@simplysm/service-client 13.0.0-beta.51 → 13.0.1
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 +41 -11
- package/dist/features/event-client.d.ts +2 -5
- package/dist/features/event-client.d.ts.map +1 -1
- package/dist/features/event-client.js +26 -25
- package/dist/features/event-client.js.map +1 -1
- package/dist/features/file-client.d.ts +2 -4
- package/dist/features/file-client.d.ts.map +1 -1
- package/dist/features/file-client.js +11 -11
- package/dist/features/file-client.js.map +1 -1
- package/dist/features/orm/orm-client-connector.d.ts +5 -6
- package/dist/features/orm/orm-client-connector.d.ts.map +1 -1
- package/dist/features/orm/orm-client-connector.js +23 -15
- package/dist/features/orm/orm-client-connector.js.map +1 -1
- package/dist/features/orm/orm-connect-config.d.ts +3 -3
- package/dist/features/orm/orm-connect-config.d.ts.map +1 -1
- package/dist/index.d.ts +17 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -11
- package/dist/index.js.map +1 -1
- package/dist/protocol/client-protocol-wrapper.d.ts +3 -15
- package/dist/protocol/client-protocol-wrapper.d.ts.map +1 -1
- package/dist/protocol/client-protocol-wrapper.js +68 -75
- package/dist/protocol/client-protocol-wrapper.js.map +1 -1
- package/dist/service-client.d.ts +1 -0
- package/dist/service-client.d.ts.map +1 -1
- package/dist/service-client.js +17 -9
- package/dist/service-client.js.map +1 -1
- package/dist/transport/service-transport.d.ts +6 -12
- package/dist/transport/service-transport.d.ts.map +1 -1
- package/dist/transport/service-transport.js +40 -42
- package/dist/transport/service-transport.js.map +1 -1
- package/dist/transport/socket-provider.d.ts +6 -21
- package/dist/transport/socket-provider.d.ts.map +1 -1
- package/dist/transport/socket-provider.js +90 -91
- package/dist/transport/socket-provider.js.map +1 -1
- package/dist/workers/client-protocol.worker.js +2 -2
- package/dist/workers/client-protocol.worker.js.map +1 -1
- package/package.json +4 -4
- package/src/features/event-client.ts +41 -21
- package/src/features/file-client.ts +18 -10
- package/src/features/orm/orm-client-connector.ts +37 -17
- package/src/features/orm/orm-connect-config.ts +3 -3
- package/src/index.ts +17 -11
- package/src/protocol/client-protocol-wrapper.ts +96 -95
- package/src/service-client.ts +16 -8
- package/src/transport/service-transport.ts +55 -41
- package/src/transport/socket-provider.ts +103 -87
- package/src/workers/client-protocol.worker.ts +3 -3
package/README.md
CHANGED
|
@@ -22,21 +22,28 @@ pnpm add @simplysm/service-client
|
|
|
22
22
|
|
|
23
23
|
## Main Modules
|
|
24
24
|
|
|
25
|
-
### Core Classes
|
|
25
|
+
### Core Functions and Classes
|
|
26
26
|
|
|
27
|
-
| Class | Description |
|
|
27
|
+
| Function/Class | Description |
|
|
28
28
|
|--------|------|
|
|
29
|
-
| `
|
|
29
|
+
| `createServiceClient` | Factory function for creating a ServiceClient instance. **Recommended over using the class constructor directly.** |
|
|
30
|
+
| `ServiceClient` | Main service client class. Provides integrated connection management, RPC calls, events, files, and authentication. |
|
|
31
|
+
| `createServiceTransport` | Factory function for creating a ServiceTransport instance |
|
|
30
32
|
| `ServiceTransport` | Message transport layer. Handles request/response matching, progress tracking, and protocol encoding/decoding. |
|
|
33
|
+
| `createSocketProvider` | Factory function for creating a SocketProvider instance |
|
|
31
34
|
| `SocketProvider` | WebSocket connection management. Handles heartbeat, auto-reconnection, and connection state events. |
|
|
35
|
+
| `createClientProtocolWrapper` | Factory function for creating a ClientProtocolWrapper instance |
|
|
32
36
|
| `ClientProtocolWrapper` | Protocol wrapper. Automatically selects main thread/Web Worker for encoding/decoding based on data size. |
|
|
33
37
|
|
|
34
|
-
### Feature Classes
|
|
38
|
+
### Feature Functions and Classes
|
|
35
39
|
|
|
36
|
-
| Class | Description |
|
|
40
|
+
| Function/Class | Description |
|
|
37
41
|
|--------|------|
|
|
42
|
+
| `createEventClient` | Factory function for creating an EventClient instance |
|
|
38
43
|
| `EventClient` | Server event subscription/publishing. Supports automatic listener recovery on reconnection. |
|
|
44
|
+
| `createFileClient` | Factory function for creating a FileClient instance |
|
|
39
45
|
| `FileClient` | Handles HTTP-based file upload/download. |
|
|
46
|
+
| `createOrmClientConnector` | Factory function for creating an OrmClientConnector instance |
|
|
40
47
|
| `OrmClientConnector` | ORM remote connection connector. Supports transaction/non-transaction connections. |
|
|
41
48
|
| `OrmClientDbContextExecutor` | ORM DbContext remote executor. Calls server's `OrmService` via RPC. |
|
|
42
49
|
|
|
@@ -55,10 +62,10 @@ pnpm add @simplysm/service-client
|
|
|
55
62
|
### Basic Connection and Service Call
|
|
56
63
|
|
|
57
64
|
```typescript
|
|
58
|
-
import {
|
|
65
|
+
import { createServiceClient } from "@simplysm/service-client";
|
|
59
66
|
|
|
60
|
-
// Create client
|
|
61
|
-
const client =
|
|
67
|
+
// Create client (recommended: use factory function)
|
|
68
|
+
const client = createServiceClient("my-app", {
|
|
62
69
|
host: "localhost",
|
|
63
70
|
port: 8080,
|
|
64
71
|
ssl: false,
|
|
@@ -261,11 +268,11 @@ const buffer = await client.downloadFileBuffer("/uploads/2024/file.pdf");
|
|
|
261
268
|
Access the database through the server's ORM service. Transactions are automatically managed.
|
|
262
269
|
|
|
263
270
|
```typescript
|
|
264
|
-
import {
|
|
271
|
+
import { createOrmClientConnector } from "@simplysm/service-client";
|
|
265
272
|
import type { OrmConnectConfig } from "@simplysm/service-client";
|
|
266
273
|
import { DbContext } from "@simplysm/orm-common";
|
|
267
274
|
|
|
268
|
-
const connector =
|
|
275
|
+
const connector = createOrmClientConnector(client);
|
|
269
276
|
|
|
270
277
|
// Connect with transaction (auto rollback on error)
|
|
271
278
|
await connector.connect(
|
|
@@ -307,11 +314,34 @@ Server connection configuration interface.
|
|
|
307
314
|
| `ssl` | `boolean` | No | SSL usage. If `true`, uses `wss://` / `https://` |
|
|
308
315
|
| `maxReconnectCount` | `number` | No | Max reconnection attempts (default: 10). 0 means no reconnection |
|
|
309
316
|
|
|
317
|
+
### createServiceClient
|
|
318
|
+
|
|
319
|
+
Factory function for creating a ServiceClient instance.
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
function createServiceClient(name: string, options: ServiceConnectionConfig): ServiceClient
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Parameters:**
|
|
326
|
+
- `name` - Client identifier (used for server-side logging and connection management)
|
|
327
|
+
- `options` - Server connection configuration
|
|
328
|
+
|
|
329
|
+
**Returns:** ServiceClient instance
|
|
330
|
+
|
|
331
|
+
**Example:**
|
|
332
|
+
```typescript
|
|
333
|
+
const client = createServiceClient("my-app", {
|
|
334
|
+
host: "localhost",
|
|
335
|
+
port: 8080,
|
|
336
|
+
ssl: false,
|
|
337
|
+
});
|
|
338
|
+
```
|
|
339
|
+
|
|
310
340
|
### ServiceClient
|
|
311
341
|
|
|
312
342
|
| Method/Property | Return Type | Description |
|
|
313
343
|
|-------------|----------|------|
|
|
314
|
-
| `constructor(name, options)` | - | Create client instance. `name` is the client identifier |
|
|
344
|
+
| `constructor(name, options)` | - | Create client instance. `name` is the client identifier. **Note: Prefer using `createServiceClient()` factory function.** |
|
|
315
345
|
| `connected` | `boolean` | WebSocket connection status |
|
|
316
346
|
| `hostUrl` | `string` | HTTP URL (e.g., `http://localhost:8080`) |
|
|
317
347
|
| `connect()` | `Promise<void>` | Connect to server via WebSocket |
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import type { ServiceEventDef } from "@simplysm/service-common";
|
|
2
2
|
import type { ServiceTransport } from "../transport/service-transport";
|
|
3
|
-
export
|
|
4
|
-
private readonly _transport;
|
|
5
|
-
private readonly _listenerMap;
|
|
6
|
-
constructor(_transport: ServiceTransport);
|
|
3
|
+
export interface EventClient {
|
|
7
4
|
addListener<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, info: TInfo, cb: (data: TData) => PromiseLike<void>): Promise<string>;
|
|
8
5
|
removeListener(key: string): Promise<void>;
|
|
9
6
|
emitToServer<TInfo, TData>(eventDef: ServiceEventDef<TInfo, TData>, infoSelector: (item: TInfo) => boolean, data: TData): Promise<void>;
|
|
10
7
|
reRegisterAll(): Promise<void>;
|
|
11
|
-
private _executeByKey;
|
|
12
8
|
}
|
|
9
|
+
export declare function createEventClient(transport: ServiceTransport): EventClient;
|
|
13
10
|
//# sourceMappingURL=event-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-client.d.ts","sourceRoot":"","sources":["../../src/features/event-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAKvE,
|
|
1
|
+
{"version":3,"file":"event-client.d.ts","sourceRoot":"","sources":["../../src/features/event-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAKvE,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,KAAK,EAAE,KAAK,EACtB,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,CAAC;IACnB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,YAAY,CAAC,KAAK,EAAE,KAAK,EACvB,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,CAAC;IACjB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,WAAW,CAgG1E"}
|
|
@@ -1,51 +1,47 @@
|
|
|
1
1
|
import { Uuid } from "@simplysm/core-common";
|
|
2
2
|
import consola from "consola";
|
|
3
3
|
const logger = consola.withTag("service-client:EventClient");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
_listenerMap = /* @__PURE__ */ new Map();
|
|
12
|
-
async addListener(eventDef, info, cb) {
|
|
4
|
+
function createEventClient(transport) {
|
|
5
|
+
const listenerMap = /* @__PURE__ */ new Map();
|
|
6
|
+
transport.on("event", async ({ keys, data }) => {
|
|
7
|
+
await executeByKey(keys, data);
|
|
8
|
+
});
|
|
9
|
+
async function addListener(eventDef, info, cb) {
|
|
13
10
|
const key = Uuid.new().toString();
|
|
14
11
|
const eventName = eventDef.eventName;
|
|
15
|
-
await
|
|
12
|
+
await transport.send({
|
|
16
13
|
name: "evt:add",
|
|
17
14
|
body: { key, name: eventName, info }
|
|
18
15
|
});
|
|
19
|
-
|
|
16
|
+
listenerMap.set(key, {
|
|
20
17
|
eventName,
|
|
21
18
|
info,
|
|
22
19
|
cb
|
|
23
20
|
});
|
|
24
21
|
return key;
|
|
25
22
|
}
|
|
26
|
-
async removeListener(key) {
|
|
27
|
-
await
|
|
28
|
-
|
|
23
|
+
async function removeListener(key) {
|
|
24
|
+
await transport.send({ name: "evt:remove", body: { key } });
|
|
25
|
+
listenerMap.delete(key);
|
|
29
26
|
}
|
|
30
|
-
async emitToServer(eventDef, infoSelector, data) {
|
|
27
|
+
async function emitToServer(eventDef, infoSelector, data) {
|
|
31
28
|
const eventName = eventDef.eventName;
|
|
32
|
-
const listenerInfos = await
|
|
29
|
+
const listenerInfos = await transport.send({
|
|
33
30
|
name: "evt:gets",
|
|
34
31
|
body: { name: eventName }
|
|
35
32
|
});
|
|
36
33
|
const targetKeys = listenerInfos.filter((item) => infoSelector(item.info)).map((item) => item.key);
|
|
37
34
|
if (targetKeys.length > 0) {
|
|
38
|
-
await
|
|
35
|
+
await transport.send({
|
|
39
36
|
name: "evt:emit",
|
|
40
37
|
body: { keys: targetKeys, data }
|
|
41
38
|
});
|
|
42
39
|
}
|
|
43
40
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
for (const [key, value] of this._listenerMap.entries()) {
|
|
41
|
+
async function reRegisterAll() {
|
|
42
|
+
for (const [key, value] of listenerMap.entries()) {
|
|
47
43
|
try {
|
|
48
|
-
await
|
|
44
|
+
await transport.send({
|
|
49
45
|
name: "evt:add",
|
|
50
46
|
body: { key, name: value.eventName, info: value.info }
|
|
51
47
|
});
|
|
@@ -54,10 +50,9 @@ class EventClient {
|
|
|
54
50
|
}
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
|
-
|
|
58
|
-
async _executeByKey(keys, data) {
|
|
53
|
+
async function executeByKey(keys, data) {
|
|
59
54
|
for (const key of keys) {
|
|
60
|
-
const entry =
|
|
55
|
+
const entry = listenerMap.get(key);
|
|
61
56
|
if (entry != null) {
|
|
62
57
|
try {
|
|
63
58
|
await entry.cb(data);
|
|
@@ -67,8 +62,14 @@ class EventClient {
|
|
|
67
62
|
}
|
|
68
63
|
}
|
|
69
64
|
}
|
|
65
|
+
return {
|
|
66
|
+
addListener,
|
|
67
|
+
removeListener,
|
|
68
|
+
emitToServer,
|
|
69
|
+
reRegisterAll
|
|
70
|
+
};
|
|
70
71
|
}
|
|
71
72
|
export {
|
|
72
|
-
|
|
73
|
+
createEventClient
|
|
73
74
|
};
|
|
74
75
|
//# sourceMappingURL=event-client.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/features/event-client.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,YAAY;AAGrB,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,4BAA4B;
|
|
4
|
+
"mappings": "AAAA,SAAS,YAAY;AAGrB,OAAO,aAAa;AAEpB,MAAM,SAAS,QAAQ,QAAQ,4BAA4B;AAiBpD,SAAS,kBAAkB,WAA0C;AAC1E,QAAM,cAAc,oBAAI,IAGtB;AAEF,YAAU,GAAG,SAAS,OAAO,EAAE,MAAM,KAAK,MAAM;AAC9C,UAAM,aAAa,MAAM,IAAI;AAAA,EAC/B,CAAC;AAED,iBAAe,YACb,UACA,MACA,IACiB;AACjB,UAAM,MAAM,KAAK,IAAI,EAAE,SAAS;AAChC,UAAM,YAAY,SAAS;AAG3B,UAAM,UAAU,KAAK;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,EAAE,KAAK,MAAM,WAAW,KAAK;AAAA,IACrC,CAAC;AAGD,gBAAY,IAAI,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,iBAAe,eAAe,KAA4B;AACxD,UAAM,UAAU,KAAK,EAAE,MAAM,cAAc,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1D,gBAAY,OAAO,GAAG;AAAA,EACxB;AAEA,iBAAe,aACb,UACA,cACA,MACe;AACf,UAAM,YAAY,SAAS;AAG3B,UAAM,gBAAiB,MAAM,UAAU,KAAK;AAAA,MAC1C,MAAM;AAAA,MACN,MAAM,EAAE,MAAM,UAAU;AAAA,IAC1B,CAAC;AAED,UAAM,aAAa,cAAc,OAAO,CAAC,SAAS,aAAa,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,GAAG;AAEjG,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,YAAY,KAAK;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,iBAAe,gBAA+B;AAC5C,eAAW,CAAC,KAAK,KAAK,KAAK,YAAY,QAAQ,GAAG;AAChD,UAAI;AACF,cAAM,UAAU,KAAK;AAAA,UACnB,MAAM;AAAA,UACN,MAAM,EAAE,KAAK,MAAM,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QACvD,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,MAAM,mEAAiB,EAAE,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAGA,iBAAe,aAAa,MAAgB,MAA8B;AACxE,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,UAAI,SAAS,MAAM;AACjB,YAAI;AACF,gBAAM,MAAM,GAAG,IAAI;AAAA,QACrB,SAAS,KAAK;AACZ,iBAAO,MAAM,sDAAc,EAAE,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import type { Bytes } from "@simplysm/core-common";
|
|
2
2
|
import type { ServiceUploadResult } from "@simplysm/service-common";
|
|
3
|
-
export
|
|
4
|
-
private readonly _hostUrl;
|
|
5
|
-
private readonly _clientName;
|
|
6
|
-
constructor(_hostUrl: string, _clientName: string);
|
|
3
|
+
export interface FileClient {
|
|
7
4
|
download(relPath: string): Promise<Bytes>;
|
|
8
5
|
upload(files: File[] | FileList | {
|
|
9
6
|
name: string;
|
|
10
7
|
data: BlobPart;
|
|
11
8
|
}[], authToken: string): Promise<ServiceUploadResult[]>;
|
|
12
9
|
}
|
|
10
|
+
export declare function createFileClient(hostUrl: string, clientName: string): FileClient;
|
|
13
11
|
//# sourceMappingURL=file-client.d.ts.map
|
|
@@ -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;AAEpE,
|
|
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;AAEpE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CACJ,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,EAAE,EAC7D,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"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
this._clientName = _clientName;
|
|
5
|
-
}
|
|
6
|
-
async download(relPath) {
|
|
7
|
-
const url = `${this._hostUrl}${relPath.startsWith("/") ? "" : "/"}${relPath}`;
|
|
1
|
+
function createFileClient(hostUrl, clientName) {
|
|
2
|
+
async function download(relPath) {
|
|
3
|
+
const url = `${hostUrl}${relPath.startsWith("/") ? "" : "/"}${relPath}`;
|
|
8
4
|
const res = await fetch(url);
|
|
9
5
|
if (!res.ok) {
|
|
10
6
|
throw new Error(`Download failed: ${res.status} ${res.statusText}`);
|
|
11
7
|
}
|
|
12
8
|
return new Uint8Array(await res.arrayBuffer());
|
|
13
9
|
}
|
|
14
|
-
async upload(files, authToken) {
|
|
10
|
+
async function upload(files, authToken) {
|
|
15
11
|
const formData = new FormData();
|
|
16
12
|
const fileList = files instanceof FileList ? Array.from(files) : files;
|
|
17
13
|
for (const file of fileList) {
|
|
@@ -22,10 +18,10 @@ class FileClient {
|
|
|
22
18
|
formData.append("files", file, file.name);
|
|
23
19
|
}
|
|
24
20
|
}
|
|
25
|
-
const res = await fetch(`${
|
|
21
|
+
const res = await fetch(`${hostUrl}/upload`, {
|
|
26
22
|
method: "POST",
|
|
27
23
|
headers: {
|
|
28
|
-
"x-sd-client-name":
|
|
24
|
+
"x-sd-client-name": clientName,
|
|
29
25
|
"Authorization": `Bearer ${authToken}`
|
|
30
26
|
},
|
|
31
27
|
body: formData
|
|
@@ -35,8 +31,12 @@ class FileClient {
|
|
|
35
31
|
}
|
|
36
32
|
return res.json();
|
|
37
33
|
}
|
|
34
|
+
return {
|
|
35
|
+
download,
|
|
36
|
+
upload
|
|
37
|
+
};
|
|
38
38
|
}
|
|
39
39
|
export {
|
|
40
|
-
|
|
40
|
+
createFileClient
|
|
41
41
|
};
|
|
42
42
|
//# sourceMappingURL=file-client.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/features/file-client.ts"],
|
|
4
|
-
"mappings": "
|
|
4
|
+
"mappings": "AAWO,SAAS,iBAAiB,SAAiB,YAAgC;AAChF,iBAAe,SAAS,SAAiC;AAEvD,UAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,WAAW,GAAG,IAAI,KAAK,GAAG,GAAG,OAAO;AAErE,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,oBAAoB,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,IACpE;AAGA,WAAO,IAAI,WAAW,MAAM,IAAI,YAAY,CAAC;AAAA,EAC/C;AAEA,iBAAe,OACb,OACA,WACgC;AAChC,UAAM,WAAW,IAAI,SAAS;AAC9B,UAAM,WAAW,iBAAiB,WAAW,MAAM,KAAK,KAAK,IAAI;AAEjE,eAAW,QAAQ,UAAU;AAC3B,UAAI,UAAU,MAAM;AAElB,cAAM,OAAO,KAAK,gBAAgB,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC;AACzE,iBAAS,OAAO,SAAS,MAAM,KAAK,IAAI;AAAA,MAC1C,OAAO;AAEL,iBAAS,OAAO,SAAS,MAAM,KAAK,IAAI;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,WAAW;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,oBAAoB;AAAA,QACpB,iBAAiB,UAAU,SAAS;AAAA,MACtC;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,kBAAkB,IAAI,UAAU,EAAE;AAAA,IACpD;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import type { OrmConnectConfig } from "./orm-connect-config";
|
|
2
|
-
import type
|
|
2
|
+
import { type DbContextDef, type DbContextInstance } from "@simplysm/orm-common";
|
|
3
3
|
import type { ServiceClient } from "../../service-client";
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
connect<T extends DbContext, R>(config: OrmConnectConfig<T>, callback: (conn: T) => Promise<R> | R): Promise<R>;
|
|
8
|
-
connectWithoutTransaction<T extends DbContext, R>(config: OrmConnectConfig<T>, callback: (conn: T) => Promise<R> | R): Promise<R>;
|
|
4
|
+
export interface OrmClientConnector {
|
|
5
|
+
connect<TDef extends DbContextDef<any, any, any>, R>(config: OrmConnectConfig<TDef>, callback: (conn: DbContextInstance<TDef>) => Promise<R> | R): Promise<R>;
|
|
6
|
+
connectWithoutTransaction<TDef extends DbContextDef<any, any, any>, R>(config: OrmConnectConfig<TDef>, callback: (conn: DbContextInstance<TDef>) => Promise<R> | R): Promise<R>;
|
|
9
7
|
}
|
|
8
|
+
export declare function createOrmClientConnector(serviceClient: ServiceClient): OrmClientConnector;
|
|
10
9
|
//# sourceMappingURL=orm-client-connector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orm-client-connector.d.ts","sourceRoot":"","sources":["../../../src/features/orm/orm-client-connector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"orm-client-connector.d.ts","sourceRoot":"","sources":["../../../src/features/orm/orm-client-connector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAmB,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,IAAI,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACjD,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC1D,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,yBAAyB,CAAC,IAAI,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACnE,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAC1D,OAAO,CAAC,CAAC,CAAC,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,aAAa,GAAG,kBAAkB,CAqDzF"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { OrmClientDbContextExecutor } from "./orm-client-db-context-executor.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
async connect(config, callback) {
|
|
2
|
+
import { createDbContext } from "@simplysm/orm-common";
|
|
3
|
+
function createOrmClientConnector(serviceClient) {
|
|
4
|
+
async function connect(config, callback) {
|
|
7
5
|
var _a, _b;
|
|
8
|
-
const executor = new OrmClientDbContextExecutor(
|
|
6
|
+
const executor = new OrmClientDbContextExecutor(serviceClient, config.connOpt);
|
|
9
7
|
const info = await executor.getInfo();
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
const database = ((_a = config.dbContextOpt) == null ? void 0 : _a.database) ?? info.database;
|
|
9
|
+
if (database == null || database === "") {
|
|
10
|
+
throw new Error("Database name is required");
|
|
11
|
+
}
|
|
12
|
+
const db = createDbContext(config.dbContextDef, executor, {
|
|
13
|
+
database,
|
|
13
14
|
schema: ((_b = config.dbContextOpt) == null ? void 0 : _b.schema) ?? info.schema
|
|
14
15
|
});
|
|
15
16
|
return db.connect(async () => {
|
|
@@ -23,19 +24,26 @@ class OrmClientConnector {
|
|
|
23
24
|
}
|
|
24
25
|
});
|
|
25
26
|
}
|
|
26
|
-
async connectWithoutTransaction(config, callback) {
|
|
27
|
+
async function connectWithoutTransaction(config, callback) {
|
|
27
28
|
var _a, _b;
|
|
28
|
-
const executor = new OrmClientDbContextExecutor(
|
|
29
|
+
const executor = new OrmClientDbContextExecutor(serviceClient, config.connOpt);
|
|
29
30
|
const info = await executor.getInfo();
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const database = ((_a = config.dbContextOpt) == null ? void 0 : _a.database) ?? info.database;
|
|
32
|
+
if (database == null || database === "") {
|
|
33
|
+
throw new Error("Database name is required");
|
|
34
|
+
}
|
|
35
|
+
const db = createDbContext(config.dbContextDef, executor, {
|
|
36
|
+
database,
|
|
33
37
|
schema: ((_b = config.dbContextOpt) == null ? void 0 : _b.schema) ?? info.schema
|
|
34
38
|
});
|
|
35
39
|
return db.connectWithoutTransaction(async () => callback(db));
|
|
36
40
|
}
|
|
41
|
+
return {
|
|
42
|
+
connect,
|
|
43
|
+
connectWithoutTransaction
|
|
44
|
+
};
|
|
37
45
|
}
|
|
38
46
|
export {
|
|
39
|
-
|
|
47
|
+
createOrmClientConnector
|
|
40
48
|
};
|
|
41
49
|
//# sourceMappingURL=orm-client-connector.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/features/orm/orm-client-connector.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,kCAAkC;
|
|
4
|
+
"mappings": "AAAA,SAAS,kCAAkC;AAE3C,SAAS,uBAAkE;AAcpE,SAAS,yBAAyB,eAAkD;AACzF,iBAAe,QACb,QACA,UACY;AApBhB;AAqBI,UAAM,WAAW,IAAI,2BAA2B,eAAe,OAAO,OAAO;AAC7E,UAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,UAAM,aAAW,YAAO,iBAAP,mBAAqB,aAAY,KAAK;AACvD,QAAI,YAAY,QAAQ,aAAa,IAAI;AACvC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,UAAM,KAAK,gBAAgB,OAAO,cAAc,UAAU;AAAA,MACxD;AAAA,MACA,UAAQ,YAAO,iBAAP,mBAAqB,WAAU,KAAK;AAAA,IAC9C,CAAC;AACD,WAAO,GAAG,QAAQ,YAAY;AAC5B,UAAI;AACF,eAAO,MAAM,SAAS,EAAE;AAAA,MAC1B,SAAS,KAAK;AACZ,YACE,eAAe,UACd,IAAI,QAAQ,SAAS,wCAAwC,KAC5D,IAAI,QAAQ,SAAS,+BAA+B,IACtD;AACA,cAAI,UAAU;AAAA,QAChB;AAEA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,iBAAe,0BACb,QACA,UACY;AAnDhB;AAoDI,UAAM,WAAW,IAAI,2BAA2B,eAAe,OAAO,OAAO;AAC7E,UAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,UAAM,aAAW,YAAO,iBAAP,mBAAqB,aAAY,KAAK;AACvD,QAAI,YAAY,QAAQ,aAAa,IAAI;AACvC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,UAAM,KAAK,gBAAgB,OAAO,cAAc,UAAU;AAAA,MACxD;AAAA,MACA,UAAQ,YAAO,iBAAP,mBAAqB,WAAU,KAAK;AAAA,IAC9C,CAAC;AACD,WAAO,GAAG,0BAA0B,YAAY,SAAS,EAAE,CAAC;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DbContextDef } from "@simplysm/orm-common";
|
|
2
2
|
import type { DbConnOptions } from "@simplysm/service-common";
|
|
3
|
-
export interface OrmConnectConfig<
|
|
4
|
-
|
|
3
|
+
export interface OrmConnectConfig<TDef extends DbContextDef<any, any, any>> {
|
|
4
|
+
dbContextDef: TDef;
|
|
5
5
|
connOpt: DbConnOptions & {
|
|
6
6
|
configName: string;
|
|
7
7
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orm-connect-config.d.ts","sourceRoot":"","sources":["../../../src/features/orm/orm-connect-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"orm-connect-config.d.ts","sourceRoot":"","sources":["../../../src/features/orm/orm-connect-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,gBAAgB,CAAC,IAAI,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACxE,YAAY,EAAE,IAAI,CAAC;IACnB,OAAO,EAAE,aAAa,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
1
|
+
export type { ServiceConnectionConfig } from "./types/connection-config";
|
|
2
|
+
export type { ServiceProgress, ServiceProgressState } from "./types/progress.types";
|
|
3
|
+
export type { SocketProvider, SocketProviderEvents } from "./transport/socket-provider";
|
|
4
|
+
export { createSocketProvider } from "./transport/socket-provider";
|
|
5
|
+
export type { ServiceTransport, ServiceTransportEvents } from "./transport/service-transport";
|
|
6
|
+
export { createServiceTransport } from "./transport/service-transport";
|
|
7
|
+
export type { ClientProtocolWrapper } from "./protocol/client-protocol-wrapper";
|
|
8
|
+
export { createClientProtocolWrapper } from "./protocol/client-protocol-wrapper";
|
|
9
|
+
export type { EventClient } from "./features/event-client";
|
|
10
|
+
export { createEventClient } from "./features/event-client";
|
|
11
|
+
export type { FileClient } from "./features/file-client";
|
|
12
|
+
export { createFileClient } from "./features/file-client";
|
|
13
|
+
export type { OrmConnectConfig } from "./features/orm/orm-connect-config";
|
|
14
|
+
export type { OrmClientConnector } from "./features/orm/orm-client-connector";
|
|
15
|
+
export { createOrmClientConnector } from "./features/orm/orm-client-connector";
|
|
16
|
+
export { OrmClientDbContextExecutor } from "./features/orm/orm-client-db-context-executor";
|
|
17
|
+
export { ServiceClient, createServiceClient, type RemoteService } from "./service-client";
|
|
12
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGpF,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGjF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,YAAY,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+CAA+C,CAAC;AAG3F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { createSocketProvider } from "./transport/socket-provider.js";
|
|
2
|
+
import { createServiceTransport } from "./transport/service-transport.js";
|
|
3
|
+
import { createClientProtocolWrapper } from "./protocol/client-protocol-wrapper.js";
|
|
4
|
+
import { createEventClient } from "./features/event-client.js";
|
|
5
|
+
import { createFileClient } from "./features/file-client.js";
|
|
6
|
+
import { createOrmClientConnector } from "./features/orm/orm-client-connector.js";
|
|
7
|
+
import { OrmClientDbContextExecutor } from "./features/orm/orm-client-db-context-executor.js";
|
|
8
|
+
import { ServiceClient, createServiceClient } from "./service-client.js";
|
|
9
|
+
export {
|
|
10
|
+
OrmClientDbContextExecutor,
|
|
11
|
+
ServiceClient,
|
|
12
|
+
createClientProtocolWrapper,
|
|
13
|
+
createEventClient,
|
|
14
|
+
createFileClient,
|
|
15
|
+
createOrmClientConnector,
|
|
16
|
+
createServiceClient,
|
|
17
|
+
createServiceTransport,
|
|
18
|
+
createSocketProvider
|
|
19
|
+
};
|
|
12
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": "
|
|
4
|
+
"mappings": "AAMA,SAAS,4BAA4B;AAErC,SAAS,8BAA8B;AAIvC,SAAS,mCAAmC;AAI5C,SAAS,yBAAyB;AAElC,SAAS,wBAAwB;AAGjC,SAAS,gCAAgC;AACzC,SAAS,kCAAkC;AAG3C,SAAS,eAAe,2BAA+C;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
import type { Bytes } from "@simplysm/core-common";
|
|
2
|
-
import type { ServiceMessageDecodeResult, ServiceMessage } from "@simplysm/service-common";
|
|
3
|
-
export
|
|
4
|
-
private readonly _SIZE_THRESHOLD;
|
|
5
|
-
private readonly _protocol;
|
|
6
|
-
private static _worker?;
|
|
7
|
-
private static readonly _workerResolvers;
|
|
8
|
-
private static _workerAvailable;
|
|
9
|
-
private static get workerAvailable();
|
|
10
|
-
private static get worker();
|
|
11
|
-
/**
|
|
12
|
-
* Worker에 작업 위임 및 결과 대기
|
|
13
|
-
* 주의: workerAvailable이 true일 때만 호출해야 함
|
|
14
|
-
*/
|
|
15
|
-
private _runWorker;
|
|
2
|
+
import type { ServiceMessageDecodeResult, ServiceMessage, ServiceProtocol } from "@simplysm/service-common";
|
|
3
|
+
export interface ClientProtocolWrapper {
|
|
16
4
|
encode(uuid: string, message: ServiceMessage): Promise<{
|
|
17
5
|
chunks: Bytes[];
|
|
18
6
|
totalSize: number;
|
|
19
7
|
}>;
|
|
20
8
|
decode(bytes: Bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>>;
|
|
21
|
-
private _shouldUseWorkerForEncode;
|
|
22
9
|
}
|
|
10
|
+
export declare function createClientProtocolWrapper(protocol: ServiceProtocol): ClientProtocolWrapper;
|
|
23
11
|
//# sourceMappingURL=client-protocol-wrapper.d.ts.map
|
|
@@ -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,EAAE,0BAA0B,EAAE,cAAc,EAAE,
|
|
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,EAAE,0BAA0B,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE5G,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;CAC3E;AAwED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,eAAe,GAAG,qBAAqB,CAqD5F"}
|