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(`==================== \n\nCRITICAL ERROR! \n\nApplication at ${key} is missing one or more: messenger, onConnect, onMessage, onDisconnect.\n\n====================\n`); } }); 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', (rawBody) => { app.onMessage(ws, rawBody); }); 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");