@yuno-payments/sdk-event-log 0.2.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 (93) hide show
  1. package/dist/cjs/api/__tests__/api.test.d.ts +1 -0
  2. package/dist/cjs/api/__tests__/api.test.js +49 -0
  3. package/dist/cjs/api/__tests__/api.utils.test.d.ts +1 -0
  4. package/dist/cjs/api/__tests__/api.utils.test.js +35 -0
  5. package/dist/cjs/api/api.d.ts +10 -0
  6. package/dist/cjs/api/api.js +41 -0
  7. package/dist/cjs/api/api.utils.d.ts +1 -0
  8. package/dist/cjs/api/api.utils.js +18 -0
  9. package/dist/cjs/api/index.d.ts +1 -0
  10. package/dist/cjs/api/index.js +17 -0
  11. package/dist/cjs/cron/cron.d.ts +10 -0
  12. package/dist/cjs/cron/cron.js +46 -0
  13. package/dist/cjs/cron/cron.test.d.ts +1 -0
  14. package/dist/cjs/cron/cron.test.js +52 -0
  15. package/dist/cjs/cron/index.d.ts +1 -0
  16. package/dist/cjs/cron/index.js +17 -0
  17. package/dist/cjs/database/database.d.ts +3 -0
  18. package/dist/cjs/database/database.js +31 -0
  19. package/dist/cjs/database/database.test.d.ts +1 -0
  20. package/dist/cjs/database/database.test.js +25 -0
  21. package/dist/cjs/database/database.types.d.ts +8 -0
  22. package/dist/cjs/database/database.types.js +2 -0
  23. package/dist/cjs/database/index.d.ts +1 -0
  24. package/dist/cjs/database/index.js +17 -0
  25. package/dist/cjs/database/local-storage/index.d.ts +1 -0
  26. package/dist/cjs/database/local-storage/index.js +17 -0
  27. package/dist/cjs/database/local-storage/local-storage.d.ts +11 -0
  28. package/dist/cjs/database/local-storage/local-storage.js +65 -0
  29. package/dist/cjs/database/local-storage/local-storage.test.d.ts +1 -0
  30. package/dist/cjs/database/local-storage/local-storage.test.js +39 -0
  31. package/dist/cjs/database/memory-storage/index.d.ts +1 -0
  32. package/dist/cjs/database/memory-storage/index.js +17 -0
  33. package/dist/cjs/database/memory-storage/memory-storage.d.ts +11 -0
  34. package/dist/cjs/database/memory-storage/memory-storage.js +51 -0
  35. package/dist/cjs/database/memory-storage/memory-storage.test.d.ts +1 -0
  36. package/dist/cjs/database/memory-storage/memory-storage.test.js +34 -0
  37. package/dist/cjs/index.d.ts +15 -0
  38. package/dist/cjs/index.js +52 -0
  39. package/dist/cjs/index.test.d.ts +1 -0
  40. package/dist/cjs/index.test.js +113 -0
  41. package/dist/cjs/index.types.d.ts +7 -0
  42. package/dist/cjs/index.types.js +2 -0
  43. package/dist/cjs/index.utils.d.ts +2 -0
  44. package/dist/cjs/index.utils.js +12 -0
  45. package/dist/cjs/types/index.d.ts +41 -0
  46. package/dist/cjs/types/index.js +14 -0
  47. package/dist/esm/api/__tests__/api.test.d.ts +1 -0
  48. package/dist/esm/api/__tests__/api.test.js +40 -0
  49. package/dist/esm/api/__tests__/api.utils.test.d.ts +1 -0
  50. package/dist/esm/api/__tests__/api.utils.test.js +35 -0
  51. package/dist/esm/api/api.d.ts +10 -0
  52. package/dist/esm/api/api.js +41 -0
  53. package/dist/esm/api/api.utils.d.ts +1 -0
  54. package/dist/esm/api/api.utils.js +18 -0
  55. package/dist/esm/api/index.d.ts +1 -0
  56. package/dist/esm/api/index.js +17 -0
  57. package/dist/esm/cron/cron.d.ts +10 -0
  58. package/dist/esm/cron/cron.js +46 -0
  59. package/dist/esm/cron/cron.test.d.ts +1 -0
  60. package/dist/esm/cron/cron.test.js +43 -0
  61. package/dist/esm/cron/index.d.ts +1 -0
  62. package/dist/esm/cron/index.js +17 -0
  63. package/dist/esm/database/database.d.ts +3 -0
  64. package/dist/esm/database/database.js +31 -0
  65. package/dist/esm/database/database.test.d.ts +1 -0
  66. package/dist/esm/database/database.test.js +25 -0
  67. package/dist/esm/database/database.types.d.ts +8 -0
  68. package/dist/esm/database/database.types.js +2 -0
  69. package/dist/esm/database/index.d.ts +1 -0
  70. package/dist/esm/database/index.js +17 -0
  71. package/dist/esm/database/local-storage/index.d.ts +1 -0
  72. package/dist/esm/database/local-storage/index.js +17 -0
  73. package/dist/esm/database/local-storage/local-storage.d.ts +11 -0
  74. package/dist/esm/database/local-storage/local-storage.js +52 -0
  75. package/dist/esm/database/local-storage/local-storage.test.d.ts +1 -0
  76. package/dist/esm/database/local-storage/local-storage.test.js +30 -0
  77. package/dist/esm/database/memory-storage/index.d.ts +1 -0
  78. package/dist/esm/database/memory-storage/index.js +17 -0
  79. package/dist/esm/database/memory-storage/memory-storage.d.ts +11 -0
  80. package/dist/esm/database/memory-storage/memory-storage.js +38 -0
  81. package/dist/esm/database/memory-storage/memory-storage.test.d.ts +1 -0
  82. package/dist/esm/database/memory-storage/memory-storage.test.js +25 -0
  83. package/dist/esm/index.d.ts +15 -0
  84. package/dist/esm/index.js +52 -0
  85. package/dist/esm/index.test.d.ts +1 -0
  86. package/dist/esm/index.test.js +104 -0
  87. package/dist/esm/index.types.d.ts +7 -0
  88. package/dist/esm/index.types.js +2 -0
  89. package/dist/esm/index.utils.d.ts +2 -0
  90. package/dist/esm/index.utils.js +12 -0
  91. package/dist/esm/types/index.d.ts +41 -0
  92. package/dist/esm/types/index.js +14 -0
  93. package/package.json +51 -0
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
12
+ if (kind === "m") throw new TypeError("Private method is not writable");
13
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
14
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
15
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
16
+ };
17
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
19
+ 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");
20
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
+ };
22
+ var _MemoryStorage_items;
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.MemoryStorage = void 0;
25
+ class MemoryStorage {
26
+ constructor() {
27
+ _MemoryStorage_items.set(this, void 0);
28
+ __classPrivateFieldSet(this, _MemoryStorage_items, [], "f");
29
+ }
30
+ reset() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ __classPrivateFieldSet(this, _MemoryStorage_items, [], "f");
33
+ });
34
+ }
35
+ setItem(item) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ __classPrivateFieldGet(this, _MemoryStorage_items, "f").push(item);
38
+ });
39
+ }
40
+ getItem(id) {
41
+ throw new Error('Method not implemented.' + id);
42
+ }
43
+ removeItem(id) {
44
+ throw new Error('Method not implemented.' + id);
45
+ }
46
+ getAllItems() {
47
+ return Promise.resolve(__classPrivateFieldGet(this, _MemoryStorage_items, "f"));
48
+ }
49
+ }
50
+ exports.MemoryStorage = MemoryStorage;
51
+ _MemoryStorage_items = new WeakMap();
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const types_1 = require("../../types");
13
+ const memory_storage_1 = require("./memory-storage");
14
+ const batch = {
15
+ source: 'test',
16
+ event: 'testEvent',
17
+ description: 'Test event',
18
+ original_created_at: new Date().toISOString(),
19
+ type: types_1.EventLogType.EVENT,
20
+ };
21
+ describe('MemoryStorage', () => {
22
+ let memoryStorage;
23
+ beforeEach(() => {
24
+ memoryStorage = new memory_storage_1.MemoryStorage();
25
+ });
26
+ afterEach(() => {
27
+ memoryStorage.reset();
28
+ });
29
+ it('should set an item in the database', () => __awaiter(void 0, void 0, void 0, function* () {
30
+ yield memoryStorage.setItem(batch);
31
+ const database = yield memoryStorage.getAllItems();
32
+ expect(database).toEqual([batch]);
33
+ }));
34
+ });
@@ -0,0 +1,15 @@
1
+ import { InitArgs } from './index.types';
2
+ import './database';
3
+ import { Event, Log } from './types';
4
+ declare class EventLog {
5
+ #private;
6
+ init({ publicApiKey, platform, batchTime, enableEvents, enableLogs }: InitArgs): void;
7
+ event(eventArgs: Omit<Event, 'type'>): Promise<void> | undefined;
8
+ logger: {
9
+ error: (errorArgs: Omit<Log, 'level' | 'type'>) => Promise<void> | undefined;
10
+ debug: (debugArgs: Omit<Log, 'level' | 'type'>) => Promise<void> | undefined;
11
+ info: (infoArgs: Omit<Log, 'level' | 'type'>) => Promise<void> | undefined;
12
+ };
13
+ }
14
+ export declare const eventLog: EventLog;
15
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _EventLog_enableEvents, _EventLog_enableLogs;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.eventLog = void 0;
16
+ const api_1 = require("./api");
17
+ require("./database");
18
+ const cron_1 = require("./cron");
19
+ const types_1 = require("./types");
20
+ const database_1 = require("./database");
21
+ const index_utils_1 = require("./index.utils");
22
+ class EventLog {
23
+ constructor() {
24
+ _EventLog_enableEvents.set(this, false);
25
+ _EventLog_enableLogs.set(this, false);
26
+ this.logger = {
27
+ error: (errorArgs) => {
28
+ return (0, index_utils_1.setLog)(errorArgs, types_1.Level.ERROR, __classPrivateFieldGet(this, _EventLog_enableLogs, "f"));
29
+ },
30
+ debug: (debugArgs) => {
31
+ return (0, index_utils_1.setLog)(debugArgs, types_1.Level.DEBUG, __classPrivateFieldGet(this, _EventLog_enableLogs, "f"));
32
+ },
33
+ info: (infoArgs) => {
34
+ return (0, index_utils_1.setLog)(infoArgs, types_1.Level.INFO, __classPrivateFieldGet(this, _EventLog_enableLogs, "f"));
35
+ }
36
+ };
37
+ }
38
+ init({ publicApiKey, platform = 'web', batchTime, enableEvents, enableLogs }) {
39
+ __classPrivateFieldSet(this, _EventLog_enableEvents, enableEvents, "f");
40
+ __classPrivateFieldSet(this, _EventLog_enableLogs, enableLogs, "f");
41
+ api_1.api.init(publicApiKey, platform);
42
+ cron_1.cron.init(batchTime);
43
+ }
44
+ event(eventArgs) {
45
+ if (!__classPrivateFieldGet(this, _EventLog_enableEvents, "f")) {
46
+ return;
47
+ }
48
+ return database_1.database.setItem(Object.assign(Object.assign({}, eventArgs), { type: types_1.EventLogType.EVENT }));
49
+ }
50
+ }
51
+ _EventLog_enableEvents = new WeakMap(), _EventLog_enableLogs = new WeakMap();
52
+ exports.eventLog = new EventLog();
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const index_1 = require("./index");
13
+ const database_1 = require("./database");
14
+ const cron_1 = require("./cron");
15
+ const PUBLIC_API_KEY = 'staging_gAAAAABj-NC2WEf3XA4lHnN6RfGbjETf6qL27jlU7c1tm01ERV-Y-E6ddee1QPyV_CA8cxjVlGy-qDNA2-mqa9msQlTJit-Fmbvv6f2AZdfbFd_CUo1stvixnF4_8MzM_IYVWYz7KK86VfEBvxNpjRCyp7BDef-QzrT1-yqa8HAYTuA1GU3Hjjo=';
16
+ const eventArgs = {
17
+ source: 'test',
18
+ event: 'testEvent',
19
+ description: 'Test event',
20
+ original_created_at: new Date().toISOString(),
21
+ };
22
+ const logArgs = {
23
+ sdk_version: '',
24
+ url: '',
25
+ method: '',
26
+ country: '',
27
+ original_created_at: new Date().toISOString()
28
+ };
29
+ describe('EventLog', () => {
30
+ beforeEach(() => {
31
+ // Reset the database before each test
32
+ // to ensure a clean slate
33
+ index_1.eventLog.init({
34
+ publicApiKey: PUBLIC_API_KEY,
35
+ batchTime: 500,
36
+ enableEvents: true,
37
+ enableLogs: true,
38
+ });
39
+ database_1.database.reset();
40
+ });
41
+ afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
42
+ yield new Promise((resolve) => setTimeout(resolve, 1000));
43
+ cron_1.cron.stop();
44
+ }));
45
+ it('should add an event to the database', () => __awaiter(void 0, void 0, void 0, function* () {
46
+ index_1.eventLog.event(eventArgs);
47
+ const events = yield database_1.database.getAllItems();
48
+ expect(events).toHaveLength(1);
49
+ expect(events[0]).toMatchObject(eventArgs);
50
+ }));
51
+ it('should not add an event to the database if events are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
52
+ index_1.eventLog.init({
53
+ publicApiKey: PUBLIC_API_KEY,
54
+ batchTime: 1000,
55
+ enableEvents: false,
56
+ enableLogs: true,
57
+ });
58
+ index_1.eventLog.event(eventArgs);
59
+ const events = yield database_1.database.getAllItems();
60
+ expect(events).toHaveLength(0);
61
+ }));
62
+ it('should log an error', () => __awaiter(void 0, void 0, void 0, function* () {
63
+ index_1.eventLog.logger.error(logArgs);
64
+ const events = yield database_1.database.getAllItems();
65
+ expect(events).toHaveLength(1);
66
+ expect(events[0]).toMatchObject(logArgs);
67
+ }));
68
+ it('should not log an error if logs are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
69
+ index_1.eventLog.init({
70
+ publicApiKey: PUBLIC_API_KEY,
71
+ batchTime: 1000,
72
+ enableEvents: false,
73
+ enableLogs: false,
74
+ });
75
+ index_1.eventLog.logger.error(logArgs);
76
+ const events = yield database_1.database.getAllItems();
77
+ expect(events).toHaveLength(0);
78
+ }));
79
+ it('should log a debug message', () => __awaiter(void 0, void 0, void 0, function* () {
80
+ index_1.eventLog.logger.debug(logArgs);
81
+ const events = yield database_1.database.getAllItems();
82
+ expect(events).toHaveLength(1);
83
+ expect(events[0]).toMatchObject(logArgs);
84
+ }));
85
+ it('should not log a debug message if logs are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
86
+ index_1.eventLog.init({
87
+ publicApiKey: PUBLIC_API_KEY,
88
+ batchTime: 1000,
89
+ enableEvents: false,
90
+ enableLogs: false,
91
+ });
92
+ index_1.eventLog.logger.debug(logArgs);
93
+ const events = yield database_1.database.getAllItems();
94
+ expect(events).toHaveLength(0);
95
+ }));
96
+ it('should log an info message', () => __awaiter(void 0, void 0, void 0, function* () {
97
+ index_1.eventLog.logger.info(logArgs);
98
+ const events = yield database_1.database.getAllItems();
99
+ expect(events).toHaveLength(1);
100
+ expect(events[0]).toMatchObject(logArgs);
101
+ }));
102
+ it('should not log an info message if logs are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
103
+ index_1.eventLog.init({
104
+ publicApiKey: PUBLIC_API_KEY,
105
+ batchTime: 1000,
106
+ enableEvents: false,
107
+ enableLogs: false,
108
+ });
109
+ index_1.eventLog.logger.info(logArgs);
110
+ const events = yield database_1.database.getAllItems();
111
+ expect(events).toHaveLength(0);
112
+ }));
113
+ });
@@ -0,0 +1,7 @@
1
+ export type InitArgs = {
2
+ publicApiKey: string;
3
+ batchTime: number;
4
+ enableEvents: boolean;
5
+ enableLogs: boolean;
6
+ platform?: string;
7
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ import { Level, Log } from './types';
2
+ export declare function setLog(logArgs: Omit<Log, 'level' | 'type'>, level: Level, enableLog: boolean): Promise<void> | undefined;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setLog = void 0;
4
+ const database_1 = require("./database");
5
+ const types_1 = require("./types");
6
+ function setLog(logArgs, level, enableLog) {
7
+ if (!enableLog) {
8
+ return;
9
+ }
10
+ return database_1.database.setItem(Object.assign(Object.assign({}, logArgs), { level, type: types_1.EventLogType.LOG }));
11
+ }
12
+ exports.setLog = setLog;
@@ -0,0 +1,41 @@
1
+ export declare enum EventLogType {
2
+ LOG = "LOG",
3
+ EVENT = "EVENT"
4
+ }
5
+ export declare enum Level {
6
+ ERROR = "ERROR",
7
+ DEBUG = "DEBUG",
8
+ INFO = "INFO"
9
+ }
10
+ type BaseEventLog = {
11
+ type: EventLogType;
12
+ customer_session?: string;
13
+ checkout_session?: string;
14
+ original_created_at: string;
15
+ };
16
+ export type Log = BaseEventLog & {
17
+ sdk_version: string;
18
+ os?: string;
19
+ url: string;
20
+ method: string;
21
+ headers?: object;
22
+ request?: object;
23
+ response?: object;
24
+ status_code?: number;
25
+ trace_id?: string;
26
+ metadata?: unknown;
27
+ country: string;
28
+ organization_name?: string;
29
+ level: Level;
30
+ stack_trace?: string;
31
+ };
32
+ export type Event = BaseEventLog & {
33
+ source: string;
34
+ event: string;
35
+ entity_code?: string;
36
+ user_email?: string;
37
+ description: string;
38
+ headers?: object;
39
+ };
40
+ export type Batch = Log | Event;
41
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Level = exports.EventLogType = void 0;
4
+ var EventLogType;
5
+ (function (EventLogType) {
6
+ EventLogType["LOG"] = "LOG";
7
+ EventLogType["EVENT"] = "EVENT";
8
+ })(EventLogType || (exports.EventLogType = EventLogType = {}));
9
+ var Level;
10
+ (function (Level) {
11
+ Level["ERROR"] = "ERROR";
12
+ Level["DEBUG"] = "DEBUG";
13
+ Level["INFO"] = "INFO";
14
+ })(Level || (exports.Level = Level = {}));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const types_1 = require("../../types");
4
+ const api_1 = require("../api");
5
+ const PUBLIC_API_KEY = 'staging_gAAAAABj-NC2WEf3XA4lHnN6RfGbjETf6qL27jlU7c1tm01ERV-Y-E6ddee1QPyV_CA8cxjVlGy-qDNA2-mqa9msQlTJit-Fmbvv6f2AZdfbFd_CUo1stvixnF4_8MzM_IYVWYz7KK86VfEBvxNpjRCyp7BDef-QzrT1-yqa8HAYTuA1GU3Hjjo=';
6
+ const publicApiKey = PUBLIC_API_KEY;
7
+ const platform = 'web';
8
+ const STATUS_CREATED = 201;
9
+ describe('Api', () => {
10
+ beforeEach(() => {
11
+ // 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();
16
+ });
17
+ 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);
21
+ expect(instance === null || instance === void 0 ? void 0 : instance.defaults.headers['X-Platform']).toBe(platform);
22
+ });
23
+ it('should send a batch of events to the server', async () => {
24
+ const batches = [
25
+ {
26
+ source: 'test',
27
+ event: 'testEvent',
28
+ description: 'Test event',
29
+ original_created_at: new Date().toISOString(),
30
+ type: types_1.EventLogType.EVENT,
31
+ },
32
+ ];
33
+ const response = await api_1.api.sendBatch(batches);
34
+ expect(response === null || response === void 0 ? void 0 : response.status).toBe(STATUS_CREATED);
35
+ });
36
+ it('should return the instance', () => {
37
+ const instance = api_1.api.getInstances();
38
+ expect(instance).not.toBeNull();
39
+ });
40
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const api_utils_1 = require("../api.utils");
4
+ describe('getBaseUrl', () => {
5
+ it('should return the correct base URL for a dev environment', () => {
6
+ const publicApiKey = 'dev_1234567890';
7
+ const expectedUrl = 'https://api-dev.y.uno/v1';
8
+ const result = (0, api_utils_1.getBaseUrl)(publicApiKey);
9
+ expect(result).toBe(expectedUrl);
10
+ });
11
+ it('should return the correct base URL for a staging environment', () => {
12
+ const publicApiKey = 'staging_1234567890';
13
+ const expectedUrl = 'https://api-staging.y.uno/v1';
14
+ const result = (0, api_utils_1.getBaseUrl)(publicApiKey);
15
+ expect(result).toBe(expectedUrl);
16
+ });
17
+ it('should return the correct base URL for a sandbox environment', () => {
18
+ const publicApiKey = 'sandbox_1234567890';
19
+ const expectedUrl = 'https://api-sandbox.y.uno/v1';
20
+ const result = (0, api_utils_1.getBaseUrl)(publicApiKey);
21
+ expect(result).toBe(expectedUrl);
22
+ });
23
+ it('should return the correct base URL for a prod environment', () => {
24
+ const publicApiKey = 'prod_1234567890';
25
+ const expectedUrl = 'https://api.y.uno/v1';
26
+ const result = (0, api_utils_1.getBaseUrl)(publicApiKey);
27
+ expect(result).toBe(expectedUrl);
28
+ });
29
+ it('should throw an error for an invalid public API key', () => {
30
+ const publicApiKey = 'invalidApiKey';
31
+ expect(() => {
32
+ (0, api_utils_1.getBaseUrl)(publicApiKey);
33
+ }).toThrowError('Not environment found publicApiKey: invalidApiKey, apiKeyPrefix: invalidApiKey, environmentSuffix: undefined');
34
+ });
35
+ });
@@ -0,0 +1,10 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { Batch } from '../types';
3
+ declare class Api {
4
+ #private;
5
+ init(publicApiKey: string, platform: string): void;
6
+ sendBatch(batches: Batch[]): Promise<import("axios").AxiosResponse<any, any>> | undefined;
7
+ getInstances(): AxiosInstance | null;
8
+ }
9
+ export declare const api: Api;
10
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _Api_instance;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.api = void 0;
19
+ const axios_1 = __importDefault(require("axios"));
20
+ const api_utils_1 = require("./api.utils");
21
+ class Api {
22
+ constructor() {
23
+ _Api_instance.set(this, null);
24
+ }
25
+ init(publicApiKey, platform) {
26
+ __classPrivateFieldSet(this, _Api_instance, axios_1.default.create({
27
+ baseURL: (0, api_utils_1.getBaseUrl)(publicApiKey),
28
+ // eslint-disable-next-line @typescript-eslint/naming-convention
29
+ headers: { 'public-api-key': publicApiKey, 'X-Platform': platform },
30
+ }), "f");
31
+ }
32
+ sendBatch(batches) {
33
+ var _a;
34
+ return (_a = __classPrivateFieldGet(this, _Api_instance, "f")) === null || _a === void 0 ? void 0 : _a.post('/sdk-event-log/publish', { batch: batches });
35
+ }
36
+ getInstances() {
37
+ return __classPrivateFieldGet(this, _Api_instance, "f");
38
+ }
39
+ }
40
+ _Api_instance = new WeakMap();
41
+ exports.api = new Api();
@@ -0,0 +1 @@
1
+ export declare const getBaseUrl: (publicApiKey: string) => string;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBaseUrl = void 0;
4
+ const ApiKeyPrefixToEnvironmentSuffix = {
5
+ dev: '-dev',
6
+ staging: '-staging',
7
+ sandbox: '-sandbox',
8
+ prod: '',
9
+ };
10
+ const getBaseUrl = (publicApiKey) => {
11
+ const [apiKeyPrefix] = publicApiKey.split('_');
12
+ const environmentSuffix = ApiKeyPrefixToEnvironmentSuffix[apiKeyPrefix];
13
+ if (environmentSuffix === undefined) {
14
+ throw new Error(`Not environment found publicApiKey: ${publicApiKey}, apiKeyPrefix: ${apiKeyPrefix}, environmentSuffix: ${environmentSuffix}`);
15
+ }
16
+ return 'https://api_ENVIRONMENT_.y.uno/v1'.replace('_ENVIRONMENT_', environmentSuffix);
17
+ };
18
+ exports.getBaseUrl = getBaseUrl;
@@ -0,0 +1 @@
1
+ export * from './api';
@@ -0,0 +1,17 @@
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("./api"), exports);
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ declare class Cron {
3
+ #private;
4
+ init(batchTime: number): void;
5
+ sendBatch(): void;
6
+ stop(): void;
7
+ getInterval(): NodeJS.Timeout | undefined;
8
+ }
9
+ export declare const cron: Cron;
10
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _Cron_interval;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.cron = void 0;
16
+ const api_1 = require("../api");
17
+ const database_1 = require("../database");
18
+ const NONE_ITEMS = 0;
19
+ class Cron {
20
+ constructor() {
21
+ _Cron_interval.set(this, void 0);
22
+ }
23
+ init(batchTime) {
24
+ this.stop();
25
+ __classPrivateFieldSet(this, _Cron_interval, setInterval(this.sendBatch, batchTime), "f");
26
+ }
27
+ sendBatch() {
28
+ database_1.database.getAllItems().then((items) => {
29
+ var _a;
30
+ if (items.length > NONE_ITEMS) {
31
+ (_a = api_1.api.sendBatch(items)) === null || _a === void 0 ? void 0 : _a.then(() => database_1.database.reset());
32
+ }
33
+ });
34
+ }
35
+ stop() {
36
+ if (__classPrivateFieldGet(this, _Cron_interval, "f")) {
37
+ clearInterval(__classPrivateFieldGet(this, _Cron_interval, "f"));
38
+ __classPrivateFieldSet(this, _Cron_interval, undefined, "f");
39
+ }
40
+ }
41
+ getInterval() {
42
+ return __classPrivateFieldGet(this, _Cron_interval, "f");
43
+ }
44
+ }
45
+ _Cron_interval = new WeakMap();
46
+ exports.cron = new Cron();
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cron_1 = require("./cron");
4
+ const api_1 = require("../api");
5
+ const database_1 = require("../database");
6
+ const types_1 = require("../types");
7
+ const TIME_INTERVAL = 1000;
8
+ describe('Cron', () => {
9
+ let spy;
10
+ beforeEach(async () => {
11
+ // restore the spy created with spyOn
12
+ jest.restoreAllMocks();
13
+ spy = jest.spyOn(api_1.api, 'sendBatch');
14
+ await database_1.database.reset();
15
+ });
16
+ it('should send a batch of items to the API if there are items in the database', async () => {
17
+ const batch = {
18
+ source: 'test',
19
+ event: 'testEvent',
20
+ description: 'Test event',
21
+ original_created_at: new Date().toISOString(),
22
+ type: types_1.EventLogType.EVENT,
23
+ };
24
+ database_1.database.setItem(batch);
25
+ await cron_1.cron.sendBatch();
26
+ expect(spy).toHaveBeenCalledWith([batch]);
27
+ });
28
+ 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();
30
+ expect(spy).not.toHaveBeenCalled();
31
+ });
32
+ it('should stop the interval when stop is called', () => {
33
+ jest.useFakeTimers();
34
+ cron_1.cron.init(TIME_INTERVAL);
35
+ cron_1.cron.stop();
36
+ expect(cron_1.cron.getInterval()).toBeUndefined();
37
+ });
38
+ it('should start the interval when init is called', () => {
39
+ jest.useFakeTimers();
40
+ cron_1.cron.init(TIME_INTERVAL);
41
+ expect(cron_1.cron.getInterval()).toBeDefined();
42
+ });
43
+ });
@@ -0,0 +1 @@
1
+ export * from './cron';