What is rpc-websockets?
The rpc-websockets package provides a simple way to implement JSON-RPC 2.0 over WebSockets. It allows for both client and server implementations, enabling remote procedure calls (RPC) and event-based communication between clients and servers.
What are rpc-websockets's main functionalities?
Creating a WebSocket Server
This code demonstrates how to create a WebSocket server using rpc-websockets. The server listens on port 8080 and registers a 'sum' method that takes an array of parameters and returns their sum.
const WebSocketServer = require('rpc-websockets').Server;
const server = new WebSocketServer({ port: 8080 });
server.register('sum', (params) => {
return params[0] + params[1];
});
console.log('WebSocket server is running on ws://localhost:8080');
Creating a WebSocket Client
This code demonstrates how to create a WebSocket client using rpc-websockets. The client connects to the server at ws://localhost:8080 and calls the 'sum' method with parameters 5 and 3, then logs the result.
const WebSocketClient = require('rpc-websockets').Client;
const client = new WebSocketClient('ws://localhost:8080');
client.on('open', () => {
client.call('sum', [5, 3]).then((result) => {
console.log('Sum:', result);
}).catch((error) => {
console.error('Error:', error);
});
});
Subscribing to Events
This code demonstrates how to create a WebSocket server that emits events. The server defines an 'update' event and emits it every second with the current timestamp.
const WebSocketServer = require('rpc-websockets').Server;
const server = new WebSocketServer({ port: 8080 });
server.event('update');
setInterval(() => {
server.emit('update', { timestamp: new Date() });
}, 1000);
console.log('WebSocket server is running on ws://localhost:8080');
Listening to Events on Client
This code demonstrates how to create a WebSocket client that listens to events. The client connects to the server at ws://localhost:8080, subscribes to the 'update' event, and logs any received updates.
const WebSocketClient = require('rpc-websockets').Client;
const client = new WebSocketClient('ws://localhost:8080');
client.on('open', () => {
client.subscribe('update');
client.on('update', (data) => {
console.log('Update received:', data);
});
});
Other packages similar to rpc-websockets
ws
The ws package is a simple to use, blazing fast, and thoroughly tested WebSocket client and server for Node.js. Unlike rpc-websockets, ws does not provide built-in support for JSON-RPC, but it offers a more flexible and lower-level API for WebSocket communication.
socket.io
Socket.IO is a library that enables real-time, bidirectional, and event-based communication between web clients and servers. It provides higher-level abstractions compared to rpc-websockets, including automatic reconnection, multiplexing, and broadcasting, but does not natively support JSON-RPC.
rpc-websockets
rpc-websockets wraps ws library providing JSON RPC 2.0 support on top.
Installation
npm install rpc-websockets
Examples
var WebSocket = require('rpc-websockets').Client
var WebSocketServer = require('rpc-websockets').Server
var server = new WebSocketServer({
port: 8080,
host: 'localhost',
rpc: {
root_path: '/rpc',
version: '1.0'
}
})
server.register('sum', function(params) {
return params[0] + params[1]
})
server.event('feedUpdated')
console.log(server.eventList)
server.emit('feedUpdated')
server.close()
var ws = new WebSocket('ws://localhost:8080/rpc/1.0')
ws.on('open', function() {
ws.call('sum', [5, 3]).then(function(result) {
require('assert').equal(result, 8)
})
ws.notify('openedNewsModule')
ws.subscribe('feedUpdated')
ws.on('feedUpdated', function() {
updateLogic()
})
ws.unsubscribe('feedUpdated')
ws.close()
})
Client
var WebSocket = require('rpc-websockets').Client
var ws = new WebSocket('ws://localhost:8080/rpc/1.0')
new WebSocket(address[, options]) -> Client
Instantiate a WebSocket client.
Parameters:
address
{String}: The URL of the WebSocket server. Defaults to 'ws://localhost:8080/rpc/1.0'.options
{Object}: Client options that are also forwarded to ws
.
autoconnect
{Boolean}: Client autoconnect upon Client class instantiation. Defaults to true
.reconnect
{Boolean}: Whether client should reconnect automatically once the connection is down. Defaults to true
.reconnect_interval
{Number}: Time between adjacent reconnects. Defaults to 1000
.max_reconnects
{Number}: Maximum number of times the client should try to reconnect. Defaults to 5
.
ws.call(method[, params]) -> Promise
Calls a registered RPC method on server. Resolves once the response is ready. Throws if an RPC error was received.
Parameters:
method
{String}: An RPC method name to run on server-side.params
{Object|Array}: Optional parameter(s) to be sent along the request.
ws.notify(method[, params])
Sends a JSON-RPC 2.0 notification to server.
Parameters:
method
{String}: An RPC method name to run on server-side.params
{Object|Array}: Optional parameter(s) to be sent along the request.
ws.subscribe(event) -> Promise
Subscribes for a defined event.
Parameters:
event
{String}: Event name.
ws.unsubscribe(event) -> Promise
Unsubscribes from a defined event.
Parameters:
event
{String}: Event name.
ws.close([code[, data]])
Closes a WebSocket connection gracefully.
Parameters:
code
{Number}: Socket close code.data
{String}: Optional data to be sent to socket before closing.
Event: 'open'
Emits when the connection is opened and ready for use.
Event: 'error'
Emits when a socket error is raised.
Event: 'close'
Emits when the connection is closed.
Event: <Notification>
Emits a notification event with possible parameters a client has subscribed to once the server sends it.
Example:
ws.subscribe('feedUpdated')
ws.on('feedUpdated', handlerFunction)
Server
var WebSocketServer = require('rpc-websockets').Server
var server = new WebSocketServer({
port: 8080,
host: 'localhost',
rpc: {
root_path: '/rpc',
version: '1.0'
}
})
new WebSocketServer([options]) -> Server
Instantiate a WebSocket server.
Parameters:
options
{Object}: Server options that are also forwarded to ws
.
port
{Number}: Port number on which the server will listen for incoming requests.host
{String}: Address on which the server will listen for incoming requests.rpc
{Object}:
root_path
{String}: RPC server endpoint.version
{String}: RPC API version.
Once the Server class is instantiated, you can use a ws
library's instance via server.wss object.
server.register(method, callback)
Registers an RPC method.
Parameters:
method
{String}: RPC method name.callback
{Function}: RPC function that will be fired with a possible parameter object once the method is called.
server.event(name)
Creates a new event that can be emitted to clients.
Parameters:
name
{String}: Name of the event.
server.emit(name[, ...params])
Emits a created event to clients.
Parameters:
name
{String}: Name of the event....params
: Parameters forwarded to clients.
get server.eventList -> Array
Lists all created events.
server.createError(code, message[, data]) -> Object
Creates a structured error that can be thrown in a .register callback.
Parameters:
code
{Number}: Indicates the error type that occurred.message
{String}: Provides a short description of the error.data
{String|Object}: Details containing additional information about the error.
server.close() -> Promise
Closes the server and terminates all clients.
Event: 'listening'
Emits when the server has started listening for requests.
Event: 'error'
Emits when a server error is raised.