@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.
Files changed (83) hide show
  1. package/cache/cookieCache.d.ts +1 -1
  2. package/cache/cookieCache.js +12 -2
  3. package/cache/cookieCache.js.map +1 -1
  4. package/channel/channel.d.ts +7 -0
  5. package/channel/channel.js +23 -0
  6. package/channel/channel.js.map +1 -1
  7. package/channel/guaranteedChannel.js +4 -3
  8. package/channel/guaranteedChannel.js.map +1 -1
  9. package/channel/httpBeaconChannel.d.ts +23 -0
  10. package/channel/httpBeaconChannel.js +89 -0
  11. package/channel/httpBeaconChannel.js.map +1 -0
  12. package/channel/index.d.ts +1 -2
  13. package/channel/index.js +3 -5
  14. package/channel/index.js.map +1 -1
  15. package/channel/queuedChannel.js +5 -4
  16. package/channel/queuedChannel.js.map +1 -1
  17. package/channel/retryChannel.js +8 -4
  18. package/channel/retryChannel.js.map +1 -1
  19. package/channel/sandboxChannel.js +4 -0
  20. package/channel/sandboxChannel.js.map +1 -1
  21. package/constants.d.ts +2 -2
  22. package/constants.js +1 -1
  23. package/container.d.ts +3 -0
  24. package/container.js +15 -14
  25. package/container.js.map +1 -1
  26. package/contentFetcher.d.ts +3 -4
  27. package/contentFetcher.js +37 -27
  28. package/contentFetcher.js.map +1 -1
  29. package/evaluator.d.ts +2 -4
  30. package/evaluator.js +47 -39
  31. package/evaluator.js.map +1 -1
  32. package/facade/contentFetcherFacade.d.ts +1 -6
  33. package/facade/contentFetcherFacade.js +2 -5
  34. package/facade/contentFetcherFacade.js.map +1 -1
  35. package/facade/sdkFacade.d.ts +3 -6
  36. package/facade/sdkFacade.js +3 -7
  37. package/facade/sdkFacade.js.map +1 -1
  38. package/help.d.ts +3 -0
  39. package/help.js +26 -0
  40. package/help.js.map +1 -0
  41. package/package.json +1 -3
  42. package/queue/persistentQueue.d.ts +1 -3
  43. package/queue/persistentQueue.js +9 -16
  44. package/queue/persistentQueue.js.map +1 -1
  45. package/schema/eventSchemas.js +0 -16
  46. package/schema/eventSchemas.js.map +1 -1
  47. package/schema/sdkFacadeSchemas.js +5 -1
  48. package/schema/sdkFacadeSchemas.js.map +1 -1
  49. package/schema/sdkSchemas.js +7 -0
  50. package/schema/sdkSchemas.js.map +1 -1
  51. package/sdk.d.ts +2 -0
  52. package/sdk.js +1 -2
  53. package/sdk.js.map +1 -1
  54. package/src/cache/cookieCache.ts +13 -2
  55. package/src/channel/channel.ts +32 -0
  56. package/src/channel/guaranteedChannel.ts +4 -4
  57. package/src/channel/httpBeaconChannel.ts +128 -0
  58. package/src/channel/index.ts +1 -2
  59. package/src/channel/queuedChannel.ts +5 -5
  60. package/src/channel/retryChannel.ts +9 -5
  61. package/src/channel/sandboxChannel.ts +5 -1
  62. package/src/container.ts +17 -19
  63. package/src/contentFetcher.ts +41 -29
  64. package/src/evaluator.ts +74 -65
  65. package/src/facade/contentFetcherFacade.ts +2 -11
  66. package/src/facade/sdkFacade.ts +5 -14
  67. package/src/help.ts +24 -0
  68. package/src/queue/persistentQueue.ts +11 -22
  69. package/src/schema/eventSchemas.ts +0 -16
  70. package/src/schema/sdkFacadeSchemas.ts +14 -2
  71. package/src/schema/sdkSchemas.ts +7 -0
  72. package/src/sdk.ts +3 -2
  73. package/src/trackingEvents.ts +0 -4
  74. package/trackingEvents.d.ts +0 -4
  75. package/trackingEvents.js.map +1 -1
  76. package/channel/beaconSocketChannel.d.ts +0 -37
  77. package/channel/beaconSocketChannel.js +0 -83
  78. package/channel/beaconSocketChannel.js.map +0 -1
  79. package/channel/socketChannel.d.ts +0 -31
  80. package/channel/socketChannel.js +0 -145
  81. package/channel/socketChannel.js.map +0 -1
  82. package/src/channel/beaconSocketChannel.ts +0 -153
  83. package/src/channel/socketChannel.ts +0 -217
@@ -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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"trackingEvents.js","sourceRoot":"","sources":["src/trackingEvents.ts"],"names":[],"mappings":";;;AAsaA,sDAEC;AAED,gDAEC;AArWD;;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;AAED,SAAgB,kBAAkB,CAAC,KAA2B;IAC1D,OAAO,sBAAc,CAAC,QAAQ,CAAE,KAAmB,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
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"}
@@ -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":";;;AAEA,wCAA6D;AA2B7D,MAAa,mBAAmB;IAuB5B,YAAmB,aAA4B;;QAR9B,cAAS,GAAmC,EAAE,CAAC;QAMxD,oBAAe,GAAG,CAAC,CAAC;QAGxB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,MAAA,aAAa,CAAC,MAAM,mCAAI,IAAI,oBAAU,EAAE,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,MAAA,aAAa,CAAC,aAAa,mCAAI,CAAC,GAAW,EAAE,CAAC,IAAI,oBAAU,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAC/C,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC,kBAAkB,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,EAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAA2B;QACnE,MAAM,EAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3D,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;gBAEpE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE5C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACrC,CAAC;YAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAC7B,IAAI,CAAC,SAAS,CAAC;YACX,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,SAAS;YACvB,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;SACnB,CAAC,CACL,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,KAAc;QAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAElD,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;QAEpF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,OAAO,GAAkC,IAAI,CAAC,aAAa,CAC7D,QAAQ,CAAC,QAAQ,EAAE,EACnB,IAAI,CAAC,aAAa,CAAC,aAAa,IAAI,CAAC,eAAe,EAAE,CAAC,CAC1D,CAAC;QAEF,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;QAE1B,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,SAAS,CAAC,QAAiC;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAEM,WAAW,CAAC,QAAiC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,OAAe;QAC1B,IAAI,YAA0B,CAAC;QAE/B,IAAI,CAAC;YACD,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAEpD,OAAO;QACX,CAAC;QAED,MAAM,EAAC,UAAU,GAAG,EAAE,EAAE,SAAS,EAAC,GAAG,YAAY,CAAC;QAElD,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAEtE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAEM,KAAK;QACR,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;CACJ;AA3HD,kDA2HC"}
@@ -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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"}
@@ -1,153 +0,0 @@
1
- import {ChannelListener, DuplexChannel} from './channel';
2
- import {Envelope} from './guaranteedChannel';
3
- import {Logger, LoggerFactory, NullLogger} from '../logging';
4
- import {CidAssigner} from '../cid';
5
-
6
- export interface DuplexChannelFactory {
7
- (url: string, logger: Logger): DuplexChannel<string, string>;
8
- }
9
-
10
- type Configuration = {
11
- logger?: Logger,
12
- loggerFactory?: LoggerFactory,
13
- tokenParameter: string,
14
- trackerEndpointUrl: string,
15
- channelFactory: DuplexChannelFactory,
16
- cidAssigner: CidAssigner,
17
- cidParameter: string,
18
- };
19
-
20
- type Violation = {
21
- message: string,
22
- path: string,
23
- };
24
-
25
- type Confirmation = {
26
- receiptId: string | null,
27
- violations?: Violation[],
28
- };
29
-
30
- export class BeaconSocketChannel implements DuplexChannel<string, Envelope<string, string>> {
31
- private readonly socketFactory: DuplexChannelFactory;
32
-
33
- private readonly logger: Logger;
34
-
35
- private readonly loggerFactory: LoggerFactory;
36
-
37
- private readonly cidAssigner: CidAssigner;
38
-
39
- private readonly cidParameter: string;
40
-
41
- private readonly tokenParameter: string;
42
-
43
- private readonly trackerEndpointUrl: string;
44
-
45
- private readonly listeners: Array<ChannelListener<string>> = [];
46
-
47
- private socketChannel?: DuplexChannel<string, string>;
48
-
49
- private token?: string;
50
-
51
- private connectionIndex = 0;
52
-
53
- public constructor(configuration: Configuration) {
54
- this.socketFactory = configuration.channelFactory;
55
- this.logger = configuration.logger ?? new NullLogger();
56
- this.loggerFactory = configuration.loggerFactory ?? ((): Logger => new NullLogger());
57
- this.cidAssigner = configuration.cidAssigner;
58
- this.cidParameter = configuration.cidParameter;
59
- this.trackerEndpointUrl = configuration.trackerEndpointUrl;
60
- this.tokenParameter = configuration.tokenParameter;
61
- this.notify = this.notify.bind(this);
62
- }
63
-
64
- public async publish({id: receiptId, message}: Envelope<string, string>): Promise<void> {
65
- const {token, timestamp, context, payload} = JSON.parse(message);
66
-
67
- if (this.token !== token || this.socketChannel === undefined) {
68
- if (this.socketChannel !== undefined) {
69
- this.logger.info('Connection no longer valid for current message.');
70
-
71
- this.socketChannel.unsubscribe(this.notify);
72
-
73
- await this.socketChannel.close();
74
- }
75
-
76
- this.token = token;
77
- this.socketChannel = await this.createSocketChannel(token);
78
- }
79
-
80
- return this.socketChannel.publish(
81
- JSON.stringify({
82
- receiptId: receiptId,
83
- originalTime: timestamp,
84
- departureTime: Date.now(),
85
- context: context,
86
- payload: payload,
87
- }),
88
- );
89
- }
90
-
91
- private async createSocketChannel(token?: string): Promise<DuplexChannel<string, string>> {
92
- const endpoint = new URL(this.trackerEndpointUrl);
93
-
94
- endpoint.searchParams.append(this.cidParameter, await this.cidAssigner.assignCid());
95
-
96
- if (token !== undefined) {
97
- endpoint.searchParams.append(this.tokenParameter, token);
98
- }
99
-
100
- const channel: DuplexChannel<string, string> = this.socketFactory(
101
- endpoint.toString(),
102
- this.loggerFactory(`WebSocket#${this.connectionIndex}`),
103
- );
104
-
105
- this.connectionIndex += 1;
106
-
107
- channel.subscribe(this.notify);
108
-
109
- return channel;
110
- }
111
-
112
- public subscribe(listener: ChannelListener<string>): void {
113
- if (!this.listeners.includes(listener)) {
114
- this.listeners.push(listener);
115
- }
116
- }
117
-
118
- public unsubscribe(listener: ChannelListener<string>): void {
119
- const index = this.listeners.indexOf(listener);
120
-
121
- if (index >= 0) {
122
- this.listeners.splice(index, 1);
123
- }
124
- }
125
-
126
- private notify(message: string): void {
127
- let confirmation: Confirmation;
128
-
129
- try {
130
- confirmation = JSON.parse(message);
131
- } catch {
132
- this.logger.error('Invalid JSON message received.');
133
-
134
- return;
135
- }
136
-
137
- const {violations = [], receiptId} = confirmation;
138
-
139
- violations.forEach(violation => this.logger.error(violation.message));
140
-
141
- if (receiptId !== null) {
142
- this.listeners.forEach(dispatch => dispatch(receiptId));
143
- }
144
- }
145
-
146
- public close(): Promise<void> {
147
- if (this.socketChannel === undefined) {
148
- return Promise.resolve();
149
- }
150
-
151
- return this.socketChannel.close();
152
- }
153
- }