@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.
- package/constants.cjs +1 -1
- package/constants.cjs.map +1 -1
- package/constants.d.ts +2 -2
- package/constants.js +1 -1
- package/constants.js.map +1 -1
- package/package.json +1 -1
- package/src/activeRecord.ts +0 -150
- package/src/apiKey.ts +0 -208
- package/src/base64Url.ts +0 -22
- package/src/cache/cache.ts +0 -22
- package/src/cache/cookieCache.ts +0 -88
- package/src/cache/fallbackCache.ts +0 -29
- package/src/cache/inMemoryCache.ts +0 -21
- package/src/cache/index.ts +0 -4
- package/src/cache/localStorageCache.ts +0 -85
- package/src/channel/channel.ts +0 -52
- package/src/channel/encodedChannel.ts +0 -21
- package/src/channel/guaranteedChannel.ts +0 -131
- package/src/channel/httpBeaconChannel.ts +0 -128
- package/src/channel/index.ts +0 -7
- package/src/channel/queuedChannel.ts +0 -143
- package/src/channel/retryChannel.ts +0 -94
- package/src/channel/sandboxChannel.ts +0 -47
- package/src/cid/assigner.ts +0 -3
- package/src/cid/cachedAssigner.ts +0 -68
- package/src/cid/fixedAssigner.ts +0 -13
- package/src/cid/index.ts +0 -4
- package/src/cid/remoteAssigner.ts +0 -57
- package/src/constants.ts +0 -4
- package/src/container.ts +0 -410
- package/src/contentFetcher.ts +0 -290
- package/src/context.ts +0 -139
- package/src/error.ts +0 -31
- package/src/evaluator.ts +0 -314
- package/src/eventManager.ts +0 -53
- package/src/eventSubjectProcessor.ts +0 -85
- package/src/facade/contentFetcherFacade.ts +0 -69
- package/src/facade/evaluatorFacade.ts +0 -111
- package/src/facade/index.ts +0 -7
- package/src/facade/sdkFacade.ts +0 -310
- package/src/facade/sessionFacade.ts +0 -14
- package/src/facade/sessionPatch.ts +0 -32
- package/src/facade/trackerFacade.ts +0 -98
- package/src/facade/userFacade.ts +0 -26
- package/src/facade/userPatch.ts +0 -32
- package/src/help.ts +0 -24
- package/src/index.ts +0 -4
- package/src/logging/consoleLogger.ts +0 -38
- package/src/logging/filteredLogger.ts +0 -57
- package/src/logging/index.ts +0 -5
- package/src/logging/logger.ts +0 -13
- package/src/logging/namespacedLogger.ts +0 -32
- package/src/logging/nullLogger.ts +0 -19
- package/src/namespacedStorage.ts +0 -69
- package/src/patch.ts +0 -64
- package/src/queue/capacityRestrictedQueue.ts +0 -44
- package/src/queue/inMemoryQueue.ts +0 -43
- package/src/queue/index.ts +0 -5
- package/src/queue/monitoredQueue.ts +0 -168
- package/src/queue/persistentQueue.ts +0 -73
- package/src/queue/queue.ts +0 -15
- package/src/retry/arbitraryPolicy.ts +0 -21
- package/src/retry/backoffPolicy.ts +0 -84
- package/src/retry/index.ts +0 -5
- package/src/retry/maxAttemptsPolicy.ts +0 -28
- package/src/retry/neverPolicy.ts +0 -11
- package/src/retry/policy.ts +0 -5
- package/src/schema/attributeSchema.ts +0 -6
- package/src/schema/contentFetcherSchemas.ts +0 -23
- package/src/schema/contentSchemas.ts +0 -44
- package/src/schema/contextSchemas.ts +0 -5
- package/src/schema/ecommerceSchemas.ts +0 -179
- package/src/schema/evaluatorSchemas.ts +0 -52
- package/src/schema/eventSchemas.ts +0 -134
- package/src/schema/index.ts +0 -11
- package/src/schema/loggerSchema.ts +0 -12
- package/src/schema/operationSchemas.ts +0 -102
- package/src/schema/sdkFacadeSchemas.ts +0 -64
- package/src/schema/sdkSchemas.ts +0 -82
- package/src/schema/tokenSchema.ts +0 -42
- package/src/schema/userSchema.ts +0 -184
- package/src/sdk.ts +0 -183
- package/src/sdkEvents.ts +0 -15
- package/src/sourceLocation.ts +0 -85
- package/src/tab.ts +0 -148
- package/src/token/cachedTokenStore.ts +0 -34
- package/src/token/inMemoryTokenStore.ts +0 -13
- package/src/token/index.ts +0 -4
- package/src/token/replicatedTokenStore.ts +0 -21
- package/src/token/token.ts +0 -301
- package/src/tracker.ts +0 -504
- package/src/trackingEvents.ts +0 -452
- package/src/transformer.ts +0 -7
- package/src/utilityTypes.ts +0 -3
- package/src/uuid.ts +0 -43
- package/src/validation/arrayType.ts +0 -71
- package/src/validation/booleanType.ts +0 -22
- package/src/validation/functionType.ts +0 -22
- package/src/validation/index.ts +0 -12
- package/src/validation/jsonType.ts +0 -156
- package/src/validation/mixedSchema.ts +0 -7
- package/src/validation/nullType.ts +0 -22
- package/src/validation/numberType.ts +0 -59
- package/src/validation/objectType.ts +0 -138
- package/src/validation/schema.ts +0 -21
- package/src/validation/stringType.ts +0 -118
- package/src/validation/unionType.ts +0 -53
- package/src/validation/violation.ts +0 -23
package/src/facade/sdkFacade.ts
DELETED
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
import {EvaluatorFacade, TabContextFactory} from './evaluatorFacade';
|
|
2
|
-
import {TrackerFacade} from './trackerFacade';
|
|
3
|
-
import {Context, TokenScope} from '../context';
|
|
4
|
-
import {UserFacade} from './userFacade';
|
|
5
|
-
import {Token, TokenStore} from '../token';
|
|
6
|
-
import {formatCause} from '../error';
|
|
7
|
-
import {sdkFacadeConfigurationSchema} from '../schema';
|
|
8
|
-
import {Sdk} from '../sdk';
|
|
9
|
-
import {SessionFacade} from './sessionFacade';
|
|
10
|
-
import {Logger} from '../logging';
|
|
11
|
-
import {SdkEventMap} from '../sdkEvents';
|
|
12
|
-
import {EventManager} from '../eventManager';
|
|
13
|
-
import {CidAssigner} from '../cid';
|
|
14
|
-
import {PartialTrackingEvent} from '../trackingEvents';
|
|
15
|
-
import {UrlSanitizer} from '../tab';
|
|
16
|
-
import {ContentFetcherFacade} from './contentFetcherFacade';
|
|
17
|
-
import {CookieCacheConfiguration} from '../cache/cookieCache';
|
|
18
|
-
import {EventSubjectProcessor} from '../eventSubjectProcessor';
|
|
19
|
-
|
|
20
|
-
export type Configuration = {
|
|
21
|
-
appId: string,
|
|
22
|
-
tokenScope?: TokenScope,
|
|
23
|
-
debug?: boolean,
|
|
24
|
-
test?: boolean,
|
|
25
|
-
track?: boolean,
|
|
26
|
-
token?: string | null,
|
|
27
|
-
userId?: string | null,
|
|
28
|
-
clientId?: string,
|
|
29
|
-
eventMetadata?: {[key: string]: string},
|
|
30
|
-
logger?: Logger,
|
|
31
|
-
urlSanitizer?: UrlSanitizer,
|
|
32
|
-
baseEndpointUrl?: string,
|
|
33
|
-
disableCidMirroring?: boolean,
|
|
34
|
-
cidAssignerEndpointUrl?: string,
|
|
35
|
-
cookie?: {
|
|
36
|
-
clientId?: CookieCacheConfiguration,
|
|
37
|
-
userToken?: CookieCacheConfiguration,
|
|
38
|
-
previewToken?: CookieCacheConfiguration,
|
|
39
|
-
},
|
|
40
|
-
defaultFetchTimeout?: number,
|
|
41
|
-
defaultPreferredLocale?: string,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
function validateConfiguration(configuration: unknown): asserts configuration is Configuration {
|
|
45
|
-
try {
|
|
46
|
-
sdkFacadeConfigurationSchema.validate(configuration);
|
|
47
|
-
} catch (violation) {
|
|
48
|
-
throw new Error(`Invalid configuration: ${formatCause(violation)}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export class SdkFacade {
|
|
53
|
-
private readonly sdk: Sdk;
|
|
54
|
-
|
|
55
|
-
private trackerFacade?: TrackerFacade;
|
|
56
|
-
|
|
57
|
-
private userFacade?: UserFacade;
|
|
58
|
-
|
|
59
|
-
private sessionFacade?: SessionFacade;
|
|
60
|
-
|
|
61
|
-
private evaluatorFacade?: EvaluatorFacade;
|
|
62
|
-
|
|
63
|
-
private contentFetcherFacade?: ContentFetcherFacade;
|
|
64
|
-
|
|
65
|
-
private constructor(sdk: Sdk) {
|
|
66
|
-
this.sdk = sdk;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
public static init(configuration: Configuration): SdkFacade {
|
|
70
|
-
validateConfiguration(configuration);
|
|
71
|
-
|
|
72
|
-
const {track = true, userId, token, ...containerConfiguration} = configuration;
|
|
73
|
-
|
|
74
|
-
if (userId !== undefined && token !== undefined) {
|
|
75
|
-
throw new Error('Either the user ID or token can be specified, but not both.');
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const sdk = new SdkFacade(
|
|
79
|
-
Sdk.init({
|
|
80
|
-
...containerConfiguration,
|
|
81
|
-
tokenScope: containerConfiguration.tokenScope ?? 'global',
|
|
82
|
-
debug: containerConfiguration.debug ?? false,
|
|
83
|
-
test: containerConfiguration.test ?? false,
|
|
84
|
-
disableCidMirroring: containerConfiguration.disableCidMirroring ?? false,
|
|
85
|
-
eventProcessor: container => new EventSubjectProcessor(container.getLogger('EventSubjectProcessor')),
|
|
86
|
-
}),
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
if (userId !== undefined) {
|
|
90
|
-
const currentToken = sdk.context.getToken();
|
|
91
|
-
const currentSubject = currentToken?.getSubject() ?? null;
|
|
92
|
-
|
|
93
|
-
if (currentSubject !== userId) {
|
|
94
|
-
if (userId === null) {
|
|
95
|
-
sdk.unsetToken();
|
|
96
|
-
} else {
|
|
97
|
-
sdk.identify(userId);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
} else if (token !== undefined) {
|
|
101
|
-
if (token === null) {
|
|
102
|
-
sdk.unsetToken();
|
|
103
|
-
} else {
|
|
104
|
-
sdk.setToken(Token.parse(token));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (track) {
|
|
109
|
-
sdk.tracker.enable();
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return sdk;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
public get context(): Context {
|
|
116
|
-
return this.sdk.context;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
public get cidAssigner(): CidAssigner {
|
|
120
|
-
return this.sdk.cidAssigner;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
public get previewTokenStore(): TokenStore {
|
|
124
|
-
return this.sdk.previewTokenStore;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
public get userTokenStore(): TokenStore {
|
|
128
|
-
return this.sdk.userTokenStore;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
public get tracker(): TrackerFacade {
|
|
132
|
-
if (this.trackerFacade === undefined) {
|
|
133
|
-
this.trackerFacade = new TrackerFacade(this.sdk.tracker);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return this.trackerFacade;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
public get user(): UserFacade {
|
|
140
|
-
if (this.userFacade === undefined) {
|
|
141
|
-
this.userFacade = new UserFacade(this.context, this.sdk.tracker);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return this.userFacade;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
public get session(): SessionFacade {
|
|
148
|
-
if (this.sessionFacade === undefined) {
|
|
149
|
-
this.sessionFacade = new SessionFacade(this.sdk.tracker);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return this.sessionFacade;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
public get evaluator(): EvaluatorFacade {
|
|
156
|
-
if (this.evaluatorFacade === undefined) {
|
|
157
|
-
this.evaluatorFacade = new EvaluatorFacade({
|
|
158
|
-
evaluator: this.sdk.evaluator,
|
|
159
|
-
contextFactory: new TabContextFactory(this.sdk
|
|
160
|
-
.context
|
|
161
|
-
.getTab()),
|
|
162
|
-
cidAssigner: this.sdk.cidAssigner,
|
|
163
|
-
userTokenProvider: this.sdk.userTokenStore,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return this.evaluatorFacade;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
public get contentFetcher(): ContentFetcherFacade {
|
|
171
|
-
if (this.contentFetcherFacade === undefined) {
|
|
172
|
-
this.contentFetcherFacade = new ContentFetcherFacade({
|
|
173
|
-
contentFetcher: this.sdk.contentFetcher,
|
|
174
|
-
contextFactory: new TabContextFactory(this.sdk
|
|
175
|
-
.context
|
|
176
|
-
.getTab()),
|
|
177
|
-
cidAssigner: this.sdk.cidAssigner,
|
|
178
|
-
previewTokenProvider: this.sdk.previewTokenStore,
|
|
179
|
-
userTokenProvider: this.sdk.userTokenStore,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
return this.contentFetcherFacade;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
public get eventManager(): EventManager<Record<string, Record<string, unknown>>, SdkEventMap> {
|
|
187
|
-
const {eventManager} = this.sdk;
|
|
188
|
-
|
|
189
|
-
return {
|
|
190
|
-
addListener: eventManager.addListener.bind(eventManager),
|
|
191
|
-
removeListener: eventManager.removeListener.bind(eventManager),
|
|
192
|
-
dispatch: (eventName: string, event: Record<string, unknown>): void => {
|
|
193
|
-
if (!/[a-z][a-z_]+\.[a-z][a-z_]+/i.test(eventName)) {
|
|
194
|
-
throw new Error(
|
|
195
|
-
'The event name must be in the form of "namespaced.eventName", where '
|
|
196
|
-
+ 'both the namespace and event name must start with a letter, followed by '
|
|
197
|
-
+ 'any series of letters and underscores.',
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
eventManager.dispatch(eventName, event);
|
|
202
|
-
},
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
public identify(userId: string): void {
|
|
207
|
-
this.setToken(Token.issue(this.sdk.appId, userId));
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
public anonymize(): void {
|
|
211
|
-
if (!this.context.isAnonymous()) {
|
|
212
|
-
this.unsetToken();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
public getToken(): Token|null {
|
|
217
|
-
return this.context.getToken();
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
public setToken(token: Token): void {
|
|
221
|
-
const currentToken = this.getToken();
|
|
222
|
-
|
|
223
|
-
if (currentToken !== null && currentToken.toString() === token.toString()) {
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const currentSubject = currentToken?.getSubject() ?? null;
|
|
228
|
-
const subject = token.getSubject();
|
|
229
|
-
const logger = this.getLogger();
|
|
230
|
-
|
|
231
|
-
if (subject === currentSubject) {
|
|
232
|
-
this.context.setToken(token);
|
|
233
|
-
|
|
234
|
-
logger.debug('Token refreshed');
|
|
235
|
-
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (currentSubject !== null) {
|
|
240
|
-
this.trackInternalEvent({
|
|
241
|
-
type: 'userSignedOut',
|
|
242
|
-
userId: currentSubject,
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
logger.info('User signed out');
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
this.context.setToken(token);
|
|
249
|
-
|
|
250
|
-
if (subject !== null) {
|
|
251
|
-
this.trackInternalEvent({
|
|
252
|
-
type: 'userSignedIn',
|
|
253
|
-
userId: subject,
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
logger.info(`User signed in as ${subject}`);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
logger.debug('New token saved, ');
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
public unsetToken(): void {
|
|
263
|
-
const token = this.getToken();
|
|
264
|
-
|
|
265
|
-
if (token === null) {
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const logger = this.getLogger();
|
|
270
|
-
const subject = token.getSubject();
|
|
271
|
-
|
|
272
|
-
if (subject !== null) {
|
|
273
|
-
this.trackInternalEvent({
|
|
274
|
-
type: 'userSignedOut',
|
|
275
|
-
userId: subject,
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
logger.info('User signed out');
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
this.context.setToken(null);
|
|
282
|
-
|
|
283
|
-
logger.debug('Token removed');
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
private trackInternalEvent(event: PartialTrackingEvent): void {
|
|
287
|
-
this.sdk
|
|
288
|
-
.tracker
|
|
289
|
-
.track(event)
|
|
290
|
-
.catch(() => {
|
|
291
|
-
// suppress error as it is already logged by the tracker
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
public getLogger(...namespace: string[]): Logger {
|
|
296
|
-
return this.sdk.getLogger(...namespace);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
public getTabStorage(namespace: string, ...subnamespace: string[]): Storage {
|
|
300
|
-
return this.sdk.getTabStorage(namespace, ...subnamespace);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
public getBrowserStorage(namespace: string, ...subnamespace: string[]): Storage {
|
|
304
|
-
return this.sdk.getBrowserStorage(namespace, ...subnamespace);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
public close(): Promise<void> {
|
|
308
|
-
return this.sdk.close();
|
|
309
|
-
}
|
|
310
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {Tracker} from '../tracker';
|
|
2
|
-
import {SessionPatch} from './sessionPatch';
|
|
3
|
-
|
|
4
|
-
export class SessionFacade {
|
|
5
|
-
private readonly tracker: Tracker;
|
|
6
|
-
|
|
7
|
-
public constructor(tracker: Tracker) {
|
|
8
|
-
this.tracker = tracker;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
public edit(): SessionPatch {
|
|
12
|
-
return new SessionPatch(this.tracker);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {ActiveRecord} from '../activeRecord';
|
|
2
|
-
import {Tracker} from '../tracker';
|
|
3
|
-
import {SessionAttributesChanged} from '../trackingEvents';
|
|
4
|
-
|
|
5
|
-
export class SessionPatch extends ActiveRecord<SessionAttributesChanged> {
|
|
6
|
-
private readonly tracker: Tracker;
|
|
7
|
-
|
|
8
|
-
public constructor(tracker: Tracker) {
|
|
9
|
-
super();
|
|
10
|
-
|
|
11
|
-
this.tracker = tracker;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public save(): Promise<SessionAttributesChanged> {
|
|
15
|
-
if (!this.isDirty()) {
|
|
16
|
-
// Empty patch
|
|
17
|
-
return Promise.resolve({
|
|
18
|
-
type: 'sessionAttributesChanged',
|
|
19
|
-
patch: {operations: []},
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const promise = this.tracker.track({
|
|
24
|
-
type: 'sessionAttributesChanged',
|
|
25
|
-
patch: this.buildPatch(),
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
this.reset();
|
|
29
|
-
|
|
30
|
-
return promise;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ExternalTrackingEvent as ExternalEvent,
|
|
3
|
-
ExternalTrackingEventPayload as ExternalEventPayload,
|
|
4
|
-
ExternalTrackingEventType as ExternalEventType,
|
|
5
|
-
} from '../trackingEvents';
|
|
6
|
-
import {formatCause} from '../error';
|
|
7
|
-
import {Tracker, EventListener} from '../tracker';
|
|
8
|
-
import {
|
|
9
|
-
cartModified,
|
|
10
|
-
cartViewed,
|
|
11
|
-
checkoutStarted,
|
|
12
|
-
eventOccurred,
|
|
13
|
-
goalCompleted,
|
|
14
|
-
interestShown,
|
|
15
|
-
postViewed,
|
|
16
|
-
orderPlaced,
|
|
17
|
-
productViewed,
|
|
18
|
-
userSignedUp,
|
|
19
|
-
linkOpened,
|
|
20
|
-
} from '../schema';
|
|
21
|
-
|
|
22
|
-
const eventSchemas = {
|
|
23
|
-
cartViewed: cartViewed,
|
|
24
|
-
cartModified: cartModified,
|
|
25
|
-
checkoutStarted: checkoutStarted,
|
|
26
|
-
orderPlaced: orderPlaced,
|
|
27
|
-
productViewed: productViewed,
|
|
28
|
-
userSignedUp: userSignedUp,
|
|
29
|
-
eventOccurred: eventOccurred,
|
|
30
|
-
interestShown: interestShown,
|
|
31
|
-
postViewed: postViewed,
|
|
32
|
-
goalCompleted: goalCompleted,
|
|
33
|
-
linkOpened: linkOpened,
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
type UnknownEvent<T extends ExternalEventType> = Pick<ExternalEvent<T>, 'type'>;
|
|
37
|
-
|
|
38
|
-
function validateEvent<T extends ExternalEventType>(event: UnknownEvent<T>): asserts event is ExternalEvent<T> {
|
|
39
|
-
const {type, ...payload} = event;
|
|
40
|
-
|
|
41
|
-
if (!(type in eventSchemas)) {
|
|
42
|
-
throw new Error(`Unknown event type '${type}'.`);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
eventSchemas[type].validate(payload);
|
|
47
|
-
} catch (violation) {
|
|
48
|
-
throw new Error(`Invalid event payload: ${formatCause(violation)}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function createEvent<T extends ExternalEventType>(type: T, payload: unknown): ExternalEvent<T> {
|
|
53
|
-
if (typeof type !== 'string') {
|
|
54
|
-
throw new Error('The event type must of type string.');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (typeof payload !== 'object' || payload == null) {
|
|
58
|
-
throw new Error('The event payload must of type object.');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const event: UnknownEvent<T> = {type: type, ...payload};
|
|
62
|
-
|
|
63
|
-
validateEvent(event);
|
|
64
|
-
|
|
65
|
-
return event;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export class TrackerFacade {
|
|
69
|
-
private readonly tracker: Tracker;
|
|
70
|
-
|
|
71
|
-
public constructor(tracker: Tracker) {
|
|
72
|
-
this.tracker = tracker;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
public get flushed(): Promise<void> {
|
|
76
|
-
return this.tracker.flushed;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public enable(): void {
|
|
80
|
-
this.tracker.enable();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
public disable(): void {
|
|
84
|
-
this.tracker.disable();
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public addListener(listener: EventListener): void {
|
|
88
|
-
this.tracker.addListener(listener);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
public removeListener(listener: EventListener): void {
|
|
92
|
-
this.tracker.removeListener(listener);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public track<T extends ExternalEventType>(type: T, payload: ExternalEventPayload<T>): Promise<ExternalEvent<T>> {
|
|
96
|
-
return this.tracker.track(createEvent(type, payload));
|
|
97
|
-
}
|
|
98
|
-
}
|
package/src/facade/userFacade.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import {Tracker} from '../tracker';
|
|
2
|
-
import {UserPatch} from './userPatch';
|
|
3
|
-
import {Context} from '../context';
|
|
4
|
-
|
|
5
|
-
export class UserFacade {
|
|
6
|
-
private readonly context: Context;
|
|
7
|
-
|
|
8
|
-
private readonly tracker: Tracker;
|
|
9
|
-
|
|
10
|
-
public constructor(context: Context, tracker: Tracker) {
|
|
11
|
-
this.context = context;
|
|
12
|
-
this.tracker = tracker;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public isIdentified(): boolean {
|
|
16
|
-
return !this.isAnonymous();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public isAnonymous(): boolean {
|
|
20
|
-
return this.context.isAnonymous();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
public edit(): UserPatch {
|
|
24
|
-
return new UserPatch(this.tracker);
|
|
25
|
-
}
|
|
26
|
-
}
|
package/src/facade/userPatch.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {ActiveRecord} from '../activeRecord';
|
|
2
|
-
import {Tracker} from '../tracker';
|
|
3
|
-
import {UserProfileChanged} from '../trackingEvents';
|
|
4
|
-
|
|
5
|
-
export class UserPatch extends ActiveRecord<UserProfileChanged> {
|
|
6
|
-
private readonly tracker: Tracker;
|
|
7
|
-
|
|
8
|
-
public constructor(tracker: Tracker) {
|
|
9
|
-
super();
|
|
10
|
-
|
|
11
|
-
this.tracker = tracker;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public save(): Promise<UserProfileChanged> {
|
|
15
|
-
if (!this.isDirty()) {
|
|
16
|
-
// Empty patch
|
|
17
|
-
return Promise.resolve({
|
|
18
|
-
type: 'userProfileChanged',
|
|
19
|
-
patch: {operations: []},
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const promise = this.tracker.track({
|
|
24
|
-
type: 'userProfileChanged',
|
|
25
|
-
patch: this.buildPatch(),
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
this.reset();
|
|
29
|
-
|
|
30
|
-
return promise;
|
|
31
|
-
}
|
|
32
|
-
}
|
package/src/help.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export namespace Help {
|
|
2
|
-
export function forStatusCode(statusCode: number): string|undefined {
|
|
3
|
-
switch (statusCode) {
|
|
4
|
-
case 401:
|
|
5
|
-
return 'The request was not authorized, most likely due to invalid credentials. '
|
|
6
|
-
+ 'For help, see https://croct.help/sdk/javascript/invalid-credentials';
|
|
7
|
-
|
|
8
|
-
case 403:
|
|
9
|
-
return 'The origin of the request is not allowed in your application settings. '
|
|
10
|
-
+ 'For help, see https://croct.help/sdk/javascript/unauthorized-origin';
|
|
11
|
-
|
|
12
|
-
case 408:
|
|
13
|
-
return 'The request timed out. '
|
|
14
|
-
+ 'For help, see https://croct.help/sdk/javascript/request-timeout';
|
|
15
|
-
|
|
16
|
-
case 423:
|
|
17
|
-
return 'The application has exceeded the monthly active users (MAU) quota. '
|
|
18
|
-
+ 'For help, see https://croct.help/sdk/javascript/mau-exceeded';
|
|
19
|
-
|
|
20
|
-
default:
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console -- This is a logging utility */
|
|
2
|
-
import {Logger} from './logger';
|
|
3
|
-
|
|
4
|
-
type ConsoleMethod = {
|
|
5
|
-
(message?: any, ...optionalParams: any[]): void,
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export class ConsoleLogger implements Logger {
|
|
9
|
-
private readonly namespace?: string;
|
|
10
|
-
|
|
11
|
-
public constructor(namespace?: string) {
|
|
12
|
-
this.namespace = namespace;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public get debug(): (message: string) => void {
|
|
16
|
-
return this.bind(console.debug);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public get info(): (message: string) => void {
|
|
20
|
-
return this.bind(console.info);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
public get warn(): (message: string) => void {
|
|
24
|
-
return this.bind(console.warn);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public get error(): (message: string) => void {
|
|
28
|
-
return this.bind(console.error);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
private bind(method: ConsoleMethod): ConsoleMethod {
|
|
32
|
-
if (this.namespace !== undefined) {
|
|
33
|
-
return method.bind(console, `[${this.namespace}]`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return method.bind(console);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import {Logger} from './logger';
|
|
2
|
-
|
|
3
|
-
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
4
|
-
|
|
5
|
-
export type LogFilter = (level: LogLevel, message: string) => boolean;
|
|
6
|
-
|
|
7
|
-
export type FilteredLoggerConfiguration = {
|
|
8
|
-
logger: Logger,
|
|
9
|
-
allowFilter: LogFilter,
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export class FilteredLogger implements Logger {
|
|
13
|
-
private readonly logger: Logger;
|
|
14
|
-
|
|
15
|
-
private readonly allowFilter: LogFilter;
|
|
16
|
-
|
|
17
|
-
public constructor(configuration: FilteredLoggerConfiguration) {
|
|
18
|
-
this.logger = configuration.logger;
|
|
19
|
-
this.allowFilter = configuration.allowFilter;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public static include(logger: Logger, levels: LogLevel[]): Logger {
|
|
23
|
-
return new FilteredLogger({
|
|
24
|
-
logger: logger,
|
|
25
|
-
allowFilter: (level: LogLevel): boolean => levels.includes(level),
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public static exclude(logger: Logger, levels: LogLevel[]): FilteredLogger {
|
|
30
|
-
return new FilteredLogger({
|
|
31
|
-
logger: logger,
|
|
32
|
-
allowFilter: (level: LogLevel): boolean => !levels.includes(level),
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public debug(message: string): void {
|
|
37
|
-
this.log('debug', message);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
public info(message: string): void {
|
|
41
|
-
this.log('info', message);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
public warn(message: string): void {
|
|
45
|
-
this.log('warn', message);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public error(message: string): void {
|
|
49
|
-
this.log('error', message);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
private log(level: LogLevel, message: string): void {
|
|
53
|
-
if (this.allowFilter(level, message)) {
|
|
54
|
-
this.logger[level](message);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
package/src/logging/index.ts
DELETED
package/src/logging/logger.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {Logger} from './logger';
|
|
2
|
-
|
|
3
|
-
export class NamespacedLogger implements Logger {
|
|
4
|
-
private readonly logger: Logger;
|
|
5
|
-
|
|
6
|
-
private readonly namespace: string;
|
|
7
|
-
|
|
8
|
-
public constructor(logger: Logger, namespace: string) {
|
|
9
|
-
this.logger = logger;
|
|
10
|
-
this.namespace = namespace;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
public debug(message: string): void {
|
|
14
|
-
this.logger.debug(this.format(message));
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public info(message: string): void {
|
|
18
|
-
this.logger.info(this.format(message));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public warn(message: string): void {
|
|
22
|
-
this.logger.warn(this.format(message));
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public error(message: string): void {
|
|
26
|
-
this.logger.error(this.format(message));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
private format(message: string): string {
|
|
30
|
-
return `[${this.namespace}] ${message}`;
|
|
31
|
-
}
|
|
32
|
-
}
|