diff --git a/package.json b/package.json index 1546be5..0159f56 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rpclibrary", - "version": "1.8.3", + "version": "1.9.0", "description": "rpclibrary is a websocket on steroids!", "main": "./js/Index.js", "repository": { diff --git a/src/Backend.ts b/src/Backend.ts index e08e77c..9d18900 100644 --- a/src/Backend.ts +++ b/src/Backend.ts @@ -6,6 +6,9 @@ import bsock = require('bsock'); import * as T from './Types'; import * as U from './Utils'; import * as I from './Interfaces'; +import { Socket } from 'dgram'; + +type Exporters = I.RPCExporter, keyof InterfaceT, SubResType>[] /** * A Websocket-server-on-steroids with built-in RPC capabilities @@ -31,10 +34,9 @@ export class RPCServer< */ constructor( private port:number, - private exporters: I.RPCExporter, keyof InterfaceT, SubResType>[] = [], + private exporters: Exporters = [], conf: T.ServerConf = {} ){ - if(!conf.visibility) this.visibility = "127.0.0.1" if(conf.sesame){ @@ -91,6 +93,19 @@ export class RPCServer< ] } + /** + * Publishes a new list of Exporters. This destroys and restarts the socket + * @param exporters the exporters to publish + */ + public setExporters(exporters: Exporters):any{ + exporters.forEach(U.fixNames) + this.destroy() + this.ws = http.createServer() + this.io = bsock.createServer() + this.exporters = exporters + this.startWebsocket() + } + destroy(): void { this.io.close() this.ws.close() diff --git a/test/Test.ts b/test/Test.ts index 8805e69..8b2ce54 100644 --- a/test/Test.ts +++ b/test/Test.ts @@ -541,38 +541,73 @@ type myExporterIfc = { describe("Class binding", ()=>{ + let exporter1 : MyExporter + let serv : RPCServer + let sock: RPCSocket & myExporterIfc + class MyExporter implements RPCExporter{ name = "MyExporter" as "MyExporter"; exportRPCs = () => [ this.myRPC ] - myRPC = async () => "Hello World" + myRPC = async () => { + serv.setExporters([new MyOtherExporter]) + return "Hello World" + } + } + + class MyOtherExporter implements RPCExporter{ + name = "MyExporter" as "MyExporter"; + exportRPCs = () => [ + this.myRPC + ] + + myRPC = async () => "Hello Borld" } - let serv: RPCServer, - sock: RPCSocket & myExporterIfc, - exporter: MyExporter + + before(done => { + exporter1 = new MyExporter() + serv = new RPCServer(21004, [exporter1]) + done() + }) + + beforeEach((done)=>{ - before((done)=>{ - exporter = new MyExporter() - serv = new RPCServer(21004, [exporter]) const s = new RPCSocket(21004, 'localhost') s.connect().then(conn => { sock = conn done() }) }) - after(() => { + + afterEach(done => { sock.destroy() + done() + }) + + after(() => { serv.destroy() }) it("binds correctly", (done)=>{ - sock['MyExporter'].myRPC().then(() => { + sock['MyExporter'].myRPC().then((res) => { + done(new Error(res)) + }).catch(e => { + //job will time out because of setExporters done() }) }) + + it("changes exporters", (done) => { + sock['MyExporter'].myRPC().then((res) => { + if(res === "Hello Borld") + done() + else + done(new Error(res)) + }) + }) })