JSON-RPC over websocket with multicast service discovery with a browser compatible client
npm install --save microserv
const { Server, Service } = require('microserv')
const server = new Server('my-app', { port: 3000 })
const msgService = new Service('message')
msgService.register('getMessage', () => {
return 'Hello, world!'
})
server.addService(msgService)
server.listen()
server.announce()
const http = require('http')
const { Server, Service } = require('microserv')
const server = new Server('my-app', { port: 3001 })
const mathService = new Service('math')
mathService.register('add', (a, b) => {
return a + b
})
server.addService(mathService)
// Wait for the message service to be ready
server.need('message')
.then(([ message ]) => {
const app = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
// Call the message service `getMessage` method
message.getMessage()
.then(msg => {
res.end(msg)
// { type: 'string', data: 'Hello, world!' }
})
})
app.listen(8080, '127.0.0.1')
})
server.listen()
server.announce()
const { Client } = require('microserv')
const client = new Client()
client.need('message', 'math')
.then(([ message, math ]) => {
message
.getMessage()
.then(msg => console.log(msg))
math
.add(1, 2)
.then(sum => console.log(sum))
})
client.connect('ws://localhost:3000')
client.connect('ws://localhost:3001')
const server = new Server('my-app', { port: 3001 })
Instantiate a client
Parameters:
address
{String}: The service namespace. Only services in the same namespace can connect to each other.options
{Object}: Websocket optionsport
{Number}: Websocket portinterval
{Number}: How often to announce the service (in ms). Defaults to5000
.sever
{http.Server|https.server}: A server to use as the websocket server. If set, will overrideport
.secure
{Boolean}: Use secure websockets. Defaults tofalse
.serviceTransform
{Function}: A function to transform the data returned from an rpc call. Defaults to noop.authorization
{Any}: Credentials to pass to Server when connectingauthorizeClient
{Function}: A sync or async function to authorize a Client. Function is passed the Client'sauthorization
credentialsdns
{Object}: dns-discovery options
Add a service to the server, and announce the service to connected peers
Parameters:
service
{Service}: A Service instance
List required services. Resolves with each of the required services of type ClientService
Parameters:
services
{String}: Service names
Begin listening for peers
Announce the service on the network. Will reannounce the service at the interval provided via opts
.
Emitted when there is an error on the server
Emitted when a connected socket is reset
const service = new Service('my-service')
Instantiate a new Service
Parameters:
name
{String}: The service name that will be announced to peers
Register an rpc method with the service
Parameters:
method
{String}: The name of the methodcb
{Function}: The function to invoke when the rpc method is calledresultType
{String}: The type of data returned by the method. Defaults totypeof result
Emits an event via the websocket
Parameters:
name
{String}: The event namedata
{*}: The event data
Returned from server.need()
. This should not be instantiated direclty.
Subscribe to a service event
Parameters:
name
{String}: The name of the eventcb
{Function}: The event callback
Each method registered with the service is exposed a method of the client service. Returns and object with data
and type
properties.
Emitted when the connection to the service is lost
Emitted when the connection to a lost service is reestablished
const client = new Client()
Instantiate a new Client
Parameters:
opts
{Object}: OptionsserviceTransform
{Function}: A function to transform the data returned from an rpc call. Defaults to noop.authorization
{Any}: Credentials to pass to Server when connecting
rpcOpts
{Object}: Options for rpc-websockets
Connect to a specific websocket server
Parameters:
connection
{String}: The server connection string (eg. ws://localhost:3001)
List required services. Resolves with each of the required services of type ClientService
Parameters:
services
{String}: Service names
Emitted when the connection to a service is closed
Emitted when the client fails authorization
npm run test