Fusion.js supports WebSockets through the HttpServerToken
exported from fusion-core
. This token represents the current running instance of the Node http.Server
class and can be used to manually respond to the HTTP upgrade event necessary for WebSocket handshaking.
The following example uses the HttpServerToken
inside of a plugin to set up a WebSocket connection. The Node ws
library is used for this example but any library could be used as long as it has an interface to handshake with an existing http.Server
instance.
import {createPlugin, HttpServerToken} from 'fusion-core';
import WebSocket from 'ws';
export default __SERVER__ && createPlugin({
deps: {httpServer: HttpServerToken},
provides: deps => {
const {httpServer} = deps;
const wss = new WebSocket.Server({noServer: true});
wss.on('connection', ws => {
ws.on('message', data => {
// Respond to message here
});
ws.on('close', (...args) => {
// Respond to socket close
});
});
wss.on('error', () => {
// Respond to socket error
});
httpServer.on('upgrade', (request, socket, head) => {
wss.handleUpgrade(request, socket, head, function done(ws) {
wss.emit('connection', ws, request);
});
});
// Optionally return the websocket connection here to allow other plugins to access the connection
return wss;
},
middleware: () => {
// If you don't need to provide the wss object you can register the websocket connection here instead
},
});
From the client side, using a standard WebSocket
class is sufficient to connect to the server using the wss://
protocol.