@yuno-payments/sdk-event-log 0.2.0 → 0.3.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/__tests__/api.test.js +5 -9
- package/dist/cjs/api/api.d.ts +3 -5
- package/dist/cjs/api/api.js +18 -11
- package/dist/cjs/cron/cron.d.ts +5 -5
- package/dist/cjs/cron/cron.js +26 -14
- package/dist/cjs/cron/cron.test.js +15 -11
- package/dist/cjs/database/database.d.ts +1 -2
- package/dist/cjs/database/database.js +3 -4
- package/dist/cjs/database/database.test.js +2 -2
- package/dist/cjs/database/database.types.d.ts +2 -2
- package/dist/cjs/database/index.d.ts +1 -0
- package/dist/cjs/database/index.js +1 -0
- package/dist/cjs/database/local-storage/local-storage.d.ts +3 -3
- package/dist/cjs/database/local-storage/local-storage.js +16 -8
- package/dist/cjs/database/local-storage/local-storage.test.js +7 -6
- package/dist/cjs/database/memory-storage/memory-storage.d.ts +4 -2
- package/dist/cjs/database/memory-storage/memory-storage.js +10 -5
- package/dist/cjs/database/memory-storage/memory-storage.test.js +2 -2
- package/dist/cjs/index.d.ts +7 -9
- package/dist/cjs/index.js +43 -21
- package/dist/cjs/index.test.js +146 -84
- package/dist/cjs/index.types.d.ts +5 -4
- package/dist/cjs/index.utils.d.ts +2 -1
- package/dist/cjs/index.utils.js +2 -3
- package/dist/cjs/types/index.d.ts +13 -13
- package/dist/esm/api/__tests__/api.test.js +5 -9
- package/dist/esm/api/api.d.ts +3 -5
- package/dist/esm/api/api.js +18 -11
- package/dist/esm/cron/cron.d.ts +5 -5
- package/dist/esm/cron/cron.js +17 -16
- package/dist/esm/cron/cron.test.js +15 -11
- package/dist/esm/database/database.d.ts +1 -2
- package/dist/esm/database/database.js +3 -4
- package/dist/esm/database/database.test.js +2 -2
- package/dist/esm/database/database.types.d.ts +2 -2
- package/dist/esm/database/index.d.ts +1 -0
- package/dist/esm/database/index.js +1 -0
- package/dist/esm/database/local-storage/local-storage.d.ts +3 -3
- package/dist/esm/database/local-storage/local-storage.js +16 -8
- package/dist/esm/database/local-storage/local-storage.test.js +7 -6
- package/dist/esm/database/memory-storage/memory-storage.d.ts +4 -2
- package/dist/esm/database/memory-storage/memory-storage.js +10 -5
- package/dist/esm/database/memory-storage/memory-storage.test.js +2 -2
- package/dist/esm/index.d.ts +7 -9
- package/dist/esm/index.js +32 -21
- package/dist/esm/index.test.js +137 -75
- package/dist/esm/index.types.d.ts +5 -4
- package/dist/esm/index.utils.d.ts +2 -1
- package/dist/esm/index.utils.js +2 -3
- package/dist/esm/types/index.d.ts +13 -13
- package/package.json +2 -1
package/dist/cjs/index.test.js
CHANGED
|
@@ -10,9 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const index_1 = require("./index");
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
const node_1 = require("msw/node");
|
|
15
|
+
const msw_1 = require("msw");
|
|
16
16
|
const eventArgs = {
|
|
17
17
|
source: 'test',
|
|
18
18
|
event: 'testEvent',
|
|
@@ -24,90 +24,152 @@ const logArgs = {
|
|
|
24
24
|
url: '',
|
|
25
25
|
method: '',
|
|
26
26
|
country: '',
|
|
27
|
-
original_created_at: new Date().toISOString()
|
|
27
|
+
original_created_at: new Date().toISOString(),
|
|
28
28
|
};
|
|
29
|
+
const publicApiKey = 'prod_1';
|
|
30
|
+
let mockInterceptRequest = jest.fn();
|
|
31
|
+
const server = (0, node_1.setupServer)(
|
|
32
|
+
// Describe the requests to mock.
|
|
33
|
+
msw_1.rest.post('https://api.y.uno/v1/sdk/event-log/publish', (req, res, ctx) => {
|
|
34
|
+
mockInterceptRequest(req.body);
|
|
35
|
+
return res(ctx.status(200));
|
|
36
|
+
}));
|
|
29
37
|
describe('EventLog', () => {
|
|
38
|
+
let eventLog;
|
|
39
|
+
beforeAll(() => {
|
|
40
|
+
mockInterceptRequest = jest.fn();
|
|
41
|
+
server.listen();
|
|
42
|
+
});
|
|
43
|
+
// Reset any request handlers that we may add during the tests,
|
|
44
|
+
// so they don't affect other tests.
|
|
45
|
+
afterEach(() => server.resetHandlers());
|
|
46
|
+
// Clean up after the tests are finished.
|
|
47
|
+
afterAll(() => server.close());
|
|
30
48
|
beforeEach(() => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
publicApiKey: PUBLIC_API_KEY,
|
|
35
|
-
batchTime: 500,
|
|
36
|
-
enableEvents: true,
|
|
37
|
-
enableLogs: true,
|
|
49
|
+
eventLog = new index_1.EventLog({
|
|
50
|
+
organizationName: 'testOrg',
|
|
51
|
+
debug: false,
|
|
38
52
|
});
|
|
39
|
-
database_1.database.reset();
|
|
40
53
|
});
|
|
41
|
-
afterEach(() =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
publicApiKey
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
54
|
+
afterEach(() => {
|
|
55
|
+
jest.clearAllMocks();
|
|
56
|
+
});
|
|
57
|
+
describe('event', () => {
|
|
58
|
+
it('should add an event to the database if events are enabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
eventLog.event(eventArgs, publicApiKey);
|
|
60
|
+
eventLog.sendBatch();
|
|
61
|
+
yield new Promise(process.nextTick);
|
|
62
|
+
expect(mockInterceptRequest).toHaveBeenCalledWith({
|
|
63
|
+
batch: [Object.assign(Object.assign({}, eventArgs), { type: types_1.EventLogType.EVENT })],
|
|
64
|
+
});
|
|
65
|
+
}));
|
|
66
|
+
it('should not add an event to the database if events are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
+
const publicApiKey = 'testApiKey';
|
|
68
|
+
eventLog = new index_1.EventLog({
|
|
69
|
+
organizationName: 'testOrg',
|
|
70
|
+
enableEvents: false,
|
|
71
|
+
});
|
|
72
|
+
eventLog.event(eventArgs, publicApiKey);
|
|
73
|
+
eventLog.sendBatch();
|
|
74
|
+
yield new Promise(process.nextTick);
|
|
75
|
+
expect(mockInterceptRequest).not.toHaveBeenCalled();
|
|
76
|
+
}));
|
|
77
|
+
});
|
|
78
|
+
describe('logger', () => {
|
|
79
|
+
it('should add an error log to the database if logs are enabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
80
|
+
eventLog.logger.error(logArgs, publicApiKey);
|
|
81
|
+
eventLog.sendBatch();
|
|
82
|
+
yield new Promise(process.nextTick);
|
|
83
|
+
expect(mockInterceptRequest).toHaveBeenCalledWith({
|
|
84
|
+
batch: [Object.assign(Object.assign({}, logArgs), { type: types_1.EventLogType.LOG, level: types_1.Level.ERROR })],
|
|
85
|
+
});
|
|
86
|
+
}));
|
|
87
|
+
it('should not add an error log to the database if logs are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
88
|
+
const publicApiKey = 'testApiKey';
|
|
89
|
+
eventLog = new index_1.EventLog({
|
|
90
|
+
organizationName: 'testOrg',
|
|
91
|
+
enableEvents: true,
|
|
92
|
+
enableLogs: false,
|
|
93
|
+
debug: false,
|
|
94
|
+
});
|
|
95
|
+
eventLog.logger.error(logArgs, publicApiKey);
|
|
96
|
+
eventLog.sendBatch();
|
|
97
|
+
yield new Promise(process.nextTick);
|
|
98
|
+
expect(mockInterceptRequest).not.toHaveBeenCalled();
|
|
99
|
+
}));
|
|
100
|
+
it('should add a debug log to the database if logs are enabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
101
|
+
eventLog.logger.debug(logArgs, publicApiKey);
|
|
102
|
+
eventLog.sendBatch();
|
|
103
|
+
yield new Promise(process.nextTick);
|
|
104
|
+
expect(mockInterceptRequest).toHaveBeenCalledWith({
|
|
105
|
+
batch: [Object.assign(Object.assign({}, logArgs), { type: types_1.EventLogType.LOG, level: types_1.Level.DEBUG })],
|
|
106
|
+
});
|
|
107
|
+
}));
|
|
108
|
+
it('should not add a debug log to the database if logs are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
109
|
+
const publicApiKey = 'testApiKey';
|
|
110
|
+
eventLog = new index_1.EventLog({
|
|
111
|
+
organizationName: 'testOrg',
|
|
112
|
+
platform: 'web',
|
|
113
|
+
enableEvents: true,
|
|
114
|
+
enableLogs: false,
|
|
115
|
+
debug: false,
|
|
116
|
+
});
|
|
117
|
+
eventLog.logger.debug(logArgs, publicApiKey);
|
|
118
|
+
eventLog.sendBatch();
|
|
119
|
+
yield new Promise(process.nextTick);
|
|
120
|
+
expect(mockInterceptRequest).not.toHaveBeenCalled();
|
|
121
|
+
}));
|
|
122
|
+
it('should add an info log to the database if logs are enabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
123
|
+
eventLog.logger.info(logArgs, publicApiKey);
|
|
124
|
+
eventLog.sendBatch();
|
|
125
|
+
yield new Promise(process.nextTick);
|
|
126
|
+
expect(mockInterceptRequest).toHaveBeenCalledWith({
|
|
127
|
+
batch: [Object.assign(Object.assign({}, logArgs), { type: types_1.EventLogType.LOG, level: types_1.Level.INFO })],
|
|
128
|
+
});
|
|
129
|
+
}));
|
|
130
|
+
it('should not add an info log to the database if logs are disabled', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
131
|
+
eventLog = new index_1.EventLog({
|
|
132
|
+
organizationName: 'testOrg',
|
|
133
|
+
platform: 'web',
|
|
134
|
+
enableEvents: true,
|
|
135
|
+
enableLogs: false,
|
|
136
|
+
debug: false,
|
|
137
|
+
});
|
|
138
|
+
eventLog.sendBatch();
|
|
139
|
+
yield new Promise(process.nextTick);
|
|
140
|
+
expect(mockInterceptRequest).not.toHaveBeenCalled();
|
|
141
|
+
}));
|
|
142
|
+
});
|
|
143
|
+
describe('sendBatch', () => {
|
|
144
|
+
it('should not send a batch of items to the API if there are no items in the database', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
145
|
+
yield eventLog.sendBatch();
|
|
146
|
+
yield new Promise(process.nextTick);
|
|
147
|
+
expect(mockInterceptRequest).not.toHaveBeenCalled();
|
|
148
|
+
}));
|
|
149
|
+
});
|
|
150
|
+
describe('Cron', () => {
|
|
151
|
+
it('should send a batch of items to the API', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
152
|
+
eventLog = new index_1.EventLog({
|
|
153
|
+
organizationName: 'testOrg',
|
|
154
|
+
platform: 'web',
|
|
155
|
+
batchTime: 1000,
|
|
156
|
+
enableEvents: true,
|
|
157
|
+
enableLogs: true,
|
|
158
|
+
debug: false,
|
|
159
|
+
});
|
|
160
|
+
yield eventLog.event(eventArgs, publicApiKey);
|
|
161
|
+
yield eventLog.logger.error(logArgs, publicApiKey);
|
|
162
|
+
yield eventLog.logger.debug(logArgs, publicApiKey);
|
|
163
|
+
yield eventLog.logger.info(logArgs, publicApiKey);
|
|
164
|
+
yield new Promise((resolve) => setTimeout(resolve, 1200));
|
|
165
|
+
expect(mockInterceptRequest).toHaveBeenCalledWith({
|
|
166
|
+
batch: [
|
|
167
|
+
Object.assign(Object.assign({}, eventArgs), { type: types_1.EventLogType.EVENT }),
|
|
168
|
+
Object.assign(Object.assign({}, logArgs), { type: types_1.EventLogType.LOG, level: types_1.Level.ERROR }),
|
|
169
|
+
Object.assign(Object.assign({}, logArgs), { type: types_1.EventLogType.LOG, level: types_1.Level.DEBUG }),
|
|
170
|
+
Object.assign(Object.assign({}, logArgs), { type: types_1.EventLogType.LOG, level: types_1.Level.INFO }),
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
}));
|
|
174
|
+
});
|
|
113
175
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export type InitArgs = {
|
|
2
|
-
|
|
3
|
-
batchTime
|
|
4
|
-
enableEvents
|
|
5
|
-
enableLogs
|
|
2
|
+
organizationName: string;
|
|
3
|
+
batchTime?: number;
|
|
4
|
+
enableEvents?: boolean;
|
|
5
|
+
enableLogs?: boolean;
|
|
6
6
|
platform?: string;
|
|
7
|
+
debug?: boolean;
|
|
7
8
|
};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
import { Database } from './database';
|
|
1
2
|
import { Level, Log } from './types';
|
|
2
|
-
export declare function setLog(logArgs: Omit<Log, 'level' | 'type'>, level: Level, enableLog: boolean): Promise<void> | undefined;
|
|
3
|
+
export declare function setLog(logArgs: Omit<Log, 'level' | 'type'>, level: Level, enableLog: boolean, database: Database, publicApiKey: string): Promise<void> | undefined;
|
package/dist/cjs/index.utils.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.setLog = void 0;
|
|
4
|
-
const database_1 = require("./database");
|
|
5
4
|
const types_1 = require("./types");
|
|
6
|
-
function setLog(logArgs, level, enableLog) {
|
|
5
|
+
function setLog(logArgs, level, enableLog, database, publicApiKey) {
|
|
7
6
|
if (!enableLog) {
|
|
8
7
|
return;
|
|
9
8
|
}
|
|
10
|
-
return
|
|
9
|
+
return database.setItem(Object.assign(Object.assign({}, logArgs), { level, type: types_1.EventLogType.LOG }), publicApiKey);
|
|
11
10
|
}
|
|
12
11
|
exports.setLog = setLog;
|
|
@@ -9,23 +9,23 @@ export declare enum Level {
|
|
|
9
9
|
}
|
|
10
10
|
type BaseEventLog = {
|
|
11
11
|
type: EventLogType;
|
|
12
|
-
customer_session?: string;
|
|
13
|
-
checkout_session?: string;
|
|
12
|
+
customer_session?: string | null;
|
|
13
|
+
checkout_session?: string | null;
|
|
14
14
|
original_created_at: string;
|
|
15
15
|
};
|
|
16
16
|
export type Log = BaseEventLog & {
|
|
17
17
|
sdk_version: string;
|
|
18
|
-
os?: string;
|
|
19
|
-
url
|
|
20
|
-
method
|
|
21
|
-
headers?: object;
|
|
22
|
-
request?: object;
|
|
23
|
-
response?: object;
|
|
24
|
-
status_code?:
|
|
25
|
-
trace_id?: string;
|
|
26
|
-
metadata?: unknown;
|
|
27
|
-
country
|
|
28
|
-
organization_name?: string;
|
|
18
|
+
os?: string | null;
|
|
19
|
+
url?: string | null;
|
|
20
|
+
method?: string | null;
|
|
21
|
+
headers?: object | null;
|
|
22
|
+
request?: object | null;
|
|
23
|
+
response?: object | null;
|
|
24
|
+
status_code?: string | null;
|
|
25
|
+
trace_id?: string | null;
|
|
26
|
+
metadata?: unknown | null;
|
|
27
|
+
country?: string | null;
|
|
28
|
+
organization_name?: string | null;
|
|
29
29
|
level: Level;
|
|
30
30
|
stack_trace?: string;
|
|
31
31
|
};
|
|
@@ -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.
|
|
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 =
|
|
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
|
|
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 =
|
|
33
|
+
const instance = api.getInstances();
|
|
38
34
|
expect(instance).not.toBeNull();
|
|
39
35
|
});
|
|
40
36
|
});
|
package/dist/esm/api/api.d.ts
CHANGED
|
@@ -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
|
-
|
|
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 {};
|
package/dist/esm/api/api.js
CHANGED
|
@@ -13,29 +13,36 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
13
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
|
-
var _Api_instance;
|
|
16
|
+
var _Api_instance, _Api_debug;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.
|
|
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
|
-
|
|
25
|
-
|
|
24
|
+
_Api_debug.set(this, false);
|
|
25
|
+
__classPrivateFieldSet(this, _Api_debug, debug, "f");
|
|
26
26
|
__classPrivateFieldSet(this, _Api_instance, axios_1.default.create({
|
|
27
|
-
baseURL: (0, api_utils_1.getBaseUrl)(publicApiKey),
|
|
28
27
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
29
|
-
headers: { '
|
|
28
|
+
headers: { 'X-Platform': platform },
|
|
30
29
|
}), "f");
|
|
31
30
|
}
|
|
32
|
-
sendBatch(batches) {
|
|
31
|
+
sendBatch(batches, publicApiKey) {
|
|
33
32
|
var _a;
|
|
34
|
-
|
|
33
|
+
if (__classPrivateFieldGet(this, _Api_debug, "f")) {
|
|
34
|
+
console.dir(batches, { depth: null });
|
|
35
|
+
console.log(publicApiKey);
|
|
36
|
+
}
|
|
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
|
+
});
|
|
35
42
|
}
|
|
36
43
|
getInstances() {
|
|
37
44
|
return __classPrivateFieldGet(this, _Api_instance, "f");
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
exports.Api = Api;
|
|
48
|
+
_Api_instance = new WeakMap(), _Api_debug = new WeakMap();
|
package/dist/esm/cron/cron.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
2
|
+
import { Api } from '../api';
|
|
3
|
+
import { Database } from '../database';
|
|
4
|
+
export declare class Cron {
|
|
3
5
|
#private;
|
|
4
|
-
|
|
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 {};
|
package/dist/esm/cron/cron.js
CHANGED
|
@@ -10,27 +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.
|
|
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
|
-
|
|
20
|
+
_Cron_api.set(this, void 0);
|
|
21
|
+
_Cron_database.set(this, void 0);
|
|
24
22
|
this.stop();
|
|
25
|
-
__classPrivateFieldSet(this,
|
|
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");
|
|
26
26
|
}
|
|
27
|
-
sendBatch() {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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);
|
|
32
33
|
}
|
|
33
|
-
}
|
|
34
|
+
}
|
|
34
35
|
}
|
|
35
36
|
stop() {
|
|
36
37
|
if (__classPrivateFieldGet(this, _Cron_interval, "f")) {
|
|
@@ -42,5 +43,5 @@ class Cron {
|
|
|
42
43
|
return __classPrivateFieldGet(this, _Cron_interval, "f");
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
25
|
-
await
|
|
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
|
|
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
|
-
|
|
35
|
-
|
|
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
|
-
|
|
41
|
-
expect(cron_1.cron.getInterval()).toBeDefined();
|
|
45
|
+
expect(cron.getInterval()).toBeDefined();
|
|
42
46
|
});
|
|
43
47
|
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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() {
|
|
6
|
+
function databaseFactory(organizationName) {
|
|
7
7
|
const databaseType = isLocalStorageEnabled()
|
|
8
8
|
? 'local-storage'
|
|
9
9
|
: 'memory-storage';
|
|
10
10
|
switch (databaseType) {
|
|
11
11
|
case 'local-storage':
|
|
12
|
-
return new local_storage_1.LocalStorage();
|
|
12
|
+
return new local_storage_1.LocalStorage(organizationName);
|
|
13
13
|
case 'memory-storage':
|
|
14
14
|
return new memory_storage_1.MemoryStorage();
|
|
15
15
|
default:
|
|
@@ -28,4 +28,3 @@ function isLocalStorageEnabled() {
|
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
30
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
|
}
|
|
@@ -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
|
}
|