@croct/sdk 0.16.1 → 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.
Files changed (94) hide show
  1. package/base64Url.js +2 -3
  2. package/base64Url.js.map +1 -1
  3. package/cache/cookieCache.d.ts +1 -1
  4. package/cache/cookieCache.js +12 -2
  5. package/cache/cookieCache.js.map +1 -1
  6. package/channel/channel.d.ts +7 -0
  7. package/channel/channel.js +23 -0
  8. package/channel/channel.js.map +1 -1
  9. package/channel/guaranteedChannel.js +4 -3
  10. package/channel/guaranteedChannel.js.map +1 -1
  11. package/channel/httpBeaconChannel.d.ts +23 -0
  12. package/channel/httpBeaconChannel.js +89 -0
  13. package/channel/httpBeaconChannel.js.map +1 -0
  14. package/channel/index.d.ts +1 -2
  15. package/channel/index.js +3 -5
  16. package/channel/index.js.map +1 -1
  17. package/channel/queuedChannel.js +5 -4
  18. package/channel/queuedChannel.js.map +1 -1
  19. package/channel/retryChannel.js +8 -4
  20. package/channel/retryChannel.js.map +1 -1
  21. package/channel/sandboxChannel.js +4 -0
  22. package/channel/sandboxChannel.js.map +1 -1
  23. package/constants.d.ts +2 -2
  24. package/constants.js +1 -1
  25. package/container.d.ts +3 -0
  26. package/container.js +15 -14
  27. package/container.js.map +1 -1
  28. package/contentFetcher.d.ts +3 -4
  29. package/contentFetcher.js +44 -27
  30. package/contentFetcher.js.map +1 -1
  31. package/error.js +2 -3
  32. package/error.js.map +1 -1
  33. package/evaluator.d.ts +2 -4
  34. package/evaluator.js +54 -39
  35. package/evaluator.js.map +1 -1
  36. package/facade/contentFetcherFacade.d.ts +1 -6
  37. package/facade/contentFetcherFacade.js +2 -5
  38. package/facade/contentFetcherFacade.js.map +1 -1
  39. package/facade/sdkFacade.d.ts +3 -6
  40. package/facade/sdkFacade.js +3 -7
  41. package/facade/sdkFacade.js.map +1 -1
  42. package/help.d.ts +3 -0
  43. package/help.js +26 -0
  44. package/help.js.map +1 -0
  45. package/package.json +1 -3
  46. package/queue/persistentQueue.d.ts +1 -3
  47. package/queue/persistentQueue.js +9 -16
  48. package/queue/persistentQueue.js.map +1 -1
  49. package/schema/eventSchemas.js +0 -16
  50. package/schema/eventSchemas.js.map +1 -1
  51. package/schema/sdkFacadeSchemas.js +5 -1
  52. package/schema/sdkFacadeSchemas.js.map +1 -1
  53. package/schema/sdkSchemas.js +7 -0
  54. package/schema/sdkSchemas.js.map +1 -1
  55. package/sdk.d.ts +2 -0
  56. package/sdk.js +1 -2
  57. package/sdk.js.map +1 -1
  58. package/sourceLocation.js +3 -4
  59. package/sourceLocation.js.map +1 -1
  60. package/src/cache/cookieCache.ts +13 -2
  61. package/src/channel/channel.ts +32 -0
  62. package/src/channel/guaranteedChannel.ts +4 -4
  63. package/src/channel/httpBeaconChannel.ts +128 -0
  64. package/src/channel/index.ts +1 -2
  65. package/src/channel/queuedChannel.ts +5 -5
  66. package/src/channel/retryChannel.ts +9 -5
  67. package/src/channel/sandboxChannel.ts +5 -1
  68. package/src/container.ts +17 -19
  69. package/src/contentFetcher.ts +48 -29
  70. package/src/evaluator.ts +81 -65
  71. package/src/facade/contentFetcherFacade.ts +2 -11
  72. package/src/facade/sdkFacade.ts +5 -14
  73. package/src/help.ts +24 -0
  74. package/src/queue/persistentQueue.ts +11 -22
  75. package/src/schema/eventSchemas.ts +0 -16
  76. package/src/schema/sdkFacadeSchemas.ts +14 -2
  77. package/src/schema/sdkSchemas.ts +7 -0
  78. package/src/sdk.ts +3 -2
  79. package/src/trackingEvents.ts +0 -4
  80. package/trackingEvents.d.ts +0 -4
  81. package/trackingEvents.js +3 -3
  82. package/trackingEvents.js.map +1 -1
  83. package/uuid.js +1 -2
  84. package/uuid.js.map +1 -1
  85. package/validation/violation.js +2 -3
  86. package/validation/violation.js.map +1 -1
  87. package/channel/beaconSocketChannel.d.ts +0 -37
  88. package/channel/beaconSocketChannel.js +0 -83
  89. package/channel/beaconSocketChannel.js.map +0 -1
  90. package/channel/socketChannel.d.ts +0 -31
  91. package/channel/socketChannel.js +0 -145
  92. package/channel/socketChannel.js.map +0 -1
  93. package/src/channel/beaconSocketChannel.ts +0 -153
  94. package/src/channel/socketChannel.ts +0 -217
@@ -1,8 +1,6 @@
1
1
  import {Queue} from './queue';
2
2
 
3
3
  export class PersistentQueue<T> implements Queue<T> {
4
- private cache: T[];
5
-
6
4
  private readonly storage: Storage;
7
5
 
8
6
  private readonly key: string;
@@ -17,7 +15,7 @@ export class PersistentQueue<T> implements Queue<T> {
17
15
  }
18
16
 
19
17
  public getCapacity(): number {
20
- return Infinity;
18
+ return Number.MAX_SAFE_INTEGER;
21
19
  }
22
20
 
23
21
  public isEmpty(): boolean {
@@ -29,9 +27,7 @@ export class PersistentQueue<T> implements Queue<T> {
29
27
  }
30
28
 
31
29
  public push(value: T): void {
32
- this.queue.push(value);
33
-
34
- this.flush();
30
+ this.save([...this.queue, value]);
35
31
  }
36
32
 
37
33
  public peek(): T | null {
@@ -45,30 +41,19 @@ export class PersistentQueue<T> implements Queue<T> {
45
41
  }
46
42
 
47
43
  public shift(): T {
48
- const value = this.queue.shift();
44
+ const queue = [...this.queue];
45
+ const value = queue.shift();
49
46
 
50
47
  if (value === undefined) {
51
48
  throw new Error('The queue is empty.');
52
49
  }
53
50
 
54
- this.flush();
51
+ this.save(queue);
55
52
 
56
53
  return value;
57
54
  }
58
55
 
59
- private get queue(): T[] {
60
- if (this.cache === undefined) {
61
- this.cache = this.load();
62
- }
63
-
64
- return this.cache;
65
- }
66
-
67
- private flush(): void {
68
- this.storage.setItem(this.key, JSON.stringify(this.cache ?? []));
69
- }
70
-
71
- private load(): T[] {
56
+ private get queue(): readonly T[] {
72
57
  const data = this.storage.getItem(this.key);
73
58
 
74
59
  if (data === null) {
@@ -77,8 +62,12 @@ export class PersistentQueue<T> implements Queue<T> {
77
62
 
78
63
  try {
79
64
  return JSON.parse(data);
80
- } catch (error) {
65
+ } catch {
81
66
  return [];
82
67
  }
83
68
  }
69
+
70
+ private save(data: T[]): void {
71
+ this.storage.setItem(this.key, JSON.stringify(data));
72
+ }
84
73
  }
@@ -114,22 +114,6 @@ export const eventOccurred = new ObjectType({
114
114
  minLength: 1,
115
115
  maxLength: 50,
116
116
  }),
117
- testId: new StringType({
118
- minLength: 1,
119
- maxLength: 50,
120
- }),
121
- groupId: new StringType({
122
- minLength: 1,
123
- maxLength: 50,
124
- }),
125
- personalizationId: new StringType({
126
- minLength: 1,
127
- maxLength: 50,
128
- }),
129
- audience: new StringType({
130
- minLength: 1,
131
- maxLength: 50,
132
- }),
133
117
  details: new ObjectType({
134
118
  additionalProperties: new UnionType(
135
119
  new NullType(),
@@ -1,4 +1,12 @@
1
- import {ObjectType, StringType, BooleanType, UnionType, NullType, FunctionType} from '../validation';
1
+ import {
2
+ ObjectType,
3
+ StringType,
4
+ BooleanType,
5
+ UnionType,
6
+ NullType,
7
+ FunctionType,
8
+ NumberType,
9
+ } from '../validation';
2
10
  import {tokenScopeSchema} from './contextSchemas';
3
11
  import {cookieOptionsSchema, eventMetadataSchema} from './sdkSchemas';
4
12
  import {loggerSchema} from './loggerSchema';
@@ -45,7 +53,11 @@ export const sdkFacadeConfigurationSchema = new ObjectType({
45
53
  previewToken: cookieOptionsSchema,
46
54
  },
47
55
  }),
48
- preferredLocale: new StringType({
56
+ defaultFetchTimeout: new NumberType({
57
+ integer: true,
58
+ minimum: 1,
59
+ }),
60
+ defaultPreferredLocale: new StringType({
49
61
  pattern: /^[a-z]{2,3}([-_][a-z]{2,3})?$/i,
50
62
  }),
51
63
  },
@@ -71,5 +71,12 @@ export const sdkConfigurationSchema = new ObjectType({
71
71
  urlSanitizer: new FunctionType(),
72
72
  eventMetadata: eventMetadataSchema,
73
73
  eventProcessor: new FunctionType(),
74
+ defaultFetchTimeout: new NumberType({
75
+ integer: true,
76
+ minimum: 1,
77
+ }),
78
+ defaultPreferredLocale: new StringType({
79
+ pattern: /^[a-z]{2,3}([-_][a-z]{2,3})?$/i,
80
+ }),
74
81
  },
75
82
  });
package/src/sdk.ts CHANGED
@@ -33,6 +33,8 @@ export type Configuration = {
33
33
  previewToken?: CookieCacheConfiguration,
34
34
  },
35
35
  eventProcessor?: DependencyResolver<TrackingEventProcessor>,
36
+ defaultFetchTimeout?: number,
37
+ defaultPreferredLocale?: string,
36
38
  };
37
39
 
38
40
  function validateConfiguration(configuration: unknown): asserts configuration is Configuration {
@@ -75,13 +77,12 @@ export class Sdk {
75
77
  }
76
78
 
77
79
  const baseHttpEndpoint = baseEndpointUrl.replace(/\/+$/, '');
78
- const baseWsEndpoint = baseHttpEndpoint.replace(/^http/i, 'ws');
79
80
 
80
81
  const container = new Container({
81
82
  ...containerConfiguration,
82
83
  evaluationBaseEndpointUrl: baseHttpEndpoint,
83
84
  contentBaseEndpointUrl: baseHttpEndpoint,
84
- trackerEndpointUrl: `${baseWsEndpoint}/client/web/connect`,
85
+ trackerEndpointUrl: `${baseHttpEndpoint}/client/web/track`,
85
86
  cidAssignerEndpointUrl: cidAssignerEndpointUrl ?? `${baseHttpEndpoint}/client/web/cid`,
86
87
  beaconQueueSize: containerConfiguration.beaconQueueSize ?? 100,
87
88
  eventMetadata: eventMetadata,
@@ -325,10 +325,6 @@ export interface PostViewed extends BaseEvent {
325
325
  export interface EventOccurred extends BaseEvent {
326
326
  type: 'eventOccurred';
327
327
  name: string;
328
- testId?: string;
329
- groupId?: string;
330
- personalizationId?: string;
331
- audience?: string;
332
328
  details?: {[key: string]: string|number|boolean|null};
333
329
  }
334
330
 
@@ -227,10 +227,6 @@ export interface PostViewed extends BaseEvent {
227
227
  export interface EventOccurred extends BaseEvent {
228
228
  type: 'eventOccurred';
229
229
  name: string;
230
- testId?: string;
231
- groupId?: string;
232
- personalizationId?: string;
233
- audience?: string;
234
230
  details?: {
235
231
  [key: string]: string | number | boolean | null;
236
232
  };
package/trackingEvents.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isCartPartialEvent = exports.isIdentifiedUserEvent = exports.eventTypes = exports.miscEventTypes = exports.userEventTypes = exports.identifiedUserEventTypes = exports.ecommerceEventTypes = exports.cartEventTypes = exports.tabEventTypes = exports.pageEventTypes = void 0;
3
+ exports.eventTypes = exports.miscEventTypes = exports.userEventTypes = exports.identifiedUserEventTypes = exports.ecommerceEventTypes = exports.cartEventTypes = exports.tabEventTypes = exports.pageEventTypes = void 0;
4
+ exports.isIdentifiedUserEvent = isIdentifiedUserEvent;
5
+ exports.isCartPartialEvent = isCartPartialEvent;
4
6
  /*
5
7
  * Events
6
8
  */
@@ -53,9 +55,7 @@ exports.eventTypes = [
53
55
  function isIdentifiedUserEvent(event) {
54
56
  return exports.identifiedUserEventTypes.includes(event.type);
55
57
  }
56
- exports.isIdentifiedUserEvent = isIdentifiedUserEvent;
57
58
  function isCartPartialEvent(event) {
58
59
  return exports.cartEventTypes.includes(event.type);
59
60
  }
60
- exports.isCartPartialEvent = isCartPartialEvent;
61
61
  //# sourceMappingURL=trackingEvents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trackingEvents.js","sourceRoot":"","sources":["src/trackingEvents.ts"],"names":[],"mappings":";;;AAuEA;;GAEG;AAEU,QAAA,cAAc,GAAG;IAC1B,YAAY;IACZ,YAAY;CACN,CAAC;AAEE,QAAA,aAAa,GAAG;IACzB,WAAW;IACX,eAAe;IACf,sBAAsB;CAChB,CAAC;AAEE,QAAA,cAAc,GAAG;IAC1B,cAAc;IACd,YAAY;IACZ,iBAAiB;CACX,CAAC;AAEE,QAAA,mBAAmB,GAAG;IAC/B,GAAG,sBAAc;IACjB,aAAa;IACb,eAAe;CACT,CAAC;AAEE,QAAA,wBAAwB,GAAG;IACpC,cAAc;IACd,eAAe;IACf,cAAc;CACjB,CAAC;AAEW,QAAA,cAAc,GAAG;IAC1B,GAAG,gCAAwB;IAC3B,oBAAoB;CACd,CAAC;AAEE,QAAA,cAAc,GAAG;IAC1B,gBAAgB;IAChB,0BAA0B;IAC1B,eAAe;IACf,eAAe;IACf,YAAY;IACZ,eAAe;IACf,YAAY;CACN,CAAC;AAEE,QAAA,UAAU,GAAG;IACtB,GAAG,sBAAc;IACjB,GAAG,2BAAmB;IACtB,GAAG,sBAAc;IACjB,GAAG,sBAAc;CACX,CAAC;AAsSX;;GAEG;AAEH,SAAgB,qBAAqB,CAAC,KAAoB;IACtD,OAAO,gCAAwB,CAAC,QAAQ,CAAE,KAA6B,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC;AAFD,sDAEC;AAED,SAAgB,kBAAkB,CAAC,KAA2B;IAC1D,OAAO,sBAAc,CAAC,QAAQ,CAAE,KAAmB,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAFD,gDAEC"}
1
+ {"version":3,"file":"trackingEvents.js","sourceRoot":"","sources":["src/trackingEvents.ts"],"names":[],"mappings":";;;AAkaA,sDAEC;AAED,gDAEC;AAjWD;;GAEG;AAEU,QAAA,cAAc,GAAG;IAC1B,YAAY;IACZ,YAAY;CACN,CAAC;AAEE,QAAA,aAAa,GAAG;IACzB,WAAW;IACX,eAAe;IACf,sBAAsB;CAChB,CAAC;AAEE,QAAA,cAAc,GAAG;IAC1B,cAAc;IACd,YAAY;IACZ,iBAAiB;CACX,CAAC;AAEE,QAAA,mBAAmB,GAAG;IAC/B,GAAG,sBAAc;IACjB,aAAa;IACb,eAAe;CACT,CAAC;AAEE,QAAA,wBAAwB,GAAG;IACpC,cAAc;IACd,eAAe;IACf,cAAc;CACjB,CAAC;AAEW,QAAA,cAAc,GAAG;IAC1B,GAAG,gCAAwB;IAC3B,oBAAoB;CACd,CAAC;AAEE,QAAA,cAAc,GAAG;IAC1B,gBAAgB;IAChB,0BAA0B;IAC1B,eAAe;IACf,eAAe;IACf,YAAY;IACZ,eAAe;IACf,YAAY;CACN,CAAC;AAEE,QAAA,UAAU,GAAG;IACtB,GAAG,sBAAc;IACjB,GAAG,2BAAmB;IACtB,GAAG,sBAAc;IACjB,GAAG,sBAAc;CACX,CAAC;AAkSX;;GAEG;AAEH,SAAgB,qBAAqB,CAAC,KAAoB;IACtD,OAAO,gCAAwB,CAAC,QAAQ,CAAE,KAA6B,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAA2B;IAC1D,OAAO,sBAAc,CAAC,QAAQ,CAAE,KAAmB,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
package/uuid.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uuid4 = void 0;
3
+ exports.uuid4 = uuid4;
4
4
  function uuid4(sortable = false) {
5
5
  let uuid = '';
6
6
  if (sortable) {
@@ -34,5 +34,4 @@ function uuid4(sortable = false) {
34
34
  }
35
35
  return uuid;
36
36
  }
37
- exports.uuid4 = uuid4;
38
37
  //# sourceMappingURL=uuid.js.map
package/uuid.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"uuid.js","sourceRoot":"","sources":["src/uuid.ts"],"names":[],"mappings":";;;AAAA,SAAgB,KAAK,CAAC,QAAQ,GAAG,KAAK;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;aACpB,QAAQ,CAAC,EAAE,CAAC;aACZ,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;aACjB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtB,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QAChD,QAAQ,KAAK,EAAE,CAAC;YACZ,KAAK,CAAC,CAAC;YACP,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,KAAK,EAAE;gBACH,IAAI,IAAI,GAAG,CAAC;gBAEZ,MAAM;YAEV,KAAK,EAAE;gBACH,sDAAsD;gBACtD,IAAI,IAAI,GAAG,CAAC;gBAEZ,MAAM;YAEV,OAAO,CAAC,CAAC,CAAC;gBACN,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBAEtC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBACf,kDAAkD;oBAClD,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;gBAED,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AA1CD,sBA0CC"}
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["src/uuid.ts"],"names":[],"mappings":";;AAAA,sBA0CC;AA1CD,SAAgB,KAAK,CAAC,QAAQ,GAAG,KAAK;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;aACpB,QAAQ,CAAC,EAAE,CAAC;aACZ,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;aACjB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEtB,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QAChD,QAAQ,KAAK,EAAE,CAAC;YACZ,KAAK,CAAC,CAAC;YACP,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,KAAK,EAAE;gBACH,IAAI,IAAI,GAAG,CAAC;gBAEZ,MAAM;YAEV,KAAK,EAAE;gBACH,sDAAsD;gBACtD,IAAI,IAAI,GAAG,CAAC;gBAEZ,MAAM;YAEV,OAAO,CAAC,CAAC,CAAC;gBACN,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBAEtC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBACf,kDAAkD;oBAClD,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;gBAED,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatPath = exports.describe = void 0;
3
+ exports.describe = describe;
4
+ exports.formatPath = formatPath;
4
5
  function describe(value) {
5
6
  if (value === null) {
6
7
  return 'null';
@@ -16,9 +17,7 @@ function describe(value) {
16
17
  }
17
18
  return typeof value;
18
19
  }
19
- exports.describe = describe;
20
20
  function formatPath(path) {
21
21
  return `/${path.join('/')}`;
22
22
  }
23
- exports.formatPath = formatPath;
24
23
  //# sourceMappingURL=violation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"violation.js","sourceRoot":"","sources":["../src/validation/violation.ts"],"names":[],"mappings":";;;AAAA,SAAgB,QAAQ,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAQ,KAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,OAAO,OAAO,KAAK,CAAC;AACxB,CAAC;AAlBD,4BAkBC;AAED,SAAgB,UAAU,CAAC,IAAc;IACrC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,CAAC;AAFD,gCAEC"}
1
+ {"version":3,"file":"violation.js","sourceRoot":"","sources":["../src/validation/violation.ts"],"names":[],"mappings":";;AAAA,4BAkBC;AAED,gCAEC;AAtBD,SAAgB,QAAQ,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAQ,KAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,OAAO,OAAO,KAAK,CAAC;AACxB,CAAC;AAED,SAAgB,UAAU,CAAC,IAAc;IACrC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,CAAC"}
@@ -1,37 +0,0 @@
1
- import { ChannelListener, DuplexChannel } from './channel';
2
- import { Envelope } from './guaranteedChannel';
3
- import { Logger, LoggerFactory } from '../logging';
4
- import { CidAssigner } from '../cid';
5
- export interface DuplexChannelFactory {
6
- (url: string, logger: Logger): DuplexChannel<string, string>;
7
- }
8
- type Configuration = {
9
- logger?: Logger;
10
- loggerFactory?: LoggerFactory;
11
- tokenParameter: string;
12
- trackerEndpointUrl: string;
13
- channelFactory: DuplexChannelFactory;
14
- cidAssigner: CidAssigner;
15
- cidParameter: string;
16
- };
17
- export declare class BeaconSocketChannel implements DuplexChannel<string, Envelope<string, string>> {
18
- private readonly socketFactory;
19
- private readonly logger;
20
- private readonly loggerFactory;
21
- private readonly cidAssigner;
22
- private readonly cidParameter;
23
- private readonly tokenParameter;
24
- private readonly trackerEndpointUrl;
25
- private readonly listeners;
26
- private socketChannel?;
27
- private token?;
28
- private connectionIndex;
29
- constructor(configuration: Configuration);
30
- publish({ id: receiptId, message }: Envelope<string, string>): Promise<void>;
31
- private createSocketChannel;
32
- subscribe(listener: ChannelListener<string>): void;
33
- unsubscribe(listener: ChannelListener<string>): void;
34
- private notify;
35
- close(): Promise<void>;
36
- }
37
- export {};
@@ -1,83 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BeaconSocketChannel = void 0;
4
- const logging_1 = require("../logging");
5
- class BeaconSocketChannel {
6
- constructor(configuration) {
7
- var _a, _b;
8
- this.listeners = [];
9
- this.connectionIndex = 0;
10
- this.socketFactory = configuration.channelFactory;
11
- this.logger = (_a = configuration.logger) !== null && _a !== void 0 ? _a : new logging_1.NullLogger();
12
- this.loggerFactory = (_b = configuration.loggerFactory) !== null && _b !== void 0 ? _b : (() => new logging_1.NullLogger());
13
- this.cidAssigner = configuration.cidAssigner;
14
- this.cidParameter = configuration.cidParameter;
15
- this.trackerEndpointUrl = configuration.trackerEndpointUrl;
16
- this.tokenParameter = configuration.tokenParameter;
17
- this.notify = this.notify.bind(this);
18
- }
19
- async publish({ id: receiptId, message }) {
20
- const { token, timestamp, context, payload } = JSON.parse(message);
21
- if (this.token !== token || this.socketChannel === undefined) {
22
- if (this.socketChannel !== undefined) {
23
- this.logger.info('Connection no longer valid for current message.');
24
- this.socketChannel.unsubscribe(this.notify);
25
- await this.socketChannel.close();
26
- }
27
- this.token = token;
28
- this.socketChannel = await this.createSocketChannel(token);
29
- }
30
- return this.socketChannel.publish(JSON.stringify({
31
- receiptId: receiptId,
32
- originalTime: timestamp,
33
- departureTime: Date.now(),
34
- context: context,
35
- payload: payload,
36
- }));
37
- }
38
- async createSocketChannel(token) {
39
- const endpoint = new URL(this.trackerEndpointUrl);
40
- endpoint.searchParams.append(this.cidParameter, await this.cidAssigner.assignCid());
41
- if (token !== undefined) {
42
- endpoint.searchParams.append(this.tokenParameter, token);
43
- }
44
- const channel = this.socketFactory(endpoint.toString(), this.loggerFactory(`WebSocket#${this.connectionIndex}`));
45
- this.connectionIndex += 1;
46
- channel.subscribe(this.notify);
47
- return channel;
48
- }
49
- subscribe(listener) {
50
- if (!this.listeners.includes(listener)) {
51
- this.listeners.push(listener);
52
- }
53
- }
54
- unsubscribe(listener) {
55
- const index = this.listeners.indexOf(listener);
56
- if (index >= 0) {
57
- this.listeners.splice(index, 1);
58
- }
59
- }
60
- notify(message) {
61
- let confirmation;
62
- try {
63
- confirmation = JSON.parse(message);
64
- }
65
- catch {
66
- this.logger.error('Invalid JSON message received.');
67
- return;
68
- }
69
- const { violations = [], receiptId } = confirmation;
70
- violations.forEach(violation => this.logger.error(violation.message));
71
- if (receiptId !== null) {
72
- this.listeners.forEach(dispatch => dispatch(receiptId));
73
- }
74
- }
75
- close() {
76
- if (this.socketChannel === undefined) {
77
- return Promise.resolve();
78
- }
79
- return this.socketChannel.close();
80
- }
81
- }
82
- exports.BeaconSocketChannel = BeaconSocketChannel;
83
- //# sourceMappingURL=beaconSocketChannel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"beaconSocketChannel.js","sourceRoot":"","sources":["../src/channel/beaconSocketChannel.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import { Logger } from '../logging';
2
- import { ChannelListener, DuplexChannel } from './channel';
3
- type Input = string | ArrayBufferLike | Blob | ArrayBufferView;
4
- type Output = string | ArrayBuffer | Blob;
5
- type Options = {
6
- closeTimeout: number;
7
- connectionTimeout: number;
8
- protocols: string | string[];
9
- binaryType?: BinaryType;
10
- };
11
- export type Configuration = Partial<Options> & {
12
- url: string;
13
- logger?: Logger;
14
- };
15
- export declare class SocketChannel<I extends Input, O extends Output> implements DuplexChannel<I, O> {
16
- private readonly url;
17
- private readonly logger;
18
- private readonly options;
19
- private readonly listeners;
20
- private connection?;
21
- private closed;
22
- constructor({ url, logger, ...options }: Configuration);
23
- get connected(): Promise<boolean>;
24
- publish(message: O): Promise<void>;
25
- subscribe(listener: ChannelListener<I>): void;
26
- unsubscribe(listener: ChannelListener<I>): void;
27
- private notify;
28
- private connect;
29
- close(): Promise<void>;
30
- }
31
- export {};
@@ -1,145 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SocketChannel = void 0;
4
- const logging_1 = require("../logging");
5
- const error_1 = require("../error");
6
- class SocketChannel {
7
- constructor({ url, logger, ...options }) {
8
- var _a, _b, _c;
9
- this.listeners = [];
10
- this.closed = false;
11
- this.url = url;
12
- this.logger = logger !== null && logger !== void 0 ? logger : new logging_1.NullLogger();
13
- this.options = {
14
- ...options,
15
- closeTimeout: (_a = options.closeTimeout) !== null && _a !== void 0 ? _a : 5000,
16
- connectionTimeout: (_b = options.connectionTimeout) !== null && _b !== void 0 ? _b : 10000,
17
- protocols: (_c = options.protocols) !== null && _c !== void 0 ? _c : [],
18
- };
19
- }
20
- get connected() {
21
- if (this.connection === undefined) {
22
- return Promise.resolve(false);
23
- }
24
- return this.connection.then(() => true, () => false);
25
- }
26
- publish(message) {
27
- return this.connect().then(socket => {
28
- socket.send(message);
29
- this.logger.debug('Message sent.');
30
- });
31
- }
32
- subscribe(listener) {
33
- if (!this.listeners.includes(listener)) {
34
- this.listeners.push(listener);
35
- }
36
- }
37
- unsubscribe(listener) {
38
- const index = this.listeners.indexOf(listener);
39
- if (index >= 0) {
40
- this.listeners.splice(index, 1);
41
- }
42
- }
43
- notify(message) {
44
- this.listeners.forEach(dispatch => dispatch(message));
45
- }
46
- connect() {
47
- if (this.closed) {
48
- return Promise.reject(new Error('Channel has been closed.'));
49
- }
50
- if (this.connection !== undefined) {
51
- return this.connection
52
- .then(connection => {
53
- const state = connection.readyState;
54
- if (state === WebSocket.OPEN) {
55
- return connection;
56
- }
57
- throw new Error('Connection lost.');
58
- })
59
- .catch(() => {
60
- // Reconnect
61
- delete this.connection;
62
- return this.connect();
63
- });
64
- }
65
- this.connection = new Promise((resolve, reject) => {
66
- this.logger.debug('Connecting...');
67
- const connection = new window.WebSocket(this.url, this.options.protocols);
68
- if (this.options.binaryType !== undefined) {
69
- connection.binaryType = this.options.binaryType;
70
- }
71
- const abortListener = () => {
72
- const reason = 'Maximum connection timeout reached.';
73
- this.logger.error(reason);
74
- reject(new Error(reason));
75
- connection.close(1000, reason);
76
- };
77
- const abortTimer = window.setTimeout(abortListener, this.options.connectionTimeout);
78
- const openListener = () => {
79
- window.clearTimeout(abortTimer);
80
- this.logger.info('Connection established.');
81
- connection.removeEventListener('open', openListener);
82
- resolve(connection);
83
- };
84
- const errorListener = () => {
85
- if (!this.closed) {
86
- this.logger.error('Connection error.');
87
- }
88
- };
89
- const messageListener = (event) => {
90
- this.logger.debug('Message received.');
91
- this.notify(event.data);
92
- };
93
- const closeListener = (event) => {
94
- var _a;
95
- window.clearTimeout(abortTimer);
96
- const reason = `${(0, error_1.formatCause)((_a = event.reason) !== null && _a !== void 0 ? _a : 'unknown')} (code ${event.code})`;
97
- const message = `Connection has been closed, reason: ${reason}`;
98
- if (!this.closed) {
99
- this.logger.info(message);
100
- }
101
- connection.removeEventListener('open', openListener);
102
- connection.removeEventListener('error', errorListener);
103
- connection.removeEventListener('close', closeListener);
104
- connection.removeEventListener('message', messageListener);
105
- reject(new Error(message));
106
- };
107
- connection.addEventListener('open', openListener, { once: true });
108
- connection.addEventListener('close', closeListener, { once: true });
109
- connection.addEventListener('error', errorListener);
110
- connection.addEventListener('message', messageListener);
111
- });
112
- return this.connection;
113
- }
114
- close() {
115
- this.logger.debug('Closing connection...');
116
- return new Promise((resolve, reject) => {
117
- this.closed = true;
118
- if (this.connection === undefined) {
119
- this.logger.debug('Connection is not open.');
120
- resolve();
121
- return;
122
- }
123
- this.connection.then((connection) => {
124
- let abortTimer;
125
- const abort = () => {
126
- this.logger.warn('Connection could not be closed within the timeout period.');
127
- reject(new Error('Maximum close timeout reached.'));
128
- };
129
- const close = () => {
130
- window.clearTimeout(abortTimer);
131
- this.logger.info('Connection gracefully closed.');
132
- resolve();
133
- };
134
- connection.addEventListener('close', close, { once: true });
135
- connection.close(1000, 'Deliberate disconnection.');
136
- abortTimer = window.setTimeout(abort, this.options.closeTimeout);
137
- }, () => {
138
- this.logger.info('Connection closed.');
139
- resolve();
140
- });
141
- });
142
- }
143
- }
144
- exports.SocketChannel = SocketChannel;
145
- //# sourceMappingURL=socketChannel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"socketChannel.js","sourceRoot":"","sources":["../src/channel/socketChannel.ts"],"names":[],"mappings":"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"}