@croct/sdk 0.16.2 → 0.17.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/cache/cookieCache.d.ts +1 -1
- package/cache/cookieCache.js +12 -2
- package/cache/cookieCache.js.map +1 -1
- package/channel/channel.d.ts +7 -0
- package/channel/channel.js +23 -0
- package/channel/channel.js.map +1 -1
- package/channel/guaranteedChannel.js +4 -3
- package/channel/guaranteedChannel.js.map +1 -1
- package/channel/httpBeaconChannel.d.ts +23 -0
- package/channel/httpBeaconChannel.js +89 -0
- package/channel/httpBeaconChannel.js.map +1 -0
- package/channel/index.d.ts +1 -2
- package/channel/index.js +3 -5
- package/channel/index.js.map +1 -1
- package/channel/queuedChannel.js +5 -4
- package/channel/queuedChannel.js.map +1 -1
- package/channel/retryChannel.js +8 -4
- package/channel/retryChannel.js.map +1 -1
- package/channel/sandboxChannel.js +4 -0
- package/channel/sandboxChannel.js.map +1 -1
- package/constants.d.ts +2 -2
- package/constants.js +1 -1
- package/container.d.ts +3 -0
- package/container.js +15 -14
- package/container.js.map +1 -1
- package/contentFetcher.d.ts +3 -4
- package/contentFetcher.js +37 -27
- package/contentFetcher.js.map +1 -1
- package/evaluator.d.ts +2 -4
- package/evaluator.js +47 -39
- package/evaluator.js.map +1 -1
- package/facade/contentFetcherFacade.d.ts +1 -6
- package/facade/contentFetcherFacade.js +2 -5
- package/facade/contentFetcherFacade.js.map +1 -1
- package/facade/sdkFacade.d.ts +3 -6
- package/facade/sdkFacade.js +3 -7
- package/facade/sdkFacade.js.map +1 -1
- package/help.d.ts +3 -0
- package/help.js +26 -0
- package/help.js.map +1 -0
- package/package.json +1 -3
- package/queue/persistentQueue.d.ts +1 -3
- package/queue/persistentQueue.js +9 -16
- package/queue/persistentQueue.js.map +1 -1
- package/schema/eventSchemas.js +0 -16
- package/schema/eventSchemas.js.map +1 -1
- package/schema/sdkFacadeSchemas.js +5 -1
- package/schema/sdkFacadeSchemas.js.map +1 -1
- package/schema/sdkSchemas.js +7 -0
- package/schema/sdkSchemas.js.map +1 -1
- package/sdk.d.ts +2 -0
- package/sdk.js +1 -2
- package/sdk.js.map +1 -1
- package/src/cache/cookieCache.ts +13 -2
- package/src/channel/channel.ts +32 -0
- package/src/channel/guaranteedChannel.ts +4 -4
- package/src/channel/httpBeaconChannel.ts +128 -0
- package/src/channel/index.ts +1 -2
- package/src/channel/queuedChannel.ts +5 -5
- package/src/channel/retryChannel.ts +9 -5
- package/src/channel/sandboxChannel.ts +5 -1
- package/src/container.ts +17 -19
- package/src/contentFetcher.ts +41 -29
- package/src/evaluator.ts +74 -65
- package/src/facade/contentFetcherFacade.ts +2 -11
- package/src/facade/sdkFacade.ts +5 -14
- package/src/help.ts +24 -0
- package/src/queue/persistentQueue.ts +11 -22
- package/src/schema/eventSchemas.ts +0 -16
- package/src/schema/sdkFacadeSchemas.ts +14 -2
- package/src/schema/sdkSchemas.ts +7 -0
- package/src/sdk.ts +3 -2
- package/src/trackingEvents.ts +0 -4
- package/trackingEvents.d.ts +0 -4
- package/trackingEvents.js.map +1 -1
- package/channel/beaconSocketChannel.d.ts +0 -37
- package/channel/beaconSocketChannel.js +0 -83
- package/channel/beaconSocketChannel.js.map +0 -1
- package/channel/socketChannel.d.ts +0 -31
- package/channel/socketChannel.js +0 -145
- package/channel/socketChannel.js.map +0 -1
- package/src/channel/beaconSocketChannel.ts +0 -153
- package/src/channel/socketChannel.ts +0 -217
package/queue/persistentQueue.js
CHANGED
|
@@ -10,7 +10,7 @@ class PersistentQueue {
|
|
|
10
10
|
return this.queue.slice();
|
|
11
11
|
}
|
|
12
12
|
getCapacity() {
|
|
13
|
-
return
|
|
13
|
+
return Number.MAX_SAFE_INTEGER;
|
|
14
14
|
}
|
|
15
15
|
isEmpty() {
|
|
16
16
|
return this.length() === 0;
|
|
@@ -19,8 +19,7 @@ class PersistentQueue {
|
|
|
19
19
|
return this.queue.length;
|
|
20
20
|
}
|
|
21
21
|
push(value) {
|
|
22
|
-
this.queue
|
|
23
|
-
this.flush();
|
|
22
|
+
this.save([...this.queue, value]);
|
|
24
23
|
}
|
|
25
24
|
peek() {
|
|
26
25
|
const item = this.queue[0];
|
|
@@ -30,24 +29,15 @@ class PersistentQueue {
|
|
|
30
29
|
return item;
|
|
31
30
|
}
|
|
32
31
|
shift() {
|
|
33
|
-
const
|
|
32
|
+
const queue = [...this.queue];
|
|
33
|
+
const value = queue.shift();
|
|
34
34
|
if (value === undefined) {
|
|
35
35
|
throw new Error('The queue is empty.');
|
|
36
36
|
}
|
|
37
|
-
this.
|
|
37
|
+
this.save(queue);
|
|
38
38
|
return value;
|
|
39
39
|
}
|
|
40
40
|
get queue() {
|
|
41
|
-
if (this.cache === undefined) {
|
|
42
|
-
this.cache = this.load();
|
|
43
|
-
}
|
|
44
|
-
return this.cache;
|
|
45
|
-
}
|
|
46
|
-
flush() {
|
|
47
|
-
var _a;
|
|
48
|
-
this.storage.setItem(this.key, JSON.stringify((_a = this.cache) !== null && _a !== void 0 ? _a : []));
|
|
49
|
-
}
|
|
50
|
-
load() {
|
|
51
41
|
const data = this.storage.getItem(this.key);
|
|
52
42
|
if (data === null) {
|
|
53
43
|
return [];
|
|
@@ -55,10 +45,13 @@ class PersistentQueue {
|
|
|
55
45
|
try {
|
|
56
46
|
return JSON.parse(data);
|
|
57
47
|
}
|
|
58
|
-
catch
|
|
48
|
+
catch {
|
|
59
49
|
return [];
|
|
60
50
|
}
|
|
61
51
|
}
|
|
52
|
+
save(data) {
|
|
53
|
+
this.storage.setItem(this.key, JSON.stringify(data));
|
|
54
|
+
}
|
|
62
55
|
}
|
|
63
56
|
exports.PersistentQueue = PersistentQueue;
|
|
64
57
|
//# sourceMappingURL=persistentQueue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentQueue.js","sourceRoot":"","sources":["../src/queue/persistentQueue.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"persistentQueue.js","sourceRoot":"","sources":["../src/queue/persistentQueue.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAKxB,YAAmB,OAAgB,EAAE,GAAG,GAAG,OAAO;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEM,WAAW;QACd,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEM,MAAM;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAEM,IAAI,CAAC,KAAQ;QAChB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;IAEM,IAAI;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK;QACR,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAE5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAY,KAAK;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,IAAS;QAClB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;CACJ;AAtED,0CAsEC"}
|
package/schema/eventSchemas.js
CHANGED
|
@@ -98,22 +98,6 @@ exports.eventOccurred = new validation_1.ObjectType({
|
|
|
98
98
|
minLength: 1,
|
|
99
99
|
maxLength: 50,
|
|
100
100
|
}),
|
|
101
|
-
testId: new validation_1.StringType({
|
|
102
|
-
minLength: 1,
|
|
103
|
-
maxLength: 50,
|
|
104
|
-
}),
|
|
105
|
-
groupId: new validation_1.StringType({
|
|
106
|
-
minLength: 1,
|
|
107
|
-
maxLength: 50,
|
|
108
|
-
}),
|
|
109
|
-
personalizationId: new validation_1.StringType({
|
|
110
|
-
minLength: 1,
|
|
111
|
-
maxLength: 50,
|
|
112
|
-
}),
|
|
113
|
-
audience: new validation_1.StringType({
|
|
114
|
-
minLength: 1,
|
|
115
|
-
maxLength: 50,
|
|
116
|
-
}),
|
|
117
101
|
details: new validation_1.ObjectType({
|
|
118
102
|
additionalProperties: new validation_1.UnionType(new validation_1.NullType(), new validation_1.BooleanType(), new validation_1.NumberType(), new validation_1.StringType({
|
|
119
103
|
maxLength: 300,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventSchemas.js","sourceRoot":"","sources":["../src/schema/eventSchemas.ts"],"names":[],"mappings":";;;AAAA,8CAQuB;AACvB,yDAA+D;AAC/D,6CAA+C;AAC/C,qDAA6C;AAEhC,QAAA,YAAY,GAAG,IAAI,uBAAU,CAAC;IACvC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,uBAAI;KACb;CACJ,CAAC,CAAC;AAEU,QAAA,UAAU,GAAG,IAAI,uBAAU,CAAC;IACrC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,uBAAI;KACb;CACJ,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,IAAI,uBAAU,CAAC;IAC1C,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,uBAAI;QACV,OAAO,EAAE,IAAI,uBAAU,CAAC;YACpB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,EAAE;SAChB,CAAC;KACL;CACJ,CAAC,CAAC;AAEU,QAAA,WAAW,GAAG,IAAI,uBAAU,CAAC;IACtC,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACR,KAAK,EAAE,wBAAK;KACf;CACJ,CAAC,CAAC;AAEU,QAAA,aAAa,GAAG,IAAI,uBAAU,CAAC;IACxC,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,UAAU,EAAE;QACR,OAAO,EAAE,iCAAc;KAC1B;CACJ,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,IAAI,uBAAU,CAAC;IACvC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,UAAU,EAAE;QACR,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,GAAG;SACjB,CAAC;QACF,OAAO,EAAE,8BAAiB;KAC7B;CACJ,CAAC,CAAC;AAEU,QAAA,aAAa,GAAG,IAAI,uBAAU,CAAC;IACxC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,UAAU,EAAE;QACR,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,iCAAiC;SAC7C,CAAC;QACF,KAAK,EAAE,IAAI,uBAAU,CAAC;YAClB,OAAO,EAAE,CAAC;SACb,CAAC;QACF,QAAQ,EAAE,IAAI,uBAAU,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,EAAE;SAChB,CAAC;KACL;CACJ,CAAC,CAAC;AAEU,QAAA,aAAa,GAAG,IAAI,uBAAU,CAAC;IACxC,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,UAAU,EAAE;QACR,SAAS,EAAE,IAAI,sBAAS,CAAC;YACrB,KAAK,EAAE,IAAI,uBAAU,CAAC;gBAClB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,EAAE;aAChB,CAAC;YACF,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;SACf,CAAC;KACL;CACJ,CAAC,CAAC;AAEU,QAAA,UAAU,GAAG,IAAI,uBAAU,CAAC;IACrC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,4BAAW;KACpB;CACJ,CAAC,CAAC;AAEU,QAAA,UAAU,GAAG,IAAI,uBAAU,CAAC;IACrC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,IAAI,uBAAU,EAAE;KACzB;CACJ,CAAC,CAAC;AAEU,QAAA,aAAa,GAAG,IAAI,uBAAU,CAAC;IACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,IAAI,uBAAU,CAAC;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,EAAE;SAChB,CAAC;QACF,
|
|
1
|
+
{"version":3,"file":"eventSchemas.js","sourceRoot":"","sources":["../src/schema/eventSchemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,7 +41,11 @@ exports.sdkFacadeConfigurationSchema = new validation_1.ObjectType({
|
|
|
41
41
|
previewToken: sdkSchemas_1.cookieOptionsSchema,
|
|
42
42
|
},
|
|
43
43
|
}),
|
|
44
|
-
|
|
44
|
+
defaultFetchTimeout: new validation_1.NumberType({
|
|
45
|
+
integer: true,
|
|
46
|
+
minimum: 1,
|
|
47
|
+
}),
|
|
48
|
+
defaultPreferredLocale: new validation_1.StringType({
|
|
45
49
|
pattern: /^[a-z]{2,3}([-_][a-z]{2,3})?$/i,
|
|
46
50
|
}),
|
|
47
51
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkFacadeSchemas.js","sourceRoot":"","sources":["../src/schema/sdkFacadeSchemas.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"sdkFacadeSchemas.js","sourceRoot":"","sources":["../src/schema/sdkFacadeSchemas.ts"],"names":[],"mappings":";;;AAAA,8CAQuB;AACvB,qDAAkD;AAClD,6CAAsE;AACtE,iDAA4C;AAE/B,QAAA,4BAA4B,GAAG,IAAI,uBAAU,CAAC;IACvD,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACR,KAAK,EAAE,IAAI,uBAAU,CAAC;YAClB,MAAM,EAAE,MAAM;SACjB,CAAC;QACF,QAAQ,EAAE,IAAI,uBAAU,CAAC;YACrB,OAAO,EAAE,iBAAiB;SAC7B,CAAC;QACF,UAAU,EAAE,iCAAgB;QAC5B,mBAAmB,EAAE,IAAI,wBAAW,EAAE;QACtC,KAAK,EAAE,IAAI,wBAAW,EAAE;QACxB,IAAI,EAAE,IAAI,wBAAW,EAAE;QACvB,KAAK,EAAE,IAAI,wBAAW,EAAE;QACxB,MAAM,EAAE,2BAAY;QACpB,YAAY,EAAE,IAAI,yBAAY,EAAE;QAChC,aAAa,EAAE,gCAAmB;QAClC,MAAM,EAAE,IAAI,sBAAS,CACjB,IAAI,uBAAU,CAAC;YACX,SAAS,EAAE,CAAC;SACf,CAAC,EACF,IAAI,qBAAQ,EAAE,CACjB;QACD,KAAK,EAAE,IAAI,sBAAS,CAChB,IAAI,uBAAU,CAAC;YACX,OAAO,EAAE,yDAAyD;SACrE,CAAC,EACF,IAAI,qBAAQ,EAAE,CACjB;QACD,eAAe,EAAE,IAAI,uBAAU,CAAC;YAC5B,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,sBAAsB,EAAE,IAAI,uBAAU,CAAC;YACnC,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,UAAU,EAAE;gBACR,QAAQ,EAAE,gCAAmB;gBAC7B,SAAS,EAAE,gCAAmB;gBAC9B,YAAY,EAAE,gCAAmB;aACpC;SACJ,CAAC;QACF,mBAAmB,EAAE,IAAI,uBAAU,CAAC;YAChC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC;SACb,CAAC;QACF,sBAAsB,EAAE,IAAI,uBAAU,CAAC;YACnC,OAAO,EAAE,gCAAgC;SAC5C,CAAC;KACL;CACJ,CAAC,CAAC"}
|
package/schema/sdkSchemas.js
CHANGED
|
@@ -71,6 +71,13 @@ exports.sdkConfigurationSchema = new validation_1.ObjectType({
|
|
|
71
71
|
urlSanitizer: new validation_1.FunctionType(),
|
|
72
72
|
eventMetadata: exports.eventMetadataSchema,
|
|
73
73
|
eventProcessor: new validation_1.FunctionType(),
|
|
74
|
+
defaultFetchTimeout: new validation_1.NumberType({
|
|
75
|
+
integer: true,
|
|
76
|
+
minimum: 1,
|
|
77
|
+
}),
|
|
78
|
+
defaultPreferredLocale: new validation_1.StringType({
|
|
79
|
+
pattern: /^[a-z]{2,3}([-_][a-z]{2,3})?$/i,
|
|
80
|
+
}),
|
|
74
81
|
},
|
|
75
82
|
});
|
|
76
83
|
//# sourceMappingURL=sdkSchemas.js.map
|
package/schema/sdkSchemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkSchemas.js","sourceRoot":"","sources":["../src/schema/sdkSchemas.ts"],"names":[],"mappings":";;;AAAA,8CAA4F;AAC5F,qDAAkD;AAClD,iDAA4C;AAE/B,QAAA,mBAAmB,GAAG,IAAI,uBAAU,CAAC;IAC9C,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,IAAI,uBAAU,CAAC;QAC1B,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,YAAY;KACvB,CAAC;IACF,oBAAoB,EAAE,IAAI,uBAAU,CAAC;QACjC,SAAS,EAAE,GAAG;KACjB,CAAC;CACL,CAAC,CAAC;AAEU,QAAA,mBAAmB,GAAG,IAAI,uBAAU,CAAC;IAC9C,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,IAAI,uBAAU,CAAC;YACjB,SAAS,EAAE,CAAC;SACf,CAAC;QACF,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,SAAS,EAAE,CAAC;SACf,CAAC;QACF,IAAI,EAAE,IAAI,uBAAU,CAAC;YACjB,SAAS,EAAE,CAAC;SACf,CAAC;QACF,MAAM,EAAE,IAAI,wBAAW,EAAE;QACzB,QAAQ,EAAE,IAAI,uBAAU,CAAC;YACrB,WAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;SACzC,CAAC;QACF,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,IAAI;SAChB,CAAC;KACL;CACJ,CAAC,CAAC;AAEU,QAAA,sBAAsB,GAAG,IAAI,uBAAU,CAAC;IACjD,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC;IACzE,UAAU,EAAE;QACR,KAAK,EAAE,IAAI,uBAAU,CAAC;YAClB,MAAM,EAAE,MAAM;SACjB,CAAC;QACF,QAAQ,EAAE,IAAI,uBAAU,CAAC;YACrB,OAAO,EAAE,iBAAiB;SAC7B,CAAC;QACF,UAAU,EAAE,iCAAgB;QAC5B,eAAe,EAAE,IAAI,uBAAU,CAAC;YAC5B,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,sBAAsB,EAAE,IAAI,uBAAU,CAAC;YACnC,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,eAAe,EAAE,IAAI,uBAAU,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,IAAI;SAChB,CAAC;QACF,mBAAmB,EAAE,IAAI,wBAAW,EAAE;QACtC,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,UAAU,EAAE;gBACR,QAAQ,EAAE,2BAAmB;gBAC7B,SAAS,EAAE,2BAAmB;gBAC9B,YAAY,EAAE,2BAAmB;aACpC;SACJ,CAAC;QACF,KAAK,EAAE,IAAI,wBAAW,EAAE;QACxB,IAAI,EAAE,IAAI,wBAAW,EAAE;QACvB,MAAM,EAAE,2BAAY;QACpB,YAAY,EAAE,IAAI,yBAAY,EAAE;QAChC,aAAa,EAAE,2BAAmB;QAClC,cAAc,EAAE,IAAI,yBAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"sdkSchemas.js","sourceRoot":"","sources":["../src/schema/sdkSchemas.ts"],"names":[],"mappings":";;;AAAA,8CAA4F;AAC5F,qDAAkD;AAClD,iDAA4C;AAE/B,QAAA,mBAAmB,GAAG,IAAI,uBAAU,CAAC;IAC9C,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,IAAI,uBAAU,CAAC;QAC1B,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,YAAY;KACvB,CAAC;IACF,oBAAoB,EAAE,IAAI,uBAAU,CAAC;QACjC,SAAS,EAAE,GAAG;KACjB,CAAC;CACL,CAAC,CAAC;AAEU,QAAA,mBAAmB,GAAG,IAAI,uBAAU,CAAC;IAC9C,QAAQ,EAAE,CAAC,MAAM,CAAC;IAClB,UAAU,EAAE;QACR,IAAI,EAAE,IAAI,uBAAU,CAAC;YACjB,SAAS,EAAE,CAAC;SACf,CAAC;QACF,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,SAAS,EAAE,CAAC;SACf,CAAC;QACF,IAAI,EAAE,IAAI,uBAAU,CAAC;YACjB,SAAS,EAAE,CAAC;SACf,CAAC;QACF,MAAM,EAAE,IAAI,wBAAW,EAAE;QACzB,QAAQ,EAAE,IAAI,uBAAU,CAAC;YACrB,WAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;SACzC,CAAC;QACF,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,IAAI;SAChB,CAAC;KACL;CACJ,CAAC,CAAC;AAEU,QAAA,sBAAsB,GAAG,IAAI,uBAAU,CAAC;IACjD,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC;IACzE,UAAU,EAAE;QACR,KAAK,EAAE,IAAI,uBAAU,CAAC;YAClB,MAAM,EAAE,MAAM;SACjB,CAAC;QACF,QAAQ,EAAE,IAAI,uBAAU,CAAC;YACrB,OAAO,EAAE,iBAAiB;SAC7B,CAAC;QACF,UAAU,EAAE,iCAAgB;QAC5B,eAAe,EAAE,IAAI,uBAAU,CAAC;YAC5B,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,sBAAsB,EAAE,IAAI,uBAAU,CAAC;YACnC,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,eAAe,EAAE,IAAI,uBAAU,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,IAAI;SAChB,CAAC;QACF,mBAAmB,EAAE,IAAI,wBAAW,EAAE;QACtC,MAAM,EAAE,IAAI,uBAAU,CAAC;YACnB,UAAU,EAAE;gBACR,QAAQ,EAAE,2BAAmB;gBAC7B,SAAS,EAAE,2BAAmB;gBAC9B,YAAY,EAAE,2BAAmB;aACpC;SACJ,CAAC;QACF,KAAK,EAAE,IAAI,wBAAW,EAAE;QACxB,IAAI,EAAE,IAAI,wBAAW,EAAE;QACvB,MAAM,EAAE,2BAAY;QACpB,YAAY,EAAE,IAAI,yBAAY,EAAE;QAChC,aAAa,EAAE,2BAAmB;QAClC,cAAc,EAAE,IAAI,yBAAY,EAAE;QAClC,mBAAmB,EAAE,IAAI,uBAAU,CAAC;YAChC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC;SACb,CAAC;QACF,sBAAsB,EAAE,IAAI,uBAAU,CAAC;YACnC,OAAO,EAAE,gCAAgC;SAC5C,CAAC;KACL;CACJ,CAAC,CAAC"}
|
package/sdk.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ export type Configuration = {
|
|
|
31
31
|
previewToken?: CookieCacheConfiguration;
|
|
32
32
|
};
|
|
33
33
|
eventProcessor?: DependencyResolver<TrackingEventProcessor>;
|
|
34
|
+
defaultFetchTimeout?: number;
|
|
35
|
+
defaultPreferredLocale?: string;
|
|
34
36
|
};
|
|
35
37
|
export declare class Sdk {
|
|
36
38
|
private container;
|
package/sdk.js
CHANGED
|
@@ -31,12 +31,11 @@ class Sdk {
|
|
|
31
31
|
eventMetadata[`custom_${metadata}`] = customMetadata[metadata];
|
|
32
32
|
}
|
|
33
33
|
const baseHttpEndpoint = baseEndpointUrl.replace(/\/+$/, '');
|
|
34
|
-
const baseWsEndpoint = baseHttpEndpoint.replace(/^http/i, 'ws');
|
|
35
34
|
const container = new container_1.Container({
|
|
36
35
|
...containerConfiguration,
|
|
37
36
|
evaluationBaseEndpointUrl: baseHttpEndpoint,
|
|
38
37
|
contentBaseEndpointUrl: baseHttpEndpoint,
|
|
39
|
-
trackerEndpointUrl: `${
|
|
38
|
+
trackerEndpointUrl: `${baseHttpEndpoint}/client/web/track`,
|
|
40
39
|
cidAssignerEndpointUrl: cidAssignerEndpointUrl !== null && cidAssignerEndpointUrl !== void 0 ? cidAssignerEndpointUrl : `${baseHttpEndpoint}/client/web/cid`,
|
|
41
40
|
beaconQueueSize: (_a = containerConfiguration.beaconQueueSize) !== null && _a !== void 0 ? _a : 100,
|
|
42
41
|
eventMetadata: eventMetadata,
|
package/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["src/sdk.ts"],"names":[],"mappings":";;;AAAA,2CAA0D;AAG1D,2CAAuD;AACvD,qCAAgD;AAChD,mCAAoC;
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["src/sdk.ts"],"names":[],"mappings":"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"}
|
package/src/cache/cookieCache.ts
CHANGED
|
@@ -12,8 +12,19 @@ export type CookieCacheConfiguration = {
|
|
|
12
12
|
export class CookieCache implements Cache {
|
|
13
13
|
private readonly config: CookieCacheConfiguration;
|
|
14
14
|
|
|
15
|
-
public constructor(config: CookieCacheConfiguration) {
|
|
16
|
-
this.config =
|
|
15
|
+
public constructor(config: CookieCacheConfiguration, defaultSecure = window.location.protocol === 'https:') {
|
|
16
|
+
this.config = {
|
|
17
|
+
...config,
|
|
18
|
+
path: config.path ?? '/',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
if (defaultSecure && this.config.secure === undefined) {
|
|
22
|
+
this.config.secure = true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (this.config.secure === true && this.config.sameSite === undefined) {
|
|
26
|
+
this.config.sameSite = 'none';
|
|
27
|
+
}
|
|
17
28
|
}
|
|
18
29
|
|
|
19
30
|
public get(): string | null {
|
package/src/channel/channel.ts
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
import {formatMessage} from '../error';
|
|
2
|
+
|
|
3
|
+
export class MessageDeliveryError extends Error {
|
|
4
|
+
public readonly retryable: boolean;
|
|
5
|
+
|
|
6
|
+
public constructor(message: string, retryable: boolean) {
|
|
7
|
+
super(message);
|
|
8
|
+
|
|
9
|
+
this.retryable = retryable;
|
|
10
|
+
|
|
11
|
+
Object.setPrototypeOf(this, MessageDeliveryError.prototype);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public static retryable(cause: unknown): MessageDeliveryError {
|
|
15
|
+
return MessageDeliveryError.fromCause(cause, true);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public static nonRetryable(cause: unknown): MessageDeliveryError {
|
|
19
|
+
return MessageDeliveryError.fromCause(cause, false);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private static fromCause(cause: unknown, retryable: boolean): MessageDeliveryError {
|
|
23
|
+
const error = new MessageDeliveryError(formatMessage(cause), retryable);
|
|
24
|
+
|
|
25
|
+
if (cause instanceof Error) {
|
|
26
|
+
error.stack = cause.stack;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
1
33
|
export interface Closeable {
|
|
2
34
|
close(): Promise<void>;
|
|
3
35
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {Logger, NullLogger} from '../logging';
|
|
2
|
-
import {DuplexChannel, OutputChannel} from './channel';
|
|
2
|
+
import {DuplexChannel, MessageDeliveryError, OutputChannel} from './channel';
|
|
3
3
|
|
|
4
4
|
export type MessageStamper<M, S> = {
|
|
5
5
|
generate(message: M): S,
|
|
@@ -49,7 +49,7 @@ export class GuaranteedChannel<M, S> implements OutputChannel<M> {
|
|
|
49
49
|
|
|
50
50
|
public publish(message: M): Promise<void> {
|
|
51
51
|
if (this.closed) {
|
|
52
|
-
return Promise.reject(
|
|
52
|
+
return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
return new Promise((resolve, reject): void => {
|
|
@@ -99,7 +99,7 @@ export class GuaranteedChannel<M, S> implements OutputChannel<M> {
|
|
|
99
99
|
() => {
|
|
100
100
|
if (this.closed) {
|
|
101
101
|
// Cancel delay immediately when the channel is closed
|
|
102
|
-
abort(
|
|
102
|
+
abort(MessageDeliveryError.nonRetryable('Connection deliberately closed.'));
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
105
|
0,
|
|
@@ -109,7 +109,7 @@ export class GuaranteedChannel<M, S> implements OutputChannel<M> {
|
|
|
109
109
|
|
|
110
110
|
timeoutTimer = window.setTimeout(
|
|
111
111
|
() => {
|
|
112
|
-
abort(
|
|
112
|
+
abort(MessageDeliveryError.retryable('Maximum confirmation time reached.'));
|
|
113
113
|
},
|
|
114
114
|
this.options.ackTimeout,
|
|
115
115
|
);
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {ChannelListener, DuplexChannel, MessageDeliveryError} from './channel';
|
|
2
|
+
import {Envelope} from './guaranteedChannel';
|
|
3
|
+
import {Logger, NullLogger} from '../logging';
|
|
4
|
+
import {CidAssigner} from '../cid';
|
|
5
|
+
import {formatMessage} from '../error';
|
|
6
|
+
import {CLIENT_LIBRARY} from '../constants';
|
|
7
|
+
import {Help} from '../help';
|
|
8
|
+
|
|
9
|
+
export type Configuration = {
|
|
10
|
+
appId: string,
|
|
11
|
+
endpointUrl: string,
|
|
12
|
+
cidAssigner: CidAssigner,
|
|
13
|
+
logger?: Logger,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type ApiProblem = {
|
|
17
|
+
type: string,
|
|
18
|
+
title: string,
|
|
19
|
+
status: number,
|
|
20
|
+
detail: string,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export class HttpBeaconChannel implements DuplexChannel<string, Envelope<string, string>> {
|
|
24
|
+
private readonly configuration: Omit<Configuration, 'logger'>;
|
|
25
|
+
|
|
26
|
+
private readonly logger: Logger;
|
|
27
|
+
|
|
28
|
+
private readonly listeners: Array<ChannelListener<string>> = [];
|
|
29
|
+
|
|
30
|
+
private closed = false;
|
|
31
|
+
|
|
32
|
+
public constructor({logger = new NullLogger(), ...configuration}: Configuration) {
|
|
33
|
+
this.configuration = configuration;
|
|
34
|
+
this.logger = logger;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public async publish({id: receiptId, message}: Envelope<string, string>): Promise<void> {
|
|
38
|
+
if (this.closed) {
|
|
39
|
+
return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed'));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const {token, timestamp, context, payload} = JSON.parse(message);
|
|
43
|
+
const {endpointUrl, appId, cidAssigner} = this.configuration;
|
|
44
|
+
|
|
45
|
+
return fetch(endpointUrl, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers: {
|
|
48
|
+
'X-App-Id': appId,
|
|
49
|
+
'X-Client-Id': await cidAssigner.assignCid(),
|
|
50
|
+
'X-Client-Library': CLIENT_LIBRARY,
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
...(token !== undefined ? {'X-Token': token} : {}),
|
|
53
|
+
},
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
context: context,
|
|
56
|
+
payload: payload,
|
|
57
|
+
originalTime: timestamp,
|
|
58
|
+
departureTime: Date.now(),
|
|
59
|
+
}),
|
|
60
|
+
}).then(async response => {
|
|
61
|
+
if (response.ok) {
|
|
62
|
+
this.notify(receiptId);
|
|
63
|
+
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const problem: ApiProblem = await response.json().catch(
|
|
68
|
+
() => ({
|
|
69
|
+
type: 'https://croct.help/api/event-tracker#unexpected-error',
|
|
70
|
+
title: response.statusText,
|
|
71
|
+
status: response.status,
|
|
72
|
+
}),
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const isRetryable = HttpBeaconChannel.isRetryable(problem.status);
|
|
76
|
+
const help = Help.forStatusCode(problem.status);
|
|
77
|
+
|
|
78
|
+
if (help !== undefined) {
|
|
79
|
+
this.logger.error(help);
|
|
80
|
+
} else if (!isRetryable) {
|
|
81
|
+
this.logger.error(`Beacon rejected with non-retryable status: ${problem.title}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return Promise.reject(
|
|
85
|
+
isRetryable
|
|
86
|
+
? MessageDeliveryError.retryable(problem.title)
|
|
87
|
+
: MessageDeliveryError.nonRetryable(problem.title),
|
|
88
|
+
);
|
|
89
|
+
}).catch(error => {
|
|
90
|
+
this.logger.error(`Failed to publish beacon: ${formatMessage(error)}`);
|
|
91
|
+
|
|
92
|
+
return Promise.reject(
|
|
93
|
+
error instanceof MessageDeliveryError
|
|
94
|
+
? error
|
|
95
|
+
: MessageDeliveryError.retryable(error),
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public subscribe(listener: ChannelListener<string>): void {
|
|
101
|
+
if (!this.listeners.includes(listener)) {
|
|
102
|
+
this.listeners.push(listener);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public unsubscribe(listener: ChannelListener<string>): void {
|
|
107
|
+
const index = this.listeners.indexOf(listener);
|
|
108
|
+
|
|
109
|
+
if (index >= 0) {
|
|
110
|
+
this.listeners.splice(index, 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private notify(receiptId: string): void {
|
|
115
|
+
this.listeners.forEach(dispatch => dispatch(receiptId));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public close(): Promise<void> {
|
|
119
|
+
this.closed = true;
|
|
120
|
+
|
|
121
|
+
return Promise.resolve();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private static isRetryable(status: number): boolean {
|
|
125
|
+
// Retry on any server error and client errors 429 (rate limit) and 408 (request timeout)
|
|
126
|
+
return status >= 500 || status === 429 || status === 408;
|
|
127
|
+
}
|
|
128
|
+
}
|
package/src/channel/index.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export * from './channel';
|
|
2
|
-
export {BeaconSocketChannel, DuplexChannelFactory} from './beaconSocketChannel';
|
|
3
2
|
export {EncodedChannel} from './encodedChannel';
|
|
4
3
|
export {GuaranteedChannel} from './guaranteedChannel';
|
|
5
4
|
export {QueuedChannel} from './queuedChannel';
|
|
6
5
|
export {RetryChannel} from './retryChannel';
|
|
7
6
|
export {SandboxChannel} from './sandboxChannel';
|
|
8
|
-
export {
|
|
7
|
+
export {HttpBeaconChannel} from './httpBeaconChannel';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {OutputChannel} from './channel';
|
|
1
|
+
import {MessageDeliveryError, OutputChannel} from './channel';
|
|
2
2
|
import {Queue} from '../queue';
|
|
3
3
|
import {Logger, NullLogger} from '../logging';
|
|
4
4
|
|
|
@@ -29,19 +29,19 @@ export class QueuedChannel<T> implements OutputChannel<T> {
|
|
|
29
29
|
|
|
30
30
|
public publish(message: T): Promise<void> {
|
|
31
31
|
if (this.closed) {
|
|
32
|
-
return Promise.reject(
|
|
32
|
+
return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
if (this.queue.length() >= this.queue.getCapacity()) {
|
|
36
36
|
this.logger.warn('The queue is full, message rejected.');
|
|
37
37
|
|
|
38
|
-
return Promise.reject(
|
|
38
|
+
return Promise.reject(MessageDeliveryError.retryable('The queue is full.'));
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
if (this.pending === undefined) {
|
|
42
42
|
this.pending = this.queue.isEmpty()
|
|
43
43
|
? Promise.resolve()
|
|
44
|
-
: Promise.reject(
|
|
44
|
+
: Promise.reject(MessageDeliveryError.retryable('The queue must be flushed.'));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
this.enqueue(message);
|
|
@@ -71,7 +71,7 @@ export class QueuedChannel<T> implements OutputChannel<T> {
|
|
|
71
71
|
|
|
72
72
|
private requeue(): Promise<void> {
|
|
73
73
|
if (this.closed) {
|
|
74
|
-
return Promise.reject(
|
|
74
|
+
return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
this.pending = Promise.resolve();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {OutputChannel} from './channel';
|
|
1
|
+
import {MessageDeliveryError, OutputChannel} from './channel';
|
|
2
2
|
import {Logger, NullLogger} from '../logging';
|
|
3
3
|
import {RetryPolicy} from '../retry';
|
|
4
4
|
|
|
@@ -25,7 +25,7 @@ export class RetryChannel<T> implements OutputChannel<T> {
|
|
|
25
25
|
|
|
26
26
|
public publish(message: T): Promise<void> {
|
|
27
27
|
if (this.closed) {
|
|
28
|
-
return Promise.reject(
|
|
28
|
+
return Promise.reject(MessageDeliveryError.nonRetryable('The channel is closed.'));
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
return this.channel
|
|
@@ -34,11 +34,15 @@ export class RetryChannel<T> implements OutputChannel<T> {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
public async retry(message: T, error: unknown): Promise<void> {
|
|
37
|
+
if (error instanceof MessageDeliveryError && !error.retryable) {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
|
|
37
41
|
let attempt = 0;
|
|
38
42
|
|
|
39
43
|
while (this.retryPolicy.shouldRetry(attempt, message, error)) {
|
|
40
44
|
if (this.closed) {
|
|
41
|
-
throw
|
|
45
|
+
throw MessageDeliveryError.nonRetryable('Connection deliberately closed.');
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
const delay = this.retryPolicy.getDelay(attempt);
|
|
@@ -55,7 +59,7 @@ export class RetryChannel<T> implements OutputChannel<T> {
|
|
|
55
59
|
// Cancel delay immediately when the channel is closed
|
|
56
60
|
window.clearInterval(closeWatcher);
|
|
57
61
|
|
|
58
|
-
reject(
|
|
62
|
+
reject(MessageDeliveryError.nonRetryable('Connection deliberately closed.'));
|
|
59
63
|
}
|
|
60
64
|
},
|
|
61
65
|
0,
|
|
@@ -79,7 +83,7 @@ export class RetryChannel<T> implements OutputChannel<T> {
|
|
|
79
83
|
}
|
|
80
84
|
}
|
|
81
85
|
|
|
82
|
-
throw
|
|
86
|
+
throw MessageDeliveryError.nonRetryable('Maximum retry attempts reached.');
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
public close(): Promise<void> {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {ChannelListener, DuplexChannel} from './channel';
|
|
1
|
+
import {ChannelListener, DuplexChannel, MessageDeliveryError} from './channel';
|
|
2
2
|
|
|
3
3
|
export class SandboxChannel<I, O> implements DuplexChannel<I, O> {
|
|
4
4
|
private readonly listeners: Array<ChannelListener<I>> = [];
|
|
@@ -8,6 +8,10 @@ export class SandboxChannel<I, O> implements DuplexChannel<I, O> {
|
|
|
8
8
|
private closed = false;
|
|
9
9
|
|
|
10
10
|
public publish(message: O): Promise<void> {
|
|
11
|
+
if (this.closed) {
|
|
12
|
+
return Promise.reject(MessageDeliveryError.nonRetryable('Channel is closed.'));
|
|
13
|
+
}
|
|
14
|
+
|
|
11
15
|
this.messages.push(message);
|
|
12
16
|
|
|
13
17
|
return Promise.resolve();
|
package/src/container.ts
CHANGED
|
@@ -20,13 +20,12 @@ import {
|
|
|
20
20
|
RetryChannel,
|
|
21
21
|
GuaranteedChannel,
|
|
22
22
|
EncodedChannel,
|
|
23
|
-
BeaconSocketChannel,
|
|
24
|
-
SocketChannel,
|
|
25
23
|
SandboxChannel,
|
|
26
24
|
} from './channel';
|
|
27
25
|
import {ContentFetcher} from './contentFetcher';
|
|
28
26
|
import {CookieCache, CookieCacheConfiguration} from './cache/cookieCache';
|
|
29
27
|
import {FilteredLogger} from './logging/filteredLogger';
|
|
28
|
+
import {HttpBeaconChannel} from './channel/httpBeaconChannel';
|
|
30
29
|
|
|
31
30
|
export type DependencyResolver<T> = (container: Container) => T;
|
|
32
31
|
|
|
@@ -51,9 +50,13 @@ export type Configuration = {
|
|
|
51
50
|
},
|
|
52
51
|
eventMetadata?: {[key: string]: string},
|
|
53
52
|
eventProcessor?: DependencyResolver<TrackingEventProcessor>,
|
|
53
|
+
defaultFetchTimeout?: number,
|
|
54
|
+
defaultPreferredLocale?: string,
|
|
54
55
|
};
|
|
55
56
|
|
|
56
57
|
export class Container {
|
|
58
|
+
public static readonly DEFAULT_FETCH_TIMEOUT = 5_000; // 5 seconds
|
|
59
|
+
|
|
57
60
|
private readonly configuration: Configuration;
|
|
58
61
|
|
|
59
62
|
private context?: Context;
|
|
@@ -99,6 +102,7 @@ export class Container {
|
|
|
99
102
|
appId: this.configuration.appId,
|
|
100
103
|
baseEndpointUrl: this.configuration.evaluationBaseEndpointUrl,
|
|
101
104
|
logger: this.getLogger('Evaluator'),
|
|
105
|
+
defaultTimeout: this.configuration.defaultFetchTimeout ?? Container.DEFAULT_FETCH_TIMEOUT,
|
|
102
106
|
});
|
|
103
107
|
}
|
|
104
108
|
|
|
@@ -115,6 +119,8 @@ export class Container {
|
|
|
115
119
|
appId: this.configuration.appId,
|
|
116
120
|
baseEndpointUrl: this.configuration.contentBaseEndpointUrl,
|
|
117
121
|
logger: this.getLogger('ContentFetcher'),
|
|
122
|
+
defaultTimeout: this.configuration.defaultFetchTimeout ?? Container.DEFAULT_FETCH_TIMEOUT,
|
|
123
|
+
defaultPreferredLocale: this.configuration.defaultPreferredLocale,
|
|
118
124
|
});
|
|
119
125
|
}
|
|
120
126
|
|
|
@@ -226,23 +232,18 @@ export class Container {
|
|
|
226
232
|
const queuedChannel = new QueuedChannel(
|
|
227
233
|
new RetryChannel({
|
|
228
234
|
channel: new GuaranteedChannel({
|
|
229
|
-
channel: new
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
loggerFactory: this.getLogger.bind(this),
|
|
233
|
-
logger: channelLogger,
|
|
234
|
-
channelFactory: (url, logger): SocketChannel<any, any> => (
|
|
235
|
-
new SocketChannel({url: url, logger: logger})
|
|
236
|
-
),
|
|
235
|
+
channel: new HttpBeaconChannel({
|
|
236
|
+
appId: appId,
|
|
237
|
+
endpointUrl: trackerEndpointUrl,
|
|
237
238
|
cidAssigner: this.getCidAssigner(),
|
|
238
|
-
|
|
239
|
+
logger: channelLogger,
|
|
239
240
|
}),
|
|
240
241
|
stamper: new TimeStamper(),
|
|
241
242
|
ackTimeout: 10000,
|
|
242
243
|
logger: channelLogger,
|
|
243
244
|
}),
|
|
244
245
|
retryPolicy: new BackoffPolicy({
|
|
245
|
-
minRetryDelay:
|
|
246
|
+
minRetryDelay: 3000, // 3 seconds
|
|
246
247
|
maxRetryDelay: 60 * 1000, // 60 seconds
|
|
247
248
|
backoffFactor: 1.5, // 1.5 ^ attempt
|
|
248
249
|
backoffJitter: 1, // add randomness
|
|
@@ -300,12 +301,9 @@ export class Container {
|
|
|
300
301
|
}
|
|
301
302
|
|
|
302
303
|
private createBeaconQueue(): MonitoredQueue<string> {
|
|
303
|
-
const context = this.getContext();
|
|
304
|
-
const tab = context.getTab();
|
|
305
|
-
|
|
306
304
|
return new MonitoredQueue<string>(
|
|
307
305
|
new CapacityRestrictedQueue(
|
|
308
|
-
new PersistentQueue(this.getGlobalTabStorage('queue')
|
|
306
|
+
new PersistentQueue(this.getGlobalTabStorage('queue')),
|
|
309
307
|
this.configuration.beaconQueueSize,
|
|
310
308
|
),
|
|
311
309
|
this.getLogger('BeaconQueue'),
|
|
@@ -349,9 +347,9 @@ export class Container {
|
|
|
349
347
|
}
|
|
350
348
|
|
|
351
349
|
private resolveStorageNamespace(namespace: string, ...subnamespace: string[]): string {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
350
|
+
const {appId} = this.configuration;
|
|
351
|
+
|
|
352
|
+
return `croct[${appId.toLowerCase()}].${[namespace].concat(subnamespace).join('.')}`;
|
|
355
353
|
}
|
|
356
354
|
|
|
357
355
|
private getLocalStorage(): Storage {
|