rapport CircleCI Coverage Status
A simple websocket wrapper that adds request/response functionality.
- Callback and Promise support for requests
- Wraps node WS objects as well as the browser Websocket object
- Small footprint (7.4kb minified)
- Configurable promise implementation
- Configurable serialization functions
- Zero dependencies
Simply add rapport.min.js to your HTML page and start using it:
const Rapport = Rapport(Websocket); const ws = Rapport.create('ws:localhost', wsOptions); ws.onOpen(() => { // If the browser supports ES6 promises or a promise library is configured ws.request('some request', timeout) .then((response) => {}) .catch((err) => {}); // If you prefer callbacks ws.request('some request', timeout, (response, error) => {}); }); // Replying to a request ws.onMessage((msg, ws) => { // The message content is in the body const content = msg.body; if (msg.isRequest) { ws.respond('hello'); ws.respondWithError('Error!'); } }); // Closes are resolved when onClose is called, with an optional timeout ws.close(optionalMessage, optionalWsCode, optionalTimeout) .then() .catch(); // Other functions are also wrapped: ws.onError((err) => {}); ws.onClose((msg, code) => {}); ws.send(message);
Install with npm install --save rapport.
const Rapport = require('rapport')(); const wrappedSocket = Rapport.wrap(existingSocket); wrappedSocket.request('some request', timeout) .then((response) => {}) .catch((err) => {}); wrappedSocket.request('some request', timeout, (response, error) => {});
const Rapport = require('rapport')(); const wrappedSocket = Rapport.wrap(existingSocket); wrappedSocket.onMessage((msg, ws) => { // The message content is in the body const content = msg.body; if (msg.isRequest) { ws.respond('Hello'); ws.respondWithError('Error!'); } });
const Rapport = require('rapport')(require('ws')); const ws = Rapport.create('ws:localhost', wsOptions); ws.onOpen(() => { ws.request('some request', timeout) .then((response) => {}) .catch((err) => {}); }); // Replying to a request ws.onMessage((msg, ws) => { // The message content is in the body const content = msg.body; if (msg.isRequest) { ws.respond('hello'); ws.respondWithError('Error!'); } }); // Closes are resolved when onClose is called, with an optional timeout ws.close(optionalMessage, optionalWsCode, optionalTimeout) .then() .catch(); // Other functions are also wrapped: ws.onError((err) => {}); ws.onClose((msg, code) => {}); ws.send(message);
There are 6 configurable options for the Rapport library, with the following defaults:
Rapport(Websocket, { // Set the function for encoding messages encodeMessage: (msg) => { return JSON.stringify(msg); }, // Set the function for decoding messages decodeMessage: (msg) => { return JSON.parse(msg); }, // Set the function for encoding close messages. This MUST return a string. encodeCloseMessage: (msg) => { return JSON.stringify(msg); }, // Set the function for decoding messages. This will always receive a string. decodeCloseMessage: (msg) => { return JSON.parse(msg); }, // Set the Promise implementation to use. Set to false to turn off promises. Promise: Promise, // Set the request ID generation function generateRequestId: () => { return uuid.v4(); } });