@devrev/airsync-sdk 2.0.0-beta.3 → 2.0.0-beta.5

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