@simplysm/service-client 13.0.0-beta.11
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 +397 -0
- package/dist/core-common/src/common.types.d.ts +74 -0
- package/dist/core-common/src/common.types.d.ts.map +1 -0
- package/dist/core-common/src/env.d.ts +6 -0
- package/dist/core-common/src/env.d.ts.map +1 -0
- package/dist/core-common/src/errors/argument-error.d.ts +25 -0
- package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/sd-error.d.ts +27 -0
- package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
- package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
- package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
- package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
- package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
- package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
- package/dist/core-common/src/features/event-emitter.d.ts +66 -0
- package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
- package/dist/core-common/src/features/serial-queue.d.ts +47 -0
- package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
- package/dist/core-common/src/index.d.ts +32 -0
- package/dist/core-common/src/index.d.ts.map +1 -0
- package/dist/core-common/src/types/date-only.d.ts +152 -0
- package/dist/core-common/src/types/date-only.d.ts.map +1 -0
- package/dist/core-common/src/types/date-time.d.ts +96 -0
- package/dist/core-common/src/types/date-time.d.ts.map +1 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/core-common/src/types/time.d.ts +68 -0
- package/dist/core-common/src/types/time.d.ts.map +1 -0
- package/dist/core-common/src/types/uuid.d.ts +35 -0
- package/dist/core-common/src/types/uuid.d.ts.map +1 -0
- package/dist/core-common/src/utils/bytes.d.ts +51 -0
- package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
- package/dist/core-common/src/utils/date-format.d.ts +90 -0
- package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
- package/dist/core-common/src/utils/json.d.ts +34 -0
- package/dist/core-common/src/utils/json.d.ts.map +1 -0
- package/dist/core-common/src/utils/num.d.ts +60 -0
- package/dist/core-common/src/utils/num.d.ts.map +1 -0
- package/dist/core-common/src/utils/obj.d.ts +258 -0
- package/dist/core-common/src/utils/obj.d.ts.map +1 -0
- package/dist/core-common/src/utils/path.d.ts +23 -0
- package/dist/core-common/src/utils/path.d.ts.map +1 -0
- package/dist/core-common/src/utils/primitive.d.ts +18 -0
- package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
- package/dist/core-common/src/utils/str.d.ts +103 -0
- package/dist/core-common/src/utils/str.d.ts.map +1 -0
- package/dist/core-common/src/utils/template-strings.d.ts +84 -0
- package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
- package/dist/core-common/src/utils/transferable.d.ts +47 -0
- package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
- package/dist/core-common/src/utils/wait.d.ts +19 -0
- package/dist/core-common/src/utils/wait.d.ts.map +1 -0
- package/dist/core-common/src/utils/xml.d.ts +36 -0
- package/dist/core-common/src/utils/xml.d.ts.map +1 -0
- package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
- package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
- package/dist/features/event-client.js +74 -0
- package/dist/features/event-client.js.map +7 -0
- package/dist/features/file-client.js +42 -0
- package/dist/features/file-client.js.map +7 -0
- package/dist/features/orm/orm-client-connector.js +41 -0
- package/dist/features/orm/orm-client-connector.js.map +7 -0
- package/dist/features/orm/orm-client-db-context-executor.js +61 -0
- package/dist/features/orm/orm-client-db-context-executor.js.map +7 -0
- package/dist/features/orm/orm-connect-config.js +1 -0
- package/dist/features/orm/orm-connect-config.js.map +7 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +7 -0
- package/dist/orm-common/src/db-context.d.ts +669 -0
- package/dist/orm-common/src/db-context.d.ts.map +1 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
- package/dist/orm-common/src/exec/executable.d.ts +79 -0
- package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/queryable.d.ts +708 -0
- package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
- package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr.d.ts +1369 -0
- package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
- package/dist/orm-common/src/index.d.ts +32 -0
- package/dist/orm-common/src/index.d.ts.map +1 -0
- package/dist/orm-common/src/models/system-migration.d.ts +10 -0
- package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
- package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
- package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
- package/dist/orm-common/src/types/column.d.ts +172 -0
- package/dist/orm-common/src/types/column.d.ts.map +1 -0
- package/dist/orm-common/src/types/db.d.ts +175 -0
- package/dist/orm-common/src/types/db.d.ts.map +1 -0
- package/dist/orm-common/src/types/expr.d.ts +474 -0
- package/dist/orm-common/src/types/expr.d.ts.map +1 -0
- package/dist/orm-common/src/types/query-def.d.ts +351 -0
- package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
- package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
- package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
- package/dist/protocol/client-protocol-wrapper.js +92 -0
- package/dist/protocol/client-protocol-wrapper.js.map +7 -0
- package/dist/service-client/src/features/event-client.d.ts +14 -0
- package/dist/service-client/src/features/event-client.d.ts.map +1 -0
- package/dist/service-client/src/features/file-client.d.ts +13 -0
- package/dist/service-client/src/features/file-client.d.ts.map +1 -0
- package/dist/service-client/src/features/orm/orm-client-connector.d.ts +10 -0
- package/dist/service-client/src/features/orm/orm-client-connector.d.ts.map +1 -0
- package/dist/service-client/src/features/orm/orm-client-db-context-executor.d.ts +26 -0
- package/dist/service-client/src/features/orm/orm-client-db-context-executor.d.ts.map +1 -0
- package/dist/service-client/src/features/orm/orm-connect-config.d.ts +13 -0
- package/dist/service-client/src/features/orm/orm-connect-config.d.ts.map +1 -0
- package/dist/service-client/src/index.d.ts +12 -0
- package/dist/service-client/src/index.d.ts.map +1 -0
- package/dist/service-client/src/protocol/client-protocol-wrapper.d.ts +23 -0
- package/dist/service-client/src/protocol/client-protocol-wrapper.d.ts.map +1 -0
- package/dist/service-client/src/service-client.d.ts +41 -0
- package/dist/service-client/src/service-client.d.ts.map +1 -0
- package/dist/service-client/src/transport/service-transport.d.ts +24 -0
- package/dist/service-client/src/transport/service-transport.d.ts.map +1 -0
- package/dist/service-client/src/transport/socket-provider.d.ts +31 -0
- package/dist/service-client/src/transport/socket-provider.d.ts.map +1 -0
- package/dist/service-client/src/types/connection-config.d.ts +8 -0
- package/dist/service-client/src/types/connection-config.d.ts.map +1 -0
- package/dist/service-client/src/types/progress.types.d.ts +10 -0
- package/dist/service-client/src/types/progress.types.d.ts.map +1 -0
- package/dist/service-client/src/workers/client-protocol.worker.d.ts +2 -0
- package/dist/service-client/src/workers/client-protocol.worker.d.ts.map +1 -0
- package/dist/service-client.js +114 -0
- package/dist/service-client.js.map +7 -0
- package/dist/service-common/src/index.d.ts +8 -0
- package/dist/service-common/src/index.d.ts.map +1 -0
- package/dist/service-common/src/protocol/protocol.types.d.ts +100 -0
- package/dist/service-common/src/protocol/protocol.types.d.ts.map +1 -0
- package/dist/service-common/src/protocol/service-protocol.d.ts +63 -0
- package/dist/service-common/src/protocol/service-protocol.d.ts.map +1 -0
- package/dist/service-common/src/service-types/auto-update-service.types.d.ts +17 -0
- package/dist/service-common/src/service-types/auto-update-service.types.d.ts.map +1 -0
- package/dist/service-common/src/service-types/crypto-service.types.d.ts +22 -0
- package/dist/service-common/src/service-types/crypto-service.types.d.ts.map +1 -0
- package/dist/service-common/src/service-types/orm-service.types.d.ts +30 -0
- package/dist/service-common/src/service-types/orm-service.types.d.ts.map +1 -0
- package/dist/service-common/src/service-types/smtp-service.types.d.ts +55 -0
- package/dist/service-common/src/service-types/smtp-service.types.d.ts.map +1 -0
- package/dist/service-common/src/types.d.ts +43 -0
- package/dist/service-common/src/types.d.ts.map +1 -0
- package/dist/transport/service-transport.js +112 -0
- package/dist/transport/service-transport.js.map +7 -0
- package/dist/transport/socket-provider.js +170 -0
- package/dist/transport/socket-provider.js.map +7 -0
- package/dist/types/connection-config.js +1 -0
- package/dist/types/connection-config.js.map +7 -0
- package/dist/types/progress.types.js +1 -0
- package/dist/types/progress.types.js.map +7 -0
- package/dist/workers/client-protocol.worker.js +30 -0
- package/dist/workers/client-protocol.worker.js.map +7 -0
- package/package.json +29 -0
package/README.md
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
# @simplysm/service-client
|
|
2
|
+
|
|
3
|
+
A service client package for the Simplysm framework. Provides WebSocket communication with `@simplysm/service-server`, remote service invocation (RPC), event subscription, file upload/download, and ORM remote access.
|
|
4
|
+
|
|
5
|
+
Works in both browser and Node.js environments, with built-in features like automatic message chunking/merging for large payloads, heartbeat-based connection monitoring, and automatic reconnection.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @simplysm/service-client
|
|
11
|
+
# or
|
|
12
|
+
pnpm add @simplysm/service-client
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Dependencies
|
|
16
|
+
|
|
17
|
+
| Package | Description |
|
|
18
|
+
|--------|------|
|
|
19
|
+
| `@simplysm/core-common` | Common utilities (EventEmitter, Uuid, etc.) |
|
|
20
|
+
| `@simplysm/orm-common` | ORM query builder, schema definitions |
|
|
21
|
+
| `@simplysm/service-common` | Service protocol, type definitions |
|
|
22
|
+
|
|
23
|
+
## Main Modules
|
|
24
|
+
|
|
25
|
+
### Core Classes
|
|
26
|
+
|
|
27
|
+
| Class | Description |
|
|
28
|
+
|--------|------|
|
|
29
|
+
| `ServiceClient` | Main service client. Provides integrated connection management, RPC calls, events, files, and authentication. |
|
|
30
|
+
| `ServiceTransport` | Message transport layer. Handles request/response matching, progress tracking, and protocol encoding/decoding. |
|
|
31
|
+
| `SocketProvider` | WebSocket connection management. Handles heartbeat, auto-reconnection, and connection state events. |
|
|
32
|
+
| `ClientProtocolWrapper` | Protocol wrapper. Automatically selects main thread/Web Worker for encoding/decoding based on data size. |
|
|
33
|
+
|
|
34
|
+
### Feature Classes
|
|
35
|
+
|
|
36
|
+
| Class | Description |
|
|
37
|
+
|--------|------|
|
|
38
|
+
| `EventClient` | Server event subscription/publishing. Supports automatic listener recovery on reconnection. |
|
|
39
|
+
| `FileClient` | Handles HTTP-based file upload/download. |
|
|
40
|
+
| `OrmClientConnector` | ORM remote connection connector. Supports transaction/non-transaction connections. |
|
|
41
|
+
| `OrmClientDbContextExecutor` | ORM DbContext remote executor. Calls server's `OrmService` via RPC. |
|
|
42
|
+
|
|
43
|
+
### Types/Interfaces
|
|
44
|
+
|
|
45
|
+
| Type | Description |
|
|
46
|
+
|------|------|
|
|
47
|
+
| `ServiceConnectionConfig` | Server connection config (host, port, ssl, maxReconnectCount) |
|
|
48
|
+
| `ServiceProgress` | Request/response progress callback |
|
|
49
|
+
| `ServiceProgressState` | Progress state (uuid, totalSize, completedSize) |
|
|
50
|
+
| `OrmConnectConfig<T>` | ORM connection config (DbContext type, connection options, DB/schema override) |
|
|
51
|
+
| `RemoteService<T>` | Utility type that wraps all method return types of a service interface with `Promise` |
|
|
52
|
+
|
|
53
|
+
## Usage
|
|
54
|
+
|
|
55
|
+
### Basic Connection and Service Call
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { ServiceClient } from "@simplysm/service-client";
|
|
59
|
+
|
|
60
|
+
// Create client
|
|
61
|
+
const client = new ServiceClient("my-app", {
|
|
62
|
+
host: "localhost",
|
|
63
|
+
port: 8080,
|
|
64
|
+
ssl: false,
|
|
65
|
+
maxReconnectCount: 10, // Max reconnection attempts (default: 10, 0 means no reconnection)
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Connect to server
|
|
69
|
+
await client.connect();
|
|
70
|
+
|
|
71
|
+
// Check connection status
|
|
72
|
+
console.log(client.connected); // true
|
|
73
|
+
console.log(client.hostUrl); // "http://localhost:8080"
|
|
74
|
+
|
|
75
|
+
// Direct RPC call
|
|
76
|
+
const result = await client.send("MyService", "getUsers", [{ page: 1 }]);
|
|
77
|
+
|
|
78
|
+
// Close connection
|
|
79
|
+
await client.close();
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Type-Safe Service Call (getService)
|
|
83
|
+
|
|
84
|
+
`getService<T>()` uses `Proxy` to provide type-safe remote calls to service interfaces.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// Service interface definition (shared from service-common)
|
|
88
|
+
interface UserService {
|
|
89
|
+
getUsers(filter: { page: number }): Promise<User[]>;
|
|
90
|
+
createUser(data: CreateUserDto): Promise<number>;
|
|
91
|
+
deleteUser(id: number): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Create type-safe proxy
|
|
95
|
+
const userService = client.getService<UserService>("UserService");
|
|
96
|
+
|
|
97
|
+
// Parameter/return types are automatically inferred on method calls
|
|
98
|
+
const users = await userService.getUsers({ page: 1 }); // users: User[]
|
|
99
|
+
const newId = await userService.createUser({ name: "test" }); // newId: number
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`RemoteService<T>` wraps all method return types of the original interface with `Promise`. Methods already returning `Promise` are not double-wrapped.
|
|
103
|
+
|
|
104
|
+
### Authentication
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
// Send auth token after server connection
|
|
108
|
+
await client.connect();
|
|
109
|
+
await client.auth("jwt-token-here");
|
|
110
|
+
|
|
111
|
+
// Automatically re-authenticated on reconnection
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Tokens stored after `auth()` calls are automatically resent to the server on WebSocket reconnection.
|
|
115
|
+
|
|
116
|
+
### Connection State Monitoring
|
|
117
|
+
|
|
118
|
+
`ServiceClient` extends `EventEmitter` and supports the following events.
|
|
119
|
+
|
|
120
|
+
| Event | Type | Description |
|
|
121
|
+
|--------|------|------|
|
|
122
|
+
| `state` | `"connected" \| "closed" \| "reconnecting"` | Connection state change |
|
|
123
|
+
| `request-progress` | `ServiceProgressState` | Request transmission progress |
|
|
124
|
+
| `response-progress` | `ServiceProgressState` | Response reception progress |
|
|
125
|
+
| `reload` | `Set<string>` | File change notification from server (dev mode HMR) |
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// Monitor connection state changes
|
|
129
|
+
client.on("state", (state) => {
|
|
130
|
+
if (state === "connected") {
|
|
131
|
+
console.log("Connected to server");
|
|
132
|
+
} else if (state === "reconnecting") {
|
|
133
|
+
console.log("Reconnection in progress...");
|
|
134
|
+
} else if (state === "closed") {
|
|
135
|
+
console.log("Connection closed");
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Monitor request/response progress (large messages)
|
|
140
|
+
client.on("request-progress", (state) => {
|
|
141
|
+
const percent = Math.round((state.completedSize / state.totalSize) * 100);
|
|
142
|
+
console.log(`Sending: ${percent}%`);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
client.on("response-progress", (state) => {
|
|
146
|
+
const percent = Math.round((state.completedSize / state.totalSize) * 100);
|
|
147
|
+
console.log(`Receiving: ${percent}%`);
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Individual Request Progress Tracking
|
|
152
|
+
|
|
153
|
+
Track progress of individual requests with the `progress` parameter of the `send()` method.
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
const result = await client.send("DataService", "getLargeData", [query], {
|
|
157
|
+
request: (state) => {
|
|
158
|
+
console.log(`Request sending: ${state.completedSize}/${state.totalSize} bytes`);
|
|
159
|
+
},
|
|
160
|
+
response: (state) => {
|
|
161
|
+
console.log(`Response receiving: ${state.completedSize}/${state.totalSize} bytes`);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Event Subscription (Server -> Client)
|
|
167
|
+
|
|
168
|
+
Subscribe to events from the server, and listeners are automatically recovered on reconnection.
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
import { ServiceEventListener } from "@simplysm/service-common";
|
|
172
|
+
|
|
173
|
+
// Event listener type definition (shared between server/client)
|
|
174
|
+
class SharedDataChangeEvent extends ServiceEventListener<
|
|
175
|
+
{ name: string; filter: unknown },
|
|
176
|
+
(string | number)[] | undefined
|
|
177
|
+
> {
|
|
178
|
+
readonly eventName = "SharedDataChangeEvent";
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Subscribe to event
|
|
182
|
+
const listenerKey = await client.addEventListener(
|
|
183
|
+
SharedDataChangeEvent,
|
|
184
|
+
{ name: "users", filter: null },
|
|
185
|
+
async (data) => {
|
|
186
|
+
console.log("Data changed:", data);
|
|
187
|
+
},
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
// Unsubscribe from event
|
|
191
|
+
await client.removeEventListener(listenerKey);
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Event Publishing (Client -> Server -> Other Clients)
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
// Publish event to listeners matching specific conditions
|
|
198
|
+
await client.emitToServer(
|
|
199
|
+
SharedDataChangeEvent,
|
|
200
|
+
(info) => info.name === "users", // Target filter
|
|
201
|
+
[1, 2, 3], // Data to send
|
|
202
|
+
);
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
The server finds listeners matching the `infoSelector` condition in the registered listener list and delivers the event.
|
|
206
|
+
|
|
207
|
+
### File Upload
|
|
208
|
+
|
|
209
|
+
File upload is handled via HTTP POST requests and requires an authentication token.
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
// Authentication required
|
|
213
|
+
await client.auth("jwt-token");
|
|
214
|
+
|
|
215
|
+
// Upload with browser File object
|
|
216
|
+
const fileInput = document.querySelector("input[type=file]") as HTMLInputElement;
|
|
217
|
+
const results = await client.uploadFile(fileInput.files!);
|
|
218
|
+
|
|
219
|
+
// Upload with custom data
|
|
220
|
+
const results = await client.uploadFile([
|
|
221
|
+
{ name: "data.json", data: JSON.stringify({ key: "value" }) },
|
|
222
|
+
{ name: "image.png", data: imageBlob },
|
|
223
|
+
]);
|
|
224
|
+
|
|
225
|
+
// Upload results
|
|
226
|
+
for (const result of results) {
|
|
227
|
+
console.log(result.path); // Server storage path
|
|
228
|
+
console.log(result.filename); // Original filename
|
|
229
|
+
console.log(result.size); // File size (bytes)
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### File Download
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// Download file from server's relative path
|
|
237
|
+
const buffer = await client.downloadFileBuffer("/uploads/2024/file.pdf");
|
|
238
|
+
// buffer: Uint8Array
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### ORM Remote Access
|
|
242
|
+
|
|
243
|
+
Access the database through the server's ORM service. Transactions are automatically managed.
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
import { OrmClientConnector } from "@simplysm/service-client";
|
|
247
|
+
import type { OrmConnectConfig } from "@simplysm/service-client";
|
|
248
|
+
import { DbContext } from "@simplysm/orm-common";
|
|
249
|
+
|
|
250
|
+
const connector = new OrmClientConnector(client);
|
|
251
|
+
|
|
252
|
+
// Connect with transaction (auto rollback on error)
|
|
253
|
+
await connector.connect(
|
|
254
|
+
{
|
|
255
|
+
dbContextType: MyDbContext,
|
|
256
|
+
connOpt: { configName: "default" },
|
|
257
|
+
dbContextOpt: { database: "mydb", schema: "dbo" }, // Optional
|
|
258
|
+
},
|
|
259
|
+
async (db) => {
|
|
260
|
+
const users = await db.from(User).resultAsync();
|
|
261
|
+
await db.from(User).insert({ name: "test" });
|
|
262
|
+
// Auto commit on callback success
|
|
263
|
+
},
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// Connect without transaction (suitable for read-only operations)
|
|
267
|
+
await connector.connectWithoutTransaction(
|
|
268
|
+
{
|
|
269
|
+
dbContextType: MyDbContext,
|
|
270
|
+
connOpt: { configName: "default" },
|
|
271
|
+
},
|
|
272
|
+
async (db) => {
|
|
273
|
+
const users = await db.from(User).resultAsync();
|
|
274
|
+
return users;
|
|
275
|
+
},
|
|
276
|
+
);
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Detailed API
|
|
280
|
+
|
|
281
|
+
### ServiceConnectionConfig
|
|
282
|
+
|
|
283
|
+
Server connection configuration interface.
|
|
284
|
+
|
|
285
|
+
| Property | Type | Required | Description |
|
|
286
|
+
|------|------|------|------|
|
|
287
|
+
| `host` | `string` | Yes | Server host address |
|
|
288
|
+
| `port` | `number` | Yes | Server port number |
|
|
289
|
+
| `ssl` | `boolean` | No | SSL usage. If `true`, uses `wss://` / `https://` |
|
|
290
|
+
| `maxReconnectCount` | `number` | No | Max reconnection attempts (default: 10). 0 means no reconnection |
|
|
291
|
+
|
|
292
|
+
### ServiceClient
|
|
293
|
+
|
|
294
|
+
| Method/Property | Return Type | Description |
|
|
295
|
+
|-------------|----------|------|
|
|
296
|
+
| `constructor(name, options)` | - | Create client instance. `name` is the client identifier |
|
|
297
|
+
| `connected` | `boolean` | WebSocket connection status |
|
|
298
|
+
| `hostUrl` | `string` | HTTP URL (e.g., `http://localhost:8080`) |
|
|
299
|
+
| `connect()` | `Promise<void>` | Connect to server via WebSocket |
|
|
300
|
+
| `close()` | `Promise<void>` | Close connection (Graceful Shutdown) |
|
|
301
|
+
| `send(serviceName, methodName, params, progress?)` | `Promise<unknown>` | Remote call to service method |
|
|
302
|
+
| `getService<T>(serviceName)` | `RemoteService<T>` | Create type-safe service proxy |
|
|
303
|
+
| `auth(token)` | `Promise<void>` | Send auth token (auto re-auth on reconnection) |
|
|
304
|
+
| `addEventListener(eventType, info, cb)` | `Promise<string>` | Register event listener. Returns listener key |
|
|
305
|
+
| `removeEventListener(key)` | `Promise<void>` | Remove event listener |
|
|
306
|
+
| `emitToServer(eventType, infoSelector, data)` | `Promise<void>` | Publish event to other clients through server |
|
|
307
|
+
| `uploadFile(files)` | `Promise<ServiceUploadResult[]>` | File upload (auth required) |
|
|
308
|
+
| `downloadFileBuffer(relPath)` | `Promise<Uint8Array>` | File download |
|
|
309
|
+
|
|
310
|
+
### ServiceProgress / ServiceProgressState
|
|
311
|
+
|
|
312
|
+
Interfaces for tracking progress of large message transmissions.
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
interface ServiceProgress {
|
|
316
|
+
request?: (s: ServiceProgressState) => void; // Request transmission progress
|
|
317
|
+
response?: (s: ServiceProgressState) => void; // Response reception progress
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
interface ServiceProgressState {
|
|
321
|
+
uuid: string; // Request unique identifier
|
|
322
|
+
totalSize: number; // Total size (bytes)
|
|
323
|
+
completedSize: number; // Completed size (bytes)
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### OrmConnectConfig\<T\>
|
|
328
|
+
|
|
329
|
+
ORM remote connection configuration interface.
|
|
330
|
+
|
|
331
|
+
| Property | Type | Required | Description |
|
|
332
|
+
|------|------|------|------|
|
|
333
|
+
| `dbContextType` | `Type<T>` | Yes | DbContext class |
|
|
334
|
+
| `connOpt` | `DbConnOptions & { configName: string }` | Yes | DB connection options (including server-side config name) |
|
|
335
|
+
| `dbContextOpt` | `{ database: string; schema: string }` | No | Database/schema override |
|
|
336
|
+
|
|
337
|
+
### SocketProvider
|
|
338
|
+
|
|
339
|
+
Handles low-level management of WebSocket connections. Not typically used directly, but indirectly through `ServiceClient`.
|
|
340
|
+
|
|
341
|
+
| Constant | Value | Description |
|
|
342
|
+
|------|-----|------|
|
|
343
|
+
| Heartbeat Timeout | 30s | Connection considered disconnected if no messages for this duration |
|
|
344
|
+
| Heartbeat Interval | 5s | Ping transmission interval |
|
|
345
|
+
| Reconnect Delay | 3s | Reconnection attempt interval |
|
|
346
|
+
|
|
347
|
+
### ClientProtocolWrapper
|
|
348
|
+
|
|
349
|
+
Handles message encoding/decoding. In browser environments, data exceeding 30KB is automatically processed in a Web Worker to prevent main thread blocking.
|
|
350
|
+
|
|
351
|
+
| Threshold | Condition |
|
|
352
|
+
|--------|------|
|
|
353
|
+
| 30KB or less | Processed directly in main thread |
|
|
354
|
+
| Over 30KB | Delegated to Web Worker (browser environments only) |
|
|
355
|
+
|
|
356
|
+
Worker delegation conditions (during encoding):
|
|
357
|
+
- `Uint8Array` data
|
|
358
|
+
- Strings exceeding 30KB
|
|
359
|
+
- Arrays exceeding 100 elements or arrays containing `Uint8Array`
|
|
360
|
+
|
|
361
|
+
## Architecture
|
|
362
|
+
|
|
363
|
+
```
|
|
364
|
+
ServiceClient (integrated entry point)
|
|
365
|
+
|
|
|
366
|
+
+-- SocketProvider (WebSocket connection management)
|
|
367
|
+
| +-- Heartbeat (Ping/Pong)
|
|
368
|
+
| +-- Auto reconnection
|
|
369
|
+
|
|
|
370
|
+
+-- ServiceTransport (message send/receive)
|
|
371
|
+
| +-- ClientProtocolWrapper (encoding/decoding)
|
|
372
|
+
| | +-- ServiceProtocol (main thread)
|
|
373
|
+
| | +-- Web Worker (large data)
|
|
374
|
+
| +-- Request/response matching (UUID-based)
|
|
375
|
+
| +-- Progress tracking
|
|
376
|
+
|
|
|
377
|
+
+-- EventClient (event subscription/publishing)
|
|
378
|
+
| +-- Listener management (registration/removal)
|
|
379
|
+
| +-- Auto recovery on reconnection
|
|
380
|
+
|
|
|
381
|
+
+-- FileClient (HTTP file transfer)
|
|
382
|
+
+-- Upload (FormData, POST)
|
|
383
|
+
+-- Download (GET)
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Caveats
|
|
387
|
+
|
|
388
|
+
- **Auth Required**: You must authenticate with `auth()` before calling `uploadFile()`. An error occurs if not authenticated.
|
|
389
|
+
- **Connection State Check**: `addEventListener()` can only be called when connected to the server. An error occurs if not connected.
|
|
390
|
+
- **Auto Reconnection**: If the connection is lost, automatic reconnection is attempted up to `maxReconnectCount` times at 3-second intervals. On successful reconnection, auth tokens and event listeners are automatically recovered.
|
|
391
|
+
- **Large Messages**: Large messages are automatically split/merged by `ServiceProtocol` from `@simplysm/service-common`. Progress can be tracked via `ServiceProgress` callbacks or `ServiceClient` events.
|
|
392
|
+
- **Web Worker**: In browser environments, encoding/decoding of data exceeding 30KB is automatically handled in a Web Worker. In Node.js environments, it's always processed in the main thread.
|
|
393
|
+
- **Foreign Key Error Conversion**: ORM connection errors due to foreign key constraint violations are automatically converted to user-friendly messages.
|
|
394
|
+
|
|
395
|
+
## License
|
|
396
|
+
|
|
397
|
+
Apache-2.0
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { DateTime } from "./types/date-time";
|
|
2
|
+
import { DateOnly } from "./types/date-only";
|
|
3
|
+
import { Time } from "./types/time";
|
|
4
|
+
import { Uuid } from "./types/uuid";
|
|
5
|
+
/**
|
|
6
|
+
* Buffer 대신 사용하는 바이너리 타입
|
|
7
|
+
*/
|
|
8
|
+
export type Bytes = Uint8Array;
|
|
9
|
+
/**
|
|
10
|
+
* Primitive 타입 매핑
|
|
11
|
+
* orm-common과 공유
|
|
12
|
+
*/
|
|
13
|
+
export type PrimitiveTypeMap = {
|
|
14
|
+
string: string;
|
|
15
|
+
number: number;
|
|
16
|
+
boolean: boolean;
|
|
17
|
+
DateTime: DateTime;
|
|
18
|
+
DateOnly: DateOnly;
|
|
19
|
+
Time: Time;
|
|
20
|
+
Uuid: Uuid;
|
|
21
|
+
Bytes: Bytes;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Primitive 타입 문자열 키
|
|
25
|
+
*/
|
|
26
|
+
export type PrimitiveTypeStr = keyof PrimitiveTypeMap;
|
|
27
|
+
/**
|
|
28
|
+
* Primitive 타입 유니온
|
|
29
|
+
*/
|
|
30
|
+
export type PrimitiveType = PrimitiveTypeMap[PrimitiveTypeStr] | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* 깊은 Partial 타입
|
|
33
|
+
*
|
|
34
|
+
* 객체의 모든 속성을 재귀적으로 선택적(optional)으로 만듭니다.
|
|
35
|
+
* Primitive 타입(string, number, boolean 등)은 그대로 유지하고,
|
|
36
|
+
* 객체/배열 타입만 재귀적으로 Partial을 적용합니다.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* interface User {
|
|
41
|
+
* name: string;
|
|
42
|
+
* profile: {
|
|
43
|
+
* age: number;
|
|
44
|
+
* address: { city: string };
|
|
45
|
+
* };
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* // 모든 깊이의 속성이 선택적이 됨
|
|
49
|
+
* const partial: DeepPartial<User> = {
|
|
50
|
+
* profile: { address: {} }
|
|
51
|
+
* };
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export type DeepPartial<T> = Partial<{
|
|
55
|
+
[K in keyof T]: T[K] extends PrimitiveType ? T[K] : DeepPartial<T[K]>;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* 생성자 타입
|
|
59
|
+
*
|
|
60
|
+
* 클래스 생성자를 타입으로 표현할 때 사용합니다.
|
|
61
|
+
* 주로 의존성 주입, 팩토리 패턴, instanceof 체크 등에서 활용됩니다.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* function create<T>(ctor: Type<T>): T {
|
|
65
|
+
* return new ctor();
|
|
66
|
+
* }
|
|
67
|
+
*
|
|
68
|
+
* class MyClass { name = "test"; }
|
|
69
|
+
* const instance = create(MyClass); // MyClass 인스턴스
|
|
70
|
+
*/
|
|
71
|
+
export interface Type<T> extends Function {
|
|
72
|
+
new (...args: unknown[]): T;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=common.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.types.d.ts","sourceRoot":"","sources":["../../../../core-common/src/common.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAIpC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAM/B;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;AAM3E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC;KAClC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,CAAE,SAAQ,QAAQ;IACvC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../core-common/src/env.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,EAAE;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAKxB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SdError } from "./sd-error";
|
|
2
|
+
/**
|
|
3
|
+
* 인수 오류
|
|
4
|
+
*
|
|
5
|
+
* 잘못된 인수를 받았을 때 발생시키는 에러이다.
|
|
6
|
+
* 인수 객체를 YAML 형식으로 메시지에 포함하여 디버깅을 용이하게 한다.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // 인수 객체만 전달
|
|
10
|
+
* throw new ArgumentError({ userId: 123, name: null });
|
|
11
|
+
* // 결과 메시지: "인수가 잘못되었습니다.\n\nuserId: 123\nname: null"
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // 커스텀 메시지와 인수 객체 전달
|
|
15
|
+
* throw new ArgumentError("유효하지 않은 사용자", { userId: 123 });
|
|
16
|
+
* // 결과 메시지: "유효하지 않은 사용자\n\nuserId: 123"
|
|
17
|
+
*/
|
|
18
|
+
export declare class ArgumentError extends SdError {
|
|
19
|
+
/** 기본 메시지("인수가 잘못되었습니다.")와 함께 인수 객체를 YAML 형식으로 출력 */
|
|
20
|
+
constructor(argObj: Record<string, unknown>);
|
|
21
|
+
/** 커스텀 메시지와 함께 인수 객체를 YAML 형식으로 출력 */
|
|
22
|
+
constructor(message: string, argObj: Record<string, unknown>);
|
|
23
|
+
constructor(arg1: Record<string, unknown> | string, arg2?: Record<string, unknown>);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=argument-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argument-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/argument-error.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,qDAAqD;gBACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3C,sCAAsC;gBAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAYnF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SdError } from "./sd-error";
|
|
2
|
+
/**
|
|
3
|
+
* 미구현 오류
|
|
4
|
+
*
|
|
5
|
+
* 아직 구현되지 않은 기능을 호출했을 때 발생시키는 에러이다.
|
|
6
|
+
* 추상 메서드 스텁, 향후 구현 예정인 분기 등에 사용한다.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // 추상 메서드 구현 전
|
|
10
|
+
* class BaseService {
|
|
11
|
+
* process(): void {
|
|
12
|
+
* throw new NotImplementedError("서브클래스에서 구현 필요");
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* // 향후 구현 예정 분기
|
|
18
|
+
* switch (type) {
|
|
19
|
+
* case "A": return handleA();
|
|
20
|
+
* case "B": throw new NotImplementedError(`타입 ${type} 처리`);
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
export declare class NotImplementedError extends SdError {
|
|
24
|
+
/**
|
|
25
|
+
* @param message 추가 설명 메시지
|
|
26
|
+
*/
|
|
27
|
+
constructor(message?: string);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=not-implemented-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"not-implemented-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/not-implemented-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,mBAAoB,SAAQ,OAAO;IAC9C;;OAEG;gBACS,OAAO,CAAC,EAAE,MAAM;CAI7B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 오류의 Tree 구조 구성이 가능한 오류 클래스
|
|
3
|
+
* ES2024 cause 속성 활용
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* // 원인 에러를 감싸서 생성
|
|
7
|
+
* try {
|
|
8
|
+
* await fetch(url);
|
|
9
|
+
* } catch (err) {
|
|
10
|
+
* throw new SdError(err, "API 호출 실패", "사용자 로드 실패");
|
|
11
|
+
* }
|
|
12
|
+
* // 결과 메시지: "사용자 로드 실패 => API 호출 실패 => 원본 에러 메시지"
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // 메시지만으로 생성
|
|
16
|
+
* throw new SdError("잘못된 상태", "처리 불가");
|
|
17
|
+
* // 결과 메시지: "처리 불가 => 잘못된 상태"
|
|
18
|
+
*/
|
|
19
|
+
export declare class SdError extends Error {
|
|
20
|
+
cause?: Error;
|
|
21
|
+
/** 원인 에러를 감싸서 생성. 메시지는 역순으로 연결됨 (상위 메시지 => 하위 메시지 => 원인 메시지) */
|
|
22
|
+
constructor(cause: Error, ...messages: string[]);
|
|
23
|
+
/** 메시지만으로 생성. 메시지는 역순으로 연결됨 (상위 메시지 => 하위 메시지) */
|
|
24
|
+
constructor(...messages: string[]);
|
|
25
|
+
constructor(arg1?: unknown, ...messages: string[]);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sd-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/sd-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IAEvB,gEAAgE;gBACpD,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;IAC/C,kDAAkD;gBACtC,GAAG,QAAQ,EAAE,MAAM,EAAE;gBACrB,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;CA2BlD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SdError } from "./sd-error";
|
|
2
|
+
/**
|
|
3
|
+
* 타임아웃 오류
|
|
4
|
+
*
|
|
5
|
+
* 대기 시간이 초과되었을 때 발생하는 에러이다.
|
|
6
|
+
* Wait.until() 등의 비동기 대기 함수에서 최대 시도 횟수를 초과하면 자동으로 발생한다.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* // Wait.until에서 자동 발생
|
|
10
|
+
* try {
|
|
11
|
+
* await Wait.until(() => isReady, 100, 50); // 100ms 간격, 최대 50회
|
|
12
|
+
* } catch (err) {
|
|
13
|
+
* if (err instanceof TimeoutError) {
|
|
14
|
+
* console.log("시간 초과");
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // 직접 발생
|
|
20
|
+
* if (elapsed > maxTime) {
|
|
21
|
+
* throw new TimeoutError(undefined, "API 응답 대기 초과");
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
export declare class TimeoutError extends SdError {
|
|
25
|
+
/**
|
|
26
|
+
* @param count 시도 횟수
|
|
27
|
+
* @param message 추가 메시지
|
|
28
|
+
*/
|
|
29
|
+
constructor(count?: number, message?: string);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=timeout-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/timeout-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,YAAa,SAAQ,OAAO;IACvC;;;OAGG;gBACS,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM7C"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Array 확장 메서드
|
|
3
|
+
*
|
|
4
|
+
* @remarks 각 메서드의 TSDoc은 타입 정의 파일(arr-ext.types.ts) 참조
|
|
5
|
+
*/
|
|
6
|
+
import "./map-ext";
|
|
7
|
+
import type { ReadonlyArrayExt, MutableArrayExt } from "./arr-ext.types";
|
|
8
|
+
declare global {
|
|
9
|
+
interface ReadonlyArray<T> extends ReadonlyArrayExt<T> {
|
|
10
|
+
}
|
|
11
|
+
interface Array<T> extends ReadonlyArrayExt<T>, MutableArrayExt<T> {
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export type { ArrayDiffsResult, ArrayDiffs2Result, TreeArray, ComparableType } from "./arr-ext.types";
|
|
15
|
+
//# sourceMappingURL=arr-ext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arr-ext.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/extensions/arr-ext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,WAAW,CAAC;AAUnB,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AA2uBzB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;KAAG;IACzD,UAAU,KAAK,CAAC,CAAC,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;KAAG;CACtE;AAID,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Array 확장 헬퍼 함수
|
|
3
|
+
*/
|
|
4
|
+
import type { ComparableType } from "./arr-ext.types";
|
|
5
|
+
/**
|
|
6
|
+
* DateTime, DateOnly, Time을 비교 가능한 primitive 값으로 변환
|
|
7
|
+
*/
|
|
8
|
+
export declare function toComparable(value: ComparableType): string | number | boolean | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* 정렬을 위한 비교 함수
|
|
11
|
+
*
|
|
12
|
+
* @param pp 비교 대상 1
|
|
13
|
+
* @param pn 비교 대상 2
|
|
14
|
+
* @param desc true: 내림차순, false: 오름차순
|
|
15
|
+
* @returns 음수: pp가 앞, 0: 같음, 양수: pn이 앞
|
|
16
|
+
* @note null/undefined 값은 오름차순 시 앞으로, 내림차순 시 뒤로 정렬됨
|
|
17
|
+
*/
|
|
18
|
+
export declare function compareForOrder(pp: ComparableType, pn: ComparableType, desc: boolean): number;
|
|
19
|
+
//# sourceMappingURL=arr-ext.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arr-ext.helpers.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/extensions/arr-ext.helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAKzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAuB7F"}
|