UNPKG

resolve-local-event-broker

Version:

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

140 lines (131 loc) 4.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _constants = require("../constants"); const pushNotificationAndGetSubscriptions = async (pool, payload) => { const { database: { escapeId, escapeStr, runQuery, runRawQuery, encodeJsonPath }, invokeOperation, invokeConsumer, generateGuid } = pool; const { event } = payload; const notificationsTableNameAsId = escapeId(_constants.NOTIFICATIONS_TABLE_NAME); const subscribersTableNameAsId = escapeId(_constants.SUBSCRIBERS_TABLE_NAME); const insertionId = generateGuid(event.aggregateId, event.aggregateVersion); await runRawQuery(` INSERT OR IGNORE 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(`${event.aggregateId}:${event.aggregateVersion}`)} AS "aggregateIdAndVersion", ${escapeStr(_constants.NotificationStatus.RECIEVED)} AS "status" FROM ( SELECT ${subscribersTableNameAsId}."subscriptionId" FROM ${subscribersTableNameAsId} WHERE ${subscribersTableNameAsId}."status" = ${escapeStr(_constants.SubscriptionStatus.DELIVER)} AND ${subscribersTableNameAsId}."deliveryStrategy" <> ${escapeStr(_constants.DeliveryStrategy.PASSTHROUGH)} AND ( json_extract( ${subscribersTableNameAsId}."eventTypes", ${escapeStr(`$.${JSON.stringify(encodeJsonPath(event.type))}`)} ) = 1 OR json_extract( ${subscribersTableNameAsId}."eventTypes", '$' ) IS NULL ) AND ( json_extract( ${subscribersTableNameAsId}."aggregateIds", ${escapeStr(`$.${JSON.stringify(encodeJsonPath(event.aggregateId))}`)} ) = 1 OR json_extract( ${subscribersTableNameAsId}."aggregateIds", '$' ) IS NULL ) AND NOT EXISTS ( SELECT ${notificationsTableNameAsId}."subscriptionId" FROM ${notificationsTableNameAsId} WHERE ${notificationsTableNameAsId}."subscriptionId" = ${notificationsTableNameAsId} AND ${notificationsTableNameAsId}."batchId" IS NULL ) ) "subscriptionIds"; COMMIT; BEGIN IMMEDIATE; `); const subscriptionIdsResult = await runQuery(` SELECT "subscriptionId" FROM ${notificationsTableNameAsId} WHERE "insertionId" = ${escapeStr(insertionId)} `); const pullPromises = []; for (const { subscriptionId } of subscriptionIdsResult) { const input = { type: _constants.PrivateOperationType.PULL_NOTIFICATIONS, payload: { subscriptionId } }; pullPromises.push(invokeOperation(pool, _constants.LazinessStrategy.EAGER, input)); } await Promise.all(pullPromises); const passthroughSubscriptions = await runQuery(` SELECT ${subscribersTableNameAsId}."eventSubscriber" AS "eventSubscriber" FROM ${subscribersTableNameAsId} WHERE ${subscribersTableNameAsId}."status" = ${escapeStr(_constants.SubscriptionStatus.DELIVER)} AND ${subscribersTableNameAsId}."deliveryStrategy" = ${escapeStr(_constants.DeliveryStrategy.PASSTHROUGH)} AND ( json_extract( ${subscribersTableNameAsId}."eventTypes", ${escapeStr(`$."${encodeJsonPath(event.type)}"`)} ) = 1 OR json_extract( ${subscribersTableNameAsId}."eventTypes", '$' ) IS NULL ) AND ( json_extract( ${subscribersTableNameAsId}."aggregateIds", ${escapeStr(`$."${encodeJsonPath(event.aggregateId)}"`)} ) = 1 OR json_extract( ${subscribersTableNameAsId}."aggregateIds", '$' ) IS NULL ) `); const passthroughPromises = []; for (const { eventSubscriber } of passthroughSubscriptions) { passthroughPromises.push(invokeConsumer(pool, _constants.ConsumerMethod.SendEvents, { eventSubscriber, events: [event], batchId: null })); } await Promise.all(passthroughPromises); }; var _default = pushNotificationAndGetSubscriptions; exports.default = _default; //# sourceMappingURL=push-notification-and-get-subscriptions.js.map