fix listener bugs
This commit is contained in:
+170
-53
@@ -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 ##
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user