@agentunion/fastaun-browser 0.4.9 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/_packed_docs/CHANGELOG.md +46 -0
- package/_packed_docs/INDEX.md +31 -14
- package/_packed_docs/KITE_DOCS_GUIDE.md +20 -14
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +244 -16
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +114 -28
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +7 -4
- package/_packed_docs/sdk/09-group-rpc-manual.md +238 -2
- package/_packed_docs/sdk/09-proxy-rpc-manual.md +231 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +354 -22
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +15 -11
- package/_packed_docs/sdk/INDEX.md +14 -8
- package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +214 -0
- package/_packed_docs/sdk/README.md +8 -6
- package/dist/bundle.js +1611 -48
- package/dist/client/delivery.d.ts +8 -1
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +241 -15
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.js +2 -2
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +29 -4
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +16 -2
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +131 -14
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/service-proxy.d.ts +219 -0
- package/dist/service-proxy.d.ts.map +1 -0
- package/dist/service-proxy.js +1321 -0
- package/dist/service-proxy.js.map +1 -0
- package/dist/transport.d.ts +2 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +34 -0
- package/dist/transport.js.map +1 -1
- package/dist/v2/e2ee/encrypt-p2p.js +1 -1
- package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
- package/dist/v2/session/keystore.d.ts.map +1 -1
- package/dist/v2/session/keystore.js +8 -9
- package/dist/v2/session/keystore.js.map +1 -1
- package/dist/v2/session/session.d.ts +4 -2
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +20 -4
- package/dist/v2/session/session.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Service Proxy — RPC Manual
|
|
2
|
+
|
|
3
|
+
## 方法索引
|
|
4
|
+
|
|
5
|
+
### Gateway 控制面方法
|
|
6
|
+
|
|
7
|
+
| 方法 | 说明 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| [proxy.register_services](#proxyregister_services) | 注册当前 Gateway 长连接可提供的 Service Proxy 服务列表 |
|
|
10
|
+
| [proxy.unregister_services](#proxyunregister_services) | 注销当前 Gateway 长连接上的部分或全部服务列表 |
|
|
11
|
+
| [proxy.list_services](#proxylist_services) | 查询当前 Gateway 长连接已注册的服务列表 |
|
|
12
|
+
|
|
13
|
+
### proxy-server 数据面隧道消息
|
|
14
|
+
|
|
15
|
+
| 消息 | 方向 | 说明 |
|
|
16
|
+
|------|------|------|
|
|
17
|
+
| [register_services](#register_services-隧道消息) | proxy-client → proxy-server | proxy-server 隧道认证后注册本连接的数据面服务列表 |
|
|
18
|
+
| `register_services_ack` | proxy-server → proxy-client | 数据面服务注册成功确认 |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 控制面与数据面
|
|
23
|
+
|
|
24
|
+
Service Proxy 有两层注册,二者都必须存在:
|
|
25
|
+
|
|
26
|
+
- **Gateway 控制面**:provider 的 AUN 长连接调用 `proxy.register_services`,Gateway 记录该 provider 在线且声明了哪些服务。proxy-server 用它判断 provider 是否在线、目标服务是否声明、是否应该 wakeup。
|
|
27
|
+
- **proxy-server 数据面**:proxy-client 连接 proxy-server 的 `/ws/client` 并完成认证后,必须再发送 `register_services` 隧道消息。proxy-server 只会向本地已注册目标服务的数据面连接转发请求。
|
|
28
|
+
|
|
29
|
+
服务列表与连接绑定。Gateway 长连接断开后,Gateway 上的服务列表立即失效;proxy-server 隧道断开后,proxy-server 上的服务列表立即失效。
|
|
30
|
+
|
|
31
|
+
同一个 provider AID 可以有多个实例连接,但所有实例注册的服务摘要必须一致。若同一 provider AID 的第二条连接注册了不同服务列表,服务端应拒绝该次注册并返回 `proxy_services_inconsistent`。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 服务摘要
|
|
36
|
+
|
|
37
|
+
服务摘要只描述可公开发现的服务能力,不包含本地 endpoint。
|
|
38
|
+
|
|
39
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
40
|
+
|------|------|------|------|
|
|
41
|
+
| `service_name` | string | 是 | 服务名,建议使用 `[a-z0-9_-]+` |
|
|
42
|
+
| `service_type` | string | 否 | 服务类型,默认 `http`;常见值为 `http` / `websocket` / `sse` / `mcp` |
|
|
43
|
+
| `visibility` | string | 否 | 可见性,默认 `private` |
|
|
44
|
+
| `metadata` | object | 否 | 非敏感描述信息。服务端会移除 token、secret、endpoint、url、cookie、key、cert 等敏感字段 |
|
|
45
|
+
|
|
46
|
+
Python `ServiceProxyClient.register_service()` 会保存本地 endpoint,但 `list_service_summaries()`、Gateway 注册和 proxy-server 注册只发送摘要。
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## proxy.register_services
|
|
51
|
+
|
|
52
|
+
注册当前 Gateway 长连接提供的 Service Proxy 服务列表。服务端必须以连接认证得到的 AID 作为 provider AID,不能信任客户端传入的 `provider_aid` 覆盖认证身份。
|
|
53
|
+
|
|
54
|
+
### 参数
|
|
55
|
+
|
|
56
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
57
|
+
|------|------|------|------|
|
|
58
|
+
| `provider_aid` | string | 否 | 兼容字段或诊断字段;服务端以认证身份为准 |
|
|
59
|
+
| `services` | array | 是 | 服务摘要列表 |
|
|
60
|
+
|
|
61
|
+
### 响应
|
|
62
|
+
|
|
63
|
+
| 字段 | 类型 | 说明 |
|
|
64
|
+
|------|------|------|
|
|
65
|
+
| `ok` | boolean | 固定为 `true` |
|
|
66
|
+
| `provider_aid` | string | 认证后的 provider AID |
|
|
67
|
+
| `connection_id` | string | Gateway 连接 ID |
|
|
68
|
+
| `count` | integer | 已注册服务数量 |
|
|
69
|
+
| `services` | array | 服务端清洗后的服务摘要列表 |
|
|
70
|
+
|
|
71
|
+
### 示例
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
result = await client.call("proxy.register_services", {
|
|
75
|
+
"services": [
|
|
76
|
+
{
|
|
77
|
+
"service_name": "fileshare",
|
|
78
|
+
"service_type": "http",
|
|
79
|
+
"visibility": "public",
|
|
80
|
+
"metadata": {"label": "Files"},
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
})
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 错误
|
|
87
|
+
|
|
88
|
+
| JSON-RPC code | message | 原因 |
|
|
89
|
+
|---------------|---------|------|
|
|
90
|
+
| -32602 | `proxy service registration requires a long connection` | 短连接不能注册 Service Proxy 服务 |
|
|
91
|
+
| -32020 | `proxy_services_inconsistent` | 同一 provider AID 的已有连接注册了不一致的服务列表 |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## proxy.unregister_services
|
|
96
|
+
|
|
97
|
+
注销当前 Gateway 长连接上的部分或全部服务。
|
|
98
|
+
|
|
99
|
+
### 参数
|
|
100
|
+
|
|
101
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
102
|
+
|------|------|------|------|
|
|
103
|
+
| `service_names` | array | 否 | 要注销的服务名列表;省略时注销当前连接上的全部服务 |
|
|
104
|
+
| `service_name` | string | 否 | 单服务兼容字段 |
|
|
105
|
+
|
|
106
|
+
### 响应
|
|
107
|
+
|
|
108
|
+
| 字段 | 类型 | 说明 |
|
|
109
|
+
|------|------|------|
|
|
110
|
+
| `ok` | boolean | 固定为 `true` |
|
|
111
|
+
| `provider_aid` | string | 认证后的 provider AID |
|
|
112
|
+
| `connection_id` | string | Gateway 连接 ID |
|
|
113
|
+
| `removed` | array | 实际移除的服务名 |
|
|
114
|
+
| `count` | integer | 剩余服务数量;全部注销时可省略 |
|
|
115
|
+
|
|
116
|
+
### 示例
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
await client.call("proxy.unregister_services", {
|
|
120
|
+
"service_names": ["fileshare"],
|
|
121
|
+
})
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## proxy.list_services
|
|
127
|
+
|
|
128
|
+
查询当前 Gateway 长连接已注册的 Service Proxy 服务列表。
|
|
129
|
+
|
|
130
|
+
### 参数
|
|
131
|
+
|
|
132
|
+
无有效参数。`provider_aid` 若存在,也只能作为兼容字段;服务端以当前连接身份为准。
|
|
133
|
+
|
|
134
|
+
### 响应
|
|
135
|
+
|
|
136
|
+
| 字段 | 类型 | 说明 |
|
|
137
|
+
|------|------|------|
|
|
138
|
+
| `provider_aid` | string | 当前连接认证后的 AID |
|
|
139
|
+
| `connection_id` | string | Gateway 连接 ID |
|
|
140
|
+
| `services` | array | 当前连接已注册的服务摘要列表 |
|
|
141
|
+
|
|
142
|
+
### 示例
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
current = await client.call("proxy.list_services", {})
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## register_services 隧道消息
|
|
151
|
+
|
|
152
|
+
proxy-client 连接 proxy-server `/ws/client` 并收到 `service_proxy_auth_response.ok=true` 后,必须立即发送 `register_services` 隧道消息。proxy-server 只根据这个数据面注册表选择实际转发连接。
|
|
153
|
+
|
|
154
|
+
### 请求
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"type": "register_services",
|
|
159
|
+
"request_id": "register-services",
|
|
160
|
+
"services": [
|
|
161
|
+
{
|
|
162
|
+
"service_name": "fileshare",
|
|
163
|
+
"service_type": "http",
|
|
164
|
+
"visibility": "public",
|
|
165
|
+
"metadata": {"label": "Files"}
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 成功响应
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{"type": "register_services_ack", "request_id": "register-services", "ok": true, "count": 1}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 失败响应
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"type": "service_proxy_error",
|
|
182
|
+
"request_id": "register-services",
|
|
183
|
+
"error": {
|
|
184
|
+
"code": "proxy_services_inconsistent",
|
|
185
|
+
"message": "provider service list is inconsistent with existing connections"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Python ServiceProxyClient
|
|
193
|
+
|
|
194
|
+
Python SDK 的 `ServiceProxyClient` 已封装双注册流程:
|
|
195
|
+
|
|
196
|
+
1. `connect_once()` / `serve_once()` / `serve_forever()` 建立 proxy-server 隧道前,会在存在 `aun_client.call()` 时自动调用 `proxy.register_services`。
|
|
197
|
+
2. proxy-server 连接地址必须通过 `/.well-known/aun-proxy` 发现:先读 provider AID SQLite metadata 中 1 小时 TTL 的 `service_proxy_discovery` 缓存;缓存缺失或过期时查询 `https://{provider_aid}/.well-known/aun-proxy`,失败后回退 `https://proxy.{issuer}/.well-known/aun-proxy`。应用不得传入、配置或硬拼 proxy-server URL。
|
|
198
|
+
3. proxy-server 隧道使用 AUN auth token 鉴权:优先复用 cached access token;缓存缺失或过期时,必须通过 `aun_client.authenticate()` 经 Gateway 两步登录刷新 token。
|
|
199
|
+
4. proxy-server 隧道认证成功后,会自动发送 `register_services` 隧道消息。
|
|
200
|
+
5. persistent 和 on-demand 重连时,每条新连接都会重新执行以上流程。
|
|
201
|
+
|
|
202
|
+
常用入口:
|
|
203
|
+
|
|
204
|
+
| 方法 | 说明 |
|
|
205
|
+
|------|------|
|
|
206
|
+
| `register_service(name, endpoint, service_type="http", visibility="private", metadata=None)` | 注册本地 embedded endpoint |
|
|
207
|
+
| `unregister_service(name)` | 移除本地 endpoint |
|
|
208
|
+
| `list_service_summaries()` | 返回可上报的服务摘要 |
|
|
209
|
+
| `register_services_with_gateway()` | 显式向 Gateway 注册控制面服务列表 |
|
|
210
|
+
| `unregister_services_from_gateway(names=None)` | 显式从 Gateway 注销控制面服务 |
|
|
211
|
+
| `list_gateway_services()` | 查询 Gateway 当前连接服务列表 |
|
|
212
|
+
| `register_services_with_proxy_server(ws)` | 通过已认证 proxy-server 隧道注册数据面服务列表 |
|
|
213
|
+
| `discover_proxy_server(force_refresh=False)` | 通过缓存 / well-known 发现 proxy-server |
|
|
214
|
+
| `serve_once()` / `serve_forever()` | 连接 proxy-server 并处理转发请求 |
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 路由与 wakeup 语义
|
|
219
|
+
|
|
220
|
+
proxy-server 收到 `https://proxy.{issuer}/{user_name}/{svc_name}` 或对应 WebSocket 请求时,应按以下顺序处理:
|
|
221
|
+
|
|
222
|
+
1. 本 proxy-server 已有 `(provider_aid, service_name)` 数据面连接:直接转发,并按 visitor/provider/service 维持稳定粘性。
|
|
223
|
+
2. provider 已连接本 proxy-server 且已注册服务列表,但没有目标服务:返回 `service_not_registered`,不 wakeup。
|
|
224
|
+
3. provider 未连接本 proxy-server:查询 Gateway 控制面。
|
|
225
|
+
4. Gateway 检查 provider AID 证书不存在:返回 `provider_aid_not_found`;证书查询失败:返回 `provider_aid_check_failed`。
|
|
226
|
+
5. Gateway 显示 provider 没有在线长连接:返回 `provider_offline`。
|
|
227
|
+
6. Gateway 显示 provider 在线但未声明目标服务:返回 `service_not_registered`,不 wakeup。
|
|
228
|
+
7. Gateway 显示 provider 在线且声明目标服务:仅向注册了该服务的 provider 连接发送 wakeup。
|
|
229
|
+
8. wakeup 已投递但本 proxy-server 等不到目标数据面隧道注册时,返回 `provider_wakeup_timeout`。
|
|
230
|
+
|
|
231
|
+
因此,只向 Gateway 注册不足以承载请求;只有 proxy-server 数据面也注册了目标服务,访问才会真正转发。
|
|
@@ -12,18 +12,51 @@
|
|
|
12
12
|
| [storage.delete_object](#storagedelete_object) | 删除对象 |
|
|
13
13
|
| [storage.list_objects](#storagelist_objects) | 列举对象 |
|
|
14
14
|
| [storage.list_prefixes](#storagelist_prefixes) | 列举子目录 |
|
|
15
|
-
| [storage.get_quota](#storageget_quota) | 查询配额 |
|
|
16
|
-
| [storage.get_limits](#storageget_limits) | 查询上传限制 |
|
|
17
|
-
| [storage.check_upload](#storagecheck_upload) | 上传预检(秒传检测 + 超限检测) |
|
|
18
|
-
|
|
19
|
-
###
|
|
20
|
-
|
|
21
|
-
| 方法 | 说明 |
|
|
15
|
+
| [storage.get_quota](#storageget_quota) | 查询配额 |
|
|
16
|
+
| [storage.get_limits](#storageget_limits) | 查询上传限制 |
|
|
17
|
+
| [storage.check_upload](#storagecheck_upload) | 上传预检(秒传检测 + 超限检测) |
|
|
18
|
+
|
|
19
|
+
### 目录树方法
|
|
20
|
+
|
|
21
|
+
| 方法 | 说明 |
|
|
22
|
+
|------|------|
|
|
23
|
+
| [storage.create_folder](#storagecreate_folder) | 创建目录 |
|
|
24
|
+
| [storage.get_folder](#storageget_folder) | 查询目录 |
|
|
25
|
+
| [storage.list_children](#storagelist_children) | 列出目录子节点 |
|
|
26
|
+
| [storage.rename_folder](#storagerename_folder) | 重命名目录 |
|
|
27
|
+
| [storage.move_folder](#storagemove_folder) | 移动目录 |
|
|
28
|
+
| [storage.delete_folder](#storagedelete_folder) | 删除目录 |
|
|
29
|
+
| [storage.resolve_path](#storageresolve_path) | 按路径解析节点 |
|
|
30
|
+
|
|
31
|
+
### 对象管理方法
|
|
32
|
+
|
|
33
|
+
| 方法 | 说明 |
|
|
34
|
+
|------|------|
|
|
35
|
+
| [storage.move_object](#storagemove_object) | 移动或重命名对象 |
|
|
36
|
+
| [storage.copy_object](#storagecopy_object) | 复制对象 |
|
|
37
|
+
| [storage.batch_delete](#storagebatch_delete) | 批量删除对象/目录 |
|
|
38
|
+
| [storage.batch_head_object](#storagebatch_head_object) | 批量查询对象元数据 |
|
|
39
|
+
| [storage.set_object_meta](#storageset_object_meta) | 更新对象元数据 |
|
|
40
|
+
| [storage.get_object_url](#storageget_object_url) | 获取稳定对象 URL |
|
|
41
|
+
| [storage.append_object](#storageappend_object) | 追加写对象 |
|
|
42
|
+
|
|
43
|
+
### 数据面协调方法
|
|
44
|
+
|
|
45
|
+
| 方法 | 说明 |
|
|
22
46
|
|------|------|
|
|
23
47
|
| [storage.create_upload_session](#storagecreate_upload_session) | 申请上传 URL |
|
|
24
48
|
| [storage.complete_upload](#storagecomplete_upload) | 确认上传完成 |
|
|
25
49
|
| [storage.create_download_ticket](#storagecreate_download_ticket) | 申请下载 URL |
|
|
26
50
|
|
|
51
|
+
### 分享方法
|
|
52
|
+
|
|
53
|
+
| 方法 | 说明 |
|
|
54
|
+
|------|------|
|
|
55
|
+
| [storage.create_share_link](#storagecreate_share_link) | 创建分享链接 |
|
|
56
|
+
| [storage.list_share_links](#storagelist_share_links) | 列举分享链接 |
|
|
57
|
+
| [storage.revoke_share_link](#storagerevoke_share_link) | 撤销分享链接 |
|
|
58
|
+
| [storage.get_by_share](#storageget_by_share) | 通过分享短码读取对象 |
|
|
59
|
+
|
|
27
60
|
---
|
|
28
61
|
|
|
29
62
|
> `object_key` 当前仅支持 ASCII 安全字符集合 `[A-Za-z0-9._/-]`,且不允许空路径段、`..`、反斜杠转义后的非法段。
|
|
@@ -51,6 +84,8 @@
|
|
|
51
84
|
|
|
52
85
|
| 字段 | 类型 | 说明 |
|
|
53
86
|
|------|------|------|
|
|
87
|
+
| `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/storage/{object_key}`,经 NameService 302 跳转到直链 |
|
|
88
|
+
| `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无跳转 |
|
|
54
89
|
| `owner_aid` | string | 所有者 AID |
|
|
55
90
|
| `bucket` | string | 存储桶 |
|
|
56
91
|
| `object_key` | string | 对象路径 |
|
|
@@ -246,9 +281,9 @@ for obj in result["items"]:
|
|
|
246
281
|
|
|
247
282
|
---
|
|
248
283
|
|
|
249
|
-
## storage.get_quota
|
|
250
|
-
|
|
251
|
-
查询存储配额。
|
|
284
|
+
## storage.get_quota
|
|
285
|
+
|
|
286
|
+
查询存储配额。
|
|
252
287
|
|
|
253
288
|
### 参数
|
|
254
289
|
|
|
@@ -263,13 +298,193 @@ for obj in result["items"]:
|
|
|
263
298
|
| `owner_aid` | string | 所有者 AID |
|
|
264
299
|
| `used_bytes` | integer | 已使用空间(字节) |
|
|
265
300
|
| `object_count` | integer | 对象数量 |
|
|
266
|
-
| `quota_bytes` | integer | 配额上限(字节),0 表示无限制 |
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## storage.
|
|
271
|
-
|
|
272
|
-
|
|
301
|
+
| `quota_bytes` | integer | 配额上限(字节),0 表示无限制 |
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## storage.create_folder
|
|
306
|
+
|
|
307
|
+
创建目录节点。目录和对象共用同一个 `bucket`,默认 bucket 为 `"default"`。
|
|
308
|
+
|
|
309
|
+
**参数**:
|
|
310
|
+
|
|
311
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
312
|
+
|------|------|------|------|
|
|
313
|
+
| `path` | string | 否 | 完整目录路径;提供时优先使用 |
|
|
314
|
+
| `name` | string | 否 | 目录名;未提供 `path` 时必填 |
|
|
315
|
+
| `parent_folder_id` | string | 否 | 父目录 ID |
|
|
316
|
+
| `parent_path` | string | 否 | 父目录路径,默认根目录 |
|
|
317
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
318
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
319
|
+
| `mkdirs` | boolean | 否 | 是否递归创建父目录 |
|
|
320
|
+
| `metadata` | object | 否 | 目录元数据 |
|
|
321
|
+
| `conflict_policy` | string | 否 | `"reject"` / `"return_existing"` |
|
|
322
|
+
|
|
323
|
+
**响应**:返回 `folder`,同时在顶层展开 `folder_id`、`path`、`name`、`parent_folder_id`、`version` 等字段。
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## storage.get_folder
|
|
328
|
+
|
|
329
|
+
查询目录节点。
|
|
330
|
+
|
|
331
|
+
**参数**:`folder_id` 或 `path` 至少提供一个;可选 `bucket`、`owner_aid`。
|
|
332
|
+
|
|
333
|
+
**响应**:同 `storage.create_folder` 的 `folder` 视图。
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## storage.list_children
|
|
338
|
+
|
|
339
|
+
列出目录下的直接子目录和对象。
|
|
340
|
+
|
|
341
|
+
**参数**:
|
|
342
|
+
|
|
343
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
344
|
+
|------|------|------|------|
|
|
345
|
+
| `folder_id` / `path` | string | 否 | 目标目录;都不传表示根目录 |
|
|
346
|
+
| `type` | string | 否 | `"all"` / `"folder"` / `"object"`,默认 `"all"` |
|
|
347
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
348
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
349
|
+
| `page` | integer | 否 | 页码,默认 1 |
|
|
350
|
+
| `size` | integer | 否 | 每页数量,最大受服务配置限制 |
|
|
351
|
+
| `order_by` | string | 否 | `"name"` / `"updated_at"` / `"size_bytes"` |
|
|
352
|
+
| `order` | string | 否 | `"asc"` / `"desc"` |
|
|
353
|
+
| `include_metadata` | boolean | 否 | 是否返回元数据,默认 `true` |
|
|
354
|
+
| `include_urls` | boolean | 否 | 是否返回 URL 字段,默认 `true` |
|
|
355
|
+
|
|
356
|
+
**响应**:`folder`、`items`、`total`、`page`、`size`、`next_marker`。`items[].node_type` 区分 `folder` / `object`。
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## storage.rename_folder
|
|
361
|
+
|
|
362
|
+
重命名目录。根目录不可改名。
|
|
363
|
+
|
|
364
|
+
**参数**:`folder_id` 或 `path`,`new_name` 必填;可选 `bucket`、`owner_aid`、`expected_version`。
|
|
365
|
+
|
|
366
|
+
**响应**:更新后的 `folder` 视图。
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## storage.move_folder
|
|
371
|
+
|
|
372
|
+
移动目录。不能移动到自身或自身子目录。
|
|
373
|
+
|
|
374
|
+
**参数**:`folder_id` 或 `path`,目标目录通过 `dst_parent_folder_id` 或 `dst_parent_path` 指定;可选 `new_name`、`bucket`、`owner_aid`、`expected_version`。
|
|
375
|
+
|
|
376
|
+
**响应**:更新后的 `folder` 视图。
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## storage.delete_folder
|
|
381
|
+
|
|
382
|
+
删除目录。
|
|
383
|
+
|
|
384
|
+
**参数**:
|
|
385
|
+
|
|
386
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
387
|
+
|------|------|------|------|
|
|
388
|
+
| `folder_id` / `path` | string | 是 | 待删除目录 |
|
|
389
|
+
| `recursive` | boolean | 否 | 非空目录必须传 `true` |
|
|
390
|
+
| `dry_run` | boolean | 否 | 只预览将删除的目录/对象 |
|
|
391
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
392
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
393
|
+
|
|
394
|
+
**响应**:`deleted_folders`、`deleted_objects`、`deleted_object_items`、`errors`;`dry_run=true` 时返回预览列表。
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## storage.resolve_path
|
|
399
|
+
|
|
400
|
+
按路径解析目录或对象。
|
|
401
|
+
|
|
402
|
+
**参数**:`path` 必填;可选 `expected_type`(`"any"` / `"object"` / `"folder"`)、`bucket`、`owner_aid`。
|
|
403
|
+
|
|
404
|
+
**响应**:`type`、`folder_id` 或 `object_id`、`path`、`status`。
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## storage.move_object
|
|
409
|
+
|
|
410
|
+
移动或重命名对象。
|
|
411
|
+
|
|
412
|
+
**参数**:对象选择器(`object_id` / `object_key` / `path`),目标目录 `dst_parent_folder_id` 或 `dst_parent_path`;可选 `new_name`、`conflict_policy`(`"reject"` / `"replace"` / `"keep_both"`)、`expected_version`。
|
|
413
|
+
|
|
414
|
+
**响应**:返回 `object`,同时在顶层展开对象视图字段。
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## storage.copy_object
|
|
419
|
+
|
|
420
|
+
复制对象,底层内容按 CAS 引用计数复用。
|
|
421
|
+
|
|
422
|
+
**参数**:源对象选择器(`object_id` / `object_key` / `path`,也接受 `src_object_key` / `src_path`),目标 `dst_object_key` / `dst_path` 或目标父目录 + `new_name`;可选 `conflict_policy`、`copy_metadata`。
|
|
423
|
+
|
|
424
|
+
**响应**:新对象视图。
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## storage.batch_delete
|
|
429
|
+
|
|
430
|
+
批量删除对象或目录。
|
|
431
|
+
|
|
432
|
+
**参数**:
|
|
433
|
+
|
|
434
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
435
|
+
|------|------|------|------|
|
|
436
|
+
| `items` | array | 否 | 每项含 `type`、`object_id` / `object_key` / `path` / `folder_id` |
|
|
437
|
+
| `object_keys` | string[] | 否 | 兼容简写,转为对象删除 |
|
|
438
|
+
| `recursive` | boolean | 否 | 删除目录时是否递归 |
|
|
439
|
+
| `dry_run` | boolean | 否 | 只预览 |
|
|
440
|
+
|
|
441
|
+
**响应**:`deleted`、`errors`、`deleted_count`、`summary`。
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## storage.batch_head_object
|
|
446
|
+
|
|
447
|
+
批量查询对象元数据。
|
|
448
|
+
|
|
449
|
+
**参数**:`object_ids`、`paths` 至少提供一类;可选 `owner_aid`、`bucket`、`include_missing`、`include_metadata`、`include_urls`。
|
|
450
|
+
|
|
451
|
+
**响应**:`items` 和 `errors`。
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## storage.set_object_meta
|
|
456
|
+
|
|
457
|
+
更新对象元数据和可选 MIME 类型。
|
|
458
|
+
|
|
459
|
+
**参数**:对象选择器,`metadata`;可选 `merge`(默认 `true`)、`content_type`、`expected_version`。
|
|
460
|
+
|
|
461
|
+
**响应**:更新后的对象视图。
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## storage.get_object_url
|
|
466
|
+
|
|
467
|
+
获取稳定对象 URL。
|
|
468
|
+
|
|
469
|
+
**参数**:对象选择器;可选 `include_path_url`。
|
|
470
|
+
|
|
471
|
+
**响应**:`object_id`、`object_url`、`path_url`、`stable`。
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## storage.append_object
|
|
476
|
+
|
|
477
|
+
向对象尾部追加 base64 内容;对象不存在时创建。
|
|
478
|
+
|
|
479
|
+
**参数**:与 `storage.put_object` 类似,`content` 必填;可选 `object_key` / `path` / `name`、`bucket`、`owner_aid`、`content_type`、`metadata`、`expected_version`、`is_private`。
|
|
480
|
+
|
|
481
|
+
**响应**:对象视图。
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## storage.create_upload_session
|
|
486
|
+
|
|
487
|
+
获取上传用 presigned URL。
|
|
273
488
|
|
|
274
489
|
### 参数
|
|
275
490
|
|
|
@@ -313,12 +528,13 @@ for obj in result["items"]:
|
|
|
313
528
|
| 参数 | 类型 | 必填 | 说明 |
|
|
314
529
|
|------|------|------|------|
|
|
315
530
|
| `object_key` | string | 是 | 对象路径 |
|
|
316
|
-
| `sha256` | string |
|
|
531
|
+
| `sha256` | string | 否 | 文件 SHA-256 哈希;提供则校验完整性,`skip_blob=true` 时必填 |
|
|
317
532
|
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
318
533
|
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
319
534
|
| `content_type` | string | 否 | MIME 类型,默认 `"application/octet-stream"` |
|
|
320
535
|
| `is_private` | boolean | 否 | 是否私有,默认 `true` |
|
|
321
536
|
| `size_bytes` | integer | 否 | 预期文件大小(用于校验) |
|
|
537
|
+
| `skip_blob` | boolean | 否 | 秒传模式,默认 `false`;为 `true` 时跳过 blob 上传,必须提供 `sha256` 且服务端已存在对应内容 |
|
|
322
538
|
| `expected_version` | integer | 否 | 乐观并发控制版本号 |
|
|
323
539
|
| `expire_in_seconds` | integer | 否 | 过期时间(秒) |
|
|
324
540
|
| `metadata` | object | 否 | 自定义元数据 |
|
|
@@ -327,6 +543,8 @@ for obj in result["items"]:
|
|
|
327
543
|
|
|
328
544
|
| 字段 | 类型 | 说明 |
|
|
329
545
|
|------|------|------|
|
|
546
|
+
| `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/storage/{object_key}`,经 NameService 302 跳转 |
|
|
547
|
+
| `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,无跳转 |
|
|
330
548
|
| `owner_aid` | string | 所有者 AID |
|
|
331
549
|
| `bucket` | string | 存储桶 |
|
|
332
550
|
| `object_key` | string | 对象路径 |
|
|
@@ -356,8 +574,10 @@ for obj in result["items"]:
|
|
|
356
574
|
|
|
357
575
|
| 字段 | 类型 | 说明 |
|
|
358
576
|
|------|------|------|
|
|
359
|
-
| `
|
|
360
|
-
| `
|
|
577
|
+
| `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/storage/{object_key}`,经 NameService 302 跳转 |
|
|
578
|
+
| `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无跳转 |
|
|
579
|
+
| `download_url` | string | 预签名下载 URL(有时效,签名形式由 BlobStore 后端决定) |
|
|
580
|
+
| `expire_at` | integer | `download_url` 的过期时间戳(Unix 秒) |
|
|
361
581
|
| `file_name` | string | 文件名(从 object_key 提取) |
|
|
362
582
|
| `size_bytes` | integer | 文件大小(字节) |
|
|
363
583
|
| `content_type` | string | MIME 类型 |
|
|
@@ -365,7 +585,7 @@ for obj in result["items"]:
|
|
|
365
585
|
| `version` | integer | 版本号 |
|
|
366
586
|
| `etag` | string | 实体标签 |
|
|
367
587
|
|
|
368
|
-
客户端获得 `download_url` 后,通过 HTTP GET
|
|
588
|
+
客户端获得 `download_url` 后,通过 HTTP GET 下载文件。`url` 为永久可分享的 AID 风格链接,`logical_url` 为无跳转直链。
|
|
369
589
|
|
|
370
590
|
> 当前实现会对 BlobStore 返回的 loopback URL 做对外地址规范化:优先使用 `KITE_STORAGE_EXTERNAL_URL`,否则按 `storage.{issuer}` 形式改写。对外地址不可使用 `127.0.0.1` 或 `localhost`。
|
|
371
591
|
|
|
@@ -486,7 +706,119 @@ else:
|
|
|
486
706
|
|
|
487
707
|
---
|
|
488
708
|
|
|
489
|
-
##
|
|
709
|
+
## storage.create_share_link
|
|
710
|
+
|
|
711
|
+
创建分享链接。生成一个短码(share_id),通过短码可访问对象,支持授权 AID 白名单、有效期、使用次数限制。
|
|
712
|
+
|
|
713
|
+
### 参数
|
|
714
|
+
|
|
715
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
716
|
+
|------|------|------|------|
|
|
717
|
+
| `object_key` | string | 是 | 被分享对象的路径 |
|
|
718
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
719
|
+
| `owner_aid` | string | 否 | 对象所有者 AID,默认当前用户(仅可分享自己的对象) |
|
|
720
|
+
| `allowed_aids` | string[] | 否 | 授权访问的 AID 列表,默认 `["*"]`(任意 AID 可访问);含 `"*"` 即视为公开 |
|
|
721
|
+
| `expire_in_seconds` | integer | 否 | 有效期(秒),默认 86400(1 天),`0` 表示永不过期 |
|
|
722
|
+
| `max_uses` | integer | 否 | 最大使用次数,默认 `0`(无限制) |
|
|
723
|
+
|
|
724
|
+
### 响应
|
|
725
|
+
|
|
726
|
+
| 字段 | 类型 | 说明 |
|
|
727
|
+
|------|------|------|
|
|
728
|
+
| `share_id` | string | 10 位 Base62 分享短码 |
|
|
729
|
+
| `aid_share_url` | string | **AID 风格分享 URL(默认/推荐)**:`https://{owner_aid}/storage/{share_id}`,体现分享者身份 |
|
|
730
|
+
| `share_url` | string | 直链分享 URL:`{base_url}/s/{share_id}`,兼容字段 |
|
|
731
|
+
| `expire_at` | integer | 过期时间戳(Unix 秒),`0` 表示永不过期 |
|
|
732
|
+
| `max_uses` | integer | 最大使用次数,`0` 表示无限制 |
|
|
733
|
+
| `allowed_aids` | string[] | 授权 AID 列表,`["*"]` 表示公开 |
|
|
734
|
+
|
|
735
|
+
> 访问 `aid_share_url` 时经 NameService 302 跳转到 `share_url`。share_id 是 10 位无斜杠 Base62,与 object_key 路径天然区分(object_key 含 `/` 或非 10 位)。
|
|
736
|
+
> share_id 指向 `(owner_aid, bucket, object_key)` 逻辑引用,非内容快照:对象改名/移动后原 share_id 失效,内容覆盖后下载到新内容。
|
|
737
|
+
|
|
738
|
+
### 示例
|
|
739
|
+
|
|
740
|
+
```python
|
|
741
|
+
result = await client.call("storage.create_share_link", {
|
|
742
|
+
"object_key": "docs/report.pdf",
|
|
743
|
+
"allowed_aids": ["alice.agentid.pub"],
|
|
744
|
+
"expire_in_seconds": 3600,
|
|
745
|
+
"max_uses": 5,
|
|
746
|
+
})
|
|
747
|
+
share_url = result["aid_share_url"]
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
---
|
|
751
|
+
|
|
752
|
+
## storage.list_share_links
|
|
753
|
+
|
|
754
|
+
列举分享链接,可按 bucket / object_key 过滤。仅返回当前用户自己创建的链接。
|
|
755
|
+
|
|
756
|
+
### 参数
|
|
757
|
+
|
|
758
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
759
|
+
|------|------|------|------|
|
|
760
|
+
| `bucket` | string | 否 | 按存储桶过滤 |
|
|
761
|
+
| `object_key` | string | 否 | 按对象路径过滤 |
|
|
762
|
+
|
|
763
|
+
### 响应
|
|
764
|
+
|
|
765
|
+
| 字段 | 类型 | 说明 |
|
|
766
|
+
|------|------|------|
|
|
767
|
+
| `links` | array | 分享链接列表 |
|
|
768
|
+
|
|
769
|
+
每个 link 包含:
|
|
770
|
+
|
|
771
|
+
| 字段 | 类型 | 说明 |
|
|
772
|
+
|------|------|------|
|
|
773
|
+
| `share_id` | string | 分享短码 |
|
|
774
|
+
| `aid_share_url` | string | AID 风格分享 URL(主字段) |
|
|
775
|
+
| `share_url` | string | 直链分享 URL(兼容) |
|
|
776
|
+
| `object_key` | string | 被分享对象路径 |
|
|
777
|
+
| `bucket` | string | 存储桶 |
|
|
778
|
+
| `allowed_aids` | string[] | 授权 AID 列表,`["*"]` 表示公开 |
|
|
779
|
+
| `expire_at` | integer | 过期时间戳(秒),`0` 表示永不过期 |
|
|
780
|
+
| `max_uses` | integer | 最大使用次数,`0` 表示无限制 |
|
|
781
|
+
| `used_count` | integer | 已使用次数 |
|
|
782
|
+
| `created_at` | integer | 创建时间戳(毫秒) |
|
|
783
|
+
|
|
784
|
+
---
|
|
785
|
+
|
|
786
|
+
## storage.revoke_share_link
|
|
787
|
+
|
|
788
|
+
撤销分享链接。
|
|
789
|
+
|
|
790
|
+
### 参数
|
|
791
|
+
|
|
792
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
793
|
+
|------|------|------|------|
|
|
794
|
+
| `share_id` | string | 是 | 待撤销的分享短码 |
|
|
795
|
+
|
|
796
|
+
### 响应
|
|
797
|
+
|
|
798
|
+
| 字段 | 类型 | 说明 |
|
|
799
|
+
|------|------|------|
|
|
800
|
+
| `revoked` | boolean | 是否成功撤销 |
|
|
801
|
+
| `share_id` | string | 被撤销的分享短码 |
|
|
802
|
+
|
|
803
|
+
> 链接不存在或已撤销时返回通用错误(`-32000`)。
|
|
804
|
+
|
|
805
|
+
---
|
|
806
|
+
|
|
807
|
+
## storage.get_by_share
|
|
808
|
+
|
|
809
|
+
通过分享短码读取对象。公开分享无需额外授权;私有白名单分享需要请求者 AID 在 `allowed_aids` 内。
|
|
810
|
+
|
|
811
|
+
**参数**:
|
|
812
|
+
|
|
813
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
814
|
+
|------|------|------|------|
|
|
815
|
+
| `share_id` | string | 是 | 分享短码 |
|
|
816
|
+
|
|
817
|
+
**响应**:小对象返回 `content`;大对象返回 `download_url`。同时返回 `object_id`、`object_key`、`path`、`size_bytes`、`content_type`、`sha256`。
|
|
818
|
+
|
|
819
|
+
---
|
|
820
|
+
|
|
821
|
+
## 错误码
|
|
490
822
|
|
|
491
823
|
| code | 说明 |
|
|
492
824
|
|------|------|
|