From 35cfe200626849f463e9ed791b27b7a889931ddf Mon Sep 17 00:00:00 2001 From: Timo Reichl Date: Sun, 30 Mar 2025 13:39:12 +0200 Subject: [PATCH] =?UTF-8?q?If-Abfrage=20f=C3=BCr=20ObjectId-Filterung=20ei?= =?UTF-8?q?ngebaut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 74 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/index.js b/index.js index 828c284..e78006f 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,5 @@ -import { WebSocketServer } from 'ws'; -import { MongoClient } from 'mongodb'; +import { WebSocketServer } from "ws"; +import { MongoClient, ObjectId } from "mongodb"; const mongo = new MongoClient(process.env.MONGO_CONN_STR); const db = mongo.db(); @@ -14,56 +14,72 @@ async function executeSet(message, ws) { 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; + 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 }) + await subject.updateMany(message.filter, newValue, { upsert: true }); } -wss.on('connection', function connection(ws) { +wss.on("connection", function connection(ws) { connections.push(ws); - console.log('accepted new connection'); + console.log("accepted new connection"); - ws.on('error', console.error); - ws.on('close', e => { - console.log('closed a 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'); + ws.on("message", function message(data, isBinary) { + console.log("received a new message"); + if ( + message.filter && + message.filter._id && + typeof message.filter._id === "string" + ) { + try { + message.filter._id = new ObjectId(message.filter._id); + } catch (e) { + console.error("Invalid ObjectId in filter:", e); + } + } try { let message = JSON.parse(data); - console.log('message action is ' + message.action); + console.log("message action is " + message.action); switch (message.action) { - case 'set': + case "set": executeSet(message, ws).catch(console.error); break; - case 'subscribe': + case "subscribe": let subject = collections[message.subject]; if (!subject) { - subject = collections[message.subject] = db.collection(message.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]) - })); - }); + 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); + console.error("error while processing message", e); ws.send(JSON.stringify(e)); } }); - });