fix listener bugs

This commit is contained in:
2020-11-29 05:50:53 +01:00
parent 2b722822cf
commit 8352ac1bf7
9 changed files with 278 additions and 144 deletions
+170 -53
View File
@@ -1,16 +1,20 @@
import { describe, it } from "mocha";
import { RPCServer, RPCSocket } from '../Index'
import { RPCExporter } from "../src/Interfaces";
import { RPCExporter, Socket } 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';
import { PromiseIO } from "../src/PromiseIO/Server";
import { PromiseIOClient } from "../src/PromiseIO/Client";
const noop = (...args) => { }
const add = (...args: number[]) => { return args.reduce((a, b) => a + b, 0) }
function makeServer() {
function makeServer(onCallback = noop, connectionHandler = noop, hookCloseHandler = noop, closeHandler = noop, errorHandler = (socket, err) => { throw err }) {
let subcallback
const sv = new RPCServer([{
const serv = new RPCServer([{
name: 'test',
RPCs: [
{
@@ -22,36 +26,92 @@ function makeServer() {
subcallback = callback
return { topic: "test" }
},
onClose: (res) => { }
onDestroy: hookCloseHandler
}, {
name: 'subscribe',
hook: async (callback) => {
subcallback = callback
return { topic: "test" }
},
onClose: (res, rpc) => {
console.log("onClose", rpc.name === 'subscribe' && res ? "OK" : "")
subcallback = null
},
onCallback: (...args: any) => {
console.log("onCallback", args[0] === "test" && args[1] === "callback" ? "OK" : "")
}
onDestroy: hookCloseHandler,
onCallback: onCallback
},
add,
function triggerCallback(...messages: any[]): number { return subcallback.apply({}, messages) },
function brokenRPC(){ throw new Error("Intended error") }
]
}],
{
connectionHandler: (socket) => {
},
closeHandler: (socket) => { },
errorHandler: (socket, err) => { throw err }
})
sv.listen(21010)
return sv
}],
{
connectionHandler: connectionHandler,
closeHandler: closeHandler,
errorHandler: errorHandler
})
serv.listen(21010)
return serv
}
describe('PromiseIO', () => {
it("bind + fire", (done) => {
const server = new PromiseIO()
server.attach(new http.Server())
server.on("socket", clientSocket => {
clientSocket.bind("test123", (p1,p2) => {
server.close()
if(p1 === "p1" && p2 === "p2")
done()
})
});
server.listen(21003)
PromiseIOClient.connect(21003, "localhost", "http").then(cli => {
cli.fire("test123", "p1", "p2")
cli.close()
})
})
it("hook + call", (done) => {
const server = new PromiseIO()
server.attach(new http.Server())
server.on("socket", clientSocket => {
clientSocket.hook("test123", (p1,p2) => {
if(p1 === "p1" && p2 === "p2")
return "OK"
})
});
server.listen(21003)
PromiseIOClient.connect(21003, "localhost", "http").then(cli => {
cli.call("test123", "p1", "p2").then(resp => {
cli.close()
server.close()
if(resp === "OK")
done()
})
})
})
it("on + emit", (done) => {
const server = new PromiseIO()
server.attach(new http.Server())
server.on("socket", clientSocket => {
clientSocket.on("test123", (p1,p2) => {
server.close()
if(p1 === "p1" && p2 === "p2")
done()
})
});
server.listen(21003)
PromiseIOClient.connect(21003, "localhost", "http").then(cli => {
cli.emit("test123", "p1", "p2")
cli.close()
})
})
})
describe('RPCServer', () => {
let client, server
const echo = (x) => x
@@ -133,21 +193,21 @@ describe('RPCServer with premade http server', () => {
{
name: 'Grp2',
RPCs: [
function test(){ return "test" }
function test() { return "test" }
],
}
]
let client:RPCSocket, server:RPCServer
let client: RPCSocket, server: RPCServer
before(done => {
const expressServer = express()
const httpServer = new http.Server(expressServer)
expressServer.get('/REST_ping', (req, res)=>{
expressServer.get('/REST_ping', (req, res) => {
return res
.send('REST_pong')
.status(200)
.send('REST_pong')
.status(200)
})
server = new RPCServer(
@@ -157,7 +217,7 @@ describe('RPCServer with premade http server', () => {
httpServer.listen(8080)
client = new RPCSocket(8080, 'localhost')
done()
})
@@ -171,10 +231,10 @@ describe('RPCServer with premade http server', () => {
it('should serve REST', (done) => {
fetch('http://localhost:8080/REST_ping').then(response => {
response.text().then(text => {
if(text === "REST_pong")
if (text === "REST_pong")
done()
else
done(new Error("REST repsonse was "+text))
done(new Error("REST repsonse was " + text))
})
})
})
@@ -197,6 +257,54 @@ describe('RPCServer with premade http server', () => {
})
describe('Serverside Triggers', () => {
let server, client
const closerFunction = (done) => () => {
client.close()
server.close()
done()
}
it('trigger onCallback', (done) => {
server = makeServer(closerFunction(done))
client = new RPCSocket(21010, "localhost")
client.connect().then(_ => {
client['test'].subscribe(noop).then(_ => client['test'].triggerCallback())
})
})
it('trigger connectionHandler', (done) => {
server = makeServer(undefined, closerFunction(done))
client = new RPCSocket(21010, "localhost")
client.connect()
})
it('trigger hook closeHandler', (done) => {
server = makeServer(undefined, undefined, closerFunction(done))
client = new RPCSocket(21010, "localhost")
client.connect().then(_ => {
client['test'].subscribe(function cb(){
cb['destroy']()
}).then(_ => client['test'].triggerCallback())
})
})
it('trigger global closeHandler', (done) => {
server = makeServer(undefined, undefined, undefined, () => {
server.close()
done()
})
client = new RPCSocket(21010, "localhost")
client.connect().then(_ => {
client['test'].subscribe(noop).then(_ => client.close())
})
})
})
describe('RPCSocket', () => {
let client: RPCSocket
let server: RPCServer
@@ -266,6 +374,7 @@ describe('RPCSocket', () => {
})
})
describe('It should do unhook', () => {
const yesCandy = "OK"
const noCandy = "stolen"
@@ -304,12 +413,12 @@ 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 }
})
}],
{
connectionHandler: noop,
closeHandler: noop,
errorHandler: (socket, err) => { throw err }
})
server.listen(21010)
client = new RPCSocket(21010, "localhost")
return await client.connect()
@@ -321,7 +430,7 @@ describe('It should do unhook', () => {
})
it('Subscribe with param', (done) => {
client['test'].subscribeWithParam("OK", c => { }).then(async (res) => {
client['test'].subscribeWithParam("OK", noop).then(async (res) => {
if (res.uuid === candy) {
done()
} else
@@ -363,10 +472,6 @@ type SesameTestIfc = {
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]>
}
other: {
echo: (x: any) => Promise<any>
}
}
describe('Sesame should unlock the socket', () => {
@@ -387,17 +492,11 @@ describe('Sesame should unlock the socket', () => {
topic: 'test'
}
},
onClose: (a) => { }
onDestroy: noop
},
async function checkCandy() { cb(candy); cb = () => { }; return candy },
async function checkCandy() { cb(candy); cb = noop; return candy },
async function manyParams(a, b, c, d) { return [a, b, c, d] }
],
}, {
name: 'other',
RPCs: () => [
async function echo(x) { return x }
]
}], {
sesame: (_sesame) => _sesame === 'sesame!'
})
@@ -413,7 +512,7 @@ describe('Sesame should unlock the socket', () => {
client.close()
server.close()
})
it('should work with sesame', (done) => {
client.test.checkCandy().then(c => done())
})
@@ -575,7 +674,7 @@ describe("Errorhandler functionality", () => {
})
.then(r => {
if (r != null)
done("UNEXPECTED RESULT " + r)
done(new Error("UNEXPECTED RESULT " + r))
})
.catch((e) => {
done(new Error("UNEXPECTED CLIENT ERROR " + e.message))
@@ -614,11 +713,10 @@ describe("Errorhandler functionality", () => {
})
.then(r => {
if (r != null)
done("UNEXPECTED RESULT " + r)
done(new Error("UNEXPECTED RESULT " + r))
})
.catch((e) => {
done("UNEXPECTED CLIENT ERROR " + e)
done(e)
done(new Error("UNEXPECTED CLIENT ERROR " + e))
})
.finally(() => {
cli.close()
@@ -670,7 +768,7 @@ describe("Class binding", () => {
before(done => {
exporter1 = new MyExporter()
serv = new RPCServer<myExporterIfc>(
[exporter1],
[exporter1],
{
accessFilter: async (sesame, exporter) => {
if (exporter.name === 'MyExporter') {
@@ -772,6 +870,25 @@ describe("attaching handlers before connecting", () => {
})
})
it("fires error if call is unknown", (done) => {
const serv = new RPCServer().listen(21004)
const sock = new RPCSocket(21004, 'localhost')
sock.on('error', (err) => {
sock.close()
serv.close()
done()
})
sock.connect().then(_ => {
sock.call("unknownRPC123", "AAAAA").catch(e => { }).then(x => {
done(new Error("unexpected return value"))
})
}).catch(e => {
done(e)
})
})
/*
* ## 1.11.0 breaking ##
*