@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/context.js
CHANGED
|
@@ -1,92 +1,91 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const tab_1 = require("./tab");
|
|
6
|
-
const uuid_1 = require("./uuid");
|
|
7
|
-
const cache_1 = require("./cache");
|
|
1
|
+
import { CachedTokenStore, ReplicatedTokenStore, InMemoryTokenStore } from "./token";
|
|
2
|
+
import { Tab } from "./tab";
|
|
3
|
+
import { uuid4 } from "./uuid";
|
|
4
|
+
import { ObservableCache } from "./cache";
|
|
8
5
|
function tokenEquals(left, right) {
|
|
9
|
-
|
|
6
|
+
return left === right || left !== null && right !== null && left.toString() === right.toString();
|
|
10
7
|
}
|
|
11
8
|
class Context {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
9
|
+
constructor(tab, tokenStore, eventDispatcher) {
|
|
10
|
+
this.tab = tab;
|
|
11
|
+
this.tokenStore = tokenStore;
|
|
12
|
+
this.eventDispatcher = eventDispatcher;
|
|
13
|
+
this.lastToken = tokenStore.getToken();
|
|
14
|
+
this.syncToken = this.syncToken.bind(this);
|
|
15
|
+
}
|
|
16
|
+
static load({ cache, tokenScope, eventDispatcher, urlSanitizer }) {
|
|
17
|
+
let tabId = cache.tabId.get();
|
|
18
|
+
let newTab = false;
|
|
19
|
+
if (tabId === null) {
|
|
20
|
+
tabId = uuid4(true);
|
|
21
|
+
newTab = true;
|
|
18
22
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const tab = new Tab(tabId, newTab, urlSanitizer);
|
|
24
|
+
cache.tabId.clear();
|
|
25
|
+
tab.addListener("unload", () => cache.tabId.put(tab.id));
|
|
26
|
+
switch (tokenScope) {
|
|
27
|
+
case "isolated":
|
|
28
|
+
return new Context(tab, new InMemoryTokenStore(), eventDispatcher);
|
|
29
|
+
case "global": {
|
|
30
|
+
const context = new Context(tab, new CachedTokenStore(cache.browserToken), eventDispatcher);
|
|
31
|
+
if (ObservableCache.isObservable(cache.browserToken)) {
|
|
32
|
+
cache.browserToken.addListener(context.syncToken);
|
|
25
33
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const context = new Context(tab, new token_1.CachedTokenStore(cache.browserToken), eventDispatcher);
|
|
34
|
-
if (cache_1.ObservableCache.isObservable(cache.browserToken)) {
|
|
35
|
-
cache.browserToken.addListener(context.syncToken);
|
|
36
|
-
}
|
|
37
|
-
return context;
|
|
38
|
-
}
|
|
39
|
-
case 'contextual': {
|
|
40
|
-
const primaryStorage = new token_1.CachedTokenStore(cache.tabToken);
|
|
41
|
-
const secondaryStorage = new token_1.CachedTokenStore(cache.browserToken);
|
|
42
|
-
if (tab.isNew) {
|
|
43
|
-
primaryStorage.setToken(secondaryStorage.getToken());
|
|
44
|
-
}
|
|
45
|
-
tab.addListener('visibilityChange', event => {
|
|
46
|
-
if (event.detail.visible) {
|
|
47
|
-
secondaryStorage.setToken(primaryStorage.getToken());
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
return new Context(tab, new token_1.ReplicatedTokenStore(primaryStorage, secondaryStorage), eventDispatcher);
|
|
51
|
-
}
|
|
34
|
+
return context;
|
|
35
|
+
}
|
|
36
|
+
case "contextual": {
|
|
37
|
+
const primaryStorage = new CachedTokenStore(cache.tabToken);
|
|
38
|
+
const secondaryStorage = new CachedTokenStore(cache.browserToken);
|
|
39
|
+
if (tab.isNew) {
|
|
40
|
+
primaryStorage.setToken(secondaryStorage.getToken());
|
|
52
41
|
}
|
|
42
|
+
tab.addListener("visibilityChange", (event) => {
|
|
43
|
+
if (event.detail.visible) {
|
|
44
|
+
secondaryStorage.setToken(primaryStorage.getToken());
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return new Context(tab, new ReplicatedTokenStore(primaryStorage, secondaryStorage), eventDispatcher);
|
|
48
|
+
}
|
|
53
49
|
}
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
}
|
|
51
|
+
getTab() {
|
|
52
|
+
return this.tab;
|
|
53
|
+
}
|
|
54
|
+
isAnonymous() {
|
|
55
|
+
const token = this.getToken();
|
|
56
|
+
return token == null || token.isAnonymous();
|
|
57
|
+
}
|
|
58
|
+
getUser() {
|
|
59
|
+
const token = this.getToken();
|
|
60
|
+
return token == null ? null : token.getSubject();
|
|
61
|
+
}
|
|
62
|
+
getToken() {
|
|
63
|
+
return this.tokenStore.getToken();
|
|
64
|
+
}
|
|
65
|
+
setToken(token) {
|
|
66
|
+
const oldToken = this.lastToken;
|
|
67
|
+
this.lastToken = token;
|
|
68
|
+
this.tokenStore.setToken(token);
|
|
69
|
+
if (!tokenEquals(oldToken, token)) {
|
|
70
|
+
this.eventDispatcher.dispatch("tokenChanged", {
|
|
71
|
+
oldToken,
|
|
72
|
+
newToken: token
|
|
73
|
+
});
|
|
56
74
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
setToken(token) {
|
|
69
|
-
const oldToken = this.lastToken;
|
|
70
|
-
this.lastToken = token;
|
|
71
|
-
this.tokenStore.setToken(token);
|
|
72
|
-
if (!tokenEquals(oldToken, token)) {
|
|
73
|
-
this.eventDispatcher.dispatch('tokenChanged', {
|
|
74
|
-
oldToken: oldToken,
|
|
75
|
-
newToken: token,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
syncToken() {
|
|
80
|
-
const newToken = this.tokenStore.getToken();
|
|
81
|
-
const oldToken = this.lastToken;
|
|
82
|
-
if (!tokenEquals(oldToken, newToken)) {
|
|
83
|
-
this.lastToken = newToken;
|
|
84
|
-
this.eventDispatcher.dispatch('tokenChanged', {
|
|
85
|
-
oldToken: oldToken,
|
|
86
|
-
newToken: newToken,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
75
|
+
}
|
|
76
|
+
syncToken() {
|
|
77
|
+
const newToken = this.tokenStore.getToken();
|
|
78
|
+
const oldToken = this.lastToken;
|
|
79
|
+
if (!tokenEquals(oldToken, newToken)) {
|
|
80
|
+
this.lastToken = newToken;
|
|
81
|
+
this.eventDispatcher.dispatch("tokenChanged", {
|
|
82
|
+
oldToken,
|
|
83
|
+
newToken
|
|
84
|
+
});
|
|
89
85
|
}
|
|
86
|
+
}
|
|
90
87
|
}
|
|
91
|
-
|
|
88
|
+
export {
|
|
89
|
+
Context
|
|
90
|
+
};
|
|
92
91
|
//# sourceMappingURL=context.js.map
|
package/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["src/context.ts"],"sourcesContent":["import {Token, TokenStore, CachedTokenStore, ReplicatedTokenStore, InMemoryTokenStore} from './token';\nimport {Tab, UrlSanitizer} from './tab';\nimport {uuid4} from './uuid';\nimport {EventDispatcher} from './eventManager';\nimport {SdkEventMap} from './sdkEvents';\nimport {Cache, ObservableCache} from './cache';\n\nexport type TokenScope = 'isolated' | 'global' | 'contextual';\n\nexport type Configuration = {\n tokenScope: TokenScope,\n urlSanitizer?: UrlSanitizer,\n eventDispatcher: ContextEventDispatcher,\n cache: {\n tabId: Cache,\n tabToken: Cache,\n browserToken: Cache,\n },\n};\n\ntype ContextEventDispatcher = EventDispatcher<Pick<SdkEventMap, 'tokenChanged'>>;\n\nfunction tokenEquals(left: Token|null, right: Token|null): boolean {\n return left === right || (left !== null && right !== null && left.toString() === right.toString());\n}\n\nexport class Context {\n private readonly tab: Tab;\n\n private readonly tokenStore: TokenStore;\n\n private readonly eventDispatcher: ContextEventDispatcher;\n\n private lastToken: Token|null;\n\n private constructor(tab: Tab, tokenStore: TokenStore, eventDispatcher: ContextEventDispatcher) {\n this.tab = tab;\n this.tokenStore = tokenStore;\n this.eventDispatcher = eventDispatcher;\n this.lastToken = tokenStore.getToken();\n this.syncToken = this.syncToken.bind(this);\n }\n\n public static load({cache, tokenScope, eventDispatcher, urlSanitizer}: Configuration): Context {\n let tabId: string | null = cache.tabId.get();\n let newTab = false;\n\n if (tabId === null) {\n tabId = uuid4(true);\n newTab = true;\n }\n\n const tab = new Tab(tabId, newTab, urlSanitizer);\n\n cache.tabId.clear();\n\n tab.addListener('unload', () => cache.tabId.put(tab.id));\n\n switch (tokenScope) {\n case 'isolated':\n return new Context(tab, new InMemoryTokenStore(), eventDispatcher);\n\n case 'global': {\n const context = new Context(tab, new CachedTokenStore(cache.browserToken), eventDispatcher);\n\n if (ObservableCache.isObservable(cache.browserToken)) {\n cache.browserToken.addListener(context.syncToken);\n }\n\n return context;\n }\n\n case 'contextual': {\n const primaryStorage = new CachedTokenStore(cache.tabToken);\n const secondaryStorage = new CachedTokenStore(cache.browserToken);\n\n if (tab.isNew) {\n primaryStorage.setToken(secondaryStorage.getToken());\n }\n\n tab.addListener('visibilityChange', event => {\n if (event.detail.visible) {\n secondaryStorage.setToken(primaryStorage.getToken());\n }\n });\n\n return new Context(tab, new ReplicatedTokenStore(primaryStorage, secondaryStorage), eventDispatcher);\n }\n }\n }\n\n public getTab(): Tab {\n return this.tab;\n }\n\n public isAnonymous(): boolean {\n const token = this.getToken();\n\n return token == null || token.isAnonymous();\n }\n\n public getUser(): string | null {\n const token = this.getToken();\n\n return token == null ? null : token.getSubject();\n }\n\n public getToken(): Token | null {\n return this.tokenStore.getToken();\n }\n\n public setToken(token: Token | null): void {\n const oldToken = this.lastToken;\n\n this.lastToken = token;\n this.tokenStore.setToken(token);\n\n if (!tokenEquals(oldToken, token)) {\n this.eventDispatcher.dispatch('tokenChanged', {\n oldToken: oldToken,\n newToken: token,\n });\n }\n }\n\n private syncToken(): void {\n const newToken = this.tokenStore.getToken();\n const oldToken = this.lastToken;\n\n if (!tokenEquals(oldToken, newToken)) {\n this.lastToken = newToken;\n\n this.eventDispatcher.dispatch('tokenChanged', {\n oldToken: oldToken,\n newToken: newToken,\n });\n }\n }\n}\n"],"mappings":"AAAA,SAA2B,kBAAkB,sBAAsB,0BAAyB;AAC5F,SAAQ,WAAwB;AAChC,SAAQ,aAAY;AAGpB,SAAe,uBAAsB;AAiBrC,SAAS,YAAY,MAAkB,OAA4B;AAC/D,SAAO,SAAS,SAAU,SAAS,QAAQ,UAAU,QAAQ,KAAK,SAAS,MAAM,MAAM,SAAS;AACpG;AAEO,MAAM,QAAQ;AAAA,EAST,YAAY,KAAU,YAAwB,iBAAyC;AAC3F,SAAK,MAAM;AACX,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,YAAY,WAAW,SAAS;AACrC,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAc,KAAK,EAAC,OAAO,YAAY,iBAAiB,aAAY,GAA2B;AAC3F,QAAI,QAAuB,MAAM,MAAM,IAAI;AAC3C,QAAI,SAAS;AAEb,QAAI,UAAU,MAAM;AAChB,cAAQ,MAAM,IAAI;AAClB,eAAS;AAAA,IACb;AAEA,UAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,YAAY;AAE/C,UAAM,MAAM,MAAM;AAElB,QAAI,YAAY,UAAU,MAAM,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;AAEvD,YAAQ,YAAY;AAAA,MAChB,KAAK;AACD,eAAO,IAAI,QAAQ,KAAK,IAAI,mBAAmB,GAAG,eAAe;AAAA,MAErE,KAAK,UAAU;AACX,cAAM,UAAU,IAAI,QAAQ,KAAK,IAAI,iBAAiB,MAAM,YAAY,GAAG,eAAe;AAE1F,YAAI,gBAAgB,aAAa,MAAM,YAAY,GAAG;AAClD,gBAAM,aAAa,YAAY,QAAQ,SAAS;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAAA,MAEA,KAAK,cAAc;AACf,cAAM,iBAAiB,IAAI,iBAAiB,MAAM,QAAQ;AAC1D,cAAM,mBAAmB,IAAI,iBAAiB,MAAM,YAAY;AAEhE,YAAI,IAAI,OAAO;AACX,yBAAe,SAAS,iBAAiB,SAAS,CAAC;AAAA,QACvD;AAEA,YAAI,YAAY,oBAAoB,WAAS;AACzC,cAAI,MAAM,OAAO,SAAS;AACtB,6BAAiB,SAAS,eAAe,SAAS,CAAC;AAAA,UACvD;AAAA,QACJ,CAAC;AAED,eAAO,IAAI,QAAQ,KAAK,IAAI,qBAAqB,gBAAgB,gBAAgB,GAAG,eAAe;AAAA,MACvG;AAAA,IACJ;AAAA,EACJ;AAAA,EAEO,SAAc;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,cAAuB;AAC1B,UAAM,QAAQ,KAAK,SAAS;AAE5B,WAAO,SAAS,QAAQ,MAAM,YAAY;AAAA,EAC9C;AAAA,EAEO,UAAyB;AAC5B,UAAM,QAAQ,KAAK,SAAS;AAE5B,WAAO,SAAS,OAAO,OAAO,MAAM,WAAW;AAAA,EACnD;AAAA,EAEO,WAAyB;AAC5B,WAAO,KAAK,WAAW,SAAS;AAAA,EACpC;AAAA,EAEO,SAAS,OAA2B;AACvC,UAAM,WAAW,KAAK;AAEtB,SAAK,YAAY;AACjB,SAAK,WAAW,SAAS,KAAK;AAE9B,QAAI,CAAC,YAAY,UAAU,KAAK,GAAG;AAC/B,WAAK,gBAAgB,SAAS,gBAAgB;AAAA,QAC1C;AAAA,QACA,UAAU;AAAA,MACd,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,YAAkB;AACtB,UAAM,WAAW,KAAK,WAAW,SAAS;AAC1C,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,YAAY,UAAU,QAAQ,GAAG;AAClC,WAAK,YAAY;AAEjB,WAAK,gBAAgB,SAAS,gBAAgB;AAAA,QAC1C;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;","names":[]}
|
package/error.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error.ts"],"sourcesContent":["function extractMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string' && error !== '') {\n return error;\n }\n\n return 'unknown error';\n}\n\nexport function formatMessage(error: unknown): string {\n const message = extractMessage(error);\n\n if (message.length === 0) {\n return message;\n }\n\n return message.charAt(0).toUpperCase() + message.slice(1);\n}\n\nexport function formatCause(error: unknown): string {\n const message = formatMessage(error);\n\n if (message.length === 0) {\n return message;\n }\n\n return message.charAt(0).toLowerCase() + message.slice(1);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,eAAe,OAAwB;AAC5C,MAAI,iBAAiB,OAAO;AACxB,WAAO,MAAM;AAAA,EACjB;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,IAAI;AAC3C,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEO,SAAS,cAAc,OAAwB;AAClD,QAAM,UAAU,eAAe,KAAK;AAEpC,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC;AAC5D;AAEO,SAAS,YAAY,OAAwB;AAChD,QAAM,UAAU,cAAc,KAAK;AAEnC,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC;AAC5D;","names":[]}
|
package/error.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
declare function formatMessage(error: unknown): string;
|
|
2
|
+
declare function formatCause(error: unknown): string;
|
|
3
|
+
|
|
4
|
+
export { formatCause, formatMessage };
|
package/error.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatMessage = formatMessage;
|
|
4
|
-
exports.formatCause = formatCause;
|
|
5
1
|
function extractMessage(error) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
if (error instanceof Error) {
|
|
3
|
+
return error.message;
|
|
4
|
+
}
|
|
5
|
+
if (typeof error === "string" && error !== "") {
|
|
6
|
+
return error;
|
|
7
|
+
}
|
|
8
|
+
return "unknown error";
|
|
13
9
|
}
|
|
14
10
|
function formatMessage(error) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
const message = extractMessage(error);
|
|
12
|
+
if (message.length === 0) {
|
|
13
|
+
return message;
|
|
14
|
+
}
|
|
15
|
+
return message.charAt(0).toUpperCase() + message.slice(1);
|
|
20
16
|
}
|
|
21
17
|
function formatCause(error) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
const message = formatMessage(error);
|
|
19
|
+
if (message.length === 0) {
|
|
20
|
+
return message;
|
|
21
|
+
}
|
|
22
|
+
return message.charAt(0).toLowerCase() + message.slice(1);
|
|
27
23
|
}
|
|
24
|
+
export {
|
|
25
|
+
formatCause,
|
|
26
|
+
formatMessage
|
|
27
|
+
};
|
|
28
28
|
//# sourceMappingURL=error.js.map
|
package/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["src/error.ts"],"sourcesContent":["function extractMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string' && error !== '') {\n return error;\n }\n\n return 'unknown error';\n}\n\nexport function formatMessage(error: unknown): string {\n const message = extractMessage(error);\n\n if (message.length === 0) {\n return message;\n }\n\n return message.charAt(0).toUpperCase() + message.slice(1);\n}\n\nexport function formatCause(error: unknown): string {\n const message = formatMessage(error);\n\n if (message.length === 0) {\n return message;\n }\n\n return message.charAt(0).toLowerCase() + message.slice(1);\n}\n"],"mappings":"AAAA,SAAS,eAAe,OAAwB;AAC5C,MAAI,iBAAiB,OAAO;AACxB,WAAO,MAAM;AAAA,EACjB;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU,IAAI;AAC3C,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEO,SAAS,cAAc,OAAwB;AAClD,QAAM,UAAU,eAAe,KAAK;AAEpC,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC;AAC5D;AAEO,SAAS,YAAY,OAAwB;AAChD,QAAM,UAAU,cAAc,KAAK;AAEnC,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO;AAAA,EACX;AAEA,SAAO,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC;AAC5D;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
package/evaluator.d.ts
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import { JsonObject, JsonValue } from '@croct/json';
|
|
2
|
-
import { Token } from './token';
|
|
3
|
-
import { Location } from './sourceLocation';
|
|
4
|
-
import { Logger } from './logging';
|
|
5
|
-
import
|
|
6
|
-
|
|
2
|
+
import { Token } from './token/token.js';
|
|
3
|
+
import { Location } from './sourceLocation.js';
|
|
4
|
+
import { Logger } from './logging/logger.js';
|
|
5
|
+
import { ApiKey } from './apiKey.js';
|
|
6
|
+
|
|
7
|
+
type Campaign = {
|
|
7
8
|
name?: string;
|
|
8
9
|
source?: string;
|
|
9
10
|
medium?: string;
|
|
10
11
|
term?: string;
|
|
11
12
|
content?: string;
|
|
12
13
|
};
|
|
13
|
-
|
|
14
|
+
type Page = {
|
|
14
15
|
url: string;
|
|
15
16
|
title?: string;
|
|
16
17
|
referrer?: string;
|
|
17
18
|
};
|
|
18
|
-
|
|
19
|
+
type EvaluationContext = {
|
|
19
20
|
timeZone?: string;
|
|
20
21
|
campaign?: Campaign;
|
|
21
22
|
page?: Page;
|
|
@@ -25,7 +26,7 @@ type AllowedFetchOptions = Exclude<keyof RequestInit, 'method' | 'body' | 'heade
|
|
|
25
26
|
type ExtraFetchOptions<T extends keyof RequestInit = AllowedFetchOptions> = Pick<RequestInit, T> & {
|
|
26
27
|
[key in Exclude<keyof RequestInit, T>]?: never;
|
|
27
28
|
} & Record<string, any>;
|
|
28
|
-
|
|
29
|
+
type EvaluationOptions = {
|
|
29
30
|
clientId?: string;
|
|
30
31
|
clientIp?: string;
|
|
31
32
|
clientAgent?: string;
|
|
@@ -34,7 +35,7 @@ export type EvaluationOptions = {
|
|
|
34
35
|
context?: EvaluationContext;
|
|
35
36
|
extra?: ExtraFetchOptions;
|
|
36
37
|
};
|
|
37
|
-
|
|
38
|
+
declare enum EvaluationErrorType {
|
|
38
39
|
TIMEOUT = "https://croct.help/api/evaluation#timeout",
|
|
39
40
|
UNEXPECTED_ERROR = "https://croct.help/api/evaluation#unexpected-error",
|
|
40
41
|
INVALID_QUERY = "https://croct.help/api/evaluation#invalid-query",
|
|
@@ -43,13 +44,13 @@ export declare enum EvaluationErrorType {
|
|
|
43
44
|
UNALLOWED_RESULT = "https://croct.help/api/evaluation#unallowed-result",
|
|
44
45
|
UNSERIALIZABLE_RESULT = "https://croct.help/api/evaluation#unserializable-result"
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
+
type ErrorResponse = {
|
|
47
48
|
type: EvaluationErrorType;
|
|
48
49
|
title: string;
|
|
49
50
|
status: number;
|
|
50
51
|
detail?: string;
|
|
51
52
|
};
|
|
52
|
-
|
|
53
|
+
declare class EvaluationError<T extends ErrorResponse = ErrorResponse> extends Error {
|
|
53
54
|
readonly response: T;
|
|
54
55
|
constructor(response: T);
|
|
55
56
|
}
|
|
@@ -57,20 +58,20 @@ type QueryErrorDetail = {
|
|
|
57
58
|
cause: string;
|
|
58
59
|
location: Location;
|
|
59
60
|
};
|
|
60
|
-
|
|
61
|
+
type QueryErrorResponse = ErrorResponse & {
|
|
61
62
|
errors: QueryErrorDetail[];
|
|
62
63
|
};
|
|
63
|
-
|
|
64
|
+
declare class QueryError extends EvaluationError<QueryErrorResponse> {
|
|
64
65
|
constructor(response: QueryErrorResponse);
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
+
type Configuration = {
|
|
67
68
|
appId?: string;
|
|
68
69
|
apiKey?: string | ApiKey;
|
|
69
70
|
baseEndpointUrl?: string;
|
|
70
71
|
logger?: Logger;
|
|
71
72
|
defaultTimeout?: number;
|
|
72
73
|
};
|
|
73
|
-
|
|
74
|
+
declare class Evaluator {
|
|
74
75
|
static readonly MAX_QUERY_LENGTH: number;
|
|
75
76
|
private readonly configuration;
|
|
76
77
|
private readonly endpoint;
|
|
@@ -81,4 +82,5 @@ export declare class Evaluator {
|
|
|
81
82
|
private logHelp;
|
|
82
83
|
toJSON(): never;
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
+
|
|
86
|
+
export { type Campaign, type Configuration, type ErrorResponse, type EvaluationContext, EvaluationError, EvaluationErrorType, type EvaluationOptions, Evaluator, type Page, QueryError, type QueryErrorResponse };
|