@devrev/ts-adaas 1.8.0-beta.1 → 1.8.0-beta.2
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/logger/logger.js +1 -1
- package/dist/logger/logger.test.js +8 -8
- package/dist/state/state.js +2 -2
- package/dist/tests/test-helpers.js +8 -0
- package/dist/types/extraction.d.ts +32 -0
- package/dist/workers/worker-adapter.js +5 -1
- package/dist/workers/worker-adapter.test.js +62 -0
- package/package.json +1 -1
package/dist/logger/logger.js
CHANGED
|
@@ -14,7 +14,7 @@ class Logger extends node_console_1.Console {
|
|
|
14
14
|
constructor({ event, options }) {
|
|
15
15
|
super(process.stdout, process.stderr);
|
|
16
16
|
this.options = options;
|
|
17
|
-
this.tags = Object.assign(Object.assign({}, event.payload.event_context), { dev_oid: event.payload.event_context.
|
|
17
|
+
this.tags = Object.assign(Object.assign({}, event.payload.event_context), { dev_oid: event.payload.event_context.dev_oid });
|
|
18
18
|
}
|
|
19
19
|
valueToString(value) {
|
|
20
20
|
if (typeof value === 'string') {
|
|
@@ -50,7 +50,7 @@ describe('Logger', () => {
|
|
|
50
50
|
const logger = new logger_1.Logger({ event: mockEvent, options: mockOptions });
|
|
51
51
|
// Access private property for testing
|
|
52
52
|
const tags = logger.tags;
|
|
53
|
-
expect(tags).toEqual(Object.assign(Object.assign({}, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.
|
|
53
|
+
expect(tags).toEqual(Object.assign(Object.assign({}, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.dev_oid }));
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
56
|
describe('production logging', () => {
|
|
@@ -62,7 +62,7 @@ describe('Logger', () => {
|
|
|
62
62
|
it('should log single string message without backslashes', () => {
|
|
63
63
|
const message = 'Worker is online. Started processing the task.';
|
|
64
64
|
logger.info(message);
|
|
65
|
-
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.
|
|
65
|
+
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.dev_oid })));
|
|
66
66
|
});
|
|
67
67
|
it('should log single object message with JSON stringify', () => {
|
|
68
68
|
const data = { id: 123, name: 'test' };
|
|
@@ -71,7 +71,7 @@ describe('Logger', () => {
|
|
|
71
71
|
compact: false,
|
|
72
72
|
depth: Infinity,
|
|
73
73
|
});
|
|
74
|
-
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: expectedMessage }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.
|
|
74
|
+
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: expectedMessage }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.dev_oid })));
|
|
75
75
|
});
|
|
76
76
|
it('should log multiple arguments joined with space', () => {
|
|
77
77
|
const text = 'Successfully fetched';
|
|
@@ -81,7 +81,7 @@ describe('Logger', () => {
|
|
|
81
81
|
compact: false,
|
|
82
82
|
depth: Infinity,
|
|
83
83
|
});
|
|
84
|
-
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: `${text} ${expectedDataMessage}` }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.
|
|
84
|
+
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: `${text} ${expectedDataMessage}` }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.dev_oid })));
|
|
85
85
|
});
|
|
86
86
|
it('should handle mixed string and object arguments', () => {
|
|
87
87
|
const text1 = 'Processing';
|
|
@@ -92,7 +92,7 @@ describe('Logger', () => {
|
|
|
92
92
|
compact: false,
|
|
93
93
|
depth: Infinity,
|
|
94
94
|
});
|
|
95
|
-
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: `${text1} ${expectedDataMessage} ${text2}` }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.
|
|
95
|
+
expect(mockConsoleInfo).toHaveBeenCalledWith(JSON.stringify(Object.assign(Object.assign({ message: `${text1} ${expectedDataMessage} ${text2}` }, mockEvent.payload.event_context), { dev_oid: mockEvent.payload.event_context.dev_oid })));
|
|
96
96
|
});
|
|
97
97
|
});
|
|
98
98
|
describe('local development logging', () => {
|
|
@@ -143,7 +143,7 @@ describe('Logger', () => {
|
|
|
143
143
|
const callArgs = mockConsoleInfo.mock.calls[0][0];
|
|
144
144
|
const logObject = JSON.parse(callArgs);
|
|
145
145
|
expect(logObject.message).toBe('');
|
|
146
|
-
expect(logObject.dev_oid).toBe(mockEvent.payload.event_context.
|
|
146
|
+
expect(logObject.dev_oid).toBe(mockEvent.payload.event_context.dev_oid);
|
|
147
147
|
expect(logObject.request_id).toBe(mockEvent.payload.event_context.request_id);
|
|
148
148
|
});
|
|
149
149
|
it('should handle null and undefined values', () => {
|
|
@@ -153,7 +153,7 @@ describe('Logger', () => {
|
|
|
153
153
|
const logObject = JSON.parse(callArgs);
|
|
154
154
|
// inspect shows 'null' and 'undefined' as strings
|
|
155
155
|
expect(logObject.message).toBe('test null undefined');
|
|
156
|
-
expect(logObject.dev_oid).toBe(mockEvent.payload.event_context.
|
|
156
|
+
expect(logObject.dev_oid).toBe(mockEvent.payload.event_context.dev_oid);
|
|
157
157
|
});
|
|
158
158
|
it('should handle complex nested objects', () => {
|
|
159
159
|
const complexObject = {
|
|
@@ -174,7 +174,7 @@ describe('Logger', () => {
|
|
|
174
174
|
depth: Infinity,
|
|
175
175
|
});
|
|
176
176
|
expect(logObject.message).toBe(expectedMessage);
|
|
177
|
-
expect(logObject.dev_oid).toBe(mockEvent.payload.event_context.
|
|
177
|
+
expect(logObject.dev_oid).toBe(mockEvent.payload.event_context.dev_oid);
|
|
178
178
|
expect(typeof logObject.callback_url).toBe('string');
|
|
179
179
|
});
|
|
180
180
|
});
|
package/dist/state/state.js
CHANGED
|
@@ -96,7 +96,7 @@ class State {
|
|
|
96
96
|
},
|
|
97
97
|
params: {
|
|
98
98
|
sync_unit: this.event.payload.event_context.sync_unit_id,
|
|
99
|
-
request_id: this.event.payload.event_context.
|
|
99
|
+
request_id: this.event.payload.event_context.request_id_adaas,
|
|
100
100
|
},
|
|
101
101
|
});
|
|
102
102
|
this.state = state || this.state;
|
|
@@ -124,7 +124,7 @@ class State {
|
|
|
124
124
|
},
|
|
125
125
|
params: {
|
|
126
126
|
sync_unit: this.event.payload.event_context.sync_unit_id,
|
|
127
|
-
request_id: this.event.payload.event_context.
|
|
127
|
+
request_id: this.event.payload.event_context.request_id_adaas,
|
|
128
128
|
},
|
|
129
129
|
});
|
|
130
130
|
this.state = JSON.parse(response.data.state);
|
|
@@ -10,17 +10,25 @@ function createEvent({ eventType, externalSyncUnits = [], progress, error, delay
|
|
|
10
10
|
const defaultEventContext = {
|
|
11
11
|
callback_url: 'test_callback_url',
|
|
12
12
|
dev_org: 'test_dev_org',
|
|
13
|
+
dev_oid: 'test_dev_oid',
|
|
13
14
|
dev_org_id: 'test_dev_org_id',
|
|
14
15
|
dev_user: 'test_dev_user',
|
|
15
16
|
dev_user_id: 'test_dev_user_id',
|
|
17
|
+
dev_uid: 'test_dev_uid',
|
|
18
|
+
event_type_adaas: 'test_event_type_adaas',
|
|
16
19
|
external_sync_unit: 'test_external_sync_unit',
|
|
17
20
|
external_sync_unit_id: 'test_external_sync_unit_id',
|
|
18
21
|
external_sync_unit_name: 'test_external_sync_unit_name',
|
|
19
22
|
external_system: 'test_external_system',
|
|
23
|
+
external_system_id: 'test_external_system_id',
|
|
24
|
+
external_system_name: 'test_external_system_name',
|
|
20
25
|
external_system_type: 'test_external_system_type',
|
|
21
26
|
import_slug: 'test_import_slug',
|
|
22
27
|
mode: 'test_mode',
|
|
23
28
|
request_id: 'test_request_id',
|
|
29
|
+
request_id_adaas: 'test_request_id_adaas',
|
|
30
|
+
run_id: 'test_run_id',
|
|
31
|
+
sequence_version: 'test_sequence_version',
|
|
24
32
|
snap_in_slug: 'test_snap_in_slug',
|
|
25
33
|
snap_in_version_id: 'test_snap_in_version_id',
|
|
26
34
|
sync_run: 'test_sync_run',
|
|
@@ -125,32 +125,64 @@ export interface EventContextOut {
|
|
|
125
125
|
*/
|
|
126
126
|
export interface EventContext {
|
|
127
127
|
callback_url: string;
|
|
128
|
+
/**
|
|
129
|
+
* @deprecated dev_org is deprecated and should not be used. Use dev_oid instead.
|
|
130
|
+
*/
|
|
128
131
|
dev_org: string;
|
|
132
|
+
dev_oid: string;
|
|
129
133
|
dev_org_id: string;
|
|
134
|
+
/**
|
|
135
|
+
* @deprecated dev_user is deprecated and should not be used. Use dev_uid instead.
|
|
136
|
+
*/
|
|
130
137
|
dev_user: string;
|
|
138
|
+
/**
|
|
139
|
+
* @deprecated dev_user_id is deprecated and should not be used. Use dev_uid instead.
|
|
140
|
+
*/
|
|
131
141
|
dev_user_id: string;
|
|
142
|
+
dev_uid: string;
|
|
143
|
+
event_type_adaas: string;
|
|
144
|
+
/**
|
|
145
|
+
* @deprecated external_sync_unit is deprecated and should not be used. Use external_sync_unit_id instead.
|
|
146
|
+
*/
|
|
132
147
|
external_sync_unit: string;
|
|
133
148
|
external_sync_unit_id: string;
|
|
134
149
|
external_sync_unit_name: string;
|
|
150
|
+
/**
|
|
151
|
+
* @deprecated external_system is deprecated and should not be used. Use external_system_id instead.
|
|
152
|
+
*/
|
|
135
153
|
external_system: string;
|
|
154
|
+
external_system_id: string;
|
|
155
|
+
external_system_name: string;
|
|
136
156
|
external_system_type: string;
|
|
137
157
|
extract_from?: string;
|
|
138
158
|
import_slug: string;
|
|
139
159
|
initial_sync_scope?: InitialSyncScope;
|
|
140
160
|
mode: string;
|
|
141
161
|
request_id: string;
|
|
162
|
+
request_id_adaas: string;
|
|
142
163
|
/**
|
|
143
164
|
* @deprecated reset_extraction is deprecated and should not be used. Use reset_extract_from instead.
|
|
144
165
|
*/
|
|
145
166
|
reset_extraction?: boolean;
|
|
146
167
|
reset_extract_from?: boolean;
|
|
168
|
+
run_id: string;
|
|
169
|
+
sequence_version: string;
|
|
147
170
|
snap_in_slug: string;
|
|
148
171
|
snap_in_version_id: string;
|
|
172
|
+
/**
|
|
173
|
+
* @deprecated sync_run is deprecated and should not be used. Use run_id instead.
|
|
174
|
+
*/
|
|
149
175
|
sync_run: string;
|
|
176
|
+
/**
|
|
177
|
+
* @deprecated sync_run_id is deprecated and should not be used. Use run_id instead.
|
|
178
|
+
*/
|
|
150
179
|
sync_run_id: string;
|
|
151
180
|
sync_tier: string;
|
|
152
181
|
sync_unit: DonV2;
|
|
153
182
|
sync_unit_id: string;
|
|
183
|
+
/**
|
|
184
|
+
* @deprecated uuid is deprecated and should not be used. Use request_id_adaas instead.
|
|
185
|
+
*/
|
|
154
186
|
uuid: string;
|
|
155
187
|
worker_data_url: string;
|
|
156
188
|
}
|
|
@@ -124,6 +124,7 @@ class WorkerAdapter {
|
|
|
124
124
|
catch (error) {
|
|
125
125
|
console.error('Error while uploading repos', error);
|
|
126
126
|
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage(workers_1.WorkerMessageSubject.WorkerMessageExit);
|
|
127
|
+
this.hasWorkerEmitted = true;
|
|
127
128
|
return;
|
|
128
129
|
}
|
|
129
130
|
}
|
|
@@ -142,6 +143,8 @@ class WorkerAdapter {
|
|
|
142
143
|
catch (error) {
|
|
143
144
|
console.error('Error while posting state', error);
|
|
144
145
|
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage(workers_1.WorkerMessageSubject.WorkerMessageExit);
|
|
146
|
+
this.hasWorkerEmitted = true;
|
|
147
|
+
return;
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
try {
|
|
@@ -157,12 +160,13 @@ class WorkerAdapter {
|
|
|
157
160
|
payload: { eventType: newEventType },
|
|
158
161
|
};
|
|
159
162
|
this.artifacts = [];
|
|
160
|
-
this.hasWorkerEmitted = true;
|
|
161
163
|
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage(message);
|
|
164
|
+
this.hasWorkerEmitted = true;
|
|
162
165
|
}
|
|
163
166
|
catch (error) {
|
|
164
167
|
console.error(`Error while emitting event with event type: ${newEventType}.`, (0, logger_1.serializeError)(error));
|
|
165
168
|
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage(workers_1.WorkerMessageSubject.WorkerMessageExit);
|
|
169
|
+
this.hasWorkerEmitted = true;
|
|
166
170
|
}
|
|
167
171
|
}
|
|
168
172
|
async uploadAllRepos() {
|
|
@@ -382,4 +382,66 @@ describe('WorkerAdapter', () => {
|
|
|
382
382
|
expect(adapter.state.toDevRev.attachmentsMetadata.lastProcessed).toBe(0);
|
|
383
383
|
});
|
|
384
384
|
});
|
|
385
|
+
describe('emit', () => {
|
|
386
|
+
let counter;
|
|
387
|
+
let mockPostMessage;
|
|
388
|
+
beforeEach(() => {
|
|
389
|
+
counter = { counter: 0 };
|
|
390
|
+
// Import the worker_threads module and spy on parentPort.postMessage
|
|
391
|
+
const workerThreads = require('node:worker_threads');
|
|
392
|
+
mockPostMessage = jest.fn().mockImplementation((a) => {
|
|
393
|
+
console.log('postMessage called with:', a);
|
|
394
|
+
counter.counter += 1;
|
|
395
|
+
});
|
|
396
|
+
// Spy on the parentPort.postMessage method
|
|
397
|
+
if (workerThreads.parentPort) {
|
|
398
|
+
jest.spyOn(workerThreads.parentPort, 'postMessage').mockImplementation(mockPostMessage);
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
// If parentPort is null (not in worker context), create a mock
|
|
402
|
+
workerThreads.parentPort = {
|
|
403
|
+
postMessage: mockPostMessage,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
afterEach(() => {
|
|
408
|
+
// Restore all mocks
|
|
409
|
+
jest.restoreAllMocks();
|
|
410
|
+
});
|
|
411
|
+
test('should correctly emit event', async () => {
|
|
412
|
+
adapter['adapterState'].postState = jest.fn().mockResolvedValue(undefined);
|
|
413
|
+
adapter.uploadAllRepos = jest.fn().mockResolvedValue(undefined);
|
|
414
|
+
await adapter.emit(types_1.ExtractorEventType.ExtractionMetadataError, {
|
|
415
|
+
reports: [],
|
|
416
|
+
processed_files: [],
|
|
417
|
+
});
|
|
418
|
+
await adapter.emit(types_1.ExtractorEventType.ExtractionMetadataError, {
|
|
419
|
+
reports: [],
|
|
420
|
+
processed_files: [],
|
|
421
|
+
});
|
|
422
|
+
await adapter.emit(types_1.ExtractorEventType.ExtractionMetadataDone, {
|
|
423
|
+
reports: [],
|
|
424
|
+
processed_files: [],
|
|
425
|
+
});
|
|
426
|
+
expect(counter.counter).toBe(1);
|
|
427
|
+
});
|
|
428
|
+
test('should correctly emit one event even if postState errors', async () => {
|
|
429
|
+
adapter['adapterState'].postState = jest.fn().mockRejectedValue(new Error('postState error'));
|
|
430
|
+
adapter.uploadAllRepos = jest.fn().mockResolvedValue(undefined);
|
|
431
|
+
await adapter.emit(types_1.ExtractorEventType.ExtractionMetadataError, {
|
|
432
|
+
reports: [],
|
|
433
|
+
processed_files: [],
|
|
434
|
+
});
|
|
435
|
+
expect(counter.counter).toBe(1);
|
|
436
|
+
});
|
|
437
|
+
test('should correctly emit one event even if uploadAllRepos errors', async () => {
|
|
438
|
+
adapter['adapterState'].postState = jest.fn().mockResolvedValue(undefined);
|
|
439
|
+
adapter.uploadAllRepos = jest.fn().mockRejectedValue(new Error('uploadAllRepos error'));
|
|
440
|
+
await adapter.emit(types_1.ExtractorEventType.ExtractionMetadataError, {
|
|
441
|
+
reports: [],
|
|
442
|
+
processed_files: [],
|
|
443
|
+
});
|
|
444
|
+
expect(counter.counter).toBe(1);
|
|
445
|
+
});
|
|
446
|
+
});
|
|
385
447
|
});
|
package/package.json
CHANGED