From f90cd8fece6fbc9d290789e944c8b18ac7c4fa02 Mon Sep 17 00:00:00 2001 From: Praveen Ravichandran Date: Sat, 23 Jan 2021 21:55:56 -0500 Subject: [PATCH] Updates --- package-lock.json | 5 +++++ src/index.js | 54 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index dcd04cd..16eb003 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "ws": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", diff --git a/src/index.js b/src/index.js index 3780c9e..6240907 100644 --- a/src/index.js +++ b/src/index.js @@ -1,12 +1,56 @@ const WebSocket = require('ws'); - +const url = require('url'); const wss = new WebSocket.Server({ port: 3000 }); -wss.on('connection', (ws) => { - console.log('New User Connected'); - ws.on('message', (data) => { - console.log(data); +const clients = []; +const webClients = []; +const DATA = {}; + +wss.on('connection', (ws, req) => { + const { query: { token, type } } = url.parse(req.url, true); + if(token && type && type === 'web'){ + ws.id = token; + webClients.push(ws); + console.log('New Web Client Connected', 'Clients: ' + clients.length, 'Web Clients: ' + webClients.length); + } + + if(token && type && type === 'bridge') { + ws.id = token; + clients.push(ws); + console.log('New User Connected:' + token, 'Clients: ' + clients.length, 'Web Clients: ' + webClients.length); + } + + ws.on('message', (data) => { + data = JSON.parse(data); + DATA[ws.id] = data; + const eegs = Object.values(DATA).map(e => e.rawEeg); + const average = { + rawEeg: eegs.reduce((r, a) => { + a.forEach((b, i) => { + r[i] = (r[i] || 0) + b; + }); + return r; + }, []).map(e => e / clients.length), + timestamp: new Date().getTime() + } + webClients.forEach((ws) => { + ws.send(JSON.stringify(average)); }); + }); + ws.on('close', () => { + if(clients.findIndex(w => w.id === ws.id) > -1) { + clients.splice(clients.findIndex(w => w.id === ws.id), 1); + } + if(webClients.findIndex(w => w.id === ws.id) > -1) { + webClients.splice(webClients.findIndex(w => w.id === ws.id), 1); + } + try { + delete DATA[ws.id]; + console.log('User Disconnected:' + ws.id, 'Clients: ' + clients.length, 'Web Clients: ' + webClients.length); + } catch (error) { + + } + }); }); \ No newline at end of file