@croct/sdk 0.17.7 → 0.17.8
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/activeRecord.cjs.map +1 -0
- package/activeRecord.d.ts +8 -4
- package/activeRecord.js +115 -106
- package/activeRecord.js.map +1 -1
- package/apiKey.cjs.map +1 -0
- package/apiKey.d.ts +4 -2
- package/apiKey.js +152 -141
- package/apiKey.js.map +1 -1
- package/base64Url.cjs.map +1 -0
- package/base64Url.d.ts +4 -2
- package/base64Url.js +8 -15
- package/base64Url.js.map +1 -1
- package/cache/cache.cjs.map +1 -0
- package/cache/cache.d.ts +6 -4
- package/cache/cache.js +9 -10
- package/cache/cache.js.map +1 -1
- package/cache/cookieCache.cjs.map +1 -0
- package/cache/cookieCache.d.ts +6 -3
- package/cache/cookieCache.js +52 -54
- package/cache/cookieCache.js.map +1 -1
- package/cache/fallbackCache.cjs.map +1 -0
- package/cache/fallbackCache.d.ts +5 -2
- package/cache/fallbackCache.js +20 -21
- package/cache/fallbackCache.js.map +1 -1
- package/cache/inMemoryCache.cjs.map +1 -0
- package/cache/inMemoryCache.d.ts +5 -2
- package/cache/inMemoryCache.js +15 -17
- package/cache/inMemoryCache.js.map +1 -1
- package/cache/index.cjs.map +1 -0
- package/cache/index.d.ts +4 -4
- package/cache/index.js +9 -11
- package/cache/index.js.map +1 -1
- package/cache/localStorageCache.cjs.map +1 -0
- package/cache/localStorageCache.d.ts +5 -2
- package/cache/localStorageCache.js +55 -63
- package/cache/localStorageCache.js.map +1 -1
- package/channel/channel.cjs.map +1 -0
- package/channel/channel.d.ts +8 -6
- package/channel/channel.js +21 -22
- package/channel/channel.js.map +1 -1
- package/channel/encodedChannel.cjs.map +1 -0
- package/channel/encodedChannel.d.ts +6 -3
- package/channel/encodedChannel.js +13 -14
- package/channel/encodedChannel.js.map +1 -1
- package/channel/guaranteedChannel.cjs.map +1 -0
- package/channel/guaranteedChannel.d.ts +9 -7
- package/channel/guaranteedChannel.js +74 -73
- package/channel/guaranteedChannel.js.map +1 -1
- package/channel/httpBeaconChannel.cjs.map +1 -0
- package/channel/httpBeaconChannel.d.ts +9 -6
- package/channel/httpBeaconChannel.js +82 -83
- package/channel/httpBeaconChannel.js.map +1 -1
- package/channel/index.cjs.map +1 -0
- package/channel/index.d.ts +12 -7
- package/channel/index.js +15 -17
- package/channel/index.js.map +1 -1
- package/channel/queuedChannel.cjs.map +1 -0
- package/channel/queuedChannel.d.ts +7 -4
- package/channel/queuedChannel.js +87 -97
- package/channel/queuedChannel.js.map +1 -1
- package/channel/retryChannel.cjs.map +1 -0
- package/channel/retryChannel.d.ts +7 -5
- package/channel/retryChannel.js +58 -57
- package/channel/retryChannel.js.map +1 -1
- package/channel/sandboxChannel.cjs.map +1 -0
- package/channel/sandboxChannel.d.ts +5 -2
- package/channel/sandboxChannel.js +34 -35
- package/channel/sandboxChannel.js.map +1 -1
- package/cid/assigner.cjs.map +1 -0
- package/cid/assigner.d.ts +3 -1
- package/cid/assigner.js +0 -2
- package/cid/assigner.js.map +1 -1
- package/cid/cachedAssigner.cjs.map +1 -0
- package/cid/cachedAssigner.d.ts +7 -5
- package/cid/cachedAssigner.js +37 -43
- package/cid/cachedAssigner.js.map +1 -1
- package/cid/fixedAssigner.cjs.map +1 -0
- package/cid/fixedAssigner.d.ts +5 -2
- package/cid/fixedAssigner.js +9 -10
- package/cid/fixedAssigner.js.map +1 -1
- package/cid/index.cjs.map +1 -0
- package/cid/index.d.ts +6 -4
- package/cid/index.js +9 -11
- package/cid/index.js.map +1 -1
- package/cid/remoteAssigner.cjs.map +1 -0
- package/cid/remoteAssigner.d.ts +6 -3
- package/cid/remoteAssigner.js +36 -37
- package/cid/remoteAssigner.js.map +1 -1
- package/constants.cjs.map +1 -0
- package/constants.d.ts +6 -4
- package/constants.js +10 -7
- package/constants.js.map +1 -1
- package/container.cjs.map +1 -0
- package/container.d.ts +28 -15
- package/container.js +269 -252
- package/container.js.map +1 -1
- package/contentFetcher.cjs.map +1 -0
- package/contentFetcher.d.ts +17 -14
- package/contentFetcher.js +156 -163
- package/contentFetcher.js.map +1 -1
- package/context.cjs.map +1 -0
- package/context.d.ts +13 -9
- package/context.js +80 -81
- package/context.js.map +1 -1
- package/error.cjs.map +1 -0
- package/error.d.ts +4 -2
- package/error.js +21 -21
- package/error.js.map +1 -1
- package/evaluator.cjs.map +1 -0
- package/evaluator.d.ts +18 -16
- package/evaluator.js +179 -179
- package/evaluator.js.map +1 -1
- package/eventManager.cjs.map +1 -0
- package/eventManager.d.ts +8 -6
- package/eventManager.js +24 -26
- package/eventManager.js.map +1 -1
- package/eventSubjectProcessor.cjs.map +1 -0
- package/eventSubjectProcessor.d.ts +16 -3
- package/eventSubjectProcessor.js +53 -59
- package/eventSubjectProcessor.js.map +1 -1
- package/facade/contentFetcherFacade.cjs.map +1 -0
- package/facade/contentFetcherFacade.d.ts +16 -7
- package/facade/contentFetcherFacade.js +32 -35
- package/facade/contentFetcherFacade.js.map +1 -1
- package/facade/evaluatorFacade.cjs.map +1 -0
- package/facade/evaluatorFacade.d.ts +17 -10
- package/facade/evaluatorFacade.js +56 -60
- package/facade/evaluatorFacade.js.map +1 -1
- package/facade/index.cjs.map +1 -0
- package/facade/index.d.ts +29 -7
- package/facade/index.js +19 -19
- package/facade/index.js.map +1 -1
- package/facade/sdkFacade.cjs.map +1 -0
- package/facade/sdkFacade.d.ts +33 -15
- package/facade/sdkFacade.js +201 -214
- package/facade/sdkFacade.js.map +1 -1
- package/facade/sessionFacade.cjs.map +1 -0
- package/facade/sessionFacade.d.ts +18 -3
- package/facade/sessionFacade.js +10 -11
- package/facade/sessionFacade.js.map +1 -1
- package/facade/sessionPatch.cjs.map +1 -0
- package/facade/sessionPatch.d.ts +17 -4
- package/facade/sessionPatch.js +22 -24
- package/facade/sessionPatch.js.map +1 -1
- package/facade/trackerFacade.cjs.map +1 -0
- package/facade/trackerFacade.d.ts +17 -4
- package/facade/trackerFacade.js +67 -57
- package/facade/trackerFacade.js.map +1 -1
- package/facade/userFacade.cjs.map +1 -0
- package/facade/userFacade.d.ts +21 -4
- package/facade/userFacade.js +17 -18
- package/facade/userFacade.js.map +1 -1
- package/facade/userPatch.cjs.map +1 -0
- package/facade/userPatch.d.ts +17 -4
- package/facade/userPatch.js +22 -24
- package/facade/userPatch.js.map +1 -1
- package/help.cjs.map +1 -0
- package/help.d.ts +3 -1
- package/help.js +19 -23
- package/help.js.map +1 -1
- package/index.cjs.map +1 -0
- package/index.d.ts +25 -3
- package/index.js +7 -7
- package/index.js.map +1 -1
- package/logging/consoleLogger.cjs.map +1 -0
- package/logging/consoleLogger.d.ts +5 -2
- package/logging/consoleLogger.js +23 -24
- package/logging/consoleLogger.js.map +1 -1
- package/logging/filteredLogger.cjs.map +1 -0
- package/logging/filteredLogger.d.ts +8 -5
- package/logging/filteredLogger.js +36 -37
- package/logging/filteredLogger.js.map +1 -1
- package/logging/index.cjs.map +1 -0
- package/logging/index.d.ts +5 -5
- package/logging/index.js +11 -13
- package/logging/index.js.map +1 -1
- package/logging/logger.cjs.map +1 -0
- package/logging/logger.d.ts +4 -2
- package/logging/logger.js +0 -2
- package/logging/logger.js.map +1 -1
- package/logging/namespacedLogger.cjs.map +1 -0
- package/logging/namespacedLogger.d.ts +5 -2
- package/logging/namespacedLogger.js +22 -23
- package/logging/namespacedLogger.js.map +1 -1
- package/logging/nullLogger.cjs.map +1 -0
- package/logging/nullLogger.d.ts +5 -2
- package/logging/nullLogger.js +11 -16
- package/logging/nullLogger.js.map +1 -1
- package/namespacedStorage.cjs.map +1 -0
- package/namespacedStorage.d.ts +3 -1
- package/namespacedStorage.js +51 -52
- package/namespacedStorage.js.map +1 -1
- package/package.json +60 -6
- package/patch.cjs.map +1 -0
- package/patch.d.ts +6 -4
- package/patch.js +0 -2
- package/patch.js.map +1 -1
- package/queue/capacityRestrictedQueue.cjs.map +1 -0
- package/queue/capacityRestrictedQueue.d.ts +5 -2
- package/queue/capacityRestrictedQueue.js +31 -32
- package/queue/capacityRestrictedQueue.js.map +1 -1
- package/queue/inMemoryQueue.cjs.map +1 -0
- package/queue/inMemoryQueue.d.ts +5 -2
- package/queue/inMemoryQueue.js +32 -34
- package/queue/inMemoryQueue.js.map +1 -1
- package/queue/index.cjs.map +1 -0
- package/queue/index.d.ts +6 -5
- package/queue/index.js +11 -13
- package/queue/index.js.map +1 -1
- package/queue/monitoredQueue.cjs.map +1 -0
- package/queue/monitoredQueue.d.ts +8 -5
- package/queue/monitoredQueue.js +104 -110
- package/queue/monitoredQueue.js.map +1 -1
- package/queue/persistentQueue.cjs.map +1 -0
- package/queue/persistentQueue.d.ts +5 -2
- package/queue/persistentQueue.js +52 -54
- package/queue/persistentQueue.js.map +1 -1
- package/queue/queue.cjs.map +1 -0
- package/queue/queue.d.ts +3 -1
- package/queue/queue.js +0 -2
- package/queue/queue.js.map +1 -1
- package/retry/arbitraryPolicy.cjs.map +1 -0
- package/retry/arbitraryPolicy.d.ts +5 -2
- package/retry/arbitraryPolicy.js +14 -15
- package/retry/arbitraryPolicy.js.map +1 -1
- package/retry/backoffPolicy.cjs.map +1 -0
- package/retry/backoffPolicy.d.ts +5 -3
- package/retry/backoffPolicy.js +52 -50
- package/retry/backoffPolicy.js.map +1 -1
- package/retry/index.cjs.map +1 -0
- package/retry/index.d.ts +5 -5
- package/retry/index.js +11 -13
- package/retry/index.js.map +1 -1
- package/retry/maxAttemptsPolicy.cjs.map +1 -0
- package/retry/maxAttemptsPolicy.d.ts +5 -2
- package/retry/maxAttemptsPolicy.js +17 -18
- package/retry/maxAttemptsPolicy.js.map +1 -1
- package/retry/neverPolicy.cjs.map +1 -0
- package/retry/neverPolicy.d.ts +5 -2
- package/retry/neverPolicy.js +9 -10
- package/retry/neverPolicy.js.map +1 -1
- package/retry/policy.cjs.map +1 -0
- package/retry/policy.d.ts +3 -1
- package/retry/policy.js +0 -2
- package/retry/policy.js.map +1 -1
- package/schema/attributeSchema.cjs.map +1 -0
- package/schema/attributeSchema.d.ts +6 -2
- package/schema/attributeSchema.js +7 -7
- package/schema/attributeSchema.js.map +1 -1
- package/schema/contentFetcherSchemas.cjs.map +1 -0
- package/schema/contentFetcherSchemas.d.ts +6 -2
- package/schema/contentFetcherSchemas.js +24 -21
- package/schema/contentFetcherSchemas.js.map +1 -1
- package/schema/contentSchemas.cjs.map +1 -0
- package/schema/contentSchemas.d.ts +6 -2
- package/schema/contentSchemas.js +45 -45
- package/schema/contentSchemas.js.map +1 -1
- package/schema/contextSchemas.cjs.map +1 -0
- package/schema/contextSchemas.d.ts +6 -2
- package/schema/contextSchemas.js +6 -6
- package/schema/contextSchemas.js.map +1 -1
- package/schema/ecommerceSchemas.cjs.map +1 -0
- package/schema/ecommerceSchemas.d.ts +10 -6
- package/schema/ecommerceSchemas.js +176 -172
- package/schema/ecommerceSchemas.js.map +1 -1
- package/schema/evaluatorSchemas.cjs.map +1 -0
- package/schema/evaluatorSchemas.d.ts +6 -2
- package/schema/evaluatorSchemas.js +46 -30
- package/schema/evaluatorSchemas.js.map +1 -1
- package/schema/eventSchemas.cjs.map +1 -0
- package/schema/eventSchemas.d.ts +16 -12
- package/schema/eventSchemas.js +125 -102
- package/schema/eventSchemas.js.map +1 -1
- package/schema/index.cjs.map +1 -0
- package/schema/index.d.ts +14 -11
- package/schema/index.js +11 -14
- package/schema/index.js.map +1 -1
- package/schema/loggerSchema.cjs.map +1 -0
- package/schema/loggerSchema.d.ts +6 -2
- package/schema/loggerSchema.js +13 -13
- package/schema/loggerSchema.js.map +1 -1
- package/schema/operationSchemas.cjs.map +1 -0
- package/schema/operationSchemas.d.ts +14 -10
- package/schema/operationSchemas.js +85 -69
- package/schema/operationSchemas.js.map +1 -1
- package/schema/sdkFacadeSchemas.cjs.map +1 -0
- package/schema/sdkFacadeSchemas.d.ts +6 -2
- package/schema/sdkFacadeSchemas.js +65 -51
- package/schema/sdkFacadeSchemas.js.map +1 -1
- package/schema/sdkSchemas.cjs.map +1 -0
- package/schema/sdkSchemas.d.ts +8 -4
- package/schema/sdkSchemas.js +80 -78
- package/schema/sdkSchemas.js.map +1 -1
- package/schema/tokenSchema.cjs.map +1 -0
- package/schema/tokenSchema.d.ts +6 -2
- package/schema/tokenSchema.js +41 -38
- package/schema/tokenSchema.js.map +1 -1
- package/schema/userSchema.cjs.map +1 -0
- package/schema/userSchema.d.ts +6 -2
- package/schema/userSchema.js +183 -134
- package/schema/userSchema.js.map +1 -1
- package/sdk.cjs.map +1 -0
- package/sdk.d.ts +28 -14
- package/sdk.js +106 -108
- package/sdk.js.map +1 -1
- package/sdkEvents.cjs.map +1 -0
- package/sdkEvents.d.ts +10 -5
- package/sdkEvents.js +0 -2
- package/sdkEvents.js.map +1 -1
- package/sourceLocation.cjs.map +1 -0
- package/sourceLocation.d.ts +7 -5
- package/sourceLocation.js +56 -57
- package/sourceLocation.js.map +1 -1
- package/tab.cjs.map +1 -0
- package/tab.d.ts +9 -7
- package/tab.js +93 -90
- package/tab.js.map +1 -1
- package/token/cachedTokenStore.cjs.map +1 -0
- package/token/cachedTokenStore.d.ts +8 -3
- package/token/cachedTokenStore.js +22 -24
- package/token/cachedTokenStore.js.map +1 -1
- package/token/inMemoryTokenStore.cjs.map +1 -0
- package/token/inMemoryTokenStore.d.ts +7 -2
- package/token/inMemoryTokenStore.js +12 -13
- package/token/inMemoryTokenStore.js.map +1 -1
- package/token/index.cjs.map +1 -0
- package/token/index.d.ts +7 -4
- package/token/index.js +9 -11
- package/token/index.js.map +1 -1
- package/token/replicatedTokenStore.cjs.map +1 -0
- package/token/replicatedTokenStore.d.ts +7 -2
- package/token/replicatedTokenStore.js +14 -15
- package/token/replicatedTokenStore.js.map +1 -1
- package/token/token.cjs.map +1 -0
- package/token/token.d.ts +11 -8
- package/token/token.js +212 -195
- package/token/token.js.map +1 -1
- package/tracker.cjs.map +1 -0
- package/tracker.d.ts +20 -13
- package/tracker.js +307 -307
- package/tracker.js.map +1 -1
- package/trackingEvents.cjs.map +1 -0
- package/trackingEvents.d.ts +65 -62
- package/trackingEvents.js +57 -56
- package/trackingEvents.js.map +1 -1
- package/transformer.cjs.map +1 -0
- package/transformer.d.ts +4 -2
- package/transformer.js +5 -6
- package/transformer.js.map +1 -1
- package/utilityTypes.cjs.map +1 -0
- package/utilityTypes.d.ts +4 -2
- package/utilityTypes.js +0 -2
- package/utilityTypes.js.map +1 -1
- package/uuid.cjs.map +1 -0
- package/uuid.d.ts +3 -1
- package/uuid.js +27 -32
- package/uuid.js.map +1 -1
- package/validation/arrayType.cjs.map +1 -0
- package/validation/arrayType.d.ts +5 -3
- package/validation/arrayType.js +45 -41
- package/validation/arrayType.js.map +1 -1
- package/validation/booleanType.cjs.map +1 -0
- package/validation/booleanType.d.ts +5 -2
- package/validation/booleanType.js +19 -16
- package/validation/booleanType.js.map +1 -1
- package/validation/functionType.cjs.map +1 -0
- package/validation/functionType.d.ts +5 -2
- package/validation/functionType.js +19 -16
- package/validation/functionType.js.map +1 -1
- package/validation/index.cjs.map +1 -0
- package/validation/index.d.ts +12 -12
- package/validation/index.js +27 -29
- package/validation/index.js.map +1 -1
- package/validation/jsonType.cjs.map +1 -0
- package/validation/jsonType.d.ts +8 -6
- package/validation/jsonType.js +89 -82
- package/validation/jsonType.js.map +1 -1
- package/validation/mixedSchema.cjs.map +1 -0
- package/validation/mixedSchema.d.ts +5 -2
- package/validation/mixedSchema.js +5 -7
- package/validation/mixedSchema.js.map +1 -1
- package/validation/nullType.cjs.map +1 -0
- package/validation/nullType.d.ts +5 -2
- package/validation/nullType.js +19 -16
- package/validation/nullType.js.map +1 -1
- package/validation/numberType.cjs.map +1 -0
- package/validation/numberType.d.ts +5 -3
- package/validation/numberType.js +40 -32
- package/validation/numberType.js.map +1 -1
- package/validation/objectType.cjs.map +1 -0
- package/validation/objectType.d.ts +5 -3
- package/validation/objectType.js +84 -85
- package/validation/objectType.js.map +1 -1
- package/validation/schema.cjs.map +1 -0
- package/validation/schema.d.ts +5 -3
- package/validation/schema.js +8 -9
- package/validation/schema.js.map +1 -1
- package/validation/stringType.cjs.map +1 -0
- package/validation/stringType.d.ts +5 -3
- package/validation/stringType.js +74 -70
- package/validation/stringType.js.map +1 -1
- package/validation/unionType.cjs.map +1 -0
- package/validation/unionType.d.ts +5 -2
- package/validation/unionType.js +37 -35
- package/validation/unionType.js.map +1 -1
- package/validation/violation.cjs.map +1 -0
- package/validation/violation.d.ts +4 -2
- package/validation/violation.js +18 -18
- package/validation/violation.js.map +1 -1
|
@@ -1,89 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const error_1 = require("../error");
|
|
7
|
-
const constants_1 = require("../constants");
|
|
8
|
-
const help_1 = require("../help");
|
|
1
|
+
import { MessageDeliveryError } from "./channel";
|
|
2
|
+
import { NullLogger } from "../logging";
|
|
3
|
+
import { formatMessage } from "../error";
|
|
4
|
+
import { CLIENT_LIBRARY } from "../constants";
|
|
5
|
+
import { Help } from "../help";
|
|
9
6
|
class HttpBeaconChannel {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
constructor({ logger = new NullLogger(), ...configuration }) {
|
|
8
|
+
this.listeners = [];
|
|
9
|
+
this.closed = false;
|
|
10
|
+
this.configuration = configuration;
|
|
11
|
+
this.logger = logger;
|
|
12
|
+
}
|
|
13
|
+
async publish({ id: receiptId, message }) {
|
|
14
|
+
if (this.closed) {
|
|
15
|
+
return Promise.reject(MessageDeliveryError.nonRetryable("Channel is closed"));
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
17
|
+
const { token, timestamp, context, payload } = JSON.parse(message);
|
|
18
|
+
const { endpointUrl, appId, cidAssigner } = this.configuration;
|
|
19
|
+
return fetch(endpointUrl, {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: {
|
|
22
|
+
"X-App-Id": appId,
|
|
23
|
+
"X-Client-Id": await cidAssigner.assignCid(),
|
|
24
|
+
"X-Client-Library": CLIENT_LIBRARY,
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
...token !== void 0 ? { "X-Token": token } : {}
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({
|
|
29
|
+
context,
|
|
30
|
+
payload,
|
|
31
|
+
originalTime: timestamp,
|
|
32
|
+
departureTime: Date.now()
|
|
33
|
+
})
|
|
34
|
+
}).then(async (response) => {
|
|
35
|
+
if (response.ok) {
|
|
36
|
+
this.notify(receiptId);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const problem = await response.json().catch(
|
|
40
|
+
() => ({
|
|
41
|
+
type: "https://croct.help/api/event-tracker#unexpected-error",
|
|
42
|
+
title: response.statusText,
|
|
43
|
+
status: response.status
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
const isRetryable = HttpBeaconChannel.isRetryable(problem.status);
|
|
47
|
+
const help = Help.forStatusCode(problem.status);
|
|
48
|
+
if (help !== void 0) {
|
|
49
|
+
this.logger.error(help);
|
|
50
|
+
} else if (!isRetryable) {
|
|
51
|
+
this.logger.error(`Beacon rejected with non-retryable status: ${problem.title}`);
|
|
52
|
+
}
|
|
53
|
+
return Promise.reject(
|
|
54
|
+
isRetryable ? MessageDeliveryError.retryable(problem.title) : MessageDeliveryError.nonRetryable(problem.title)
|
|
55
|
+
);
|
|
56
|
+
}).catch((error) => {
|
|
57
|
+
this.logger.error(`Failed to publish beacon: ${formatMessage(error)}`);
|
|
58
|
+
return Promise.reject(
|
|
59
|
+
error instanceof MessageDeliveryError ? error : MessageDeliveryError.retryable(error)
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
subscribe(listener) {
|
|
64
|
+
if (!this.listeners.includes(listener)) {
|
|
65
|
+
this.listeners.push(listener);
|
|
64
66
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
unsubscribe(listener) {
|
|
71
|
-
const index = this.listeners.indexOf(listener);
|
|
72
|
-
if (index >= 0) {
|
|
73
|
-
this.listeners.splice(index, 1);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
notify(receiptId) {
|
|
77
|
-
this.listeners.forEach(dispatch => dispatch(receiptId));
|
|
78
|
-
}
|
|
79
|
-
close() {
|
|
80
|
-
this.closed = true;
|
|
81
|
-
return Promise.resolve();
|
|
82
|
-
}
|
|
83
|
-
static isRetryable(status) {
|
|
84
|
-
// Retry on any server error and client errors 429 (rate limit) and 408 (request timeout)
|
|
85
|
-
return status >= 500 || status === 429 || status === 408;
|
|
67
|
+
}
|
|
68
|
+
unsubscribe(listener) {
|
|
69
|
+
const index = this.listeners.indexOf(listener);
|
|
70
|
+
if (index >= 0) {
|
|
71
|
+
this.listeners.splice(index, 1);
|
|
86
72
|
}
|
|
73
|
+
}
|
|
74
|
+
notify(receiptId) {
|
|
75
|
+
this.listeners.forEach((dispatch) => dispatch(receiptId));
|
|
76
|
+
}
|
|
77
|
+
close() {
|
|
78
|
+
this.closed = true;
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
}
|
|
81
|
+
static isRetryable(status) {
|
|
82
|
+
return status >= 500 || status === 429 || status === 408;
|
|
83
|
+
}
|
|
87
84
|
}
|
|
88
|
-
|
|
85
|
+
export {
|
|
86
|
+
HttpBeaconChannel
|
|
87
|
+
};
|
|
89
88
|
//# sourceMappingURL=httpBeaconChannel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/channel/httpBeaconChannel.ts"],"sourcesContent":["import {ChannelListener, DuplexChannel, MessageDeliveryError} from './channel';\nimport {Envelope} from './guaranteedChannel';\nimport {Logger, NullLogger} from '../logging';\nimport {CidAssigner} from '../cid';\nimport {formatMessage} from '../error';\nimport {CLIENT_LIBRARY} from '../constants';\nimport {Help} from '../help';\n\nexport type Configuration = {\n appId: string,\n endpointUrl: string,\n cidAssigner: CidAssigner,\n logger?: Logger,\n};\n\ntype ApiProblem = {\n type: string,\n title: string,\n status: number,\n detail: string,\n};\n\nexport class HttpBeaconChannel implements DuplexChannel<string, Envelope<string, string>> {\n private readonly configuration: Omit<Configuration, 'logger'>;\n\n private readonly logger: Logger;\n\n private readonly listeners: Array<ChannelListener<string>> = [];\n\n private closed = false;\n\n public constructor({logger = new NullLogger(), ...configuration}: Configuration) {\n this.configuration = configuration;\n this.logger = logger;\n }\n\n public async publish({id: receiptId, message}: Envelope<string, string>): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed'));\n }\n\n const {token, timestamp, context, payload} = JSON.parse(message);\n const {endpointUrl, appId, cidAssigner} = this.configuration;\n\n return fetch(endpointUrl, {\n method: 'POST',\n headers: {\n 'X-App-Id': appId,\n 'X-Client-Id': await cidAssigner.assignCid(),\n 'X-Client-Library': CLIENT_LIBRARY,\n 'Content-Type': 'application/json',\n ...(token !== undefined ? {'X-Token': token} : {}),\n },\n body: JSON.stringify({\n context: context,\n payload: payload,\n originalTime: timestamp,\n departureTime: Date.now(),\n }),\n }).then(async response => {\n if (response.ok) {\n this.notify(receiptId);\n\n return;\n }\n\n const problem: ApiProblem = await response.json().catch(\n () => ({\n type: 'https://croct.help/api/event-tracker#unexpected-error',\n title: response.statusText,\n status: response.status,\n }),\n );\n\n const isRetryable = HttpBeaconChannel.isRetryable(problem.status);\n const help = Help.forStatusCode(problem.status);\n\n if (help !== undefined) {\n this.logger.error(help);\n } else if (!isRetryable) {\n this.logger.error(`Beacon rejected with non-retryable status: ${problem.title}`);\n }\n\n return Promise.reject(\n isRetryable\n ? MessageDeliveryError.retryable(problem.title)\n : MessageDeliveryError.nonRetryable(problem.title),\n );\n }).catch(error => {\n this.logger.error(`Failed to publish beacon: ${formatMessage(error)}`);\n\n return Promise.reject(\n error instanceof MessageDeliveryError\n ? error\n : MessageDeliveryError.retryable(error),\n );\n });\n }\n\n public subscribe(listener: ChannelListener<string>): void {\n if (!this.listeners.includes(listener)) {\n this.listeners.push(listener);\n }\n }\n\n public unsubscribe(listener: ChannelListener<string>): void {\n const index = this.listeners.indexOf(listener);\n\n if (index >= 0) {\n this.listeners.splice(index, 1);\n }\n }\n\n private notify(receiptId: string): void {\n this.listeners.forEach(dispatch => dispatch(receiptId));\n }\n\n public close(): Promise<void> {\n this.closed = true;\n\n return Promise.resolve();\n }\n\n private static isRetryable(status: number): boolean {\n // Retry on any server error and client errors 429 (rate limit) and 408 (request timeout)\n return status >= 500 || status === 429 || status === 408;\n }\n}\n"],"mappings":"AAAA,SAAwC,4BAA2B;AAEnE,SAAgB,kBAAiB;AAEjC,SAAQ,qBAAoB;AAC5B,SAAQ,sBAAqB;AAC7B,SAAQ,YAAW;AAgBZ,MAAM,kBAA6E;AAAA,EAS/E,YAAY,EAAC,SAAS,IAAI,WAAW,GAAG,GAAG,cAAa,GAAkB;AAJjF,SAAiB,YAA4C,CAAC;AAE9D,SAAQ,SAAS;AAGb,SAAK,gBAAgB;AACrB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,QAAQ,EAAC,IAAI,WAAW,QAAO,GAA4C;AACpF,QAAI,KAAK,QAAQ;AACb,aAAO,QAAQ,OAAO,qBAAqB,aAAa,mBAAmB,CAAC;AAAA,IAChF;AAEA,UAAM,EAAC,OAAO,WAAW,SAAS,QAAO,IAAI,KAAK,MAAM,OAAO;AAC/D,UAAM,EAAC,aAAa,OAAO,YAAW,IAAI,KAAK;AAE/C,WAAO,MAAM,aAAa;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,YAAY;AAAA,QACZ,eAAe,MAAM,YAAY,UAAU;AAAA,QAC3C,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,GAAI,UAAU,SAAY,EAAC,WAAW,MAAK,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,eAAe,KAAK,IAAI;AAAA,MAC5B,CAAC;AAAA,IACL,CAAC,EAAE,KAAK,OAAM,aAAY;AACtB,UAAI,SAAS,IAAI;AACb,aAAK,OAAO,SAAS;AAErB;AAAA,MACJ;AAEA,YAAM,UAAsB,MAAM,SAAS,KAAK,EAAE;AAAA,QAC9C,OAAO;AAAA,UACH,MAAM;AAAA,UACN,OAAO,SAAS;AAAA,UAChB,QAAQ,SAAS;AAAA,QACrB;AAAA,MACJ;AAEA,YAAM,cAAc,kBAAkB,YAAY,QAAQ,MAAM;AAChE,YAAM,OAAO,KAAK,cAAc,QAAQ,MAAM;AAE9C,UAAI,SAAS,QAAW;AACpB,aAAK,OAAO,MAAM,IAAI;AAAA,MAC1B,WAAW,CAAC,aAAa;AACrB,aAAK,OAAO,MAAM,8CAA8C,QAAQ,KAAK,EAAE;AAAA,MACnF;AAEA,aAAO,QAAQ;AAAA,QACX,cACM,qBAAqB,UAAU,QAAQ,KAAK,IAC5C,qBAAqB,aAAa,QAAQ,KAAK;AAAA,MACzD;AAAA,IACJ,CAAC,EAAE,MAAM,WAAS;AACd,WAAK,OAAO,MAAM,6BAA6B,cAAc,KAAK,CAAC,EAAE;AAErE,aAAO,QAAQ;AAAA,QACX,iBAAiB,uBACX,QACA,qBAAqB,UAAU,KAAK;AAAA,MAC9C;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEO,UAAU,UAAyC;AACtD,QAAI,CAAC,KAAK,UAAU,SAAS,QAAQ,GAAG;AACpC,WAAK,UAAU,KAAK,QAAQ;AAAA,IAChC;AAAA,EACJ;AAAA,EAEO,YAAY,UAAyC;AACxD,UAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ;AAE7C,QAAI,SAAS,GAAG;AACZ,WAAK,UAAU,OAAO,OAAO,CAAC;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,OAAO,WAAyB;AACpC,SAAK,UAAU,QAAQ,cAAY,SAAS,SAAS,CAAC;AAAA,EAC1D;AAAA,EAEO,QAAuB;AAC1B,SAAK,SAAS;AAEd,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,OAAe,YAAY,QAAyB;AAEhD,WAAO,UAAU,OAAO,WAAW,OAAO,WAAW;AAAA,EACzD;AACJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/channel/index.ts"],"sourcesContent":["export * from './channel';\nexport {EncodedChannel} from './encodedChannel';\nexport {GuaranteedChannel} from './guaranteedChannel';\nexport {QueuedChannel} from './queuedChannel';\nexport {RetryChannel} from './retryChannel';\nexport {SandboxChannel} from './sandboxChannel';\nexport {HttpBeaconChannel} from './httpBeaconChannel';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAc,sBAAd;AACA,4BAA6B;AAC7B,+BAAgC;AAChC,2BAA4B;AAC5B,0BAA2B;AAC3B,4BAA6B;AAC7B,+BAAgC;","names":[]}
|
package/channel/index.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
export
|
|
2
|
-
export { EncodedChannel } from './encodedChannel';
|
|
3
|
-
export { GuaranteedChannel } from './guaranteedChannel';
|
|
4
|
-
export { QueuedChannel } from './queuedChannel';
|
|
5
|
-
export { RetryChannel } from './retryChannel';
|
|
6
|
-
export { SandboxChannel } from './sandboxChannel';
|
|
7
|
-
export { HttpBeaconChannel } from './httpBeaconChannel';
|
|
1
|
+
export { ChannelListener, Closeable, DuplexChannel, InputChannel, MessageDeliveryError, OutputChannel } from './channel.js';
|
|
2
|
+
export { EncodedChannel } from './encodedChannel.js';
|
|
3
|
+
export { GuaranteedChannel } from './guaranteedChannel.js';
|
|
4
|
+
export { QueuedChannel } from './queuedChannel.js';
|
|
5
|
+
export { RetryChannel } from './retryChannel.js';
|
|
6
|
+
export { SandboxChannel } from './sandboxChannel.js';
|
|
7
|
+
export { HttpBeaconChannel } from './httpBeaconChannel.js';
|
|
8
|
+
import '../transformer.js';
|
|
9
|
+
import '../logging/logger.js';
|
|
10
|
+
import '../queue/queue.js';
|
|
11
|
+
import '../retry/policy.js';
|
|
12
|
+
import '../cid/assigner.js';
|
package/channel/index.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var httpBeaconChannel_1 = require("./httpBeaconChannel");
|
|
17
|
-
Object.defineProperty(exports, "HttpBeaconChannel", { enumerable: true, get: function () { return httpBeaconChannel_1.HttpBeaconChannel; } });
|
|
1
|
+
export * from "./channel";
|
|
2
|
+
import { EncodedChannel } from "./encodedChannel";
|
|
3
|
+
import { GuaranteedChannel } from "./guaranteedChannel";
|
|
4
|
+
import { QueuedChannel } from "./queuedChannel";
|
|
5
|
+
import { RetryChannel } from "./retryChannel";
|
|
6
|
+
import { SandboxChannel } from "./sandboxChannel";
|
|
7
|
+
import { HttpBeaconChannel } from "./httpBeaconChannel";
|
|
8
|
+
export {
|
|
9
|
+
EncodedChannel,
|
|
10
|
+
GuaranteedChannel,
|
|
11
|
+
HttpBeaconChannel,
|
|
12
|
+
QueuedChannel,
|
|
13
|
+
RetryChannel,
|
|
14
|
+
SandboxChannel
|
|
15
|
+
};
|
|
18
16
|
//# sourceMappingURL=index.js.map
|
package/channel/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/channel/index.ts"],"sourcesContent":["export * from './channel';\nexport {EncodedChannel} from './encodedChannel';\nexport {GuaranteedChannel} from './guaranteedChannel';\nexport {QueuedChannel} from './queuedChannel';\nexport {RetryChannel} from './retryChannel';\nexport {SandboxChannel} from './sandboxChannel';\nexport {HttpBeaconChannel} from './httpBeaconChannel';\n"],"mappings":"AAAA,cAAc;AACd,SAAQ,sBAAqB;AAC7B,SAAQ,yBAAwB;AAChC,SAAQ,qBAAoB;AAC5B,SAAQ,oBAAmB;AAC3B,SAAQ,sBAAqB;AAC7B,SAAQ,yBAAwB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/channel/queuedChannel.ts"],"sourcesContent":["import {MessageDeliveryError, OutputChannel} from './channel';\nimport {Queue} from '../queue';\nimport {Logger, NullLogger} from '../logging';\n\nexport class QueuedChannel<T> implements OutputChannel<T> {\n private readonly channel: OutputChannel<T>;\n\n private readonly queue: Queue<T>;\n\n private readonly logger: Logger;\n\n private pending?: Promise<void>;\n\n private closed = false;\n\n public constructor(channel: OutputChannel<T>, queue: Queue<T>, logger?: Logger) {\n this.channel = channel;\n this.queue = queue;\n this.logger = logger ?? new NullLogger();\n }\n\n public flush(): Promise<void> {\n if (this.pending === undefined) {\n return this.requeue();\n }\n\n return this.pending.catch(this.requeue.bind(this));\n }\n\n public publish(message: T): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n if (this.queue.length() >= this.queue.getCapacity()) {\n this.logger.warn('The queue is full, message rejected.');\n\n return Promise.reject(MessageDeliveryError.retryable('The queue is full.'));\n }\n\n if (this.pending === undefined) {\n this.pending = this.requeue();\n }\n\n this.pending = this.chainNext(this.pending, message, true);\n\n return this.pending;\n }\n\n private enqueue(message: T): void {\n this.logger.debug('Enqueueing message...');\n this.logger.debug(`Queue length: ${this.queue.length() + 1}`);\n\n this.queue.push(message);\n }\n\n private dequeue(): void {\n this.logger.debug('Dequeuing message...');\n this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);\n\n this.queue.shift();\n }\n\n private requeue(): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n this.pending = Promise.resolve();\n\n if (this.queue.isEmpty()) {\n return this.pending;\n }\n\n const length = this.queue.length();\n\n this.logger.debug('Requeuing messages...');\n this.logger.debug(`Queue length: ${length}`);\n\n for (const message of this.queue.all()) {\n this.pending = this.chainNext(this.pending, message);\n }\n\n return this.pending;\n }\n\n private async chainNext(previous: Promise<void>, message: T, enqueue = false): Promise<void> {\n if (enqueue) {\n this.enqueue(message);\n }\n\n try {\n await previous;\n } catch (error) {\n if (error instanceof MessageDeliveryError && error.retryable) {\n // If the previous message failed to deliver, requeue all messages\n // including the current one that was just enqueued\n return this.requeue();\n }\n\n throw error;\n }\n\n if (this.closed) {\n throw MessageDeliveryError.retryable('Connection deliberately closed.');\n }\n\n try {\n const result = await this.channel.publish(message);\n\n this.dequeue();\n\n return result;\n } catch (error) {\n if (!(error instanceof MessageDeliveryError) || !error.retryable) {\n // Discard the message if it's non-retryable\n this.dequeue();\n\n if (!enqueue) {\n // If the message was not enqueued, suppress the error\n // so that the next message in the queue can be immediately\n return;\n }\n }\n\n throw error;\n }\n }\n\n public async close(): Promise<void> {\n this.closed = true;\n\n await this.channel.close();\n\n if (this.pending !== undefined) {\n try {\n await this.pending;\n } catch {\n // suppress errors\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { OutputChannel } from './channel';
|
|
2
|
-
import { Queue } from '../queue';
|
|
3
|
-
import { Logger } from '../logging';
|
|
4
|
-
|
|
1
|
+
import { OutputChannel } from './channel.js';
|
|
2
|
+
import { Queue } from '../queue/queue.js';
|
|
3
|
+
import { Logger } from '../logging/logger.js';
|
|
4
|
+
|
|
5
|
+
declare class QueuedChannel<T> implements OutputChannel<T> {
|
|
5
6
|
private readonly channel;
|
|
6
7
|
private readonly queue;
|
|
7
8
|
private readonly logger;
|
|
@@ -16,3 +17,5 @@ export declare class QueuedChannel<T> implements OutputChannel<T> {
|
|
|
16
17
|
private chainNext;
|
|
17
18
|
close(): Promise<void>;
|
|
18
19
|
}
|
|
20
|
+
|
|
21
|
+
export { QueuedChannel };
|
package/channel/queuedChannel.js
CHANGED
|
@@ -1,109 +1,99 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.QueuedChannel = void 0;
|
|
4
|
-
const channel_1 = require("./channel");
|
|
5
|
-
const logging_1 = require("../logging");
|
|
1
|
+
import { MessageDeliveryError } from "./channel";
|
|
2
|
+
import { NullLogger } from "../logging";
|
|
6
3
|
class QueuedChannel {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
constructor(channel, queue, logger) {
|
|
5
|
+
this.closed = false;
|
|
6
|
+
this.channel = channel;
|
|
7
|
+
this.queue = queue;
|
|
8
|
+
this.logger = logger ?? new NullLogger();
|
|
9
|
+
}
|
|
10
|
+
flush() {
|
|
11
|
+
if (this.pending === void 0) {
|
|
12
|
+
return this.requeue();
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
return this.pending.catch(this.requeue.bind(this));
|
|
15
|
+
}
|
|
16
|
+
publish(message) {
|
|
17
|
+
if (this.closed) {
|
|
18
|
+
return Promise.reject(MessageDeliveryError.nonRetryable("Channel is closed."));
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
if (this.queue.length() >= this.queue.getCapacity()) {
|
|
24
|
-
this.logger.warn('The queue is full, message rejected.');
|
|
25
|
-
return Promise.reject(channel_1.MessageDeliveryError.retryable('The queue is full.'));
|
|
26
|
-
}
|
|
27
|
-
if (this.pending === undefined) {
|
|
28
|
-
this.pending = this.requeue();
|
|
29
|
-
}
|
|
30
|
-
this.pending = this.chainNext(this.pending, message, true);
|
|
31
|
-
return this.pending;
|
|
20
|
+
if (this.queue.length() >= this.queue.getCapacity()) {
|
|
21
|
+
this.logger.warn("The queue is full, message rejected.");
|
|
22
|
+
return Promise.reject(MessageDeliveryError.retryable("The queue is full."));
|
|
32
23
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.logger.debug(`Queue length: ${this.queue.length() + 1}`);
|
|
36
|
-
this.queue.push(message);
|
|
24
|
+
if (this.pending === void 0) {
|
|
25
|
+
this.pending = this.requeue();
|
|
37
26
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
27
|
+
this.pending = this.chainNext(this.pending, message, true);
|
|
28
|
+
return this.pending;
|
|
29
|
+
}
|
|
30
|
+
enqueue(message) {
|
|
31
|
+
this.logger.debug("Enqueueing message...");
|
|
32
|
+
this.logger.debug(`Queue length: ${this.queue.length() + 1}`);
|
|
33
|
+
this.queue.push(message);
|
|
34
|
+
}
|
|
35
|
+
dequeue() {
|
|
36
|
+
this.logger.debug("Dequeuing message...");
|
|
37
|
+
this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);
|
|
38
|
+
this.queue.shift();
|
|
39
|
+
}
|
|
40
|
+
requeue() {
|
|
41
|
+
if (this.closed) {
|
|
42
|
+
return Promise.reject(MessageDeliveryError.nonRetryable("Channel is closed."));
|
|
42
43
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
this.pending = Promise.resolve();
|
|
48
|
-
if (this.queue.isEmpty()) {
|
|
49
|
-
return this.pending;
|
|
50
|
-
}
|
|
51
|
-
const length = this.queue.length();
|
|
52
|
-
this.logger.debug('Requeuing messages...');
|
|
53
|
-
this.logger.debug(`Queue length: ${length}`);
|
|
54
|
-
for (const message of this.queue.all()) {
|
|
55
|
-
this.pending = this.chainNext(this.pending, message);
|
|
56
|
-
}
|
|
57
|
-
return this.pending;
|
|
44
|
+
this.pending = Promise.resolve();
|
|
45
|
+
if (this.queue.isEmpty()) {
|
|
46
|
+
return this.pending;
|
|
58
47
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
await previous;
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
if (error instanceof channel_1.MessageDeliveryError && error.retryable) {
|
|
68
|
-
// If the previous message failed to deliver, requeue all messages
|
|
69
|
-
// including the current one that was just enqueued
|
|
70
|
-
return this.requeue();
|
|
71
|
-
}
|
|
72
|
-
throw error;
|
|
73
|
-
}
|
|
74
|
-
if (this.closed) {
|
|
75
|
-
throw channel_1.MessageDeliveryError.retryable('Connection deliberately closed.');
|
|
76
|
-
}
|
|
77
|
-
try {
|
|
78
|
-
const result = await this.channel.publish(message);
|
|
79
|
-
this.dequeue();
|
|
80
|
-
return result;
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
if (!(error instanceof channel_1.MessageDeliveryError) || !error.retryable) {
|
|
84
|
-
// Discard the message if it's non-retryable
|
|
85
|
-
this.dequeue();
|
|
86
|
-
if (!enqueue) {
|
|
87
|
-
// If the message was not enqueued, suppress the error
|
|
88
|
-
// so that the next message in the queue can be immediately
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
throw error;
|
|
93
|
-
}
|
|
48
|
+
const length = this.queue.length();
|
|
49
|
+
this.logger.debug("Requeuing messages...");
|
|
50
|
+
this.logger.debug(`Queue length: ${length}`);
|
|
51
|
+
for (const message of this.queue.all()) {
|
|
52
|
+
this.pending = this.chainNext(this.pending, message);
|
|
94
53
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
54
|
+
return this.pending;
|
|
55
|
+
}
|
|
56
|
+
async chainNext(previous, message, enqueue = false) {
|
|
57
|
+
if (enqueue) {
|
|
58
|
+
this.enqueue(message);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await previous;
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (error instanceof MessageDeliveryError && error.retryable) {
|
|
64
|
+
return this.requeue();
|
|
65
|
+
}
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
if (this.closed) {
|
|
69
|
+
throw MessageDeliveryError.retryable("Connection deliberately closed.");
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const result = await this.channel.publish(message);
|
|
73
|
+
this.dequeue();
|
|
74
|
+
return result;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
if (!(error instanceof MessageDeliveryError) || !error.retryable) {
|
|
77
|
+
this.dequeue();
|
|
78
|
+
if (!enqueue) {
|
|
79
|
+
return;
|
|
105
80
|
}
|
|
81
|
+
}
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async close() {
|
|
86
|
+
this.closed = true;
|
|
87
|
+
await this.channel.close();
|
|
88
|
+
if (this.pending !== void 0) {
|
|
89
|
+
try {
|
|
90
|
+
await this.pending;
|
|
91
|
+
} catch {
|
|
92
|
+
}
|
|
106
93
|
}
|
|
94
|
+
}
|
|
107
95
|
}
|
|
108
|
-
|
|
96
|
+
export {
|
|
97
|
+
QueuedChannel
|
|
98
|
+
};
|
|
109
99
|
//# sourceMappingURL=queuedChannel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/channel/queuedChannel.ts"],"sourcesContent":["import {MessageDeliveryError, OutputChannel} from './channel';\nimport {Queue} from '../queue';\nimport {Logger, NullLogger} from '../logging';\n\nexport class QueuedChannel<T> implements OutputChannel<T> {\n private readonly channel: OutputChannel<T>;\n\n private readonly queue: Queue<T>;\n\n private readonly logger: Logger;\n\n private pending?: Promise<void>;\n\n private closed = false;\n\n public constructor(channel: OutputChannel<T>, queue: Queue<T>, logger?: Logger) {\n this.channel = channel;\n this.queue = queue;\n this.logger = logger ?? new NullLogger();\n }\n\n public flush(): Promise<void> {\n if (this.pending === undefined) {\n return this.requeue();\n }\n\n return this.pending.catch(this.requeue.bind(this));\n }\n\n public publish(message: T): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n if (this.queue.length() >= this.queue.getCapacity()) {\n this.logger.warn('The queue is full, message rejected.');\n\n return Promise.reject(MessageDeliveryError.retryable('The queue is full.'));\n }\n\n if (this.pending === undefined) {\n this.pending = this.requeue();\n }\n\n this.pending = this.chainNext(this.pending, message, true);\n\n return this.pending;\n }\n\n private enqueue(message: T): void {\n this.logger.debug('Enqueueing message...');\n this.logger.debug(`Queue length: ${this.queue.length() + 1}`);\n\n this.queue.push(message);\n }\n\n private dequeue(): void {\n this.logger.debug('Dequeuing message...');\n this.logger.debug(`Queue length: ${Math.max(0, this.queue.length() - 1)}`);\n\n this.queue.shift();\n }\n\n private requeue(): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));\n }\n\n this.pending = Promise.resolve();\n\n if (this.queue.isEmpty()) {\n return this.pending;\n }\n\n const length = this.queue.length();\n\n this.logger.debug('Requeuing messages...');\n this.logger.debug(`Queue length: ${length}`);\n\n for (const message of this.queue.all()) {\n this.pending = this.chainNext(this.pending, message);\n }\n\n return this.pending;\n }\n\n private async chainNext(previous: Promise<void>, message: T, enqueue = false): Promise<void> {\n if (enqueue) {\n this.enqueue(message);\n }\n\n try {\n await previous;\n } catch (error) {\n if (error instanceof MessageDeliveryError && error.retryable) {\n // If the previous message failed to deliver, requeue all messages\n // including the current one that was just enqueued\n return this.requeue();\n }\n\n throw error;\n }\n\n if (this.closed) {\n throw MessageDeliveryError.retryable('Connection deliberately closed.');\n }\n\n try {\n const result = await this.channel.publish(message);\n\n this.dequeue();\n\n return result;\n } catch (error) {\n if (!(error instanceof MessageDeliveryError) || !error.retryable) {\n // Discard the message if it's non-retryable\n this.dequeue();\n\n if (!enqueue) {\n // If the message was not enqueued, suppress the error\n // so that the next message in the queue can be immediately\n return;\n }\n }\n\n throw error;\n }\n }\n\n public async close(): Promise<void> {\n this.closed = true;\n\n await this.channel.close();\n\n if (this.pending !== undefined) {\n try {\n await this.pending;\n } catch {\n // suppress errors\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/channel/retryChannel.ts"],"sourcesContent":["import {MessageDeliveryError, OutputChannel} from './channel';\nimport {Logger, NullLogger} from '../logging';\nimport {RetryPolicy} from '../retry';\n\ntype Configuration<T> = {\n channel: OutputChannel<T>,\n retryPolicy: RetryPolicy<T>,\n logger?: Logger,\n};\n\nexport class RetryChannel<T> implements OutputChannel<T> {\n private readonly channel: OutputChannel<T>;\n\n private readonly retryPolicy: RetryPolicy<T>;\n\n private readonly logger: Logger;\n\n private closed = false;\n\n public constructor({channel, retryPolicy, logger}: Configuration<T>) {\n this.channel = channel;\n this.retryPolicy = retryPolicy;\n this.logger = logger ?? new NullLogger();\n }\n\n public publish(message: T): Promise<void> {\n if (this.closed) {\n return Promise.reject(MessageDeliveryError.nonRetryable('The channel is closed.'));\n }\n\n return this.channel\n .publish(message)\n .catch(error => this.retry(message, error));\n }\n\n public async retry(message: T, error: unknown): Promise<void> {\n if (error instanceof MessageDeliveryError && !error.retryable) {\n throw error;\n }\n\n let attempt = 0;\n\n while (this.retryPolicy.shouldRetry(attempt, message, error)) {\n if (this.closed) {\n throw MessageDeliveryError.retryable('Connection deliberately closed.');\n }\n\n const delay = this.retryPolicy.getDelay(attempt);\n\n this.logger.debug(`Retry attempt ${attempt + 1}`);\n\n if (delay > 0) {\n this.logger.debug(`Retry attempt delayed in ${delay}ms`);\n\n await new Promise<void>((resolve, reject): void => {\n const closeWatcher = window.setInterval(\n () => {\n if (this.closed) {\n // Cancel delay immediately when the channel is closed\n window.clearInterval(closeWatcher);\n\n reject(MessageDeliveryError.retryable('Connection deliberately closed.'));\n }\n },\n 0,\n );\n\n window.setTimeout(\n (): void => {\n window.clearInterval(closeWatcher);\n\n resolve();\n },\n delay,\n );\n });\n }\n\n try {\n return await this.channel.publish(message);\n } catch {\n attempt += 1;\n }\n }\n\n throw MessageDeliveryError.nonRetryable('Maximum retry attempts reached.');\n }\n\n public close(): Promise<void> {\n this.closed = true;\n\n return this.channel.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAkD;AAClD,qBAAiC;AAS1B,MAAM,aAA4C;AAAA,EAS9C,YAAY,EAAC,SAAS,aAAa,OAAM,GAAqB;AAFrE,SAAQ,SAAS;AAGb,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,SAAS,UAAU,IAAI,0BAAW;AAAA,EAC3C;AAAA,EAEO,QAAQ,SAA2B;AACtC,QAAI,KAAK,QAAQ;AACb,aAAO,QAAQ,OAAO,oCAAqB,aAAa,wBAAwB,CAAC;AAAA,IACrF;AAEA,WAAO,KAAK,QACP,QAAQ,OAAO,EACf,MAAM,WAAS,KAAK,MAAM,SAAS,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,MAAM,SAAY,OAA+B;AAC1D,QAAI,iBAAiB,uCAAwB,CAAC,MAAM,WAAW;AAC3D,YAAM;AAAA,IACV;AAEA,QAAI,UAAU;AAEd,WAAO,KAAK,YAAY,YAAY,SAAS,SAAS,KAAK,GAAG;AAC1D,UAAI,KAAK,QAAQ;AACb,cAAM,oCAAqB,UAAU,iCAAiC;AAAA,MAC1E;AAEA,YAAM,QAAQ,KAAK,YAAY,SAAS,OAAO;AAE/C,WAAK,OAAO,MAAM,iBAAiB,UAAU,CAAC,EAAE;AAEhD,UAAI,QAAQ,GAAG;AACX,aAAK,OAAO,MAAM,4BAA4B,KAAK,IAAI;AAEvD,cAAM,IAAI,QAAc,CAAC,SAAS,WAAiB;AAC/C,gBAAM,eAAe,OAAO;AAAA,YACxB,MAAM;AACF,kBAAI,KAAK,QAAQ;AAEb,uBAAO,cAAc,YAAY;AAEjC,uBAAO,oCAAqB,UAAU,iCAAiC,CAAC;AAAA,cAC5E;AAAA,YACJ;AAAA,YACA;AAAA,UACJ;AAEA,iBAAO;AAAA,YACH,MAAY;AACR,qBAAO,cAAc,YAAY;AAEjC,sBAAQ;AAAA,YACZ;AAAA,YACA;AAAA,UACJ;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,UAAI;AACA,eAAO,MAAM,KAAK,QAAQ,QAAQ,OAAO;AAAA,MAC7C,QAAQ;AACJ,mBAAW;AAAA,MACf;AAAA,IACJ;AAEA,UAAM,oCAAqB,aAAa,iCAAiC;AAAA,EAC7E;AAAA,EAEO,QAAuB;AAC1B,SAAK,SAAS;AAEd,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AACJ;","names":[]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { OutputChannel } from './channel';
|
|
2
|
-
import { Logger } from '../logging';
|
|
3
|
-
import { RetryPolicy } from '../retry';
|
|
1
|
+
import { OutputChannel } from './channel.js';
|
|
2
|
+
import { Logger } from '../logging/logger.js';
|
|
3
|
+
import { RetryPolicy } from '../retry/policy.js';
|
|
4
|
+
|
|
4
5
|
type Configuration<T> = {
|
|
5
6
|
channel: OutputChannel<T>;
|
|
6
7
|
retryPolicy: RetryPolicy<T>;
|
|
7
8
|
logger?: Logger;
|
|
8
9
|
};
|
|
9
|
-
|
|
10
|
+
declare class RetryChannel<T> implements OutputChannel<T> {
|
|
10
11
|
private readonly channel;
|
|
11
12
|
private readonly retryPolicy;
|
|
12
13
|
private readonly logger;
|
|
@@ -16,4 +17,5 @@ export declare class RetryChannel<T> implements OutputChannel<T> {
|
|
|
16
17
|
retry(message: T, error: unknown): Promise<void>;
|
|
17
18
|
close(): Promise<void>;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
|
|
21
|
+
export { RetryChannel };
|