Blocklet Server PubSub base on Websocket and Phoenix Protocol
- WsServer
const { WsServer } = require('@arcblock/ws');
/**
* @params {Object} opts
* @params {http.Server} opts.httpServer
* @params {String} opts.pathname default to '/websocket'
* @params {Function} opts.authenticate
*/
const wsServer = new WsServer({
httpServer: http.createServer(),
authenticate: (req, cb) => {
const { searchParams } = new URL(req.url, `http://${req.headers.host || 'unknown'}`);
const token = searchParams.get('token');
if (!token) {
cb(new Error('token not found'), null);
return;
}
// custom logic for validate token
const authInfo = validateToken(token);
// if validate success
cb(null, authInfo);
// if validate error
cb(new Error('validate fail'), null);
},
});
// attach to httpServer(httpServer has passed by constructor)
wsSerer.attach();
// push message
wsServer.broadcast('blocklet.installed', data);
wsServer.broadcast('notification.create', data);
wsServer.broadcast('topic', 'event', data);
- WsClient
WsClient is inherited from Phoenix(source),
import WsClient from '@arcblock/ws/lib/client';
// create instance
const socket = new WsClient(`//${window.location.hostname}`, {
// params will be passed to server through url
params: () => ({
// token is used for authentication
token: window.localStorage.getItem('abt_node_login_token'),
}),
// Defaults to none
logger: (type, msg, data) => console.log(type, msg, data),
});
// connect
socket.connect();
// add subscriber
socket.on('blocklet.installed', callback1);
socket.on('notification.create', callback2);
// remove subscriber
socket.off('blocklet.installed', callback1);
socket.off('notification.create', callback2);
// More flexible subscription
const subscription = socket.subscribe('topic', {});
subscription.on('event', ({ response }) => {
// Do something with the event data
});
// disconnect
socket.disconnect(() => {
// after disconnected...
});
- Hooks
It's very simple to create hooks in react apps.