other/train-to-cloud-city/devices/rfid/utils/metrics.js (36 lines of code) (raw):

const { PubSub } = require("@google-cloud/pubsub"); const pubSubClient = new PubSub(); let queuedMetricsToPublish = []; /** * queueMessageToPublish * --------------------------- * Queue up metrics to publish while game is going on */ function queueMessageToPublish(topic, data) { const dataBuffer = Buffer.from(JSON.stringify(data)); const publishTimeBuffer = Buffer.from( JSON.stringify({ timestamp: Date.now() }), ); queuedMetricsToPublish.push({ topic, publishTime: publishTimeBuffer, data: dataBuffer, }); } /** * publishQueuedMessages * --------------------------- * As long as there are items in the queue to publish * continue pushing items up to google-cloud pubsub */ (async function publishQueuedMessages() { setInterval(() => { queuedMetricsToPublish?.forEach(async (metrics) => { const topicBuffer = Buffer.from(JSON.stringify(metrics?.topic)); try { const messageId = await pubSubClient .topic(metrics?.topic) .publishMessage({ data: metrics?.data, topic: topicBuffer, timestamp: metrics?.publishTime, }); console.log(`Message ${messageId} published.`); // clear published metrics queuedMetricsToPublish = []; } catch (error) { console.error(`Received error while publishing: ${error.message}`); process.exitCode = 1; } }); }, 500); })(); module.exports = { queueMessageToPublish };