@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,175 +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
- describe('State — TimeValue resolution', () => {
8
- let fetchStateSpy;
9
- let processExitSpy;
10
- beforeEach(() => {
11
- jest.clearAllMocks();
12
- jest.restoreAllMocks();
13
- fetchStateSpy = jest.spyOn(extraction_state_1.ExtractionState.prototype, 'fetchState');
14
- processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
15
- throw new Error('process.exit called');
16
- });
17
- });
18
- describe('Enhanced Control Protocol - TimeValue resolution failures', () => {
19
- it('should exit the process if extraction_start_time resolution fails', async () => {
20
- // Arrange: WORKERS_NEWEST type but state has no workersNewest
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.WORKERS_NEWEST,
27
- },
28
- },
29
- },
30
- });
31
- const stringifiedState = JSON.stringify({
32
- snapInVersionId: 'test_snap_in_version_id',
33
- workers_oldest: '',
34
- workers_newest: '',
35
- });
36
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
37
- // Act & Assert
38
- await expect((0, extraction_state_1.createExtractionState)({
39
- event,
40
- initialState: {},
41
- initialDomainMapping: {},
42
- })).rejects.toThrow('process.exit called');
43
- expect(processExitSpy).toHaveBeenCalledWith(1);
44
- });
45
- it('should exit the process if extraction_end_time resolution fails', async () => {
46
- // Arrange: WORKERS_NEWEST type but state has no workersNewest
47
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
48
- payload: {
49
- event_type: extraction_1.EventType.StartExtractingMetadata,
50
- event_context: {
51
- extraction_start_time: {
52
- type: extraction_1.TimeValueType.UNBOUNDED,
53
- },
54
- extraction_end_time: {
55
- type: extraction_1.TimeValueType.WORKERS_NEWEST,
56
- },
57
- },
58
- },
59
- });
60
- const stringifiedState = JSON.stringify({
61
- snapInVersionId: 'test_snap_in_version_id',
62
- workers_oldest: '',
63
- workers_newest: '',
64
- });
65
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
66
- // Act & Assert
67
- await expect((0, extraction_state_1.createExtractionState)({
68
- event,
69
- initialState: {},
70
- initialDomainMapping: {},
71
- })).rejects.toThrow('process.exit called');
72
- expect(processExitSpy).toHaveBeenCalledWith(1);
73
- });
74
- });
75
- describe('Backwards compatibility - missing TimeValue type', () => {
76
- it('should skip resolution when extraction_start_time has no type', async () => {
77
- // Arrange: platform sends extraction_start_time without a type field (old platform version)
78
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
79
- context: {
80
- snap_in_version_id: 'test_snap_in_version_id',
81
- },
82
- payload: {
83
- event_type: extraction_1.EventType.StartExtractingMetadata,
84
- event_context: {
85
- extraction_start_time: {},
86
- extraction_end_time: {
87
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
88
- value: '2025-06-01T00:00:00Z',
89
- },
90
- },
91
- },
92
- });
93
- const stringifiedState = JSON.stringify({
94
- snapInVersionId: 'test_snap_in_version_id',
95
- });
96
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
97
- // Act
98
- const state = await (0, extraction_state_1.createExtractionState)({
99
- event,
100
- initialState: {},
101
- initialDomainMapping: {},
102
- });
103
- // Assert: should not crash, extract_from is not set, extract_to is resolved
104
- expect(processExitSpy).not.toHaveBeenCalled();
105
- expect(event.payload.event_context.extract_from).toBeUndefined();
106
- expect(event.payload.event_context.extract_to).toBe('2025-06-01T00:00:00.000Z');
107
- expect(state.sdkState.pendingWorkersNewest).toBe('2025-06-01T00:00:00.000Z');
108
- });
109
- it('should skip resolution when extraction_end_time has no type', async () => {
110
- // Arrange: platform sends extraction_end_time without a type field
111
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
112
- context: {
113
- snap_in_version_id: 'test_snap_in_version_id',
114
- },
115
- payload: {
116
- event_type: extraction_1.EventType.StartExtractingMetadata,
117
- event_context: {
118
- extraction_start_time: {
119
- type: extraction_1.TimeValueType.ABSOLUTE_TIME,
120
- value: '2024-01-01T00:00:00Z',
121
- },
122
- extraction_end_time: {},
123
- },
124
- },
125
- });
126
- const stringifiedState = JSON.stringify({
127
- snapInVersionId: 'test_snap_in_version_id',
128
- });
129
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
130
- // Act
131
- await (0, extraction_state_1.createExtractionState)({
132
- event,
133
- initialState: {},
134
- initialDomainMapping: {},
135
- });
136
- // Assert: should not crash, extract_to is not set, extract_from is resolved
137
- expect(processExitSpy).not.toHaveBeenCalled();
138
- expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00.000Z');
139
- expect(event.payload.event_context.extract_to).toBeUndefined();
140
- });
141
- it('should skip resolution when both extraction times have no type', async () => {
142
- // Arrange: platform sends both time values without type fields
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: {
148
- event_type: extraction_1.EventType.StartExtractingMetadata,
149
- event_context: {
150
- extraction_start_time: {
151
- value: 'some-value',
152
- },
153
- extraction_end_time: {
154
- value: 'some-value',
155
- },
156
- },
157
- },
158
- });
159
- const stringifiedState = JSON.stringify({
160
- snapInVersionId: 'test_snap_in_version_id',
161
- });
162
- fetchStateSpy.mockResolvedValue({ state: stringifiedState });
163
- // Act
164
- await (0, extraction_state_1.createExtractionState)({
165
- event,
166
- initialState: {},
167
- initialDomainMapping: {},
168
- });
169
- // Assert: should not crash, neither extraction time is resolved
170
- expect(processExitSpy).not.toHaveBeenCalled();
171
- expect(event.payload.event_context.extract_from).toBeUndefined();
172
- expect(event.payload.event_context.extract_to).toBeUndefined();
173
- });
174
- });
175
- });
@@ -1,11 +0,0 @@
1
- // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
- // It should be published with your NPM package. It should not be tracked by Git.
3
- {
4
- "tsdocVersion": "0.12",
5
- "toolPackages": [
6
- {
7
- "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.58.7"
9
- }
10
- ]
11
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=extraction.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extraction.test.d.ts","sourceRoot":"","sources":["../../src/types/extraction.test.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const test_utils_1 = require("../common/test-utils");
4
- const jest_setup_1 = require("../tests/jest.setup");
5
- const extraction_1 = require("./extraction");
6
- describe('ExtractionTypes', () => {
7
- it('should create event context with all optional fields', () => {
8
- // Arrange & Act
9
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
10
- payload: {
11
- event_type: extraction_1.EventType.StartExtractingData,
12
- event_context: {
13
- extract_from: '2024-01-01T00:00:00Z',
14
- extract_to: '2024-06-01T00:00:00Z',
15
- initial_sync_scope: extraction_1.InitialSyncScope.TIME_SCOPED,
16
- },
17
- },
18
- });
19
- // Assert
20
- expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00Z');
21
- expect(event.payload.event_context.extract_to).toBe('2024-06-01T00:00:00Z');
22
- expect(event.payload.event_context.initial_sync_scope).toBe(extraction_1.InitialSyncScope.TIME_SCOPED);
23
- });
24
- it('should create event context with partial optional fields', () => {
25
- // Arrange & Act
26
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
27
- payload: {
28
- event_type: extraction_1.EventType.StartExtractingData,
29
- event_context: {
30
- extract_from: '2024-01-01T00:00:00Z',
31
- },
32
- },
33
- });
34
- // Assert
35
- expect(event.payload.event_context.extract_from).toBe('2024-01-01T00:00:00Z');
36
- });
37
- it('should handle different InitialSyncScope values', () => {
38
- // Arrange & Act
39
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
40
- payload: {
41
- event_type: extraction_1.EventType.StartExtractingData,
42
- event_context: {
43
- initial_sync_scope: extraction_1.InitialSyncScope.FULL_HISTORY,
44
- },
45
- },
46
- });
47
- // Assert
48
- expect(event.payload.event_context.initial_sync_scope).toBe(extraction_1.InitialSyncScope.FULL_HISTORY);
49
- });
50
- it('[edge] should handle null event context gracefully', () => {
51
- // Arrange
52
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
53
- payload: { event_type: extraction_1.EventType.StartExtractingData },
54
- });
55
- // Act
56
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
- event.payload.event_context = null;
58
- // Assert
59
- expect(event.payload.event_context).toBeNull();
60
- });
61
- it('[edge] should handle undefined optional fields', () => {
62
- // Arrange & Act
63
- const event = (0, test_utils_1.createMockEvent)(jest_setup_1.mockServer.baseUrl, {
64
- payload: {
65
- event_type: extraction_1.EventType.StartExtractingData,
66
- event_context: {
67
- extract_from: undefined,
68
- extract_to: undefined,
69
- initial_sync_scope: undefined,
70
- },
71
- },
72
- });
73
- // Assert
74
- expect(event.payload.event_context.extract_from).toBeUndefined();
75
- expect(event.payload.event_context.extract_to).toBeUndefined();
76
- expect(event.payload.event_context.initial_sync_scope).toBeUndefined();
77
- });
78
- describe('TimeValueType enum', () => {
79
- it('should have all expected values', () => {
80
- // Assert
81
- expect(extraction_1.TimeValueType.WORKERS_OLDEST).toBe('workers_oldest');
82
- expect(extraction_1.TimeValueType.WORKERS_OLDEST_MINUS_WINDOW).toBe('workers_oldest_minus_window');
83
- expect(extraction_1.TimeValueType.WORKERS_NEWEST).toBe('workers_newest');
84
- expect(extraction_1.TimeValueType.WORKERS_NEWEST_PLUS_WINDOW).toBe('workers_newest_plus_window');
85
- expect(extraction_1.TimeValueType.CURRENT_TIME).toBe('current_time');
86
- expect(extraction_1.TimeValueType.ABSOLUTE_TIME).toBe('absolute_time');
87
- expect(extraction_1.TimeValueType.UNBOUNDED).toBe('unbounded');
88
- });
89
- it('should have exactly seven values', () => {
90
- // Act
91
- const values = Object.values(extraction_1.TimeValueType);
92
- // Assert
93
- expect(values.length).toBe(7);
94
- });
95
- });
96
- });
@@ -1,10 +0,0 @@
1
- export { ErrorRecord, InitialDomainMapping, SyncMode } from './common';
2
- export { AirSyncEvent, AirSyncMessage, ConnectionData, EventContext, EventData, EventType, ExternalProcessAttachmentFunction, ExternalSyncUnit, ExternalSystemAttachmentIteratorFunction, ExternalSystemAttachmentReducerFunction, ExternalSystemAttachmentStreamingFunction, ExternalSystemAttachmentStreamingParams, ExternalSystemAttachmentStreamingResponse, ExtractorEvent, ExtractorEventType, InitialSyncScope, ProcessAttachmentReturnType, TimeUnit, TimeValue, TimeValueType, } from './extraction';
3
- export { ExternalSystemAttachment, ExternalSystemItem, ExternalSystemItemLoadingParams, ExternalSystemItemLoadingResponse, LoaderEventType, } from './loading';
4
- export { NormalizedAttachment, NormalizedItem, RepoInterface, } from '../repo/repo.interfaces';
5
- export { UNBOUNDED_DATE_TIME_VALUE } from '../common/constants';
6
- export { Artifact, ArtifactsPrepareResponse, SsorAttachment, StreamAttachmentsResponse, StreamResponse, UploadResponse, } from '../uploader/uploader.interfaces';
7
- export type { MappersCreateParams, MappersGetByExternalIdParams, MappersGetByTargetIdParams, MappersUpdateParams, } from '../mappers/mappers.interface';
8
- export { SyncMapperRecordStatus, SyncMapperRecordTargetType, } from '../mappers/mappers.interface';
9
- export type { CollectionData, ConditionalPrivilegeData, CustomLinkData, CustomLinkNames, CustomStage, CustomState, EnumData, EnumValue, EnumValueKey, ExternalDomainMetadata, Field, FieldCondition, FieldConditionComparator, FieldConditionEffect, FieldConditions, FieldKey, FieldPrivilegeData, FieldReferenceData, FieldType, FloatData, IntData, PermissionData, RecordType, RecordTypeCategory, RecordTypeCategoryKey, RecordTypeKey, RecordTypePrivilegeData, RecordTypeScope, ReferenceData, ReferenceDetail, ReferenceType, SchemaVersion, StageKey, StageDiagram, StateKey, StructData, StructTypeKey, StructType, TargetTypeKeyData, TextData, TypedReferenceData, } from './external-domain-metadata';
10
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGvE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,iCAAiC,EACjC,gBAAgB,EAChB,wCAAwC,EACxC,uCAAuC,EACvC,yCAAyC,EACzC,uCAAuC,EACvC,yCAAyC,EACzC,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,QAAQ,EACR,SAAS,EACT,aAAa,GACd,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,+BAA+B,EAC/B,iCAAiC,EACjC,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EACL,QAAQ,EACR,wBAAwB,EACxB,cAAc,EACd,yBAAyB,EACzB,cAAc,EACd,cAAc,GACf,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,KAAK,EACL,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,OAAO,EACP,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,kBAAkB,GACnB,MAAM,4BAA4B,CAAC"}
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SyncMapperRecordTargetType = exports.SyncMapperRecordStatus = exports.UNBOUNDED_DATE_TIME_VALUE = exports.LoaderEventType = exports.TimeValueType = exports.TimeUnit = exports.InitialSyncScope = exports.ExtractorEventType = exports.EventType = exports.SyncMode = void 0;
4
- // Common
5
- var common_1 = require("./common");
6
- Object.defineProperty(exports, "SyncMode", { enumerable: true, get: function () { return common_1.SyncMode; } });
7
- // Extraction
8
- var extraction_1 = require("./extraction");
9
- Object.defineProperty(exports, "EventType", { enumerable: true, get: function () { return extraction_1.EventType; } });
10
- Object.defineProperty(exports, "ExtractorEventType", { enumerable: true, get: function () { return extraction_1.ExtractorEventType; } });
11
- Object.defineProperty(exports, "InitialSyncScope", { enumerable: true, get: function () { return extraction_1.InitialSyncScope; } });
12
- Object.defineProperty(exports, "TimeUnit", { enumerable: true, get: function () { return extraction_1.TimeUnit; } });
13
- Object.defineProperty(exports, "TimeValueType", { enumerable: true, get: function () { return extraction_1.TimeValueType; } });
14
- // Loading
15
- var loading_1 = require("./loading");
16
- Object.defineProperty(exports, "LoaderEventType", { enumerable: true, get: function () { return loading_1.LoaderEventType; } });
17
- var constants_1 = require("../common/constants");
18
- Object.defineProperty(exports, "UNBOUNDED_DATE_TIME_VALUE", { enumerable: true, get: function () { return constants_1.UNBOUNDED_DATE_TIME_VALUE; } });
19
- var mappers_interface_1 = require("../mappers/mappers.interface");
20
- Object.defineProperty(exports, "SyncMapperRecordStatus", { enumerable: true, get: function () { return mappers_interface_1.SyncMapperRecordStatus; } });
21
- Object.defineProperty(exports, "SyncMapperRecordTargetType", { enumerable: true, get: function () { return mappers_interface_1.SyncMapperRecordTargetType; } });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=uploader.helpers.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploader.helpers.test.d.ts","sourceRoot":"","sources":["../../src/uploader/uploader.helpers.test.ts"],"names":[],"mappings":""}
@@ -1,256 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const fs_2 = require("fs");
8
- const js_jsonl_1 = require("js-jsonl");
9
- const zlib_1 = __importDefault(require("zlib"));
10
- const constants_1 = require("../common/constants");
11
- const uploader_helpers_1 = require("./uploader.helpers");
12
- describe('uploader.helpers', () => {
13
- afterEach(() => {
14
- jest.clearAllMocks();
15
- });
16
- describe(uploader_helpers_1.compressGzip.name, () => {
17
- it('should compress a string to gzip buffer', () => {
18
- // Arrange
19
- const input = '{"id":1}\n{"id":2}';
20
- // Act
21
- const result = (0, uploader_helpers_1.compressGzip)(input);
22
- // Assert
23
- expect(result.response).toBeInstanceOf(Buffer);
24
- const decompressed = zlib_1.default
25
- .gunzipSync(result.response)
26
- .toString();
27
- expect(decompressed).toBe(input);
28
- });
29
- it('[edge] should return undefined and log error when compression fails', () => {
30
- // Arrange
31
- const gzipSyncSpy = jest
32
- .spyOn(zlib_1.default, 'gzipSync')
33
- .mockImplementationOnce(() => {
34
- throw new Error('Compression failed');
35
- });
36
- // Act
37
- const result = (0, uploader_helpers_1.compressGzip)('test data');
38
- // Assert
39
- expect(result.response).toBeUndefined();
40
- gzipSyncSpy.mockRestore();
41
- });
42
- });
43
- describe(uploader_helpers_1.decompressGzip.name, () => {
44
- it('should decompress a gzip buffer to string', () => {
45
- // Arrange
46
- const originalString = '{"id":1}\n{"id":2}';
47
- const compressed = zlib_1.default.gzipSync(originalString);
48
- // Act
49
- const result = (0, uploader_helpers_1.decompressGzip)(compressed);
50
- // Assert
51
- expect(result.response).toBe(originalString);
52
- });
53
- it('[edge] should return undefined and log error when decompression fails', () => {
54
- // Arrange
55
- const invalidGzip = Buffer.from('not valid gzip data');
56
- // Act
57
- const result = (0, uploader_helpers_1.decompressGzip)(invalidGzip);
58
- // Assert
59
- expect(result.response).toBeUndefined();
60
- });
61
- });
62
- describe(uploader_helpers_1.parseJsonl.name, () => {
63
- it('should parse valid JSONL string to array of objects', () => {
64
- // Arrange
65
- const data = [
66
- { id: 1, name: 'Item 1' },
67
- { id: 2, name: 'Item 2' },
68
- ];
69
- const jsonlString = js_jsonl_1.jsonl.stringify(data);
70
- // Act
71
- const result = (0, uploader_helpers_1.parseJsonl)(jsonlString);
72
- // Assert
73
- expect(result.response).toEqual(data);
74
- });
75
- it('[edge] should return null and log error when parsing fails', () => {
76
- // Arrange
77
- const invalidJsonl = 'not valid jsonl {{{';
78
- // Act
79
- const result = (0, uploader_helpers_1.parseJsonl)(invalidJsonl);
80
- // Assert
81
- expect(result.response).toBeUndefined();
82
- });
83
- });
84
- describe(uploader_helpers_1.downloadToLocal.name, () => {
85
- const mockExistsSync = jest.spyOn(fs_1.default, 'existsSync');
86
- const mockMkdirSync = jest.spyOn(fs_1.default, 'mkdirSync');
87
- afterEach(() => {
88
- mockExistsSync.mockReset();
89
- mockMkdirSync.mockReset();
90
- });
91
- it('should create extracted_files directory if it does not exist', async () => {
92
- // Arrange
93
- const itemType = 'tasks';
94
- const fetchedObjects = [{ id: 1 }];
95
- mockExistsSync.mockReturnValueOnce(false);
96
- mockMkdirSync.mockImplementationOnce(() => undefined);
97
- const mockFileHandle = {
98
- write: jest.fn().mockResolvedValue(undefined),
99
- close: jest.fn().mockResolvedValue(undefined),
100
- };
101
- const fsPromisesOpenSpy = jest
102
- .spyOn(fs_2.promises, 'open')
103
- .mockResolvedValueOnce(mockFileHandle);
104
- // Act
105
- await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
106
- // Assert
107
- expect(mockExistsSync).toHaveBeenCalledWith('extracted_files');
108
- expect(mockMkdirSync).toHaveBeenCalledWith('extracted_files');
109
- fsPromisesOpenSpy.mockRestore();
110
- });
111
- it('should write objects as JSONL lines to file', async () => {
112
- // Arrange
113
- const itemType = 'tasks';
114
- const fetchedObjects = [{ id: 1 }, { id: 2 }];
115
- mockExistsSync.mockReturnValueOnce(true);
116
- const mockFileHandle = {
117
- write: jest.fn().mockResolvedValue(undefined),
118
- close: jest.fn().mockResolvedValue(undefined),
119
- };
120
- const fsPromisesOpenSpy = jest
121
- .spyOn(fs_2.promises, 'open')
122
- .mockResolvedValueOnce(mockFileHandle);
123
- // Act
124
- await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects);
125
- // Assert
126
- expect(mockFileHandle.write).toHaveBeenCalledTimes(2);
127
- expect(mockFileHandle.write).toHaveBeenCalledWith('{"id":1}\n');
128
- expect(mockFileHandle.write).toHaveBeenCalledWith('{"id":2}\n');
129
- expect(mockFileHandle.close).toHaveBeenCalled();
130
- fsPromisesOpenSpy.mockRestore();
131
- });
132
- it('should handle single object (non-array) input', async () => {
133
- // Arrange
134
- const itemType = 'metadata';
135
- const fetchedObject = { key: 'value' };
136
- mockExistsSync.mockReturnValueOnce(true);
137
- const mockFileHandle = {
138
- write: jest.fn().mockResolvedValue(undefined),
139
- close: jest.fn().mockResolvedValue(undefined),
140
- };
141
- const fsPromisesOpenSpy = jest
142
- .spyOn(fs_2.promises, 'open')
143
- .mockResolvedValueOnce(mockFileHandle);
144
- // Act
145
- await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObject);
146
- // Assert
147
- expect(mockFileHandle.write).toHaveBeenCalledTimes(1);
148
- expect(mockFileHandle.write).toHaveBeenCalledWith('{"key":"value"}\n');
149
- fsPromisesOpenSpy.mockRestore();
150
- });
151
- it('should use .json extension when itemType is external_domain_metadata', async () => {
152
- // Arrange
153
- const itemType = 'external_domain_metadata';
154
- const fetchedObject = { domain: 'example.com' };
155
- mockExistsSync.mockReturnValueOnce(true);
156
- const mockFileHandle = {
157
- write: jest.fn().mockResolvedValue(undefined),
158
- close: jest.fn().mockResolvedValue(undefined),
159
- };
160
- const fsPromisesOpenSpy = jest
161
- .spyOn(fs_2.promises, 'open')
162
- .mockResolvedValueOnce(mockFileHandle);
163
- // Act
164
- await (0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObject);
165
- // Assert
166
- expect(fsPromisesOpenSpy).toHaveBeenCalledWith(expect.stringMatching(/extractor_external_domain_metadata_\d+\.json$/), 'w');
167
- fsPromisesOpenSpy.mockRestore();
168
- });
169
- it('[edge] should reject and log error when file operations fail', async () => {
170
- // Arrange
171
- const itemType = 'tasks';
172
- const fetchedObjects = [{ id: 1 }];
173
- const fileError = new Error('File write failed');
174
- mockExistsSync.mockReturnValueOnce(true);
175
- const fsPromisesOpenSpy = jest
176
- .spyOn(fs_2.promises, 'open')
177
- .mockRejectedValueOnce(fileError);
178
- // Act & Assert
179
- await expect((0, uploader_helpers_1.downloadToLocal)(itemType, fetchedObjects)).rejects.toThrow(fileError);
180
- fsPromisesOpenSpy.mockRestore();
181
- });
182
- });
183
- describe(uploader_helpers_1.truncateFilename.name, () => {
184
- it('should return filename unchanged when within the limit', () => {
185
- // Arrange
186
- const filename = 'short-filename.txt';
187
- // Act
188
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
189
- // Assert
190
- expect(result).toBe(filename);
191
- });
192
- it('should return filename unchanged when exactly at the limit', () => {
193
- // Arrange
194
- const filename = 'a'.repeat(constants_1.MAX_DEVREV_FILENAME_LENGTH);
195
- // Act
196
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
197
- // Assert
198
- expect(result).toBe(filename);
199
- expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
200
- });
201
- it('should truncate filename and preserve extension when exceeding the limit', () => {
202
- // Arrange
203
- const longName = 'a'.repeat(300);
204
- const extension = '.txt';
205
- const filename = longName + extension;
206
- // Act
207
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
208
- // Assert
209
- expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
210
- expect(result).toContain('...');
211
- expect(result.endsWith(extension)).toBe(true);
212
- });
213
- it('should preserve the last MAX_DEVREV_FILENAME_EXTENSION_LENGTH characters as extension', () => {
214
- // Arrange
215
- const longName = 'document-'.repeat(50);
216
- const extension = '.verylongextension';
217
- const filename = longName + extension;
218
- // Act
219
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
220
- // Assert
221
- expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
222
- const expectedExtension = filename.slice(-constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH);
223
- expect(result.endsWith(expectedExtension)).toBe(true);
224
- });
225
- it('should correctly format the truncated filename with ellipsis', () => {
226
- // Arrange
227
- const filename = 'x'.repeat(300) + '.pdf';
228
- // Act
229
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
230
- // Assert
231
- const availableNameLength = constants_1.MAX_DEVREV_FILENAME_LENGTH - constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH - 3;
232
- const expectedPrefix = 'x'.repeat(availableNameLength);
233
- const expectedExtension = filename.slice(-constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH);
234
- expect(result).toBe(`${expectedPrefix}...${expectedExtension}`);
235
- });
236
- it('[edge] should handle filename with no extension', () => {
237
- // Arrange
238
- const filename = 'a'.repeat(300);
239
- // Act
240
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
241
- // Assert
242
- expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
243
- expect(result).toContain('...');
244
- // Last 20 chars are preserved as "extension"
245
- expect(result.endsWith('a'.repeat(constants_1.MAX_DEVREV_FILENAME_EXTENSION_LENGTH))).toBe(true);
246
- });
247
- it('[edge] should handle filename that is just one character over the limit', () => {
248
- // Arrange
249
- const filename = 'a'.repeat(constants_1.MAX_DEVREV_FILENAME_LENGTH + 1);
250
- // Act
251
- const result = (0, uploader_helpers_1.truncateFilename)(filename);
252
- // Assert
253
- expect(result.length).toBe(constants_1.MAX_DEVREV_FILENAME_LENGTH);
254
- });
255
- });
256
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=uploader.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploader.test.d.ts","sourceRoot":"","sources":["../../src/uploader/uploader.test.ts"],"names":[],"mappings":""}