@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.
- package/activeRecord.js.map +1 -1
- package/apiKey.d.ts +18 -0
- package/apiKey.js +89 -0
- package/apiKey.js.map +1 -0
- package/cache/cache.d.ts +3 -0
- package/cache/cache.js +9 -0
- package/cache/cache.js.map +1 -1
- package/cache/cookieCache.d.ts +19 -0
- package/cache/cookieCache.js +54 -0
- package/cache/cookieCache.js.map +1 -0
- package/cache/fallbackCache.js.map +1 -1
- package/cache/localStorageCache.js.map +1 -1
- package/channel/beaconSocketChannel.js.map +1 -1
- package/channel/guaranteedChannel.js.map +1 -1
- package/channel/queuedChannel.js.map +1 -1
- package/channel/retryChannel.js.map +1 -1
- package/channel/sandboxChannel.js.map +1 -1
- package/channel/socketChannel.js.map +1 -1
- package/cid/cachedAssigner.js.map +1 -1
- package/cid/remoteAssigner.js.map +1 -1
- package/constants.d.ts +2 -2
- package/constants.js +1 -1
- package/container.d.ts +8 -1
- package/container.js +21 -7
- package/container.js.map +1 -1
- package/contentFetcher.d.ts +9 -1
- package/contentFetcher.js +24 -6
- package/contentFetcher.js.map +1 -1
- package/context.d.ts +4 -4
- package/context.js +4 -1
- package/context.js.map +1 -1
- package/error.js.map +1 -1
- package/evaluator.d.ts +9 -1
- package/evaluator.js +27 -9
- package/evaluator.js.map +1 -1
- package/eventManager.js.map +1 -1
- package/eventSubjectProcessor.d.ts +9 -0
- package/eventSubjectProcessor.js +67 -0
- package/eventSubjectProcessor.js.map +1 -0
- package/facade/contentFetcherFacade.d.ts +6 -1
- package/facade/contentFetcherFacade.js +5 -2
- package/facade/contentFetcherFacade.js.map +1 -1
- package/facade/evaluatorFacade.js.map +1 -1
- package/facade/sdkFacade.d.ts +11 -1
- package/facade/sdkFacade.js +9 -3
- package/facade/sdkFacade.js.map +1 -1
- package/facade/sessionPatch.js.map +1 -1
- package/facade/trackerFacade.js.map +1 -1
- package/facade/userPatch.js.map +1 -1
- package/logging/consoleLogger.js.map +1 -1
- package/namespacedStorage.js.map +1 -1
- package/package.json +5 -4
- package/queue/capacityRestrictedQueue.js.map +1 -1
- package/queue/inMemoryQueue.js.map +1 -1
- package/queue/monitoredQueue.js.map +1 -1
- package/queue/persistentQueue.js.map +1 -1
- package/retry/arbitraryPolicy.js.map +1 -1
- package/retry/backoffPolicy.js.map +1 -1
- package/retry/maxAttemptsPolicy.js.map +1 -1
- package/schema/sdkFacadeSchemas.js +9 -0
- package/schema/sdkFacadeSchemas.js.map +1 -1
- package/schema/sdkSchemas.d.ts +1 -0
- package/schema/sdkSchemas.js +30 -1
- package/schema/sdkSchemas.js.map +1 -1
- package/sdk.d.ts +8 -1
- package/sdk.js +1 -2
- package/sdk.js.map +1 -1
- package/sourceLocation.js.map +1 -1
- package/src/apiKey.ts +110 -0
- package/src/cache/cache.ts +7 -0
- package/src/cache/cookieCache.ts +77 -0
- package/src/container.ts +24 -5
- package/src/contentFetcher.ts +39 -8
- package/src/context.ts +7 -5
- package/src/evaluator.ts +39 -9
- package/src/eventSubjectProcessor.ts +85 -0
- package/src/facade/contentFetcherFacade.ts +11 -2
- package/src/facade/sdkFacade.ts +21 -3
- package/src/schema/sdkFacadeSchemas.ts +10 -1
- package/src/schema/sdkSchemas.ts +30 -0
- package/src/sdk.ts +8 -4
- package/src/token/token.ts +100 -18
- package/src/tracker.ts +59 -15
- package/tab.js.map +1 -1
- package/token/cachedTokenStore.js.map +1 -1
- package/token/token.d.ts +19 -2
- package/token/token.js +79 -16
- package/token/token.js.map +1 -1
- package/tracker.d.ts +9 -1
- package/tracker.js +37 -12
- package/tracker.js.map +1 -1
- package/uuid.js.map +1 -1
- package/validation/arrayType.js.map +1 -1
- package/validation/booleanType.js.map +1 -1
- package/validation/functionType.js.map +1 -1
- package/validation/jsonType.js.map +1 -1
- package/validation/nullType.js.map +1 -1
- package/validation/numberType.js.map +1 -1
- package/validation/objectType.js.map +1 -1
- package/validation/stringType.js.map +1 -1
- package/validation/unionType.js.map +1 -1
- package/validation/violation.js.map +1 -1
- package/base64Url.d.ts +0 -2
- package/base64Url.js +0 -28
- package/base64Url.js.map +0 -1
- package/src/base64Url.ts +0 -36
package/src/token/token.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {JsonObject} from '@croct/json';
|
|
2
|
-
import {
|
|
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
|
-
|
|
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(
|
|
83
|
-
payload = JSON.parse(
|
|
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,
|
|
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
|
|
122
|
-
return this.
|
|
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
|
|
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 =
|
|
139
|
-
const payload =
|
|
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.
|
|
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.
|
|
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
|
|
328
|
-
|
|
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
|
|
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(
|
|
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
|
|
407
|
-
const token = this.tokenProvider.getToken();
|
|
408
|
-
|
|
452
|
+
private createBeacon({event, timestamp, context, userToken}: QueuedEventInfo): Beacon {
|
|
409
453
|
return {
|
|
410
454
|
timestamp: timestamp,
|
|
411
|
-
...(
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
45
|
-
payload = JSON.parse((0,
|
|
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,
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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,
|
|
91
|
-
const payload = (0,
|
|
92
|
-
|
|
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;
|
package/token/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token/token.ts"],"names":[],"mappings":";;;AACA,
|
|
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;
|