From 7a3fbbb8c1b1ab731881bc8ff605b934b0eaecff Mon Sep 17 00:00:00 2001 From: dave Date: Sun, 23 Feb 2025 18:40:21 +0100 Subject: [PATCH] first commit with ugly code --- README.md | 3 ++ indes.js | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 17 +++++++++++ 3 files changed, 99 insertions(+) create mode 100644 indes.js create mode 100644 package.json diff --git a/README.md b/README.md index e69de29..58aba6e 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,3 @@ +# Timobert Server + +Pure WebSocket server for Timobert's client. diff --git a/indes.js b/indes.js new file mode 100644 index 0000000..ca07a51 --- /dev/null +++ b/indes.js @@ -0,0 +1,79 @@ +import { WebSocketServer } from 'ws'; +import { MongoClient } from 'mongodb'; + +const mongo = new MongoClient(process.env.MONGO_CONN_STR); +const db = mongo.db(); +const collections = {}; + +const wss = new WebSocketServer({ port: 7130 }); +const connections = []; +const subscriptions = []; + +async function executeSet(message, ws) { + let subject = collections[message.subject]; + if (!subject) { + subject = collections[message.subject] = db.collection(message.subject); + } + let newValue = {$set: {}}; + newValue.$set[message.field + '.modifiedAt'] = Date.now(); + newValue.$set[message.field + '.modifiedBy'] = 'anonymous'; + newValue.$set[message.field + '.transientValue'] = message.value; + + await subject.updateMany(message.filter, newValue, { upsert: true }) +} + +wss.on('connection', function connection(ws) { + connections.push(ws); + console.log('accepted new connection'); + + ws.on('error', console.error); + ws.on('close', e => { + console.log('closed a connection'); + connections.splice(connections.indexOf(ws), 1); + }); + + ws.on('message', function message(data, isBinary) { + console.log('received a new message'); + + try { + let message = JSON.parse(data); + console.log('message action is ' + message.action); + + switch (message.action) { + case 'set': + executeSet(message, ws).catch(console.error); + break; + case 'subscribe': + if (!subscriptions[message.subject]) { + subscriptions[message.subject] = {}; + } + if (!subscriptions[message.subject][JSON.stringify(message.filter)]) { + subscriptions[message.subject][JSON.stringify(message.filter)] = {}; + } + if (!subscriptions[message.subject][JSON.stringify(message.filter)][message.field]) { + subscriptions[message.subject][JSON.stringify(message.filter)][message.field] = []; + } + subscriptions[message.subject][JSON.stringify(message.filter)][message.field].push(ws); + let subject = collections[message.subject]; + if (!subject) { + subject = collections[message.subject] = db.collection(message.subject); + } + subject.find(message.filter, {}).toArray().then(r => { + ws.send(JSON.stringify({ + subject: message.subject, + field: message.field, + filter: message.filter, + value: r.map(v => v[message.field]) + })); + }); + + break; + } + + } catch (e) { + console.error('error while processing message', e); + ws.send(JSON.stringify(e)); + } + }); + +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..f15bcd8 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "server", + "version": "1.0.0", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node --env-file=.env index.js" + }, + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "mongodb": "^6.13.0", + "ws": "^8.18.0" + } +}