@croct/sdk 0.13.0 → 0.15.0

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 (106) hide show
  1. package/activeRecord.js.map +1 -1
  2. package/apiKey.d.ts +18 -0
  3. package/apiKey.js +89 -0
  4. package/apiKey.js.map +1 -0
  5. package/cache/cache.d.ts +3 -0
  6. package/cache/cache.js +9 -0
  7. package/cache/cache.js.map +1 -1
  8. package/cache/cookieCache.d.ts +19 -0
  9. package/cache/cookieCache.js +54 -0
  10. package/cache/cookieCache.js.map +1 -0
  11. package/cache/fallbackCache.js.map +1 -1
  12. package/cache/localStorageCache.js.map +1 -1
  13. package/channel/beaconSocketChannel.js.map +1 -1
  14. package/channel/guaranteedChannel.js.map +1 -1
  15. package/channel/queuedChannel.js.map +1 -1
  16. package/channel/retryChannel.js.map +1 -1
  17. package/channel/sandboxChannel.js.map +1 -1
  18. package/channel/socketChannel.js.map +1 -1
  19. package/cid/cachedAssigner.js.map +1 -1
  20. package/cid/remoteAssigner.js.map +1 -1
  21. package/constants.d.ts +2 -2
  22. package/constants.js +1 -1
  23. package/container.d.ts +8 -1
  24. package/container.js +21 -7
  25. package/container.js.map +1 -1
  26. package/contentFetcher.d.ts +9 -1
  27. package/contentFetcher.js +24 -6
  28. package/contentFetcher.js.map +1 -1
  29. package/context.d.ts +4 -4
  30. package/context.js +4 -1
  31. package/context.js.map +1 -1
  32. package/error.js.map +1 -1
  33. package/evaluator.d.ts +9 -1
  34. package/evaluator.js +27 -9
  35. package/evaluator.js.map +1 -1
  36. package/eventManager.js.map +1 -1
  37. package/eventSubjectProcessor.d.ts +9 -0
  38. package/eventSubjectProcessor.js +67 -0
  39. package/eventSubjectProcessor.js.map +1 -0
  40. package/facade/contentFetcherFacade.d.ts +6 -1
  41. package/facade/contentFetcherFacade.js +5 -2
  42. package/facade/contentFetcherFacade.js.map +1 -1
  43. package/facade/evaluatorFacade.js.map +1 -1
  44. package/facade/sdkFacade.d.ts +11 -1
  45. package/facade/sdkFacade.js +9 -3
  46. package/facade/sdkFacade.js.map +1 -1
  47. package/facade/sessionPatch.js.map +1 -1
  48. package/facade/trackerFacade.js.map +1 -1
  49. package/facade/userPatch.js.map +1 -1
  50. package/logging/consoleLogger.js.map +1 -1
  51. package/namespacedStorage.js.map +1 -1
  52. package/package.json +5 -4
  53. package/queue/capacityRestrictedQueue.js.map +1 -1
  54. package/queue/inMemoryQueue.js.map +1 -1
  55. package/queue/monitoredQueue.js.map +1 -1
  56. package/queue/persistentQueue.js.map +1 -1
  57. package/retry/arbitraryPolicy.js.map +1 -1
  58. package/retry/backoffPolicy.js.map +1 -1
  59. package/retry/maxAttemptsPolicy.js.map +1 -1
  60. package/schema/sdkFacadeSchemas.js +9 -0
  61. package/schema/sdkFacadeSchemas.js.map +1 -1
  62. package/schema/sdkSchemas.d.ts +1 -0
  63. package/schema/sdkSchemas.js +30 -1
  64. package/schema/sdkSchemas.js.map +1 -1
  65. package/sdk.d.ts +8 -1
  66. package/sdk.js +1 -2
  67. package/sdk.js.map +1 -1
  68. package/sourceLocation.js.map +1 -1
  69. package/src/apiKey.ts +110 -0
  70. package/src/cache/cache.ts +7 -0
  71. package/src/cache/cookieCache.ts +77 -0
  72. package/src/container.ts +24 -5
  73. package/src/contentFetcher.ts +39 -8
  74. package/src/context.ts +7 -5
  75. package/src/evaluator.ts +39 -9
  76. package/src/eventSubjectProcessor.ts +85 -0
  77. package/src/facade/contentFetcherFacade.ts +11 -2
  78. package/src/facade/sdkFacade.ts +21 -3
  79. package/src/schema/sdkFacadeSchemas.ts +10 -1
  80. package/src/schema/sdkSchemas.ts +30 -0
  81. package/src/sdk.ts +8 -4
  82. package/src/token/token.ts +100 -18
  83. package/src/tracker.ts +59 -15
  84. package/tab.js.map +1 -1
  85. package/token/cachedTokenStore.js.map +1 -1
  86. package/token/token.d.ts +19 -2
  87. package/token/token.js +79 -16
  88. package/token/token.js.map +1 -1
  89. package/tracker.d.ts +9 -1
  90. package/tracker.js +37 -12
  91. package/tracker.js.map +1 -1
  92. package/uuid.js.map +1 -1
  93. package/validation/arrayType.js.map +1 -1
  94. package/validation/booleanType.js.map +1 -1
  95. package/validation/functionType.js.map +1 -1
  96. package/validation/jsonType.js.map +1 -1
  97. package/validation/nullType.js.map +1 -1
  98. package/validation/numberType.js.map +1 -1
  99. package/validation/objectType.js.map +1 -1
  100. package/validation/stringType.js.map +1 -1
  101. package/validation/unionType.js.map +1 -1
  102. package/validation/violation.js.map +1 -1
  103. package/base64Url.d.ts +0 -2
  104. package/base64Url.js +0 -28
  105. package/base64Url.js.map +0 -1
  106. package/src/base64Url.ts +0 -36
@@ -1,7 +1,8 @@
1
1
  import {JsonObject} from '@croct/json';
2
- import {base64UrlDecode, base64UrlEncode} from '../base64Url';
2
+ import {encodeURI as base64Encode, decode as base64Decode} from 'js-base64';
3
3
  import {tokenSchema} from '../schema';
4
4
  import {formatCause} from '../error';
5
+ import {ApiKey} from '../apiKey';
5
6
 
6
7
  export type Headers = {
7
8
  typ: string,
@@ -16,12 +17,14 @@ type Claims = {
16
17
  iat: number,
17
18
  exp?: number,
18
19
  sub?: string,
19
- jid?: string,
20
+ jti?: string,
20
21
  };
21
22
 
22
23
  export type TokenPayload = JsonObject & Claims;
23
24
 
24
25
  export class Token {
26
+ private static readonly UUID_PATTERN = /^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/;
27
+
25
28
  private readonly headers: Headers;
26
29
 
27
30
  private readonly payload: TokenPayload;
@@ -76,20 +79,15 @@ export class Token {
76
79
 
77
80
  let headers;
78
81
  let payload;
79
- let signature;
80
82
 
81
83
  try {
82
- headers = JSON.parse(base64UrlDecode(parts[0], true));
83
- payload = JSON.parse(base64UrlDecode(parts[1], true));
84
-
85
- if (parts.length === 3) {
86
- signature = base64UrlDecode(parts[2], false);
87
- }
88
- } catch {
84
+ headers = JSON.parse(base64Decode(parts[0]));
85
+ payload = JSON.parse(base64Decode(parts[1]));
86
+ } catch (error) {
89
87
  throw new Error('The token is corrupted.');
90
88
  }
91
89
 
92
- return Token.of(headers, payload, signature);
90
+ return Token.of(headers, payload, parts[2]);
93
91
  }
94
92
 
95
93
  public static of(headers: Headers, payload: TokenPayload, signature = ''): Token {
@@ -106,6 +104,63 @@ export class Token {
106
104
  return new Token(headers as Headers, payload as TokenPayload, signature as string);
107
105
  }
108
106
 
107
+ public async signedWith(apiKey: ApiKey): Promise<Token> {
108
+ const keyId = await apiKey.getIdentifierHash();
109
+ const headers: Headers = {
110
+ ...this.headers,
111
+ kid: keyId,
112
+ alg: 'EdDSA',
113
+ };
114
+
115
+ const encodedHeader = base64Encode(JSON.stringify(headers));
116
+ const encodedPayload = base64Encode(JSON.stringify(this.payload));
117
+ const signatureData = `${encodedHeader}.${encodedPayload}`;
118
+ const signature = await apiKey.sign(Buffer.from(signatureData, 'utf-8'));
119
+
120
+ return new Token(headers, this.payload, signature.toString('base64url'));
121
+ }
122
+
123
+ public isSigned(): boolean {
124
+ return this.headers.alg !== 'none' && this.signature !== '';
125
+ }
126
+
127
+ public isSubject(subject: string): boolean {
128
+ return this.getSubject() === subject;
129
+ }
130
+
131
+ public isAnonymous(): boolean {
132
+ return this.payload.sub === undefined;
133
+ }
134
+
135
+ public isValidNow(now: number = Math.floor(Date.now() / 1000)): boolean {
136
+ const {exp, iat} = this.payload;
137
+
138
+ return (exp === undefined || exp >= now) && iat <= now;
139
+ }
140
+
141
+ public isNewerThan(token: Token): boolean {
142
+ return this.payload.iat > token.payload.iat;
143
+ }
144
+
145
+ public async matchesKeyId(apiKey: ApiKey): Promise<boolean> {
146
+ return this.headers.kid === await apiKey.getIdentifierHash();
147
+ }
148
+
149
+ public withTokenId(tokenId: string): Token {
150
+ if (tokenId === '' || !Token.UUID_PATTERN.test(tokenId)) {
151
+ throw new Error('The token ID must be a valid UUID.');
152
+ }
153
+
154
+ return new Token(
155
+ this.headers,
156
+ {
157
+ ...this.payload,
158
+ jti: tokenId,
159
+ },
160
+ this.signature,
161
+ );
162
+ }
163
+
109
164
  public getHeaders(): Headers {
110
165
  return {...this.headers};
111
166
  }
@@ -118,28 +173,55 @@ export class Token {
118
173
  return this.signature;
119
174
  }
120
175
 
121
- public isAnonymous(): boolean {
122
- return this.payload.sub === undefined;
176
+ public getApplicationId(): string | null {
177
+ return this.headers.appId ?? null;
178
+ }
179
+
180
+ public getAlgorithm(): string {
181
+ return this.headers.alg;
182
+ }
183
+
184
+ public getType(): string {
185
+ return this.headers.typ;
186
+ }
187
+
188
+ public getKeyId(): string | null {
189
+ return this.headers.kid ?? null;
123
190
  }
124
191
 
125
192
  public getSubject(): string | null {
126
- return this.payload.sub !== undefined ? this.payload.sub : null;
193
+ return this.payload.sub ?? null;
127
194
  }
128
195
 
129
196
  public getIssueTime(): number {
130
197
  return this.payload.iat;
131
198
  }
132
199
 
200
+ public getExpirationTime(): number | null {
201
+ return this.payload.exp ?? null;
202
+ }
203
+
204
+ public getTokenId(): string | null {
205
+ return this.payload.jti ?? null;
206
+ }
207
+
208
+ public getAudience(): string | string[] {
209
+ return this.payload.aud;
210
+ }
211
+
212
+ public getIssuer(): string {
213
+ return this.payload.iss;
214
+ }
215
+
133
216
  public toJSON(): string {
134
217
  return this.toString();
135
218
  }
136
219
 
137
220
  public toString(): string {
138
- const headers = base64UrlEncode(JSON.stringify(this.headers), true);
139
- const payload = base64UrlEncode(JSON.stringify(this.payload), true);
140
- const signature = base64UrlEncode(this.signature, false);
221
+ const headers = base64Encode(JSON.stringify(this.headers));
222
+ const payload = base64Encode(JSON.stringify(this.payload));
141
223
 
142
- return `${headers}.${payload}.${signature}`;
224
+ return `${headers}.${payload}.${this.signature}`;
143
225
  }
144
226
  }
145
227
 
package/src/tracker.ts CHANGED
@@ -2,7 +2,7 @@ import {Logger, NullLogger} from './logging';
2
2
  import {Tab, TabEvent, TabUrlChangeEvent, TabVisibilityChangeEvent} from './tab';
3
3
  import {OutputChannel} from './channel';
4
4
  import {formatCause} from './error';
5
- import {TokenProvider} from './token';
5
+ import {Token, TokenProvider} from './token';
6
6
  import {RetryPolicy} from './retry';
7
7
  import {
8
8
  Beacon,
@@ -23,6 +23,7 @@ export type Configuration = Options & {
23
23
  logger?: Logger,
24
24
  tab: Tab,
25
25
  tokenProvider: TokenProvider,
26
+ processor?: TrackingEventProcessor,
26
27
  inactivityRetryPolicy: RetryPolicy<number>,
27
28
  };
28
29
 
@@ -37,8 +38,15 @@ type InactivityTimer = {
37
38
  since: number,
38
39
  };
39
40
 
41
+ export interface TrackingEventProcessor {
42
+ process(event: QueuedEventInfo): QueuedEventInfo[];
43
+ }
44
+
45
+ export type QueuedEventInfo<T extends TrackingEvent = TrackingEvent> = Omit<EventInfo<T>, 'status'>;
46
+
40
47
  export type EventInfo<T extends TrackingEvent = TrackingEvent> = {
41
48
  context: TrackingEventContext,
49
+ userToken?: Token,
42
50
  event: T,
43
51
  timestamp: number,
44
52
  status: 'pending' | 'confirmed' | 'failed' | 'ignored',
@@ -63,6 +71,8 @@ export class Tracker {
63
71
 
64
72
  private readonly logger: Logger;
65
73
 
74
+ private readonly processor?: TrackingEventProcessor;
75
+
66
76
  private readonly listeners: EventListener[] = [];
67
77
 
68
78
  private readonly pending: Array<Promise<void>> = [];
@@ -85,6 +95,7 @@ export class Tracker {
85
95
  this.inactivityRetryPolicy = inactivityRetryPolicy;
86
96
  this.channel = channel;
87
97
  this.logger = logger ?? new NullLogger();
98
+ this.processor = config.processor;
88
99
  this.options = {
89
100
  ...options,
90
101
  eventMetadata: options.eventMetadata ?? {},
@@ -264,7 +275,7 @@ export class Tracker {
264
275
  }
265
276
 
266
277
  public track<T extends PartialTrackingEvent>(event: T, timestamp: number = Date.now()): Promise<T> {
267
- return this.publish(this.enrichEvent(event, timestamp), timestamp).then(() => event);
278
+ return this.dispatch(this.enrichEvent(event, timestamp), timestamp).then(() => event);
268
279
  }
269
280
 
270
281
  private trackPageOpen({referrer, ...payload}: {url: string, referrer: string}): void {
@@ -315,7 +326,7 @@ export class Tracker {
315
326
  }
316
327
 
317
328
  private enqueue(event: TrackingEvent, timestamp: number = Date.now()): void {
318
- this.publish(event, timestamp).catch(() => {
329
+ this.dispatch(event, timestamp).catch(() => {
319
330
  // suppress error
320
331
  });
321
332
  }
@@ -324,11 +335,8 @@ export class Tracker {
324
335
  this.listeners.map(listener => listener(event));
325
336
  }
326
337
 
327
- private publish<T extends TrackingEvent>(event: T, timestamp: number): Promise<T> {
328
- if (event.type !== 'nothingChanged') {
329
- this.stopInactivityTimer();
330
- }
331
-
338
+ private dispatch<T extends TrackingEvent>(event: T, timestamp: number): Promise<T> {
339
+ const userToken = this.tokenProvider.getToken();
332
340
  const metadata = this.options.eventMetadata;
333
341
  const context: TrackingEventContext = {
334
342
  tabId: this.tab.id,
@@ -336,10 +344,48 @@ export class Tracker {
336
344
  ...(Object.keys(metadata).length > 0 ? {metadata: metadata} : {}),
337
345
  };
338
346
 
339
- const eventInfo: EventInfo<T> = {
347
+ const queuedEvent: QueuedEventInfo<T> = {
348
+ ...(userToken !== null ? {userToken: userToken} : {}),
340
349
  event: event,
341
- context: context,
342
350
  timestamp: timestamp,
351
+ context: context,
352
+ };
353
+
354
+ const processedEvents = this.processor !== undefined
355
+ ? this.processor.process(queuedEvent)
356
+ : [queuedEvent];
357
+
358
+ // sort events by timestamp in ascending order
359
+ processedEvents.sort((left, right) => left.timestamp - right.timestamp);
360
+
361
+ let result: Promise<T>|null = null;
362
+
363
+ for (const processedEvent of processedEvents) {
364
+ if (processedEvent === queuedEvent) {
365
+ result = this.publish(queuedEvent);
366
+
367
+ continue;
368
+ }
369
+
370
+ this.publish(processedEvent);
371
+ }
372
+
373
+ if (result === null) {
374
+ return Promise.reject(new Error('Event suppressed.'));
375
+ }
376
+
377
+ return result;
378
+ }
379
+
380
+ private publish<T extends TrackingEvent>(queuedEvent: QueuedEventInfo<T>): Promise<T> {
381
+ const {event} = queuedEvent;
382
+
383
+ if (event.type !== 'nothingChanged') {
384
+ this.stopInactivityTimer();
385
+ }
386
+
387
+ const eventInfo: EventInfo<T> = {
388
+ ...queuedEvent,
343
389
  status: 'pending',
344
390
  };
345
391
 
@@ -357,7 +403,7 @@ export class Tracker {
357
403
 
358
404
  return new Promise<T>((resolve, reject) => {
359
405
  const promise = this.channel
360
- .publish(this.createBeacon(event, timestamp, context))
406
+ .publish(this.createBeacon(queuedEvent))
361
407
  .then(
362
408
  () => {
363
409
  this.logger.debug(`Successfully published event "${event.type}"`);
@@ -403,12 +449,10 @@ export class Tracker {
403
449
  return event;
404
450
  }
405
451
 
406
- private createBeacon(event: TrackingEvent, timestamp: number, context: TrackingEventContext): Beacon {
407
- const token = this.tokenProvider.getToken();
408
-
452
+ private createBeacon({event, timestamp, context, userToken}: QueuedEventInfo): Beacon {
409
453
  return {
410
454
  timestamp: timestamp,
411
- ...(token !== null ? {token: token.toString()} : {}),
455
+ ...(userToken !== undefined ? {token: userToken.toString()} : {}),
412
456
  context: context,
413
457
  payload: this.enrichBeaconPayload(this.createBeaconPayload(event)),
414
458
  };
package/tab.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tab.js","sourceRoot":"","sources":["src/tab.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tab.js","sourceRoot":"","sources":["src/tab.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cachedTokenStore.js","sourceRoot":"","sources":["../src/token/cachedTokenStore.ts"],"names":[],"mappings":";;;AAAA,mCAA0C;AAG1C,MAAa,gBAAgB;IAGzB,YAAmB,KAAY;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,QAAQ;QACX,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAE7C,IAAI,IAAI,KAAK,IAAI,EAAE;YACf,OAAO,IAAI,CAAC;SACf;QAED,IAAI;YACA,OAAO,aAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC5B;QAAC,OAAO,KAAK,EAAE;YACZ,OAAO,IAAI,CAAC;SACf;IACL,CAAC;IAEM,QAAQ,CAAC,KAAmB;QAC/B,IAAI,KAAK,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAEnB,OAAO;SACV;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;CACJ;AA9BD,4CA8BC"}
1
+ {"version":3,"file":"cachedTokenStore.js","sourceRoot":"","sources":["../src/token/cachedTokenStore.ts"],"names":[],"mappings":";;;AAAA,mCAA0C;AAG1C,MAAa,gBAAgB;IAGzB,YAAmB,KAAY;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,QAAQ;QACX,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAE7C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACD,OAAO,aAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,KAAmB;QAC/B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAEnB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrC,CAAC;CACJ;AA9BD,4CA8BC"}
package/token/token.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { JsonObject } from '@croct/json';
2
+ import { ApiKey } from '../apiKey';
2
3
  export type Headers = {
3
4
  typ: string;
4
5
  alg: string;
@@ -11,10 +12,11 @@ type Claims = {
11
12
  iat: number;
12
13
  exp?: number;
13
14
  sub?: string;
14
- jid?: string;
15
+ jti?: string;
15
16
  };
16
17
  export type TokenPayload = JsonObject & Claims;
17
18
  export declare class Token {
19
+ private static readonly UUID_PATTERN;
18
20
  private readonly headers;
19
21
  private readonly payload;
20
22
  private readonly signature;
@@ -22,12 +24,27 @@ export declare class Token {
22
24
  static issue(appId: string, subject?: string | null, timestamp?: number): Token;
23
25
  static parse(token: string): Token;
24
26
  static of(headers: Headers, payload: TokenPayload, signature?: string): Token;
27
+ signedWith(apiKey: ApiKey): Promise<Token>;
28
+ isSigned(): boolean;
29
+ isSubject(subject: string): boolean;
30
+ isAnonymous(): boolean;
31
+ isValidNow(now?: number): boolean;
32
+ isNewerThan(token: Token): boolean;
33
+ matchesKeyId(apiKey: ApiKey): Promise<boolean>;
34
+ withTokenId(tokenId: string): Token;
25
35
  getHeaders(): Headers;
26
36
  getPayload(): TokenPayload;
27
37
  getSignature(): string;
28
- isAnonymous(): boolean;
38
+ getApplicationId(): string | null;
39
+ getAlgorithm(): string;
40
+ getType(): string;
41
+ getKeyId(): string | null;
29
42
  getSubject(): string | null;
30
43
  getIssueTime(): number;
44
+ getExpirationTime(): number | null;
45
+ getTokenId(): string | null;
46
+ getAudience(): string | string[];
47
+ getIssuer(): string;
31
48
  toJSON(): string;
32
49
  toString(): string;
33
50
  }
package/token/token.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FixedTokenProvider = exports.Token = void 0;
4
- const base64Url_1 = require("../base64Url");
4
+ const js_base64_1 = require("js-base64");
5
5
  const schema_1 = require("../schema");
6
6
  const error_1 = require("../error");
7
7
  class Token {
@@ -39,18 +39,14 @@ class Token {
39
39
  }
40
40
  let headers;
41
41
  let payload;
42
- let signature;
43
42
  try {
44
- headers = JSON.parse((0, base64Url_1.base64UrlDecode)(parts[0], true));
45
- payload = JSON.parse((0, base64Url_1.base64UrlDecode)(parts[1], true));
46
- if (parts.length === 3) {
47
- signature = (0, base64Url_1.base64UrlDecode)(parts[2], false);
48
- }
43
+ headers = JSON.parse((0, js_base64_1.decode)(parts[0]));
44
+ payload = JSON.parse((0, js_base64_1.decode)(parts[1]));
49
45
  }
50
- catch {
46
+ catch (error) {
51
47
  throw new Error('The token is corrupted.');
52
48
  }
53
- return Token.of(headers, payload, signature);
49
+ return Token.of(headers, payload, parts[2]);
54
50
  }
55
51
  static of(headers, payload, signature = '') {
56
52
  try {
@@ -65,6 +61,47 @@ class Token {
65
61
  }
66
62
  return new Token(headers, payload, signature);
67
63
  }
64
+ async signedWith(apiKey) {
65
+ const keyId = await apiKey.getIdentifierHash();
66
+ const headers = {
67
+ ...this.headers,
68
+ kid: keyId,
69
+ alg: 'EdDSA',
70
+ };
71
+ const encodedHeader = (0, js_base64_1.encodeURI)(JSON.stringify(headers));
72
+ const encodedPayload = (0, js_base64_1.encodeURI)(JSON.stringify(this.payload));
73
+ const signatureData = `${encodedHeader}.${encodedPayload}`;
74
+ const signature = await apiKey.sign(Buffer.from(signatureData, 'utf-8'));
75
+ return new Token(headers, this.payload, signature.toString('base64url'));
76
+ }
77
+ isSigned() {
78
+ return this.headers.alg !== 'none' && this.signature !== '';
79
+ }
80
+ isSubject(subject) {
81
+ return this.getSubject() === subject;
82
+ }
83
+ isAnonymous() {
84
+ return this.payload.sub === undefined;
85
+ }
86
+ isValidNow(now = Math.floor(Date.now() / 1000)) {
87
+ const { exp, iat } = this.payload;
88
+ return (exp === undefined || exp >= now) && iat <= now;
89
+ }
90
+ isNewerThan(token) {
91
+ return this.payload.iat > token.payload.iat;
92
+ }
93
+ async matchesKeyId(apiKey) {
94
+ return this.headers.kid === await apiKey.getIdentifierHash();
95
+ }
96
+ withTokenId(tokenId) {
97
+ if (tokenId === '' || !Token.UUID_PATTERN.test(tokenId)) {
98
+ throw new Error('The token ID must be a valid UUID.');
99
+ }
100
+ return new Token(this.headers, {
101
+ ...this.payload,
102
+ jti: tokenId,
103
+ }, this.signature);
104
+ }
68
105
  getHeaders() {
69
106
  return { ...this.headers };
70
107
  }
@@ -74,26 +111,52 @@ class Token {
74
111
  getSignature() {
75
112
  return this.signature;
76
113
  }
77
- isAnonymous() {
78
- return this.payload.sub === undefined;
114
+ getApplicationId() {
115
+ var _a;
116
+ return (_a = this.headers.appId) !== null && _a !== void 0 ? _a : null;
117
+ }
118
+ getAlgorithm() {
119
+ return this.headers.alg;
120
+ }
121
+ getType() {
122
+ return this.headers.typ;
123
+ }
124
+ getKeyId() {
125
+ var _a;
126
+ return (_a = this.headers.kid) !== null && _a !== void 0 ? _a : null;
79
127
  }
80
128
  getSubject() {
81
- return this.payload.sub !== undefined ? this.payload.sub : null;
129
+ var _a;
130
+ return (_a = this.payload.sub) !== null && _a !== void 0 ? _a : null;
82
131
  }
83
132
  getIssueTime() {
84
133
  return this.payload.iat;
85
134
  }
135
+ getExpirationTime() {
136
+ var _a;
137
+ return (_a = this.payload.exp) !== null && _a !== void 0 ? _a : null;
138
+ }
139
+ getTokenId() {
140
+ var _a;
141
+ return (_a = this.payload.jti) !== null && _a !== void 0 ? _a : null;
142
+ }
143
+ getAudience() {
144
+ return this.payload.aud;
145
+ }
146
+ getIssuer() {
147
+ return this.payload.iss;
148
+ }
86
149
  toJSON() {
87
150
  return this.toString();
88
151
  }
89
152
  toString() {
90
- const headers = (0, base64Url_1.base64UrlEncode)(JSON.stringify(this.headers), true);
91
- const payload = (0, base64Url_1.base64UrlEncode)(JSON.stringify(this.payload), true);
92
- const signature = (0, base64Url_1.base64UrlEncode)(this.signature, false);
93
- return `${headers}.${payload}.${signature}`;
153
+ const headers = (0, js_base64_1.encodeURI)(JSON.stringify(this.headers));
154
+ const payload = (0, js_base64_1.encodeURI)(JSON.stringify(this.payload));
155
+ return `${headers}.${payload}.${this.signature}`;
94
156
  }
95
157
  }
96
158
  exports.Token = Token;
159
+ Token.UUID_PATTERN = /^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/;
97
160
  class FixedTokenProvider {
98
161
  constructor(token) {
99
162
  this.token = token;
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token/token.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token/token.ts"],"names":[],"mappings":"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"}
package/tracker.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Logger } from './logging';
2
2
  import { Tab } from './tab';
3
3
  import { OutputChannel } from './channel';
4
- import { TokenProvider } from './token';
4
+ import { Token, TokenProvider } from './token';
5
5
  import { RetryPolicy } from './retry';
6
6
  import { Beacon, TrackingEvent, TrackingEventContext, PartialTrackingEvent } from './trackingEvents';
7
7
  type Options = {
@@ -14,10 +14,16 @@ export type Configuration = Options & {
14
14
  logger?: Logger;
15
15
  tab: Tab;
16
16
  tokenProvider: TokenProvider;
17
+ processor?: TrackingEventProcessor;
17
18
  inactivityRetryPolicy: RetryPolicy<number>;
18
19
  };
20
+ export interface TrackingEventProcessor {
21
+ process(event: QueuedEventInfo): QueuedEventInfo[];
22
+ }
23
+ export type QueuedEventInfo<T extends TrackingEvent = TrackingEvent> = Omit<EventInfo<T>, 'status'>;
19
24
  export type EventInfo<T extends TrackingEvent = TrackingEvent> = {
20
25
  context: TrackingEventContext;
26
+ userToken?: Token;
21
27
  event: T;
22
28
  timestamp: number;
23
29
  status: 'pending' | 'confirmed' | 'failed' | 'ignored';
@@ -32,6 +38,7 @@ export declare class Tracker {
32
38
  private inactivityRetryPolicy;
33
39
  private readonly channel;
34
40
  private readonly logger;
41
+ private readonly processor?;
35
42
  private readonly listeners;
36
43
  private readonly pending;
37
44
  private readonly state;
@@ -58,6 +65,7 @@ export declare class Tracker {
58
65
  private trackInactivity;
59
66
  private enqueue;
60
67
  private notifyEvent;
68
+ private dispatch;
61
69
  private publish;
62
70
  private enrichEvent;
63
71
  private createBeacon;