This commit is contained in:
2019-09-21 16:15:31 +02:00
parent 6005382a54
commit 597be1b80f
7 changed files with 878 additions and 130 deletions
+853 -1
View File
File diff suppressed because it is too large Load Diff
+9 -3
View File
@@ -9,18 +9,24 @@
"backend": "node js/test/TestBackend.js", "backend": "node js/test/TestBackend.js",
"frontend": "node js/test/TestFrontend.js", "frontend": "node js/test/TestFrontend.js",
"build": "npm run clean && tsc && npm run webpack", "build": "npm run clean && tsc && npm run webpack",
"clean": "rm -rf js" "clean": "rm -rf js",
"test": "mocha js/test/Test.js"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/expect": "^1.20.4",
"@types/express": "^4.17.0", "@types/express": "^4.17.0",
"@types/mocha": "^5.2.7",
"@types/node": "^11.13.19", "@types/node": "^11.13.19",
"chai": "^4.2.0",
"mocha": "^6.2.0",
"terser-webpack-plugin": "^2.1.0",
"ts-loader": "^5.3.3", "ts-loader": "^5.3.3",
"ts-mocha": "^6.0.0",
"typescript": "^3.5.3", "typescript": "^3.5.3",
"webpack": "^4.40.2", "webpack": "^4.40.2",
"webpack-cli": "^3.3.9", "webpack-cli": "^3.3.9"
"terser-webpack-plugin": "^2.1.0"
}, },
"dependencies": { "dependencies": {
"bsock": "^0.1.9", "bsock": "^0.1.9",
+8 -2
View File
@@ -9,7 +9,8 @@ import * as I from './Interfaces';
export class RPCServer< export class RPCServer<
SubResType = {} SubResType = {}
>{ > implements I.Destroyable{
private ws = http.createServer() private ws = http.createServer()
private io = bsock.createServer() private io = bsock.createServer()
private visibility:T.Visibility private visibility:T.Visibility
@@ -34,7 +35,7 @@ export class RPCServer<
if(!conf.closeHandler) this.closeHandler = if(!conf.closeHandler) this.closeHandler =
(socket:I.Socket) => () => { (socket:I.Socket) => () => {
console.log("Socket on port "+socket.port+"closing") console.log("Socket on port "+socket.port+" closing")
} }
if(!conf.connectionHandler) this.connectionHandler = if(!conf.connectionHandler) this.connectionHandler =
@@ -78,4 +79,9 @@ export class RPCServer<
...this.exporters.flatMap(exporter => U.rpcHooker(socket, exporter)) ...this.exporters.flatMap(exporter => U.rpcHooker(socket, exporter))
] ]
} }
async destroy(): Promise<void> {
this.io.close()
this.ws.close()
}
} }
+1
View File
@@ -47,6 +47,7 @@ export class RPCSocket implements I.Socket{
public async connect(){ public async connect(){
this.socket = await bsock.connect(this.port, this.server, this.tls) this.socket = await bsock.connect(this.port, this.server, this.tls)
this.on('error', () => {})
const info:T.ExtendedRpcInfo[] = await this.info() const info:T.ExtendedRpcInfo[] = await this.info()
info.forEach(i => { info.forEach(i => {
+6 -3
View File
@@ -6,13 +6,16 @@ export interface Exporter<T = {}>{
exportRPCs() : T.RPC<T>[] exportRPCs() : T.RPC<T>[]
} }
export interface Socket { export interface Socket extends Destroyable {
port: number port: number
hook: (rpcname: T.Name, ...args: T.Any[]) => I.Socket hook: (rpcname: T.Name, ...args: T.Any[]) => I.Socket
unhook: (rpcname:T.Name) => I.Socket unhook: (rpcname:T.Name) => I.Socket
call: (rpcname:T.Name, ...args: T.Any[]) => Promise<T.Any> call: (rpcname:T.Name, ...args: T.Any[]) => Promise<T.Any>
fire: (rpcname:T.Name, ...args: T.Any[]) => Promise<T.Any> fire: (rpcname:T.Name, ...args: T.Any[]) => Promise<T.Any>
on: T.OnFunction on: T.OnFunction
destroy: ()=>void close() : void
close: ()=>void }
export interface Destroyable{
destroy() : void
} }
-84
View File
@@ -1,84 +0,0 @@
import { RPCServer } from '../src/Backend'
import { SubscriptionResponse, ErrorResponse, SuccessResponse } from '../src/Types'
import { HookRPC } from '../src/Types'
import * as uuidv4 from "uuid/v4"
import { makeSubResponse } from '../src/Utils'
let subcallback
new RPCServer(20000, [{
name: "HelloWorldRPCGroup",
exportRPCs: () => [
{
name: 'echo',
call: async (s:string) => s,
},{
name: 'simpleSubscribe',
hook: async(callback) => {
subcallback = callback
return makeSubResponse()
}
},{
name: 'subscribe',
hook: async (callback):Promise<any> => {
subcallback = callback
return makeSubResponse()
},
onClose: (res, rpc) => {
console.log("Specific close handler for", rpc.name, res)
subcallback = null
},
onCallback: (...args) => { console.log.apply(console, args) }
},
function add(...args:number[]):number {return args.reduce((a,b)=>a+b, 0)},
function triggerCallback(...messages:any[]):number {return subcallback.apply({}, messages)},
]
}])
new RPCServer<{ topic: string }>(20001, [{
name: "HelloWorldRPCGroup",
exportRPCs: () => [
{
name: 'echo',
call: async (s:string) => s,
},{
name: 'simpleSubscribe',
hook: async(callback) => {
subcallback = callback
return {
result: "Success",
uuid: uuidv4(),
topic: ""
}
}
},{
name: 'subscribe',
hook: async (callback) => {
subcallback = callback
return {
result: "Success",
uuid: uuidv4(),
topic: ""
}
},
onClose: (res, rpc) => {
console.log("Specific close handler for", rpc.name, res)
subcallback = null
},
onCallback: (...args:any) => { console.log.apply(console, args) }
},
function add(...args:number[]):number {return args.reduce((a,b)=>a+b, 0)},
function triggerCallback(...messages:any[]):number {return subcallback.apply({}, messages)},
]
}])
try{
new RPCServer(20001, [{
name: "bad",
exportRPCs: () => [
(aaa,bbb,ccc) => { return aaa+bbb+ccc }
]
}])
}catch(badRPCError){
console.log("expected bad-RPC error happened: "+ !!badRPCError, String(badRPCError))
}
-36
View File
@@ -1,36 +0,0 @@
import { RPCSocket } from '../src/Frontend'
const client = new RPCSocket(20000, 'localhost')
client.connect().then(async _ => {
await client.info().then(console.log)
await client["HelloWorldRPCGroup"].echo("x")
.then(hopefullyX => console.log("echo('x') returned x: ", hopefullyX === "x", hopefullyX))
await client["HelloWorldRPCGroup"].add(1,2,3)
.then(hopefully6 => console.log("add(1,2,3) returned 6: ", hopefully6 === 6, hopefully6))
let counter = 0
const handler = (s) => {
counter++
if(counter === 3)
console.log("subscribe call counter met", counter === 3)
}
await client["HelloWorldRPCGroup"].subscribe(handler)
await Promise.all([
client["HelloWorldRPCGroup"].triggerCallback("test1", "test1", "test1", ),
client["HelloWorldRPCGroup"].triggerCallback("test2", "test2", "test2", ),
client["HelloWorldRPCGroup"].triggerCallback("test3", "test3", "test3", ),
])
counter = 0
const simplehandler = (s) => {
counter++
if(counter === 3)
console.log("simpleSubscribe call counter met", counter === 3)
}
await client["HelloWorldRPCGroup"].simpleSubscribe(simplehandler)
client["HelloWorldRPCGroup"].triggerCallback("simple1", "simple1", "simple1", )
client["HelloWorldRPCGroup"].triggerCallback("simple2", "simple2", "simple2", )
client["HelloWorldRPCGroup"].triggerCallback("simple3", "simple3", "simple3", )
})