@simplysm/service-client 14.0.48 → 14.0.51
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/README.md +69 -154
- package/dist/features/event-client.js +1 -1
- package/dist/features/event-client.js.map +1 -1
- package/dist/transport/service-transport.js.map +1 -1
- package/docs/features/event-client.md +88 -0
- package/docs/features/file-client.md +58 -0
- package/docs/features/orm-client-connector.md +83 -0
- package/docs/features/orm-client-db-context-executor.md +26 -0
- package/docs/{main.md → main/service-client.md} +50 -51
- package/docs/{protocol.md → protocol/client-protocol-wrapper.md} +19 -16
- package/docs/transport/service-transport.md +63 -0
- package/docs/transport/socket-provider.md +95 -0
- package/docs/types/blob-input.md +7 -0
- package/docs/types/browser-worker.md +47 -0
- package/docs/types/file-collection.md +21 -0
- package/docs/types/service-connection-options.md +22 -0
- package/docs/types/service-progress.md +39 -0
- package/package.json +4 -4
- package/src/features/event-client.ts +1 -1
- package/src/transport/service-transport.ts +2 -2
- package/docs/features.md +0 -217
- package/docs/transport.md +0 -131
- package/docs/types.md +0 -93
package/README.md
CHANGED
|
@@ -10,89 +10,72 @@ npm install @simplysm/service-client
|
|
|
10
10
|
|
|
11
11
|
## API Overview
|
|
12
12
|
|
|
13
|
-
###
|
|
14
|
-
|
|
15
|
-
|
|
|
16
|
-
|
|
17
|
-
| `ServiceClient` | class | WebSocket 서비스 클라이언트 최상위 파사드 (연결, RPC, 이벤트, 파일, ORM 통합) |
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
|
26
|
-
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
|
48
|
-
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
|
65
|
-
|
|
66
|
-
| `OrmClientConnector` | interface | DbContext 원격 트랜잭션 연결 헬퍼 |
|
|
67
|
-
| `createOrmClientConnector()` | function | OrmClientConnector 팩토리. ServiceClient 사용 |
|
|
68
|
-
| `OrmConnectOptions<T>` | interface | ORM 연결 설정 (DbClass, connOpt, dbContextOpt) |
|
|
69
|
-
| `OrmClientDbContextExecutor` | class | DbContextExecutor 구현체 (서버로 원격 호출) |
|
|
70
|
-
|
|
71
|
-
### Types & Utilities
|
|
72
|
-
|
|
73
|
-
| API | Type | Description |
|
|
74
|
-
|-----|------|-------------|
|
|
75
|
-
| `ServiceConnectionOptions` | interface | 서버 연결 옵션 (host, port, ssl, maxReconnectCount) |
|
|
76
|
-
| `ServiceProgress` | interface | progress 콜백 인터페이스 (request, response, server) |
|
|
77
|
-
| `ServiceProgressState` | interface | progress 상태 (uuid, totalSize, completedSize) |
|
|
78
|
-
| `BlobInput` | type | Blob \| Uint8Array \| ArrayBuffer \| string (Blob 생성자 허용 타입) |
|
|
79
|
-
| `FileCollection` | interface | FileList 호환 컬렉션 인터페이스 |
|
|
80
|
-
| `isWorkerSupported()` | function | Web Worker 지원 여부 확인 |
|
|
81
|
-
|
|
82
|
-
→ See [docs/types.md](./docs/types.md) for details.
|
|
13
|
+
### Main
|
|
14
|
+
|
|
15
|
+
| Entry | Kind | Description |
|
|
16
|
+
|-------|------|-------------|
|
|
17
|
+
| [`ServiceClient`](./docs/main/service-client.md) | class | WebSocket 서비스 클라이언트 최상위 파사드 (연결, RPC, 이벤트, 파일, ORM 통합) |
|
|
18
|
+
| [`ServiceProxy<T>`](./docs/main/service-client.md) | type | 서비스 메서드 반환 타입을 Promise로 래핑하는 타입 변환기 |
|
|
19
|
+
| [`createServiceClient()`](./docs/main/service-client.md) | function | ServiceClient 인스턴스 생성 팩토리 함수 |
|
|
20
|
+
|
|
21
|
+
### Transport
|
|
22
|
+
|
|
23
|
+
| Entry | Kind | Description |
|
|
24
|
+
|-------|------|-------------|
|
|
25
|
+
| [`SocketProvider`](./docs/transport/socket-provider.md) | interface | WebSocket 래퍼 (connect, close, send, on, off, 하트비트·재연결 관리) |
|
|
26
|
+
| [`SocketProviderEvents`](./docs/transport/socket-provider.md) | interface | SocketProvider 이벤트 맵 (message, state) |
|
|
27
|
+
| [`createSocketProvider()`](./docs/transport/socket-provider.md) | function | SocketProvider 팩토리 |
|
|
28
|
+
| [`ServiceTransport`](./docs/transport/service-transport.md) | interface | 요청-응답 매핑, progress 중계, 이벤트 디스패치 |
|
|
29
|
+
| [`ServiceTransportEvents`](./docs/transport/service-transport.md) | interface | ServiceTransport 이벤트 맵 (event) |
|
|
30
|
+
| [`createServiceTransport()`](./docs/transport/service-transport.md) | function | ServiceTransport 팩토리 |
|
|
31
|
+
|
|
32
|
+
### Protocol
|
|
33
|
+
|
|
34
|
+
| Entry | Kind | Description |
|
|
35
|
+
|-------|------|-------------|
|
|
36
|
+
| [`ClientProtocolWrapper`](./docs/protocol/client-protocol-wrapper.md) | interface | 메시지 인코딩/디코딩 (30KB 이상 시 Web Worker 오프로드) |
|
|
37
|
+
| [`createClientProtocolWrapper()`](./docs/protocol/client-protocol-wrapper.md) | function | ClientProtocolWrapper 팩토리 |
|
|
38
|
+
|
|
39
|
+
### Features
|
|
40
|
+
|
|
41
|
+
| Entry | Kind | Description |
|
|
42
|
+
|-------|------|-------------|
|
|
43
|
+
| [`EventClient`](./docs/features/event-client.md) | interface | 서버 이벤트 구독/발행 관리 (재연결 시 자동 재구독) |
|
|
44
|
+
| [`ClientEventProxy<T>`](./docs/features/event-client.md) | interface | 특정 이벤트에 대한 프록시 인터페이스 |
|
|
45
|
+
| [`createEventClient()`](./docs/features/event-client.md) | function | EventClient 팩토리 |
|
|
46
|
+
| [`FileClient`](./docs/features/file-client.md) | interface | 파일 업로드(POST)/다운로드(GET) |
|
|
47
|
+
| [`createFileClient()`](./docs/features/file-client.md) | function | FileClient 팩토리 |
|
|
48
|
+
| [`OrmClientConnector`](./docs/features/orm-client-connector.md) | interface | DbContext 원격 트랜잭션 연결 헬퍼 |
|
|
49
|
+
| [`OrmConnectOptions<T>`](./docs/features/orm-client-connector.md) | interface | ORM 연결 설정 (DbClass, connOpt, dbContextOpt) |
|
|
50
|
+
| [`createOrmClientConnector()`](./docs/features/orm-client-connector.md) | function | OrmClientConnector 팩토리 |
|
|
51
|
+
| [`OrmClientDbContextExecutor`](./docs/features/orm-client-db-context-executor.md) | class | DbContextExecutor 구현체 (서버로 원격 호출) |
|
|
52
|
+
|
|
53
|
+
### Types
|
|
54
|
+
|
|
55
|
+
| Entry | Kind | Description |
|
|
56
|
+
|-------|------|-------------|
|
|
57
|
+
| [`ServiceConnectionOptions`](./docs/types/service-connection-options.md) | interface | 서버 연결 옵션 (host, port, ssl, maxReconnectCount) |
|
|
58
|
+
| [`ServiceProgress`](./docs/types/service-progress.md) | interface | progress 콜백 인터페이스 (request, response, server) |
|
|
59
|
+
| [`ServiceProgressState`](./docs/types/service-progress.md) | interface | progress 상태 (uuid, totalSize, completedSize) |
|
|
60
|
+
| [`BlobInput`](./docs/types/blob-input.md) | type | `Blob \| Uint8Array \| ArrayBuffer \| string` (Blob 생성자 허용 타입) |
|
|
61
|
+
| [`FileCollection`](./docs/types/file-collection.md) | interface | FileList 호환 컬렉션 인터페이스 |
|
|
62
|
+
| [`BrowserWorker`](./docs/types/browser-worker.md) | interface | Web Worker 최소 인터페이스 (cross-env 타입 호환용) |
|
|
63
|
+
| [`isBrowserWorkerSupported()`](./docs/types/browser-worker.md) | function | DOM Worker API 지원 여부 확인 |
|
|
64
|
+
| [`isNodeWorkerSupported()`](./docs/types/browser-worker.md) | function | Node.js worker_threads 지원 여부 확인 |
|
|
65
|
+
| [`isWorkerSupported()`](./docs/types/browser-worker.md) | function | Worker 오프로딩 지원 여부 확인 |
|
|
83
66
|
|
|
84
67
|
## Usage Examples
|
|
85
68
|
|
|
86
|
-
###
|
|
69
|
+
### 기본 연결 및 서비스 호출
|
|
87
70
|
|
|
88
71
|
```typescript
|
|
89
|
-
import {
|
|
72
|
+
import { ServiceClient } from "@simplysm/service-client";
|
|
90
73
|
|
|
91
|
-
const client =
|
|
74
|
+
const client = new ServiceClient("my-app", {
|
|
92
75
|
host: "localhost",
|
|
93
76
|
port: 3000,
|
|
94
77
|
ssl: false,
|
|
95
|
-
maxReconnectCount: 10,
|
|
78
|
+
maxReconnectCount: 10,
|
|
96
79
|
});
|
|
97
80
|
|
|
98
81
|
await client.connect();
|
|
@@ -105,96 +88,28 @@ const users = await userSvc.getAll();
|
|
|
105
88
|
await client.close();
|
|
106
89
|
```
|
|
107
90
|
|
|
108
|
-
###
|
|
91
|
+
### 이벤트 구독
|
|
109
92
|
|
|
110
93
|
```typescript
|
|
111
|
-
// 이벤트
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
},
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
// 이벤트 발행 (특정 selector에 매칭하는 리스너에만 전송)
|
|
121
|
-
await client.emitEvent(
|
|
122
|
-
"user:created",
|
|
123
|
-
(info) => info.userId === 123,
|
|
124
|
-
{ name: "Alice", email: "alice@example.com" },
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
// 리스너 제거
|
|
128
|
-
await client.removeListener(listenerId);
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### File Upload & Download
|
|
94
|
+
// 이벤트 프록시 방식 (권장)
|
|
95
|
+
const chatEvt = client.getEvent<typeof ChatEvent>("Chat");
|
|
96
|
+
const key = await chatEvt.addListener({ roomId: "room-1" }, async (data) => {
|
|
97
|
+
console.log("메시지:", data.message);
|
|
98
|
+
});
|
|
99
|
+
await chatEvt.removeListener(key);
|
|
132
100
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const files = [
|
|
136
|
-
new File(["content"], "file.txt", { type: "text/plain" }),
|
|
137
|
-
];
|
|
138
|
-
const results = await client.uploadFile(files);
|
|
139
|
-
console.log("업로드 결과:", results);
|
|
140
|
-
|
|
141
|
-
// 파일 다운로드
|
|
142
|
-
const buffer = await client.downloadFileBuffer("/uploaded/file.txt");
|
|
143
|
-
console.log("다운로드 바이트:", buffer.length);
|
|
101
|
+
// 발행
|
|
102
|
+
await chatEvt.emit((info) => info.roomId === "room-1", { message: "hello" });
|
|
144
103
|
```
|
|
145
104
|
|
|
146
|
-
### ORM
|
|
105
|
+
### ORM 원격 실행
|
|
147
106
|
|
|
148
107
|
```typescript
|
|
149
108
|
import { createOrmClientConnector } from "@simplysm/service-client";
|
|
150
109
|
|
|
151
110
|
const connector = createOrmClientConnector(client);
|
|
152
|
-
|
|
153
111
|
const result = await connector.connect(
|
|
154
|
-
{
|
|
155
|
-
|
|
156
|
-
connOpt: { configName: "main", username: "user", password: "pass" },
|
|
157
|
-
},
|
|
158
|
-
async (db) => {
|
|
159
|
-
return db.users.select().execute();
|
|
160
|
-
},
|
|
112
|
+
{ DbClass: MyDbContext, connOpt: { configName: "main" } },
|
|
113
|
+
async (db) => db.users.select().execute(),
|
|
161
114
|
);
|
|
162
|
-
|
|
163
|
-
console.log("조회 결과:", result);
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Progress Tracking
|
|
167
|
-
|
|
168
|
-
```typescript
|
|
169
|
-
const progress = {
|
|
170
|
-
request: (state) => {
|
|
171
|
-
console.log(`요청 전송: ${state.completedSize}/${state.totalSize} bytes`);
|
|
172
|
-
},
|
|
173
|
-
response: (state) => {
|
|
174
|
-
console.log(`응답 수신: ${state.completedSize}/${state.totalSize} bytes`);
|
|
175
|
-
},
|
|
176
|
-
server: (state) => {
|
|
177
|
-
console.log(`서버 처리: ${state.completedSize}/${state.totalSize}`);
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
await client.send("Service", "method", [arg1, arg2], progress);
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Connection State & Events
|
|
185
|
-
|
|
186
|
-
```typescript
|
|
187
|
-
// 연결 상태 모니터링
|
|
188
|
-
client.on("state", (state) => {
|
|
189
|
-
console.log("연결 상태:", state); // "connected" | "closed" | "reconnecting"
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
client.on("request-progress", (state) => {
|
|
193
|
-
console.log(`요청 진행: ${state.completedSize}/${state.totalSize}`);
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
// 연결 확인
|
|
197
|
-
if (client.connected) {
|
|
198
|
-
console.log("서버에 연결됨");
|
|
199
|
-
}
|
|
200
115
|
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-client.js","sourceRoot":"","sources":["../../src/features/event-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAG7C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;AAgC7D,MAAM,UAAU,iBAAiB,CAAC,SAA2B;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,EAGxB,CAAC;IAEJ,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7C,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,WAAW,CACxB,SAAiB,EACjB,IAAwB,EACxB,EAAmD;QAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;QAEvC,eAAe;QACf,MAAM,SAAS,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;SACrC,CAAC,CAAC;QAEH,uBAAuB;QACvB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE;YACnB,SAAS;YACT,IAAI;YACJ,EAAE
|
|
1
|
+
{"version":3,"file":"event-client.js","sourceRoot":"","sources":["../../src/features/event-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-transport.js","sourceRoot":"","sources":["../../src/transport/service-transport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service-transport.js","sourceRoot":"","sources":["../../src/transport/service-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# EventClient
|
|
2
|
+
|
|
3
|
+
서버 이벤트 구독/발행 관리 인터페이스. 재연결 시 자동 재구독된다. 팩토리 함수 `createEventClient`로 생성한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface EventClient {
|
|
7
|
+
getEvent<TEventDef extends ServiceEventDef>(
|
|
8
|
+
eventName: string,
|
|
9
|
+
): ClientEventProxy<TEventDef>;
|
|
10
|
+
addListener<TEventDef extends ServiceEventDef>(
|
|
11
|
+
eventName: string,
|
|
12
|
+
info: TEventDef["$info"],
|
|
13
|
+
cb: (data: TEventDef["$data"]) => PromiseLike<void>,
|
|
14
|
+
): Promise<string>;
|
|
15
|
+
removeListener(key: string): Promise<void>;
|
|
16
|
+
emit<TEventDef extends ServiceEventDef>(
|
|
17
|
+
eventName: string,
|
|
18
|
+
infoSelector: (item: TEventDef["$info"]) => boolean,
|
|
19
|
+
data: TEventDef["$data"],
|
|
20
|
+
): Promise<void>;
|
|
21
|
+
resubscribeAll(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Members
|
|
26
|
+
|
|
27
|
+
| Member | Kind | Type | Description |
|
|
28
|
+
|--------|------|------|-------------|
|
|
29
|
+
| `getEvent(eventName)` | method | `ClientEventProxy<TEventDef>` | 이벤트 이름과 타입을 캡처한 프록시 반환 |
|
|
30
|
+
| `addListener(eventName, info, cb)` | method | `Promise<string>` | 이벤트 리스너 등록. 반환값은 `key` (제거 시 사용) |
|
|
31
|
+
| `removeListener(key)` | method | `Promise<void>` | 등록된 이벤트 리스너 제거 |
|
|
32
|
+
| `emit(eventName, infoSelector, data)` | method | `Promise<void>` | `infoSelector`가 참인 대상에게 데이터 발행 |
|
|
33
|
+
| `resubscribeAll()` | method | `Promise<void>` | 재연결 시 모든 리스너를 서버에 재등록. `ServiceClient`가 자동 호출 |
|
|
34
|
+
|
|
35
|
+
## Related Types
|
|
36
|
+
|
|
37
|
+
### `ClientEventProxy`
|
|
38
|
+
|
|
39
|
+
`getEvent()`가 반환하는 이벤트 프록시 인터페이스. 이벤트 이름과 제네릭 타입이 캡처되어 있어 호출 시 반복 지정이 불필요하다.
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
export interface ClientEventProxy<TEventDef extends ServiceEventDef> {
|
|
43
|
+
addListener(
|
|
44
|
+
info: TEventDef["$info"],
|
|
45
|
+
cb: (data: TEventDef["$data"]) => PromiseLike<void>,
|
|
46
|
+
): Promise<string>;
|
|
47
|
+
removeListener(key: string): Promise<void>;
|
|
48
|
+
emit(
|
|
49
|
+
infoSelector: (item: TEventDef["$info"]) => boolean,
|
|
50
|
+
data: TEventDef["$data"],
|
|
51
|
+
): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
| Member | Type | Description |
|
|
56
|
+
|--------|------|-------------|
|
|
57
|
+
| `addListener(info, cb)` | `Promise<string>` | 이벤트 리스너 등록. 반환값은 `key` (제거 시 사용) |
|
|
58
|
+
| `removeListener(key)` | `Promise<void>` | 등록된 이벤트 리스너 제거 |
|
|
59
|
+
| `emit(infoSelector, data)` | `Promise<void>` | `infoSelector`가 참인 대상에게 데이터 발행 |
|
|
60
|
+
|
|
61
|
+
## `createEventClient`
|
|
62
|
+
|
|
63
|
+
`EventClient` 팩토리 함수.
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
export function createEventClient(transport: ServiceTransport): EventClient;
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| Parameter | Type | Description |
|
|
70
|
+
|-----------|------|-------------|
|
|
71
|
+
| `transport` | [`ServiceTransport`](../transport/service-transport.md) | 서비스 전송 계층 |
|
|
72
|
+
|
|
73
|
+
## Usage
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// getEvent() 방식 (권장 — 이벤트 이름과 타입이 캡처됨)
|
|
77
|
+
const chatEvt = client.getEvent<typeof ChatEvent>("Chat");
|
|
78
|
+
const key = await chatEvt.addListener({ roomId: "room-1" }, async (data) => {
|
|
79
|
+
console.log("메시지:", data.message);
|
|
80
|
+
});
|
|
81
|
+
await chatEvt.removeListener(key);
|
|
82
|
+
|
|
83
|
+
// 이벤트 발행
|
|
84
|
+
await chatEvt.emit(
|
|
85
|
+
(info) => info.roomId === "room-1",
|
|
86
|
+
{ message: "hello" },
|
|
87
|
+
);
|
|
88
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# FileClient
|
|
2
|
+
|
|
3
|
+
파일 업로드(POST)/다운로드(GET) 인터페이스. 팩토리 함수 `createFileClient`로 생성한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface FileClient {
|
|
7
|
+
download(relPath: string): Promise<Bytes>;
|
|
8
|
+
upload(
|
|
9
|
+
files: File[] | FileCollection | { name: string; data: BlobInput }[],
|
|
10
|
+
authToken: string,
|
|
11
|
+
): Promise<ServiceUploadResult[]>;
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Members
|
|
16
|
+
|
|
17
|
+
| Member | Kind | Type | Description |
|
|
18
|
+
|--------|------|------|-------------|
|
|
19
|
+
| `download(relPath)` | method | `Promise<Bytes>` | `GET {hostUrl}{relPath}`로 파일 다운로드. `Uint8Array` 반환 |
|
|
20
|
+
| `upload(files, authToken)` | method | `Promise<ServiceUploadResult[]>` | `POST {hostUrl}/upload`로 파일 업로드. `multipart/form-data` 사용 |
|
|
21
|
+
|
|
22
|
+
### `upload` Parameters
|
|
23
|
+
|
|
24
|
+
| Parameter | Type | Description |
|
|
25
|
+
|-----------|------|-------------|
|
|
26
|
+
| `files` | `File[] \| FileCollection \| { name: string; data: BlobInput }[]` | 업로드할 파일 목록 |
|
|
27
|
+
| `authToken` | `string` | 인증 토큰 (`Authorization: Bearer {token}` 헤더로 전송) |
|
|
28
|
+
|
|
29
|
+
## `createFileClient`
|
|
30
|
+
|
|
31
|
+
`FileClient` 팩토리 함수.
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
export function createFileClient(hostUrl: string, clientName: string): FileClient;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Parameter | Type | Description |
|
|
38
|
+
|-----------|------|-------------|
|
|
39
|
+
| `hostUrl` | `string` | 서버 기본 URL (`http://host:port` 형식) |
|
|
40
|
+
| `clientName` | `string` | 클라이언트 식별자 (`x-sd-client-name` 헤더로 전송) |
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// 일반적으로 ServiceClient를 통해 간접 사용한다
|
|
46
|
+
// 파일 업로드 (auth() 호출 후 사용)
|
|
47
|
+
const results = await client.uploadFile([
|
|
48
|
+
new File(["content"], "file.txt", { type: "text/plain" }),
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
// 커스텀 데이터 업로드
|
|
52
|
+
const results2 = await client.uploadFile([
|
|
53
|
+
{ name: "report.csv", data: "col1,col2\nval1,val2" },
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
// 파일 다운로드
|
|
57
|
+
const bytes = await client.downloadFileBuffer("/uploaded/file.txt");
|
|
58
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# OrmClientConnector
|
|
2
|
+
|
|
3
|
+
`DbContext` 트랜잭션 연결을 원격 서버에서 실행하는 헬퍼 인터페이스. 팩토리 함수 `createOrmClientConnector`로 생성한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface OrmClientConnector {
|
|
7
|
+
connect<T extends DbContext, R>(
|
|
8
|
+
config: OrmConnectOptions<T>,
|
|
9
|
+
callback: (db: T) => Promise<R> | R,
|
|
10
|
+
): Promise<R>;
|
|
11
|
+
connectWithoutTransaction<T extends DbContext, R>(
|
|
12
|
+
config: OrmConnectOptions<T>,
|
|
13
|
+
callback: (db: T) => Promise<R> | R,
|
|
14
|
+
): Promise<R>;
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Members
|
|
19
|
+
|
|
20
|
+
| Member | Kind | Type | Description |
|
|
21
|
+
|--------|------|------|-------------|
|
|
22
|
+
| `connect(config, callback)` | method | `Promise<R>` | 트랜잭션 모드로 연결. FK 제약 위반 시 사용자 친화적 에러 메시지로 변환 |
|
|
23
|
+
| `connectWithoutTransaction(config, callback)` | method | `Promise<R>` | 트랜잭션 없이 연결 |
|
|
24
|
+
|
|
25
|
+
## Related Types
|
|
26
|
+
|
|
27
|
+
### `OrmConnectOptions`
|
|
28
|
+
|
|
29
|
+
ORM 원격 연결에 필요한 옵션 인터페이스.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
export interface OrmConnectOptions<T extends DbContext> {
|
|
33
|
+
DbClass: new (executor: DbContextExecutor, opt: { database: string; schema?: string }) => T;
|
|
34
|
+
connOpt: DbConnOptions & { configName: string };
|
|
35
|
+
dbContextOpt?: {
|
|
36
|
+
database: string;
|
|
37
|
+
schema: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| Field | Type | Required | Description |
|
|
43
|
+
|-------|------|----------|-------------|
|
|
44
|
+
| `DbClass` | `new (executor: DbContextExecutor, opt: { database: string; schema?: string }) => T` | required | 사용할 `DbContext` 서브클래스 생성자 |
|
|
45
|
+
| `connOpt` | `DbConnOptions & { configName: string }` | required | DB 연결 옵션. `configName`은 서버 설정 키 |
|
|
46
|
+
| `dbContextOpt` | `{ database: string; schema: string }` | optional | DB 컨텍스트 옵션. 생략하면 서버에서 조회한 `info.database`/`info.schema` 사용 |
|
|
47
|
+
|
|
48
|
+
## `createOrmClientConnector`
|
|
49
|
+
|
|
50
|
+
`OrmClientConnector` 팩토리 함수.
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
export function createOrmClientConnector(serviceClient: ServiceClient): OrmClientConnector;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
| Parameter | Type | Description |
|
|
57
|
+
|-----------|------|-------------|
|
|
58
|
+
| `serviceClient` | [`ServiceClient`](../main/service-client.md) | 이미 연결된 서비스 클라이언트 |
|
|
59
|
+
|
|
60
|
+
## Usage
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { createOrmClientConnector } from "@simplysm/service-client";
|
|
64
|
+
|
|
65
|
+
const connector = createOrmClientConnector(client);
|
|
66
|
+
|
|
67
|
+
// 트랜잭션 모드
|
|
68
|
+
const result = await connector.connect(
|
|
69
|
+
{
|
|
70
|
+
DbClass: MyDbContext,
|
|
71
|
+
connOpt: { configName: "main", username: "user", password: "pass" },
|
|
72
|
+
},
|
|
73
|
+
async (db) => {
|
|
74
|
+
return db.myTable.select((item) => ({ id: item.id, name: item.name }));
|
|
75
|
+
},
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
// 트랜잭션 없이
|
|
79
|
+
const result2 = await connector.connectWithoutTransaction(
|
|
80
|
+
{ DbClass: MyDbContext, connOpt: { configName: "main" } },
|
|
81
|
+
async (db) => db.myTable.select(),
|
|
82
|
+
);
|
|
83
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# OrmClientDbContextExecutor
|
|
2
|
+
|
|
3
|
+
`DbContextExecutor` 인터페이스 구현체. `DbContext`의 쿼리 실행을 서버 `OrmService`에 원격 호출한다. 직접 사용보다 [`createOrmClientConnector`](./orm-client-connector.md)를 통해 사용하는 것을 권장한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
7
|
+
constructor(
|
|
8
|
+
private readonly _client: ServiceClient,
|
|
9
|
+
private readonly _opt: DbConnOptions & { configName: string },
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Members
|
|
15
|
+
|
|
16
|
+
| Member | Kind | Type | Description |
|
|
17
|
+
|--------|------|------|-------------|
|
|
18
|
+
| `getInfo()` | method | `Promise<{ dialect: Dialect; database?: string; schema?: string }>` | 서버에서 DB dialect, database, schema 조회 |
|
|
19
|
+
| `connect()` | method | `Promise<void>` | 서버에서 DB 연결 생성. `_connId` 할당 |
|
|
20
|
+
| `beginTransaction(isolationLevel?)` | method | `Promise<void>` | 트랜잭션 시작 |
|
|
21
|
+
| `commitTransaction()` | method | `Promise<void>` | 트랜잭션 커밋 |
|
|
22
|
+
| `rollbackTransaction()` | method | `Promise<void>` | 트랜잭션 롤백 |
|
|
23
|
+
| `close()` | method | `Promise<void>` | DB 연결 종료 및 `_connId` 해제 |
|
|
24
|
+
| `executeDefs(defs, options?)` | method | `Promise<T[][]>` | QueryDef 배열을 서버에서 실행 |
|
|
25
|
+
| `executeParametrized(query, params?)` | method | `Promise<unknown[][]>` | 파라미터화된 쿼리를 서버에서 실행 |
|
|
26
|
+
| `bulkInsert(tableName, columnDefs, records)` | method | `Promise<void>` | 대량 INSERT를 서버에서 실행 |
|