@simplysm/core-node 13.0.0-beta.20 → 13.0.0-beta.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAiC,MAAM,SAAS,CAAC;AAoJxF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;IACjB;;;;;;OAMG;WACI,OAAO,SAAS,YAAY,YACvB,MAAM,QACV,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAChD,WAAW,CAAC,OAAO,CAAC;CAyBxB,CAAC"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAiC,MAAM,SAAS,CAAC;AAsJxF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;IACjB;;;;;;OAMG;WACI,OAAO,SAAS,YAAY,YACvB,MAAM,QACV,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAChD,WAAW,CAAC,OAAO,CAAC;CAyBxB,CAAC"}
@@ -13,6 +13,7 @@ class WorkerInternal extends EventEmitter {
13
13
  const ext = path.extname(import.meta.filename);
14
14
  const envObj = opt?.env != null && typeof opt.env === "object" ? opt.env : {};
15
15
  if (ext === ".ts") {
16
+ const workerPath = filePath.startsWith("file://") ? fileURLToPath(filePath) : filePath;
16
17
  this._worker = new WorkerRaw(path.resolve(import.meta.dirname, "../../lib/worker-dev-proxy.js"), {
17
18
  stdout: true,
18
19
  stderr: true,
@@ -21,7 +22,7 @@ class WorkerInternal extends EventEmitter {
21
22
  ...process.env,
22
23
  ...envObj
23
24
  },
24
- argv: [filePath, ...opt?.argv ?? []]
25
+ argv: [workerPath, ...opt?.argv ?? []]
25
26
  });
26
27
  } else {
27
28
  const workerPath = filePath.startsWith("file://") ? fileURLToPath(filePath) : filePath;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/worker/worker.ts"],
4
- "sourcesContent": ["import { EventEmitter, transferableDecode, transferableEncode, Uuid } from \"@simplysm/core-common\";\nimport { createConsola } from \"consola\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { WorkerOptions as WorkerRawOptions } from \"worker_threads\";\nimport { Worker as WorkerRaw } from \"worker_threads\";\nimport type { WorkerModule, WorkerProxy, WorkerRequest, WorkerResponse } from \"./types\";\n\nconst logger = createConsola().withTag(\"sd-worker\");\n\n//#region WorkerInternal\n\n/**\n * Worker \uB0B4\uBD80 \uAD6C\uD604 \uD074\uB798\uC2A4.\n * Proxy\uB97C \uD1B5\uD574 \uC678\uBD80\uC5D0 \uB178\uCD9C\uB428.\n *\n * \uAC1C\uBC1C \uD658\uACBD(.ts)\uC5D0\uC11C\uB294 tsx\uB97C \uD1B5\uD574 TypeScript \uC6CC\uCEE4 \uD30C\uC77C\uC744 \uC2E4\uD589\uD558\uACE0,\n * \uD504\uB85C\uB355\uC158 \uD658\uACBD(.js)\uC5D0\uC11C\uB294 \uC9C1\uC811 Worker\uB97C \uC0DD\uC131\uD55C\uB2E4.\n */\nclass WorkerInternal extends EventEmitter<Record<string, unknown>> {\n private readonly _worker: WorkerRaw;\n private _isTerminated = false;\n private readonly _pendingRequests = new Map<\n string,\n { method: string; resolve: (value: unknown) => void; reject: (err: Error) => void }\n >();\n\n constructor(filePath: string, opt?: Omit<WorkerRawOptions, \"stdout\" | \"stderr\">) {\n super();\n\n const ext = path.extname(import.meta.filename);\n\n // \uD0C0\uC785 \uAC00\uB4DC\uB97C \uD1B5\uD55C env \uAC1D\uCCB4 \uCD94\uCD9C\n const envObj = opt?.env != null && typeof opt.env === \"object\" ? opt.env : {};\n\n // \uAC1C\uBC1C \uD658\uACBD (.ts \uD30C\uC77C)\uC778 \uACBD\uC6B0 tsx\uB97C \uD1B5\uD574 \uC2E4\uD589\n // worker-dev-proxy.js: tsx\uB85C TypeScript \uC6CC\uCEE4 \uD30C\uC77C\uC744 \uB3D9\uC801\uC73C\uB85C \uB85C\uB4DC\uD558\uB294 \uD504\uB85D\uC2DC\n if (ext === \".ts\") {\n this._worker = new WorkerRaw(path.resolve(import.meta.dirname, \"../../lib/worker-dev-proxy.js\"), {\n stdout: true,\n stderr: true,\n ...opt,\n env: {\n ...process.env,\n ...envObj,\n },\n argv: [filePath, ...(opt?.argv ?? [])],\n });\n } else {\n // \uD504\uB85C\uB355\uC158 \uD658\uACBD (.js \uD30C\uC77C)\n // file:// URL\uC778 \uACBD\uC6B0 \uBCC0\uD658, \uC774\uBBF8 \uC808\uB300 \uACBD\uB85C\uC778 \uACBD\uC6B0 \uADF8\uB300\uB85C \uC0AC\uC6A9\n const workerPath = filePath.startsWith(\"file://\") ? fileURLToPath(filePath) : filePath;\n this._worker = new WorkerRaw(workerPath, {\n stdout: true,\n stderr: true,\n ...opt,\n env: {\n ...process.env,\n ...envObj,\n },\n });\n }\n\n // \uC6CC\uCEE4\uC758 stdout/stderr\uB97C \uBA54\uC778\uC5D0 \uCD9C\uB825\n this._worker.stdout.pipe(process.stdout);\n this._worker.stderr.pipe(process.stderr);\n\n this._worker.on(\"exit\", (code) => {\n if (!this._isTerminated && code !== 0) {\n logger.error(`\uC6CC\uCEE4\uAC00 \uC624\uB958\uC640 \uD568\uAED8 \uB2EB\uD798 (code: ${code})`);\n // \uBE44\uC815\uC0C1 \uC885\uB8CC \uC2DC \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uC694\uCCAD reject\n this._rejectAllPending(new Error(`\uC6CC\uCEE4\uAC00 \uBE44\uC815\uC0C1 \uC885\uB8CC\uB428 (code: ${code})`));\n }\n });\n\n this._worker.on(\"error\", (err) => {\n logger.error(\"\uC6CC\uCEE4 \uC624\uB958:\", err);\n // \uC6CC\uCEE4 \uC5D0\uB7EC \uC2DC \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uC694\uCCAD reject\n this._rejectAllPending(err);\n });\n\n this._worker.on(\"message\", (serializedResponse: unknown) => {\n const decoded = transferableDecode(serializedResponse);\n\n // \uC751\uB2F5 \uAD6C\uC870 \uAC80\uC99D\n if (decoded == null || typeof decoded !== \"object\" || !(\"type\" in decoded)) {\n logger.warn(\"\uC6CC\uCEE4\uC5D0\uC11C \uC798\uBABB\uB41C \uD615\uC2DD\uC758 \uC751\uB2F5:\", decoded);\n return;\n }\n const response = decoded as WorkerResponse;\n\n if (response.type === \"event\") {\n this.emit(response.event, response.body);\n } else if (response.type === \"log\") {\n process.stdout.write(response.body);\n } else if (response.type === \"return\") {\n const pending = this._pendingRequests.get(response.request.id);\n if (pending) {\n this._pendingRequests.delete(response.request.id);\n pending.resolve(response.body);\n }\n } else {\n // response.type === \"error\"\n const pending = this._pendingRequests.get(response.request.id);\n if (pending) {\n this._pendingRequests.delete(response.request.id);\n pending.reject(response.body);\n }\n }\n });\n }\n\n /**\n * \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uC694\uCCAD\uC744 reject\uD569\uB2C8\uB2E4.\n */\n private _rejectAllPending(err: Error): void {\n for (const [_id, { method, reject }] of this._pendingRequests) {\n reject(new Error(`${err.message} (method: ${method})`));\n }\n this._pendingRequests.clear();\n }\n\n /**\n * \uC6CC\uCEE4 \uBA54\uC11C\uB4DC \uD638\uCD9C.\n */\n call(method: string, params: unknown[]): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const request: WorkerRequest = {\n id: Uuid.new().toString(),\n method,\n params,\n };\n\n this._pendingRequests.set(request.id, { method, resolve, reject });\n\n const serialized = transferableEncode(request);\n this._worker.postMessage(serialized.result, serialized.transferList);\n });\n }\n\n /**\n * \uC6CC\uCEE4 \uC885\uB8CC.\n */\n async terminate(): Promise<void> {\n this._isTerminated = true;\n this._rejectAllPending(new Error(\"\uC6CC\uCEE4\uAC00 \uC885\uB8CC\uB428\"));\n await this._worker.terminate();\n }\n}\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uD0C0\uC785 \uC548\uC804\uD55C Worker \uB798\uD37C.\n *\n * @example\n * // worker.ts\n * export default createWorker({\n * add: (a: number, b: number) => a + b,\n * });\n *\n * // main.ts\n * const worker = Worker.create<typeof import(\"./worker\")>(\"./worker.ts\");\n * const result = await worker.add(10, 20); // 30\n * await worker.terminate();\n */\nexport const Worker = {\n /**\n * \uD0C0\uC785 \uC548\uC804\uD55C Worker Proxy \uC0DD\uC131.\n *\n * @param filePath - \uC6CC\uCEE4 \uD30C\uC77C \uACBD\uB85C (file:// URL \uB610\uB294 \uC808\uB300 \uACBD\uB85C)\n * @param opt - Worker \uC635\uC158\n * @returns Proxy \uAC1D\uCCB4 (\uBA54\uC11C\uB4DC \uC9C1\uC811 \uD638\uCD9C, on(), terminate() \uC9C0\uC6D0)\n */\n create<TModule extends WorkerModule>(\n filePath: string,\n opt?: Omit<WorkerRawOptions, \"stdout\" | \"stderr\">,\n ): WorkerProxy<TModule> {\n const internal = new WorkerInternal(filePath, opt);\n\n return new Proxy({} as WorkerProxy<TModule>, {\n get(_target, prop: string) {\n // \uC608\uC57D\uB41C \uBA54\uC11C\uB4DC: on, off, terminate\n if (prop === \"on\") {\n return (event: string, listener: (data: unknown) => void) => {\n internal.on(event, listener);\n };\n }\n if (prop === \"off\") {\n return (event: string, listener: (data: unknown) => void) => {\n internal.off(event, listener);\n };\n }\n if (prop === \"terminate\") {\n return () => internal.terminate();\n }\n\n // \uADF8 \uC678\uB294 \uC6CC\uCEE4 \uBA54\uC11C\uB4DC\uB85C \uCC98\uB9AC\n return (...args: unknown[]) => internal.call(prop, args);\n },\n });\n },\n};\n\n//#endregion\n"],
5
- "mappings": "AAAA,SAAS,cAAc,oBAAoB,oBAAoB,YAAY;AAC3E,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,SAAS,UAAU,iBAAiB;AAGpC,MAAM,SAAS,cAAc,EAAE,QAAQ,WAAW;AAWlD,MAAM,uBAAuB,aAAsC;AAAA,EAChD;AAAA,EACT,gBAAgB;AAAA,EACP,mBAAmB,oBAAI,IAGtC;AAAA,EAEF,YAAY,UAAkB,KAAmD;AAC/E,UAAM;AAEN,UAAM,MAAM,KAAK,QAAQ,YAAY,QAAQ;AAG7C,UAAM,SAAS,KAAK,OAAO,QAAQ,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAM,CAAC;AAI5E,QAAI,QAAQ,OAAO;AACjB,WAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,YAAY,SAAS,+BAA+B,GAAG;AAAA,QAC/F,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,GAAG;AAAA,QACH,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,GAAG;AAAA,QACL;AAAA,QACA,MAAM,CAAC,UAAU,GAAI,KAAK,QAAQ,CAAC,CAAE;AAAA,MACvC,CAAC;AAAA,IACH,OAAO;AAGL,YAAM,aAAa,SAAS,WAAW,SAAS,IAAI,cAAc,QAAQ,IAAI;AAC9E,WAAK,UAAU,IAAI,UAAU,YAAY;AAAA,QACvC,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,GAAG;AAAA,QACH,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,GAAG;AAAA,QACL;AAAA,MACF,CAAC;AAAA,IACH;AAGA,SAAK,QAAQ,OAAO,KAAK,QAAQ,MAAM;AACvC,SAAK,QAAQ,OAAO,KAAK,QAAQ,MAAM;AAEvC,SAAK,QAAQ,GAAG,QAAQ,CAAC,SAAS;AAChC,UAAI,CAAC,KAAK,iBAAiB,SAAS,GAAG;AACrC,eAAO,MAAM,0EAAwB,IAAI,GAAG;AAE5C,aAAK,kBAAkB,IAAI,MAAM,mEAAsB,IAAI,GAAG,CAAC;AAAA,MACjE;AAAA,IACF,CAAC;AAED,SAAK,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAChC,aAAO,MAAM,8BAAU,GAAG;AAE1B,WAAK,kBAAkB,GAAG;AAAA,IAC5B,CAAC;AAED,SAAK,QAAQ,GAAG,WAAW,CAAC,uBAAgC;AAC1D,YAAM,UAAU,mBAAmB,kBAAkB;AAGrD,UAAI,WAAW,QAAQ,OAAO,YAAY,YAAY,EAAE,UAAU,UAAU;AAC1E,eAAO,KAAK,gFAAoB,OAAO;AACvC;AAAA,MACF;AACA,YAAM,WAAW;AAEjB,UAAI,SAAS,SAAS,SAAS;AAC7B,aAAK,KAAK,SAAS,OAAO,SAAS,IAAI;AAAA,MACzC,WAAW,SAAS,SAAS,OAAO;AAClC,gBAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,MACpC,WAAW,SAAS,SAAS,UAAU;AACrC,cAAM,UAAU,KAAK,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AAC7D,YAAI,SAAS;AACX,eAAK,iBAAiB,OAAO,SAAS,QAAQ,EAAE;AAChD,kBAAQ,QAAQ,SAAS,IAAI;AAAA,QAC/B;AAAA,MACF,OAAO;AAEL,cAAM,UAAU,KAAK,iBAAiB,IAAI,SAAS,QAAQ,EAAE;AAC7D,YAAI,SAAS;AACX,eAAK,iBAAiB,OAAO,SAAS,QAAQ,EAAE;AAChD,kBAAQ,OAAO,SAAS,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAkB;AAC1C,eAAW,CAAC,KAAK,EAAE,QAAQ,OAAO,CAAC,KAAK,KAAK,kBAAkB;AAC7D,aAAO,IAAI,MAAM,GAAG,IAAI,OAAO,aAAa,MAAM,GAAG,CAAC;AAAA,IACxD;AACA,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,QAAgB,QAAqC;AACxD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAyB;AAAA,QAC7B,IAAI,KAAK,IAAI,EAAE,SAAS;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAEA,WAAK,iBAAiB,IAAI,QAAQ,IAAI,EAAE,QAAQ,SAAS,OAAO,CAAC;AAEjE,YAAM,aAAa,mBAAmB,OAAO;AAC7C,WAAK,QAAQ,YAAY,WAAW,QAAQ,WAAW,YAAY;AAAA,IACrE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2B;AAC/B,SAAK,gBAAgB;AACrB,SAAK,kBAAkB,IAAI,MAAM,uCAAS,CAAC;AAC3C,UAAM,KAAK,QAAQ,UAAU;AAAA,EAC/B;AACF;AAoBO,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpB,OACE,UACA,KACsB;AACtB,UAAM,WAAW,IAAI,eAAe,UAAU,GAAG;AAEjD,WAAO,IAAI,MAAM,CAAC,GAA2B;AAAA,MAC3C,IAAI,SAAS,MAAc;AAEzB,YAAI,SAAS,MAAM;AACjB,iBAAO,CAAC,OAAe,aAAsC;AAC3D,qBAAS,GAAG,OAAO,QAAQ;AAAA,UAC7B;AAAA,QACF;AACA,YAAI,SAAS,OAAO;AAClB,iBAAO,CAAC,OAAe,aAAsC;AAC3D,qBAAS,IAAI,OAAO,QAAQ;AAAA,UAC9B;AAAA,QACF;AACA,YAAI,SAAS,aAAa;AACxB,iBAAO,MAAM,SAAS,UAAU;AAAA,QAClC;AAGA,eAAO,IAAI,SAAoB,SAAS,KAAK,MAAM,IAAI;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import { EventEmitter, transferableDecode, transferableEncode, Uuid } from \"@simplysm/core-common\";\nimport { createConsola } from \"consola\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { WorkerOptions as WorkerRawOptions } from \"worker_threads\";\nimport { Worker as WorkerRaw } from \"worker_threads\";\nimport type { WorkerModule, WorkerProxy, WorkerRequest, WorkerResponse } from \"./types\";\n\nconst logger = createConsola().withTag(\"sd-worker\");\n\n//#region WorkerInternal\n\n/**\n * Worker \uB0B4\uBD80 \uAD6C\uD604 \uD074\uB798\uC2A4.\n * Proxy\uB97C \uD1B5\uD574 \uC678\uBD80\uC5D0 \uB178\uCD9C\uB428.\n *\n * \uAC1C\uBC1C \uD658\uACBD(.ts)\uC5D0\uC11C\uB294 tsx\uB97C \uD1B5\uD574 TypeScript \uC6CC\uCEE4 \uD30C\uC77C\uC744 \uC2E4\uD589\uD558\uACE0,\n * \uD504\uB85C\uB355\uC158 \uD658\uACBD(.js)\uC5D0\uC11C\uB294 \uC9C1\uC811 Worker\uB97C \uC0DD\uC131\uD55C\uB2E4.\n */\nclass WorkerInternal extends EventEmitter<Record<string, unknown>> {\n private readonly _worker: WorkerRaw;\n private _isTerminated = false;\n private readonly _pendingRequests = new Map<\n string,\n { method: string; resolve: (value: unknown) => void; reject: (err: Error) => void }\n >();\n\n constructor(filePath: string, opt?: Omit<WorkerRawOptions, \"stdout\" | \"stderr\">) {\n super();\n\n const ext = path.extname(import.meta.filename);\n\n // \uD0C0\uC785 \uAC00\uB4DC\uB97C \uD1B5\uD55C env \uAC1D\uCCB4 \uCD94\uCD9C\n const envObj = opt?.env != null && typeof opt.env === \"object\" ? opt.env : {};\n\n // \uAC1C\uBC1C \uD658\uACBD (.ts \uD30C\uC77C)\uC778 \uACBD\uC6B0 tsx\uB97C \uD1B5\uD574 \uC2E4\uD589\n // worker-dev-proxy.js: tsx\uB85C TypeScript \uC6CC\uCEE4 \uD30C\uC77C\uC744 \uB3D9\uC801\uC73C\uB85C \uB85C\uB4DC\uD558\uB294 \uD504\uB85D\uC2DC\n if (ext === \".ts\") {\n // file:// URL\uC778 \uACBD\uC6B0 \uC808\uB300 \uACBD\uB85C\uB85C \uBCC0\uD658 (worker-dev-proxy.js\uC5D0\uC11C \uB2E4\uC2DC pathToFileURL \uC801\uC6A9)\n const workerPath = filePath.startsWith(\"file://\") ? fileURLToPath(filePath) : filePath;\n this._worker = new WorkerRaw(path.resolve(import.meta.dirname, \"../../lib/worker-dev-proxy.js\"), {\n stdout: true,\n stderr: true,\n ...opt,\n env: {\n ...process.env,\n ...envObj,\n },\n argv: [workerPath, ...(opt?.argv ?? [])],\n });\n } else {\n // \uD504\uB85C\uB355\uC158 \uD658\uACBD (.js \uD30C\uC77C)\n // file:// URL\uC778 \uACBD\uC6B0 \uBCC0\uD658, \uC774\uBBF8 \uC808\uB300 \uACBD\uB85C\uC778 \uACBD\uC6B0 \uADF8\uB300\uB85C \uC0AC\uC6A9\n const workerPath = filePath.startsWith(\"file://\") ? fileURLToPath(filePath) : filePath;\n this._worker = new WorkerRaw(workerPath, {\n stdout: true,\n stderr: true,\n ...opt,\n env: {\n ...process.env,\n ...envObj,\n },\n });\n }\n\n // \uC6CC\uCEE4\uC758 stdout/stderr\uB97C \uBA54\uC778\uC5D0 \uCD9C\uB825\n this._worker.stdout.pipe(process.stdout);\n this._worker.stderr.pipe(process.stderr);\n\n this._worker.on(\"exit\", (code) => {\n if (!this._isTerminated && code !== 0) {\n logger.error(`\uC6CC\uCEE4\uAC00 \uC624\uB958\uC640 \uD568\uAED8 \uB2EB\uD798 (code: ${code})`);\n // \uBE44\uC815\uC0C1 \uC885\uB8CC \uC2DC \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uC694\uCCAD reject\n this._rejectAllPending(new Error(`\uC6CC\uCEE4\uAC00 \uBE44\uC815\uC0C1 \uC885\uB8CC\uB428 (code: ${code})`));\n }\n });\n\n this._worker.on(\"error\", (err) => {\n logger.error(\"\uC6CC\uCEE4 \uC624\uB958:\", err);\n // \uC6CC\uCEE4 \uC5D0\uB7EC \uC2DC \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uC694\uCCAD reject\n this._rejectAllPending(err);\n });\n\n this._worker.on(\"message\", (serializedResponse: unknown) => {\n const decoded = transferableDecode(serializedResponse);\n\n // \uC751\uB2F5 \uAD6C\uC870 \uAC80\uC99D\n if (decoded == null || typeof decoded !== \"object\" || !(\"type\" in decoded)) {\n logger.warn(\"\uC6CC\uCEE4\uC5D0\uC11C \uC798\uBABB\uB41C \uD615\uC2DD\uC758 \uC751\uB2F5:\", decoded);\n return;\n }\n const response = decoded as WorkerResponse;\n\n if (response.type === \"event\") {\n this.emit(response.event, response.body);\n } else if (response.type === \"log\") {\n process.stdout.write(response.body);\n } else if (response.type === \"return\") {\n const pending = this._pendingRequests.get(response.request.id);\n if (pending) {\n this._pendingRequests.delete(response.request.id);\n pending.resolve(response.body);\n }\n } else {\n // response.type === \"error\"\n const pending = this._pendingRequests.get(response.request.id);\n if (pending) {\n this._pendingRequests.delete(response.request.id);\n pending.reject(response.body);\n }\n }\n });\n }\n\n /**\n * \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uC694\uCCAD\uC744 reject\uD569\uB2C8\uB2E4.\n */\n private _rejectAllPending(err: Error): void {\n for (const [_id, { method, reject }] of this._pendingRequests) {\n reject(new Error(`${err.message} (method: ${method})`));\n }\n this._pendingRequests.clear();\n }\n\n /**\n * \uC6CC\uCEE4 \uBA54\uC11C\uB4DC \uD638\uCD9C.\n */\n call(method: string, params: unknown[]): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const request: WorkerRequest = {\n id: Uuid.new().toString(),\n method,\n params,\n };\n\n this._pendingRequests.set(request.id, { method, resolve, reject });\n\n const serialized = transferableEncode(request);\n this._worker.postMessage(serialized.result, serialized.transferList);\n });\n }\n\n /**\n * \uC6CC\uCEE4 \uC885\uB8CC.\n */\n async terminate(): Promise<void> {\n this._isTerminated = true;\n this._rejectAllPending(new Error(\"\uC6CC\uCEE4\uAC00 \uC885\uB8CC\uB428\"));\n await this._worker.terminate();\n }\n}\n\n//#endregion\n\n//#region Worker\n\n/**\n * \uD0C0\uC785 \uC548\uC804\uD55C Worker \uB798\uD37C.\n *\n * @example\n * // worker.ts\n * export default createWorker({\n * add: (a: number, b: number) => a + b,\n * });\n *\n * // main.ts\n * const worker = Worker.create<typeof import(\"./worker\")>(\"./worker.ts\");\n * const result = await worker.add(10, 20); // 30\n * await worker.terminate();\n */\nexport const Worker = {\n /**\n * \uD0C0\uC785 \uC548\uC804\uD55C Worker Proxy \uC0DD\uC131.\n *\n * @param filePath - \uC6CC\uCEE4 \uD30C\uC77C \uACBD\uB85C (file:// URL \uB610\uB294 \uC808\uB300 \uACBD\uB85C)\n * @param opt - Worker \uC635\uC158\n * @returns Proxy \uAC1D\uCCB4 (\uBA54\uC11C\uB4DC \uC9C1\uC811 \uD638\uCD9C, on(), terminate() \uC9C0\uC6D0)\n */\n create<TModule extends WorkerModule>(\n filePath: string,\n opt?: Omit<WorkerRawOptions, \"stdout\" | \"stderr\">,\n ): WorkerProxy<TModule> {\n const internal = new WorkerInternal(filePath, opt);\n\n return new Proxy({} as WorkerProxy<TModule>, {\n get(_target, prop: string) {\n // \uC608\uC57D\uB41C \uBA54\uC11C\uB4DC: on, off, terminate\n if (prop === \"on\") {\n return (event: string, listener: (data: unknown) => void) => {\n internal.on(event, listener);\n };\n }\n if (prop === \"off\") {\n return (event: string, listener: (data: unknown) => void) => {\n internal.off(event, listener);\n };\n }\n if (prop === \"terminate\") {\n return () => internal.terminate();\n }\n\n // \uADF8 \uC678\uB294 \uC6CC\uCEE4 \uBA54\uC11C\uB4DC\uB85C \uCC98\uB9AC\n return (...args: unknown[]) => internal.call(prop, args);\n },\n });\n },\n};\n\n//#endregion\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/core-node",
3
- "version": "13.0.0-beta.20",
3
+ "version": "13.0.0-beta.21",
4
4
  "description": "심플리즘 패키지 - 코어 모듈 (node)",
5
5
  "author": "김석래",
6
6
  "repository": {
@@ -21,6 +21,6 @@
21
21
  "consola": "^3.4.2",
22
22
  "glob": "^13.0.2",
23
23
  "tsx": "^4.21.0",
24
- "@simplysm/core-common": "13.0.0-beta.20"
24
+ "@simplysm/core-common": "13.0.0-beta.21"
25
25
  }
26
26
  }