@devrev/airsync-sdk 2.0.0-beta.2 → 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 (206) hide show
  1. package/README.md +5 -11
  2. package/dist/attachments-streaming/attachments-streaming-pool.d.ts +1 -8
  3. package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
  4. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +4 -3
  5. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
  6. package/dist/attachments-streaming/attachments-streaming-pool.js +11 -39
  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 +25 -13
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +51 -30
  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 +71 -0
  28. package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -0
  29. package/dist/multithreading/adapters/base-adapter.js +138 -0
  30. package/dist/multithreading/adapters/extraction-adapter.d.ts +57 -0
  31. package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -0
  32. package/dist/multithreading/adapters/extraction-adapter.js +323 -0
  33. package/dist/multithreading/adapters/loading-adapter.d.ts +44 -0
  34. package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -0
  35. package/dist/multithreading/{worker-adapter/worker-adapter.helpers.d.ts → adapters/loading-adapter.helpers.d.ts} +1 -1
  36. package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -0
  37. package/dist/multithreading/adapters/loading-adapter.js +431 -0
  38. package/dist/{common/control-protocol.d.ts → multithreading/emit.d.ts} +1 -1
  39. package/dist/multithreading/emit.d.ts.map +1 -0
  40. package/dist/{common/control-protocol.js → multithreading/emit.js} +3 -3
  41. package/dist/multithreading/process-task.d.ts +16 -1
  42. package/dist/multithreading/process-task.d.ts.map +1 -1
  43. package/dist/multithreading/process-task.js +115 -50
  44. package/dist/multithreading/spawn/spawn.helpers.d.ts +23 -3
  45. package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
  46. package/dist/multithreading/spawn/spawn.helpers.js +152 -2
  47. package/dist/multithreading/spawn/spawn.js +7 -7
  48. package/dist/multithreading/worker.js +1 -2
  49. package/dist/repo/repo.js +2 -2
  50. package/dist/state/base-state.d.ts +75 -0
  51. package/dist/state/base-state.d.ts.map +1 -0
  52. package/dist/state/base-state.js +261 -0
  53. package/dist/state/extraction-state.d.ts +29 -0
  54. package/dist/state/extraction-state.d.ts.map +1 -0
  55. package/dist/state/extraction-state.js +122 -0
  56. package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
  57. package/dist/{common → state}/install-initial-domain-mapping.js +4 -4
  58. package/dist/state/loading-state.d.ts +18 -0
  59. package/dist/state/loading-state.d.ts.map +1 -0
  60. package/dist/state/loading-state.js +39 -0
  61. package/dist/state/state.d.ts +3 -35
  62. package/dist/state/state.d.ts.map +1 -1
  63. package/dist/state/state.interfaces.d.ts +20 -3
  64. package/dist/state/state.interfaces.d.ts.map +1 -1
  65. package/dist/state/state.interfaces.js +19 -1
  66. package/dist/state/state.js +9 -263
  67. package/dist/{common → state}/time-value-resolver.d.ts +4 -5
  68. package/dist/state/time-value-resolver.d.ts.map +1 -0
  69. package/dist/{common → state}/time-value-resolver.js +9 -8
  70. package/dist/{common/test-utils.d.ts → testing/mock-event.d.ts} +1 -2
  71. package/dist/testing/mock-event.d.ts.map +1 -0
  72. package/dist/{common/test-utils.js → testing/mock-event.js} +14 -3
  73. package/dist/{mock-server → testing}/mock-server.d.ts +5 -0
  74. package/dist/testing/mock-server.d.ts.map +1 -0
  75. package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
  76. package/dist/{mock-server → testing}/mock-server.js +6 -1
  77. package/dist/types/errors.d.ts +9 -0
  78. package/dist/types/errors.d.ts.map +1 -0
  79. package/dist/types/extraction.d.ts +73 -18
  80. package/dist/types/extraction.d.ts.map +1 -1
  81. package/dist/types/extraction.js +4 -6
  82. package/dist/types/loading.d.ts +1 -2
  83. package/dist/types/loading.d.ts.map +1 -1
  84. package/dist/types/loading.js +0 -1
  85. package/dist/types/workers.d.ts +64 -20
  86. package/dist/types/workers.d.ts.map +1 -1
  87. package/dist/uploader/uploader.d.ts +5 -4
  88. package/dist/uploader/uploader.d.ts.map +1 -1
  89. package/dist/uploader/uploader.interfaces.d.ts +1 -1
  90. package/dist/uploader/uploader.js +10 -10
  91. package/package.json +3 -3
  92. package/dist/airsync-sdk.d.ts +0 -1802
  93. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
  94. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
  95. package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -516
  96. package/dist/common/control-protocol.d.ts.map +0 -1
  97. package/dist/common/errors.d.ts +0 -6
  98. package/dist/common/errors.d.ts.map +0 -1
  99. package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
  100. package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
  101. package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
  102. package/dist/common/install-initial-domain-mapping.test.js +0 -211
  103. package/dist/common/test-utils.d.ts.map +0 -1
  104. package/dist/common/time-value-resolver.d.ts.map +0 -1
  105. package/dist/common/time-value-resolver.test.d.ts +0 -2
  106. package/dist/common/time-value-resolver.test.d.ts.map +0 -1
  107. package/dist/common/time-value-resolver.test.js +0 -268
  108. package/dist/http/axios-client-internal.d.ts.map +0 -1
  109. package/dist/http/axios-client-internal.test.d.ts +0 -2
  110. package/dist/http/axios-client-internal.test.d.ts.map +0 -1
  111. package/dist/http/axios-client-internal.test.js +0 -175
  112. package/dist/http/axios-client.d.ts +0 -27
  113. package/dist/http/axios-client.d.ts.map +0 -1
  114. package/dist/http/axios-client.js +0 -60
  115. package/dist/http/constants.d.ts +0 -4
  116. package/dist/http/constants.d.ts.map +0 -1
  117. package/dist/http/constants.js +0 -6
  118. package/dist/http/index.d.ts +0 -2
  119. package/dist/http/index.d.ts.map +0 -1
  120. package/dist/http/index.js +0 -17
  121. package/dist/logger/logger.constants.d.ts +0 -6
  122. package/dist/logger/logger.constants.d.ts.map +0 -1
  123. package/dist/logger/logger.constants.js +0 -13
  124. package/dist/logger/logger.context.d.ts +0 -58
  125. package/dist/logger/logger.context.d.ts.map +0 -1
  126. package/dist/logger/logger.context.js +0 -86
  127. package/dist/logger/logger.test.d.ts +0 -2
  128. package/dist/logger/logger.test.d.ts.map +0 -1
  129. package/dist/logger/logger.test.js +0 -537
  130. package/dist/mappers/mappers.interface.d.ts.map +0 -1
  131. package/dist/mappers/mappers.test.d.ts +0 -2
  132. package/dist/mappers/mappers.test.d.ts.map +0 -1
  133. package/dist/mappers/mappers.test.js +0 -105
  134. package/dist/mock-server/mock-server.d.ts.map +0 -1
  135. package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
  136. package/dist/multithreading/create-worker.test.d.ts +0 -2
  137. package/dist/multithreading/create-worker.test.d.ts.map +0 -1
  138. package/dist/multithreading/create-worker.test.js +0 -108
  139. package/dist/multithreading/process-task.test.d.ts +0 -2
  140. package/dist/multithreading/process-task.test.d.ts.map +0 -1
  141. package/dist/multithreading/process-task.test.js +0 -146
  142. package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
  143. package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
  144. package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
  145. package/dist/multithreading/spawn/spawn.test.d.ts +0 -2
  146. package/dist/multithreading/spawn/spawn.test.d.ts.map +0 -1
  147. package/dist/multithreading/spawn/spawn.test.js +0 -232
  148. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +0 -2
  149. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +0 -1
  150. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +0 -175
  151. package/dist/multithreading/worker-adapter/worker-adapter.d.ts +0 -97
  152. package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +0 -1
  153. package/dist/multithreading/worker-adapter/worker-adapter.emit.test.d.ts +0 -2
  154. package/dist/multithreading/worker-adapter/worker-adapter.emit.test.d.ts.map +0 -1
  155. package/dist/multithreading/worker-adapter/worker-adapter.emit.test.js +0 -390
  156. package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.d.ts +0 -2
  157. package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.d.ts.map +0 -1
  158. package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.js +0 -799
  159. package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +0 -1
  160. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +0 -2
  161. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +0 -1
  162. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +0 -514
  163. package/dist/multithreading/worker-adapter/worker-adapter.js +0 -846
  164. package/dist/multithreading/worker-adapter/worker-adapter.loading.test.d.ts +0 -2
  165. package/dist/multithreading/worker-adapter/worker-adapter.loading.test.d.ts.map +0 -1
  166. package/dist/multithreading/worker-adapter/worker-adapter.loading.test.js +0 -596
  167. package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.d.ts +0 -2
  168. package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.d.ts.map +0 -1
  169. package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.js +0 -71
  170. package/dist/repo/repo.test.d.ts +0 -2
  171. package/dist/repo/repo.test.d.ts.map +0 -1
  172. package/dist/repo/repo.test.js +0 -184
  173. package/dist/state/state.extract-window.test.d.ts +0 -2
  174. package/dist/state/state.extract-window.test.d.ts.map +0 -1
  175. package/dist/state/state.extract-window.test.js +0 -163
  176. package/dist/state/state.pending-boundaries.test.d.ts +0 -2
  177. package/dist/state/state.pending-boundaries.test.d.ts.map +0 -1
  178. package/dist/state/state.pending-boundaries.test.js +0 -189
  179. package/dist/state/state.post-state.test.d.ts +0 -2
  180. package/dist/state/state.post-state.test.d.ts.map +0 -1
  181. package/dist/state/state.post-state.test.js +0 -77
  182. package/dist/state/state.test.d.ts +0 -2
  183. package/dist/state/state.test.d.ts.map +0 -1
  184. package/dist/state/state.test.js +0 -268
  185. package/dist/state/state.time-value-resolution.test.d.ts +0 -2
  186. package/dist/state/state.time-value-resolution.test.d.ts.map +0 -1
  187. package/dist/state/state.time-value-resolution.test.js +0 -175
  188. package/dist/tsdoc-metadata.json +0 -11
  189. package/dist/types/extraction.test.d.ts +0 -2
  190. package/dist/types/extraction.test.d.ts.map +0 -1
  191. package/dist/types/extraction.test.js +0 -96
  192. package/dist/types/index.d.ts +0 -11
  193. package/dist/types/index.d.ts.map +0 -1
  194. package/dist/types/index.js +0 -21
  195. package/dist/uploader/uploader.helpers.test.d.ts +0 -2
  196. package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
  197. package/dist/uploader/uploader.helpers.test.js +0 -256
  198. package/dist/uploader/uploader.test.d.ts +0 -2
  199. package/dist/uploader/uploader.test.d.ts.map +0 -1
  200. package/dist/uploader/uploader.test.js +0 -601
  201. /package/dist/http/{axios-client-internal.js → client.js} +0 -0
  202. /package/dist/multithreading/{worker-adapter/worker-adapter.helpers.js → adapters/loading-adapter.helpers.js} +0 -0
  203. /package/dist/{common → state}/install-initial-domain-mapping.d.ts +0 -0
  204. /package/dist/{mock-server → testing}/mock-server.interfaces.d.ts +0 -0
  205. /package/dist/{mock-server → testing}/mock-server.interfaces.js +0 -0
  206. /package/dist/{common → types}/errors.js +0 -0
@@ -1,184 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const constants_1 = require("../common/constants");
4
- const test_helpers_1 = require("../tests/test-helpers");
5
- const jest_setup_1 = require("../tests/jest.setup");
6
- const test_utils_1 = require("../common/test-utils");
7
- const types_1 = require("../types");
8
- const repo_1 = require("./repo");
9
- jest.mock('../tests/test-helpers', () => (Object.assign(Object.assign({}, jest.requireActual('../tests/test-helpers')), { normalizeItem: jest.fn() })));
10
- describe(repo_1.Repo.name, () => {
11
- let repo;
12
- let normalize;
13
- beforeEach(() => {
14
- normalize = jest.fn();
15
- repo = new repo_1.Repo({
16
- event: (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
17
- payload: { event_type: types_1.EventType.StartExtractingData },
18
- }),
19
- itemType: 'test_item_type',
20
- normalize,
21
- onUpload: jest.fn(),
22
- });
23
- });
24
- afterEach(() => {
25
- jest.clearAllMocks();
26
- });
27
- it('should normalize and push items when array contains items', async () => {
28
- // Arrange
29
- const items = (0, test_helpers_1.createItems)(10);
30
- // Act
31
- await repo.push(items);
32
- // Assert
33
- expect(normalize).toHaveBeenCalledTimes(10);
34
- const normalizedItems = items.map((item) => (0, test_helpers_1.normalizeItem)(item));
35
- expect(repo.getItems()).toEqual(normalizedItems);
36
- });
37
- it('should not normalize items when normalize function is not provided', async () => {
38
- // Arrange
39
- repo = new repo_1.Repo({
40
- event: (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
41
- payload: { event_type: types_1.EventType.StartExtractingData },
42
- }),
43
- itemType: 'test_item_type',
44
- onUpload: jest.fn(),
45
- options: {},
46
- });
47
- const items = (0, test_helpers_1.createItems)(10);
48
- // Act
49
- await repo.push(items);
50
- // Assert
51
- expect(normalize).not.toHaveBeenCalled();
52
- });
53
- it('[edge] should not push items when items array is empty', async () => {
54
- // Act
55
- await repo.push([]);
56
- // Assert
57
- expect(repo.getItems()).toEqual([]);
58
- });
59
- it('should not normalize items when item type is external_domain_metadata', async () => {
60
- // Arrange
61
- repo = new repo_1.Repo({
62
- event: (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
63
- payload: { event_type: types_1.EventType.StartExtractingData },
64
- }),
65
- itemType: constants_1.AirSyncDefaultItemTypes.EXTERNAL_DOMAIN_METADATA,
66
- normalize,
67
- onUpload: jest.fn(),
68
- options: {},
69
- });
70
- const items = (0, test_helpers_1.createItems)(10);
71
- // Act
72
- await repo.push(items);
73
- // Assert
74
- expect(normalize).not.toHaveBeenCalled();
75
- });
76
- it('should not normalize items when item type is ssor_attachment', async () => {
77
- // Arrange
78
- repo = new repo_1.Repo({
79
- event: (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
80
- payload: { event_type: types_1.EventType.StartExtractingData },
81
- }),
82
- itemType: constants_1.SSOR_ATTACHMENT,
83
- normalize,
84
- onUpload: jest.fn(),
85
- options: {},
86
- });
87
- const items = (0, test_helpers_1.createItems)(10);
88
- // Act
89
- await repo.push(items);
90
- // Assert
91
- expect(normalize).not.toHaveBeenCalled();
92
- });
93
- it('should leave 5 items in the items array after pushing 2005 items with batch size of 2000', async () => {
94
- // Arrange
95
- const items = (0, test_helpers_1.createItems)(2005);
96
- // Act
97
- await repo.push(items);
98
- // Assert
99
- expect(repo.getItems().length).toBe(5);
100
- });
101
- it('should normalize all items when pushing 4005 items with batch size of 2000', async () => {
102
- // Arrange
103
- const items = (0, test_helpers_1.createItems)(4005);
104
- // Act
105
- await repo.push(items);
106
- // Assert
107
- expect(normalize).toHaveBeenCalledTimes(4005);
108
- });
109
- it('should upload 2 batches when pushing 4005 items with batch size of 2000', async () => {
110
- // Arrange
111
- const uploadSpy = jest.spyOn(repo, 'upload');
112
- const items = (0, test_helpers_1.createItems)(4005);
113
- // Act
114
- await repo.push(items);
115
- // Assert
116
- expect(uploadSpy).toHaveBeenCalledTimes(2);
117
- uploadSpy.mockRestore();
118
- });
119
- it('should leave 5 items in array after pushing 4005 items with batch size of 2000', async () => {
120
- // Arrange
121
- const items = (0, test_helpers_1.createItems)(4005);
122
- // Act
123
- await repo.push(items);
124
- // Assert
125
- expect(repo.getItems().length).toBe(5);
126
- });
127
- describe('should take batch size into account', () => {
128
- beforeEach(() => {
129
- repo = new repo_1.Repo({
130
- event: (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
131
- payload: { event_type: types_1.EventType.StartExtractingData },
132
- }),
133
- itemType: 'test_item_type',
134
- normalize,
135
- onUpload: jest.fn(),
136
- options: {
137
- batchSize: 50,
138
- },
139
- });
140
- });
141
- it('should empty the items array after pushing 50 items with batch size of 50', async () => {
142
- // Arrange
143
- const items = (0, test_helpers_1.createItems)(50);
144
- // Act
145
- await repo.push(items);
146
- // Assert
147
- expect(repo.getItems()).toEqual([]);
148
- });
149
- it('should leave 5 items in the items array after pushing 205 items with batch size of 50', async () => {
150
- // Arrange
151
- const items = (0, test_helpers_1.createItems)(205);
152
- // Act
153
- await repo.push(items);
154
- // Assert
155
- expect(repo.getItems().length).toBe(5);
156
- });
157
- it('should normalize all items when pushing 205 items with batch size of 50', async () => {
158
- // Arrange
159
- const items = (0, test_helpers_1.createItems)(205);
160
- // Act
161
- await repo.push(items);
162
- // Assert
163
- expect(normalize).toHaveBeenCalledTimes(205);
164
- });
165
- it('should upload 4 batches when pushing 205 items with batch size of 50', async () => {
166
- // Arrange
167
- const uploadSpy = jest.spyOn(repo, 'upload');
168
- const items = (0, test_helpers_1.createItems)(205);
169
- // Act
170
- await repo.push(items);
171
- // Assert
172
- expect(uploadSpy).toHaveBeenCalledTimes(4);
173
- uploadSpy.mockRestore();
174
- });
175
- it('should leave 5 items in array after pushing 205 items with batch size of 50', async () => {
176
- // Arrange
177
- const items = (0, test_helpers_1.createItems)(205);
178
- // Act
179
- await repo.push(items);
180
- // Assert
181
- expect(repo.getItems().length).toBe(5);
182
- });
183
- });
184
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=state.extract-window.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.extract-window.test.d.ts","sourceRoot":"","sources":["../../src/state/state.extract-window.test.ts"],"names":[],"mappings":""}
@@ -1,163 +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 state_1 = require("./state");
7
- describe('State — extraction window validation', () => {
8
- let fetchStateSpy;
9
- let processExitSpy;
10
- beforeEach(() => {
11
- jest.clearAllMocks();
12
- jest.restoreAllMocks();
13
- fetchStateSpy = jest.spyOn(state_1.State.prototype, 'fetchState');
14
- processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
15
- throw new Error('process.exit called');
16
- });
17
- });
18
- describe('Enhanced Control Protocol - extraction window validation', () => {
19
- it('should exit the process if extract_from >= extract_to', async () => {
20
- // Arrange: start is after end (inverted window)
21
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
22
- payload: {
23
- event_type: extraction_1.EventType.StartExtractingMetadata,
24
- event_context: {
25
- extraction_start_time: {
26
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
27
- value: '2025-06-01T00:00:00Z',
28
- },
29
- extraction_end_time: {
30
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
31
- value: '2024-01-01T00:00:00Z',
32
- },
33
- },
34
- },
35
- });
36
- const stringifiedState = JSON.stringify({
37
- snapInVersionId: 'test_snap_in_version_id',
38
- });
39
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
40
- // Act & Assert
41
- await expect((0, state_1.createAdapterState)({
42
- event,
43
- initialState: {},
44
- initialDomainMapping: {},
45
- })).rejects.toThrow('process.exit called');
46
- expect(processExitSpy).toHaveBeenCalledWith(1);
47
- });
48
- it('should exit the process if extract_from equals extract_to', async () => {
49
- // Arrange: start equals end (zero-width window)
50
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
51
- payload: {
52
- event_type: extraction_1.EventType.StartExtractingMetadata,
53
- event_context: {
54
- extraction_start_time: {
55
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
56
- value: '2024-06-01T00:00:00Z',
57
- },
58
- extraction_end_time: {
59
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
60
- value: '2024-06-01T00:00:00Z',
61
- },
62
- },
63
- },
64
- });
65
- const stringifiedState = JSON.stringify({
66
- snapInVersionId: 'test_snap_in_version_id',
67
- });
68
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
69
- // Act & Assert
70
- await expect((0, state_1.createAdapterState)({
71
- event,
72
- initialState: {},
73
- initialDomainMapping: {},
74
- })).rejects.toThrow('process.exit called');
75
- expect(processExitSpy).toHaveBeenCalledWith(1);
76
- });
77
- it('should not exit when extract_from < extract_to', async () => {
78
- // Arrange: valid window
79
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
80
- payload: {
81
- event_type: extraction_1.EventType.StartExtractingMetadata,
82
- event_context: {
83
- extraction_start_time: {
84
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
85
- value: '2024-01-01T00:00:00Z',
86
- },
87
- extraction_end_time: {
88
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
89
- value: '2025-06-01T00:00:00Z',
90
- },
91
- },
92
- },
93
- });
94
- const stringifiedState = JSON.stringify({
95
- snapInVersionId: 'test_snap_in_version_id',
96
- });
97
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
98
- // Act
99
- await (0, state_1.createAdapterState)({
100
- event,
101
- initialState: {},
102
- initialDomainMapping: {},
103
- });
104
- // Assert: process.exit should NOT have been called
105
- expect(processExitSpy).not.toHaveBeenCalled();
106
- });
107
- it('should not validate when only extract_from is set', async () => {
108
- // Arrange: only start, no end
109
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
110
- payload: {
111
- event_type: extraction_1.EventType.StartExtractingMetadata,
112
- event_context: {
113
- extraction_start_time: {
114
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
115
- value: '2024-01-01T00:00:00Z',
116
- },
117
- },
118
- },
119
- });
120
- const stringifiedState = JSON.stringify({
121
- snapInVersionId: 'test_snap_in_version_id',
122
- });
123
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
124
- // Act
125
- await (0, state_1.createAdapterState)({
126
- event,
127
- initialState: {},
128
- initialDomainMapping: {},
129
- });
130
- // Assert: process.exit should NOT have been called
131
- expect(processExitSpy).not.toHaveBeenCalled();
132
- });
133
- it('should not exit when extract_from is UNBOUNDED and extract_to is a real timestamp', async () => {
134
- // Arrange: UNBOUNDED start (epoch) with a real ABSOLUTE end timestamp
135
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
136
- payload: {
137
- event_type: extraction_1.EventType.StartExtractingMetadata,
138
- event_context: {
139
- extraction_start_time: {
140
- type: extraction_1.TimeValueType.UNBOUNDED,
141
- },
142
- extraction_end_time: {
143
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
144
- value: '2025-06-01T00:00:00Z',
145
- },
146
- },
147
- },
148
- });
149
- const stringifiedState = JSON.stringify({
150
- snapInVersionId: 'test_snap_in_version_id',
151
- });
152
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
153
- // Act
154
- await (0, state_1.createAdapterState)({
155
- event,
156
- initialState: {},
157
- initialDomainMapping: {},
158
- });
159
- // Assert: process.exit should NOT have been called
160
- expect(processExitSpy).not.toHaveBeenCalled();
161
- });
162
- });
163
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=state.pending-boundaries.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.pending-boundaries.test.d.ts","sourceRoot":"","sources":["../../src/state/state.pending-boundaries.test.ts"],"names":[],"mappings":""}
@@ -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 state_1 = require("./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(state_1.State.prototype, 'postState');
17
- fetchStateSpy = jest.spyOn(state_1.State.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, state_1.createAdapterState)({
54
- event,
55
- initialState: {},
56
- initialDomainMapping: {},
57
- });
58
- // Assert
59
- expect(state.state.pendingWorkersOldest).toBe('1970-01-01T00:00:00.000Z');
60
- expect(state.state.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, state_1.createAdapterState)({
92
- event,
93
- initialState: {},
94
- initialDomainMapping: {},
95
- });
96
- // Assert: pending values are overwritten with fresh resolution, not stale values
97
- expect(state.state.pendingWorkersOldest).toBe('1970-01-01T00:00:00.000Z');
98
- expect(state.state.pendingWorkersNewest).toBe(FIXED_NOW);
99
- expect(state.state.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, state_1.createAdapterState)({
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.state.pendingWorkersOldest).toBe(pendingOldest);
139
- expect(state.state.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, state_1.createAdapterState)({
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, state_1.createAdapterState)({
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,77 +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 state_1 = require("./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(state_1.State.prototype, 'postState');
16
- fetchStateSpy = jest.spyOn(state_1.State.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, state_1.createAdapterState)({
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 state, preserving the original fields
47
- expect(typeof body.state).toBe('string');
48
- const parsed = JSON.parse(body.state);
49
- expect(parsed.foo).toBe('bar');
50
- expect(parsed.snapInVersionId).toBe('1.0.0');
51
- });
52
- it('should exit(1) when postState HTTP request fails', async () => {
53
- // Arrange
54
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
55
- context: { snap_in_version_id: '1.0.0' },
56
- payload: { event_type: extraction_1.EventType.StartExtractingData },
57
- });
58
- fetchStateSpy.mockResolvedValue({
59
- state: JSON.stringify({ snapInVersionId: '1.0.0' }),
60
- });
61
- postStateSpy.mockRestore();
62
- const adapterState = await (0, state_1.createAdapterState)({
63
- event,
64
- initialState: {},
65
- initialDomainMapping: {},
66
- });
67
- // Mock axiosClient.post directly to bypass the retry backoff
68
- const axiosClientModule = require('../http/axios-client-internal');
69
- const axiosPostSpy = jest
70
- .spyOn(axiosClientModule.axiosClient, 'post')
71
- .mockRejectedValue(new Error('network error'));
72
- // Act & Assert
73
- await expect(adapterState.postState()).rejects.toThrow('process.exit called');
74
- expect(processExitSpy).toHaveBeenCalledWith(1);
75
- axiosPostSpy.mockRestore();
76
- });
77
- });
@@ -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":""}