@agentunion/fastaun 0.5.33 → 0.5.34
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 +30 -2
- package/README.md +28 -26
- package/_packed_docs/CHANGELOG.md +30 -2
- package/_packed_docs/INDEX.md +17 -3
- package/_packed_docs/KITE_DOCS_GUIDE.md +10 -4
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +58 -8
- package/_packed_docs/sdk/0.5.33-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +464 -316
- package/_packed_docs/sdk/0.5.33-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +499 -304
- package/_packed_docs/sdk/0.5.34-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +133 -0
- package/_packed_docs/sdk/0.5.34-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +107 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +16 -13
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +13 -1
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +17 -7
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +55 -14
- package/_packed_docs/sdk/09-collab-rpc-manual.md +48 -30
- package/_packed_docs/sdk/09-custody-api-manual.md +3 -3
- package/_packed_docs/sdk/09-group-rpc-manual.md +53 -6
- package/_packed_docs/sdk/09-message-rpc-manual.md +22 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -1
- package/_packed_docs/sdk/09-payload-reference.md +9 -8
- package/_packed_docs/sdk/09-proxy-rpc-manual.md +20 -14
- package/_packed_docs/sdk/09-storage-rpc-manual.md +1698 -1659
- package/_packed_docs/sdk/09-stream-rpc-manual.md +33 -20
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +11 -9
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +53 -28
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/274/200/345/217/221/347/247/273/346/244/215/346/214/207/345/215/227.md +62 -28
- package/_packed_docs/sdk/INDEX.md +21 -9
- package/_packed_docs/sdk/README.md +11 -6
- package/dist/auth.js +8 -2
- package/dist/auth.js.map +1 -1
- package/dist/client/control-messages.js +2 -2
- package/dist/client/control-messages.js.map +1 -1
- package/dist/client/delivery.d.ts +5 -0
- package/dist/client/delivery.js +146 -32
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/lifecycle.js +3 -0
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-budget.d.ts +21 -0
- package/dist/client/rpc-budget.js +82 -0
- package/dist/client/rpc-budget.js.map +1 -0
- package/dist/client/rpc-pipeline.d.ts +3 -0
- package/dist/client/rpc-pipeline.js +166 -60
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/sync-channels.d.ts +89 -0
- package/dist/client/sync-channels.js +489 -0
- package/dist/client/sync-channels.js.map +1 -0
- package/dist/client/v2-e2ee.d.ts +4 -1
- package/dist/client/v2-e2ee.js +401 -298
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.js +63 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pubsub/binding.js +14 -1
- package/dist/pubsub/binding.js.map +1 -1
- package/dist/pubsub/channel.d.ts +4 -0
- package/dist/pubsub/channel.js +26 -0
- package/dist/pubsub/channel.js.map +1 -1
- package/dist/pubsub/client.d.ts +9 -0
- package/dist/pubsub/client.js +154 -31
- package/dist/pubsub/client.js.map +1 -1
- package/dist/pubsub/credentials.d.ts +3 -0
- package/dist/pubsub/credentials.js +57 -20
- package/dist/pubsub/credentials.js.map +1 -1
- package/dist/pubsub/index.d.ts +3 -0
- package/dist/pubsub/index.js +69 -53
- package/dist/pubsub/index.js.map +1 -1
- package/dist/pubsub/service.d.ts +3 -0
- package/dist/pubsub/service.js +167 -12
- package/dist/pubsub/service.js.map +1 -1
- package/dist/pubsub/types.d.ts +2 -0
- package/dist/storage/lowlevel.d.ts +3 -1
- package/dist/storage/lowlevel.js +13 -0
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/types.d.ts +10 -0
- package/dist/storage/types.js.map +1 -1
- package/dist/storage/vfs.d.ts +3 -1
- package/dist/storage/vfs.js +2 -2
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +55 -5
- package/dist/tools/cross-sdk-agent.js +88 -21
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +12 -0
- package/dist/transport.js +91 -6
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,1659 +1,1698 @@
|
|
|
1
|
-
# 存储 — RPC Manual
|
|
2
|
-
|
|
3
|
-
## 方法索引
|
|
4
|
-
|
|
5
|
-
### 控制面方法
|
|
6
|
-
|
|
7
|
-
| 方法 | 说明 |
|
|
8
|
-
|------|------|
|
|
9
|
-
| [storage.put_object](#storageput_object) | Inline 写入小对象 |
|
|
10
|
-
| [storage.get_object](#storageget_object) | Inline 读取小对象 |
|
|
11
|
-
| [storage.head_object](#storagehead_object) | 查询元数据 |
|
|
12
|
-
| [storage.delete_object](#storagedelete_object) | 删除对象 |
|
|
13
|
-
| [storage.list_objects](#storagelist_objects) | 列举对象 |
|
|
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
|
-
| 方法 | 说明 |
|
|
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
|
-
| 方法 | 说明 |
|
|
46
|
-
|------|------|
|
|
47
|
-
| [storage.create_upload_session](#storagecreate_upload_session) | 申请上传 URL |
|
|
48
|
-
| [storage.complete_upload](#storagecomplete_upload) | 确认上传完成 |
|
|
49
|
-
| [storage.create_download_ticket](#storagecreate_download_ticket) | 申请下载 URL |
|
|
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
|
-
|
|
60
|
-
### POSIX VFS 方法
|
|
61
|
-
|
|
62
|
-
> 在对象存储之上提供 Linux 文件系统语义(`ls/find/df/stat/lstat/mkdir/touch/rm/mv/cp/mount`)。节点类型:`file` / `dir` / `symlink` / `mount`。
|
|
63
|
-
|
|
64
|
-
| 方法 | 说明 |
|
|
65
|
-
|------|------|
|
|
66
|
-
| [storage.fs.list](#storagefslist) | 列目录(ls) |
|
|
67
|
-
| [storage.fs.find](#storagefsfind) | 递归查找(find,支持 name/type/size/mtime 过滤) |
|
|
68
|
-
| [storage.fs.df](#storagefsdf) | 配额/用量报告(df) |
|
|
69
|
-
| [storage.fs.stat](#storagefsstat) | 查节点(stat,跟随末级软链) |
|
|
70
|
-
| [storage.fs.lstat](#storagefslstat) | 查节点(lstat,不跟随软链) |
|
|
71
|
-
| [storage.fs.mkdir](#storagefsmkdir) | 建目录(mkdir) |
|
|
72
|
-
| [storage.fs.touch](#storagefstouch) | 创建空文件或更新时间戳(touch) |
|
|
73
|
-
| [storage.fs.remove](#storagefsremove) | 删除文件/目录/软链(rm) |
|
|
74
|
-
| [storage.fs.rename](#storagefsrename) | 同 owner 内移动/改名(mv) |
|
|
75
|
-
| [storage.fs.copy](#storagefscopy) | 复制对象或软链(cp) |
|
|
76
|
-
| [storage.fs.mount](#storagefsmount) | 挂载卷或他人子树 |
|
|
77
|
-
| [storage.fs.approve](#storagefsapprove) | 源 owner 批准待审挂载 |
|
|
78
|
-
| [storage.fs.reject](#storagefsreject) | 拒绝待审挂载 |
|
|
79
|
-
| [storage.fs.unmount](#storagefsunmount) | 卸载挂载点 |
|
|
80
|
-
| [storage.fs.invalidate_membership](#storagefsinvalidate_membership) | 群成员变更时失效群挂载 |
|
|
81
|
-
|
|
82
|
-
### 软链方法
|
|
83
|
-
|
|
84
|
-
| 方法 | 说明 |
|
|
85
|
-
|------|------|
|
|
86
|
-
| [storage.create_symlink](#storagecreate_symlink) | 创建软链 |
|
|
87
|
-
| [storage.readlink](#storagereadlink) | 读软链 target |
|
|
88
|
-
| [storage.atomic_repoint](#storageatomic_repoint) | 原子重指 target(CAS 乐观锁) |
|
|
89
|
-
| [storage.rename_symlink](#storagerename_symlink) | 改软链 key(target 不变) |
|
|
90
|
-
| [storage.delete_symlink](#storagedelete_symlink) | 删软链记录(不动 target) |
|
|
91
|
-
|
|
92
|
-
### ACL / 权限方法
|
|
93
|
-
|
|
94
|
-
> 统一权限求值顺序(硬顺序):公开位 → token → ACL(最近祖先前缀)→ 角色 → owner → 拒绝。
|
|
95
|
-
>
|
|
96
|
-
> `storage.set_acl` 授予路径前缀权限:`w` 写、`x` 删、`r`
|
|
97
|
-
|
|
98
|
-
| 方法 | 说明 |
|
|
99
|
-
|------|------|
|
|
100
|
-
| [storage.set_acl](#storageset_acl) | 授予路径前缀 ACL |
|
|
101
|
-
| [storage.remove_acl](#storageremove_acl) | 移除 ACL 授权 |
|
|
102
|
-
| [storage.list_acl](#storagelist_acl) | 列出路径 ACL |
|
|
103
|
-
| [storage.set_visibility](#storageset_visibility) | 切换公开/私有 |
|
|
104
|
-
| [storage.check_access](#storagecheck_access) | 非抛错的访问探测 |
|
|
105
|
-
| [storage.issue_token](#storageissue_token) | 签发路径访问 token |
|
|
106
|
-
| [storage.revoke_token](#storagerevoke_token) | 吊销 token |
|
|
107
|
-
| [storage.list_tokens](#storagelist_tokens) | 列出 token |
|
|
108
|
-
|
|
109
|
-
### 卷方法
|
|
110
|
-
|
|
111
|
-
| 方法 | 说明 |
|
|
112
|
-
|------|------|
|
|
113
|
-
| [storage.volume.create](#storagevolumecreate) | 创建/upsert 配额卷 |
|
|
114
|
-
| [storage.volume.renew](#storagevolumerenew) | 续期卷 |
|
|
115
|
-
| [storage.volume.expire_due](#storagevolumeexpire_due) | 过期到期卷并失效其挂载 |
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
> `object_key` 当前仅支持 ASCII 安全字符集合 `[A-Za-z0-9._/-]`,且不允许空路径段、`..`、反斜杠转义后的非法段。
|
|
120
|
-
|
|
121
|
-
## SDK 封装状态
|
|
122
|
-
|
|
123
|
-
Python / Go / TypeScript / JavaScript SDK 均提供 storage low-level 与 VFS 门面。普通应用优先使用 SDK VFS:`write_bytes` / `upload_file` 会先 `check_upload`,小对象走 `put_object`,大对象走 `create_upload_session` → HTTP PUT → `complete_upload`,秒传路径用 `complete_upload(skip_blob=true)`;`read_bytes` 优先尝试 inline `get_object`,超限时回退 `create_download_ticket`。Python / Go / TypeScript 的 `download_file` / `downloadFile` 从下载票据及 HTTP GET 路径读取并写入本地文件;JavaScript 的 `downloadFile` 复用字节读取路径并返回正文数据。`touch` 直接封装 `storage.fs.touch`。需要精确控制 ACL、token、软链、卷、批量操作或 URL 字段时,再直接调用本手册中的 `storage.*` RPC。
|
|
124
|
-
|
|
125
|
-
四个 SDK 的 VFS 会优先按实际字节识别 PNG、JPEG、GIF、BMP、WebP、PDF、gzip、ZIP、MP4、JSON、HTML 和 UTF-8 文本,再回退文件扩展名及 `application/octet-stream`。大文件上传时,`create_upload_session`、HTTP PUT 和 `complete_upload` 使用同一个 `Content-Type`;如果 session 响应额外提供 `headers`,SDK 会保留其它 header 并以实际识别结果替换其中的 Content-Type。OSS 预签名 PUT 会把 Content-Type 纳入签名校验,缺失或不一致时可直接返回 403。
|
|
126
|
-
|
|
127
|
-
直接调用底层 RPC 的高级客户端必须自行完成相同编排:先确定内容类型,再把同一个值传给 session 和 complete,并在 PUT 请求中发送一致的 `Content-Type`。绕过 VFS 后未遵守该约束属于调用方式错误。
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
|
136
|
-
|
|
137
|
-
|
|
|
138
|
-
|
|
139
|
-
`
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
|
158
|
-
|
|
|
159
|
-
| `read_cache
|
|
160
|
-
| `
|
|
161
|
-
| `
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
`
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
|
190
|
-
|
|
191
|
-
| `
|
|
192
|
-
| `
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
|
208
|
-
|
|
209
|
-
| `
|
|
210
|
-
| `
|
|
211
|
-
| `
|
|
212
|
-
| `
|
|
213
|
-
| `
|
|
214
|
-
| `
|
|
215
|
-
| `
|
|
216
|
-
| `
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `
|
|
223
|
-
| `
|
|
224
|
-
| `
|
|
225
|
-
| `
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
|
261
|
-
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
|
268
|
-
|
|
269
|
-
| `
|
|
270
|
-
| `
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
|
305
|
-
|
|
306
|
-
| `owner_aid` | string | 所有者 AID |
|
|
307
|
-
| `
|
|
308
|
-
| `
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
|
313
|
-
|
|
314
|
-
| `
|
|
315
|
-
| `
|
|
316
|
-
| `
|
|
317
|
-
| `
|
|
318
|
-
| `
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
|
343
|
-
|
|
344
|
-
| `
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
|
370
|
-
|
|
371
|
-
| `
|
|
372
|
-
| `
|
|
373
|
-
| `
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
|
381
|
-
|
|
382
|
-
| `
|
|
383
|
-
| `
|
|
384
|
-
| `
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
| `
|
|
423
|
-
| `
|
|
424
|
-
| `size` | integer |
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
|
443
|
-
|
|
444
|
-
| `
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
|
464
|
-
|
|
465
|
-
| `
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
|
496
|
-
|
|
497
|
-
| `
|
|
498
|
-
| `
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
|
648
|
-
|
|
649
|
-
| `
|
|
650
|
-
| `
|
|
651
|
-
| `
|
|
652
|
-
| `
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
|
657
|
-
|
|
658
|
-
| `
|
|
659
|
-
| `
|
|
660
|
-
| `
|
|
661
|
-
| `
|
|
662
|
-
| `
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
|
690
|
-
|
|
691
|
-
| `
|
|
692
|
-
| `
|
|
693
|
-
| `
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
|
698
|
-
|
|
699
|
-
| `
|
|
700
|
-
| `
|
|
701
|
-
| `
|
|
702
|
-
| `
|
|
703
|
-
| `
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
|
708
|
-
|
|
709
|
-
| `
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
| `
|
|
733
|
-
| `
|
|
734
|
-
| `
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
|
741
|
-
|
|
742
|
-
| `
|
|
743
|
-
|
|
744
|
-
`
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
|
837
|
-
|
|
838
|
-
| `
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
"
|
|
872
|
-
"
|
|
873
|
-
"
|
|
874
|
-
})
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
| `
|
|
900
|
-
| `
|
|
901
|
-
| `
|
|
902
|
-
| `
|
|
903
|
-
| `
|
|
904
|
-
| `
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
share_url
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
| `
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
|
949
|
-
|
|
950
|
-
| `
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
|
966
|
-
|
|
967
|
-
| `
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
###
|
|
1013
|
-
|
|
1014
|
-
|
|
|
1015
|
-
|
|
1016
|
-
| `
|
|
1017
|
-
| `
|
|
1018
|
-
| `
|
|
1019
|
-
| `page`
|
|
1020
|
-
| `
|
|
1021
|
-
|
|
1022
|
-
`
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
|
1070
|
-
|
|
1071
|
-
| `
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
|
1154
|
-
|
|
1155
|
-
| `
|
|
1156
|
-
| `
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
| `
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
| `
|
|
1193
|
-
| `
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
###
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
| `
|
|
1252
|
-
| `
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
| `
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
`
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
|
1466
|
-
|
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
|
1501
|
-
|
|
1502
|
-
| `
|
|
1503
|
-
| `
|
|
1504
|
-
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1505
|
-
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
| `
|
|
1524
|
-
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1525
|
-
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
|
1542
|
-
|
|
1543
|
-
| `
|
|
1544
|
-
| `
|
|
1545
|
-
| `
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
|
1562
|
-
|
|
1563
|
-
| `
|
|
1564
|
-
| `
|
|
1565
|
-
| `
|
|
1566
|
-
| `
|
|
1567
|
-
|
|
1568
|
-
### 响应
|
|
1569
|
-
|
|
1570
|
-
`{
|
|
1571
|
-
|
|
1572
|
-
---
|
|
1573
|
-
|
|
1574
|
-
## storage.
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
### 参数
|
|
1579
|
-
|
|
1580
|
-
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1581
|
-
|------|------|------|------|------|
|
|
1582
|
-
| `path` | string | 是 | — |
|
|
1583
|
-
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1584
|
-
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
|
1601
|
-
|
|
1602
|
-
| `
|
|
1603
|
-
| `
|
|
1604
|
-
| `
|
|
1605
|
-
| `
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
|
1622
|
-
|
|
1623
|
-
| `
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
|
1642
|
-
|
|
1643
|
-
| `
|
|
1644
|
-
| `
|
|
1645
|
-
| `
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1
|
+
# 存储 — RPC Manual
|
|
2
|
+
|
|
3
|
+
## 方法索引
|
|
4
|
+
|
|
5
|
+
### 控制面方法
|
|
6
|
+
|
|
7
|
+
| 方法 | 说明 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| [storage.put_object](#storageput_object) | Inline 写入小对象 |
|
|
10
|
+
| [storage.get_object](#storageget_object) | Inline 读取小对象 |
|
|
11
|
+
| [storage.head_object](#storagehead_object) | 查询元数据 |
|
|
12
|
+
| [storage.delete_object](#storagedelete_object) | 删除对象 |
|
|
13
|
+
| [storage.list_objects](#storagelist_objects) | 列举对象 |
|
|
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
|
+
| 方法 | 说明 |
|
|
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
|
+
| 方法 | 说明 |
|
|
46
|
+
|------|------|
|
|
47
|
+
| [storage.create_upload_session](#storagecreate_upload_session) | 申请上传 URL |
|
|
48
|
+
| [storage.complete_upload](#storagecomplete_upload) | 确认上传完成 |
|
|
49
|
+
| [storage.create_download_ticket](#storagecreate_download_ticket) | 申请下载 URL |
|
|
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
|
+
|
|
60
|
+
### POSIX VFS 方法
|
|
61
|
+
|
|
62
|
+
> 在对象存储之上提供 Linux 文件系统语义(`ls/find/df/stat/lstat/mkdir/touch/rm/mv/cp/mount`)。节点类型:`file` / `dir` / `symlink` / `mount`。
|
|
63
|
+
|
|
64
|
+
| 方法 | 说明 |
|
|
65
|
+
|------|------|
|
|
66
|
+
| [storage.fs.list](#storagefslist) | 列目录(ls) |
|
|
67
|
+
| [storage.fs.find](#storagefsfind) | 递归查找(find,支持 name/type/size/mtime 过滤) |
|
|
68
|
+
| [storage.fs.df](#storagefsdf) | 配额/用量报告(df) |
|
|
69
|
+
| [storage.fs.stat](#storagefsstat) | 查节点(stat,跟随末级软链) |
|
|
70
|
+
| [storage.fs.lstat](#storagefslstat) | 查节点(lstat,不跟随软链) |
|
|
71
|
+
| [storage.fs.mkdir](#storagefsmkdir) | 建目录(mkdir) |
|
|
72
|
+
| [storage.fs.touch](#storagefstouch) | 创建空文件或更新时间戳(touch) |
|
|
73
|
+
| [storage.fs.remove](#storagefsremove) | 删除文件/目录/软链(rm) |
|
|
74
|
+
| [storage.fs.rename](#storagefsrename) | 同 owner 内移动/改名(mv) |
|
|
75
|
+
| [storage.fs.copy](#storagefscopy) | 复制对象或软链(cp) |
|
|
76
|
+
| [storage.fs.mount](#storagefsmount) | 挂载卷或他人子树 |
|
|
77
|
+
| [storage.fs.approve](#storagefsapprove) | 源 owner 批准待审挂载 |
|
|
78
|
+
| [storage.fs.reject](#storagefsreject) | 拒绝待审挂载 |
|
|
79
|
+
| [storage.fs.unmount](#storagefsunmount) | 卸载挂载点 |
|
|
80
|
+
| [storage.fs.invalidate_membership](#storagefsinvalidate_membership) | 群成员变更时失效群挂载 |
|
|
81
|
+
|
|
82
|
+
### 软链方法
|
|
83
|
+
|
|
84
|
+
| 方法 | 说明 |
|
|
85
|
+
|------|------|
|
|
86
|
+
| [storage.create_symlink](#storagecreate_symlink) | 创建软链 |
|
|
87
|
+
| [storage.readlink](#storagereadlink) | 读软链 target |
|
|
88
|
+
| [storage.atomic_repoint](#storageatomic_repoint) | 原子重指 target(CAS 乐观锁) |
|
|
89
|
+
| [storage.rename_symlink](#storagerename_symlink) | 改软链 key(target 不变) |
|
|
90
|
+
| [storage.delete_symlink](#storagedelete_symlink) | 删软链记录(不动 target) |
|
|
91
|
+
|
|
92
|
+
### ACL / 权限方法
|
|
93
|
+
|
|
94
|
+
> 统一权限求值顺序(硬顺序):公开位 → token → ACL(最近祖先前缀)→ 角色 → owner → 拒绝。
|
|
95
|
+
>
|
|
96
|
+
> `storage.set_acl` 授予路径前缀权限:`w` 写、`x` 删、`r` 读。具体 AID 的 `r` 用于 authoritative 读取和受信挂载读取;`subject` 条件 ACL 还支持匹配者读取普通私有对象。向指定 AID 分享普通私有对象仍使用 `storage.create_share_link` 的 `allowed_aids`。群角色 ACL 使用 `group.fs.set_acl/remove_acl`。
|
|
97
|
+
|
|
98
|
+
| 方法 | 说明 |
|
|
99
|
+
|------|------|
|
|
100
|
+
| [storage.set_acl](#storageset_acl) | 授予路径前缀 ACL |
|
|
101
|
+
| [storage.remove_acl](#storageremove_acl) | 移除 ACL 授权 |
|
|
102
|
+
| [storage.list_acl](#storagelist_acl) | 列出路径 ACL |
|
|
103
|
+
| [storage.set_visibility](#storageset_visibility) | 切换公开/私有 |
|
|
104
|
+
| [storage.check_access](#storagecheck_access) | 非抛错的访问探测 |
|
|
105
|
+
| [storage.issue_token](#storageissue_token) | 签发路径访问 token |
|
|
106
|
+
| [storage.revoke_token](#storagerevoke_token) | 吊销 token |
|
|
107
|
+
| [storage.list_tokens](#storagelist_tokens) | 列出 token |
|
|
108
|
+
|
|
109
|
+
### 卷方法
|
|
110
|
+
|
|
111
|
+
| 方法 | 说明 |
|
|
112
|
+
|------|------|
|
|
113
|
+
| [storage.volume.create](#storagevolumecreate) | 创建/upsert 配额卷 |
|
|
114
|
+
| [storage.volume.renew](#storagevolumerenew) | 续期卷 |
|
|
115
|
+
| [storage.volume.expire_due](#storagevolumeexpire_due) | 过期到期卷并失效其挂载 |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
> `object_key` 当前仅支持 ASCII 安全字符集合 `[A-Za-z0-9._/-]`,且不允许空路径段、`..`、反斜杠转义后的非法段。
|
|
120
|
+
|
|
121
|
+
## SDK 封装状态
|
|
122
|
+
|
|
123
|
+
Python / Go / TypeScript / JavaScript SDK 均提供 storage low-level 与 VFS 门面。普通应用优先使用 SDK VFS:`write_bytes` / `upload_file` 会先 `check_upload`,小对象走 `put_object`,大对象走 `create_upload_session` → HTTP PUT → `complete_upload`,秒传路径用 `complete_upload(skip_blob=true)`;`read_bytes` 优先尝试 inline `get_object`,超限时回退 `create_download_ticket`。Python / Go / TypeScript 的 `download_file` / `downloadFile` 从下载票据及 HTTP GET 路径读取并写入本地文件;JavaScript 的 `downloadFile` 复用字节读取路径并返回正文数据。`touch` 直接封装 `storage.fs.touch`。需要精确控制 ACL、token、软链、卷、批量操作或 URL 字段时,再直接调用本手册中的 `storage.*` RPC。
|
|
124
|
+
|
|
125
|
+
四个 SDK 的 VFS 会优先按实际字节识别 PNG、JPEG、GIF、BMP、WebP、PDF、gzip、ZIP、MP4、JSON、HTML 和 UTF-8 文本,再回退文件扩展名及 `application/octet-stream`。大文件上传时,`create_upload_session`、HTTP PUT 和 `complete_upload` 使用同一个 `Content-Type`;如果 session 响应额外提供 `headers`,SDK 会保留其它 header 并以实际识别结果替换其中的 Content-Type。OSS 预签名 PUT 会把 Content-Type 纳入签名校验,缺失或不一致时可直接返回 403。
|
|
126
|
+
|
|
127
|
+
直接调用底层 RPC 的高级客户端必须自行完成相同编排:先确定内容类型,再把同一个值传给 session 和 complete,并在 PUT 请求中发送一致的 `Content-Type`。绕过 VFS 后未遵守该约束属于调用方式错误。
|
|
128
|
+
|
|
129
|
+
四端 VFS 写入会沿用本端读取的版本或显式 `expected_version`/`expectedVersion`;目标已存在但没有可用版本时返回冲突,显式 `force` 可选择覆盖。low-level 封装会对对象写入和删除执行版本预检;直接 `client.call()` 不具有这层 SDK 编排。RPC 的 `expected_version=0` 表示只允许目标不存在,正整数表示必须匹配当前版本。
|
|
130
|
+
|
|
131
|
+
## SDK 默认读缓存
|
|
132
|
+
|
|
133
|
+
从 0.5.22 起,四个 SDK 的 Storage 和 Group FS 读缓存由客户端默认启用,服务端无需逐个对象显式授权缓存。已接入缓存的元数据查询(如 `head_object`、目录列表、`fs.stat/lstat/find/df`)与完整小正文读取适用下表;不是任意 RPC 或大文件下载都缓存。
|
|
134
|
+
|
|
135
|
+
| 响应策略 | SDK 行为 |
|
|
136
|
+
|----------|----------|
|
|
137
|
+
| 不返回 `read_cache`,或值为 `null` | 元数据默认 TTL 60 秒;正文实际大小不超过 65,536 字节、SHA-256 合法且校验通过时,默认缓存正文 |
|
|
138
|
+
| `read_cache.reusable: false` | 此响应不进入可复用读缓存,用于显式禁止特定文件缓存 |
|
|
139
|
+
| 显式允许策略 | 元数据须 `reusable: true`,正文还须 `inline: true`;省略 `max_age_ms` 时默认 60 秒,有限正数 TTL 最多使用 60 秒 |
|
|
140
|
+
|
|
141
|
+
`read_cache` 是读取响应中的策略对象,不是应用写入文件时的通用选项。缺省策略的 64 KiB 上限使用实际正文长度;元数据可独立缓存,不因文件正文较大而自动禁用。显式允许策略省略 TTL 时采用 60 秒;显式 null、非正数或非法 TTL 均不复用,不把空对象或其它显式异常值解释为缺省允许。
|
|
142
|
+
|
|
143
|
+
应用可为特定读取设置 TypeScript / JavaScript `noCache: true`、Python `no_cache=True` 或 Go 对应 VFS Options 的 `NoCache: true`。TS/JS 的底层 RPC 和 Group FS 也兼容 `no_cache`,TypeScript Storage VFS 的类型化选项使用 `noCache`。SDK 消费该选项并跳过有效缓存命中,仍可发送已有 SHA-256 进行条件校验;它不表示 no-store,新结果仍按响应策略缓存。对于支持 `consistency` 的底层 RPC,`consistency: "authoritative"` 则完全旁路 SDK 读缓存,规则见下节。
|
|
144
|
+
|
|
145
|
+
正文过期或显式刷新时,SDK 可带 `if_sha256`;服务端返回 `not_modified: true` 时只复用已有且已验证的正文,无本地正文时不能将该响应当作空内容。缓存键隔离调用身份及业务参数;写入和相关变更使缓存失效,重新鉴权仍由联网读取执行。范围读取和直接调用预签 RPC 不使用普通正文缓存;VFS 的完整下载流程可按下文缓存已验证的 inline 大小正文。
|
|
146
|
+
|
|
147
|
+
下载票据路径也可缓存已下载并校验的 inline 大小正文,TTL 最多 60 秒;Python / Go / TypeScript 的下载入口可复用对应 `get_object` 热缓存,不必先重传正文。过期后可用 SHA-256 向下载票据接口条件校验,摘要未变则直接复用本地正文;正文大于 inline 缓存上限时仍按原下载路径传输。
|
|
148
|
+
|
|
149
|
+
有限次 token、ACL 和分享授权的 inline 读取只有返回正文才计次;inline 和大对象匹配 SHA 而只返回无正文 `not_modified` 均不计次,额度耗尽后仍可进行该条件验证。SDK 本地缓存命中不请求 Storage,因此不计次;HEAD 等纯元数据查询不计次。限次授权可缓存,TTL 受对象及授权有效期限制;联网验证继续检查撤销、过期、身份和权限。大对象按下载授权计次:非 `not_modified` 请求签发 URL 或授权 302 时计一次,直接复用已签发的正文下载 URL 属于同次授权;再次向 Storage 申请 URL/授权跳转按新授权计次;普通下载不代理外部 OSS 正文,不统计 OSS 实际 GET 次数;subject 条件下载由 Storage 流式代理并在每次下载时重新判权。范围参数错误、正文读取失败、下载 URL/票据准备失败不扣次;`storage.get_object_url` 仅返回稳定地址,不计次,权限和额度预检保持。响应准备成功后发生网络中断,不承诺退回次数。
|
|
150
|
+
|
|
151
|
+
`subject` 条件 ACL 的响应使用 `read_cache.reusable: false`、`max_age_ms: 0`,每次联网读取核对 Owner 当前 `owner.md` 单方声明;只有限定 `card` 时才检查名片,名片使用 Storage 的 60 秒 TTL 缓存。其 `max_uses` 由整条规则共享;下载票据兑换正文时还会核对原规则、权限、当前声明及按相同缓存策略取得的名片。条件下载由 Storage 直接返回或流式代理正文,HTTP 响应使用 `Cache-Control: private, no-store`;撤销规则或声明后,后续联网读取被拒绝;名片改为不匹配最多有 60 秒缓存窗口。
|
|
152
|
+
|
|
153
|
+
普通文件 API 读取 `default/sub_aids/{sub_aid}/owner.md` 同样适用上述默认规则;Ownership 管理、维护和新鲜共识的权威读取继续旁路。`resolve` 的 ownership 展示快照使用自己的 TTL 和刷新选项,不能替代条件 ACL 对当前 Owner 声明的检查。
|
|
154
|
+
|
|
155
|
+
### 策略字段与条件读取
|
|
156
|
+
|
|
157
|
+
| 字段 | 类型 | 含义 |
|
|
158
|
+
| --- | --- | --- |
|
|
159
|
+
| `read_cache` | object / null,可省略 | 响应缓存策略;缺省/null 使用上表默认规则 |
|
|
160
|
+
| `read_cache.reusable` | boolean | `false` 禁止复用该响应,显式允许策略使用 `true` |
|
|
161
|
+
| `read_cache.inline` | boolean | 显式策略是否允许缓存完整正文;`false` 不妨碍符合条件的元数据独立缓存 |
|
|
162
|
+
| `read_cache.max_age_ms` | integer,可省略 | 有效期上限,单位毫秒;显式允许策略省略时默认 60,000;正数最多使用 60,000,并受对象及授权剩余有效期限制;显式 null/非正数/非法值不复用 |
|
|
163
|
+
| `read_cache.max_inline_bytes` | integer | 服务端允许 inline 正文的大小上限(字节);不表示大对象正文也可缓存 |
|
|
164
|
+
| `if_sha256` | string,可选请求字段 | 本地完整正文的 64 位十六进制 SHA-256,用于条件读取,不用于范围正文 |
|
|
165
|
+
| `not_modified` | boolean,可选响应字段 | 摘要未变化;仍须通过当前访问校验,响应可省略正文或下载票据 |
|
|
166
|
+
|
|
167
|
+
收到 `not_modified: true` 时,无论当前响应是否允许继续缓存,SDK 都必须校验响应摘要与已有、已验证完整正文的摘要一致;无本地正文须重新请求完整对象,不能返回空内容。它不等于 HTTP 304,也不延长票据期限。`noCache`/`no_cache` 是 SDK 本地选项,不作为服务端 `get_object` 或下载票据的业务参数。四端对齐落点见 [parity 块⑦](../../python/CHANGES_FOR_PARITY.md#块⑦-storage--group-fs-默认读缓存)。
|
|
168
|
+
|
|
169
|
+
### 持久化与新鲜度
|
|
170
|
+
|
|
171
|
+
Node.js TypeScript、Python、Go 的索引位于 `{aunPath}/.cache/storage/index.sqlite3`,正文按摘要存于同目录 `blobs/{前2位}/{sha256}`;浏览器使用既有 `aun-keystore` IndexedDB 的 `storage_cache_index`/`storage_cache_blobs`。当前默认内存正文预算 32 MiB、持久正文预算 256 MiB,更多索引容量、淘汰及故障降级要求见 [0.5.22 移植指南](0.5.22-SDK开发与移植指南.md#61-storage--group-fs-默认读缓存)。这不是新增 JSONL 业务记录或公共配置接口。
|
|
172
|
+
|
|
173
|
+
服务端 `max_age_ms` 扣除本次授权/对象解析所用元数据的已缓存年龄及解析耗时,使服务端元数据可能陈旧时间与 SDK 复用时间之和不超过 60 秒,同时受对象及授权剩余有效期限制。热命中不联网,也不续期 TTL。其它客户端写入或撤销权限可能在剩余 TTL 内仍未被本端观察,默认最多 60 秒;需要立即观察时显式刷新,权威管理/授权仍用权威入口。正文缓存不持久复用下载 URL、临时 token 或签名;票据过期后重新申请。重启恢复、原始 RPC 正文和权限查询白名单的已对齐分支及定向测试范围统一列在上述 parity 节,完整联网矩阵仍须单独验收。
|
|
174
|
+
|
|
175
|
+
## 权威读取与完整发布
|
|
176
|
+
|
|
177
|
+
`storage.head_object/get_object` 和 `storage.fs.stat` 的 `consistency: authoritative` 绕过正负缓存,核对当前存在性、规范路径及完整正文摘要。权威结果包含 `consistency`、布尔 `exists`、请求 `owner_aid/bucket/path` 和 Unix 秒 `observed_at`;存在时返回完整对象元数据,仅 `get_object` 另含严格 Base64 的完整 `content`,head/stat 不返回正文。恢复未完成、权限错误、网络或数据库故障不能返回 `exists=false`。私有路径仍检查 ACL;具体 AID 的 `r` grant 不授权普通下载票据,匹配的 `subject` 条件规则可授权该读取流程。
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
`default/sub_aids/{sub_aid}/owner.md` 为公开可读的 Ownership 规范路径,仅命名空间 owner 可写删;ACL、token、父目录、移动、重命名、软链、挂载或自动清理均不能给第三方绕过能力。该路径约束先于通用权限放行,关系授权以 [Ownership 2.1](../protocol/Ownership协议定义2.1.md) 的 NS 新鲜事实为准。
|
|
182
|
+
|
|
183
|
+
## storage.put_object
|
|
184
|
+
|
|
185
|
+
上传小对象(内容 base64 编码通过 RPC 传输)。
|
|
186
|
+
|
|
187
|
+
### 参数
|
|
188
|
+
|
|
189
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
190
|
+
|------|------|------|------|
|
|
191
|
+
| `object_key` | string | 是 | 对象路径 |
|
|
192
|
+
| `content` | string | 是 | base64 编码内容 |
|
|
193
|
+
| `content_type` | string | 否 | MIME 类型,默认 `"application/octet-stream"` |
|
|
194
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
195
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
196
|
+
| `is_private` | boolean | 否 | 是否私有,默认 `true` |
|
|
197
|
+
| `overwrite` | boolean | 否 | 是否覆盖已有对象,默认 `false`;提供匹配的 `expected_version` 时可更新已有对象 |
|
|
198
|
+
| `force` | boolean | 否 | 覆盖开关的兼容别名,默认 `false`;不会绕过已提供的版本条件 |
|
|
199
|
+
| `expected_version` | integer | 否 | 乐观并发控制版本号 |
|
|
200
|
+
| `expire_in_seconds` | integer | 否 | 过期时间(秒),0 表示不过期 |
|
|
201
|
+
| `metadata` | object | 否 | 自定义元数据 |
|
|
202
|
+
|
|
203
|
+
### 响应
|
|
204
|
+
|
|
205
|
+
返回写入后的对象元数据。URL 字段收敛为 `url` 和 `logical_url`,供后续 HTTP 读取使用;私有对象仍须通过访问鉴权。SDK 需要 HTTP 下载时,使用 `storage.create_download_ticket` 响应中的地址。
|
|
206
|
+
|
|
207
|
+
| 字段 | 类型 | 说明 |
|
|
208
|
+
|------|------|------|
|
|
209
|
+
| `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/{object_key}`,经 NameService fallback 302 跳转到 storage 服务 |
|
|
210
|
+
| `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无跳转 |
|
|
211
|
+
| `node_type` | string | 固定为 `"object"` |
|
|
212
|
+
| `type` | string | 固定为 `"file"` |
|
|
213
|
+
| `object_id` | string | 对象 ID |
|
|
214
|
+
| `owner_aid` | string | 所有者 AID |
|
|
215
|
+
| `bucket` | string | 存储桶 |
|
|
216
|
+
| `object_key` | string | 对象路径 |
|
|
217
|
+
| `parent_folder_id` | string | 父目录 ID |
|
|
218
|
+
| `name` | string | 文件名 |
|
|
219
|
+
| `path` | string | 对象路径,与 `object_key` 相同 |
|
|
220
|
+
| `size_bytes` | integer | 对象大小(字节) |
|
|
221
|
+
| `content_type` | string | MIME 类型 |
|
|
222
|
+
| `sha256` | string | SHA-256 哈希 |
|
|
223
|
+
| `version` | integer | 版本号 |
|
|
224
|
+
| `etag` | string | 实体标签 |
|
|
225
|
+
| `is_private` | boolean | 是否私有 |
|
|
226
|
+
| `expire_at` | integer | 过期时间戳(秒),`0` 表示不过期 |
|
|
227
|
+
| `created_at` | integer | 创建时间戳(毫秒) |
|
|
228
|
+
| `updated_at` | integer | 更新时间戳(毫秒) |
|
|
229
|
+
| `status` | string | 对象状态,通常为 `"active"` |
|
|
230
|
+
| `metadata` | object | 自定义元数据,未设置时为 `{}` |
|
|
231
|
+
|
|
232
|
+
### 示例
|
|
233
|
+
|
|
234
|
+
```python
|
|
235
|
+
import base64
|
|
236
|
+
|
|
237
|
+
content = base64.b64encode(b"Hello World").decode()
|
|
238
|
+
result = await client.call("storage.put_object", {
|
|
239
|
+
"object_key": "notes/hello.txt",
|
|
240
|
+
"content": content,
|
|
241
|
+
"content_type": "text/plain",
|
|
242
|
+
})
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## storage.get_object
|
|
248
|
+
|
|
249
|
+
读取小对象,返回 base64 编码内容。
|
|
250
|
+
|
|
251
|
+
可传 `consistency: authoritative`,结果及故障分类见 [权威读取与完整发布](#权威读取与完整发布);权威读取只接受完整对象。
|
|
252
|
+
|
|
253
|
+
### 参数
|
|
254
|
+
|
|
255
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
256
|
+
|------|------|------|------|
|
|
257
|
+
| `object_key` | string | 是 | 对象路径 |
|
|
258
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
259
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
260
|
+
| `consistency` | string | 否 | 传 `authoritative` 时绕过缓存并返回完整权威对象 |
|
|
261
|
+
| `if_sha256` | string | 否 | 本地完整正文的 64 位十六进制 SHA-256;普通条件读取时使用,权威读取仍返回完整对象 |
|
|
262
|
+
| `token` | string | 否 | 访问 token |
|
|
263
|
+
| `offset` / `limit` | integer | 否 | 字节起点与返回长度;范围读取不使用 `if_sha256`,也不能与权威读取组合 |
|
|
264
|
+
|
|
265
|
+
### 响应
|
|
266
|
+
|
|
267
|
+
| 字段 | 类型 | 说明 |
|
|
268
|
+
|------|------|------|
|
|
269
|
+
| `owner_aid` | string | 所有者 AID |
|
|
270
|
+
| `bucket` | string | 存储桶 |
|
|
271
|
+
| `object_key` | string | 对象路径 |
|
|
272
|
+
| `content` | string | base64 编码内容;`not_modified: true` 时可省略 |
|
|
273
|
+
| `content_type` | string | MIME 类型 |
|
|
274
|
+
| `size_bytes` | integer | 对象大小(字节) |
|
|
275
|
+
| `sha256` | string | SHA-256 哈希 |
|
|
276
|
+
| `version` | integer | 版本号 |
|
|
277
|
+
| `updated_at` | integer | 更新时间戳 |
|
|
278
|
+
|
|
279
|
+
普通读取还可返回 `read_cache`(object)及 `not_modified`(boolean);字段和本地正文复用条件见 [策略字段与条件读取](#策略字段与条件读取)。只有提供了匹配 `if_sha256` 的条件读取才可将缺少 `content` 的 `not_modified` 结果与已有正文组合,不能当作空对象。
|
|
280
|
+
|
|
281
|
+
响应包含对象的 `etag`;范围读取额外返回 `range: {offset, limit, returned_bytes, size_bytes, partial: true}`,其中对象 `size_bytes` 和 `sha256` 仍描述完整对象。
|
|
282
|
+
|
|
283
|
+
### 示例
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
result = await client.call("storage.get_object", {
|
|
287
|
+
"object_key": "notes/hello.txt",
|
|
288
|
+
})
|
|
289
|
+
content = base64.b64decode(result["content"])
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## storage.head_object
|
|
295
|
+
|
|
296
|
+
查询对象元数据,不返回内容。
|
|
297
|
+
|
|
298
|
+
可传 `consistency: authoritative`,返回当前存在性与完整对象元数据;完整契约见 [权威读取与完整发布](#权威读取与完整发布)。
|
|
299
|
+
|
|
300
|
+
### 参数
|
|
301
|
+
|
|
302
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
303
|
+
|------|------|------|------|
|
|
304
|
+
| `object_key` | string | 是 | 对象路径 |
|
|
305
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
306
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
307
|
+
| `consistency` | string | 否 | 传 `authoritative` 时绕过缓存并返回权威对象元数据 |
|
|
308
|
+
| `token` | string | 否 | 访问 token |
|
|
309
|
+
|
|
310
|
+
### 响应
|
|
311
|
+
|
|
312
|
+
| 字段 | 类型 | 说明 |
|
|
313
|
+
|------|------|------|
|
|
314
|
+
| `owner_aid` | string | 所有者 AID |
|
|
315
|
+
| `bucket` | string | 存储桶 |
|
|
316
|
+
| `object_key` | string | 对象路径 |
|
|
317
|
+
| `content_type` | string | MIME 类型 |
|
|
318
|
+
| `size_bytes` | integer | 对象大小(字节) |
|
|
319
|
+
| `sha256` | string | SHA-256 哈希 |
|
|
320
|
+
| `version` | integer | 版本号 |
|
|
321
|
+
| `etag` | string | 实体标签 |
|
|
322
|
+
| `is_private` | boolean | 是否私有 |
|
|
323
|
+
| `expire_at` | integer | 过期时间戳(0 表示不过期) |
|
|
324
|
+
| `created_at` | integer | 创建时间戳 |
|
|
325
|
+
| `updated_at` | integer | 更新时间戳 |
|
|
326
|
+
| `read_cache` | object | 可选缓存策略;不返回/null 时采用 SDK 默认元数据策略,见 [策略字段](#策略字段与条件读取) |
|
|
327
|
+
|
|
328
|
+
HEAD 只查询元数据,不消耗 token、ACL 或分享的正文读取次数。
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## storage.delete_object
|
|
333
|
+
|
|
334
|
+
删除对象。
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
### 参数
|
|
338
|
+
|
|
339
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
340
|
+
|------|------|------|------|
|
|
341
|
+
| `object_key` | string | 是 | 对象路径 |
|
|
342
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
343
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
344
|
+
| `expected_version` | integer | 否 | 非负 JSON 整数;指定时使用版本 CAS 删除 |
|
|
345
|
+
|
|
346
|
+
省略 `expected_version` 保持既有无条件删除行为。提供 `0` 时仅匹配对象不存在并返回 `deleted: false`;提供正整数时必须存在相同版本的对象才删除。存在性不符、版本不符或检查后对象被替换导致 CAS 失败时返回 `-32009`(Version conflict),不得继续删除新版本。字符串、浮点数、布尔值及负数不是合法版本条件。收到 `-32009` 后,先权威读取当前对象及原件摘要;目标已不是本任务原件时停止删除,不得改用新版本号自动重试。请求结果未知时,先核对目标是否已删除,再决定是否重放原条件请求。
|
|
347
|
+
|
|
348
|
+
### 响应
|
|
349
|
+
|
|
350
|
+
| 字段 | 类型 | 说明 |
|
|
351
|
+
|------|------|------|
|
|
352
|
+
| `deleted` | boolean | 是否成功删除(`false` 表示对象不存在) |
|
|
353
|
+
| `owner_aid` | string | 所有者 AID |
|
|
354
|
+
| `object_key` | string | 对象路径 |
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## storage.list_objects
|
|
359
|
+
|
|
360
|
+
列出对象。
|
|
361
|
+
|
|
362
|
+
> 权限:仅允许查询自己的对象(`owner_aid` 默认为当前用户,不可指定他人的 AID)
|
|
363
|
+
|
|
364
|
+
### 参数
|
|
365
|
+
|
|
366
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
367
|
+
|------|------|------|------|
|
|
368
|
+
| `prefix` | string | 否 | 路径前缀过滤 |
|
|
369
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
370
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
371
|
+
| `page` | integer | 否 | 页码,默认 1 |
|
|
372
|
+
| `size` | integer | 否 | 每页条数,RPC 默认 50;SDK low-level 默认传 100 |
|
|
373
|
+
| `marker` | string | 否 | 深度分页游标;传入时优先按游标分页 |
|
|
374
|
+
|
|
375
|
+
### 响应
|
|
376
|
+
|
|
377
|
+
| 字段 | 类型 | 说明 |
|
|
378
|
+
|------|------|------|
|
|
379
|
+
| `items` | array | 对象元数据列表 |
|
|
380
|
+
| `total` | integer | 普通 SDK 调用返回本次可见条数,不是全目录精确总数 |
|
|
381
|
+
| `page` | integer | 当前页码 |
|
|
382
|
+
| `size` | integer | 每页条数 |
|
|
383
|
+
| `marker` | string | 当前游标标记 |
|
|
384
|
+
| `next_marker` | string | 下一页游标标记(为空表示无更多数据) |
|
|
385
|
+
|
|
386
|
+
每个 item 包含:
|
|
387
|
+
|
|
388
|
+
| 字段 | 类型 | 说明 |
|
|
389
|
+
|------|------|------|
|
|
390
|
+
| `object_key` | string | 对象路径 |
|
|
391
|
+
| `size_bytes` | integer | 对象大小(字节) |
|
|
392
|
+
| `content_type` | string | MIME 类型 |
|
|
393
|
+
| `sha256` | string | SHA-256 哈希 |
|
|
394
|
+
| `version` | integer | 版本号 |
|
|
395
|
+
| `is_private` | boolean | 是否私有 |
|
|
396
|
+
| `updated_at` | integer | 更新时间戳 |
|
|
397
|
+
|
|
398
|
+
### 示例
|
|
399
|
+
|
|
400
|
+
```python
|
|
401
|
+
result = await client.call("storage.list_objects", {
|
|
402
|
+
"prefix": "notes/",
|
|
403
|
+
"size": 20,
|
|
404
|
+
})
|
|
405
|
+
for obj in result["items"]:
|
|
406
|
+
print(f"{obj['object_key']} ({obj['size_bytes']} bytes)")
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## storage.list_prefixes
|
|
412
|
+
|
|
413
|
+
列出直接子目录(前缀)。
|
|
414
|
+
|
|
415
|
+
> 权限:仅允许查询自己的对象(`owner_aid` 默认为当前用户,不可指定他人的 AID)
|
|
416
|
+
|
|
417
|
+
### 参数
|
|
418
|
+
|
|
419
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
420
|
+
|------|------|------|------|
|
|
421
|
+
| `prefix` | string | 否 | 路径前缀过滤 |
|
|
422
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
423
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
424
|
+
| `size` | integer | 否 | 每页条数上限 |
|
|
425
|
+
|
|
426
|
+
### 响应
|
|
427
|
+
|
|
428
|
+
| 字段 | 类型 | 说明 |
|
|
429
|
+
|------|------|------|
|
|
430
|
+
| `prefixes` | string[] | 直接子目录列表 |
|
|
431
|
+
| `count` | integer | 子目录数量 |
|
|
432
|
+
| `size` | integer | 实际生效的每页上限 |
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## storage.get_quota
|
|
437
|
+
|
|
438
|
+
查询存储配额。
|
|
439
|
+
|
|
440
|
+
### 参数
|
|
441
|
+
|
|
442
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
443
|
+
|------|------|------|------|
|
|
444
|
+
| `owner_aid` | string | 否 | 查询指定 AID 的配额(默认为当前用户,仅允许查询自己的配额) |
|
|
445
|
+
|
|
446
|
+
### 响应
|
|
447
|
+
|
|
448
|
+
| 字段 | 类型 | 说明 |
|
|
449
|
+
|------|------|------|
|
|
450
|
+
| `owner_aid` | string | 所有者 AID |
|
|
451
|
+
| `used_bytes` | integer | 已使用空间(字节) |
|
|
452
|
+
| `object_count` | integer | 对象数量 |
|
|
453
|
+
| `quota_bytes` | integer | 配额上限(字节),0 表示无限制 |
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
## storage.create_folder
|
|
458
|
+
|
|
459
|
+
创建目录节点。目录和对象共用同一个 `bucket`,默认 bucket 为 `"default"`。
|
|
460
|
+
|
|
461
|
+
**参数**:
|
|
462
|
+
|
|
463
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
464
|
+
|------|------|------|------|
|
|
465
|
+
| `path` | string | 否 | 完整目录路径;提供时优先使用 |
|
|
466
|
+
| `name` | string | 否 | 目录名;未提供 `path` 时必填 |
|
|
467
|
+
| `parent_folder_id` | string | 否 | 父目录 ID |
|
|
468
|
+
| `parent_path` | string | 否 | 父目录路径,默认根目录 |
|
|
469
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
470
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
471
|
+
| `mkdirs` | boolean | 否 | 是否递归创建父目录 |
|
|
472
|
+
| `metadata` | object | 否 | 目录元数据 |
|
|
473
|
+
| `conflict_policy` | string | 否 | `"reject"` / `"return_existing"` |
|
|
474
|
+
|
|
475
|
+
**响应**:返回 `folder`,同时在顶层展开 `folder_id`、`path`、`name`、`parent_folder_id`、`version` 等字段。
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
479
|
+
## storage.get_folder
|
|
480
|
+
|
|
481
|
+
查询目录节点。
|
|
482
|
+
|
|
483
|
+
**参数**:`folder_id` 或 `path` 至少提供一个;可选 `bucket`、`owner_aid`。
|
|
484
|
+
|
|
485
|
+
**响应**:同 `storage.create_folder` 的 `folder` 视图。
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## storage.list_children
|
|
490
|
+
|
|
491
|
+
列出目录下的直接子目录和对象。
|
|
492
|
+
|
|
493
|
+
**参数**:
|
|
494
|
+
|
|
495
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
496
|
+
|------|------|------|------|
|
|
497
|
+
| `folder_id` / `path` | string | 否 | 目标目录;都不传表示根目录 |
|
|
498
|
+
| `type` | string | 否 | `"all"` / `"folder"` / `"object"`,默认 `"all"` |
|
|
499
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
500
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
501
|
+
| `page` | integer | 否 | 页码,默认 1 |
|
|
502
|
+
| `size` | integer | 否 | 每页数量,最大受服务配置限制 |
|
|
503
|
+
| `order_by` | string | 否 | `"name"` / `"updated_at"` / `"size_bytes"` |
|
|
504
|
+
| `order` | string | 否 | `"asc"` / `"desc"` |
|
|
505
|
+
| `include_metadata` | boolean | 否 | 是否返回元数据,默认 `true` |
|
|
506
|
+
| `include_urls` | boolean | 否 | 是否返回 URL 字段,默认 `true` |
|
|
507
|
+
|
|
508
|
+
**响应**:`folder`、`items`、`total`、`page`、`size`、`next_marker`。`items[].node_type` 区分 `folder` / `object`。
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## storage.rename_folder
|
|
513
|
+
|
|
514
|
+
重命名目录。根目录不可改名。
|
|
515
|
+
|
|
516
|
+
**参数**:`folder_id` 或 `path`,`new_name` 必填;可选 `bucket`、`owner_aid`、`expected_version`。
|
|
517
|
+
|
|
518
|
+
**响应**:更新后的 `folder` 视图。
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## storage.move_folder
|
|
523
|
+
|
|
524
|
+
移动目录。不能移动到自身或自身子目录。
|
|
525
|
+
|
|
526
|
+
**参数**:`folder_id` 或 `path`,目标目录通过 `dst_parent_folder_id` 或 `dst_parent_path` 指定;可选 `new_name`、`bucket`、`owner_aid`、`expected_version`。
|
|
527
|
+
|
|
528
|
+
**响应**:更新后的 `folder` 视图。
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## storage.delete_folder
|
|
533
|
+
|
|
534
|
+
删除目录。
|
|
535
|
+
|
|
536
|
+
**参数**:
|
|
537
|
+
|
|
538
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
539
|
+
|------|------|------|------|
|
|
540
|
+
| `folder_id` / `path` | string | 是 | 待删除目录 |
|
|
541
|
+
| `recursive` | boolean | 否 | 非空目录必须传 `true` |
|
|
542
|
+
| `dry_run` | boolean | 否 | 只预览将删除的目录/对象 |
|
|
543
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
544
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
545
|
+
|
|
546
|
+
**响应**:`deleted_folders`、`deleted_objects`、`deleted_object_items`、`errors`;`dry_run=true` 时返回预览列表。
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
## storage.resolve_path
|
|
551
|
+
|
|
552
|
+
按路径解析目录或对象。
|
|
553
|
+
|
|
554
|
+
**参数**:`path` 必填;可选 `expected_type`(`"any"` / `"object"` / `"folder"`)、`bucket`、`owner_aid`。
|
|
555
|
+
|
|
556
|
+
**响应**:`type`、`folder_id` 或 `object_id`、`path`、`status`。
|
|
557
|
+
|
|
558
|
+
---
|
|
559
|
+
|
|
560
|
+
## storage.move_object
|
|
561
|
+
|
|
562
|
+
移动或重命名对象。
|
|
563
|
+
|
|
564
|
+
**参数**:对象选择器(`object_id` / `object_key` / `path`),目标目录 `destination_parent_folder_id` 或 `dst_parent_path`(别名 `destination_parent_path`);可选 `new_name`、`conflict_policy`(`"reject"` / `"replace"` / `"keep_both"`)、`expected_version`。
|
|
565
|
+
|
|
566
|
+
**响应**:返回 `object`,同时在顶层展开对象视图字段。
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## storage.copy_object
|
|
571
|
+
|
|
572
|
+
复制对象,底层内容按 CAS 引用计数复用。
|
|
573
|
+
|
|
574
|
+
**参数**:源对象选择器(`object_id` / `object_key` / `path`,也接受 `src_object_key` / `src_path`),目标 `dst_object_key` / `dst_path` 或目标父目录 + `new_name`;可选 `conflict_policy`、`copy_metadata`。
|
|
575
|
+
|
|
576
|
+
**响应**:新对象视图。
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
## storage.batch_delete
|
|
581
|
+
|
|
582
|
+
批量删除对象或目录。
|
|
583
|
+
|
|
584
|
+
**参数**:
|
|
585
|
+
|
|
586
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
587
|
+
|------|------|------|------|
|
|
588
|
+
| `items` | array | 否 | 每项含 `type`、`object_id` / `object_key` / `path` / `folder_id` |
|
|
589
|
+
| `object_keys` | string[] | 否 | 兼容简写,转为对象删除 |
|
|
590
|
+
| `recursive` | boolean | 否 | 删除目录时是否递归 |
|
|
591
|
+
| `dry_run` | boolean | 否 | 只预览 |
|
|
592
|
+
|
|
593
|
+
**响应**:`deleted`、`errors`、`deleted_count`、`summary`。
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
## storage.batch_head_object
|
|
598
|
+
|
|
599
|
+
批量查询对象元数据。
|
|
600
|
+
|
|
601
|
+
**参数**:`object_ids`、`paths` 至少提供一类;可选 `owner_aid`、`bucket`、`include_missing`、`include_metadata`、`include_urls`。
|
|
602
|
+
|
|
603
|
+
**响应**:`items` 和 `errors`。
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## storage.set_object_meta
|
|
608
|
+
|
|
609
|
+
更新对象元数据和可选 MIME 类型。
|
|
610
|
+
|
|
611
|
+
**参数**:对象选择器,`metadata`;可选 `merge`(默认 `true`)、`content_type`、`expected_version`。
|
|
612
|
+
|
|
613
|
+
**响应**:更新后的对象视图。
|
|
614
|
+
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
## storage.get_object_url
|
|
618
|
+
|
|
619
|
+
获取稳定对象 URL。
|
|
620
|
+
|
|
621
|
+
**参数**:对象选择器;可选 `include_path_url`。
|
|
622
|
+
|
|
623
|
+
**响应**:`object_id`、`object_url`、`path_url`、`stable`。
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
## storage.append_object
|
|
628
|
+
|
|
629
|
+
向对象尾部追加 base64 内容;对象不存在时创建。
|
|
630
|
+
|
|
631
|
+
**参数**:与 `storage.put_object` 类似,`content` 必填;可选 `object_key` / `path` / `name`、`bucket`、`owner_aid`、`content_type`、`metadata`、`expected_version`、`is_private`。
|
|
632
|
+
|
|
633
|
+
**响应**:对象视图。
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## storage.create_upload_session
|
|
638
|
+
|
|
639
|
+
获取上传用 presigned URL。
|
|
640
|
+
|
|
641
|
+
### 参数
|
|
642
|
+
|
|
643
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
644
|
+
|------|------|------|------|
|
|
645
|
+
| `object_key` | string | 是 | 对象路径 |
|
|
646
|
+
| `size_bytes` | integer | 否 | 声明的文件大小(字节)。当前实现允许省略,但建议传入用于客户端追踪与最终校验 |
|
|
647
|
+
| `content_type` | string | 否 | MIME 类型,默认 `"application/octet-stream"` |
|
|
648
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
649
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
650
|
+
| `expected_version` | integer | 否 | 乐观并发控制版本号 |
|
|
651
|
+
| `overwrite` / `force` | boolean | 否 | 默认 `false`;允许覆盖已有目标,提供版本条件时仍须匹配 |
|
|
652
|
+
| `expire_in_seconds` | integer | 否 | URL 有效期(秒),默认 3600 |
|
|
653
|
+
|
|
654
|
+
### 响应
|
|
655
|
+
|
|
656
|
+
| 字段 | 类型 | 说明 |
|
|
657
|
+
|------|------|------|
|
|
658
|
+
| `upload_url` | string | 上传用 presigned URL |
|
|
659
|
+
| `session_id` | string | 本次上传会话 ID;普通对象与规范文件均返回 |
|
|
660
|
+
| `expire_at` | integer | URL 过期时间戳 |
|
|
661
|
+
| `owner_aid` | string | 所有者 AID |
|
|
662
|
+
| `bucket` | string | 存储桶 |
|
|
663
|
+
| `object_key` | string | 对象路径 |
|
|
664
|
+
| `name` | string | 对象名称 |
|
|
665
|
+
| `path` | string | 对象路径 |
|
|
666
|
+
| `path_url` | string | Storage path URL |
|
|
667
|
+
| `url` / `download_url` | string | AID 风格对象 URL |
|
|
668
|
+
| `logical_url` | string | Storage 直链 URL |
|
|
669
|
+
| `content_type` | string | MIME 类型 |
|
|
670
|
+
| `size_bytes` | integer | 声明的文件大小 |
|
|
671
|
+
| `overwrite` | boolean | 是否覆盖已有对象 |
|
|
672
|
+
|
|
673
|
+
客户端获得 `upload_url` 后,通过 HTTP PUT 上传文件数据,再把同一 `session_id` 传给 `complete_upload`。会话绑定申请者、目标、声明大小和版本条件,正文先写入独立临时对象。
|
|
674
|
+
|
|
675
|
+
服务端核对会话申请者、目标及有效期,验证完整内容后发布。兼容调用省略 `session_id` 时,服务端仅在当前申请者和目标存在唯一已上传且未过期的会话时自动匹配;存在多个候选时必须显式提供。规范 `default/agent.md` 与 `default/sub_aids/{sub_aid}/owner.md` 仍执行完整原子发布,失败保留旧完整文件;上传会话不记录 Ownership 关系事实或路径历史。
|
|
676
|
+
|
|
677
|
+
> 当前实现会对 BlobStore 返回的 loopback URL 做对外地址规范化:优先使用 `KITE_STORAGE_EXTERNAL_URL`,否则按 `storage.{issuer}` 形式改写。对外地址不可使用 `127.0.0.1` 或 `localhost`。
|
|
678
|
+
|
|
679
|
+
> 当前实现会在 `create_upload_session` 阶段按声明的 `size_bytes` 校验最大文件限制;实际 blob 大小、SHA-256 和配额在 `storage.complete_upload` 阶段校验。
|
|
680
|
+
|
|
681
|
+
---
|
|
682
|
+
|
|
683
|
+
## storage.complete_upload
|
|
684
|
+
|
|
685
|
+
完成上传,提交校验信息。
|
|
686
|
+
|
|
687
|
+
### 参数
|
|
688
|
+
|
|
689
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
690
|
+
|------|------|------|------|
|
|
691
|
+
| `object_key` | string | 条件 | 对象路径;提供 `session_id` 时可省略,若提供则必须与原会话目标一致 |
|
|
692
|
+
| `session_id` | string | 否 | 沿用 `create_upload_session` 返回的会话;省略时仅支持上述唯一会话匹配或既有无会话路径 |
|
|
693
|
+
| `sha256` | string | 否 | 文件 SHA-256 哈希;提供则校验完整性,`skip_blob=true` 时必填 |
|
|
694
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
695
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户 |
|
|
696
|
+
| `content_type` | string | 否 | MIME 类型,默认 `"application/octet-stream"` |
|
|
697
|
+
| `is_private` | boolean | 否 | 是否私有,默认 `true` |
|
|
698
|
+
| `size_bytes` | integer | 否 | 预期文件大小(用于校验) |
|
|
699
|
+
| `skip_blob` | boolean | 否 | 秒传模式,默认 `false`;为 `true` 时跳过 blob 上传,必须提供 `sha256`,且当前 owner 已拥有相同内容 |
|
|
700
|
+
| `expected_version` | integer | 否 | 乐观并发控制版本号;会话保存过版本条件时必须沿用,传入不同值返回冲突;原会话未设置时可在完成请求中提供 |
|
|
701
|
+
| `overwrite` / `force` | boolean | 否 | 默认 `false`;与会话原有覆盖开关合并,不绕过版本条件 |
|
|
702
|
+
| `expire_in_seconds` | integer | 否 | 过期时间(秒) |
|
|
703
|
+
| `metadata` | object | 否 | 自定义元数据 |
|
|
704
|
+
|
|
705
|
+
### 响应
|
|
706
|
+
|
|
707
|
+
| 字段 | 类型 | 说明 |
|
|
708
|
+
|------|------|------|
|
|
709
|
+
| `url` | string | **AID 风格 URL(默认/推荐)**:`https://{owner_aid}/{object_key}`,经 NameService fallback 302 跳转 |
|
|
710
|
+
| `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,无跳转 |
|
|
711
|
+
| `owner_aid` | string | 所有者 AID |
|
|
712
|
+
| `bucket` | string | 存储桶 |
|
|
713
|
+
| `object_key` | string | 对象路径 |
|
|
714
|
+
| `size_bytes` | integer | 对象大小(字节) |
|
|
715
|
+
| `content_type` | string | MIME 类型 |
|
|
716
|
+
| `sha256` | string | SHA-256 哈希 |
|
|
717
|
+
| `version` | integer | 版本号 |
|
|
718
|
+
| `etag` | string | 实体标签 |
|
|
719
|
+
| `updated_at` | integer | 更新时间戳 |
|
|
720
|
+
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
## storage.create_download_ticket
|
|
724
|
+
|
|
725
|
+
获取对象下载 URL。私有对象要分享给指定 AID 时,使用 `storage.create_share_link` 并设置 `allowed_aids`。
|
|
726
|
+
|
|
727
|
+
### 参数
|
|
728
|
+
|
|
729
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
730
|
+
|------|------|------|------|
|
|
731
|
+
| `object_key` | string | 是 | 对象路径 |
|
|
732
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
733
|
+
| `owner_aid` | string | 否 | 所有者 AID,默认当前用户(公开对象可指定其他 AID) |
|
|
734
|
+
| `expire_in_seconds` | integer | 否 | URL 有效期(秒),默认 3600 |
|
|
735
|
+
|
|
736
|
+
支持可选 `if_sha256`(string,64 位十六进制摘要);摘要匹配时可返回 `not_modified: true`、对象元数据及 `read_cache`,不签发新的 URL/token。调用方须持有匹配且已验证的正文,否则重新请求完整下载票据。权威对象存在性与完整原件校验使用 `storage.head_object/get_object` 或 `storage.fs.stat` 的权威入口。
|
|
737
|
+
|
|
738
|
+
### 响应
|
|
739
|
+
|
|
740
|
+
| 字段 | 类型 | 说明 |
|
|
741
|
+
|------|------|------|
|
|
742
|
+
| `url` | string | **AID 风格 URL(默认/推荐)**:public 文件为 `https://{owner_aid}/{object_key}`,private 文件为 `https://{owner_aid}/{object_key}?t={token}`。经 NameService fallback 302 跳转到 storage 服务,storage 实时鉴权后出文件(302 到 blob 后端,对客户端透明) |
|
|
743
|
+
| `logical_url` | string | 直链 URL:`https://storage.{issuer}/{user}/{object_key}`,直达 storage 服务,无 NameService 跳转 |
|
|
744
|
+
| `download_url` | string | 同 `url`(兼容旧客户端,格式已统一) |
|
|
745
|
+
| `expire_at` | integer | token 过期时间戳(Unix 秒),public 文件此字段无实际约束 |
|
|
746
|
+
| `token` | string | private 文件的不透明访问 token(10 位 Base62),public 文件无此字段 |
|
|
747
|
+
| `file_name` | string | 文件名(从 object_key 提取) |
|
|
748
|
+
| `size_bytes` | integer | 文件大小(字节) |
|
|
749
|
+
| `content_type` | string | MIME 类型 |
|
|
750
|
+
| `sha256` | string | SHA-256 哈希 |
|
|
751
|
+
| `version` | integer | 版本号 |
|
|
752
|
+
| `etag` | string | 实体标签 |
|
|
753
|
+
|
|
754
|
+
`url` 是推荐使用的干净链接。访问时 storage 服务实时鉴权:public 文件直接通过,private 文件需 `?t=` token 或 `Authorization: Bearer <AID JWT>` 头证明 owner 身份。鉴权通过后 storage 302 到 blob 后端完成实际下载,这一步对客户端完全透明。
|
|
755
|
+
|
|
756
|
+
普通票据响应还可带 `read_cache`。该策略供 SDK 判断下载后正文是否可缓存,票据 URL、token、headers 及 `expire_at` 不因此成为可长期复用的正文缓存;条件未变化响应的处理见 [策略字段与条件读取](#策略字段与条件读取)。
|
|
757
|
+
|
|
758
|
+
### 数据面 HTTP 下载流程
|
|
759
|
+
|
|
760
|
+
1. 通过控制面 RPC `storage.create_download_ticket` 获取短 TTL 的下载票据,不把长期对象 URL 当作最终下载地址。
|
|
761
|
+
2. 优先使用返回的 `url` / `download_url`,完整保留查询参数。URL 已包含 `?t=` 时,该值就是资源域签发的能力凭据,按原样请求即可,不要替换为 AID access token。
|
|
762
|
+
3. 只有目标端点明确要求 `Authorization: Bearer <AID JWT>` 时,才在发起请求前读取当前 token:Python 使用 `get_access_token()`,TypeScript / JavaScript 使用 `getAccessToken()`,Go 使用 `GetAccessToken()`。不得长期保存 `authenticate()` 首次返回的 token,也不得跨多次请求缓存 getter 的返回值。
|
|
763
|
+
4. getter 只读后台刷新任务维护的缓存,不主动刷新。返回空值时先完成身份加载和认证/连接,不发送空 Bearer。跨 issuer 下载必须使用资源所在域签发的 `?t=` 票据,不能把调用方所在域的 AID JWT 发给远端 storage。
|
|
764
|
+
5. Bearer 请求收到 401/403 时,重新读取一次 getter;仅当 token 已变化时最多重试一次。token 未变化时保留真实鉴权/授权错误,不得无限重试。票据过期则重新调用 `create_download_ticket`,不能靠刷新 AID token 延长票据。
|
|
765
|
+
6. 跟随 302 时不得把 AID Bearer 转发到不同 origin 的 blob backend;下载完成后校验 `size_bytes` / `sha256`。
|
|
766
|
+
|
|
767
|
+
SDK Storage VFS 会编排 ticket、HTTP GET 和完整性校验。应用只有在绕过 VFS、自行执行 HTTP 请求时,才需要直接处理上述凭据生命周期。
|
|
768
|
+
|
|
769
|
+
---
|
|
770
|
+
|
|
771
|
+
## 事件
|
|
772
|
+
|
|
773
|
+
### event/storage.object_changed
|
|
774
|
+
|
|
775
|
+
对象变更时推送。
|
|
776
|
+
|
|
777
|
+
**Payload**:
|
|
778
|
+
|
|
779
|
+
```json
|
|
780
|
+
{
|
|
781
|
+
"module_id": "storage",
|
|
782
|
+
"action": "put",
|
|
783
|
+
"owner_aid": "alice.agentid.pub",
|
|
784
|
+
"object_key": "notes/hello.txt"
|
|
785
|
+
}
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
| 字段 | 类型 | 说明 |
|
|
789
|
+
|------|------|------|
|
|
790
|
+
| `module_id` | string | 当前模块 ID,通常为 `"storage"` |
|
|
791
|
+
| `action` | string | `"put"` 或 `"delete"` |
|
|
792
|
+
| `owner_aid` | string | 对象所有者 AID |
|
|
793
|
+
| `object_key` | string | 对象路径 |
|
|
794
|
+
|
|
795
|
+
> 当前实现在 `storage.put_object` 成功后推送 `action="put"`,`storage.delete_object` 返回 `deleted=true` 时推送 `action="delete"`,`storage.complete_upload` 成功后也会推送 `action="put"` 事件。
|
|
796
|
+
|
|
797
|
+
---
|
|
798
|
+
|
|
799
|
+
## storage.get_limits
|
|
800
|
+
|
|
801
|
+
查询当前用户的上传限制和配额使用情况。客户端可在上传前调用此方法,避免超限后浪费流量。
|
|
802
|
+
|
|
803
|
+
### 参数
|
|
804
|
+
|
|
805
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
806
|
+
|------|------|------|------|
|
|
807
|
+
| `owner_aid` | string | 否 | 默认当前用户;仅允许查询自己的限制和配额 |
|
|
808
|
+
|
|
809
|
+
### 响应
|
|
810
|
+
|
|
811
|
+
| 字段 | 类型 | 说明 |
|
|
812
|
+
|------|------|------|
|
|
813
|
+
| `max_inline_bytes` | integer | `put_object` 内联上限,服务默认 65,536 字节,以响应配置值为准 |
|
|
814
|
+
| `max_file_size_bytes` | integer | 单文件大小上限,服务默认 100 MiB,以响应配置值为准 |
|
|
815
|
+
| `quota_total_bytes` | integer | 用户总配额(0 表示无限制) |
|
|
816
|
+
| `quota_used_bytes` | integer | 已用配额 |
|
|
817
|
+
|
|
818
|
+
### 示例
|
|
819
|
+
|
|
820
|
+
```python
|
|
821
|
+
limits = await client.call("storage.get_limits", {})
|
|
822
|
+
print(f"单文件上限: {limits['max_file_size_bytes']} bytes")
|
|
823
|
+
print(f"配额: {limits['quota_used_bytes']}/{limits['quota_total_bytes']}")
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
---
|
|
827
|
+
|
|
828
|
+
## storage.check_upload
|
|
829
|
+
|
|
830
|
+
上传预检:一次调用同时回答"文件是否超限"和"当前 owner 是否可秒传"。客户端应在计算完文件 SHA-256 后、实际上传前调用。
|
|
831
|
+
|
|
832
|
+
> `check_upload` / `complete_upload(skip_blob=true)` 只允许复用当前 owner 已拥有的内容,避免跨 owner 暴露全局 CAS 存在性或跳过上传克隆他人私有内容。不同 owner 上传相同内容时,仍会在完成上传后归一到同一个 CAS blob,由服务端引用计数管理物理去重。
|
|
833
|
+
|
|
834
|
+
### 参数
|
|
835
|
+
|
|
836
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
837
|
+
|------|------|------|------|
|
|
838
|
+
| `sha256` | string | 是 | 文件内容的 SHA-256 hex(64 字符) |
|
|
839
|
+
| `size_bytes` | integer | 是 | 文件大小(字节) |
|
|
840
|
+
| `owner_aid` | string | 否 | 目标 owner,默认当前用户;未提供目标路径时必须等于当前登录 AID |
|
|
841
|
+
| `object_key` | string | 否 | 目标路径;提供时按该目标的写权限和挂载解析进行预检 |
|
|
842
|
+
| `bucket` | string | 否 | 目标存储桶,默认 `"default"` |
|
|
843
|
+
|
|
844
|
+
### 响应
|
|
845
|
+
|
|
846
|
+
| 字段 | 类型 | 说明 |
|
|
847
|
+
|------|------|------|
|
|
848
|
+
| `within_limit` | boolean | 文件大小是否在限制内 |
|
|
849
|
+
| `exists` | boolean | 当前 owner 是否已拥有相同内容且 CAS blob 可用 |
|
|
850
|
+
| `skip_upload` | boolean | 是否可跳过上传(秒传) |
|
|
851
|
+
|
|
852
|
+
### 使用场景
|
|
853
|
+
|
|
854
|
+
```python
|
|
855
|
+
import hashlib
|
|
856
|
+
|
|
857
|
+
data = open("large_file.bin", "rb").read()
|
|
858
|
+
sha256 = hashlib.sha256(data).hexdigest()
|
|
859
|
+
|
|
860
|
+
check = await client.call("storage.check_upload", {
|
|
861
|
+
"sha256": sha256,
|
|
862
|
+
"size_bytes": len(data),
|
|
863
|
+
})
|
|
864
|
+
|
|
865
|
+
if not check["within_limit"]:
|
|
866
|
+
print("文件超限,无法上传")
|
|
867
|
+
elif check["skip_upload"]:
|
|
868
|
+
# 秒传:当前 owner 已拥有相同内容,跳过上传直接 complete
|
|
869
|
+
await client.call("storage.complete_upload", {
|
|
870
|
+
"object_key": "my/file.bin",
|
|
871
|
+
"sha256": sha256,
|
|
872
|
+
"size_bytes": len(data),
|
|
873
|
+
"skip_blob": True,
|
|
874
|
+
})
|
|
875
|
+
else:
|
|
876
|
+
# 正常上传流程
|
|
877
|
+
session = await client.call("storage.create_upload_session", {
|
|
878
|
+
"object_key": "my/file.bin",
|
|
879
|
+
"size_bytes": len(data),
|
|
880
|
+
})
|
|
881
|
+
# HTTP PUT ...
|
|
882
|
+
await client.call("storage.complete_upload", {
|
|
883
|
+
"object_key": "my/file.bin",
|
|
884
|
+
"sha256": sha256,
|
|
885
|
+
"size_bytes": len(data),
|
|
886
|
+
})
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
---
|
|
890
|
+
|
|
891
|
+
## storage.create_share_link
|
|
892
|
+
|
|
893
|
+
创建分享链接。生成一个短码(share_id),通过短码可访问对象,支持授权 AID 白名单、有效期、使用次数限制。
|
|
894
|
+
|
|
895
|
+
### 参数
|
|
896
|
+
|
|
897
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
898
|
+
|------|------|------|------|
|
|
899
|
+
| `object_key` | string | 是 | 被分享对象的路径 |
|
|
900
|
+
| `bucket` | string | 否 | 存储桶,默认 `"default"` |
|
|
901
|
+
| `owner_aid` | string | 否 | 对象所有者 AID,默认当前用户(仅可分享自己的对象) |
|
|
902
|
+
| `allowed_aids` | string[] | 否 | 授权访问的 AID 列表,默认 `["*"]`(任意 AID 可访问);含 `"*"` 即视为公开 |
|
|
903
|
+
| `expire_in_seconds` | integer | 否 | 有效期(秒),默认 86400(1 天),`0` 表示永不过期 |
|
|
904
|
+
| `max_uses` | integer | 否 | 最大使用次数,默认 `0`(无限制) |
|
|
905
|
+
|
|
906
|
+
### 响应
|
|
907
|
+
|
|
908
|
+
| 字段 | 类型 | 说明 |
|
|
909
|
+
|------|------|------|
|
|
910
|
+
| `share_id` | string | 10 位 Base62 分享短码 |
|
|
911
|
+
| `url` | string | 默认分享 URL:`https://{owner_aid}/s/{share_id}`,经 NameService 跳转 |
|
|
912
|
+
| `share_url` | string | Storage 直链:`https://storage.{issuer}/s/{share_id}`,直接访问 Storage 服务 |
|
|
913
|
+
| `expire_at` | integer | 分享链接过期时间戳(Unix 秒),`0` 表示永不过期 |
|
|
914
|
+
| `max_uses` | integer | 最大使用次数,`0` 表示无限制 |
|
|
915
|
+
| `allowed_aids` | string[] | 授权 AID 列表,`["*"]` 表示公开 |
|
|
916
|
+
| `target` | object | 被分享对象的元数据,不包含空 URL 字段;其中 `expire_at` 为对象过期时间 |
|
|
917
|
+
|
|
918
|
+
> `url` 经 NameService 302 跳转到 `share_url`;两者都通过 `share_id` 定位到同一条分享记录鉴权。
|
|
919
|
+
> share_id 指向 `(owner_aid, bucket, object_key)` 逻辑引用,非内容快照:对象改名/移动后原 share_id 失效,内容覆盖后下载到新内容。
|
|
920
|
+
|
|
921
|
+
### 示例
|
|
922
|
+
|
|
923
|
+
```python
|
|
924
|
+
result = await client.call("storage.create_share_link", {
|
|
925
|
+
"object_key": "docs/report.pdf",
|
|
926
|
+
"allowed_aids": ["alice.agentid.pub"],
|
|
927
|
+
"expire_in_seconds": 3600,
|
|
928
|
+
"max_uses": 5,
|
|
929
|
+
})
|
|
930
|
+
share_url = result["url"] # https://alice.agentid.pub/s/Ab3xK9mZ2q
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
---
|
|
934
|
+
|
|
935
|
+
## storage.list_share_links
|
|
936
|
+
|
|
937
|
+
列举分享链接,可按 bucket / object_key 过滤。仅返回当前用户自己创建的链接。
|
|
938
|
+
|
|
939
|
+
### 参数
|
|
940
|
+
|
|
941
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
942
|
+
|------|------|------|------|
|
|
943
|
+
| `bucket` | string | 否 | 按存储桶过滤 |
|
|
944
|
+
| `object_key` | string | 否 | 按对象路径过滤 |
|
|
945
|
+
|
|
946
|
+
### 响应
|
|
947
|
+
|
|
948
|
+
| 字段 | 类型 | 说明 |
|
|
949
|
+
|------|------|------|
|
|
950
|
+
| `links` | array | 分享链接列表 |
|
|
951
|
+
|
|
952
|
+
每个 link 包含:
|
|
953
|
+
|
|
954
|
+
| 字段 | 类型 | 说明 |
|
|
955
|
+
|------|------|------|
|
|
956
|
+
| `share_id` | string | 分享短码 |
|
|
957
|
+
| `url` | string | 默认分享 URL(隐藏路径):`https://{owner_aid}/s/{share_id}` |
|
|
958
|
+
| `share_url` | string | Storage 直链:`https://storage.{issuer}/s/{share_id}` |
|
|
959
|
+
| `object_key` | string | 被分享对象路径 |
|
|
960
|
+
| `target_type` | string | 分享目标类型 |
|
|
961
|
+
| `target_id` | string | 分享目标 ID |
|
|
962
|
+
| `bucket` | string | 存储桶 |
|
|
963
|
+
| `allowed_aids` | string[] | 授权 AID 列表,`["*"]` 表示公开 |
|
|
964
|
+
| `expire_at` | integer | 过期时间戳(秒),`0` 表示永不过期 |
|
|
965
|
+
| `max_uses` | integer | 最大使用次数,`0` 表示无限制 |
|
|
966
|
+
| `used_count` | integer | 已使用次数 |
|
|
967
|
+
| `created_at` | integer | 创建时间戳(毫秒) |
|
|
968
|
+
|
|
969
|
+
---
|
|
970
|
+
|
|
971
|
+
## storage.revoke_share_link
|
|
972
|
+
|
|
973
|
+
撤销分享链接。
|
|
974
|
+
|
|
975
|
+
### 参数
|
|
976
|
+
|
|
977
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
978
|
+
|------|------|------|------|
|
|
979
|
+
| `share_id` | string | 是 | 待撤销的分享短码 |
|
|
980
|
+
|
|
981
|
+
### 响应
|
|
982
|
+
|
|
983
|
+
| 字段 | 类型 | 说明 |
|
|
984
|
+
|------|------|------|
|
|
985
|
+
| `revoked` | boolean | 是否成功撤销 |
|
|
986
|
+
| `share_id` | string | 被撤销的分享短码 |
|
|
987
|
+
|
|
988
|
+
> 链接不存在或已撤销时返回通用错误(`-32000`)。
|
|
989
|
+
|
|
990
|
+
---
|
|
991
|
+
|
|
992
|
+
## storage.get_by_share
|
|
993
|
+
|
|
994
|
+
通过分享短码读取对象。公开分享无需额外授权;私有白名单分享需要请求者 AID 在 `allowed_aids` 内。
|
|
995
|
+
|
|
996
|
+
**参数**:
|
|
997
|
+
|
|
998
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
999
|
+
|------|------|------|------|
|
|
1000
|
+
| `share_id` | string | 是 | 分享短码 |
|
|
1001
|
+
|
|
1002
|
+
可选 `if_sha256`(string,64 位十六进制摘要)用于已验证完整正文的条件读取。
|
|
1003
|
+
|
|
1004
|
+
**响应**:小对象返回 `content`;大对象返回 `download_url`,该响应不能按空 `content` 解码。共同返回 `object_id`、`object_key`、`path`、`size_bytes`、`content_type`、`sha256` 和可选 `read_cache`。当前访问校验通过且摘要一致时可返回 `not_modified: true` 并省略正文/URL,复用要求见 [策略字段与条件读取](#策略字段与条件读取)。有限次分享允许 SDK 复用已验证的本地正文;本地缓存命中及无正文的 `not_modified` 不消耗分享次数;inline 返回正文时计次,大对象按下载授权签发/跳转计次,见[默认读缓存](#sdk-默认读缓存)。
|
|
1005
|
+
|
|
1006
|
+
---
|
|
1007
|
+
|
|
1008
|
+
## storage.fs.list
|
|
1009
|
+
|
|
1010
|
+
列目录(POSIX `ls`)。混合返回子目录/对象/软链/可用挂载点,排序 dir < file < symlink < mount。群 owner 路径回退到 Group FS 子节点。
|
|
1011
|
+
|
|
1012
|
+
### 参数
|
|
1013
|
+
|
|
1014
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1015
|
+
|------|------|------|------|------|
|
|
1016
|
+
| `path` | string | 否 | `""` | 目录路径(空=根) |
|
|
1017
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1018
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1019
|
+
| `page` | integer | 否 | `1` | 页码 |
|
|
1020
|
+
| `size` | integer | 否 | `100` | 每页条数(受 `list_max_limit` 上限约束) |
|
|
1021
|
+
| `marker` | string | 否 | — | SDK 兼容参数,当前服务不消费该游标 |
|
|
1022
|
+
| `token` | string | 否 | — | 访问 token |
|
|
1023
|
+
|
|
1024
|
+
### 响应
|
|
1025
|
+
|
|
1026
|
+
| 字段 | 类型 | 说明 |
|
|
1027
|
+
|------|------|------|
|
|
1028
|
+
| `nodes` | array | 节点列表,每项 `{type, node_type, name, path, mode, size, mtime, owner_principal}` |
|
|
1029
|
+
| `items` | array | 同 `nodes`(兼容别名) |
|
|
1030
|
+
| `total` | integer | 当前可见候选条数;普通调用不保证全目录精确总数 |
|
|
1031
|
+
| `page` / `size` | integer | 页码回显与截断上限;当前服务不按 `page` 偏移 |
|
|
1032
|
+
| `next_marker` | null | 当前固定为 `null`,不能据此遍历后续页 |
|
|
1033
|
+
|
|
1034
|
+
`type` 取值:`file` / `dir` / `symlink` / `mount`。
|
|
1035
|
+
|
|
1036
|
+
---
|
|
1037
|
+
|
|
1038
|
+
## storage.fs.find
|
|
1039
|
+
|
|
1040
|
+
递归查找(POSIX `find`),支持 name/type/size/mtime 过滤与分页。Group FS 与 `.collab` 注册表有回退。
|
|
1041
|
+
|
|
1042
|
+
### 参数
|
|
1043
|
+
|
|
1044
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1045
|
+
|------|------|------|------|------|
|
|
1046
|
+
| `path` | string | 是 | — | 起始目录 |
|
|
1047
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1048
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1049
|
+
| `name` | string | 否 | — | 名称 glob(如 `*.md`) |
|
|
1050
|
+
| `type` | string | 否 | — | 节点类型过滤:`f`/`d`/`l`(SDK 形参 `node_type`) |
|
|
1051
|
+
| `size` | string | 否 | — | 大小表达式(如 `+1M`) |
|
|
1052
|
+
| `mtime` | string | 否 | — | 修改时间表达式 |
|
|
1053
|
+
| `page` | integer | 否 | `1` | 页码 |
|
|
1054
|
+
| `page_size` | integer | 否 | `1000` | 每页条数,最大 5000 |
|
|
1055
|
+
| `token` | string | 否 | — | 访问 token |
|
|
1056
|
+
|
|
1057
|
+
### 响应
|
|
1058
|
+
|
|
1059
|
+
同 `storage.fs.list`:`{nodes, items, total, page, size, next_marker}`。
|
|
1060
|
+
|
|
1061
|
+
---
|
|
1062
|
+
|
|
1063
|
+
## storage.fs.df
|
|
1064
|
+
|
|
1065
|
+
配额/用量报告(POSIX `df`),含每 owner 卷(过期卷重新计算)。
|
|
1066
|
+
|
|
1067
|
+
### 参数
|
|
1068
|
+
|
|
1069
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1070
|
+
|------|------|------|------|------|
|
|
1071
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1072
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1073
|
+
|
|
1074
|
+
### 响应
|
|
1075
|
+
|
|
1076
|
+
| 字段 | 类型 | 说明 |
|
|
1077
|
+
|------|------|------|
|
|
1078
|
+
| `owner_aid` / `bucket` | string | 所有者 / 桶 |
|
|
1079
|
+
| `used_bytes` | integer | 已用字节 |
|
|
1080
|
+
| `object_count` | integer | 对象数 |
|
|
1081
|
+
| `quota_bytes` | integer | 配额上限 |
|
|
1082
|
+
| `avail_bytes` | integer | 剩余可用 |
|
|
1083
|
+
| `volumes` | array | 每卷用量明细 |
|
|
1084
|
+
|
|
1085
|
+
---
|
|
1086
|
+
|
|
1087
|
+
## storage.fs.stat
|
|
1088
|
+
|
|
1089
|
+
查节点元数据(POSIX `stat`)。`follow_final=true`,解析末级软链 target。
|
|
1090
|
+
|
|
1091
|
+
可传 `consistency: authoritative`;此模式使用 [权威对象结果](#权威读取与完整发布),不是普通 fs 节点视图。
|
|
1092
|
+
|
|
1093
|
+
### 参数
|
|
1094
|
+
|
|
1095
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1096
|
+
|------|------|------|------|------|
|
|
1097
|
+
| `path` | string | 是 | — | 节点路径 |
|
|
1098
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1099
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1100
|
+
| `token` | string | 否 | — | 访问 token |
|
|
1101
|
+
| `consistency` | string | 否 | — | 传 `authoritative` 时返回权威对象结果 |
|
|
1102
|
+
|
|
1103
|
+
### 响应
|
|
1104
|
+
|
|
1105
|
+
fs 节点视图:`{type, node_type, name, path, mode, size, mtime, owner_principal, ...}`。
|
|
1106
|
+
|
|
1107
|
+
---
|
|
1108
|
+
|
|
1109
|
+
## storage.fs.lstat
|
|
1110
|
+
|
|
1111
|
+
查节点(POSIX `lstat`),**不跟随末级软链**——返回软链本身(携带 `dangling` 悬空标志),不返回 target。
|
|
1112
|
+
|
|
1113
|
+
### 参数
|
|
1114
|
+
|
|
1115
|
+
同 `storage.fs.stat`。
|
|
1116
|
+
|
|
1117
|
+
### 响应
|
|
1118
|
+
|
|
1119
|
+
fs 节点视图;若为软链,返回软链节点本身(含 `dangling` 标志)。
|
|
1120
|
+
|
|
1121
|
+
---
|
|
1122
|
+
|
|
1123
|
+
## storage.fs.mkdir
|
|
1124
|
+
|
|
1125
|
+
建目录(POSIX `mkdir`)。委托 `create_folder`。
|
|
1126
|
+
|
|
1127
|
+
### 参数
|
|
1128
|
+
|
|
1129
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1130
|
+
|------|------|------|------|------|
|
|
1131
|
+
| `path` | string | 是 | — | 目录路径 |
|
|
1132
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1133
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1134
|
+
| `parents` | boolean | 否 | `false` | 递归创建父目录(类 `mkdir -p`) |
|
|
1135
|
+
|
|
1136
|
+
### 响应
|
|
1137
|
+
|
|
1138
|
+
fs 目录节点视图。
|
|
1139
|
+
|
|
1140
|
+
---
|
|
1141
|
+
|
|
1142
|
+
## storage.fs.touch
|
|
1143
|
+
|
|
1144
|
+
创建空文件或刷新已有节点的修改时间(POSIX `touch`)。已存在的文件、目录或软链会更新时间戳;不存在时默认创建 0 字节私有文件;`no_create=true` 时不存在不创建并返回 `{touched:false, created:false}`。
|
|
1145
|
+
|
|
1146
|
+
### 参数
|
|
1147
|
+
|
|
1148
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1149
|
+
|------|------|------|------|------|
|
|
1150
|
+
| `path` | string | 是 | — | 目标路径 |
|
|
1151
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1152
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1153
|
+
| `parents` | boolean | 否 | `false` | 创建文件时是否递归创建父目录 |
|
|
1154
|
+
| `no_create` / `noCreate` | boolean | 否 | `false` | 目标不存在时不创建 |
|
|
1155
|
+
| `mtime` | integer | 否 | 当前时间 | Unix 秒或毫秒;小于 `10000000000` 按秒解释 |
|
|
1156
|
+
| `follow_symlinks` / `followSymlinks` | boolean | 否 | `false` | 目标为软链时是否跟随末级软链 |
|
|
1157
|
+
| `content_type` | string | 否 | `"application/octet-stream"` | 新建空文件的 MIME 类型 |
|
|
1158
|
+
| `metadata` | object | 否 | `{}` | 新建空文件的元数据 |
|
|
1159
|
+
| `is_private` | boolean | 否 | `true` | 新建空文件是否私有 |
|
|
1160
|
+
| `ttl_seconds` | integer | 否 | `0` | 新建空文件的过期秒数;不是 `expire_in_seconds` |
|
|
1161
|
+
|
|
1162
|
+
### 响应
|
|
1163
|
+
|
|
1164
|
+
成功返回 fs 节点视图,并额外包含:
|
|
1165
|
+
|
|
1166
|
+
| 字段 | 类型 | 说明 |
|
|
1167
|
+
|------|------|------|
|
|
1168
|
+
| `touched` | boolean | 是否实际更新或创建 |
|
|
1169
|
+
| `created` | boolean | 是否新建了空文件 |
|
|
1170
|
+
|
|
1171
|
+
---
|
|
1172
|
+
|
|
1173
|
+
## storage.fs.remove
|
|
1174
|
+
|
|
1175
|
+
删除文件/目录/软链(POSIX `rm`,目录用 `recursive`)。**拒绝删除挂载点**(须先 unmount)。
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
### 参数
|
|
1179
|
+
|
|
1180
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1181
|
+
|------|------|------|------|------|
|
|
1182
|
+
| `path` | string | 是 | — | 节点路径 |
|
|
1183
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1184
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1185
|
+
| `recursive` | boolean | 否 | `false` | 递归删除目录 |
|
|
1186
|
+
|
|
1187
|
+
### 响应
|
|
1188
|
+
|
|
1189
|
+
| 字段 | 类型 | 说明 |
|
|
1190
|
+
|------|------|------|
|
|
1191
|
+
| `owner_aid` / `bucket` / `path` | string | 目标 |
|
|
1192
|
+
| `removed_count` | integer | 删除节点数 |
|
|
1193
|
+
| `deleted` | boolean | 是否删除成功 |
|
|
1194
|
+
|
|
1195
|
+
---
|
|
1196
|
+
|
|
1197
|
+
## storage.fs.rename
|
|
1198
|
+
|
|
1199
|
+
同 owner/bucket 内移动或改名(POSIX `mv`)。**跨 owner/bucket 被拒**;按节点类型分派到 move_folder / rename_symlink / move_object。
|
|
1200
|
+
|
|
1201
|
+
### 参数
|
|
1202
|
+
|
|
1203
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1204
|
+
|------|------|------|------|------|
|
|
1205
|
+
| `src` | string | 是 | — | 源路径 |
|
|
1206
|
+
| `dst` | string | 是 | — | 目标路径 |
|
|
1207
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1208
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1209
|
+
| `overwrite` | boolean | 否 | `false` | 覆盖已存在目标 |
|
|
1210
|
+
| `expected_version` | integer | 否 | — | 乐观锁版本号 |
|
|
1211
|
+
|
|
1212
|
+
### 响应
|
|
1213
|
+
|
|
1214
|
+
被重命名节点的 fs 节点视图。
|
|
1215
|
+
|
|
1216
|
+
---
|
|
1217
|
+
|
|
1218
|
+
## storage.fs.copy
|
|
1219
|
+
|
|
1220
|
+
复制对象、软链或目录(POSIX `cp`,目录必须传 `recursive=true`)。CAS blob 引用计数复用,支持跨 owner 复制,目标仍须具备写权限。
|
|
1221
|
+
|
|
1222
|
+
### 参数
|
|
1223
|
+
|
|
1224
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1225
|
+
|------|------|------|------|------|
|
|
1226
|
+
| `src` | string | 是 | — | 源路径 |
|
|
1227
|
+
| `dst` | string | 是 | — | 目标路径 |
|
|
1228
|
+
| `owner_aid` | string | 否 | 当前用户 | 源所有者 AID |
|
|
1229
|
+
| `bucket` | string | 否 | `"default"` | 源存储桶 |
|
|
1230
|
+
| `overwrite` | boolean | 否 | `false` | 覆盖已存在目标 |
|
|
1231
|
+
| `follow_symlinks` | boolean | 否 | `false` | 复制软链 target 而非软链本身 |
|
|
1232
|
+
| `recursive` | boolean | 否 | `false` | 递归复制目录及其对象、软链 |
|
|
1233
|
+
| `dst_owner_aid` | string | 否 | 同源 | 目标所有者(SDK 形参 `dst_owner`) |
|
|
1234
|
+
| `dst_bucket` | string | 否 | 同源 | 目标存储桶 |
|
|
1235
|
+
|
|
1236
|
+
### 响应
|
|
1237
|
+
|
|
1238
|
+
被复制节点的 fs 节点视图;目录额外返回 `copied_folders`、`copied_objects`、`copied_symlinks`。四端 VFS 解析为通用 NodeView 后不保留这些计数字段,需要计数时使用 low-level 原始响应。
|
|
1239
|
+
|
|
1240
|
+
---
|
|
1241
|
+
|
|
1242
|
+
## storage.fs.mount
|
|
1243
|
+
|
|
1244
|
+
挂载卷或他人子树进 owner 命名空间。`readonly` 默认 true;`require_approval=true` 时进入 pending 直到源 owner 批准。群成员卷挂载场景下,storage 通过 CA `aid_type=group` 识别群命名空间,命中 `/memberdata/` 时调 `group.check_membership` 实时校验成员身份。
|
|
1245
|
+
|
|
1246
|
+
### 参数
|
|
1247
|
+
|
|
1248
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1249
|
+
|------|------|------|------|------|
|
|
1250
|
+
| `mount_path` | string | 是 | — | 挂载点路径 |
|
|
1251
|
+
| `owner_aid` | string | 否 | 当前用户 | 命名空间所有者 |
|
|
1252
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1253
|
+
| `volume_id` | string | 否 | — | 挂载实体卷(与 source_* 互斥) |
|
|
1254
|
+
| `source_aid` | string | 否 | — | 虚拟卷源 AID(与 volume_id 互斥) |
|
|
1255
|
+
| `source_path` | string | 否 | — | 虚拟卷源路径 |
|
|
1256
|
+
| `source_bucket` | string | 否 | — | 虚拟卷源存储桶 |
|
|
1257
|
+
| `readonly` | boolean | 否 | `true` | 只读挂载 |
|
|
1258
|
+
| `require_approval` | boolean | 否 | `false` | 需源 owner 批准 |
|
|
1259
|
+
| `expires_at` | integer | 否 | — | 挂载过期时间 |
|
|
1260
|
+
|
|
1261
|
+
### 响应
|
|
1262
|
+
|
|
1263
|
+
| 字段 | 类型 | 说明 |
|
|
1264
|
+
|------|------|------|
|
|
1265
|
+
| `mount` | object | 挂载视图 |
|
|
1266
|
+
| `status` | string | `active`(直接生效)/ `pending`(待批准) |
|
|
1267
|
+
|
|
1268
|
+
> `status` 字段仅在直接调用 lowlevel RPC(`fs_mount`/`FSMount`/`fsMount` 原始返回)时可见。四语言 SDK 的高层 VFS 门面(`vfs.mount()`/`StorageVFS.Mount()`/`vfs.mount()`)会把响应解析为通用 NodeView,该视图不保留顶层 `status` 字段;需要判断是否 `pending` 时请改用 lowlevel 接口读取原始响应,或检查服务端在 `pending` 场景下额外写入的 `request_id`。
|
|
1269
|
+
|
|
1270
|
+
---
|
|
1271
|
+
|
|
1272
|
+
## storage.fs.approve
|
|
1273
|
+
|
|
1274
|
+
源 owner 批准 pending 挂载(重新校验源路径存在)。`mount_id` 或 `(owner_aid, bucket, mount_path)` 二选一定位。
|
|
1275
|
+
|
|
1276
|
+
### 参数
|
|
1277
|
+
|
|
1278
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
1279
|
+
|------|------|------|------|
|
|
1280
|
+
| `mount_id` | string | 否 | 挂载 ID(或用下方三元组定位) |
|
|
1281
|
+
| `owner_aid` | string | 否 | 命名空间所有者 |
|
|
1282
|
+
| `bucket` | string | 否 | 存储桶 |
|
|
1283
|
+
| `mount_path` | string | 否 | 挂载点路径 |
|
|
1284
|
+
|
|
1285
|
+
### 响应
|
|
1286
|
+
|
|
1287
|
+
| 字段 | 类型 | 说明 |
|
|
1288
|
+
|------|------|------|
|
|
1289
|
+
| `approved` | boolean | `true` |
|
|
1290
|
+
| `mount` | object | 挂载视图 |
|
|
1291
|
+
|
|
1292
|
+
---
|
|
1293
|
+
|
|
1294
|
+
## storage.fs.reject
|
|
1295
|
+
|
|
1296
|
+
源 owner 或挂载 owner 拒绝 pending 挂载。定位方式同 `fs.approve`。
|
|
1297
|
+
|
|
1298
|
+
### 响应
|
|
1299
|
+
|
|
1300
|
+
`{rejected: boolean, mount}`。
|
|
1301
|
+
|
|
1302
|
+
---
|
|
1303
|
+
|
|
1304
|
+
## storage.fs.unmount
|
|
1305
|
+
|
|
1306
|
+
卸载挂载点(仅 owner 可操作)。
|
|
1307
|
+
|
|
1308
|
+
### 参数
|
|
1309
|
+
|
|
1310
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1311
|
+
|------|------|------|------|------|
|
|
1312
|
+
| `mount_path` | string | 是 | — | 挂载点路径 |
|
|
1313
|
+
| `owner_aid` | string | 否 | 当前用户 | 命名空间所有者 |
|
|
1314
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1315
|
+
|
|
1316
|
+
### 响应
|
|
1317
|
+
|
|
1318
|
+
`{unmounted: boolean, owner_aid, bucket, path, mount_path}`。
|
|
1319
|
+
|
|
1320
|
+
---
|
|
1321
|
+
|
|
1322
|
+
## storage.fs.invalidate_membership
|
|
1323
|
+
|
|
1324
|
+
群成员变更/群解散时失效群挂载(仅群 owner 或内部调用者)。SDK 形参不带 owner/bucket。
|
|
1325
|
+
|
|
1326
|
+
### 参数
|
|
1327
|
+
|
|
1328
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1329
|
+
|------|------|------|------|------|
|
|
1330
|
+
| `group_id` | string | 是 | — | 群组标识兼容字段,值语义为目标态 `group_aid` |
|
|
1331
|
+
| `group_owner_aid` | string | 是 | — | 群 owner AID |
|
|
1332
|
+
| `member_aid` | string | 否 | — | 成员 AID(不传=全员) |
|
|
1333
|
+
| `reason` | string | 否 | `"membership_changed"` | `dissolved` / `membership_changed` |
|
|
1334
|
+
| `status` | string | 否 | — | `inactive` / `unavailable` |
|
|
1335
|
+
|
|
1336
|
+
### 响应
|
|
1337
|
+
|
|
1338
|
+
`{group_id, group_aid, group_owner_aid, member_aid, reason, status, invalidated}`(`invalidated`=失效挂载数)。
|
|
1339
|
+
|
|
1340
|
+
---
|
|
1341
|
+
|
|
1342
|
+
## storage.create_symlink
|
|
1343
|
+
|
|
1344
|
+
创建软链。target 受限于 owner 命名空间;拒绝同名 file/dir;父路径不可含软链前缀。
|
|
1345
|
+
|
|
1346
|
+
### 参数
|
|
1347
|
+
|
|
1348
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1349
|
+
|------|------|------|------|------|
|
|
1350
|
+
| `path` | string | 是 | — | 软链路径 |
|
|
1351
|
+
| `target` | string | 是 | — | 指向目标路径 |
|
|
1352
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1353
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1354
|
+
| `overwrite` | boolean | 否 | `false` | 覆盖已存在软链 |
|
|
1355
|
+
|
|
1356
|
+
### 响应
|
|
1357
|
+
|
|
1358
|
+
软链视图(含 `dangling` 悬空标志)。
|
|
1359
|
+
|
|
1360
|
+
---
|
|
1361
|
+
|
|
1362
|
+
## storage.readlink
|
|
1363
|
+
|
|
1364
|
+
读软链 target(owner 校验)。
|
|
1365
|
+
|
|
1366
|
+
### 参数
|
|
1367
|
+
|
|
1368
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1369
|
+
|------|------|------|------|------|
|
|
1370
|
+
| `path` | string | 是 | — | 软链路径 |
|
|
1371
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1372
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1373
|
+
|
|
1374
|
+
### 响应
|
|
1375
|
+
|
|
1376
|
+
软链视图 `{symlink, target, version, ...}`。
|
|
1377
|
+
|
|
1378
|
+
---
|
|
1379
|
+
|
|
1380
|
+
## storage.atomic_repoint
|
|
1381
|
+
|
|
1382
|
+
原子重指软链 target(乐观锁 CAS)。**collab commit / tag 并发正确性的底层核心**。
|
|
1383
|
+
|
|
1384
|
+
### 参数
|
|
1385
|
+
|
|
1386
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1387
|
+
|------|------|------|------|------|
|
|
1388
|
+
| `path` | string | 是 | — | 软链路径 |
|
|
1389
|
+
| `new_target` | string | 是 | — | 新 target |
|
|
1390
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1391
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1392
|
+
| `expected_version` | integer | 否 | — | CAS 期望版本(null=跳过 CAS) |
|
|
1393
|
+
|
|
1394
|
+
### 响应
|
|
1395
|
+
|
|
1396
|
+
**成功**:`{ok: true, ...软链视图}`(version+1)。
|
|
1397
|
+
**CAS 失败**:`{ok: false, current_version, current_target}`。
|
|
1398
|
+
|
|
1399
|
+
---
|
|
1400
|
+
|
|
1401
|
+
## storage.rename_symlink
|
|
1402
|
+
|
|
1403
|
+
改软链 key(同 owner/bucket 内移动/改名),target 不变。跨 owner 被拒。
|
|
1404
|
+
|
|
1405
|
+
### 参数
|
|
1406
|
+
|
|
1407
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1408
|
+
|------|------|------|------|------|
|
|
1409
|
+
| `path` | string | 是 | — | 原软链路径(SDK 形参 `path`/服务端 `src`) |
|
|
1410
|
+
| `new_path` | string | 是 | — | 新软链路径(服务端 `dst`) |
|
|
1411
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1412
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1413
|
+
| `overwrite` | boolean | 否 | `false` | 覆盖已存在 |
|
|
1414
|
+
| `expected_version` | integer | 否 | — | CAS 期望版本 |
|
|
1415
|
+
|
|
1416
|
+
### 响应
|
|
1417
|
+
|
|
1418
|
+
**成功**:`{ok: true, ...软链视图}`。
|
|
1419
|
+
**CAS 失败**:`{ok: false, current_version, current_path, current_target}`。
|
|
1420
|
+
|
|
1421
|
+
---
|
|
1422
|
+
|
|
1423
|
+
## storage.delete_symlink
|
|
1424
|
+
|
|
1425
|
+
删软链记录(不动 target 对象)。
|
|
1426
|
+
|
|
1427
|
+
### 参数
|
|
1428
|
+
|
|
1429
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1430
|
+
|------|------|------|------|------|
|
|
1431
|
+
| `path` | string | 是 | — | 软链路径 |
|
|
1432
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1433
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1434
|
+
|
|
1435
|
+
### 响应
|
|
1436
|
+
|
|
1437
|
+
`{deleted: boolean, owner_aid, bucket, path, symlink_id, target}`。
|
|
1438
|
+
|
|
1439
|
+
---
|
|
1440
|
+
|
|
1441
|
+
## storage.set_acl
|
|
1442
|
+
|
|
1443
|
+
授予路径前缀权限,作用于该路径及子路径(最近祖先 ACL 生效)。`w` 写、`x` 删、`r` 读。具体 AID 的 `r` 用于 authoritative 读取和受信挂载读取;`subject` 条件规则的 `r` 还可授权普通私有对象读取。向指定 AID 分享普通私有对象,使用 `storage.create_share_link` 的 `allowed_aids`。
|
|
1444
|
+
|
|
1445
|
+
`role:*` 伪主体只允许可信 group 内部门面写入。客户端不能直接对 `group_aid` 空间调用 `storage.set_acl` 设置 `role:admin`;群自有区角色写授权统一使用 `group.fs.set_acl`。
|
|
1446
|
+
|
|
1447
|
+
### 参数
|
|
1448
|
+
|
|
1449
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1450
|
+
|------|------|------|------|------|
|
|
1451
|
+
| `path` | string | 是 | — | 授权路径前缀 |
|
|
1452
|
+
| `subject` | object | 三选一 | — | 按 Ownership 和可信名片匹配的条件规则,结构见下表 |
|
|
1453
|
+
| `grantee_aids` | string[] | 三选一 | — | 一个或多个被授权 AID;`role:*` 仅限 group 内部调用 |
|
|
1454
|
+
| `grantee_aid` | string | 三选一 | — | 兼容旧调用的单个 AID |
|
|
1455
|
+
| `perms` | string | 是 | — | 权限位:`r` 读取、`w` 写入、`x` 删除,可组合 |
|
|
1456
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1457
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1458
|
+
| `expires_at` | integer | 否 | — | 授权过期时间,Unix 秒 |
|
|
1459
|
+
| `max_uses` | integer | 否 | — | 具体 AID 分别计数;`subject` 整条规则共享计数;0 表示不限次数 |
|
|
1460
|
+
|
|
1461
|
+
`subject`、`grantee_aid`、`grantee_aids` 必须且只能传一种;全部省略、同时传入或显式 `null` 返回 `-32602`。数组允许一个 AID,不能为空,元素不能为空;重复 AID 去重并保留首次顺序。先校验整批参数,再逐项写入;存储错误会中断,已完成项保留。
|
|
1462
|
+
|
|
1463
|
+
### subject 结构
|
|
1464
|
+
|
|
1465
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
1466
|
+
| --- | --- | --- | --- |
|
|
1467
|
+
| `ownership` | object | 是 | 匹配 Owner 当前 `owner.md` 单方声明的 sub,不要求双向共识 |
|
|
1468
|
+
| `ownership.owner_aid` | string | 是 | 要求请求者归属的 Owner AID;Owner 自身不计入 sub |
|
|
1469
|
+
| `ownership.scope` | string | 否 | 默认 `direct`:直接 sub;`descendants`:沿各级 Owner 声明检查后代,最多 64 跳,遇循环停止 |
|
|
1470
|
+
| `card` | object | 否 | 追加请求者的可信 Name Service 名片条件 |
|
|
1471
|
+
| `card.type` | string[] | 否 | 允许的 `type`;提供时必须为非空数组 |
|
|
1472
|
+
| `card.exttype` | string[] | 否 | 允许的 `exttype`;提供时必须为非空数组 |
|
|
1473
|
+
|
|
1474
|
+
Ownership、`type`、`exttype` 之间是 AND;同一属性数组内是 OR。属性值去首尾空白、排序、去重后精确匹配;名片由服务端查询,应用不能随读取请求自报属性。同一路径和归一化 `subject` 对应同一规则,重复授权更新该规则。
|
|
1475
|
+
|
|
1476
|
+
Storage 先检查 `owner_aid:/default/sub_aids/{请求者 AID}/owner.md`;`descendants` 逐级检查声明。每次确认当前路径快照,按正文摘要缓存解析结果,声明修改或删除后不复用旧版本。省略 `card` 不查询 NS;配置 `card` 时使用 60 秒 TTL 名片缓存,未命中/过期经内部 svc RPC `nameservice.agent_md_batch` 回源,不匹配时允许提前刷新,相邻刷新至少间隔 5 秒。并发查询按 AID 合并并去重,按需短窗口批查每批最多 64 个,无周期同步任务。远域 Owner 声明由内部 `storage.owner_declared_subjects` 查询;两种内部 RPC 只供受信 Storage 服务使用,SDK Facade 无需新增调用。
|
|
1477
|
+
|
|
1478
|
+
```json
|
|
1479
|
+
{"path":"reports","subject":{"ownership":{"owner_aid":"owner.aid.example","scope":"direct"},"card":{"type":["agent"],"exttype":["assistant","worker"]}},"perms":"r"}
|
|
1480
|
+
```
|
|
1481
|
+
|
|
1482
|
+
这条规则允许该 Owner 的直接 sub 中,名片满足 `type=agent` 且 `exttype` 为 `assistant` 或 `worker` 的 AID 读取 `reports` 及子路径。受保护的系统路径仍遵循原有约束。
|
|
1483
|
+
|
|
1484
|
+
### 响应
|
|
1485
|
+
|
|
1486
|
+
使用 `grantee_aids` 返回 `{acls: [ACL视图, ...]}`,单元素数组也返回此结构;仅使用兼容字段 `grantee_aid` 时仍返回单条 ACL 视图。每个 AID 独立保存 `max_uses` 和 `used_count`。
|
|
1487
|
+
|
|
1488
|
+
使用 `subject` 返回单条 ACL 视图,其中用归一化 `subject` 替代 `grantee_aid`;其 `max_uses`、`used_count` 为整条规则的共享计数。视图另含 `acl_id`、`owner_aid`、`bucket`、`path/path_prefix`、`perms`、`expires_at`、`created_at`、`updated_at`。
|
|
1489
|
+
|
|
1490
|
+
---
|
|
1491
|
+
|
|
1492
|
+
## storage.remove_acl
|
|
1493
|
+
|
|
1494
|
+
移除指定路径的具体 AID 或条件 ACL。撤销分享链接使用 `storage.revoke_share_link`;群角色 ACL 使用 `group.fs.remove_acl`。
|
|
1495
|
+
|
|
1496
|
+
### 参数
|
|
1497
|
+
|
|
1498
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1499
|
+
|------|------|------|------|------|
|
|
1500
|
+
| `path` | string | 是 | — | 授权路径前缀 |
|
|
1501
|
+
| `subject` | object | 三选一 | — | 原授权条件;按归一化后的同一规则撤销 |
|
|
1502
|
+
| `grantee_aids` | string[] | 三选一 | — | 一个或多个待撤销 AID |
|
|
1503
|
+
| `grantee_aid` | string | 三选一 | — | 兼容旧调用的单个 AID |
|
|
1504
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1505
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1506
|
+
|
|
1507
|
+
### 响应
|
|
1508
|
+
|
|
1509
|
+
使用 `grantee_aids` 返回 `{results: [{removed: boolean, owner_aid, bucket, path, grantee_aid}, ...]}`;单元素数组也返回此结构。仅使用 `grantee_aid` 时仍返回 `{removed: boolean, owner_aid, bucket, path, grantee_aid}`。
|
|
1510
|
+
|
|
1511
|
+
使用 `subject` 返回 `{removed: boolean, owner_aid, bucket, path, subject}`。三选一、条件归一化、数组校验和去重规则与 `storage.set_acl` 一致;逐项撤销,存储错误会中断并保留已完成项。
|
|
1512
|
+
|
|
1513
|
+
---
|
|
1514
|
+
|
|
1515
|
+
## storage.list_acl
|
|
1516
|
+
|
|
1517
|
+
列出路径上的 ACL 授权(owner 校验)。
|
|
1518
|
+
|
|
1519
|
+
### 参数
|
|
1520
|
+
|
|
1521
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1522
|
+
|------|------|------|------|------|
|
|
1523
|
+
| `path` | string | 是 | — | 路径 |
|
|
1524
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1525
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1526
|
+
|
|
1527
|
+
### 响应
|
|
1528
|
+
|
|
1529
|
+
`{owner_aid, bucket, path, acls}`。每条具体 AID 规则显示 `grantee_aid`,条件规则显示 `subject`;两类规则可同时存在,条件规则不暴露内部存储主体键。
|
|
1530
|
+
|
|
1531
|
+
---
|
|
1532
|
+
|
|
1533
|
+
## storage.set_visibility
|
|
1534
|
+
|
|
1535
|
+
切换对象或目录的公开/私有(软链不支持)。`allow_roles` 是低层兼容字段,不能作为群自有区 admin 写授权入口;群自有区角色写授权必须使用 `group.fs.set_acl/remove_acl`。
|
|
1536
|
+
|
|
1537
|
+
### 参数
|
|
1538
|
+
|
|
1539
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1540
|
+
|------|------|------|------|------|
|
|
1541
|
+
| `path` | string | 是 | — | 路径 |
|
|
1542
|
+
| `visibility` | string | 是 | — | `public` / `private` |
|
|
1543
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1544
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1545
|
+
| `allow_roles` | array | 否 | — | 低层兼容字段,仅表示可见性读角色;不能用于群自有区写授权 |
|
|
1546
|
+
|
|
1547
|
+
### 响应
|
|
1548
|
+
|
|
1549
|
+
fs 节点视图(含 `allow_roles`)。
|
|
1550
|
+
|
|
1551
|
+
---
|
|
1552
|
+
|
|
1553
|
+
## storage.check_access
|
|
1554
|
+
|
|
1555
|
+
非抛错的访问探测——探测某操作在某路径是否放行(内部捕获 NotFound/Dangling/Permission)。
|
|
1556
|
+
|
|
1557
|
+
### 参数
|
|
1558
|
+
|
|
1559
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1560
|
+
|------|------|------|------|------|
|
|
1561
|
+
| `path` | string | 是 | — | 路径(服务端别名 `object_key`) |
|
|
1562
|
+
| `operation` | string | 否 | `"read"` | `read` / `write` / `delete`(服务端别名 `op`) |
|
|
1563
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1564
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1565
|
+
| `token` | string | 否 | — | 访问 token |
|
|
1566
|
+
| `follow_symlinks` | boolean | 否 | `true` | 跟随软链 |
|
|
1567
|
+
|
|
1568
|
+
### 响应
|
|
1569
|
+
|
|
1570
|
+
`{allowed: boolean, reason, message, requester_aid, owner_aid, bucket, path, operation}`。
|
|
1571
|
+
|
|
1572
|
+
---
|
|
1573
|
+
|
|
1574
|
+
## storage.issue_token
|
|
1575
|
+
|
|
1576
|
+
签发 hash 化的 bearer 访问 token,scope 到某路径。返回的明文 token 仅此一次可见。
|
|
1577
|
+
|
|
1578
|
+
### 参数
|
|
1579
|
+
|
|
1580
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1581
|
+
|------|------|------|------|------|
|
|
1582
|
+
| `path` | string | 是 | — | 授权路径(服务端别名 `object_key`) |
|
|
1583
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1584
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1585
|
+
| `expires_at` | integer | 否 | — | 过期时间 |
|
|
1586
|
+
| `max_reads` | integer | 否 | — | 最大读取次数(服务端别名 `max_uses`) |
|
|
1587
|
+
|
|
1588
|
+
### 响应
|
|
1589
|
+
|
|
1590
|
+
token 视图 + 明文 token(一次性返回)。
|
|
1591
|
+
|
|
1592
|
+
---
|
|
1593
|
+
|
|
1594
|
+
## storage.revoke_token
|
|
1595
|
+
|
|
1596
|
+
按明文 token 值吊销(内部 hash 后查找)。
|
|
1597
|
+
|
|
1598
|
+
### 参数
|
|
1599
|
+
|
|
1600
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1601
|
+
|------|------|------|------|------|
|
|
1602
|
+
| `path` | string | 是 | — | 路径(服务端别名 `object_key`) |
|
|
1603
|
+
| `token` | string | 是 | — | 要吊销的明文 token |
|
|
1604
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1605
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1606
|
+
|
|
1607
|
+
### 响应
|
|
1608
|
+
|
|
1609
|
+
`{revoked: boolean, owner_aid, bucket, path}`。
|
|
1610
|
+
|
|
1611
|
+
---
|
|
1612
|
+
|
|
1613
|
+
## storage.list_tokens
|
|
1614
|
+
|
|
1615
|
+
列出路径上的 token(owner 校验,不返回明文)。
|
|
1616
|
+
|
|
1617
|
+
### 参数
|
|
1618
|
+
|
|
1619
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1620
|
+
|------|------|------|------|------|
|
|
1621
|
+
| `path` | string | 是 | — | 路径 |
|
|
1622
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1623
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1624
|
+
|
|
1625
|
+
### 响应
|
|
1626
|
+
|
|
1627
|
+
token 列表(hash 摘要 + 元数据)。
|
|
1628
|
+
|
|
1629
|
+
---
|
|
1630
|
+
|
|
1631
|
+
## storage.volume.create
|
|
1632
|
+
|
|
1633
|
+
创建/upsert 配额卷(含 mount_point)。
|
|
1634
|
+
|
|
1635
|
+
### 参数
|
|
1636
|
+
|
|
1637
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1638
|
+
|------|------|------|------|------|
|
|
1639
|
+
| `size_bytes` | integer | 是 | — | 卷容量(>0) |
|
|
1640
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1641
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1642
|
+
| `volume_id` | string | 否 | 自动 | 卷 ID |
|
|
1643
|
+
| `used_bytes` | integer | 否 | — | 已用字节 |
|
|
1644
|
+
| `status` | string | 否 | `active` | `active` / `grace` / `expired` |
|
|
1645
|
+
| `mount_point` | string | 否 | — | 挂载点 |
|
|
1646
|
+
| `expires_at` | integer | 否 | — | 过期时间 |
|
|
1647
|
+
|
|
1648
|
+
### 响应
|
|
1649
|
+
|
|
1650
|
+
`{volume, ...卷视图}`。
|
|
1651
|
+
|
|
1652
|
+
---
|
|
1653
|
+
|
|
1654
|
+
## storage.volume.renew
|
|
1655
|
+
|
|
1656
|
+
续期卷过期时间/状态(owner 校验,owner 不符抛 PermissionError)。
|
|
1657
|
+
|
|
1658
|
+
### 参数
|
|
1659
|
+
|
|
1660
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1661
|
+
|------|------|------|------|------|
|
|
1662
|
+
| `volume_id` | string | 是 | — | 卷 ID(服务端别名 `id`) |
|
|
1663
|
+
| `expires_at` | integer | 是 | — | 新过期时间 |
|
|
1664
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1665
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1666
|
+
| `status` | string | 否 | — | 卷状态 |
|
|
1667
|
+
|
|
1668
|
+
### 响应
|
|
1669
|
+
|
|
1670
|
+
`{volume, ...卷视图}`。
|
|
1671
|
+
|
|
1672
|
+
---
|
|
1673
|
+
|
|
1674
|
+
## storage.volume.expire_due
|
|
1675
|
+
|
|
1676
|
+
过期所有到期卷并标记其挂载为 unavailable。
|
|
1677
|
+
|
|
1678
|
+
### 参数
|
|
1679
|
+
|
|
1680
|
+
| 参数 | 类型 | 必填 | 默认 | 说明 |
|
|
1681
|
+
|------|------|------|------|------|
|
|
1682
|
+
| `owner_aid` | string | 否 | 当前用户 | 所有者 AID |
|
|
1683
|
+
| `bucket` | string | 否 | `"default"` | 存储桶 |
|
|
1684
|
+
| `now` | integer | 否 | 当前时间 | 判定基准时间 |
|
|
1685
|
+
|
|
1686
|
+
### 响应
|
|
1687
|
+
|
|
1688
|
+
`{owner_aid, bucket, expired, mounts_unavailable, volumes, mounts}`。
|
|
1689
|
+
|
|
1690
|
+
## 错误码
|
|
1691
|
+
|
|
1692
|
+
| code | 说明 |
|
|
1693
|
+
|------|------|
|
|
1694
|
+
| -32002 | 服务暂不可用(数据库未连接) |
|
|
1695
|
+
| -32004 | 权限拒绝(requester 不是对象 owner,或非公开对象的读权限不足) |
|
|
1696
|
+
| -32008 | 对象不存在(`ErrNotFound`) |
|
|
1697
|
+
| -32009 | 版本冲突(`ErrVersionConflict`,`expected_version` 与实际版本不匹配) |
|
|
1698
|
+
| -32000 | 通用错误(参数校验失败、配额不足、base64 解码失败、文件大小超限等) |
|