@simplysm/sd-claude 14.0.47 → 14.0.49
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/{claude/references/sd-simplysm14/sd-claude/usage.md → README.md} +2 -2
- package/claude/rules/sd-claude-rules.md +25 -10
- package/claude/rules/sd-options.md +11 -6
- package/claude/sd-subagent-start.sh +6 -0
- package/claude/settings.json +1 -12
- package/claude/skills/sd-check/SKILL.md +43 -12
- package/claude/skills/sd-claude-docs/SKILL.md +30 -58
- package/claude/skills/sd-claude-docs/references/package-claudemd.md +12 -0
- package/claude/skills/sd-claude-docs/references/package-doc-gen.md +26 -13
- package/claude/skills/sd-commit/SKILL.md +1 -1
- package/claude/skills/sd-debug/SKILL.md +5 -3
- package/claude/skills/sd-deliverable/SKILL.md +1 -1
- package/claude/skills/sd-dev/SKILL.md +14 -9
- package/claude/skills/sd-doc-extract/SKILL.md +8 -10
- package/claude/skills/sd-doc-extract/_common.py +8 -1
- package/claude/skills/sd-doc-extract/_extract_docx.py +74 -34
- package/claude/skills/sd-doc-extract/_extract_pdf.py +12 -1
- package/claude/skills/sd-doc-extract/_extract_pptx.py +103 -23
- package/claude/skills/sd-doc-extract/_extract_xlsb.py +93 -4
- package/claude/skills/sd-doc-extract/_extract_xlsx.py +98 -36
- package/claude/skills/sd-doc-extract/extract.py +22 -3
- package/claude/skills/sd-inner-clarify/SKILL.md +78 -0
- package/claude/skills/sd-inner-debug/SKILL.md +1 -1
- package/claude/skills/sd-inner-review/SKILL.md +13 -0
- package/claude/skills/sd-issue/SKILL.md +1 -1
- package/claude/skills/sd-outlook/SKILL.md +1 -1
- package/claude/skills/sd-plan/SKILL.md +50 -17
- package/claude/skills/sd-prompt/SKILL.md +180 -178
- package/claude/skills/sd-prompt/references/eval-runner.md +5 -30
- package/claude/skills/sd-prompt/references/sd-eval-env-template.md +23 -0
- package/claude/skills/sd-refactor/SKILL.md +2 -2
- package/claude/skills/sd-tdd/SKILL.md +45 -16
- package/claude/skills/sd-use/SKILL.md +84 -80
- package/claude/skills/sd-wbs/SKILL.md +84 -27
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/assets.md +2 -3
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/hooks.md +7 -6
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/scripts.md +1 -9
- package/package.json +3 -2
- package/scripts/sync.mjs +4 -2
- package/claude/references/sd-simplysm14/angular/docs/bootstrap.md +0 -48
- package/claude/references/sd-simplysm14/angular/docs/directives.md +0 -236
- package/claude/references/sd-simplysm14/angular/docs/features.md +0 -379
- package/claude/references/sd-simplysm14/angular/docs/pipes.md +0 -32
- package/claude/references/sd-simplysm14/angular/docs/plugins.md +0 -37
- package/claude/references/sd-simplysm14/angular/docs/provider-types.md +0 -283
- package/claude/references/sd-simplysm14/angular/docs/providers.md +0 -379
- package/claude/references/sd-simplysm14/angular/docs/styling.md +0 -222
- package/claude/references/sd-simplysm14/angular/docs/type-utilities.md +0 -250
- package/claude/references/sd-simplysm14/angular/docs/ui-data.md +0 -275
- package/claude/references/sd-simplysm14/angular/docs/ui-form.md +0 -490
- package/claude/references/sd-simplysm14/angular/docs/ui-layout.md +0 -140
- package/claude/references/sd-simplysm14/angular/docs/ui-navigation.md +0 -273
- package/claude/references/sd-simplysm14/angular/docs/ui-overlay.md +0 -157
- package/claude/references/sd-simplysm14/angular/docs/ui-visual.md +0 -127
- package/claude/references/sd-simplysm14/angular/docs/utils.md +0 -295
- package/claude/references/sd-simplysm14/angular/usage.md +0 -489
- package/claude/references/sd-simplysm14/capacitor-plugin-auto-update/usage.md +0 -182
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/file-operations.md +0 -154
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/permissions.md +0 -84
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/storage-paths.md +0 -107
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/types.md +0 -83
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/usage.md +0 -133
- package/claude/references/sd-simplysm14/capacitor-plugin-intent/usage.md +0 -203
- package/claude/references/sd-simplysm14/capacitor-plugin-usb-storage/usage.md +0 -258
- package/claude/references/sd-simplysm14/core-browser/usage.md +0 -306
- package/claude/references/sd-simplysm14/core-common/docs/errors.md +0 -82
- package/claude/references/sd-simplysm14/core-common/docs/extensions.md +0 -167
- package/claude/references/sd-simplysm14/core-common/docs/features.md +0 -136
- package/claude/references/sd-simplysm14/core-common/docs/types.md +0 -245
- package/claude/references/sd-simplysm14/core-common/docs/utils.md +0 -591
- package/claude/references/sd-simplysm14/core-common/usage.md +0 -255
- package/claude/references/sd-simplysm14/core-node/docs/child-process.md +0 -182
- package/claude/references/sd-simplysm14/core-node/docs/features.md +0 -214
- package/claude/references/sd-simplysm14/core-node/docs/file-system.md +0 -509
- package/claude/references/sd-simplysm14/core-node/docs/file-watching.md +0 -139
- package/claude/references/sd-simplysm14/core-node/docs/logging.md +0 -180
- package/claude/references/sd-simplysm14/core-node/docs/path.md +0 -176
- package/claude/references/sd-simplysm14/core-node/docs/utilities-cpx.md +0 -194
- package/claude/references/sd-simplysm14/core-node/docs/utilities-fsx.md +0 -469
- package/claude/references/sd-simplysm14/core-node/docs/utilities-pathx.md +0 -151
- package/claude/references/sd-simplysm14/core-node/docs/worker-threads.md +0 -334
- package/claude/references/sd-simplysm14/core-node/docs/worker.md +0 -205
- package/claude/references/sd-simplysm14/core-node/usage.md +0 -259
- package/claude/references/sd-simplysm14/excel/docs/core-classes.md +0 -453
- package/claude/references/sd-simplysm14/excel/docs/types.md +0 -459
- package/claude/references/sd-simplysm14/excel/docs/utilities.md +0 -194
- package/claude/references/sd-simplysm14/excel/docs/wrapper.md +0 -73
- package/claude/references/sd-simplysm14/excel/usage.md +0 -134
- package/claude/references/sd-simplysm14/lint/usage.md +0 -130
- package/claude/references/sd-simplysm14/orm-common/docs/core.md +0 -188
- package/claude/references/sd-simplysm14/orm-common/docs/expression.md +0 -190
- package/claude/references/sd-simplysm14/orm-common/docs/models.md +0 -17
- package/claude/references/sd-simplysm14/orm-common/docs/query-builder.md +0 -97
- package/claude/references/sd-simplysm14/orm-common/docs/queryable-executable.md +0 -250
- package/claude/references/sd-simplysm14/orm-common/docs/schema-builders.md +0 -364
- package/claude/references/sd-simplysm14/orm-common/docs/types.md +0 -522
- package/claude/references/sd-simplysm14/orm-common/usage.md +0 -229
- package/claude/references/sd-simplysm14/orm-node/docs/connections.md +0 -137
- package/claude/references/sd-simplysm14/orm-node/docs/core.md +0 -131
- package/claude/references/sd-simplysm14/orm-node/docs/types.md +0 -173
- package/claude/references/sd-simplysm14/orm-node/usage.md +0 -143
- package/claude/references/sd-simplysm14/sd-cli/usage.md +0 -782
- package/claude/references/sd-simplysm14/service-client/docs/features.md +0 -217
- package/claude/references/sd-simplysm14/service-client/docs/main.md +0 -148
- package/claude/references/sd-simplysm14/service-client/docs/protocol.md +0 -53
- package/claude/references/sd-simplysm14/service-client/docs/transport.md +0 -131
- package/claude/references/sd-simplysm14/service-client/docs/types.md +0 -129
- package/claude/references/sd-simplysm14/service-client/usage.md +0 -202
- package/claude/references/sd-simplysm14/service-common/docs/app-structure.md +0 -175
- package/claude/references/sd-simplysm14/service-common/docs/events.md +0 -64
- package/claude/references/sd-simplysm14/service-common/docs/protocol.md +0 -331
- package/claude/references/sd-simplysm14/service-common/docs/service-types.md +0 -90
- package/claude/references/sd-simplysm14/service-common/docs/types.md +0 -19
- package/claude/references/sd-simplysm14/service-common/usage.md +0 -154
- package/claude/references/sd-simplysm14/service-server/docs/auth.md +0 -64
- package/claude/references/sd-simplysm14/service-server/docs/core.md +0 -174
- package/claude/references/sd-simplysm14/service-server/docs/legacy.md +0 -25
- package/claude/references/sd-simplysm14/service-server/docs/main.md +0 -88
- package/claude/references/sd-simplysm14/service-server/docs/protocol.md +0 -33
- package/claude/references/sd-simplysm14/service-server/docs/services.md +0 -94
- package/claude/references/sd-simplysm14/service-server/docs/transport-http.md +0 -93
- package/claude/references/sd-simplysm14/service-server/docs/transport-socket.md +0 -119
- package/claude/references/sd-simplysm14/service-server/docs/types.md +0 -36
- package/claude/references/sd-simplysm14/service-server/docs/utils.md +0 -22
- package/claude/references/sd-simplysm14/service-server/usage.md +0 -171
- package/claude/references/sd-simplysm14/storage/usage.md +0 -301
- package/claude/references/sd-simplysm14.md +0 -35
- package/claude/rules/sd-clarify.md +0 -23
- package/claude/sd-session-start.sh +0 -10
- /package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/cli.md +0 -0
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
# Worker Threads
|
|
2
|
-
|
|
3
|
-
## `Worker`
|
|
4
|
-
|
|
5
|
-
Worker thread 프록시를 생성하는 팩토리 객체.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
export const Worker: {
|
|
9
|
-
create<TModule extends WorkerModule>(
|
|
10
|
-
workerPath: string,
|
|
11
|
-
options?: Omit<WorkerRawOptions, "stdout" | "stderr">,
|
|
12
|
-
): WorkerProxy<TModule>
|
|
13
|
-
}
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
### Static Method
|
|
17
|
-
|
|
18
|
-
#### `create`
|
|
19
|
-
|
|
20
|
-
워커 파일을 로드하고 타입 안전한 프록시를 생성한다.
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
static create<TModule extends WorkerModule>(
|
|
24
|
-
workerPath: string,
|
|
25
|
-
options?: Omit<WorkerRawOptions, "stdout" | "stderr">,
|
|
26
|
-
): WorkerProxy<TModule>
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
| Parameter | Type | Description |
|
|
30
|
-
|-----------|------|-------------|
|
|
31
|
-
| `workerPath` | string | 워커 파일 경로 (.ts 또는 .js). 개발 환경에서는 .ts를 권장하며, 내부적으로 tsx를 통해 실행된다. |
|
|
32
|
-
| `options` | WorkerRawOptions (optional) | Worker thread 옵션. stdout/stderr는 자동으로 메인 프로세스로 파이프된다. |
|
|
33
|
-
|
|
34
|
-
**Return**: WorkerProxy<TModule> - 타입 안전한 워커 프록시
|
|
35
|
-
|
|
36
|
-
**Development vs Production**:
|
|
37
|
-
- **.ts 파일**: `lib/worker-dev-proxy.js`를 통해 tsx로 실행됨
|
|
38
|
-
- **.js 파일**: 직접 Worker로 로드됨
|
|
39
|
-
|
|
40
|
-
**Example**:
|
|
41
|
-
```typescript
|
|
42
|
-
import { Worker } from "@simplysm/core-node";
|
|
43
|
-
import type * as MyWorker from "./worker";
|
|
44
|
-
|
|
45
|
-
const worker = Worker.create<typeof MyWorker>("./worker.ts");
|
|
46
|
-
|
|
47
|
-
// 메서드 호출 (타입 안전)
|
|
48
|
-
const result = await worker.add(10, 20);
|
|
49
|
-
|
|
50
|
-
// 이벤트 수신 (타입 안전)
|
|
51
|
-
worker.on("progress", (value) => {
|
|
52
|
-
console.log(`Progress: ${value}%`);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
await worker.terminate();
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## `createWorker`
|
|
61
|
-
|
|
62
|
-
워커 측에서 호출하여 메서드와 이벤트를 등록하는 팩토리 함수.
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
export function createWorker<
|
|
66
|
-
TMethods extends Record<string, (...args: any[]) => unknown>,
|
|
67
|
-
TEvents extends Record<string, unknown> = Record<string, never>,
|
|
68
|
-
>(
|
|
69
|
-
methods: TMethods,
|
|
70
|
-
): {
|
|
71
|
-
send<TEventName extends keyof TEvents & string>(event: TEventName, data?: TEvents[TEventName]): void;
|
|
72
|
-
__methods: TMethods;
|
|
73
|
-
__events: TEvents;
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
| Parameter | Type | Description |
|
|
78
|
-
|-----------|------|-------------|
|
|
79
|
-
| `methods` | Record<string, function> | 워커가 제공할 메서드 객체 |
|
|
80
|
-
|
|
81
|
-
**Type Parameters**:
|
|
82
|
-
- `TMethods`: 메서드 타입
|
|
83
|
-
- `TEvents`: 이벤트 타입 (기본값: 빈 객체)
|
|
84
|
-
|
|
85
|
-
**Return**: sender 객체. `send()` 메서드로 이벤트를 발송하고, export default로 내보낸다.
|
|
86
|
-
|
|
87
|
-
**Example**:
|
|
88
|
-
```typescript
|
|
89
|
-
// worker.ts
|
|
90
|
-
import { createWorker } from "@simplysm/core-node";
|
|
91
|
-
|
|
92
|
-
interface MyEvents {
|
|
93
|
-
progress: number;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const methods = {
|
|
97
|
-
add: (a: number, b: number) => a + b,
|
|
98
|
-
multiply: (a: number, b: number) => a * b,
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const sender = createWorker<typeof methods, MyEvents>(methods);
|
|
102
|
-
|
|
103
|
-
export default sender;
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
## `WorkerProxy`
|
|
109
|
-
|
|
110
|
-
Worker.create()가 반환하는 프록시 타입.
|
|
111
|
-
|
|
112
|
-
Promise화된 메서드 + 이벤트 리스너 + 종료 메서드를 제공한다.
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
export type WorkerProxy<TModule extends WorkerModule> = PromisifyMethods<
|
|
116
|
-
TModule["default"]["__methods"]
|
|
117
|
-
> & {
|
|
118
|
-
on<TEventName extends keyof TModule["default"]["__events"] & string>(
|
|
119
|
-
event: TEventName,
|
|
120
|
-
listener: (data: TModule["default"]["__events"][TEventName]) => void,
|
|
121
|
-
): void;
|
|
122
|
-
|
|
123
|
-
off<TEventName extends keyof TModule["default"]["__events"] & string>(
|
|
124
|
-
event: TEventName,
|
|
125
|
-
listener: (data: TModule["default"]["__events"][TEventName]) => void,
|
|
126
|
-
): void;
|
|
127
|
-
|
|
128
|
-
terminate(): Promise<void>;
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Methods
|
|
133
|
-
|
|
134
|
-
| Name | Signature | Description |
|
|
135
|
-
|------|-----------|-------------|
|
|
136
|
-
| `[메서드명]` | `(...args): Promise<R>` | 워커의 메서드. 비동기로 Promise를 반환한다. |
|
|
137
|
-
| `on` | `<E extends EventName>(event, listener): void` | 워커 이벤트 리스너를 등록한다. |
|
|
138
|
-
| `off` | `<E extends EventName>(event, listener): void` | 워커 이벤트 리스너를 해제한다. |
|
|
139
|
-
| `terminate` | `(): Promise<void>` | 워커를 종료한다. |
|
|
140
|
-
|
|
141
|
-
**Example**:
|
|
142
|
-
```typescript
|
|
143
|
-
const worker = Worker.create<typeof MyWorker>("./worker.ts");
|
|
144
|
-
|
|
145
|
-
// 메서드 호출
|
|
146
|
-
const sum = await worker.add(10, 20); // 30
|
|
147
|
-
const product = await worker.multiply(5, 6); // 30
|
|
148
|
-
|
|
149
|
-
// 이벤트 리스너 등록
|
|
150
|
-
worker.on("progress", (value) => {
|
|
151
|
-
console.log(`Progress: ${value}%`);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// 이벤트 리스너 제거
|
|
155
|
-
worker.off("progress", handler);
|
|
156
|
-
|
|
157
|
-
// 워커 종료
|
|
158
|
-
await worker.terminate();
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## `PromisifyMethods`
|
|
164
|
-
|
|
165
|
-
메서드의 반환값을 Promise로 감싸는 매핑 타입.
|
|
166
|
-
|
|
167
|
-
```typescript
|
|
168
|
-
export type PromisifyMethods<TMethods> = {
|
|
169
|
-
[K in keyof TMethods]: TMethods[K] extends (...args: infer P) => infer R
|
|
170
|
-
? (...args: P) => Promise<Awaited<R>>
|
|
171
|
-
: never;
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
**Note**: 워커 메서드는 postMessage 기반으로 동작하여 항상 비동기이므로, 동기 메서드 타입도 `Promise<Awaited<R>>`로 변환된다.
|
|
176
|
-
|
|
177
|
-
**Example**:
|
|
178
|
-
```typescript
|
|
179
|
-
// 원본
|
|
180
|
-
interface Methods {
|
|
181
|
-
add: (a: number, b: number) => number;
|
|
182
|
-
process: (data: string) => Promise<Result>;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// PromisifyMethods 적용 후
|
|
186
|
-
type ProxiedMethods = {
|
|
187
|
-
add: (a: number, b: number) => Promise<number>;
|
|
188
|
-
process: (data: string) => Promise<Result>;
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## `WorkerModule`
|
|
195
|
-
|
|
196
|
-
createWorker()가 반환하는 워커 모듈의 타입 구조.
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
export interface WorkerModule {
|
|
200
|
-
default: {
|
|
201
|
-
__methods: Record<string, (...args: any[]) => unknown>;
|
|
202
|
-
__events: Record<string, unknown>;
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
**Usage**:
|
|
208
|
-
```typescript
|
|
209
|
-
import type * as MyWorker from "./worker";
|
|
210
|
-
|
|
211
|
-
const worker = Worker.create<typeof MyWorker>("./worker.ts");
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## `WorkerRequest`
|
|
217
|
-
|
|
218
|
-
메인 프로세스에서 워커로 보내는 요청 메시지.
|
|
219
|
-
|
|
220
|
-
```typescript
|
|
221
|
-
export interface WorkerRequest {
|
|
222
|
-
id: string;
|
|
223
|
-
method: string;
|
|
224
|
-
params: unknown[];
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
| Field | Type | Description |
|
|
229
|
-
|-------|------|-------------|
|
|
230
|
-
| `id` | string | 요청의 고유 ID (응답과 매칭하는 데 사용) |
|
|
231
|
-
| `method` | string | 호출할 메서드명 |
|
|
232
|
-
| `params` | unknown[] | 메서드 인자 배열 |
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## `WorkerResponse`
|
|
237
|
-
|
|
238
|
-
워커에서 메인 프로세스로 보내는 응답 메시지.
|
|
239
|
-
|
|
240
|
-
Discriminated union 타입으로, 다음 중 하나의 형태를 가진다:
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
export type WorkerResponse =
|
|
244
|
-
| {
|
|
245
|
-
request: WorkerRequest;
|
|
246
|
-
type: "return";
|
|
247
|
-
body?: unknown;
|
|
248
|
-
}
|
|
249
|
-
| {
|
|
250
|
-
request: WorkerRequest;
|
|
251
|
-
type: "error";
|
|
252
|
-
body: Error;
|
|
253
|
-
}
|
|
254
|
-
| {
|
|
255
|
-
type: "event";
|
|
256
|
-
event: string;
|
|
257
|
-
body?: unknown;
|
|
258
|
-
}
|
|
259
|
-
| {
|
|
260
|
-
type: "log";
|
|
261
|
-
body: string;
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
| Variant | Description |
|
|
266
|
-
|---------|-------------|
|
|
267
|
-
| `return` | 메서드 실행 성공 결과 |
|
|
268
|
-
| `error` | 메서드 실행 중 에러 발생 |
|
|
269
|
-
| `event` | 워커에서 발송한 이벤트 (request 없음, event 이름과 body 포함) |
|
|
270
|
-
| `log` | 워커의 stdout.write 출력 (string body) |
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
## Complete Example
|
|
275
|
-
|
|
276
|
-
### worker.ts (워커 파일)
|
|
277
|
-
|
|
278
|
-
```typescript
|
|
279
|
-
import { createWorker } from "@simplysm/core-node";
|
|
280
|
-
|
|
281
|
-
interface MyEvents {
|
|
282
|
-
progress: number;
|
|
283
|
-
done: { result: number };
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const methods = {
|
|
287
|
-
compute: async (n: number) => {
|
|
288
|
-
const sender = createWorker<typeof methods, MyEvents>(methods);
|
|
289
|
-
|
|
290
|
-
let result = 0;
|
|
291
|
-
for (let i = 0; i <= n; i++) {
|
|
292
|
-
result += i;
|
|
293
|
-
// 진행률 보고
|
|
294
|
-
sender.send("progress", (i / n) * 100);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
sender.send("done", { result });
|
|
298
|
-
return result;
|
|
299
|
-
},
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
const sender = createWorker<typeof methods, MyEvents>(methods);
|
|
303
|
-
export default sender;
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
### main.ts (메인 파일)
|
|
307
|
-
|
|
308
|
-
```typescript
|
|
309
|
-
import { Worker } from "@simplysm/core-node";
|
|
310
|
-
import type * as MyWorker from "./worker";
|
|
311
|
-
|
|
312
|
-
async function main() {
|
|
313
|
-
const worker = Worker.create<typeof MyWorker>("./worker.ts");
|
|
314
|
-
|
|
315
|
-
// 진행률 수신
|
|
316
|
-
worker.on("progress", (value) => {
|
|
317
|
-
console.log(`Progress: ${value.toFixed(1)}%`);
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
// 완료 신호 수신
|
|
321
|
-
worker.on("done", ({ result }) => {
|
|
322
|
-
console.log(`Done! Result: ${result}`);
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
// 메서드 호출
|
|
326
|
-
const result = await worker.compute(100);
|
|
327
|
-
console.log(`Final result: ${result}`);
|
|
328
|
-
|
|
329
|
-
// 워커 종료
|
|
330
|
-
await worker.terminate();
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
main().catch(console.error);
|
|
334
|
-
```
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
# Worker
|
|
2
|
-
|
|
3
|
-
타입 안전한 Worker thread 래퍼. 워커 측(`createWorker`)과 메인 측(`Worker.create`) 한 쌍으로 구성된다.
|
|
4
|
-
|
|
5
|
-
개발 환경(`.ts` 파일)에서는 `lib/worker-dev-proxy.js`를 통해 tsx로 TypeScript 워커를 실행한다. 프로덕션(`.js` 파일)에서는 직접 Worker를 생성한다.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## `WorkerModule`
|
|
10
|
-
|
|
11
|
-
`createWorker()`가 반환하는 워커 모듈의 타입 구조. `Worker.create<typeof import("./worker")>()`에서 타입 추론에 사용된다.
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
export interface WorkerModule {
|
|
15
|
-
default: {
|
|
16
|
-
__methods: Record<string, (...args: any[]) => unknown>;
|
|
17
|
-
__events: Record<string, unknown>;
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
| Field | Type | Description |
|
|
23
|
-
|-------|------|-------------|
|
|
24
|
-
| `default.__methods` | `Record<string, (...args: any[]) => unknown>` | 워커가 노출하는 메서드 맵 |
|
|
25
|
-
| `default.__events` | `Record<string, unknown>` | 워커가 emit할 수 있는 이벤트와 데이터 타입 맵 |
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## `PromisifyMethods`
|
|
30
|
-
|
|
31
|
-
메서드 반환값을 Promise로 감싸는 매핑 타입. 워커 메서드는 postMessage 기반으로 동작하여 항상 비동기이므로, 동기 메서드 타입도 `Promise<Awaited<R>>`로 변환된다.
|
|
32
|
-
|
|
33
|
-
```typescript
|
|
34
|
-
export type PromisifyMethods<TMethods> = {
|
|
35
|
-
[K in keyof TMethods]: TMethods[K] extends (...args: infer P) => infer R
|
|
36
|
-
? (...args: P) => Promise<Awaited<R>>
|
|
37
|
-
: never;
|
|
38
|
-
};
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## `WorkerProxy`
|
|
44
|
-
|
|
45
|
-
`Worker.create()`가 반환하는 프록시 타입. Promise화된 메서드 + `on()` + `off()` + `terminate()`를 제공한다.
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
export type WorkerProxy<TModule extends WorkerModule> = PromisifyMethods<
|
|
49
|
-
TModule["default"]["__methods"]
|
|
50
|
-
> & {
|
|
51
|
-
on<TEventName extends keyof TModule["default"]["__events"] & string>(
|
|
52
|
-
event: TEventName,
|
|
53
|
-
listener: (data: TModule["default"]["__events"][TEventName]) => void,
|
|
54
|
-
): void;
|
|
55
|
-
|
|
56
|
-
off<TEventName extends keyof TModule["default"]["__events"] & string>(
|
|
57
|
-
event: TEventName,
|
|
58
|
-
listener: (data: TModule["default"]["__events"][TEventName]) => void,
|
|
59
|
-
): void;
|
|
60
|
-
|
|
61
|
-
terminate(): Promise<void>;
|
|
62
|
-
};
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
| Member | Description |
|
|
66
|
-
|--------|-------------|
|
|
67
|
-
| 메서드들 | 워커 메서드를 Promise화한 버전. 타입 안전하게 호출 가능 |
|
|
68
|
-
| `on(event, listener)` | 워커 이벤트 리스너를 등록한다 |
|
|
69
|
-
| `off(event, listener)` | 워커 이벤트 리스너를 해제한다 |
|
|
70
|
-
| `terminate()` | 워커를 종료한다 |
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## `WorkerRequest`
|
|
75
|
-
|
|
76
|
-
내부 워커 요청 메시지. 메인 스레드 → 워커 방향.
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
export interface WorkerRequest {
|
|
80
|
-
id: string;
|
|
81
|
-
method: string;
|
|
82
|
-
params: unknown[];
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
| Field | Type | Description |
|
|
87
|
-
|-------|------|-------------|
|
|
88
|
-
| `id` | `string` | 요청 식별자 (UUID) |
|
|
89
|
-
| `method` | `string` | 호출할 메서드 이름 |
|
|
90
|
-
| `params` | `unknown[]` | 메서드 인수 |
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## `WorkerResponse`
|
|
95
|
-
|
|
96
|
-
내부 워커 응답 메시지. 워커 → 메인 스레드 방향. `type` 필드로 분기되는 discriminated union이다.
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
export type WorkerResponse =
|
|
100
|
-
| { request: WorkerRequest; type: "return"; body?: unknown }
|
|
101
|
-
| { request: WorkerRequest; type: "error"; body: Error }
|
|
102
|
-
| { type: "event"; event: string; body?: unknown }
|
|
103
|
-
| { type: "log"; body: string };
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
| Variant (`type`) | Fields | Description |
|
|
107
|
-
|------------------|--------|-------------|
|
|
108
|
-
| `"return"` | `request`, `body?` | 메서드 정상 반환 |
|
|
109
|
-
| `"error"` | `request`, `body: Error` | 메서드 에러 반환 |
|
|
110
|
-
| `"event"` | `event: string`, `body?` | 워커 이벤트 발행 |
|
|
111
|
-
| `"log"` | `body: string` | 워커 stdout 로그 전달 |
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## `Worker`
|
|
116
|
-
|
|
117
|
-
타입 안전한 Worker Proxy 생성 팩토리 객체.
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
export const Worker: {
|
|
121
|
-
create<TModule extends WorkerModule>(
|
|
122
|
-
filePath: string,
|
|
123
|
-
opt?: Omit<WorkerRawOptions, "stdout" | "stderr">,
|
|
124
|
-
): WorkerProxy<TModule>;
|
|
125
|
-
};
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### `Worker.create`
|
|
129
|
-
|
|
130
|
-
타입 안전한 Worker Proxy를 생성한다.
|
|
131
|
-
|
|
132
|
-
| Parameter | Type | Description |
|
|
133
|
-
|-----------|------|-------------|
|
|
134
|
-
| `filePath` | `string` | 워커 파일 경로 (`file://` URL 또는 절대 경로) |
|
|
135
|
-
| `opt` | `Omit<WorkerRawOptions, "stdout" \| "stderr">` | 워커 옵션 (`stdout`/`stderr`는 항상 pipe) |
|
|
136
|
-
|
|
137
|
-
**반환**: `WorkerProxy<TModule>` — 메서드 직접 호출, `on()`, `off()`, `terminate()` 지원
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
import { Worker } from "@simplysm/core-node";
|
|
141
|
-
import type * as MyWorker from "./worker";
|
|
142
|
-
|
|
143
|
-
const worker = Worker.create<typeof MyWorker>("./worker.ts");
|
|
144
|
-
|
|
145
|
-
worker.on("progress", (value) => { /* ... */ });
|
|
146
|
-
const result = await worker.add(10, 20); // 30
|
|
147
|
-
await worker.terminate();
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## `createWorker`
|
|
153
|
-
|
|
154
|
-
Worker thread에서 사용하기 위한 워커 팩토리. 메서드와 이벤트를 등록하고, 메인 스레드로 이벤트를 전송하는 `send()` 함수를 포함하는 객체를 반환한다.
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
export function createWorker<
|
|
158
|
-
TMethods extends Record<string, (...args: any[]) => unknown>,
|
|
159
|
-
TEvents extends Record<string, unknown> = Record<string, never>,
|
|
160
|
-
>(
|
|
161
|
-
methods: TMethods,
|
|
162
|
-
): {
|
|
163
|
-
send<TEventName extends keyof TEvents & string>(event: TEventName, data?: TEvents[TEventName]): void;
|
|
164
|
-
__methods: TMethods;
|
|
165
|
-
__events: TEvents;
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
| Parameter | Type | Description |
|
|
170
|
-
|-----------|------|-------------|
|
|
171
|
-
| `methods` | `TMethods` | 메인 스레드에서 호출할 수 있는 메서드 맵 |
|
|
172
|
-
|
|
173
|
-
**반환 객체**:
|
|
174
|
-
|
|
175
|
-
| Member | Description |
|
|
176
|
-
|--------|-------------|
|
|
177
|
-
| `send(event, data?)` | 메인 스레드로 이벤트를 전송한다 |
|
|
178
|
-
| `__methods` | 등록된 메서드 맵 (타입 추론용) |
|
|
179
|
-
| `__events` | 이벤트 타입 맵 (타입 추론용) |
|
|
180
|
-
|
|
181
|
-
**Throws**: `parentPort`가 `null`이면 `SdError`를 던진다 (Worker thread 외부에서 호출 시).
|
|
182
|
-
|
|
183
|
-
```typescript
|
|
184
|
-
// worker.ts — 이벤트 없는 워커
|
|
185
|
-
import { createWorker } from "@simplysm/core-node";
|
|
186
|
-
|
|
187
|
-
export default createWorker({
|
|
188
|
-
add: (a: number, b: number) => a + b,
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
// worker.ts — 이벤트가 있는 워커
|
|
192
|
-
import { createWorker } from "@simplysm/core-node";
|
|
193
|
-
|
|
194
|
-
interface MyEvents { progress: number; }
|
|
195
|
-
|
|
196
|
-
const methods = {
|
|
197
|
-
calc: (x: number) => {
|
|
198
|
-
sender.send("progress", 50);
|
|
199
|
-
return x * 2;
|
|
200
|
-
},
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
const sender = createWorker<typeof methods, MyEvents>(methods);
|
|
204
|
-
export default sender;
|
|
205
|
-
```
|