peter c45f9a2558 v 1.2.0 | 5 years ago | |
---|---|---|
src | 5 years ago | |
test | 5 years ago | |
.drone.yml | 5 years ago | |
.gitignore | 5 years ago | |
.npmignore | 5 years ago | |
README.md | 5 years ago | |
package-lock.json | 5 years ago | |
package.json | 5 years ago | |
tsconfig.json | 5 years ago |
rpclibrary is a websocket on steroids!
npm i rpclibrary
import {Backend, Frontend} from 'rpclibrary'
const echo = (x) => x
const server = new Backend.RPCServer(20000, [{
name: 'HelloWorldRPCGroup',
exportRPCs: () => [
echo, //named function variable
function echof(x){ return x }, //named function
{
name: 'echoExplicit', //describing object
call: async (x) => x
}
]
}])
const client = new Frontend.RPCSocket(20000, 'localhost')
client.connect().then(async () => {
const r0 = await client['HelloWorldRPCGroup'].echo('Hello')
const r1 = await client['HelloWorldRPCGroup'].echof('World')
const r2 = await client['HelloWorldRPCGroup'].echoExplicit('RPC!')
console.log(r0,r1,r2) //Hello World RPC!
})
rpclibrary offers a special type of call that can be used with callbacks
import {Backend, Frontend, Utils} from 'rpclibrary'
const callbacks:Map<string, Function> = new Map()
const server = new Backend.RPCServer(20000, [{
name: 'HelloWorldRPCGroup',
exportRPCs: () => [
function triggerCallbacks(...messages){ callbacks.forEach(cb => cb.apply({}, messages)) },
{
name: 'subscribe',
hook: async (callback) => {
const resp = Utils.makeSubResponse()
callbacks.set(resp.uuid, callback);
return resp
}
},{
name: 'unsubscribe',
call: async (uuid) => { callbacks.delete(uuid) }
}
]
}])
const client = new Frontend.RPCSocket(20000, 'localhost')
client.connect().then(async () => {
const res = await client['HelloWorldRPCGroup'].subscribe(async (...args:any) => {
console.log.apply(console, args)
/* close the callbacks once you're done */
await client['HelloWorldRPCGroup'].unsubscribe(res.uuid)
client.unhook(res.uuid)
})
await client['HelloWorldRPCGroup'].triggerCallbacks("Hello", "World", "Callbacks")
})
It is possible to declare pseudo-interfaces for servers and clients
type MyInterface = RPCInterface<{
Group1: {
triggerCallbacks: (...args:any[]) => Promise<void>,
subscribe: (param:string, callback:Function) => Promise<SubscriptionResponse<{a: string}>>,
unsubscribe: (uuid:string) => Promise<void>
},
Group2: {
echo: (x:string) => Promise<string>
}
}>
Create a client using
RPCSocket.makeSocket<MyInterface>(port, host).then((async (client) => {
const r = await client.Group2.echo("hee") //tsc knows about available RPCs
}))
/* OR */
const client = new Frontend.RPCSocket(20000, 'localhost')
client.connect<MyInterface>().then((async (client) => {
const r = await client.Group2.echo("hee") //tsc knows about available RPCs
}))
Create a server using
new RPCServer<{a:string}, MyInterface>(20001,
[{
//...
},{
name: 'Group2', //Auto completion for names
exportRPCs: () => [{
name: 'echo', //this name too!
call: async (x) => x+"llo World!" //the paramter and return types are known by tsc
}]
}]
)