qing-client 0.0.57 → 1.0.0

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 (239) hide show
  1. package/README.md +293 -0
  2. package/lib/{client → core}/BaseClient.d.ts +9 -7
  3. package/lib/core/BaseClient.d.ts.map +1 -0
  4. package/lib/{client → core}/BaseClient.js +47 -101
  5. package/lib/core/BaseClient.js.map +1 -0
  6. package/lib/core/Client.d.ts +30 -0
  7. package/lib/core/Client.d.ts.map +1 -0
  8. package/lib/core/Client.js +140 -0
  9. package/lib/core/Client.js.map +1 -0
  10. package/lib/core/index.d.ts +3 -0
  11. package/lib/core/index.d.ts.map +1 -0
  12. package/lib/core/index.js +8 -0
  13. package/lib/core/index.js.map +1 -0
  14. package/lib/index.d.ts +34 -30
  15. package/lib/index.d.ts.map +1 -0
  16. package/lib/index.js +26 -39
  17. package/lib/index.js.map +1 -0
  18. package/lib/{service → services/ai}/AiService.d.ts +13 -4
  19. package/lib/services/ai/AiService.d.ts.map +1 -0
  20. package/lib/{service → services/ai}/AiService.js +53 -42
  21. package/lib/services/ai/AiService.js.map +1 -0
  22. package/lib/services/ai/index.d.ts +3 -0
  23. package/lib/services/ai/index.d.ts.map +1 -0
  24. package/lib/services/ai/index.js +21 -0
  25. package/lib/services/ai/index.js.map +1 -0
  26. package/lib/{types/ai.d.ts → services/ai/types.d.ts} +7 -18
  27. package/lib/services/ai/types.d.ts.map +1 -0
  28. package/lib/{types/ai.js → services/ai/types.js} +1 -1
  29. package/lib/services/ai/types.js.map +1 -0
  30. package/lib/{service → services/aigc}/AigcService.d.ts +13 -4
  31. package/lib/services/aigc/AigcService.d.ts.map +1 -0
  32. package/lib/{service → services/aigc}/AigcService.js +23 -28
  33. package/lib/services/aigc/AigcService.js.map +1 -0
  34. package/lib/services/aigc/index.d.ts +3 -0
  35. package/lib/services/aigc/index.d.ts.map +1 -0
  36. package/lib/services/aigc/index.js +21 -0
  37. package/lib/services/aigc/index.js.map +1 -0
  38. package/lib/{types/aigc.d.ts → services/aigc/types.d.ts} +1 -0
  39. package/lib/services/aigc/types.d.ts.map +1 -0
  40. package/lib/{types/aigc.js → services/aigc/types.js} +1 -0
  41. package/lib/services/aigc/types.js.map +1 -0
  42. package/lib/services/audit/AuditLogService.d.ts +17 -0
  43. package/lib/services/audit/AuditLogService.d.ts.map +1 -0
  44. package/lib/{service → services/audit}/AuditLogService.js +9 -30
  45. package/lib/services/audit/AuditLogService.js.map +1 -0
  46. package/lib/services/audit/index.d.ts +3 -0
  47. package/lib/services/audit/index.d.ts.map +1 -0
  48. package/lib/services/audit/index.js +21 -0
  49. package/lib/services/audit/index.js.map +1 -0
  50. package/lib/{types/audit.d.ts → services/audit/types.d.ts} +1 -10
  51. package/lib/services/audit/types.d.ts.map +1 -0
  52. package/lib/{types/audit.js → services/audit/types.js} +1 -1
  53. package/lib/services/audit/types.js.map +1 -0
  54. package/lib/services/auth/AuthService.d.ts +24 -0
  55. package/lib/services/auth/AuthService.d.ts.map +1 -0
  56. package/lib/{service → services/auth}/AuthService.js +29 -55
  57. package/lib/services/auth/AuthService.js.map +1 -0
  58. package/lib/services/auth/index.d.ts +3 -0
  59. package/lib/services/auth/index.d.ts.map +1 -0
  60. package/lib/services/auth/index.js +21 -0
  61. package/lib/services/auth/index.js.map +1 -0
  62. package/lib/services/auth/types.d.ts +65 -0
  63. package/lib/services/auth/types.d.ts.map +1 -0
  64. package/lib/{types/fronthost.js → services/auth/types.js} +1 -1
  65. package/lib/services/auth/types.js.map +1 -0
  66. package/lib/{service → services/delivery-stream}/DeliveryStreamService.d.ts +13 -79
  67. package/lib/services/delivery-stream/DeliveryStreamService.d.ts.map +1 -0
  68. package/lib/{service → services/delivery-stream}/DeliveryStreamService.js +12 -85
  69. package/lib/services/delivery-stream/DeliveryStreamService.js.map +1 -0
  70. package/lib/services/delivery-stream/index.d.ts +3 -0
  71. package/lib/services/delivery-stream/index.d.ts.map +1 -0
  72. package/lib/services/delivery-stream/index.js +21 -0
  73. package/lib/services/delivery-stream/index.js.map +1 -0
  74. package/lib/{types/delivery-stream.d.ts → services/delivery-stream/types.d.ts} +1 -0
  75. package/lib/services/delivery-stream/types.d.ts.map +1 -0
  76. package/lib/services/delivery-stream/types.js +3 -0
  77. package/lib/services/delivery-stream/types.js.map +1 -0
  78. package/lib/services/ez-ability/EzAbilityService.d.ts +39 -0
  79. package/lib/services/ez-ability/EzAbilityService.d.ts.map +1 -0
  80. package/lib/services/ez-ability/EzAbilityService.js +112 -0
  81. package/lib/services/ez-ability/EzAbilityService.js.map +1 -0
  82. package/lib/services/ez-ability/index.d.ts +3 -0
  83. package/lib/services/ez-ability/index.d.ts.map +1 -0
  84. package/lib/services/ez-ability/index.js +21 -0
  85. package/lib/services/ez-ability/index.js.map +1 -0
  86. package/lib/{types/ez-ability.d.ts → services/ez-ability/types.d.ts} +1 -34
  87. package/lib/services/ez-ability/types.d.ts.map +1 -0
  88. package/lib/{types/ez-ability.js → services/ez-ability/types.js} +1 -3
  89. package/lib/services/ez-ability/types.js.map +1 -0
  90. package/lib/services/file/FileService.d.ts +39 -0
  91. package/lib/services/file/FileService.d.ts.map +1 -0
  92. package/lib/{service → services/file}/FileService.js +11 -134
  93. package/lib/services/file/FileService.js.map +1 -0
  94. package/lib/services/file/index.d.ts +3 -0
  95. package/lib/services/file/index.d.ts.map +1 -0
  96. package/lib/services/file/index.js +21 -0
  97. package/lib/services/file/index.js.map +1 -0
  98. package/lib/{types/file.d.ts → services/file/types.d.ts} +1 -16
  99. package/lib/services/file/types.d.ts.map +1 -0
  100. package/lib/services/file/types.js +3 -0
  101. package/lib/services/file/types.js.map +1 -0
  102. package/lib/services/fronthost/FrontHostService.d.ts +24 -0
  103. package/lib/services/fronthost/FrontHostService.d.ts.map +1 -0
  104. package/lib/{service → services/fronthost}/FrontHostService.js +9 -36
  105. package/lib/services/fronthost/FrontHostService.js.map +1 -0
  106. package/lib/services/fronthost/index.d.ts +3 -0
  107. package/lib/services/fronthost/index.d.ts.map +1 -0
  108. package/lib/services/fronthost/index.js +21 -0
  109. package/lib/services/fronthost/index.js.map +1 -0
  110. package/lib/{types/fronthost.d.ts → services/fronthost/types.d.ts} +1 -16
  111. package/lib/services/fronthost/types.d.ts.map +1 -0
  112. package/lib/services/fronthost/types.js +3 -0
  113. package/lib/services/fronthost/types.js.map +1 -0
  114. package/lib/services/im/ImService.d.ts +18 -0
  115. package/lib/services/im/ImService.d.ts.map +1 -0
  116. package/lib/{service → services/im}/ImService.js +9 -18
  117. package/lib/services/im/ImService.js.map +1 -0
  118. package/lib/services/im/index.d.ts +3 -0
  119. package/lib/services/im/index.d.ts.map +1 -0
  120. package/lib/services/im/index.js +21 -0
  121. package/lib/services/im/index.js.map +1 -0
  122. package/lib/{types/im.d.ts → services/im/types.d.ts} +1 -4
  123. package/lib/services/im/types.d.ts.map +1 -0
  124. package/lib/services/im/types.js +3 -0
  125. package/lib/services/im/types.js.map +1 -0
  126. package/lib/services/index.d.ts +16 -0
  127. package/lib/services/index.d.ts.map +1 -0
  128. package/lib/services/index.js +32 -0
  129. package/lib/services/index.js.map +1 -0
  130. package/lib/{service → services/msg}/MsgService.d.ts +28 -10
  131. package/lib/services/msg/MsgService.d.ts.map +1 -0
  132. package/lib/services/msg/MsgService.js +91 -0
  133. package/lib/services/msg/MsgService.js.map +1 -0
  134. package/lib/services/msg/index.d.ts +3 -0
  135. package/lib/services/msg/index.d.ts.map +1 -0
  136. package/lib/services/msg/index.js +21 -0
  137. package/lib/services/msg/index.js.map +1 -0
  138. package/lib/{types/msg.d.ts → services/msg/types.d.ts} +23 -61
  139. package/lib/services/msg/types.d.ts.map +1 -0
  140. package/lib/services/msg/types.js +3 -0
  141. package/lib/services/msg/types.js.map +1 -0
  142. package/lib/{service → services/org}/OrgService.d.ts +13 -137
  143. package/lib/services/org/OrgService.d.ts.map +1 -0
  144. package/lib/{service → services/org}/OrgService.js +10 -144
  145. package/lib/services/org/OrgService.js.map +1 -0
  146. package/lib/services/org/index.d.ts +3 -0
  147. package/lib/services/org/index.d.ts.map +1 -0
  148. package/lib/services/org/index.js +21 -0
  149. package/lib/services/org/index.js.map +1 -0
  150. package/lib/{types/org.d.ts → services/org/types.d.ts} +2 -41
  151. package/lib/services/org/types.d.ts.map +1 -0
  152. package/lib/services/org/types.js +3 -0
  153. package/lib/services/org/types.js.map +1 -0
  154. package/lib/{service → services/provider}/ProviderService.d.ts +13 -9
  155. package/lib/services/provider/ProviderService.d.ts.map +1 -0
  156. package/lib/{service → services/provider}/ProviderService.js +9 -13
  157. package/lib/services/provider/ProviderService.js.map +1 -0
  158. package/lib/services/provider/index.d.ts +3 -0
  159. package/lib/services/provider/index.d.ts.map +1 -0
  160. package/lib/services/provider/index.js +21 -0
  161. package/lib/services/provider/index.js.map +1 -0
  162. package/lib/{types/provider.d.ts → services/provider/types.d.ts} +1 -0
  163. package/lib/services/provider/types.d.ts.map +1 -0
  164. package/lib/services/provider/types.js +3 -0
  165. package/lib/services/provider/types.js.map +1 -0
  166. package/lib/{service → services/token}/TokenService.d.ts +13 -4
  167. package/lib/services/token/TokenService.d.ts.map +1 -0
  168. package/lib/{service → services/token}/TokenService.js +9 -8
  169. package/lib/services/token/TokenService.js.map +1 -0
  170. package/lib/services/token/index.d.ts +3 -0
  171. package/lib/services/token/index.d.ts.map +1 -0
  172. package/lib/services/token/index.js +21 -0
  173. package/lib/services/token/index.js.map +1 -0
  174. package/lib/{types/token.d.ts → services/token/types.d.ts} +1 -6
  175. package/lib/services/token/types.d.ts.map +1 -0
  176. package/lib/services/token/types.js +3 -0
  177. package/lib/services/token/types.js.map +1 -0
  178. package/lib/{service → services/usage}/UsageService.d.ts +13 -10
  179. package/lib/services/usage/UsageService.d.ts.map +1 -0
  180. package/lib/{service → services/usage}/UsageService.js +9 -10
  181. package/lib/services/usage/UsageService.js.map +1 -0
  182. package/lib/services/usage/index.d.ts +3 -0
  183. package/lib/services/usage/index.d.ts.map +1 -0
  184. package/lib/services/usage/index.js +21 -0
  185. package/lib/services/usage/index.js.map +1 -0
  186. package/lib/{types/usage.d.ts → services/usage/types.d.ts} +1 -0
  187. package/lib/services/usage/types.d.ts.map +1 -0
  188. package/lib/services/usage/types.js +3 -0
  189. package/lib/services/usage/types.js.map +1 -0
  190. package/lib/{service → services/user}/UserService.d.ts +13 -4
  191. package/lib/services/user/UserService.d.ts.map +1 -0
  192. package/lib/{service → services/user}/UserService.js +10 -15
  193. package/lib/services/user/UserService.js.map +1 -0
  194. package/lib/services/user/index.d.ts +3 -0
  195. package/lib/services/user/index.d.ts.map +1 -0
  196. package/lib/services/user/index.js +21 -0
  197. package/lib/services/user/index.js.map +1 -0
  198. package/lib/{types/user.d.ts → services/user/types.d.ts} +1 -15
  199. package/lib/services/user/types.d.ts.map +1 -0
  200. package/lib/services/user/types.js +3 -0
  201. package/lib/services/user/types.js.map +1 -0
  202. package/lib/types/common.d.ts +38 -0
  203. package/lib/types/common.d.ts.map +1 -0
  204. package/lib/types/common.js +3 -0
  205. package/lib/types/common.js.map +1 -0
  206. package/lib/types/config.d.ts +31 -0
  207. package/lib/types/config.d.ts.map +1 -0
  208. package/lib/types/config.js +3 -0
  209. package/lib/types/config.js.map +1 -0
  210. package/lib/types/index.d.ts +4 -67
  211. package/lib/types/index.d.ts.map +1 -0
  212. package/lib/types/index.js +4 -4
  213. package/lib/types/index.js.map +1 -0
  214. package/lib/types/service-contract.d.ts +25 -0
  215. package/lib/types/service-contract.d.ts.map +1 -0
  216. package/lib/types/{delivery-stream.js → service-contract.js} +1 -1
  217. package/lib/types/service-contract.js.map +1 -0
  218. package/package.json +25 -28
  219. package/README.MD +0 -717
  220. package/lib/client/index.d.ts +0 -46
  221. package/lib/client/index.js +0 -179
  222. package/lib/service/AuditLogService.d.ts +0 -29
  223. package/lib/service/AuthService.d.ts +0 -43
  224. package/lib/service/EzAbilityService.d.ts +0 -165
  225. package/lib/service/EzAbilityService.js +0 -241
  226. package/lib/service/FileService.d.ts +0 -149
  227. package/lib/service/FrontHostService.d.ts +0 -45
  228. package/lib/service/ImService.d.ts +0 -24
  229. package/lib/service/MsgService.js +0 -116
  230. package/lib/types/file.js +0 -4
  231. package/lib/types/im.js +0 -4
  232. package/lib/types/msg.js +0 -2
  233. package/lib/types/org.js +0 -4
  234. package/lib/types/provider.js +0 -2
  235. package/lib/types/token.js +0 -2
  236. package/lib/types/usage.js +0 -2
  237. package/lib/types/user.js +0 -2
  238. package/lib/utils/snakeCase.d.ts +0 -4
  239. package/lib/utils/snakeCase.js +0 -28
package/README.md ADDED
@@ -0,0 +1,293 @@
1
+ # qing-client
2
+
3
+ Qing 平台统一 SDK - 插件化架构 (v2)
4
+
5
+ ---
6
+
7
+ ## 特性
8
+
9
+ - **插件化架构**:服务按需注册,类似 Vue.use() / Fastify.register()
10
+ - **完整类型推导**:通过 Module Augmentation 实现类型自动补全
11
+ - **前后端统一**:一套 SDK 支持前端(网关)和后端(直连)两种模式
12
+ - **自动 Token 管理**:全局 setToken/clearToken 自动同步到所有服务
13
+ - **服务隔离**:每个服务独立目录,互不影响
14
+
15
+ ---
16
+
17
+ ## 安装
18
+
19
+ ```bash
20
+ npm install qing-client
21
+ ```
22
+
23
+ ---
24
+
25
+ ## 快速开始
26
+
27
+ ### 前端模式
28
+
29
+ ```typescript
30
+ import {
31
+ Client,
32
+ AuthService,
33
+ MsgService,
34
+ AiService,
35
+ ImService
36
+ } from 'qing-client';
37
+
38
+ // 创建客户端并注册需要的服务
39
+ const client = new Client({
40
+ gatewayUrl: 'https://api.example.com',
41
+ projectId: 'your-project-id',
42
+ appId: 'your-app-id',
43
+ })
44
+ .use(AuthService)
45
+ .use(MsgService)
46
+ .use(AiService)
47
+ .use(ImService);
48
+
49
+ // 登录
50
+ const loginRes = await client.services.auth.loginJson({
51
+ username: 'user',
52
+ password: 'pass',
53
+ });
54
+
55
+ // 设置 Token(全局生效)
56
+ await client.setToken(loginRes.access_token);
57
+
58
+ // 使用服务(完整类型推导)
59
+ const messages = await client.services.msg.getMessages({ isRead: false });
60
+ const groups = await client.services.im.listGroups();
61
+ ```
62
+
63
+ ### 后端模式
64
+
65
+ ```typescript
66
+ import { Client, AuthService, MsgService } from 'qing-client';
67
+
68
+ const client = new Client({
69
+ authServiceUrl: 'http://auth-service',
70
+ msgServiceUrl: 'http://msg-service',
71
+ userContext: {
72
+ userId: '123',
73
+ role: 'ADMIN',
74
+ projectId: 'project-1',
75
+ },
76
+ })
77
+ .use(AuthService)
78
+ .use(MsgService);
79
+
80
+ await client.setToken('xxx');
81
+ ```
82
+
83
+ ---
84
+
85
+ ## 可用服务(17 个)
86
+
87
+ ### 核心服务
88
+
89
+ | 服务 | 说明 | 注册名 |
90
+ |------|------|--------|
91
+ | AuthService | 认证与登录 | `auth` |
92
+ | MsgService | 消息中心 | `msg` |
93
+ | UserService | 用户管理 | `user` |
94
+ | TokenService | Token 管理(微信等) | `token` |
95
+ | FileService | 文件服务 | `file` / `files` |
96
+
97
+ ### AI 相关
98
+
99
+ | 服务 | 说明 | 注册名 |
100
+ |------|------|--------|
101
+ | AiService | AI 对话/会话 | `ai` |
102
+ | AigcService | AIGC 能力 | `aigc` |
103
+ | ProviderService | 大模型供应商 | `providers` |
104
+ | UsageService | 用量统计 | `providers` |
105
+
106
+ ### 业务服务
107
+
108
+ | 服务 | 说明 | 注册名 |
109
+ |------|------|--------|
110
+ | AuditLogService | 审计日志 | `logs` |
111
+ | FrontHostService | 静态 HTML 托管 | `gateway-h5` |
112
+ | OrgService | 组织与多租户 | `org` |
113
+ | DeliveryStreamService | 投递流 | `delivery-stream` |
114
+ | EzAbilityService | Ez AI 能力 | `ez-ability` |
115
+ | ImService | IM 群组 | `im` |
116
+
117
+ ---
118
+
119
+ ## 插件注册
120
+
121
+ ### 链式注册
122
+
123
+ ```typescript
124
+ const client = new Client(config)
125
+ .use(AuthService)
126
+ .use(MsgService)
127
+ .use(FileService)
128
+ .use(AiService)
129
+ .use(ImService);
130
+ ```
131
+
132
+ ### 批量注册
133
+
134
+ ```typescript
135
+ import {
136
+ AuthService, MsgService, FileService,
137
+ AiService, ImService, OrgService
138
+ } from 'qing-client';
139
+
140
+ const client = new Client(config).useAll([
141
+ AuthService,
142
+ MsgService,
143
+ FileService,
144
+ AiService,
145
+ ImService,
146
+ OrgService,
147
+ ]);
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Token 管理
153
+
154
+ ### 全局设置
155
+
156
+ ```typescript
157
+ // 设置 Token(自动同步到所有服务)
158
+ await client.setToken('your-token');
159
+
160
+ // 清除 Token
161
+ await client.clearToken();
162
+ ```
163
+
164
+ ### 自定义 Token 存储
165
+
166
+ ```typescript
167
+ const client = new Client({
168
+ gatewayUrl: '...',
169
+ tokenStorage: {
170
+ async getToken() {
171
+ return localStorage.getItem('token') || undefined;
172
+ },
173
+ async setToken(token) {
174
+ localStorage.setItem('token', token);
175
+ },
176
+ async clearToken() {
177
+ localStorage.removeItem('token');
178
+ },
179
+ },
180
+ });
181
+ ```
182
+
183
+ ---
184
+
185
+ ## 多租户支持
186
+
187
+ ### 前端模式
188
+
189
+ ```typescript
190
+ // 方式一:初始化时配置
191
+ const client = new Client({
192
+ gatewayUrl: '...',
193
+ projectId: 'project-1',
194
+ orgId: 'org-1',
195
+ appId: 'app-1',
196
+ });
197
+
198
+ // 方式二:运行时设置
199
+ client.setProjectOrgApp('project-1', 'org-1', 'app-1');
200
+ ```
201
+
202
+ ### 后端模式
203
+
204
+ ```typescript
205
+ client.setUserContext({
206
+ userId: '123',
207
+ role: 'ADMIN',
208
+ projectId: 'project-1',
209
+ orgId: 'org-1',
210
+ appId: 'app-1',
211
+ });
212
+ ```
213
+
214
+ ---
215
+
216
+ ## 新增服务
217
+
218
+ 参见 [SDK-GENERATION.md](./docs/SDK-GENERATION.md)
219
+
220
+ 1. 在 `src/services/{name}/` 创建服务目录
221
+ 2. 生成 `types.ts` 和 `{Name}Service.ts`
222
+ 3. 在 `src/services/index.ts` 和 `src/index.ts` 添加导出
223
+ 4. 使用方通过 `.use(YourService)` 注册
224
+
225
+ ---
226
+
227
+ ## 目录结构
228
+
229
+ ```
230
+ src/
231
+ ├── core/ # 核心框架
232
+ │ ├── Client.ts # 主客户端(插件注册)
233
+ │ ├── BaseClient.ts # 服务基类
234
+ │ └── index.ts
235
+ ├── types/ # 公共类型和契约
236
+ │ ├── common.ts # 通用类型
237
+ │ ├── config.ts # 配置类型
238
+ │ ├── service-contract.ts # 服务契约
239
+ │ └── index.ts
240
+ ├── services/ # 服务目录(17 个服务)
241
+ │ ├── auth/ # 认证服务
242
+ │ ├── msg/ # 消息服务
243
+ │ ├── user/ # 用户服务
244
+ │ ├── token/ # Token 服务
245
+ │ ├── file/ # 文件服务
246
+ │ ├── ai/ # AI 服务
247
+ │ ├── aigc/ # AIGC 服务
248
+ │ ├── provider/ # 供应商服务
249
+ │ ├── usage/ # 用量服务
250
+ │ ├── audit/ # 审计日志服务
251
+ │ ├── fronthost/ # 前端托管服务
252
+ │ ├── org/ # 组织服务
253
+ │ ├── delivery-stream/ # 投递流服务
254
+ │ ├── ez-ability/ # Ez 能力服务
255
+ │ ├── im/ # IM 服务
256
+ │ └── index.ts
257
+ ├── docs/
258
+ │ └── SDK-GENERATION.md # 生成指南
259
+ └── index.ts # 包入口
260
+ ```
261
+
262
+ ---
263
+
264
+ ## 开发
265
+
266
+ ```bash
267
+ # 安装依赖
268
+ npm install
269
+
270
+ # 构建
271
+ npm run build
272
+
273
+ # 开发模式
274
+ npm run dev
275
+ ```
276
+
277
+ ---
278
+
279
+ ## 与旧版对比
280
+
281
+ | 方面 | 旧版 (v0.x) | 新版 (v2.0) |
282
+ |------|------------|-------------|
283
+ | 新增服务 | 改 6+ 文件 | 改 2 文件 + 注册 |
284
+ | 类型推导 | 手动维护 | Module Augmentation 自动 |
285
+ | Token 管理 | 遍历硬编码 | 自动收集 TokenAware |
286
+ | 服务隔离 | 耦合在一起 | 完全独立目录 |
287
+ | 代码重复 | setToken 遍历 16 次 | 自动收集处理 |
288
+
289
+ ---
290
+
291
+ ## License
292
+
293
+ MIT
@@ -1,8 +1,8 @@
1
1
  import { AxiosInstance, RawAxiosRequestHeaders } from 'axios';
2
- import { UserContext, ClientConfig, RequestOptions, TokenStorage, PaginatedResponse } from '../types';
3
- export declare abstract class BaseClient {
2
+ import { UserContext, ClientConfig, RequestOptions, TokenStorage, PaginatedResponse, BaseService } from '../types';
3
+ export declare abstract class BaseClient implements BaseService {
4
4
  protected config: ClientConfig;
5
- protected serviceName: string;
5
+ protected servicePath: string;
6
6
  protected axiosInstance: AxiosInstance;
7
7
  protected isFrontendMode: boolean;
8
8
  protected serviceBasePath: string;
@@ -11,19 +11,21 @@ export declare abstract class BaseClient {
11
11
  protected orgId?: string;
12
12
  protected appId?: string;
13
13
  protected userContext?: UserContext;
14
- constructor(config: ClientConfig, serviceName: string);
15
- initUserContext(context: UserContext): RawAxiosRequestHeaders;
14
+ abstract get serviceName(): string;
15
+ constructor(config: ClientConfig, servicePath: string, tokenStorage?: TokenStorage);
16
+ protected initUserContextHeaders(context: UserContext): RawAxiosRequestHeaders;
16
17
  setUserContext(context: UserContext): this;
17
18
  setProjectId(projectId: string): this;
18
19
  setAppId(appId: string): this;
19
- setProjectAndApp(projectId: string, appId: string): this;
20
20
  setOrgId(orgId: string): this;
21
+ setProjectAndApp(projectId: string, appId: string): this;
21
22
  setProjectOrgApp(projectId: string, orgId: string, appId: string): this;
22
23
  setTokenStorage(storage: TokenStorage): this;
23
- private getBaseUrl;
24
24
  setToken(token: string): Promise<void>;
25
25
  clearToken(): Promise<void>;
26
+ protected getBaseUrl(): string;
26
27
  protected request<T>(path: string, options?: RequestOptions): Promise<T>;
27
28
  protected paginatedRequest<T>(path: string, options?: RequestOptions): Promise<PaginatedResponse<T>>;
28
29
  private handleApiError;
29
30
  }
31
+ //# sourceMappingURL=BaseClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseClient.d.ts","sourceRoot":"","sources":["../../src/core/BaseClient.ts"],"names":[],"mappings":"AAEA,OAAc,EAAE,aAAa,EAAc,sBAAsB,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,YAAY,EAEZ,iBAAiB,EACjB,WAAW,EACZ,MAAM,UAAU,CAAC;AAsBlB,8BAAsB,UAAW,YAAW,WAAW;IAoBnD,SAAS,CAAC,MAAM,EAAE,YAAY;IAC9B,SAAS,CAAC,WAAW,EAAE,MAAM;IApB/B,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACvC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC;IAClC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IAGrC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAGzB,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IAKpC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC;gBAGvB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EAC7B,YAAY,CAAC,EAAE,YAAY;IAsD7B,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,sBAAsB;IAoB9E,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAW1C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUxD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAgBvE,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAQtC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,SAAS,CAAC,UAAU,IAAI,MAAM;cAmBd,OAAO,CAAC,CAAC,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAkC,GAC1C,OAAO,CAAC,CAAC,CAAC;cA8CG,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAkC,GAC1C,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA4ChC,OAAO,CAAC,cAAc;CA8BvB"}
@@ -1,12 +1,10 @@
1
1
  "use strict";
2
- // client/npm/src/client/BaseClient.ts
3
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
4
  };
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
6
  exports.BaseClient = void 0;
8
7
  const axios_1 = __importDefault(require("axios"));
9
- // 默认内存存储实现
10
8
  const memoryTokenStorage = {
11
9
  token: undefined,
12
10
  async getToken() {
@@ -17,62 +15,52 @@ const memoryTokenStorage = {
17
15
  },
18
16
  async clearToken() {
19
17
  this.token = undefined;
20
- }
18
+ },
21
19
  };
22
20
  class BaseClient {
23
- constructor(config, serviceName) {
21
+ constructor(config, servicePath, tokenStorage) {
24
22
  this.config = config;
25
- this.serviceName = serviceName;
23
+ this.servicePath = servicePath;
26
24
  this.isFrontendMode = !!config.gatewayUrl;
27
- this.serviceBasePath = `/api/${serviceName}`;
28
- // 根据模式设置不同的配置
25
+ this.serviceBasePath = `/api/${servicePath}`;
29
26
  if (this.isFrontendMode) {
30
- // 前端模式:使用项目、组织和应用ID
31
27
  this.projectId = config.projectId;
32
28
  this.orgId = config.orgId;
33
29
  this.appId = config.appId;
34
30
  }
35
31
  else {
36
- // 后端模式:使用用户上下文
37
32
  this.userContext = config.userContext;
38
33
  }
39
- // 设置令牌存储
40
- this.tokenStorage = config.tokenStorage || memoryTokenStorage;
41
- // 创建Axios实例
34
+ this.tokenStorage = tokenStorage || memoryTokenStorage;
42
35
  this.axiosInstance = axios_1.default.create({
43
36
  baseURL: this.getBaseUrl(),
44
- timeout: 30000,
37
+ timeout: config.timeout || 30000,
45
38
  headers: {
46
39
  'Content-Type': 'application/json',
47
- 'Accept': 'application/json'
48
- }
40
+ Accept: 'application/json',
41
+ },
49
42
  });
50
- // 添加请求拦截器 - 只处理认证令牌
51
- this.axiosInstance.interceptors.request.use(async (config) => {
52
- let headers = config.headers || {};
53
- // 只注入认证令牌(两种模式都需要)
43
+ this.axiosInstance.interceptors.request.use(async (axiosConfig) => {
44
+ let headers = axiosConfig.headers || {};
54
45
  const token = await this.tokenStorage.getToken();
55
46
  if (token) {
56
47
  headers['Authorization'] = `Bearer ${token}`;
57
48
  }
58
- // 合并自定义头
59
- if (config.headers) {
60
- Object.assign(headers, config.headers);
49
+ if (axiosConfig.headers) {
50
+ Object.assign(headers, axiosConfig.headers);
61
51
  }
62
52
  return {
63
- ...config,
64
- headers
53
+ ...axiosConfig,
54
+ headers,
65
55
  };
66
56
  });
67
57
  }
68
- // 后端模式:用户上下文相关方法
69
- initUserContext(context) {
58
+ initUserContextHeaders(context) {
70
59
  const headers = {
71
60
  'v-user-id': context.userId,
72
61
  'v-user-role': context.role,
73
- 'v-project-id': context.projectId
62
+ 'v-project-id': context.projectId,
74
63
  };
75
- // 可选字段
76
64
  if (context.orgId) {
77
65
  headers['v-org-id'] = context.orgId;
78
66
  }
@@ -90,7 +78,6 @@ class BaseClient {
90
78
  }
91
79
  return this;
92
80
  }
93
- // 前端模式:项目和应用相关方法
94
81
  setProjectId(projectId) {
95
82
  if (this.isFrontendMode) {
96
83
  this.projectId = projectId;
@@ -109,22 +96,22 @@ class BaseClient {
109
96
  }
110
97
  return this;
111
98
  }
112
- setProjectAndApp(projectId, appId) {
99
+ setOrgId(orgId) {
113
100
  if (this.isFrontendMode) {
114
- this.projectId = projectId;
115
- this.appId = appId;
101
+ this.orgId = orgId;
116
102
  }
117
103
  else {
118
- console.warn('setProjectAndApp() 仅在前端模式下有效');
104
+ console.warn('setOrgId() 仅在前端模式下有效');
119
105
  }
120
106
  return this;
121
107
  }
122
- setOrgId(orgId) {
108
+ setProjectAndApp(projectId, appId) {
123
109
  if (this.isFrontendMode) {
124
- this.orgId = orgId;
110
+ this.projectId = projectId;
111
+ this.appId = appId;
125
112
  }
126
113
  else {
127
- console.warn('setOrgId() 仅在前端模式下有效');
114
+ console.warn('setProjectAndApp() 仅在前端模式下有效');
128
115
  }
129
116
  return this;
130
117
  }
@@ -139,71 +126,48 @@ class BaseClient {
139
126
  }
140
127
  return this;
141
128
  }
142
- // 设置令牌存储(可在运行时更换存储策略)
143
129
  setTokenStorage(storage) {
144
130
  this.tokenStorage = storage;
145
131
  return this;
146
132
  }
147
- // 确定请求基础URL
148
- getBaseUrl() {
149
- if (this.isFrontendMode) {
150
- return this.config.gatewayUrl;
151
- }
152
- // 后端模式使用服务专属URL
153
- switch (this.serviceName) {
154
- case 'auth': return this.config.authServiceUrl;
155
- case 'msg': return this.config.msgServiceUrl;
156
- case 'users': return this.config.userServiceUrl;
157
- case 'file': return this.config.fileServiceUrl; // V1 兼容路由
158
- case 'files': return this.config.fileServiceUrl; // V2 新路由
159
- case 'survey': return this.config.surveyServiceUrl;
160
- case 'token': return this.config.tokenServiceUrl;
161
- case 'aigc': return this.config.aigcServiceUrl;
162
- case "logs": return this.config.auditLogServiceUrl;
163
- case "providers": return this.config.providerServiceUrl;
164
- case "org": return this.config.orgServiceUrl; // 组织感知服务
165
- case "gateway-h5": return this.config.gatewayH5ServiceUrl;
166
- case "ez-ability": return this.config.ezAbilityServiceUrl; // EzAI 能力服务
167
- case "im": return this.config.imServiceUrl; // IM 群组服务
168
- default: throw new Error(`Unsupported service: ${this.serviceName}`);
169
- }
170
- }
171
- // 设置认证令牌
172
133
  async setToken(token) {
173
134
  await this.tokenStorage.setToken(token);
174
135
  }
175
- // 清除认证令牌
176
136
  async clearToken() {
177
137
  await this.tokenStorage.clearToken();
178
138
  }
179
- // 统一请求方法
139
+ getBaseUrl() {
140
+ if (this.isFrontendMode) {
141
+ return this.config.gatewayUrl;
142
+ }
143
+ const urlKey = `${this.servicePath}ServiceUrl`;
144
+ const serviceUrl = this.config[urlKey];
145
+ if (!serviceUrl) {
146
+ throw new Error(`服务 ${this.servicePath} 的 URL 未配置,请在 ClientConfig 中设置 ${urlKey}`);
147
+ }
148
+ return serviceUrl;
149
+ }
180
150
  async request(path, options = { method: 'GET' }) {
181
151
  try {
182
152
  const fullPath = this.isFrontendMode
183
153
  ? `${this.serviceBasePath}${path}`
184
154
  : path;
185
155
  let headers = options.headers || {};
186
- // 根据模式添加不同的头信息
187
156
  if (this.isFrontendMode) {
188
- // 前端模式:添加项目、组织和应用ID头
189
157
  const projectId = options.projectId || this.projectId;
190
158
  const orgId = options.orgId || this.orgId;
191
159
  const appId = options.appId || this.appId;
192
- if (projectId) {
160
+ if (projectId)
193
161
  headers['x-project-id'] = projectId;
194
- }
195
- if (orgId) {
162
+ if (orgId)
196
163
  headers['x-org-id'] = orgId;
197
- }
198
- if (appId) {
164
+ if (appId)
199
165
  headers['x-app-id'] = appId;
200
- }
201
166
  }
202
167
  else {
203
- // 后端模式:添加用户上下文头
204
168
  const context = options.userContext || this.userContext;
205
169
  if (context) {
206
- headers = { ...headers, ...this.initUserContext(context) };
170
+ headers = { ...headers, ...this.initUserContextHeaders(context) };
207
171
  }
208
172
  }
209
173
  const response = await this.axiosInstance.request({
@@ -211,50 +175,38 @@ class BaseClient {
211
175
  method: options.method,
212
176
  headers,
213
177
  params: options.params,
214
- data: options.body
178
+ data: options.body,
215
179
  });
216
- console.log('Request URL:', this.getBaseUrl() + fullPath);
217
- console.log('Request params:', options.params);
218
- // 检查业务成功状态
219
180
  if (!response.data.success) {
220
- throw new Error(response.data.message || `业务请求失败`);
181
+ throw new Error(response.data.message || '业务请求失败');
221
182
  }
222
- // 返回实际数据
223
183
  return response.data.data;
224
184
  }
225
185
  catch (error) {
226
- // 明确返回错误处理
227
186
  return this.handleApiError(error, path);
228
187
  }
229
188
  }
230
- // 分页请求方法
231
189
  async paginatedRequest(path, options = { method: 'GET' }) {
232
190
  try {
233
191
  const fullPath = this.isFrontendMode
234
192
  ? `${this.serviceBasePath}${path}`
235
193
  : path;
236
194
  let headers = options.headers || {};
237
- // 根据模式添加不同的头信息
238
195
  if (this.isFrontendMode) {
239
- // 前端模式:添加项目、组织和应用ID头
240
196
  const projectId = options.projectId || this.projectId;
241
197
  const orgId = options.orgId || this.orgId;
242
198
  const appId = options.appId || this.appId;
243
- if (projectId) {
199
+ if (projectId)
244
200
  headers['x-project-id'] = projectId;
245
- }
246
- if (orgId) {
201
+ if (orgId)
247
202
  headers['x-org-id'] = orgId;
248
- }
249
- if (appId) {
203
+ if (appId)
250
204
  headers['x-app-id'] = appId;
251
- }
252
205
  }
253
206
  else {
254
- // 后端模式:添加用户上下文头
255
207
  const context = options.userContext || this.userContext;
256
208
  if (context) {
257
- headers = { ...headers, ...this.initUserContext(context) };
209
+ headers = { ...headers, ...this.initUserContextHeaders(context) };
258
210
  }
259
211
  }
260
212
  const response = await this.axiosInstance.request({
@@ -262,25 +214,21 @@ class BaseClient {
262
214
  method: options.method,
263
215
  headers,
264
216
  params: options.params,
265
- data: options.body
217
+ data: options.body,
266
218
  });
267
- // 检查业务成功状态
268
219
  if (!response.data.success) {
269
- throw new Error(response.data.message || `业务请求失败`);
220
+ throw new Error('业务请求失败');
270
221
  }
271
- // 返回分页数据
272
222
  return response.data;
273
223
  }
274
224
  catch (error) {
275
225
  return this.handleApiError(error, path);
276
226
  }
277
227
  }
278
- // 统一错误处理方法
279
228
  handleApiError(error, path) {
280
229
  let errorMessage = `[${this.serviceName}服务] `;
281
230
  if (error.response) {
282
231
  const responseData = error.response.data;
283
- // 尝试从响应体中提取错误信息
284
232
  if (responseData?.message) {
285
233
  errorMessage += responseData.message;
286
234
  }
@@ -290,7 +238,6 @@ class BaseClient {
290
238
  else {
291
239
  errorMessage += `请求失败,状态码: ${error.response.status}`;
292
240
  }
293
- // 添加详细错误信息(开发环境)
294
241
  if (process.env.NODE_ENV === 'development') {
295
242
  errorMessage += ` | 状态码: ${error.response.status}`;
296
243
  if (error.response.headers?.['x-request-id']) {
@@ -304,10 +251,9 @@ class BaseClient {
304
251
  else {
305
252
  errorMessage += error.message;
306
253
  }
307
- // 添加路径信息
308
254
  errorMessage += ` (路径: ${path})`;
309
- // 明确抛出错误
310
255
  throw new Error(errorMessage);
311
256
  }
312
257
  }
313
258
  exports.BaseClient = BaseClient;
259
+ //# sourceMappingURL=BaseClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseClient.js","sourceRoot":"","sources":["../../src/core/BaseClient.ts"],"names":[],"mappings":"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"}