@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.
Files changed (198) hide show
  1. package/README.md +5 -11
  2. package/dist/attachments-streaming/attachments-streaming-pool.d.ts +2 -10
  3. package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
  4. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +2 -7
  5. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
  6. package/dist/attachments-streaming/attachments-streaming-pool.js +15 -43
  7. package/dist/common/constants.d.ts +1 -0
  8. package/dist/common/constants.d.ts.map +1 -1
  9. package/dist/common/constants.js +2 -1
  10. package/dist/common/helpers.d.ts +0 -14
  11. package/dist/common/helpers.d.ts.map +1 -1
  12. package/dist/common/helpers.js +0 -36
  13. package/dist/http/{axios-client-internal.d.ts → client.d.ts} +1 -1
  14. package/dist/http/client.d.ts.map +1 -0
  15. package/dist/index.d.ts +22 -11
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +46 -28
  18. package/dist/logger/logger.d.ts +14 -0
  19. package/dist/logger/logger.d.ts.map +1 -1
  20. package/dist/logger/logger.js +55 -8
  21. package/dist/mappers/mappers.d.ts +9 -10
  22. package/dist/mappers/mappers.d.ts.map +1 -1
  23. package/dist/mappers/{mappers.interface.d.ts → mappers.interfaces.d.ts} +5 -5
  24. package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
  25. package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +3 -3
  26. package/dist/mappers/mappers.js +13 -9
  27. package/dist/multithreading/adapters/base-adapter.d.ts +23 -8
  28. package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -1
  29. package/dist/multithreading/adapters/base-adapter.js +41 -8
  30. package/dist/multithreading/adapters/extraction-adapter.d.ts +8 -9
  31. package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -1
  32. package/dist/multithreading/adapters/extraction-adapter.js +24 -26
  33. package/dist/multithreading/adapters/loading-adapter.d.ts +7 -7
  34. package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -1
  35. package/dist/multithreading/adapters/loading-adapter.js +53 -83
  36. package/dist/{common/control-protocol.d.ts → multithreading/emit.d.ts} +1 -1
  37. package/dist/multithreading/emit.d.ts.map +1 -0
  38. package/dist/{common/control-protocol.js → multithreading/emit.js} +3 -3
  39. package/dist/multithreading/process-task.d.ts.map +1 -1
  40. package/dist/multithreading/process-task.js +26 -9
  41. package/dist/multithreading/spawn/spawn.helpers.d.ts +23 -3
  42. package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
  43. package/dist/multithreading/spawn/spawn.helpers.js +152 -2
  44. package/dist/multithreading/spawn/spawn.js +7 -7
  45. package/dist/multithreading/worker.js +1 -2
  46. package/dist/repo/repo.js +2 -2
  47. package/dist/state/base-state.d.ts +5 -5
  48. package/dist/state/base-state.d.ts.map +1 -1
  49. package/dist/state/base-state.js +7 -7
  50. package/dist/state/extraction-state.d.ts +9 -9
  51. package/dist/state/extraction-state.d.ts.map +1 -1
  52. package/dist/state/extraction-state.js +10 -10
  53. package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
  54. package/dist/{common → state}/install-initial-domain-mapping.js +4 -4
  55. package/dist/state/loading-state.d.ts +7 -8
  56. package/dist/state/loading-state.d.ts.map +1 -1
  57. package/dist/state/loading-state.js +6 -7
  58. package/dist/state/state.d.ts +4 -0
  59. package/dist/state/state.d.ts.map +1 -0
  60. package/dist/state/state.interfaces.d.ts +28 -18
  61. package/dist/state/state.interfaces.d.ts.map +1 -1
  62. package/dist/state/state.interfaces.js +13 -6
  63. package/dist/state/state.js +11 -0
  64. package/dist/{common → state}/time-value-resolver.d.ts +6 -7
  65. package/dist/state/time-value-resolver.d.ts.map +1 -0
  66. package/dist/{common → state}/time-value-resolver.js +9 -8
  67. package/dist/{common/test-utils.d.ts → testing/mock-event.d.ts} +1 -2
  68. package/dist/testing/mock-event.d.ts.map +1 -0
  69. package/dist/{common/test-utils.js → testing/mock-event.js} +14 -3
  70. package/dist/{mock-server → testing}/mock-server.d.ts +5 -0
  71. package/dist/testing/mock-server.d.ts.map +1 -0
  72. package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
  73. package/dist/{mock-server → testing}/mock-server.js +6 -1
  74. package/dist/types/errors.d.ts +9 -0
  75. package/dist/types/errors.d.ts.map +1 -0
  76. package/dist/types/extraction.d.ts +70 -15
  77. package/dist/types/extraction.d.ts.map +1 -1
  78. package/dist/types/extraction.js +4 -6
  79. package/dist/types/loading.d.ts +1 -2
  80. package/dist/types/loading.d.ts.map +1 -1
  81. package/dist/types/loading.js +0 -1
  82. package/dist/types/workers.d.ts +66 -23
  83. package/dist/types/workers.d.ts.map +1 -1
  84. package/dist/uploader/uploader.d.ts +5 -4
  85. package/dist/uploader/uploader.d.ts.map +1 -1
  86. package/dist/uploader/uploader.interfaces.d.ts +1 -1
  87. package/dist/uploader/uploader.js +10 -10
  88. package/package.json +3 -3
  89. package/dist/airsync-sdk.d.ts +0 -2059
  90. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
  91. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
  92. package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -540
  93. package/dist/common/control-protocol.d.ts.map +0 -1
  94. package/dist/common/errors.d.ts +0 -6
  95. package/dist/common/errors.d.ts.map +0 -1
  96. package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
  97. package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
  98. package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
  99. package/dist/common/install-initial-domain-mapping.test.js +0 -211
  100. package/dist/common/test-utils.d.ts.map +0 -1
  101. package/dist/common/time-value-resolver.d.ts.map +0 -1
  102. package/dist/common/time-value-resolver.test.d.ts +0 -2
  103. package/dist/common/time-value-resolver.test.d.ts.map +0 -1
  104. package/dist/common/time-value-resolver.test.js +0 -268
  105. package/dist/http/axios-client-internal.d.ts.map +0 -1
  106. package/dist/http/axios-client-internal.test.d.ts +0 -2
  107. package/dist/http/axios-client-internal.test.d.ts.map +0 -1
  108. package/dist/http/axios-client-internal.test.js +0 -175
  109. package/dist/http/axios-client.d.ts +0 -27
  110. package/dist/http/axios-client.d.ts.map +0 -1
  111. package/dist/http/axios-client.js +0 -60
  112. package/dist/http/constants.d.ts +0 -4
  113. package/dist/http/constants.d.ts.map +0 -1
  114. package/dist/http/constants.js +0 -6
  115. package/dist/http/index.d.ts +0 -2
  116. package/dist/http/index.d.ts.map +0 -1
  117. package/dist/http/index.js +0 -17
  118. package/dist/logger/logger.constants.d.ts +0 -6
  119. package/dist/logger/logger.constants.d.ts.map +0 -1
  120. package/dist/logger/logger.constants.js +0 -13
  121. package/dist/logger/logger.context.d.ts +0 -58
  122. package/dist/logger/logger.context.d.ts.map +0 -1
  123. package/dist/logger/logger.context.js +0 -86
  124. package/dist/logger/logger.test.d.ts +0 -2
  125. package/dist/logger/logger.test.d.ts.map +0 -1
  126. package/dist/logger/logger.test.js +0 -537
  127. package/dist/mappers/mappers.interface.d.ts.map +0 -1
  128. package/dist/mappers/mappers.test.d.ts +0 -2
  129. package/dist/mappers/mappers.test.d.ts.map +0 -1
  130. package/dist/mappers/mappers.test.js +0 -105
  131. package/dist/mock-server/mock-server.d.ts.map +0 -1
  132. package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
  133. package/dist/multithreading/adapters/base-adapter.emit.test.d.ts +0 -2
  134. package/dist/multithreading/adapters/base-adapter.emit.test.d.ts.map +0 -1
  135. package/dist/multithreading/adapters/base-adapter.emit.test.js +0 -403
  136. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts +0 -2
  137. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts.map +0 -1
  138. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.js +0 -175
  139. package/dist/multithreading/adapters/extraction-adapter.test.d.ts +0 -2
  140. package/dist/multithreading/adapters/extraction-adapter.test.d.ts.map +0 -1
  141. package/dist/multithreading/adapters/extraction-adapter.test.js +0 -789
  142. package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts +0 -2
  143. package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts.map +0 -1
  144. package/dist/multithreading/adapters/loading-adapter.helpers.test.js +0 -514
  145. package/dist/multithreading/adapters/loading-adapter.test.d.ts +0 -2
  146. package/dist/multithreading/adapters/loading-adapter.test.d.ts.map +0 -1
  147. package/dist/multithreading/adapters/loading-adapter.test.js +0 -589
  148. package/dist/multithreading/adapters/serialization.test.d.ts +0 -2
  149. package/dist/multithreading/adapters/serialization.test.d.ts.map +0 -1
  150. package/dist/multithreading/adapters/serialization.test.js +0 -71
  151. package/dist/multithreading/create-worker.test.d.ts +0 -2
  152. package/dist/multithreading/create-worker.test.d.ts.map +0 -1
  153. package/dist/multithreading/create-worker.test.js +0 -108
  154. package/dist/multithreading/process-task.test.d.ts +0 -2
  155. package/dist/multithreading/process-task.test.d.ts.map +0 -1
  156. package/dist/multithreading/process-task.test.js +0 -146
  157. package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
  158. package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
  159. package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
  160. package/dist/multithreading/spawn/spawn.test.d.ts +0 -2
  161. package/dist/multithreading/spawn/spawn.test.d.ts.map +0 -1
  162. package/dist/multithreading/spawn/spawn.test.js +0 -232
  163. package/dist/repo/repo.test.d.ts +0 -2
  164. package/dist/repo/repo.test.d.ts.map +0 -1
  165. package/dist/repo/repo.test.js +0 -184
  166. package/dist/state/state.extract-window.test.d.ts +0 -2
  167. package/dist/state/state.extract-window.test.d.ts.map +0 -1
  168. package/dist/state/state.extract-window.test.js +0 -163
  169. package/dist/state/state.pending-boundaries.test.d.ts +0 -2
  170. package/dist/state/state.pending-boundaries.test.d.ts.map +0 -1
  171. package/dist/state/state.pending-boundaries.test.js +0 -189
  172. package/dist/state/state.post-state.test.d.ts +0 -2
  173. package/dist/state/state.post-state.test.d.ts.map +0 -1
  174. package/dist/state/state.post-state.test.js +0 -78
  175. package/dist/state/state.test.d.ts +0 -2
  176. package/dist/state/state.test.d.ts.map +0 -1
  177. package/dist/state/state.test.js +0 -271
  178. package/dist/state/state.time-value-resolution.test.d.ts +0 -2
  179. package/dist/state/state.time-value-resolution.test.d.ts.map +0 -1
  180. package/dist/state/state.time-value-resolution.test.js +0 -175
  181. package/dist/tsdoc-metadata.json +0 -11
  182. package/dist/types/extraction.test.d.ts +0 -2
  183. package/dist/types/extraction.test.d.ts.map +0 -1
  184. package/dist/types/extraction.test.js +0 -96
  185. package/dist/types/index.d.ts +0 -10
  186. package/dist/types/index.d.ts.map +0 -1
  187. package/dist/types/index.js +0 -21
  188. package/dist/uploader/uploader.helpers.test.d.ts +0 -2
  189. package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
  190. package/dist/uploader/uploader.helpers.test.js +0 -256
  191. package/dist/uploader/uploader.test.d.ts +0 -2
  192. package/dist/uploader/uploader.test.d.ts.map +0 -1
  193. package/dist/uploader/uploader.test.js +0 -601
  194. /package/dist/http/{axios-client-internal.js → client.js} +0 -0
  195. /package/dist/{common → state}/install-initial-domain-mapping.d.ts +0 -0
  196. /package/dist/{mock-server → testing}/mock-server.interfaces.d.ts +0 -0
  197. /package/dist/{mock-server → testing}/mock-server.interfaces.js +0 -0
  198. /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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=state.post-state.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=state.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../../src/state/state.test.ts"],"names":[],"mappings":""}
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=state.time-value-resolution.test.d.ts.map
@@ -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":""}