nestworker 2.0.4 → 2.1.0

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 (40) hide show
  1. package/README.md +333 -134
  2. package/dist/core/worker.interfaces.d.ts +89 -10
  3. package/dist/core/worker.module.d.ts +21 -11
  4. package/dist/core/worker.module.js +38 -10
  5. package/dist/core/worker.module.js.map +1 -1
  6. package/dist/core/worker.pool.d.ts +26 -6
  7. package/dist/core/worker.pool.js +246 -101
  8. package/dist/core/worker.pool.js.map +1 -1
  9. package/dist/core/worker.service.d.ts +29 -76
  10. package/dist/core/worker.service.js +108 -80
  11. package/dist/core/worker.service.js.map +1 -1
  12. package/dist/decorators/worker-task.decorator.d.ts +7 -25
  13. package/dist/decorators/worker-task.decorator.js +5 -26
  14. package/dist/decorators/worker-task.decorator.js.map +1 -1
  15. package/dist/di/di-serializer.d.ts +9 -8
  16. package/dist/di/di-serializer.js +69 -46
  17. package/dist/di/di-serializer.js.map +1 -1
  18. package/dist/di/worker-container.d.ts +32 -30
  19. package/dist/di/worker-container.js +130 -70
  20. package/dist/di/worker-container.js.map +1 -1
  21. package/dist/discovery/discovery.service.d.ts +2 -9
  22. package/dist/discovery/discovery.service.js +86 -21
  23. package/dist/discovery/discovery.service.js.map +1 -1
  24. package/dist/example/image.service.d.ts +4 -0
  25. package/dist/example/image.service.js +16 -1
  26. package/dist/example/image.service.js.map +1 -1
  27. package/dist/example/main.js +15 -2
  28. package/dist/example/main.js.map +1 -1
  29. package/dist/health/worker.health.d.ts +46 -0
  30. package/dist/health/worker.health.js +77 -0
  31. package/dist/health/worker.health.js.map +1 -0
  32. package/dist/index.d.ts +6 -1
  33. package/dist/index.js +10 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/metrics/worker.metrics.d.ts +65 -0
  36. package/dist/metrics/worker.metrics.js +122 -0
  37. package/dist/metrics/worker.metrics.js.map +1 -0
  38. package/dist/worker/worker-runtime.js +124 -27
  39. package/dist/worker/worker-runtime.js.map +1 -1
  40. package/package.json +1 -1
@@ -1,33 +1,24 @@
1
1
  /**
2
2
  * WorkerContainer – minimal DI container for worker threads.
3
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.
4
+ * APPROACH: vm.runInNewContext() with a shared module cache.
7
5
  *
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.
6
+ * Each compiled .js file is executed inside a vm context that has:
7
+ * - A custom require() that blocks NestJS bootstrap imports (returning
8
+ * transparent Proxy stubs so decorator calls at file-eval time are no-ops)
9
+ * - Full access to Node built-ins and third-party packages
10
+ * - Correct __filename / __dirname so relative requires resolve properly
11
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.
12
+ * This avoids every problem of the new Function() approach:
13
+ * - No alias injection (crypto_1, node_os_1, …)
14
+ * - No TS helper injection (__importStar, __importDefault, …)
15
+ * - No class-body-only extraction — the full compiled file runs as-is
16
+ * - Dynamic import() and require() both work natively
27
17
  */
28
18
  export interface SerializedDep {
29
19
  name: string;
30
- classSource: string;
20
+ /** Absolute path to the compiled .js file that exports this class */
21
+ filePath: string;
31
22
  snapshot: Record<string, unknown>;
32
23
  propertyKey: string;
33
24
  }
@@ -38,21 +29,32 @@ export interface SerializedMethod {
38
29
  }
39
30
  export interface SerializedService {
40
31
  name: string;
41
- classSource: string;
32
+ /** Absolute path to the compiled .js file that exports this class */
33
+ filePath: string;
42
34
  methods: SerializedMethod[];
43
35
  deps: SerializedDep[];
44
36
  }
45
37
  export declare class WorkerContainer {
46
38
  private readonly instances;
39
+ /**
40
+ * Module export cache — keyed by absolute file path.
41
+ * Avoids re-executing the same file multiple times when several services
42
+ * live in the same compiled output (monorepo barrel files, etc.).
43
+ */
44
+ private readonly fileCache;
47
45
  load(services: SerializedService[]): void;
48
46
  get<T>(name: string): T;
49
- private reconstructFromSource;
47
+ private reconstructFromFile;
48
+ /**
49
+ * Load a named export from a compiled .js file by running it in a vm
50
+ * context. The context's require() stubs NestJS packages so decorators
51
+ * at file-eval time are silent no-ops, while all other imports resolve
52
+ * normally through the real Node module system.
53
+ */
54
+ private loadClass;
50
55
  /**
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
+ * Execute a compiled .js file in an isolated vm context and return its
57
+ * module.exports. Results are cached by file path.
56
58
  */
57
- private evalClass;
59
+ private runFile;
58
60
  }
@@ -2,77 +2,92 @@
2
2
  /**
3
3
  * WorkerContainer – minimal DI container for worker threads.
4
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.
5
+ * APPROACH: vm.runInNewContext() with a shared module cache.
8
6
  *
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.
7
+ * Each compiled .js file is executed inside a vm context that has:
8
+ * - A custom require() that blocks NestJS bootstrap imports (returning
9
+ * transparent Proxy stubs so decorator calls at file-eval time are no-ops)
10
+ * - Full access to Node built-ins and third-party packages
11
+ * - Correct __filename / __dirname so relative requires resolve properly
12
12
  *
13
- * WHY HELPERS ARE INJECTED:
14
- * new Function() runs in the global scope. TypeScript compiles dynamic
15
- * imports using file-level helpers:
13
+ * This avoids every problem of the new Function() approach:
14
+ * - No alias injection (crypto_1, node_os_1, …)
15
+ * - No TS helper injection (__importStar, __importDefault, …)
16
+ * - No class-body-only extraction — the full compiled file runs as-is
17
+ * - Dynamic import() and require() both work natively
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.WorkerContainer = void 0;
24
+ const node_vm_1 = __importDefault(require("node:vm"));
25
+ const node_path_1 = __importDefault(require("node:path"));
26
+ const node_module_1 = __importDefault(require("node:module"));
27
+ const node_fs_1 = __importDefault(require("node:fs"));
28
+ /**
29
+ * NestJS packages that must never be required inside a worker.
30
+ * Requiring them triggers the full NestJS bootstrap chain which crashes
31
+ * in an isolated vm context. We stub them with a transparent Proxy so
32
+ * decorator calls (@Injectable, @Controller, etc.) at file-eval time
33
+ * become silent no-ops.
34
+ */
35
+ const NESTJS_STUB_PACKAGES = new Set([
36
+ '@nestjs/common',
37
+ '@nestjs/core',
38
+ '@nestjs/microservices',
39
+ '@nestjs/platform-express',
40
+ '@nestjs/platform-fastify',
41
+ 'reflect-metadata',
42
+ ]);
43
+ /**
44
+ * A Proxy that silently absorbs NestJS decorator calls at file-eval time.
16
45
  *
17
- * await import('node:os')
18
- * Promise.resolve().then(() => __importStar(require('node:os')))
46
+ * The apply trap passes through its first argument when it is a function —
47
+ * this preserves the class through decorator factory patterns emitted by TS:
19
48
  *
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
49
+ * MyClass = Injectable()(MyClass) ?? MyClass
50
+ * └─ NOOP_STUB() ──┘└─ apply(MyClass) MyClass ─┘
24
51
  *
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.
52
+ * Without this, NOOP_STUB would replace the class, breaking all exports.
28
53
  */
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
- }
54
+ const NOOP_STUB = new Proxy(
55
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
56
+ function () { }, {
57
+ get: (_t, _k) => NOOP_STUB,
58
+ apply: (_t, _this, args) => {
59
+ // If called with a class/function as the first arg (decorator pattern),
60
+ // return it unchanged so the assignment keeps the real class.
61
+ const first = args[0];
62
+ return typeof first === 'function' ? first : NOOP_STUB;
63
+ },
64
+ construct: () => Object.create(null),
65
+ });
63
66
  // ── WorkerContainer ───────────────────────────────────────────────────────
64
67
  class WorkerContainer {
65
68
  instances = new Map();
69
+ /**
70
+ * Module export cache — keyed by absolute file path.
71
+ * Avoids re-executing the same file multiple times when several services
72
+ * live in the same compiled output (monorepo barrel files, etc.).
73
+ */
74
+ fileCache = new Map();
66
75
  load(services) {
67
76
  for (const svc of services) {
68
- const depInstances = [];
77
+ // Reconstruct each dep from its compiled file + snapshot
78
+ const depsByKey = new Map();
69
79
  for (const dep of svc.deps) {
70
- const inst = this.reconstructFromSource(dep.classSource, dep.name, dep.snapshot);
80
+ const inst = this.reconstructFromFile(dep.filePath, dep.name, dep.snapshot);
71
81
  this.instances.set(dep.name, inst);
72
- depInstances.push(inst);
82
+ depsByKey.set(dep.propertyKey, inst);
83
+ }
84
+ // Allocate the service without calling its constructor — deps are
85
+ // assigned by property key so constructor slot order never matters.
86
+ const ServiceClass = this.loadClass(svc.filePath, svc.name);
87
+ const serviceInstance = Object.create(ServiceClass.prototype);
88
+ for (const [key, inst] of depsByKey) {
89
+ serviceInstance[key] = inst;
73
90
  }
74
- const ServiceClass = this.evalClass(svc.classSource, svc.name);
75
- const serviceInstance = new ServiceClass(...depInstances);
76
91
  this.instances.set(svc.name, serviceInstance);
77
92
  }
78
93
  }
@@ -82,29 +97,74 @@ class WorkerContainer {
82
97
  throw new Error(`WorkerContainer: "${name}" not found`);
83
98
  return inst;
84
99
  }
85
- reconstructFromSource(classSource, className, snapshot) {
86
- const DepClass = this.evalClass(classSource, className);
100
+ reconstructFromFile(filePath, className, snapshot) {
101
+ const DepClass = this.loadClass(filePath, className);
87
102
  const instance = Object.create(DepClass.prototype);
88
103
  Object.assign(instance, snapshot);
89
104
  return instance;
90
105
  }
91
106
  /**
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.
107
+ * Load a named export from a compiled .js file by running it in a vm
108
+ * context. The context's require() stubs NestJS packages so decorators
109
+ * at file-eval time are silent no-ops, while all other imports resolve
110
+ * normally through the real Node module system.
97
111
  */
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);
112
+ loadClass(filePath, className) {
113
+ const exports = this.runFile(filePath);
114
+ const cls = exports[className];
103
115
  if (typeof cls !== 'function') {
104
- throw new Error(`WorkerContainer: eval of "${className}" did not return a constructor`);
116
+ throw new Error(`WorkerContainer: "${className}" not found in "${filePath}". ` +
117
+ `Available exports: ${Object.keys(exports).join(', ')}`);
105
118
  }
106
119
  return cls;
107
120
  }
121
+ /**
122
+ * Execute a compiled .js file in an isolated vm context and return its
123
+ * module.exports. Results are cached by file path.
124
+ */
125
+ runFile(filePath) {
126
+ const cached = this.fileCache.get(filePath);
127
+ if (cached)
128
+ return cached;
129
+ const source = node_fs_1.default.readFileSync(filePath, 'utf8');
130
+ const mod = { exports: {} };
131
+ const customRequire = node_module_1.default.createRequire(filePath);
132
+ const sandboxRequire = (id) => {
133
+ if (NESTJS_STUB_PACKAGES.has(id))
134
+ return NOOP_STUB;
135
+ return customRequire(id);
136
+ };
137
+ const context = node_vm_1.default.createContext({
138
+ require: sandboxRequire,
139
+ module: mod,
140
+ exports: mod.exports,
141
+ __filename: filePath,
142
+ __dirname: node_path_1.default.dirname(filePath),
143
+ // Standard globals the compiled output may reference
144
+ console,
145
+ process,
146
+ Buffer,
147
+ URL,
148
+ URLSearchParams,
149
+ fetch,
150
+ setTimeout,
151
+ clearTimeout,
152
+ setInterval,
153
+ clearInterval,
154
+ setImmediate,
155
+ clearImmediate,
156
+ Promise,
157
+ // Make the context's global === the context itself so that
158
+ // `(this && this.__importStar)` patterns resolve to the context global
159
+ // rather than to undefined (as they would in new Function()).
160
+ global: undefined, // set below after createContext
161
+ });
162
+ // Wire global → context so self-referential global patterns work
163
+ context.global = context;
164
+ node_vm_1.default.runInContext(source, context, { filename: filePath });
165
+ this.fileCache.set(filePath, mod.exports);
166
+ return mod.exports;
167
+ }
108
168
  }
109
169
  exports.WorkerContainer = WorkerContainer;
110
170
  //# sourceMappingURL=worker-container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-container.js","sourceRoot":"","sources":["../../src/di/worker-container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-container.js","sourceRoot":"","sources":["../../src/di/worker-container.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,13 @@
1
1
  import { ModuleRef, ModulesContainer } from '@nestjs/core';
2
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
3
  export declare class WorkerDiscoveryService {
13
4
  private readonly modulesContainer;
14
5
  private readonly moduleRef;
6
+ private readonly logger;
15
7
  private scanned;
16
8
  private discovered;
17
9
  constructor(modulesContainer: ModulesContainer, moduleRef: ModuleRef);
18
10
  scan(): DiscoveredTask[];
19
11
  private inspectWrapper;
12
+ private resolveToken;
20
13
  }
@@ -8,23 +8,16 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var WorkerDiscoveryService_1;
11
12
  Object.defineProperty(exports, "__esModule", { value: true });
12
13
  exports.WorkerDiscoveryService = void 0;
13
14
  const common_1 = require("@nestjs/common");
14
15
  const core_1 = require("@nestjs/core");
15
16
  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 {
17
+ let WorkerDiscoveryService = WorkerDiscoveryService_1 = class WorkerDiscoveryService {
26
18
  modulesContainer;
27
19
  moduleRef;
20
+ logger = new common_1.Logger(WorkerDiscoveryService_1.name);
28
21
  scanned = false;
29
22
  discovered = [];
30
23
  constructor(modulesContainer, moduleRef) {
@@ -36,59 +29,131 @@ let WorkerDiscoveryService = class WorkerDiscoveryService {
36
29
  return this.discovered;
37
30
  this.scanned = true;
38
31
  for (const module of this.modulesContainer.values()) {
39
- // Scan providers (services, repositories, etc.)
40
32
  for (const wrapper of module.providers.values()) {
41
33
  this.inspectWrapper(wrapper);
42
34
  }
43
- // Scan controllers — NestJS registers these separately
44
35
  for (const wrapper of module.controllers.values()) {
45
36
  this.inspectWrapper(wrapper);
46
37
  }
47
38
  }
39
+ if (this.discovered.length === 0) {
40
+ this.logger.warn('No @WorkerTask methods found. Ensure at least one class is decorated ' +
41
+ 'with @WorkerClass() and has methods decorated with @WorkerTask().');
42
+ }
48
43
  return this.discovered;
49
44
  }
50
45
  inspectWrapper(wrapper) {
51
46
  const { instance, metatype } = wrapper;
52
47
  if (!instance || !metatype)
53
48
  return;
54
- const isWorkerClass = Reflect.getMetadata(worker_task_decorator_1.WORKER_CLASS_META, metatype);
55
- if (!isWorkerClass)
49
+ if (!Reflect.getMetadata(worker_task_decorator_1.WORKER_CLASS_META, metatype))
56
50
  return;
57
51
  const serviceName = metatype.name;
58
- const proto = Object.getPrototypeOf(instance);
52
+ const proto = metatype.prototype;
53
+ // ── serialised deps ───────────────────────────────────────────────────
59
54
  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 });
55
+ const deps = depTypes.map((token) => this.resolveToken(token, serviceName, 'deps'));
56
+ // ── proxy services ────────────────────────────────────────────────────
57
+ const proxyTypes = Reflect.getMetadata(worker_task_decorator_1.WORKER_PROXY_META, metatype) ?? [];
58
+ const proxyInstances = proxyTypes.map((token) => {
59
+ const svcInstance = this.resolveToken(token, serviceName, 'proxy');
60
+ const tokenName = token.name ?? 'unknown';
61
+ const propertyKey = findPropertyKey(instance, svcInstance) ?? camelCase(tokenName);
62
+ if (!findPropertyKey(instance, svcInstance)) {
63
+ this.logger.warn(`${serviceName}: could not find property key for proxy "${tokenName}" ` +
64
+ `— falling back to camelCase: "${propertyKey}".`);
63
65
  }
64
- catch {
65
- return undefined;
66
+ const methodNames = [];
67
+ if (svcInstance) {
68
+ let cursor = Object.getPrototypeOf(svcInstance);
69
+ while (cursor && cursor !== Object.prototype) {
70
+ for (const k of Object.getOwnPropertyNames(cursor)) {
71
+ if (k !== 'constructor' && !methodNames.includes(k)) {
72
+ const desc = Object.getOwnPropertyDescriptor(cursor, k);
73
+ if (desc && typeof desc.value === 'function')
74
+ methodNames.push(k);
75
+ }
76
+ }
77
+ cursor = Object.getPrototypeOf(cursor);
78
+ }
66
79
  }
80
+ return { propertyKey, methodNames, instance: svcInstance ?? {} };
67
81
  });
82
+ // ── @WorkerTask methods ───────────────────────────────────────────────
83
+ let tasksFound = 0;
68
84
  for (const methodName of Object.getOwnPropertyNames(proto)) {
69
85
  if (methodName === 'constructor')
70
86
  continue;
71
87
  const options = Reflect.getMetadata(worker_task_decorator_1.WORKER_METHOD_META, proto, methodName);
72
88
  if (!options)
73
89
  continue;
90
+ tasksFound++;
91
+ // Normalise retryDelay: function form → serialised as max of first 3 calls
92
+ // (functions can't cross the thread boundary; we store the numeric value)
93
+ let retryDelay;
94
+ if (typeof options.retryDelay === 'function') {
95
+ // Store delays for attempts 1-3 as a simple average to give workers
96
+ // a representative delay. For production use, pass a number.
97
+ const fn = options.retryDelay;
98
+ retryDelay = Math.round((fn(1) + fn(2) + fn(3)) / 3);
99
+ this.logger.warn(`${serviceName}.${methodName}: retryDelay as a function is not supported ` +
100
+ `across thread boundaries. Computed average: ${retryDelay}ms. ` +
101
+ `Pass a number for precise control.`);
102
+ }
103
+ else {
104
+ retryDelay = options.retryDelay;
105
+ }
74
106
  const fn = instance[methodName].bind(instance);
75
107
  this.discovered.push({
76
108
  serviceName,
77
109
  methodName,
78
110
  priority: options.priority ?? 'NORMAL',
79
111
  timeout: options.timeout,
112
+ retry: options.retry,
113
+ retryDelay,
80
114
  fn,
81
115
  metatype: metatype,
82
116
  instance,
83
117
  deps,
118
+ proxyInstances,
84
119
  });
120
+ this.logger.debug(`Registered task: ${serviceName}.${methodName} ` +
121
+ `[priority=${options.priority ?? 'NORMAL'}` +
122
+ `${options.timeout ? `, timeout=${options.timeout}ms` : ''}` +
123
+ `${options.retry ? `, retry=${options.retry}` : ''}]`);
124
+ }
125
+ if (tasksFound === 0) {
126
+ this.logger.warn(`${serviceName} has @WorkerClass() but no @WorkerTask() methods.`);
127
+ }
128
+ }
129
+ resolveToken(token, ownerName, role) {
130
+ try {
131
+ return this.moduleRef.get(token, { strict: false });
132
+ }
133
+ catch (err) {
134
+ const name = token.name ?? String(token);
135
+ this.logger.error(`${ownerName}: failed to resolve ${role} token "${name}". ` +
136
+ `Original error: ${err.message}`);
137
+ return undefined;
85
138
  }
86
139
  }
87
140
  };
88
141
  exports.WorkerDiscoveryService = WorkerDiscoveryService;
89
- exports.WorkerDiscoveryService = WorkerDiscoveryService = __decorate([
142
+ exports.WorkerDiscoveryService = WorkerDiscoveryService = WorkerDiscoveryService_1 = __decorate([
90
143
  (0, common_1.Injectable)(),
91
144
  __metadata("design:paramtypes", [core_1.ModulesContainer,
92
145
  core_1.ModuleRef])
93
146
  ], WorkerDiscoveryService);
147
+ function findPropertyKey(serviceInstance, depInstance) {
148
+ if (!serviceInstance || !depInstance || typeof serviceInstance !== 'object')
149
+ return undefined;
150
+ for (const key of Object.getOwnPropertyNames(serviceInstance)) {
151
+ if (serviceInstance[key] === depInstance)
152
+ return key;
153
+ }
154
+ return undefined;
155
+ }
156
+ function camelCase(name) {
157
+ return name.charAt(0).toLowerCase() + name.slice(1);
158
+ }
94
159
  //# sourceMappingURL=discovery.service.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"discovery.service.js","sourceRoot":"","sources":["../../src/discovery/discovery.service.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,8 @@ export declare class ImageService {
6
6
  generateThumbnail(width: number, height: number): string;
7
7
  moduleImport(): Promise<string>;
8
8
  moduleRequire(): Promise<string>;
9
+ outlineModule(): Promise<{
10
+ p: number;
11
+ f: number;
12
+ }>;
9
13
  }
@@ -41,11 +41,15 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  var __metadata = (this && this.__metadata) || function (k, v) {
42
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
43
  };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
44
47
  Object.defineProperty(exports, "__esModule", { value: true });
45
48
  exports.ImageService = void 0;
46
49
  const common_1 = require("@nestjs/common");
47
50
  const worker_task_decorator_1 = require("../decorators/worker-task.decorator");
48
51
  const config_service_1 = require("./config.service");
52
+ const promises_1 = __importDefault(require("fs/promises"));
49
53
  let ImageService = class ImageService {
50
54
  configService;
51
55
  constructor(configService) {
@@ -74,10 +78,15 @@ let ImageService = class ImageService {
74
78
  const os = require('node:os');
75
79
  return `Require os size ${os.cpus().length}`;
76
80
  }
81
+ async outlineModule() {
82
+ const p = await promises_1.default.readFile('./package.json', 'utf-8');
83
+ const f = (await fetch('https://api.github.com')).status;
84
+ return { p: p.length, f };
85
+ }
77
86
  };
78
87
  exports.ImageService = ImageService;
79
88
  __decorate([
80
- (0, worker_task_decorator_1.WorkerTask)(),
89
+ (0, worker_task_decorator_1.WorkerTask)({ priority: 'HIGH' }),
81
90
  __metadata("design:type", Function),
82
91
  __metadata("design:paramtypes", [Number]),
83
92
  __metadata("design:returntype", Number)
@@ -100,6 +109,12 @@ __decorate([
100
109
  __metadata("design:paramtypes", []),
101
110
  __metadata("design:returntype", Promise)
102
111
  ], ImageService.prototype, "moduleRequire", null);
112
+ __decorate([
113
+ (0, worker_task_decorator_1.WorkerTask)(),
114
+ __metadata("design:type", Function),
115
+ __metadata("design:paramtypes", []),
116
+ __metadata("design:returntype", Promise)
117
+ ], ImageService.prototype, "outlineModule", null);
103
118
  exports.ImageService = ImageService = __decorate([
104
119
  (0, common_1.Injectable)(),
105
120
  (0, worker_task_decorator_1.WorkerClass)({ deps: [config_service_1.ConfigService] }),
@@ -1 +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"}
1
+ {"version":3,"file":"image.service.js","sourceRoot":"","sources":["../../src/example/image.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+EAA8E;AAC9E,qDAAiD;AACjD,2DAA6B;AAItB,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,CAAC;IAC9C,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,CAAC;IAC/C,CAAC;IAGK,AAAN,KAAK,CAAC,aAAa;QACjB,MAAM,CAAC,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC5B,CAAC;CACF,CAAA;AAvCY,oCAAY;AAKvB;IADC,IAAA,kCAAU,EAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;;;;+CAOhC;AAGD;IADC,IAAA,kCAAU,GAAE;;;;qDAMZ;AAGK;IADL,IAAA,kCAAU,GAAE;;;;gDAIZ;AAGK;IADL,IAAA,kCAAU,GAAE;;;;iDAIZ;AAGK;IADL,IAAA,kCAAU,GAAE;;;;iDAKZ;uBAtCU,YAAY;IAFxB,IAAA,mBAAU,GAAE;IACZ,IAAA,mCAAW,EAAC,EAAE,IAAI,EAAE,CAAC,8BAAa,CAAC,EAAE,CAAC;qCAEO,8BAAa;GAD9C,YAAY,CAuCxB"}