@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
package/evaluator.js
CHANGED
|
@@ -1,193 +1,193 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
EvaluationErrorType["UNALLOWED_RESULT"] = "https://croct.help/api/evaluation#unallowed-result";
|
|
17
|
-
EvaluationErrorType["UNSERIALIZABLE_RESULT"] = "https://croct.help/api/evaluation#unserializable-result";
|
|
18
|
-
})(EvaluationErrorType || (exports.EvaluationErrorType = EvaluationErrorType = {}));
|
|
1
|
+
import { BASE_ENDPOINT_URL, CLIENT_LIBRARY, MAX_QUERY_LENGTH } from "./constants";
|
|
2
|
+
import { formatMessage } from "./error";
|
|
3
|
+
import { getLength, getLocation } from "./sourceLocation";
|
|
4
|
+
import { NullLogger } from "./logging";
|
|
5
|
+
import { Help } from "./help";
|
|
6
|
+
var EvaluationErrorType = /* @__PURE__ */ ((EvaluationErrorType2) => {
|
|
7
|
+
EvaluationErrorType2["TIMEOUT"] = "https://croct.help/api/evaluation#timeout";
|
|
8
|
+
EvaluationErrorType2["UNEXPECTED_ERROR"] = "https://croct.help/api/evaluation#unexpected-error";
|
|
9
|
+
EvaluationErrorType2["INVALID_QUERY"] = "https://croct.help/api/evaluation#invalid-query";
|
|
10
|
+
EvaluationErrorType2["TOO_COMPLEX_QUERY"] = "https://croct.help/api/evaluation#too-complex-query";
|
|
11
|
+
EvaluationErrorType2["EVALUATION_FAILED"] = "https://croct.help/api/evaluation#evaluation-failed";
|
|
12
|
+
EvaluationErrorType2["UNALLOWED_RESULT"] = "https://croct.help/api/evaluation#unallowed-result";
|
|
13
|
+
EvaluationErrorType2["UNSERIALIZABLE_RESULT"] = "https://croct.help/api/evaluation#unserializable-result";
|
|
14
|
+
return EvaluationErrorType2;
|
|
15
|
+
})(EvaluationErrorType || {});
|
|
19
16
|
class EvaluationError extends Error {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
constructor(response) {
|
|
18
|
+
super(response.title);
|
|
19
|
+
this.response = response;
|
|
20
|
+
Object.setPrototypeOf(this, EvaluationError.prototype);
|
|
21
|
+
}
|
|
25
22
|
}
|
|
26
|
-
exports.EvaluationError = EvaluationError;
|
|
27
23
|
class QueryError extends EvaluationError {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
constructor(response) {
|
|
25
|
+
super(response);
|
|
26
|
+
Object.setPrototypeOf(this, QueryError.prototype);
|
|
27
|
+
}
|
|
32
28
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
29
|
+
const _Evaluator = class _Evaluator {
|
|
30
|
+
constructor(configuration) {
|
|
31
|
+
if (configuration.appId === void 0 === (configuration.apiKey === void 0)) {
|
|
32
|
+
throw new Error("Either the application ID or the API key must be provided.");
|
|
33
|
+
}
|
|
34
|
+
const { baseEndpointUrl } = configuration;
|
|
35
|
+
const apiKey = typeof configuration.apiKey === "object" ? configuration.apiKey.getIdentifier() : configuration.apiKey;
|
|
36
|
+
this.endpoint = (baseEndpointUrl ?? BASE_ENDPOINT_URL).replace(/\/+$/, "") + (apiKey === void 0 ? "/client" : "/external") + "/web/evaluate";
|
|
37
|
+
this.logger = configuration.logger ?? new NullLogger();
|
|
38
|
+
this.configuration = {
|
|
39
|
+
appId: configuration.appId,
|
|
40
|
+
apiKey,
|
|
41
|
+
defaultTimeout: configuration.defaultTimeout
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
evaluate(query, options = {}) {
|
|
45
|
+
const length = getLength(query);
|
|
46
|
+
const reference = query.length > 20 ? `${query.slice(0, 20)}...` : query;
|
|
47
|
+
if (length > _Evaluator.MAX_QUERY_LENGTH) {
|
|
48
|
+
const response = {
|
|
49
|
+
title: "The query is too complex.",
|
|
50
|
+
status: 422,
|
|
51
|
+
// Unprocessable Entity
|
|
52
|
+
type: "https://croct.help/api/evaluation#too-complex-query" /* TOO_COMPLEX_QUERY */,
|
|
53
|
+
detail: `The query "${reference}" must be at most ${_Evaluator.MAX_QUERY_LENGTH} characters long, but it is ${length} characters long.`,
|
|
54
|
+
errors: [{
|
|
55
|
+
cause: "The query is longer than expected.",
|
|
56
|
+
location: getLocation(query, 0, Math.max(length - 1, 0))
|
|
57
|
+
}]
|
|
58
|
+
};
|
|
59
|
+
return Promise.reject(new QueryError(response));
|
|
60
|
+
}
|
|
61
|
+
const payload = {
|
|
62
|
+
query
|
|
63
|
+
};
|
|
64
|
+
if (options.context !== void 0) {
|
|
65
|
+
payload.context = options.context;
|
|
54
66
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const abortController = new AbortController();
|
|
69
|
+
const timeout = options.timeout ?? this.configuration.defaultTimeout;
|
|
70
|
+
let timer;
|
|
71
|
+
if (timeout !== void 0) {
|
|
72
|
+
timer = setTimeout(
|
|
73
|
+
() => {
|
|
59
74
|
const response = {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
errors: [{
|
|
66
|
-
cause: 'The query is longer than expected.',
|
|
67
|
-
location: (0, sourceLocation_1.getLocation)(query, 0, Math.max(length - 1, 0)),
|
|
68
|
-
}],
|
|
75
|
+
title: `Evaluation could not be completed in time for query "${reference}".`,
|
|
76
|
+
type: "https://croct.help/api/evaluation#timeout" /* TIMEOUT */,
|
|
77
|
+
detail: `The evaluation took more than ${timeout}ms to complete.`,
|
|
78
|
+
status: 408
|
|
79
|
+
// Request Timeout
|
|
69
80
|
};
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
type: EvaluationErrorType.TIMEOUT,
|
|
88
|
-
detail: `The evaluation took more than ${timeout}ms to complete.`,
|
|
89
|
-
status: 408, // Request Timeout
|
|
90
|
-
};
|
|
91
|
-
abortController.abort();
|
|
92
|
-
this.logHelp(response.status);
|
|
93
|
-
reject(new EvaluationError(response));
|
|
94
|
-
}, timeout);
|
|
81
|
+
abortController.abort();
|
|
82
|
+
this.logHelp(response.status);
|
|
83
|
+
reject(new EvaluationError(response));
|
|
84
|
+
},
|
|
85
|
+
timeout
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
this.fetch(payload, abortController.signal, options).finally(() => clearTimeout(timer)).then(
|
|
89
|
+
(response) => {
|
|
90
|
+
const region = response.headers.get("X-Croct-Region");
|
|
91
|
+
const timing = response.headers.get("X-Croct-Timing");
|
|
92
|
+
this.logger.debug(
|
|
93
|
+
`Evaluation of the query "${reference}" processed by region ${region} in ${timing}.`
|
|
94
|
+
);
|
|
95
|
+
return response.json().then((body) => {
|
|
96
|
+
if (response.ok) {
|
|
97
|
+
return resolve(body);
|
|
95
98
|
}
|
|
96
|
-
this.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
break;
|
|
115
|
-
default:
|
|
116
|
-
reject(new EvaluationError(problem));
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
.catch(error => {
|
|
121
|
-
if (!response.ok) {
|
|
122
|
-
throw new Error(`Error ${response.status} - ${response.statusText}`);
|
|
123
|
-
}
|
|
124
|
-
throw error;
|
|
125
|
-
});
|
|
126
|
-
})
|
|
127
|
-
.catch(error => {
|
|
128
|
-
if (!abortController.signal.aborted) {
|
|
129
|
-
reject(new EvaluationError({
|
|
130
|
-
title: (0, error_1.formatMessage)(error),
|
|
131
|
-
type: EvaluationErrorType.UNEXPECTED_ERROR,
|
|
132
|
-
detail: 'Please try again or contact Croct support if the error persists.',
|
|
133
|
-
status: 500, // Internal Server Error
|
|
134
|
-
}));
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
fetch(body, signal, options) {
|
|
140
|
-
const { appId, apiKey } = this.configuration;
|
|
141
|
-
const { clientId, clientIp, userToken, clientAgent } = options;
|
|
142
|
-
const headers = {
|
|
143
|
-
'Content-Type': 'application/json',
|
|
144
|
-
};
|
|
145
|
-
headers['X-Client-Library'] = constants_1.CLIENT_LIBRARY;
|
|
146
|
-
if (apiKey !== undefined) {
|
|
147
|
-
headers['X-Api-Key'] = apiKey;
|
|
148
|
-
}
|
|
149
|
-
else if (appId !== undefined) {
|
|
150
|
-
headers['X-App-Id'] = appId;
|
|
151
|
-
}
|
|
152
|
-
if (clientId !== undefined) {
|
|
153
|
-
headers['X-Client-Id'] = clientId;
|
|
154
|
-
}
|
|
155
|
-
if (clientIp !== undefined) {
|
|
156
|
-
headers['X-Client-Ip'] = clientIp;
|
|
157
|
-
}
|
|
158
|
-
if (userToken !== undefined) {
|
|
159
|
-
headers['X-Token'] = userToken.toString();
|
|
99
|
+
this.logHelp(response.status);
|
|
100
|
+
const problem = body;
|
|
101
|
+
switch (problem.type) {
|
|
102
|
+
case "https://croct.help/api/evaluation#invalid-query" /* INVALID_QUERY */:
|
|
103
|
+
case "https://croct.help/api/evaluation#evaluation-failed" /* EVALUATION_FAILED */:
|
|
104
|
+
case "https://croct.help/api/evaluation#too-complex-query" /* TOO_COMPLEX_QUERY */:
|
|
105
|
+
reject(new QueryError(problem));
|
|
106
|
+
break;
|
|
107
|
+
default:
|
|
108
|
+
reject(new EvaluationError(problem));
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}).catch((error) => {
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
throw new Error(`Error ${response.status} - ${response.statusText}`);
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
});
|
|
160
117
|
}
|
|
161
|
-
|
|
162
|
-
|
|
118
|
+
).catch(
|
|
119
|
+
(error) => {
|
|
120
|
+
if (!abortController.signal.aborted) {
|
|
121
|
+
reject(
|
|
122
|
+
new EvaluationError({
|
|
123
|
+
title: formatMessage(error),
|
|
124
|
+
type: "https://croct.help/api/evaluation#unexpected-error" /* UNEXPECTED_ERROR */,
|
|
125
|
+
detail: "Please try again or contact Croct support if the error persists.",
|
|
126
|
+
status: 500
|
|
127
|
+
// Internal Server Error
|
|
128
|
+
})
|
|
129
|
+
);
|
|
130
|
+
}
|
|
163
131
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
});
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
fetch(body, signal, options) {
|
|
136
|
+
const { appId, apiKey } = this.configuration;
|
|
137
|
+
const { clientId, clientIp, userToken, clientAgent } = options;
|
|
138
|
+
const headers = {
|
|
139
|
+
"Content-Type": "application/json"
|
|
140
|
+
};
|
|
141
|
+
headers["X-Client-Library"] = CLIENT_LIBRARY;
|
|
142
|
+
if (apiKey !== void 0) {
|
|
143
|
+
headers["X-Api-Key"] = apiKey;
|
|
144
|
+
} else if (appId !== void 0) {
|
|
145
|
+
headers["X-App-Id"] = appId;
|
|
179
146
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (help !== undefined) {
|
|
183
|
-
this.logger.error(help);
|
|
184
|
-
}
|
|
147
|
+
if (clientId !== void 0) {
|
|
148
|
+
headers["X-Client-Id"] = clientId;
|
|
185
149
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
throw new Error('Unserializable value.');
|
|
150
|
+
if (clientIp !== void 0) {
|
|
151
|
+
headers["X-Client-Ip"] = clientIp;
|
|
189
152
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
153
|
+
if (userToken !== void 0) {
|
|
154
|
+
headers["X-Token"] = userToken.toString();
|
|
155
|
+
}
|
|
156
|
+
if (clientAgent !== void 0) {
|
|
157
|
+
headers["X-Client-Agent"] = clientAgent;
|
|
158
|
+
}
|
|
159
|
+
return fetch(this.endpoint, {
|
|
160
|
+
// Set the request mode to 'cors' when running in the browser.
|
|
161
|
+
// By default, the request mode is computed based on the referrer policy
|
|
162
|
+
// and response-tainting rules applied to the script that ultimately
|
|
163
|
+
// initiated the fetch, make this prone to errors due to unrelated
|
|
164
|
+
// configurations on the page.
|
|
165
|
+
// https://fetch.spec.whatwg.org/#origin-header
|
|
166
|
+
mode: typeof window === "undefined" ? void 0 : "cors",
|
|
167
|
+
credentials: "omit",
|
|
168
|
+
...options.extra,
|
|
169
|
+
method: "POST",
|
|
170
|
+
headers,
|
|
171
|
+
signal,
|
|
172
|
+
body: JSON.stringify(body)
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
logHelp(statusCode) {
|
|
176
|
+
const help = Help.forStatusCode(statusCode);
|
|
177
|
+
if (help !== void 0) {
|
|
178
|
+
this.logger.error(help);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
toJSON() {
|
|
182
|
+
throw new Error("Unserializable value.");
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
_Evaluator.MAX_QUERY_LENGTH = MAX_QUERY_LENGTH;
|
|
186
|
+
let Evaluator = _Evaluator;
|
|
187
|
+
export {
|
|
188
|
+
EvaluationError,
|
|
189
|
+
EvaluationErrorType,
|
|
190
|
+
Evaluator,
|
|
191
|
+
QueryError
|
|
192
|
+
};
|
|
193
193
|
//# sourceMappingURL=evaluator.js.map
|
package/evaluator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["src/evaluator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["src/evaluator.ts"],"sourcesContent":["import {JsonObject, JsonValue} from '@croct/json';\nimport {Token} from './token';\nimport {BASE_ENDPOINT_URL, CLIENT_LIBRARY, MAX_QUERY_LENGTH} from './constants';\nimport {formatMessage} from './error';\nimport {getLength, getLocation, Location} from './sourceLocation';\nimport {Logger, NullLogger} from './logging';\nimport type {ApiKey} from './apiKey';\nimport {Help} from './help';\n\nexport type Campaign = {\n name?: string,\n source?: string,\n medium?: string,\n term?: string,\n content?: string,\n};\n\nexport type Page = {\n url: string,\n title?: string,\n referrer?: string,\n};\n\nexport type EvaluationContext = {\n timeZone?: string,\n campaign?: Campaign,\n page?: Page,\n attributes?: JsonObject,\n};\n\ntype AllowedFetchOptions = Exclude<keyof RequestInit, 'method' | 'body' | 'headers' | 'signal'>;\n\ntype ExtraFetchOptions<T extends keyof RequestInit = AllowedFetchOptions> = Pick<RequestInit, T>\n & {[key in Exclude<keyof RequestInit, T>]?: never}\n & Record<string, any>;\n\nexport type EvaluationOptions = {\n clientId?: string,\n clientIp?: string,\n clientAgent?: string,\n userToken?: Token|string,\n timeout?: number,\n context?: EvaluationContext,\n extra?: ExtraFetchOptions,\n};\n\nexport enum EvaluationErrorType {\n TIMEOUT = 'https://croct.help/api/evaluation#timeout',\n UNEXPECTED_ERROR = 'https://croct.help/api/evaluation#unexpected-error',\n INVALID_QUERY = 'https://croct.help/api/evaluation#invalid-query',\n TOO_COMPLEX_QUERY = 'https://croct.help/api/evaluation#too-complex-query',\n EVALUATION_FAILED = 'https://croct.help/api/evaluation#evaluation-failed',\n UNALLOWED_RESULT = 'https://croct.help/api/evaluation#unallowed-result',\n UNSERIALIZABLE_RESULT = 'https://croct.help/api/evaluation#unserializable-result',\n}\n\nexport type ErrorResponse = {\n type: EvaluationErrorType,\n title: string,\n status: number,\n detail?: string,\n};\n\nexport class EvaluationError<T extends ErrorResponse = ErrorResponse> extends Error {\n public readonly response: T;\n\n public constructor(response: T) {\n super(response.title);\n\n this.response = response;\n\n Object.setPrototypeOf(this, EvaluationError.prototype);\n }\n}\n\ntype QueryErrorDetail = {\n cause: string,\n location: Location,\n};\n\nexport type QueryErrorResponse = ErrorResponse & {\n errors: QueryErrorDetail[],\n};\n\nexport class QueryError extends EvaluationError<QueryErrorResponse> {\n public constructor(response: QueryErrorResponse) {\n super(response);\n\n Object.setPrototypeOf(this, QueryError.prototype);\n }\n}\n\nexport type Configuration = {\n appId?: string,\n apiKey?: string|ApiKey,\n baseEndpointUrl?: string,\n logger?: Logger,\n defaultTimeout?: number,\n};\n\ntype InternalConfiguration = {\n appId?: string,\n apiKey?: string,\n defaultTimeout?: number,\n};\n\nexport class Evaluator {\n public static readonly MAX_QUERY_LENGTH = MAX_QUERY_LENGTH;\n\n private readonly configuration: InternalConfiguration;\n\n private readonly endpoint: string;\n\n private readonly logger: Logger;\n\n public constructor(configuration: Configuration) {\n if ((configuration.appId === undefined) === (configuration.apiKey === undefined)) {\n throw new Error('Either the application ID or the API key must be provided.');\n }\n\n const {baseEndpointUrl} = configuration;\n const apiKey = typeof configuration.apiKey === 'object'\n ? configuration.apiKey.getIdentifier()\n : configuration.apiKey;\n\n // eslint-disable-next-line prefer-template -- Better readability\n this.endpoint = (baseEndpointUrl ?? BASE_ENDPOINT_URL).replace(/\\/+$/, '')\n + (apiKey === undefined ? '/client' : '/external')\n + '/web/evaluate';\n this.logger = configuration.logger ?? new NullLogger();\n this.configuration = {\n appId: configuration.appId,\n apiKey: apiKey,\n defaultTimeout: configuration.defaultTimeout,\n };\n }\n\n public evaluate(query: string, options: EvaluationOptions = {}): Promise<JsonValue> {\n const length = getLength(query);\n const reference = query.length > 20 ? `${query.slice(0, 20)}...` : query;\n\n if (length > Evaluator.MAX_QUERY_LENGTH) {\n const response: QueryErrorResponse = {\n title: 'The query is too complex.',\n status: 422, // Unprocessable Entity\n type: EvaluationErrorType.TOO_COMPLEX_QUERY,\n detail: `The query \"${reference}\" must be at most ${Evaluator.MAX_QUERY_LENGTH} characters long, `\n + `but it is ${length} characters long.`,\n errors: [{\n cause: 'The query is longer than expected.',\n location: getLocation(query, 0, Math.max(length - 1, 0)),\n }],\n };\n\n return Promise.reject(new QueryError(response));\n }\n\n const payload: JsonObject = {\n query: query,\n };\n\n if (options.context !== undefined) {\n payload.context = options.context;\n }\n\n return new Promise((resolve, reject) => {\n const abortController = new AbortController();\n const timeout = options.timeout ?? this.configuration.defaultTimeout;\n\n let timer: number | NodeJS.Timeout | undefined;\n\n if (timeout !== undefined) {\n timer = setTimeout(\n () => {\n const response: ErrorResponse = {\n title: `Evaluation could not be completed in time for query \"${reference}\".`,\n type: EvaluationErrorType.TIMEOUT,\n detail: `The evaluation took more than ${timeout}ms to complete.`,\n status: 408, // Request Timeout\n };\n\n abortController.abort();\n\n this.logHelp(response.status);\n\n reject(new EvaluationError(response));\n },\n timeout,\n );\n }\n\n this.fetch(payload, abortController.signal, options)\n .finally(() => clearTimeout(timer))\n .then(\n response => {\n const region = response.headers.get('X-Croct-Region');\n const timing = response.headers.get('X-Croct-Timing');\n\n this.logger.debug(\n `Evaluation of the query \"${reference}\" processed by region ${region} in ${timing}.`,\n );\n\n return response.json()\n .then(body => {\n if (response.ok) {\n return resolve(body);\n }\n\n this.logHelp(response.status);\n\n const problem: ErrorResponse = body;\n\n switch (problem.type) {\n case EvaluationErrorType.INVALID_QUERY:\n case EvaluationErrorType.EVALUATION_FAILED:\n case EvaluationErrorType.TOO_COMPLEX_QUERY:\n reject(new QueryError(problem as QueryErrorResponse));\n\n break;\n\n default:\n reject(new EvaluationError(problem));\n\n break;\n }\n })\n .catch(error => {\n if (!response.ok) {\n throw new Error(`Error ${response.status} - ${response.statusText}`);\n }\n\n throw error;\n });\n },\n )\n .catch(\n error => {\n if (!abortController.signal.aborted) {\n reject(\n new EvaluationError({\n title: formatMessage(error),\n type: EvaluationErrorType.UNEXPECTED_ERROR,\n detail: 'Please try again or contact Croct support if the error persists.',\n status: 500, // Internal Server Error\n }),\n );\n }\n },\n );\n });\n }\n\n private fetch(body: JsonObject, signal: AbortSignal, options: EvaluationOptions): Promise<Response> {\n const {appId, apiKey} = this.configuration;\n const {clientId, clientIp, userToken, clientAgent} = options;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n headers['X-Client-Library'] = CLIENT_LIBRARY;\n\n if (apiKey !== undefined) {\n headers['X-Api-Key'] = apiKey;\n } else if (appId !== undefined) {\n headers['X-App-Id'] = appId;\n }\n\n if (clientId !== undefined) {\n headers['X-Client-Id'] = clientId;\n }\n\n if (clientIp !== undefined) {\n headers['X-Client-Ip'] = clientIp;\n }\n\n if (userToken !== undefined) {\n headers['X-Token'] = userToken.toString();\n }\n\n if (clientAgent !== undefined) {\n headers['X-Client-Agent'] = clientAgent;\n }\n\n return fetch(this.endpoint, {\n // Set the request mode to 'cors' when running in the browser.\n // By default, the request mode is computed based on the referrer policy\n // and response-tainting rules applied to the script that ultimately\n // initiated the fetch, make this prone to errors due to unrelated\n // configurations on the page.\n // https://fetch.spec.whatwg.org/#origin-header\n mode: typeof window === 'undefined' ? undefined : 'cors',\n credentials: 'omit',\n ...options.extra,\n method: 'POST',\n headers: headers,\n signal: signal,\n body: JSON.stringify(body),\n });\n }\n\n private logHelp(statusCode: number): void {\n const help = Help.forStatusCode(statusCode);\n\n if (help !== undefined) {\n this.logger.error(help);\n }\n }\n\n public toJSON(): never {\n // Prevent sensitive configuration from being serialized\n throw new Error('Unserializable value.');\n }\n}\n"],"mappings":"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","names":["EvaluationErrorType"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventManager.ts"],"sourcesContent":["export interface EventListener<T> {\n (event: T): void;\n}\n\nexport type EventMap = Record<string, Record<string, any>>;\n\nexport interface EventDispatcher<TEvents extends EventMap> {\n dispatch<T extends keyof TEvents>(eventName: T, event: TEvents[T]): void;\n}\n\nexport interface EventSubscriber<TEvents extends EventMap> {\n addListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;\n\n removeListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;\n}\n\nexport interface EventManager<DEvents extends EventMap, SEvents extends EventMap = DEvents>\n extends EventDispatcher<DEvents>, EventSubscriber<SEvents> {\n}\n\nexport class SynchronousEventManager<TEvents extends EventMap> implements EventManager<TEvents> {\n private readonly listeners: {[type in keyof TEvents]?: Array<EventListener<TEvents[type]>>} = {};\n\n public addListener<T extends keyof TEvents>(type: T, listener: EventListener<TEvents[T]>): void {\n const listeners: Array<EventListener<TEvents[T]>> = this.listeners[type] ?? [];\n\n listeners.push(listener);\n\n this.listeners[type] = listeners;\n }\n\n public removeListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void {\n const listeners = this.listeners[eventName];\n\n if (listeners === undefined) {\n return;\n }\n\n const index = listeners.indexOf(listener);\n\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n\n public dispatch<T extends keyof TEvents>(eventName: T, event: TEvents[T]): void {\n const listeners = this.listeners[eventName];\n\n if (listeners !== undefined) {\n listeners.forEach(listener => listener(event));\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,MAAM,wBAAmF;AAAA,EAAzF;AACH,SAAiB,YAA6E,CAAC;AAAA;AAAA,EAExF,YAAqC,MAAS,UAA2C;AAC5F,UAAM,YAA8C,KAAK,UAAU,IAAI,KAAK,CAAC;AAE7E,cAAU,KAAK,QAAQ;AAEvB,SAAK,UAAU,IAAI,IAAI;AAAA,EAC3B;AAAA,EAEO,eAAwC,WAAc,UAA2C;AACpG,UAAM,YAAY,KAAK,UAAU,SAAS;AAE1C,QAAI,cAAc,QAAW;AACzB;AAAA,IACJ;AAEA,UAAM,QAAQ,UAAU,QAAQ,QAAQ;AAExC,QAAI,SAAS,GAAG;AACZ,gBAAU,OAAO,OAAO,CAAC;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEO,SAAkC,WAAc,OAAyB;AAC5E,UAAM,YAAY,KAAK,UAAU,SAAS;AAE1C,QAAI,cAAc,QAAW;AACzB,gBAAU,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,IACjD;AAAA,EACJ;AACJ;","names":[]}
|
package/eventManager.d.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
interface EventListener<T> {
|
|
2
2
|
(event: T): void;
|
|
3
3
|
}
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
type EventMap = Record<string, Record<string, any>>;
|
|
5
|
+
interface EventDispatcher<TEvents extends EventMap> {
|
|
6
6
|
dispatch<T extends keyof TEvents>(eventName: T, event: TEvents[T]): void;
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
interface EventSubscriber<TEvents extends EventMap> {
|
|
9
9
|
addListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;
|
|
10
10
|
removeListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
interface EventManager<DEvents extends EventMap, SEvents extends EventMap = DEvents> extends EventDispatcher<DEvents>, EventSubscriber<SEvents> {
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
declare class SynchronousEventManager<TEvents extends EventMap> implements EventManager<TEvents> {
|
|
15
15
|
private readonly listeners;
|
|
16
16
|
addListener<T extends keyof TEvents>(type: T, listener: EventListener<TEvents[T]>): void;
|
|
17
17
|
removeListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;
|
|
18
18
|
dispatch<T extends keyof TEvents>(eventName: T, event: TEvents[T]): void;
|
|
19
19
|
}
|
|
20
|
+
|
|
21
|
+
export { type EventDispatcher, type EventListener, type EventManager, type EventMap, type EventSubscriber, SynchronousEventManager };
|
package/eventManager.js
CHANGED
|
@@ -1,32 +1,30 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SynchronousEventManager = void 0;
|
|
4
1
|
class SynchronousEventManager {
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
constructor() {
|
|
3
|
+
this.listeners = {};
|
|
4
|
+
}
|
|
5
|
+
addListener(type, listener) {
|
|
6
|
+
const listeners = this.listeners[type] ?? [];
|
|
7
|
+
listeners.push(listener);
|
|
8
|
+
this.listeners[type] = listeners;
|
|
9
|
+
}
|
|
10
|
+
removeListener(eventName, listener) {
|
|
11
|
+
const listeners = this.listeners[eventName];
|
|
12
|
+
if (listeners === void 0) {
|
|
13
|
+
return;
|
|
7
14
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
listeners.push(listener);
|
|
12
|
-
this.listeners[type] = listeners;
|
|
15
|
+
const index = listeners.indexOf(listener);
|
|
16
|
+
if (index >= 0) {
|
|
17
|
+
listeners.splice(index, 1);
|
|
13
18
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const index = listeners.indexOf(listener);
|
|
20
|
-
if (index >= 0) {
|
|
21
|
-
listeners.splice(index, 1);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
dispatch(eventName, event) {
|
|
25
|
-
const listeners = this.listeners[eventName];
|
|
26
|
-
if (listeners !== undefined) {
|
|
27
|
-
listeners.forEach(listener => listener(event));
|
|
28
|
-
}
|
|
19
|
+
}
|
|
20
|
+
dispatch(eventName, event) {
|
|
21
|
+
const listeners = this.listeners[eventName];
|
|
22
|
+
if (listeners !== void 0) {
|
|
23
|
+
listeners.forEach((listener) => listener(event));
|
|
29
24
|
}
|
|
25
|
+
}
|
|
30
26
|
}
|
|
31
|
-
|
|
27
|
+
export {
|
|
28
|
+
SynchronousEventManager
|
|
29
|
+
};
|
|
32
30
|
//# sourceMappingURL=eventManager.js.map
|
package/eventManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["src/eventManager.ts"],"sourcesContent":["export interface EventListener<T> {\n (event: T): void;\n}\n\nexport type EventMap = Record<string, Record<string, any>>;\n\nexport interface EventDispatcher<TEvents extends EventMap> {\n dispatch<T extends keyof TEvents>(eventName: T, event: TEvents[T]): void;\n}\n\nexport interface EventSubscriber<TEvents extends EventMap> {\n addListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;\n\n removeListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void;\n}\n\nexport interface EventManager<DEvents extends EventMap, SEvents extends EventMap = DEvents>\n extends EventDispatcher<DEvents>, EventSubscriber<SEvents> {\n}\n\nexport class SynchronousEventManager<TEvents extends EventMap> implements EventManager<TEvents> {\n private readonly listeners: {[type in keyof TEvents]?: Array<EventListener<TEvents[type]>>} = {};\n\n public addListener<T extends keyof TEvents>(type: T, listener: EventListener<TEvents[T]>): void {\n const listeners: Array<EventListener<TEvents[T]>> = this.listeners[type] ?? [];\n\n listeners.push(listener);\n\n this.listeners[type] = listeners;\n }\n\n public removeListener<T extends keyof TEvents>(eventName: T, listener: EventListener<TEvents[T]>): void {\n const listeners = this.listeners[eventName];\n\n if (listeners === undefined) {\n return;\n }\n\n const index = listeners.indexOf(listener);\n\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n }\n\n public dispatch<T extends keyof TEvents>(eventName: T, event: TEvents[T]): void {\n const listeners = this.listeners[eventName];\n\n if (listeners !== undefined) {\n listeners.forEach(listener => listener(event));\n }\n }\n}\n"],"mappings":"AAoBO,MAAM,wBAAmF;AAAA,EAAzF;AACH,SAAiB,YAA6E,CAAC;AAAA;AAAA,EAExF,YAAqC,MAAS,UAA2C;AAC5F,UAAM,YAA8C,KAAK,UAAU,IAAI,KAAK,CAAC;AAE7E,cAAU,KAAK,QAAQ;AAEvB,SAAK,UAAU,IAAI,IAAI;AAAA,EAC3B;AAAA,EAEO,eAAwC,WAAc,UAA2C;AACpG,UAAM,YAAY,KAAK,UAAU,SAAS;AAE1C,QAAI,cAAc,QAAW;AACzB;AAAA,IACJ;AAEA,UAAM,QAAQ,UAAU,QAAQ,QAAQ;AAExC,QAAI,SAAS,GAAG;AACZ,gBAAU,OAAO,OAAO,CAAC;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEO,SAAkC,WAAc,OAAyB;AAC5E,UAAM,YAAY,KAAK,UAAU,SAAS;AAE1C,QAAI,cAAc,QAAW;AACzB,gBAAU,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,IACjD;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventSubjectProcessor.ts"],"sourcesContent":["import {QueuedEventInfo, TrackingEventProcessor} from './tracker';\nimport {Token} from './token';\nimport {Logger} from './logging';\nimport {TrackingEvent} from './trackingEvents';\n\nexport class EventSubjectProcessor implements TrackingEventProcessor {\n private currentToken?: Token|null;\n\n private logger: Logger;\n\n public constructor(logger: Logger) {\n this.logger = logger;\n }\n\n public process(event: QueuedEventInfo): QueuedEventInfo[] {\n const {currentToken} = this;\n\n this.currentToken = event.userToken ?? null;\n\n if (currentToken === undefined) {\n // This is the first event, no subject to compare.\n // If the user is already identified at this point,\n // assume that the event was previously tracked.\n return [event];\n }\n\n if (EventSubjectProcessor.isIdentificationEvent(event.event)) {\n return [event];\n }\n\n const currentSubject = currentToken?.getSubject() ?? null;\n const newSubject = event.userToken?.getSubject() ?? null;\n\n if (newSubject === currentSubject) {\n // No change in subject\n return [event];\n }\n\n const events: QueuedEventInfo[] = [];\n\n if (currentToken !== null && currentSubject !== null) {\n this.logger.info('External user sign out automatically tracked');\n\n events.push({\n timestamp: event.timestamp,\n context: event.context,\n userToken: currentToken,\n event: {\n type: 'userSignedOut',\n userId: currentSubject,\n },\n });\n }\n\n if (newSubject !== null) {\n this.logger.info('External user sign in automatically tracked');\n\n events.push({\n timestamp: event.timestamp,\n context: event.context,\n userToken: event.userToken,\n event: {\n type: 'userSignedIn',\n userId: newSubject,\n },\n });\n }\n\n events.push(event);\n\n return events;\n }\n\n private static isIdentificationEvent(event: TrackingEvent): boolean {\n switch (event.type) {\n case 'userSignedIn':\n case 'userSignedUp':\n case 'userSignedOut':\n return true;\n\n default:\n return false;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,sBAAwD;AAAA,EAK1D,YAAY,QAAgB;AAC/B,SAAK,SAAS;AAAA,EAClB;AAAA,EAEO,QAAQ,OAA2C;AACtD,UAAM,EAAC,aAAY,IAAI;AAEvB,SAAK,eAAe,MAAM,aAAa;AAEvC,QAAI,iBAAiB,QAAW;AAI5B,aAAO,CAAC,KAAK;AAAA,IACjB;AAEA,QAAI,sBAAsB,sBAAsB,MAAM,KAAK,GAAG;AAC1D,aAAO,CAAC,KAAK;AAAA,IACjB;AAEA,UAAM,iBAAiB,cAAc,WAAW,KAAK;AACrD,UAAM,aAAa,MAAM,WAAW,WAAW,KAAK;AAEpD,QAAI,eAAe,gBAAgB;AAE/B,aAAO,CAAC,KAAK;AAAA,IACjB;AAEA,UAAM,SAA4B,CAAC;AAEnC,QAAI,iBAAiB,QAAQ,mBAAmB,MAAM;AAClD,WAAK,OAAO,KAAK,8CAA8C;AAE/D,aAAO,KAAK;AAAA,QACR,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM;AAAA,QACf,WAAW;AAAA,QACX,OAAO;AAAA,UACH,MAAM;AAAA,UACN,QAAQ;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,QAAI,eAAe,MAAM;AACrB,WAAK,OAAO,KAAK,6CAA6C;AAE9D,aAAO,KAAK;AAAA,QACR,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,QACjB,OAAO;AAAA,UACH,MAAM;AAAA,UACN,QAAQ;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,WAAO,KAAK,KAAK;AAEjB,WAAO;AAAA,EACX;AAAA,EAEA,OAAe,sBAAsB,OAA+B;AAChE,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MAEX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AACJ;","names":[]}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Logger } from './logging';
|
|
3
|
-
|
|
1
|
+
import { TrackingEventProcessor, QueuedEventInfo } from './tracker.js';
|
|
2
|
+
import { Logger } from './logging/logger.js';
|
|
3
|
+
import './tab.js';
|
|
4
|
+
import './eventManager.js';
|
|
5
|
+
import './channel/channel.js';
|
|
6
|
+
import './retry/policy.js';
|
|
7
|
+
import './token/token.js';
|
|
8
|
+
import '@croct/json';
|
|
9
|
+
import './apiKey.js';
|
|
10
|
+
import './trackingEvents.js';
|
|
11
|
+
import './patch.js';
|
|
12
|
+
import './utilityTypes.js';
|
|
13
|
+
|
|
14
|
+
declare class EventSubjectProcessor implements TrackingEventProcessor {
|
|
4
15
|
private currentToken?;
|
|
5
16
|
private logger;
|
|
6
17
|
constructor(logger: Logger);
|
|
7
18
|
process(event: QueuedEventInfo): QueuedEventInfo[];
|
|
8
19
|
private static isIdentificationEvent;
|
|
9
20
|
}
|
|
21
|
+
|
|
22
|
+
export { EventSubjectProcessor };
|