@simplysm/sd-claude 14.0.98 β 14.0.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/claude/references/sd-simplysm14/README.md +16 -16
- package/claude/references/sd-simplysm14/apis/angular/README.md +81 -153
- package/claude/references/sd-simplysm14/apis/angular/controls.md +179 -205
- package/claude/references/sd-simplysm14/apis/angular/crud.md +71 -57
- package/claude/references/sd-simplysm14/apis/angular/directives.md +49 -109
- package/claude/references/sd-simplysm14/apis/angular/features.md +58 -86
- package/claude/references/sd-simplysm14/apis/angular/kanban.md +32 -40
- package/claude/references/sd-simplysm14/apis/angular/layout.md +38 -52
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +86 -110
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +54 -86
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +82 -74
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +56 -80
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +15 -15
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +21 -21
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +79 -53
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +9 -11
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +15 -15
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +20 -20
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +18 -18
- package/claude/references/sd-simplysm14/apis/core-common/README.md +20 -49
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +66 -55
- package/claude/references/sd-simplysm14/apis/core-common/collection-ext.md +83 -56
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +32 -21
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +57 -39
- package/claude/references/sd-simplysm14/apis/core-common/serialization.md +36 -30
- package/claude/references/sd-simplysm14/apis/core-common/value-types.md +69 -41
- package/claude/references/sd-simplysm14/apis/core-node/README.md +4 -4
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +15 -13
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +11 -7
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +8 -8
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +29 -20
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +14 -6
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +3 -3
- package/claude/references/sd-simplysm14/apis/excel/README.md +3 -3
- package/claude/references/sd-simplysm14/apis/excel/cell.md +32 -32
- package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +23 -24
- package/claude/references/sd-simplysm14/apis/excel/style.md +24 -30
- package/claude/references/sd-simplysm14/apis/excel/utils.md +20 -23
- package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +60 -71
- package/claude/references/sd-simplysm14/apis/excel/wrapper.md +36 -36
- package/claude/references/sd-simplysm14/apis/lint/README.md +7 -9
- package/claude/references/sd-simplysm14/apis/lint/recommended.md +59 -37
- package/claude/references/sd-simplysm14/apis/lint/rules.md +81 -74
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +6 -6
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +112 -78
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +131 -75
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +126 -82
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +170 -113
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +102 -48
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +12 -13
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +3 -3
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +5 -5
- package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +67 -65
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +130 -123
- package/claude/references/sd-simplysm14/apis/service-client/README.md +63 -63
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +22 -22
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +30 -26
- package/claude/references/sd-simplysm14/apis/service-common/README.md +8 -8
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +13 -6
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +1 -1
- package/claude/references/sd-simplysm14/apis/service-server/README.md +43 -47
- package/claude/references/sd-simplysm14/apis/service-server/built-in-services.md +35 -0
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +20 -19
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +23 -25
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +9 -9
- package/claude/references/sd-simplysm14/apis/storage/README.md +26 -26
- package/claude/references/sd-simplysm14/manuals/client-component.md +9 -1
- package/claude/references/sd-simplysm14/manuals/client-crud.md +1 -1
- package/claude/references/sd-simplysm14/manuals/client-orm.md +1 -0
- package/claude/references/sd-simplysm14/manuals/client-service.md +1 -0
- package/claude/references/sd-simplysm14/manuals/client-shared-data.md +1 -0
- package/claude/references/sd-simplysm14/manuals/client-ssg.md +1 -0
- package/claude/sd-system-prompt.md +11 -26
- package/claude/skills/sd-docs/references/subagent-prompt.md +4 -3
- package/claude/skills/sd-spec/SKILL.md +87 -18
- package/claude/skills/sd-spec/references/format.md +2 -2
- package/package.json +1 -1
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
# @simplysm/service-client
|
|
2
2
|
|
|
3
|
-
WebSocket μΌλ‘ μλΉμ€ μλ²μ
|
|
3
|
+
WebSocket μΌλ‘ μλΉμ€ μλ²μ λΆμ΄ μλΉμ€ λ©μλ RPC νΈμΆΒ·μλ² νΈμ μ΄λ²€νΈ ꡬλ
/λ°νΒ·νμΌ μ
/λ€μ΄λ‘λΒ·μλ²μΈ‘ ORM μ격 μ€νμ μννλ ν΄λΌμ΄μΈνΈ. λΈλΌμ°μ Β·Node.js μμͺ½μμ λμνλ©°, Node μμ κΈλ‘λ² `WebSocket` μ΄ μμΌλ©΄ μμΌ λͺ¨λ λ‘λ μμ μ `ws` ν¨ν€μ§λ‘ polyfill νλ€.
|
|
4
4
|
|
|
5
5
|
## μ¬μ© νΈλ¦¬κ±° μΈλ±μ€
|
|
6
6
|
|
|
7
|
-
- **createServiceClient / ServiceClient** β μλ²
|
|
8
|
-
- **ServiceConnectionOptions** β
|
|
9
|
-
- **getService / ServiceProxy** β μλ²
|
|
10
|
-
- **μ΄λ²€νΈ ꡬλ
Β·λ°ν (addListener / removeListener / emitEvent /
|
|
11
|
-
- **νμΌ μ
/λ€μ΄λ‘λ (uploadFile / downloadFileBuffer / FileClient)** β
|
|
12
|
-
- **μ§νλ₯ (ServiceProgress / ServiceProgressState)** β
|
|
13
|
-
- **νκ²½ νΈν νμ
Β·ν¬νΌ (BlobInput / FileCollection / BrowserWorker / isWorkerSupported
|
|
14
|
-
- **ORM μ격 μ€ν (createOrmClientConnector / OrmClientConnector / OrmConnectOptions / OrmClientDbContextExecutor)** β
|
|
15
|
-
- **μ μμ€ μ μ‘ κ³μΈ΅ (SocketProvider / ServiceTransport / ClientProtocolWrapper λ° create\*)** β
|
|
7
|
+
- **createServiceClient / ServiceClient** β μλ² μ μΒ·μλΉμ€ νΈμΆΒ·μΈμ¦Β·μ°κ²° μν μΆμ μ μ£Ό μ§μ
μ . (μλ μΈλΌμΈ)
|
|
8
|
+
- **ServiceConnectionOptions** β μ μ λμ(host/port/ssl)Β·μ¬μ°κ²° μ μ±
μ§μ . (μλ μΈλΌμΈ)
|
|
9
|
+
- **getService / ServiceProxy** β μλ² μλΉμ€λ₯Ό νμ
μμ νλ‘μλ‘ νΈμΆ. (μλ μΈλΌμΈ)
|
|
10
|
+
- **μ΄λ²€νΈ ꡬλ
Β·λ°ν (getEvent / addListener / removeListener / emitEvent / ClientEventProxy / EventClient)** β μλ² νΈμ μ΄λ²€νΈ ꡬλ
Β·λ°ν. (μλ μΈλΌμΈ)
|
|
11
|
+
- **νμΌ μ
/λ€μ΄λ‘λ (uploadFile / downloadFileBuffer / FileClient)** β μΈμ¦ μ
λ‘λ, μλ² μλκ²½λ‘ λ€μ΄λ‘λ. (μλ μΈλΌμΈ)
|
|
12
|
+
- **μ§νλ₯ (ServiceProgress / ServiceProgressState)** β μ²ν¬ λΆν λλ λμ©λ μμ²/μλ΅μ μ§ν μΆμ . (μλ μΈλΌμΈ)
|
|
13
|
+
- **νκ²½ νΈν νμ
Β·ν¬νΌ (BlobInput / FileCollection / BrowserWorker / isBrowserWorkerSupported / isNodeWorkerSupported / isWorkerSupported)** β Node/browser κ³΅μ© μ½λμ DOM νμ
ννΌΒ·Worker λΆκΈ°. (μλ μΈλΌμΈ)
|
|
14
|
+
- **ORM μ격 μ€ν (createOrmClientConnector / OrmClientConnector / OrmConnectOptions / OrmClientDbContextExecutor)** β μλ² DbContext λ₯Ό ν΄λΌμ΄μΈνΈμμ νΈλμμ
λ¨μλ‘ μ€ν. μμΈν: [orm.md](./orm.md)
|
|
15
|
+
- **μ μμ€ μ μ‘ κ³μΈ΅ (SocketProvider / ServiceTransport / ClientProtocolWrapper λ° create\*)** β `ServiceClient` κ° λ΄λΆμμ 쑰립νλ μμΌΒ·ννΈλΉνΈΒ·νλ‘ν μ½Β·μ²ν¬ λͺ¨λ. μ§μ μ°μ§ μμ. μμΈν: [transport.md](./transport.md)
|
|
16
16
|
|
|
17
|
-
> μ±(Angular)
|
|
17
|
+
> μ±(Angular)μμλ νλ©΄μ΄ `ServiceClient` λ₯Ό μ§μ λ§λ€μ§ μκ³ `AppServiceProvider`(root provider)μ `client` getter λ₯Ό κ²½μ ν΄ μλΉμ€Β·μ΄λ²€νΈΒ·ORM μ§μ
μ μ λͺ¨μλ€. μλ μμλ client μ§μ νΈμΆ ννμ§λ§, μ€μ μ± μ½λλ manuals/client-service.mdΒ·client-orm.mdΒ·event.md μ provider ν¨ν΄μ λ°λ₯Έλ€.
|
|
18
18
|
|
|
19
19
|
## λ©μΈ ν΄λΌμ΄μΈνΈ (createServiceClient / ServiceClient)
|
|
20
20
|
|
|
21
21
|
`createServiceClient(name, options): ServiceClient` β ν΄λΌμ΄μΈνΈ μΈμ€ν΄μ€ μμ±. `new ServiceClient(name, options)` μ λμΌ.
|
|
22
22
|
|
|
23
|
-
- name: string β ν΄λΌμ΄μΈνΈ μλ³ μ΄λ¦. WebSocket μ μ 쿼리μ `clientName`Β·νμΌ μ
λ‘λ ν€λ `x-sd-client-name` μΌλ‘ μλ²μ μ λ¬.
|
|
24
|
-
- options: ServiceConnectionOptions β μ μ λμΒ·μ¬μ°κ²° μ μ±
(μλ μΉμ
).
|
|
23
|
+
- `name: string` β ν΄λΌμ΄μΈνΈ μλ³ μ΄λ¦. WebSocket μ μ 쿼리μ `clientName`Β·νμΌ μ
λ‘λ ν€λ `x-sd-client-name` μΌλ‘ μλ²μ μ λ¬. μλ²μΈ‘ μ°κ²° ꡬλΆΒ·λ‘κΉ
μ©.
|
|
24
|
+
- `options: ServiceConnectionOptions` β μ μ λμΒ·μ¬μ°κ²° μ μ±
(μλ μΉμ
).
|
|
25
25
|
|
|
26
26
|
`ServiceClient` λ `EventEmitter<ServiceClientEvents>` λ₯Ό μμνλ©° λ€μμ λ
ΈμΆ:
|
|
27
27
|
|
|
28
|
-
- name: string (readonly) β μμ± μ λ°μ
|
|
29
|
-
- options: ServiceConnectionOptions (readonly) β μμ± μ λ°μ μ μ μ΅μ
.
|
|
30
|
-
- connected: boolean (getter) β
|
|
31
|
-
- hostUrl: string (getter) β `http
|
|
32
|
-
- connect(): Promise
|
|
33
|
-
- close(): Promise
|
|
34
|
-
- send(serviceName, methodName, params, progress?): Promise
|
|
35
|
-
- auth(token): Promise
|
|
36
|
-
- getService / getEvent / addListener / removeListener / emitEvent / uploadFile / downloadFileBuffer β μλ κ°
|
|
28
|
+
- `name: string` (readonly) β μμ± μ λ°μ μ΄λ¦.
|
|
29
|
+
- `options: ServiceConnectionOptions` (readonly) β μμ± μ λ°μ μ μ μ΅μ
.
|
|
30
|
+
- `connected: boolean` (getter) β μμΌμ΄ OPEN μνμΈμ§. μ¬μ°κ²° μ€Β·μ’
λ£ μ false. `addListener` λ false λ©΄ throw νλ―λ‘ λ±λ‘ κ°λ₯ μ¬λΆ νλ¨μ μ¬μ©.
|
|
31
|
+
- `hostUrl: string` (getter) β `ssl` μ΄λ©΄ `https://`, μλλ©΄ `http://` λ‘ μμνλ `νλ‘ν μ½://host:port` HTTP λ² μ΄μ€ URL. νμΌ μ
/λ€μ΄λ‘λκ° μ΄ URL μ λ² μ΄μ€λ‘ μ¬μ©.
|
|
32
|
+
- `connect(): Promise<void>` β μλ²μ WebSocket μ°κ²°. μ΄κΈ° μ°κ²° μ€ν¨ μ throw. λͺ¨λ ν΅μ (μλΉμ€ νΈμΆΒ·μ΄λ²€νΈ λ±λ‘) μ μ 1ν νΈμΆ.
|
|
33
|
+
- `close(): Promise<void>` β μ°κ²° μλ μ’
λ£(μ΄ν μλ μ¬μ°κ²° μ ν¨) ν νλ‘ν μ½ μ컀 μμ ν΄μ (`protocolWrapper.dispose()`). μ’
λ£ν μΈμ€ν΄μ€λ μ¬μ¬μ©νμ§ μμ.
|
|
34
|
+
- `send(serviceName, methodName, params, progress?): Promise<unknown>` β μ μμ€ μλΉμ€ νΈμΆ. `serviceName.methodName` λ©μμ§λ₯Ό 보λ΄κ³ μλ΅ λ°ν. λ³΄ν΅ `getService` νλ‘μλ‘ κ°μ νΈμΆ. progress μΈμλ₯Ό μ£Όμ§ μμλ client μ `request/response/server-progress` μ΄λ²€νΈλ νμ λ°μ.
|
|
35
|
+
- `auth(token): Promise<void>` β μΈμ¦ ν ν°μ μλ²μ μ μ‘νκ³ λ΄λΆ 보κ΄. λ³΄κ΄ ν ν°μ μ¬μ°κ²° μ μλ μ¬μΈμ¦Β·νμΌ μ
λ‘λ Bearer μΈμ¦μ μ¬μ¬μ©λ¨. νμΌ μ
λ‘λ μ μ ν νμ.
|
|
36
|
+
- `getService / getEvent / addListener / removeListener / emitEvent / uploadFile / downloadFileBuffer` β μλ κ° μΉμ
.
|
|
37
37
|
|
|
38
38
|
```ts
|
|
39
39
|
const client = createServiceClient("my-app", { host: "localhost", port: 50080, ssl: false });
|
|
@@ -43,10 +43,10 @@ await client.auth(jwtToken);
|
|
|
43
43
|
|
|
44
44
|
**ServiceClientEvents** (EventEmitter μ΄λ²€νΈ):
|
|
45
45
|
|
|
46
|
-
- "request-progress": ServiceProgressState β μμ²(μ
λ‘λ) μ²ν¬ μ§νλ₯ . μμ² λ³Έλ¬Έμ΄ μ²ν¬ 2κ° μ΄μμΌλ‘ λΆν λ λλ§ λ°μ.
|
|
47
|
-
- "response-progress": ServiceProgressState β μλ΅(λ€μ΄λ‘λ) μ²ν¬ μμ μ§νλ₯ . λΆν
|
|
48
|
-
- "server-progress": ServiceProgressState β μλ²κ° μ²λ¦¬ μ€
|
|
49
|
-
- "state": "connected" | "closed" | "reconnecting" β μ°κ²° μν
|
|
46
|
+
- `"request-progress": ServiceProgressState` β μμ²(μ
λ‘λ) μ²ν¬ μ§νλ₯ . μμ² λ³Έλ¬Έμ΄ μ²ν¬ 2κ° μ΄μμΌλ‘ λΆν λ λλ§ λ°μ.
|
|
47
|
+
- `"response-progress": ServiceProgressState` β μλ΅(λ€μ΄λ‘λ) μ²ν¬ μμ μ§νλ₯ . λΆν μλ΅μ΄λ©΄ μλ£ μ 100% λ₯Ό ν λ² λ λ³΄κ³ .
|
|
48
|
+
- `"server-progress": ServiceProgressState` β μλ²κ° μ²λ¦¬ μ€ λ³΄κ³ νλ μ§νλ₯ (μλ²μΈ‘ `name: "progress"` λ©μμ§ μμ μ).
|
|
49
|
+
- `"state": "connected" | "closed" | "reconnecting"` β μ°κ²° μν μ μ΄. `"connected"` = μ°κ²°/μ¬μ°κ²° μ±κ³΅(μ΄ μ μ΄ μ λ³΄κ΄ ν ν°μΌλ‘ μλ μ¬μΈμ¦ + λ±λ‘ 리μ€λ μλ 볡ꡬ), `"closed"` = μ μ μ’
λ£ λλ μ¬μ°κ²° νλ μ΄κ³Ό, `"reconnecting"` = μ¬μ°κ²° μλ μ€. μ€νλΌμΈ λ°°λ ν κΈ λ±μ μ¬μ©.
|
|
50
50
|
|
|
51
51
|
```ts
|
|
52
52
|
client.on("state", (s) => { if (s === "reconnecting") showOfflineBanner(); });
|
|
@@ -56,50 +56,50 @@ client.on("state", (s) => { if (s === "reconnecting") showOfflineBanner(); });
|
|
|
56
56
|
|
|
57
57
|
`createServiceClient` μ λ λ²μ§Έ μΈμ.
|
|
58
58
|
|
|
59
|
-
- port: number β μλ² ν¬νΈ. νμ.
|
|
60
|
-
- host: string β μλ² νΈμ€νΈ. νμ.
|
|
61
|
-
- ssl?: boolean β TLS μ¬μ© μ¬λΆ. true λ©΄ `wss`/`https`, falseΒ·λ―Έμ§μ μ΄λ©΄ `ws`/`http`. TLS μλ²μ λΆμ λλ§ true.
|
|
62
|
-
- maxReconnectCount?: number β μ°κ²° λκΉ μ μ΅λ μ¬μ°κ²° μλ νμ. λ―Έμ§μ μ 10. 0 μ΄λ©΄
|
|
59
|
+
- `port: number` β μλ² ν¬νΈ. νμ.
|
|
60
|
+
- `host: string` β μλ² νΈμ€νΈ. νμ.
|
|
61
|
+
- `ssl?: boolean` β TLS μ¬μ© μ¬λΆ. true λ©΄ `wss`/`https`, falseΒ·λ―Έμ§μ μ΄λ©΄ `ws`/`http`. TLS μλ²μ λΆμ λλ§ true.
|
|
62
|
+
- `maxReconnectCount?: number` β μ°κ²° λκΉ μ μ΅λ μ¬μ°κ²° μλ νμ. λ―Έμ§μ μ 10. 0 μ΄λ©΄ μ¬μ°κ²°μ λΉνμ±ννκ³ λκΈ°λ©΄ μ¦μ ν¬κΈ°. ν
μ€νΈΒ·λ¨λ°μ± μ°κ²°μ΄λ©΄ 0.
|
|
63
63
|
|
|
64
64
|
## getService / ServiceProxy
|
|
65
65
|
|
|
66
|
-
μλ²
|
|
66
|
+
μλ² μλΉμ€μ κ° λ©μλλ₯Ό `Promise` λ°ν ν¨μλ‘ λ
ΈμΆνλ νμ
μμ νλ‘μ.
|
|
67
67
|
|
|
68
|
-
`getService<TService>(serviceName): ServiceProxy<TService>` β `serviceName` μΌλ‘ λ±λ‘λ μλ² μλΉμ€μ νλ‘μ λ°ν. νλ‘μ λ©μλ νΈμΆμ λ΄λΆμ μΌλ‘ `client.send(serviceName, λ©μλλͺ
, μΈμλ°°μ΄)` λ‘
|
|
68
|
+
`getService<TService>(serviceName): ServiceProxy<TService>` β `serviceName` μΌλ‘ λ±λ‘λ μλ² μλΉμ€μ νλ‘μ λ°ν. νλ‘μ λ©μλ νΈμΆμ λ΄λΆμ μΌλ‘ `client.send(serviceName, λ©μλλͺ
, μΈμλ°°μ΄)` λ‘ μμ(`Proxy` κΈ°λ°, λͺ¨λ μμ± μ κ·Όμ λΉλκΈ° RPC ν¨μλ‘ λ³ν).
|
|
69
69
|
|
|
70
|
-
- TService β μλ² μλΉμ€ λ©μλ μΈν°νμ΄μ€ νμ
. μ»΄νμΌ νμ μκ·Έλμ²
|
|
71
|
-
- serviceName: string β μλ²μ `defineService("XxxName", ...)` μ΄λ¦κ³Ό μΌμΉν΄μΌ ν¨.
|
|
72
|
-
- ServiceProxy
|
|
70
|
+
- `TService` β μλ² μλΉμ€ λ©μλ μΈν°νμ΄μ€ νμ
. μ»΄νμΌ νμ μκ·Έλμ² κ²μ¦ μ μ©(λ°νμ κ²μ¦ μλ). μ±μμ server ν¨ν€μ§κ° export ν `ServiceMethods<typeof XxxService>` μ¬μ©.
|
|
71
|
+
- `serviceName: string` β μλ²μ `defineService("XxxName", ...)` μ΄λ¦κ³Ό μΌμΉν΄μΌ ν¨.
|
|
72
|
+
- `ServiceProxy<TService>` β `TService` μ κ° ν¨μ λ©€λ²λ₯Ό `(...args) => Promise<Awaited<R>>` λ‘ λ§€ννλ νμ
λ³νκΈ°. μλ³Έμ΄ λκΈ° λ°νμ΄μ΄λ Promise λ‘ λν. ν¨μ μλ μμ±μ `never` λ‘ μ μΈ.
|
|
73
73
|
|
|
74
74
|
```ts
|
|
75
75
|
const svc = client.getService<TestServiceMethods>("TestService");
|
|
76
|
-
const result = await svc.echo("hi"); // μλ² TestService.echo("hi")
|
|
76
|
+
const result = await svc.echo("hi"); // μλ² TestService.echo("hi") νΈμΆ β Promise<string>
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
## μ΄λ²€νΈ ꡬλ
Β·λ°ν (addListener / removeListener / emitEvent
|
|
79
|
+
## μ΄λ²€νΈ ꡬλ
Β·λ°ν (getEvent / addListener / removeListener / emitEvent)
|
|
80
80
|
|
|
81
|
-
μλ² νΈμ μ΄λ²€νΈλ `@simplysm/service-common` μ `defineEvent` μ°μΆλ¬Ό(`ServiceEventDef`. `$info` = ꡬλ
νν° μ 보 νμ
, `$data` = νμ΄λ‘λ νμ
) λ¨μλ‘ λ€λ£¬λ€. λ±λ‘ν 리μ€λλ μ¬μ°κ²° μ μλ
|
|
81
|
+
μλ² νΈμ μ΄λ²€νΈλ `@simplysm/service-common` μ `defineEvent` μ°μΆλ¬Ό(`ServiceEventDef`. `$info` = ꡬλ
νν° μ 보 νμ
, `$data` = νμ΄λ‘λ νμ
) λ¨μλ‘ λ€λ£¬λ€. λ±λ‘ν 리μ€λλ μ¬μ°κ²° μ μλ μ¬κ΅¬λ
λλ€.
|
|
82
82
|
|
|
83
83
|
`addListener<TEventDef>(eventDef, info, cb): Promise<string>` β 리μ€λ λ±λ‘. λ―Έμ°κ²°(`connected === false`)μ΄λ©΄ throw("μλ²μ μ°κ²°λμ§ μμμ΅λλ€."). λ°ν key λ‘ λμ€μ μ κ±°.
|
|
84
84
|
|
|
85
|
-
- eventDef: TEventDef β μ΄λ²€νΈ μ μ(`defineEvent` κ²°κ³Ό). `$info`/`$data` νμ
μ
|
|
86
|
-
- info: TEventDef["$info"] β μ΄ κ΅¬λ
μ μλ³Β·νν°λ§ν μ 보. λ°νμΈ‘ selector κ° μ΄ κ°μ λ³΄κ³ μ λ¬ μ¬λΆ κ²°μ .
|
|
87
|
-
- cb: (data: $data) => PromiseLike
|
|
85
|
+
- `eventDef: TEventDef` β μ΄λ²€νΈ μ μ(`defineEvent` κ²°κ³Ό). `$info`/`$data` νμ
μ μΆμ²μ΄μ λΌμ°ν
ν€(`eventName`).
|
|
86
|
+
- `info: TEventDef["$info"]` β μ΄ κ΅¬λ
μ μλ³Β·νν°λ§ν μ 보. λ°νμΈ‘ selector κ° μ΄ κ°μ λ³΄κ³ μ λ¬ μ¬λΆ κ²°μ .
|
|
87
|
+
- `cb: (data: $data) => PromiseLike<void>` β μ΄λ²€νΈ μμ μ½λ°±. μ½λ°± λ΄ μμΈλ λ‘κΉ
λ§ λκ³ νΈμΆλΆλ‘ μ νλμ§ μμ.
|
|
88
88
|
|
|
89
|
-
`removeListener(key): Promise<void>` β λ±λ‘ key λ‘ λ¦¬μ€λ
|
|
89
|
+
`removeListener(key): Promise<void>` β λ±λ‘ key λ‘ λ¦¬μ€λ μ κ±°(λ‘컬 λ§΅ μμ + μλ² `evt:remove` μ μ‘). μλ² μ μ‘ μ€ν¨(μ°κ²° λκΉ λ±)λ 무μ β μλ²κ° λκΉ μ 리μ€λλ₯Ό μλ μ 리νλ―λ‘ μμ .
|
|
90
90
|
|
|
91
91
|
`emitEvent<TEventDef>(eventDef, infoSelector, data): Promise<void>` β μ΄λ²€νΈ λ°ν. μλ²μμ λμΌ μ΄λ²€νΈ ꡬλ
μ λͺ©λ‘μ μ‘°νν λ€ `infoSelector(info)` κ° true μΈ λμμκ²λ§ data μ μ‘. λ§€μΉ λμμ΄ 0κ°λ©΄ μ μ‘ μ체λ₯Ό μλ΅.
|
|
92
92
|
|
|
93
|
-
- infoSelector: (item: $info) => boolean β λ°ν λμ ꡬλ
μλ₯Ό info κΈ°μ€μΌλ‘ νν°. true λ°ν ꡬλ
μμκ²λ§ μ λ¬. μ 체 μ μ‘μ΄λ©΄ `() => true`.
|
|
94
|
-
- data: TEventDef["$data"] β μ μ‘ νμ΄λ‘λ.
|
|
93
|
+
- `infoSelector: (item: $info) => boolean` β λ°ν λμ ꡬλ
μλ₯Ό info κΈ°μ€μΌλ‘ νν°. true λ°ν ꡬλ
μμκ²λ§ μ λ¬. μ 체 μ μ‘μ΄λ©΄ `() => true`.
|
|
94
|
+
- `data: TEventDef["$data"]` β μ μ‘ νμ΄λ‘λ.
|
|
95
95
|
|
|
96
96
|
`getEvent<TEventDef>(eventDef): ClientEventProxy<TEventDef>` β νΉμ eventDef μ λ°μΈλ©λ νλ‘μ λ°ν. eventDef λ₯Ό λ§€λ² λκΈ°μ§ μκ³ μ§§κ² μ°λ € ν λ(μ±μ `AppServiceProvider.xxxEvent` getter ν¨ν΄).
|
|
97
97
|
|
|
98
98
|
`ClientEventProxy<TEventDef>` λ©€λ²(μ client λ©μλμ eventDef κ³ μ ν):
|
|
99
99
|
|
|
100
|
-
- addListener(info, cb): Promise
|
|
101
|
-
- removeListener(key): Promise
|
|
102
|
-
- emit(infoSelector, data): Promise
|
|
100
|
+
- `addListener(info, cb): Promise<string>` β 리μ€λ λ±λ‘.
|
|
101
|
+
- `removeListener(key): Promise<void>` β 리μ€λ μ κ±°.
|
|
102
|
+
- `emit(infoSelector, data): Promise<void>` β μ΄λ²€νΈ λ°ν.
|
|
103
103
|
|
|
104
104
|
```ts
|
|
105
105
|
const chatEvent = defineEvent<{ channel: string }, string>("Chat");
|
|
@@ -108,17 +108,17 @@ await client.emitEvent(chatEvent, (info) => info.channel === "room1", "hello");
|
|
|
108
108
|
await client.removeListener(key);
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
-
`EventClient` / `createEventClient(transport)` λ `ServiceClient` κ° λ΄λΆ 쑰립μ μ°λ μ μμ€ κ΅¬ν. μ λ©μλ(getEvent/addListener/removeListener/emit)μ λν΄ `resubscribeAll(): Promise<void>`(보κ΄λ λͺ¨λ 리μ€λλ₯Ό μλ²μ μ¬λ±λ‘, μ¬μ°κ²°
|
|
111
|
+
`EventClient` / `createEventClient(transport)` λ `ServiceClient` κ° λ΄λΆ 쑰립μ μ°λ μ μμ€ κ΅¬ν. μ λ©μλ(getEvent/addListener/removeListener/emit)μ λν΄ `resubscribeAll(): Promise<void>`(보κ΄λ λͺ¨λ 리μ€λλ₯Ό μλ²μ μ¬λ±λ‘, μ¬μ°κ²° 볡ꡬμ©. νλͺ©λ³ μ€ν¨λ λ‘κΉ
ν κ³μ)λ₯Ό κ°μ§. μΌλ° μ¬μ©μμ μ§μ λ§λ€μ§ μμ.
|
|
112
112
|
|
|
113
113
|
## νμΌ μ
/λ€μ΄λ‘λ (uploadFile / downloadFileBuffer)
|
|
114
114
|
|
|
115
|
-
`uploadFile(files): Promise<ServiceUploadResult[]>` β `POST <hostUrl>/upload` (multipart/form-data) λ‘ νμΌ μ
λ‘λ. λ³΄κ΄ ν ν°μ `Authorization: Bearer` ν€λλ‘ μ μ‘νλ―λ‘ μ¬μ `auth()` νμ(
|
|
115
|
+
`uploadFile(files): Promise<ServiceUploadResult[]>` β `POST <hostUrl>/upload` (multipart/form-data) λ‘ νμΌ μ
λ‘λ. λ³΄κ΄ ν ν°μ `Authorization: Bearer` ν€λλ‘ μ μ‘νλ―λ‘ μ¬μ `auth()` νμ(λ³΄κ΄ ν ν° μμΌλ©΄ throw). μλ΅ λΉμ μ(`!res.ok`) μ throw.
|
|
116
116
|
|
|
117
|
-
- files:
|
|
117
|
+
- `files: File[] | FileCollection | { name: string; data: BlobInput }[]` β μ
λ‘λ λμ. λΈλΌμ°μ `File` λ°°μ΄, `FileCollection`(FileList νΈν), λλ `{ name, data }` 컀μ€ν
κ°μ²΄ λ°°μ΄. 컀μ€ν
κ°μ²΄μ data κ° `Blob` μ΄ μλλ©΄ `new Blob([data])` λ‘ κ°μΈ μ μ‘.
|
|
118
118
|
|
|
119
119
|
`downloadFileBuffer(relPath): Promise<Bytes>` β `<hostUrl>/<relPath>` λ₯Ό GET ν΄ `Uint8Array` λ°ν. μλ΅ λΉμ μ(`!res.ok`) μ throw.
|
|
120
120
|
|
|
121
|
-
- relPath: string β μλ² κΈ°μ€ μλκ²½λ‘. μ ν `/` μ 무 λͺ¨λ νμ©(μμΌλ©΄ μλμΌλ‘ `/`
|
|
121
|
+
- `relPath: string` β μλ² κΈ°μ€ μλκ²½λ‘. μ ν `/` μ 무 λͺ¨λ νμ©(μμΌλ©΄ μλμΌλ‘ `/` 보μ ).
|
|
122
122
|
|
|
123
123
|
```ts
|
|
124
124
|
await client.auth(token);
|
|
@@ -134,15 +134,15 @@ const bytes = await client.downloadFileBuffer("/files/a.txt");
|
|
|
134
134
|
|
|
135
135
|
`ServiceProgress` β `send(..., progress)` μ λκΈ°λ μ½λ°± μ§ν©(ν΄λΉ νΈμΆ λ¨κ±΄ μΆμ μ©, μ μ μ΄λ²€νΈμ λ³κ°). κ° μ½λ°±μ `(s: ServiceProgressState) => void`:
|
|
136
136
|
|
|
137
|
-
- request
|
|
138
|
-
- response
|
|
139
|
-
- server
|
|
137
|
+
- `request?` β μμ² μ²ν¬ μ
λ‘λ μ§ν μ νΈμΆ. μμ² μ²ν¬κ° 2κ° μ΄μμΌ λλ§ λ°μ.
|
|
138
|
+
- `response?` β μλ΅ μ²ν¬ μμ μ§ν μ νΈμΆ. λΆν μλ΅μ΄μμΌλ©΄ μλ£ μ 100%(`completedSize === totalSize`)λ₯Ό ν λ² λ λ³΄κ³ .
|
|
139
|
+
- `server?` β μλ²κ° μ²λ¦¬ μ€ λ³΄κ³ ν μ§νλ₯ μμ μ νΈμΆ(μλ²μΈ‘ `name: "progress"` λ©μμ§).
|
|
140
140
|
|
|
141
141
|
`ServiceProgressState` β μ§νλ₯ μ€λ
μ·.
|
|
142
142
|
|
|
143
|
-
- uuid: string β ν΄λΉ μμ²/μλ΅ μλ³μ. λμ μμ² κ΅¬λΆμ©.
|
|
144
|
-
- totalSize: number β μ 체 λ°μ΄νΈ μ.
|
|
145
|
-
- completedSize: number β μλ£ λ°μ΄νΈ μ. `completedSize === totalSize` λ©΄ μλ£.
|
|
143
|
+
- `uuid: string` β ν΄λΉ μμ²/μλ΅ μλ³μ. λμ μμ² κ΅¬λΆμ©.
|
|
144
|
+
- `totalSize: number` β μ 체 λ°μ΄νΈ μ.
|
|
145
|
+
- `completedSize: number` β μλ£ λ°μ΄νΈ μ. `completedSize === totalSize` λ©΄ μλ£.
|
|
146
146
|
|
|
147
147
|
μ μ μΆμ μ΄λ©΄ μ½λ°± λμ ServiceClient μ `request/response/server-progress` μ΄λ²€νΈ(`client.on("response-progress", ...)`)λ₯Ό μ¨λ λ¨ β `send` λ progress μΈμ μ 무μ 무κ΄νκ² μ΄ μ΄λ²€νΈλ€μ νμ λ°μμν΄.
|
|
148
148
|
|
|
@@ -154,9 +154,9 @@ client.on("response-progress", (s) => updateBar(s.completedSize / s.totalSize));
|
|
|
154
154
|
|
|
155
155
|
Node/browser κ³΅μ© μ½λμμ DOM μ μ© νμ
μ νΌνκ³ Worker μ§μ μ¬λΆλ₯Ό λΆκΈ°νκΈ° μν νμ
Β·ν¨μ. νλ‘ν μ½ μΈμ½λ©/νμ± Worker μ€νλ‘λ© νλ¨ μ λ΄λΆμμ μ¬μ©.
|
|
156
156
|
|
|
157
|
-
- BlobInput =
|
|
158
|
-
- FileCollection (interface) β DOM `FileList` λ체. `length`, `item(index): File | null`, μΈλ±μ€ μ κ·Ό, `[Symbol.iterator]` 보μ . λΈλΌμ°μ `FileList` μ ꡬ쑰μ νΈν.
|
|
159
|
-
- BrowserWorker (interface) β DOM `Worker` μ΅μ μΈν°νμ΄μ€(`onmessage`/`onerror` νΈλ€λ¬, `postMessage(message, transfer?)`, `terminate()`). DOM lib μμ΄ νμ
μ²΄ν¬ ν΅κ³Όμ©.
|
|
160
|
-
- isBrowserWorkerSupported(): boolean β `globalThis` μ `Worker` μ‘΄μ¬ μ¬λΆ λ°ν. λΈλΌμ°μ DOM Worker κ°μ© νλ¨.
|
|
161
|
-
- isNodeWorkerSupported(): boolean β `process.versions.node` μ‘΄μ¬ μ¬λΆ λ°ν. Node `worker_threads` κ°μ© νλ¨.
|
|
162
|
-
- isWorkerSupported(): boolean β μ λ μ€ νλλΌλ true λ©΄ true. νλ‘ν μ½ μΈμ½λ©/νμ± μ€νλ‘λ© κ°λ₯ μ¬λΆ νλ¨(λ―Έμ§μ μ λ©μΈ μ€λ λ ν΄λ°±).
|
|
157
|
+
- `BlobInput = Blob | Uint8Array<ArrayBuffer> | ArrayBuffer | string` β `Blob` μμ±μκ° λ°λ λ°μ΄ν° νμ
(DOM `BlobPart` λ체). `uploadFile` 컀μ€ν
κ°μ²΄μ data νμ
.
|
|
158
|
+
- `FileCollection` (interface) β DOM `FileList` λ체. `length`, `item(index): File | null`, μΈλ±μ€ μ κ·Ό, `[Symbol.iterator]` 보μ . λΈλΌμ°μ `FileList` μ ꡬ쑰μ νΈν.
|
|
159
|
+
- `BrowserWorker` (interface) β DOM `Worker` μ΅μ μΈν°νμ΄μ€(`onmessage`/`onerror` νΈλ€λ¬, `postMessage(message, transfer?)`, `terminate()`). DOM lib μμ΄ νμ
μ²΄ν¬ ν΅κ³Όμ©.
|
|
160
|
+
- `isBrowserWorkerSupported(): boolean` β `globalThis` μ `Worker` μ‘΄μ¬ μ¬λΆ λ°ν. λΈλΌμ°μ DOM Worker κ°μ© νλ¨.
|
|
161
|
+
- `isNodeWorkerSupported(): boolean` β `process.versions.node` μ‘΄μ¬ μ¬λΆ λ°ν. Node `worker_threads` κ°μ© νλ¨.
|
|
162
|
+
- `isWorkerSupported(): boolean` β μ λ μ€ νλλΌλ true λ©΄ true. νλ‘ν μ½ μΈμ½λ©/νμ± μ€νλ‘λ© κ°λ₯ μ¬λΆ νλ¨(λ―Έμ§μ μ λ©μΈ μ€λ λ ν΄λ°±).
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @simplysm/service-client β ORM μ격 μ€ν
|
|
2
2
|
|
|
3
|
-
μλ²μΈ‘ ORM DbContext λ₯Ό ν΄λΌμ΄μΈνΈμμ
|
|
3
|
+
μλ²μΈ‘ ORM DbContext λ₯Ό ν΄λΌμ΄μΈνΈμμ μ격 μ€ννλ λ¬Άμ. 쿼리 μ체λ μλ² `Orm` μλΉμ€κ° DB μ λν΄ μννκ³ , ν΄λΌμ΄μΈνΈλ 컀λ₯μ
Β·νΈλμμ
·쿼리 μ μ(`QueryDef`)λ§ RPC λ‘ μ μ‘νλ€. 쿼리λ `connect`/`connectWithoutTransaction` μ½λ°± λ΄λΆμμλ§ κ°λ₯. ORM μμ
μ νΈλμμ
κ²½κ³λ‘ λ¬Άμ΄ μ€νν λ ν¨κ» μ½νλ€.
|
|
4
4
|
|
|
5
|
-
> μ±(Angular)μμλ `OrmConnectOptions`(DbClassΒ·connOptΒ·dbContextOpt)λ₯Ό νλ©΄μ ν©λΏλ¦¬μ§ μκ³ `AppOrmProvider`(root provider) ν κ³³μ κ³ μ ν λ€ `connectAsync
|
|
5
|
+
> μ±(Angular)μμλ `OrmConnectOptions`(DbClassΒ·connOptΒ·dbContextOpt)λ₯Ό νλ©΄μ ν©λΏλ¦¬μ§ μκ³ `AppOrmProvider`(root provider) ν κ³³μ κ³ μ ν λ€ `connectAsync` λ§ νΈμΆνλ€. 쿼리 μμ±λ²μ apis/orm-commonΒ·manuals/orm.md μ°Έμ‘°. μλ μμλ connector μ§μ νΈμΆ ννμ§λ§ μ€μ μ±μ manuals/client-orm.md μ provider ν¨ν΄μ λ°λ₯Έλ€.
|
|
6
6
|
|
|
7
7
|
## createOrmClientConnector / OrmClientConnector
|
|
8
8
|
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
|
|
11
11
|
`OrmClientConnector` λ©μλ:
|
|
12
12
|
|
|
13
|
-
- connect<T, R>(config, callback): Promise
|
|
14
|
-
- connectWithoutTransaction<T, R>(config, callback): Promise
|
|
13
|
+
- `connect<T, R>(config, callback): Promise<R>` β νΈλμμ
μμμ callback μ€ν. DbContext μμ± β `db.connect(...)`(connect + beginTransaction + callback + commit/rollback) μν. callback μ μ λ°ν μ 컀λ°(λ°νκ°μ΄ κ·Έλλ‘ λ©μλ λ°νκ°), throw μ λ‘€λ°±λμ΄ μ½λ°± λ΄ λ€κ±΄ μμ
μ΄ μμ μ²λ¦¬λ¨. callback μμ λ°μν μλ¬ μ€ μΈλν€ μ μ½ μλ° λ©μμ§(MySQL `a parent row: a foreign key constraint` / MSSQL `conflicted with the REFERENCE` / PostgreSQL `violates foreign key constraint`)λ "κ²½κ³ ! μ°κ΄λ μμ
μΌλ‘ μΈν΄ μμ
μ΄ κ±°λΆλμμ΅λλ€. νμ μμ
μ νμΈν΄ μ£ΌμΈμ." λ‘ κ°μΌ `SdError` λ‘ throw(μλ³Έμ cause μ 보쑴), κ·Έ μΈ μλ¬λ κ·Έλλ‘ throw.
|
|
14
|
+
- `connectWithoutTransaction<T, R>(config, callback): Promise<R>` β νΈλμμ
μμ΄ callback μ€ν(`db.connectWithoutTransaction`). νΈλμμ
μμμ λμνμ§ μλ μμ
(μ: DB initialize)Β·μ‘°ν μ μ© μμ
μ μ¬μ©. callback λ°νκ°μ΄ κ·Έλλ‘ λ°νλ¨. μΈλν€ λ©μμ§ λν μμ.
|
|
15
15
|
|
|
16
16
|
κ³΅ν΅ μΈμ:
|
|
17
17
|
|
|
18
|
-
- config: OrmConnectOptions
|
|
19
|
-
- callback: (db: T) => Promise
|
|
18
|
+
- `config: OrmConnectOptions<T>` β μλ μΉμ
. DbContext ν΄λμ€Β·μλ² ORM μ€μ Β·DBλͺ
/μ€ν€λ§.
|
|
19
|
+
- `callback: (db: T) => Promise<R> | R` β μμ±Β·μ°κ²°λ DbContext λ₯Ό λ°μ 쿼리νλ μ½λ°±. λκΈ°/λΉλκΈ° λ°ν λͺ¨λ νμ©.
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
22
|
const connector = createOrmClientConnector(client);
|
|
@@ -30,24 +30,24 @@ const rows = await connector.connect(
|
|
|
30
30
|
|
|
31
31
|
`connect`/`connectWithoutTransaction` μ 첫 μΈμ. DbContext 1ν μ€νμ νμν μ€μ .
|
|
32
32
|
|
|
33
|
-
- DbClass:
|
|
34
|
-
- connOpt:
|
|
35
|
-
- dbContextOpt?:
|
|
36
|
-
- database: string β λμ λ°μ΄ν°λ² μ΄μ€λͺ
.
|
|
37
|
-
- schema?: string β λμ μ€ν€λ§λͺ
. λ―Έμ§μ μ μλ² `getInfo()` μ schema λ₯Ό μ¬μ©.
|
|
33
|
+
- `DbClass: new (executor, opt) => T` β μ€νν DbContext ν΄λμ€ μμ±μ. `executor`(μλ `OrmClientDbContextExecutor`)μ `{ database, schema? }` λ₯Ό λ°μ μΈμ€ν΄μ€νλ¨. μ±λ³ DbContext(μ: `MainDbContext`)λ₯Ό κ·Έλλ‘ μ λ¬.
|
|
34
|
+
- `connOpt: DbConnOptions & { configName: string }` β μλ²μΈ‘ ORM μ°κ²° μ€μ . `configName` μ μλ²μ λ±λ‘λ ORM μ€μ μ΄λ¦(μλ²κ° μ΄ μ΄λ¦μΌλ‘ μ€μ DB μ μ μ 보λ₯Ό μ°Ύμ). λλ¨Έμ§ νλλ `@simplysm/service-common` μ `DbConnOptions`.
|
|
35
|
+
- `dbContextOpt?: { database: string; schema?: string }` β DbContext μ μ μ©ν DBλͺ
Β·μ€ν€λ§. μλ΅ μ μλ² `getInfo()` κ° λλ €μ€ `database`/`schema` λ₯Ό μ¬μ©. database κ° μ΅μ
Β·μλ² μμͺ½ λͺ¨λ λΉμ΄ μμΌλ©΄ throw("databaseλ νμμ
λλ€." β κ²°μΈ‘μ μμ 보μ νμ§ μμ).
|
|
36
|
+
- `database: string` β λμ λ°μ΄ν°λ² μ΄μ€λͺ
.
|
|
37
|
+
- `schema?: string` β λμ μ€ν€λ§λͺ
. λ―Έμ§μ μ μλ² `getInfo()` μ schema λ₯Ό μ¬μ©.
|
|
38
38
|
|
|
39
39
|
## OrmClientDbContextExecutor
|
|
40
40
|
|
|
41
41
|
`DbContextExecutor`(`@simplysm/orm-common`) ꡬν체. λͺ¨λ λ©μλλ₯Ό `client.getService<OrmService>("Orm")` RPC λ‘ μμ. 컀λ₯ν°κ° λ΄λΆμμ DbContext μ μ£Όμ
νλ―λ‘ μ§μ μμ±Β·νΈμΆμ λ³΄ν΅ λΆνμ.
|
|
42
42
|
|
|
43
|
-
`new OrmClientDbContextExecutor(client, opt)` β μμ±. opt =
|
|
44
|
-
|
|
45
|
-
- getInfo():
|
|
46
|
-
- connect(): Promise
|
|
47
|
-
- beginTransaction(isolationLevel?): Promise
|
|
48
|
-
- commitTransaction(): Promise
|
|
49
|
-
- rollbackTransaction(): Promise
|
|
50
|
-
- close(): Promise
|
|
51
|
-
- executeDefs
|
|
52
|
-
- executeParametrized(query, params?): Promise
|
|
53
|
-
- bulkInsert(tableName, columnDefs, records): Promise
|
|
43
|
+
`new OrmClientDbContextExecutor(client, opt)` β μμ±. `opt = DbConnOptions & { configName: string }`. μμ± μ `Orm` μλΉμ€ νλ‘μ ν보. μλ `getInfo`/`connect` μ΄μΈμ μ€ν λ©μλλ connId κ° μμΌλ©΄(λ―Έμ°κ²°) throw("λ°μ΄ν°λ² μ΄μ€μ μ°κ²°λμ§ μμμ΅λλ€.").
|
|
44
|
+
|
|
45
|
+
- `getInfo(): Promise<{ dialect; database?; schema? }>` β μλ² ORM μ€μ μ 보(λ°©μΈΒ·κΈ°λ³Έ DBλͺ
Β·μ€ν€λ§) μ‘°ν. 컀λ₯ν°κ° dbContextOpt λ―Έμ§μ μ fallback μΌλ‘ μ¬μ©.
|
|
46
|
+
- `connect(): Promise<void>` β μλ²μ 컀λ₯μ
μμ±, λ°νλ connId λ₯Ό λ΄λΆ 보κ΄. μ΄ν νΈλμμ
·쿼리 νΈμΆμ νΈλ€.
|
|
47
|
+
- `beginTransaction(isolationLevel?): Promise<void>` β νΈλμμ
μμ. `isolationLevel`(orm-common `IsolationLevel`) λ―Έμ§μ μ μλ² κΈ°λ³Έκ°.
|
|
48
|
+
- `commitTransaction(): Promise<void>` β νΈλμμ
컀λ°.
|
|
49
|
+
- `rollbackTransaction(): Promise<void>` β νΈλμμ
λ‘€λ°±.
|
|
50
|
+
- `close(): Promise<void>` β 컀λ₯μ
μ’
λ£ ν λ³΄κ΄ connId ν΄μ .
|
|
51
|
+
- `executeDefs<T>(defs, options?): Promise<T[][]>` β 쿼리 μ μ λ°°μ΄(`QueryDef[]`)μ μλ²μμ μ€ν. `options` λ μ μλ³ κ²°κ³Ό λ§€ν λ©ν(`(ResultMeta | undefined)[]`, νλͺ©λ³ nullable)λ‘ ν μμ§λ ¬ν λ°©μ μ§μ . μ μ 1κ°λΉ κ²°κ³Ό λ°°μ΄ 1κ°λ₯Ό κ°μ§ 2μ°¨μ λ°°μ΄ λ°ν.
|
|
52
|
+
- `executeParametrized(query, params?): Promise<unknown[][]>` β νλΌλ―Έν° λ°μΈλ© raw SQL μ€ν. `query` = SQL λ¬Έμμ΄, `params` = λ°μΈλ© κ° λ°°μ΄.
|
|
53
|
+
- `bulkInsert(tableName, columnDefs, records): Promise<void>` β λλ μ½μ
. `tableName` = λμ ν
μ΄λΈλͺ
, `columnDefs`(`Record<string, ColumnMeta>`)λ‘ μ»¬λΌλ³ λ©ν, `records`(`Record<string, unknown>[]`)λ‘ μ½μ
ν ν κ°μ²΄ λ°°μ΄μ μ λ¬.
|
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
# @simplysm/service-client β μ μμ€ μ μ‘ κ³μΈ΅
|
|
2
2
|
|
|
3
|
-
`ServiceClient` κ° μμ±μμμ λ΄λΆμ μΌλ‘ 쑰립νλ μ μμ€ λͺ¨λλ€. WebSocket
|
|
3
|
+
`ServiceClient` κ° μμ±μμμ λ΄λΆμ μΌλ‘ 쑰립νλ μ μμ€ λͺ¨λλ€. WebSocket μ°κ²°Β·ννΈλΉνΈΒ·μλ μ¬μ°κ²°(SocketProvider), μμ²/μλ΅ uuid λ§€μΉκ³Ό λ©μμ§ λμ€ν¨μΉ(ServiceTransport), μΈμ½λ©/λμ½λ©μ Worker μ€νλ‘λ©(ClientProtocolWrapper). μΌλ° μ¬μ©μμλ `ServiceClient` λ§ μ°λ©΄ λλ©°, μ΄ κ³μΈ΅μ μμΌΒ·μ²ν¬Β·ννΈλΉνΈ λμμ μ΄ν΄ν΄μΌ ν λλ§ μ½λλ€.
|
|
4
4
|
|
|
5
5
|
## SocketProvider / createSocketProvider
|
|
6
6
|
|
|
7
7
|
WebSocket 1κ°μ μ°κ²°Β·ννΈλΉνΈΒ·μλ μ¬μ°κ²° λ΄λΉ.
|
|
8
8
|
|
|
9
|
-
`createSocketProvider(url, clientName, maxReconnectCount): SocketProvider` β νλ‘λ°μ΄λ μμ±.
|
|
9
|
+
`createSocketProvider(url, clientName, maxReconnectCount): SocketProvider` β νλ‘λ°μ΄λ μμ±. μ΄ λͺ¨λμ import μμ μ κΈλ‘λ² `WebSocket` μ΄ μμΌλ©΄ `ws` ν¨ν€μ§λ‘ polyfill νλ€(Node νκ²½).
|
|
10
10
|
|
|
11
|
-
- url: string β `ws(s)://host:port/ws`. μ μ μ `ver=2`, μμ±λ `clientId`(UUID), `clientName` 쿼리λ₯Ό λΆμ.
|
|
12
|
-
- clientName: string β μ μ 쿼리μ μ€λ¦¬λ μλ³λͺ
.
|
|
13
|
-
- maxReconnectCount: number β μ΅λ μ¬μ°κ²° μλ νμ. 0 μ΄λ©΄ μ¬μ°κ²° μ ν¨.
|
|
11
|
+
- `url: string` β `ws(s)://host:port/ws`. μ μ μ `ver=2`, μμ±λ `clientId`(UUID), `clientName` 쿼리λ₯Ό λΆμ.
|
|
12
|
+
- `clientName: string` β μ μ 쿼리μ μ€λ¦¬λ μλ³λͺ
.
|
|
13
|
+
- `maxReconnectCount: number` β μ΅λ μ¬μ°κ²° μλ νμ. 0 μ΄λ©΄ μ¬μ°κ²° μ ν¨.
|
|
14
14
|
|
|
15
|
-
λ΄λΆ μμ:
|
|
15
|
+
λ΄λΆ μμ: ping 5μ΄ κ°κ²© μ μ‘, 30μ΄ λ¬΄μμ μ νμμμ, μ¬μ°κ²° 3μ΄ κ°κ²©. 1λ°μ΄νΈ `0x01` ping μ μ‘, μμ ν 1λ°μ΄νΈ `0x02` pong μ 무μ(ννΈλΉνΈ νμμ€ν¬νλ§ κ°±μ ).
|
|
16
16
|
|
|
17
|
-
λ©€λ²:
|
|
17
|
+
`SocketProvider` λ©€λ²:
|
|
18
18
|
|
|
19
|
-
- clientName: string (readonly) β μμ± μ λ°μ μλ³λͺ
.
|
|
20
|
-
- connected: boolean (getter) β μμΌμ΄ OPEN μνμΈμ§.
|
|
21
|
-
- connect(): Promise
|
|
22
|
-
- close(): Promise
|
|
23
|
-
- send(data: Bytes): Promise
|
|
24
|
-
- on(type, listener) / off(type, listener) β μ΄λ²€νΈ ꡬλ
/ν΄μ .
|
|
19
|
+
- `clientName: string` (readonly) β μμ± μ λ°μ μλ³λͺ
.
|
|
20
|
+
- `connected: boolean` (getter) β μμΌμ΄ OPEN μνμΈμ§.
|
|
21
|
+
- `connect(): Promise<void>` β μ μ μμ. μ€ν¨ μ throw, μ±κ³΅ μ μ¬μ°κ²° μΉ΄μ΄νΈ 리μ
ν `state: "connected"` emit.
|
|
22
|
+
- `close(): Promise<void>` β μλ μ’
λ£. μ΄ν μλ μ¬μ°κ²° μ ν¨. μμΌ CLOSED κΉμ§ λκΈ° ν `state: "closed"` emit.
|
|
23
|
+
- `send(data: Bytes): Promise<void>` β λ°μ΄νΈ μ μ‘. μΌμ μκ° λ΄ λ―Έμ°κ²°μ΄λ©΄ throw("μλ²μ μ°κ²°λμ§ μμμ΅λλ€. μΈν°λ· μ°κ²°μ νμΈν΄ μ£ΌμΈμ.").
|
|
24
|
+
- `on(type, listener)` / `off(type, listener)` β μ΄λ²€νΈ ꡬλ
/ν΄μ .
|
|
25
25
|
|
|
26
26
|
`SocketProviderEvents`:
|
|
27
27
|
|
|
28
|
-
- message: Bytes β μμ λ°μ΄νΈ(ping/pong
|
|
29
|
-
- state: "connected" | "closed" | "reconnecting" β μ°κ²° μν
|
|
28
|
+
- `message: Bytes` β μμ λ°μ΄νΈ(1λ°μ΄νΈ ping/pong μ μ΄ νλ μ μ μΈ).
|
|
29
|
+
- `state: "connected" | "closed" | "reconnecting"` β μ°κ²° μν μ μ΄. `"connected"` = μ°κ²°/μ¬μ°κ²° μ±κ³΅, `"closed"` = μλ μ’
λ£ λλ μ¬μ°κ²° νλ μ΄κ³Ό, `"reconnecting"` = μ¬μ°κ²° μλ μ€.
|
|
30
30
|
|
|
31
|
-
ννΈλΉνΈ νμμμ κ°μ§ μ μμΌμ κ°μ μ 리νκ³ (λ¦μ onclose λ‘ μΈν μ€λ³΅ μ¬μ°κ²° λ°©μ§λ₯Ό μν΄ νΈλ€λ¬ ν΄μ ) μλ μ’
λ£κ° μλλ©΄ μ¬μ°κ²°μ μλ. μ΅λ μλ μ΄κ³Ό μ `state: "closed"` emit.
|
|
31
|
+
ννΈλΉνΈ νμμμ κ°μ§ μ μμΌμ κ°μ μ 리νκ³ (λ¦μ `onclose` λ‘ μΈν μ€λ³΅ μ¬μ°κ²° λ°©μ§λ₯Ό μν΄ νΈλ€λ¬ ν΄μ ) μλ μ’
λ£κ° μλλ©΄ μ¬μ°κ²°μ μλ. μ¬μ°κ²°μ μ¬κ· λμ 루νλ‘ μννλ©° μ΅λ μλ μ΄κ³Ό μ `state: "closed"` emit.
|
|
32
32
|
|
|
33
33
|
## ServiceTransport / createServiceTransport
|
|
34
34
|
|
|
35
35
|
μμ²λ³ uuid λ§€μΉ, μλ΅/μλ¬/μ§νλ₯ /μλ²μ΄λ²€νΈ λμ€ν¨μΉ λ΄λΉ.
|
|
36
36
|
|
|
37
|
-
`createServiceTransport(socket, protocol): ServiceTransport` β νΈλμ€ν¬νΈ μμ±. μμΌ `message` λ₯Ό λ°μ decode ν μ’
λ₯λ³ λΆκΈ°. μμΌμ΄ `closed`/`reconnecting` λλ©΄ λκΈ° μ€μΈ λͺ¨λ μμ²μ reject(λ©λͺ¨λ¦¬
|
|
37
|
+
`createServiceTransport(socket, protocol): ServiceTransport` β νΈλμ€ν¬νΈ μμ±. μμΌ `message` λ₯Ό λ°μ decode ν μ’
λ₯λ³ λΆκΈ°. μμΌμ΄ `closed`/`reconnecting` λλ©΄ λκΈ° μ€μΈ λͺ¨λ μμ²μ reject("μμ² μ·¨μλ¨: ...") νμ¬ λ©λͺ¨λ¦¬ ν΄μ .
|
|
38
38
|
|
|
39
|
-
- socket: SocketProvider β νμ μμΌ.
|
|
40
|
-
- protocol: ClientProtocolWrapper β μΈμ½λ/λμ½λ λνΌ.
|
|
39
|
+
- `socket: SocketProvider` β νμ μμΌ.
|
|
40
|
+
- `protocol: ClientProtocolWrapper` β μΈμ½λ/λμ½λ λνΌ.
|
|
41
41
|
|
|
42
|
-
λ©€λ²:
|
|
42
|
+
`ServiceTransport` λ©€λ²:
|
|
43
43
|
|
|
44
|
-
- send(message, progress?): Promise
|
|
45
|
-
- on(type, listener) / off(type, listener) β μ΄λ²€νΈ ꡬλ
/ν΄μ .
|
|
44
|
+
- `send(message, progress?): Promise<unknown>` β μμ² 1건 μ μ‘ ν μλ΅ Promise λ°ν. uuid μμ± β 리μ€λ μ λ±λ‘ β encode β μ²ν¬ μμ°¨ μ μ‘. μλ΅(`response`) μμ μ resolve, μλ¬(`error`) μμ μ μλ² μλ¬ νλλ₯Ό λ¨Έμ§ν `Error` λ‘ reject. `message = ServiceClientMessage`, `progress = ServiceProgress`(μ ν).
|
|
45
|
+
- `on(type, listener)` / `off(type, listener)` β μ΄λ²€νΈ ꡬλ
/ν΄μ .
|
|
46
46
|
|
|
47
47
|
`ServiceTransportEvents`:
|
|
48
48
|
|
|
49
|
-
- event:
|
|
49
|
+
- `event: { keys: string[]; data: unknown }` β μλ²κ° νΈμν `evt:on` λ©μμ§. `EventClient` κ° μ΄κ±Έ ꡬλ
ν΄ keys μ λ§€μΉλλ λ‘컬 리μ€λλ‘ λμ€ν¨μΉ.
|
|
50
50
|
|
|
51
51
|
decode μ€ν¨ μμλ ν€λ 16λ°μ΄νΈμμ uuid λ₯Ό μ μΆμΆν΄ ν΄λΉ μμ²λ§ reject. λΆν μλ΅μ΄λ©΄ μλ£ μ `progress.response` λ‘ 100% λ₯Ό ν λ² λ λ³΄κ³ . μλ²μΈ‘ μ§ν λ©μμ§(`name: "progress"`)λ `progress.server` λ‘ μ λ¬.
|
|
52
52
|
|
|
@@ -56,6 +56,10 @@ decode μ€ν¨ μμλ ν€λ 16λ°μ΄νΈμμ uuid λ₯Ό μ μΆμΆν΄ ν΄λΉ
|
|
|
56
56
|
|
|
57
57
|
`createClientProtocolWrapper(protocol): ClientProtocolWrapper` β λνΌ μμ±.
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
-
|
|
59
|
+
`ClientProtocolWrapper` λ©€λ²:
|
|
60
|
+
|
|
61
|
+
- `encode(uuid, message): Promise<{ chunks: Bytes[]; totalSize: number }>` β λ©μμ§λ₯Ό μ²ν¬ λ°°μ΄λ‘ μΈμ½λ. body κ° `Uint8Array`, 30KB μ΄κ³Ό λ¬Έμμ΄, κΈΈμ΄ 100 μ΄κ³Ό λ°°μ΄, λλ 첫 νλͺ©μ΄ `Uint8Array` μΈ λ°°μ΄μ΄λ©΄ Worker μ¬μ©(κ·Έ μΈΒ·Worker λ―Έκ°μ© μ λ©μΈ μ€λ λ). `message = ServiceMessage`.
|
|
62
|
+
- `decode(bytes): Promise<ServiceMessageDecodeResult<ServiceMessage>>` β μμ λ°μ΄νΈ λμ½λ. μ²ν¬ μ¬μ‘°λ¦½(stateful)μ ν λ©μμ§μ μ²ν¬κ° μλ‘ λ€λ₯Έ λμ κΈ°λ‘ ν©μ΄μ§μ§ μλλ‘ νμ λ©μΈ μ€λ λ λ¨μΌ λμ κΈ°μμ μννκ³ (#35), μ¬μ‘°λ¦½ μλ£ ν 30KB μ΄κ³Ό JSON νμ±(stateless)λ§ Worker μ μμ. λ―Έμλ£(progress) μνλ©΄ κ·Έλλ‘ λ°ν.
|
|
63
|
+
- `dispose(): void` β νλ‘ν μ½κ³Ό Worker λ¦¬μ‘Έλ² μ 리. `ServiceClient.close()` μμ νΈμΆ.
|
|
64
|
+
|
|
65
|
+
Worker λ browser DOM Worker λλ Node `worker_threads` μ€ κ°μ©ν μͺ½μ lazy μ΄κΈ°ννλ©°, Worker μμ
μ΄ 60μ΄ λ΄ μλ΅νμ§ μμΌλ©΄ ν΄λΉ μμ
μ μκ° μ΄κ³Όλ‘ reject νλ€.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @simplysm/service-common
|
|
2
2
|
|
|
3
|
-
μλ²Β·ν΄λΌμ΄μΈνΈκ° 곡μ νλ μλΉμ€ ν΅μ κ³μ½. μ΄λ²€νΈ μ μ(`defineEvent`), λ΄μ₯ RPC μλΉμ€ μΈν°νμ΄μ€ μκ·Έλμ², μ± λ©λ΄Β·κΆνΒ·λͺ¨λ ꡬ쑰(`AppStructure`), WebSocket λ°μ΄λ리 νλ‘ν μ½Β·λ©μμ§ νμ
μ νκ³³μ λλ€. λ°μ츑·ꡬλ
μΈ‘ λλ μλ²Β·ν΄λΌμ΄μΈνΈκ° κ°μ μ μ κ°μ²΄Β·νμ
μ import ν΄ μ°λ κ² ν΅μ¬.
|
|
3
|
+
μλ²Β·ν΄λΌμ΄μΈνΈκ° 곡μ νλ μλΉμ€ ν΅μ κ³μ½. μ€μκ° μ΄λ²€νΈ μ μ(`defineEvent`), λ΄μ₯ RPC μλΉμ€ μΈν°νμ΄μ€ μκ·Έλμ², μ± λ©λ΄Β·κΆνΒ·λͺ¨λ ꡬ쑰(`AppStructure`), WebSocket λ°μ΄λ리 νλ‘ν μ½Β·λ©μμ§ νμ
μ νκ³³μ λλ€. λ°μ츑·ꡬλ
μΈ‘ λλ μλ²Β·ν΄λΌμ΄μΈνΈκ° κ°μ μ μ κ°μ²΄Β·νμ
μ import ν΄ μ°λ κ² ν΅μ¬.
|
|
4
4
|
|
|
5
5
|
## μ¬μ© νΈλ¦¬κ±° μΈλ±μ€
|
|
6
6
|
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
function defineEvent<TInfo = unknown, TData = unknown>(eventName: string): ServiceEventDef<TInfo, TData>
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
- `TInfo` (μ λ€λ¦) β ꡬλ
μκ° "무μμ ꡬλ
νλμ§" μλ³νλ λ©νλ°μ΄ν° νμ
. λ°μμΈ‘ selector κ° μ΄ κ°μ λ³΄κ³ μ λ¬ λμμ 골λΌλ. λ―Έμ§μ μ `unknown`.
|
|
25
|
-
- `TData` (μ λ€λ¦) β μ΄λ²€νΈκ° μ€μ΄ λλ₯΄λ νμ΄λ‘λ νμ
. ꡬλ
μ½λ°±μ΄ λ°λ μΈμ νμ
. λ―Έμ§μ μ `unknown`.
|
|
26
|
-
- `eventName` (μΈμ) β λΌμ°ν
ν€ λ¬Έμμ΄. κ°μ μ΄λ¦μ΄λ©΄ κ°μ μ΄λ²€νΈλ‘ μ·¨κΈλλ―λ‘ μ± λ΄μμ κ³ μ ν΄μΌ ν¨.
|
|
24
|
+
- `TInfo` (μ λ€λ¦) β ꡬλ
μκ° "무μμ ꡬλ
νλμ§" μλ³νλ λ©νλ°μ΄ν° νμ
. λ°μμΈ‘ selector κ° μ΄ κ°μ λ³΄κ³ μ λ¬ λμμ 골λΌλ. λ―Έμ§μ μ `unknown`.
|
|
25
|
+
- `TData` (μ λ€λ¦) β μ΄λ²€νΈκ° μ€μ΄ λλ₯΄λ νμ΄λ‘λ νμ
. ꡬλ
μ½λ°±μ΄ λ°λ μΈμ νμ
. λ―Έμ§μ μ `unknown`.
|
|
26
|
+
- `eventName` (μΈμ) β λΌμ°ν
ν€ λ¬Έμμ΄. `ServiceEventDef.eventName` μ κ·Έλλ‘ λ€μ΄κ°λ©° λ°νμμ μ€μ λ‘ μ°μ΄λ μ μΌν κ°. κ°μ μ΄λ¦μ΄λ©΄ κ°μ μ΄λ²€νΈλ‘ μ·¨κΈλλ―λ‘ μ± λ΄μμ κ³ μ ν΄μΌ ν¨.
|
|
27
27
|
- λ°νλ `ServiceEventDef` λ₯Ό κ·Έλλ‘ λ°μ·ꡬλ
API μ 첫 μΈμλ‘ λκΈ°λ©΄ μ΄λ¦Β·νμ
μ΄ μΆλ‘ λ¨.
|
|
28
28
|
|
|
29
29
|
```ts
|
|
@@ -49,8 +49,8 @@ interface ServiceEventDef<TInfo = unknown, TData = unknown> {
|
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
- `eventName: string` β λΌμ°ν
ν€. `defineEvent` μΈμκ° κ·Έλλ‘ λ€μ΄κ°λ©° λ°νμμ μ€μ λ‘ μ°μ΄λ μ μΌν κ°.
|
|
52
|
-
- `$info: TInfo` (readonly) β `TInfo` νμ
μΆμΆ μ μ©
|
|
53
|
-
- `$data: TData` (readonly) β `TData` νμ
μΆμΆ μ μ©
|
|
52
|
+
- `$info: TInfo` (readonly) β `TInfo` νμ
μΆμΆ μ μ© λ§μ»€. λ°νμ κ°μ `undefined`(μ¬μ©λμ§ μμ). λ°μ·ꡬλ
API κ° μ΄ λ§μ»€λ‘ `TInfo` λ₯Ό λμ΄λ€ μ. μ§μ μ½μ§ λ§ κ².
|
|
53
|
+
- `$data: TData` (readonly) β `TData` νμ
μΆμΆ μ μ© λ§μ»€. λ°νμ κ°μ `undefined`(μ¬μ©λμ§ μμ). μ§μ μ½μ§ λ§ κ².
|
|
54
54
|
|
|
55
55
|
## λ΄μ₯ RPC μλΉμ€ μκ·Έλμ² (OrmService / AutoUpdateService)
|
|
56
56
|
|
|
@@ -82,7 +82,7 @@ interface OrmService {
|
|
|
82
82
|
- `rollbackTransaction(connId)` β νΈλμμ
μ·¨μ.
|
|
83
83
|
- `executeParametrized(connId, query, params?)` β νλΌλ―Έν° λ°μΈλ© raw SQL μ§μ μ€ν. `params` λ νλ μ΄μ€νλμ μμλλ‘ λ°μΈλ©(μμΌλ©΄ λ°μΈλ© μλ 쿼리). κ²°κ³Όλ κ²°κ³Όμ
λ³ ν λ°°μ΄(`unknown[][]`).
|
|
84
84
|
- `executeDefs(connId, defs, options?)` β ORM μ½μ΄κ° λ§λ `QueryDef` λ°°μ΄μ μΌκ΄ μ€ν. `options[i]` λ `defs[i]` κ²°κ³Όμ
μ μ»¬λΌ νμ± λ©ν(`ResultMeta`)λ‘, λ©ν λΆνμν def μ리λ `undefined`.
|
|
85
|
-
- `bulkInsert(connId, tableName, columnDefs, records)` β λ€κ±΄ λ μ½λ λλ μ½μ
. `columnDefs` λ 컬λΌλͺ
β`ColumnMeta`
|
|
85
|
+
- `bulkInsert(connId, tableName, columnDefs, records)` β λ€κ±΄ λ μ½λ λλ μ½μ
. `columnDefs` λ 컬λΌλͺ
β`ColumnMeta` λ§€ν, `records` λ μ½μ
ν ν λ°°μ΄.
|
|
86
86
|
|
|
87
87
|
`Dialect`/`IsolationLevel`/`QueryDef`/`ColumnMeta`/`ResultMeta` λ `@simplysm/orm-common` νμ
.
|
|
88
88
|
|
|
@@ -92,7 +92,7 @@ interface OrmService {
|
|
|
92
92
|
type DbConnOptions = { configName?: string; config?: Record<string, unknown> }
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
- `configName?: string` β μλ²μ λ±λ‘λ DB μ°κ²° μ€μ μ μ΄λ¦. μ΄ μ΄λ¦μΌλ‘ μλ²κ° μ μ μ 보λ₯Ό μ°Ύμ.
|
|
95
|
+
- `configName?: string` β μλ²μ λ±λ‘λ DB μ°κ²° μ€μ μ μ΄λ¦. μ΄ μ΄λ¦μΌλ‘ μλ²κ° μ μ μ 보λ₯Ό μ°Ύμ. `getInfo`/`connect` λ μ΄ νλλ₯Ό νμλ‘ κ΅μ°¨ν΄(`& { configName: string }`) λ°μ.
|
|
96
96
|
- `config?: Record<string, unknown>` β λ±λ‘ μ€μ λμ μ§μ λκΈ°λ μ¦μ μ μ μ€μ κ°μ²΄. `configName` μΌλ‘ κ°λ¦¬ν¬ μ μμ λ μ¬μ©.
|
|
97
97
|
|
|
98
98
|
### AutoUpdateService
|
|
@@ -51,7 +51,7 @@ interface AppStructureLeafItem<TModule> {
|
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
- `code` / `title` / `modules` / `requiredModules` / `icon` β κ·Έλ£Ήκ³Ό λμΌ μλ―Έ.
|
|
54
|
-
- `perms?: ("use" | "edit")[]` β μ΄ νλ©΄μ λΆμ¬ κ°λ₯ν κΆν μ’
λ₯. `"use"` = μ‘°ν κΆν, `"edit"` = νΈμ§ κΆν. μ§μ ν νλ©΄λ§ κΆν νμ΄μ§Β·κΆν μ²΄ν¬ λμμ΄ λ¨. μλ΅νλ©΄ μ μ½ μλ
|
|
54
|
+
- `perms?: ("use" | "edit")[]` β μ΄ νλ©΄μ λΆμ¬ κ°λ₯ν κΆν μ’
λ₯. `"use"` = μ‘°ν κΆν, `"edit"` = νΈμ§ κΆν. μ§μ ν νλ©΄λ§ κΆν νμ΄μ§Β·κΆν μ²΄ν¬ λμμ΄ λ¨. μλ΅νλ©΄ μ μ½ μλ νλ©΄.
|
|
55
55
|
- `subPerms?: AppStructureSubPermission<TModule>[]` β ν νλ©΄ μμ μΈλΆ κΈ°λ₯ κΆν λͺ©λ‘.
|
|
56
56
|
- `url?: string` β μΈλΆ λ§ν¬ λ± μ΄λ κ²½λ‘. μΌλ° νλ©΄ λΌμ°ν
λμ μΈλΆλ‘ λ³΄λΌ λ.
|
|
57
57
|
- `isNotMenu?: boolean` β λ©λ΄ λ
ΈμΆ ν κΈ. `true` λ©΄ μ¬μ΄λ λ©λ΄μμ μ¨κΉ(λΌμ°ν
λμ νλ©΄ μ체λ μ μ§). νΒ·λ΄μ 보 λ± μ§μ μ§μ
νλ©΄μ μ¬μ©. λ―Έμ§μ /`false` λ©΄ λ©λ΄μ λ
ΈμΆ.
|
|
@@ -88,9 +88,9 @@ interface FlatPermission<TModule = unknown> {
|
|
|
88
88
|
}
|
|
89
89
|
```
|
|
90
90
|
|
|
91
|
-
- `titleChain: string[]` β 루νΈλΆν° μ΄ κΆνκΉμ§μ νμλͺ
κ²½λ‘. κΆν νμ΄μ§μμ κ³μΈ΅ λΌλ²¨λ‘ μ¬μ©.
|
|
91
|
+
- `titleChain: string[]` β 루νΈλΆν° μ΄ κΆνκΉμ§μ νμλͺ
(`title`) κ²½λ‘. κΆν νμ΄μ§μμ κ³μΈ΅ λΌλ²¨λ‘ μ¬μ©.
|
|
92
92
|
- `codeChain: string[]` β 루νΈλΆν°μ μ½λ κ²½λ‘ + λ§μ§λ§μ κΆν μ’
λ₯(`"use"`/`"edit"`)Β·μΈλΆμ½λκ° λΆμ μ 체 ν€. κΆν μλ³μ.
|
|
93
|
-
- `modulesChain: TModule[][]` β κ²½λ‘μ
|
|
93
|
+
- `modulesChain: TModule[][]` β κ²½λ‘μ `modules` λ₯Ό κ°μ§ κ° λ 벨μ `modules` λ°°μ΄λ€μ λͺ¨μ. μ΄ κΆνμ΄ μ΄λ€ λͺ¨λ 쑰건μ λ¬Άμλμ§ νν.
|
|
94
94
|
|
|
95
95
|
## isUsableModules
|
|
96
96
|
|
|
@@ -102,9 +102,16 @@ function isUsableModules<TModule>(modules: TModule[] | undefined, requiredModule
|
|
|
102
102
|
|
|
103
103
|
- `modules` β OR 쑰건. λμ΄ μ€ νλλΌλ `usableModules` μ μμΌλ©΄ ν΅κ³Ό. `undefined`/λΉ λ°°μ΄μ΄λ©΄ 무쑰건 ν΅κ³Ό.
|
|
104
104
|
- `requiredModules` β AND 쑰건. λμ΄ μ λΆκ° `usableModules` μ μμ΄μΌ ν΅κ³Ό. `undefined`/λΉ λ°°μ΄μ΄λ©΄ ν΅κ³Όλ‘ κ°μ£Ό.
|
|
105
|
-
- `usableModules` β νμ¬ μ±μμ νμ±μΈ λͺ¨λ λͺ©λ‘.
|
|
105
|
+
- `usableModules` β νμ¬ μ±μμ νμ±μΈ λͺ¨λ λͺ©λ‘. `undefined` μ΄λ©΄ `modules` λ₯Ό κ°μ§ νλͺ©μ λ§€μΉ μ€ν¨(ν΅κ³Ό λΆκ°).
|
|
106
106
|
- λ°ν: requiredModules(AND)μ modules(OR)λ₯Ό λͺ¨λ λ§μ‘±νλ©΄ `true`.
|
|
107
107
|
|
|
108
|
+
```ts
|
|
109
|
+
import { isUsableModules } from "@simplysm/service-common";
|
|
110
|
+
|
|
111
|
+
isUsableModules(["A", "B"], undefined, ["A"]); // true β OR
|
|
112
|
+
isUsableModules(undefined, ["A", "B"], ["A"]); // false β AND λ―ΈμΆ©μ‘±
|
|
113
|
+
```
|
|
114
|
+
|
|
108
115
|
## isUsableModulesChain
|
|
109
116
|
|
|
110
117
|
```ts
|
|
@@ -116,7 +123,7 @@ function isUsableModulesChain<TModule>(modulesChain: TModule[][], requiredModule
|
|
|
116
123
|
- `modulesChain` β κ° λ 벨μ `modules` λ°°μ΄λ€. λͺ¨λ λ λ²¨μ΄ OR 쑰건μ ν΅κ³Όν΄μΌ ν¨.
|
|
117
124
|
- `requiredModulesChain` β κ° λ 벨μ `requiredModules` λ°°μ΄λ€. λͺ¨λ λ λ²¨μ΄ AND 쑰건μ ν΅κ³Όν΄μΌ ν¨.
|
|
118
125
|
- `usableModules` β νμ¬ νμ± λͺ¨λ λͺ©λ‘.
|
|
119
|
-
- λ°ν: ν λ 벨μ΄λΌλ λ§νλ©΄ `false`. μμ νμ μ¬λΆ νμ μ μ¬μ©.
|
|
126
|
+
- λ°ν: λΉ μ²΄μΈμ΄λ©΄ `true`, ν λ 벨μ΄λΌλ λ§νλ©΄ `false`. μμ νμ μ¬λΆ νμ μ μ¬μ©.
|
|
120
127
|
|
|
121
128
|
## getFlatPermissions
|
|
122
129
|
|
|
@@ -128,7 +135,7 @@ function getFlatPermissions<TModule>(items: AppStructureItem<TModule>[], usableM
|
|
|
128
135
|
|
|
129
136
|
- `items` β μ± κ΅¬μ‘° λ°°μ΄(루νΈ).
|
|
130
137
|
- `usableModules` β νμ¬ νμ± λͺ¨λ. λͺ¨λ 쑰건μ ν΅κ³Όνμ§ λͺ»ν κ°μ§(κ·Έ μμΒ·κΆν ν¬ν¨)λ κ²°κ³Όμμ λΉ μ§.
|
|
131
|
-
- λμ: leaf μ `perms` κ°κ°, κ·Έλ¦¬κ³ `subPerms` μ κ° `perm` μ ν μ€(`FlatPermission`)λ‘ νΌμΉ¨. `subPerms` λ μ체 λͺ¨λ 쑰건λ μΆκ°λ‘ κ²μ¬.
|
|
138
|
+
- λμ: leaf μ `perms` κ°κ°, κ·Έλ¦¬κ³ `subPerms` μ κ° `perm` μ ν μ€(`FlatPermission`)λ‘ νΌμΉ¨. `subPerms` λ μ체 λͺ¨λ 쑰건λ μΆκ°λ‘ κ²μ¬. λΉ `items` λ©΄ λΉ λ°°μ΄.
|
|
132
139
|
- λ°ν: νμ κ°λ₯ν κΆνλ€μ νν λ°°μ΄. κΆν κ΄λ¦¬ νλ©΄(`<sd-permission-table>` μ
λ ₯)Β·κΆν λ§€μΉμ κΈ°λ°.
|
|
133
140
|
|
|
134
141
|
```ts
|
|
@@ -37,7 +37,7 @@ interface ServiceProtocol {
|
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
- `encode(uuid, message)` β λ©μμ§λ₯Ό μμ΄μ΄ λ°μ΄νΈλ‘ μΈμ½λ©. 3MB μ΄κ³Ό μ μλμΌλ‘ μ¬λ¬ μ²ν¬λ‘ λΆν . λ°ν `chunks` λ μ μ‘ν ν¨ν· λ°°μ΄, `totalSize` λ λ³Έλ¬Έ μ΄ λ°μ΄νΈ. κ°μ λ©μμ§μ λͺ¨λ μ²ν¬λ λμΌ `uuid` λ₯Ό 곡μ . `MAX_TOTAL_SIZE` μ΄κ³Ό μ throw.
|
|
40
|
-
- `accumulate(bytes)` β μμ μ²ν¬ ν¨ν·μ λμ (stateful). κ°μ uuid μ μ²ν¬λ₯Ό ν λμ κΈ°μ λͺ¨μ. λ―Έμμ±μ΄λ©΄ `progress`, μ λΆ λμ°©νλ©΄ μ¬μ‘°λ¦½λ raw λ°μ΄νΈλ₯Ό λ΄μ `complete` λ°ν. JSON νμ±μ μ ν¨. ν€λ(28λ°μ΄νΈ) λ―Έλ§μ΄κ±°λ ν¬κΈ° μλ° μ throw. μ€λ³΅ ν¨ν·μ
|
|
40
|
+
- `accumulate(bytes)` β μμ μ²ν¬ ν¨ν·μ λμ (stateful). κ°μ uuid μ μ²ν¬λ₯Ό ν λμ κΈ°μ λͺ¨μ. λ―Έμμ±μ΄λ©΄ `progress`, μ λΆ λμ°©νλ©΄ μ¬μ‘°λ¦½λ raw λ°μ΄νΈλ₯Ό λ΄μ `complete` λ°ν. JSON νμ±μ μ ν¨. ν€λ(28λ°μ΄νΈ) λ―Έλ§μ΄κ±°λ ν¬κΈ° μλ° μ throw. μ€λ³΅ ν¨ν·μ μΈλ±μ€ κΈ°μ€ 1νλ§ λ°μ(μ€λ³΅μ 무μ). λμ λΆμ΄ `totalSize` λ₯Ό μ΄κ³Όνλ©΄ λ¬΄κ²°μ± μλ°μΌλ‘ throw.
|
|
41
41
|
- `parseMessage(resultBytes)` β μ¬μ‘°λ¦½λ raw λ°μ΄νΈλ₯Ό `ServiceMessage` λ‘ νμ±(stateless). λμ κΈ° μνμ μμ‘΄νμ§ μμ worker λ± λ€λ₯Έ 컨ν
μ€νΈμ μμ κ°λ₯. νμ± μ€ν¨ μ throw.
|
|
42
42
|
- `decode(bytes)` β `accumulate` ν μλ£ μ `parseMessage` κΉμ§ μννλ ν΅ν© κ²½λ‘. λ¨μΌ 컨ν
μ€νΈμμ ν λ²μ λμ½λ©ν λ.
|
|
43
43
|
- `dispose()` β λ΄λΆ μ²ν¬ λμ κΈ°μ GC νμ΄λ¨Έ ν΄μ Β·λ©λͺ¨λ¦¬ λ°ν. μΈμ€ν΄μ€λ₯Ό λ μ μΈ λ λ°λμ νΈμΆ.
|