2020-09-03 14:04:29 +02:00
|
|
|
const { pool } = require('../lib/db/connection');
|
|
|
|
|
|
|
|
|
|
var client;
|
|
|
|
|
|
|
|
|
|
const channels = {};
|
|
|
|
|
|
|
|
|
|
async function notify (data) {
|
|
|
|
|
if (data.channel in channels) {
|
|
|
|
|
data._received = new Date();
|
2020-09-25 18:26:04 +02:00
|
|
|
try {
|
|
|
|
|
const json = JSON.parse(data.payload);
|
|
|
|
|
data.payload = json;
|
|
|
|
|
} catch {
|
|
|
|
|
// Ignore the error
|
|
|
|
|
}
|
2020-09-03 14:04:29 +02:00
|
|
|
for (const listener of channels[data.channel]) {
|
|
|
|
|
listener(data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function listen (addChannels, callback) {
|
|
|
|
|
if (!client) {
|
|
|
|
|
client = await pool.connect();
|
|
|
|
|
client.on('notification', notify);
|
|
|
|
|
console.log("Client connected");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(addChannels)) {
|
|
|
|
|
addChannels = [addChannels];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const channel of addChannels) {
|
|
|
|
|
if (!(channel in channels)) {
|
|
|
|
|
await client.query("LISTEN "+channel);
|
|
|
|
|
channels[channel] = new Set();
|
|
|
|
|
console.log("Listening to ", channel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
channels[channel].add(callback);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
listen
|
|
|
|
|
}
|