@signageos/lib 23.9.1 → 23.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/AMQP/CQRS/ICommand.d.ts +3 -36
- package/dist/AMQP/CQRS/ICommand.js +18 -0
- package/dist/AMQP/CQRS/ICommand.js.map +1 -1
- package/dist/AMQP/CQRS/ICommandError.d.ts +4 -4
- package/dist/AMQP/CQRS/commandQueue.d.ts +4 -59
- package/dist/AMQP/CQRS/commandQueue.js +16 -308
- package/dist/AMQP/CQRS/commandQueue.js.map +1 -1
- package/dist/AMQP/CQRS/commandResponseHelper.d.ts +4 -3
- package/dist/AMQP/CQRS/commandResponseHelper.js +18 -5
- package/dist/AMQP/CQRS/commandResponseHelper.js.map +1 -1
- package/dist/AMQP/CQRS/storedCommandQueue.d.ts +4 -27
- package/dist/AMQP/CQRS/storedCommandQueue.js +16 -296
- package/dist/AMQP/CQRS/storedCommandQueue.js.map +1 -1
- package/dist/AMQP/ChannelProvider.d.ts +5 -37
- package/dist/AMQP/ChannelProvider.js +9 -868
- package/dist/AMQP/ChannelProvider.js.map +1 -1
- package/dist/AMQP/DeviceActions/Bridge/deviceActionBridgeFactory.d.ts +4 -39
- package/dist/AMQP/DeviceActions/Bridge/deviceActionBridgeFactory.js +16 -287
- package/dist/AMQP/DeviceActions/Bridge/deviceActionBridgeFactory.js.map +1 -1
- package/dist/AMQP/DeviceActions/IDeviceAction.d.ts +4 -4
- package/dist/AMQP/DeviceActions/deviceActionsQueue.d.ts +2 -81
- package/dist/AMQP/DeviceActions/deviceActionsQueue.js +14 -531
- package/dist/AMQP/DeviceActions/deviceActionsQueue.js.map +1 -1
- package/dist/AMQP/EventSourcing/EventConsumer/AmqpEventConsumer.d.ts +2 -45
- package/dist/AMQP/EventSourcing/EventConsumer/AmqpEventConsumer.js +14 -211
- package/dist/AMQP/EventSourcing/EventConsumer/AmqpEventConsumer.js.map +1 -1
- package/dist/AMQP/EventSourcing/EventConsumer/IEventConsumer.d.ts +2 -11
- package/dist/AMQP/EventSourcing/EventConsumer/IEventConsumer.js +18 -0
- package/dist/AMQP/EventSourcing/EventConsumer/IEventConsumer.js.map +1 -1
- package/dist/AMQP/EventSourcing/EventConsumer/InMemoryEventConsumer.d.ts +2 -13
- package/dist/AMQP/EventSourcing/EventConsumer/InMemoryEventConsumer.js +14 -69
- package/dist/AMQP/EventSourcing/EventConsumer/InMemoryEventConsumer.js.map +1 -1
- package/dist/AMQP/EventSourcing/IEvent.d.ts +3 -70
- package/dist/AMQP/EventSourcing/IEvent.js +18 -0
- package/dist/AMQP/EventSourcing/IEvent.js.map +1 -1
- package/dist/AMQP/EventSourcing/Locked/deferredState.d.ts +2 -19
- package/dist/AMQP/EventSourcing/Locked/deferredState.js +15 -66
- package/dist/AMQP/EventSourcing/Locked/deferredState.js.map +1 -1
- package/dist/AMQP/EventSourcing/Locked/lockedEventConsumer.d.ts +2 -68
- package/dist/AMQP/EventSourcing/Locked/lockedEventConsumer.js +14 -429
- package/dist/AMQP/EventSourcing/Locked/lockedEventConsumer.js.map +1 -1
- package/dist/AMQP/EventSourcing/Locked/rejectedTimestamps.d.ts +2 -22
- package/dist/AMQP/EventSourcing/Locked/rejectedTimestamps.js +16 -59
- package/dist/AMQP/EventSourcing/Locked/rejectedTimestamps.js.map +1 -1
- package/dist/AMQP/EventSourcing/Locked/withLock.d.ts +2 -40
- package/dist/AMQP/EventSourcing/Locked/withLock.js +14 -134
- package/dist/AMQP/EventSourcing/Locked/withLock.js.map +1 -1
- package/dist/AMQP/EventSourcing/eventQueue.d.ts +2 -85
- package/dist/AMQP/EventSourcing/eventQueue.js +14 -132
- package/dist/AMQP/EventSourcing/eventQueue.js.map +1 -1
- package/dist/AMQP/EventSourcing/eventQueue.utils.d.ts +2 -71
- package/dist/AMQP/EventSourcing/eventQueue.utils.js +16 -152
- package/dist/AMQP/EventSourcing/eventQueue.utils.js.map +1 -1
- package/dist/AMQP/EventSourcing/eventQueueDetached.d.ts +2 -47
- package/dist/AMQP/EventSourcing/eventQueueDetached.js +14 -421
- package/dist/AMQP/EventSourcing/eventQueueDetached.js.map +1 -1
- package/dist/AMQP/EventSourcing/eventQueueDomain.d.ts +2 -53
- package/dist/AMQP/EventSourcing/eventQueueDomain.js +14 -611
- package/dist/AMQP/EventSourcing/eventQueueDomain.js.map +1 -1
- package/dist/AMQP/EventSourcing/eventQueuePublish.d.ts +2 -17
- package/dist/AMQP/EventSourcing/eventQueuePublish.js +14 -202
- package/dist/AMQP/EventSourcing/eventQueuePublish.js.map +1 -1
- package/dist/AMQP/EventSourcing/synchronization.d.ts +2 -37
- package/dist/AMQP/EventSourcing/synchronization.js +18 -9
- package/dist/AMQP/EventSourcing/synchronization.js.map +1 -1
- package/dist/AMQP/Exchange.d.ts +4 -1
- package/dist/AMQP/Exchange.js +18 -0
- package/dist/AMQP/Exchange.js.map +1 -1
- package/dist/AMQP/IAsyncGotMessage.d.ts +2 -13
- package/dist/AMQP/IAsyncGotMessage.js +18 -0
- package/dist/AMQP/IAsyncGotMessage.js.map +1 -1
- package/dist/AMQP/IChannel.d.ts +5 -43
- package/dist/AMQP/IChannel.js +18 -0
- package/dist/AMQP/IChannel.js.map +1 -1
- package/dist/AMQP/IConsumeOptions.d.ts +5 -106
- package/dist/AMQP/IConsumeOptions.js +18 -0
- package/dist/AMQP/IConsumeOptions.js.map +1 -1
- package/dist/AMQP/IMessageOptions.d.ts +5 -6
- package/dist/AMQP/IMessageOptions.js +18 -0
- package/dist/AMQP/IMessageOptions.js.map +1 -1
- package/dist/AMQP/INackOptions.d.ts +5 -4
- package/dist/AMQP/INackOptions.js +18 -0
- package/dist/AMQP/INackOptions.js.map +1 -1
- package/dist/AMQP/IQueueOptions.d.ts +5 -8
- package/dist/AMQP/IQueueOptions.js +18 -0
- package/dist/AMQP/IQueueOptions.js.map +1 -1
- package/dist/AMQP/Logging/IDeviceLog.d.ts +4 -15
- package/dist/AMQP/Logging/IDeviceLog.js +18 -7
- package/dist/AMQP/Logging/IDeviceLog.js.map +1 -1
- package/dist/AMQP/Logging/logDeviceQueue.d.ts +4 -12
- package/dist/AMQP/Logging/logDeviceQueue.js +16 -102
- package/dist/AMQP/Logging/logDeviceQueue.js.map +1 -1
- package/dist/AMQP/QueueFetcher.d.ts +3 -11
- package/dist/AMQP/QueueFetcher.js +17 -156
- package/dist/AMQP/QueueFetcher.js.map +1 -1
- package/dist/AMQP/QueuePublisher.d.ts +5 -7
- package/dist/AMQP/QueuePublisher.js +19 -127
- package/dist/AMQP/QueuePublisher.js.map +1 -1
- package/dist/AMQP/QueueRepeatableSubscription.d.ts +5 -14
- package/dist/AMQP/QueueRepeatableSubscription.js +19 -154
- package/dist/AMQP/QueueRepeatableSubscription.js.map +1 -1
- package/dist/AMQP/QueueSubscriber.d.ts +5 -27
- package/dist/AMQP/QueueSubscriber.js +9 -303
- package/dist/AMQP/QueueSubscriber.js.map +1 -1
- package/dist/AMQP/ResponseProvider.d.ts +4 -20
- package/dist/AMQP/ResponseProvider.js +16 -188
- package/dist/AMQP/ResponseProvider.js.map +1 -1
- package/dist/AMQP/Static/filesQueue.d.ts +4 -12
- package/dist/AMQP/Static/filesQueue.js +6 -205
- package/dist/AMQP/Static/filesQueue.js.map +1 -1
- package/dist/AMQP/amqpConnectionFactory.d.ts +2 -25
- package/dist/AMQP/amqpConnectionFactory.js +4 -219
- package/dist/AMQP/amqpConnectionFactory.js.map +1 -1
- package/dist/AMQP/amqpErrors.d.ts +4 -5
- package/dist/AMQP/amqpErrors.js +18 -27
- package/dist/AMQP/amqpErrors.js.map +1 -1
- package/dist/AMQP/errors.d.ts +4 -3
- package/dist/AMQP/errors.js +18 -27
- package/dist/AMQP/errors.js.map +1 -1
- package/dist/AMQP/fetchNextMessage.d.ts +3 -12
- package/dist/AMQP/fetchNextMessage.js +20 -111
- package/dist/AMQP/fetchNextMessage.js.map +1 -1
- package/dist/AMQP/queueConfigurator.d.ts +2 -3
- package/dist/AMQP/queueConfigurator.js +14 -71
- package/dist/AMQP/queueConfigurator.js.map +1 -1
- package/dist/DateTime/waitUntil.d.ts +4 -15
- package/dist/DateTime/waitUntil.js +17 -139
- package/dist/DateTime/waitUntil.js.map +1 -1
- package/dist/Events/AsyncEventEmitter.d.ts +2 -29
- package/dist/Events/AsyncEventEmitter.js +14 -118
- package/dist/Events/AsyncEventEmitter.js.map +1 -1
- package/dist/Events/eventsHelpers.d.ts +4 -3
- package/dist/Events/eventsHelpers.js +18 -21
- package/dist/Events/eventsHelpers.js.map +1 -1
- package/dist/Hash/checksum.d.ts +2 -3
- package/dist/Hash/checksum.js +16 -15
- package/dist/Hash/checksum.js.map +1 -1
- package/dist/Hash/checksumFile.d.ts +2 -2
- package/dist/Hash/checksumFile.js +4 -65
- package/dist/Hash/checksumFile.js.map +1 -1
- package/dist/Hash/generator.d.ts +4 -2
- package/dist/Hash/generator.js +18 -12
- package/dist/Hash/generator.js.map +1 -1
- package/dist/HttpStatus/checks/amqpStatusCheck.d.ts +1 -1
- package/dist/HttpStatus/statuses/amqpStatus.d.ts +1 -1
- package/dist/Metrics/MetricsClient.d.ts +2 -44
- package/dist/Metrics/MetricsClient.js +6 -86
- package/dist/Metrics/MetricsClient.js.map +1 -1
- package/dist/Metrics/metrics.d.ts +2 -82
- package/dist/Metrics/metrics.js +4 -238
- package/dist/Metrics/metrics.js.map +1 -1
- package/dist/Metrics/processSocketsMetrics.d.ts +4 -10
- package/dist/Metrics/processSocketsMetrics.js +17 -88
- package/dist/Metrics/processSocketsMetrics.js.map +1 -1
- package/dist/Service/dbConnections.d.ts +1 -1
- package/dist/Service/metrics/connections.js +7 -7
- package/dist/Service/metrics/connections.js.map +1 -1
- package/dist/ThirdParty/connection.d.ts +0 -11
- package/package.json +5 -9
- package/dist/AMQP/IAMQPPool.d.ts +0 -5
- package/dist/AMQP/IAMQPPool.js +0 -3
- package/dist/AMQP/IAMQPPool.js.map +0 -1
- package/dist/Events/genericGracefulExit.d.ts +0 -11
- package/dist/Events/genericGracefulExit.js +0 -90
- package/dist/Events/genericGracefulExit.js.map +0 -1
- package/dist/GenericPool/options.d.ts +0 -63
- package/dist/GenericPool/options.js +0 -3
- package/dist/GenericPool/options.js.map +0 -1
- package/dist/Metrics/deviceConsumerMetrics.d.ts +0 -6
- package/dist/Metrics/deviceConsumerMetrics.js +0 -59
- package/dist/Metrics/deviceConsumerMetrics.js.map +0 -1
- package/dist/Metrics/eventConsumerMetrics.d.ts +0 -19
- package/dist/Metrics/eventConsumerMetrics.js +0 -52
- package/dist/Metrics/eventConsumerMetrics.js.map +0 -1
- package/dist/Metrics/eventQueueMetrics.d.ts +0 -7
- package/dist/Metrics/eventQueueMetrics.js +0 -19
- package/dist/Metrics/eventQueueMetrics.js.map +0 -1
- package/dist/Pool/IBasePool.d.ts +0 -6
- package/dist/Pool/IBasePool.js +0 -3
- package/dist/Pool/IBasePool.js.map +0 -1
- package/dist/System/signalSender.d.ts +0 -1
- package/dist/System/signalSender.js +0 -7
- package/dist/System/signalSender.js.map +0 -1
|
@@ -1,70 +1,4 @@
|
|
|
1
|
-
import { IAMQPConnection } from '../../amqpConnectionFactory';
|
|
2
|
-
import IEvent, { IEventPayload } from '../IEvent';
|
|
3
|
-
export interface LockedBindOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Number of events to prefetch from the main queue.
|
|
6
|
-
* This number has to greater than 0.
|
|
7
|
-
* Make sure that you have enough main prefetch count that can properly utilize the distributed prefetch count
|
|
8
|
-
* for all started consumers. The general rule is to have at least the same number of main prefetch count as the number of consumers times distributed prefetch count.
|
|
9
|
-
* In other words: `mainPrefetchCount >= numberOfConsumers * distributedPrefetchCount`
|
|
10
|
-
*/
|
|
11
|
-
mainPrefetchCount?: number;
|
|
12
|
-
/**
|
|
13
|
-
* Number of events to prefetch from the distributed queue.
|
|
14
|
-
* This number can be 0, which means that the distributed consumption is disabled.
|
|
15
|
-
* In this case, the events are consumed directly from the main queue and the distributed queue is not used (neither created).
|
|
16
|
-
* If this number is greater than 0, the distributed consumption is enabled and the events are distributed from the main queue to the distributed queue.
|
|
17
|
-
* You can scale the number of consumers that multiply the total number of possibly concurrently processed events.
|
|
18
|
-
*/
|
|
19
|
-
distributedPrefetchCount?: number;
|
|
20
|
-
/**
|
|
21
|
-
* Maximum time to wait before flushing the batch even if maxBatchSize is not reached.
|
|
22
|
-
*/
|
|
23
|
-
flushBatchDelayMs?: number;
|
|
24
|
-
/**
|
|
25
|
-
* Delay in milliseconds before redelivering the event in case of error.
|
|
26
|
-
* It's dead-lettered on the first error and redirected to the event_rejected queue for the specified delay.
|
|
27
|
-
*/
|
|
28
|
-
redeliverDelayMs?: number;
|
|
29
|
-
/**
|
|
30
|
-
* If true, binding is done with notification option, so the exchange is prefixed with `events_notifications-` instead of standard `events-`.
|
|
31
|
-
* @deprecated This logic is about to be removed soon. Use it temporarily only for platform-consumer-redis until it's migrated to the new logic.
|
|
32
|
-
* The new logic is based on strong consistency awaiting.
|
|
33
|
-
*/
|
|
34
|
-
legacyNotification?: boolean;
|
|
35
|
-
}
|
|
36
1
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* It ensures that only one event with the same lockKey is processed at a time.
|
|
40
|
-
* Practically, it means that events with the same lockKey are processed sequentially.
|
|
41
|
-
* However, events with different lockKeys can be processed in parallel.
|
|
42
|
-
*
|
|
43
|
-
* The consumer includes a rejection mechanism that prevents processing events out of order
|
|
44
|
-
* when temporary failures occur (e.g., MongoDB transaction failures). Failed events are
|
|
45
|
-
* sent to rejected queues (dead-letter queues) and their timestamps are tracked to ensure
|
|
46
|
-
* later events with the same lockKeys wait until earlier failed events are resolved.
|
|
47
|
-
*
|
|
48
|
-
* Internal implementation uses 2 separate queues (if distributedPrefetchCount > 0):
|
|
49
|
-
* - Main queue for distributing events to distributed queue
|
|
50
|
-
* - Distributed queue for processing events
|
|
51
|
-
*
|
|
52
|
-
* The main queue is "Single Active Consumer" and is locking the event processing based on lockKeys field of the event.
|
|
53
|
-
* So the order of events is preserved based on the lockKeys.
|
|
54
|
-
* However, the distributed queue is not locking the event processing and is processing across multiple consumers at the same time.
|
|
55
|
-
* Messages in the distributed queue are transient. In case of failure, they are not lost because the main queue is persistent
|
|
56
|
-
* and is not acked until the distributed queue acks the message.
|
|
2
|
+
* @deprecated Use `@signageos/amqp` instead.
|
|
57
3
|
*/
|
|
58
|
-
export
|
|
59
|
-
private amqpConnection;
|
|
60
|
-
private withLock;
|
|
61
|
-
constructor(amqpConnection: IAMQPConnection);
|
|
62
|
-
bind<TPayload extends IEventPayload>(eventTypes: string[], domainName: string, consumerType: string, onEvent: (event: IEvent<TPayload>) => Promise<void>, bindOptions?: LockedBindOptions): Promise<() => Promise<() => Promise<void>>>;
|
|
63
|
-
bindBatch<TPayload extends IEventPayload>(eventTypes: string[], domainName: string, consumerType: string, onEventsBatch: (events: IEvent<TPayload>[]) => Promise<void>, bindOptions?: LockedBindOptions): Promise<() => Promise<() => Promise<void>>>;
|
|
64
|
-
private createMainBindOptions;
|
|
65
|
-
private createConsumeEvent;
|
|
66
|
-
private createConsumeEventsBatch;
|
|
67
|
-
private createDistributedBindOptions;
|
|
68
|
-
private createDistributeEvent;
|
|
69
|
-
private createDistributeEventsBatch;
|
|
70
|
-
}
|
|
4
|
+
export * from '@signageos/amqp/dist/EventSourcing/Locked/lockedEventConsumer';
|
|
@@ -1,436 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
47
7
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
51
15
|
};
|
|
52
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
-
exports.LockedEventConsumer = void 0;
|
|
54
|
-
var eventQueueDomain_1 = require("../eventQueueDomain");
|
|
55
|
-
var debug_1 = __importDefault(require("debug"));
|
|
56
|
-
var deferredState_1 = require("./deferredState");
|
|
57
|
-
var withLock_1 = require("./withLock");
|
|
58
|
-
var eventConsumerMetrics_1 = require("../../../Metrics/eventConsumerMetrics");
|
|
59
|
-
var rejectedTimestamps_1 = require("./rejectedTimestamps");
|
|
60
|
-
var debug = (0, debug_1.default)('@signageos/lib:AMQP:EventSourcing:Locked:LockedEventConsumer');
|
|
61
|
-
/**
|
|
62
|
-
* The default values for the bind options doesn't allow concurrent processing of events.
|
|
63
|
-
*/
|
|
64
|
-
var DEFAULT_BIND_OPTIONS = {
|
|
65
|
-
mainPrefetchCount: 1,
|
|
66
|
-
distributedPrefetchCount: 0,
|
|
67
|
-
flushBatchDelayMs: 50,
|
|
68
|
-
redeliverDelayMs: 30e3,
|
|
69
|
-
legacyNotification: false,
|
|
70
|
-
};
|
|
71
|
-
var mainEventQueueBindOptions = {
|
|
72
|
-
queueType: 'quorum',
|
|
73
|
-
singleActiveConsumer: true,
|
|
74
|
-
deadLetterIfErred: true,
|
|
75
|
-
};
|
|
76
|
-
var distributedEventQueueBindOptions = {
|
|
77
|
-
queueType: 'classic',
|
|
78
|
-
singleActiveConsumer: false,
|
|
79
|
-
durable: false,
|
|
80
|
-
};
|
|
81
|
-
var DEFAULT_LOCK_KEY = '$default';
|
|
82
|
-
function getEventsType(events) {
|
|
83
|
-
if (events.length === 0) {
|
|
84
|
-
throw new Error('No events to get type from');
|
|
85
|
-
}
|
|
86
|
-
var eventType = events[0].payload.type;
|
|
87
|
-
for (var _i = 0, events_1 = events; _i < events_1.length; _i++) {
|
|
88
|
-
var event_1 = events_1[_i];
|
|
89
|
-
if (event_1.payload.type !== eventType) {
|
|
90
|
-
throw new Error('Events have different types');
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return eventType;
|
|
94
|
-
}
|
|
95
|
-
function getLockKeys(events) {
|
|
96
|
-
var _a;
|
|
97
|
-
var lockKeysSet = new Set();
|
|
98
|
-
for (var _i = 0, events_2 = events; _i < events_2.length; _i++) {
|
|
99
|
-
var event_2 = events_2[_i];
|
|
100
|
-
var lockKeys = (_a = event_2.lockKeys) !== null && _a !== void 0 ? _a : [DEFAULT_LOCK_KEY]; // TODO default lock could be removed one day in future when all events are migrated
|
|
101
|
-
for (var _b = 0, lockKeys_1 = lockKeys; _b < lockKeys_1.length; _b++) {
|
|
102
|
-
var lockKey = lockKeys_1[_b];
|
|
103
|
-
lockKeysSet.add(lockKey);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return Array.from(lockKeysSet);
|
|
107
|
-
}
|
|
108
17
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* It ensures that only one event with the same lockKey is processed at a time.
|
|
112
|
-
* Practically, it means that events with the same lockKey are processed sequentially.
|
|
113
|
-
* However, events with different lockKeys can be processed in parallel.
|
|
114
|
-
*
|
|
115
|
-
* The consumer includes a rejection mechanism that prevents processing events out of order
|
|
116
|
-
* when temporary failures occur (e.g., MongoDB transaction failures). Failed events are
|
|
117
|
-
* sent to rejected queues (dead-letter queues) and their timestamps are tracked to ensure
|
|
118
|
-
* later events with the same lockKeys wait until earlier failed events are resolved.
|
|
119
|
-
*
|
|
120
|
-
* Internal implementation uses 2 separate queues (if distributedPrefetchCount > 0):
|
|
121
|
-
* - Main queue for distributing events to distributed queue
|
|
122
|
-
* - Distributed queue for processing events
|
|
123
|
-
*
|
|
124
|
-
* The main queue is "Single Active Consumer" and is locking the event processing based on lockKeys field of the event.
|
|
125
|
-
* So the order of events is preserved based on the lockKeys.
|
|
126
|
-
* However, the distributed queue is not locking the event processing and is processing across multiple consumers at the same time.
|
|
127
|
-
* Messages in the distributed queue are transient. In case of failure, they are not lost because the main queue is persistent
|
|
128
|
-
* and is not acked until the distributed queue acks the message.
|
|
18
|
+
* @deprecated Use `@signageos/amqp` instead.
|
|
129
19
|
*/
|
|
130
|
-
|
|
131
|
-
function LockedEventConsumer(amqpConnection) {
|
|
132
|
-
this.amqpConnection = amqpConnection;
|
|
133
|
-
this.withLock = (0, withLock_1.createWithLock)({ deferredState: new deferredState_1.DeferredState(), rejectedTimestamps: new rejectedTimestamps_1.RejectedTimestamps() });
|
|
134
|
-
}
|
|
135
|
-
LockedEventConsumer.prototype.bind = function (eventTypes_1, domainName_1, consumerType_1, onEvent_1) {
|
|
136
|
-
return __awaiter(this, arguments, void 0, function (eventTypes, domainName, consumerType, onEvent, bindOptions) {
|
|
137
|
-
var mainBindOptions, distributedBindOptions, consumeEvent, cancelConsumptions, cancelMain, distributeEvent, cancelDistributed, cancelMain;
|
|
138
|
-
var _this = this;
|
|
139
|
-
var _a;
|
|
140
|
-
if (bindOptions === void 0) { bindOptions = DEFAULT_BIND_OPTIONS; }
|
|
141
|
-
return __generator(this, function (_b) {
|
|
142
|
-
switch (_b.label) {
|
|
143
|
-
case 0:
|
|
144
|
-
bindOptions = __assign(__assign({}, DEFAULT_BIND_OPTIONS), bindOptions);
|
|
145
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.prepareRejectedDomain)(this.amqpConnection, domainName, consumerType, {
|
|
146
|
-
redeliverDelayMs: (_a = bindOptions.redeliverDelayMs) !== null && _a !== void 0 ? _a : DEFAULT_BIND_OPTIONS.redeliverDelayMs,
|
|
147
|
-
})];
|
|
148
|
-
case 1:
|
|
149
|
-
_b.sent();
|
|
150
|
-
mainBindOptions = this.createMainBindOptions(bindOptions);
|
|
151
|
-
distributedBindOptions = this.createDistributedBindOptions(bindOptions);
|
|
152
|
-
consumeEvent = this.createConsumeEvent(domainName, consumerType, mainBindOptions, onEvent);
|
|
153
|
-
cancelConsumptions = [];
|
|
154
|
-
if (!(bindOptions.distributedPrefetchCount === 0)) return [3 /*break*/, 3];
|
|
155
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.bindDomain)(this.amqpConnection, eventTypes, domainName, consumerType, consumeEvent, mainBindOptions)];
|
|
156
|
-
case 2:
|
|
157
|
-
cancelMain = _b.sent();
|
|
158
|
-
cancelConsumptions.push(cancelMain);
|
|
159
|
-
return [3 /*break*/, 6];
|
|
160
|
-
case 3:
|
|
161
|
-
distributeEvent = this.createDistributeEvent(domainName, consumerType, distributedBindOptions);
|
|
162
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.bindRPCDomain)(this.amqpConnection, domainName, consumerType, consumeEvent, distributedBindOptions)];
|
|
163
|
-
case 4:
|
|
164
|
-
cancelDistributed = _b.sent();
|
|
165
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.bindDomain)(this.amqpConnection, eventTypes, domainName, consumerType, distributeEvent, mainBindOptions)];
|
|
166
|
-
case 5:
|
|
167
|
-
cancelMain = _b.sent();
|
|
168
|
-
cancelConsumptions.push(cancelDistributed);
|
|
169
|
-
cancelConsumptions.push(cancelMain);
|
|
170
|
-
_b.label = 6;
|
|
171
|
-
case 6: return [2 /*return*/, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
172
|
-
var closeChannels;
|
|
173
|
-
var _this = this;
|
|
174
|
-
return __generator(this, function (_a) {
|
|
175
|
-
switch (_a.label) {
|
|
176
|
-
case 0: return [4 /*yield*/, Promise.all(cancelConsumptions.map(function (cancel) { return cancel(); }))];
|
|
177
|
-
case 1:
|
|
178
|
-
closeChannels = _a.sent();
|
|
179
|
-
return [2 /*return*/, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
180
|
-
return __generator(this, function (_a) {
|
|
181
|
-
switch (_a.label) {
|
|
182
|
-
case 0: return [4 /*yield*/, Promise.all(closeChannels.map(function (close) { return close(); }))];
|
|
183
|
-
case 1:
|
|
184
|
-
_a.sent();
|
|
185
|
-
return [2 /*return*/];
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
}); }];
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
}); }];
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
};
|
|
196
|
-
LockedEventConsumer.prototype.bindBatch = function (eventTypes_1, domainName_1, consumerType_1, onEventsBatch_1) {
|
|
197
|
-
return __awaiter(this, arguments, void 0, function (eventTypes, domainName, consumerType, onEventsBatch, bindOptions) {
|
|
198
|
-
var mainBindOptions, distributedBindOptions, consumeEventsBatch, cancelConsumptions, cancelMain, distributeEventsBatch, cancelDistributed, cancelMain;
|
|
199
|
-
var _this = this;
|
|
200
|
-
var _a;
|
|
201
|
-
if (bindOptions === void 0) { bindOptions = DEFAULT_BIND_OPTIONS; }
|
|
202
|
-
return __generator(this, function (_b) {
|
|
203
|
-
switch (_b.label) {
|
|
204
|
-
case 0:
|
|
205
|
-
bindOptions = __assign(__assign({}, DEFAULT_BIND_OPTIONS), bindOptions);
|
|
206
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.prepareRejectedDomain)(this.amqpConnection, domainName, consumerType, {
|
|
207
|
-
redeliverDelayMs: (_a = bindOptions.redeliverDelayMs) !== null && _a !== void 0 ? _a : DEFAULT_BIND_OPTIONS.redeliverDelayMs,
|
|
208
|
-
})];
|
|
209
|
-
case 1:
|
|
210
|
-
_b.sent();
|
|
211
|
-
mainBindOptions = this.createMainBindOptions(bindOptions);
|
|
212
|
-
distributedBindOptions = this.createDistributedBindOptions(bindOptions);
|
|
213
|
-
consumeEventsBatch = this.createConsumeEventsBatch(domainName, consumerType, mainBindOptions, onEventsBatch);
|
|
214
|
-
cancelConsumptions = [];
|
|
215
|
-
if (!(bindOptions.distributedPrefetchCount === 0)) return [3 /*break*/, 3];
|
|
216
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.bindDomainBatch)(this.amqpConnection, eventTypes, domainName, consumerType, consumeEventsBatch, mainBindOptions, {
|
|
217
|
-
flushBatchDelayMs: 100,
|
|
218
|
-
})];
|
|
219
|
-
case 2:
|
|
220
|
-
cancelMain = _b.sent();
|
|
221
|
-
cancelConsumptions.push(cancelMain);
|
|
222
|
-
return [3 /*break*/, 6];
|
|
223
|
-
case 3:
|
|
224
|
-
distributeEventsBatch = this.createDistributeEventsBatch(domainName, consumerType, distributedBindOptions);
|
|
225
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.bindRPCDomainBatch)(this.amqpConnection, domainName, consumerType, consumeEventsBatch, distributedBindOptions)];
|
|
226
|
-
case 4:
|
|
227
|
-
cancelDistributed = _b.sent();
|
|
228
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.bindDomainBatch)(this.amqpConnection, eventTypes, domainName, consumerType, distributeEventsBatch, mainBindOptions)];
|
|
229
|
-
case 5:
|
|
230
|
-
cancelMain = _b.sent();
|
|
231
|
-
cancelConsumptions.push(cancelDistributed);
|
|
232
|
-
cancelConsumptions.push(cancelMain);
|
|
233
|
-
_b.label = 6;
|
|
234
|
-
case 6: return [2 /*return*/, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
235
|
-
var closeChannels;
|
|
236
|
-
var _this = this;
|
|
237
|
-
return __generator(this, function (_a) {
|
|
238
|
-
switch (_a.label) {
|
|
239
|
-
case 0: return [4 /*yield*/, Promise.all(cancelConsumptions.map(function (cancel) { return cancel(); }))];
|
|
240
|
-
case 1:
|
|
241
|
-
closeChannels = _a.sent();
|
|
242
|
-
return [2 /*return*/, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
243
|
-
return __generator(this, function (_a) {
|
|
244
|
-
switch (_a.label) {
|
|
245
|
-
case 0: return [4 /*yield*/, Promise.all(closeChannels.map(function (close) { return close(); }))];
|
|
246
|
-
case 1:
|
|
247
|
-
_a.sent();
|
|
248
|
-
return [2 /*return*/];
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
}); }];
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
}); }];
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
};
|
|
259
|
-
LockedEventConsumer.prototype.createMainBindOptions = function (bindOptions) {
|
|
260
|
-
var _a;
|
|
261
|
-
return __assign(__assign({}, mainEventQueueBindOptions), { prefetchCount: bindOptions.mainPrefetchCount, notification: (_a = bindOptions.legacyNotification) !== null && _a !== void 0 ? _a : false });
|
|
262
|
-
};
|
|
263
|
-
LockedEventConsumer.prototype.createConsumeEvent = function (domainName, consumerType, bindOptions, onEvent) {
|
|
264
|
-
var _this = this;
|
|
265
|
-
return function (event) { return __awaiter(_this, void 0, void 0, function () {
|
|
266
|
-
var start, commandStart, logMetadata, e_1;
|
|
267
|
-
return __generator(this, function (_a) {
|
|
268
|
-
switch (_a.label) {
|
|
269
|
-
case 0:
|
|
270
|
-
start = new Date().getTime();
|
|
271
|
-
eventConsumerMetrics_1.metrics.emit('events_total', { eventType: event.type });
|
|
272
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds_total', { eventType: event.type, phase: 'eventStart' }, start - event.receivedAt.getTime());
|
|
273
|
-
commandStart = event.receivedAt.getTime() - event.dispatchedAt.getTime();
|
|
274
|
-
if (commandStart !== 0) {
|
|
275
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds_total', { eventType: event.type, phase: 'commandStart' }, event.receivedAt.getTime() - event.dispatchedAt.getTime());
|
|
276
|
-
}
|
|
277
|
-
logMetadata = {
|
|
278
|
-
domainName: domainName,
|
|
279
|
-
consumerType: consumerType,
|
|
280
|
-
bindOptions: bindOptions,
|
|
281
|
-
event: event,
|
|
282
|
-
};
|
|
283
|
-
debug("Consuming event ".concat(event.type, " from ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
284
|
-
_a.label = 1;
|
|
285
|
-
case 1:
|
|
286
|
-
_a.trys.push([1, 3, 4, 5]);
|
|
287
|
-
return [4 /*yield*/, onEvent(event)];
|
|
288
|
-
case 2:
|
|
289
|
-
_a.sent();
|
|
290
|
-
eventConsumerMetrics_1.metrics.emit('event_success_total', { eventType: event.type });
|
|
291
|
-
return [3 /*break*/, 5];
|
|
292
|
-
case 3:
|
|
293
|
-
e_1 = _a.sent();
|
|
294
|
-
eventConsumerMetrics_1.metrics.emit('event_error_total', { eventType: event.type });
|
|
295
|
-
debug("Error consuming event ".concat(event.type, " from ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
296
|
-
throw e_1;
|
|
297
|
-
case 4:
|
|
298
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds_total', { eventType: event.type, phase: 'processing' }, new Date().getTime() - start);
|
|
299
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds', { eventType: event.type }, new Date().getTime() - start);
|
|
300
|
-
return [7 /*endfinally*/];
|
|
301
|
-
case 5: return [2 /*return*/];
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
}); };
|
|
305
|
-
};
|
|
306
|
-
LockedEventConsumer.prototype.createConsumeEventsBatch = function (domainName, consumerType, bindOptions, onEventsBatch) {
|
|
307
|
-
var _this = this;
|
|
308
|
-
return function (events) { return __awaiter(_this, void 0, void 0, function () {
|
|
309
|
-
var eventType, firstEvent, start, commandStart, logMetadata, e_2;
|
|
310
|
-
return __generator(this, function (_a) {
|
|
311
|
-
switch (_a.label) {
|
|
312
|
-
case 0:
|
|
313
|
-
eventType = getEventsType(events);
|
|
314
|
-
firstEvent = events[0];
|
|
315
|
-
start = new Date().getTime();
|
|
316
|
-
eventConsumerMetrics_1.metrics.emit('events_total', { eventType: eventType }, events.length);
|
|
317
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds_total', { eventType: eventType, phase: 'eventStart' }, start - firstEvent.receivedAt.getTime());
|
|
318
|
-
commandStart = firstEvent.receivedAt.getTime() - firstEvent.dispatchedAt.getTime();
|
|
319
|
-
if (commandStart !== 0) {
|
|
320
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds_total', { eventType: eventType, phase: 'commandStart' }, firstEvent.receivedAt.getTime() - firstEvent.dispatchedAt.getTime());
|
|
321
|
-
}
|
|
322
|
-
logMetadata = {
|
|
323
|
-
domainName: domainName,
|
|
324
|
-
consumerType: consumerType,
|
|
325
|
-
bindOptions: bindOptions,
|
|
326
|
-
events: events,
|
|
327
|
-
};
|
|
328
|
-
debug("Consuming events batch ".concat(eventType, " from ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
329
|
-
_a.label = 1;
|
|
330
|
-
case 1:
|
|
331
|
-
_a.trys.push([1, 3, 4, 5]);
|
|
332
|
-
return [4 /*yield*/, onEventsBatch(events)];
|
|
333
|
-
case 2:
|
|
334
|
-
_a.sent();
|
|
335
|
-
eventConsumerMetrics_1.metrics.emit('event_success_total', { eventType: eventType }, events.length);
|
|
336
|
-
return [3 /*break*/, 5];
|
|
337
|
-
case 3:
|
|
338
|
-
e_2 = _a.sent();
|
|
339
|
-
eventConsumerMetrics_1.metrics.emit('event_error_total', { eventType: eventType }, events.length);
|
|
340
|
-
debug("Error consuming events batch ".concat(eventType, " from ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
341
|
-
throw e_2;
|
|
342
|
-
case 4:
|
|
343
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds_total', { eventType: eventType, phase: 'processing' }, (new Date().getTime() - start) / events.length);
|
|
344
|
-
eventConsumerMetrics_1.metrics.emit('event_duration_seconds', { eventType: eventType }, (new Date().getTime() - start) / events.length);
|
|
345
|
-
return [7 /*endfinally*/];
|
|
346
|
-
case 5: return [2 /*return*/];
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}); };
|
|
350
|
-
};
|
|
351
|
-
LockedEventConsumer.prototype.createDistributedBindOptions = function (bindOptions) {
|
|
352
|
-
return __assign(__assign({}, distributedEventQueueBindOptions), { prefetchCount: bindOptions.distributedPrefetchCount });
|
|
353
|
-
};
|
|
354
|
-
LockedEventConsumer.prototype.createDistributeEvent = function (domainName, consumerType, bindOptions) {
|
|
355
|
-
var _this = this;
|
|
356
|
-
return function (event) { return __awaiter(_this, void 0, void 0, function () {
|
|
357
|
-
var logMetadata, lockKeys;
|
|
358
|
-
var _this = this;
|
|
359
|
-
var _a;
|
|
360
|
-
return __generator(this, function (_b) {
|
|
361
|
-
switch (_b.label) {
|
|
362
|
-
case 0:
|
|
363
|
-
logMetadata = {
|
|
364
|
-
domainName: domainName,
|
|
365
|
-
consumerType: consumerType,
|
|
366
|
-
bindOptions: bindOptions,
|
|
367
|
-
event: event,
|
|
368
|
-
};
|
|
369
|
-
debug("Received event ".concat(event.type, " to ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
370
|
-
lockKeys = (_a = event.lockKeys) !== null && _a !== void 0 ? _a : [DEFAULT_LOCK_KEY];
|
|
371
|
-
return [4 /*yield*/, this.withLock(lockKeys, event, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
372
|
-
return __generator(this, function (_a) {
|
|
373
|
-
switch (_a.label) {
|
|
374
|
-
case 0:
|
|
375
|
-
debug("Distributing event ".concat(event.type, " to ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
376
|
-
// TODO Add timeout for processing event, because it can be stucked until the instance is restarted
|
|
377
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.processRPCDomain)(this.amqpConnection, domainName, consumerType, event, { persistent: false })];
|
|
378
|
-
case 1:
|
|
379
|
-
// TODO Add timeout for processing event, because it can be stucked until the instance is restarted
|
|
380
|
-
_a.sent();
|
|
381
|
-
return [2 /*return*/];
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
}); })];
|
|
385
|
-
case 1:
|
|
386
|
-
_b.sent();
|
|
387
|
-
debug("Distributed event consumed ".concat(event.type, " to ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
388
|
-
return [2 /*return*/];
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
}); };
|
|
392
|
-
};
|
|
393
|
-
LockedEventConsumer.prototype.createDistributeEventsBatch = function (domainName, consumerType, bindOptions) {
|
|
394
|
-
var _this = this;
|
|
395
|
-
return function (events) { return __awaiter(_this, void 0, void 0, function () {
|
|
396
|
-
var eventType, firstEvent, logMetadata, lockKeys;
|
|
397
|
-
var _this = this;
|
|
398
|
-
return __generator(this, function (_a) {
|
|
399
|
-
switch (_a.label) {
|
|
400
|
-
case 0:
|
|
401
|
-
eventType = getEventsType(events);
|
|
402
|
-
firstEvent = events[0];
|
|
403
|
-
logMetadata = {
|
|
404
|
-
domainName: domainName,
|
|
405
|
-
consumerType: consumerType,
|
|
406
|
-
bindOptions: bindOptions,
|
|
407
|
-
events: events,
|
|
408
|
-
};
|
|
409
|
-
debug("Received events batch ".concat(eventType, " to ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
410
|
-
lockKeys = getLockKeys(events);
|
|
411
|
-
return [4 /*yield*/, this.withLock(lockKeys, firstEvent, function () { return __awaiter(_this, void 0, void 0, function () {
|
|
412
|
-
return __generator(this, function (_a) {
|
|
413
|
-
switch (_a.label) {
|
|
414
|
-
case 0:
|
|
415
|
-
debug("Distributing events batch ".concat(eventType, " to ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
416
|
-
// TODO Add timeout for processing event, because it can be stucked until the instance is restarted
|
|
417
|
-
return [4 /*yield*/, (0, eventQueueDomain_1.processRPCDomainBatch)(this.amqpConnection, domainName, consumerType, events, { persistent: false })];
|
|
418
|
-
case 1:
|
|
419
|
-
// TODO Add timeout for processing event, because it can be stucked until the instance is restarted
|
|
420
|
-
_a.sent();
|
|
421
|
-
return [2 /*return*/];
|
|
422
|
-
}
|
|
423
|
-
});
|
|
424
|
-
}); })];
|
|
425
|
-
case 1:
|
|
426
|
-
_a.sent();
|
|
427
|
-
debug("Distributed events batch consumed ".concat(eventType, " to ").concat(domainName, ".").concat(consumerType), logMetadata);
|
|
428
|
-
return [2 /*return*/];
|
|
429
|
-
}
|
|
430
|
-
});
|
|
431
|
-
}); };
|
|
432
|
-
};
|
|
433
|
-
return LockedEventConsumer;
|
|
434
|
-
}());
|
|
435
|
-
exports.LockedEventConsumer = LockedEventConsumer;
|
|
20
|
+
__exportStar(require("@signageos/amqp/dist/EventSourcing/Locked/lockedEventConsumer"), exports);
|
|
436
21
|
//# sourceMappingURL=lockedEventConsumer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockedEventConsumer.js","sourceRoot":"","sources":["../../../../src/AMQP/EventSourcing/Locked/lockedEventConsumer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lockedEventConsumer.js","sourceRoot":"","sources":["../../../../src/AMQP/EventSourcing/Locked/lockedEventConsumer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,gGAA8E"}
|
|
@@ -1,24 +1,4 @@
|
|
|
1
|
-
import { ITimestamp } from '../synchronization';
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
* to prevent processing/consuming events in incorrect order based on random (temporary) failing events.
|
|
5
|
-
*
|
|
6
|
-
* This class helps maintain event ordering by keeping track of rejected events' timestamps,
|
|
7
|
-
* ensuring that later events cannot be processed until earlier failed events are resolved.
|
|
8
|
-
* It has to be sideloaded to __rejected queues (dead-letter queues) so it doesn't affect
|
|
9
|
-
* processing of other events with different lockKeys.
|
|
10
|
-
*
|
|
11
|
-
* The main goal is to react as soon as possible and skip failing events, but continue
|
|
12
|
-
* processing others to prevent downtimes or outages. This implementation should only slow down
|
|
13
|
-
* or block a single lockDomain without significantly affecting others.
|
|
14
|
-
*
|
|
15
|
-
* Usually, the errors are temporary (for example MongoDB transactions), so this keeps in memory
|
|
16
|
-
* the last rejected events' timestamps to know that later events cannot be processed yet (by lockKeys).
|
|
2
|
+
* @deprecated Use `@signageos/amqp` instead.
|
|
17
3
|
*/
|
|
18
|
-
export
|
|
19
|
-
private rejectedTimestamps;
|
|
20
|
-
addRejection(lockKeys: string[], timestamp: ITimestamp): void;
|
|
21
|
-
removeRejection(lockKeys: string[], timestamp: ITimestamp): void;
|
|
22
|
-
previousWasRejected(lockKeys: string[], timestamp: ITimestamp): boolean;
|
|
23
|
-
private compareTimestamps;
|
|
24
|
-
}
|
|
4
|
+
export * from '@signageos/amqp/dist/EventSourcing/Locked/rejectedTimestamps';
|