@yuno-payments/sdk-event-log 0.3.0-beta.8 → 1.0.0-beta.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 (75) hide show
  1. package/dist/cjs/api/__tests__/api.test.js +5 -9
  2. package/dist/cjs/api/api.d.ts +3 -5
  3. package/dist/cjs/api/api.js +12 -10
  4. package/dist/cjs/cron/cron.d.ts +5 -5
  5. package/dist/cjs/cron/cron.js +26 -16
  6. package/dist/cjs/cron/cron.test.js +15 -11
  7. package/dist/cjs/database/database.d.ts +1 -2
  8. package/dist/cjs/database/database.js +5 -16
  9. package/dist/cjs/database/database.test.js +2 -2
  10. package/dist/cjs/database/database.types.d.ts +2 -2
  11. package/dist/cjs/database/index.d.ts +1 -0
  12. package/dist/cjs/database/index.js +1 -0
  13. package/dist/cjs/database/local-storage/local-storage.d.ts +3 -3
  14. package/dist/cjs/database/local-storage/local-storage.js +17 -8
  15. package/dist/cjs/database/local-storage/local-storage.test.js +7 -6
  16. package/dist/cjs/database/memory-storage/memory-storage.d.ts +4 -2
  17. package/dist/cjs/database/memory-storage/memory-storage.js +10 -5
  18. package/dist/cjs/database/memory-storage/memory-storage.test.js +2 -2
  19. package/dist/cjs/index.d.ts +7 -9
  20. package/dist/cjs/index.js +43 -21
  21. package/dist/cjs/index.test.js +168 -86
  22. package/dist/cjs/index.types.d.ts +4 -4
  23. package/dist/cjs/index.utils.d.ts +5 -2
  24. package/dist/cjs/index.utils.js +12 -4
  25. package/dist/cjs/types/index.d.ts +11 -1
  26. package/dist/cjs/utils/__tests__/check-environment.test.d.ts +1 -0
  27. package/dist/cjs/utils/__tests__/check-environment.test.js +30 -0
  28. package/dist/cjs/utils/__tests__/client-detection.test.d.ts +1 -0
  29. package/dist/cjs/utils/__tests__/client-detection.test.js +40 -0
  30. package/dist/cjs/utils/check-environment.d.ts +2 -0
  31. package/dist/cjs/utils/check-environment.js +17 -0
  32. package/dist/cjs/utils/client-detection.d.ts +8 -0
  33. package/dist/cjs/utils/client-detection.js +216 -0
  34. package/dist/cjs/utils/index.d.ts +3 -0
  35. package/dist/cjs/utils/index.js +19 -0
  36. package/dist/cjs/utils/stringyfy.d.ts +1 -0
  37. package/dist/cjs/utils/stringyfy.js +20 -0
  38. package/dist/esm/api/__tests__/api.test.js +5 -9
  39. package/dist/esm/api/api.d.ts +3 -5
  40. package/dist/esm/api/api.js +12 -10
  41. package/dist/esm/cron/cron.d.ts +5 -5
  42. package/dist/esm/cron/cron.js +17 -18
  43. package/dist/esm/cron/cron.test.js +15 -11
  44. package/dist/esm/database/database.d.ts +1 -2
  45. package/dist/esm/database/database.js +5 -16
  46. package/dist/esm/database/database.test.js +2 -2
  47. package/dist/esm/database/database.types.d.ts +2 -2
  48. package/dist/esm/database/index.d.ts +1 -0
  49. package/dist/esm/database/index.js +1 -0
  50. package/dist/esm/database/local-storage/local-storage.d.ts +3 -3
  51. package/dist/esm/database/local-storage/local-storage.js +17 -8
  52. package/dist/esm/database/local-storage/local-storage.test.js +7 -6
  53. package/dist/esm/database/memory-storage/memory-storage.d.ts +4 -2
  54. package/dist/esm/database/memory-storage/memory-storage.js +10 -5
  55. package/dist/esm/database/memory-storage/memory-storage.test.js +2 -2
  56. package/dist/esm/index.d.ts +7 -9
  57. package/dist/esm/index.js +36 -21
  58. package/dist/esm/index.test.js +199 -77
  59. package/dist/esm/index.types.d.ts +4 -4
  60. package/dist/esm/index.utils.d.ts +5 -2
  61. package/dist/esm/index.utils.js +21 -4
  62. package/dist/esm/types/index.d.ts +11 -1
  63. package/dist/esm/utils/__tests__/check-environment.test.d.ts +1 -0
  64. package/dist/esm/utils/__tests__/check-environment.test.js +30 -0
  65. package/dist/esm/utils/__tests__/client-detection.test.d.ts +1 -0
  66. package/dist/esm/utils/__tests__/client-detection.test.js +31 -0
  67. package/dist/esm/utils/check-environment.d.ts +2 -0
  68. package/dist/esm/utils/check-environment.js +17 -0
  69. package/dist/esm/utils/client-detection.d.ts +8 -0
  70. package/dist/esm/utils/client-detection.js +205 -0
  71. package/dist/esm/utils/index.d.ts +3 -0
  72. package/dist/esm/utils/index.js +19 -0
  73. package/dist/esm/utils/stringyfy.d.ts +1 -0
  74. package/dist/esm/utils/stringyfy.js +20 -0
  75. package/package.json +4 -4
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /* eslint-disable no-magic-numbers */
3
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
+ return new (P || (P = Promise))(function (resolve, reject) {
6
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
10
+ });
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.clientDetection = void 0;
14
+ /**
15
+ * JavaScript Client Detection
16
+ * (C) viazenetti GmbH (Christian Ludwig)
17
+ * https://stackoverflow.com/questions/9514179/how-to-find-the-operating-system-details-using-javascript
18
+ * this package is better but too weighty: https://www.npmjs.com/package/ua-parser-js
19
+ */
20
+ function clientDetection() {
21
+ var _a, _b, _c;
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ const unknown = '-';
24
+ // screen
25
+ let screenSize = '';
26
+ if (screen.width) {
27
+ const width = screen.width ? screen.width : '';
28
+ const height = screen.height ? screen.height : '';
29
+ screenSize += '' + width + ' x ' + height;
30
+ }
31
+ // browser
32
+ const nVer = navigator.appVersion;
33
+ const nAgt = navigator.userAgent;
34
+ let browser = navigator.appName;
35
+ let version = '' + parseFloat(nVer);
36
+ let nameOffset, verOffset, ix;
37
+ // Yandex Browser
38
+ if ((verOffset = nAgt.indexOf('YaBrowser')) !== -1) {
39
+ browser = 'Yandex';
40
+ version = nAgt.substring(verOffset + 10);
41
+ }
42
+ // Samsung Browser
43
+ else if ((verOffset = nAgt.indexOf('SamsungBrowser')) !== -1) {
44
+ browser = 'Samsung';
45
+ version = nAgt.substring(verOffset + 15);
46
+ }
47
+ // UC Browser
48
+ else if ((verOffset = nAgt.indexOf('UCBrowser')) !== -1) {
49
+ browser = 'UC Browser';
50
+ version = nAgt.substring(verOffset + 10);
51
+ }
52
+ // Opera Next
53
+ else if ((verOffset = nAgt.indexOf('OPR')) !== -1) {
54
+ browser = 'Opera';
55
+ version = nAgt.substring(verOffset + 4);
56
+ }
57
+ // Opera
58
+ else if ((verOffset = nAgt.indexOf('Opera')) !== -1) {
59
+ browser = 'Opera';
60
+ version = nAgt.substring(verOffset + 6);
61
+ if ((verOffset = nAgt.indexOf('Version')) !== -1) {
62
+ version = nAgt.substring(verOffset + 8);
63
+ }
64
+ }
65
+ // Legacy Edge
66
+ else if ((verOffset = nAgt.indexOf('Edge')) !== -1) {
67
+ browser = 'Microsoft Legacy Edge';
68
+ version = nAgt.substring(verOffset + 5);
69
+ }
70
+ // Edge (Chromium)
71
+ else if ((verOffset = nAgt.indexOf('Edg')) !== -1) {
72
+ browser = 'Microsoft Edge';
73
+ version = nAgt.substring(verOffset + 4);
74
+ }
75
+ // MSIE
76
+ else if ((verOffset = nAgt.indexOf('MSIE')) !== -1) {
77
+ browser = 'Microsoft Internet Explorer';
78
+ version = nAgt.substring(verOffset + 5);
79
+ }
80
+ // Chrome
81
+ else if ((verOffset = nAgt.indexOf('Chrome')) !== -1) {
82
+ browser = 'Chrome';
83
+ version = nAgt.substring(verOffset + 7);
84
+ }
85
+ // Safari
86
+ else if ((verOffset = nAgt.indexOf('Safari')) !== -1) {
87
+ browser = 'Safari';
88
+ version = nAgt.substring(verOffset + 7);
89
+ if ((verOffset = nAgt.indexOf('Version')) !== -1) {
90
+ version = nAgt.substring(verOffset + 8);
91
+ }
92
+ }
93
+ // Firefox
94
+ else if ((verOffset = nAgt.indexOf('Firefox')) !== -1) {
95
+ browser = 'Firefox';
96
+ version = nAgt.substring(verOffset + 8);
97
+ }
98
+ // MSIE 11+
99
+ else if (nAgt.indexOf('Trident/') !== -1) {
100
+ browser = 'Microsoft Internet Explorer';
101
+ version = nAgt.substring(nAgt.indexOf('rv:') + 3);
102
+ }
103
+ // Other browsers
104
+ else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) <
105
+ (verOffset = nAgt.lastIndexOf('/'))) {
106
+ browser = nAgt.substring(nameOffset, verOffset);
107
+ version = nAgt.substring(verOffset + 1);
108
+ if (browser.toLowerCase() === browser.toUpperCase()) {
109
+ browser = navigator.appName;
110
+ }
111
+ }
112
+ // trim the version string
113
+ if ((ix = version.indexOf(';')) !== -1)
114
+ version = version.substring(0, ix);
115
+ if ((ix = version.indexOf(' ')) !== -1)
116
+ version = version.substring(0, ix);
117
+ if ((ix = version.indexOf(')')) !== -1)
118
+ version = version.substring(0, ix);
119
+ let majorVersion = parseInt('' + version, 10);
120
+ if (isNaN(majorVersion)) {
121
+ version = '' + parseFloat(nVer);
122
+ majorVersion = parseInt(nVer, 10);
123
+ }
124
+ // mobile version
125
+ const mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
126
+ // cookie
127
+ let cookieEnabled = navigator.cookieEnabled ? true : false;
128
+ if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) {
129
+ document.cookie = 'testcookie';
130
+ cookieEnabled = document.cookie.indexOf('testcookie') !== -1 ? true : false;
131
+ }
132
+ // system
133
+ let os = unknown;
134
+ const clientStrings = [
135
+ { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
136
+ { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
137
+ { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
138
+ { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
139
+ { s: 'Windows Vista', r: /Windows NT 6.0/ },
140
+ { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
141
+ { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
142
+ { s: 'Windows 2000', r: /(Windows NT 5.0|Windows 2000)/ },
143
+ { s: 'Windows ME', r: /(Win 9x 4.90|Windows ME)/ },
144
+ { s: 'Windows 98', r: /(Windows 98|Win98)/ },
145
+ { s: 'Windows 95', r: /(Windows 95|Win95|Windows_95)/ },
146
+ { s: 'Windows NT 4.0', r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/ },
147
+ { s: 'Windows CE', r: /Windows CE/ },
148
+ { s: 'Windows 3.11', r: /Win16/ },
149
+ { s: 'Android', r: /Android/ },
150
+ { s: 'Open BSD', r: /OpenBSD/ },
151
+ { s: 'Sun OS', r: /SunOS/ },
152
+ { s: 'Chrome OS', r: /CrOS/ },
153
+ { s: 'Linux', r: /(Linux|X11(?!.*CrOS))/ },
154
+ { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
155
+ { s: 'Mac OS X', r: /Mac OS X/ },
156
+ { s: 'Mac OS', r: /(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
157
+ { s: 'QNX', r: /QNX/ },
158
+ { s: 'UNIX', r: /UNIX/ },
159
+ { s: 'BeOS', r: /BeOS/ },
160
+ { s: 'OS/2', r: /OS\/2/ },
161
+ {
162
+ s: 'Search Bot',
163
+ r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/,
164
+ },
165
+ ];
166
+ for (const id in clientStrings) {
167
+ const cs = clientStrings[id];
168
+ if (cs.r.test(nAgt)) {
169
+ os = cs.s;
170
+ break;
171
+ }
172
+ }
173
+ let osVersion = unknown;
174
+ if (/Windows/.test(os)) {
175
+ osVersion = (_a = /Windows (.*)/.exec(os)) === null || _a === void 0 ? void 0 : _a[1];
176
+ if (osVersion && parseInt(osVersion) === 10 && navigator.userAgentData) {
177
+ osVersion = yield navigator.userAgentData
178
+ .getHighEntropyValues(['platformVersion'])
179
+ .then((ua) => { var _a, _b; return parseInt((_b = (_a = ua.platformVersion) === null || _a === void 0 ? void 0 : _a.split('.')[0]) !== null && _b !== void 0 ? _b : '0') < 13 ? 10 : 11; });
180
+ }
181
+ os = 'Windows';
182
+ }
183
+ switch (os) {
184
+ case 'Mac OS':
185
+ case 'Mac OS X':
186
+ case 'Android':
187
+ osVersion =
188
+ (_c = (_b = /(?:Android|Mac OS|Mac OS X|MacPPC|MacIntel|Mac_PowerPC|Macintosh) ([._\d]+)/.exec(nAgt)) === null || _b === void 0 ? void 0 : _b[1]) !== null && _c !== void 0 ? _c : osVersion;
189
+ break;
190
+ case 'iOS':
191
+ {
192
+ const osVersionRegexp = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
193
+ if (osVersionRegexp) {
194
+ osVersion =
195
+ osVersionRegexp[1] +
196
+ '.' +
197
+ osVersionRegexp[2] +
198
+ '.' +
199
+ osVersionRegexp[3];
200
+ }
201
+ }
202
+ break;
203
+ }
204
+ return {
205
+ screen: screenSize,
206
+ browser,
207
+ browserVersion: version,
208
+ browserMajorVersion: majorVersion,
209
+ mobile,
210
+ os,
211
+ osVersion: osVersion,
212
+ cookies: cookieEnabled,
213
+ };
214
+ });
215
+ }
216
+ exports.clientDetection = clientDetection;
@@ -0,0 +1,3 @@
1
+ export * from './check-environment';
2
+ export * from './client-detection';
3
+ export * from './stringyfy';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./check-environment"), exports);
18
+ __exportStar(require("./client-detection"), exports);
19
+ __exportStar(require("./stringyfy"), exports);
@@ -0,0 +1 @@
1
+ export declare function stringify(obj: object): string;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringify = void 0;
4
+ const DO_NOT_EXIST = -1;
5
+ function stringify(obj) {
6
+ const cache = [];
7
+ const str = JSON.stringify(obj, function (key, value) {
8
+ if (typeof value === 'object' && value !== null) {
9
+ if (cache.indexOf(value) !== DO_NOT_EXIST) {
10
+ // Circular reference found, discard key
11
+ return;
12
+ }
13
+ // Store value in our collection
14
+ cache.push(value);
15
+ }
16
+ return value;
17
+ });
18
+ return str;
19
+ }
20
+ exports.stringify = stringify;
@@ -7,17 +7,13 @@ const publicApiKey = PUBLIC_API_KEY;
7
7
  const platform = 'web';
8
8
  const STATUS_CREATED = 201;
9
9
  describe('Api', () => {
10
+ let api;
10
11
  beforeEach(() => {
11
12
  // Reset the instance before each test
12
- api_1.api.init(publicApiKey, platform);
13
- });
14
- it('should thorw an error if the instance is not initialized well', () => {
15
- expect(() => api_1.api.init('', '')).toThrowError();
13
+ api = new api_1.Api(platform, true);
16
14
  });
17
15
  it('should initialize the instance with the correct headers', () => {
18
- const instance = api_1.api.getInstances();
19
- expect(instance === null || instance === void 0 ? void 0 : instance.defaults.baseURL).toBe('https://api-staging.y.uno/v1');
20
- expect(instance === null || instance === void 0 ? void 0 : instance.defaults.headers['public-api-key']).toBe(publicApiKey);
16
+ const instance = api.getInstances();
21
17
  expect(instance === null || instance === void 0 ? void 0 : instance.defaults.headers['X-Platform']).toBe(platform);
22
18
  });
23
19
  it('should send a batch of events to the server', async () => {
@@ -30,11 +26,11 @@ describe('Api', () => {
30
26
  type: types_1.EventLogType.EVENT,
31
27
  },
32
28
  ];
33
- const response = await api_1.api.sendBatch(batches);
29
+ const response = await api.sendBatch(batches, publicApiKey);
34
30
  expect(response === null || response === void 0 ? void 0 : response.status).toBe(STATUS_CREATED);
35
31
  });
36
32
  it('should return the instance', () => {
37
- const instance = api_1.api.getInstances();
33
+ const instance = api.getInstances();
38
34
  expect(instance).not.toBeNull();
39
35
  });
40
36
  });
@@ -1,10 +1,8 @@
1
1
  import { AxiosInstance } from 'axios';
2
2
  import { Batch } from '../types';
3
- declare class Api {
3
+ export declare class Api {
4
4
  #private;
5
- init(publicApiKey: string, platform: string, debug?: boolean): void;
6
- sendBatch(batches: Batch[]): Promise<import("axios").AxiosResponse<any, any>> | undefined;
5
+ constructor(platform: string, debug?: boolean);
6
+ sendBatch(batches: Batch[], publicApiKey: string): Promise<import("axios").AxiosResponse<any, any>> | undefined;
7
7
  getInstances(): AxiosInstance | null;
8
8
  }
9
- export declare const api: Api;
10
- export {};
@@ -15,32 +15,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15
15
  };
16
16
  var _Api_instance, _Api_debug;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.api = void 0;
18
+ exports.Api = void 0;
19
19
  const axios_1 = __importDefault(require("axios"));
20
20
  const api_utils_1 = require("./api.utils");
21
21
  class Api {
22
- constructor() {
22
+ constructor(platform, debug = false) {
23
23
  _Api_instance.set(this, null);
24
24
  _Api_debug.set(this, false);
25
- }
26
- init(publicApiKey, platform, debug = false) {
27
25
  __classPrivateFieldSet(this, _Api_debug, debug, "f");
28
26
  __classPrivateFieldSet(this, _Api_instance, axios_1.default.create({
29
- baseURL: (0, api_utils_1.getBaseUrl)(publicApiKey),
30
27
  // eslint-disable-next-line @typescript-eslint/naming-convention
31
- headers: { 'public-api-key': publicApiKey, 'X-Platform': platform },
28
+ headers: { 'X-Platform': platform },
32
29
  }), "f");
33
30
  }
34
- sendBatch(batches) {
31
+ sendBatch(batches, publicApiKey) {
35
32
  var _a;
36
- if (!__classPrivateFieldGet(this, _Api_debug, "f")) {
33
+ if (__classPrivateFieldGet(this, _Api_debug, "f")) {
37
34
  console.dir(batches, { depth: null });
35
+ console.log(publicApiKey);
38
36
  }
39
- return (_a = __classPrivateFieldGet(this, _Api_instance, "f")) === null || _a === void 0 ? void 0 : _a.post('/sdk/event-log/publish', { batch: batches });
37
+ return (_a = __classPrivateFieldGet(this, _Api_instance, "f")) === null || _a === void 0 ? void 0 : _a.post('/sdk/event-log/publish', { batch: batches }, {
38
+ baseURL: (0, api_utils_1.getBaseUrl)(publicApiKey),
39
+ // eslint-disable-next-line @typescript-eslint/naming-convention
40
+ headers: { 'public-api-key': publicApiKey }
41
+ });
40
42
  }
41
43
  getInstances() {
42
44
  return __classPrivateFieldGet(this, _Api_instance, "f");
43
45
  }
44
46
  }
47
+ exports.Api = Api;
45
48
  _Api_instance = new WeakMap(), _Api_debug = new WeakMap();
46
- exports.api = new Api();
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" />
2
- declare class Cron {
2
+ import { Api } from '../api';
3
+ import { Database } from '../database';
4
+ export declare class Cron {
3
5
  #private;
4
- init(batchTime: number): void;
5
- sendBatch(): void;
6
+ constructor(batchTime: number, api: Api, database: Database);
7
+ sendBatch(): Promise<void>;
6
8
  stop(): void;
7
9
  getInterval(): NodeJS.Timeout | undefined;
8
10
  }
9
- export declare const cron: Cron;
10
- export {};
@@ -10,29 +10,28 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _Cron_interval;
13
+ var _Cron_interval, _Cron_api, _Cron_database;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.cron = void 0;
16
- const api_1 = require("../api");
17
- const database_1 = require("../database");
15
+ exports.Cron = void 0;
18
16
  const NONE_ITEMS = 0;
19
17
  class Cron {
20
- constructor() {
18
+ constructor(batchTime, api, database) {
21
19
  _Cron_interval.set(this, void 0);
22
- }
23
- init(batchTime) {
20
+ _Cron_api.set(this, void 0);
21
+ _Cron_database.set(this, void 0);
24
22
  this.stop();
25
- __classPrivateFieldSet(this, _Cron_interval, setInterval(this.sendBatch, batchTime), "f");
26
- console.log('cron started');
23
+ __classPrivateFieldSet(this, _Cron_api, api, "f");
24
+ __classPrivateFieldSet(this, _Cron_database, database, "f");
25
+ __classPrivateFieldSet(this, _Cron_interval, setInterval(this.sendBatch.bind(this), batchTime), "f");
27
26
  }
28
- sendBatch() {
29
- database_1.database.getAllItems().then((items) => {
30
- var _a;
31
- console.log('items', items);
32
- if (items.length > NONE_ITEMS) {
33
- (_a = api_1.api.sendBatch(items)) === null || _a === void 0 ? void 0 : _a.then(() => database_1.database.reset());
27
+ async sendBatch() {
28
+ const items = await __classPrivateFieldGet(this, _Cron_database, "f").getAllItems();
29
+ const keys = Object.keys(items);
30
+ if (keys.length > NONE_ITEMS) {
31
+ for (const key of keys) {
32
+ __classPrivateFieldGet(this, _Cron_api, "f").sendBatch(items[key], key);
34
33
  }
35
- });
34
+ }
36
35
  }
37
36
  stop() {
38
37
  if (__classPrivateFieldGet(this, _Cron_interval, "f")) {
@@ -44,5 +43,5 @@ class Cron {
44
43
  return __classPrivateFieldGet(this, _Cron_interval, "f");
45
44
  }
46
45
  }
47
- _Cron_interval = new WeakMap();
48
- exports.cron = new Cron();
46
+ exports.Cron = Cron;
47
+ _Cron_interval = new WeakMap(), _Cron_api = new WeakMap(), _Cron_database = new WeakMap();
@@ -7,11 +7,17 @@ const types_1 = require("../types");
7
7
  const TIME_INTERVAL = 1000;
8
8
  describe('Cron', () => {
9
9
  let spy;
10
+ let cron;
11
+ let api;
12
+ let database;
10
13
  beforeEach(async () => {
11
14
  // restore the spy created with spyOn
12
15
  jest.restoreAllMocks();
13
- spy = jest.spyOn(api_1.api, 'sendBatch');
14
- await database_1.database.reset();
16
+ api = new api_1.Api('web', true);
17
+ database = (0, database_1.databaseFactory)('testOrganization');
18
+ cron = new cron_1.Cron(TIME_INTERVAL, api, database);
19
+ spy = jest.spyOn(api, 'sendBatch');
20
+ await database.reset();
15
21
  });
16
22
  it('should send a batch of items to the API if there are items in the database', async () => {
17
23
  const batch = {
@@ -21,23 +27,21 @@ describe('Cron', () => {
21
27
  original_created_at: new Date().toISOString(),
22
28
  type: types_1.EventLogType.EVENT,
23
29
  };
24
- database_1.database.setItem(batch);
25
- await cron_1.cron.sendBatch();
26
- expect(spy).toHaveBeenCalledWith([batch]);
30
+ database.setItem(batch, 'sandbox_1');
31
+ await cron.sendBatch();
32
+ expect(spy).toHaveBeenCalledWith([batch], 'sandbox_1');
27
33
  });
28
34
  it('should not send a batch of items to the API if there are no items in the database', async () => {
29
- await cron_1.cron.sendBatch();
35
+ await cron.sendBatch();
30
36
  expect(spy).not.toHaveBeenCalled();
31
37
  });
32
38
  it('should stop the interval when stop is called', () => {
33
39
  jest.useFakeTimers();
34
- cron_1.cron.init(TIME_INTERVAL);
35
- cron_1.cron.stop();
36
- expect(cron_1.cron.getInterval()).toBeUndefined();
40
+ cron.stop();
41
+ expect(cron.getInterval()).toBeUndefined();
37
42
  });
38
43
  it('should start the interval when init is called', () => {
39
44
  jest.useFakeTimers();
40
- cron_1.cron.init(TIME_INTERVAL);
41
- expect(cron_1.cron.getInterval()).toBeDefined();
45
+ expect(cron.getInterval()).toBeDefined();
42
46
  });
43
47
  });
@@ -1,3 +1,2 @@
1
1
  import { Database } from './database.types';
2
- export declare function databaseFactory(): Database;
3
- export declare const database: Database;
2
+ export declare function databaseFactory(organizationName: string): Database;
@@ -1,15 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.database = exports.databaseFactory = void 0;
3
+ exports.databaseFactory = void 0;
4
4
  const local_storage_1 = require("./local-storage");
5
5
  const memory_storage_1 = require("./memory-storage");
6
- function databaseFactory() {
7
- const databaseType = isLocalStorageEnabled()
6
+ const utils_1 = require("../utils");
7
+ function databaseFactory(organizationName) {
8
+ const databaseType = (0, utils_1.isLocalStorageEnabled)()
8
9
  ? 'local-storage'
9
10
  : 'memory-storage';
10
11
  switch (databaseType) {
11
12
  case 'local-storage':
12
- return new local_storage_1.LocalStorage();
13
+ return new local_storage_1.LocalStorage(organizationName);
13
14
  case 'memory-storage':
14
15
  return new memory_storage_1.MemoryStorage();
15
16
  default:
@@ -17,15 +18,3 @@ function databaseFactory() {
17
18
  }
18
19
  }
19
20
  exports.databaseFactory = databaseFactory;
20
- function isLocalStorageEnabled() {
21
- try {
22
- const key = '__yuno_storage__test';
23
- window.localStorage.setItem(key, 'test_value');
24
- window.localStorage.removeItem(key);
25
- return true;
26
- }
27
- catch (e) {
28
- return false;
29
- }
30
- }
31
- exports.database = databaseFactory();
@@ -11,7 +11,7 @@ describe('databaseFactory', () => {
11
11
  it('should return a LocalStorage instance if local storage is enabled', () => {
12
12
  jest.spyOn(Storage.prototype, 'setItem').mockImplementation(() => { });
13
13
  jest.spyOn(Storage.prototype, 'removeItem').mockImplementation(() => { });
14
- const result = (0, database_1.databaseFactory)();
14
+ const result = (0, database_1.databaseFactory)('testOrganization');
15
15
  expect(result).toBeInstanceOf(local_storage_1.LocalStorage);
16
16
  });
17
17
  it('should return a MemoryStorage instance if local storage is not enabled', () => {
@@ -19,7 +19,7 @@ describe('databaseFactory', () => {
19
19
  throw new Error('Local storage not available');
20
20
  });
21
21
  jest.spyOn(Storage.prototype, 'removeItem').mockImplementation(() => { });
22
- const result = (0, database_1.databaseFactory)();
22
+ const result = (0, database_1.databaseFactory)('testOrganization');
23
23
  expect(result).toBeInstanceOf(memory_storage_1.MemoryStorage);
24
24
  });
25
25
  });
@@ -1,8 +1,8 @@
1
1
  import { Batch } from '../types';
2
2
  export interface Database {
3
- setItem(item: Batch): Promise<void>;
3
+ setItem(item: Batch, publicApiKey: string): Promise<void>;
4
4
  getItem(id: string): Promise<Batch>;
5
5
  removeItem(id: string): Promise<void>;
6
- getAllItems(): Promise<Batch[]>;
6
+ getAllItems(): Promise<Record<string, Batch[]>>;
7
7
  reset(): Promise<void>;
8
8
  }
@@ -1 +1,2 @@
1
1
  export * from './database';
2
+ export * from './database.types';
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./database"), exports);
18
+ __exportStar(require("./database.types"), exports);
@@ -2,10 +2,10 @@ import { Batch } from '../../types';
2
2
  import { Database } from '../database.types';
3
3
  export declare class LocalStorage implements Database {
4
4
  #private;
5
- constructor();
5
+ constructor(organizationName: string);
6
6
  reset(): Promise<void>;
7
- setItem(item: Batch): Promise<void>;
7
+ setItem(item: Batch, publicApiKey: string): Promise<void>;
8
8
  getItem(id: string): Promise<Batch>;
9
9
  removeItem(id: string): Promise<void>;
10
- getAllItems(): Promise<Batch[]>;
10
+ getAllItems(): Promise<Record<string, Batch[]>>;
11
11
  }
@@ -13,23 +13,30 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var _LocalStorage_instances, _LocalStorage_localStorage, _LocalStorage_databaseName, _LocalStorage_getDatabase;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.LocalStorage = void 0;
16
+ const utils_1 = require("../../utils");
17
+ const DATABASE_NAME_SPACE = 'YUNO_EVENT_LOGS';
16
18
  class LocalStorage {
17
- constructor() {
19
+ constructor(organizationName) {
18
20
  _LocalStorage_instances.add(this);
19
21
  _LocalStorage_localStorage.set(this, void 0);
20
- _LocalStorage_databaseName.set(this, 'YUNO_EVENT_LOGS');
22
+ _LocalStorage_databaseName.set(this, void 0);
21
23
  __classPrivateFieldSet(this, _LocalStorage_localStorage, window.localStorage, "f");
24
+ __classPrivateFieldSet(this, _LocalStorage_databaseName, `${DATABASE_NAME_SPACE}_${organizationName}`, "f");
22
25
  const database = __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").getItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"));
23
26
  if (database === null || database === undefined) {
24
- __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").setItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"), JSON.stringify([]));
27
+ this.reset();
25
28
  }
26
29
  }
27
30
  async reset() {
28
- __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").setItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"), JSON.stringify([]));
31
+ __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").setItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"), JSON.stringify({}));
29
32
  }
30
- async setItem(item) {
33
+ async setItem(item, publicApiKey) {
31
34
  const database = __classPrivateFieldGet(this, _LocalStorage_instances, "m", _LocalStorage_getDatabase).call(this);
32
- __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").setItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"), JSON.stringify([...database, item]));
35
+ if (database[publicApiKey] === undefined) {
36
+ database[publicApiKey] = [];
37
+ }
38
+ database[publicApiKey].push(item);
39
+ __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").setItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"), (0, utils_1.stringify)(database));
33
40
  }
34
41
  getItem(id) {
35
42
  throw new Error('Method not implemented.' + id);
@@ -38,14 +45,16 @@ class LocalStorage {
38
45
  throw new Error('Method not implemented.' + id);
39
46
  }
40
47
  getAllItems() {
41
- return Promise.resolve(__classPrivateFieldGet(this, _LocalStorage_instances, "m", _LocalStorage_getDatabase).call(this));
48
+ const database = __classPrivateFieldGet(this, _LocalStorage_instances, "m", _LocalStorage_getDatabase).call(this);
49
+ this.reset();
50
+ return Promise.resolve(database);
42
51
  }
43
52
  }
44
53
  exports.LocalStorage = LocalStorage;
45
54
  _LocalStorage_localStorage = new WeakMap(), _LocalStorage_databaseName = new WeakMap(), _LocalStorage_instances = new WeakSet(), _LocalStorage_getDatabase = function _LocalStorage_getDatabase() {
46
55
  let database = __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").getItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"));
47
56
  if (database === null || database === undefined) {
48
- database = JSON.stringify([]);
57
+ database = JSON.stringify({});
49
58
  __classPrivateFieldGet(this, _LocalStorage_localStorage, "f").setItem(__classPrivateFieldGet(this, _LocalStorage_databaseName, "f"), database);
50
59
  }
51
60
  return JSON.parse(database);