@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
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExtractionAdapter = void 0;
4
+ const attachments_streaming_pool_1 = require("../../attachments-streaming/attachments-streaming-pool");
5
+ const constants_1 = require("../../common/constants");
6
+ const logger_1 = require("../../logger/logger");
7
+ const repo_1 = require("../../repo/repo");
8
+ const extraction_1 = require("../../types/extraction");
9
+ const base_adapter_1 = require("./base-adapter");
10
+ /**
11
+ * ExtractionAdapter is the adapter passed to extraction tasks. It exposes the
12
+ * extraction surface (repos, artifacts, attachment streaming) and uploads
13
+ * pending repos and updates the extraction boundaries before emitting.
14
+ *
15
+ * @public
16
+ */
17
+ class ExtractionAdapter extends base_adapter_1.BaseAdapter {
18
+ constructor(params) {
19
+ super(params);
20
+ this.repos = [];
21
+ this.currentEventDataLength = 0;
22
+ this._artifacts = [];
23
+ }
24
+ /**
25
+ * Returns whether the given item type should be extracted.
26
+ * Defaults to true if the scope is empty or the item type is not listed.
27
+ */
28
+ shouldExtract(itemType) {
29
+ const scope = this.extractionScope;
30
+ if (Object.keys(scope).length === 0)
31
+ return true;
32
+ if (!(itemType in scope))
33
+ return true;
34
+ return scope[itemType].extract;
35
+ }
36
+ initializeRepos(repos) {
37
+ this.repos = repos.map((repo) => {
38
+ const shouldNormalize = repo.itemType !== constants_1.AirSyncDefaultItemTypes.EXTERNAL_DOMAIN_METADATA &&
39
+ repo.itemType !== constants_1.SSOR_ATTACHMENT;
40
+ return new repo_1.Repo(Object.assign(Object.assign({ event: this.event, itemType: repo.itemType }, (shouldNormalize && { normalize: repo.normalize })), { onUpload: (artifact) => {
41
+ var _a;
42
+ // We need to store artifacts ids in state for later use when streaming attachments
43
+ if (repo.itemType === constants_1.AirSyncDefaultItemTypes.ATTACHMENTS) {
44
+ (_a = this.sdkState.toDevRev) === null || _a === void 0 ? void 0 : _a.attachmentsMetadata.artifactIds.push(artifact.id);
45
+ }
46
+ // Calculate size of the entire artifact object that goes in the SQS message
47
+ this.currentEventDataLength += Buffer.byteLength(JSON.stringify(artifact), 'utf8');
48
+ if (this.currentEventDataLength > constants_1.EVENT_SIZE_THRESHOLD_BYTES &&
49
+ !this.isTimeout) {
50
+ this.isTimeout = true;
51
+ }
52
+ }, options: Object.assign(Object.assign({}, this.options), repo.overridenOptions) }));
53
+ });
54
+ }
55
+ getRepo(itemType) {
56
+ return (0, logger_1.runWithSdkLogContext)(() => {
57
+ const repo = this.repos.find((repo) => repo.itemType === itemType);
58
+ if (!repo) {
59
+ console.error(`Repo for item type ${itemType} not found.`);
60
+ return;
61
+ }
62
+ return repo;
63
+ });
64
+ }
65
+ get artifacts() {
66
+ return this._artifacts;
67
+ }
68
+ set artifacts(artifacts) {
69
+ this._artifacts = this._artifacts
70
+ .concat(artifacts)
71
+ .filter((value, index, self) => self.indexOf(value) === index);
72
+ }
73
+ async beforeEmit(newEventType) {
74
+ // Upload all repos before emitting the event
75
+ console.log(`Uploading all repos before emitting event with event type: ${newEventType}.`);
76
+ await this.uploadAllRepos();
77
+ // When the full extraction cycle completes, commit the extraction window
78
+ // boundaries so subsequent incremental syncs can resume from them.
79
+ if (newEventType === extraction_1.ExtractorEventType.AttachmentExtractionDone) {
80
+ const sdkState = this.sdkState;
81
+ // Clear pending extraction boundaries now that the cycle is complete
82
+ sdkState.pendingWorkersOldest = '';
83
+ sdkState.pendingWorkersNewest = '';
84
+ // Update workersOldest and workersNewest boundaries from resolved extraction timestamps.
85
+ // Expand boundaries: workersOldest gets the earliest timestamp, workersNewest gets the latest.
86
+ const extractionStart = this.event.payload.event_context.extract_from;
87
+ const extractionEnd = this.event.payload.event_context.extract_to;
88
+ if (extractionStart &&
89
+ (!sdkState.workersOldest || extractionStart < sdkState.workersOldest)) {
90
+ console.log(`Updating workersOldest from '${sdkState.workersOldest}' to '${extractionStart}'.`);
91
+ sdkState.workersOldest = extractionStart;
92
+ }
93
+ if (extractionEnd &&
94
+ (!sdkState.workersNewest || extractionEnd > sdkState.workersNewest)) {
95
+ console.log(`Updating workersNewest from '${sdkState.workersNewest}' to '${extractionEnd}'.`);
96
+ sdkState.workersNewest = extractionEnd;
97
+ }
98
+ }
99
+ }
100
+ buildEmitPayload(newEventType) {
101
+ const isExtractionEvent = Object.values(extraction_1.ExtractorEventType).includes(newEventType);
102
+ return isExtractionEvent ? { artifacts: this.artifacts } : {};
103
+ }
104
+ afterEmit() {
105
+ this.artifacts = [];
106
+ }
107
+ async uploadAllRepos() {
108
+ for (const repo of this.repos) {
109
+ const error = await repo.upload();
110
+ this.artifacts.push(...repo.uploadedArtifacts);
111
+ if (error) {
112
+ throw error;
113
+ }
114
+ }
115
+ }
116
+ async processAttachment(attachment, stream) {
117
+ return (0, logger_1.runWithSdkLogContext)(async () => {
118
+ var _a, _b, _c;
119
+ const { httpStream, delay, error } = await (0, logger_1.runWithUserLogContext)(async () => stream({
120
+ item: attachment,
121
+ event: this.event,
122
+ }));
123
+ if (error) {
124
+ return { error };
125
+ }
126
+ else if (delay) {
127
+ return { delay };
128
+ }
129
+ if (httpStream) {
130
+ const fileType = attachment.content_type ||
131
+ ((_a = httpStream.headers['content-type']) === null || _a === void 0 ? void 0 : _a.toString()) ||
132
+ 'application/octet-stream';
133
+ const contentLength = (_b = httpStream.headers['content-length']) === null || _b === void 0 ? void 0 : _b.toString();
134
+ const fileSize = contentLength ? parseInt(contentLength) : undefined;
135
+ // Get upload URL
136
+ const { error: artifactUrlError, response: artifactUrlResponse } = await this.uploader.getArtifactUploadUrl(attachment.file_name, fileType, fileSize);
137
+ if (artifactUrlError) {
138
+ this.destroyHttpStream(httpStream);
139
+ return {
140
+ error: {
141
+ message: `Error while preparing artifact for attachment ID ${attachment.id}. Skipping attachment. ${(0, logger_1.serializeError)(artifactUrlError)}`,
142
+ fileSize: fileSize,
143
+ },
144
+ };
145
+ }
146
+ // Stream attachment
147
+ const { error: uploadedArtifactError } = await this.uploader.streamArtifact(artifactUrlResponse, httpStream);
148
+ if (uploadedArtifactError) {
149
+ this.destroyHttpStream(httpStream);
150
+ return {
151
+ error: {
152
+ message: `Error while streaming to artifact for attachment ID ${attachment.id}. Skipping attachment. ` +
153
+ (0, logger_1.serializeError)(uploadedArtifactError),
154
+ fileSize: fileSize,
155
+ },
156
+ };
157
+ }
158
+ // Confirm attachment upload
159
+ const { error: confirmArtifactUploadError } = await this.uploader.confirmArtifactUpload(artifactUrlResponse.artifact_id);
160
+ if (confirmArtifactUploadError) {
161
+ return {
162
+ error: {
163
+ message: `Error while confirming upload for attachment ID ${attachment.id}. ` +
164
+ (0, logger_1.serializeError)(confirmArtifactUploadError),
165
+ fileSize: fileSize,
166
+ },
167
+ };
168
+ }
169
+ const ssorAttachment = {
170
+ id: {
171
+ devrev: artifactUrlResponse.artifact_id,
172
+ external: attachment.id,
173
+ },
174
+ parent_id: {
175
+ external: attachment.parent_id,
176
+ },
177
+ };
178
+ if (attachment.author_id) {
179
+ ssorAttachment.actor_id = {
180
+ external: attachment.author_id,
181
+ };
182
+ }
183
+ // This will set inline flag in ssor_attachment only if it is explicity
184
+ // set in the attachment object.
185
+ if (attachment.inline === true) {
186
+ ssorAttachment.inline = true;
187
+ }
188
+ else if (attachment.inline === false) {
189
+ ssorAttachment.inline = false;
190
+ }
191
+ await ((_c = this.getRepo('ssor_attachment')) === null || _c === void 0 ? void 0 : _c.push([ssorAttachment]));
192
+ return;
193
+ }
194
+ return {
195
+ error: {
196
+ message: `Error while opening attachment stream. Skipping attachment.`,
197
+ },
198
+ };
199
+ });
200
+ }
201
+ /**
202
+ * Destroys a stream to prevent memory leaks.
203
+ * @param httpStream - The axios response stream to destroy
204
+ */
205
+ destroyHttpStream(httpStream) {
206
+ try {
207
+ if (httpStream && httpStream.data) {
208
+ if (typeof httpStream.data.destroy === 'function') {
209
+ httpStream.data.destroy();
210
+ }
211
+ else if (typeof httpStream.data.close === 'function') {
212
+ httpStream.data.close();
213
+ }
214
+ }
215
+ }
216
+ catch (error) {
217
+ console.warn('Error while destroying HTTP stream:', error);
218
+ }
219
+ }
220
+ /**
221
+ * Streams the attachments to the DevRev platform.
222
+ * The attachments are streamed to the platform and the artifact information is returned.
223
+ * @param params - The parameters to stream the attachments
224
+ * @returns The response object containing the ssorAttachment artifact information
225
+ * or error information if there was an error
226
+ */
227
+ async streamAttachments({ stream, processors, batchSize = 1, // By default, we want to stream one attachment at a time
228
+ }) {
229
+ return (0, logger_1.runWithSdkLogContext)(async () => {
230
+ var _a, _b;
231
+ if (batchSize <= 0) {
232
+ console.warn(`The specified batch size (${batchSize}) is invalid. Using 1 instead.`);
233
+ batchSize = 1;
234
+ }
235
+ if (batchSize > 50) {
236
+ console.warn(`The specified batch size (${batchSize}) is too large. Using 50 instead.`);
237
+ batchSize = 50;
238
+ }
239
+ const repos = [
240
+ {
241
+ itemType: 'ssor_attachment',
242
+ },
243
+ ];
244
+ this.initializeRepos(repos);
245
+ const attachmentsMetadata = (_a = this.sdkState.toDevRev) === null || _a === void 0 ? void 0 : _a.attachmentsMetadata;
246
+ // If there are no attachments metadata artifact IDs in state, finish here
247
+ if (!((_b = attachmentsMetadata === null || attachmentsMetadata === void 0 ? void 0 : attachmentsMetadata.artifactIds) === null || _b === void 0 ? void 0 : _b.length)) {
248
+ console.log(`No attachments metadata artifact IDs found in state.`);
249
+ return { status: 'success' };
250
+ }
251
+ else {
252
+ console.log(`Found ${attachmentsMetadata.artifactIds.length} attachments metadata artifact IDs in state.`);
253
+ }
254
+ // Loop through the attachments metadata artifact IDs
255
+ while (attachmentsMetadata.artifactIds.length > 0) {
256
+ const attachmentsMetadataArtifactId = attachmentsMetadata.artifactIds[0];
257
+ console.log(`Started processing attachments for attachments metadata artifact ID: ${attachmentsMetadataArtifactId}.`);
258
+ const { attachments, error } = await this.uploader.getAttachmentsFromArtifactId({
259
+ artifact: attachmentsMetadataArtifactId,
260
+ });
261
+ if (error) {
262
+ console.error(`Failed to get attachments for artifact ID: ${attachmentsMetadataArtifactId}.`);
263
+ return { status: 'error', error };
264
+ }
265
+ if (!attachments || attachments.length === 0) {
266
+ console.warn(`No attachments found for artifact ID: ${attachmentsMetadataArtifactId}.`);
267
+ // Remove empty artifact and reset lastProcessed
268
+ attachmentsMetadata.artifactIds.shift();
269
+ attachmentsMetadata.lastProcessed = 0;
270
+ continue;
271
+ }
272
+ console.log(`Found ${attachments.length} attachments for artifact ID: ${attachmentsMetadataArtifactId}.`);
273
+ let response;
274
+ if (processors) {
275
+ console.log(`Using custom processors for attachments.`);
276
+ const reducer = processors.reducer;
277
+ const iterator = processors.iterator;
278
+ const reducedAttachments = (0, logger_1.runWithUserLogContext)(() => reducer({
279
+ attachments,
280
+ adapter: this,
281
+ batchSize,
282
+ }));
283
+ response = await (0, logger_1.runWithUserLogContext)(async () => {
284
+ return await iterator({
285
+ reducedAttachments,
286
+ adapter: this,
287
+ stream,
288
+ });
289
+ });
290
+ }
291
+ else {
292
+ console.log(`Using attachments streaming pool for attachments streaming.`);
293
+ const attachmentsPool = new attachments_streaming_pool_1.AttachmentsStreamingPool({
294
+ adapter: this,
295
+ attachments,
296
+ batchSize,
297
+ stream,
298
+ });
299
+ response = await attachmentsPool.streamAll();
300
+ }
301
+ if (response === null || response === void 0 ? void 0 : response.error) {
302
+ return { status: 'error', error: response.error };
303
+ }
304
+ if (response === null || response === void 0 ? void 0 : response.delay) {
305
+ return { status: 'delay', delaySeconds: response.delay };
306
+ }
307
+ // On timeout, return progress to allow continuation in a fresh invocation.
308
+ if (this.isTimeout) {
309
+ console.log(`Timeout detected after processing attachments for artifact ID: ${attachmentsMetadataArtifactId}. Returning progress to allow continuation.`);
310
+ return { status: 'progress' };
311
+ }
312
+ console.log(`Finished processing all attachments for artifact ID: ${attachmentsMetadataArtifactId}.`);
313
+ attachmentsMetadata.artifactIds.shift();
314
+ attachmentsMetadata.lastProcessed = 0;
315
+ if (attachmentsMetadata.lastProcessedAttachmentsIdsList) {
316
+ attachmentsMetadata.lastProcessedAttachmentsIdsList.length = 0;
317
+ }
318
+ }
319
+ return { status: 'success' };
320
+ });
321
+ }
322
+ }
323
+ exports.ExtractionAdapter = ExtractionAdapter;
@@ -0,0 +1,44 @@
1
+ import { Mappers } from '../../mappers/mappers';
2
+ import { BaseState } from '../../state/state';
3
+ import { AirSyncEvent, EventData, ExtractorEventType } from '../../types/extraction';
4
+ import { ExternalSystemAttachment, ExternalSystemItem, ExternalSystemLoadingFunction, FileToLoad, ItemTypesToLoadParams, ItemTypeToLoad, LoaderEventType, LoaderReport, LoadItemResponse } from '../../types/loading';
5
+ import { TaskResult, WorkerAdapterOptions } from '../../types/workers';
6
+ import { BaseAdapter } from './base-adapter';
7
+ /**
8
+ * LoadingAdapter is the adapter passed to loading tasks. It exposes the loading
9
+ * surface (item/attachment loading, mappers, loader reports).
10
+ *
11
+ * @public
12
+ */
13
+ export declare class LoadingAdapter<ConnectorState> extends BaseAdapter<ConnectorState> {
14
+ private loaderReports;
15
+ private _processedFiles;
16
+ private _mappers;
17
+ constructor(params: {
18
+ event: AirSyncEvent;
19
+ adapterState: BaseState<ConnectorState>;
20
+ options?: WorkerAdapterOptions;
21
+ });
22
+ get reports(): LoaderReport[];
23
+ get processedFiles(): string[];
24
+ get mappers(): Mappers;
25
+ protected beforeEmit(): Promise<void>;
26
+ protected buildEmitPayload(newEventType: ExtractorEventType | LoaderEventType): EventData;
27
+ protected afterEmit(): void;
28
+ loadItemTypes({ itemTypesToLoad, }: ItemTypesToLoadParams): Promise<TaskResult>;
29
+ getLoaderBatches({ supportedItemTypes, }: {
30
+ supportedItemTypes: string[];
31
+ }): Promise<FileToLoad[]>;
32
+ loadAttachments({ create, }: {
33
+ create: ExternalSystemLoadingFunction<ExternalSystemAttachment>;
34
+ }): Promise<TaskResult>;
35
+ loadItem({ item, itemTypeToLoad, }: {
36
+ item: ExternalSystemItem;
37
+ itemTypeToLoad: ItemTypeToLoad;
38
+ }): Promise<LoadItemResponse>;
39
+ loadAttachment({ item, create, }: {
40
+ item: ExternalSystemAttachment;
41
+ create: ExternalSystemLoadingFunction<ExternalSystemAttachment>;
42
+ }): Promise<LoadItemResponse>;
43
+ }
44
+ //# sourceMappingURL=loading-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-adapter.d.ts","sourceRoot":"","sources":["../../../src/multithreading/adapters/loading-adapter.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,SAAS,EAET,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC7B,UAAU,EACV,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C;;;;;GAKG;AACH,qBAAa,cAAc,CACzB,cAAc,CACd,SAAQ,WAAW,CAAC,cAAc,CAAC;IACnC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAU;gBAEd,MAAM,EAAE;QAClB,KAAK,EAAE,YAAY,CAAC;QACpB,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,OAAO,CAAC,EAAE,oBAAoB,CAAC;KAChC;IAUD,IAAI,OAAO,IAAI,YAAY,EAAE,CAE5B;IAED,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;cAEe,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3C,SAAS,CAAC,gBAAgB,CACxB,YAAY,EAAE,kBAAkB,GAAG,eAAe,GACjD,SAAS;IAYZ,SAAS,CAAC,SAAS,IAAI,IAAI;IAIrB,aAAa,CAAC,EAClB,eAAe,GAChB,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAsHxC,gBAAgB,CAAC,EACrB,kBAAkB,GACnB,EAAE;QACD,kBAAkB,EAAE,MAAM,EAAE,CAAC;KAC9B;IA4BK,eAAe,CAAC,EACpB,MAAM,GACP,EAAE;QACD,MAAM,EAAE,6BAA6B,CAAC,wBAAwB,CAAC,CAAC;KACjE,GAAG,OAAO,CAAC,UAAU,CAAC;IA4FjB,QAAQ,CAAC,EACb,IAAI,EACJ,cAAc,GACf,EAAE;QACD,IAAI,EAAE,kBAAkB,CAAC;QACzB,cAAc,EAAE,cAAc,CAAC;KAChC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsMvB,cAAc,CAAC,EACnB,IAAI,EACJ,MAAM,GACP,EAAE;QACD,IAAI,EAAE,wBAAwB,CAAC;QAC/B,MAAM,EAAE,6BAA6B,CAAC,wBAAwB,CAAC,CAAC;KACjE,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAsD9B"}
@@ -19,4 +19,4 @@ export declare function addReportToLoaderReport({ loaderReports, report, }: {
19
19
  loaderReports: LoaderReport[];
20
20
  report: LoaderReport;
21
21
  }): LoaderReport[];
22
- //# sourceMappingURL=worker-adapter.helpers.d.ts.map
22
+ //# sourceMappingURL=loading-adapter.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-adapter.helpers.d.ts","sourceRoot":"","sources":["../../../src/multithreading/adapters/loading-adapter.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAE7B;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,kBAAkB,EAClB,SAAS,GACV,EAAE;IACD,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B,GAAG,UAAU,EAAE,CA8Bf;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,aAAa,EACb,MAAM,GACP,EAAE;IACD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,YAAY,CAAC;CACtB,GAAG,YAAY,EAAE,CA4BjB"}