UNPKG

resolve-local-event-broker

Version:

The reSolve framework's event broker for applications on a local machine.

96 lines (87 loc) 3.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _constants = require("../constants"); const resumeSubscriber = async (pool, payload) => { const { database: { escapeId, escapeStr, runQuery, runRawQuery }, invokeOperation, generateGuid } = pool; const { eventSubscriber, conditionalResume } = payload; const notificationsTableNameAsId = escapeId(_constants.NOTIFICATIONS_TABLE_NAME); const subscribersTableNameAsId = escapeId(_constants.SUBSCRIBERS_TABLE_NAME); const insertionId = generateGuid('FORCEUPDATE'); await runRawQuery(` UPDATE ${subscribersTableNameAsId} SET "status" = ${escapeStr(_constants.SubscriptionStatus.DELIVER)} WHERE "eventSubscriber" = ${escapeStr(eventSubscriber)} AND ${conditionalResume ? `"status" = ${escapeStr(_constants.SubscriptionStatus.DELIVER)}` : `"status" <> ${escapeStr(_constants.SubscriptionStatus.ERROR)}`}; INSERT INTO ${notificationsTableNameAsId}( "insertionId", "subscriptionId", "incomingTimestamp", "processStartTimestamp", "processEndTimestamp", "heartbeatTimestamp", "aggregateIdAndVersion", "status" ) SELECT ${escapeStr(insertionId)} AS "insertionId", "subscriptionIds"."subscriptionId" AS "subscriptionId", CAST(strftime('%s','now') || substr(strftime('%f','now'),4) AS ${_constants.LONG_INTEGER_SQL_TYPE}) AS "incomingTimestamp", NULL AS "processStartTimestamp", NULL AS "processEndTimestamp", NULL AS "heartbeatTimestamp", ${escapeStr('FORCEUPDATE')} AS "aggregateIdAndVersion", ${escapeStr(_constants.NotificationStatus.RECIEVED)} AS "status" FROM ( SELECT ${subscribersTableNameAsId}."subscriptionId" FROM ${subscribersTableNameAsId} WHERE "eventSubscriber" = ${escapeStr(eventSubscriber)} AND "status" = ${escapeStr(_constants.SubscriptionStatus.DELIVER)} AND "deliveryStrategy" <> ${escapeStr(_constants.DeliveryStrategy.PASSTHROUGH)} ) "subscriptionIds"; COMMIT; BEGIN IMMEDIATE; `); const result = await runQuery(` SELECT ${subscribersTableNameAsId}."subscriptionId", ${subscribersTableNameAsId}."status" FROM ${subscribersTableNameAsId} WHERE "eventSubscriber" = ${escapeStr(eventSubscriber)} AND ( "status" = ${escapeStr(_constants.SubscriptionStatus.DELIVER)} OR "status" = ${escapeStr(_constants.SubscriptionStatus.SKIP)} ) `); if (result == null || result.length !== 1) { throw new Error(`Notification for event subscriber ${eventSubscriber} cannot be pushed`); } const { subscriptionId, status } = result[0]; if (status === _constants.SubscriptionStatus.DELIVER) { const input = { type: _constants.PrivateOperationType.PULL_NOTIFICATIONS, payload: { subscriptionId } }; await invokeOperation(pool, _constants.LazinessStrategy.EAGER, input); } }; var _default = resumeSubscriber; exports.default = _default; //# sourceMappingURL=resume-subscriber.js.map