@croct/sdk 0.17.10 → 0.17.11

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.
Files changed (108) hide show
  1. package/constants.cjs +1 -1
  2. package/constants.cjs.map +1 -1
  3. package/constants.d.ts +2 -2
  4. package/constants.js +1 -1
  5. package/constants.js.map +1 -1
  6. package/package.json +1 -1
  7. package/src/activeRecord.ts +0 -150
  8. package/src/apiKey.ts +0 -208
  9. package/src/base64Url.ts +0 -22
  10. package/src/cache/cache.ts +0 -22
  11. package/src/cache/cookieCache.ts +0 -88
  12. package/src/cache/fallbackCache.ts +0 -29
  13. package/src/cache/inMemoryCache.ts +0 -21
  14. package/src/cache/index.ts +0 -4
  15. package/src/cache/localStorageCache.ts +0 -85
  16. package/src/channel/channel.ts +0 -52
  17. package/src/channel/encodedChannel.ts +0 -21
  18. package/src/channel/guaranteedChannel.ts +0 -131
  19. package/src/channel/httpBeaconChannel.ts +0 -128
  20. package/src/channel/index.ts +0 -7
  21. package/src/channel/queuedChannel.ts +0 -143
  22. package/src/channel/retryChannel.ts +0 -94
  23. package/src/channel/sandboxChannel.ts +0 -47
  24. package/src/cid/assigner.ts +0 -3
  25. package/src/cid/cachedAssigner.ts +0 -68
  26. package/src/cid/fixedAssigner.ts +0 -13
  27. package/src/cid/index.ts +0 -4
  28. package/src/cid/remoteAssigner.ts +0 -57
  29. package/src/constants.ts +0 -4
  30. package/src/container.ts +0 -410
  31. package/src/contentFetcher.ts +0 -290
  32. package/src/context.ts +0 -139
  33. package/src/error.ts +0 -31
  34. package/src/evaluator.ts +0 -314
  35. package/src/eventManager.ts +0 -53
  36. package/src/eventSubjectProcessor.ts +0 -85
  37. package/src/facade/contentFetcherFacade.ts +0 -69
  38. package/src/facade/evaluatorFacade.ts +0 -111
  39. package/src/facade/index.ts +0 -7
  40. package/src/facade/sdkFacade.ts +0 -310
  41. package/src/facade/sessionFacade.ts +0 -14
  42. package/src/facade/sessionPatch.ts +0 -32
  43. package/src/facade/trackerFacade.ts +0 -98
  44. package/src/facade/userFacade.ts +0 -26
  45. package/src/facade/userPatch.ts +0 -32
  46. package/src/help.ts +0 -24
  47. package/src/index.ts +0 -4
  48. package/src/logging/consoleLogger.ts +0 -38
  49. package/src/logging/filteredLogger.ts +0 -57
  50. package/src/logging/index.ts +0 -5
  51. package/src/logging/logger.ts +0 -13
  52. package/src/logging/namespacedLogger.ts +0 -32
  53. package/src/logging/nullLogger.ts +0 -19
  54. package/src/namespacedStorage.ts +0 -69
  55. package/src/patch.ts +0 -64
  56. package/src/queue/capacityRestrictedQueue.ts +0 -44
  57. package/src/queue/inMemoryQueue.ts +0 -43
  58. package/src/queue/index.ts +0 -5
  59. package/src/queue/monitoredQueue.ts +0 -168
  60. package/src/queue/persistentQueue.ts +0 -73
  61. package/src/queue/queue.ts +0 -15
  62. package/src/retry/arbitraryPolicy.ts +0 -21
  63. package/src/retry/backoffPolicy.ts +0 -84
  64. package/src/retry/index.ts +0 -5
  65. package/src/retry/maxAttemptsPolicy.ts +0 -28
  66. package/src/retry/neverPolicy.ts +0 -11
  67. package/src/retry/policy.ts +0 -5
  68. package/src/schema/attributeSchema.ts +0 -6
  69. package/src/schema/contentFetcherSchemas.ts +0 -23
  70. package/src/schema/contentSchemas.ts +0 -44
  71. package/src/schema/contextSchemas.ts +0 -5
  72. package/src/schema/ecommerceSchemas.ts +0 -179
  73. package/src/schema/evaluatorSchemas.ts +0 -52
  74. package/src/schema/eventSchemas.ts +0 -134
  75. package/src/schema/index.ts +0 -11
  76. package/src/schema/loggerSchema.ts +0 -12
  77. package/src/schema/operationSchemas.ts +0 -102
  78. package/src/schema/sdkFacadeSchemas.ts +0 -64
  79. package/src/schema/sdkSchemas.ts +0 -82
  80. package/src/schema/tokenSchema.ts +0 -42
  81. package/src/schema/userSchema.ts +0 -184
  82. package/src/sdk.ts +0 -183
  83. package/src/sdkEvents.ts +0 -15
  84. package/src/sourceLocation.ts +0 -85
  85. package/src/tab.ts +0 -148
  86. package/src/token/cachedTokenStore.ts +0 -34
  87. package/src/token/inMemoryTokenStore.ts +0 -13
  88. package/src/token/index.ts +0 -4
  89. package/src/token/replicatedTokenStore.ts +0 -21
  90. package/src/token/token.ts +0 -301
  91. package/src/tracker.ts +0 -504
  92. package/src/trackingEvents.ts +0 -452
  93. package/src/transformer.ts +0 -7
  94. package/src/utilityTypes.ts +0 -3
  95. package/src/uuid.ts +0 -43
  96. package/src/validation/arrayType.ts +0 -71
  97. package/src/validation/booleanType.ts +0 -22
  98. package/src/validation/functionType.ts +0 -22
  99. package/src/validation/index.ts +0 -12
  100. package/src/validation/jsonType.ts +0 -156
  101. package/src/validation/mixedSchema.ts +0 -7
  102. package/src/validation/nullType.ts +0 -22
  103. package/src/validation/numberType.ts +0 -59
  104. package/src/validation/objectType.ts +0 -138
  105. package/src/validation/schema.ts +0 -21
  106. package/src/validation/stringType.ts +0 -118
  107. package/src/validation/unionType.ts +0 -53
  108. package/src/validation/violation.ts +0 -23
@@ -1,13 +0,0 @@
1
- import {CidAssigner} from './assigner';
2
-
3
- export class FixedAssigner implements CidAssigner {
4
- private readonly cid: string;
5
-
6
- public constructor(cid: string) {
7
- this.cid = cid;
8
- }
9
-
10
- public assignCid(): Promise<string> {
11
- return Promise.resolve(this.cid);
12
- }
13
- }
package/src/cid/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './assigner';
2
- export {CachedAssigner} from './cachedAssigner';
3
- export {FixedAssigner} from './fixedAssigner';
4
- export {RemoteAssigner} from './remoteAssigner';
@@ -1,57 +0,0 @@
1
- import {Logger, NullLogger} from '../logging';
2
- import {formatCause} from '../error';
3
- import {CidAssigner} from './assigner';
4
- import {CLIENT_LIBRARY} from '../constants';
5
-
6
- export class RemoteAssigner implements CidAssigner {
7
- private readonly logger: Logger;
8
-
9
- private readonly endpoint: string;
10
-
11
- private pending?: Promise<string>;
12
-
13
- public constructor(endpoint: string, logger?: Logger) {
14
- this.endpoint = endpoint;
15
- this.logger = logger ?? new NullLogger();
16
- }
17
-
18
- public assignCid(currentCid?: string): Promise<string> {
19
- if (this.pending === undefined) {
20
- this.pending = this.fetchCid(currentCid).finally(() => {
21
- this.pending = undefined;
22
- });
23
- }
24
-
25
- return this.pending;
26
- }
27
-
28
- private async fetchCid(currentCid?: string): Promise<string> {
29
- const options: RequestInit = {
30
- method: 'GET',
31
- credentials: 'include',
32
- headers: {
33
- 'X-Client-Library': CLIENT_LIBRARY,
34
- },
35
- };
36
-
37
- const endpoint = new URL(this.endpoint);
38
-
39
- if (currentCid !== undefined) {
40
- endpoint.searchParams.set('cid', currentCid);
41
- }
42
-
43
- const response = await fetch(endpoint, options);
44
-
45
- if (!response.ok) {
46
- const error = new Error(`Failed to assign CID: ${formatCause(response.statusText)}`);
47
-
48
- this.logger.error(error.message);
49
-
50
- throw error;
51
- }
52
-
53
- this.logger.debug('New CID successfully assigned');
54
-
55
- return response.text();
56
- }
57
- }
package/src/constants.ts DELETED
@@ -1,4 +0,0 @@
1
- export const BASE_ENDPOINT_URL = '<@baseEndpointUrl@>';
2
- export const MAX_QUERY_LENGTH = parseInt('<@maxQueryLength@>', 10);
3
- export const VERSION = '<@version@>';
4
- export const CLIENT_LIBRARY = `Croct SDK JS v${VERSION}`;
package/src/container.ts DELETED
@@ -1,410 +0,0 @@
1
- import {Logger, ConsoleLogger, NamespacedLogger} from './logging';
2
- import {Context, TokenScope} from './context';
3
- import {NamespacedStorage} from './namespacedStorage';
4
- import {BackoffPolicy, ArbitraryPolicy} from './retry';
5
- import {PersistentQueue, MonitoredQueue, CapacityRestrictedQueue} from './queue';
6
- import {Beacon} from './trackingEvents';
7
- import {CachedTokenStore, TokenStore} from './token';
8
- import {Tracker, TrackingEventProcessor} from './tracker';
9
- import {Evaluator} from './evaluator';
10
- import {encodeJson} from './transformer';
11
- import {CidAssigner, CachedAssigner, RemoteAssigner, FixedAssigner} from './cid';
12
- import {EventManager, SynchronousEventManager} from './eventManager';
13
- import {SdkEventMap} from './sdkEvents';
14
- import {LocalStorageCache} from './cache';
15
- import {UrlSanitizer} from './tab';
16
- import {TimeStamper} from './channel/guaranteedChannel';
17
- import {
18
- OutputChannel,
19
- QueuedChannel,
20
- RetryChannel,
21
- GuaranteedChannel,
22
- EncodedChannel,
23
- SandboxChannel,
24
- } from './channel';
25
- import {ContentFetcher} from './contentFetcher';
26
- import {CookieCache, CookieCacheConfiguration} from './cache/cookieCache';
27
- import {FilteredLogger} from './logging/filteredLogger';
28
- import {HttpBeaconChannel} from './channel/httpBeaconChannel';
29
-
30
- export type DependencyResolver<T> = (container: Container) => T;
31
-
32
- export type Configuration = {
33
- appId: string,
34
- tokenScope: TokenScope,
35
- clientId?: string,
36
- debug: boolean,
37
- test: boolean,
38
- disableCidMirroring: boolean,
39
- cidAssignerEndpointUrl: string,
40
- trackerEndpointUrl: string,
41
- evaluationBaseEndpointUrl: string,
42
- contentBaseEndpointUrl: string,
43
- beaconQueueSize: number,
44
- logger?: Logger,
45
- urlSanitizer?: UrlSanitizer,
46
- cookie?: {
47
- clientId?: CookieCacheConfiguration,
48
- userToken?: CookieCacheConfiguration,
49
- previewToken?: CookieCacheConfiguration,
50
- },
51
- eventMetadata?: {[key: string]: string},
52
- eventProcessor?: DependencyResolver<TrackingEventProcessor>,
53
- defaultFetchTimeout?: number,
54
- defaultPreferredLocale?: string,
55
- };
56
-
57
- export class Container {
58
- public static readonly DEFAULT_FETCH_TIMEOUT = 5_000; // 5 seconds
59
-
60
- private readonly configuration: Configuration;
61
-
62
- private context?: Context;
63
-
64
- private userTokenProvider?: TokenStore;
65
-
66
- private previewTokenStore?: TokenStore;
67
-
68
- private tracker?: Tracker;
69
-
70
- private evaluator?: Evaluator;
71
-
72
- private contentFetcher?: ContentFetcher;
73
-
74
- private cidAssigner?: CidAssigner;
75
-
76
- private beaconChannel?: OutputChannel<Beacon>;
77
-
78
- private beaconQueue?: MonitoredQueue<string>;
79
-
80
- private removeTokenSyncListener?: {(): void};
81
-
82
- private readonly eventManager = new SynchronousEventManager<SdkEventMap>();
83
-
84
- public constructor(configuration: Configuration) {
85
- this.configuration = configuration;
86
- }
87
-
88
- public getConfiguration(): Configuration {
89
- return this.configuration;
90
- }
91
-
92
- public getEvaluator(): Evaluator {
93
- if (this.evaluator === undefined) {
94
- this.evaluator = this.createEvaluator();
95
- }
96
-
97
- return this.evaluator;
98
- }
99
-
100
- private createEvaluator(): Evaluator {
101
- return new Evaluator({
102
- appId: this.configuration.appId,
103
- baseEndpointUrl: this.configuration.evaluationBaseEndpointUrl,
104
- logger: this.getLogger('Evaluator'),
105
- defaultTimeout: this.configuration.defaultFetchTimeout ?? Container.DEFAULT_FETCH_TIMEOUT,
106
- });
107
- }
108
-
109
- public getContentFetcher(): ContentFetcher {
110
- if (this.contentFetcher === undefined) {
111
- this.contentFetcher = this.createContentFetcher();
112
- }
113
-
114
- return this.contentFetcher;
115
- }
116
-
117
- private createContentFetcher(): ContentFetcher {
118
- return new ContentFetcher({
119
- appId: this.configuration.appId,
120
- baseEndpointUrl: this.configuration.contentBaseEndpointUrl,
121
- logger: this.getLogger('ContentFetcher'),
122
- defaultTimeout: this.configuration.defaultFetchTimeout ?? Container.DEFAULT_FETCH_TIMEOUT,
123
- defaultPreferredLocale: this.configuration.defaultPreferredLocale,
124
- });
125
- }
126
-
127
- public getPreviewTokenStore(): TokenStore {
128
- if (this.previewTokenStore === undefined) {
129
- this.previewTokenStore = new CachedTokenStore(
130
- this.configuration.cookie?.previewToken !== undefined
131
- ? new CookieCache(this.configuration.cookie.previewToken)
132
- : new LocalStorageCache(this.getGlobalBrowserStorage('preview'), 'token'),
133
- );
134
- }
135
-
136
- return this.previewTokenStore;
137
- }
138
-
139
- public getTracker(): Tracker {
140
- if (this.tracker === undefined) {
141
- this.tracker = this.createTracker();
142
- }
143
-
144
- return this.tracker;
145
- }
146
-
147
- private createTracker(): Tracker {
148
- const context = this.getContext();
149
-
150
- const tracker = new Tracker({
151
- tab: context.getTab(),
152
- tokenProvider: this.getUserTokenStore(),
153
- inactivityRetryPolicy: new ArbitraryPolicy([30_000, 30_000, 120_000, 120_000, 300_000, 300_000, 900_000]),
154
- logger: this.getLogger('Tracker'),
155
- channel: this.getBeaconChannel(),
156
- eventMetadata: this.configuration.eventMetadata,
157
- processor: this.configuration.eventProcessor === undefined
158
- ? undefined
159
- : this.configuration.eventProcessor(this),
160
- });
161
-
162
- const queue = this.getBeaconQueue();
163
-
164
- queue.addCallback('halfEmpty', tracker.unsuspend);
165
- queue.addCallback('full', tracker.suspend);
166
-
167
- return tracker;
168
- }
169
-
170
- public getUserTokenStore(): TokenStore {
171
- if (this.userTokenProvider === undefined) {
172
- const context = this.getContext();
173
-
174
- this.userTokenProvider = {
175
- getToken: context.getToken.bind(context),
176
- setToken: context.setToken.bind(context),
177
- };
178
- }
179
-
180
- return this.userTokenProvider;
181
- }
182
-
183
- public getContext(): Context {
184
- if (this.context === undefined) {
185
- this.context = this.createContext();
186
- }
187
-
188
- return this.context;
189
- }
190
-
191
- private createContext(): Context {
192
- const tokenKey = this.resolveStorageNamespace('token');
193
- const tabKey = this.resolveStorageNamespace('tab');
194
- const browserCache = this.configuration.tokenScope === 'global'
195
- && this.configuration.cookie?.userToken !== undefined
196
- ? new CookieCache(this.configuration.cookie.userToken)
197
- : new LocalStorageCache(this.getLocalStorage(), tokenKey);
198
- const tabStorage = this.getSessionStorage();
199
-
200
- if (browserCache instanceof LocalStorageCache) {
201
- this.removeTokenSyncListener = LocalStorageCache.autoSync(browserCache);
202
- }
203
-
204
- return Context.load({
205
- tokenScope: this.configuration.tokenScope,
206
- eventDispatcher: this.getEventManager(),
207
- urlSanitizer: this.configuration.urlSanitizer,
208
- cache: {
209
- tabId: new LocalStorageCache(tabStorage, tabKey),
210
- tabToken: new LocalStorageCache(tabStorage, tokenKey),
211
- browserToken: browserCache,
212
- },
213
- });
214
- }
215
-
216
- private getBeaconChannel(): OutputChannel<Beacon> {
217
- if (this.beaconChannel === undefined) {
218
- this.beaconChannel = this.createBeaconChannel();
219
- }
220
-
221
- return this.beaconChannel;
222
- }
223
-
224
- private createBeaconChannel(): OutputChannel<Beacon> {
225
- if (this.configuration.test) {
226
- return new SandboxChannel();
227
- }
228
-
229
- const channelLogger = this.getLogger('BeaconChannel');
230
- const {appId, trackerEndpointUrl} = this.configuration;
231
-
232
- const queuedChannel = new QueuedChannel(
233
- new RetryChannel({
234
- channel: new GuaranteedChannel({
235
- channel: new HttpBeaconChannel({
236
- appId: appId,
237
- endpointUrl: trackerEndpointUrl,
238
- cidAssigner: this.getCidAssigner(),
239
- logger: channelLogger,
240
- }),
241
- stamper: new TimeStamper(),
242
- ackTimeout: 10000,
243
- logger: channelLogger,
244
- }),
245
- retryPolicy: new BackoffPolicy({
246
- minRetryDelay: 3000, // 3 seconds
247
- maxRetryDelay: 60 * 1000, // 60 seconds
248
- backoffFactor: 1.5, // 1.5 ^ attempt
249
- backoffJitter: 1, // add randomness
250
- }),
251
- logger: channelLogger,
252
- }),
253
- this.getBeaconQueue(),
254
- channelLogger,
255
- );
256
-
257
- queuedChannel.flush().catch(() => {
258
- // Suppress errors as they are already reported by the channel
259
- });
260
-
261
- return new EncodedChannel<Beacon, string>(queuedChannel, encodeJson);
262
- }
263
-
264
- public getCidAssigner(): CidAssigner {
265
- if (this.cidAssigner === undefined) {
266
- this.cidAssigner = this.createCidAssigner();
267
- }
268
-
269
- return this.cidAssigner;
270
- }
271
-
272
- private createCidAssigner(): CidAssigner {
273
- if (this.configuration.clientId !== undefined) {
274
- return new FixedAssigner(this.configuration.clientId);
275
- }
276
-
277
- if (this.configuration.test) {
278
- return new FixedAssigner('00000000-0000-0000-0000-000000000000');
279
- }
280
-
281
- const logger = this.getLogger('CidAssigner');
282
-
283
- return new CachedAssigner(
284
- new RemoteAssigner(this.configuration.cidAssignerEndpointUrl, logger),
285
- this.configuration.cookie?.clientId !== undefined
286
- ? new CookieCache(this.configuration.cookie?.clientId)
287
- : new LocalStorageCache(this.getLocalStorage(), 'croct.cid'),
288
- {
289
- logger: logger,
290
- mirror: !this.configuration.disableCidMirroring,
291
- },
292
- );
293
- }
294
-
295
- public getBeaconQueue(): MonitoredQueue<string> {
296
- if (this.beaconQueue === undefined) {
297
- this.beaconQueue = this.createBeaconQueue();
298
- }
299
-
300
- return this.beaconQueue;
301
- }
302
-
303
- private createBeaconQueue(): MonitoredQueue<string> {
304
- return new MonitoredQueue<string>(
305
- new CapacityRestrictedQueue(
306
- new PersistentQueue(this.getGlobalTabStorage('queue')),
307
- this.configuration.beaconQueueSize,
308
- ),
309
- this.getLogger('BeaconQueue'),
310
- );
311
- }
312
-
313
- public getLogger(...namespace: string[]): Logger {
314
- const prefix = `Croct${namespace.length === 0 ? '' : `:${namespace.join(':')}`}`;
315
-
316
- if (this.configuration.logger !== undefined) {
317
- return new NamespacedLogger(this.configuration.logger, prefix);
318
- }
319
-
320
- if (this.configuration.debug) {
321
- return new ConsoleLogger(prefix);
322
- }
323
-
324
- return FilteredLogger.include(new ConsoleLogger(), ['error', 'warn']);
325
- }
326
-
327
- public getTabStorage(namespace: string, ...subnamespace: string[]): Storage {
328
- return this.getGlobalTabStorage('external', namespace, ...subnamespace);
329
- }
330
-
331
- public getBrowserStorage(namespace: string, ...subnamespace: string[]): Storage {
332
- return this.getGlobalBrowserStorage('external', namespace, ...subnamespace);
333
- }
334
-
335
- private getGlobalTabStorage(namespace: string, ...subnamespace: string[]): Storage {
336
- return new NamespacedStorage(
337
- this.getSessionStorage(),
338
- this.resolveStorageNamespace(namespace, ...subnamespace),
339
- );
340
- }
341
-
342
- private getGlobalBrowserStorage(namespace: string, ...subnamespace: string[]): Storage {
343
- return new NamespacedStorage(
344
- this.getLocalStorage(),
345
- this.resolveStorageNamespace(namespace, ...subnamespace),
346
- );
347
- }
348
-
349
- private resolveStorageNamespace(namespace: string, ...subnamespace: string[]): string {
350
- const {appId} = this.configuration;
351
-
352
- return `croct[${appId.toLowerCase()}].${[namespace].concat(subnamespace).join('.')}`;
353
- }
354
-
355
- private getLocalStorage(): Storage {
356
- return localStorage;
357
- }
358
-
359
- private getSessionStorage(): Storage {
360
- return sessionStorage;
361
- }
362
-
363
- public getEventManager(): EventManager<SdkEventMap> {
364
- return this.eventManager;
365
- }
366
-
367
- public async dispose(): Promise<void> {
368
- const logger = this.getLogger();
369
-
370
- if (this.beaconChannel !== undefined) {
371
- logger.debug('Closing beacon channel...');
372
-
373
- await this.beaconChannel.close();
374
- }
375
-
376
- if (this.removeTokenSyncListener !== undefined) {
377
- logger.debug('Removing token sync listener...');
378
-
379
- this.removeTokenSyncListener();
380
- }
381
-
382
- if (this.tracker !== undefined) {
383
- if (this.beaconQueue !== undefined) {
384
- logger.debug('Removing queue listeners...');
385
-
386
- this.beaconQueue.removeCallback('halfEmpty', this.tracker.unsuspend);
387
- this.beaconQueue.removeCallback('full', this.tracker.suspend);
388
- }
389
-
390
- logger.debug('Suspending tracker...');
391
-
392
- this.tracker.suspend();
393
-
394
- await this.tracker.flushed;
395
- }
396
-
397
- delete this.context;
398
- delete this.userTokenProvider;
399
- delete this.previewTokenStore;
400
- delete this.cidAssigner;
401
- delete this.tracker;
402
- delete this.evaluator;
403
- delete this.contentFetcher;
404
- delete this.beaconChannel;
405
- delete this.beaconQueue;
406
- delete this.removeTokenSyncListener;
407
-
408
- logger.debug('Container resources released.');
409
- }
410
- }