@devrev/ts-adaas 1.20.2-beta.4 → 1.20.2-beta.6
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.
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +1 -0
- package/dist/common/event-type-translation.d.ts.map +1 -1
- package/dist/common/event-type-translation.js +1 -0
- package/dist/common/event-type-translation.test.js +1 -0
- package/dist/http/axios-client.d.ts +6 -2
- package/dist/http/axios-client.d.ts.map +1 -1
- package/dist/http/axios-client.js +7 -4
- package/dist/mock-server/mock-server.d.ts +4 -0
- package/dist/mock-server/mock-server.d.ts.map +1 -1
- package/dist/mock-server/mock-server.interfaces.d.ts +9 -0
- package/dist/mock-server/mock-server.interfaces.d.ts.map +1 -1
- package/dist/mock-server/mock-server.js +39 -6
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +21 -6
- package/dist/multithreading/process-task.test.js +28 -1
- package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.js +9 -0
- package/dist/multithreading/spawn/spawn.helpers.test.js +34 -0
- package/dist/multithreading/spawn/spawn.js +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +13 -0
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +1 -1
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.js +51 -5
- package/dist/multithreading/worker-adapter/worker-adapter.js +131 -79
- package/dist/multithreading/worker-adapter/worker-adapter.upload-failure.test.d.ts +2 -0
- package/dist/multithreading/worker-adapter/worker-adapter.upload-failure.test.d.ts.map +1 -0
- package/dist/multithreading/worker-adapter/worker-adapter.upload-failure.test.js +135 -0
- package/dist/repo/repo.d.ts +1 -2
- package/dist/repo/repo.d.ts.map +1 -1
- package/dist/repo/repo.js +6 -12
- package/dist/repo/repo.test.js +32 -1
- package/dist/state/state.d.ts.map +1 -1
- package/dist/state/state.js +9 -5
- package/dist/state/state.time-value-resolution.test.js +31 -2
- package/dist/types/extraction.d.ts +6 -3
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +3 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,eAAO,MAAM,8BAA8B,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,eAAO,MAAM,8BAA8B,aAU1C,CAAC;AAEF,eAAO,MAAM,2BAA2B,aAKvC,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAG/B,CAAC;AAEF,eAAO,MAAM,gCAAgC,aAI5C,CAAC;AAEF,eAAO,MAAM,6BAA6B,aAGzC,CAAC;AAEF,eAAO,MAAM,qBAAqB,aAGjC,CAAC;AAEF,eAAO,MAAM,+BAA+B,aAGzC,CAAC;AAEJ,eAAO,MAAM,4BAA4B,aAExC,CAAC;AAEF,eAAO,MAAM,oBAAoB,aAGhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,wBAAwB,QAAyB,CAAC;AAC/D,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,oCAAoC,KAAK,CAAC;AAGvD,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,eAAO,MAAM,0BAA0B,QAEtC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAA0B,CAAC;AAEzD,oBAAY,uBAAuB;IACjC,wBAAwB,6BAA6B;IACrD,WAAW,gBAAgB;IAC3B,mBAAmB,wBAAwB;CAC5C;AAED,eAAO,MAAM,eAAe,KAAsB,CAAC;AAEnD,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AACrD,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAE7C,eAAO,MAAM,sBAAsB,QAAgB,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,6BAA6B,CAAC"}
|
package/dist/common/constants.js
CHANGED
|
@@ -6,6 +6,7 @@ const helpers_1 = require("./helpers");
|
|
|
6
6
|
exports.ALLOWED_EXTRACTION_EVENT_TYPES = [
|
|
7
7
|
extraction_1.EventType.StartExtractingExternalSyncUnits,
|
|
8
8
|
extraction_1.EventType.StartExtractingMetadata,
|
|
9
|
+
extraction_1.EventType.ContinueExtractingMetadata,
|
|
9
10
|
extraction_1.EventType.StartExtractingData,
|
|
10
11
|
extraction_1.EventType.ContinueExtractingData,
|
|
11
12
|
extraction_1.EventType.StartDeletingExtractorState,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-type-translation.d.ts","sourceRoot":"","sources":["../../src/common/event-type-translation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"event-type-translation.d.ts","sourceRoot":"","sources":["../../src/common/event-type-translation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CA0D7E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,kBAAkB,GAC5B,kBAAkB,CA0CpB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,eAAe,GACzB,eAAe,CAmBjB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,kBAAkB,GAAG,eAAe,GAC9C,kBAAkB,GAAG,eAAe,CAatC"}
|
|
@@ -27,6 +27,7 @@ function translateIncomingEventType(eventTypeString) {
|
|
|
27
27
|
// New extraction event types (already correct, map to new enum members)
|
|
28
28
|
[extraction_1.EventType.StartExtractingExternalSyncUnits]: extraction_1.EventType.StartExtractingExternalSyncUnits,
|
|
29
29
|
[extraction_1.EventType.StartExtractingMetadata]: extraction_1.EventType.StartExtractingMetadata,
|
|
30
|
+
[extraction_1.EventType.ContinueExtractingMetadata]: extraction_1.EventType.ContinueExtractingMetadata,
|
|
30
31
|
[extraction_1.EventType.StartExtractingData]: extraction_1.EventType.StartExtractingData,
|
|
31
32
|
[extraction_1.EventType.ContinueExtractingData]: extraction_1.EventType.ContinueExtractingData,
|
|
32
33
|
[extraction_1.EventType.StartDeletingExtractorState]: extraction_1.EventType.StartDeletingExtractorState,
|
|
@@ -31,6 +31,7 @@ describe(event_type_translation_1.translateIncomingEventType.name, () => {
|
|
|
31
31
|
it.each([
|
|
32
32
|
[extraction_1.EventType.StartExtractingExternalSyncUnits],
|
|
33
33
|
[extraction_1.EventType.StartExtractingMetadata],
|
|
34
|
+
[extraction_1.EventType.ContinueExtractingMetadata],
|
|
34
35
|
[extraction_1.EventType.StartExtractingData],
|
|
35
36
|
[extraction_1.EventType.ContinueExtractingData],
|
|
36
37
|
[extraction_1.EventType.StartDeletingExtractorState],
|
|
@@ -22,6 +22,10 @@
|
|
|
22
22
|
* - `axiosClient`: Configured axios instance with retry logic.
|
|
23
23
|
*/
|
|
24
24
|
import axios from 'axios';
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
/**
|
|
26
|
+
* @deprecated This client has been deprecated because each use requires a
|
|
27
|
+
* specific configuration. It is intended for SDK-internal use only.
|
|
28
|
+
*/
|
|
29
|
+
export declare const axiosClient: import("axios").AxiosInstance;
|
|
30
|
+
export { axios };
|
|
27
31
|
//# sourceMappingURL=axios-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-client.d.ts","sourceRoot":"","sources":["../../src/http/axios-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAI1C,
|
|
1
|
+
{"version":3,"file":"axios-client.d.ts","sourceRoot":"","sources":["../../src/http/axios-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAI1C;;;GAGG;AACH,eAAO,MAAM,WAAW,+BAAiB,CAAC;AAuC1C,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -26,14 +26,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
29
|
+
exports.axios = exports.axiosClient = void 0;
|
|
30
30
|
const axios_1 = __importDefault(require("axios"));
|
|
31
31
|
exports.axios = axios_1.default;
|
|
32
32
|
const axios_retry_1 = __importDefault(require("axios-retry"));
|
|
33
33
|
const logger_context_1 = require("../logger/logger.context");
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
/**
|
|
35
|
+
* @deprecated This client has been deprecated because each use requires a
|
|
36
|
+
* specific configuration. It is intended for SDK-internal use only.
|
|
37
|
+
*/
|
|
38
|
+
exports.axiosClient = axios_1.default.create();
|
|
39
|
+
(0, axios_retry_1.default)(exports.axiosClient, {
|
|
37
40
|
retries: 5,
|
|
38
41
|
retryDelay: (retryCount, error) => {
|
|
39
42
|
// exponential backoff algorithm: 1 * 2 ^ retryCount * 1000ms
|
|
@@ -31,6 +31,10 @@ export declare class MockServer {
|
|
|
31
31
|
* Also clears request tracking data.
|
|
32
32
|
*/
|
|
33
33
|
resetRoutes(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Returns all POST requests to the platform callback URL.
|
|
36
|
+
*/
|
|
37
|
+
getCallbackRequests(): RequestInfo[];
|
|
34
38
|
/**
|
|
35
39
|
* Returns the most recent request or undefined if no requests exist.
|
|
36
40
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../src/mock-server/mock-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,WAAW,EACX,WAAW,EAEZ,MAAM,0BAA0B,CAAC;AA4ElC;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAA4B;gBAErC,IAAI,GAAE,MAAiC;IAMtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBpB,aAAa;IA+B3B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,WAAW;IAInB;;OAEG;IACI,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../src/mock-server/mock-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,WAAW,EACX,WAAW,EAEZ,MAAM,0BAA0B,CAAC;AA4ElC;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAA4B;gBAErC,IAAI,GAAE,MAAiC;IAMtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBpB,aAAa;IA+B3B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,WAAW;IAInB;;OAEG;IACI,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA+G1C;;;OAGG;IACI,WAAW,IAAI,IAAI;IAM1B;;OAEG;IACI,mBAAmB,IAAI,WAAW,EAAE;IAO3C;;OAEG;IACI,cAAc,IAAI,WAAW,GAAG,SAAS;IAOhD;;OAEG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI5D;;OAEG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;CAQhE"}
|
|
@@ -51,6 +51,15 @@ export interface RouteConfig {
|
|
|
51
51
|
headers?: Record<string, string>;
|
|
52
52
|
/** Optional retry configuration for simulating failures before success */
|
|
53
53
|
retry?: RetryConfig;
|
|
54
|
+
/**
|
|
55
|
+
* Respond successfully for the first N requests, then return an error.
|
|
56
|
+
* Useful for partial-upload scenarios (first batch succeeds, second fails).
|
|
57
|
+
*/
|
|
58
|
+
succeedThenFail?: {
|
|
59
|
+
successCount: number;
|
|
60
|
+
errorStatus?: number;
|
|
61
|
+
errorBody?: unknown;
|
|
62
|
+
};
|
|
54
63
|
/** Optional delay in milliseconds before sending the response */
|
|
55
64
|
delay?: number;
|
|
56
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-server.interfaces.d.ts","sourceRoot":"","sources":["../../src/mock-server/mock-server.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEvD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,yCAAyC;IACzC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC;IACnD,+BAA+B;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,2BAA2B;IAC3B,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6BAA6B;IAC7B,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"mock-server.interfaces.d.ts","sourceRoot":"","sources":["../../src/mock-server/mock-server.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEvD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,yCAAyC;IACzC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC;IACnD,+BAA+B;IAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,2BAA2B;IAC3B,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6BAA6B;IAC7B,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC"}
|
|
@@ -178,19 +178,46 @@ class MockServer {
|
|
|
178
178
|
* Configures a route to return a specific status code and optional response body.
|
|
179
179
|
*/
|
|
180
180
|
setRoute(config) {
|
|
181
|
-
const { path, method, status, body, bodyBuffer, retry, headers, delay } = config;
|
|
181
|
+
const { path, method, status, body, bodyBuffer, retry, succeedThenFail, headers, delay, } = config;
|
|
182
182
|
const key = this.getRouteKey(method, path);
|
|
183
|
-
if (retry) {
|
|
183
|
+
if (retry || succeedThenFail) {
|
|
184
184
|
this.requestCounts.set(key, 0);
|
|
185
185
|
}
|
|
186
186
|
this.routeHandlers.set(key, (req, res) => {
|
|
187
187
|
const sendResponse = (responseDelay) => {
|
|
188
188
|
const send = () => {
|
|
189
|
-
var _a, _b;
|
|
190
|
-
if (
|
|
189
|
+
var _a, _b, _c;
|
|
190
|
+
if (succeedThenFail) {
|
|
191
191
|
const currentCount = this.requestCounts.get(key) || 0;
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
this.requestCounts.set(key, currentCount + 1);
|
|
193
|
+
if (currentCount < succeedThenFail.successCount) {
|
|
194
|
+
if (headers) {
|
|
195
|
+
res.set(headers);
|
|
196
|
+
}
|
|
197
|
+
if (bodyBuffer !== undefined) {
|
|
198
|
+
res.status(status).buffer(bodyBuffer);
|
|
199
|
+
}
|
|
200
|
+
else if (body !== undefined) {
|
|
201
|
+
res.status(status).json(body);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.defaultRouteHandler(req, res);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
const errorStatus = (_a = succeedThenFail.errorStatus) !== null && _a !== void 0 ? _a : 400;
|
|
209
|
+
if (succeedThenFail.errorBody !== undefined) {
|
|
210
|
+
res.status(errorStatus).json(succeedThenFail.errorBody);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
res.status(errorStatus).send();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else if (retry) {
|
|
218
|
+
const currentCount = this.requestCounts.get(key) || 0;
|
|
219
|
+
const failureCount = (_b = retry.failureCount) !== null && _b !== void 0 ? _b : 4;
|
|
220
|
+
const errorStatus = (_c = retry.errorStatus) !== null && _c !== void 0 ? _c : 500;
|
|
194
221
|
if (currentCount < failureCount) {
|
|
195
222
|
this.requestCounts.set(key, currentCount + 1);
|
|
196
223
|
const sendFailure = () => {
|
|
@@ -261,6 +288,12 @@ class MockServer {
|
|
|
261
288
|
this.requestCounts.clear();
|
|
262
289
|
this.requests = [];
|
|
263
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* Returns all POST requests to the platform callback URL.
|
|
293
|
+
*/
|
|
294
|
+
getCallbackRequests() {
|
|
295
|
+
return this.requests.filter((req) => req.method.toUpperCase() === 'POST' && req.url.includes('callback_url'));
|
|
296
|
+
}
|
|
264
297
|
/**
|
|
265
298
|
* Returns the most recent request or undefined if no requests exist.
|
|
266
299
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-task.d.ts","sourceRoot":"","sources":["../../src/multithreading/process-task.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAG1B,wBAAgB,WAAW,CAAC,cAAc,EAAE,EAC1C,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"process-task.d.ts","sourceRoot":"","sources":["../../src/multithreading/process-task.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAG1B,wBAAgB,WAAW,CAAC,cAAc,EAAE,EAC1C,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,cAAc,CAAC,QA0FtC"}
|
|
@@ -14,6 +14,7 @@ function processTask({ task, onTimeout, }) {
|
|
|
14
14
|
}
|
|
15
15
|
void (async () => {
|
|
16
16
|
await (0, logger_context_1.runWithSdkLogContext)(async () => {
|
|
17
|
+
let adapter;
|
|
17
18
|
try {
|
|
18
19
|
const event = node_worker_threads_1.workerData.event;
|
|
19
20
|
// TODO: Remove when the old types are completely phased out
|
|
@@ -29,26 +30,40 @@ function processTask({ task, onTimeout, }) {
|
|
|
29
30
|
initialDomainMapping,
|
|
30
31
|
options,
|
|
31
32
|
});
|
|
32
|
-
const
|
|
33
|
+
const workerAdapter = new worker_adapter_1.WorkerAdapter({
|
|
33
34
|
event,
|
|
34
35
|
adapterState,
|
|
35
36
|
options,
|
|
36
37
|
});
|
|
38
|
+
adapter = workerAdapter;
|
|
37
39
|
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) => {
|
|
38
40
|
if (message.subject !== workers_1.WorkerMessageSubject.WorkerMessageExit) {
|
|
39
41
|
return;
|
|
40
42
|
}
|
|
41
43
|
console.log('Timeout received. Waiting for the task to finish.');
|
|
42
|
-
|
|
44
|
+
workerAdapter.isTimeout = true;
|
|
43
45
|
});
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
console.log('Event passsed from SDK to the connector:', workerAdapter.event);
|
|
47
|
+
await (0, logger_context_1.runWithUserLogContext)(async () => task({ adapter: workerAdapter }));
|
|
48
|
+
if (workerAdapter.isTimeout && !workerAdapter.hasWorkerEmitted) {
|
|
49
|
+
await (0, logger_context_1.runWithUserLogContext)(async () => onTimeout({ adapter: workerAdapter }));
|
|
47
50
|
}
|
|
48
51
|
process.exit(0);
|
|
49
52
|
}
|
|
50
53
|
catch (error) {
|
|
51
|
-
(0, logger_context_1.runWithUserLogContext)(() => {
|
|
54
|
+
await (0, logger_context_1.runWithUserLogContext)(async () => {
|
|
55
|
+
if (adapter && !adapter.hasWorkerEmitted) {
|
|
56
|
+
try {
|
|
57
|
+
await adapter.emitError(error);
|
|
58
|
+
}
|
|
59
|
+
catch (failureError) {
|
|
60
|
+
console.error('Error while emitting task failure.', (0, logger_1.serializeError)(failureError));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (adapter === null || adapter === void 0 ? void 0 : adapter.hasWorkerEmitted) {
|
|
64
|
+
process.exit(1);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
52
67
|
const errorMessage = `Error while processing task. ${(0, logger_1.serializeError)(error)}`;
|
|
53
68
|
console.error(errorMessage);
|
|
54
69
|
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
@@ -56,6 +56,7 @@ jest.mock('./worker-adapter/worker-adapter', () => ({
|
|
|
56
56
|
WorkerAdapter: jest.fn().mockImplementation(() => ({
|
|
57
57
|
isTimeout: false,
|
|
58
58
|
hasWorkerEmitted: false,
|
|
59
|
+
emitError: jest.fn(),
|
|
59
60
|
})),
|
|
60
61
|
}));
|
|
61
62
|
const process_task_1 = require("./process-task");
|
|
@@ -124,7 +125,11 @@ describe(process_task_1.processTask.name, () => {
|
|
|
124
125
|
// Arrange
|
|
125
126
|
const event = makeEvent();
|
|
126
127
|
setWorkerData({ event, initialState: {}, options: {} });
|
|
127
|
-
const mockAdapter = {
|
|
128
|
+
const mockAdapter = {
|
|
129
|
+
isTimeout: false,
|
|
130
|
+
hasWorkerEmitted: false,
|
|
131
|
+
emitError: jest.fn(),
|
|
132
|
+
};
|
|
128
133
|
worker_adapter_1.WorkerAdapter.mockImplementation(() => mockAdapter);
|
|
129
134
|
const task = jest.fn().mockResolvedValue(undefined);
|
|
130
135
|
const onTimeout = jest.fn().mockResolvedValue(undefined);
|
|
@@ -163,4 +168,26 @@ describe(process_task_1.processTask.name, () => {
|
|
|
163
168
|
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
164
169
|
expect(onTimeout).not.toHaveBeenCalled();
|
|
165
170
|
});
|
|
171
|
+
it('should emit a failure event through the adapter before falling back', async () => {
|
|
172
|
+
const event = makeEvent();
|
|
173
|
+
setWorkerData({ event, initialState: {}, options: {} });
|
|
174
|
+
const mockAdapter = {
|
|
175
|
+
isTimeout: false,
|
|
176
|
+
hasWorkerEmitted: false,
|
|
177
|
+
emitError: jest.fn().mockImplementation(() => {
|
|
178
|
+
mockAdapter.hasWorkerEmitted = true;
|
|
179
|
+
}),
|
|
180
|
+
};
|
|
181
|
+
worker_adapter_1.WorkerAdapter.mockImplementation(() => mockAdapter);
|
|
182
|
+
const taskError = new Error('task upload failed');
|
|
183
|
+
const task = jest.fn().mockRejectedValue(taskError);
|
|
184
|
+
const onTimeout = jest.fn().mockResolvedValue(undefined);
|
|
185
|
+
(0, process_task_1.processTask)({ task, onTimeout });
|
|
186
|
+
await flush();
|
|
187
|
+
expect(mockAdapter.emitError).toHaveBeenCalledWith(taskError);
|
|
188
|
+
expect(mockParentPortPostMessage).not.toHaveBeenCalledWith(expect.objectContaining({
|
|
189
|
+
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
190
|
+
}));
|
|
191
|
+
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
192
|
+
});
|
|
166
193
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,qBAAqB,EACrB,cAAc,EAGf,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,qBAAqB,EACrB,cAAc,EAGf,MAAM,qBAAqB,CAAC;AAgD7B;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CAAC,cAAc,EAAE,EAC1C,KAAK,EACL,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,GACf,EAAE,qBAAqB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFvD;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 +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,
|
|
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,CAoFA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;;;;EAmCxD"}
|
|
@@ -13,6 +13,7 @@ function getTimeoutErrorEventType(eventType) {
|
|
|
13
13
|
switch (eventType) {
|
|
14
14
|
// Metadata extraction (handles both old and new enum members)
|
|
15
15
|
case extraction_1.EventType.StartExtractingMetadata:
|
|
16
|
+
case extraction_1.EventType.ContinueExtractingMetadata:
|
|
16
17
|
case extraction_1.EventType.ExtractionMetadataStart:
|
|
17
18
|
return {
|
|
18
19
|
eventType: extraction_1.ExtractorEventType.MetadataExtractionError,
|
|
@@ -88,6 +89,14 @@ function getTimeoutErrorEventType(eventType) {
|
|
|
88
89
|
*/
|
|
89
90
|
function getNoScriptEventType(eventType) {
|
|
90
91
|
switch (eventType) {
|
|
92
|
+
// A missing metadata worker is a misconfigured connector, so report it as a
|
|
93
|
+
// phase error rather than an unknown event type.
|
|
94
|
+
case extraction_1.EventType.StartExtractingMetadata:
|
|
95
|
+
case extraction_1.EventType.ContinueExtractingMetadata:
|
|
96
|
+
case extraction_1.EventType.ExtractionMetadataStart:
|
|
97
|
+
return {
|
|
98
|
+
eventType: extraction_1.ExtractorEventType.MetadataExtractionError,
|
|
99
|
+
};
|
|
91
100
|
case extraction_1.EventType.StartDeletingExtractorState:
|
|
92
101
|
return {
|
|
93
102
|
eventType: extraction_1.ExtractorEventType.ExtractorStateDeletionDone,
|
|
@@ -13,6 +13,14 @@ describe(spawn_helpers_1.getTimeoutErrorEventType.name, () => {
|
|
|
13
13
|
// Assert
|
|
14
14
|
expect(result.eventType).toBe(extraction_1.ExtractorEventType.MetadataExtractionError);
|
|
15
15
|
});
|
|
16
|
+
it('should return MetadataExtractionError for ContinueExtractingMetadata', () => {
|
|
17
|
+
// Arrange
|
|
18
|
+
const eventType = extraction_1.EventType.ContinueExtractingMetadata;
|
|
19
|
+
// Act
|
|
20
|
+
const result = (0, spawn_helpers_1.getTimeoutErrorEventType)(eventType);
|
|
21
|
+
// Assert
|
|
22
|
+
expect(result.eventType).toBe(extraction_1.ExtractorEventType.MetadataExtractionError);
|
|
23
|
+
});
|
|
16
24
|
it('should return MetadataExtractionError for deprecated ExtractionMetadataStart', () => {
|
|
17
25
|
// Arrange
|
|
18
26
|
const eventType = extraction_1.EventType.ExtractionMetadataStart;
|
|
@@ -219,6 +227,32 @@ describe(spawn_helpers_1.getTimeoutErrorEventType.name, () => {
|
|
|
219
227
|
});
|
|
220
228
|
});
|
|
221
229
|
describe(spawn_helpers_1.getNoScriptEventType.name, () => {
|
|
230
|
+
describe('metadata extraction', () => {
|
|
231
|
+
it('should return MetadataExtractionError for StartExtractingMetadata', () => {
|
|
232
|
+
// Arrange
|
|
233
|
+
const eventType = extraction_1.EventType.StartExtractingMetadata;
|
|
234
|
+
// Act
|
|
235
|
+
const result = (0, spawn_helpers_1.getNoScriptEventType)(eventType);
|
|
236
|
+
// Assert
|
|
237
|
+
expect(result.eventType).toBe(extraction_1.ExtractorEventType.MetadataExtractionError);
|
|
238
|
+
});
|
|
239
|
+
it('should return MetadataExtractionError for ContinueExtractingMetadata', () => {
|
|
240
|
+
// Arrange
|
|
241
|
+
const eventType = extraction_1.EventType.ContinueExtractingMetadata;
|
|
242
|
+
// Act
|
|
243
|
+
const result = (0, spawn_helpers_1.getNoScriptEventType)(eventType);
|
|
244
|
+
// Assert
|
|
245
|
+
expect(result.eventType).toBe(extraction_1.ExtractorEventType.MetadataExtractionError);
|
|
246
|
+
});
|
|
247
|
+
it('should return MetadataExtractionError for deprecated ExtractionMetadataStart', () => {
|
|
248
|
+
// Arrange
|
|
249
|
+
const eventType = extraction_1.EventType.ExtractionMetadataStart;
|
|
250
|
+
// Act
|
|
251
|
+
const result = (0, spawn_helpers_1.getNoScriptEventType)(eventType);
|
|
252
|
+
// Assert
|
|
253
|
+
expect(result.eventType).toBe(extraction_1.ExtractorEventType.MetadataExtractionError);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
222
256
|
describe('extractor state deletion', () => {
|
|
223
257
|
it('should return ExtractorStateDeletionDone for StartDeletingExtractorState', () => {
|
|
224
258
|
// Arrange
|
|
@@ -23,6 +23,7 @@ function getWorkerPath({ event, workerBasePath, }) {
|
|
|
23
23
|
path = '/workers/external-sync-units-extraction';
|
|
24
24
|
break;
|
|
25
25
|
case extraction_1.EventType.StartExtractingMetadata:
|
|
26
|
+
case extraction_1.EventType.ContinueExtractingMetadata:
|
|
26
27
|
path = '/workers/metadata-extraction';
|
|
27
28
|
break;
|
|
28
29
|
case extraction_1.EventType.StartExtractingData:
|
|
@@ -64,7 +64,20 @@ export declare class WorkerAdapter<ConnectorState> {
|
|
|
64
64
|
* @param data - The data to be sent with the event
|
|
65
65
|
*/
|
|
66
66
|
emit(newEventType: ExtractorEventType | LoaderEventType, data?: EventData): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Emits a phase-specific error after task or pre-emit execution fails. This
|
|
69
|
+
* path avoids flushing repos again, so artifacts uploaded before the failure
|
|
70
|
+
* are still reported without retrying the failed batch.
|
|
71
|
+
*/
|
|
72
|
+
emitError(error: unknown): Promise<void>;
|
|
67
73
|
uploadAllRepos(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Pre-emit hook: uploads all repos and updates extraction boundaries/state.
|
|
76
|
+
* Throws if uploading repos or persisting state fails. The caller emits a
|
|
77
|
+
* compensating error event with whatever artifacts did upload.
|
|
78
|
+
*/
|
|
79
|
+
private beforeEmit;
|
|
80
|
+
private buildEmitPayload;
|
|
68
81
|
loadItemTypes({ itemTypesToLoad, }: ItemTypesToLoadParams): Promise<LoadItemTypesResponse>;
|
|
69
82
|
getLoaderBatches({ supportedItemTypes, }: {
|
|
70
83
|
supportedItemTypes: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-adapter.d.ts","sourceRoot":"","sources":["../../../src/multithreading/worker-adapter/worker-adapter.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EACL,YAAY,EACZ,SAAS,EAET,kCAAkC,EAClC,yCAAyC,EACzC,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC7B,UAAU,EACV,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EAGrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAkB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-adapter.d.ts","sourceRoot":"","sources":["../../../src/multithreading/worker-adapter/worker-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -114,19 +114,43 @@ describe(`${worker_adapter_1.WorkerAdapter.name}.emit`, () => {
|
|
|
114
114
|
// Assert
|
|
115
115
|
expect(mockPostMessage).toHaveBeenCalledTimes(1);
|
|
116
116
|
});
|
|
117
|
-
it('should
|
|
117
|
+
it('should log state size and current state before posting state', async () => {
|
|
118
118
|
// Arrange
|
|
119
|
+
const logSpy = jest.spyOn(console, 'log').mockImplementation();
|
|
119
120
|
adapter['adapterState'].postState = jest.fn().mockResolvedValue(undefined);
|
|
120
|
-
adapter.uploadAllRepos = jest
|
|
121
|
-
.fn()
|
|
122
|
-
.mockRejectedValue(new Error('uploadAllRepos error'));
|
|
121
|
+
adapter.uploadAllRepos = jest.fn().mockResolvedValue(undefined);
|
|
123
122
|
// Act
|
|
124
123
|
await adapter.emit(types_1.ExtractorEventType.MetadataExtractionError, {
|
|
125
124
|
reports: [],
|
|
126
125
|
processed_files: [],
|
|
127
126
|
});
|
|
128
127
|
// Assert
|
|
129
|
-
|
|
128
|
+
const stateLogCall = logSpy.mock.calls.find(([message]) => typeof message === 'string' &&
|
|
129
|
+
message.includes('Saving ') &&
|
|
130
|
+
message.includes('Current state'));
|
|
131
|
+
expect(stateLogCall).toBeDefined();
|
|
132
|
+
expect(stateLogCall === null || stateLogCall === void 0 ? void 0 : stateLogCall[0]).toContain('KB state before emitting event with event type: METADATA_EXTRACTION_ERROR. Current state');
|
|
133
|
+
expect(stateLogCall === null || stateLogCall === void 0 ? void 0 : stateLogCall[1]).toEqual(expect.objectContaining({ attachments: { completed: false } }));
|
|
134
|
+
});
|
|
135
|
+
it('should emit phase extraction error when uploadAllRepos fails', async () => {
|
|
136
|
+
const { emit: mockEmit } = require('../../common/control-protocol');
|
|
137
|
+
adapter['adapterState'].postState = jest.fn().mockResolvedValue(undefined);
|
|
138
|
+
adapter.uploadAllRepos = jest
|
|
139
|
+
.fn()
|
|
140
|
+
.mockRejectedValue(new Error('uploadAllRepos error'));
|
|
141
|
+
await adapter.emit(types_1.ExtractorEventType.DataExtractionDone);
|
|
142
|
+
expect(mockEmit).toHaveBeenCalledWith(expect.objectContaining({
|
|
143
|
+
eventType: types_1.ExtractorEventType.DataExtractionError,
|
|
144
|
+
data: expect.objectContaining({
|
|
145
|
+
error: expect.objectContaining({
|
|
146
|
+
message: expect.stringContaining('uploadAllRepos error'),
|
|
147
|
+
}),
|
|
148
|
+
}),
|
|
149
|
+
}));
|
|
150
|
+
expect(mockPostMessage).toHaveBeenCalledWith(expect.objectContaining({
|
|
151
|
+
subject: 'emit',
|
|
152
|
+
payload: { eventType: types_1.ExtractorEventType.DataExtractionError },
|
|
153
|
+
}));
|
|
130
154
|
});
|
|
131
155
|
it('should include artifacts in data for extraction events', async () => {
|
|
132
156
|
// Arrange
|
|
@@ -405,6 +429,28 @@ describe(`${worker_adapter_1.WorkerAdapter.name}.emit — ExternalSyncUnitExtrac
|
|
|
405
429
|
const emittedData = mockEmit.mock.calls[0][0].data;
|
|
406
430
|
expect(emittedData).not.toHaveProperty('external_sync_units');
|
|
407
431
|
});
|
|
432
|
+
it('should emit an error when external sync unit upload fails', async () => {
|
|
433
|
+
const { adapter } = makeAdapter(types_1.EventType.StartExtractingExternalSyncUnits);
|
|
434
|
+
adapter['adapterState'].postState = jest.fn().mockResolvedValue(undefined);
|
|
435
|
+
adapter.uploadAllRepos = jest.fn().mockResolvedValue(undefined);
|
|
436
|
+
const pushMock = jest
|
|
437
|
+
.fn()
|
|
438
|
+
.mockRejectedValue(new Error('external sync unit upload failed'));
|
|
439
|
+
jest.spyOn(adapter, 'initializeRepos').mockImplementation(() => undefined);
|
|
440
|
+
jest.spyOn(adapter, 'getRepo').mockReturnValue({ push: pushMock });
|
|
441
|
+
await adapter.emit(types_1.ExtractorEventType.ExternalSyncUnitExtractionDone, {
|
|
442
|
+
external_sync_units: [{ id: 'esu-1' }],
|
|
443
|
+
});
|
|
444
|
+
const { emit: mockEmit } = require('../../common/control-protocol');
|
|
445
|
+
expect(mockEmit).toHaveBeenCalledWith(expect.objectContaining({
|
|
446
|
+
eventType: types_1.ExtractorEventType.ExternalSyncUnitExtractionError,
|
|
447
|
+
data: expect.objectContaining({
|
|
448
|
+
error: expect.objectContaining({
|
|
449
|
+
message: expect.stringContaining('external sync unit upload failed'),
|
|
450
|
+
}),
|
|
451
|
+
}),
|
|
452
|
+
}));
|
|
453
|
+
});
|
|
408
454
|
});
|
|
409
455
|
describe('WorkerAdapter — workersOldest / workersNewest boundary updates', () => {
|
|
410
456
|
let adapter;
|