resolve-local-event-broker
Version:
The reSolve framework's event broker for applications on a local machine.
96 lines (87 loc) • 3.2 kB
JavaScript
;
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