@devrev/airsync-sdk 2.0.0-beta.3 → 2.0.0-beta.4
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/README.md +5 -11
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +2 -10
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +2 -7
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.js +15 -43
- package/dist/common/constants.d.ts +1 -0
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +2 -1
- package/dist/common/helpers.d.ts +0 -14
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +0 -36
- package/dist/http/{axios-client-internal.d.ts → client.d.ts} +1 -1
- package/dist/http/client.d.ts.map +1 -0
- package/dist/index.d.ts +22 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -28
- package/dist/logger/logger.d.ts +14 -0
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +55 -8
- package/dist/mappers/mappers.d.ts +9 -10
- package/dist/mappers/mappers.d.ts.map +1 -1
- package/dist/mappers/{mappers.interface.d.ts → mappers.interfaces.d.ts} +5 -5
- package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
- package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +3 -3
- package/dist/mappers/mappers.js +13 -9
- package/dist/multithreading/adapters/base-adapter.d.ts +23 -8
- package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/base-adapter.js +41 -8
- package/dist/multithreading/adapters/extraction-adapter.d.ts +8 -9
- package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/extraction-adapter.js +24 -26
- package/dist/multithreading/adapters/loading-adapter.d.ts +7 -7
- package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/loading-adapter.js +53 -83
- package/dist/{common/control-protocol.d.ts → multithreading/emit.d.ts} +1 -1
- package/dist/multithreading/emit.d.ts.map +1 -0
- package/dist/{common/control-protocol.js → multithreading/emit.js} +3 -3
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +26 -9
- package/dist/multithreading/spawn/spawn.helpers.d.ts +23 -3
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.js +152 -2
- package/dist/multithreading/spawn/spawn.js +7 -7
- package/dist/multithreading/worker.js +1 -2
- package/dist/repo/repo.js +2 -2
- package/dist/state/base-state.d.ts +5 -5
- package/dist/state/base-state.d.ts.map +1 -1
- package/dist/state/base-state.js +7 -7
- package/dist/state/extraction-state.d.ts +9 -9
- package/dist/state/extraction-state.d.ts.map +1 -1
- package/dist/state/extraction-state.js +10 -10
- package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
- package/dist/{common → state}/install-initial-domain-mapping.js +4 -4
- package/dist/state/loading-state.d.ts +7 -8
- package/dist/state/loading-state.d.ts.map +1 -1
- package/dist/state/loading-state.js +6 -7
- package/dist/state/state.d.ts +4 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.interfaces.d.ts +28 -18
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +13 -6
- package/dist/state/state.js +11 -0
- package/dist/{common → state}/time-value-resolver.d.ts +6 -7
- package/dist/state/time-value-resolver.d.ts.map +1 -0
- package/dist/{common → state}/time-value-resolver.js +9 -8
- package/dist/{common/test-utils.d.ts → testing/mock-event.d.ts} +1 -2
- package/dist/testing/mock-event.d.ts.map +1 -0
- package/dist/{common/test-utils.js → testing/mock-event.js} +14 -3
- package/dist/{mock-server → testing}/mock-server.d.ts +5 -0
- package/dist/testing/mock-server.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
- package/dist/{mock-server → testing}/mock-server.js +6 -1
- package/dist/types/errors.d.ts +9 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/extraction.d.ts +70 -15
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +4 -6
- package/dist/types/loading.d.ts +1 -2
- package/dist/types/loading.d.ts.map +1 -1
- package/dist/types/loading.js +0 -1
- package/dist/types/workers.d.ts +66 -23
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/uploader/uploader.d.ts +5 -4
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.interfaces.d.ts +1 -1
- package/dist/uploader/uploader.js +10 -10
- package/package.json +3 -3
- package/dist/airsync-sdk.d.ts +0 -2059
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
- package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -540
- package/dist/common/control-protocol.d.ts.map +0 -1
- package/dist/common/errors.d.ts +0 -6
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
- package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.test.js +0 -211
- package/dist/common/test-utils.d.ts.map +0 -1
- package/dist/common/time-value-resolver.d.ts.map +0 -1
- package/dist/common/time-value-resolver.test.d.ts +0 -2
- package/dist/common/time-value-resolver.test.d.ts.map +0 -1
- package/dist/common/time-value-resolver.test.js +0 -268
- package/dist/http/axios-client-internal.d.ts.map +0 -1
- package/dist/http/axios-client-internal.test.d.ts +0 -2
- package/dist/http/axios-client-internal.test.d.ts.map +0 -1
- package/dist/http/axios-client-internal.test.js +0 -175
- package/dist/http/axios-client.d.ts +0 -27
- package/dist/http/axios-client.d.ts.map +0 -1
- package/dist/http/axios-client.js +0 -60
- package/dist/http/constants.d.ts +0 -4
- package/dist/http/constants.d.ts.map +0 -1
- package/dist/http/constants.js +0 -6
- package/dist/http/index.d.ts +0 -2
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -17
- package/dist/logger/logger.constants.d.ts +0 -6
- package/dist/logger/logger.constants.d.ts.map +0 -1
- package/dist/logger/logger.constants.js +0 -13
- package/dist/logger/logger.context.d.ts +0 -58
- package/dist/logger/logger.context.d.ts.map +0 -1
- package/dist/logger/logger.context.js +0 -86
- package/dist/logger/logger.test.d.ts +0 -2
- package/dist/logger/logger.test.d.ts.map +0 -1
- package/dist/logger/logger.test.js +0 -537
- package/dist/mappers/mappers.interface.d.ts.map +0 -1
- package/dist/mappers/mappers.test.d.ts +0 -2
- package/dist/mappers/mappers.test.d.ts.map +0 -1
- package/dist/mappers/mappers.test.js +0 -105
- package/dist/mock-server/mock-server.d.ts.map +0 -1
- package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
- package/dist/multithreading/adapters/base-adapter.emit.test.d.ts +0 -2
- package/dist/multithreading/adapters/base-adapter.emit.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/base-adapter.emit.test.js +0 -403
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts +0 -2
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.js +0 -175
- package/dist/multithreading/adapters/extraction-adapter.test.d.ts +0 -2
- package/dist/multithreading/adapters/extraction-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/extraction-adapter.test.js +0 -789
- package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts +0 -2
- package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.test.js +0 -514
- package/dist/multithreading/adapters/loading-adapter.test.d.ts +0 -2
- package/dist/multithreading/adapters/loading-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/loading-adapter.test.js +0 -589
- package/dist/multithreading/adapters/serialization.test.d.ts +0 -2
- package/dist/multithreading/adapters/serialization.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/serialization.test.js +0 -71
- package/dist/multithreading/create-worker.test.d.ts +0 -2
- package/dist/multithreading/create-worker.test.d.ts.map +0 -1
- package/dist/multithreading/create-worker.test.js +0 -108
- package/dist/multithreading/process-task.test.d.ts +0 -2
- package/dist/multithreading/process-task.test.d.ts.map +0 -1
- package/dist/multithreading/process-task.test.js +0 -146
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
- package/dist/multithreading/spawn/spawn.test.d.ts +0 -2
- package/dist/multithreading/spawn/spawn.test.d.ts.map +0 -1
- package/dist/multithreading/spawn/spawn.test.js +0 -232
- package/dist/repo/repo.test.d.ts +0 -2
- package/dist/repo/repo.test.d.ts.map +0 -1
- package/dist/repo/repo.test.js +0 -184
- package/dist/state/state.extract-window.test.d.ts +0 -2
- package/dist/state/state.extract-window.test.d.ts.map +0 -1
- package/dist/state/state.extract-window.test.js +0 -163
- package/dist/state/state.pending-boundaries.test.d.ts +0 -2
- package/dist/state/state.pending-boundaries.test.d.ts.map +0 -1
- package/dist/state/state.pending-boundaries.test.js +0 -189
- package/dist/state/state.post-state.test.d.ts +0 -2
- package/dist/state/state.post-state.test.d.ts.map +0 -1
- package/dist/state/state.post-state.test.js +0 -78
- package/dist/state/state.test.d.ts +0 -2
- package/dist/state/state.test.d.ts.map +0 -1
- package/dist/state/state.test.js +0 -271
- package/dist/state/state.time-value-resolution.test.d.ts +0 -2
- package/dist/state/state.time-value-resolution.test.d.ts.map +0 -1
- package/dist/state/state.time-value-resolution.test.js +0 -175
- package/dist/tsdoc-metadata.json +0 -11
- package/dist/types/extraction.test.d.ts +0 -2
- package/dist/types/extraction.test.d.ts.map +0 -1
- package/dist/types/extraction.test.js +0 -96
- package/dist/types/index.d.ts +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -21
- package/dist/uploader/uploader.helpers.test.d.ts +0 -2
- package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
- package/dist/uploader/uploader.helpers.test.js +0 -256
- package/dist/uploader/uploader.test.d.ts +0 -2
- package/dist/uploader/uploader.test.d.ts.map +0 -1
- package/dist/uploader/uploader.test.js +0 -601
- /package/dist/http/{axios-client-internal.js → client.js} +0 -0
- /package/dist/{common → state}/install-initial-domain-mapping.d.ts +0 -0
- /package/dist/{mock-server → testing}/mock-server.interfaces.d.ts +0 -0
- /package/dist/{mock-server → testing}/mock-server.interfaces.js +0 -0
- /package/dist/{common → types}/errors.js +0 -0
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const jest_setup_1 = require("../tests/jest.setup");
|
|
4
|
-
const test_utils_1 = require("../common/test-utils");
|
|
5
|
-
const extraction_1 = require("../types/extraction");
|
|
6
|
-
const extraction_state_1 = require("./extraction-state");
|
|
7
|
-
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
8
|
-
const FIXED_NOW = '2026-03-26T10:00:00.000Z';
|
|
9
|
-
describe('State — pending extraction boundaries', () => {
|
|
10
|
-
let postStateSpy;
|
|
11
|
-
let fetchStateSpy;
|
|
12
|
-
let installInitialDomainMappingSpy;
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
jest.clearAllMocks();
|
|
15
|
-
jest.restoreAllMocks();
|
|
16
|
-
postStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'postState');
|
|
17
|
-
fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
|
|
18
|
-
installInitialDomainMappingSpy = jest.spyOn(require('../common/install-initial-domain-mapping'), 'installInitialDomainMapping');
|
|
19
|
-
jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
20
|
-
throw new Error('process.exit called');
|
|
21
|
-
});
|
|
22
|
-
jest.useFakeTimers();
|
|
23
|
-
jest.setSystemTime(new Date(FIXED_NOW));
|
|
24
|
-
});
|
|
25
|
-
afterEach(() => {
|
|
26
|
-
jest.useRealTimers();
|
|
27
|
-
});
|
|
28
|
-
it('should store resolved values in pendingWorkersOldest/pendingWorkersNewest on StartExtractingMetadata', async () => {
|
|
29
|
-
// Arrange
|
|
30
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
31
|
-
context: {
|
|
32
|
-
snap_in_version_id: '',
|
|
33
|
-
},
|
|
34
|
-
payload: {
|
|
35
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
36
|
-
event_context: {
|
|
37
|
-
extraction_start_time: {
|
|
38
|
-
type: extraction_1.TimeValueType.UNBOUNDED,
|
|
39
|
-
},
|
|
40
|
-
extraction_end_time: {
|
|
41
|
-
type: extraction_1.TimeValueType.CURRENT_TIME,
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
fetchStateSpy.mockRejectedValue({
|
|
47
|
-
isAxiosError: true,
|
|
48
|
-
response: { status: 404 },
|
|
49
|
-
});
|
|
50
|
-
installInitialDomainMappingSpy.mockResolvedValue({ success: true });
|
|
51
|
-
postStateSpy.mockResolvedValue({ success: true });
|
|
52
|
-
// Act
|
|
53
|
-
const state = await (0, extraction_state_1.createExtractionState)({
|
|
54
|
-
event,
|
|
55
|
-
initialState: {},
|
|
56
|
-
initialDomainMapping: {},
|
|
57
|
-
});
|
|
58
|
-
// Assert
|
|
59
|
-
expect(state.sdkState.pendingWorkersOldest).toBe('1970-01-01T00:00:00.000Z');
|
|
60
|
-
expect(state.sdkState.pendingWorkersNewest).toBe(FIXED_NOW);
|
|
61
|
-
expect(event.payload.event_context.extract_from).toBe('1970-01-01T00:00:00.000Z');
|
|
62
|
-
expect(event.payload.event_context.extract_to).toBe(FIXED_NOW);
|
|
63
|
-
});
|
|
64
|
-
it('should overwrite pending values on a retry (new StartExtractingMetadata after failure)', async () => {
|
|
65
|
-
// Arrange: state has stale pending values from a previous failed attempt
|
|
66
|
-
const staleOldest = '2026-03-25T08:00:00.000Z';
|
|
67
|
-
const staleNewest = '2026-03-25T09:00:00.000Z';
|
|
68
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
69
|
-
context: {
|
|
70
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
71
|
-
},
|
|
72
|
-
payload: {
|
|
73
|
-
event_type: extraction_1.EventType.StartExtractingMetadata,
|
|
74
|
-
event_context: {
|
|
75
|
-
extraction_start_time: {
|
|
76
|
-
type: extraction_1.TimeValueType.UNBOUNDED,
|
|
77
|
-
},
|
|
78
|
-
extraction_end_time: {
|
|
79
|
-
type: extraction_1.TimeValueType.CURRENT_TIME,
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
const stringifiedState = JSON.stringify({
|
|
85
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
86
|
-
pendingWorkersOldest: staleOldest,
|
|
87
|
-
pendingWorkersNewest: staleNewest,
|
|
88
|
-
});
|
|
89
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
90
|
-
// Act
|
|
91
|
-
const state = await (0, extraction_state_1.createExtractionState)({
|
|
92
|
-
event,
|
|
93
|
-
initialState: {},
|
|
94
|
-
initialDomainMapping: {},
|
|
95
|
-
});
|
|
96
|
-
// Assert: pending values are overwritten with fresh resolution, not stale values
|
|
97
|
-
expect(state.sdkState.pendingWorkersOldest).toBe('1970-01-01T00:00:00.000Z');
|
|
98
|
-
expect(state.sdkState.pendingWorkersNewest).toBe(FIXED_NOW);
|
|
99
|
-
expect(state.sdkState.pendingWorkersNewest).not.toBe(staleNewest);
|
|
100
|
-
});
|
|
101
|
-
it('should reuse pending values from state on ContinueExtractingData instead of re-resolving', async () => {
|
|
102
|
-
// Arrange: state has pending values from a prior StartExtractingMetadata phase
|
|
103
|
-
const pendingOldest = '1970-01-01T00:00:00.000Z';
|
|
104
|
-
const pendingNewest = '2026-03-26T08:00:00.000Z'; // Earlier than FIXED_NOW
|
|
105
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
106
|
-
context: {
|
|
107
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
108
|
-
},
|
|
109
|
-
payload: {
|
|
110
|
-
event_type: extraction_1.EventType.ContinueExtractingData,
|
|
111
|
-
event_context: {
|
|
112
|
-
// Platform still sends TimeValue objects, but they should be ignored
|
|
113
|
-
extraction_start_time: {
|
|
114
|
-
type: extraction_1.TimeValueType.CURRENT_TIME,
|
|
115
|
-
},
|
|
116
|
-
extraction_end_time: {
|
|
117
|
-
type: extraction_1.TimeValueType.CURRENT_TIME,
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
const stringifiedState = JSON.stringify({
|
|
123
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
124
|
-
pendingWorkersOldest: pendingOldest,
|
|
125
|
-
pendingWorkersNewest: pendingNewest,
|
|
126
|
-
});
|
|
127
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
128
|
-
// Act
|
|
129
|
-
const state = await (0, extraction_state_1.createExtractionState)({
|
|
130
|
-
event,
|
|
131
|
-
initialState: {},
|
|
132
|
-
initialDomainMapping: {},
|
|
133
|
-
});
|
|
134
|
-
// Assert: uses cached pending values, NOT new Date() resolution
|
|
135
|
-
expect(event.payload.event_context.extract_from).toBe(pendingOldest);
|
|
136
|
-
expect(event.payload.event_context.extract_to).toBe(pendingNewest);
|
|
137
|
-
// Pending values in state remain unchanged
|
|
138
|
-
expect(state.sdkState.pendingWorkersOldest).toBe(pendingOldest);
|
|
139
|
-
expect(state.sdkState.pendingWorkersNewest).toBe(pendingNewest);
|
|
140
|
-
});
|
|
141
|
-
it('should not set extract_from/extract_to on ContinueExtractingData if no pending values exist', async () => {
|
|
142
|
-
// Arrange: state has no pending values (e.g. old state from before this feature)
|
|
143
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
144
|
-
context: {
|
|
145
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
146
|
-
},
|
|
147
|
-
payload: { event_type: extraction_1.EventType.ContinueExtractingData },
|
|
148
|
-
});
|
|
149
|
-
const stringifiedState = JSON.stringify({
|
|
150
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
151
|
-
});
|
|
152
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
153
|
-
// Act
|
|
154
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
155
|
-
event,
|
|
156
|
-
initialState: {},
|
|
157
|
-
initialDomainMapping: {},
|
|
158
|
-
});
|
|
159
|
-
// Assert: no extraction timestamps are set
|
|
160
|
-
expect(event.payload.event_context.extract_from).toBeUndefined();
|
|
161
|
-
expect(event.payload.event_context.extract_to).toBeUndefined();
|
|
162
|
-
});
|
|
163
|
-
it('should reuse pending values on StartExtractingAttachments', async () => {
|
|
164
|
-
// Arrange: state has pending values from the StartExtractingMetadata phase
|
|
165
|
-
const pendingOldest = '1970-01-01T00:00:00.000Z';
|
|
166
|
-
const pendingNewest = '2026-03-26T08:00:00.000Z';
|
|
167
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
168
|
-
context: {
|
|
169
|
-
snap_in_version_id: 'test_snap_in_version_id',
|
|
170
|
-
},
|
|
171
|
-
payload: { event_type: extraction_1.EventType.StartExtractingAttachments },
|
|
172
|
-
});
|
|
173
|
-
const stringifiedState = JSON.stringify({
|
|
174
|
-
snapInVersionId: 'test_snap_in_version_id',
|
|
175
|
-
pendingWorkersOldest: pendingOldest,
|
|
176
|
-
pendingWorkersNewest: pendingNewest,
|
|
177
|
-
});
|
|
178
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
179
|
-
// Act
|
|
180
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
181
|
-
event,
|
|
182
|
-
initialState: {},
|
|
183
|
-
initialDomainMapping: {},
|
|
184
|
-
});
|
|
185
|
-
// Assert: pending values are reused
|
|
186
|
-
expect(event.payload.event_context.extract_from).toBe(pendingOldest);
|
|
187
|
-
expect(event.payload.event_context.extract_to).toBe(pendingNewest);
|
|
188
|
-
});
|
|
189
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.post-state.test.d.ts","sourceRoot":"","sources":["../../src/state/state.post-state.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const jest_setup_1 = require("../tests/jest.setup");
|
|
4
|
-
const test_utils_1 = require("../common/test-utils");
|
|
5
|
-
const extraction_1 = require("../types/extraction");
|
|
6
|
-
const extraction_state_1 = require("./extraction-state");
|
|
7
|
-
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
8
|
-
describe('State.postState', () => {
|
|
9
|
-
let postStateSpy;
|
|
10
|
-
let fetchStateSpy;
|
|
11
|
-
let processExitSpy;
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
jest.clearAllMocks();
|
|
14
|
-
jest.restoreAllMocks();
|
|
15
|
-
postStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'postState');
|
|
16
|
-
fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
|
|
17
|
-
processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
18
|
-
throw new Error('process.exit called');
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
it('should POST the stringified state to the update endpoint', async () => {
|
|
22
|
-
// Arrange
|
|
23
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
24
|
-
context: {
|
|
25
|
-
snap_in_version_id: '1.0.0',
|
|
26
|
-
secrets: { service_account_token: 'test_token' },
|
|
27
|
-
},
|
|
28
|
-
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
29
|
-
});
|
|
30
|
-
const stateToPost = { snapInVersionId: '1.0.0', foo: 'bar' };
|
|
31
|
-
fetchStateSpy.mockResolvedValue({
|
|
32
|
-
state: JSON.stringify({ snapInVersionId: '1.0.0' }),
|
|
33
|
-
});
|
|
34
|
-
postStateSpy.mockRestore();
|
|
35
|
-
const adapterState = await (0, extraction_state_1.createExtractionState)({
|
|
36
|
-
event,
|
|
37
|
-
initialState: {},
|
|
38
|
-
initialDomainMapping: {},
|
|
39
|
-
});
|
|
40
|
-
// Act
|
|
41
|
-
await adapterState.postState(stateToPost);
|
|
42
|
-
// Assert: the mock server records all incoming requests — inspect what was sent
|
|
43
|
-
const requests = jest_setup_1.mockServer.getRequests('POST', '/worker_data_url.update');
|
|
44
|
-
expect(requests).toHaveLength(1);
|
|
45
|
-
const body = requests[0].body;
|
|
46
|
-
// Body must contain the stringified v2 envelope: connector state and SDK
|
|
47
|
-
// bookkeeping stored as disjoint sub-objects.
|
|
48
|
-
expect(typeof body.state).toBe('string');
|
|
49
|
-
const parsed = JSON.parse(body.state);
|
|
50
|
-
expect(parsed.connectorState.foo).toBe('bar');
|
|
51
|
-
expect(parsed.sdkState.snapInVersionId).toBe('1.0.0');
|
|
52
|
-
});
|
|
53
|
-
it('should exit(1) when postState HTTP request fails', async () => {
|
|
54
|
-
// Arrange
|
|
55
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
56
|
-
context: { snap_in_version_id: '1.0.0' },
|
|
57
|
-
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
58
|
-
});
|
|
59
|
-
fetchStateSpy.mockResolvedValue({
|
|
60
|
-
state: JSON.stringify({ snapInVersionId: '1.0.0' }),
|
|
61
|
-
});
|
|
62
|
-
postStateSpy.mockRestore();
|
|
63
|
-
const adapterState = await (0, extraction_state_1.createExtractionState)({
|
|
64
|
-
event,
|
|
65
|
-
initialState: {},
|
|
66
|
-
initialDomainMapping: {},
|
|
67
|
-
});
|
|
68
|
-
// Mock axiosClient.post directly to bypass the retry backoff
|
|
69
|
-
const axiosClientModule = require('../http/axios-client-internal');
|
|
70
|
-
const axiosPostSpy = jest
|
|
71
|
-
.spyOn(axiosClientModule.axiosClient, 'post')
|
|
72
|
-
.mockRejectedValue(new Error('network error'));
|
|
73
|
-
// Act & Assert
|
|
74
|
-
await expect(adapterState.postState()).rejects.toThrow('process.exit called');
|
|
75
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
76
|
-
axiosPostSpy.mockRestore();
|
|
77
|
-
});
|
|
78
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../../src/state/state.test.ts"],"names":[],"mappings":""}
|
package/dist/state/state.test.js
DELETED
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const constants_1 = require("../common/constants");
|
|
4
|
-
const jest_setup_1 = require("../tests/jest.setup");
|
|
5
|
-
const test_utils_1 = require("../common/test-utils");
|
|
6
|
-
const extraction_1 = require("../types/extraction");
|
|
7
|
-
const extraction_state_1 = require("./extraction-state");
|
|
8
|
-
const state_interfaces_1 = require("./state.interfaces");
|
|
9
|
-
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
10
|
-
describe(extraction_state_1.ExtractionState.name, () => {
|
|
11
|
-
let initSpy;
|
|
12
|
-
let postStateSpy;
|
|
13
|
-
let fetchStateSpy;
|
|
14
|
-
let installInitialDomainMappingSpy;
|
|
15
|
-
let processExitSpy;
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
jest.clearAllMocks();
|
|
18
|
-
jest.restoreAllMocks();
|
|
19
|
-
initSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'init');
|
|
20
|
-
postStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'postState');
|
|
21
|
-
fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
|
|
22
|
-
installInitialDomainMappingSpy = jest.spyOn(require('../common/install-initial-domain-mapping'), 'installInitialDomainMapping');
|
|
23
|
-
processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
24
|
-
throw new Error('process.exit called');
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
it.each(constants_1.STATELESS_EVENT_TYPES)('should not init, fetch, post or install IDM for stateless event type %s', async (eventType) => {
|
|
28
|
-
// Arrange
|
|
29
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
30
|
-
payload: { event_type: eventType },
|
|
31
|
-
});
|
|
32
|
-
// Act
|
|
33
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
34
|
-
event,
|
|
35
|
-
initialState: {},
|
|
36
|
-
initialDomainMapping: {},
|
|
37
|
-
});
|
|
38
|
-
// Assert
|
|
39
|
-
expect(initSpy).not.toHaveBeenCalled();
|
|
40
|
-
expect(fetchStateSpy).not.toHaveBeenCalled();
|
|
41
|
-
expect(postStateSpy).not.toHaveBeenCalled();
|
|
42
|
-
expect(installInitialDomainMappingSpy).not.toHaveBeenCalled();
|
|
43
|
-
});
|
|
44
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching the state fails for event type %s', async (eventType) => {
|
|
45
|
-
// Arrange
|
|
46
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
47
|
-
payload: { event_type: eventType },
|
|
48
|
-
});
|
|
49
|
-
fetchStateSpy.mockRejectedValue({
|
|
50
|
-
isAxiosError: true,
|
|
51
|
-
response: { status: 500 },
|
|
52
|
-
});
|
|
53
|
-
// Act & Assert
|
|
54
|
-
await expect((0, extraction_state_1.createExtractionState)({
|
|
55
|
-
event,
|
|
56
|
-
initialState: {},
|
|
57
|
-
initialDomainMapping: {},
|
|
58
|
-
})).rejects.toThrow('process.exit called');
|
|
59
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
60
|
-
});
|
|
61
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if parsing the state fails for event type %s', async (eventType) => {
|
|
62
|
-
// Arrange
|
|
63
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
64
|
-
payload: { event_type: eventType },
|
|
65
|
-
});
|
|
66
|
-
fetchStateSpy.mockResolvedValue({ state: 'invalid-json' });
|
|
67
|
-
// Act & Assert
|
|
68
|
-
await expect((0, extraction_state_1.createExtractionState)({
|
|
69
|
-
event,
|
|
70
|
-
initialState: {},
|
|
71
|
-
initialDomainMapping: {},
|
|
72
|
-
})).rejects.toThrow('process.exit called');
|
|
73
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
74
|
-
});
|
|
75
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if fetching is successful but there is no state in the response for event type %s', async (eventType) => {
|
|
76
|
-
// Arrange
|
|
77
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
78
|
-
payload: { event_type: eventType },
|
|
79
|
-
});
|
|
80
|
-
fetchStateSpy.mockResolvedValue({ state: null });
|
|
81
|
-
// Act & Assert
|
|
82
|
-
await expect((0, extraction_state_1.createExtractionState)({
|
|
83
|
-
event,
|
|
84
|
-
initialState: {},
|
|
85
|
-
initialDomainMapping: {},
|
|
86
|
-
})).rejects.toThrow('process.exit called');
|
|
87
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
88
|
-
});
|
|
89
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES.filter((eventType) => eventType !== extraction_1.EventType.StartExtractingData))('should call post state with full adapter state if fetching returns 404 for event type %s', async (eventType) => {
|
|
90
|
-
// Arrange
|
|
91
|
-
const initialState = {
|
|
92
|
-
test: 'test',
|
|
93
|
-
};
|
|
94
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
95
|
-
context: {
|
|
96
|
-
snap_in_version_id: '',
|
|
97
|
-
},
|
|
98
|
-
payload: { event_type: eventType },
|
|
99
|
-
});
|
|
100
|
-
fetchStateSpy.mockRejectedValue({
|
|
101
|
-
isAxiosError: true,
|
|
102
|
-
response: { status: 404 },
|
|
103
|
-
});
|
|
104
|
-
installInitialDomainMappingSpy.mockResolvedValue({
|
|
105
|
-
success: true,
|
|
106
|
-
});
|
|
107
|
-
postStateSpy.mockResolvedValue({
|
|
108
|
-
success: true,
|
|
109
|
-
});
|
|
110
|
-
// Act
|
|
111
|
-
const adapterState = await (0, extraction_state_1.createExtractionState)({
|
|
112
|
-
event,
|
|
113
|
-
initialState,
|
|
114
|
-
initialDomainMapping: {},
|
|
115
|
-
});
|
|
116
|
-
// On 404, init() persists the v2 envelope: connector state untouched,
|
|
117
|
-
// SDK bookkeeping seeded from defaults.
|
|
118
|
-
expect(postStateSpy).toHaveBeenCalled();
|
|
119
|
-
expect(adapterState.state).toEqual(initialState);
|
|
120
|
-
expect(adapterState.sdkState).toEqual(state_interfaces_1.initialExtractionSdkState);
|
|
121
|
-
});
|
|
122
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should exit the process if initialDomainMapping is not provided for event type %s', async (eventType) => {
|
|
123
|
-
// Arrange
|
|
124
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
125
|
-
payload: { event_type: eventType },
|
|
126
|
-
});
|
|
127
|
-
fetchStateSpy.mockResolvedValue({
|
|
128
|
-
state: JSON.stringify({
|
|
129
|
-
test: 'test',
|
|
130
|
-
}),
|
|
131
|
-
});
|
|
132
|
-
// Act & Assert
|
|
133
|
-
await expect((0, extraction_state_1.createExtractionState)({
|
|
134
|
-
event,
|
|
135
|
-
initialState: {},
|
|
136
|
-
initialDomainMapping: undefined,
|
|
137
|
-
})).rejects.toThrow('process.exit called');
|
|
138
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
139
|
-
});
|
|
140
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should not install IDM if version matches for event type %s', async (eventType) => {
|
|
141
|
-
// Arrange
|
|
142
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
143
|
-
context: {
|
|
144
|
-
snap_in_version_id: '1.0.0',
|
|
145
|
-
},
|
|
146
|
-
payload: { event_type: eventType },
|
|
147
|
-
});
|
|
148
|
-
const stringifiedState = JSON.stringify({
|
|
149
|
-
test: 'test',
|
|
150
|
-
snapInVersionId: '1.0.0',
|
|
151
|
-
});
|
|
152
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
153
|
-
// Act & Assert
|
|
154
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
155
|
-
event,
|
|
156
|
-
initialState: {},
|
|
157
|
-
initialDomainMapping: {},
|
|
158
|
-
});
|
|
159
|
-
// Assert
|
|
160
|
-
expect(installInitialDomainMappingSpy).not.toHaveBeenCalled();
|
|
161
|
-
});
|
|
162
|
-
it.each(constants_1.STATEFUL_EVENT_TYPES)('should install IDM if version does not match for event type %s', async (eventType) => {
|
|
163
|
-
// Arrange
|
|
164
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
165
|
-
context: {
|
|
166
|
-
snap_in_version_id: '2.0.0',
|
|
167
|
-
},
|
|
168
|
-
payload: { event_type: eventType },
|
|
169
|
-
});
|
|
170
|
-
const stringifiedState = JSON.stringify({
|
|
171
|
-
test: 'test',
|
|
172
|
-
snapInVersionId: '1.0.0',
|
|
173
|
-
});
|
|
174
|
-
fetchStateSpy.mockResolvedValue({ state: stringifiedState });
|
|
175
|
-
installInitialDomainMappingSpy.mockResolvedValue({
|
|
176
|
-
success: true,
|
|
177
|
-
});
|
|
178
|
-
// Act
|
|
179
|
-
await (0, extraction_state_1.createExtractionState)({
|
|
180
|
-
event,
|
|
181
|
-
initialState: {},
|
|
182
|
-
initialDomainMapping: {},
|
|
183
|
-
});
|
|
184
|
-
// Assert
|
|
185
|
-
expect(installInitialDomainMappingSpy).toHaveBeenCalled();
|
|
186
|
-
});
|
|
187
|
-
it('should populate extractionScope from API response', async () => {
|
|
188
|
-
// Arrange
|
|
189
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
190
|
-
context: {
|
|
191
|
-
snap_in_version_id: '1.0.0',
|
|
192
|
-
},
|
|
193
|
-
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
194
|
-
});
|
|
195
|
-
fetchStateSpy.mockResolvedValue({
|
|
196
|
-
state: JSON.stringify({ snapInVersionId: '1.0.0' }),
|
|
197
|
-
objects: JSON.stringify({
|
|
198
|
-
tasks: { extract: true },
|
|
199
|
-
users: { extract: true },
|
|
200
|
-
}),
|
|
201
|
-
});
|
|
202
|
-
// Act
|
|
203
|
-
const result = await (0, extraction_state_1.createExtractionState)({
|
|
204
|
-
event,
|
|
205
|
-
initialState: {},
|
|
206
|
-
initialDomainMapping: {},
|
|
207
|
-
});
|
|
208
|
-
// Assert
|
|
209
|
-
expect(result.extractionScope).toEqual({
|
|
210
|
-
tasks: { extract: true },
|
|
211
|
-
users: { extract: true },
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
it('should have empty extractionScope on 404', async () => {
|
|
215
|
-
// Arrange
|
|
216
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
217
|
-
context: {
|
|
218
|
-
snap_in_version_id: '',
|
|
219
|
-
},
|
|
220
|
-
payload: { event_type: extraction_1.EventType.StartExtractingMetadata },
|
|
221
|
-
});
|
|
222
|
-
fetchStateSpy.mockRejectedValue({
|
|
223
|
-
isAxiosError: true,
|
|
224
|
-
response: { status: 404 },
|
|
225
|
-
});
|
|
226
|
-
installInitialDomainMappingSpy.mockResolvedValue({ success: true });
|
|
227
|
-
postStateSpy.mockResolvedValue({ success: true });
|
|
228
|
-
// Act
|
|
229
|
-
const result = await (0, extraction_state_1.createExtractionState)({
|
|
230
|
-
event,
|
|
231
|
-
initialState: {},
|
|
232
|
-
initialDomainMapping: {},
|
|
233
|
-
});
|
|
234
|
-
// Assert
|
|
235
|
-
expect(result.extractionScope).toEqual({});
|
|
236
|
-
});
|
|
237
|
-
it('should have empty extractionScope for stateless events', async () => {
|
|
238
|
-
// Arrange
|
|
239
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
240
|
-
payload: { event_type: extraction_1.EventType.StartExtractingExternalSyncUnits },
|
|
241
|
-
});
|
|
242
|
-
// Act
|
|
243
|
-
const result = await (0, extraction_state_1.createExtractionState)({
|
|
244
|
-
event,
|
|
245
|
-
initialState: {},
|
|
246
|
-
initialDomainMapping: {},
|
|
247
|
-
});
|
|
248
|
-
// Assert
|
|
249
|
-
expect(result.extractionScope).toEqual({});
|
|
250
|
-
});
|
|
251
|
-
it('should continue with empty extractionScope when objects field contains invalid JSON', async () => {
|
|
252
|
-
// Arrange
|
|
253
|
-
const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
|
|
254
|
-
context: { snap_in_version_id: '1.0.0' },
|
|
255
|
-
payload: { event_type: extraction_1.EventType.StartExtractingData },
|
|
256
|
-
});
|
|
257
|
-
fetchStateSpy.mockResolvedValue({
|
|
258
|
-
state: JSON.stringify({ snapInVersionId: '1.0.0' }),
|
|
259
|
-
objects: 'NOT_VALID_JSON',
|
|
260
|
-
});
|
|
261
|
-
// Act
|
|
262
|
-
const result = await (0, extraction_state_1.createExtractionState)({
|
|
263
|
-
event,
|
|
264
|
-
initialState: {},
|
|
265
|
-
initialDomainMapping: {},
|
|
266
|
-
});
|
|
267
|
-
// Assert: should not crash, extractionScope is empty (default)
|
|
268
|
-
expect(result.extractionScope).toEqual({});
|
|
269
|
-
expect(processExitSpy).not.toHaveBeenCalled();
|
|
270
|
-
});
|
|
271
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.time-value-resolution.test.d.ts","sourceRoot":"","sources":["../../src/state/state.time-value-resolution.test.ts"],"names":[],"mappings":""}
|