@downcity/city 0.2.205 → 0.2.211

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.
Files changed (118) hide show
  1. package/README.md +63 -5
  2. package/bin/client/bureau.d.ts +41 -0
  3. package/bin/client/bureau.d.ts.map +1 -0
  4. package/bin/client/bureau.js +240 -0
  5. package/bin/client/bureau.js.map +1 -0
  6. package/bin/client/city.d.ts +15 -79
  7. package/bin/client/city.d.ts.map +1 -1
  8. package/bin/client/city.js +15 -99
  9. package/bin/client/city.js.map +1 -1
  10. package/bin/client/federation-admin.d.ts +32 -0
  11. package/bin/client/federation-admin.d.ts.map +1 -0
  12. package/bin/client/federation-admin.js +54 -0
  13. package/bin/client/federation-admin.js.map +1 -0
  14. package/bin/client/types.d.ts +10 -70
  15. package/bin/client/types.d.ts.map +1 -1
  16. package/bin/client/types.js +3 -3
  17. package/bin/federation/auth/authenticator.d.ts +17 -13
  18. package/bin/federation/auth/authenticator.d.ts.map +1 -1
  19. package/bin/federation/auth/authenticator.js +38 -27
  20. package/bin/federation/auth/authenticator.js.map +1 -1
  21. package/bin/federation/auth/bureau-token-schema.d.ts +274 -0
  22. package/bin/federation/auth/bureau-token-schema.d.ts.map +1 -0
  23. package/bin/federation/auth/bureau-token-schema.js +43 -0
  24. package/bin/federation/auth/bureau-token-schema.js.map +1 -0
  25. package/bin/federation/auth/bureau-token-store.d.ts +22 -0
  26. package/bin/federation/auth/bureau-token-store.d.ts.map +1 -0
  27. package/bin/federation/auth/bureau-token-store.js +122 -0
  28. package/bin/federation/auth/bureau-token-store.js.map +1 -0
  29. package/bin/federation/auth/federation-key-store.d.ts +26 -0
  30. package/bin/federation/auth/federation-key-store.d.ts.map +1 -0
  31. package/bin/federation/auth/federation-key-store.js +96 -0
  32. package/bin/federation/auth/federation-key-store.js.map +1 -0
  33. package/bin/federation/auth/key-schema.d.ts +275 -0
  34. package/bin/federation/auth/key-schema.d.ts.map +1 -0
  35. package/bin/federation/auth/key-schema.js +44 -0
  36. package/bin/federation/auth/key-schema.js.map +1 -0
  37. package/bin/federation/auth/types.d.ts +62 -4
  38. package/bin/federation/auth/types.d.ts.map +1 -1
  39. package/bin/federation/auth/user-token-authority.d.ts +26 -0
  40. package/bin/federation/auth/user-token-authority.d.ts.map +1 -0
  41. package/bin/federation/auth/user-token-authority.js +179 -0
  42. package/bin/federation/auth/user-token-authority.js.map +1 -0
  43. package/bin/federation/federation-init.d.ts.map +1 -1
  44. package/bin/federation/federation-init.js +23 -4
  45. package/bin/federation/federation-init.js.map +1 -1
  46. package/bin/federation/federation-router.d.ts +3 -1
  47. package/bin/federation/federation-router.d.ts.map +1 -1
  48. package/bin/federation/federation-router.js +17 -0
  49. package/bin/federation/federation-router.js.map +1 -1
  50. package/bin/federation/federation-runtime.d.ts.map +1 -1
  51. package/bin/federation/federation-runtime.js +14 -2
  52. package/bin/federation/federation-runtime.js.map +1 -1
  53. package/bin/federation/federation.d.ts.map +1 -1
  54. package/bin/federation/federation.js +2 -0
  55. package/bin/federation/federation.js.map +1 -1
  56. package/bin/federation/runtime.d.ts +4 -0
  57. package/bin/federation/runtime.d.ts.map +1 -1
  58. package/bin/index.d.ts +8 -3
  59. package/bin/index.d.ts.map +1 -1
  60. package/bin/index.js +3 -1
  61. package/bin/index.js.map +1 -1
  62. package/bin/pact/admin/index.d.ts +7 -19
  63. package/bin/pact/admin/index.d.ts.map +1 -1
  64. package/bin/pact/admin/index.js +10 -18
  65. package/bin/pact/admin/index.js.map +1 -1
  66. package/bin/pact/admin/types.d.ts +4 -10
  67. package/bin/pact/admin/types.d.ts.map +1 -1
  68. package/bin/pact/invoker/bureaus/index.d.ts +25 -0
  69. package/bin/pact/invoker/bureaus/index.d.ts.map +1 -0
  70. package/bin/pact/invoker/bureaus/index.js +36 -0
  71. package/bin/pact/invoker/bureaus/index.js.map +1 -0
  72. package/bin/pact/invoker/cities/types.d.ts +2 -2
  73. package/bin/pact/invoker/cities/types.d.ts.map +1 -1
  74. package/bin/pact/invoker/user/index.d.ts +19 -0
  75. package/bin/pact/invoker/user/index.d.ts.map +1 -0
  76. package/bin/pact/invoker/user/index.js +24 -0
  77. package/bin/pact/invoker/user/index.js.map +1 -0
  78. package/bin/pact/user/index.d.ts +2 -1
  79. package/bin/pact/user/index.d.ts.map +1 -1
  80. package/bin/pact/user/index.js +7 -3
  81. package/bin/pact/user/index.js.map +1 -1
  82. package/bin/pact/user/types.d.ts +0 -2
  83. package/bin/pact/user/types.d.ts.map +1 -1
  84. package/bin/service/ai/ai-service.d.ts +1 -1
  85. package/bin/service/ai/ai-service.d.ts.map +1 -1
  86. package/bin/service/ai/model-registry.d.ts +1 -1
  87. package/bin/service/ai/model-registry.d.ts.map +1 -1
  88. package/bin/service/bureaus/bureaus-service.d.ts +15 -0
  89. package/bin/service/bureaus/bureaus-service.d.ts.map +1 -0
  90. package/bin/service/bureaus/bureaus-service.js +55 -0
  91. package/bin/service/bureaus/bureaus-service.js.map +1 -0
  92. package/bin/service/installable-service.d.ts +5 -2
  93. package/bin/service/installable-service.d.ts.map +1 -1
  94. package/bin/service/installable-service.js +1 -0
  95. package/bin/service/installable-service.js.map +1 -1
  96. package/bin/service/instruction.js +1 -1
  97. package/bin/service/instruction.js.map +1 -1
  98. package/bin/service/service.d.ts +7 -1
  99. package/bin/service/service.d.ts.map +1 -1
  100. package/bin/service/service.js +2 -0
  101. package/bin/service/service.js.map +1 -1
  102. package/bin/types/Bureau.d.ts +96 -0
  103. package/bin/types/Bureau.d.ts.map +1 -0
  104. package/bin/types/Bureau.js +8 -0
  105. package/bin/types/Bureau.js.map +1 -0
  106. package/bin/types/FederationAdmin.d.ts +16 -0
  107. package/bin/types/FederationAdmin.d.ts.map +1 -0
  108. package/bin/types/FederationAdmin.js +7 -0
  109. package/bin/types/FederationAdmin.js.map +1 -0
  110. package/bin/types/User.d.ts +24 -0
  111. package/bin/types/User.d.ts.map +1 -0
  112. package/bin/types/User.js +8 -0
  113. package/bin/types/User.js.map +1 -0
  114. package/package.json +4 -3
  115. package/bin/federation/auth/token-signer.d.ts +0 -27
  116. package/bin/federation/auth/token-signer.d.ts.map +0 -1
  117. package/bin/federation/auth/token-signer.js +0 -116
  118. package/bin/federation/auth/token-signer.js.map +0 -1
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Federation 全局控制面客户端。
3
+ *
4
+ * 该客户端承载 env、City、余额、模型和 Service 管理能力,不参与终端用户
5
+ * 或 Bureau 产品后端的请求链路。
6
+ */
7
+ import { AdminPactAccess } from "../pact/admin/index.js";
8
+ import type { ServiceClient } from "../pact/invoker/invoker.js";
9
+ import type { AdminModelRecord, AdminServiceSummary } from "../pact/admin/types.js";
10
+ import type { FederationAdminOptions } from "../types/FederationAdmin.js";
11
+ /** Federation 全局控制面客户端。 */
12
+ export declare class FederationAdmin {
13
+ private readonly admin_access;
14
+ constructor(options: FederationAdminOptions);
15
+ /** Federation 余额管理入口。 */
16
+ get balance(): AdminPactAccess["balance"];
17
+ /** Federation City 管理入口。 */
18
+ get cities(): AdminPactAccess["cities"];
19
+ /** Federation Bureau 注册表管理入口。 */
20
+ get bureaus(): AdminPactAccess["bureaus"];
21
+ /** Federation 环境变量管理入口。 */
22
+ get env(): AdminPactAccess["env"];
23
+ /** 获取管理身份下的 Service 调用器。 */
24
+ service(name: string): ServiceClient;
25
+ /** 列出 Federation 暴露的 Service。 */
26
+ listServices(): Promise<AdminServiceSummary[]>;
27
+ /** 列出 Federation 模型目录及管理状态。 */
28
+ listModels(): Promise<AdminModelRecord[]>;
29
+ /** 读取 Federation 聚合说明文档。 */
30
+ instruction(): Promise<string>;
31
+ }
32
+ //# sourceMappingURL=federation-admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-admin.d.ts","sourceRoot":"","sources":["../../src/client/federation-admin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,2BAA2B;AAC3B,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;gBAEnC,OAAO,EAAE,sBAAsB;IAW3C,yBAAyB;IACzB,IAAI,OAAO,IAAI,eAAe,CAAC,SAAS,CAAC,CAExC;IAED,4BAA4B;IAC5B,IAAI,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAEtC;IAED,iCAAiC;IACjC,IAAI,OAAO,IAAI,eAAe,CAAC,SAAS,CAAC,CAExC;IAED,2BAA2B;IAC3B,IAAI,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAEhC;IAED,4BAA4B;IAC5B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAIpC,iCAAiC;IACjC,YAAY,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAI9C,+BAA+B;IAC/B,UAAU,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIzC,4BAA4B;IAC5B,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CAG/B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Federation 全局控制面客户端。
3
+ *
4
+ * 该客户端承载 env、City、余额、模型和 Service 管理能力,不参与终端用户
5
+ * 或 Bureau 产品后端的请求链路。
6
+ */
7
+ import { AdminPactAccess } from "../pact/admin/index.js";
8
+ /** Federation 全局控制面客户端。 */
9
+ export class FederationAdmin {
10
+ admin_access;
11
+ constructor(options) {
12
+ if (!options || typeof options !== "object") {
13
+ throw new TypeError("FederationAdmin options are required");
14
+ }
15
+ this.admin_access = new AdminPactAccess({
16
+ base_url: options.federation_url,
17
+ admin_secret_key: options.admin_secret_key,
18
+ fetch: options.fetch,
19
+ });
20
+ }
21
+ /** Federation 余额管理入口。 */
22
+ get balance() {
23
+ return this.admin_access.balance;
24
+ }
25
+ /** Federation City 管理入口。 */
26
+ get cities() {
27
+ return this.admin_access.cities;
28
+ }
29
+ /** Federation Bureau 注册表管理入口。 */
30
+ get bureaus() {
31
+ return this.admin_access.bureaus;
32
+ }
33
+ /** Federation 环境变量管理入口。 */
34
+ get env() {
35
+ return this.admin_access.env;
36
+ }
37
+ /** 获取管理身份下的 Service 调用器。 */
38
+ service(name) {
39
+ return this.admin_access.service(name);
40
+ }
41
+ /** 列出 Federation 暴露的 Service。 */
42
+ listServices() {
43
+ return this.admin_access.listServices();
44
+ }
45
+ /** 列出 Federation 模型目录及管理状态。 */
46
+ listModels() {
47
+ return this.admin_access.listModels();
48
+ }
49
+ /** 读取 Federation 聚合说明文档。 */
50
+ instruction() {
51
+ return this.admin_access.instruction();
52
+ }
53
+ }
54
+ //# sourceMappingURL=federation-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-admin.js","sourceRoot":"","sources":["../../src/client/federation-admin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAKzD,2BAA2B;AAC3B,MAAM,OAAO,eAAe;IACT,YAAY,CAAkB;IAE/C,YAAY,OAA+B;QACzC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,cAAc;YAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;IAED,iCAAiC;IACjC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;IAC/B,CAAC;IAED,4BAA4B;IAC5B,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,iCAAiC;IACjC,YAAY;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;IAC1C,CAAC;IAED,+BAA+B;IAC/B,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,WAAW;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IACzC,CAAC;CACF"}
@@ -1,81 +1,21 @@
1
1
  /**
2
- * City 客户端构造类型模块。
2
+ * City 用户客户端构造类型模块。
3
3
  *
4
- * City 是访问 Federation 的统一客户端入口:开发者只需要声明访问角色,
5
- * SDK 会在内部选择 admin user 能力面。底层 HTTP 协议实现位于 `pact/`。
4
+ * City 只表达终端用户访问 Federation。已登录身份和 city_id 均来自 user_token,
5
+ * Bureau 是可选产品后端,Federation 控制面由 FederationAdmin 独立提供。
6
6
  */
7
7
  import type { FetchLike } from "../pact/http.js";
8
- /**
9
- * City 访问角色。
10
- */
11
- export type CityRole = "admin" | "user";
12
- /**
13
- * City 客户端共享构造参数。
14
- */
15
- export interface CityBaseOptions {
16
- /**
17
- * Federation 的 HTTP 入口地址。
18
- *
19
- * 示例:`https://city.example.com`、`http://localhost:43127`
20
- * 或本机 loopback HTTP:`http://127.0.0.1:15315`。
21
- */
8
+ /** City 用户客户端构造参数。 */
9
+ export interface CityOptions {
10
+ /** Federation 的 HTTP 入口地址。 */
22
11
  federation_url: string;
23
12
  /**
24
- * 自定义 fetch 实现。
25
- *
26
- * 主要用于测试、Worker 运行时适配,或在请求层注入日志与追踪。
27
- */
28
- fetch?: FetchLike;
29
- }
30
- /**
31
- * Admin 角色的 City 构造参数。
32
- */
33
- export interface AdminCityOptions extends CityBaseOptions {
34
- /**
35
- * 使用 admin 身份访问 Federation。
36
- */
37
- role: "admin";
38
- /**
39
- * 当前管理的 City ID。
13
+ * Federation 签发的终端用户 token。
40
14
  *
41
- * token 签发等服务会自动使用该 ID,调用方无需再传 city_id。
42
- */
43
- city_id: string;
44
- /**
45
- * Federation 管理密钥。
46
- *
47
- * 未传入时会由 SDK 回退读取 `DOWNCITY_FEDERATION_ADMIN_SECRET_KEY`。
48
- */
49
- admin_secret_key?: string;
50
- }
51
- /**
52
- * User 角色的 City 构造参数。
53
- */
54
- export interface UserCityOptions extends CityBaseOptions {
55
- /**
56
- * 使用 user 身份访问 Federation。
57
- */
58
- role: "user";
59
- /**
60
- * 当前 user_token 绑定的 City ID。
61
- *
62
- * 普通 service action 调用会自动把该值注入为 `city_id`。
63
- * AI 调用会优先使用 `user_token` 解析出的 City 身份。
64
- */
65
- city_id?: string;
66
- /**
67
- * 终端用户访问 token。
68
- *
69
- * 仅访问 public action(例如 accounts 本地登录)时可以暂不传。
15
+ * 访问 accounts 登录等公开 Action 时可以省略;受保护操作必须提供。
70
16
  */
71
17
  user_token?: string;
18
+ /** 自定义 fetch 实现。 */
19
+ fetch?: FetchLike;
72
20
  }
73
- /**
74
- * City 构造参数。
75
- */
76
- export type CityOptions = AdminCityOptions | UserCityOptions;
77
- /**
78
- * 按角色收窄后的 City 构造参数。
79
- */
80
- export type CityOptionsForRole<TRole extends CityRole> = TRole extends "admin" ? AdminCityOptions : UserCityOptions;
81
21
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAE7D;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,QAAQ,IAAI,KAAK,SAAS,OAAO,GAC1E,gBAAgB,GAChB,eAAe,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,sBAAsB;AACtB,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oBAAoB;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * City 客户端构造类型模块。
2
+ * City 用户客户端构造类型模块。
3
3
  *
4
- * City 是访问 Federation 的统一客户端入口:开发者只需要声明访问角色,
5
- * SDK 会在内部选择 admin user 能力面。底层 HTTP 协议实现位于 `pact/`。
4
+ * City 只表达终端用户访问 Federation。已登录身份和 city_id 均来自 user_token,
5
+ * Bureau 是可选产品后端,Federation 控制面由 FederationAdmin 独立提供。
6
6
  */
7
7
  export {};
8
8
  //# sourceMappingURL=types.js.map
@@ -1,14 +1,17 @@
1
1
  /**
2
2
  * 统一鉴权模块。
3
3
  *
4
- * Authenticator 统一处理 admin(secret key)和 user(JWT token)两种鉴权方式。
4
+ * Authenticator 统一处理 admin(secret key)、bureau(不透明部署凭证)和
5
+ * user(Ed25519 JWT)三种鉴权方式。
5
6
  * 所有鉴权失败统一抛出 httpError(ErrorWithStatus)。
6
- *
7
- * TokenSigner 实例通过 getSigner() 缓存,避免重复 new TokenSigner(key)。
8
7
  */
9
8
  import { type RouteAuth, type RouteIdentity } from "../../service/service.js";
10
9
  import type { EnvProvider } from "../runtime.js";
11
- import type { CreateUserTokenInput, UserTokenPayload, UserTokenIssueResult, RuntimeUser } from "./types.js";
10
+ import { type UserTokenAuthority } from "./user-token-authority.js";
11
+ import type { FederationKeyStore } from "./federation-key-store.js";
12
+ import type { BureauTokenStore } from "./bureau-token-store.js";
13
+ import type { CreateUserTokenInput, FederationDiscovery, FederationJwks, UserTokenPayload, UserTokenIssueResult, RuntimeUser } from "./types.js";
14
+ import type { RuntimeBureau } from "../../types/Bureau.js";
12
15
  import type { FederationTrustedIdentity } from "../types.js";
13
16
  /** 鉴权级别 */
14
17
  /** 鉴权结果 */
@@ -22,13 +25,16 @@ export interface AuthResult {
22
25
  city_id: string;
23
26
  status: string;
24
27
  };
28
+ /** 解析出的 Bureau 信息(bureau token 时可用)。 */
29
+ bureau?: RuntimeBureau;
25
30
  }
26
31
  /** 统一鉴权器 */
27
32
  export declare class Authenticator {
28
33
  private env;
29
34
  private store;
30
- /** 缓存的 TokenSigner 实例 */
31
- private tokenSigner?;
35
+ private readonly token_authority;
36
+ private readonly key_store;
37
+ private readonly bureau_token_store;
32
38
  constructor(env: EnvProvider, store: () => Promise<{
33
39
  city: {
34
40
  get(id: string): Promise<{
@@ -36,13 +42,7 @@ export declare class Authenticator {
36
42
  status: string;
37
43
  } | undefined>;
38
44
  };
39
- }>);
40
- /**
41
- * 获取(或创建)TokenSigner 单例。
42
- *
43
- * 首次调用时从 env 读取 DOWNCITY_FEDERATION_TOKEN_SIGNING_KEY 创建实例并缓存。
44
- */
45
- private getSigner;
45
+ }>, token_authority: UserTokenAuthority, key_store: FederationKeyStore, bureau_token_store: BureauTokenStore);
46
46
  /**
47
47
  * 解析请求身份。
48
48
  *
@@ -84,5 +84,9 @@ export declare class Authenticator {
84
84
  * @returns 解析出的 token 载荷
85
85
  */
86
86
  verifyToken(token: string): Promise<UserTokenPayload>;
87
+ /** 返回 Federation 当前可公开使用的 JWKS。 */
88
+ get_public_jwks(): Promise<FederationJwks>;
89
+ /** 根据当前请求 origin 生成 Federation 发现信息。 */
90
+ get_discovery(origin: string): FederationDiscovery;
87
91
  }
88
92
  //# sourceMappingURL=authenticator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../src/federation/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAsB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5G,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,WAAW;AACX,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,+BAA+B;IAC/B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,YAAY;AACZ,qBAAa,aAAa;IAKtB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IALf,yBAAyB;IACzB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAGxB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,SAAS,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;IAGvH;;;;OAIG;IACH,OAAO,CAAC,SAAS;IASjB;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BpD;;;;;;OAMG;IACH,cAAc,CAAC,QAAQ,EAAE,yBAAyB,GAAG,UAAU;IAW/D;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU;IAY/D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAI/E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiB7E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAG5D"}
1
+ {"version":3,"file":"authenticator.d.ts","sourceRoot":"","sources":["../../../src/federation/auth/authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAsB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,WAAW;AACX,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,+BAA+B;IAC/B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,wCAAwC;IACxC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,YAAY;AACZ,qBAAa,aAAa;IAEtB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAJ3B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,GAAG,SAAS,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC,EACpG,eAAe,EAAE,kBAAkB,EACnC,SAAS,EAAE,kBAAkB,EAC7B,kBAAkB,EAAE,gBAAgB;IAGvD;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAkCpD;;;;;;OAMG;IACH,cAAc,CAAC,QAAQ,EAAE,yBAAyB,GAAG,UAAU;IAW/D;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU;IAY/D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAI/E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgB7E;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3D,mCAAmC;IACnC,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC;IAI1C,wCAAwC;IACxC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB;CASnD"}
@@ -1,37 +1,26 @@
1
1
  /**
2
2
  * 统一鉴权模块。
3
3
  *
4
- * Authenticator 统一处理 admin(secret key)和 user(JWT token)两种鉴权方式。
4
+ * Authenticator 统一处理 admin(secret key)、bureau(不透明部署凭证)和
5
+ * user(Ed25519 JWT)三种鉴权方式。
5
6
  * 所有鉴权失败统一抛出 httpError(ErrorWithStatus)。
6
- *
7
- * TokenSigner 实例通过 getSigner() 缓存,避免重复 new TokenSigner(key)。
8
7
  */
9
8
  import { bearerToken, httpError } from "../../utils/helpers.js";
10
- import { TokenSigner } from "./token-signer.js";
11
9
  import { normalizeRouteAuth } from "../../service/service.js";
10
+ import { parse_user_token_ttl } from "./user-token-authority.js";
12
11
  /** 统一鉴权器 */
13
12
  export class Authenticator {
14
13
  env;
15
14
  store;
16
- /** 缓存的 TokenSigner 实例 */
17
- tokenSigner;
18
- constructor(env, store) {
15
+ token_authority;
16
+ key_store;
17
+ bureau_token_store;
18
+ constructor(env, store, token_authority, key_store, bureau_token_store) {
19
19
  this.env = env;
20
20
  this.store = store;
21
- }
22
- /**
23
- * 获取(或创建)TokenSigner 单例。
24
- *
25
- * 首次调用时从 env 读取 DOWNCITY_FEDERATION_TOKEN_SIGNING_KEY 创建实例并缓存。
26
- */
27
- getSigner() {
28
- if (!this.tokenSigner) {
29
- const signingKey = this.env.get("DOWNCITY_FEDERATION_TOKEN_SIGNING_KEY");
30
- if (!signingKey)
31
- throw new Error("DOWNCITY_FEDERATION_TOKEN_SIGNING_KEY is required");
32
- this.tokenSigner = new TokenSigner(signingKey);
33
- }
34
- return this.tokenSigner;
21
+ this.token_authority = token_authority;
22
+ this.key_store = key_store;
23
+ this.bureau_token_store = bureau_token_store;
35
24
  }
36
25
  /**
37
26
  * 解析请求身份。
@@ -47,8 +36,16 @@ export class Authenticator {
47
36
  if (adminKey && token === adminKey) {
48
37
  return { level: "admin" };
49
38
  }
39
+ const bureau = await this.bureau_token_store.resolve(token);
40
+ if (bureau) {
41
+ const store = await this.store();
42
+ const city = await store.city.get(bureau.city_id);
43
+ if (!city || city.status !== "active")
44
+ return { level: "guest" };
45
+ return { level: "bureau", bureau, city };
46
+ }
50
47
  try {
51
- const payload = await this.getSigner().verify(token);
48
+ const payload = await this.token_authority.verify(token);
52
49
  const store = await this.store();
53
50
  const city = await store.city.get(payload.city_id);
54
51
  if (!city)
@@ -119,14 +116,13 @@ export class Authenticator {
119
116
  throw httpError(404, `Unknown city: ${input.city_id}`);
120
117
  if (city.status !== "active")
121
118
  throw httpError(403, `City is not active: ${input.city_id}`);
122
- const user_token = await this.getSigner().sign(input);
119
+ const ttl_seconds = parse_user_token_ttl(input.ttl);
120
+ const user_token = await this.token_authority.sign(input);
123
121
  return {
124
122
  user_token,
125
123
  city_id: input.city_id,
126
124
  user_id: input.user_id,
127
- ...(input.ttl
128
- ? { expires_at: new Date(Date.now() + TokenSigner.parseTTL(input.ttl) * 1000).toISOString() }
129
- : {}),
125
+ expires_at: new Date(Date.now() + ttl_seconds * 1000).toISOString(),
130
126
  };
131
127
  }
132
128
  /**
@@ -136,7 +132,22 @@ export class Authenticator {
136
132
  * @returns 解析出的 token 载荷
137
133
  */
138
134
  async verifyToken(token) {
139
- return this.getSigner().verify(token);
135
+ return this.token_authority.verify(token);
136
+ }
137
+ /** 返回 Federation 当前可公开使用的 JWKS。 */
138
+ get_public_jwks() {
139
+ return this.key_store.get_public_jwks();
140
+ }
141
+ /** 根据当前请求 origin 生成 Federation 发现信息。 */
142
+ get_discovery(origin) {
143
+ const federation_id = this.env.get("DOWNCITY_FEDERATION_ID");
144
+ if (!federation_id)
145
+ throw new Error("DOWNCITY_FEDERATION_ID is required");
146
+ return {
147
+ issuer: `urn:downcity:federation:${federation_id}`,
148
+ jwks_uri: `${origin.replace(/\/+$/, "")}/.well-known/jwks.json`,
149
+ user_token_audience: "downcity:user",
150
+ };
140
151
  }
141
152
  }
142
153
  //# sourceMappingURL=authenticator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../../src/federation/auth/authenticator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../../src/federation/auth/authenticator.ts"],"names":[],"mappings":"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"}