From 66ec28dd83d7c0a6c8d62a6dc4a4960a5b8139bc Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Sat, 14 Oct 2023 18:33:41 +0200 Subject: [PATCH] Refactor DB notifications listener to support large payloads. The listener will automatically retrieve the full payload before passing it on to event handlers. --- lib/www/server/lib/db/notify.js | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/www/server/lib/db/notify.js b/lib/www/server/lib/db/notify.js index 5ff9e9c..4b364e9 100644 --- a/lib/www/server/lib/db/notify.js +++ b/lib/www/server/lib/db/notify.js @@ -1,5 +1,31 @@ -const { makeSubscriber } = require('./connection'); +const { makeSubscriber, pool } = require('./connection'); +const { ALERT, ERROR, WARNING, NOTICE, INFO, DEBUG } = require('DOUGAL_ROOT/debug')(__filename); +async function fullPayload (payload) { + + if (!payload.payload_id) { + return payload; + } else { + let client, res; + try { + client = await pool.connect(); + const text = `SELECT payload FROM notify_payloads WHERE id = $1;`; + const values = [ payload.payload_id ]; + res = await client.query(text, values); + res = res?.rows[0]?.payload; + DEBUG(`Oversize notification payload retrieved with id ${payload.payload_id} and size ${res.length}`); + // DEBUG(res); + res = JSON.parse(res); + } catch (err) { + ERROR(err); + } finally { + if (client) { + client.release(); + } + } + return res; + } +} async function listen (addChannels, callback) { @@ -18,11 +44,11 @@ async function listen (addChannels, callback) { for (const channel of addChannels) { await client.listenTo(channel); - client.notifications.on(channel, (payload) => { + client.notifications.on(channel, async (payload) => { const data = { channel, _received: new Date(), - payload + payload: await fullPayload(payload) }; callback(data); });