2.0 rework

This commit is contained in:
2020-08-08 04:23:56 +02:00
parent dde95027bc
commit cb974cbc61
11 changed files with 752 additions and 524 deletions
+154 -53
View File
@@ -3,13 +3,16 @@ import { RPCServer, RPCSocket } from '../Index'
import { RPCExporter } from "../src/Interfaces";
import { ConnectedSocket } from "../src/Types";
import * as log from 'why-is-node-running';
import * as http from 'http';
import * as express from 'express';
import * as fetch from 'node-fetch';
const add = (...args: number[]) => { return args.reduce((a, b) => a + b, 0) }
function makeServer() {
let subcallback
return new RPCServer(21010, [{
const sv = new RPCServer([{
name: 'test',
exportRPCs: () => [
RPCs: [
{
name: 'echo',
call: async (s: string) => s,
@@ -37,12 +40,15 @@ function makeServer() {
add,
function triggerCallback(...messages: any[]): number { return subcallback.apply({}, messages) },
]
}], {
}],
{
connectionHandler: (socket) => {
},
closeHandler: (socket) => { },
errorHandler: (socket, err) => { throw err }
})
sv.listen(21010)
return sv
}
@@ -51,9 +57,9 @@ describe('RPCServer', () => {
const echo = (x) => x
before(done => {
server = new RPCServer(21003, [{
server = new RPCServer([{
name: 'HelloWorldRPCGroup',
exportRPCs: () => [
RPCs: () => [
echo, //named function variable
function echof(x) { return x }, //named function
{
@@ -62,11 +68,11 @@ describe('RPCServer', () => {
}
]
}])
server.listen(21003)
client = new RPCSocket(21003, 'localhost')
done()
})
after(done => {
client.close()
server.close()
@@ -83,7 +89,7 @@ describe('RPCServer', () => {
if (r0 === 'Hello' && r1 === 'World' && r2.join('') === 'RPC!') {
done()
}else{
} else {
done(new Error("Bad response"))
}
})
@@ -91,12 +97,13 @@ describe('RPCServer', () => {
it('new RPCServer() should fail on bad RPC', (done) => {
try {
new RPCServer(20001, [{
const sv = new RPCServer([{
name: 'bad',
exportRPCs: () => [
RPCs: () => [
(aaa, bbb, ccc) => { return aaa + bbb + ccc }
]
}])
sv.listen(20001)
done(new Error("Didn't fail with bad RPC"))
} catch (badRPCError) {
done()
@@ -104,6 +111,91 @@ describe('RPCServer', () => {
})
})
describe('RPCServer with premade http server', () => {
const echo = (x) => x
const RPCs = [
echo, //named function variable
function echof(x) { return x }, //named function
{
name: 'echoExplicit', //describing object
call: async (x, y, z) => [x, y, z]
}
]
const RPCExporters = [
{
name: 'HelloWorldRPCGroup',
RPCs: RPCs,
}
]
const RPCExporters2 = [
{
name: 'Grp2',
RPCs: [
function test(){ return "test" }
],
}
]
let client:RPCSocket, server:RPCServer
before(done => {
const expressServer = express()
const httpServer = new http.Server(expressServer)
expressServer.get('/REST_ping', (req, res)=>{
return res
.send('REST_pong')
.status(200)
})
server = new RPCServer(
RPCExporters,
)
server.attach(httpServer)
httpServer.listen(8080)
client = new RPCSocket(8080, 'localhost')
done()
})
after(done => {
client.close()
server.close()
done()
})
it('should serve REST', (done) => {
fetch('http://localhost:8080/REST_ping').then(response => {
response.text().then(text => {
if(text === "REST_pong")
done()
else
done(new Error("REST repsonse was "+text))
})
})
})
it('should be able to use all kinds of RPC definitions', (done) => {
client.connect().then(async () => {
const r0 = await client['HelloWorldRPCGroup'].echo('Hello')
const r1 = await client['HelloWorldRPCGroup'].echof('World')
const r2 = await client['HelloWorldRPCGroup'].echoExplicit('R', 'P', 'C!')
if (r0 === 'Hello' && r1 === 'World' && r2.join('') === 'RPC!') {
done()
} else {
done(new Error("Bad response"))
}
})
})
})
describe('RPCSocket', () => {
let client: RPCSocket
@@ -111,6 +203,7 @@ describe('RPCSocket', () => {
before(async () => {
server = makeServer()
client = new RPCSocket(21010, "localhost")
return await client.connect()
})
@@ -183,9 +276,9 @@ describe('It should do unhook', () => {
let server: RPCServer
before(async () => {
server = new RPCServer(21010, [{
server = new RPCServer([{
name: "test",
exportRPCs: () => [{
RPCs: () => [{
name: 'subscribe',
hook: async (callback): Promise<void> => {
cb = <Function>callback
@@ -211,11 +304,13 @@ describe('It should do unhook', () => {
function publish(): string { cb(candy); return candy },
function unsubscribe(): string { candy = noCandy; cb(candy); cb = () => { }; return candy }
]
}], {
}],
{
connectionHandler: (socket) => { },
closeHandler: (socket) => { },
errorHandler: (socket, err) => { throw err }
})
server.listen(21010)
client = new RPCSocket(21010, "localhost")
return await client.connect()
})
@@ -238,15 +333,15 @@ describe('It should do unhook', () => {
const expected = [yesCandy, noCandy, noCandy, noCandy]
it('Unhook+unsubscribe should stop callbacks', (done) => {
client['test'].subscribe(function myCallback(c){
if(run == 1)
(myCallback as any).destroy()
client['test'].subscribe(function myCallback(c) {
if (run == 1)
(myCallback as any).destroy()
if (c !== expected[run++]) {
done(new Error(`Wrong candy '${c}' in iteration '${run - 1}'`))
}
}).then(async function(res){
}).then(async function (res) {
const r1 = await client['test'].publish()
const r3 = await client['test'].unsubscribe()
const r2 = await client['test'].publish()
@@ -266,11 +361,11 @@ type SesameTestIfc = {
test: {
checkCandy: () => Promise<string>
subscribe: (callback: Function) => Promise<topicDTO>
manyParams: <A=string,B=number,C=boolean,D=Object>(a:A, b:B, c:C, d:D) => Promise<[A, B, C, D]>
manyParams: <A = string, B = number, C = boolean, D = Object>(a: A, b: B, c: C, d: D) => Promise<[A, B, C, D]>
}
other: {
echo: (x:any) => Promise<any>
echo: (x: any) => Promise<any>
}
}
@@ -281,9 +376,9 @@ describe('Sesame should unlock the socket', () => {
let cb: Function = (...args) => { }
before((done) => {
server = new RPCServer<SesameTestIfc>(21004, [{
server = new RPCServer<SesameTestIfc>([{
name: "test",
exportRPCs: () => [
RPCs: () => [
{
name: 'subscribe',
hook: async (callback) => {
@@ -297,15 +392,16 @@ describe('Sesame should unlock the socket', () => {
async function checkCandy() { cb(candy); cb = () => { }; return candy },
async function manyParams(a, b, c, d) { return [a, b, c, d] }
],
},{
}, {
name: 'other',
exportRPCs: () => [
async function echo(x){return x}
RPCs: () => [
async function echo(x) { return x }
]
}], {
sesame: (_sesame) => _sesame === 'sesame!'
})
server.listen(21004)
const sock = new RPCSocket<SesameTestIfc>(21004, "localhost")
sock.connect('sesame!').then(cli => {
client = cli
@@ -378,15 +474,14 @@ describe('Error handling', () => {
}
it("RPC throws on client without handler", (done) => {
let server = new RPCServer(21004, [{
let server = new RPCServer([{
name: "createUser",
exportRPCs: () => [{
RPCs: () => [{
name: 'createUser' as 'createUser',
call: createUser
}]
}], {
})
}])
server.listen(21004)
let sock = new RPCSocket(21004, 'localhost')
sock.connect().then((cli) => {
@@ -413,9 +508,9 @@ describe('Error handling', () => {
})
it("RPC throws on server with handler", (done) => {
let server = new RPCServer(21004, [{
let server = new RPCServer([{
name: "createUser",
exportRPCs: () => [{
RPCs: () => [{
name: 'createUser' as 'createUser',
call: createUser
}]
@@ -424,6 +519,7 @@ describe('Error handling', () => {
done()
}
})
server.listen(21004)
let sock = new RPCSocket(21004, 'localhost')
sock.connect().then((cli) => {
@@ -457,9 +553,9 @@ describe("Errorhandler functionality", () => {
}
it("correct values are passed to the handler", (done) => {
let server = new RPCServer(21004, [{
let server = new RPCServer([{
name: "createUser",
exportRPCs: () => [{
RPCs: () => [{
name: 'createUser' as 'createUser',
call: createUser
}]
@@ -469,6 +565,7 @@ describe("Errorhandler functionality", () => {
done()
}
})
server.listen(21004)
let sock = new RPCSocket(21004, 'localhost')
sock.connect().then((cli) => {
@@ -493,9 +590,9 @@ describe("Errorhandler functionality", () => {
it("handler sees sesame", (done) => {
let sesame = "AAAAAAAAAAAAAAA"
let server = new RPCServer(21004, [{
let server = new RPCServer([{
name: "createUser" as "createUser",
exportRPCs: () => [{
RPCs: () => [{
name: 'createUser' as 'createUser',
call: createUser
}]
@@ -507,6 +604,7 @@ describe("Errorhandler functionality", () => {
}
})
server.listen(21004)
let sock = new RPCSocket(21004, 'localhost')
sock.connect(sesame).then((cli) => {
@@ -547,7 +645,7 @@ describe("Class binding", () => {
class MyExporter implements RPCExporter<myExporterIfc>{
name = "MyExporter" as "MyExporter"
exportRPCs = () => [
RPCs = () => [
this.myRPC
]
@@ -559,7 +657,7 @@ describe("Class binding", () => {
class MyOtherExporter implements RPCExporter<myExporterIfc>{
name = "MyExporter" as "MyExporter"
exportRPCs = () => [
RPCs = () => [
this.myRPC
]
@@ -571,18 +669,21 @@ describe("Class binding", () => {
before(done => {
exporter1 = new MyExporter()
serv = new RPCServer<myExporterIfc>(21004, [exporter1], {
accessFilter: async (sesame, exporter) => {
if(exporter.name === 'MyExporter'){
if (!allowed) return false
allowed = false
return sesame === 'xxx';
}else{
return false
}
},
sesame: "xxx"
})
serv = new RPCServer<myExporterIfc>(
[exporter1],
{
accessFilter: async (sesame, exporter) => {
if (exporter.name === 'MyExporter') {
if (!allowed) return false
allowed = false
return sesame === 'xxx';
} else {
return false
}
},
sesame: "xxx"
})
serv.listen(21004)
done()
})
@@ -630,7 +731,7 @@ describe("Class binding", () => {
it("use sesameFilter for available", (done) => {
if (sock['MyExporter']){
if (sock['MyExporter']) {
allowed = false
done()
}
@@ -722,6 +823,6 @@ describe("attaching handlers before connecting", () => {
describe('finally', () => {
it('print open handles (Ignore `DNSCHANNEL` and `Immediate`)', () => {
log()
//log(console)
})
})