@simplysm/sd-claude 14.0.46 → 14.0.48
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 +27 -9
- 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 +18 -9
- package/claude/skills/sd-claude-docs/SKILL.md +29 -58
- package/claude/skills/sd-claude-docs/references/package-claudemd.md +12 -0
- package/claude/skills/sd-claude-docs/references/package-doc-gen.md +22 -12
- package/claude/skills/sd-debug/SKILL.md +5 -3
- package/claude/skills/sd-deliverable/SKILL.md +0 -1
- package/claude/skills/sd-dev/SKILL.md +14 -9
- package/claude/skills/sd-doc-extract/SKILL.md +7 -9
- 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-plan/SKILL.md +50 -17
- package/claude/skills/sd-prompt/SKILL.md +180 -178
- package/claude/skills/sd-prompt/references/eval-runner.md +5 -31
- 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 +46 -10
- package/claude/skills/sd-use/SKILL.md +84 -80
- package/claude/skills/sd-wbs/SKILL.md +85 -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 -370
- 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 -241
- 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 -443
- package/claude/references/sd-simplysm14/excel/docs/types.md +0 -455
- 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,331 +0,0 @@
|
|
|
1
|
-
# Protocol
|
|
2
|
-
|
|
3
|
-
## `PROTOCOL_CONFIG`
|
|
4
|
-
|
|
5
|
-
서비스 프로토콜 설정 상수.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
export const PROTOCOL_CONFIG = {
|
|
9
|
-
MAX_TOTAL_SIZE: 100 * 1024 * 1024, // 최대 메시지 크기 (100MB)
|
|
10
|
-
SPLIT_MESSAGE_SIZE: 3 * 1024 * 1024, // 청킹 임계값 (3MB)
|
|
11
|
-
CHUNK_SIZE: 300 * 1024, // 청크 크기 (300KB)
|
|
12
|
-
GC_INTERVAL: 10 * 1000, // GC 주기 (10초)
|
|
13
|
-
EXPIRE_TIME: 60 * 1000, // 미완성 메시지 만료 시간 (60초)
|
|
14
|
-
} as const;
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
| Field | Type | Description |
|
|
18
|
-
|-------|------|-------------|
|
|
19
|
-
| `MAX_TOTAL_SIZE` | `number` | 단일 메시지의 최대 허용 크기. 초과 시 `ArgumentError` 발생 |
|
|
20
|
-
| `SPLIT_MESSAGE_SIZE` | `number` | 이 크기를 초과하면 자동으로 청크 분할 |
|
|
21
|
-
| `CHUNK_SIZE` | `number` | 분할된 각 청크의 크기 |
|
|
22
|
-
| `GC_INTERVAL` | `number` | 내부 청크 누적기의 가비지 컬렉션 주기 (밀리초) |
|
|
23
|
-
| `EXPIRE_TIME` | `number` | 미완성 청크 메시지의 만료 시간. 이 시간 내에 모든 청크가 도착하지 않으면 제거 |
|
|
24
|
-
|
|
25
|
-
## `ServiceMessage`
|
|
26
|
-
|
|
27
|
-
모든 서비스 메시지의 유니언 타입. 클라이언트·서버 양방향 메시지를 모두 포함한다.
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
export type ServiceMessage =
|
|
31
|
-
| ServiceRequestMessage
|
|
32
|
-
| ServiceAuthMessage
|
|
33
|
-
| ServiceProgressMessage
|
|
34
|
-
| ServiceResponseMessage
|
|
35
|
-
| ServiceErrorMessage
|
|
36
|
-
| ServiceAddEventListenerMessage
|
|
37
|
-
| ServiceRemoveEventListenerMessage
|
|
38
|
-
| ServiceGetEventListenerInfosMessage
|
|
39
|
-
| ServiceEmitEventMessage
|
|
40
|
-
| ServiceEventMessage;
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## `ServiceServerMessage`
|
|
44
|
-
|
|
45
|
-
서버 → 클라이언트 메시지 유니언.
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
export type ServiceServerMessage =
|
|
49
|
-
| ServiceResponseMessage
|
|
50
|
-
| ServiceErrorMessage
|
|
51
|
-
| ServiceEventMessage;
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## `ServiceServerRawMessage`
|
|
55
|
-
|
|
56
|
-
서버가 보내는 모든 메시지 (진행 상태 포함).
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
export type ServiceServerRawMessage = ServiceProgressMessage | ServiceServerMessage;
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## `ServiceClientMessage`
|
|
63
|
-
|
|
64
|
-
클라이언트 → 서버 메시지 유니언.
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
export type ServiceClientMessage =
|
|
68
|
-
| ServiceRequestMessage
|
|
69
|
-
| ServiceAuthMessage
|
|
70
|
-
| ServiceAddEventListenerMessage
|
|
71
|
-
| ServiceRemoveEventListenerMessage
|
|
72
|
-
| ServiceGetEventListenerInfosMessage
|
|
73
|
-
| ServiceEmitEventMessage;
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## `ServiceProgressMessage`
|
|
77
|
-
|
|
78
|
-
서버가 보내는 청크 수신 진행 상태 알림 메시지.
|
|
79
|
-
|
|
80
|
-
```typescript
|
|
81
|
-
export interface ServiceProgressMessage {
|
|
82
|
-
name: "progress";
|
|
83
|
-
body: {
|
|
84
|
-
totalSize: number;
|
|
85
|
-
completedSize: number;
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
| Field | Type | Description |
|
|
91
|
-
|-------|------|-------------|
|
|
92
|
-
| `name` | `"progress"` | 고정 문자열 discriminant |
|
|
93
|
-
| `body.totalSize` | `number` | 전체 메시지 크기 (바이트) |
|
|
94
|
-
| `body.completedSize` | `number` | 현재까지 수신 완료된 크기 (바이트) |
|
|
95
|
-
|
|
96
|
-
## `ServiceErrorMessage`
|
|
97
|
-
|
|
98
|
-
서버가 보내는 에러 알림 메시지.
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
export interface ServiceErrorMessage {
|
|
102
|
-
name: "error";
|
|
103
|
-
body: {
|
|
104
|
-
name: string;
|
|
105
|
-
message: string;
|
|
106
|
-
code: string;
|
|
107
|
-
stack?: string;
|
|
108
|
-
detail?: unknown;
|
|
109
|
-
cause?: unknown;
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
| Field | Type | Description |
|
|
115
|
-
|-------|------|-------------|
|
|
116
|
-
| `name` | `"error"` | 고정 문자열 discriminant |
|
|
117
|
-
| `body.name` | `string` | 에러 이름 (클래스명) |
|
|
118
|
-
| `body.message` | `string` | 에러 메시지 |
|
|
119
|
-
| `body.code` | `string` | 에러 코드 |
|
|
120
|
-
| `body.stack` | `string?` | 스택 트레이스 (선택) |
|
|
121
|
-
| `body.detail` | `unknown?` | 추가 상세 정보 (선택) |
|
|
122
|
-
| `body.cause` | `unknown?` | 원인 에러 (선택) |
|
|
123
|
-
|
|
124
|
-
## `ServiceAuthMessage`
|
|
125
|
-
|
|
126
|
-
클라이언트가 보내는 인증 메시지.
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
export interface ServiceAuthMessage {
|
|
130
|
-
name: "auth";
|
|
131
|
-
body: string;
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
| Field | Type | Description |
|
|
136
|
-
|-------|------|-------------|
|
|
137
|
-
| `name` | `"auth"` | 고정 문자열 discriminant |
|
|
138
|
-
| `body` | `string` | 인증 토큰 |
|
|
139
|
-
|
|
140
|
-
## `ServiceRequestMessage`
|
|
141
|
-
|
|
142
|
-
클라이언트가 보내는 서비스 메서드 요청 메시지.
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
export interface ServiceRequestMessage {
|
|
146
|
-
name: `${string}.${string}`;
|
|
147
|
-
body: unknown[];
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
| Field | Type | Description |
|
|
152
|
-
|-------|------|-------------|
|
|
153
|
-
| `name` | `` `${string}.${string}` `` | 서비스명.메서드명 형식 (예: `"OrmService.connect"`) |
|
|
154
|
-
| `body` | `unknown[]` | 메서드 매개변수 배열 |
|
|
155
|
-
|
|
156
|
-
## `ServiceResponseMessage`
|
|
157
|
-
|
|
158
|
-
서버가 보내는 서비스 메서드 응답 메시지.
|
|
159
|
-
|
|
160
|
-
```typescript
|
|
161
|
-
export interface ServiceResponseMessage {
|
|
162
|
-
name: "response";
|
|
163
|
-
body?: unknown;
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
| Field | Type | Description |
|
|
168
|
-
|-------|------|-------------|
|
|
169
|
-
| `name` | `"response"` | 고정 문자열 discriminant |
|
|
170
|
-
| `body` | `unknown?` | 메서드 실행 결과 (없으면 void) |
|
|
171
|
-
|
|
172
|
-
## `ServiceAddEventListenerMessage`
|
|
173
|
-
|
|
174
|
-
클라이언트가 보내는 이벤트 리스너 추가 메시지.
|
|
175
|
-
|
|
176
|
-
```typescript
|
|
177
|
-
export interface ServiceAddEventListenerMessage {
|
|
178
|
-
name: "evt:add";
|
|
179
|
-
body: {
|
|
180
|
-
key: string;
|
|
181
|
-
name: string;
|
|
182
|
-
info: unknown;
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
| Field | Type | Description |
|
|
188
|
-
|-------|------|-------------|
|
|
189
|
-
| `name` | `"evt:add"` | 고정 문자열 discriminant |
|
|
190
|
-
| `body.key` | `string` | 리스너 키 (UUID). removeEventListener에 사용 |
|
|
191
|
-
| `body.name` | `string` | 이벤트 이름 (`ServiceEventDef.eventName`) |
|
|
192
|
-
| `body.info` | `unknown` | 이벤트 발생 시 필터링을 위한 추가 리스너 정보 |
|
|
193
|
-
|
|
194
|
-
## `ServiceRemoveEventListenerMessage`
|
|
195
|
-
|
|
196
|
-
클라이언트가 보내는 이벤트 리스너 제거 메시지.
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
export interface ServiceRemoveEventListenerMessage {
|
|
200
|
-
name: "evt:remove";
|
|
201
|
-
body: {
|
|
202
|
-
key: string;
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
| Field | Type | Description |
|
|
208
|
-
|-------|------|-------------|
|
|
209
|
-
| `name` | `"evt:remove"` | 고정 문자열 discriminant |
|
|
210
|
-
| `body.key` | `string` | 제거할 리스너 키 (UUID) |
|
|
211
|
-
|
|
212
|
-
## `ServiceGetEventListenerInfosMessage`
|
|
213
|
-
|
|
214
|
-
클라이언트가 보내는 이벤트 리스너 정보 목록 요청 메시지.
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
export interface ServiceGetEventListenerInfosMessage {
|
|
218
|
-
name: "evt:gets";
|
|
219
|
-
body: {
|
|
220
|
-
name: string;
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
| Field | Type | Description |
|
|
226
|
-
|-------|------|-------------|
|
|
227
|
-
| `name` | `"evt:gets"` | 고정 문자열 discriminant |
|
|
228
|
-
| `body.name` | `string` | 조회할 이벤트 이름 |
|
|
229
|
-
|
|
230
|
-
## `ServiceEmitEventMessage`
|
|
231
|
-
|
|
232
|
-
클라이언트가 보내는 이벤트 발생 메시지.
|
|
233
|
-
|
|
234
|
-
```typescript
|
|
235
|
-
export interface ServiceEmitEventMessage {
|
|
236
|
-
name: "evt:emit";
|
|
237
|
-
body: {
|
|
238
|
-
keys: string[];
|
|
239
|
-
data: unknown;
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
| Field | Type | Description |
|
|
245
|
-
|-------|------|-------------|
|
|
246
|
-
| `name` | `"evt:emit"` | 고정 문자열 discriminant |
|
|
247
|
-
| `body.keys` | `string[]` | 대상 리스너 키 목록 |
|
|
248
|
-
| `body.data` | `unknown` | 이벤트 데이터 |
|
|
249
|
-
|
|
250
|
-
## `ServiceEventMessage`
|
|
251
|
-
|
|
252
|
-
서버가 보내는 이벤트 알림 메시지.
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
export interface ServiceEventMessage {
|
|
256
|
-
name: "evt:on";
|
|
257
|
-
body: {
|
|
258
|
-
keys: string[];
|
|
259
|
-
data: unknown;
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
| Field | Type | Description |
|
|
265
|
-
|-------|------|-------------|
|
|
266
|
-
| `name` | `"evt:on"` | 고정 문자열 discriminant |
|
|
267
|
-
| `body.keys` | `string[]` | 대상 리스너 키 목록 |
|
|
268
|
-
| `body.data` | `unknown` | 이벤트 데이터 |
|
|
269
|
-
|
|
270
|
-
## `ServiceProtocol`
|
|
271
|
-
|
|
272
|
-
바이너리 프로토콜 V2 인코더/디코더 인터페이스. `createServiceProtocol()`로 생성한다.
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
export interface ServiceProtocol {
|
|
276
|
-
encode(uuid: string, message: ServiceMessage): { chunks: Bytes[]; totalSize: number };
|
|
277
|
-
decode<T extends ServiceMessage>(bytes: Bytes): ServiceMessageDecodeResult<T>;
|
|
278
|
-
dispose(): void;
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
| Method | Parameters | Return | Description |
|
|
283
|
-
|--------|-----------|--------|-------------|
|
|
284
|
-
| `encode` | `uuid: string, message: ServiceMessage` | `{ chunks: Bytes[]; totalSize: number }` | 메시지를 인코딩한다. 3MB 초과 시 300KB 청크로 자동 분할 |
|
|
285
|
-
| `decode` | `bytes: Bytes` | `ServiceMessageDecodeResult<T>` | 청크를 디코딩한다. 청크가 모두 도착하면 complete, 아니면 progress 반환 |
|
|
286
|
-
| `dispose` | 없음 | `void` | 내부 GC 타이머와 청크 누적기를 해제한다. 사용 후 반드시 호출 |
|
|
287
|
-
|
|
288
|
-
헤더 구조 (28바이트, Big Endian):
|
|
289
|
-
|
|
290
|
-
| Offset | Size | Field |
|
|
291
|
-
|--------|------|-------|
|
|
292
|
-
| 0 | 16 | UUID (바이너리) |
|
|
293
|
-
| 16 | 8 | TotalSize (uint64, 상위 4바이트 = 0) |
|
|
294
|
-
| 24 | 4 | Index (uint32) |
|
|
295
|
-
|
|
296
|
-
## `ServiceMessageDecodeResult`
|
|
297
|
-
|
|
298
|
-
메시지 디코딩 결과 유니언 타입. `type` 필드로 분기한다.
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
export type ServiceMessageDecodeResult<TMessage extends ServiceMessage> =
|
|
302
|
-
| { type: "complete"; uuid: string; message: TMessage }
|
|
303
|
-
| { type: "progress"; uuid: string; totalSize: number; completedSize: number };
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
**Variant: `complete`** — 모든 청크가 도착하여 메시지 재조립이 완료된 상태.
|
|
307
|
-
|
|
308
|
-
| Field | Type | Description |
|
|
309
|
-
|-------|------|-------------|
|
|
310
|
-
| `type` | `"complete"` | discriminant |
|
|
311
|
-
| `uuid` | `string` | 메시지 UUID |
|
|
312
|
-
| `message` | `TMessage` | 재조립된 메시지 |
|
|
313
|
-
|
|
314
|
-
**Variant: `progress`** — 청크 메시지 수신 진행 중.
|
|
315
|
-
|
|
316
|
-
| Field | Type | Description |
|
|
317
|
-
|-------|------|-------------|
|
|
318
|
-
| `type` | `"progress"` | discriminant |
|
|
319
|
-
| `uuid` | `string` | 메시지 UUID |
|
|
320
|
-
| `totalSize` | `number` | 전체 크기 (바이트) |
|
|
321
|
-
| `completedSize` | `number` | 수신 완료된 크기 (바이트) |
|
|
322
|
-
|
|
323
|
-
## `createServiceProtocol`
|
|
324
|
-
|
|
325
|
-
ServiceProtocol 인스턴스를 생성하는 팩토리 함수.
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
export function createServiceProtocol(): ServiceProtocol;
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
내부에 `LazyGcMap` 기반 청크 누적기를 캡슐화한다. 미완성 메시지는 60초 후 GC로 자동 정리된다. 사용 후 반드시 `dispose()`를 호출하여 GC 타이머를 해제해야 한다.
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
# Service Types
|
|
2
|
-
|
|
3
|
-
## `OrmService`
|
|
4
|
-
|
|
5
|
-
데이터베이스 연결, 트랜잭션 관리, 쿼리 실행을 제공하는 서비스 인터페이스. MySQL, MSSQL, PostgreSQL을 지원한다. 이 패키지에는 구현체가 없으며, 서버(`service-server`)와 클라이언트(`service-client`)가 공유하는 타입 계약이다.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
export interface OrmService {
|
|
9
|
-
getInfo(opt: DbConnOptions & { configName: string }): Promise<{
|
|
10
|
-
dialect: Dialect;
|
|
11
|
-
database?: string;
|
|
12
|
-
schema?: string;
|
|
13
|
-
}>;
|
|
14
|
-
connect(opt: DbConnOptions & { configName: string }): Promise<number>;
|
|
15
|
-
close(connId: number): Promise<void>;
|
|
16
|
-
beginTransaction(connId: number, isolationLevel?: IsolationLevel): Promise<void>;
|
|
17
|
-
commitTransaction(connId: number): Promise<void>;
|
|
18
|
-
rollbackTransaction(connId: number): Promise<void>;
|
|
19
|
-
executeParametrized(connId: number, query: string, params?: unknown[]): Promise<unknown[][]>;
|
|
20
|
-
executeDefs(
|
|
21
|
-
connId: number,
|
|
22
|
-
defs: QueryDef[],
|
|
23
|
-
options?: (ResultMeta | undefined)[],
|
|
24
|
-
): Promise<unknown[][]>;
|
|
25
|
-
bulkInsert(
|
|
26
|
-
connId: number,
|
|
27
|
-
tableName: string,
|
|
28
|
-
columnDefs: Record<string, ColumnMeta>,
|
|
29
|
-
records: Record<string, unknown>[],
|
|
30
|
-
): Promise<void>;
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
| Method | Parameters | Return | Description |
|
|
35
|
-
|--------|-----------|--------|-------------|
|
|
36
|
-
| `getInfo` | `opt: DbConnOptions & { configName: string }` | `Promise<{ dialect, database?, schema? }>` | DB 연결 정보 (dialect, database, schema) 조회 |
|
|
37
|
-
| `connect` | `opt: DbConnOptions & { configName: string }` | `Promise<number>` | DB 연결을 생성하고 연결 ID 반환 |
|
|
38
|
-
| `close` | `connId: number` | `Promise<void>` | 연결 종료 |
|
|
39
|
-
| `beginTransaction` | `connId: number, isolationLevel?: IsolationLevel` | `Promise<void>` | 트랜잭션 시작 |
|
|
40
|
-
| `commitTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 커밋 |
|
|
41
|
-
| `rollbackTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 롤백 |
|
|
42
|
-
| `executeParametrized` | `connId: number, query: string, params?: unknown[]` | `Promise<unknown[][]>` | 파라미터 바인딩 쿼리 실행 |
|
|
43
|
-
| `executeDefs` | `connId: number, defs: QueryDef[], options?: (ResultMeta \| undefined)[]` | `Promise<unknown[][]>` | QueryDef 배열로 쿼리 실행 |
|
|
44
|
-
| `bulkInsert` | `connId: number, tableName: string, columnDefs: Record<string, ColumnMeta>, records: Record<string, unknown>[]` | `Promise<void>` | 대량 삽입 |
|
|
45
|
-
|
|
46
|
-
사용 순서: `connect()` -> `beginTransaction()` -> `executeDefs()`/`executeParametrized()` -> `commitTransaction()`/`rollbackTransaction()` -> `close()`
|
|
47
|
-
|
|
48
|
-
## `DbConnOptions`
|
|
49
|
-
|
|
50
|
-
데이터베이스 연결 옵션.
|
|
51
|
-
|
|
52
|
-
```typescript
|
|
53
|
-
export type DbConnOptions = { configName?: string; config?: Record<string, unknown> };
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
| Field | Type | Description |
|
|
57
|
-
|-------|------|-------------|
|
|
58
|
-
| `configName` | `string?` | 서버에 등록된 DB 설정 이름 |
|
|
59
|
-
| `config` | `Record<string, unknown>?` | 직접 지정하는 DB 연결 설정 |
|
|
60
|
-
|
|
61
|
-
## `AutoUpdateService`
|
|
62
|
-
|
|
63
|
-
클라이언트 애플리케이션의 최신 버전 정보를 조회하는 서비스 인터페이스.
|
|
64
|
-
|
|
65
|
-
```typescript
|
|
66
|
-
export interface AutoUpdateService {
|
|
67
|
-
getLastVersion(platform: string): Promise<
|
|
68
|
-
| { version: string; downloadPath: string }
|
|
69
|
-
| undefined
|
|
70
|
-
>;
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
| Method | Parameters | Return | Description |
|
|
75
|
-
|--------|-----------|--------|-------------|
|
|
76
|
-
| `getLastVersion` | `platform: string` | `Promise<{ version, downloadPath } \| undefined>` | 지정된 플랫폼(예: "win32", "darwin", "linux")의 최신 버전 정보 조회. 버전이 없으면 undefined |
|
|
77
|
-
|
|
78
|
-
## `AppStructureService`
|
|
79
|
-
|
|
80
|
-
서버에 등록된 앱 구조 항목을 클라이언트명 기준 맵으로 조회하는 서비스 인터페이스.
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
export interface AppStructureService {
|
|
84
|
-
getItems(): Record<string, AppStructureItem[]>;
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
| Method | Parameters | Return | Description |
|
|
89
|
-
|--------|-----------|--------|-------------|
|
|
90
|
-
| `getItems` | 없음 | `Record<string, AppStructureItem[]>` | 클라이언트명을 키로, 해당 클라이언트의 앱 구조 항목 배열을 값으로 하는 맵 반환 |
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Types
|
|
2
|
-
|
|
3
|
-
## `ServiceUploadResult`
|
|
4
|
-
|
|
5
|
-
파일 업로드 결과. 서버에 업로드된 파일의 정보를 포함한다.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
export interface ServiceUploadResult {
|
|
9
|
-
path: string;
|
|
10
|
-
filename: string;
|
|
11
|
-
size: number;
|
|
12
|
-
}
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
| Field | Type | Description |
|
|
16
|
-
|-------|------|-------------|
|
|
17
|
-
| `path` | `string` | 서버 내 저장 경로 |
|
|
18
|
-
| `filename` | `string` | 원본 파일명 |
|
|
19
|
-
| `size` | `number` | 파일 크기 (바이트) |
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
# @simplysm/service-common
|
|
2
|
-
|
|
3
|
-
서비스 클라이언트와 서버가 공유하는 바이너리 프로토콜, 메시지 타입, 서비스 인터페이스, 앱 구조 정의 패키지.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @simplysm/service-common
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## API Overview
|
|
12
|
-
|
|
13
|
-
### Protocol
|
|
14
|
-
|
|
15
|
-
| API | Type | Description |
|
|
16
|
-
|-----|------|-------------|
|
|
17
|
-
| `PROTOCOL_CONFIG` | const | 프로토콜 설정 상수 (최대 크기, 청킹 임계값, 청크 크기, GC 주기, 만료 시간) |
|
|
18
|
-
| `ServiceMessage` | type | 양방향 메시지의 유니언 타입 |
|
|
19
|
-
| `ServiceClientMessage` | type | 클라이언트 → 서버 메시지 유니언 |
|
|
20
|
-
| `ServiceServerMessage` | type | 서버 → 클라이언트 메시지 유니언 |
|
|
21
|
-
| `ServiceServerRawMessage` | type | 진행 상태를 포함한 서버 메시지 유니언 |
|
|
22
|
-
| `ServiceProgressMessage` | interface | 청크 수신 진행 상태 알림 |
|
|
23
|
-
| `ServiceErrorMessage` | interface | 서버 에러 알림 |
|
|
24
|
-
| `ServiceAuthMessage` | interface | 클라이언트 인증 메시지 (토큰) |
|
|
25
|
-
| `ServiceRequestMessage` | interface | 서비스 메서드 요청 |
|
|
26
|
-
| `ServiceResponseMessage` | interface | 서비스 메서드 응답 |
|
|
27
|
-
| `ServiceAddEventListenerMessage` | interface | 이벤트 리스너 추가 요청 |
|
|
28
|
-
| `ServiceRemoveEventListenerMessage` | interface | 이벤트 리스너 제거 요청 |
|
|
29
|
-
| `ServiceGetEventListenerInfosMessage` | interface | 이벤트 리스너 정보 목록 요청 |
|
|
30
|
-
| `ServiceEmitEventMessage` | interface | 이벤트 발생 요청 |
|
|
31
|
-
| `ServiceEventMessage` | interface | 서버 이벤트 알림 |
|
|
32
|
-
| `ServiceProtocol` | interface | 바이너리 프로토콜 인코더/디코더 |
|
|
33
|
-
| `ServiceMessageDecodeResult` | type | 디코딩 결과 유니언 (complete \| progress) |
|
|
34
|
-
| `createServiceProtocol` | function | ServiceProtocol 인스턴스 생성 팩토리 |
|
|
35
|
-
|
|
36
|
-
→ See [docs/protocol.md](./docs/protocol.md) for details.
|
|
37
|
-
|
|
38
|
-
### Service Types
|
|
39
|
-
|
|
40
|
-
| API | Type | Description |
|
|
41
|
-
|-----|------|-------------|
|
|
42
|
-
| `OrmService` | interface | DB 연결, 트랜잭션, 쿼리 실행 서비스 인터페이스 |
|
|
43
|
-
| `DbConnOptions` | type | DB 연결 옵션 타입 |
|
|
44
|
-
| `AutoUpdateService` | interface | 클라이언트 최신 버전 조회 서비스 인터페이스 |
|
|
45
|
-
| `AppStructureService` | interface | 앱 구조 항목 조회 서비스 인터페이스 |
|
|
46
|
-
|
|
47
|
-
→ See [docs/service-types.md](./docs/service-types.md) for details.
|
|
48
|
-
|
|
49
|
-
### Types
|
|
50
|
-
|
|
51
|
-
| API | Type | Description |
|
|
52
|
-
|-----|------|-------------|
|
|
53
|
-
| `ServiceUploadResult` | interface | 파일 업로드 결과 |
|
|
54
|
-
|
|
55
|
-
→ See [docs/types.md](./docs/types.md) for details.
|
|
56
|
-
|
|
57
|
-
### App Structure
|
|
58
|
-
|
|
59
|
-
| API | Type | Description |
|
|
60
|
-
|-----|------|-------------|
|
|
61
|
-
| `AppStructureItem` | type | 앱 구조 항목 (그룹 또는 리프) |
|
|
62
|
-
| `AppStructureGroupItem` | interface | 자식을 가진 그룹 메뉴 항목 |
|
|
63
|
-
| `AppStructureLeafItem` | interface | 말단 메뉴 항목 (권한, URL 포함) |
|
|
64
|
-
| `AppStructureSubPermission` | interface | 리프 항목의 하위 권한 정의 |
|
|
65
|
-
| `FlatPermission` | interface | 플래트닝된 권한 결과 |
|
|
66
|
-
| `isUsableModules` | function | 개별 항목의 모듈 접근 가능 여부 판단 |
|
|
67
|
-
| `isUsableModulesChain` | function | 모듈 체인 전체의 접근 가능 여부 판단 |
|
|
68
|
-
| `getFlatPermissions` | function | 앱 구조 트리를 플래트닝하여 권한 배열 반환 |
|
|
69
|
-
|
|
70
|
-
→ See [docs/app-structure.md](./docs/app-structure.md) for details.
|
|
71
|
-
|
|
72
|
-
### Events
|
|
73
|
-
|
|
74
|
-
| API | Type | Description |
|
|
75
|
-
|-----|------|-------------|
|
|
76
|
-
| `ServiceEventDef` | interface | 타입 안전 이벤트 정의 인터페이스 |
|
|
77
|
-
| `defineEvent` | function | 타입 안전 이벤트를 정의하는 팩토리 함수 |
|
|
78
|
-
|
|
79
|
-
→ See [docs/events.md](./docs/events.md) for details.
|
|
80
|
-
|
|
81
|
-
## Usage Examples
|
|
82
|
-
|
|
83
|
-
### 프로토콜 인코딩/디코딩
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
import { createServiceProtocol } from "@simplysm/service-common";
|
|
87
|
-
|
|
88
|
-
const protocol = createServiceProtocol();
|
|
89
|
-
|
|
90
|
-
// 메시지 인코딩 (3MB 초과 시 자동 청킹)
|
|
91
|
-
const { chunks, totalSize } = protocol.encode(uuid, {
|
|
92
|
-
name: "OrmService.connect",
|
|
93
|
-
body: [{ configName: "default" }],
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
// 메시지 디코딩 (청크 자동 재조립)
|
|
97
|
-
for (const chunk of chunks) {
|
|
98
|
-
const result = protocol.decode(chunk);
|
|
99
|
-
if (result.type === "complete") {
|
|
100
|
-
// result.message: 재조립된 메시지
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// 사용 후 반드시 해제
|
|
105
|
-
protocol.dispose();
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### 타입 안전 이벤트 정의
|
|
109
|
-
|
|
110
|
-
```typescript
|
|
111
|
-
import { defineEvent } from "@simplysm/service-common";
|
|
112
|
-
|
|
113
|
-
// 서버에서 이벤트 정의 + 타입 export
|
|
114
|
-
export const OrderUpdated = defineEvent<{ orderId: number }, { status: string }>("OrderUpdated");
|
|
115
|
-
|
|
116
|
-
// 서버에서 이벤트 발생 (제네릭 타입 파라미터 + 문자열 이름 패턴)
|
|
117
|
-
await server.emitEvent<typeof OrderUpdated>("OrderUpdated", (info) => info.orderId === 123, { status: "shipped" });
|
|
118
|
-
|
|
119
|
-
// 클라이언트에서 구독 (import type으로 타입만 가져옴)
|
|
120
|
-
import type { OrderUpdated } from "@server-package";
|
|
121
|
-
await client.addListener<typeof OrderUpdated>("OrderUpdated", { orderId: 123 }, async (data) => {
|
|
122
|
-
// data.status는 string으로 타입 추론됨
|
|
123
|
-
});
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### 앱 구조 권한 플래트닝
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
import { getFlatPermissions, isUsableModules } from "@simplysm/service-common";
|
|
130
|
-
import type { AppStructureItem } from "@simplysm/service-common";
|
|
131
|
-
|
|
132
|
-
const items: AppStructureItem<string>[] = [
|
|
133
|
-
{
|
|
134
|
-
code: "admin",
|
|
135
|
-
title: "관리",
|
|
136
|
-
children: [
|
|
137
|
-
{ code: "user", title: "사용자", perms: ["use", "edit"] },
|
|
138
|
-
],
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
code: "report",
|
|
142
|
-
title: "리포트",
|
|
143
|
-
modules: ["moduleA"],
|
|
144
|
-
perms: ["use"],
|
|
145
|
-
},
|
|
146
|
-
];
|
|
147
|
-
|
|
148
|
-
// 활성 모듈 기준으로 권한 플래트닝
|
|
149
|
-
const perms = getFlatPermissions(items, ["moduleA"]);
|
|
150
|
-
// [{ codeChain: ["admin", "user", "use"], ... }, { codeChain: ["admin", "user", "edit"], ... }, ...]
|
|
151
|
-
|
|
152
|
-
// 개별 모듈 접근 가능 여부 확인
|
|
153
|
-
const canAccess = isUsableModules(["moduleA", "moduleB"], undefined, ["moduleA"]); // true (OR 조건)
|
|
154
|
-
```
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# Auth
|
|
2
|
-
|
|
3
|
-
## `AuthTokenPayload`
|
|
4
|
-
|
|
5
|
-
JWT 페이로드 인터페이스. `jose` 라이브러리의 `JWTPayload`를 확장한다.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
interface AuthTokenPayload<TAuthInfo = unknown> extends JWTPayload {
|
|
9
|
-
roles: string[];
|
|
10
|
-
data: TAuthInfo;
|
|
11
|
-
}
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
| Field | Type | Description |
|
|
15
|
-
|-------|------|-------------|
|
|
16
|
-
| `roles` | `string[]` | 사용자 역할 배열. `auth(["admin"], ...)` 등에서 역할 검사에 사용된다 |
|
|
17
|
-
| `data` | `TAuthInfo` | 사용자 정의 인증 데이터. `ServiceContext.authInfo`로 접근 가능하다 |
|
|
18
|
-
| (JWTPayload 상속) | — | `iss`, `sub`, `aud`, `exp`, `nbf`, `iat`, `jti` 등 표준 JWT 클레임 |
|
|
19
|
-
|
|
20
|
-
## `signJwt`
|
|
21
|
-
|
|
22
|
-
HS256 알고리즘과 12시간 유효기간으로 JWT 토큰을 서명한다.
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
async function signJwt<TAuthInfo = unknown>(
|
|
26
|
-
jwtSecret: string,
|
|
27
|
-
payload: AuthTokenPayload<TAuthInfo>,
|
|
28
|
-
): Promise<string>;
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
| Parameter | Type | Description |
|
|
32
|
-
|-----------|------|-------------|
|
|
33
|
-
| `jwtSecret` | `string` | HMAC 서명 시크릿 |
|
|
34
|
-
| `payload` | `AuthTokenPayload<TAuthInfo>` | JWT 페이로드 |
|
|
35
|
-
|
|
36
|
-
반환값: 서명된 JWT 토큰 문자열.
|
|
37
|
-
|
|
38
|
-
## `verifyJwt`
|
|
39
|
-
|
|
40
|
-
JWT 토큰을 검증하고 페이로드를 반환한다. 만료된 토큰은 "토큰이 만료되었습니다." 에러를, 그 외 유효하지 않은 토큰은 "유효하지 않은 토큰입니다." 에러를 던진다.
|
|
41
|
-
|
|
42
|
-
```typescript
|
|
43
|
-
async function verifyJwt<TAuthInfo = unknown>(
|
|
44
|
-
jwtSecret: string,
|
|
45
|
-
token: string,
|
|
46
|
-
): Promise<AuthTokenPayload<TAuthInfo>>;
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
| Parameter | Type | Description |
|
|
50
|
-
|-----------|------|-------------|
|
|
51
|
-
| `jwtSecret` | `string` | HMAC 서명 시크릿 |
|
|
52
|
-
| `token` | `string` | 검증할 JWT 토큰 문자열 |
|
|
53
|
-
|
|
54
|
-
## `decodeJwt`
|
|
55
|
-
|
|
56
|
-
JWT 토큰을 검증 없이 디코딩한다. 서명 검증이나 만료 확인을 수행하지 않는다.
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
function decodeJwt<TAuthInfo = unknown>(token: string): AuthTokenPayload<TAuthInfo>;
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
| Parameter | Type | Description |
|
|
63
|
-
|-----------|------|-------------|
|
|
64
|
-
| `token` | `string` | 디코딩할 JWT 토큰 문자열 |
|