@downcity/city 0.2.17 → 0.2.25
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 +33 -16
- package/bin/city/admin/index.d.ts +36 -0
- package/bin/city/admin/index.d.ts.map +1 -0
- package/bin/city/admin/index.js +85 -0
- package/bin/city/admin/index.js.map +1 -0
- package/bin/city/admin/types.d.ts +41 -0
- package/bin/city/admin/types.d.ts.map +1 -0
- package/bin/city/admin/types.js +5 -0
- package/bin/city/admin/types.js.map +1 -0
- package/bin/city/city.d.ts +73 -0
- package/bin/city/city.d.ts.map +1 -0
- package/bin/city/city.js +116 -0
- package/bin/city/city.js.map +1 -0
- package/bin/city/http.d.ts +55 -0
- package/bin/city/http.d.ts.map +1 -0
- package/bin/city/http.js +78 -0
- package/bin/city/http.js.map +1 -0
- package/bin/city/index.d.ts +20 -0
- package/bin/city/index.d.ts.map +1 -0
- package/bin/city/index.js +14 -0
- package/bin/city/index.js.map +1 -0
- package/bin/city/invoker/ai/index.d.ts +126 -0
- package/bin/city/invoker/ai/index.d.ts.map +1 -0
- package/bin/city/invoker/ai/index.js +247 -0
- package/bin/city/invoker/ai/index.js.map +1 -0
- package/bin/city/invoker/ai/stream.d.ts +8 -0
- package/bin/city/invoker/ai/stream.d.ts.map +1 -0
- package/bin/city/invoker/ai/stream.js +17 -0
- package/bin/city/invoker/ai/stream.js.map +1 -0
- package/bin/city/invoker/ai/types.d.ts +14 -0
- package/bin/city/invoker/ai/types.d.ts.map +1 -0
- package/bin/city/invoker/ai/types.js +9 -0
- package/bin/city/invoker/ai/types.js.map +1 -0
- package/bin/city/invoker/balance/index.d.ts +76 -0
- package/bin/city/invoker/balance/index.d.ts.map +1 -0
- package/bin/city/invoker/balance/index.js +137 -0
- package/bin/city/invoker/balance/index.js.map +1 -0
- package/bin/city/invoker/balance/types.d.ts +324 -0
- package/bin/city/invoker/balance/types.d.ts.map +1 -0
- package/bin/city/invoker/balance/types.js +9 -0
- package/bin/city/invoker/balance/types.js.map +1 -0
- package/bin/city/invoker/env/index.d.ts +33 -0
- package/bin/city/invoker/env/index.d.ts.map +1 -0
- package/bin/city/invoker/env/index.js +53 -0
- package/bin/city/invoker/env/index.js.map +1 -0
- package/bin/city/invoker/env/types.d.ts +57 -0
- package/bin/city/invoker/env/types.d.ts.map +1 -0
- package/bin/city/invoker/env/types.js +5 -0
- package/bin/city/invoker/env/types.js.map +1 -0
- package/bin/city/invoker/invoker.d.ts +44 -0
- package/bin/city/invoker/invoker.d.ts.map +1 -0
- package/bin/city/invoker/invoker.js +87 -0
- package/bin/city/invoker/invoker.js.map +1 -0
- package/bin/city/invoker/payment/index.d.ts +69 -0
- package/bin/city/invoker/payment/index.d.ts.map +1 -0
- package/bin/city/invoker/payment/index.js +110 -0
- package/bin/city/invoker/payment/index.js.map +1 -0
- package/bin/city/invoker/payment/types.d.ts +66 -0
- package/bin/city/invoker/payment/types.d.ts.map +1 -0
- package/bin/city/invoker/payment/types.js +10 -0
- package/bin/city/invoker/payment/types.js.map +1 -0
- package/bin/city/invoker/towns/index.d.ts +46 -0
- package/bin/city/invoker/towns/index.d.ts.map +1 -0
- package/bin/city/invoker/towns/index.js +73 -0
- package/bin/city/invoker/towns/index.js.map +1 -0
- package/bin/city/invoker/towns/types.d.ts +46 -0
- package/bin/city/invoker/towns/types.d.ts.map +1 -0
- package/bin/city/invoker/towns/types.js +5 -0
- package/bin/city/invoker/towns/types.js.map +1 -0
- package/bin/city/types/city.d.ts +71 -0
- package/bin/city/types/city.d.ts.map +1 -0
- package/bin/city/types/city.js +8 -0
- package/bin/city/types/city.js.map +1 -0
- package/bin/city/user/index.d.ts +27 -0
- package/bin/city/user/index.d.ts.map +1 -0
- package/bin/city/user/index.js +100 -0
- package/bin/city/user/index.js.map +1 -0
- package/bin/city/user/types.d.ts +49 -0
- package/bin/city/user/types.d.ts.map +1 -0
- package/bin/city/user/types.js +5 -0
- package/bin/city/user/types.js.map +1 -0
- package/bin/core/auth/authenticator.d.ts +6 -6
- package/bin/core/auth/authenticator.d.ts.map +1 -1
- package/bin/core/auth/authenticator.js +11 -11
- package/bin/core/auth/authenticator.js.map +1 -1
- package/bin/core/auth/token-signer.js +4 -4
- package/bin/core/auth/token-signer.js.map +1 -1
- package/bin/core/auth/types.d.ts +7 -7
- package/bin/core/auth/types.d.ts.map +1 -1
- package/bin/core/base/base-init.d.ts +5 -5
- package/bin/core/base/base-init.d.ts.map +1 -1
- package/bin/core/base/base-init.js +8 -8
- package/bin/core/base/base-init.js.map +1 -1
- package/bin/core/base/base-instruction.js +1 -1
- package/bin/core/base/base-instruction.js.map +1 -1
- package/bin/core/base/base-router.d.ts +2 -2
- package/bin/core/base/base-router.d.ts.map +1 -1
- package/bin/core/base/base-router.js +15 -15
- package/bin/core/base/base-router.js.map +1 -1
- package/bin/core/base/base-runtime.d.ts +3 -3
- package/bin/core/base/base-runtime.d.ts.map +1 -1
- package/bin/core/base/base-runtime.js +4 -4
- package/bin/core/base/base-runtime.js.map +1 -1
- package/bin/core/base/base.d.ts +8 -8
- package/bin/core/base/base.d.ts.map +1 -1
- package/bin/core/base/base.js +10 -10
- package/bin/core/base/base.js.map +1 -1
- package/bin/core/runtime.d.ts +4 -4
- package/bin/core/runtime.d.ts.map +1 -1
- package/bin/core/runtime.js +1 -1
- package/bin/core/types.d.ts +3 -3
- package/bin/core/types.d.ts.map +1 -1
- package/bin/index.d.ts +25 -5
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +18 -7
- package/bin/index.js.map +1 -1
- package/bin/service/ai/openai-compatible-provider.d.ts +1 -1
- package/bin/service/ai/openai-compatible-provider.js +2 -2
- package/bin/service/ai/openai-compatible-provider.js.map +1 -1
- package/bin/service/ai/provider.d.ts +1 -1
- package/bin/service/ai/provider.js +1 -1
- package/bin/service/ai/types.d.ts +1 -1
- package/bin/service/installable-service.d.ts +3 -3
- package/bin/service/installable-service.d.ts.map +1 -1
- package/bin/service/installable-service.js +1 -1
- package/bin/service/installable-service.js.map +1 -1
- package/bin/service/instruction.js +7 -7
- package/bin/service/instruction.js.map +1 -1
- package/bin/service/service.d.ts +5 -5
- package/bin/service/service.d.ts.map +1 -1
- package/bin/service/service.js +1 -1
- package/bin/service/service.js.map +1 -1
- package/bin/service/{studios → towns}/schema.d.ts +23 -23
- package/bin/service/towns/schema.d.ts.map +1 -0
- package/bin/service/towns/schema.js +60 -0
- package/bin/service/towns/schema.js.map +1 -0
- package/bin/service/towns/town-store.d.ts +17 -0
- package/bin/service/towns/town-store.d.ts.map +1 -0
- package/bin/service/towns/town-store.js +49 -0
- package/bin/service/towns/town-store.js.map +1 -0
- package/bin/service/towns/towns-service.d.ts +15 -0
- package/bin/service/towns/towns-service.d.ts.map +1 -0
- package/bin/service/towns/towns-service.js +54 -0
- package/bin/service/towns/towns-service.js.map +1 -0
- package/bin/service/towns/types.d.ts +51 -0
- package/bin/service/towns/types.d.ts.map +1 -0
- package/bin/service/towns/types.js +7 -0
- package/bin/service/towns/types.js.map +1 -0
- package/package.json +9 -8
- package/bin/service/studios/schema.d.ts.map +0 -1
- package/bin/service/studios/schema.js +0 -60
- package/bin/service/studios/schema.js.map +0 -1
- package/bin/service/studios/studio-store.d.ts +0 -17
- package/bin/service/studios/studio-store.d.ts.map +0 -1
- package/bin/service/studios/studio-store.js +0 -49
- package/bin/service/studios/studio-store.js.map +0 -1
- package/bin/service/studios/studios-service.d.ts +0 -15
- package/bin/service/studios/studios-service.d.ts.map +0 -1
- package/bin/service/studios/studios-service.js +0 -51
- package/bin/service/studios/studios-service.js.map +0 -1
- package/bin/service/studios/types.d.ts +0 -51
- package/bin/service/studios/types.d.ts.map +0 -1
- package/bin/service/studios/types.js +0 -7
- package/bin/service/studios/types.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
它负责这些共用能力:
|
|
6
6
|
|
|
7
7
|
- 挂载 `Service` / `AIService`
|
|
8
|
-
- 初始化内置 `
|
|
8
|
+
- 初始化内置 `towns` / `env` 表
|
|
9
9
|
- 校验 `user_token` 和 `admin_secret_key`
|
|
10
10
|
- 暴露统一的 `/v1/*` HTTP 路由
|
|
11
11
|
- 提供 env、数据库、hook 和鉴权上下文
|
|
@@ -19,7 +19,7 @@ pnpm add @downcity/city
|
|
|
19
19
|
## 最小示例
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
|
-
import {
|
|
22
|
+
import { CityBase, AIService } from "@downcity/city";
|
|
23
23
|
import Database from "better-sqlite3";
|
|
24
24
|
import { drizzle } from "drizzle-orm/better-sqlite3";
|
|
25
25
|
|
|
@@ -30,7 +30,7 @@ const db = Object.assign(drizzle(sqlite), {
|
|
|
30
30
|
$client: { exec: (sql: string) => sqlite.exec(sql) },
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
const
|
|
33
|
+
const base = new CityBase({ db, dialect: "sqlite", raw: sqlite });
|
|
34
34
|
|
|
35
35
|
const ai = new AIService();
|
|
36
36
|
ai.use({
|
|
@@ -52,7 +52,7 @@ ai.use({
|
|
|
52
52
|
},
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
base.use(ai);
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
启动 HTTP 服务:
|
|
@@ -60,21 +60,21 @@ city.use(ai);
|
|
|
60
60
|
```ts
|
|
61
61
|
import { serve } from "@hono/node-server";
|
|
62
62
|
|
|
63
|
-
await
|
|
64
|
-
serve({ fetch:
|
|
63
|
+
await base.health();
|
|
64
|
+
serve({ fetch: base.router().fetch, port: 43127, hostname: "127.0.0.1" });
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
## City 说明文档
|
|
68
68
|
|
|
69
|
-
`
|
|
69
|
+
`base.instruction()` 会返回当前 CityBase 实例的聚合说明文档字符串,内容包含:
|
|
70
70
|
|
|
71
|
-
-
|
|
71
|
+
- CityBase 的基本使用方式
|
|
72
72
|
- 当前已挂载的 service
|
|
73
73
|
- 每个模块需要的 env 配置
|
|
74
74
|
- 每个模块补充的使用说明
|
|
75
75
|
|
|
76
76
|
```ts
|
|
77
|
-
const text = await
|
|
77
|
+
const text = await base.instruction();
|
|
78
78
|
console.log(text);
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -106,7 +106,7 @@ notes.action("list", async () => {
|
|
|
106
106
|
return { items: [] };
|
|
107
107
|
}, { method: "GET", auth: ["admin"] });
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
base.use(notes);
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
City 会自动映射为:
|
|
@@ -137,19 +137,19 @@ ai.use(
|
|
|
137
137
|
}),
|
|
138
138
|
);
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
base.use(ai);
|
|
141
141
|
```
|
|
142
142
|
|
|
143
143
|
## 官方服务
|
|
144
144
|
|
|
145
|
-
官方服务用于封装多
|
|
145
|
+
官方服务用于封装多 town 复用能力:
|
|
146
146
|
|
|
147
147
|
```ts
|
|
148
148
|
import { accountsService } from "@downcity/services";
|
|
149
149
|
import { usageService } from "@downcity/services";
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
base.use(accountsService());
|
|
152
|
+
base.use(usageService());
|
|
153
153
|
```
|
|
154
154
|
|
|
155
155
|
服务路由当前只支持:
|
|
@@ -163,18 +163,35 @@ city.use(usageService());
|
|
|
163
163
|
- `auth: ["admin"]` 只允许 `admin_secret_key`
|
|
164
164
|
- `auth: []` 表示免登录
|
|
165
165
|
|
|
166
|
-
对于用户侧请求,`user_token` 绑定
|
|
166
|
+
对于用户侧请求,`user_token` 绑定 town 身份。如果请求体或 query 中传了 `town_id`,它必须与 token 里的 town 一致。
|
|
167
167
|
|
|
168
168
|
## 主要导出
|
|
169
169
|
|
|
170
170
|
- `City`
|
|
171
|
+
- `CityBase`
|
|
171
172
|
- `Service`
|
|
172
173
|
- `ServiceDefinition`
|
|
173
174
|
- `AIService`
|
|
174
175
|
- `Provider`
|
|
176
|
+
- `CityModel`
|
|
177
|
+
- `CityModelDescriptor`
|
|
175
178
|
- `TokenSigner`
|
|
176
179
|
- `EnvService`
|
|
177
|
-
- `
|
|
180
|
+
- `TownsService`
|
|
181
|
+
|
|
182
|
+
## City 模型目录
|
|
183
|
+
|
|
184
|
+
`User City` 的 `client.ai.listModels()` 返回 `ModelCatalog`。目录中的模型是 `CityModel`,可以直接用于 City 的 AI 调用,也可以传给支持 CityModel 的 Agent SDK:
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
const catalog = await client.ai.listModels();
|
|
188
|
+
const model = catalog.default();
|
|
189
|
+
|
|
190
|
+
await client.ai.text({
|
|
191
|
+
model,
|
|
192
|
+
prompt: "hello",
|
|
193
|
+
});
|
|
194
|
+
```
|
|
178
195
|
|
|
179
196
|
## 文档
|
|
180
197
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理端 SDK。
|
|
3
|
+
*/
|
|
4
|
+
import { ServiceClient } from "../invoker/invoker.js";
|
|
5
|
+
import { BalanceInvoker } from "../invoker/balance/index.js";
|
|
6
|
+
import { EnvInvoker } from "../invoker/env/index.js";
|
|
7
|
+
import { TownsInvoker } from "../invoker/towns/index.js";
|
|
8
|
+
import type { AdminCityAccessOptions, AdminModelRecord, AdminServiceSummary } from "./types.js";
|
|
9
|
+
export declare class AdminCityAccess {
|
|
10
|
+
readonly balance: BalanceInvoker;
|
|
11
|
+
readonly env: EnvInvoker;
|
|
12
|
+
readonly towns: TownsInvoker;
|
|
13
|
+
private readonly base_url;
|
|
14
|
+
private readonly secret;
|
|
15
|
+
private readonly fetchImpl;
|
|
16
|
+
constructor(options: AdminCityAccessOptions);
|
|
17
|
+
/** 获取 Service 调用器(与 User City 共用同一路由) */
|
|
18
|
+
service(name: string): ServiceClient;
|
|
19
|
+
/** 列出当前 City 暴露的 service 摘要。 */
|
|
20
|
+
listServices(): Promise<AdminServiceSummary[]>;
|
|
21
|
+
/** 列出当前 City 注册的模型目录(admin 身份可见额外状态字段)。 */
|
|
22
|
+
listModels(): Promise<AdminModelRecord[]>;
|
|
23
|
+
/** 读取 City 聚合后的说明文档。 */
|
|
24
|
+
instruction(): Promise<string>;
|
|
25
|
+
private json;
|
|
26
|
+
private text;
|
|
27
|
+
/**
|
|
28
|
+
* 为管理端请求统一补齐鉴权头。
|
|
29
|
+
*
|
|
30
|
+
* 关键说明(中文)
|
|
31
|
+
* - 所有管理端请求都必须带上 admin bearer token
|
|
32
|
+
* - 默认仍然补 `content-type: application/json`,便于 POST action 统一行为
|
|
33
|
+
*/
|
|
34
|
+
private withAuth;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/city/admin/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAUzD,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,eAAe;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,OAAO,EAAE,sBAAsB;IAkB3C,yCAAyC;IACzC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAUpC,gCAAgC;IAC1B,YAAY,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOpD,2CAA2C;IACrC,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO/C,wBAAwB;IAClB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpC,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,IAAI;IAQZ;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;CAUjB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理端 SDK。
|
|
3
|
+
*/
|
|
4
|
+
import { ServiceClient } from "../invoker/invoker.js";
|
|
5
|
+
import { BalanceInvoker } from "../invoker/balance/index.js";
|
|
6
|
+
import { EnvInvoker } from "../invoker/env/index.js";
|
|
7
|
+
import { TownsInvoker } from "../invoker/towns/index.js";
|
|
8
|
+
import { defaultFetch, normalizeBaseURL, requestJSON, requestText, requiredString, } from "../http.js";
|
|
9
|
+
export class AdminCityAccess {
|
|
10
|
+
balance;
|
|
11
|
+
env;
|
|
12
|
+
towns;
|
|
13
|
+
base_url;
|
|
14
|
+
secret;
|
|
15
|
+
fetchImpl;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
if (!options || typeof options !== "object") {
|
|
18
|
+
throw new TypeError("Admin City options are required");
|
|
19
|
+
}
|
|
20
|
+
this.base_url = normalizeBaseURL(options.base_url, "base_url");
|
|
21
|
+
this.secret = requiredString(options.admin_secret_key ?? process.env.DOWNCITY_CITY_ADMIN_SECRET_KEY, "admin_secret_key");
|
|
22
|
+
this.fetchImpl = options.fetch ?? defaultFetch();
|
|
23
|
+
const req = (path, init) => this.json(path, init);
|
|
24
|
+
this.balance = new BalanceInvoker({ requestJSON: req });
|
|
25
|
+
this.env = new EnvInvoker({ requestJSON: req });
|
|
26
|
+
this.towns = new TownsInvoker({ requestJSON: req });
|
|
27
|
+
}
|
|
28
|
+
/** 获取 Service 调用器(与 User City 共用同一路由) */
|
|
29
|
+
service(name) {
|
|
30
|
+
const id = String(name ?? "").trim();
|
|
31
|
+
if (!id)
|
|
32
|
+
throw new TypeError("service name is required");
|
|
33
|
+
return new ServiceClient((path, init) => this.json(path, init), "/v1", id);
|
|
34
|
+
}
|
|
35
|
+
/** 列出当前 City 暴露的 service 摘要。 */
|
|
36
|
+
async listServices() {
|
|
37
|
+
const body = await this.json("/v1/services", {
|
|
38
|
+
method: "GET",
|
|
39
|
+
});
|
|
40
|
+
return body.items;
|
|
41
|
+
}
|
|
42
|
+
/** 列出当前 City 注册的模型目录(admin 身份可见额外状态字段)。 */
|
|
43
|
+
async listModels() {
|
|
44
|
+
const body = await this.json("/v1/ai/models", {
|
|
45
|
+
method: "GET",
|
|
46
|
+
});
|
|
47
|
+
return body.items;
|
|
48
|
+
}
|
|
49
|
+
/** 读取 City 聚合后的说明文档。 */
|
|
50
|
+
async instruction() {
|
|
51
|
+
return this.text("/v1/city/instruction", { method: "GET" });
|
|
52
|
+
}
|
|
53
|
+
json(path, init) {
|
|
54
|
+
return requestJSON({
|
|
55
|
+
fetch: this.fetchImpl,
|
|
56
|
+
url: `${this.base_url}${path}`,
|
|
57
|
+
init: this.withAuth(init),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
text(path, init) {
|
|
61
|
+
return requestText({
|
|
62
|
+
fetch: this.fetchImpl,
|
|
63
|
+
url: `${this.base_url}${path}`,
|
|
64
|
+
init: this.withAuth(init),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 为管理端请求统一补齐鉴权头。
|
|
69
|
+
*
|
|
70
|
+
* 关键说明(中文)
|
|
71
|
+
* - 所有管理端请求都必须带上 admin bearer token
|
|
72
|
+
* - 默认仍然补 `content-type: application/json`,便于 POST action 统一行为
|
|
73
|
+
*/
|
|
74
|
+
withAuth(init) {
|
|
75
|
+
return {
|
|
76
|
+
...init,
|
|
77
|
+
headers: {
|
|
78
|
+
"content-type": "application/json",
|
|
79
|
+
authorization: `Bearer ${this.secret}`,
|
|
80
|
+
...init.headers,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/city/admin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理端类型。
|
|
3
|
+
*/
|
|
4
|
+
import type { FetchLike } from "../http.js";
|
|
5
|
+
import type { CityModelDescriptor } from "@downcity/type";
|
|
6
|
+
import type { UserServiceSummary } from "../user/types.js";
|
|
7
|
+
/** Admin City 内部访问层构造参数 */
|
|
8
|
+
export interface AdminCityAccessOptions {
|
|
9
|
+
/** City 管理端 server URL */
|
|
10
|
+
base_url: string;
|
|
11
|
+
/** 管理密钥 */
|
|
12
|
+
admin_secret_key?: string;
|
|
13
|
+
/** 自定义 fetch 实现 */
|
|
14
|
+
fetch?: FetchLike;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 管理端可见的 Service 摘要。
|
|
18
|
+
*
|
|
19
|
+
* 复用统一 Service 目录结构:
|
|
20
|
+
* - `id` / `name` 用于展示可调用模块
|
|
21
|
+
* - `env` 用于提示当前模块依赖的配置项
|
|
22
|
+
*/
|
|
23
|
+
export type AdminServiceSummary = UserServiceSummary;
|
|
24
|
+
/**
|
|
25
|
+
* 管理端可见的模型目录记录。
|
|
26
|
+
*
|
|
27
|
+
* 复用统一模型目录结构;admin 身份下会额外看到:
|
|
28
|
+
* - `env_requirements`
|
|
29
|
+
* - `default_modes`
|
|
30
|
+
*/
|
|
31
|
+
export type AdminModelRecord = CityModelDescriptor;
|
|
32
|
+
/**
|
|
33
|
+
* City 聚合说明文档结果。
|
|
34
|
+
*/
|
|
35
|
+
export interface AdminInstructionResult {
|
|
36
|
+
/**
|
|
37
|
+
* 供管理端直接阅读的纯文本说明。
|
|
38
|
+
*/
|
|
39
|
+
text: string;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/city/admin/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,2BAA2B;AAC3B,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/city/admin/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* City 统一访问入口。
|
|
3
|
+
*
|
|
4
|
+
* City 面向开发者表达“我以某种角色进入 City”,内部再委托给
|
|
5
|
+
* admin / user 访问层,避免用户在第一层概念上关心 client 拆分。
|
|
6
|
+
*/
|
|
7
|
+
import { AdminCityAccess } from "./admin/index.js";
|
|
8
|
+
import { UserCityAccess } from "./user/index.js";
|
|
9
|
+
import type { ServiceClient } from "./invoker/invoker.js";
|
|
10
|
+
import type { CityOptionsForRole, CityRole } from "./types/city.js";
|
|
11
|
+
import type { AdminModelRecord, AdminServiceSummary } from "./admin/types.js";
|
|
12
|
+
import type { UserServiceSummary } from "./user/types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Downcity City。
|
|
15
|
+
*/
|
|
16
|
+
export declare class City<TRole extends CityRole = CityRole> {
|
|
17
|
+
/**
|
|
18
|
+
* 当前 City 访问角色。
|
|
19
|
+
*/
|
|
20
|
+
readonly role: TRole;
|
|
21
|
+
/**
|
|
22
|
+
* Admin 能力面。
|
|
23
|
+
*
|
|
24
|
+
* 仅 `role: "admin"` 时可用。
|
|
25
|
+
*/
|
|
26
|
+
private readonly admin_access?;
|
|
27
|
+
/**
|
|
28
|
+
* User 能力面。
|
|
29
|
+
*
|
|
30
|
+
* 仅 `role: "user"` 时可用。
|
|
31
|
+
*/
|
|
32
|
+
private readonly user_access?;
|
|
33
|
+
constructor(options: CityOptionsForRole<TRole>);
|
|
34
|
+
/**
|
|
35
|
+
* User City 的 AI 调用入口。
|
|
36
|
+
*/
|
|
37
|
+
get ai(): UserCityAccess["ai"];
|
|
38
|
+
/**
|
|
39
|
+
* User City 的支付入口。
|
|
40
|
+
*/
|
|
41
|
+
get payment(): UserCityAccess["payment"];
|
|
42
|
+
/**
|
|
43
|
+
* Admin City 的余额服务入口。
|
|
44
|
+
*/
|
|
45
|
+
get balance(): AdminCityAccess["balance"];
|
|
46
|
+
/**
|
|
47
|
+
* Admin City 的环境变量服务入口。
|
|
48
|
+
*/
|
|
49
|
+
get env(): AdminCityAccess["env"];
|
|
50
|
+
/**
|
|
51
|
+
* Admin City 的 Town 管理入口。
|
|
52
|
+
*/
|
|
53
|
+
get towns(): AdminCityAccess["towns"];
|
|
54
|
+
/**
|
|
55
|
+
* 获取普通 service 调用器。
|
|
56
|
+
*/
|
|
57
|
+
service(name: string): ServiceClient;
|
|
58
|
+
/**
|
|
59
|
+
* 列出当前 City 暴露的 service。
|
|
60
|
+
*/
|
|
61
|
+
listServices(): Promise<AdminServiceSummary[] | UserServiceSummary[]>;
|
|
62
|
+
/**
|
|
63
|
+
* 列出 City 模型目录。
|
|
64
|
+
*/
|
|
65
|
+
listModels(): Promise<AdminModelRecord[]>;
|
|
66
|
+
/**
|
|
67
|
+
* 读取 City 聚合说明文档。
|
|
68
|
+
*/
|
|
69
|
+
instruction(): Promise<string>;
|
|
70
|
+
private require_admin;
|
|
71
|
+
private require_user;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=city.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"city.d.ts","sourceRoot":"","sources":["../../src/city/city.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;GAEG;AACH,qBAAa,IAAI,CAAC,KAAK,SAAS,QAAQ,GAAG,QAAQ;IACjD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAkB;IAEhD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiB;gBAElC,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC;IAwB9C;;OAEG;IACH,IAAI,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,CAE7B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,CAEvC;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,eAAe,CAAC,SAAS,CAAC,CAExC;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAEhC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,eAAe,CAAC,OAAO,CAAC,CAEpC;IAED;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAIpC;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,mBAAmB,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAIrE;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIzC;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;CAMrB"}
|
package/bin/city/city.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* City 统一访问入口。
|
|
3
|
+
*
|
|
4
|
+
* City 面向开发者表达“我以某种角色进入 City”,内部再委托给
|
|
5
|
+
* admin / user 访问层,避免用户在第一层概念上关心 client 拆分。
|
|
6
|
+
*/
|
|
7
|
+
import { AdminCityAccess } from "./admin/index.js";
|
|
8
|
+
import { UserCityAccess } from "./user/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Downcity City。
|
|
11
|
+
*/
|
|
12
|
+
export class City {
|
|
13
|
+
/**
|
|
14
|
+
* 当前 City 访问角色。
|
|
15
|
+
*/
|
|
16
|
+
role;
|
|
17
|
+
/**
|
|
18
|
+
* Admin 能力面。
|
|
19
|
+
*
|
|
20
|
+
* 仅 `role: "admin"` 时可用。
|
|
21
|
+
*/
|
|
22
|
+
admin_access;
|
|
23
|
+
/**
|
|
24
|
+
* User 能力面。
|
|
25
|
+
*
|
|
26
|
+
* 仅 `role: "user"` 时可用。
|
|
27
|
+
*/
|
|
28
|
+
user_access;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
if (!options || typeof options !== "object") {
|
|
31
|
+
throw new TypeError("City options are required");
|
|
32
|
+
}
|
|
33
|
+
this.role = options.role;
|
|
34
|
+
if (options.role === "admin") {
|
|
35
|
+
this.admin_access = new AdminCityAccess({
|
|
36
|
+
base_url: options.city_url,
|
|
37
|
+
admin_secret_key: options.admin_secret_key,
|
|
38
|
+
fetch: options.fetch,
|
|
39
|
+
});
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.user_access = new UserCityAccess({
|
|
43
|
+
base_url: options.city_url,
|
|
44
|
+
town_id: options.town_id,
|
|
45
|
+
user_token: options.user_token,
|
|
46
|
+
fetch: options.fetch,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* User City 的 AI 调用入口。
|
|
51
|
+
*/
|
|
52
|
+
get ai() {
|
|
53
|
+
return this.require_user().ai;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* User City 的支付入口。
|
|
57
|
+
*/
|
|
58
|
+
get payment() {
|
|
59
|
+
return this.require_user().payment;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Admin City 的余额服务入口。
|
|
63
|
+
*/
|
|
64
|
+
get balance() {
|
|
65
|
+
return this.require_admin().balance;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Admin City 的环境变量服务入口。
|
|
69
|
+
*/
|
|
70
|
+
get env() {
|
|
71
|
+
return this.require_admin().env;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Admin City 的 Town 管理入口。
|
|
75
|
+
*/
|
|
76
|
+
get towns() {
|
|
77
|
+
return this.require_admin().towns;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 获取普通 service 调用器。
|
|
81
|
+
*/
|
|
82
|
+
service(name) {
|
|
83
|
+
return this.admin_access?.service(name) ?? this.require_user().service(name);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 列出当前 City 暴露的 service。
|
|
87
|
+
*/
|
|
88
|
+
listServices() {
|
|
89
|
+
return this.admin_access?.listServices() ?? this.require_user().listServices();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 列出 City 模型目录。
|
|
93
|
+
*/
|
|
94
|
+
listModels() {
|
|
95
|
+
return this.require_admin().listModels();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 读取 City 聚合说明文档。
|
|
99
|
+
*/
|
|
100
|
+
instruction() {
|
|
101
|
+
return this.require_admin().instruction();
|
|
102
|
+
}
|
|
103
|
+
require_admin() {
|
|
104
|
+
if (!this.admin_access) {
|
|
105
|
+
throw new TypeError("City role admin is required for this operation");
|
|
106
|
+
}
|
|
107
|
+
return this.admin_access;
|
|
108
|
+
}
|
|
109
|
+
require_user() {
|
|
110
|
+
if (!this.user_access) {
|
|
111
|
+
throw new TypeError("City role user is required for this operation");
|
|
112
|
+
}
|
|
113
|
+
return this.user_access;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=city.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"city.js","sourceRoot":"","sources":["../../src/city/city.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMjD;;GAEG;AACH,MAAM,OAAO,IAAI;IACf;;OAEG;IACM,IAAI,CAAQ;IAErB;;;;OAIG;IACc,YAAY,CAAmB;IAEhD;;;;OAIG;IACc,WAAW,CAAkB;IAE9C,YAAY,OAAkC;QAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAa,CAAC;QAElC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CAAC;gBACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,cAAc,CAAC;YACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client 包 HTTP 基础设施。
|
|
3
|
+
*
|
|
4
|
+
* 集中处理 fetch 封装、URL 规范化、服务路径等共享工具。
|
|
5
|
+
* 同时包含 HTTP 层的公共类型。
|
|
6
|
+
*/
|
|
7
|
+
/** fetch 层收到的原始字节流 body */
|
|
8
|
+
export type RawStreamBody = ReadableStream<Uint8Array> | null;
|
|
9
|
+
/** SDK 内部传给 fetch 的请求配置 */
|
|
10
|
+
export interface RequestInitLike {
|
|
11
|
+
method?: string;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
body?: string;
|
|
14
|
+
}
|
|
15
|
+
/** fetch 返回对象的最小接口 */
|
|
16
|
+
export interface FetchResponseLike {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
status: number;
|
|
19
|
+
body: RawStreamBody;
|
|
20
|
+
json(): Promise<unknown>;
|
|
21
|
+
text(): Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
/** SDK 使用的 fetch 函数签名 */
|
|
24
|
+
export interface FetchLike {
|
|
25
|
+
(url: string, init: RequestInitLike): Promise<FetchResponseLike>;
|
|
26
|
+
}
|
|
27
|
+
/** 去掉 server URL 末尾多余斜杠 */
|
|
28
|
+
export declare function normalizeBaseURL(value: unknown, label: string): string;
|
|
29
|
+
/** 校验必填字符串 */
|
|
30
|
+
export declare function requiredString(value: unknown, label: string): string;
|
|
31
|
+
/** 读取全局 fetch */
|
|
32
|
+
export declare function defaultFetch(): FetchLike;
|
|
33
|
+
/** 发送 JSON 请求并解析响应 */
|
|
34
|
+
export declare function requestJSON<T>(params: {
|
|
35
|
+
fetch: FetchLike;
|
|
36
|
+
url: string;
|
|
37
|
+
init: RequestInitLike;
|
|
38
|
+
}): Promise<T>;
|
|
39
|
+
/** 发送请求并返回原始响应 */
|
|
40
|
+
export declare function requestRaw(params: {
|
|
41
|
+
fetch: FetchLike;
|
|
42
|
+
url: string;
|
|
43
|
+
init: RequestInitLike;
|
|
44
|
+
}): Promise<FetchResponseLike>;
|
|
45
|
+
/** 发送请求并解析文本响应 */
|
|
46
|
+
export declare function requestText(params: {
|
|
47
|
+
fetch: FetchLike;
|
|
48
|
+
url: string;
|
|
49
|
+
init: RequestInitLike;
|
|
50
|
+
}): Promise<string>;
|
|
51
|
+
/** 标准化服务 ID */
|
|
52
|
+
export declare function normalizeServiceId(value: string): string;
|
|
53
|
+
/** 拼接服务请求路径 */
|
|
54
|
+
export declare function servicePath(prefix: string, serviceId: string, path: string): string;
|
|
55
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/city/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,2BAA2B;AAC3B,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;AAE9D,2BAA2B;AAC3B,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,sBAAsB;AACtB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,yBAAyB;AACzB,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAClE;AAMD,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,cAAc;AACd,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpE;AAMD,iBAAiB;AACjB,wBAAgB,YAAY,IAAI,SAAS,CAKxC;AAED,sBAAsB;AACtB,wBAAsB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE;IAC3C,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,eAAe,CAAC;CACvB,GAAG,OAAO,CAAC,CAAC,CAAC,CAIb;AAED,kBAAkB;AAClB,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACvC,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,eAAe,CAAC;CACvB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAI7B;AAED,kBAAkB;AAClB,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,eAAe,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlB;AAMD,eAAe;AACf,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,eAAe;AACf,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnF"}
|
package/bin/city/http.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client 包 HTTP 基础设施。
|
|
3
|
+
*
|
|
4
|
+
* 集中处理 fetch 封装、URL 规范化、服务路径等共享工具。
|
|
5
|
+
* 同时包含 HTTP 层的公共类型。
|
|
6
|
+
*/
|
|
7
|
+
// ===========================================================================
|
|
8
|
+
// URL 与校验
|
|
9
|
+
// ===========================================================================
|
|
10
|
+
/** 去掉 server URL 末尾多余斜杠 */
|
|
11
|
+
export function normalizeBaseURL(value, label) {
|
|
12
|
+
const url = requiredString(value, label);
|
|
13
|
+
return url.replace(/\/+$/, "");
|
|
14
|
+
}
|
|
15
|
+
/** 校验必填字符串 */
|
|
16
|
+
export function requiredString(value, label) {
|
|
17
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
18
|
+
throw new TypeError(`${label} must be a non-empty string`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
// ===========================================================================
|
|
23
|
+
// fetch 封装
|
|
24
|
+
// ===========================================================================
|
|
25
|
+
/** 读取全局 fetch */
|
|
26
|
+
export function defaultFetch() {
|
|
27
|
+
if (typeof globalThis.fetch !== "function") {
|
|
28
|
+
throw new Error("fetch is required");
|
|
29
|
+
}
|
|
30
|
+
return async (url, init) => globalThis.fetch(url, init);
|
|
31
|
+
}
|
|
32
|
+
/** 发送 JSON 请求并解析响应 */
|
|
33
|
+
export async function requestJSON(params) {
|
|
34
|
+
const response = await params.fetch(params.url, params.init);
|
|
35
|
+
if (!response.ok)
|
|
36
|
+
throw await httpError(response);
|
|
37
|
+
return response.json();
|
|
38
|
+
}
|
|
39
|
+
/** 发送请求并返回原始响应 */
|
|
40
|
+
export async function requestRaw(params) {
|
|
41
|
+
const response = await params.fetch(params.url, params.init);
|
|
42
|
+
if (!response.ok)
|
|
43
|
+
throw await httpError(response);
|
|
44
|
+
return response;
|
|
45
|
+
}
|
|
46
|
+
/** 发送请求并解析文本响应 */
|
|
47
|
+
export async function requestText(params) {
|
|
48
|
+
const response = await params.fetch(params.url, params.init);
|
|
49
|
+
if (!response.ok)
|
|
50
|
+
throw await httpError(response);
|
|
51
|
+
return response.text();
|
|
52
|
+
}
|
|
53
|
+
// ===========================================================================
|
|
54
|
+
// 服务路径工具
|
|
55
|
+
// ===========================================================================
|
|
56
|
+
/** 标准化服务 ID */
|
|
57
|
+
export function normalizeServiceId(value) {
|
|
58
|
+
const normalized = String(value ?? "").trim();
|
|
59
|
+
if (!normalized)
|
|
60
|
+
throw new TypeError("service id is required");
|
|
61
|
+
return normalized;
|
|
62
|
+
}
|
|
63
|
+
/** 拼接服务请求路径 */
|
|
64
|
+
export function servicePath(prefix, serviceId, path) {
|
|
65
|
+
const suffix = String(path ?? "").trim().replace(/^\/+/, "").replace(/\/+$/, "");
|
|
66
|
+
return suffix ? `${prefix}/${serviceId}/${suffix}` : `${prefix}/${serviceId}`;
|
|
67
|
+
}
|
|
68
|
+
// ===========================================================================
|
|
69
|
+
// 内部
|
|
70
|
+
// ===========================================================================
|
|
71
|
+
async function httpError(response) {
|
|
72
|
+
const body = await response.text();
|
|
73
|
+
const error = new Error(`Downcity request failed with ${response.status}: ${body}`);
|
|
74
|
+
error.status = response.status;
|
|
75
|
+
error.body = body;
|
|
76
|
+
return error;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/city/http.ts"],"names":[],"mappings":"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"}
|