const WebSocket = require('ws') const wss = new WebSocket.Server({ noServer: true, clientTracking: true }) let vvvv = null const connections = new Map() // Dynamic message processor const messageProcessor = { hello_v4: (ws, msg) => registerV4(ws), new_user: (ws, msg) => newUser(ws, msg), default: (ws, msg) => unknownMsg(msg), ui_counter: (ws, msg) => uiCounter(msg), } const registerV4 = (ws, msg) => { console.log('⬛ vvvv client connected') vvvv = ws // if (vvvv?.readyState === WebSocket.OPEN) { // vvvv.send(JSON.stringify(connections)) // } } const newUser = (ws, msg) => { console.log(`👤 New user connected: ${msg.user}`) ws.user = msg.user connections.set(msg.id, ws) if (vvvv?.readyState === WebSocket.OPEN) { vvvv.send(JSON.stringify(msg)) } } const unknownMsg = (msg) => { console.log('❔Unknown message type...') console.log(msg) } // Interaction messsages const uiCounter = (msg) => { console.log(`➕ Counter Interaction: +1 from ${connections.get(msg.id).user}`) if (vvvv?.readyState === WebSocket.OPEN) { vvvv.send(JSON.stringify(msg)) } } // Websocket Events wss.on('connection', (ws) => { ws.on('message', (data) => { let message try { message = JSON.parse(data) } catch (e) {} if (message) { ;(messageProcessor[message.type] || messageProcessor.default)(ws, message) } }) ws.on('close', () => { // console.log('Client Disconnected') }) }) // Upgrade connection export default function () { this.nuxt.hook('listen', (server) => { server.on('upgrade', (request, socket, head) => { wss.handleUpgrade(request, socket, head, (ws) => { wss.emit('connection', ws) }) }) }) }