nestworker 1.1.20 → 2.0.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 (63) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +334 -143
  3. package/dist/core/worker.interfaces.d.ts +36 -0
  4. package/dist/{models/task.js → core/worker.interfaces.js} +1 -1
  5. package/dist/core/worker.interfaces.js.map +1 -0
  6. package/dist/core/worker.module.d.ts +15 -0
  7. package/dist/core/worker.module.js +43 -0
  8. package/dist/core/worker.module.js.map +1 -0
  9. package/dist/core/worker.pool.d.ts +20 -0
  10. package/dist/core/worker.pool.js +210 -0
  11. package/dist/core/worker.pool.js.map +1 -0
  12. package/dist/core/worker.service.d.ts +87 -0
  13. package/dist/core/worker.service.js +133 -0
  14. package/dist/core/worker.service.js.map +1 -0
  15. package/dist/decorators/worker-task.decorator.d.ts +37 -0
  16. package/dist/decorators/worker-task.decorator.js +48 -0
  17. package/dist/decorators/worker-task.decorator.js.map +1 -0
  18. package/dist/di/di-serializer.d.ts +18 -0
  19. package/dist/di/di-serializer.js +110 -0
  20. package/dist/di/di-serializer.js.map +1 -0
  21. package/dist/di/worker-container.d.ts +58 -0
  22. package/dist/di/worker-container.js +110 -0
  23. package/dist/di/worker-container.js.map +1 -0
  24. package/dist/discovery/discovery.service.d.ts +20 -0
  25. package/dist/discovery/discovery.service.js +94 -0
  26. package/dist/discovery/discovery.service.js.map +1 -0
  27. package/dist/example/config.service.d.ts +13 -0
  28. package/dist/example/config.service.js +35 -0
  29. package/dist/example/config.service.js.map +1 -0
  30. package/dist/example/image.service.d.ts +9 -0
  31. package/dist/example/image.service.js +108 -0
  32. package/dist/example/image.service.js.map +1 -0
  33. package/dist/example/main.d.ts +1 -0
  34. package/dist/example/main.js +59 -0
  35. package/dist/example/main.js.map +1 -0
  36. package/dist/index.d.ts +5 -0
  37. package/dist/index.js +11 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/worker/worker-runtime.js +55 -0
  40. package/dist/worker/worker-runtime.js.map +1 -0
  41. package/package.json +58 -55
  42. package/CONTRIBUTING.md +0 -33
  43. package/dist/main.d.ts +0 -3
  44. package/dist/main.js +0 -29
  45. package/dist/main.js.map +0 -1
  46. package/dist/models/index.d.ts +0 -1
  47. package/dist/models/index.js +0 -18
  48. package/dist/models/index.js.map +0 -1
  49. package/dist/models/task.d.ts +0 -5
  50. package/dist/models/task.js.map +0 -1
  51. package/dist/tsconfig.build.tsbuildinfo +0 -1
  52. package/dist/worker/executor.d.ts +0 -5
  53. package/dist/worker/executor.js +0 -28
  54. package/dist/worker/executor.js.map +0 -1
  55. package/dist/worker/skeleton.d.ts +0 -6
  56. package/dist/worker/skeleton.js +0 -35
  57. package/dist/worker/skeleton.js.map +0 -1
  58. package/dist/worker/worker.js +0 -6
  59. package/dist/worker/worker.js.map +0 -1
  60. package/nest-cli.json +0 -8
  61. package/tsconfig.build.json +0 -4
  62. package/tsconfig.json +0 -25
  63. /package/dist/worker/{worker.d.ts → worker-runtime.d.ts} +0 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * WorkerContainer – minimal DI container for worker threads.
3
+ *
4
+ * WHY NOT require(filePath)?
5
+ * Compiled NestJS files import @nestjs/common at the top — requiring them
6
+ * inside a worker triggers the full NestJS bootstrap chain which throws.
7
+ *
8
+ * THE FIX: extract each class as a plain JS string on the main thread via
9
+ * Class.toString() (no imports, no decorators), send through workerData,
10
+ * and eval() back into a constructor inside the worker.
11
+ *
12
+ * WHY HELPERS ARE INJECTED:
13
+ * new Function() runs in the global scope. TypeScript compiles dynamic
14
+ * imports using file-level helpers:
15
+ *
16
+ * await import('node:os')
17
+ * → Promise.resolve().then(() => __importStar(require('node:os')))
18
+ *
19
+ * These helpers are defined as `(this && this.__importStar)` at the top of
20
+ * each compiled file — `this` being the module. Inside new Function(),
21
+ * `this` is the global object so all helpers resolve to undefined, causing:
22
+ * Fatal: Error: __importStar is not defined
23
+ *
24
+ * We define the helpers here (Node 16+ always has Object.create, no ternary
25
+ * needed) and inject them alongside require as explicit parameters so both
26
+ * `await import()` and `require()` work correctly inside task methods.
27
+ */
28
+ export interface SerializedDep {
29
+ name: string;
30
+ classSource: string;
31
+ snapshot: Record<string, unknown>;
32
+ propertyKey: string;
33
+ }
34
+ export interface SerializedMethod {
35
+ methodName: string;
36
+ priority: 'HIGH' | 'NORMAL' | 'LOW';
37
+ timeout?: number;
38
+ }
39
+ export interface SerializedService {
40
+ name: string;
41
+ classSource: string;
42
+ methods: SerializedMethod[];
43
+ deps: SerializedDep[];
44
+ }
45
+ export declare class WorkerContainer {
46
+ private readonly instances;
47
+ load(services: SerializedService[]): void;
48
+ get<T>(name: string): T;
49
+ private reconstructFromSource;
50
+ /**
51
+ * eval() a plain class declaration and return the constructor.
52
+ *
53
+ * require + all four TypeScript CJS helpers are injected as explicit
54
+ * parameters so that compiled dynamic imports (`await import(...)`) and
55
+ * inline require() calls inside task methods work correctly.
56
+ */
57
+ private evalClass;
58
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ /**
3
+ * WorkerContainer – minimal DI container for worker threads.
4
+ *
5
+ * WHY NOT require(filePath)?
6
+ * Compiled NestJS files import @nestjs/common at the top — requiring them
7
+ * inside a worker triggers the full NestJS bootstrap chain which throws.
8
+ *
9
+ * THE FIX: extract each class as a plain JS string on the main thread via
10
+ * Class.toString() (no imports, no decorators), send through workerData,
11
+ * and eval() back into a constructor inside the worker.
12
+ *
13
+ * WHY HELPERS ARE INJECTED:
14
+ * new Function() runs in the global scope. TypeScript compiles dynamic
15
+ * imports using file-level helpers:
16
+ *
17
+ * await import('node:os')
18
+ * → Promise.resolve().then(() => __importStar(require('node:os')))
19
+ *
20
+ * These helpers are defined as `(this && this.__importStar)` at the top of
21
+ * each compiled file — `this` being the module. Inside new Function(),
22
+ * `this` is the global object so all helpers resolve to undefined, causing:
23
+ * Fatal: Error: __importStar is not defined
24
+ *
25
+ * We define the helpers here (Node 16+ always has Object.create, no ternary
26
+ * needed) and inject them alongside require as explicit parameters so both
27
+ * `await import()` and `require()` work correctly inside task methods.
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.WorkerContainer = void 0;
31
+ // ── TypeScript CJS helpers ────────────────────────────────────────────────
32
+ // Node 16+ always has Object.create — no legacy ternary branch needed.
33
+ function __createBinding(o, m, k, k2) {
34
+ if (k2 === undefined)
35
+ k2 = k;
36
+ const desc = Object.getOwnPropertyDescriptor(m, k);
37
+ if (!desc || ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)) {
38
+ Object.defineProperty(o, k2, { enumerable: true, get: () => m[k] });
39
+ }
40
+ else {
41
+ o[k2] = m[k];
42
+ }
43
+ }
44
+ function __setModuleDefault(o, v) {
45
+ Object.defineProperty(o, 'default', { enumerable: true, value: v });
46
+ }
47
+ function __importStar(mod) {
48
+ if (mod && mod.__esModule)
49
+ return mod;
50
+ const result = {};
51
+ if (mod != null) {
52
+ for (const k of Object.getOwnPropertyNames(mod)) {
53
+ if (k !== 'default')
54
+ __createBinding(result, mod, k);
55
+ }
56
+ }
57
+ __setModuleDefault(result, mod);
58
+ return result;
59
+ }
60
+ function __importDefault(mod) {
61
+ return mod && mod.__esModule ? mod : { default: mod };
62
+ }
63
+ // ── WorkerContainer ───────────────────────────────────────────────────────
64
+ class WorkerContainer {
65
+ instances = new Map();
66
+ load(services) {
67
+ for (const svc of services) {
68
+ const depInstances = [];
69
+ for (const dep of svc.deps) {
70
+ const inst = this.reconstructFromSource(dep.classSource, dep.name, dep.snapshot);
71
+ this.instances.set(dep.name, inst);
72
+ depInstances.push(inst);
73
+ }
74
+ const ServiceClass = this.evalClass(svc.classSource, svc.name);
75
+ const serviceInstance = new ServiceClass(...depInstances);
76
+ this.instances.set(svc.name, serviceInstance);
77
+ }
78
+ }
79
+ get(name) {
80
+ const inst = this.instances.get(name);
81
+ if (!inst)
82
+ throw new Error(`WorkerContainer: "${name}" not found`);
83
+ return inst;
84
+ }
85
+ reconstructFromSource(classSource, className, snapshot) {
86
+ const DepClass = this.evalClass(classSource, className);
87
+ const instance = Object.create(DepClass.prototype);
88
+ Object.assign(instance, snapshot);
89
+ return instance;
90
+ }
91
+ /**
92
+ * eval() a plain class declaration and return the constructor.
93
+ *
94
+ * require + all four TypeScript CJS helpers are injected as explicit
95
+ * parameters so that compiled dynamic imports (`await import(...)`) and
96
+ * inline require() calls inside task methods work correctly.
97
+ */
98
+ evalClass(classSource, className) {
99
+ // eslint-disable-next-line no-new-func
100
+ const factory = new Function('require', '__importStar', '__importDefault', '__createBinding', '__setModuleDefault', `return (${classSource})`);
101
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
102
+ const cls = factory(require, __importStar, __importDefault, __createBinding, __setModuleDefault);
103
+ if (typeof cls !== 'function') {
104
+ throw new Error(`WorkerContainer: eval of "${className}" did not return a constructor`);
105
+ }
106
+ return cls;
107
+ }
108
+ }
109
+ exports.WorkerContainer = WorkerContainer;
110
+ //# sourceMappingURL=worker-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-container.js","sourceRoot":"","sources":["../../src/di/worker-container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ModuleRef, ModulesContainer } from '@nestjs/core';
2
+ import type { DiscoveredTask } from '../core/worker.interfaces';
3
+ /**
4
+ * WorkerDiscoveryService
5
+ *
6
+ * Scans both module.providers AND module.controllers so that
7
+ * @WorkerClass() / @WorkerTask() work on NestJS controllers too.
8
+ *
9
+ * scan() is called lazily by WorkerService on the first run() call,
10
+ * guaranteeing all providers and controllers are fully instantiated.
11
+ */
12
+ export declare class WorkerDiscoveryService {
13
+ private readonly modulesContainer;
14
+ private readonly moduleRef;
15
+ private scanned;
16
+ private discovered;
17
+ constructor(modulesContainer: ModulesContainer, moduleRef: ModuleRef);
18
+ scan(): DiscoveredTask[];
19
+ private inspectWrapper;
20
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.WorkerDiscoveryService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const worker_task_decorator_1 = require("../decorators/worker-task.decorator");
16
+ /**
17
+ * WorkerDiscoveryService
18
+ *
19
+ * Scans both module.providers AND module.controllers so that
20
+ * @WorkerClass() / @WorkerTask() work on NestJS controllers too.
21
+ *
22
+ * scan() is called lazily by WorkerService on the first run() call,
23
+ * guaranteeing all providers and controllers are fully instantiated.
24
+ */
25
+ let WorkerDiscoveryService = class WorkerDiscoveryService {
26
+ modulesContainer;
27
+ moduleRef;
28
+ scanned = false;
29
+ discovered = [];
30
+ constructor(modulesContainer, moduleRef) {
31
+ this.modulesContainer = modulesContainer;
32
+ this.moduleRef = moduleRef;
33
+ }
34
+ scan() {
35
+ if (this.scanned)
36
+ return this.discovered;
37
+ this.scanned = true;
38
+ for (const module of this.modulesContainer.values()) {
39
+ // Scan providers (services, repositories, etc.)
40
+ for (const wrapper of module.providers.values()) {
41
+ this.inspectWrapper(wrapper);
42
+ }
43
+ // Scan controllers — NestJS registers these separately
44
+ for (const wrapper of module.controllers.values()) {
45
+ this.inspectWrapper(wrapper);
46
+ }
47
+ }
48
+ return this.discovered;
49
+ }
50
+ inspectWrapper(wrapper) {
51
+ const { instance, metatype } = wrapper;
52
+ if (!instance || !metatype)
53
+ return;
54
+ const isWorkerClass = Reflect.getMetadata(worker_task_decorator_1.WORKER_CLASS_META, metatype);
55
+ if (!isWorkerClass)
56
+ return;
57
+ const serviceName = metatype.name;
58
+ const proto = Object.getPrototypeOf(instance);
59
+ const depTypes = Reflect.getMetadata(worker_task_decorator_1.WORKER_DEPS_META, metatype) ?? [];
60
+ const deps = depTypes.map((token) => {
61
+ try {
62
+ return this.moduleRef.get(token, { strict: false });
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ });
68
+ for (const methodName of Object.getOwnPropertyNames(proto)) {
69
+ if (methodName === 'constructor')
70
+ continue;
71
+ const options = Reflect.getMetadata(worker_task_decorator_1.WORKER_METHOD_META, proto, methodName);
72
+ if (!options)
73
+ continue;
74
+ const fn = instance[methodName].bind(instance);
75
+ this.discovered.push({
76
+ serviceName,
77
+ methodName,
78
+ priority: options.priority ?? 'NORMAL',
79
+ timeout: options.timeout,
80
+ fn,
81
+ metatype: metatype,
82
+ instance,
83
+ deps,
84
+ });
85
+ }
86
+ }
87
+ };
88
+ exports.WorkerDiscoveryService = WorkerDiscoveryService;
89
+ exports.WorkerDiscoveryService = WorkerDiscoveryService = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [core_1.ModulesContainer,
92
+ core_1.ModuleRef])
93
+ ], WorkerDiscoveryService);
94
+ //# sourceMappingURL=discovery.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.service.js","sourceRoot":"","sources":["../../src/discovery/discovery.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,uCAA2D;AAE3D,+EAK6C;AAG7C;;;;;;;;GAQG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAKd;IACA;IALX,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,GAAqB,EAAE,CAAC;IAE1C,YACmB,gBAAkC,EAClC,SAAoB;QADpB,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,IAAI;QACF,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,gDAAgD;YAChD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,cAAc,CAAC,OAA0B,CAAC,CAAC;YAClD,CAAC;YACD,uDAAuD;YACvD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClD,IAAI,CAAC,cAAc,CAAC,OAA0B,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,cAAc,CAAC,OAAwB;QAC7C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACvC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEnC,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,yCAAiB,EAAE,QAAQ,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAA4B,CAAC;QAEzE,MAAM,QAAQ,GACZ,OAAO,CAAC,WAAW,CAAC,wCAAgB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAExD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,IAAI,UAAU,KAAK,aAAa;gBAAE,SAAS;YAC3C,MAAM,OAAO,GAAkC,OAAO,CAAC,WAAW,CAChE,0CAAkB,EAClB,KAAK,EACL,UAAU,CACX,CAAC;YACF,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,EAAE,GACN,QACD,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnB,WAAW;gBACX,UAAU;gBACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ;gBACtC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,EAAE;gBACF,QAAQ,EAAE,QAA+C;gBACzD,QAAQ;gBACR,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AAzEY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;qCAM0B,uBAAgB;QACvB,gBAAS;GAN5B,sBAAsB,CAyElC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * ConfigService – a plain injectable dep declared on @WorkerClass.
3
+ *
4
+ * Its internal `config` map is a plain Record, so it survives
5
+ * structured-clone intact. WorkerContainer reconstructs it via
6
+ * Object.create(prototype) + Object.assign(snapshot), restoring
7
+ * both the get() / getNumber() methods and the runtime config values.
8
+ */
9
+ export declare class ConfigService {
10
+ private readonly config;
11
+ get(key: string): string;
12
+ getNumber(key: string): number;
13
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ConfigService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ /**
12
+ * ConfigService – a plain injectable dep declared on @WorkerClass.
13
+ *
14
+ * Its internal `config` map is a plain Record, so it survives
15
+ * structured-clone intact. WorkerContainer reconstructs it via
16
+ * Object.create(prototype) + Object.assign(snapshot), restoring
17
+ * both the get() / getNumber() methods and the runtime config values.
18
+ */
19
+ let ConfigService = class ConfigService {
20
+ config = {
21
+ MULTIPLIER: '3',
22
+ ITERATIONS: '10000000',
23
+ };
24
+ get(key) {
25
+ return this.config[key] ?? '';
26
+ }
27
+ getNumber(key) {
28
+ return Number(this.config[key] ?? 0);
29
+ }
30
+ };
31
+ exports.ConfigService = ConfigService;
32
+ exports.ConfigService = ConfigService = __decorate([
33
+ (0, common_1.Injectable)()
34
+ ], ConfigService);
35
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/example/config.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAE5C;;;;;;;GAOG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,MAAM,GAA2B;QAChD,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,UAAU;KACvB,CAAC;IAEF,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AAbY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAazB"}
@@ -0,0 +1,9 @@
1
+ import { ConfigService } from './config.service';
2
+ export declare class ImageService {
3
+ private readonly configService;
4
+ constructor(configService: ConfigService);
5
+ resizeImage(value: number): number;
6
+ generateThumbnail(width: number, height: number): string;
7
+ moduleImport(): Promise<string>;
8
+ moduleRequire(): Promise<string>;
9
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ImageService = void 0;
46
+ const common_1 = require("@nestjs/common");
47
+ const worker_task_decorator_1 = require("../decorators/worker-task.decorator");
48
+ const config_service_1 = require("./config.service");
49
+ let ImageService = class ImageService {
50
+ configService;
51
+ constructor(configService) {
52
+ this.configService = configService;
53
+ }
54
+ resizeImage(value) {
55
+ const multiplier = this.configService.getNumber('MULTIPLIER');
56
+ const iterations = this.configService.getNumber('ITERATIONS');
57
+ let total = 0;
58
+ for (let i = 0; i < iterations; i++)
59
+ total += i * value * multiplier;
60
+ return total;
61
+ }
62
+ generateThumbnail(width, height) {
63
+ const iterations = this.configService.getNumber('ITERATIONS');
64
+ let hash = 0;
65
+ for (let i = 0; i < iterations / 2; i++)
66
+ hash ^= (i * width * height) | 0;
67
+ return `thumb_${hash.toString(16)}_${width}x${height}.webp`;
68
+ }
69
+ async moduleImport() {
70
+ const os = await Promise.resolve().then(() => __importStar(require('node:os')));
71
+ return `Import os size ${os.cpus().length}`;
72
+ }
73
+ async moduleRequire() {
74
+ const os = require('node:os');
75
+ return `Require os size ${os.cpus().length}`;
76
+ }
77
+ };
78
+ exports.ImageService = ImageService;
79
+ __decorate([
80
+ (0, worker_task_decorator_1.WorkerTask)(),
81
+ __metadata("design:type", Function),
82
+ __metadata("design:paramtypes", [Number]),
83
+ __metadata("design:returntype", Number)
84
+ ], ImageService.prototype, "resizeImage", null);
85
+ __decorate([
86
+ (0, worker_task_decorator_1.WorkerTask)(),
87
+ __metadata("design:type", Function),
88
+ __metadata("design:paramtypes", [Number, Number]),
89
+ __metadata("design:returntype", String)
90
+ ], ImageService.prototype, "generateThumbnail", null);
91
+ __decorate([
92
+ (0, worker_task_decorator_1.WorkerTask)(),
93
+ __metadata("design:type", Function),
94
+ __metadata("design:paramtypes", []),
95
+ __metadata("design:returntype", Promise)
96
+ ], ImageService.prototype, "moduleImport", null);
97
+ __decorate([
98
+ (0, worker_task_decorator_1.WorkerTask)(),
99
+ __metadata("design:type", Function),
100
+ __metadata("design:paramtypes", []),
101
+ __metadata("design:returntype", Promise)
102
+ ], ImageService.prototype, "moduleRequire", null);
103
+ exports.ImageService = ImageService = __decorate([
104
+ (0, common_1.Injectable)(),
105
+ (0, worker_task_decorator_1.WorkerClass)({ deps: [config_service_1.ConfigService] }),
106
+ __metadata("design:paramtypes", [config_service_1.ConfigService])
107
+ ], ImageService);
108
+ //# sourceMappingURL=image.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.service.js","sourceRoot":"","sources":["../../src/example/image.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA0C;AAC1C,+EAA4E;AAC5E,qDAA+C;AAIxC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACM;IAA7B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IACzD,CAAC;IAGD,WAAW,CAAC,KAAa;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE;YAAE,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,iBAAiB,CAAC,KAAa,EAAE,MAAc;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1E,OAAO,SAAS,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC;IAC9D,CAAC;IAGK,AAAN,KAAK,CAAC,YAAY;QAChB,MAAM,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAC;QACnC,OAAO,kBAAkB,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAA;IAC7C,CAAC;IAGK,AAAN,KAAK,CAAC,aAAa;QACjB,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,mBAAmB,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAA;IAC9C,CAAC;CACF,CAAA;AAhCY,oCAAY;AAKvB;IADC,IAAA,kCAAU,GAAE;;;;+CAOZ;AAGD;IADC,IAAA,kCAAU,GAAE;;;;qDAMZ;AAGK;IADL,IAAA,kCAAU,GAAE;;;;gDAIZ;AAGK;IADL,IAAA,kCAAU,GAAE;;;;iDAIZ;uBA/BU,YAAY;IAFxB,IAAA,mBAAU,GAAE;IACZ,IAAA,mCAAW,EAAC,EAAC,IAAI,EAAE,CAAC,8BAAa,CAAC,EAAC,CAAC;qCAES,8BAAa;GAD9C,YAAY,CAgCxB"}
@@ -0,0 +1 @@
1
+ import 'reflect-metadata';
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ require("reflect-metadata");
10
+ const core_1 = require("@nestjs/core");
11
+ const common_1 = require("@nestjs/common");
12
+ const worker_module_1 = require("../core/worker.module");
13
+ const worker_service_1 = require("../core/worker.service");
14
+ const config_service_1 = require("./config.service");
15
+ const image_service_1 = require("./image.service");
16
+ let AppModule = class AppModule {
17
+ };
18
+ AppModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [worker_module_1.WorkerModule.forRoot({ poolSize: 4 })],
21
+ providers: [config_service_1.ConfigService, image_service_1.ImageService],
22
+ })
23
+ ], AppModule);
24
+ async function bootstrap() {
25
+ const app = await core_1.NestFactory.createApplicationContext(AppModule, {
26
+ logger: false,
27
+ });
28
+ const workerService = app.get(worker_service_1.WorkerService);
29
+ // ── Task 1: sequential ────────────────────────────────────────────────────
30
+ console.log('▶ resizeImage [priority: HIGH]');
31
+ console.time('resizeImage');
32
+ const resized = await workerService.run('ImageService', 'resizeImage', [5]);
33
+ console.timeEnd('resizeImage');
34
+ console.log(' result:', resized);
35
+ // ── Task 2: sequential ────────────────────────────────────────────────────
36
+ console.log('\n▶ generateThumbnail [priority: LOW override]');
37
+ console.time('generateThumbnail');
38
+ const thumb = await workerService.run('ImageService', 'generateThumbnail', [1920, 1080], { priority: 'LOW' });
39
+ console.timeEnd('generateThumbnail');
40
+ console.log(' result:', thumb);
41
+ // ── Task 3: concurrent — proves multiple workers run in parallel ───────────
42
+ console.log('\n▶ concurrent x4 [all 4 workers busy simultaneously]');
43
+ console.time('concurrent');
44
+ const results = await Promise.allSettled([
45
+ workerService.run('ImageService', 'resizeImage', [1], { priority: 'LOW' }),
46
+ workerService.run('ImageService', 'resizeImage', [2], { priority: 'LOW', timeout: 100 }),
47
+ workerService.run('ImageService', 'generateThumbnail', [640, 480], { priority: 'HIGH' }),
48
+ workerService.run('ImageService', 'moduleImport'),
49
+ workerService.run('ImageService', 'moduleRequire'),
50
+ ]);
51
+ console.timeEnd('concurrent');
52
+ console.log(' results:', results);
53
+ await app.close();
54
+ }
55
+ bootstrap().catch((err) => {
56
+ console.error('Fatal:', err);
57
+ process.exit(1);
58
+ });
59
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/example/main.ts"],"names":[],"mappings":";;;;;;;;AAAA,4BAA0B;AAC1B,uCAAyC;AACzC,2CAAsC;AACtC,yDAAmD;AACnD,2DAAqD;AACrD,qDAA+C;AAC/C,mDAA6C;AAM7C,IAAM,SAAS,GAAf,MAAM,SAAS;CACd,CAAA;AADK,SAAS;IAJd,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;QAC9C,SAAS,EAAE,CAAC,8BAAa,EAAE,4BAAY,CAAC;KACzC,CAAC;GACI,SAAS,CACd;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,wBAAwB,CAAC,SAAS,EAAE;QAChE,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;IAE7C,6EAA6E;IAC7E,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,CACrC,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,CACnC,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAElC,6EAA6E;IAC7E,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,GAAG,CACnC,cAAc,EAAE,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC,CACrE,CAAC;IACF,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEhC,8EAA8E;IAC9E,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACvC,aAAa,CAAC,GAAG,CAAS,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC,CAAC;QAChF,aAAa,CAAC,GAAG,CAAS,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAC,CAAC;QAC9F,aAAa,CAAC,GAAG,CAAS,cAAc,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAC,CAAC;QAC9F,aAAa,CAAC,GAAG,CAAS,cAAc,EAAE,cAAc,CAAC;QACzD,aAAa,CAAC,GAAG,CAAS,cAAc,EAAE,eAAe,CAAC;KAC3D,CAAC,CAAC;IACH,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEnC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { WorkerModule } from './core/worker.module';
2
+ export { WorkerService } from './core/worker.service';
3
+ export { WorkerClass, WorkerTask } from './decorators/worker-task.decorator';
4
+ export type { WorkerModuleOptions, TaskPriority } from './core/worker.interfaces';
5
+ export type { WorkerTaskOptions } from './decorators/worker-task.decorator';
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerTask = exports.WorkerClass = exports.WorkerService = exports.WorkerModule = void 0;
4
+ var worker_module_1 = require("./core/worker.module");
5
+ Object.defineProperty(exports, "WorkerModule", { enumerable: true, get: function () { return worker_module_1.WorkerModule; } });
6
+ var worker_service_1 = require("./core/worker.service");
7
+ Object.defineProperty(exports, "WorkerService", { enumerable: true, get: function () { return worker_service_1.WorkerService; } });
8
+ var worker_task_decorator_1 = require("./decorators/worker-task.decorator");
9
+ Object.defineProperty(exports, "WorkerClass", { enumerable: true, get: function () { return worker_task_decorator_1.WorkerClass; } });
10
+ Object.defineProperty(exports, "WorkerTask", { enumerable: true, get: function () { return worker_task_decorator_1.WorkerTask; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,sDAAkD;AAA1C,6GAAA,YAAY,OAAA;AACpB,wDAAoD;AAA5C,+GAAA,aAAa,OAAA;AACrB,4EAA2E;AAAnE,oHAAA,WAAW,OAAA;AAAE,mHAAA,UAAU,OAAA"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_worker_threads_1 = require("node:worker_threads");
4
+ const worker_container_1 = require("../di/worker-container");
5
+ /**
6
+ * Worker Runtime – entry point for every worker thread.
7
+ *
8
+ * Receives SerializedService[] via workerData and boots a WorkerContainer
9
+ * which eval()s the stripped class sources and reconstructs the full
10
+ * service graph (deps injected via constructor) without any require() calls
11
+ * into NestJS-annotated files.
12
+ *
13
+ * Jobs are processed serially via a queue — one postMessage() reply per job,
14
+ * which is exactly what the pool's worker.once('message') expects.
15
+ */
16
+ const services = node_worker_threads_1.workerData?.services ?? [];
17
+ const container = new worker_container_1.WorkerContainer();
18
+ container.load(services);
19
+ // Build flat dispatch map: "ServiceName.methodName" → bound callable
20
+ const tasks = {};
21
+ for (const svc of services) {
22
+ const inst = container.get(svc.name);
23
+ for (const { methodName } of svc.methods) {
24
+ tasks[`${svc.name}.${methodName}`] = (...args) => inst[methodName](...args);
25
+ }
26
+ }
27
+ const queue = [];
28
+ let busy = false;
29
+ async function runNext() {
30
+ if (busy || queue.length === 0)
31
+ return;
32
+ busy = true;
33
+ const payload = queue.shift();
34
+ const key = `${payload.serviceName}.${payload.methodName}`;
35
+ try {
36
+ const fn = tasks[key];
37
+ if (!fn)
38
+ throw new Error(`Task "${key}" is not registered`);
39
+ const data = await fn(...payload.args);
40
+ node_worker_threads_1.parentPort?.postMessage({ ok: true, data });
41
+ }
42
+ catch (error) {
43
+ const e = error;
44
+ node_worker_threads_1.parentPort?.postMessage({ ok: false, error: { message: e.message, stack: e.stack } });
45
+ }
46
+ finally {
47
+ busy = false;
48
+ runNext();
49
+ }
50
+ }
51
+ node_worker_threads_1.parentPort?.on('message', (payload) => {
52
+ queue.push(payload);
53
+ runNext();
54
+ });
55
+ //# sourceMappingURL=worker-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-runtime.js","sourceRoot":"","sources":["../../src/worker/worker-runtime.ts"],"names":[],"mappings":";;AAAA,6DAA6D;AAC7D,6DAAyD;AAGzD;;;;;;;;;;GAUG;AAEH,MAAM,QAAQ,GAAwB,gCAAU,EAAE,QAAQ,IAAI,EAAE,CAAC;AACjE,MAAM,SAAS,GAAG,IAAI,kCAAe,EAAE,CAAC;AACxC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAEzB,qEAAqE;AACrE,MAAM,KAAK,GAAoD,EAAE,CAAC;AAClE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAkD,GAAG,CAAC,IAAI,CAAC,CAAC;IACtF,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACzC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAID,MAAM,KAAK,GAAU,EAAE,CAAC;AACxB,IAAI,IAAI,GAAG,KAAK,CAAC;AAEjB,KAAK,UAAU,OAAO;IACpB,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACvC,IAAI,GAAG,IAAI,CAAC;IACZ,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,qBAAqB,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,gCAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAc,CAAC;QACzB,gCAAU,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;YAAS,CAAC;QACT,IAAI,GAAG,KAAK,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gCAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,OAAY,EAAE,EAAE;IACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC"}