@simplysm/service-client 14.0.1 → 14.0.4
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 +440 -0
- package/dist/features/file-client.d.ts +3 -2
- package/dist/features/file-client.d.ts.map +1 -1
- package/dist/features/file-client.js +3 -3
- package/dist/features/file-client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/protocol/client-protocol-wrapper.d.ts.map +1 -1
- package/dist/protocol/client-protocol-wrapper.js +6 -5
- package/dist/protocol/client-protocol-wrapper.js.map +1 -1
- package/dist/service-client.d.ts +3 -3
- package/dist/service-client.d.ts.map +1 -1
- package/dist/service-client.js +0 -3
- package/dist/service-client.js.map +1 -1
- package/dist/transport/service-transport.d.ts +0 -1
- package/dist/transport/service-transport.d.ts.map +1 -1
- package/dist/transport/service-transport.js +1 -7
- package/dist/transport/service-transport.js.map +1 -1
- package/dist/transport/socket-provider.d.ts.map +1 -1
- package/dist/transport/socket-provider.js +5 -0
- package/dist/transport/socket-provider.js.map +1 -1
- package/dist/types/browser-compat.d.ts +33 -0
- package/dist/types/browser-compat.d.ts.map +1 -0
- package/dist/types/browser-compat.js +17 -0
- package/dist/types/browser-compat.js.map +1 -0
- package/dist/workers/client-protocol.worker.js +1 -1
- package/dist/workers/client-protocol.worker.js.map +1 -1
- package/package.json +4 -4
- package/src/features/file-client.ts +6 -5
- package/src/index.ts +1 -0
- package/src/protocol/client-protocol-wrapper.ts +13 -9
- package/src/service-client.ts +2 -5
- package/src/transport/service-transport.ts +1 -7
- package/src/transport/socket-provider.ts +6 -0
- package/src/types/browser-compat.ts +47 -0
- package/src/workers/client-protocol.worker.ts +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
# @simplysm/service-client
|
|
2
|
+
|
|
3
|
+
Service client SDK -- WebSocket-based RPC client with type-safe service proxy, event subscription, file upload/download, and ORM connector.
|
|
4
|
+
|
|
5
|
+
Depends on `@simplysm/service-common` for protocol and shared types.
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
| Export | Kind | Category | Description |
|
|
10
|
+
|--------|------|----------|-------------|
|
|
11
|
+
| `ServiceConnectionOptions` | interface | Types | Connection options (host, port, SSL, reconnect) |
|
|
12
|
+
| `ServiceProgress` | interface | Types | Progress callback hooks for request/response/server |
|
|
13
|
+
| `ServiceProgressState` | interface | Types | Progress state (uuid, totalSize, completedSize) |
|
|
14
|
+
| `SocketProviderEvents` | interface | Transport | Socket provider event map |
|
|
15
|
+
| `SocketProvider` | interface | Transport | Low-level WebSocket abstraction |
|
|
16
|
+
| `createSocketProvider` | function | Transport | Create a socket provider instance |
|
|
17
|
+
| `ServiceTransportEvents` | interface | Transport | Transport event map |
|
|
18
|
+
| `ServiceTransport` | interface | Transport | Service-level message transport |
|
|
19
|
+
| `createServiceTransport` | function | Transport | Create a service transport instance |
|
|
20
|
+
| `ClientProtocolWrapper` | interface | Protocol | Client-side protocol encoder/decoder wrapper |
|
|
21
|
+
| `createClientProtocolWrapper` | function | Protocol | Create a client protocol wrapper |
|
|
22
|
+
| `EventClient` | interface | Features | Event subscription client |
|
|
23
|
+
| `createEventClient` | function | Features | Create an event client |
|
|
24
|
+
| `FileClient` | interface | Features | File upload/download client |
|
|
25
|
+
| `createFileClient` | function | Features | Create a file client |
|
|
26
|
+
| `OrmConnectOptions` | interface | Features | ORM connection options |
|
|
27
|
+
| `OrmClientConnector` | interface | Features | ORM client connector (with/without transaction) |
|
|
28
|
+
| `createOrmClientConnector` | function | Features | Create an ORM client connector |
|
|
29
|
+
| `OrmClientDbContextExecutor` | class | Features | ORM DbContext executor for client-side use |
|
|
30
|
+
| `ServiceClient` | class | Main | Main service client class |
|
|
31
|
+
| `ServiceProxy` | type | Main | Type-safe service proxy mapping |
|
|
32
|
+
| `createServiceClient` | function | Main | Create a ServiceClient instance |
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { createServiceClient } from "@simplysm/service-client";
|
|
38
|
+
|
|
39
|
+
// Create and connect
|
|
40
|
+
const client = createServiceClient("my-app", {
|
|
41
|
+
host: "localhost",
|
|
42
|
+
port: 3000,
|
|
43
|
+
ssl: false,
|
|
44
|
+
});
|
|
45
|
+
await client.connect();
|
|
46
|
+
|
|
47
|
+
// Type-safe RPC calls via proxy
|
|
48
|
+
interface MyService {
|
|
49
|
+
greet(name: string): Promise<string>;
|
|
50
|
+
}
|
|
51
|
+
const myService = client.getService<MyService>("MyService");
|
|
52
|
+
const result = await myService.greet("world");
|
|
53
|
+
|
|
54
|
+
// Authenticate
|
|
55
|
+
await client.auth(token);
|
|
56
|
+
|
|
57
|
+
// File upload
|
|
58
|
+
const uploadResults = await client.uploadFile(fileList);
|
|
59
|
+
|
|
60
|
+
// File download
|
|
61
|
+
const bytes = await client.downloadFileBuffer("uploads/file.txt");
|
|
62
|
+
|
|
63
|
+
// Event subscription
|
|
64
|
+
import { defineEvent } from "@simplysm/service-common";
|
|
65
|
+
const ChatEvent = defineEvent<{ roomId: number }, { text: string }>("ChatEvent");
|
|
66
|
+
|
|
67
|
+
const listenerKey = await client.addListener(ChatEvent, { roomId: 1 }, async (data) => {
|
|
68
|
+
// handle event
|
|
69
|
+
});
|
|
70
|
+
await client.removeListener(listenerKey);
|
|
71
|
+
|
|
72
|
+
// Clean up
|
|
73
|
+
await client.close();
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Types
|
|
77
|
+
|
|
78
|
+
### ServiceConnectionOptions
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
interface ServiceConnectionOptions {
|
|
82
|
+
port: number;
|
|
83
|
+
host: string;
|
|
84
|
+
ssl?: boolean;
|
|
85
|
+
maxReconnectCount?: number;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Field | Type | Description |
|
|
90
|
+
|-------|------|-------------|
|
|
91
|
+
| `port` | `number` | Server port |
|
|
92
|
+
| `host` | `string` | Server hostname |
|
|
93
|
+
| `ssl` | `boolean?` | Enable SSL/TLS |
|
|
94
|
+
| `maxReconnectCount` | `number?` | Max reconnection attempts. Set to `0` to disable reconnection and disconnect immediately. |
|
|
95
|
+
|
|
96
|
+
### ServiceProgress
|
|
97
|
+
|
|
98
|
+
Callback hooks for monitoring message progress.
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
interface ServiceProgress {
|
|
102
|
+
request?: (s: ServiceProgressState) => void;
|
|
103
|
+
response?: (s: ServiceProgressState) => void;
|
|
104
|
+
server?: (s: ServiceProgressState) => void;
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
| Field | Type | Description |
|
|
109
|
+
|-------|------|-------------|
|
|
110
|
+
| `request` | `(s: ServiceProgressState) => void` | Called during request encoding/sending progress |
|
|
111
|
+
| `response` | `(s: ServiceProgressState) => void` | Called during response decoding progress |
|
|
112
|
+
| `server` | `(s: ServiceProgressState) => void` | Called when server reports chunk receive progress |
|
|
113
|
+
|
|
114
|
+
### ServiceProgressState
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
interface ServiceProgressState {
|
|
118
|
+
uuid: string;
|
|
119
|
+
totalSize: number;
|
|
120
|
+
completedSize: number;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
| Field | Type | Description |
|
|
125
|
+
|-------|------|-------------|
|
|
126
|
+
| `uuid` | `string` | Message UUID |
|
|
127
|
+
| `totalSize` | `number` | Total message size in bytes |
|
|
128
|
+
| `completedSize` | `number` | Bytes transferred so far |
|
|
129
|
+
|
|
130
|
+
## Transport
|
|
131
|
+
|
|
132
|
+
### SocketProviderEvents
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
interface SocketProviderEvents {
|
|
136
|
+
message: Bytes;
|
|
137
|
+
state: "connected" | "closed" | "reconnecting";
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
| Event | Data Type | Description |
|
|
142
|
+
|-------|-----------|-------------|
|
|
143
|
+
| `message` | `Bytes` | Raw binary message received |
|
|
144
|
+
| `state` | `"connected" \| "closed" \| "reconnecting"` | Connection state change |
|
|
145
|
+
|
|
146
|
+
### SocketProvider
|
|
147
|
+
|
|
148
|
+
Low-level WebSocket abstraction with auto-reconnect.
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
interface SocketProvider {
|
|
152
|
+
readonly clientName: string;
|
|
153
|
+
readonly connected: boolean;
|
|
154
|
+
on<K extends keyof SocketProviderEvents & string>(type: K, listener: (data: SocketProviderEvents[K]) => void): void;
|
|
155
|
+
off<K extends keyof SocketProviderEvents & string>(type: K, listener: (data: SocketProviderEvents[K]) => void): void;
|
|
156
|
+
connect(): Promise<void>;
|
|
157
|
+
close(): Promise<void>;
|
|
158
|
+
send(data: Bytes): Promise<void>;
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
| Member | Kind | Description |
|
|
163
|
+
|--------|------|-------------|
|
|
164
|
+
| `clientName` | property | Client identifier name |
|
|
165
|
+
| `connected` | property | Whether currently connected |
|
|
166
|
+
| `on` | method | Subscribe to an event |
|
|
167
|
+
| `off` | method | Unsubscribe from an event |
|
|
168
|
+
| `connect` | method | Open the WebSocket connection |
|
|
169
|
+
| `close` | method | Close the connection |
|
|
170
|
+
| `send` | method | Send binary data |
|
|
171
|
+
|
|
172
|
+
### createSocketProvider
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
function createSocketProvider(url: string, clientName: string, maxReconnectCount: number): SocketProvider;
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
| Parameter | Type | Description |
|
|
179
|
+
|-----------|------|-------------|
|
|
180
|
+
| `url` | `string` | WebSocket URL |
|
|
181
|
+
| `clientName` | `string` | Client identifier |
|
|
182
|
+
| `maxReconnectCount` | `number` | Maximum reconnection attempts |
|
|
183
|
+
|
|
184
|
+
### ServiceTransportEvents
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
interface ServiceTransportEvents {
|
|
188
|
+
event: { keys: string[]; data: unknown };
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
| Event | Data Type | Description |
|
|
193
|
+
|-------|-----------|-------------|
|
|
194
|
+
| `event` | `{ keys: string[]; data: unknown }` | Server-side event broadcast received |
|
|
195
|
+
|
|
196
|
+
### ServiceTransport
|
|
197
|
+
|
|
198
|
+
Service-level message transport built on top of `SocketProvider`.
|
|
199
|
+
|
|
200
|
+
```ts
|
|
201
|
+
interface ServiceTransport {
|
|
202
|
+
on<K extends keyof ServiceTransportEvents & string>(type: K, listener: (data: ServiceTransportEvents[K]) => void): void;
|
|
203
|
+
off<K extends keyof ServiceTransportEvents & string>(type: K, listener: (data: ServiceTransportEvents[K]) => void): void;
|
|
204
|
+
send(message: ServiceClientMessage, progress?: ServiceProgress): Promise<unknown>;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
| Method | Parameters | Return | Description |
|
|
209
|
+
|--------|-----------|--------|-------------|
|
|
210
|
+
| `on` | `type`, `listener` | `void` | Subscribe to transport events |
|
|
211
|
+
| `off` | `type`, `listener` | `void` | Unsubscribe from transport events |
|
|
212
|
+
| `send` | `message: ServiceClientMessage`, `progress?: ServiceProgress` | `Promise<unknown>` | Send a service message and await the response |
|
|
213
|
+
|
|
214
|
+
### createServiceTransport
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
function createServiceTransport(socket: SocketProvider, protocol: ClientProtocolWrapper): ServiceTransport;
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Protocol
|
|
221
|
+
|
|
222
|
+
### ClientProtocolWrapper
|
|
223
|
+
|
|
224
|
+
Client-side protocol encoder/decoder wrapper.
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
interface ClientProtocolWrapper {
|
|
228
|
+
encode(uuid: string, message: ServiceMessage): Promise<{ chunks: Bytes[]; totalSize: number }>;
|
|
229
|
+
decode(bytes: Bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>>;
|
|
230
|
+
dispose(): void;
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
| Method | Parameters | Return | Description |
|
|
235
|
+
|--------|-----------|--------|-------------|
|
|
236
|
+
| `encode` | `uuid: string`, `message: ServiceMessage` | `Promise<{ chunks: Bytes[]; totalSize: number }>` | Encode a message into binary chunks |
|
|
237
|
+
| `decode` | `bytes: Bytes` | `Promise<ServiceMessageDecodeResult<ServiceMessage>>` | Decode received binary data |
|
|
238
|
+
| `dispose` | -- | `void` | Clean up resources |
|
|
239
|
+
|
|
240
|
+
### createClientProtocolWrapper
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
function createClientProtocolWrapper(protocol: ServiceProtocol): ClientProtocolWrapper;
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Creates a `ClientProtocolWrapper` from a `ServiceProtocol` instance.
|
|
247
|
+
|
|
248
|
+
## Features
|
|
249
|
+
|
|
250
|
+
### EventClient
|
|
251
|
+
|
|
252
|
+
Event subscription client for the service event system.
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
interface EventClient {
|
|
256
|
+
addListener<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, info: TInfo, cb: (data: TData) => PromiseLike<void>): Promise<string>;
|
|
257
|
+
removeListener(key: string): Promise<void>;
|
|
258
|
+
emit<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, infoSelector: (item: TInfo) => boolean, data: TData): Promise<void>;
|
|
259
|
+
resubscribeAll(): Promise<void>;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
| Method | Parameters | Return | Description |
|
|
264
|
+
|--------|-----------|--------|-------------|
|
|
265
|
+
| `addListener` | `eventDef`, `info: TInfo`, `cb` | `Promise<string>` | Subscribe to an event; returns listener key |
|
|
266
|
+
| `removeListener` | `key: string` | `Promise<void>` | Unsubscribe by listener key |
|
|
267
|
+
| `emit` | `eventDef`, `infoSelector`, `data: TData` | `Promise<void>` | Emit an event to matching listeners |
|
|
268
|
+
| `resubscribeAll` | -- | `Promise<void>` | Resubscribe all listeners (e.g., after reconnect) |
|
|
269
|
+
|
|
270
|
+
### createEventClient
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
function createEventClient(transport: ServiceTransport): EventClient;
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### FileClient
|
|
277
|
+
|
|
278
|
+
File upload and download client.
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
interface FileClient {
|
|
282
|
+
download(relPath: string): Promise<Bytes>;
|
|
283
|
+
upload(files: File[] | FileList | { name: string; data: BlobPart }[], authToken: string): Promise<ServiceUploadResult[]>;
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
| Method | Parameters | Return | Description |
|
|
288
|
+
|--------|-----------|--------|-------------|
|
|
289
|
+
| `download` | `relPath: string` | `Promise<Bytes>` | Download a file by relative path |
|
|
290
|
+
| `upload` | `files`, `authToken: string` | `Promise<ServiceUploadResult[]>` | Upload files with authentication |
|
|
291
|
+
|
|
292
|
+
### createFileClient
|
|
293
|
+
|
|
294
|
+
```ts
|
|
295
|
+
function createFileClient(hostUrl: string, clientName: string): FileClient;
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### OrmConnectOptions\<TDef\>
|
|
299
|
+
|
|
300
|
+
```ts
|
|
301
|
+
interface OrmConnectOptions<TDef extends DbContextDef<any, any, any>> {
|
|
302
|
+
dbContextDef: TDef;
|
|
303
|
+
connOpt: DbConnOptions & { configName: string };
|
|
304
|
+
dbContextOpt?: {
|
|
305
|
+
database: string;
|
|
306
|
+
schema: string;
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
| Field | Type | Description |
|
|
312
|
+
|-------|------|-------------|
|
|
313
|
+
| `dbContextDef` | `TDef` | Database context definition |
|
|
314
|
+
| `connOpt` | `DbConnOptions & { configName: string }` | Connection options with required config name |
|
|
315
|
+
| `dbContextOpt` | `{ database: string; schema: string }?` | Optional database/schema override |
|
|
316
|
+
|
|
317
|
+
### OrmClientConnector
|
|
318
|
+
|
|
319
|
+
ORM client connector that opens a database context over the service RPC layer.
|
|
320
|
+
|
|
321
|
+
```ts
|
|
322
|
+
interface OrmClientConnector {
|
|
323
|
+
connect<TDef extends DbContextDef<any, any, any>, R>(
|
|
324
|
+
config: OrmConnectOptions<TDef>,
|
|
325
|
+
callback: (db: DbContextInstance<TDef>) => Promise<R> | R,
|
|
326
|
+
): Promise<R>;
|
|
327
|
+
connectWithoutTransaction<TDef extends DbContextDef<any, any, any>, R>(
|
|
328
|
+
config: OrmConnectOptions<TDef>,
|
|
329
|
+
callback: (db: DbContextInstance<TDef>) => Promise<R> | R,
|
|
330
|
+
): Promise<R>;
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
| Method | Parameters | Return | Description |
|
|
335
|
+
|--------|-----------|--------|-------------|
|
|
336
|
+
| `connect` | `config`, `callback` | `Promise<R>` | Open a DB context with automatic transaction (begin/commit/rollback) |
|
|
337
|
+
| `connectWithoutTransaction` | `config`, `callback` | `Promise<R>` | Open a DB context without automatic transaction management |
|
|
338
|
+
|
|
339
|
+
### createOrmClientConnector
|
|
340
|
+
|
|
341
|
+
```ts
|
|
342
|
+
function createOrmClientConnector(serviceClient: ServiceClient): OrmClientConnector;
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### OrmClientDbContextExecutor
|
|
346
|
+
|
|
347
|
+
Implements `DbContextExecutor` for client-side ORM usage over the service RPC layer.
|
|
348
|
+
|
|
349
|
+
```ts
|
|
350
|
+
class OrmClientDbContextExecutor implements DbContextExecutor {
|
|
351
|
+
constructor(client: ServiceClient, opt: DbConnOptions & { configName: string });
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
| Method | Parameters | Return | Description |
|
|
356
|
+
|--------|-----------|--------|-------------|
|
|
357
|
+
| `getInfo` | -- | `Promise<{ dialect; database?; schema? }>` | Get database info |
|
|
358
|
+
| `connect` | -- | `Promise<void>` | Open the connection |
|
|
359
|
+
| `beginTransaction` | `isolationLevel?: IsolationLevel` | `Promise<void>` | Begin a transaction |
|
|
360
|
+
| `commitTransaction` | -- | `Promise<void>` | Commit the transaction |
|
|
361
|
+
| `rollbackTransaction` | -- | `Promise<void>` | Rollback the transaction |
|
|
362
|
+
| `close` | -- | `Promise<void>` | Close the connection |
|
|
363
|
+
| `executeDefs` | `defs: QueryDef[]`, `options?: (ResultMeta \| undefined)[]` | `Promise<T[][]>` | Execute query definitions |
|
|
364
|
+
| `executeParametrized` | `query: string`, `params?: unknown[]` | `Promise<unknown[][]>` | Execute a parameterized query |
|
|
365
|
+
| `bulkInsert` | `tableName: string`, `columnDefs: Record<string, ColumnMeta>`, `records: Record<string, unknown>[]` | `Promise<void>` | Bulk insert records |
|
|
366
|
+
|
|
367
|
+
## Main
|
|
368
|
+
|
|
369
|
+
### ServiceClient
|
|
370
|
+
|
|
371
|
+
Main service client class. Extends `EventEmitter` with progress and state events.
|
|
372
|
+
|
|
373
|
+
```ts
|
|
374
|
+
class ServiceClient extends EventEmitter<{
|
|
375
|
+
"request-progress": ServiceProgressState;
|
|
376
|
+
"response-progress": ServiceProgressState;
|
|
377
|
+
"server-progress": ServiceProgressState;
|
|
378
|
+
"state": "connected" | "closed" | "reconnecting";
|
|
379
|
+
}> {
|
|
380
|
+
constructor(name: string, options: ServiceConnectionOptions);
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
#### Events
|
|
385
|
+
|
|
386
|
+
| Event | Data Type | Description |
|
|
387
|
+
|-------|-----------|-------------|
|
|
388
|
+
| `request-progress` | `ServiceProgressState` | Request sending progress |
|
|
389
|
+
| `response-progress` | `ServiceProgressState` | Response receiving progress |
|
|
390
|
+
| `server-progress` | `ServiceProgressState` | Server-side chunk progress |
|
|
391
|
+
| `state` | `"connected" \| "closed" \| "reconnecting"` | Connection state change |
|
|
392
|
+
|
|
393
|
+
#### Properties
|
|
394
|
+
|
|
395
|
+
| Property | Type | Description |
|
|
396
|
+
|----------|------|-------------|
|
|
397
|
+
| `name` | `string` | Client name |
|
|
398
|
+
| `options` | `ServiceConnectionOptions` | Connection options |
|
|
399
|
+
| `connected` | `boolean` | Whether the client is connected |
|
|
400
|
+
| `hostUrl` | `string` | Full host URL (computed from options) |
|
|
401
|
+
|
|
402
|
+
#### Methods
|
|
403
|
+
|
|
404
|
+
| Method | Parameters | Return | Description |
|
|
405
|
+
|--------|-----------|--------|-------------|
|
|
406
|
+
| `getService<TService>` | `serviceName: string` | `ServiceProxy<TService>` | Get a type-safe service proxy |
|
|
407
|
+
| `connect` | -- | `Promise<void>` | Open the WebSocket connection |
|
|
408
|
+
| `close` | -- | `Promise<void>` | Close the connection |
|
|
409
|
+
| `send` | `serviceName`, `methodName`, `params`, `progress?` | `Promise<unknown>` | Send an RPC call |
|
|
410
|
+
| `auth` | `token: string` | `Promise<void>` | Authenticate with a JWT token |
|
|
411
|
+
| `addListener` | `eventDef`, `info`, `cb` | `Promise<string>` | Subscribe to an event |
|
|
412
|
+
| `removeListener` | `key: string` | `Promise<void>` | Unsubscribe from an event |
|
|
413
|
+
| `emitEvent` | `eventDef`, `infoSelector`, `data` | `Promise<void>` | Emit an event |
|
|
414
|
+
| `uploadFile` | `files` | `Promise<ServiceUploadResult[]>` | Upload files |
|
|
415
|
+
| `downloadFileBuffer` | `relPath: string` | `Promise<Bytes>` | Download a file |
|
|
416
|
+
|
|
417
|
+
### ServiceProxy\<TService\>
|
|
418
|
+
|
|
419
|
+
Maps service method signatures to async versions. Every method returns `Promise<Awaited<R>>`.
|
|
420
|
+
|
|
421
|
+
```ts
|
|
422
|
+
type ServiceProxy<TService> = {
|
|
423
|
+
[K in keyof TService]: TService[K] extends (...args: infer P) => infer R
|
|
424
|
+
? (...args: P) => Promise<Awaited<R>>
|
|
425
|
+
: never;
|
|
426
|
+
};
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### createServiceClient
|
|
430
|
+
|
|
431
|
+
```ts
|
|
432
|
+
function createServiceClient(name: string, options: ServiceConnectionOptions): ServiceClient;
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Factory function to create a `ServiceClient` instance.
|
|
436
|
+
|
|
437
|
+
| Parameter | Type | Description |
|
|
438
|
+
|-----------|------|-------------|
|
|
439
|
+
| `name` | `string` | Client identifier name |
|
|
440
|
+
| `options` | `ServiceConnectionOptions` | Connection options |
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Bytes } from "@simplysm/core-common";
|
|
2
2
|
import type { ServiceUploadResult } from "@simplysm/service-common";
|
|
3
|
+
import type { BlobInput, FileCollection } from "../types/browser-compat";
|
|
3
4
|
export interface FileClient {
|
|
4
5
|
download(relPath: string): Promise<Bytes>;
|
|
5
|
-
upload(files: File[] |
|
|
6
|
+
upload(files: File[] | FileCollection | {
|
|
6
7
|
name: string;
|
|
7
|
-
data:
|
|
8
|
+
data: BlobInput;
|
|
8
9
|
}[], authToken: string): Promise<ServiceUploadResult[]>;
|
|
9
10
|
}
|
|
10
11
|
export declare function createFileClient(hostUrl: string, clientName: string): FileClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-client.d.ts","sourceRoot":"","sources":["..\\..\\src\\features\\file-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-client.d.ts","sourceRoot":"","sources":["..\\..\\src\\features\\file-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CACJ,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,EACpE,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAoDhF"}
|
|
@@ -11,8 +11,8 @@ export function createFileClient(hostUrl, clientName) {
|
|
|
11
11
|
}
|
|
12
12
|
async function upload(files, authToken) {
|
|
13
13
|
const formData = new FormData();
|
|
14
|
-
const
|
|
15
|
-
for (const file of
|
|
14
|
+
const fileArr = Array.isArray(files) ? files : Array.from(files);
|
|
15
|
+
for (const file of fileArr) {
|
|
16
16
|
if ("data" in file) {
|
|
17
17
|
// 커스텀 객체 ({ name, data })
|
|
18
18
|
const blob = file.data instanceof Blob ? file.data : new Blob([file.data]);
|
|
@@ -34,7 +34,7 @@ export function createFileClient(hostUrl, clientName) {
|
|
|
34
34
|
if (!res.ok) {
|
|
35
35
|
throw new Error(`업로드 실패: ${res.statusText}`);
|
|
36
36
|
}
|
|
37
|
-
return res.json();
|
|
37
|
+
return (await res.json());
|
|
38
38
|
}
|
|
39
39
|
return {
|
|
40
40
|
download,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-client.js","sourceRoot":"","sources":["..\\..\\src\\features\\file-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-client.js","sourceRoot":"","sources":["..\\..\\src\\features\\file-client.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,UAAkB;IAClE,KAAK,UAAU,QAAQ,CAAC,OAAe;QACrC,SAAS;QACT,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QAExE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,4BAA4B;QAC5B,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,UAAU,MAAM,CACnB,KAAoE,EACpE,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,0BAA0B;gBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3E,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,kBAAkB,EAAE,UAAU;gBAC9B,eAAe,EAAE,UAAU,SAAS,EAAE;aACvC;YACD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;IACrD,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAG9D,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAG9D,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AAAA,KAAK;AACL,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AAEvC,QAAQ;AACR,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAE9C,OAAO;AACP,cAAc,oCAAoC,CAAC;AAEnD,KAAK;AACL,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAE9D,KAAK;AACL,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AAAA,KAAK;AACL,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AAEvC,QAAQ;AACR,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAE9C,OAAO;AACP,cAAc,oCAAoC,CAAC;AAEnD,KAAK;AACL,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAE9D,KAAK;AACL,cAAc,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-protocol-wrapper.d.ts","sourceRoot":"","sources":["..\\..\\src\\protocol\\client-protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EACd,eAAe,EAChB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"client-protocol-wrapper.d.ts","sourceRoot":"","sources":["..\\..\\src\\protocol\\client-protocol-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EACd,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1E,OAAO,IAAI,IAAI,CAAC;CACjB;AAiFD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,eAAe,GAAG,qBAAqB,CA4D5F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LazyGcMap, transfer, Uuid } from "@simplysm/core-common";
|
|
2
|
+
import { isWorkerSupported, createBrowserWorker } from "../types/browser-compat.js";
|
|
2
3
|
// 공유 worker 상태 (싱글턴 패턴)
|
|
3
4
|
let worker;
|
|
4
5
|
const workerResolvers = new LazyGcMap({
|
|
@@ -12,7 +13,7 @@ const workerResolvers = new LazyGcMap({
|
|
|
12
13
|
let workerAvailable;
|
|
13
14
|
function isWorkerAvailable() {
|
|
14
15
|
if (workerAvailable === undefined) {
|
|
15
|
-
workerAvailable =
|
|
16
|
+
workerAvailable = isWorkerSupported();
|
|
16
17
|
}
|
|
17
18
|
return workerAvailable;
|
|
18
19
|
}
|
|
@@ -23,9 +24,9 @@ function getWorker() {
|
|
|
23
24
|
if (!worker) {
|
|
24
25
|
// 모던 번들러 (Vite/Esbuild/Webpack)가 이 구문을 사용하여 Worker를 별도 파일로 분리/로드함
|
|
25
26
|
// 참고: import.meta.resolve 대신 상대 경로 사용 (Vite 호환성)
|
|
26
|
-
worker =
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
worker = createBrowserWorker(new URL("../workers/client-protocol.worker.ts", import.meta.url), { type: "module" });
|
|
28
|
+
if (worker == null)
|
|
29
|
+
return undefined;
|
|
29
30
|
worker.onmessage = (event) => {
|
|
30
31
|
const { id, type, result, error } = event.data;
|
|
31
32
|
const resolver = workerResolvers.get(id);
|
|
@@ -53,7 +54,7 @@ async function runWorker(type, data, transferables = []) {
|
|
|
53
54
|
const id = Uuid.generate().toString();
|
|
54
55
|
workerResolvers.set(id, { resolve, reject });
|
|
55
56
|
// workerAvailable 확인 후 호출되므로 worker는 항상 존재
|
|
56
|
-
getWorker().postMessage({ id, type, data },
|
|
57
|
+
getWorker().postMessage({ id, type, data }, transferables);
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
export function createClientProtocolWrapper(protocol) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-protocol-wrapper.js","sourceRoot":"","sources":["..\\..\\src\\protocol\\client-protocol-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"client-protocol-wrapper.js","sourceRoot":"","sources":["..\\..\\src\\protocol\\client-protocol-wrapper.ts"],"names":[],"mappings":"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"}
|
package/dist/service-client.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from "@simplysm/core-common";
|
|
2
2
|
import type { ServiceEventDef } from "@simplysm/service-common";
|
|
3
|
+
import type { BlobInput, FileCollection } from "./types/browser-compat";
|
|
3
4
|
import type { ServiceConnectionOptions } from "./types/connection-options";
|
|
4
5
|
import type { ServiceProgress, ServiceProgressState } from "./types/progress.types";
|
|
5
6
|
interface ServiceClientEvents {
|
|
@@ -7,7 +8,6 @@ interface ServiceClientEvents {
|
|
|
7
8
|
"response-progress": ServiceProgressState;
|
|
8
9
|
"server-progress": ServiceProgressState;
|
|
9
10
|
"state": "connected" | "closed" | "reconnecting";
|
|
10
|
-
"reload": Set<string>;
|
|
11
11
|
}
|
|
12
12
|
export declare class ServiceClient extends EventEmitter<ServiceClientEvents> {
|
|
13
13
|
readonly name: string;
|
|
@@ -29,9 +29,9 @@ export declare class ServiceClient extends EventEmitter<ServiceClientEvents> {
|
|
|
29
29
|
addListener<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, info: TInfo, cb: (data: TData) => PromiseLike<void>): Promise<string>;
|
|
30
30
|
removeListener(key: string): Promise<void>;
|
|
31
31
|
emitEvent<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, infoSelector: (item: TInfo) => boolean, data: TData): Promise<void>;
|
|
32
|
-
uploadFile(files: File[] |
|
|
32
|
+
uploadFile(files: File[] | FileCollection | {
|
|
33
33
|
name: string;
|
|
34
|
-
data:
|
|
34
|
+
data: BlobInput;
|
|
35
35
|
}[]): Promise<import("@simplysm/service-common").ServiceUploadResult[]>;
|
|
36
36
|
downloadFileBuffer(relPath: string): Promise<import("@simplysm/core-common").Bytes>;
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AASpF,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AASpF,UAAU,mBAAmB;IAC3B,kBAAkB,EAAE,oBAAoB,CAAC;IACzC,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;CAClD;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;aAoBhD,IAAI,EAAE,MAAM;aACZ,OAAO,EAAE,wBAAwB;IAnBnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IACzD,OAAO,CAAC,UAAU,CAAC,CAAS;IAG5B,IAAI,SAAS,YAEZ;IACD,IAAI,OAAO,WAGV;gBAGiB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,wBAAwB;IAmCnD,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;IAW3D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,OAAO,CAAC;IAuBb,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,WAAW,CAAC,KAAK,EAAE,KAAK,EAC5B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC;IAKZ,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,SAAS,CAAC,KAAK,EAAE,KAAK,EAC1B,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EACvC,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,EACtC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC;IAIV,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE;IAS/E,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAGzC;AAGD,MAAM,MAAM,YAAY,CAAC,QAAQ,IAAI;KAClC,CAAC,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GACpE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACnC,KAAK;CACV,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,aAAa,CAElG"}
|
package/dist/service-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-client.js","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"service-client.js","sourceRoot":"","sources":["..\\src\\service-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@ import type { ClientProtocolWrapper } from "../protocol/client-protocol-wrapper"
|
|
|
3
3
|
import type { ServiceProgress } from "../types/progress.types";
|
|
4
4
|
import type { SocketProvider } from "./socket-provider";
|
|
5
5
|
export interface ServiceTransportEvents {
|
|
6
|
-
reload: Set<string>;
|
|
7
6
|
event: {
|
|
8
7
|
keys: string[];
|
|
9
8
|
data: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-transport.d.ts","sourceRoot":"","sources":["..\\..\\src\\transport\\service-transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,
|
|
1
|
+
{"version":3,"file":"service-transport.d.ts","sourceRoot":"","sources":["..\\..\\src\\transport\\service-transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,CAAC,SAAS,MAAM,sBAAsB,GAAG,MAAM,EAChD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GAClD,IAAI,CAAC;IACR,GAAG,CAAC,CAAC,SAAS,MAAM,sBAAsB,GAAG,MAAM,EACjD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GAClD,IAAI,CAAC;IACR,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACnF;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,gBAAgB,CA8IlB"}
|
|
@@ -17,7 +17,7 @@ export function createServiceTransport(socket, protocol) {
|
|
|
17
17
|
const responsePromise = new Promise((resolve, reject) => {
|
|
18
18
|
pendingRequests.set(uuid, { resolve, reject, progress });
|
|
19
19
|
});
|
|
20
|
-
// Promise가 고아가 되었을 때 unhandled rejection 방지 (예:
|
|
20
|
+
// Promise가 고아가 되었을 때 unhandled rejection 방지 (예: 소켓 연결 끊김 시)
|
|
21
21
|
responsePromise.catch(() => { });
|
|
22
22
|
// 요청 전송
|
|
23
23
|
try {
|
|
@@ -88,12 +88,6 @@ export function createServiceTransport(socket, protocol) {
|
|
|
88
88
|
pendingRequests.delete(decoded.uuid);
|
|
89
89
|
listenerInfo?.reject(toError(decoded.message.body));
|
|
90
90
|
}
|
|
91
|
-
else if (decoded.message.name === "reload") {
|
|
92
|
-
const body = decoded.message.body;
|
|
93
|
-
if (socket.clientName === body.clientName) {
|
|
94
|
-
emitter.emit("reload", body.changedFileSet);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
91
|
else if (decoded.message.name === "evt:on") {
|
|
98
92
|
const body = decoded.message.body;
|
|
99
93
|
emitter.emit("event", { keys: body.keys, data: body.data });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-transport.js","sourceRoot":"","sources":["..\\..\\src\\transport\\service-transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"service-transport.js","sourceRoot":"","sources":["..\\..\\src\\transport\\service-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-provider.d.ts","sourceRoot":"","sources":["..\\..\\src\\transport\\socket-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"socket-provider.d.ts","sourceRoot":"","sources":["..\\..\\src\\transport\\socket-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAYnD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;CAChD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,GAAG,MAAM,EAC9C,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAChD,IAAI,CAAC;IACR,GAAG,CAAC,CAAC,SAAS,MAAM,oBAAoB,GAAG,MAAM,EAC/C,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,GAChD,IAAI,CAAC;IACR,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,GACxB,cAAc,CAsNhB"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { EventEmitter, Uuid, wait } from "@simplysm/core-common";
|
|
2
2
|
import consola from "consola";
|
|
3
|
+
// Node.js 환경에서 글로벌 WebSocket이 없으면 ws 패키지로 polyfill
|
|
4
|
+
if (typeof globalThis.WebSocket === "undefined") {
|
|
5
|
+
const { WebSocket } = await import("ws");
|
|
6
|
+
globalThis.WebSocket = WebSocket;
|
|
7
|
+
}
|
|
3
8
|
const logger = consola.withTag("service-client:SocketProvider");
|
|
4
9
|
export function createSocketProvider(url, clientName, maxReconnectCount) {
|
|
5
10
|
// 설정 상수
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-provider.js","sourceRoot":"","sources":["..\\..\\src\\transport\\socket-provider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socket-provider.js","sourceRoot":"","sources":["..\\..\\src\\transport\\socket-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-environment compatible types for browser globals.
|
|
3
|
+
* DOM-only 타입(FileList, BlobPart, Worker, Transferable)을 대체하여
|
|
4
|
+
* Node.js / browser 양쪽 환경에서 typecheck가 통과하도록 한다.
|
|
5
|
+
*/
|
|
6
|
+
/** Blob constructor가 허용하는 데이터 타입 (DOM BlobPart 대체) */
|
|
7
|
+
export type BlobInput = Blob | Uint8Array<ArrayBuffer> | ArrayBuffer | string;
|
|
8
|
+
/**
|
|
9
|
+
* File 컬렉션 인터페이스 (DOM FileList 대체).
|
|
10
|
+
* 브라우저 FileList와 구조적으로 호환됨.
|
|
11
|
+
*/
|
|
12
|
+
export interface FileCollection {
|
|
13
|
+
readonly length: number;
|
|
14
|
+
item(index: number): File | null;
|
|
15
|
+
[index: number]: File;
|
|
16
|
+
[Symbol.iterator](): IterableIterator<File>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Web Worker 인터페이스 (DOM Worker 대체).
|
|
20
|
+
* 브라우저 Worker와 구조적으로 호환됨.
|
|
21
|
+
*/
|
|
22
|
+
export interface WorkerLike {
|
|
23
|
+
onmessage: ((ev: MessageEvent) => void) | null;
|
|
24
|
+
postMessage(message: unknown, transfer?: unknown[]): void;
|
|
25
|
+
terminate(): void;
|
|
26
|
+
}
|
|
27
|
+
/** Web Worker API 지원 여부 확인 */
|
|
28
|
+
export declare function isWorkerSupported(): boolean;
|
|
29
|
+
/** Web Worker 생성 (미지원 환경이면 undefined) */
|
|
30
|
+
export declare function createBrowserWorker(url: URL, options: {
|
|
31
|
+
type: string;
|
|
32
|
+
}): WorkerLike | undefined;
|
|
33
|
+
//# sourceMappingURL=browser-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-compat.d.ts","sourceRoot":"","sources":["..\\..\\src\\types\\browser-compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC;AAE9E;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC1D,SAAS,IAAI,IAAI,CAAC;CACnB;AAED,8BAA8B;AAC9B,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,yCAAyC;AACzC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACxB,UAAU,GAAG,SAAS,CAOxB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-environment compatible types for browser globals.
|
|
3
|
+
* DOM-only 타입(FileList, BlobPart, Worker, Transferable)을 대체하여
|
|
4
|
+
* Node.js / browser 양쪽 환경에서 typecheck가 통과하도록 한다.
|
|
5
|
+
*/
|
|
6
|
+
/** Web Worker API 지원 여부 확인 */
|
|
7
|
+
export function isWorkerSupported() {
|
|
8
|
+
return "Worker" in globalThis;
|
|
9
|
+
}
|
|
10
|
+
/** Web Worker 생성 (미지원 환경이면 undefined) */
|
|
11
|
+
export function createBrowserWorker(url, options) {
|
|
12
|
+
if (!isWorkerSupported())
|
|
13
|
+
return undefined;
|
|
14
|
+
const ctor = globalThis["Worker"];
|
|
15
|
+
return new ctor(url, options);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=browser-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-compat.js","sourceRoot":"","sources":["..\\..\\src\\types\\browser-compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH,8BAA8B;AAC9B,MAAM,UAAU,iBAAiB;IAC/B,OAAO,QAAQ,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,mBAAmB,CACjC,GAAQ,EACR,OAAyB;IAEzB,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,IAAI,GAAI,UAAsC,CAAC,QAAQ,CAG9C,CAAC;IAChB,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -28,7 +28,7 @@ self.onmessage = (event) => {
|
|
|
28
28
|
transferList = encoded.transferList;
|
|
29
29
|
}
|
|
30
30
|
// [Worker -> Main] 성공 응답
|
|
31
|
-
self.postMessage({ id, type: "success", result },
|
|
31
|
+
self.postMessage({ id, type: "success", result }, transferList);
|
|
32
32
|
}
|
|
33
33
|
catch (err) {
|
|
34
34
|
// [Worker -> Main] 에러 응답
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-protocol.worker.js","sourceRoot":"","sources":["..\\..\\src\\workers\\client-protocol.worker.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;AAEzC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;IACvC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAIhC,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,MAAe,CAAC;QACpB,IAAI,YAAY,GAAmB,EAAE,CAAC;QAEtC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,oDAAoD;YACpD,sDAAsD;YACtD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAGzB,CAAC;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAElD,4BAA4B;YAC5B,MAAM,GAAG,MAAM,CAAC;YAChB,sCAAsC;YACtC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,wBAAwB;YACxB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAmB,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE5C,sCAAsC;YACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACxB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACtC,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"client-protocol.worker.js","sourceRoot":"","sources":["..\\..\\src\\workers\\client-protocol.worker.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;AAEzC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;IACvC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAIhC,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,MAAe,CAAC;QACpB,IAAI,YAAY,GAAmB,EAAE,CAAC;QAEtC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,oDAAoD;YACpD,sDAAsD;YACtD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAGzB,CAAC;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAElD,4BAA4B;YAC5B,MAAM,GAAG,MAAM,CAAC;YAChB,sCAAsC;YACtC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,wBAAwB;YACxB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAmB,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE5C,sCAAsC;YACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACxB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACtC,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yBAAyB;QACzB,IAAI,CAAC,WAAW,CAAC;YACf,EAAE;YACF,IAAI,EAAE,OAAO;YACb,KAAK,EACH,GAAG,YAAY,KAAK;gBAClB,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;gBAC5C,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/service-client",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.4",
|
|
4
4
|
"description": "심플리즘 패키지 - 서비스 (client)",
|
|
5
5
|
"author": "심플리즘",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"consola": "^3.4.2",
|
|
22
|
-
"@simplysm/core-common": "14.0.
|
|
23
|
-
"@simplysm/orm-common": "14.0.
|
|
24
|
-
"@simplysm/service-common": "14.0.
|
|
22
|
+
"@simplysm/core-common": "14.0.4",
|
|
23
|
+
"@simplysm/orm-common": "14.0.4",
|
|
24
|
+
"@simplysm/service-common": "14.0.4"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/ws": "^8.18.1",
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Bytes } from "@simplysm/core-common";
|
|
2
2
|
import type { ServiceUploadResult } from "@simplysm/service-common";
|
|
3
|
+
import type { BlobInput, FileCollection } from "../types/browser-compat";
|
|
3
4
|
|
|
4
5
|
export interface FileClient {
|
|
5
6
|
download(relPath: string): Promise<Bytes>;
|
|
6
7
|
upload(
|
|
7
|
-
files: File[] |
|
|
8
|
+
files: File[] | FileCollection | { name: string; data: BlobInput }[],
|
|
8
9
|
authToken: string,
|
|
9
10
|
): Promise<ServiceUploadResult[]>;
|
|
10
11
|
}
|
|
@@ -24,13 +25,13 @@ export function createFileClient(hostUrl: string, clientName: string): FileClien
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
async function upload(
|
|
27
|
-
files: File[] |
|
|
28
|
+
files: File[] | FileCollection | { name: string; data: BlobInput }[],
|
|
28
29
|
authToken: string,
|
|
29
30
|
): Promise<ServiceUploadResult[]> {
|
|
30
31
|
const formData = new FormData();
|
|
31
|
-
const
|
|
32
|
+
const fileArr = Array.isArray(files) ? files : Array.from(files);
|
|
32
33
|
|
|
33
|
-
for (const file of
|
|
34
|
+
for (const file of fileArr) {
|
|
34
35
|
if ("data" in file) {
|
|
35
36
|
// 커스텀 객체 ({ name, data })
|
|
36
37
|
const blob = file.data instanceof Blob ? file.data : new Blob([file.data]);
|
|
@@ -54,7 +55,7 @@ export function createFileClient(hostUrl: string, clientName: string): FileClien
|
|
|
54
55
|
throw new Error(`업로드 실패: ${res.statusText}`);
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
return res.json();
|
|
58
|
+
return (await res.json()) as ServiceUploadResult[];
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
return {
|
package/src/index.ts
CHANGED
|
@@ -5,6 +5,8 @@ import type {
|
|
|
5
5
|
ServiceMessage,
|
|
6
6
|
ServiceProtocol,
|
|
7
7
|
} from "@simplysm/service-common";
|
|
8
|
+
import type { WorkerLike } from "../types/browser-compat";
|
|
9
|
+
import { isWorkerSupported, createBrowserWorker } from "../types/browser-compat";
|
|
8
10
|
|
|
9
11
|
export interface ClientProtocolWrapper {
|
|
10
12
|
encode(uuid: string, message: ServiceMessage): Promise<{ chunks: Bytes[]; totalSize: number }>;
|
|
@@ -13,7 +15,7 @@ export interface ClientProtocolWrapper {
|
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
// 공유 worker 상태 (싱글턴 패턴)
|
|
16
|
-
let worker:
|
|
18
|
+
let worker: WorkerLike | undefined;
|
|
17
19
|
const workerResolvers = new LazyGcMap<
|
|
18
20
|
string,
|
|
19
21
|
{ resolve: (res: unknown) => void; reject: (err: Error) => void }
|
|
@@ -30,12 +32,12 @@ let workerAvailable: boolean | undefined;
|
|
|
30
32
|
|
|
31
33
|
function isWorkerAvailable(): boolean {
|
|
32
34
|
if (workerAvailable === undefined) {
|
|
33
|
-
workerAvailable =
|
|
35
|
+
workerAvailable = isWorkerSupported();
|
|
34
36
|
}
|
|
35
37
|
return workerAvailable;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
function getWorker():
|
|
40
|
+
function getWorker(): WorkerLike | undefined {
|
|
39
41
|
if (!isWorkerAvailable()) {
|
|
40
42
|
return undefined;
|
|
41
43
|
}
|
|
@@ -43,9 +45,11 @@ function getWorker(): Worker | undefined {
|
|
|
43
45
|
if (!worker) {
|
|
44
46
|
// 모던 번들러 (Vite/Esbuild/Webpack)가 이 구문을 사용하여 Worker를 별도 파일로 분리/로드함
|
|
45
47
|
// 참고: import.meta.resolve 대신 상대 경로 사용 (Vite 호환성)
|
|
46
|
-
worker =
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
worker = createBrowserWorker(
|
|
49
|
+
new URL("../workers/client-protocol.worker.ts", import.meta.url),
|
|
50
|
+
{ type: "module" },
|
|
51
|
+
);
|
|
52
|
+
if (worker == null) return undefined;
|
|
49
53
|
|
|
50
54
|
worker.onmessage = (event: MessageEvent) => {
|
|
51
55
|
const { id, type, result, error } = event.data as {
|
|
@@ -78,14 +82,14 @@ function getWorker(): Worker | undefined {
|
|
|
78
82
|
async function runWorker(
|
|
79
83
|
type: "encode" | "decode",
|
|
80
84
|
data: unknown,
|
|
81
|
-
transferables:
|
|
85
|
+
transferables: ArrayBuffer[] = [],
|
|
82
86
|
): Promise<unknown> {
|
|
83
87
|
return new Promise((resolve, reject) => {
|
|
84
88
|
const id = Uuid.generate().toString();
|
|
85
89
|
|
|
86
90
|
workerResolvers.set(id, { resolve, reject });
|
|
87
91
|
// workerAvailable 확인 후 호출되므로 worker는 항상 존재
|
|
88
|
-
getWorker()!.postMessage({ id, type, data },
|
|
92
|
+
getWorker()!.postMessage({ id, type, data }, transferables);
|
|
89
93
|
});
|
|
90
94
|
}
|
|
91
95
|
|
|
@@ -135,7 +139,7 @@ export function createClientProtocolWrapper(protocol: ServiceProtocol): ClientPr
|
|
|
135
139
|
|
|
136
140
|
// [Worker]
|
|
137
141
|
// Zero-copy 전송 (버퍼 소유권이 Worker로 이동)
|
|
138
|
-
const rawResult = await runWorker("decode", bytes, [bytes.buffer]);
|
|
142
|
+
const rawResult = await runWorker("decode", bytes, [bytes.buffer as ArrayBuffer]);
|
|
139
143
|
|
|
140
144
|
// Worker의 plain object 결과에서 클래스 인스턴스 복원 (DateTime 등)
|
|
141
145
|
return transfer.decode(rawResult) as ServiceMessageDecodeResult<ServiceMessage>;
|
package/src/service-client.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { EventEmitter } from "@simplysm/core-common";
|
|
|
3
3
|
import type { ServiceEventDef } from "@simplysm/service-common";
|
|
4
4
|
import { createServiceProtocol } from "@simplysm/service-common";
|
|
5
5
|
|
|
6
|
+
import type { BlobInput, FileCollection } from "./types/browser-compat";
|
|
6
7
|
import type { ServiceConnectionOptions } from "./types/connection-options";
|
|
7
8
|
import type { ServiceProgress, ServiceProgressState } from "./types/progress.types";
|
|
8
9
|
import { createServiceTransport, type ServiceTransport } from "./transport/service-transport";
|
|
@@ -18,7 +19,6 @@ interface ServiceClientEvents {
|
|
|
18
19
|
"response-progress": ServiceProgressState;
|
|
19
20
|
"server-progress": ServiceProgressState;
|
|
20
21
|
"state": "connected" | "closed" | "reconnecting";
|
|
21
|
-
"reload": Set<string>;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export class ServiceClient extends EventEmitter<ServiceClientEvents> {
|
|
@@ -74,9 +74,6 @@ export class ServiceClient extends EventEmitter<ServiceClientEvents> {
|
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
-
this._transport.on("reload", (changedFiles) => {
|
|
78
|
-
this.emit("reload", changedFiles);
|
|
79
|
-
});
|
|
80
77
|
}
|
|
81
78
|
|
|
82
79
|
// 타입 안전성을 위한 프록시 생성 메서드
|
|
@@ -154,7 +151,7 @@ export class ServiceClient extends EventEmitter<ServiceClientEvents> {
|
|
|
154
151
|
await this._eventClient.emit(eventDef, infoSelector, data);
|
|
155
152
|
}
|
|
156
153
|
|
|
157
|
-
async uploadFile(files: File[] |
|
|
154
|
+
async uploadFile(files: File[] | FileCollection | { name: string; data: BlobInput }[]) {
|
|
158
155
|
if (this._authToken == null) {
|
|
159
156
|
throw new Error(
|
|
160
157
|
"인증 토큰이 없습니다. 파일 업로드 전에 auth()를 호출하여 인증해 주세요.",
|
|
@@ -10,7 +10,6 @@ import type { ServiceProgress } from "../types/progress.types";
|
|
|
10
10
|
import type { SocketProvider } from "./socket-provider";
|
|
11
11
|
|
|
12
12
|
export interface ServiceTransportEvents {
|
|
13
|
-
reload: Set<string>;
|
|
14
13
|
event: { keys: string[]; data: unknown };
|
|
15
14
|
}
|
|
16
15
|
|
|
@@ -61,7 +60,7 @@ export function createServiceTransport(
|
|
|
61
60
|
pendingRequests.set(uuid, { resolve, reject, progress });
|
|
62
61
|
});
|
|
63
62
|
|
|
64
|
-
// Promise가 고아가 되었을 때 unhandled rejection 방지 (예:
|
|
63
|
+
// Promise가 고아가 되었을 때 unhandled rejection 방지 (예: 소켓 연결 끊김 시)
|
|
65
64
|
responsePromise.catch(() => {});
|
|
66
65
|
|
|
67
66
|
// 요청 전송
|
|
@@ -139,11 +138,6 @@ export function createServiceTransport(
|
|
|
139
138
|
pendingRequests.delete(decoded.uuid);
|
|
140
139
|
|
|
141
140
|
listenerInfo?.reject(toError(decoded.message.body));
|
|
142
|
-
} else if (decoded.message.name === "reload") {
|
|
143
|
-
const body = decoded.message.body as { clientName: string; changedFileSet: Set<string> };
|
|
144
|
-
if (socket.clientName === body.clientName) {
|
|
145
|
-
emitter.emit("reload", body.changedFileSet);
|
|
146
|
-
}
|
|
147
141
|
} else if (decoded.message.name === "evt:on") {
|
|
148
142
|
const body = decoded.message.body as { keys: string[]; data: unknown };
|
|
149
143
|
emitter.emit("event", { keys: body.keys, data: body.data });
|
|
@@ -2,6 +2,12 @@ import type { Bytes } from "@simplysm/core-common";
|
|
|
2
2
|
import { EventEmitter, Uuid, wait } from "@simplysm/core-common";
|
|
3
3
|
import consola from "consola";
|
|
4
4
|
|
|
5
|
+
// Node.js 환경에서 글로벌 WebSocket이 없으면 ws 패키지로 polyfill
|
|
6
|
+
if (typeof globalThis.WebSocket === "undefined") {
|
|
7
|
+
const { WebSocket } = await import("ws");
|
|
8
|
+
globalThis.WebSocket = WebSocket as never;
|
|
9
|
+
}
|
|
10
|
+
|
|
5
11
|
const logger = consola.withTag("service-client:SocketProvider");
|
|
6
12
|
|
|
7
13
|
export interface SocketProviderEvents {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-environment compatible types for browser globals.
|
|
3
|
+
* DOM-only 타입(FileList, BlobPart, Worker, Transferable)을 대체하여
|
|
4
|
+
* Node.js / browser 양쪽 환경에서 typecheck가 통과하도록 한다.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Blob constructor가 허용하는 데이터 타입 (DOM BlobPart 대체) */
|
|
8
|
+
export type BlobInput = Blob | Uint8Array<ArrayBuffer> | ArrayBuffer | string;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* File 컬렉션 인터페이스 (DOM FileList 대체).
|
|
12
|
+
* 브라우저 FileList와 구조적으로 호환됨.
|
|
13
|
+
*/
|
|
14
|
+
export interface FileCollection {
|
|
15
|
+
readonly length: number;
|
|
16
|
+
item(index: number): File | null;
|
|
17
|
+
[index: number]: File;
|
|
18
|
+
[Symbol.iterator](): IterableIterator<File>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Web Worker 인터페이스 (DOM Worker 대체).
|
|
23
|
+
* 브라우저 Worker와 구조적으로 호환됨.
|
|
24
|
+
*/
|
|
25
|
+
export interface WorkerLike {
|
|
26
|
+
onmessage: ((ev: MessageEvent) => void) | null;
|
|
27
|
+
postMessage(message: unknown, transfer?: unknown[]): void;
|
|
28
|
+
terminate(): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Web Worker API 지원 여부 확인 */
|
|
32
|
+
export function isWorkerSupported(): boolean {
|
|
33
|
+
return "Worker" in globalThis;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Web Worker 생성 (미지원 환경이면 undefined) */
|
|
37
|
+
export function createBrowserWorker(
|
|
38
|
+
url: URL,
|
|
39
|
+
options: { type: string },
|
|
40
|
+
): WorkerLike | undefined {
|
|
41
|
+
if (!isWorkerSupported()) return undefined;
|
|
42
|
+
const ctor = (globalThis as Record<string, unknown>)["Worker"] as new (
|
|
43
|
+
url: URL,
|
|
44
|
+
opts: { type: string },
|
|
45
|
+
) => WorkerLike;
|
|
46
|
+
return new ctor(url, options);
|
|
47
|
+
}
|
|
@@ -42,7 +42,7 @@ self.onmessage = (event: MessageEvent) => {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// [Worker -> Main] 성공 응답
|
|
45
|
-
self.postMessage({ id, type: "success", result },
|
|
45
|
+
self.postMessage({ id, type: "success", result }, transferList);
|
|
46
46
|
} catch (err) {
|
|
47
47
|
// [Worker -> Main] 에러 응답
|
|
48
48
|
self.postMessage({
|