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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/MIGRATION.md +1028 -0
  2. package/README.md +5 -11
  3. package/dist/attachments-streaming/attachments-streaming-pool.d.ts +7 -9
  4. package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
  5. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +2 -7
  6. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
  7. package/dist/attachments-streaming/attachments-streaming-pool.js +54 -56
  8. package/dist/common/constants.d.ts +4 -5
  9. package/dist/common/constants.d.ts.map +1 -1
  10. package/dist/common/constants.js +6 -7
  11. package/dist/common/helpers.d.ts +3 -35
  12. package/dist/common/helpers.d.ts.map +1 -1
  13. package/dist/common/helpers.js +5 -50
  14. package/dist/http/{axios-client-internal.d.ts → client.d.ts} +1 -1
  15. package/dist/http/client.d.ts.map +1 -0
  16. package/dist/http/{axios-client-internal.js → client.js} +4 -8
  17. package/dist/index.d.ts +24 -13
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +43 -32
  20. package/dist/logger/logger.d.ts +12 -53
  21. package/dist/logger/logger.d.ts.map +1 -1
  22. package/dist/logger/logger.interfaces.d.ts +0 -1
  23. package/dist/logger/logger.interfaces.d.ts.map +1 -1
  24. package/dist/logger/logger.js +36 -68
  25. package/dist/mappers/mappers.d.ts +7 -46
  26. package/dist/mappers/mappers.d.ts.map +1 -1
  27. package/dist/mappers/mappers.interfaces.d.ts +175 -0
  28. package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
  29. package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +4 -13
  30. package/dist/mappers/mappers.js +11 -45
  31. package/dist/multithreading/adapters/base-adapter.d.ts +30 -32
  32. package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -1
  33. package/dist/multithreading/adapters/base-adapter.js +97 -62
  34. package/dist/multithreading/adapters/extraction-adapter.d.ts +16 -29
  35. package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -1
  36. package/dist/multithreading/adapters/extraction-adapter.js +203 -206
  37. package/dist/multithreading/adapters/loading-adapter.d.ts +8 -13
  38. package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -1
  39. package/dist/multithreading/adapters/loading-adapter.helpers.d.ts +2 -12
  40. package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -1
  41. package/dist/multithreading/adapters/loading-adapter.helpers.js +2 -12
  42. package/dist/multithreading/adapters/loading-adapter.js +294 -346
  43. package/dist/multithreading/emit.d.ts +11 -0
  44. package/dist/multithreading/emit.d.ts.map +1 -0
  45. package/dist/{common/control-protocol.js → multithreading/emit.js} +5 -7
  46. package/dist/multithreading/process-task.d.ts +2 -12
  47. package/dist/multithreading/process-task.d.ts.map +1 -1
  48. package/dist/multithreading/process-task.js +46 -43
  49. package/dist/multithreading/spawn/spawn.d.ts +3 -9
  50. package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
  51. package/dist/multithreading/spawn/spawn.helpers.d.ts +12 -11
  52. package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
  53. package/dist/multithreading/spawn/spawn.helpers.js +128 -20
  54. package/dist/multithreading/spawn/spawn.js +24 -39
  55. package/dist/multithreading/worker.js +1 -4
  56. package/dist/repo/repo.d.ts +10 -0
  57. package/dist/repo/repo.d.ts.map +1 -1
  58. package/dist/repo/repo.helpers.d.ts +6 -0
  59. package/dist/repo/repo.helpers.d.ts.map +1 -0
  60. package/dist/repo/repo.helpers.js +16 -0
  61. package/dist/repo/repo.interfaces.d.ts +4 -16
  62. package/dist/repo/repo.interfaces.d.ts.map +1 -1
  63. package/dist/repo/repo.js +23 -8
  64. package/dist/state/base-state.d.ts +16 -38
  65. package/dist/state/base-state.d.ts.map +1 -1
  66. package/dist/state/base-state.js +19 -41
  67. package/dist/state/extraction-state.d.ts +6 -21
  68. package/dist/state/extraction-state.d.ts.map +1 -1
  69. package/dist/state/extraction-state.js +8 -25
  70. package/dist/{common → state}/install-initial-domain-mapping.d.ts +1 -1
  71. package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
  72. package/dist/{common → state}/install-initial-domain-mapping.js +5 -7
  73. package/dist/state/loading-state.d.ts +3 -14
  74. package/dist/state/loading-state.d.ts.map +1 -1
  75. package/dist/state/loading-state.js +3 -14
  76. package/dist/state/state.d.ts +4 -0
  77. package/dist/state/state.d.ts.map +1 -0
  78. package/dist/state/state.interfaces.d.ts +33 -37
  79. package/dist/state/state.interfaces.d.ts.map +1 -1
  80. package/dist/state/state.interfaces.js +16 -11
  81. package/dist/state/state.js +11 -0
  82. package/dist/state/time-value-resolver.d.ts +17 -0
  83. package/dist/state/time-value-resolver.d.ts.map +1 -0
  84. package/dist/{common → state}/time-value-resolver.js +9 -41
  85. package/dist/testing/mock-event.d.ts +10 -0
  86. package/dist/testing/mock-event.d.ts.map +1 -0
  87. package/dist/{common/test-utils.js → testing/mock-event.js} +17 -14
  88. package/dist/testing/mock-server.d.ts +29 -0
  89. package/dist/testing/mock-server.d.ts.map +1 -0
  90. package/dist/testing/mock-server.interfaces.d.ts +48 -0
  91. package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
  92. package/dist/{mock-server → testing}/mock-server.js +21 -33
  93. package/dist/types/common.d.ts +1 -12
  94. package/dist/types/common.d.ts.map +1 -1
  95. package/dist/types/common.js +1 -6
  96. package/dist/types/errors.d.ts +9 -0
  97. package/dist/types/errors.d.ts.map +1 -0
  98. package/dist/types/external-domain-metadata.d.ts +30 -171
  99. package/dist/types/external-domain-metadata.d.ts.map +1 -1
  100. package/dist/types/extraction.d.ts +64 -94
  101. package/dist/types/extraction.d.ts.map +1 -1
  102. package/dist/types/extraction.js +6 -34
  103. package/dist/types/loading.d.ts +1 -2
  104. package/dist/types/loading.d.ts.map +1 -1
  105. package/dist/types/loading.js +0 -1
  106. package/dist/types/workers.d.ts +39 -94
  107. package/dist/types/workers.d.ts.map +1 -1
  108. package/dist/types/workers.js +0 -6
  109. package/dist/uploader/uploader.d.ts +8 -59
  110. package/dist/uploader/uploader.d.ts.map +1 -1
  111. package/dist/uploader/uploader.helpers.d.ts +4 -27
  112. package/dist/uploader/uploader.helpers.d.ts.map +1 -1
  113. package/dist/uploader/uploader.helpers.js +64 -30
  114. package/dist/uploader/uploader.interfaces.d.ts +15 -25
  115. package/dist/uploader/uploader.interfaces.d.ts.map +1 -1
  116. package/dist/uploader/uploader.interfaces.js +8 -0
  117. package/dist/uploader/uploader.js +23 -89
  118. package/package.json +8 -6
  119. package/dist/airsync-sdk.d.ts +0 -2059
  120. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
  121. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
  122. package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -540
  123. package/dist/common/control-protocol.d.ts +0 -10
  124. package/dist/common/control-protocol.d.ts.map +0 -1
  125. package/dist/common/errors.d.ts +0 -6
  126. package/dist/common/errors.d.ts.map +0 -1
  127. package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
  128. package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
  129. package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
  130. package/dist/common/install-initial-domain-mapping.test.js +0 -211
  131. package/dist/common/test-utils.d.ts +0 -19
  132. package/dist/common/test-utils.d.ts.map +0 -1
  133. package/dist/common/time-value-resolver.d.ts +0 -47
  134. package/dist/common/time-value-resolver.d.ts.map +0 -1
  135. package/dist/common/time-value-resolver.test.d.ts +0 -2
  136. package/dist/common/time-value-resolver.test.d.ts.map +0 -1
  137. package/dist/common/time-value-resolver.test.js +0 -268
  138. package/dist/http/axios-client-internal.d.ts.map +0 -1
  139. package/dist/http/axios-client-internal.test.d.ts +0 -2
  140. package/dist/http/axios-client-internal.test.d.ts.map +0 -1
  141. package/dist/http/axios-client-internal.test.js +0 -175
  142. package/dist/http/axios-client.d.ts +0 -27
  143. package/dist/http/axios-client.d.ts.map +0 -1
  144. package/dist/http/axios-client.js +0 -60
  145. package/dist/http/constants.d.ts +0 -4
  146. package/dist/http/constants.d.ts.map +0 -1
  147. package/dist/http/constants.js +0 -6
  148. package/dist/http/index.d.ts +0 -2
  149. package/dist/http/index.d.ts.map +0 -1
  150. package/dist/http/index.js +0 -17
  151. package/dist/logger/logger.constants.d.ts +0 -6
  152. package/dist/logger/logger.constants.d.ts.map +0 -1
  153. package/dist/logger/logger.constants.js +0 -13
  154. package/dist/logger/logger.context.d.ts +0 -58
  155. package/dist/logger/logger.context.d.ts.map +0 -1
  156. package/dist/logger/logger.context.js +0 -86
  157. package/dist/logger/logger.test.d.ts +0 -2
  158. package/dist/logger/logger.test.d.ts.map +0 -1
  159. package/dist/logger/logger.test.js +0 -537
  160. package/dist/mappers/mappers.interface.d.ts +0 -294
  161. package/dist/mappers/mappers.interface.d.ts.map +0 -1
  162. package/dist/mappers/mappers.test.d.ts +0 -2
  163. package/dist/mappers/mappers.test.d.ts.map +0 -1
  164. package/dist/mappers/mappers.test.js +0 -105
  165. package/dist/mock-server/mock-server.d.ts +0 -47
  166. package/dist/mock-server/mock-server.d.ts.map +0 -1
  167. package/dist/mock-server/mock-server.interfaces.d.ts +0 -73
  168. package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
  169. package/dist/multithreading/adapters/base-adapter.emit.test.d.ts +0 -2
  170. package/dist/multithreading/adapters/base-adapter.emit.test.d.ts.map +0 -1
  171. package/dist/multithreading/adapters/base-adapter.emit.test.js +0 -403
  172. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts +0 -2
  173. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts.map +0 -1
  174. package/dist/multithreading/adapters/extraction-adapter.artifacts.test.js +0 -175
  175. package/dist/multithreading/adapters/extraction-adapter.test.d.ts +0 -2
  176. package/dist/multithreading/adapters/extraction-adapter.test.d.ts.map +0 -1
  177. package/dist/multithreading/adapters/extraction-adapter.test.js +0 -789
  178. package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts +0 -2
  179. package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts.map +0 -1
  180. package/dist/multithreading/adapters/loading-adapter.helpers.test.js +0 -514
  181. package/dist/multithreading/adapters/loading-adapter.test.d.ts +0 -2
  182. package/dist/multithreading/adapters/loading-adapter.test.d.ts.map +0 -1
  183. package/dist/multithreading/adapters/loading-adapter.test.js +0 -589
  184. package/dist/multithreading/adapters/serialization.test.d.ts +0 -2
  185. package/dist/multithreading/adapters/serialization.test.d.ts.map +0 -1
  186. package/dist/multithreading/adapters/serialization.test.js +0 -71
  187. package/dist/multithreading/create-worker.test.d.ts +0 -2
  188. package/dist/multithreading/create-worker.test.d.ts.map +0 -1
  189. package/dist/multithreading/create-worker.test.js +0 -108
  190. package/dist/multithreading/process-task.test.d.ts +0 -2
  191. package/dist/multithreading/process-task.test.d.ts.map +0 -1
  192. package/dist/multithreading/process-task.test.js +0 -146
  193. package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
  194. package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
  195. package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
  196. package/dist/multithreading/spawn/spawn.test.d.ts +0 -2
  197. package/dist/multithreading/spawn/spawn.test.d.ts.map +0 -1
  198. package/dist/multithreading/spawn/spawn.test.js +0 -232
  199. package/dist/repo/repo.test.d.ts +0 -2
  200. package/dist/repo/repo.test.d.ts.map +0 -1
  201. package/dist/repo/repo.test.js +0 -184
  202. package/dist/state/state.extract-window.test.d.ts +0 -2
  203. package/dist/state/state.extract-window.test.d.ts.map +0 -1
  204. package/dist/state/state.extract-window.test.js +0 -163
  205. package/dist/state/state.pending-boundaries.test.d.ts +0 -2
  206. package/dist/state/state.pending-boundaries.test.d.ts.map +0 -1
  207. package/dist/state/state.pending-boundaries.test.js +0 -189
  208. package/dist/state/state.post-state.test.d.ts +0 -2
  209. package/dist/state/state.post-state.test.d.ts.map +0 -1
  210. package/dist/state/state.post-state.test.js +0 -78
  211. package/dist/state/state.test.d.ts +0 -2
  212. package/dist/state/state.test.d.ts.map +0 -1
  213. package/dist/state/state.test.js +0 -271
  214. package/dist/state/state.time-value-resolution.test.d.ts +0 -2
  215. package/dist/state/state.time-value-resolution.test.d.ts.map +0 -1
  216. package/dist/state/state.time-value-resolution.test.js +0 -175
  217. package/dist/tsdoc-metadata.json +0 -11
  218. package/dist/types/extraction.test.d.ts +0 -2
  219. package/dist/types/extraction.test.d.ts.map +0 -1
  220. package/dist/types/extraction.test.js +0 -96
  221. package/dist/types/index.d.ts +0 -10
  222. package/dist/types/index.d.ts.map +0 -1
  223. package/dist/types/index.js +0 -21
  224. package/dist/uploader/uploader.helpers.test.d.ts +0 -2
  225. package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
  226. package/dist/uploader/uploader.helpers.test.js +0 -256
  227. package/dist/uploader/uploader.test.d.ts +0 -2
  228. package/dist/uploader/uploader.test.d.ts.map +0 -1
  229. package/dist/uploader/uploader.test.js +0 -601
  230. /package/dist/{mock-server → testing}/mock-server.interfaces.js +0 -0
  231. /package/dist/{common → types}/errors.js +0 -0
@@ -0,0 +1,11 @@
1
+ import { AxiosResponse } from 'axios';
2
+ import { AirSyncEvent, EventData, ExtractorEventType, WorkerMetadata } from '../types/extraction';
3
+ import { LoaderEventType } from '../types/loading';
4
+ export interface EmitInterface {
5
+ event: AirSyncEvent;
6
+ eventType: ExtractorEventType | LoaderEventType;
7
+ data?: EventData;
8
+ worker_metadata?: WorkerMetadata;
9
+ }
10
+ export declare const emit: ({ event, eventType, data, worker_metadata, }: EmitInterface) => Promise<AxiosResponse>;
11
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/multithreading/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EACL,YAAY,EACZ,SAAS,EAET,kBAAkB,EAElB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAChD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC;AAED,eAAO,MAAM,IAAI,GAAU,8CAKxB,aAAa,KAAG,OAAO,CAAC,aAAa,CA+BvC,CAAC"}
@@ -1,19 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.emit = void 0;
4
- const axios_client_internal_1 = require("../http/axios-client-internal");
5
- const constants_1 = require("./constants");
6
- const emit = async ({ event, eventType, data, }) => {
4
+ const constants_1 = require("../common/constants");
5
+ const client_1 = require("../http/client");
6
+ const emit = async ({ event, eventType, data, worker_metadata, }) => {
7
7
  const newEvent = {
8
8
  event_type: eventType,
9
9
  event_context: event.payload.event_context,
10
10
  event_data: Object.assign({}, data),
11
- worker_metadata: {
12
- adaas_library_version: constants_1.LIBRARY_VERSION,
13
- },
11
+ worker_metadata: Object.assign(Object.assign({}, worker_metadata), { newest_state_date: event.payload.event_context.extract_to, oldest_state_date: event.payload.event_context.extract_from, adaas_library_version: constants_1.LIBRARY_VERSION }),
14
12
  };
15
13
  console.info('Emitting event', newEvent);
16
- return axios_client_internal_1.axiosClient.post(event.payload.event_context.callback_url, Object.assign({}, newEvent), {
14
+ return client_1.axiosClient.post(event.payload.event_context.callback_url, Object.assign({}, newEvent), {
17
15
  headers: {
18
16
  Accept: 'application/json, text/plain, */*',
19
17
  Authorization: event.context.secrets.service_account_token,
@@ -1,18 +1,8 @@
1
1
  import { ProcessTaskInterface } from '../types/workers';
2
2
  import { ExtractionAdapter } from './adapters/extraction-adapter';
3
3
  import { LoadingAdapter } from './adapters/loading-adapter';
4
- /**
5
- * Entry point for an extraction worker. Builds an {@link ExtractionAdapter} and
6
- * runs the provided task against it.
7
- *
8
- * @public
9
- */
4
+ /** Entry point for an extraction worker. @public */
10
5
  export declare function processExtractionTask<ConnectorState>({ task, onTimeout, }: ProcessTaskInterface<ExtractionAdapter<ConnectorState>>): void;
11
- /**
12
- * Entry point for a loading worker. Builds a {@link LoadingAdapter} and runs the
13
- * provided task against it.
14
- *
15
- * @public
16
- */
6
+ /** Entry point for a loading worker. @public */
17
7
  export declare function processLoadingTask<ConnectorState>({ task, onTimeout, }: ProcessTaskInterface<LoadingAdapter<ConnectorState>>): void;
18
8
  //# sourceMappingURL=process-task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-task.d.ts","sourceRoot":"","sources":["../../src/multithreading/process-task.ts"],"names":[],"mappings":"AASA,OAAO,EACL,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAgD5D;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,EACpD,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,QA6BzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,EACjD,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,QA6BtD"}
1
+ {"version":3,"file":"process-task.d.ts","sourceRoot":"","sources":["../../src/multithreading/process-task.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,oBAAoB,EAIrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AA6D5D,oDAAoD;AACpD,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,EACpD,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,QA6BzD;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,EACjD,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,QA6BtD"}
@@ -4,54 +4,62 @@ exports.processExtractionTask = processExtractionTask;
4
4
  exports.processLoadingTask = processLoadingTask;
5
5
  const node_worker_threads_1 = require("node:worker_threads");
6
6
  const logger_1 = require("../logger/logger");
7
- const logger_context_1 = require("../logger/logger.context");
8
7
  const extraction_state_1 = require("../state/extraction-state");
9
8
  const loading_state_1 = require("../state/loading-state");
10
9
  const workers_1 = require("../types/workers");
11
10
  const extraction_adapter_1 = require("./adapters/extraction-adapter");
12
11
  const loading_adapter_1 = require("./adapters/loading-adapter");
12
+ const spawn_helpers_1 = require("./spawn/spawn.helpers");
13
13
  /**
14
- * Shared worker-thread driver. Builds the logger context, runs the task and
15
- * (on timeout) the onTimeout callback against the provided adapter, and wires
16
- * the error/exit plumbing. The adapter is constructed by the caller so each
17
- * entry point can build its own typed adapter.
14
+ * Shared worker-thread driver: builds the adapter, runs the task, maps the
15
+ * returned {@link TaskResult} to a platform event and emits it exactly once.
16
+ * On soft timeout the timeout outcome always wins: the `onTimeout` result (or
17
+ * a phase-appropriate default) is emitted and the task's return value is
18
+ * ignored.
18
19
  */
19
20
  async function runWorkerTask(buildAdapter, { task, onTimeout }) {
20
- await (0, logger_context_1.runWithSdkLogContext)(async () => {
21
- try {
22
- const adapter = await buildAdapter();
23
- node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.on(workers_1.WorkerEvent.WorkerMessage, (message) => {
24
- if (message.subject !== workers_1.WorkerMessageSubject.WorkerMessageExit) {
25
- return;
26
- }
27
- console.log('Timeout received. Waiting for the task to finish.');
28
- adapter.isTimeout = true;
29
- });
30
- await (0, logger_context_1.runWithUserLogContext)(async () => task({ adapter }));
31
- if (adapter.isTimeout && !adapter.hasWorkerEmitted) {
32
- await (0, logger_context_1.runWithUserLogContext)(async () => onTimeout({ adapter }));
21
+ try {
22
+ const adapter = await buildAdapter();
23
+ node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.on(workers_1.WorkerEvent.WorkerMessage, (message) => {
24
+ if (message.subject !== workers_1.WorkerMessageSubject.WorkerMessageExit) {
25
+ return;
26
+ }
27
+ console.log('Timeout received. Waiting for the task to finish.');
28
+ adapter.isTimeout = true;
29
+ });
30
+ let result = await task({ adapter });
31
+ if (adapter.isTimeout) {
32
+ if (onTimeout) {
33
+ result = await onTimeout({ adapter });
34
+ }
35
+ else {
36
+ // Non-resumable phases can't hand off with `progress`; report a timeout error.
37
+ const eventType = adapter.event.payload.event_type;
38
+ const { illegal } = (0, spawn_helpers_1.getEventTypeForResult)(eventType, 'progress');
39
+ result = illegal
40
+ ? {
41
+ status: 'error',
42
+ error: {
43
+ message: `Worker timed out during a non-resumable phase (${eventType}), which cannot be continued.`,
44
+ },
45
+ }
46
+ : { status: 'progress' };
33
47
  }
34
- process.exit(0);
35
- }
36
- catch (error) {
37
- (0, logger_context_1.runWithUserLogContext)(() => {
38
- const errorMessage = `Error while processing task. ${(0, logger_1.serializeError)(error)}`;
39
- console.error(errorMessage);
40
- node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
41
- subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
42
- payload: { message: errorMessage },
43
- });
44
- process.exit(1);
45
- });
46
48
  }
47
- });
49
+ await adapter.emitFromResult(result);
50
+ process.exit(0);
51
+ }
52
+ catch (error) {
53
+ const errorMessage = `Error while processing task. ${(0, logger_1.serializeError)(error)}`;
54
+ console.error(errorMessage);
55
+ node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
56
+ subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
57
+ payload: { message: errorMessage },
58
+ });
59
+ process.exit(1);
60
+ }
48
61
  }
49
- /**
50
- * Entry point for an extraction worker. Builds an {@link ExtractionAdapter} and
51
- * runs the provided task against it.
52
- *
53
- * @public
54
- */
62
+ /** Entry point for an extraction worker. @public */
55
63
  function processExtractionTask({ task, onTimeout, }) {
56
64
  if (node_worker_threads_1.isMainThread) {
57
65
  return;
@@ -76,12 +84,7 @@ function processExtractionTask({ task, onTimeout, }) {
76
84
  });
77
85
  }, { task, onTimeout });
78
86
  }
79
- /**
80
- * Entry point for a loading worker. Builds a {@link LoadingAdapter} and runs the
81
- * provided task against it.
82
- *
83
- * @public
84
- */
87
+ /** Entry point for a loading worker. @public */
85
88
  function processLoadingTask({ task, onTimeout, }) {
86
89
  if (node_worker_threads_1.isMainThread) {
87
90
  return;
@@ -1,14 +1,8 @@
1
1
  import { SpawnFactoryInterface, SpawnInterface } from '../../types/workers';
2
2
  /**
3
- * Creates a new instance of Spawn class.
4
- * Spawn class is responsible for spawning a new worker thread and managing the lifecycle of the worker.
5
- * The class provides utilities to emit control events to the platform and exit the worker gracefully.
6
- * In case of lambda timeout, the class emits a lambda timeout event to the platform.
7
- * @param {SpawnFactoryInterface} options - The options to create a new instance of Spawn class
8
- * @param {AirSyncEvent} options.event - The event object received from the platform
9
- * @param {object} options.initialState - The initial state of the adapter
10
- * @param {string} [options.baseWorkerPath] - The base path for the worker files, usually `__dirname`
11
- * @returns {Promise<Spawn>} - A new instance of Spawn class
3
+ * Spawns a worker thread for the event and manages its lifecycle (control
4
+ * events, graceful exit, lambda timeout handling). Resolves when the worker
5
+ * run is fully finished.
12
6
  */
13
7
  export declare function spawn<ConnectorState>({ event, initialState, initialDomainMapping, options, baseWorkerPath, }: SpawnFactoryInterface<ConnectorState>): Promise<void>;
14
8
  export declare class Spawn {
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,qBAAqB,EACrB,cAAc,EAGf,MAAM,qBAAqB,CAAC;AA+C7B;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CAAC,cAAc,EAAE,EAC1C,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,OAAO,EACP,cAAc,GACf,EAAE,qBAAqB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEvD;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,wBAAwB,CAA6C;IAC7E,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,mBAAmB,CAAqB;gBACpC,EACV,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,eAAe,GAChB,EAAE,cAAc;IAiHjB,OAAO,CAAC,aAAa;YAYP,kBAAkB;CAoCjC"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,qBAAqB,EACrB,cAAc,EAGf,MAAM,qBAAqB,CAAC;AA0C7B;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,cAAc,EAAE,EAC1C,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,OAAO,EACP,cAAc,GACf,EAAE,qBAAqB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEvD;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,wBAAwB,CAA6C;IAC7E,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,mBAAmB,CAAqB;gBACpC,EACV,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,eAAe,GAChB,EAAE,cAAc;IA0GjB,OAAO,CAAC,aAAa;YAYP,kBAAkB;CAoCjC"}
@@ -1,21 +1,22 @@
1
1
  import { EventType, ExtractorEventType } from '../../types/extraction';
2
2
  import { LoaderEventType } from '../../types/loading';
3
+ import { TaskStatus } from '../../types/workers';
3
4
  /**
4
- * Gets the event type for the timeout error.
5
- * @param {EventType} eventType - The event type to get the timeout error event type for
6
- * @returns {ExtractorEventType | LoaderEventType} The event type for the timeout error
5
+ * Resolves the outgoing event type to emit for an incoming event type and a
6
+ * {@link TaskResult} status. Resumable phases honor every status
7
+ * (success/progress/delay/error -> *_DONE/*_PROGRESS/*_DELAYED/*_ERROR);
8
+ * non-resumable phases only have done/error, so `progress`/`delay` there is
9
+ * illegal and maps to the phase's error event.
7
10
  */
11
+ export declare function getEventTypeForResult(eventType: EventType, status: TaskStatus): {
12
+ eventType: ExtractorEventType | LoaderEventType;
13
+ illegal: boolean;
14
+ };
8
15
  export declare function getTimeoutErrorEventType(eventType: EventType): {
9
16
  eventType: ExtractorEventType | LoaderEventType;
10
17
  };
11
- /**
12
- * Gets the event type for the no script error.
13
- * @param {EventType} eventType - The event type to get the no script error event type for
14
- * @returns {ExtractorEventType | LoaderEventType} The event type for the no script error
15
- */
18
+ /** Event type to emit when no worker script exists for the incoming event. */
16
19
  export declare function getNoScriptEventType(eventType: EventType): {
17
- eventType: ExtractorEventType;
18
- } | {
19
- eventType: LoaderEventType;
20
+ eventType: ExtractorEventType | LoaderEventType;
20
21
  };
21
22
  //# sourceMappingURL=spawn.helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.helpers.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG;IAC9D,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;CACjD,CA2EA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;;;;EA2BxD"}
1
+ {"version":3,"file":"spawn.helpers.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,UAAU,GACjB;IACD,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAChD,OAAO,EAAE,OAAO,CAAC;CAClB,CAiCA;AAuGD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG;IAC9D,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;CACjD,CAiEA;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;eAwBhB,kBAAkB,GAAG,eAAe;EAG5E"}
@@ -1,66 +1,178 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEventTypeForResult = getEventTypeForResult;
3
4
  exports.getTimeoutErrorEventType = getTimeoutErrorEventType;
4
5
  exports.getNoScriptEventType = getNoScriptEventType;
6
+ const constants_1 = require("../../common/constants");
5
7
  const extraction_1 = require("../../types/extraction");
6
8
  const loading_1 = require("../../types/loading");
7
9
  /**
8
- * Gets the event type for the timeout error.
9
- * @param {EventType} eventType - The event type to get the timeout error event type for
10
- * @returns {ExtractorEventType | LoaderEventType} The event type for the timeout error
10
+ * Resolves the outgoing event type to emit for an incoming event type and a
11
+ * {@link TaskResult} status. Resumable phases honor every status
12
+ * (success/progress/delay/error -> *_DONE/*_PROGRESS/*_DELAYED/*_ERROR);
13
+ * non-resumable phases only have done/error, so `progress`/`delay` there is
14
+ * illegal and maps to the phase's error event.
11
15
  */
16
+ function getEventTypeForResult(eventType, status) {
17
+ const phase = EVENT_PHASE_MAP[eventType];
18
+ if (!phase) {
19
+ console.error('Event type not recognized in getEventTypeForResult function: ' +
20
+ eventType);
21
+ return {
22
+ eventType: constants_1.UNKNOWN_EVENT_TYPE,
23
+ illegal: true,
24
+ };
25
+ }
26
+ // Non-resumable phases only define done/error events.
27
+ if (!phase.resumable) {
28
+ if (status === 'success') {
29
+ return { eventType: phase.done, illegal: false };
30
+ }
31
+ // progress/delay are illegal here; collapse them (and error) to the error event.
32
+ return { eventType: phase.error, illegal: status !== 'error' };
33
+ }
34
+ switch (status) {
35
+ case 'success':
36
+ return { eventType: phase.done, illegal: false };
37
+ case 'progress':
38
+ return { eventType: phase.progress, illegal: false };
39
+ case 'delay':
40
+ return { eventType: phase.delayed, illegal: false };
41
+ case 'error':
42
+ return { eventType: phase.error, illegal: false };
43
+ }
44
+ }
45
+ /** Per-phase outgoing event types, keyed by the incoming {@link EventType}. */
46
+ const EVENT_PHASE_MAP = {
47
+ [extraction_1.EventType.StartExtractingExternalSyncUnits]: {
48
+ resumable: false,
49
+ done: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionDone,
50
+ error: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionError,
51
+ },
52
+ [extraction_1.EventType.StartExtractingMetadata]: {
53
+ resumable: false,
54
+ done: extraction_1.ExtractorEventType.MetadataExtractionDone,
55
+ error: extraction_1.ExtractorEventType.MetadataExtractionError,
56
+ },
57
+ [extraction_1.EventType.StartExtractingData]: {
58
+ resumable: true,
59
+ done: extraction_1.ExtractorEventType.DataExtractionDone,
60
+ error: extraction_1.ExtractorEventType.DataExtractionError,
61
+ progress: extraction_1.ExtractorEventType.DataExtractionProgress,
62
+ delayed: extraction_1.ExtractorEventType.DataExtractionDelayed,
63
+ },
64
+ [extraction_1.EventType.ContinueExtractingData]: {
65
+ resumable: true,
66
+ done: extraction_1.ExtractorEventType.DataExtractionDone,
67
+ error: extraction_1.ExtractorEventType.DataExtractionError,
68
+ progress: extraction_1.ExtractorEventType.DataExtractionProgress,
69
+ delayed: extraction_1.ExtractorEventType.DataExtractionDelayed,
70
+ },
71
+ [extraction_1.EventType.StartDeletingExtractorState]: {
72
+ resumable: false,
73
+ done: extraction_1.ExtractorEventType.ExtractorStateDeletionDone,
74
+ error: extraction_1.ExtractorEventType.ExtractorStateDeletionError,
75
+ },
76
+ [extraction_1.EventType.StartExtractingAttachments]: {
77
+ resumable: true,
78
+ done: extraction_1.ExtractorEventType.AttachmentExtractionDone,
79
+ error: extraction_1.ExtractorEventType.AttachmentExtractionError,
80
+ progress: extraction_1.ExtractorEventType.AttachmentExtractionProgress,
81
+ delayed: extraction_1.ExtractorEventType.AttachmentExtractionDelayed,
82
+ },
83
+ [extraction_1.EventType.ContinueExtractingAttachments]: {
84
+ resumable: true,
85
+ done: extraction_1.ExtractorEventType.AttachmentExtractionDone,
86
+ error: extraction_1.ExtractorEventType.AttachmentExtractionError,
87
+ progress: extraction_1.ExtractorEventType.AttachmentExtractionProgress,
88
+ delayed: extraction_1.ExtractorEventType.AttachmentExtractionDelayed,
89
+ },
90
+ [extraction_1.EventType.StartDeletingExtractorAttachmentsState]: {
91
+ resumable: false,
92
+ done: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionDone,
93
+ error: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionError,
94
+ },
95
+ [extraction_1.EventType.StartLoadingData]: {
96
+ resumable: true,
97
+ done: loading_1.LoaderEventType.DataLoadingDone,
98
+ error: loading_1.LoaderEventType.DataLoadingError,
99
+ progress: loading_1.LoaderEventType.DataLoadingProgress,
100
+ delayed: loading_1.LoaderEventType.DataLoadingDelayed,
101
+ },
102
+ [extraction_1.EventType.ContinueLoadingData]: {
103
+ resumable: true,
104
+ done: loading_1.LoaderEventType.DataLoadingDone,
105
+ error: loading_1.LoaderEventType.DataLoadingError,
106
+ progress: loading_1.LoaderEventType.DataLoadingProgress,
107
+ delayed: loading_1.LoaderEventType.DataLoadingDelayed,
108
+ },
109
+ [extraction_1.EventType.StartLoadingAttachments]: {
110
+ resumable: true,
111
+ done: loading_1.LoaderEventType.AttachmentLoadingDone,
112
+ error: loading_1.LoaderEventType.AttachmentLoadingError,
113
+ progress: loading_1.LoaderEventType.AttachmentLoadingProgress,
114
+ delayed: loading_1.LoaderEventType.AttachmentLoadingDelayed,
115
+ },
116
+ [extraction_1.EventType.ContinueLoadingAttachments]: {
117
+ resumable: true,
118
+ done: loading_1.LoaderEventType.AttachmentLoadingDone,
119
+ error: loading_1.LoaderEventType.AttachmentLoadingError,
120
+ progress: loading_1.LoaderEventType.AttachmentLoadingProgress,
121
+ delayed: loading_1.LoaderEventType.AttachmentLoadingDelayed,
122
+ },
123
+ [extraction_1.EventType.StartDeletingLoaderState]: {
124
+ resumable: false,
125
+ done: loading_1.LoaderEventType.LoaderStateDeletionDone,
126
+ error: loading_1.LoaderEventType.LoaderStateDeletionError,
127
+ },
128
+ [extraction_1.EventType.StartDeletingLoaderAttachmentState]: {
129
+ resumable: false,
130
+ done: loading_1.LoaderEventType.LoaderAttachmentStateDeletionDone,
131
+ error: loading_1.LoaderEventType.LoaderAttachmentStateDeletionError,
132
+ },
133
+ };
12
134
  function getTimeoutErrorEventType(eventType) {
13
135
  switch (eventType) {
14
- // Metadata extraction
15
136
  case extraction_1.EventType.StartExtractingMetadata:
16
137
  return {
17
138
  eventType: extraction_1.ExtractorEventType.MetadataExtractionError,
18
139
  };
19
- // Data extraction
20
140
  case extraction_1.EventType.StartExtractingData:
21
141
  case extraction_1.EventType.ContinueExtractingData:
22
142
  return {
23
143
  eventType: extraction_1.ExtractorEventType.DataExtractionError,
24
144
  };
25
- // Data deletion
26
145
  case extraction_1.EventType.StartDeletingExtractorState:
27
146
  return {
28
147
  eventType: extraction_1.ExtractorEventType.ExtractorStateDeletionError,
29
148
  };
30
- // Attachments extraction
31
149
  case extraction_1.EventType.StartExtractingAttachments:
32
150
  case extraction_1.EventType.ContinueExtractingAttachments:
33
151
  return {
34
152
  eventType: extraction_1.ExtractorEventType.AttachmentExtractionError,
35
153
  };
36
- // Attachments deletion
37
154
  case extraction_1.EventType.StartDeletingExtractorAttachmentsState:
38
155
  return {
39
156
  eventType: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionError,
40
157
  };
41
- // External sync units
42
158
  case extraction_1.EventType.StartExtractingExternalSyncUnits:
43
159
  return {
44
160
  eventType: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionError,
45
161
  };
46
- // Loading data
47
162
  case extraction_1.EventType.StartLoadingData:
48
163
  case extraction_1.EventType.ContinueLoadingData:
49
164
  return {
50
165
  eventType: loading_1.LoaderEventType.DataLoadingError,
51
166
  };
52
- // Deleting loader state
53
167
  case extraction_1.EventType.StartDeletingLoaderState:
54
168
  return {
55
169
  eventType: loading_1.LoaderEventType.LoaderStateDeletionError,
56
170
  };
57
- // Loading attachments
58
171
  case extraction_1.EventType.StartLoadingAttachments:
59
172
  case extraction_1.EventType.ContinueLoadingAttachments:
60
173
  return {
61
174
  eventType: loading_1.LoaderEventType.AttachmentLoadingError,
62
175
  };
63
- // Deleting loader attachment state
64
176
  case extraction_1.EventType.StartDeletingLoaderAttachmentState:
65
177
  return {
66
178
  eventType: loading_1.LoaderEventType.LoaderAttachmentStateDeletionError,
@@ -69,15 +181,11 @@ function getTimeoutErrorEventType(eventType) {
69
181
  console.error('Event type not recognized in getTimeoutErrorEventType function: ' +
70
182
  eventType);
71
183
  return {
72
- eventType: loading_1.LoaderEventType.UnknownEventType,
184
+ eventType: constants_1.UNKNOWN_EVENT_TYPE,
73
185
  };
74
186
  }
75
187
  }
76
- /**
77
- * Gets the event type for the no script error.
78
- * @param {EventType} eventType - The event type to get the no script error event type for
79
- * @returns {ExtractorEventType | LoaderEventType} The event type for the no script error
80
- */
188
+ /** Event type to emit when no worker script exists for the incoming event. */
81
189
  function getNoScriptEventType(eventType) {
82
190
  switch (eventType) {
83
191
  case extraction_1.EventType.StartDeletingExtractorState:
@@ -100,7 +208,7 @@ function getNoScriptEventType(eventType) {
100
208
  console.error('Event type not recognized in getNoScriptEventType function: ' +
101
209
  eventType);
102
210
  return {
103
- eventType: loading_1.LoaderEventType.UnknownEventType,
211
+ eventType: constants_1.UNKNOWN_EVENT_TYPE,
104
212
  };
105
213
  }
106
214
  }
@@ -7,13 +7,13 @@ exports.Spawn = void 0;
7
7
  exports.spawn = spawn;
8
8
  const yargs_1 = __importDefault(require("yargs"));
9
9
  const helpers_1 = require("yargs/helpers");
10
- const control_protocol_1 = require("../../common/control-protocol");
10
+ const constants_1 = require("../../common/constants");
11
11
  const helpers_2 = require("../../common/helpers");
12
12
  const logger_1 = require("../../logger/logger");
13
13
  const extraction_1 = require("../../types/extraction");
14
14
  const workers_1 = require("../../types/workers");
15
- const constants_1 = require("../../common/constants");
16
15
  const create_worker_1 = require("../create-worker");
16
+ const emit_1 = require("../emit");
17
17
  const spawn_helpers_1 = require("./spawn.helpers");
18
18
  function getWorkerPath({ event, workerBasePath, }) {
19
19
  let path = null;
@@ -44,18 +44,11 @@ function getWorkerPath({ event, workerBasePath, }) {
44
44
  return path ? workerBasePath + path : null;
45
45
  }
46
46
  /**
47
- * Creates a new instance of Spawn class.
48
- * Spawn class is responsible for spawning a new worker thread and managing the lifecycle of the worker.
49
- * The class provides utilities to emit control events to the platform and exit the worker gracefully.
50
- * In case of lambda timeout, the class emits a lambda timeout event to the platform.
51
- * @param {SpawnFactoryInterface} options - The options to create a new instance of Spawn class
52
- * @param {AirSyncEvent} options.event - The event object received from the platform
53
- * @param {object} options.initialState - The initial state of the adapter
54
- * @param {string} [options.baseWorkerPath] - The base path for the worker files, usually `__dirname`
55
- * @returns {Promise<Spawn>} - A new instance of Spawn class
47
+ * Spawns a worker thread for the event and manages its lifecycle (control
48
+ * events, graceful exit, lambda timeout handling). Resolves when the worker
49
+ * run is fully finished.
56
50
  */
57
51
  async function spawn({ event, initialState, initialDomainMapping, options, baseWorkerPath, }) {
58
- // Read the command line arguments to check if the local flag is passed.
59
52
  const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv)).argv;
60
53
  if (argv._.includes('local') || argv.local) {
61
54
  options = Object.assign(Object.assign({}, (options || {})), { isLocalDevelopment: true });
@@ -66,13 +59,13 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
66
59
  if (options === null || options === void 0 ? void 0 : options.isLocalDevelopment) {
67
60
  console.log('Snap-in is running in local development mode.');
68
61
  }
69
- const eventType = event.payload.event_type;
70
62
  let script = null;
71
63
  if (baseWorkerPath != null &&
72
64
  (options === null || options === void 0 ? void 0 : options.workerPathOverrides) != null &&
73
- options.workerPathOverrides[eventType] != null) {
65
+ options.workerPathOverrides[event.payload.event_type] != null) {
74
66
  script =
75
- baseWorkerPath + options.workerPathOverrides[eventType];
67
+ baseWorkerPath +
68
+ options.workerPathOverrides[event.payload.event_type];
76
69
  }
77
70
  else {
78
71
  script = getWorkerPath({
@@ -80,7 +73,6 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
80
73
  workerBasePath: baseWorkerPath !== null && baseWorkerPath !== void 0 ? baseWorkerPath : __dirname,
81
74
  });
82
75
  }
83
- // If a script is found for the event type, spawn a new worker.
84
76
  if (script) {
85
77
  try {
86
78
  const worker = await (0, create_worker_1.createWorker)({
@@ -109,7 +101,7 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
109
101
  }
110
102
  else {
111
103
  const { eventType } = (0, spawn_helpers_1.getNoScriptEventType)(event.payload.event_type);
112
- await (0, control_protocol_1.emit)({
104
+ await (0, emit_1.emit)({
113
105
  event,
114
106
  eventType,
115
107
  });
@@ -130,7 +122,7 @@ class Spawn {
130
122
  ? Math.min(options.timeout, this.defaultLambdaTimeout)
131
123
  : this.defaultLambdaTimeout;
132
124
  this.resolve = resolve;
133
- // If soft timeout is reached, send a message to the worker to gracefully exit.
125
+ // Soft timeout: ask the worker to gracefully exit.
134
126
  this.softTimeoutTimer = setTimeout(() => void (async () => {
135
127
  console.log('SOFT TIMEOUT: Sending a message to the worker to gracefully exit.');
136
128
  this.softTimeoutSent = true;
@@ -144,7 +136,7 @@ class Spawn {
144
136
  await this.exitFromMainThread();
145
137
  }
146
138
  })(), this.lambdaTimeout);
147
- // If hard timeout is reached, that means the worker did not exit in time. Terminate the worker.
139
+ // Hard timeout: the worker did not exit in time, terminate it.
148
140
  this.hardTimeoutTimer = setTimeout(() => void (async () => {
149
141
  console.error('HARD TIMEOUT: Worker did not exit in time. Terminating the worker.');
150
142
  if (worker) {
@@ -155,13 +147,10 @@ class Spawn {
155
147
  await this.exitFromMainThread();
156
148
  }
157
149
  })(), this.lambdaTimeout * constants_1.HARD_TIMEOUT_MULTIPLIER);
158
- // If worker exits with process.exit(code), clear the timeouts and exit from
159
- // main thread. When a soft timeout was sent, we use setImmediate to defer
160
- // processing so that any pending WorkerMessage events (e.g.
161
- // WorkerMessageEmitted from onTimeout) already queued in the event loop are
162
- // handled first, preventing a race condition where exitFromMainThread sees
163
- // alreadyEmitted=false and emits an error even though the worker
164
- // successfully emitted an event.
150
+ // After a soft timeout, defer exit handling via setImmediate so pending
151
+ // WorkerMessage events (e.g. WorkerMessageEmitted from onTimeout) are
152
+ // handled first; otherwise exitFromMainThread could see
153
+ // alreadyEmitted=false and emit a spurious error.
165
154
  worker.on(workers_1.WorkerEvent.WorkerExit, (code) => {
166
155
  const handler = async () => {
167
156
  console.info('Worker exited with exit code: ' + code + '.');
@@ -176,27 +165,23 @@ class Spawn {
176
165
  }
177
166
  });
178
167
  worker.on(workers_1.WorkerEvent.WorkerMessage, (message) => {
179
- var _a, _b, _c, _d, _e;
180
- // Since logs from the worker thread are handled differently in snap-in
181
- // platform, we need to catch the log messages from worker thread and log
182
- // them in main thread.
168
+ var _a, _b, _c;
169
+ // The snap-in platform handles worker-thread logs differently, so worker
170
+ // log messages are re-logged in the main thread.
183
171
  if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageLog) {
184
172
  const stringifiedArgs = (_a = message.payload) === null || _a === void 0 ? void 0 : _a.stringifiedArgs;
185
173
  const level = (_b = message.payload) === null || _b === void 0 ? void 0 : _b.level;
186
- const isSdkLog = (_d = (_c = message.payload) === null || _c === void 0 ? void 0 : _c.isSdkLog) !== null && _d !== void 0 ? _d : true;
187
- this.logger.logFn(stringifiedArgs, level, isSdkLog);
174
+ this.logger.logFn(stringifiedArgs, level);
188
175
  }
189
- // If worker sends a message that it has emitted an event, then set alreadyEmitted to true.
190
176
  if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageEmitted) {
191
- console.info('Worker has emitted message to the AirSync platform.');
177
+ console.info('Worker has emitted message to AirSync.');
192
178
  this.alreadyEmitted = true;
193
179
  }
194
- // If worker sends a failure message before exiting, capture it for use in the error event.
180
+ // Capture the worker's failure reason for use in the error event.
195
181
  if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageFailed) {
196
- this.workerFailedMessage = (_e = message.payload) === null || _e === void 0 ? void 0 : _e.message;
182
+ this.workerFailedMessage = (_c = message.payload) === null || _c === void 0 ? void 0 : _c.message;
197
183
  }
198
184
  });
199
- // Log memory usage every 30 seconds
200
185
  this.memoryMonitoringInterval = setInterval(() => {
201
186
  try {
202
187
  const memoryInfo = (0, helpers_2.getMemoryUsage)();
@@ -205,7 +190,7 @@ class Spawn {
205
190
  }
206
191
  }
207
192
  catch (error) {
208
- // If memory monitoring fails, log the warning and clear the interval to prevent further issues
193
+ // Stop monitoring on failure to prevent repeated crashes
209
194
  console.warn('Memory monitoring failed, stopping logging of memory usage interval', error);
210
195
  if (this.memoryMonitoringInterval) {
211
196
  clearInterval(this.memoryMonitoringInterval);
@@ -236,7 +221,7 @@ class Spawn {
236
221
  this.alreadyEmitted = true;
237
222
  const { eventType } = (0, spawn_helpers_1.getTimeoutErrorEventType)(this.event.payload.event_type);
238
223
  try {
239
- await (0, control_protocol_1.emit)({
224
+ await (0, emit_1.emit)({
240
225
  eventType,
241
226
  event: this.event,
242
227
  data: {
@@ -2,8 +2,5 @@
2
2
  const { workerData } = require('node:worker_threads');
3
3
  require('ts-node').register();
4
4
  const { Logger } = require('../logger/logger');
5
- const { runWithUserLogContext } = require('../logger/logger.context');
6
5
  console = new Logger({ event: workerData.event, options: workerData.options });
7
- runWithUserLogContext(() => {
8
- require(workerData.workerPath);
9
- });
6
+ require(workerData.workerPath);