2.0 rework
This commit is contained in:
+154
-53
@@ -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)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user