const WebSocket = require('ws'); const UrlParser = require('url'); const uuid = require('node-uuid'); const Messenger = require('./messenger'); const RicochetApp = require(`${__dirname}/../server/ricochet.js`); const apps = { '/ricochet': new RicochetApp({ messenger: new Messenger() }) }; // Make sure all apps follow the messaging contract. Object.keys(apps).forEach((key) => { const app = apps[key]; const valid = app && app.messenger && app.onConnect && app.onMessage && app.onDisconnect; if (!valid) { delete apps[key]; console.log(`Application at ${key} is missing one or more: messenger, onConnect, onMessage, onDisconnect.`); } }); const onConnect = (ws, req) => { // Store an ID on the socket connection. ws.id = uuid.v4(); const url = UrlParser.parse(req.url, true); const app = apps[url.pathname]; if (app) { app.messenger.subscribe(ws); app.onConnect(ws, req); ws.on('message', app.onMessage); ws.on('close', () => { app.onDisconnect(ws); app.messenger.unsubscribe(ws); }); } }; //===== Generic socket server for any application instantiated above. const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', onConnect); console.log("Websocket server listening on :8080");