@heybox/hb-sdk 0.9.1-alpha.4 → 0.9.1-alpha.5
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 +10 -2
- package/README.md +11 -0
- package/dist/card-controller.cjs.js +194 -0
- package/dist/card-controller.esm.js +159 -0
- package/dist/cli-chunks/{build-BZg2rHkW.cjs → build-D91J_GAa.cjs} +13 -7
- package/dist/cli-chunks/{context-YrzmEOau.cjs → context-Xdd45FFd.cjs} +2 -2
- package/dist/cli-chunks/{create-fPvlqLbS.cjs → create-BzpdRC5r.cjs} +1 -1
- package/dist/cli-chunks/{dev-X8_kbp78.cjs → dev-C7acO3Kt.cjs} +55 -9
- package/dist/cli-chunks/{doctor-DdiucYs9.cjs → doctor-BgHRDQmG.cjs} +1 -1
- package/dist/cli-chunks/{index-BdbwsefW.cjs → index-CjhQXbxy.cjs} +4 -7
- package/dist/cli-chunks/{index-BGh-Izf8.cjs → index-TQwjvNjL.cjs} +32 -16
- package/dist/cli-chunks/{index.esm-WYIrPjkF.cjs → index.esm-dgqkvowo.cjs} +7 -7
- package/dist/cli-chunks/{login-DWmNuhWc.cjs → login-B14iGXHh.cjs} +2 -2
- package/dist/cli-chunks/{project-vite-BVDIeoHB.cjs → project-vite-CN6mMjzX.cjs} +1 -1
- package/dist/cli-chunks/{remote-BHJFxXyc.cjs → remote-C9RUiZxK.cjs} +22 -14
- package/dist/cli-chunks/runtime-gate-CfAkz0p-.cjs +201950 -0
- package/dist/cli-chunks/{runtime-permission-env-eiq8vE62.cjs → runtime-permission-env-L7OfyRcl.cjs} +9396 -2929
- package/dist/cli-chunks/{session-Dz1cGg0E.cjs → session-DZrr6RYK.cjs} +2 -1
- package/dist/cli-chunks/{skill-DC3cfPj2.cjs → skill-BHTVho1a.cjs} +2 -2
- package/dist/cli-chunks/{version-DYFkOykv.cjs → version-C_NaCZ8O.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/browser-dev-host/assets/browser-dev-host-KPFU0Lsa.js +102 -0
- package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-CZsodKbP.js → desktop-app-launch-BNF9Yk4P.js} +3 -3
- package/dist/devtools/browser-dev-host/assets/{index-B9tOX3zG.js → index-DRRtB9Nm.js} +4 -4
- package/dist/devtools/browser-dev-host/index.html +2 -2
- package/dist/index.cjs.js +6224 -275
- package/dist/index.esm.js +6224 -276
- package/dist/miniapp-publish.cjs.js +6612 -168
- package/dist/miniapp-publish.esm.js +6612 -169
- package/dist/protocol.cjs.js +5805 -0
- package/dist/protocol.esm.js +5805 -0
- package/dist/vite.cjs.js +7475 -217
- package/dist/vite.esm.js +7474 -218
- package/dist/workspace-card-build-sandbox-worker.mjs +72 -0
- package/package.json +25 -11
- package/skill/skill.json +4 -4
- package/types/card-controller.d.ts +3682 -0
- package/types/index.d.ts +7532 -35
- package/types/miniapp-publish/index.d.ts +542 -64
- package/types/protocol.d.ts +2083 -9
- package/types/vite/index.d.ts +25 -12
- package/dist/cli-chunks/runtime-gate-CR0dRMpQ.cjs +0 -65
- package/dist/devtools/browser-dev-host/assets/browser-dev-host-CO2_03W0.js +0 -102
- package/types/core/client.d.ts +0 -108
- package/types/core/csp-violation.d.ts +0 -5
- package/types/core/errors.d.ts +0 -78
- package/types/core/event-bus.d.ts +0 -11
- package/types/core/handshake-state.d.ts +0 -54
- package/types/core/history-observer.d.ts +0 -4
- package/types/core/mini-dev-console.d.ts +0 -36
- package/types/core/network-sanitize.d.ts +0 -31
- package/types/core/sdk.d.ts +0 -104
- package/types/core/singleton.d.ts +0 -372
- package/types/core/utils.d.ts +0 -10
- package/types/core/version.d.ts +0 -2
- package/types/devtools/device-logs.d.ts +0 -48
- package/types/miniapp-manifest/basic-info-browser.d.ts +0 -37
- package/types/miniapp-manifest/basic-info-image-header.d.ts +0 -6
- package/types/miniapp-manifest/basic-info-node.d.ts +0 -17
- package/types/miniapp-manifest/basic-info-placeholder.d.ts +0 -1
- package/types/miniapp-manifest/basic-info.d.ts +0 -33
- package/types/miniapp-manifest/bindings.d.ts +0 -70
- package/types/miniapp-manifest/category.d.ts +0 -11
- package/types/miniapp-manifest/companion-directory.d.ts +0 -2
- package/types/miniapp-manifest/companion-executable.d.ts +0 -4
- package/types/miniapp-manifest/companion-types.d.ts +0 -63
- package/types/miniapp-manifest/companions.d.ts +0 -17
- package/types/miniapp-manifest/index.d.ts +0 -7
- package/types/miniapp-manifest/node.d.ts +0 -22
- package/types/miniapp-manifest/permissions.d.ts +0 -48
- package/types/miniapp-manifest/runtime-gate.d.ts +0 -12
- package/types/miniapp-manifest/schema.d.ts +0 -302
- package/types/modules/auth/index.d.ts +0 -204
- package/types/modules/cloud/index.d.ts +0 -669
- package/types/modules/companion/index.d.ts +0 -1619
- package/types/modules/device/index.d.ts +0 -269
- package/types/modules/environment/index.d.ts +0 -238
- package/types/modules/files/index.d.ts +0 -5
- package/types/modules/files/registry.d.ts +0 -35
- package/types/modules/files/types.d.ts +0 -1548
- package/types/modules/navigation/app-pages/index.d.ts +0 -4
- package/types/modules/navigation/app-pages/types.d.ts +0 -135
- package/types/modules/navigation/index.d.ts +0 -312
- package/types/modules/network/index.d.ts +0 -457
- package/types/modules/network/observability.d.ts +0 -38
- package/types/modules/network/request-shape.d.ts +0 -44
- package/types/modules/share/copy-link.d.ts +0 -46
- package/types/modules/share/extra.d.ts +0 -5
- package/types/modules/share/index.d.ts +0 -294
- package/types/modules/share/screenshot.d.ts +0 -34
- package/types/modules/share/show-share-menu.d.ts +0 -29
- package/types/modules/share/types.d.ts +0 -201
- package/types/modules/storage/index.d.ts +0 -214
- package/types/modules/ui/index.d.ts +0 -315
- package/types/modules/user/get-info.d.ts +0 -44
- package/types/modules/user/index.d.ts +0 -245
- package/types/modules/user/revoke-authorization.d.ts +0 -31
- package/types/modules/user/steam-game-list.d.ts +0 -153
- package/types/modules/user/types.d.ts +0 -2
- package/types/modules/viewport/index.d.ts +0 -319
- package/types/protocol/capabilities.d.ts +0 -2
- package/types/protocol/constants.d.ts +0 -1
- package/types/protocol/dev-session.d.ts +0 -74
- package/types/protocol/guards.d.ts +0 -1
- package/types/protocol/runtime-permissions.d.ts +0 -2
- package/types/protocol/types.d.ts +0 -22
- package/types/skill-metadata.d.ts +0 -18
- package/types/vite/html-policy.d.ts +0 -6
- package/types/vite/runtime-permission-env.d.ts +0 -9
package/types/protocol.d.ts
CHANGED
|
@@ -1,9 +1,2083 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { MiniProgramEventName, MiniProgramEventPayloadMap, LoginScope as LoginScope$1 } from '@heybox/hb-sdk-protocol';
|
|
2
|
+
export { AUTH_LOGIN_METHOD, AuthorizedUserInfo, CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_INFO_METHOD, CLOUD_LEADERBOARD_GET_LIST_METHOD, CLOUD_LEADERBOARD_SUBMIT_METHOD, ClosePayload, CloseResult, CopyLinkPayload, CopyLinkResult, DEVICE_EXECUTE_PROTOCOL_METHOD, DEVICE_SET_CLIPBOARD_METHOD, DEVICE_VIBRATE_METHOD, DIRECTORY_CREATE_METHOD, DIRECTORY_EXISTS_METHOD, DIRECTORY_LIST_METHOD, DIRECTORY_REMOVE_METHOD, DeleteCurrentUserLeaderboardEntryPayload, DeleteCurrentUserLeaderboardEntryResult, DirectoryCreatePayload, DirectoryCreateResult, DirectoryExistsPayload, DirectoryExistsResult, DirectoryListPayload, DirectoryListResult, DirectoryRemovePayload, DirectoryRemoveResult, DownloadProgressPayload, FILES_PICK_DIRECTORY_METHOD, FILES_PICK_FILES_METHOD, FILES_SAVE_FILE_METHOD, FILE_CREATE_METHOD, FILE_EXISTS_METHOD, FILE_READ_BYTES_METHOD, FILE_READ_TEXT_METHOD, FILE_REMOVE_METHOD, FILE_STAT_METHOD, FILE_WRITE_BYTES_METHOD, FILE_WRITE_TEXT_METHOD, FileCreatePayload, FileCreateResult, FileExistsPayload, FileExistsResult, FileReadBytesPayload, FileReadBytesResult, FileReadTextPayload, FileReadTextResult, FileRemovePayload, FileRemoveResult, FileStatPayload, FileStatResult, FileWriteBytesPayload, FileWriteBytesResult, FileWriteTextPayload, FileWriteTextResult, GetCurrentUserLeaderboardEntryPayload, GetCurrentUserLeaderboardEntryResult, GetLeaderboardInfoPayload, GetLeaderboardInfoResult, GetLeaderboardListPayload, GetLeaderboardListResult, GetSteamGameListPayload, GetSteamGameListResult, GetStoragePayload, GetStorageResult, GetUserInfoPayload, GetUserInfoResult, GetWindowInfoPayload, GetWindowInfoResult, HideLoadingPayload, HideLoadingResult, LeaderboardEntry, LeaderboardOrder, LoginPayload, LoginResult, LoginScope, MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, MINI_PROGRAM_OPERATION_PROGRESS_METHOD, MINI_PROGRAM_PROTOCOL_CAPABILITIES, MiniProgramAuthMethod, MiniProgramBridgeCancelMessage, MiniProgramBridgeError, MiniProgramBridgeMessage, MiniProgramBridgeMessageType, MiniProgramBridgeMethod, MiniProgramBridgeProgressMessage, MiniProgramCapabilityDefinition, MiniProgramCapabilityModule, MiniProgramCapabilityPayload, MiniProgramCapabilityPayloadMap, MiniProgramCapabilityResult, MiniProgramCapabilityResultMap, MiniProgramCapabilityRisk, MiniProgramCloudMethod, MiniProgramDeviceMethod, MiniProgramDirectDirectoryRef, MiniProgramDirectFileRef, MiniProgramDirectoryDescriptor, MiniProgramDirectoryMethod, MiniProgramDirectoryRef, MiniProgramDisplayState, MiniProgramEventName, MiniProgramEventPayloadMap, MiniProgramFileDescriptor, MiniProgramFileMethod, MiniProgramFileMode, MiniProgramFileRef, MiniProgramFileStat, MiniProgramFileSystemEntityDescriptor, MiniProgramFileSystemEntityRef, MiniProgramFilesMethod, MiniProgramNavigationBarForegroundStyle, MiniProgramNavigationMethod, MiniProgramNetworkHeaders, MiniProgramNetworkMethod, MiniProgramNetworkParams, MiniProgramNetworkRequestMethod, MiniProgramOperatingSystemName, MiniProgramOrientationMode, MiniProgramPathRootRef, MiniProgramRuntimeEnvironmentInfo, MiniProgramRuntimeMode, MiniProgramRuntimePermissionEntry, MiniProgramRuntimePermissionStatus, MiniProgramRuntimePermissionsSnapshot, MiniProgramSafeArea, MiniProgramSandboxRootRef, MiniProgramScreenshotRect, MiniProgramShareChannel, MiniProgramShareMethod, MiniProgramSharePostOptions, MiniProgramStorageMethod, MiniProgramToastStatus, MiniProgramUiMethod, MiniProgramUserInfoResult, MiniProgramUserMethod, MiniProgramVibrateIntensity, MiniProgramViewportMethod, MiniProgramWindowInfoResult, NAVIGATION_CLOSE_METHOD, NAVIGATION_OPEN_APP_PAGE_METHOD, NAVIGATION_RELOAD_METHOD, NETWORK_DOWNLOAD_METHOD, NETWORK_REQUEST_METHOD, NetworkDownloadPayload, NetworkDownloadResult, NetworkRequestPayload, NetworkResponsePayload, OpenAppPagePayload, OpenAppPageResult, OpenGameDetailAppPagePayload, OpenMiniProgramAppPagePayload, OpenPostDetailAppPagePayload, OpenUserDetailAppPagePayload, ParsedMiniProgramRuntimePermissions, PickDirectoryPayload, PickDirectoryResult, PickFilesPayload, PickFilesResult, RUNTIME_LOCATION_PROBE_METHOD, ReloadPayload, ReloadResult, RevokeAuthorizationPayload, RevokeAuthorizationResult, RuntimeLocationProbePayload, SDKCSPBlockedResourceType, SDKCSPViolationPayload, SDKHandshakePayload, SDKHandshakeResult, SDKLocationReportPayload, SDKLocationReportTrigger, SDK_CSP_VIOLATION_METHOD, SDK_HANDSHAKE_METHOD, SDK_LOCATION_REPORT_METHOD, SHARE_COPY_LINK_METHOD, SHARE_SCREENSHOT_METHOD, SHARE_SHOW_SHARE_MENU_METHOD, STORAGE_GET_STORAGE_METHOD, STORAGE_SET_STORAGE_METHOD, SaveFilePayload, SaveFileResult, ScreenshotPayload, ScreenshotResult, SetClipboardPayload, SetClipboardResult, SetDisplayPayload, SetDisplayResult, SetNavigationBarStylePayload, SetNavigationBarStyleResult, SetStoragePayload, ShowLoadingPayload, ShowLoadingResult, ShowShareMenuPayload, ShowShareMenuResult, ShowToastPayload, ShowToastResult, SteamGameListData, SteamGameListItem, SteamGameListSort, SteamGamePrice, SubmitLeaderboardEntryPayload, SubmitLeaderboardEntryResult, UI_HIDE_LOADING_METHOD, UI_SHOW_LOADING_METHOD, UI_SHOW_TOAST_METHOD, USER_GET_INFO_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, USER_INFO_AUTHORIZATION_SCOPES, USER_REVOKE_AUTHORIZATION_METHOD, UserInfoAuthorization, UserInfoAuthorizationScope, UserInfoAuthorizationStatus, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_DISPLAY_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, VibratePayload, VibrateResult, isManagedMiniProgramRuntimePermissionKey, isMiniProgramBridgeMessage, isMiniProgramByteArray, isMiniProgramDirectoryDescriptor, isMiniProgramDirectoryRef, isMiniProgramDownloadProgressPayload, isMiniProgramFileDescriptor, isMiniProgramFileRef, isMiniProgramFileStat, isMiniProgramFileSystemEntityDescriptor, isMiniProgramPathRootRef, isMiniProgramRelativePath, parseMiniProgramRuntimePermissions } from '@heybox/hb-sdk-protocol';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 小程序生命周期或业务事件监听函数。
|
|
6
|
+
*
|
|
7
|
+
* @typeParam T - 受
|
|
8
|
+
* [MiniProgramEventName](/reference/symbols/root/types/MiniProgramEventName) 约束的事件名;它决定
|
|
9
|
+
* `payload` 的精确类型。
|
|
10
|
+
* @param payload - 由
|
|
11
|
+
* [MiniProgramEventPayloadMap](/reference/symbols/root/interfaces/MiniProgramEventPayloadMap) 按 `T`
|
|
12
|
+
* 索引得到的事件载荷。
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* handler 在 event bus 派发时同步调用,返回值会被忽略且 Promise 不会被等待。普通事件 handler
|
|
16
|
+
* 之间没有异常隔离:同步抛错会从当前派发传播,并可能阻止同一事件的后续 handler;异步 handler
|
|
17
|
+
* 的 rejected Promise 也不会被 SDK 捕获。监听器应在自身边界处理同步和异步错误。
|
|
18
|
+
*
|
|
19
|
+
* 生命周期事件不会重放,只派发给事件到达时已经注册的监听器。需要查询当前握手状态时,使用
|
|
20
|
+
* [getHandshakeState()](/reference/sdk/lifecycle/getHandshakeState) 或
|
|
21
|
+
* [onHandshakeStateChange()](/reference/sdk/lifecycle/onHandshakeStateChange)。
|
|
22
|
+
*/
|
|
23
|
+
type MiniProgramEventHandler<T extends MiniProgramEventName = MiniProgramEventName> = (payload: MiniProgramEventPayloadMap[T]) => void;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* File/Directory 访问模式。
|
|
27
|
+
*
|
|
28
|
+
* `read` 允许读取、查询状态和枚举目录;`readwrite` 在此基础上允许创建和写入。
|
|
29
|
+
* 删除操作仍只对 sandbox 对象开放,外部授权即使为 `readwrite` 也不能删除。
|
|
30
|
+
*/
|
|
31
|
+
type FileMode = 'read' | 'readwrite';
|
|
32
|
+
/**
|
|
33
|
+
* 用户选择文件时的筛选和授权选项。
|
|
34
|
+
*
|
|
35
|
+
* @remarks
|
|
36
|
+
* 省略 options 或传 `{}` 等同于 `{ mode: 'read', multiple: false }`,且不设置扩展名筛选。
|
|
37
|
+
* Host 返回的整批文件会先校验数量、结构、名称、mode 和 session 配额,再一次性注册;任一项
|
|
38
|
+
* 失败都不会保留部分授权。
|
|
39
|
+
*/
|
|
40
|
+
interface PickFilesOptions {
|
|
41
|
+
/**
|
|
42
|
+
* 请求的访问模式,默认 `read`。Host 即使授予更高权限也会被 Runtime 收窄为 `read`;请求
|
|
43
|
+
* `readwrite` 但平台/选择器只能授予只读时返回 `FILE_ACCESS_DENIED`,不会静默降级。外部
|
|
44
|
+
* File 即使为 `readwrite` 也不能调用 `remove()`。
|
|
45
|
+
*/
|
|
46
|
+
mode?: FileMode;
|
|
47
|
+
/**
|
|
48
|
+
* 传给系统选择器的文件扩展名筛选,例如 `['.json', '.txt', '.tar.gz']`。
|
|
49
|
+
*
|
|
50
|
+
* @remarks
|
|
51
|
+
* 必须是数组;每项匹配 `/^\.[a-z0-9][a-z0-9._-]*$/i`,即以 `.` 和 ASCII 字母/数字开头,
|
|
52
|
+
* 后续只允许 ASCII 字母、数字、点、下划线或连字符。空串、缺少前导点、路径、通配符、空格
|
|
53
|
+
* 或 MIME type 会以 `INVALID_PARAMS` 拒绝。重复项在进入 Host 前按首次出现顺序去重。
|
|
54
|
+
* 该字段只影响系统选择器筛选,不读取或转换文件内容;不需要筛选时应省略。
|
|
55
|
+
*/
|
|
56
|
+
accept?: string[];
|
|
57
|
+
/**
|
|
58
|
+
* 是否允许选择多个文件,默认 `false`。`false` 时成功结果恰好一个;只有显式为 `true` 时
|
|
59
|
+
* 才接受多个结果,实际数量由系统选择器决定,但成功结果仍至少一个。
|
|
60
|
+
*/
|
|
61
|
+
multiple?: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 用户选择目录时的授权选项。
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* V1 只接受 `mode`,不支持文件扩展名筛选、多选或建议名称。省略 options、传 `{}` 或省略
|
|
68
|
+
* `mode` 都请求 `read`。Host 即使返回更高权限也会被 Runtime 收窄到请求模式;请求
|
|
69
|
+
* `readwrite` 但平台/选择器只授予只读时返回 `FILE_ACCESS_DENIED`,不会静默降级。
|
|
70
|
+
*/
|
|
71
|
+
interface PickDirectoryOptions {
|
|
72
|
+
/**
|
|
73
|
+
* 请求的访问模式,默认 `read`。`read` 允许枚举、读取和查询派生目标;`readwrite` 还允许
|
|
74
|
+
* 创建/写入派生文件与目录,并可把所选目录作为 `network.download()` target。外部授权即使
|
|
75
|
+
* 为 `readwrite` 也不能调用 `remove()`。
|
|
76
|
+
*/
|
|
77
|
+
mode?: FileMode;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 用户选择精确保存目标时的选项。
|
|
81
|
+
*
|
|
82
|
+
* @remarks
|
|
83
|
+
* V1 只接受 `suggestedName`,不支持 `accept`、扩展名筛选、访问模式或 overwrite;返回授权固定
|
|
84
|
+
* 为 `readwrite`。该名称是提供给 Host 系统保存界面的建议值,跨平台最终文件名以返回
|
|
85
|
+
* {@link FileHandle.name} 为准。
|
|
86
|
+
*/
|
|
87
|
+
interface SaveFileOptions {
|
|
88
|
+
/**
|
|
89
|
+
* 提供给系统选择器的建议文件名。
|
|
90
|
+
*
|
|
91
|
+
* @remarks
|
|
92
|
+
* 必须是非空的单个规范 basename:不能以 `/` 开头或结尾,不能包含 `/`、`\\`、NUL、
|
|
93
|
+
* U+0000-U+001F / U+007F 控制字符或空 path segment,也不能等于 `.` 或 `..`。例如
|
|
94
|
+
* `report.json` 合法,`reports/report.json`、`../report.json` 与 `report\\latest.json` 非法并返回
|
|
95
|
+
* `INVALID_PARAMS`。SDK 不会自动添加或修改扩展名。
|
|
96
|
+
*/
|
|
97
|
+
suggestedName: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* {@link FileHandle.create} / {@link DirectoryHandle.create} 的创建选项。
|
|
101
|
+
*
|
|
102
|
+
* @remarks
|
|
103
|
+
* 两个字段都只接受 boolean,省略 options、传 `{}` 或省略单个字段时均使用 `false`。这些选项只影响
|
|
104
|
+
* 当前代理所指向的目标:不会把外部 File 授权扩张到父目录或兄弟项,也不会绕过当前代理的 `mode`、
|
|
105
|
+
* Runtime session、Mini-program identity、`filesystem` 权限或 Host capability 检查。
|
|
106
|
+
*/
|
|
107
|
+
interface CreateOptions {
|
|
108
|
+
/**
|
|
109
|
+
* 是否同时创建目标路径中缺失的父目录,默认 `false`。
|
|
110
|
+
*
|
|
111
|
+
* `false` 时任一父目录缺失会失败;`true` 时 Host 在当前 sandbox 或已授权目录范围内创建缺失父目录。
|
|
112
|
+
* 它不改变目标已存在时的处理方式,也不能跨出当前逻辑 root。
|
|
113
|
+
*/
|
|
114
|
+
recursive?: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* 目标已存在时是否失败,默认 `false`。
|
|
117
|
+
*
|
|
118
|
+
* `false` 是不破坏内容的 ensure-exists:同类型目标已存在时成功,不清空已有文件。`true` 要求本次
|
|
119
|
+
* 新建目标,文件或目录已存在时分别返回 `FILE_ALREADY_EXISTS` / `DIRECTORY_ALREADY_EXISTS`。
|
|
120
|
+
* 该字段只约束最终目标,不要求 `recursive` 创建的父目录也必须全新。
|
|
121
|
+
*/
|
|
122
|
+
exclusive?: boolean;
|
|
123
|
+
}
|
|
124
|
+
/** 删除目录时的选项。 */
|
|
125
|
+
interface RemoveOptions {
|
|
126
|
+
/** 是否递归删除目录内容,默认 `false`。 */
|
|
127
|
+
recursive?: boolean;
|
|
128
|
+
}
|
|
129
|
+
/** 枚举目录直接子项时的选项。 */
|
|
130
|
+
interface ListOptions {
|
|
131
|
+
/**
|
|
132
|
+
* 本次最多返回的直接子项数量,默认 `1000`。
|
|
133
|
+
*
|
|
134
|
+
* 必须是 `1` 到 `1000`(含)之间的 safe integer。`0`、负数、小数、`NaN`、无穷大或 unsafe
|
|
135
|
+
* integer 返回 `INVALID_PARAMS`;大于 `1000` 返回 `DIRECTORY_LIST_LIMIT_EXCEEDED`。该字段只是
|
|
136
|
+
* 单次结果上限,不是 offset、cursor 或递归深度,也没有配套的总数或截断标记。
|
|
137
|
+
*/
|
|
138
|
+
limit?: number;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 可同步派生 lazy File/Directory proxy 的逻辑根。
|
|
142
|
+
*
|
|
143
|
+
* @remarks
|
|
144
|
+
* 派生只创建当前 SDK session 内的冻结代理,不执行 I/O,也不暴露宿主真实路径。
|
|
145
|
+
* 路径在调用时同步校验,后续读写才通过 Host 访问目标。
|
|
146
|
+
*/
|
|
147
|
+
interface PathRoot {
|
|
148
|
+
/**
|
|
149
|
+
* 按规范相对路径派生文件代理。
|
|
150
|
+
*
|
|
151
|
+
* @param relativePath - 相对于当前逻辑根、使用 `/` 分隔的规范路径。必须是非空字符串,不能以
|
|
152
|
+
* `/` 开头或结尾,不能包含空 segment、反斜杠、NUL 或其他控制字符;任一 segment 恰为 `.` 或
|
|
153
|
+
* `..` 都会拒绝,包括整个参数 `'.'`。`.env`、`report..json` 等不等于点段的普通名称可以使用。
|
|
154
|
+
* @returns 当前 SDK session 内延迟访问目标文件的冻结
|
|
155
|
+
* [FileHandle](/reference/symbols/root/interfaces/FileHandle)。其 `kind` 固定为 `'file'`,`name` 是
|
|
156
|
+
* `relativePath` 的末段 basename,`mode` 继承当前逻辑根;因此 `files.sandbox.file()` 返回
|
|
157
|
+
* `readwrite`,从用户选择目录继续派生时则继承所选目录的 `read` 或 `readwrite`,不能通过子路径
|
|
158
|
+
* 提升权限。
|
|
159
|
+
* @throws [HbMiniProgramSDKError](/reference/symbols/root/classes/HbMiniProgramSDKError)
|
|
160
|
+
* `relativePath` 不是字符串、为空、以 `/` 开头或结尾,包含连续 `/`、任一 `.` / `..` 点段、
|
|
161
|
+
* 反斜杠或控制字符时,同步抛出 `INVALID_PARAMS`。
|
|
162
|
+
*
|
|
163
|
+
* @remarks
|
|
164
|
+
* 该方法同步校验路径并创建 lazy proxy,不检查文件是否存在或创建文件,不读取内容或元数据,不发送
|
|
165
|
+
* bridge 请求,也不会打开系统选择器。调用本身因此不需要用户手势,不会触发 Host operation,
|
|
166
|
+
* 不会占用 `pickFiles()` / `saveFile()` 的 direct handle 配额,也不会暴露宿主真实路径。
|
|
167
|
+
*
|
|
168
|
+
* 后续 I/O 才要求在 `package.json#heybox.permissions` 中声明并启用 `filesystem`,并由 Host 开放
|
|
169
|
+
* 对应 operation:[FileHandle](/reference/symbols/root/interfaces/FileHandle) 的 `create()`、`remove()`、
|
|
170
|
+
* `exists()`、`readText()`、`readBytes()`、`writeText()`、`writeBytes()`、`stat()` 分别使用
|
|
171
|
+
* `file.create`、`file.remove`、`file.exists`、`file.readText`、`file.readBytes`、`file.writeText`、
|
|
172
|
+
* `file.writeBytes`、`file.stat`。未声明或未启用权限时分别返回 `PERMISSION_NOT_DECLARED` 或
|
|
173
|
+
* `PERMISSION_DENIED`,Host 未开放具体 operation 时返回 `METHOD_FORBIDDEN`;这些错误在调用异步
|
|
174
|
+
* 方法时发生,不由本方法抛出。
|
|
175
|
+
*
|
|
176
|
+
* 代理只表达目标位置。`exists()` 可区分文件缺失或目标实际为目录;`create()` 可显式确保文件存在,
|
|
177
|
+
* `writeText()` / `writeBytes()` 也可隐式创建目标文件,但不会自动创建缺失的父目录。只读父目录派生
|
|
178
|
+
* 的文件可以读取与查询,调用 `create()`、写入或删除会返回 `FILE_ACCESS_DENIED`;外部目录派生的
|
|
179
|
+
* 文件即使是 `readwrite` 也不能删除。
|
|
180
|
+
*
|
|
181
|
+
* 若目标是目录或需要先创建父目录,使用
|
|
182
|
+
* [files.sandbox.directory()](/reference/sdk/files/sandbox/directory)。若要让用户选择现有的精确外部
|
|
183
|
+
* 文件,使用 [files.pickFiles()](/reference/sdk/files/pickFiles);若要让用户指定新的精确可写目标,
|
|
184
|
+
* 使用 [files.saveFile()](/reference/sdk/files/saveFile)。
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```ts
|
|
188
|
+
* import hbSDK from '@heybox/hb-sdk'
|
|
189
|
+
*
|
|
190
|
+
* // 构造代理时没有 I/O,且不会隐式创建 reports 目录。
|
|
191
|
+
* const report = hbSDK.files.sandbox.file('reports/latest.json')
|
|
192
|
+
* console.log(report.kind, report.name, report.mode)
|
|
193
|
+
* // file, latest.json, readwrite
|
|
194
|
+
*
|
|
195
|
+
* await hbSDK.files.sandbox.directory('reports').create({ recursive: true })
|
|
196
|
+
* await report.writeText(JSON.stringify({ generatedAt: Date.now() }))
|
|
197
|
+
*
|
|
198
|
+
* if (await report.exists()) {
|
|
199
|
+
* console.log(await report.readText())
|
|
200
|
+
* console.log((await report.stat()).size)
|
|
201
|
+
* }
|
|
202
|
+
* ```
|
|
203
|
+
*
|
|
204
|
+
* @see [files.sandbox.directory()](/reference/sdk/files/sandbox/directory) 派生或创建沙箱目录。
|
|
205
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 通过可信用户操作取得现有外部文件授权。
|
|
206
|
+
* @see [files.saveFile()](/reference/sdk/files/saveFile) 通过可信用户操作取得精确可写目标。
|
|
207
|
+
* @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 查看创建、读写、状态与删除方法。
|
|
208
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 路径、权限、Host operation 与配额说明。
|
|
209
|
+
*
|
|
210
|
+
* @since 0.8.0-alpha.2
|
|
211
|
+
* @hbPlatform android
|
|
212
|
+
* @hbPlatform ios
|
|
213
|
+
* @hbPlatform ohos
|
|
214
|
+
* @hbPlatform windows
|
|
215
|
+
* @hbPlatform macos
|
|
216
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
217
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
218
|
+
* @hbClient ohos none
|
|
219
|
+
* @hbClient windows none
|
|
220
|
+
* @hbClient macos none
|
|
221
|
+
*/
|
|
222
|
+
file(relativePath: string): FileHandle;
|
|
223
|
+
/**
|
|
224
|
+
* 按规范相对路径派生目录代理。
|
|
225
|
+
*
|
|
226
|
+
* @param relativePath - 相对于当前逻辑根、使用 `/` 分隔的规范路径。必须是非空字符串,不能以
|
|
227
|
+
* `/` 开头或结尾,不能包含空 segment、反斜杠、NUL 或其他控制字符。`.` 是仅有的特例:只有
|
|
228
|
+
* 整个参数等于 `'.'` 时才表示当前逻辑根;`./cache`、`cache/.`、`cache/../secret` 等含点段路径
|
|
229
|
+
* 不会被折叠或解析,而会直接拒绝。
|
|
230
|
+
* @returns 当前 SDK session 内延迟访问目标目录的冻结
|
|
231
|
+
* [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle)。其 `kind` 固定为
|
|
232
|
+
* `'directory'`,`name` 是末段 basename(传 `'.'` 时为 `'.'`),`mode` 继承当前逻辑根;因此
|
|
233
|
+
* `files.sandbox.directory()` 返回 `readwrite`,从用户选择目录继续派生时则继承所选目录的
|
|
234
|
+
* `read` 或 `readwrite`,不能通过子路径提升权限。
|
|
235
|
+
* @throws [HbMiniProgramSDKError](/reference/symbols/root/classes/HbMiniProgramSDKError)
|
|
236
|
+
* `relativePath` 不是字符串、为空、以 `/` 开头或结尾,包含连续 `/`、任何 `.` / `..` 点段、
|
|
237
|
+
* 反斜杠或控制字符时,同步抛出 `INVALID_PARAMS`;完整参数 `'.'` 除外。
|
|
238
|
+
*
|
|
239
|
+
* @remarks
|
|
240
|
+
* 该方法同步校验路径并创建 lazy proxy,不检查目录是否存在或创建目录,不执行文件 I/O,不发送
|
|
241
|
+
* bridge 请求,也不会打开系统选择器。调用本身因此不需要用户手势,不会触发 Host operation,
|
|
242
|
+
* 不会占用 picker / `saveFile()` 的 direct handle 配额,也不会暴露宿主真实路径。
|
|
243
|
+
*
|
|
244
|
+
* 后续 I/O 才要求在 `package.json#heybox.permissions` 中声明并启用 `filesystem`,并由 Host 开放
|
|
245
|
+
* 对应 operation:[DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 的 `create()`、
|
|
246
|
+
* `exists()`、`list()`、`remove()` 分别使用 `directory.create`、`directory.exists`、
|
|
247
|
+
* `directory.list`、`directory.remove`。未声明或未启用权限时分别返回
|
|
248
|
+
* `PERMISSION_NOT_DECLARED` 或 `PERMISSION_DENIED`,Host 未开放具体 operation 时返回
|
|
249
|
+
* `METHOD_FORBIDDEN`;这些错误在调用异步方法时发生,不由本方法抛出。
|
|
250
|
+
*
|
|
251
|
+
* `files.sandbox.directory('.')` 是沙箱根目录的逻辑代理,可用于 `exists()` 或 `list()`,但不能删除;
|
|
252
|
+
* 对它调用 `remove()` 会返回 `FILE_ACCESS_DENIED`。普通子目录代理只表达目标位置:需要确保目录
|
|
253
|
+
* 存在时调用 `create()`,需要观察直接子项时调用 `list()`。若目标是文件,使用
|
|
254
|
+
* [files.sandbox.file()](/reference/sdk/files/sandbox/file);若要访问用户选择的外部目录,使用
|
|
255
|
+
* [files.pickDirectory()](/reference/sdk/files/pickDirectory)。
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* ```ts
|
|
259
|
+
* import hbSDK from '@heybox/hb-sdk'
|
|
260
|
+
*
|
|
261
|
+
* // 构造代理时没有 I/O;父目录也不会被隐式创建。
|
|
262
|
+
* const reports = hbSDK.files.sandbox.directory('reports/2026')
|
|
263
|
+
* console.log(reports.kind, reports.name, reports.mode)
|
|
264
|
+
* // directory, 2026, readwrite
|
|
265
|
+
*
|
|
266
|
+
* await reports.create({ recursive: true })
|
|
267
|
+
*
|
|
268
|
+
* // `.` 只作为完整参数表示沙箱根;它不是可嵌入路径的点段。
|
|
269
|
+
* const root = hbSDK.files.sandbox.directory('.')
|
|
270
|
+
* const entries = await root.list({ limit: 100 })
|
|
271
|
+
* console.log(entries.map(entry => entry.name))
|
|
272
|
+
* ```
|
|
273
|
+
*
|
|
274
|
+
* @see [files.sandbox.file()](/reference/sdk/files/sandbox/file) 派生沙箱文件代理。
|
|
275
|
+
* @see [files.pickDirectory()](/reference/sdk/files/pickDirectory) 通过可信用户操作取得外部目录授权。
|
|
276
|
+
* @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 查看 `create()`、`exists()`、`list()` 与 `remove()`。
|
|
277
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 路径、权限、Host operation 与配额说明。
|
|
278
|
+
*
|
|
279
|
+
* @since 0.8.0-alpha.2
|
|
280
|
+
* @hbPlatform android
|
|
281
|
+
* @hbPlatform ios
|
|
282
|
+
* @hbPlatform ohos
|
|
283
|
+
* @hbPlatform windows
|
|
284
|
+
* @hbPlatform macos
|
|
285
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
286
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
287
|
+
* @hbClient ohos none
|
|
288
|
+
* @hbClient windows none
|
|
289
|
+
* @hbClient macos none
|
|
290
|
+
*/
|
|
291
|
+
directory(relativePath: string): DirectoryHandle;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Mini-program 私有 sandbox 的逻辑根。
|
|
295
|
+
*
|
|
296
|
+
* @remarks
|
|
297
|
+
* sandbox 按 Mini-program identity 隔离并由 Host 持久保存;它是逻辑根,不是本机路径。
|
|
298
|
+
* sandbox 派生对象固定为 `readwrite`,但每次 I/O 仍需已声明 `filesystem` 权限且 Host 支持对应 operation。
|
|
299
|
+
*/
|
|
300
|
+
interface FileSystem extends PathRoot {
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* 当前 SDK session 中的文件代理。
|
|
304
|
+
*
|
|
305
|
+
* @remarks
|
|
306
|
+
* 代理是冻结的能力对象,不是原生 `File` 或文件路径。picker / `saveFile()` 返回的精确授权仅在当前
|
|
307
|
+
* Runtime session 有效;sandbox 或已授权目录派生的逻辑代理不会在创建时执行 I/O。
|
|
308
|
+
*/
|
|
309
|
+
interface FileHandle {
|
|
310
|
+
/** 可用于区分文件与目录的固定标记。 */
|
|
311
|
+
readonly kind: 'file';
|
|
312
|
+
/** 文件 basename,不包含父目录或真实路径。 */
|
|
313
|
+
readonly name: string;
|
|
314
|
+
/** 当前代理被授予的访问模式。 */
|
|
315
|
+
readonly mode: FileMode;
|
|
316
|
+
/**
|
|
317
|
+
* 确保文件存在并返回同一个代理。
|
|
318
|
+
*
|
|
319
|
+
* @param options - 可选的父目录创建与目标独占创建设置。省略时等同于
|
|
320
|
+
* `{ recursive: false, exclusive: false }`;完整语义见 {@link CreateOptions}。
|
|
321
|
+
* @returns 当前同一个 `FileHandle` proxy;成功后 `result === file`。方法不会读取文件,且默认的
|
|
322
|
+
* ensure-exists 不会截断或改写已有内容。
|
|
323
|
+
* @throws {@link HbMiniProgramSDKError} options 非对象,或 `recursive` / `exclusive` 不是 boolean 时
|
|
324
|
+
* 返回 `INVALID_PARAMS`;代理不是 `readwrite` 时在发送 bridge 请求前返回 `FILE_ACCESS_DENIED`。
|
|
325
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
326
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到 `file.create` 时返回
|
|
327
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
328
|
+
* @throws {@link HbMiniProgramSDKError} `recursive: false` 且父目录缺失时返回
|
|
329
|
+
* `DIRECTORY_NOT_FOUND`;目标实际是目录或路径中的祖先实际是文件时返回 `FILE_TYPE_MISMATCH`;
|
|
330
|
+
* `exclusive: true` 且文件已存在时返回 `FILE_ALREADY_EXISTS`。
|
|
331
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 已失效或不属于当前 Runtime session 时返回
|
|
332
|
+
* `FILE_ACCESS_REVOKED`;Host 创建失败、响应异常或底层平台 I/O 失败时返回相应稳定文件错误码,
|
|
333
|
+
* 无法识别的 Host 错误统一为 `FILE_IO_FAILED`。
|
|
334
|
+
*
|
|
335
|
+
* @remarks
|
|
336
|
+
* 目标缺失时创建空文件。`recursive: true` 会在当前逻辑 root 内同时创建缺失父目录;它不会允许
|
|
337
|
+
* `..`、绝对路径或跨越用户授权边界。目标已是文件时,默认调用作为幂等的 ensure-exists 成功,
|
|
338
|
+
* 保留原内容;需要检测冲突时传 `exclusive: true`。若目标实际为目录,不会把目录替换为文件。
|
|
339
|
+
*
|
|
340
|
+
* 调用要求当前代理的 `mode === 'readwrite'`。sandbox 文件固定继承 `readwrite`;从用户选择的目录
|
|
341
|
+
* 派生时继承该目录的 `mode`,因此只读目录的后代不能创建。用户选择或 `saveFile()` 返回的精确
|
|
342
|
+
* 外部 File 也只能在获授 `readwrite` 时调用;操作仍局限于该精确文件,不能取得父目录或兄弟文件。
|
|
343
|
+
* Runtime 会重新校验 direct handle 的 session/provenance,Host 还会绑定当前 Mini-program identity。
|
|
344
|
+
* 该方法不需要可信用户手势,也不会创建新的 direct handle、消耗 1024 个外部授权句柄配额或暴露真实路径。
|
|
345
|
+
*
|
|
346
|
+
* 新 PC Host 支持该 operation;Android/iOS 需要 `1.3.396+` 并以 `system.describe` 实际宣告的
|
|
347
|
+
* operation 为准,OHOS 同样按 Host 协商结果启用。Android 的精确 SAF File 仅授予 `read`,因此
|
|
348
|
+
* 不能调用本方法;sandbox 或可写目录派生文件不受该精确 File 限制。Web、Browser Dev Host、旧 Host
|
|
349
|
+
* 或 operation 集不完整时 fail closed,不提供 Blob 或内存 fallback。
|
|
350
|
+
*
|
|
351
|
+
* `create()` 只创建空目标。父目录已经存在时,{@link FileHandle.writeText} /
|
|
352
|
+
* {@link FileHandle.writeBytes} 也可隐式创建文件并写入内容;它们不会自动创建父目录。若需要先确保
|
|
353
|
+
* 目录存在,使用 {@link DirectoryHandle.create};只需探测目标时使用 {@link FileHandle.exists}。
|
|
354
|
+
*
|
|
355
|
+
* @example
|
|
356
|
+
* ```ts
|
|
357
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
358
|
+
*
|
|
359
|
+
* const report = hbSDK.files.sandbox.file('reports/2026/summary.json')
|
|
360
|
+
* const sameReport = await report.create({ recursive: true })
|
|
361
|
+
* console.assert(sameReport === report)
|
|
362
|
+
*
|
|
363
|
+
* await report.writeText('{"ready":true}')
|
|
364
|
+
* await report.create() // 已存在时成功,原内容不变
|
|
365
|
+
* console.log(await report.readText())
|
|
366
|
+
*
|
|
367
|
+
* try {
|
|
368
|
+
* await report.create({ exclusive: true })
|
|
369
|
+
* } catch (error) {
|
|
370
|
+
* if (!(error instanceof HbMiniProgramSDKError) || error.code !== 'FILE_ALREADY_EXISTS') throw error
|
|
371
|
+
* }
|
|
372
|
+
* ```
|
|
373
|
+
*
|
|
374
|
+
* @see {@link CreateOptions}
|
|
375
|
+
* @see {@link FileHandle.exists}
|
|
376
|
+
* @see {@link FileHandle.writeText}
|
|
377
|
+
* @see {@link FileHandle.writeBytes}
|
|
378
|
+
* @see {@link DirectoryHandle.create}
|
|
379
|
+
* @see {@link FilesModule.pickDirectory | files.pickDirectory}
|
|
380
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox | 文件能力与沙箱}
|
|
381
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/error-handling | 错误处理}
|
|
382
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
|
|
383
|
+
*
|
|
384
|
+
* @since 0.8.0-alpha.2
|
|
385
|
+
* @hbPlatform android
|
|
386
|
+
* @hbPlatform ios
|
|
387
|
+
* @hbPlatform ohos
|
|
388
|
+
* @hbPlatform windows
|
|
389
|
+
* @hbPlatform macos
|
|
390
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
391
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
392
|
+
* @hbClient ohos none
|
|
393
|
+
* @hbClient windows none
|
|
394
|
+
* @hbClient macos none
|
|
395
|
+
*/
|
|
396
|
+
create(options?: CreateOptions): Promise<FileHandle>;
|
|
397
|
+
/**
|
|
398
|
+
* 删除当前代理指向的 sandbox 文件。
|
|
399
|
+
*
|
|
400
|
+
* @returns Host 完成删除后以 `undefined` resolve;当前 `FileHandle` 代理本身仍可复用,后续可用
|
|
401
|
+
* {@link FileHandle.exists | exists()} 确认目标已不存在,或用 {@link FileHandle.create | create()}
|
|
402
|
+
* 在同一位置重新创建文件。
|
|
403
|
+
* @throws {@link HbMiniProgramSDKError} 代理为只读,或来源是 `pickFiles()`、`saveFile()`、外部
|
|
404
|
+
* Directory 派生项/枚举项时返回 `FILE_ACCESS_DENIED`;外部授权即使为 `readwrite` 也不能删除。
|
|
405
|
+
* @throws {@link HbMiniProgramSDKError} 目标或祖先不存在时返回 `FILE_NOT_FOUND` /
|
|
406
|
+
* `DIRECTORY_NOT_FOUND`,目标实际是目录时可返回 `FILE_TYPE_MISMATCH`;授权失效或 Host 删除失败
|
|
407
|
+
* 时返回 `FILE_ACCESS_REVOKED` / `FILE_IO_FAILED` 等稳定文件错误码。
|
|
408
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
409
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放 `file.remove` operation 时返回
|
|
410
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 不认识该 method 时可返回 `METHOD_NOT_FOUND`。
|
|
411
|
+
*
|
|
412
|
+
* @remarks
|
|
413
|
+
* 该方法只删除一个文件,不接受参数,也不删除目录。可删除对象必须同时来自当前
|
|
414
|
+
* Mini-program 的 sandbox 且为 `readwrite`;`files.sandbox.file()` 和 sandbox 目录的 `list()`
|
|
415
|
+
* 结果满足来源约束。若目标是目录,使用 {@link DirectoryHandle.remove};删除非空目录还需显式
|
|
416
|
+
* 传入 `{ recursive: true }`。
|
|
417
|
+
*
|
|
418
|
+
* `remove()` 不会先调用 `exists()`,也不是幂等的“确保不存在”操作:lazy sandbox 代理可以在
|
|
419
|
+
* 文件尚不存在时构造,此时调用删除会按 Host 结果抛出缺失错误。即使先由 `exists()` 返回
|
|
420
|
+
* `true`,目标仍可能在两次异步调用之间变化,因此仍应处理 `FILE_NOT_FOUND` /
|
|
421
|
+
* `DIRECTORY_NOT_FOUND`。调用不要求可信用户手势,也不占用外部 direct-handle 配额。
|
|
422
|
+
*
|
|
423
|
+
* 新 PC Host 支持该操作;Android/iOS `1.3.396+` 和 OHOS 仍以启动时
|
|
424
|
+
* `system.describe` 宣告的 `files.remove` operation 为准。Web、Browser Dev Host、旧 Host 或
|
|
425
|
+
* operation 缺失时 fail closed,不提供浏览器文件系统或内存 fallback。
|
|
426
|
+
*
|
|
427
|
+
* @example
|
|
428
|
+
* ```ts
|
|
429
|
+
* import hbSDK from '@heybox/hb-sdk'
|
|
430
|
+
*
|
|
431
|
+
* const draft = hbSDK.files.sandbox.file('draft.txt')
|
|
432
|
+
* await draft.writeText('temporary')
|
|
433
|
+
*
|
|
434
|
+
* if (await draft.exists()) {
|
|
435
|
+
* await draft.remove()
|
|
436
|
+
* }
|
|
437
|
+
* console.log(await draft.exists()) // false
|
|
438
|
+
*
|
|
439
|
+
* // 代理仍表示同一个 sandbox 位置,可以重新创建。
|
|
440
|
+
* await draft.create()
|
|
441
|
+
* ```
|
|
442
|
+
*
|
|
443
|
+
* @see {@link FileHandle.create}
|
|
444
|
+
* @see {@link FileHandle.exists}
|
|
445
|
+
* @see {@link DirectoryHandle.remove}
|
|
446
|
+
* @see [files.sandbox.file()](/reference/sdk/files/sandbox/file) 创建 sandbox 文件代理。
|
|
447
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看来源、平台与错误码边界。
|
|
448
|
+
*/
|
|
449
|
+
remove(): Promise<void>;
|
|
450
|
+
/**
|
|
451
|
+
* 检查当前代理是否仍解析到一个文件。
|
|
452
|
+
*
|
|
453
|
+
* @returns Host 能取得目标且确认其类型为文件时返回 `true`。目标文件不存在、任一祖先目录
|
|
454
|
+
* 不存在,或同一逻辑位置实际是目录时返回 `false`;这些正常的“不存在”结果不会抛出
|
|
455
|
+
* `FILE_NOT_FOUND`、`DIRECTORY_NOT_FOUND` 或 `FILE_TYPE_MISMATCH`。
|
|
456
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 权限时分别以
|
|
457
|
+
* `PERMISSION_NOT_DECLARED`、`PERMISSION_DENIED` 拒绝;当前 Host 未开放 `file.exists` 时以
|
|
458
|
+
* `METHOD_FORBIDDEN` 拒绝,旧 Runtime 也可能返回 `METHOD_NOT_FOUND`。
|
|
459
|
+
* @throws {@link HbMiniProgramSDKError} picker / `saveFile()` 返回的精确外部授权被撤销、句柄
|
|
460
|
+
* 不属于当前 Runtime session 或 registry 已释放时,以 `FILE_ACCESS_REVOKED` 拒绝,而不是返回
|
|
461
|
+
* `false`;SDK 已销毁或 Runtime 已卸载时分别以 `SDK_DESTROYED`、`RUNTIME_UNAVAILABLE` 拒绝。
|
|
462
|
+
* @throws {@link HbMiniProgramSDKError} Host 拒绝访问、`stat` 探测失败、返回非布尔 bridge 结果
|
|
463
|
+
* 或发生其他文件 I/O 失败时,以 `FILE_ACCESS_DENIED`、`FILE_IO_FAILED` 或对应 SDK / bridge
|
|
464
|
+
* 错误拒绝。调用方不应把所有异常都解释为“不存在”。
|
|
465
|
+
*
|
|
466
|
+
* @remarks
|
|
467
|
+
* 这是只读查询,不创建文件、不读取内容、不修改访问模式,也不要求可信用户手势。
|
|
468
|
+
* `mode: 'read'` 与 `mode: 'readwrite'` 的 {@link FileHandle} 均可调用;但成功返回 `true` 不会
|
|
469
|
+
* 授予写权限,后续 `create()`、写入或删除仍受当前 mode、来源和 Host operation 限制。
|
|
470
|
+
*
|
|
471
|
+
* Runtime 使用 Host 的文件状态原语完成检查,但该布尔结果不是 {@link FileHandle.stat | stat()}
|
|
472
|
+
* 的缓存或替代品,也不包含大小与时间戳。它只描述本次探测时的状态:目标可能在 resolve 后
|
|
473
|
+
* 被删除、替换或撤销授权,因此后续 `readText()`、`stat()` 或写入仍可能失败;不要用
|
|
474
|
+
* `exists()` 作为权限检查或消除并发竞态。
|
|
475
|
+
*
|
|
476
|
+
* 对 sandbox lazy proxy,返回 `false` 后可在 `readwrite` 模式下调用
|
|
477
|
+
* {@link FileHandle.create | create()} 显式确保文件存在;缺失父目录时由 `create({ recursive: true })`
|
|
478
|
+
* 决定是否一并创建。对 picker / `saveFile()` 的精确外部 FileHandle,授权失效属于错误,不等价于
|
|
479
|
+
* 文件不存在。若要检查目录,应使用 {@link DirectoryHandle.exists | DirectoryHandle.exists()},
|
|
480
|
+
* 目录位于当前文件代理对应位置时本方法返回 `false`。
|
|
481
|
+
*
|
|
482
|
+
* 新 PC Host 支持该操作;Android / iOS `1.3.396+` 仅在 `system.describe` 宣告
|
|
483
|
+
* `files.stat` 时逐项启用,OHOS 同样以 Host 实际协商结果为准。Web、Browser Dev Host、旧 Host
|
|
484
|
+
* 或缺少该 operation 的环境会 fail closed,不提供浏览器 File / Blob 或内存 fallback;页面应
|
|
485
|
+
* 处理 `METHOD_FORBIDDEN`,不要仅按操作系统推断可用性。
|
|
486
|
+
*
|
|
487
|
+
* @example
|
|
488
|
+
* ```ts
|
|
489
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
490
|
+
*
|
|
491
|
+
* const report = hbSDK.files.sandbox.file('reports/latest.json')
|
|
492
|
+
*
|
|
493
|
+
* try {
|
|
494
|
+
* if (!(await report.exists())) {
|
|
495
|
+
* await report.create({ recursive: true })
|
|
496
|
+
* await report.writeText('{}')
|
|
497
|
+
* }
|
|
498
|
+
*
|
|
499
|
+
* // exists() 之后状态仍可能变化,实际读取错误仍需处理。
|
|
500
|
+
* console.log(await report.readText())
|
|
501
|
+
* } catch (error) {
|
|
502
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'METHOD_FORBIDDEN') {
|
|
503
|
+
* showFilesUnsupported()
|
|
504
|
+
* } else {
|
|
505
|
+
* throw error
|
|
506
|
+
* }
|
|
507
|
+
* }
|
|
508
|
+
* ```
|
|
509
|
+
*
|
|
510
|
+
* @see {@link FileHandle.create | FileHandle.create()} 确保 sandbox 文件存在。
|
|
511
|
+
* @see {@link FileHandle.stat | FileHandle.stat()} 读取文件大小与 Host 可提供的时间戳。
|
|
512
|
+
* @see {@link DirectoryHandle.exists | DirectoryHandle.exists()} 检查目录类型的目标。
|
|
513
|
+
* @see [files.sandbox.file()](/reference/sdk/files/sandbox/file) 创建 sandbox lazy FileHandle。
|
|
514
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 取得当前 session 的精确外部文件授权。
|
|
515
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看权限、平台与 Host operation 说明。
|
|
516
|
+
*
|
|
517
|
+
* @since 0.8.0-alpha.2
|
|
518
|
+
* @hbPlatform android
|
|
519
|
+
* @hbPlatform ios
|
|
520
|
+
* @hbPlatform ohos
|
|
521
|
+
* @hbPlatform windows
|
|
522
|
+
* @hbPlatform macos
|
|
523
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
524
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
525
|
+
* @hbClient ohos none
|
|
526
|
+
* @hbClient windows none
|
|
527
|
+
* @hbClient macos none
|
|
528
|
+
*/
|
|
529
|
+
exists(): Promise<boolean>;
|
|
530
|
+
/**
|
|
531
|
+
* 将完整文件按文本读取。
|
|
532
|
+
*
|
|
533
|
+
* @returns Runtime 将 Host 返回的完整字节序列按严格 UTF-8 解码后的字符串。空文件返回 `''`;
|
|
534
|
+
* 换行、NUL 与其他合法 Unicode 内容保持不变。UTF-8 decoder 会剥离第一个开头 BOM;若解码结果
|
|
535
|
+
* 仍以 `U+FEFF` 开头,Runtime 再移除一个,因此一到两个连续前导 UTF-8 BOM 都不会出现在结果中。
|
|
536
|
+
* @throws {@link HbMiniProgramSDKError} 文件不是合法 UTF-8 时返回 `FILE_ENCODING_INVALID`,不会用
|
|
537
|
+
* replacement character 静默替换坏字节。需要无损读取任意二进制或保留 BOM 时使用
|
|
538
|
+
* {@link FileHandle.readBytes | readBytes()}。
|
|
539
|
+
* @throws {@link HbMiniProgramSDKError} 目标或祖先不存在时返回 `FILE_NOT_FOUND` / `DIRECTORY_NOT_FOUND`,
|
|
540
|
+
* 目标类型不匹配时返回 `FILE_TYPE_MISMATCH`。Android/iOS 当前对一次完整读取设 8 MiB 上限,
|
|
541
|
+
* 超限时返回 `FILE_TOO_LARGE`。
|
|
542
|
+
* @throws {@link HbMiniProgramSDKError} 普通 sandbox / picker / `saveFile()` 句柄未声明或未启用
|
|
543
|
+
* `filesystem` 时返回 `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到
|
|
544
|
+
* `file.readText` 时返回 `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
545
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 已失效、来自其他或已结束的 Runtime
|
|
546
|
+
* session 时返回 `FILE_ACCESS_REVOKED`;SDK / Runtime 已终止、调用超时、Host 返回无效内容或底层
|
|
547
|
+
* I/O 失败时返回 `SDK_DESTROYED`、`RUNTIME_DESTROYED`、`REQUEST_TIMEOUT` 或 `FILE_IO_FAILED` 等
|
|
548
|
+
* 对应 SDK 错误。
|
|
549
|
+
*
|
|
550
|
+
* @remarks
|
|
551
|
+
* 该方法读取并缓冲整个文件,没有 offset、range、stream、encoding 或 `AbortSignal` 参数。移动端
|
|
552
|
+
* Host 可以在内部按 chunk 读取,但公开 Promise 只在全部字节读取、复制和 UTF-8 解码完成后 resolve;
|
|
553
|
+
* 读取失败不会返回部分文本。8 MiB 是 Android/iOS 当前 Host 的原始文件字节上限,不是 JavaScript
|
|
554
|
+
* 字符串长度限制;新 PC Host 的限制由实际 Host I/O 合同决定。
|
|
555
|
+
*
|
|
556
|
+
* `mode: 'read'` 与 `mode: 'readwrite'` 句柄都可以读取,调用不需要可信用户手势,也不会弹出 picker、
|
|
557
|
+
* 创建文件、修改内容或延长外部授权寿命。picker / `saveFile()` 返回的 direct handle 只在当前
|
|
558
|
+
* Runtime session 有效;sandbox lazy ref 会在每次调用时按当前 Mini-program identity 解析。
|
|
559
|
+
* Companion `attachments.open()` 返回的只读 FileHandle 是受控例外:其 `readText()` 由 `companion`
|
|
560
|
+
* provenance 授权,不额外要求 `filesystem`,但仍受当前 Companion / Runtime session 生命周期约束。
|
|
561
|
+
*
|
|
562
|
+
* {@link FileHandle.writeText | writeText()} 执行相反方向的完整 UTF-8 编码与覆盖写入;它不会添加 BOM,
|
|
563
|
+
* 且要求 `mode === 'readwrite'`。若内容可能不是文本,或业务需要区分 BOM 和文件正文,应使用
|
|
564
|
+
* {@link FileHandle.readBytes | readBytes()} 获取原始字节并自行解析。
|
|
565
|
+
*
|
|
566
|
+
* @example
|
|
567
|
+
* ```ts
|
|
568
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
569
|
+
*
|
|
570
|
+
* const settings = hbSDK.files.sandbox.file('settings.json')
|
|
571
|
+
*
|
|
572
|
+
* try {
|
|
573
|
+
* const text = await settings.readText()
|
|
574
|
+
* const value = JSON.parse(text)
|
|
575
|
+
* console.log(value)
|
|
576
|
+
* } catch (error) {
|
|
577
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_ENCODING_INVALID') {
|
|
578
|
+
* // readBytes() 保留原始字节和 BOM,可交给业务自己的格式解析器。
|
|
579
|
+
* const bytes = await settings.readBytes()
|
|
580
|
+
* console.warn('settings.json 不是 UTF-8', bytes)
|
|
581
|
+
* } else if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_NOT_FOUND') {
|
|
582
|
+
* await settings.writeText('{}')
|
|
583
|
+
* } else {
|
|
584
|
+
* throw error
|
|
585
|
+
* }
|
|
586
|
+
* }
|
|
587
|
+
* ```
|
|
588
|
+
*
|
|
589
|
+
* @see {@link FileHandle.readBytes | FileHandle.readBytes()} 无损读取原始字节并保留 BOM。
|
|
590
|
+
* @see {@link FileHandle.writeText | FileHandle.writeText()} 以 UTF-8 覆盖写入完整字符串。
|
|
591
|
+
* @see {@link FileHandle.stat | FileHandle.stat()} 在读取前查看文件字节数。
|
|
592
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 取得当前 session 的外部文件授权。
|
|
593
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看权限、平台限制与错误码。
|
|
594
|
+
*/
|
|
595
|
+
readText(): Promise<string>;
|
|
596
|
+
/**
|
|
597
|
+
* 将字符串按 UTF-8 编码后完整写入文件。
|
|
598
|
+
*
|
|
599
|
+
* @param content - 要写入的 JavaScript 字符串。必须确实是 `string`;SDK 不会对对象调用
|
|
600
|
+
* `String()`,也不接受 `Uint8Array`、`Blob`、stream 或 encoding 选项。空字符串合法,会把目标
|
|
601
|
+
* 替换为空文件。需要精确控制原始字节时使用 {@link FileHandle.writeBytes | writeBytes()}。
|
|
602
|
+
* @returns Runtime 完成 UTF-8 编码且 Host 的完整写入请求成功后以 `undefined` resolve。移动端会
|
|
603
|
+
* 等待最后一个带 EOF 的 chunk 获得 Host 响应;该时点不返回写入字节数、文件元数据或新的
|
|
604
|
+
* `FileHandle`,也不承诺操作系统已执行物理 `fsync`。
|
|
605
|
+
* @throws {@link HbMiniProgramSDKError} `content` 不是字符串时在 Host I/O 前以
|
|
606
|
+
* `INVALID_PARAMS` 拒绝;当前代理的 `mode` 不是 `readwrite` 时在发送 bridge 请求前以
|
|
607
|
+
* `FILE_ACCESS_DENIED` 拒绝。
|
|
608
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 权限时分别以
|
|
609
|
+
* `PERMISSION_NOT_DECLARED`、`PERMISSION_DENIED` 拒绝;Host 未开放 `file.writeText` 时以
|
|
610
|
+
* `METHOD_FORBIDDEN` 拒绝,旧 Runtime 也可能返回 `METHOD_NOT_FOUND`。
|
|
611
|
+
* @throws {@link HbMiniProgramSDKError} 缺失父目录时返回 `DIRECTORY_NOT_FOUND`,路径中的祖先
|
|
612
|
+
* 或目标类型不匹配时返回 `FILE_TYPE_MISMATCH`。Android / iOS 对一次完整写入的 UTF-8 编码结果
|
|
613
|
+
* 设 `8 MiB` 上限,超过 `8 * 1024 * 1024` bytes 时返回 `FILE_TOO_LARGE`;该限制按字节而不是
|
|
614
|
+
* JavaScript 字符数计算。
|
|
615
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 被撤销、不属于当前 Runtime session
|
|
616
|
+
* 或 registry 已释放时返回 `FILE_ACCESS_REVOKED`;SDK 已销毁、Runtime 已卸载、请求超时、Host
|
|
617
|
+
* 响应异常或底层 I/O 失败时,分别以 `SDK_DESTROYED`、`RUNTIME_UNAVAILABLE`、
|
|
618
|
+
* `REQUEST_TIMEOUT`、`FILE_IO_FAILED` 或对应稳定文件错误码拒绝。
|
|
619
|
+
*
|
|
620
|
+
* @remarks
|
|
621
|
+
* Runtime 使用标准 `TextEncoder` 把完整字符串编码为不带 BOM 的 UTF-8,再调用 Host 的完整文件
|
|
622
|
+
* 写原语。该方法不是 append、range write 或 stream:已有文件内容会被本次编码结果整体替换,
|
|
623
|
+
* 写入 `''` 会把文件截断为零字节。若 Host 在写入中途失败,Promise 会拒绝;公开合同不承诺失败
|
|
624
|
+
* 时回滚旧内容或提供跨进程原子替换,需要事务语义时应由业务使用临时文件和自己的提交协议。
|
|
625
|
+
*
|
|
626
|
+
* 目标文件本身不存在时可以隐式创建,因此通常不需要先调用
|
|
627
|
+
* {@link FileHandle.create | create()};但父目录必须已经存在,`writeText()` 不会递归创建目录。
|
|
628
|
+
* 需要创建父目录时先调用 {@link DirectoryHandle.create | DirectoryHandle.create()},或对文件调用
|
|
629
|
+
* `create({ recursive: true })`。不要用 `exists()` 后再写来消除竞态:目标可能在两次异步调用之间
|
|
630
|
+
* 变化,实际写入错误仍应处理。
|
|
631
|
+
*
|
|
632
|
+
* sandbox lazy FileHandle 固定继承 `readwrite`,并在每次调用时按当前 Mini-program identity 解析。
|
|
633
|
+
* `pickFiles({ mode: 'readwrite' })`、`pickDirectory({ mode: 'readwrite' })` 的派生文件和
|
|
634
|
+
* `saveFile()` 返回的精确外部 FileHandle 也可以写入,但授权范围不会因此扩张;direct handle 只在
|
|
635
|
+
* 当前 Runtime session 有效。只读 picker 结果、Android 的精确 SAF File 和 Companion attachment
|
|
636
|
+
* 会在本地 mode 检查时以 `FILE_ACCESS_DENIED` 拒绝。该方法不需要新的可信用户手势;只有最初
|
|
637
|
+
* 获取外部授权的 picker / `saveFile()` 需要手势。
|
|
638
|
+
*
|
|
639
|
+
* 新 PC Host 支持该操作;Android / iOS `1.3.396+` 仅在 `system.describe` 同时宣告
|
|
640
|
+
* `files.openWrite`、`files.write`、`files.release` 时逐项启用,OHOS 同样以 Host 实际协商结果为准。
|
|
641
|
+
* Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不提供浏览器 File / Blob
|
|
642
|
+
* 或内存 fallback。新 PC Host 的大小限制由实际 Host 合同决定,不应套用移动端 8 MiB 上限。
|
|
643
|
+
*
|
|
644
|
+
* {@link FileHandle.readText | readText()} 可按严格 UTF-8 读取完整内容,但会移除前导 BOM;写入后
|
|
645
|
+
* 仍可能因为外部修改、授权撤销或 Session 结束而读取失败。需要检查最终字节数或时间戳时,在
|
|
646
|
+
* 写入成功后另行调用 {@link FileHandle.stat | stat()}。
|
|
647
|
+
*
|
|
648
|
+
* @example
|
|
649
|
+
* ```ts
|
|
650
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
651
|
+
*
|
|
652
|
+
* const reports = hbSDK.files.sandbox.directory('reports')
|
|
653
|
+
* await reports.create({ recursive: true })
|
|
654
|
+
*
|
|
655
|
+
* const report = reports.file('latest.txt')
|
|
656
|
+
* await report.writeText('第一版\n') // 文件不存在时隐式创建。
|
|
657
|
+
*
|
|
658
|
+
* try {
|
|
659
|
+
* await report.writeText('第二版\n') // 完整替换,不会追加到第一版后面。
|
|
660
|
+
* console.log(await report.readText()) // 第二版
|
|
661
|
+
* } catch (error) {
|
|
662
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_TOO_LARGE') {
|
|
663
|
+
* console.warn('文本的 UTF-8 编码结果超过当前平台上限')
|
|
664
|
+
* } else {
|
|
665
|
+
* throw error
|
|
666
|
+
* }
|
|
667
|
+
* }
|
|
668
|
+
* ```
|
|
669
|
+
*
|
|
670
|
+
* @see {@link FileHandle.readText | FileHandle.readText()} 按严格 UTF-8 读取完整文件。
|
|
671
|
+
* @see {@link FileHandle.writeBytes | FileHandle.writeBytes()} 写入调用方提供的原始字节。
|
|
672
|
+
* @see {@link FileHandle.create | FileHandle.create()} 显式确保文件和可选父目录存在。
|
|
673
|
+
* @see {@link FileHandle.stat | FileHandle.stat()} 在写入后读取文件大小与时间戳。
|
|
674
|
+
* @see {@link DirectoryHandle.create | DirectoryHandle.create()} 先创建缺失父目录。
|
|
675
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 取得可选的精确外部文件写授权。
|
|
676
|
+
* @see [files.saveFile()](/reference/sdk/files/saveFile) 让用户指定新的精确可写目标。
|
|
677
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看路径、权限、平台与配额边界。
|
|
678
|
+
*
|
|
679
|
+
* @since 0.8.0-alpha.2
|
|
680
|
+
* @hbPlatform android
|
|
681
|
+
* @hbPlatform ios
|
|
682
|
+
* @hbPlatform ohos
|
|
683
|
+
* @hbPlatform windows
|
|
684
|
+
* @hbPlatform macos
|
|
685
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
686
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
687
|
+
* @hbClient ohos none
|
|
688
|
+
* @hbClient windows none
|
|
689
|
+
* @hbClient macos none
|
|
690
|
+
*/
|
|
691
|
+
writeText(content: string): Promise<void>;
|
|
692
|
+
/**
|
|
693
|
+
* 将完整文件读取为新的字节数组。
|
|
694
|
+
*
|
|
695
|
+
* @returns 包含完整文件原始字节的新 `Uint8Array`。空文件返回长度为 `0` 的数组。Runtime 会先
|
|
696
|
+
* 复制 Host 字节,SDK 验证 bridge 结果后再创建当前可见区间的副本,因此返回值不与 Host / bridge
|
|
697
|
+
* 响应共享可变存储;修改数组只改变调用方的本地副本,不会写回文件。
|
|
698
|
+
* @throws {@link HbMiniProgramSDKError} 目标或祖先不存在时返回 `FILE_NOT_FOUND` / `DIRECTORY_NOT_FOUND`,
|
|
699
|
+
* 目标类型不匹配时返回 `FILE_TYPE_MISMATCH`。Android / iOS 当前对一次完整读取设 `8 MiB`
|
|
700
|
+
* (`8 * 1024 * 1024` bytes)上限,超限时返回 `FILE_TOO_LARGE`。
|
|
701
|
+
* @throws {@link HbMiniProgramSDKError} 普通 sandbox / picker / `saveFile()` 句柄未声明或未启用
|
|
702
|
+
* `filesystem` 时返回 `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到
|
|
703
|
+
* `file.readBytes` 时返回 `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
704
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 被撤销、不属于当前或已结束的 Runtime
|
|
705
|
+
* session 时返回 `FILE_ACCESS_REVOKED`;Host 拒绝底层授权时也可能返回 `FILE_ACCESS_DENIED`。
|
|
706
|
+
* 握手失败、SDK / Runtime 已终止或不可用、调用超时、Host 返回非字节结果或底层 I/O 失败时,返回
|
|
707
|
+
* `HANDSHAKE_FAILED`、`SDK_DESTROYED`、`RUNTIME_DESTROYED`、`RUNTIME_UNAVAILABLE`、
|
|
708
|
+
* `REQUEST_TIMEOUT`、`FILE_IO_FAILED` 或对应稳定文件错误码。
|
|
709
|
+
*
|
|
710
|
+
* @remarks
|
|
711
|
+
* 该方法读取并缓冲整个文件,不提供 offset、range、stream、encoding、进度回调或 `AbortSignal`
|
|
712
|
+
* 参数。移动端 Host 可以在内部按 chunk 拉取,但公开 Promise 只在全部字节读取并复制完成后 resolve;
|
|
713
|
+
* 失败不会返回部分数组。8 MiB 是 Android / iOS 当前 Host 的原始文件字节上限,恰好等于上限允许;
|
|
714
|
+
* 新 PC Host 的限制由实际 Host I/O 合同决定。
|
|
715
|
+
*
|
|
716
|
+
* `readBytes()` 不解释内容格式:UTF-8 BOM、无效 UTF-8、NUL、压缩数据和图片头都会原样保留,也不会
|
|
717
|
+
* 因文本编码返回 `FILE_ENCODING_INVALID`。需要严格 UTF-8 字符串并移除前导 BOM 时使用
|
|
718
|
+
* {@link FileHandle.readText | readText()};需要把修改后的字节完整覆盖回文件时使用
|
|
719
|
+
* {@link FileHandle.writeBytes | writeBytes()}。
|
|
720
|
+
*
|
|
721
|
+
* `mode: 'read'` 与 `mode: 'readwrite'` 句柄都可以读取,调用不需要可信用户手势,也不会弹出 picker、
|
|
722
|
+
* 创建文件、修改内容或延长外部授权寿命。picker / `saveFile()` 返回的 direct handle 只在当前
|
|
723
|
+
* Runtime session 有效;sandbox lazy ref 会在每次调用时按当前 Mini-program identity 解析。
|
|
724
|
+
* Companion `attachments.open()` 返回的只读 FileHandle 是受控例外:其 `readBytes()` 由 `companion`
|
|
725
|
+
* provenance 授权,不额外要求 `filesystem`,但仍受当前 Companion / Runtime session 生命周期约束。
|
|
726
|
+
*
|
|
727
|
+
* 新 PC Host 支持该操作;Android / iOS `1.3.396+` 仅在 `system.describe` 同时宣告
|
|
728
|
+
* `files.openRead`、`files.read`、`files.release` 时逐项启用,OHOS 同样以 Host 实际协商结果为准。
|
|
729
|
+
* Web、Browser Dev Host 的普通 sandbox / picker 路径、旧 Host 或 operation 集不完整时 fail closed,
|
|
730
|
+
* 不提供浏览器 File / Blob、内存 fallback 或自动分段的公开 API;前述 Companion attachment 仍按
|
|
731
|
+
* 自身受控 provenance 判断。
|
|
732
|
+
*
|
|
733
|
+
* @example
|
|
734
|
+
* ```ts
|
|
735
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
736
|
+
*
|
|
737
|
+
* const avatar = hbSDK.files.sandbox.file('avatar.png')
|
|
738
|
+
*
|
|
739
|
+
* try {
|
|
740
|
+
* const bytes = await avatar.readBytes()
|
|
741
|
+
* const isPng =
|
|
742
|
+
* bytes.length >= 4 &&
|
|
743
|
+
* bytes[0] === 0x89 &&
|
|
744
|
+
* bytes[1] === 0x50 &&
|
|
745
|
+
* bytes[2] === 0x4e &&
|
|
746
|
+
* bytes[3] === 0x47
|
|
747
|
+
*
|
|
748
|
+
* console.log({ isPng, size: bytes.byteLength })
|
|
749
|
+
* bytes[0] = 0 // 只修改本地副本,不会写回 avatar.png
|
|
750
|
+
* } catch (error) {
|
|
751
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_TOO_LARGE') {
|
|
752
|
+
* console.warn('请改用业务分片格式,或避免把大文件一次读入内存')
|
|
753
|
+
* } else {
|
|
754
|
+
* throw error
|
|
755
|
+
* }
|
|
756
|
+
* }
|
|
757
|
+
* ```
|
|
758
|
+
*
|
|
759
|
+
* @see {@link FileHandle.readText | FileHandle.readText()} 严格按 UTF-8 解码并处理前导 BOM。
|
|
760
|
+
* @see {@link FileHandle.writeBytes | FileHandle.writeBytes()} 完整覆盖写入原始字节。
|
|
761
|
+
* @see {@link FileHandle.stat | FileHandle.stat()} 在完整读取前查看文件字节数。
|
|
762
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 取得当前 session 的外部文件授权。
|
|
763
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看权限、平台限制与错误码。
|
|
764
|
+
*/
|
|
765
|
+
readBytes(): Promise<Uint8Array>;
|
|
766
|
+
/**
|
|
767
|
+
* 将原始字节完整写入文件。
|
|
768
|
+
*
|
|
769
|
+
* @param content - 要写入的 `Uint8Array`。SDK 在调用时只复制该 view 的当前可见字节区间;不会把
|
|
770
|
+
* `byteOffset` 之前或 `byteLength` 之后的 backing `ArrayBuffer` 内容一并写入。调用返回 Promise 后
|
|
771
|
+
* 再修改原数组不会改变本次写入。空数组合法,会把目标替换为零字节文件。
|
|
772
|
+
* @returns SDK 与 Runtime 完成输入复制且 Host 的完整写入请求成功后以 `undefined` resolve。移动端
|
|
773
|
+
* 会等待最后一个带 EOF 的 chunk 获得 Host 响应;该时点不返回写入字节数、文件元数据或新的
|
|
774
|
+
* `FileHandle`,也不承诺操作系统已执行物理 `fsync`。
|
|
775
|
+
* @throws {@link HbMiniProgramSDKError} `content` 不是 `Uint8Array`,或其 backing buffer 是
|
|
776
|
+
* `SharedArrayBuffer` 时,在发送 bridge 请求前返回 `INVALID_PARAMS`;当前代理不是 `readwrite`
|
|
777
|
+
* 时在输入复制和 Host I/O 前返回 `FILE_ACCESS_DENIED`。
|
|
778
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 权限时返回
|
|
779
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到 `file.writeBytes` 时返回
|
|
780
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
781
|
+
* @throws {@link HbMiniProgramSDKError} 缺失父目录时返回 `DIRECTORY_NOT_FOUND`,路径中的祖先或
|
|
782
|
+
* 目标类型不匹配时返回 `FILE_TYPE_MISMATCH`。Android / iOS 对一次完整写入设 8 MiB 上限;当前
|
|
783
|
+
* view 的 `byteLength` 超过 `8 * 1024 * 1024` 时返回 `FILE_TOO_LARGE`。
|
|
784
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 被撤销、不属于当前 Runtime session 或
|
|
785
|
+
* registry 已释放时返回 `FILE_ACCESS_REVOKED`;SDK 已销毁、Runtime 已卸载、请求超时、Host 响应
|
|
786
|
+
* 异常或底层 I/O 失败时,返回 `SDK_DESTROYED`、`RUNTIME_UNAVAILABLE`、`REQUEST_TIMEOUT`、
|
|
787
|
+
* `FILE_IO_FAILED` 或对应稳定文件错误码。
|
|
788
|
+
*
|
|
789
|
+
* @remarks
|
|
790
|
+
* SDK 会在调用同步阶段执行第一次防御性复制,Runtime 收到 payload 后再复制一次,再把独立的
|
|
791
|
+
* `Uint8Array` 交给 Host。因此本次写入只观察调用时 view 中的字节,不与调用方继续共享可变
|
|
792
|
+
* `ArrayBuffer`。`SharedArrayBuffer` backing 会被明确拒绝,不能借此建立跨 bridge 共享内存。
|
|
793
|
+
*
|
|
794
|
+
* 这是完整文件写入,不是 append、range write 或 stream:已有内容会被本次字节序列整体替换,
|
|
795
|
+
* 写入空数组会截断为零字节。若 Host 在写入中途失败,Promise 会拒绝;公开合同不承诺失败时
|
|
796
|
+
* 回滚旧内容或提供跨进程原子替换,需要事务语义时应由业务使用临时文件和自己的提交协议。
|
|
797
|
+
*
|
|
798
|
+
* 目标文件不存在时可以隐式创建,但父目录必须已经存在,`writeBytes()` 不会递归创建目录。
|
|
799
|
+
* 需要创建父目录时先调用 {@link DirectoryHandle.create | DirectoryHandle.create()},或对文件调用
|
|
800
|
+
* `create({ recursive: true })`。不必先用 `exists()` 检查文件;该检查也不能消除两次异步调用之间
|
|
801
|
+
* 的状态竞态,实际写入错误仍应处理。
|
|
802
|
+
*
|
|
803
|
+
* sandbox lazy FileHandle 固定继承 `readwrite`。`pickFiles({ mode: 'readwrite' })`、
|
|
804
|
+
* `pickDirectory({ mode: 'readwrite' })` 的派生文件和 `saveFile()` 返回的精确外部 FileHandle 也可
|
|
805
|
+
* 写入,但 direct handle 只在当前 Runtime session 有效,且授权范围不会扩张。只读 picker 结果、
|
|
806
|
+
* Android 的精确 SAF File 和 Companion attachment 返回 `FILE_ACCESS_DENIED`。该方法不需要新的
|
|
807
|
+
* 可信用户手势;只有最初取得外部授权的 picker / `saveFile()` 需要手势。
|
|
808
|
+
*
|
|
809
|
+
* 新 PC Host 支持该操作;Android / iOS `1.3.396+` 仅在 `system.describe` 同时宣告
|
|
810
|
+
* `files.openWrite`、`files.write`、`files.release` 时逐项启用,OHOS 同样以 Host 实际协商结果
|
|
811
|
+
* 为准。Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不提供浏览器
|
|
812
|
+
* File / Blob 或内存 fallback。新 PC Host 的大小限制由实际 Host 合同决定,不应套用移动端
|
|
813
|
+
* 8 MiB 上限。
|
|
814
|
+
*
|
|
815
|
+
* {@link FileHandle.readBytes | readBytes()} 返回完整文件的独立字节副本;
|
|
816
|
+
* {@link FileHandle.writeText | writeText()} 则先把字符串编码成不带 BOM 的 UTF-8,再执行相同的
|
|
817
|
+
* 完整替换语义。需要检查写入后的最终大小或时间戳时,成功后另行调用
|
|
818
|
+
* {@link FileHandle.stat | stat()}。
|
|
819
|
+
*
|
|
820
|
+
* @example
|
|
821
|
+
* ```ts
|
|
822
|
+
* import hbSDK from '@heybox/hb-sdk'
|
|
823
|
+
*
|
|
824
|
+
* const file = hbSDK.files.sandbox.file('header.bin')
|
|
825
|
+
* const backing = new Uint8Array([0xff, 0x89, 0x50, 0x4e, 0x47, 0xff])
|
|
826
|
+
* const visible = backing.subarray(1, 5)
|
|
827
|
+
*
|
|
828
|
+
* const writing = file.writeBytes(visible)
|
|
829
|
+
* visible.fill(0) // 不影响 writeBytes() 已取得的快照。
|
|
830
|
+
* await writing
|
|
831
|
+
*
|
|
832
|
+
* console.log([...await file.readBytes()]) // [137, 80, 78, 71]
|
|
833
|
+
* await file.writeBytes(new Uint8Array()) // 完整替换为空文件。
|
|
834
|
+
* ```
|
|
835
|
+
*
|
|
836
|
+
* @see {@link FileHandle.readBytes | FileHandle.readBytes()} 读取独立的原始字节副本。
|
|
837
|
+
* @see {@link FileHandle.writeText | FileHandle.writeText()} 以 UTF-8 写入完整字符串。
|
|
838
|
+
* @see {@link FileHandle.create | FileHandle.create()} 显式确保文件和可选父目录存在。
|
|
839
|
+
* @see {@link FileHandle.stat | FileHandle.stat()} 在写入后读取文件大小与时间戳。
|
|
840
|
+
* @see {@link DirectoryHandle.create | DirectoryHandle.create()} 先创建缺失父目录。
|
|
841
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 取得可选的精确外部文件写授权。
|
|
842
|
+
* @see [files.saveFile()](/reference/sdk/files/saveFile) 让用户指定新的精确可写目标。
|
|
843
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看路径、权限、平台与错误码边界。
|
|
844
|
+
*/
|
|
845
|
+
writeBytes(content: Uint8Array): Promise<void>;
|
|
846
|
+
/**
|
|
847
|
+
* 读取当前文件的元数据快照。
|
|
848
|
+
*
|
|
849
|
+
* @returns 新建的 {@link FileStat} 对象:`kind` 固定为 `'file'`,`size` 是 `0` 到
|
|
850
|
+
* `Number.MAX_SAFE_INTEGER` 的整数;Host 提供时还包含相互独立、非负有限数值的
|
|
851
|
+
* `modifiedAt` / `createdAt`。返回对象不是 `FileHandle`,也不会包含真实路径、内容或 Host 的额外字段。
|
|
852
|
+
* @throws {@link HbMiniProgramSDKError} 目标文件或任一祖先不存在时返回 `FILE_NOT_FOUND` /
|
|
853
|
+
* `DIRECTORY_NOT_FOUND`;目标实际是目录、direct handle 类型不匹配时返回 `FILE_TYPE_MISMATCH`。
|
|
854
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 已撤销、不属于当前 Runtime session 或
|
|
855
|
+
* registry 已释放时返回 `FILE_ACCESS_REVOKED`;Host 拒绝读取元数据时返回 `FILE_ACCESS_DENIED`。
|
|
856
|
+
* @throws {@link HbMiniProgramSDKError} 普通 FileHandle 未声明或未启用 `filesystem` 时返回
|
|
857
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到 `file.stat` 时返回
|
|
858
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。Companion attachment 是受控例外:
|
|
859
|
+
* 它使用已启用的 `companion` 授权读取自身元数据,不要求另行声明 `filesystem`。
|
|
860
|
+
* @throws {@link HbMiniProgramSDKError} Host 返回非对象、错误的 `kind`,负数/小数/unsafe `size`,
|
|
861
|
+
* 或负数、非有限数值的时间戳时返回 `FILE_IO_FAILED`;未知 Host 错误和无法识别的响应同样规范为
|
|
862
|
+
* `FILE_IO_FAILED`。SDK 已销毁、Runtime 已卸载或请求超时时还可能返回 `SDK_DESTROYED`、
|
|
863
|
+
* `RUNTIME_UNAVAILABLE`、`REQUEST_TIMEOUT`。
|
|
864
|
+
*
|
|
865
|
+
* @remarks
|
|
866
|
+
* 这是只读操作,`mode: 'read'` 与 `mode: 'readwrite'` 均可调用,不要求可信用户手势,也不会读取
|
|
867
|
+
* 文件内容、创建文件、更新时间戳或占用新的 direct-handle 配额。Runtime 会重新校验 ref 的类型、
|
|
868
|
+
* 当前 session/provenance 与 Mini-program identity;通过结构校验不等于可以跨 session 复用句柄。
|
|
869
|
+
*
|
|
870
|
+
* 每次调用都会发送新的 `file.stat` 请求,并返回与 Host 响应分离的新对象;SDK 不缓存、冻结或持续
|
|
871
|
+
* 更新该对象。修改返回对象不会影响文件或后续结果,文件也可能在 Promise resolve 后立即被外部进程
|
|
872
|
+
* 修改、替换或删除。因此它只描述本次 Host 查询的快照,不能与之前的 `exists()` 或之后的
|
|
873
|
+
* `readText()` / `readBytes()` 组成原子检查。
|
|
874
|
+
*
|
|
875
|
+
* `size` 的公开约定单位是 byte,`modifiedAt` / `createdAt` 的公开约定单位是 Unix epoch
|
|
876
|
+
* milliseconds;但 Runtime 只能验证数值结构,不能证明 Host 使用了正确单位、时间来自文件系统或
|
|
877
|
+
* `size` 与稍后读取的内容仍一致。时间戳可分别缺失,也不要求为整数/safe integer、落在 JavaScript
|
|
878
|
+
* `Date` 可表示范围内、`createdAt <= modifiedAt` 或不晚于当前时间;用于排序和日期展示前应按业务范围
|
|
879
|
+
* 继续校验。
|
|
880
|
+
*
|
|
881
|
+
* 与 {@link FileHandle.exists | exists()} 不同,`stat()` 不会把缺失祖先、缺失目标或 kind mismatch
|
|
882
|
+
* 归一为 `false`,而会以对应错误拒绝。与 {@link FileHandle.readText | readText()} /
|
|
883
|
+
* {@link FileHandle.readBytes | readBytes()} 不同,它只读取元数据,不传输文件 body;Android/iOS 的
|
|
884
|
+
* 8 MiB 单次完整内容读写上限不限制可报告的 `size`,但 `size` 仍不能超过
|
|
885
|
+
* `Number.MAX_SAFE_INTEGER`。
|
|
886
|
+
*
|
|
887
|
+
* 新 PC Host 支持该 operation;Android/iOS `1.3.396+` 仅在 `system.describe` 宣告
|
|
888
|
+
* `files.stat` 时逐项启用,OHOS 同样以 Host 实际协商结果为准。Web、Browser Dev Host、旧 Host
|
|
889
|
+
* 或缺少该 operation 的环境会 fail closed,不提供浏览器 File / Blob 或内存 fallback。
|
|
890
|
+
*
|
|
891
|
+
* @example
|
|
892
|
+
* ```ts
|
|
893
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
894
|
+
*
|
|
895
|
+
* const report = hbSDK.files.sandbox.file('reports/latest.json')
|
|
896
|
+
*
|
|
897
|
+
* // exists() 只用于快速分支;文件仍可能在下一次异步调用前变化。
|
|
898
|
+
* if (await report.exists()) {
|
|
899
|
+
* try {
|
|
900
|
+
* const stat = await report.stat()
|
|
901
|
+
* console.log(`${stat.size} bytes`)
|
|
902
|
+
*
|
|
903
|
+
* if (stat.modifiedAt !== undefined) {
|
|
904
|
+
* const modifiedAt = new Date(stat.modifiedAt)
|
|
905
|
+
* if (!Number.isNaN(modifiedAt.getTime())) console.log(modifiedAt.toISOString())
|
|
906
|
+
* }
|
|
907
|
+
* } catch (error) {
|
|
908
|
+
* if (!(error instanceof HbMiniProgramSDKError) || error.code !== 'FILE_NOT_FOUND') throw error
|
|
909
|
+
* }
|
|
910
|
+
* }
|
|
911
|
+
* ```
|
|
912
|
+
*
|
|
913
|
+
* @see {@link FileStat}
|
|
914
|
+
* @see {@link FileHandle.exists}
|
|
915
|
+
* @see {@link FileHandle.readText}
|
|
916
|
+
* @see {@link FileHandle.readBytes}
|
|
917
|
+
* @see [files.sandbox.file()](/reference/sdk/files/sandbox/file) 创建 sandbox lazy FileHandle。
|
|
918
|
+
* @see [files.pickFiles()](/reference/sdk/files/pickFiles) 取得当前 session 的精确外部文件授权。
|
|
919
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox | 文件能力与沙箱}
|
|
920
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/error-handling | 错误处理}
|
|
921
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
|
|
922
|
+
*
|
|
923
|
+
* @since 0.8.0-alpha.2
|
|
924
|
+
* @hbPlatform android
|
|
925
|
+
* @hbPlatform ios
|
|
926
|
+
* @hbPlatform ohos
|
|
927
|
+
* @hbPlatform windows
|
|
928
|
+
* @hbPlatform macos
|
|
929
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
930
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
931
|
+
* @hbClient ohos none
|
|
932
|
+
* @hbClient windows none
|
|
933
|
+
* @hbClient macos none
|
|
934
|
+
*/
|
|
935
|
+
stat(): Promise<FileStat>;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* 当前 SDK session 中的目录代理。
|
|
939
|
+
*
|
|
940
|
+
* @remarks
|
|
941
|
+
* 目录既能执行目录操作,也是派生子 File/Directory 逻辑代理的根。派生代理继承目录的 `mode`,
|
|
942
|
+
* 不能通过子路径提升授权范围。
|
|
943
|
+
*/
|
|
944
|
+
interface DirectoryHandle extends PathRoot {
|
|
945
|
+
/** 可用于区分文件与目录的固定标记。 */
|
|
946
|
+
readonly kind: 'directory';
|
|
947
|
+
/** 目录 basename,不包含父目录或真实路径。 */
|
|
948
|
+
readonly name: string;
|
|
949
|
+
/** 当前代理及其派生项被授予的访问模式。 */
|
|
950
|
+
readonly mode: FileMode;
|
|
951
|
+
/**
|
|
952
|
+
* 确保目录存在并返回同一个代理。
|
|
953
|
+
*
|
|
954
|
+
* @param options - 可选的父目录创建与目标独占创建设置。省略时等同于
|
|
955
|
+
* `{ recursive: false, exclusive: false }`;完整语义见 {@link CreateOptions}。
|
|
956
|
+
* @returns Host 确认目录存在后返回当前同一个 `DirectoryHandle` proxy;成功后
|
|
957
|
+
* `result === directory`。不会创建新的授权 handle,也不会刷新或改变代理的 `name`、`mode`。
|
|
958
|
+
* @throws {@link HbMiniProgramSDKError} options 非对象,或 `recursive` / `exclusive` 不是 boolean 时
|
|
959
|
+
* 返回 `INVALID_PARAMS`;代理不是 `readwrite` 时在发送 bridge 请求前返回 `FILE_ACCESS_DENIED`。
|
|
960
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
961
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到 `directory.create` 时返回
|
|
962
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
963
|
+
* @throws {@link HbMiniProgramSDKError} `recursive: false` 且任一父目录缺失时返回
|
|
964
|
+
* `DIRECTORY_NOT_FOUND`;目标实际是文件或路径中的祖先实际是文件时返回 `FILE_TYPE_MISMATCH`;
|
|
965
|
+
* `exclusive: true` 且目录已存在时返回 `DIRECTORY_ALREADY_EXISTS`。
|
|
966
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct handle 已失效、伪造或不属于当前 Runtime session
|
|
967
|
+
* 时返回 `FILE_ACCESS_REVOKED`;Host 创建失败或底层平台 I/O 失败时返回相应稳定文件错误码,
|
|
968
|
+
* 无法识别的 Host 错误统一为 `FILE_IO_FAILED`。SDK / Runtime 终止或请求超时还可能返回
|
|
969
|
+
* `SDK_DESTROYED`、`RUNTIME_DESTROYED`、`RUNTIME_UNAVAILABLE` 或 `REQUEST_TIMEOUT`。
|
|
970
|
+
*
|
|
971
|
+
* @remarks
|
|
972
|
+
* 目标缺失时创建空目录。`recursive: true` 会在当前逻辑 root 内同时创建缺失父目录;它不会允许
|
|
973
|
+
* `..`、绝对路径或越过 sandbox / 用户选择目录的授权边界。目标已是目录时,默认调用作为幂等的
|
|
974
|
+
* ensure-exists 成功,不删除、清空或重新创建其中内容;需要检测最终目标冲突时传
|
|
975
|
+
* `exclusive: true`。`exclusive` 只约束最终目录,`recursive` 创建的父目录可以已经存在。
|
|
976
|
+
* 若同一位置实际是文件,则不会把文件替换为目录。
|
|
977
|
+
*
|
|
978
|
+
* 调用要求当前代理的 `mode === 'readwrite'`。sandbox 目录固定继承 `readwrite`;从
|
|
979
|
+
* `files.pickDirectory({ mode: 'readwrite' })` 返回的外部目录派生后代时也可在该授权范围内创建,
|
|
980
|
+
* 但默认 `read` 的选择结果及其后代会在本地 mode 检查时拒绝。创建不会扩大授权到所选目录之外,
|
|
981
|
+
* 也不会让外部目录获得 `remove()` 权限;外部 direct handle 及其后代仍只在当前 Runtime session
|
|
982
|
+
* 有效。Runtime 会重新校验 direct handle 的 provenance,Host 还会绑定当前 Mini-program identity。
|
|
983
|
+
*
|
|
984
|
+
* 该方法要求 `package.json#heybox.permissions` 已声明并启用 `filesystem`,但不要求新的可信用户
|
|
985
|
+
* 手势;只有最初调用 `pickDirectory()` 取得外部授权时需要用户操作。它不占用新的外部 direct-handle
|
|
986
|
+
* 配额,也不暴露 Host 真实路径。
|
|
987
|
+
*
|
|
988
|
+
* 新 PC Host 支持该 operation;Android / iOS 需要 `1.3.396+` 并以 `system.describe` 实际宣告的
|
|
989
|
+
* operation 集为准,OHOS 同样按 Host 协商结果启用。Web、Browser Dev Host、旧 Host 或 operation
|
|
990
|
+
* 集不完整时 fail closed,不提供浏览器文件系统、OPFS 或内存 fallback。
|
|
991
|
+
*
|
|
992
|
+
* 创建目录后,可用当前代理的 {@link PathRoot.file | file()} / {@link PathRoot.directory | directory()}
|
|
993
|
+
* 同步派生后代代理,并用 {@link DirectoryHandle.list | list()} 枚举直接子项;派生与枚举结果继承
|
|
994
|
+
* 当前目录的 mode。若最终目标应是文件,使用 {@link FileHandle.create};它复用同一组
|
|
995
|
+
* `recursive` / `exclusive` 选项,但独占冲突返回 `FILE_ALREADY_EXISTS`。
|
|
996
|
+
*
|
|
997
|
+
* @example
|
|
998
|
+
* ```ts
|
|
999
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
1000
|
+
*
|
|
1001
|
+
* const reports = hbSDK.files.sandbox.directory('exports/2026')
|
|
1002
|
+
* const sameReports = await reports.create({ recursive: true })
|
|
1003
|
+
* console.assert(sameReports === reports)
|
|
1004
|
+
*
|
|
1005
|
+
* const summary = reports.file('summary.json')
|
|
1006
|
+
* await summary.create()
|
|
1007
|
+
* await summary.writeText('{"ready":true}')
|
|
1008
|
+
* console.log((await reports.list()).map(entry => entry.name))
|
|
1009
|
+
*
|
|
1010
|
+
* try {
|
|
1011
|
+
* await reports.create({ exclusive: true })
|
|
1012
|
+
* } catch (error) {
|
|
1013
|
+
* if (!(error instanceof HbMiniProgramSDKError) || error.code !== 'DIRECTORY_ALREADY_EXISTS') throw error
|
|
1014
|
+
* }
|
|
1015
|
+
* ```
|
|
1016
|
+
*
|
|
1017
|
+
* @see {@link CreateOptions}
|
|
1018
|
+
* @see {@link FileHandle.create}
|
|
1019
|
+
* @see {@link DirectoryHandle.exists}
|
|
1020
|
+
* @see {@link DirectoryHandle.list}
|
|
1021
|
+
* @see {@link FilesModule.pickDirectory | files.pickDirectory}
|
|
1022
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox | 文件能力与沙箱}
|
|
1023
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/error-handling | 错误处理}
|
|
1024
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
|
|
1025
|
+
*/
|
|
1026
|
+
create(options?: CreateOptions): Promise<DirectoryHandle>;
|
|
1027
|
+
/**
|
|
1028
|
+
* 删除当前代理指向的 sandbox 目录。
|
|
1029
|
+
*
|
|
1030
|
+
* @param options - 可选删除配置。省略 options、传 `{}` 或省略 `recursive` 都等同于
|
|
1031
|
+
* `{ recursive: false }`;此时只允许删除空目录。`recursive` 必须是 boolean,非对象 options、
|
|
1032
|
+
* 数组或其他类型会以 `INVALID_PARAMS` 拒绝。
|
|
1033
|
+
* @returns Host 报告目标目录删除完成后以 `undefined` resolve。不返回删除的子项数量、原目录
|
|
1034
|
+
* 内容或新的 handle;当前 `DirectoryHandle` 仍是同一逻辑位置的代理,可继续调用
|
|
1035
|
+
* {@link DirectoryHandle.exists | exists()} 或 {@link DirectoryHandle.create | create()}。
|
|
1036
|
+
* @throws {@link HbMiniProgramSDKError} 当前代理不是 `readwrite`,来源是 `pickDirectory()` 返回的
|
|
1037
|
+
* 外部目录,或从外部目录派生/枚举得到时,在发送 bridge 请求前以 `FILE_ACCESS_DENIED` 拒绝。
|
|
1038
|
+
* 外部目录授权即使为 `readwrite` 也不能删除其自身或任何后代。
|
|
1039
|
+
* @throws {@link HbMiniProgramSDKError} 删除 `files.sandbox.directory('.')` 表示的 sandbox 根目录时
|
|
1040
|
+
* 以 `FILE_ACCESS_DENIED` 拒绝;`recursive: true` 也不能绕过该边界。目标目录非空且
|
|
1041
|
+
* `recursive` 为默认的 `false` 时返回 `DIRECTORY_NOT_EMPTY`。
|
|
1042
|
+
* @throws {@link HbMiniProgramSDKError} 目标或任一祖先不存在时返回 `DIRECTORY_NOT_FOUND`,目标
|
|
1043
|
+
* 实际是文件或路径中的祖先类型不匹配时返回 `FILE_TYPE_MISMATCH`。删除已经不存在的目录不会
|
|
1044
|
+
* 当作幂等成功;需要“确保不存在”语义时应先接受缺失错误或在操作后调用 `exists()` 对账。
|
|
1045
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 权限时分别以
|
|
1046
|
+
* `PERMISSION_NOT_DECLARED`、`PERMISSION_DENIED` 拒绝;Host 未开放 `directory.remove` 时以
|
|
1047
|
+
* `METHOD_FORBIDDEN` 拒绝,旧 Runtime 也可能返回 `METHOD_NOT_FOUND`。
|
|
1048
|
+
* @throws {@link HbMiniProgramSDKError} SDK 已销毁、Runtime 已卸载、请求超时、Host 拒绝删除或
|
|
1049
|
+
* 发生底层 I/O 失败时,以 `SDK_DESTROYED`、`RUNTIME_UNAVAILABLE`、`REQUEST_TIMEOUT`、
|
|
1050
|
+
* `FILE_ACCESS_DENIED`、`FILE_IO_FAILED` 或 Host 保留的对应稳定文件错误码拒绝。
|
|
1051
|
+
*
|
|
1052
|
+
* @remarks
|
|
1053
|
+
* 该方法只对当前 Mini-program identity 的 sandbox 子目录开放,并要求代理的
|
|
1054
|
+
* `mode === 'readwrite'`。它不需要可信用户手势、不打开系统选择器、不暴露真实路径,也不会因为
|
|
1055
|
+
* 传入 `recursive: true` 而跨出当前逻辑目录。picker 只负责授予外部访问,不能授予删除外部目录
|
|
1056
|
+
* 树的能力;这一来源限制独立于 mode 和 Host 原生权限。
|
|
1057
|
+
*
|
|
1058
|
+
* `recursive: false` 是保护性默认值:空目录会删除,存在任意直接或间接子项时应返回
|
|
1059
|
+
* `DIRECTORY_NOT_EMPTY`,且不应由 Runtime 自动重试为递归删除。`recursive: true` 明确授权 Host
|
|
1060
|
+
* 删除该目录及其整个后代,包括文件、空目录和非空目录。Promise 只反映 Host 对本次请求的最终
|
|
1061
|
+
* 结果;公开合同不承诺多对象删除具备事务原子性或失败后自动恢复已删除子项。
|
|
1062
|
+
*
|
|
1063
|
+
* 删除成功后,当前代理对象不会失效或自动改变 `name` / `mode`。随后
|
|
1064
|
+
* {@link DirectoryHandle.exists | exists()} 应在目标仍不存在时返回 `false`,也可以调用
|
|
1065
|
+
* {@link DirectoryHandle.create | create()} 在同一 sandbox 位置重新创建。两次调用之间仍存在
|
|
1066
|
+
* 并发变化窗口,因此删除前的 `exists()` 或 `list()` 不能保证后续删除成功。
|
|
1067
|
+
*
|
|
1068
|
+
* 若只需删除单个 sandbox 文件,使用 {@link FileHandle.remove | FileHandle.remove()};它没有
|
|
1069
|
+
* `recursive` 选项。若希望保留目录并清理部分内容,应先通过 `list()` 取得直接子项,再按业务规则
|
|
1070
|
+
* 删除 sandbox 项;不要对外部授权项调用 remove。
|
|
1071
|
+
*
|
|
1072
|
+
* 新 PC Host 支持该操作;Android / iOS `1.3.396+` 仅在 `system.describe` 宣告
|
|
1073
|
+
* `files.remove` 时逐项启用,OHOS 同样以 Host 实际协商结果为准。Web、Browser Dev Host、旧 Host
|
|
1074
|
+
* 或缺少该 operation 的环境会 fail closed,不提供浏览器文件系统或内存 fallback;页面应处理
|
|
1075
|
+
* `METHOD_FORBIDDEN`,不要仅按操作系统推断可用性。
|
|
1076
|
+
*
|
|
1077
|
+
* @example
|
|
1078
|
+
* ```ts
|
|
1079
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
1080
|
+
*
|
|
1081
|
+
* const cache = hbSDK.files.sandbox.directory('cache')
|
|
1082
|
+
* await cache.create({ recursive: true })
|
|
1083
|
+
* await cache.file('index.json').writeText('{}')
|
|
1084
|
+
*
|
|
1085
|
+
* try {
|
|
1086
|
+
* await cache.remove() // 默认 recursive: false,非空目录会拒绝。
|
|
1087
|
+
* } catch (error) {
|
|
1088
|
+
* if (!(error instanceof HbMiniProgramSDKError) || error.code !== 'DIRECTORY_NOT_EMPTY') {
|
|
1089
|
+
* throw error
|
|
1090
|
+
* }
|
|
1091
|
+
* }
|
|
1092
|
+
*
|
|
1093
|
+
* await cache.remove({ recursive: true })
|
|
1094
|
+
* console.log(await cache.exists()) // false
|
|
1095
|
+
*
|
|
1096
|
+
* // 代理仍表示同一个 sandbox 位置。
|
|
1097
|
+
* await cache.create()
|
|
1098
|
+
* ```
|
|
1099
|
+
*
|
|
1100
|
+
* @see {@link DirectoryHandle.create | DirectoryHandle.create()} 显式确保目录和可选父目录存在。
|
|
1101
|
+
* @see {@link DirectoryHandle.exists | DirectoryHandle.exists()} 删除后确认当前目录是否仍存在。
|
|
1102
|
+
* @see {@link DirectoryHandle.list | DirectoryHandle.list()} 删除前枚举直接子项。
|
|
1103
|
+
* @see {@link FileHandle.remove | FileHandle.remove()} 删除单个 sandbox 文件。
|
|
1104
|
+
* @see [files.sandbox.directory()](/reference/sdk/files/sandbox/directory) 创建 sandbox 目录代理。
|
|
1105
|
+
* @see [files.pickDirectory()](/reference/sdk/files/pickDirectory) 取得不可删除的外部目录授权。
|
|
1106
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看来源、权限、平台和错误码边界。
|
|
1107
|
+
*
|
|
1108
|
+
* @since 0.8.0-alpha.2
|
|
1109
|
+
* @hbPlatform android
|
|
1110
|
+
* @hbPlatform ios
|
|
1111
|
+
* @hbPlatform ohos
|
|
1112
|
+
* @hbPlatform windows
|
|
1113
|
+
* @hbPlatform macos
|
|
1114
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
1115
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
1116
|
+
* @hbClient ohos none
|
|
1117
|
+
* @hbClient windows none
|
|
1118
|
+
* @hbClient macos none
|
|
1119
|
+
*/
|
|
1120
|
+
remove(options?: RemoveOptions): Promise<void>;
|
|
1121
|
+
/**
|
|
1122
|
+
* 检查目录是否存在。
|
|
1123
|
+
*
|
|
1124
|
+
* @returns Runtime 对当前目录引用执行一次 Host `stat` 后得到的 boolean 快照。目标目录存在且 Host
|
|
1125
|
+
* 确认为目录时返回 `true`;目标或任一祖先不存在,目标实际是文件,或 Host 以
|
|
1126
|
+
* `FILE_NOT_FOUND`、`DIRECTORY_NOT_FOUND`、`FILE_TYPE_MISMATCH` 报告同类状态时返回 `false`;Host
|
|
1127
|
+
* stat 响应不是对象或 `kind` 不是 `'directory'` 时也按类型不匹配返回 `false`。不返回目录元数据、
|
|
1128
|
+
* 句柄或缺失原因。
|
|
1129
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
1130
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到 `directory.exists`
|
|
1131
|
+
* (底层要求 `files.stat`)时返回 `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
1132
|
+
* @throws {@link HbMiniProgramSDKError} 外部 direct directory handle 被撤销、不属于当前或已结束的
|
|
1133
|
+
* Runtime session 时返回 `FILE_ACCESS_REVOKED`;Host 拒绝当前目录授权时返回 `FILE_ACCESS_DENIED`。
|
|
1134
|
+
* 这些授权错误不会被转换为 `false`。
|
|
1135
|
+
* @throws {@link HbMiniProgramSDKError} Host 返回未归类的错误、公开 bridge 返回非 boolean 结果或底层
|
|
1136
|
+
* I/O 失败时返回 `FILE_IO_FAILED` 或对应稳定文件错误码。握手失败、SDK / Runtime 已终止或不可用、
|
|
1137
|
+
* 调用超时时还可能返回 `HANDSHAKE_FAILED`、`SDK_DESTROYED`、`RUNTIME_DESTROYED`、
|
|
1138
|
+
* `RUNTIME_UNAVAILABLE`、`REQUEST_TIMEOUT`。
|
|
1139
|
+
*
|
|
1140
|
+
* @remarks
|
|
1141
|
+
* `exists()` 是只读探测,`mode: 'read'` 与 `mode: 'readwrite'` 均可调用;它不要求可信用户手势,
|
|
1142
|
+
* 不会创建目录、枚举子项、读取文件内容、延长外部授权寿命或占用新的 direct-handle 配额。sandbox
|
|
1143
|
+
* lazy ref 会在每次调用时按当前 Mini-program identity 解析;picker 返回的外部目录授权只在当前
|
|
1144
|
+
* Runtime session 有效。
|
|
1145
|
+
*
|
|
1146
|
+
* 每次调用都会发送新的 `directory.exists` 请求并重新查询 Host,不读取或更新 SDK 本地缓存。
|
|
1147
|
+
* 返回值只描述该次查询完成时的状态:目录可能在 Promise resolve 后立即被其他代码创建、删除或
|
|
1148
|
+
* 替换,因此先 `exists()` 再 `create()` / `list()` 存在 TOCTOU 竞态。必须继续处理后续操作自身的
|
|
1149
|
+
* `DIRECTORY_NOT_FOUND`、`FILE_TYPE_MISMATCH`、授权和 I/O 错误;需要确保目录存在时,直接调用
|
|
1150
|
+
* {@link DirectoryHandle.create | create()} 的幂等默认模式通常更合适。
|
|
1151
|
+
*
|
|
1152
|
+
* Runtime 内部通过 Host directory `stat` 判断 kind,但公开 `DirectoryHandle` 没有 `stat()` 方法,
|
|
1153
|
+
* `exists()` 也不会暴露 size、时间戳或其他目录元数据。{@link FileHandle.stat | FileHandle.stat()}
|
|
1154
|
+
* 只适用于文件;不要把它当作目录元数据入口。需要直接子项时调用
|
|
1155
|
+
* {@link DirectoryHandle.list | list()},它会重新访问 Host,不复用本次存在性结果。
|
|
1156
|
+
*
|
|
1157
|
+
* 新 PC Host 支持该操作;Android / iOS `1.3.396+` 仅在 `system.describe` 宣告 `files.stat` 时启用,
|
|
1158
|
+
* OHOS 同样以 Host 实际协商结果为准。Web、Browser Dev Host、旧 Host 或缺少该 operation 的环境
|
|
1159
|
+
* fail closed,返回 `METHOD_FORBIDDEN` / `METHOD_NOT_FOUND`,不会用浏览器 File / Blob 或内存目录
|
|
1160
|
+
* 伪造 `false`。该操作只读取元数据,不受移动端 8 MiB 完整文件内容读写上限影响。
|
|
1161
|
+
*
|
|
1162
|
+
* @example
|
|
1163
|
+
* ```ts
|
|
1164
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
1165
|
+
*
|
|
1166
|
+
* const cache = hbSDK.files.sandbox.directory('cache/images')
|
|
1167
|
+
*
|
|
1168
|
+
* try {
|
|
1169
|
+
* if (!(await cache.exists())) {
|
|
1170
|
+
* // 默认 create 是幂等的;recursive 同时确保父目录存在。
|
|
1171
|
+
* await cache.create({ recursive: true })
|
|
1172
|
+
* }
|
|
1173
|
+
*
|
|
1174
|
+
* // exists() 与 list() 不是原子操作,list() 的错误仍需处理。
|
|
1175
|
+
* const entries = await cache.list({ limit: 100 })
|
|
1176
|
+
* console.log(entries.map(entry => entry.name))
|
|
1177
|
+
* } catch (error) {
|
|
1178
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'DIRECTORY_NOT_FOUND') {
|
|
1179
|
+
* console.warn('目录在检查后被删除,请刷新状态后重试')
|
|
1180
|
+
* } else {
|
|
1181
|
+
* throw error
|
|
1182
|
+
* }
|
|
1183
|
+
* }
|
|
1184
|
+
* ```
|
|
1185
|
+
*
|
|
1186
|
+
* @see {@link DirectoryHandle.create | DirectoryHandle.create()} 幂等确保目录及可选父目录存在。
|
|
1187
|
+
* @see {@link DirectoryHandle.list | DirectoryHandle.list()} 重新访问 Host 并枚举直接子项。
|
|
1188
|
+
* @see {@link FileHandle.exists | FileHandle.exists()} 对文件目标执行相同的存在性归一化。
|
|
1189
|
+
* @see {@link FileHandle.stat | FileHandle.stat()} 文件专属的公开元数据快照。
|
|
1190
|
+
* @see [files.sandbox.directory()](/reference/sdk/files/sandbox/directory) 创建 sandbox lazy DirectoryHandle。
|
|
1191
|
+
* @see [files.pickDirectory()](/reference/sdk/files/pickDirectory) 取得当前 session 的外部目录授权。
|
|
1192
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看权限、平台和错误边界。
|
|
1193
|
+
*/
|
|
1194
|
+
exists(): Promise<boolean>;
|
|
1195
|
+
/**
|
|
1196
|
+
* 枚举当前目录的直接子项。
|
|
1197
|
+
*
|
|
1198
|
+
* @param options - 可选的单次结果数量上限。省略 options、传 `{}` 或省略 `limit` 时使用
|
|
1199
|
+
* `1000`;完整范围见 {@link ListOptions}。
|
|
1200
|
+
* @returns 当前目录直接子项的冻结 {@link FileHandle} / {@link DirectoryHandle} 代理数组;空目录
|
|
1201
|
+
* 返回 `[]`。数组与每个代理都是本次调用的新结果,条目 `mode` 与当前目录严格一致,`name` 只含
|
|
1202
|
+
* basename,不包含父路径或 Host 真实路径。不会递归返回后代。
|
|
1203
|
+
* @throws {@link HbMiniProgramSDKError} options 不是对象,或 `limit` 不是正的 safe integer 时返回
|
|
1204
|
+
* `INVALID_PARAMS`;`limit > 1000`,或 Host 返回项目数超过有效 `limit` 时返回
|
|
1205
|
+
* `DIRECTORY_LIST_LIMIT_EXCEEDED`。
|
|
1206
|
+
* @throws {@link HbMiniProgramSDKError} 当前目录或任一祖先不存在时返回 `DIRECTORY_NOT_FOUND`,目标
|
|
1207
|
+
* 实际是文件时返回 `FILE_TYPE_MISMATCH`;外部 direct Directory 授权失效、来自其他或已结束的
|
|
1208
|
+
* Runtime session 时返回 `FILE_ACCESS_REVOKED`。
|
|
1209
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
1210
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放或未协商到 `directory.list` 时返回
|
|
1211
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。
|
|
1212
|
+
* @throws {@link HbMiniProgramSDKError} Host 返回非数组、稀疏数组、非法 kind/name/mode/handle,或
|
|
1213
|
+
* 子项不能安全派生为当前目录的直接后代时返回 `FILE_IO_FAILED`;其他 Host 枚举或底层 I/O 失败
|
|
1214
|
+
* 返回对应稳定文件错误码,无法识别的 Host 错误统一为 `FILE_IO_FAILED`。
|
|
1215
|
+
*
|
|
1216
|
+
* @remarks
|
|
1217
|
+
* `list()` 只枚举一层,不排序、不去重,也不补齐分页。结果顺序以及达到 `limit` 时选择哪些条目
|
|
1218
|
+
* 由 Host 文件系统决定;调用方不能依赖字母序、创建时间序或跨调用稳定顺序。需要稳定展示时应按
|
|
1219
|
+
* `name` 等业务规则自行排序。公开结果没有 `total`、`hasMore` 或 continuation cursor,因此
|
|
1220
|
+
* `limit` 不应被当作可完整遍历超大目录的分页协议。
|
|
1221
|
+
*
|
|
1222
|
+
* Runtime 逐槽读取 Host 数组,拒绝稀疏或越界结果,并把每个 Host 文件/目录转换成当前目录的直接
|
|
1223
|
+
* 子逻辑引用;SDK 再验证所有 descriptor 都继承父目录 `mode`。从 `read` 目录列出的代理仍只读,
|
|
1224
|
+
* 从 `readwrite` 目录列出的代理可在原授权范围内写入,但枚举不会提升权限或扩大到父目录之外。
|
|
1225
|
+
*
|
|
1226
|
+
* 返回项不会作为新的 external direct handles 注册,因此不消耗 picker / `saveFile()` 共享的 1024
|
|
1227
|
+
* direct-handle 配额。它们仍依赖原目录的来源和生命周期:sandbox 子项按当前 Mini-program identity
|
|
1228
|
+
* 解析;外部目录的子项只在原 direct Directory 所属的当前 Runtime session 内有效,session 结束或
|
|
1229
|
+
* 授权撤销后后续操作会失败。列表只是本次枚举快照,返回后文件系统可以继续变化。
|
|
1230
|
+
*
|
|
1231
|
+
* `mode: 'read'` 与 `mode: 'readwrite'` 目录都能调用。该方法不要求可信用户手势,不创建、读取或
|
|
1232
|
+
* 修改文件内容;外部目录只有最初调用 `pickDirectory()` 时需要手势。新 PC Host 支持该操作;
|
|
1233
|
+
* Android / iOS `1.3.396+` 仅在 `system.describe` 宣告 `files.list` 时逐项启用,OHOS 同样以 Host
|
|
1234
|
+
* 实际协商结果为准。Web、Browser Dev Host、旧 Host 或 operation 缺失时 fail closed,不提供
|
|
1235
|
+
* 浏览器文件系统、File / Blob 或内存 fallback。
|
|
1236
|
+
*
|
|
1237
|
+
* 若只需判断目录本身是否存在,使用 {@link DirectoryHandle.exists | exists()}。已知子项名称时,
|
|
1238
|
+
* 可直接通过当前目录的 {@link PathRoot.file | file()} 或 {@link PathRoot.directory | directory()}
|
|
1239
|
+
* 构造 lazy proxy,无需先枚举;这两个方法同样不会执行 I/O 或占用 direct-handle 配额。
|
|
1240
|
+
*
|
|
1241
|
+
* @example
|
|
1242
|
+
* ```ts
|
|
1243
|
+
* import hbSDK from '@heybox/hb-sdk'
|
|
1244
|
+
*
|
|
1245
|
+
* const reports = hbSDK.files.sandbox.directory('reports')
|
|
1246
|
+
* await reports.create({ recursive: true })
|
|
1247
|
+
* await reports.file('summary.json').writeText('{}')
|
|
1248
|
+
* await reports.directory('archive').create()
|
|
1249
|
+
*
|
|
1250
|
+
* const entries = await reports.list({ limit: 100 })
|
|
1251
|
+
* const sorted = [...entries].sort((left, right) => left.name.localeCompare(right.name))
|
|
1252
|
+
* for (const entry of sorted) {
|
|
1253
|
+
* if (entry.kind === 'file') console.log('file', entry.name, await entry.stat())
|
|
1254
|
+
* else console.log('directory', entry.name, await entry.exists())
|
|
1255
|
+
* }
|
|
1256
|
+
* ```
|
|
1257
|
+
*
|
|
1258
|
+
* @see {@link ListOptions}
|
|
1259
|
+
* @see {@link FileSystemEntity}
|
|
1260
|
+
* @see {@link PathRoot.file | DirectoryHandle.file()} 构造已知名称的直接或嵌套文件代理。
|
|
1261
|
+
* @see {@link PathRoot.directory | DirectoryHandle.directory()} 构造已知名称的直接或嵌套目录代理。
|
|
1262
|
+
* @see {@link DirectoryHandle.exists | DirectoryHandle.exists()} 检查当前目录是否存在。
|
|
1263
|
+
* @see {@link FilesModule.pickDirectory | files.pickDirectory} 取得当前 session 的外部目录授权。
|
|
1264
|
+
* @see [文件能力与沙箱](/guide/files-and-sandbox) 查看权限、路径、平台与配额边界。
|
|
1265
|
+
*/
|
|
1266
|
+
list(options?: ListOptions): Promise<FileSystemEntity[]>;
|
|
1267
|
+
}
|
|
1268
|
+
/** 目录枚举返回的文件或目录代理。 */
|
|
1269
|
+
type FileSystemEntity = FileHandle | DirectoryHandle;
|
|
1270
|
+
/**
|
|
1271
|
+
* {@link FileHandle.stat} 返回的文件元数据快照。
|
|
1272
|
+
*
|
|
1273
|
+
* @remarks
|
|
1274
|
+
* Runtime 与 SDK 会把 Host 结果规范为这四个公开字段;Host 的额外字段不会进入结果。每次 `stat()`
|
|
1275
|
+
* 返回新对象,它不是缓存或 live view,也不冻结;调用方修改字段不会改变文件或后续快照。
|
|
1276
|
+
*
|
|
1277
|
+
* 单位是公开合同而不是可从 number 结构证明的事实:`size` 按 byte 解释,时间字段按 Unix epoch
|
|
1278
|
+
* milliseconds 解释。SDK 无法验证 Host 实际单位、时间来源、字段之间的顺序关系或快照 resolve 后是否仍
|
|
1279
|
+
* 与磁盘一致。
|
|
1280
|
+
*/
|
|
1281
|
+
interface FileStat {
|
|
1282
|
+
/** 固定为 `'file'`,用于和 Host 的目录状态区分。 */
|
|
1283
|
+
kind: 'file';
|
|
1284
|
+
/**
|
|
1285
|
+
* 本次快照中的文件大小,公开约定单位为 byte。必须是 `0` 到 `Number.MAX_SAFE_INTEGER` 的整数;
|
|
1286
|
+
* `0` 表示空文件。负数、小数、`NaN`、Infinity、unsafe integer 或数字字符串会使 `stat()` 以
|
|
1287
|
+
* `FILE_IO_FAILED` 拒绝。
|
|
1288
|
+
*/
|
|
1289
|
+
size: number;
|
|
1290
|
+
/**
|
|
1291
|
+
* Host 可提供的最后修改时间,公开约定为 Unix epoch milliseconds。可独立省略;存在时只保证为
|
|
1292
|
+
* 非负有限 number,允许小数和超过 `Number.MAX_SAFE_INTEGER` 的值,不保证可构造有效 `Date`。
|
|
1293
|
+
*/
|
|
1294
|
+
modifiedAt?: number;
|
|
1295
|
+
/**
|
|
1296
|
+
* Host 可提供的创建时间,公开约定为 Unix epoch milliseconds。可独立省略;范围规则与
|
|
1297
|
+
* {@link FileStat.modifiedAt} 相同,也不保证早于或等于 `modifiedAt`。
|
|
1298
|
+
*/
|
|
1299
|
+
createdAt?: number;
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* Mini-program 对外文件能力。
|
|
1303
|
+
*
|
|
1304
|
+
* @remarks
|
|
1305
|
+
* `sandbox` 提供隔离持久存储;picker 与 `saveFile()` 通过可信用户操作授予当前 Runtime session
|
|
1306
|
+
* 最小化的外部访问范围。所有能力要求声明 `filesystem`,具体 operation 还需由 Host 宣告支持。
|
|
1307
|
+
*/
|
|
1308
|
+
interface FilesModule {
|
|
1309
|
+
/** 当前 Mini-program 的私有 sandbox 逻辑根。 */
|
|
1310
|
+
readonly sandbox: FileSystem;
|
|
1311
|
+
/**
|
|
1312
|
+
* 让用户选择一个或多个文件并返回当前 session 的授权代理。
|
|
1313
|
+
*
|
|
1314
|
+
* @param options - 可选访问模式、扩展名筛选与多选设置;完整默认值和校验见
|
|
1315
|
+
* {@link PickFilesOptions}。
|
|
1316
|
+
* @returns 非空的冻结 {@link FileHandle} 数组。默认单选时恰好一项;每项 `kind` 固定为
|
|
1317
|
+
* `'file'`,`name` 是安全 basename,`mode` 与请求模式一致,且不包含真实路径。用户取消会
|
|
1318
|
+
* 抛错,不返回空数组或 `undefined`。
|
|
1319
|
+
* @throws {@link HbMiniProgramSDKError} options、`mode`、`accept` 或 `multiple` 非法时返回
|
|
1320
|
+
* `INVALID_PARAMS`;缺少当前可信用户手势时返回 `USER_GESTURE_REQUIRED`;用户取消系统选择器
|
|
1321
|
+
* 时返回 `FILE_PICKER_CANCELLED`。
|
|
1322
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
1323
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放/未协商到 `files.external` 时返回
|
|
1324
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`;请求的 `readwrite` 未获 Host
|
|
1325
|
+
* 授予时返回 `FILE_ACCESS_DENIED`。
|
|
1326
|
+
* @throws {@link HbMiniProgramSDKError} 整批结果会让当前 session 的外部 direct handle 超过
|
|
1327
|
+
* 1024 时返回 `FILE_QUOTA_EXCEEDED`,且不保留部分结果;授权在完成前失效、Host 返回空数组、
|
|
1328
|
+
* 单选返回多项、结果结构/name/mode 非法或其他 picker/I/O 失败时返回
|
|
1329
|
+
* `FILE_ACCESS_REVOKED` / `FILE_IO_FAILED` 等稳定文件错误码。
|
|
1330
|
+
*
|
|
1331
|
+
* @remarks
|
|
1332
|
+
* 必须直接从按钮点击等可信用户操作调用。不要先 `await` 握手或其他异步任务;应提前通过
|
|
1333
|
+
* `getHandshakeState()` / `onHandshakeStateChange()` 控制按钮只在 ready 时可用,再在点击回调
|
|
1334
|
+
* 中立即调用 picker。取消是正常用户结果,应按 `FILE_PICKER_CANCELLED` 结束当前流程。
|
|
1335
|
+
*
|
|
1336
|
+
* 默认 `mode: 'read'`、`multiple: false` 且无 `accept`。返回的是用户选择范围内的精确外部
|
|
1337
|
+
* File direct handles,不是浏览器原生 `File`,不能扩张到父目录或兄弟文件;每项授权只在
|
|
1338
|
+
* 当前 Runtime session 有效,session 结束或授权撤销后不能恢复或持久化复用。单个 session
|
|
1339
|
+
* 的 picker / `saveFile()` direct handle 共享 1024 上限,每个返回文件占用一个。
|
|
1340
|
+
*
|
|
1341
|
+
* `read` File 可调用 `readText()`、`readBytes()`、`exists()` 与 `stat()`;写入、创建及作为
|
|
1342
|
+
* 下载替换目标需要 `readwrite`。外部精确 File 无论 mode 都不能删除。Android 已适配客户端
|
|
1343
|
+
* 支持精确 SAF 文件的 `readwrite` 选择,需系统返回写入授权;较早客户端仍会拒绝该模式。
|
|
1344
|
+
* `writeText()` / `writeBytes()` 先暂存完整内容再写入,最终 Provider 写入不是原子替换,
|
|
1345
|
+
* 失败时原文件可能为空或只写入部分内容。该授权不支持 `network.download()` 的原子替换。
|
|
1346
|
+
* 未指定模式时仍为只读;用户或 Provider 未授予写入权限时返回 `FILE_ACCESS_DENIED`。
|
|
1347
|
+
*
|
|
1348
|
+
* 新 PC Host 支持文件选择;Android/iOS 需要 `1.3.396+`,移动端继续以 `system.describe`
|
|
1349
|
+
* 实际声明的 operation 为准;OHOS 同样按 Host 宣告能力启用。Web、Browser Dev Host、旧 Host
|
|
1350
|
+
* 或 operation 集不完整时 fail closed,不提供浏览器 File/Blob 或内存 fallback。页面代码不应
|
|
1351
|
+
* 按操作系统猜测可用性,应处理 `METHOD_FORBIDDEN`。
|
|
1352
|
+
*
|
|
1353
|
+
* @example
|
|
1354
|
+
* ```ts
|
|
1355
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
1356
|
+
*
|
|
1357
|
+
* const chooseFilesButton = document.querySelector<HTMLButtonElement>('#choose-files')!
|
|
1358
|
+
*
|
|
1359
|
+
* chooseFilesButton.addEventListener('click', async () => {
|
|
1360
|
+
* try {
|
|
1361
|
+
* const files = await hbSDK.files.pickFiles({
|
|
1362
|
+
* mode: 'read',
|
|
1363
|
+
* accept: ['.json', '.txt'],
|
|
1364
|
+
* multiple: true,
|
|
1365
|
+
* })
|
|
1366
|
+
*
|
|
1367
|
+
* for (const file of files) {
|
|
1368
|
+
* console.log(file.kind, file.name, file.mode, await file.readText())
|
|
1369
|
+
* }
|
|
1370
|
+
* } catch (error) {
|
|
1371
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_PICKER_CANCELLED') return
|
|
1372
|
+
* throw error
|
|
1373
|
+
* }
|
|
1374
|
+
* })
|
|
1375
|
+
* ```
|
|
1376
|
+
*
|
|
1377
|
+
* @see {@link PickFilesOptions}
|
|
1378
|
+
* @see {@link FileHandle}
|
|
1379
|
+
* @see {@link FileHandle.readText}
|
|
1380
|
+
* @see {@link FileHandle.readBytes}
|
|
1381
|
+
* @see {@link FileHandle.stat}
|
|
1382
|
+
* @see {@link FilesModule.pickDirectory | files.pickDirectory}
|
|
1383
|
+
* @see {@link FilesModule.saveFile | files.saveFile}
|
|
1384
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox | 文件能力与沙箱}
|
|
1385
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/error-handling | 错误处理}
|
|
1386
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
|
|
1387
|
+
*
|
|
1388
|
+
* @since 0.8.0-alpha.2
|
|
1389
|
+
* @hbPlatform android
|
|
1390
|
+
* @hbPlatform ios
|
|
1391
|
+
* @hbPlatform ohos
|
|
1392
|
+
* @hbPlatform windows
|
|
1393
|
+
* @hbPlatform macos
|
|
1394
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
1395
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
1396
|
+
* @hbClient ohos none
|
|
1397
|
+
* @hbClient windows none
|
|
1398
|
+
* @hbClient macos none
|
|
1399
|
+
*/
|
|
1400
|
+
pickFiles(options?: PickFilesOptions): Promise<FileHandle[]>;
|
|
1401
|
+
/**
|
|
1402
|
+
* 让用户选择目录并返回当前 session 的授权代理。
|
|
1403
|
+
*
|
|
1404
|
+
* @param options - 可选目录授权模式;省略时等同于 `{ mode: 'read' }`,完整规则见
|
|
1405
|
+
* {@link PickDirectoryOptions}。
|
|
1406
|
+
* @returns 用户选中的冻结 {@link DirectoryHandle} direct proxy。`kind` 固定为
|
|
1407
|
+
* `'directory'`,`name` 是安全 basename,`mode` 与请求模式一致;不包含真实路径。取消会抛错,
|
|
1408
|
+
* 不返回 `undefined`。
|
|
1409
|
+
* @throws {@link HbMiniProgramSDKError} options 或 `mode` 非法时返回 `INVALID_PARAMS`;缺少当前
|
|
1410
|
+
* 可信用户手势时返回 `USER_GESTURE_REQUIRED`;用户取消系统选择器时返回
|
|
1411
|
+
* `FILE_PICKER_CANCELLED`。
|
|
1412
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
1413
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放/未协商到 `files.external` 时返回
|
|
1414
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`;请求的 `readwrite` 未获 Host
|
|
1415
|
+
* 授予时返回 `FILE_ACCESS_DENIED`。
|
|
1416
|
+
* @throws {@link HbMiniProgramSDKError} 当前 session 的外部 direct handle 达到 1024 上限时返回
|
|
1417
|
+
* `FILE_QUOTA_EXCEEDED`;授权在完成前失效、Host 结果非法/mode 不匹配或其他 picker/I/O 失败时
|
|
1418
|
+
* 返回 `FILE_ACCESS_REVOKED` 或 `FILE_IO_FAILED` 等稳定文件错误码。
|
|
1419
|
+
*
|
|
1420
|
+
* @remarks
|
|
1421
|
+
* 必须直接从按钮点击等可信用户操作调用。不要先 `await` 握手或其他异步任务;应提前通过
|
|
1422
|
+
* `getHandshakeState()` / `onHandshakeStateChange()` 控制按钮只在 ready 时可用,再在点击回调
|
|
1423
|
+
* 中立即调用 picker。取消是正常用户结果,应按 `FILE_PICKER_CANCELLED` 结束当前流程。
|
|
1424
|
+
*
|
|
1425
|
+
* 默认授权模式为 `read`。返回的是用户选择范围的精确外部目录授权,只在当前 Runtime
|
|
1426
|
+
* session 有效;session 结束或授权撤销后不能恢复或持久化复用。其 `file()` / `directory()`
|
|
1427
|
+
* 派生项及 `list()` 结果继承 mode、不能提升权限,也不会继续占用 direct handle 配额。
|
|
1428
|
+
* `readwrite` 允许在授权目录内创建/写入以及作为 `network.download()` target,但外部目录及
|
|
1429
|
+
* 其后代仍不能删除。
|
|
1430
|
+
*
|
|
1431
|
+
* 单个 Runtime session 最多保留 1024 个 picker / `saveFile()` direct handles;每次成功的
|
|
1432
|
+
* `pickDirectory()` 占用一个。它与 sandbox 的逻辑代理不同:
|
|
1433
|
+
* {@link FileSystem.directory | files.sandbox.directory} 不打开选择器、无需用户手势、持久按
|
|
1434
|
+
* Mini-program 隔离,也不占用该 direct-handle 配额。
|
|
1435
|
+
*
|
|
1436
|
+
* 鸿蒙手机和平板的单目录选择需要系统 API 26.0.0 或以上;较早系统需具备
|
|
1437
|
+
* `SystemCapability.FileManagement.UserFileService.FolderSelection` 能力。
|
|
1438
|
+
* 同时要求当前客户端已适配并开放目录选择,不支持时抛出 `METHOD_FORBIDDEN`。
|
|
1439
|
+
* 不具备上述能力的 API 24 鸿蒙手机无法选择外部目录,声明 `filesystem` 或升级编译 SDK
|
|
1440
|
+
* 不会解除限制。单文件读写或导出可分别使用 `pickFiles()`、`saveFile()`,不授予父目录权限。
|
|
1441
|
+
*
|
|
1442
|
+
* 新 PC Host 支持目录选择;Android/iOS 需要 `1.3.396+`,移动端继续以 `system.describe`
|
|
1443
|
+
* 实际声明的 operation 为准;OHOS 同样按 Host 宣告能力启用。Web、Browser Dev Host、旧 Host
|
|
1444
|
+
* 或 operation 集不完整时 fail closed,不提供 Blob/内存 fallback。页面代码不应按操作系统
|
|
1445
|
+
* 猜测可用性,应处理 `METHOD_FORBIDDEN`。
|
|
1446
|
+
*
|
|
1447
|
+
* @example
|
|
1448
|
+
* ```ts
|
|
1449
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
1450
|
+
*
|
|
1451
|
+
* const chooseDirectoryButton = document.querySelector<HTMLButtonElement>('#choose-directory')!
|
|
1452
|
+
*
|
|
1453
|
+
* chooseDirectoryButton.addEventListener('click', async () => {
|
|
1454
|
+
* try {
|
|
1455
|
+
* const directory = await hbSDK.files.pickDirectory({ mode: 'readwrite' })
|
|
1456
|
+
* console.log(directory.kind, directory.name, directory.mode)
|
|
1457
|
+
* await directory.file('report.txt').writeText('done')
|
|
1458
|
+
* } catch (error) {
|
|
1459
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_PICKER_CANCELLED') return
|
|
1460
|
+
* throw error
|
|
1461
|
+
* }
|
|
1462
|
+
* })
|
|
1463
|
+
* ```
|
|
1464
|
+
*
|
|
1465
|
+
* @see {@link PickDirectoryOptions}
|
|
1466
|
+
* @see {@link DirectoryHandle}
|
|
1467
|
+
* @see {@link FileSystem.directory | files.sandbox.directory}
|
|
1468
|
+
* @see {@link FilesModule.saveFile | files.saveFile}
|
|
1469
|
+
* @see {@link MiniProgramNetworkModule.download | network.download}
|
|
1470
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox | 文件能力与沙箱}
|
|
1471
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/error-handling | 错误处理}
|
|
1472
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
|
|
1473
|
+
*
|
|
1474
|
+
* @since 0.8.0-alpha.2
|
|
1475
|
+
* @hbPlatform android
|
|
1476
|
+
* @hbPlatform ios
|
|
1477
|
+
* @hbPlatform ohos
|
|
1478
|
+
* @hbPlatform windows
|
|
1479
|
+
* @hbPlatform macos
|
|
1480
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
1481
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
1482
|
+
* @hbClient ohos none
|
|
1483
|
+
* @hbClient windows none
|
|
1484
|
+
* @hbClient macos none
|
|
1485
|
+
*/
|
|
1486
|
+
pickDirectory(options?: PickDirectoryOptions): Promise<DirectoryHandle>;
|
|
1487
|
+
/**
|
|
1488
|
+
* 让用户选择一个精确的文件保存目标。
|
|
1489
|
+
*
|
|
1490
|
+
* @param options - 必填的保存目标建议 basename;完整校验见 {@link SaveFileOptions}。
|
|
1491
|
+
* @returns 用户确认后的冻结 {@link FileHandle} direct proxy。`kind` 固定为 `'file'`,`name`
|
|
1492
|
+
* 是 Host 最终文件 basename,`mode` 固定为 `'readwrite'`;不包含真实路径,也不授予父目录或
|
|
1493
|
+
* 兄弟文件访问权。
|
|
1494
|
+
* @throws {@link HbMiniProgramSDKError} options 缺失/非对象、`suggestedName` 非字符串或不是规范
|
|
1495
|
+
* basename、或传入 V1 不支持的 `accept` 时返回 `INVALID_PARAMS`;缺少当前可信用户手势时
|
|
1496
|
+
* 返回 `USER_GESTURE_REQUIRED`;用户取消系统保存界面时返回 `FILE_PICKER_CANCELLED`。
|
|
1497
|
+
* @throws {@link HbMiniProgramSDKError} 未声明或未启用 `filesystem` 时返回
|
|
1498
|
+
* `PERMISSION_NOT_DECLARED` / `PERMISSION_DENIED`;Host 未开放/未协商到保存 operation 时返回
|
|
1499
|
+
* `METHOD_FORBIDDEN`,旧 Runtime 可返回 `METHOD_NOT_FOUND`。目标已存在且 Host 不能独占创建
|
|
1500
|
+
* 时返回 `FILE_ALREADY_EXISTS`,不会静默覆盖。
|
|
1501
|
+
* @throws {@link HbMiniProgramSDKError} 当前 session 的外部 direct handle 达到 1024 上限时返回
|
|
1502
|
+
* `FILE_QUOTA_EXCEEDED`;授权在完成前失效、Host 返回非精确 File、非 `readwrite` mode、非法
|
|
1503
|
+
* descriptor 或其他 picker/I/O 失败时返回 `FILE_ACCESS_REVOKED` / `FILE_IO_FAILED` 等稳定
|
|
1504
|
+
* 文件错误码。
|
|
1505
|
+
*
|
|
1506
|
+
* @remarks
|
|
1507
|
+
* 必须直接从按钮点击等可信用户操作调用。不要先 `await` 握手或其他异步任务;应提前通过
|
|
1508
|
+
* `getHandshakeState()` / `onHandshakeStateChange()` 控制按钮只在 ready 时可用,再在点击回调
|
|
1509
|
+
* 中立即调用。取消是正常用户结果,应按 `FILE_PICKER_CANCELLED` 结束当前流程。
|
|
1510
|
+
*
|
|
1511
|
+
* 返回的是当前 Runtime session 内一个精确外部 File 授权,不会额外保留或暴露父 Directory
|
|
1512
|
+
* handle。它占用 picker / `saveFile()` 共享的 1024 direct-handle 配额中的一个;session 结束
|
|
1513
|
+
* 或授权撤销后不能恢复或持久化复用。代理固定 `readwrite`,可调用 `writeText()` /
|
|
1514
|
+
* `writeBytes()`,或作为 {@link MiniProgramNetworkModule.download | network.download} 的 File
|
|
1515
|
+
* target;外部授权仍不能调用 `remove()`。
|
|
1516
|
+
*
|
|
1517
|
+
* V1 没有 overwrite 选项。当前新 PC Host 先让用户选择保存目录,再以 `suggestedName` 独占
|
|
1518
|
+
* 创建空文件;同名目标返回 `FILE_ALREADY_EXISTS`。其他 Host 可以展示平台原生保存界面,
|
|
1519
|
+
* 但成功结果仍只授权最终精确 File,且不能通过该 API 请求静默覆盖。
|
|
1520
|
+
*
|
|
1521
|
+
* Android 已适配客户端支持 `files.saveFile`,系统保存器返回精确 SAF 文件授权,不授予
|
|
1522
|
+
* 父目录权限。`writeText()` / `writeBytes()` 先暂存完整内容,再写入该目标;最终 Provider
|
|
1523
|
+
* 写入不是原子替换,失败时目标可能为空或部分写入,原内容不保证保留。该授权不支持
|
|
1524
|
+
* `network.download()` 的原子替换,导出请调用文件代理的写入方法。
|
|
1525
|
+
*
|
|
1526
|
+
* 新 PC、Android 与 iOS Host 支持该能力。OHOS 按 Host 实际宣告的
|
|
1527
|
+
* operation 启用。Web、Browser Dev Host、旧 Host 或 operation 集不完整时 fail closed,不
|
|
1528
|
+
* 提供 Blob/内存 fallback。页面代码不应仅按操作系统判断,应处理 `METHOD_FORBIDDEN`。
|
|
1529
|
+
*
|
|
1530
|
+
* @example
|
|
1531
|
+
* ```ts
|
|
1532
|
+
* import hbSDK, { HbMiniProgramSDKError } from '@heybox/hb-sdk'
|
|
1533
|
+
*
|
|
1534
|
+
* const saveButton = document.querySelector<HTMLButtonElement>('#save-report')!
|
|
1535
|
+
*
|
|
1536
|
+
* saveButton.addEventListener('click', async () => {
|
|
1537
|
+
* try {
|
|
1538
|
+
* const file = await hbSDK.files.saveFile({ suggestedName: 'report.json' })
|
|
1539
|
+
* await file.writeText(JSON.stringify({ ok: true }))
|
|
1540
|
+
* console.log(file.kind, file.name, file.mode)
|
|
1541
|
+
* } catch (error) {
|
|
1542
|
+
* if (error instanceof HbMiniProgramSDKError && error.code === 'FILE_PICKER_CANCELLED') return
|
|
1543
|
+
* throw error
|
|
1544
|
+
* }
|
|
1545
|
+
* })
|
|
1546
|
+
* ```
|
|
1547
|
+
*
|
|
1548
|
+
* @see {@link SaveFileOptions}
|
|
1549
|
+
* @see {@link FileHandle}
|
|
1550
|
+
* @see {@link FileHandle.writeText}
|
|
1551
|
+
* @see {@link FileHandle.writeBytes}
|
|
1552
|
+
* @see {@link FilesModule.pickFiles | files.pickFiles}
|
|
1553
|
+
* @see {@link FilesModule.pickDirectory | files.pickDirectory}
|
|
1554
|
+
* @see {@link MiniProgramNetworkModule.download | network.download}
|
|
1555
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox | 文件能力与沙箱}
|
|
1556
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/error-handling | 错误处理}
|
|
1557
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
|
|
1558
|
+
*
|
|
1559
|
+
* @since 0.8.0-alpha.2
|
|
1560
|
+
* @hbPlatform android
|
|
1561
|
+
* @hbPlatform ios
|
|
1562
|
+
* @hbPlatform ohos
|
|
1563
|
+
* @hbPlatform windows
|
|
1564
|
+
* @hbPlatform macos
|
|
1565
|
+
* @hbClient android numeric-dot \>= 1.3.396
|
|
1566
|
+
* @hbClient ios numeric-dot \>= 1.3.396
|
|
1567
|
+
* @hbClient ohos none
|
|
1568
|
+
* @hbClient windows none
|
|
1569
|
+
* @hbClient macos none
|
|
1570
|
+
*/
|
|
1571
|
+
saveFile(options: SaveFileOptions): Promise<FileHandle>;
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
/**
|
|
1575
|
+
* `network.request` 请求头。
|
|
1576
|
+
*
|
|
1577
|
+
* @remarks
|
|
1578
|
+
* 键必须是无首尾空白的合法 HTTP header name,值必须是无换行/控制字符的字符串。
|
|
1579
|
+
* `Host`、`Content-Length`、hop-by-hop/framing Header 以及平台保留的认证 Header 会以
|
|
1580
|
+
* `INVALID_PARAMS` 拒绝。响应侧不会向小程序暴露 `Set-Cookie`、认证凭据或平台保留 Header。
|
|
1581
|
+
*/
|
|
1582
|
+
type MiniProgramNetworkHeaders = Record<string, string>;
|
|
1583
|
+
/**
|
|
1584
|
+
* `network.request` 查询参数,由 Host 编码到请求 URL。
|
|
1585
|
+
*
|
|
1586
|
+
* @remarks
|
|
1587
|
+
* 必须是普通对象。为获得跨 Host 一致的查询字符串,优先使用 string/number/boolean 等标量值;
|
|
1588
|
+
* `null`、`undefined`、数组和嵌套对象的具体 URL 编码不属于公共稳定契约。
|
|
1589
|
+
*/
|
|
1590
|
+
type MiniProgramNetworkParams = Record<string, unknown>;
|
|
1591
|
+
/** `network.request` 支持的 HTTP 方法;省略时使用 `GET`。 */
|
|
1592
|
+
type MiniProgramNetworkRequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';
|
|
1593
|
+
/**
|
|
1594
|
+
* SDK 侧可配置的状态校验函数。
|
|
1595
|
+
*
|
|
1596
|
+
* @param status - 标准化后的 HTTP 状态码。
|
|
1597
|
+
* @returns 返回 `true` 时表示本次响应应视为成功。
|
|
1598
|
+
*
|
|
1599
|
+
* @remarks
|
|
1600
|
+
* 该函数只在 SDK 收到并标准化响应后执行,不会跨 bridge 传输到 Host。默认仅接受 `200`
|
|
1601
|
+
* 至 `299`;可返回 `true` 接受 3xx/4xx 等完成态响应。函数自身抛出的异常会原样向调用方传播,
|
|
1602
|
+
* 不会包装成 SDK 或 Network 错误。
|
|
1603
|
+
*/
|
|
1604
|
+
type MiniProgramNetworkValidateStatus = (status: number) => boolean;
|
|
1605
|
+
/**
|
|
1606
|
+
* 对外开放的网络请求配置。
|
|
1607
|
+
*
|
|
1608
|
+
* @remarks
|
|
1609
|
+
* 该配置面向业务层,保持 axios-like 的窄接口,不暴露宿主协议的原始字段。请求进入 bridge
|
|
1610
|
+
* 时会复制 plain object/array 数据并移除 `validateStatus`;响应中的 `config` 由 SDK 另行构造。
|
|
1611
|
+
*/
|
|
1612
|
+
interface MiniProgramNetworkRequestConfig {
|
|
1613
|
+
/**
|
|
1614
|
+
* 绝对请求地址。必须是无 username/password 的 HTTP(S) URL;生产环境只允许 HTTPS,本地
|
|
1615
|
+
* 开发仅允许 Host 明确放行的数字 loopback/LAN HTTP origin。官方域名要求
|
|
1616
|
+
* `package.json#heybox.permissions.network.useOfficialDomain` 的声明值与平台批准值都为
|
|
1617
|
+
* `true`;Runtime auth、OpenAPI 内部路径和官方账号敏感路径始终禁止访问。
|
|
1618
|
+
*/
|
|
1619
|
+
url: string;
|
|
1620
|
+
/** HTTP 方法,默认 `GET`;仅支持 {@link MiniProgramNetworkRequestMethod} 中列出的值。 */
|
|
1621
|
+
method?: MiniProgramNetworkRequestMethod;
|
|
1622
|
+
/** 查询参数;必须是普通对象,SDK 会递归复制 plain object/array 后交给 Host 编码。 */
|
|
1623
|
+
params?: MiniProgramNetworkParams;
|
|
1624
|
+
/**
|
|
1625
|
+
* 请求体。
|
|
1626
|
+
*
|
|
1627
|
+
* @remarks
|
|
1628
|
+
* 支持可序列化的 JSON-compatible 值与原始字符串,总大小不得超过 2 MiB。plain object/array
|
|
1629
|
+
* 会递归复制,因此复用同一子对象可以,但循环引用会以 `INVALID_PARAMS` 拒绝。`GET`/`HEAD`
|
|
1630
|
+
* 不应携带 body。
|
|
1631
|
+
*
|
|
1632
|
+
* 第三方 URL 的非字符串 JSON-compatible 值默认按 JSON 发送;官方域名为兼容既有 Host,
|
|
1633
|
+
* plain object/array 在未显式设置 Content-Type 时默认按 form 编码。要强制 JSON,请设置
|
|
1634
|
+
* `Content-Type: application/json`;表单请传
|
|
1635
|
+
* `new URLSearchParams(values).toString()` 并设置
|
|
1636
|
+
* `application/x-www-form-urlencoded`。
|
|
1637
|
+
*
|
|
1638
|
+
* 不支持 `FormData`、`Blob`、File/Directory 代理、`ArrayBuffer`、TypedArray、`DataView`、
|
|
1639
|
+
* `SharedArrayBuffer` 或它们的嵌套值。`multipart/form-data` 与手写 multipart body 均不可用;
|
|
1640
|
+
* 文件传输应使用专用能力。
|
|
1641
|
+
*/
|
|
1642
|
+
data?: unknown;
|
|
1643
|
+
/**
|
|
1644
|
+
* 请求头;规则见 {@link MiniProgramNetworkHeaders}。调用方显式提供的普通 `Cookie` /
|
|
1645
|
+
* `Authorization` 可作为应用 Header 交给 Host,但 SDK 不提供平台 Cookie/token,且不得在
|
|
1646
|
+
* 小程序中持有或发送平台凭据、服务端应用密钥等敏感信息。
|
|
1647
|
+
*/
|
|
1648
|
+
headers?: MiniProgramNetworkHeaders;
|
|
1649
|
+
/**
|
|
1650
|
+
* Host 请求超时,单位毫秒;必须是 `0` 至 `30000` 的有限数字。省略或 `0` 时的具体默认
|
|
1651
|
+
* 行为由 Host 决定;业务需要明确超时时应传正数。该字段不改变 SDK 等待 bridge 响应的
|
|
1652
|
+
* 独立超时;默认 SDK 实例的等待上限为 10 秒,详见 {@link MiniProgramNetworkModule.request}。
|
|
1653
|
+
*/
|
|
1654
|
+
timeout?: number;
|
|
1655
|
+
/** SDK 侧状态校验;默认只接受 2xx,函数本身不会跨 bridge,详见 {@link MiniProgramNetworkValidateStatus}。 */
|
|
1656
|
+
validateStatus?: MiniProgramNetworkValidateStatus;
|
|
1657
|
+
}
|
|
1658
|
+
/**
|
|
1659
|
+
* 流式下载的 request-scoped 进度。
|
|
1660
|
+
*
|
|
1661
|
+
* @remarks
|
|
1662
|
+
* Runtime 会过滤倒退、负数、超出可信 `Content-Length` 或 `maxBytes` 的进度,并在原子提交后、
|
|
1663
|
+
* `download()` resolve 前发送一次最终进度。最终值可能与上一次相同,空文件也会发送
|
|
1664
|
+
* `loaded: 0`;不要依赖回调次数或严格递增。
|
|
1665
|
+
*/
|
|
1666
|
+
interface DownloadProgress {
|
|
1667
|
+
/** 已接收并写入临时目标的非负字节数;原子提交完成前不表示原目标已改变。 */
|
|
1668
|
+
loaded: number;
|
|
1669
|
+
/** 可从可信响应 framing 确定总长度时的非负字节数;未知、分块或压缩响应时省略。 */
|
|
1670
|
+
total?: number;
|
|
1671
|
+
/** `total` 是否存在且可用于计算百分比;为 `false` 时应展示不定进度。 */
|
|
1672
|
+
lengthComputable: boolean;
|
|
1673
|
+
}
|
|
1674
|
+
/**
|
|
1675
|
+
* 流式下载两种 target 分支共享的地址、限制、取消与进度选项。
|
|
1676
|
+
*
|
|
1677
|
+
* @remarks
|
|
1678
|
+
* 下载固定使用 GET、拒绝重定向,不接受 `method`、`data`、`body`、Range/If-Range/A-IM
|
|
1679
|
+
* 等部分响应字段。响应字节由 Host 直接写入临时目标,不经过 iframe bridge。
|
|
1680
|
+
*/
|
|
1681
|
+
interface DownloadBaseOptions {
|
|
1682
|
+
/**
|
|
1683
|
+
* 下载地址。必须是无 username/password 的 HTTP(S) URL;生产环境只允许 HTTPS,本地开发
|
|
1684
|
+
* 仅允许 Host 明确放行的 loopback/LAN HTTP origin。当前公开 Host 的流式下载 adapter 不支持
|
|
1685
|
+
* 小黑盒官方域名,即使 `network.useOfficialDomain` 已声明并获批也不应依赖;Runtime/账号
|
|
1686
|
+
* 敏感路径始终禁止访问。
|
|
1687
|
+
*/
|
|
1688
|
+
url: string;
|
|
1689
|
+
/** 查询参数;必须是对象,SDK 会复制后交给 Host 编码到下载 URL。 */
|
|
1690
|
+
params?: MiniProgramNetworkParams;
|
|
1691
|
+
/**
|
|
1692
|
+
* 请求头;必须是合法的字符串字典。Host/framing/hop-by-hop、平台保留认证头以及
|
|
1693
|
+
* `Range`、`If-Range`、`A-IM` 会以 `INVALID_PARAMS` 拒绝。普通 `Authorization` / `Cookie`
|
|
1694
|
+
* 不会被 Runtime 一律拒绝,但移动端下载不会自动附带 Host credential;鉴权资源优先使用
|
|
1695
|
+
* 短期签名 URL。
|
|
1696
|
+
*/
|
|
1697
|
+
headers?: MiniProgramNetworkHeaders;
|
|
1698
|
+
/**
|
|
1699
|
+
* 网络与响应 body 的空闲超时,单位毫秒;必须是有限正数,不是整个下载的总时长。
|
|
1700
|
+
* 省略时 SDK 与 Runtime 不设置统一默认值,由 Host 采用自身策略;需要确定超时预算时显式传入。
|
|
1701
|
+
*/
|
|
1702
|
+
timeout?: number;
|
|
1703
|
+
/**
|
|
1704
|
+
* 单次下载可提交的最大字节数;必须是正的 safe integer。可信 `Content-Length` 已超限时
|
|
1705
|
+
* 会在写入前返回 `FILE_TOO_LARGE`,流式传输过程中超限也不会提交部分文件。
|
|
1706
|
+
* 省略时 SDK 与 Runtime 不附加该字节上限,但仍受 Host 文件与传输限制;不能视为无限容量。
|
|
1707
|
+
*/
|
|
1708
|
+
maxBytes?: number;
|
|
1709
|
+
/**
|
|
1710
|
+
* 用于取消当前下载。调用前已 aborted 会立即返回 `DOWNLOAD_CANCELLED`;提交前取消获胜时
|
|
1711
|
+
* 原目标保持不变,Host 已完成原子提交时则成功结果优先。
|
|
1712
|
+
*/
|
|
1713
|
+
signal?: AbortSignal;
|
|
1714
|
+
/**
|
|
1715
|
+
* 接收当前下载的标准化 {@link DownloadProgress}。回调本身不会序列化到 bridge;回调抛错
|
|
1716
|
+
* 不会中断下载。`lengthComputable` 为 `false` 时不要按 `total` 计算百分比。
|
|
1717
|
+
*/
|
|
1718
|
+
onProgress?: (progress: DownloadProgress) => void;
|
|
1719
|
+
}
|
|
1720
|
+
/**
|
|
1721
|
+
* 下载目标选项。
|
|
1722
|
+
*
|
|
1723
|
+
* @remarks
|
|
1724
|
+
* File target 必须是当前 SDK session 中已存在的 `readwrite` {@link FileHandle}。下载成功后
|
|
1725
|
+
* 原子替换该文件并返回传入的同一个代理,不接受 `suggestedName` 或 `overwrite`。
|
|
1726
|
+
*
|
|
1727
|
+
* Directory target 必须是当前 SDK session 中已存在的 `readwrite` {@link DirectoryHandle}。
|
|
1728
|
+
* 下载会在其中创建一个直接子文件并返回新的冻结 `readwrite` File 代理;默认独占创建,
|
|
1729
|
+
* 同名目标返回 `FILE_ALREADY_EXISTS`,仅 `overwrite: true` 允许原子创建或替换。
|
|
1730
|
+
*/
|
|
1731
|
+
type DownloadOptions = DownloadBaseOptions & ({
|
|
1732
|
+
/** 当前 SDK session 创建的 `readwrite` File 代理;目标文件必须已存在。成功后返回同一代理。 */
|
|
1733
|
+
to: FileHandle;
|
|
1734
|
+
/** File target 不接受该字段;即使显式传入字符串也返回 `INVALID_PARAMS`。 */
|
|
1735
|
+
suggestedName?: never;
|
|
1736
|
+
/** File target 固定原子替换,不接受该字段;即使显式传入 boolean 也返回 `INVALID_PARAMS`。 */
|
|
1737
|
+
overwrite?: never;
|
|
1738
|
+
} | {
|
|
1739
|
+
/** 当前 SDK session 创建的、已存在的 `readwrite` Directory 代理;成功后返回其直接子 File 代理。 */
|
|
1740
|
+
to: DirectoryHandle;
|
|
1741
|
+
/**
|
|
1742
|
+
* 建议的安全子文件 basename。服务端安全 `Content-Disposition filename*` / `filename`
|
|
1743
|
+
* 优先于该值;之后依次回退 URL basename 与 `download.bin`。不能包含路径分隔符、点段、
|
|
1744
|
+
* 控制字符、Windows 保留名或尾随点/空格,最长 255 个 Unicode 字符。
|
|
1745
|
+
*/
|
|
1746
|
+
suggestedName?: string;
|
|
1747
|
+
/** 是否允许原子创建或替换目录内的同名文件,默认 `false`;`false` 时采用独占创建。 */
|
|
1748
|
+
overwrite?: boolean;
|
|
1749
|
+
});
|
|
1750
|
+
/**
|
|
1751
|
+
* bridge / runtime 返回的标准化 HTTP 响应。
|
|
1752
|
+
*
|
|
1753
|
+
* @typeParam T - 调用方声明的响应数据类型;只影响 TypeScript,不执行运行时 schema 校验。
|
|
1754
|
+
*/
|
|
1755
|
+
interface NetworkResponsePayload<T = unknown> {
|
|
1756
|
+
/** Host 标准化后的响应数据;泛型 `T` 只提供 TypeScript 类型,不执行运行时 schema 校验。 */
|
|
1757
|
+
data: T;
|
|
1758
|
+
/** 已完成 HTTP 响应的状态码。 */
|
|
1759
|
+
status: number;
|
|
1760
|
+
/** 可用时的 HTTP 状态文本。 */
|
|
1761
|
+
statusText?: string;
|
|
1762
|
+
/**
|
|
1763
|
+
* Host 返回的安全字符串响应头;无有效响应头时为空对象。`Set-Cookie`、认证凭据以及
|
|
1764
|
+
* `x-heybox-*` / `x-xhh-*` 平台保留 Header 会在跨 bridge 前移除。
|
|
1765
|
+
*/
|
|
1766
|
+
headers: MiniProgramNetworkHeaders;
|
|
1767
|
+
}
|
|
1768
|
+
/**
|
|
1769
|
+
* SDK 对外暴露的网络响应。
|
|
1770
|
+
*
|
|
1771
|
+
* @typeParam T - 调用方期望的响应数据类型;SDK 不会在运行时校验 Host 返回值是否符合该类型。
|
|
1772
|
+
*
|
|
1773
|
+
* @remarks
|
|
1774
|
+
* `config` 不包含 Host 内部 route、body encoding、Cookie 状态或协议字段。bridge 请求在调用时
|
|
1775
|
+
* 使用独立克隆;响应完成时,SDK 再从原始公开 config 构造响应快照,递归复制其中的 plain
|
|
1776
|
+
* object/array,并保留同一个 `validateStatus` 函数引用。因此请求进行期间对原 config 的修改
|
|
1777
|
+
* 不会改变已发送 payload,但可能反映在完成时生成的 `response.config` 中。
|
|
1778
|
+
*/
|
|
1779
|
+
interface MiniProgramNetworkResponse<T = unknown> extends NetworkResponsePayload<T> {
|
|
1780
|
+
/** 响应标准化时构造的 SDK 公共配置快照;对象和数组已复制,`validateStatus` 保留原函数引用。 */
|
|
1781
|
+
config: MiniProgramNetworkRequestConfig;
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
/**
|
|
1785
|
+
* 登录时可请求的用户信息 scope。
|
|
1786
|
+
*
|
|
1787
|
+
* @remarks
|
|
1788
|
+
* - `identity`:允许开发者服务端取得当前用户在当前小程序内稳定、隔离的
|
|
1789
|
+
* `app_user_id`。它不是黑盒用户 ID,也不能跨小程序关联用户。
|
|
1790
|
+
* - `profile`:允许开发者服务端读取当前用户的昵称和头像。用户可以只同意
|
|
1791
|
+
* `identity`,因此请求 `profile` 不代表最终一定获得该 scope。
|
|
1792
|
+
* - `steam_account`:申请当前用户主绑定 Steam 账号资料。授权成功不代表已绑定 Steam;
|
|
1793
|
+
* {@link AuthorizedUserInfo.steam_id} 存在才表示取得了主绑定 SteamID64,不包含游戏库。
|
|
1794
|
+
* 旧版或未启用 Steam 账号能力的 Host 会以 `INVALID_PARAMS` 拒绝该 scope。
|
|
1795
|
+
*
|
|
1796
|
+
* `identity` 是登录流程的必选 scope:调用方可以不传它,平台仍会把它加入实际授权
|
|
1797
|
+
* 结果。scope 只描述授权码和后续 OpenAPI token 可访问的资料,不是 token、客户端权限
|
|
1798
|
+
* 或 `package.json#heybox.permissions` 中的开发者权限声明。
|
|
1799
|
+
*
|
|
1800
|
+
* @see {@link LoginOptions.scopes}
|
|
1801
|
+
* @see {@link LoginResult.scopes}
|
|
1802
|
+
* @see [用户身份与登录](https://docs.xiaoheihe.cn/hb_sdk/guide/auth)
|
|
1803
|
+
*/
|
|
1804
|
+
type LoginScope = LoginScope$1;
|
|
1805
|
+
/**
|
|
1806
|
+
* `auth.login` 的可选配置。
|
|
1807
|
+
*
|
|
1808
|
+
* @remarks
|
|
1809
|
+
* 整个参数、省略的 `scopes` 和 `scopes: undefined` 都表示只申请平台隐式包含的
|
|
1810
|
+
* `identity`。配置中不接收小程序 ID、用户 ID、手势标记、应用密钥或 token;这些值由
|
|
1811
|
+
* Host 的可信上下文提供,不能由页面覆盖。
|
|
1812
|
+
*
|
|
1813
|
+
* @see {@link LoginScope}
|
|
1814
|
+
* @see [权限声明](https://docs.xiaoheihe.cn/hb_sdk/guide/permissions)
|
|
1815
|
+
*/
|
|
1816
|
+
interface LoginOptions {
|
|
1817
|
+
/**
|
|
1818
|
+
* 要申请的可选资料 scope。
|
|
1819
|
+
*
|
|
1820
|
+
* @remarks
|
|
1821
|
+
* 通常只在需要昵称和头像时传 `['profile']`;`identity` 无需显式填写。空数组不会产生
|
|
1822
|
+
* 匿名授权,成功结果仍包含 `identity`。数组中的值必须属于 {@link LoginScope} 且不能
|
|
1823
|
+
* 重复;JavaScript 调用传入未知值、重复值、`null` 或非数组值时,Promise 以
|
|
1824
|
+
* `HbMiniProgramSDKError.code === 'INVALID_PARAMS'` 拒绝。
|
|
1825
|
+
* `steam_account` 虽属于公开类型,仍要求 Host 支持并启用 Steam 账号能力。
|
|
1826
|
+
*
|
|
1827
|
+
* @defaultValue `undefined`,即只申请隐式的 `identity`。
|
|
1828
|
+
* @see {@link LoginResult.scopes}
|
|
1829
|
+
*/
|
|
1830
|
+
scopes?: LoginScope[];
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
/**
|
|
1834
|
+
* Steam 游戏库的服务端排序维度。
|
|
1835
|
+
*
|
|
1836
|
+
* @remarks
|
|
1837
|
+
* - `weeks`:按最近两周游玩时长排序,也是默认值。
|
|
1838
|
+
* - `all`:按累计游玩时长排序。
|
|
1839
|
+
* - `achieved`:按已解锁成就数排序。
|
|
1840
|
+
*/
|
|
1841
|
+
type SteamGameListSort = 'weeks' | 'all' | 'achieved';
|
|
1842
|
+
/**
|
|
1843
|
+
* Steam 游戏库查询与 offset 分页参数。
|
|
1844
|
+
*
|
|
1845
|
+
* @remarks
|
|
1846
|
+
* Runtime 会拒绝未知字段和类型不匹配的值,不会把数字字符串或 `0` / `1` 自动转换为
|
|
1847
|
+
* `number` / `boolean`。所有默认值和规范化均在 Host 发出 Steam 请求前完成。
|
|
1848
|
+
*/
|
|
1849
|
+
interface GetSteamGameListOptions {
|
|
1850
|
+
/**
|
|
1851
|
+
* 要查询的 Steam ID;省略时使用当前小黑盒用户的默认绑定账号。
|
|
1852
|
+
* 首尾空白会被移除,trim 后为空会以 `INVALID_PARAMS` 拒绝。
|
|
1853
|
+
*/
|
|
1854
|
+
steamId?: string;
|
|
1855
|
+
/** 单页数量,默认 `20`;必须是大于等于 `1` 的整数,大于 `100` 时按 `100` 查询。 */
|
|
1856
|
+
limit?: number;
|
|
1857
|
+
/** 分页偏移量,默认 `0`;必须是大于等于 `0` 的整数,不接受数字字符串。 */
|
|
1858
|
+
offset?: number;
|
|
1859
|
+
/** 排序维度,默认 `weeks`;只接受大小写完全一致的 `weeks`、`all` 或 `achieved`。 */
|
|
1860
|
+
sort?: SteamGameListSort;
|
|
1861
|
+
/**
|
|
1862
|
+
* 游戏名称搜索词。Runtime 会先 trim,再保留前 `100` 个 UTF-16 code unit;trim 后为空时
|
|
1863
|
+
* 不向服务端发送 `q`,等价于不按关键词过滤。
|
|
1864
|
+
*/
|
|
1865
|
+
q?: string;
|
|
1866
|
+
/** 是否包含当前用户隐藏的游戏,默认 `false`;只接受 boolean,不接受 `0` / `1`。 */
|
|
1867
|
+
includeHidden?: boolean;
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
/**
|
|
1871
|
+
* 小程序可选分享渠道。
|
|
1872
|
+
*
|
|
1873
|
+
* @remarks
|
|
1874
|
+
* `wechatSession` / `wechatTimeline` / `qqFriend` / `qzone` / `weibo` 分别表示微信好友、
|
|
1875
|
+
* 微信朋友圈、QQ 好友、QQ 空间和微博。值区分大小写;Host 可以只支持其中一部分。
|
|
1876
|
+
* `share.showShareMenu()` 省略 `channel` 时由客户端展示默认分享面板;指定 `channel` 时不能
|
|
1877
|
+
* 同时配置有效的社区 `post` 预置。
|
|
1878
|
+
*/
|
|
1879
|
+
type MiniProgramShareChannel = 'wechatSession' | 'wechatTimeline' | 'qqFriend' | 'qzone' | 'weibo';
|
|
1880
|
+
/**
|
|
1881
|
+
* 分享扩展数据支持的 JSON-compatible 类型。
|
|
1882
|
+
*
|
|
1883
|
+
* @remarks
|
|
1884
|
+
* 只允许 `null`、有限数字、字符串、布尔值、数组和普通对象;`undefined`、`NaN`、
|
|
1885
|
+
* `Infinity`、`bigint`、`symbol`、函数、循环引用、`Date`、`Map` 和其他 class 实例均不受支持。
|
|
1886
|
+
* 普通对象的 key 不能是 MessagePack 解码器保留的 `__proto__`。
|
|
1887
|
+
* 合法的 `null`、`false`、`0` 与空字符串在 {@link MiniProgramShareModule.getExtra | share.getExtra}
|
|
1888
|
+
* 中会原样返回,不能用真假值判断是否存在分享数据。
|
|
1889
|
+
*
|
|
1890
|
+
* 编码后的 MessagePack 最多 8 层嵌套,单个数组或对象最多 64 项,总容量不超过 128 字节;
|
|
1891
|
+
* 超限时分享 API 返回 `INVALID_PARAMS`,接收端 `getExtra()` 则对非法启动参数返回 `undefined`。
|
|
1892
|
+
* 不要把 token、cookie、个人信息或其他敏感数据放入分享 URL。
|
|
1893
|
+
*/
|
|
1894
|
+
type MiniProgramShareExtraValue = null | boolean | number | string | readonly MiniProgramShareExtraValue[] | {
|
|
1895
|
+
readonly [key: string]: MiniProgramShareExtraValue;
|
|
1896
|
+
};
|
|
1897
|
+
/**
|
|
1898
|
+
* 客户端“转发到社区”发帖页的可编辑预置。
|
|
1899
|
+
*
|
|
1900
|
+
* @remarks
|
|
1901
|
+
* 预置只填充客户端发帖页,用户仍可修改或取消,不会由 SDK 直接发布。`showShareMenu` 最多
|
|
1902
|
+
* 保留一个分区,`screenshot` 可保留多个分区;两者都会按首次出现顺序去重。
|
|
1903
|
+
*
|
|
1904
|
+
* 开发 Runtime 对任一无效项返回 `INVALID_PARAMS`,生产 Runtime 则过滤无效项;过滤后没有
|
|
1905
|
+
* 任何有效分区或话题时省略整个 `post`,但继续原分享流程。
|
|
1906
|
+
*
|
|
1907
|
+
* @see [社区分享预置](/recipes/community-share)
|
|
1908
|
+
*/
|
|
1909
|
+
interface MiniProgramSharePostOptions {
|
|
1910
|
+
/**
|
|
1911
|
+
* 默认发布分区 ID。number 必须是正安全整数并转换为字符串;string 会 trim 且必须非空。
|
|
1912
|
+
* 规范化后按首次出现顺序去重,普通分享最多保留第一项,截图分享可保留多项。
|
|
1913
|
+
*/
|
|
1914
|
+
topicIds?: (string | number)[];
|
|
1915
|
+
/**
|
|
1916
|
+
* 预置话题正文。每项必须是 string,trim 后非空且不能以 `#` 开头或结尾;规范化后按首次
|
|
1917
|
+
* 出现顺序去重。传正文即可,不要自行包裹 `#`。
|
|
1918
|
+
*/
|
|
1919
|
+
topics?: string[];
|
|
1920
|
+
}
|
|
1921
|
+
/**
|
|
1922
|
+
* 展示基础分享面板的配置。
|
|
1923
|
+
*
|
|
1924
|
+
* @remarks
|
|
1925
|
+
* 分享落地页固定为当前小程序的通用分享页。该配置只暴露基础分享字段,不暴露宿主内部
|
|
1926
|
+
* 上报、回调、自定义按钮、直接发布等协议参数。`url` 即使值为 `undefined` 也不允许出现;
|
|
1927
|
+
* 其他未知字段不会传给 Host。
|
|
1928
|
+
*/
|
|
1929
|
+
interface MiniProgramShowShareMenuOptions {
|
|
1930
|
+
/** 分享标题;必须是 trim 后非空的字符串,前后空白不会被 SDK 改写。 */
|
|
1931
|
+
title: string;
|
|
1932
|
+
/** 分享描述;必须是 trim 后非空的字符串,前后空白不会被 SDK 改写。 */
|
|
1933
|
+
desc: string;
|
|
1934
|
+
/**
|
|
1935
|
+
* 写入固定落地页 URL、供接收方 {@link MiniProgramShareModule.getExtra | share.getExtra}
|
|
1936
|
+
* 读取的业务状态;遵守 {@link MiniProgramShareExtraValue} 的类型、深度、项数和 128 字节限制。
|
|
1937
|
+
* 省略时不携带 `extra`,也不会继承当前启动链接中的值。
|
|
1938
|
+
*/
|
|
1939
|
+
extra?: MiniProgramShareExtraValue;
|
|
1940
|
+
/**
|
|
1941
|
+
* 分享缩略图的绝对 URL;必须是非空字符串、可由 `URL` 解析,且协议严格为 `http:` 或
|
|
1942
|
+
* `https:`。SDK 只校验 URL,不负责下载、裁剪或确认 Host 最终采用该图片。
|
|
1943
|
+
*/
|
|
1944
|
+
imageUrl?: string;
|
|
1945
|
+
/**
|
|
1946
|
+
* 指定站外分享渠道;省略时由客户端展示默认面板。不能与有效 `post` 同时使用,且具体
|
|
1947
|
+
* 渠道是否可用由 Host 决定。
|
|
1948
|
+
*/
|
|
1949
|
+
channel?: MiniProgramShareChannel;
|
|
1950
|
+
/**
|
|
1951
|
+
* 转发到社区时使用的分区与话题预置;`null` 或省略表示不预置。
|
|
1952
|
+
*
|
|
1953
|
+
* @remarks
|
|
1954
|
+
* 普通分享最多保留一个规范化后的 `topicIds`,但可保留多个去重后的 `topics`。开发态对
|
|
1955
|
+
* 无效项、空预置、多个分区或与 `channel` 的冲突返回 `INVALID_PARAMS`;生产态会过滤无效项、
|
|
1956
|
+
* 截断到首个分区,并在冲突时保留 `channel`、省略 `post`,不会阻断基础分享面板。
|
|
1957
|
+
* 用户进入发帖页后仍可修改或取消,SDK 不会直接发布帖子。
|
|
1958
|
+
*/
|
|
1959
|
+
post?: MiniProgramSharePostOptions | null;
|
|
1960
|
+
}
|
|
1961
|
+
/**
|
|
1962
|
+
* 截图区域。
|
|
1963
|
+
*
|
|
1964
|
+
* @remarks
|
|
1965
|
+
* 坐标与尺寸均使用当前小程序可见窗口的逻辑像素,原点是窗口左上角,与
|
|
1966
|
+
* {@link MiniProgramViewportModule.getWindowInfo | viewport.getWindowInfo} 返回的
|
|
1967
|
+
* `windowWidth`、`windowHeight` 使用同一坐标系。TypeScript 调用方应传有限 number;当前
|
|
1968
|
+
* Runtime 会先用 `Number(...)` 转换 JavaScript 值再校验范围,因此字符串、boolean、`null`
|
|
1969
|
+
* 等可能被兼容转换,业务不应依赖该宽松行为。Runtime 不会取整,也不会把矩形夹取到窗口边界;调用方应确保
|
|
1970
|
+
* `left + width <= windowWidth`、`top + height <= windowHeight`。
|
|
1971
|
+
*
|
|
1972
|
+
* 省略整个 `rect` 时,Runtime 会在调用时读取当前窗口并构造
|
|
1973
|
+
* `{ left: 0, top: 0, width: windowWidth, height: windowHeight }`。窗口可能在用户拖动、
|
|
1974
|
+
* 旋转设备或 Host 恢复后变化,不要长期缓存旧矩形。
|
|
1975
|
+
*
|
|
1976
|
+
* @see {@link MiniProgramScreenshotOptions.rect}
|
|
1977
|
+
* @see {@link MiniProgramViewportModule.getWindowInfo | viewport.getWindowInfo}
|
|
1978
|
+
*/
|
|
1979
|
+
interface MiniProgramScreenshotRect {
|
|
1980
|
+
/** 截图区域左边缘距窗口左边缘的逻辑像素数;转换后必须有限且大于等于 `0`。 */
|
|
1981
|
+
left: number;
|
|
1982
|
+
/** 截图区域上边缘距窗口上边缘的逻辑像素数;必须是有限且大于等于 `0` 的数。 */
|
|
1983
|
+
top: number;
|
|
1984
|
+
/** 截图区域宽度,单位逻辑像素;必须是有限且大于 `0` 的数。 */
|
|
1985
|
+
width: number;
|
|
1986
|
+
/** 截图区域高度,单位逻辑像素;必须是有限且大于 `0` 的数。 */
|
|
1987
|
+
height: number;
|
|
1988
|
+
}
|
|
1989
|
+
/**
|
|
1990
|
+
* 截图分享配置。
|
|
1991
|
+
*
|
|
1992
|
+
* @remarks
|
|
1993
|
+
* 该配置只暴露截图与保存相册相关基础字段,不暴露宿主内部上传、回调或样式扩展能力。
|
|
1994
|
+
* 所有字段均可省略;省略整个配置等同于传入空配置,并在调用时截取当前可见窗口。
|
|
1995
|
+
* JavaScript 调用在运行时传入 `null` 也会按空配置处理,但 TypeScript 调用方应直接省略参数。
|
|
1996
|
+
*
|
|
1997
|
+
* @see {@link MiniProgramShareModule.screenshot | share.screenshot}
|
|
1998
|
+
*/
|
|
1999
|
+
interface MiniProgramScreenshotOptions {
|
|
2000
|
+
/**
|
|
2001
|
+
* 指定截图区域;省略时截取调用时的整个可见窗口。
|
|
2002
|
+
*
|
|
2003
|
+
* @remarks
|
|
2004
|
+
* 字段单位、有效范围和窗口边界要求见 {@link MiniProgramScreenshotRect}。Runtime 不会
|
|
2005
|
+
* 自动按设备像素比换算,也不会裁正越界矩形。
|
|
2006
|
+
*/
|
|
2007
|
+
rect?: MiniProgramScreenshotRect;
|
|
2008
|
+
/**
|
|
2009
|
+
* Host 开始截图前的延迟,单位毫秒;TypeScript 调用应传 number,Runtime 用 `Number(...)`
|
|
2010
|
+
* 转换后要求有限且大于等于 `0`。
|
|
2011
|
+
*
|
|
2012
|
+
* @remarks
|
|
2013
|
+
* Runtime 不要求整数,也不设置上限。省略时不会下发 `delay`,由当前 Host 使用默认值;
|
|
2014
|
+
* Host 仍可按平台能力拒绝过大的值。
|
|
2015
|
+
*/
|
|
2016
|
+
delay?: number;
|
|
2017
|
+
/**
|
|
2018
|
+
* 是否在客户端截图分享流程中提供保存到系统相册的能力。
|
|
2019
|
+
*
|
|
2020
|
+
* @remarks
|
|
2021
|
+
* `true` 明确请求提供,`false` 明确关闭。省略时不会下发该开关,由当前 Host 决定
|
|
2022
|
+
* 默认行为;该字段本身不表示图片已经保存成功。
|
|
2023
|
+
*/
|
|
2024
|
+
saveToAlbum?: boolean;
|
|
2025
|
+
/**
|
|
2026
|
+
* 转发到社区时使用的分区与话题预置;`null` 或省略表示不预置。
|
|
2027
|
+
*
|
|
2028
|
+
* @remarks
|
|
2029
|
+
* 截图分享支持多个分区。`topicIds` 中的正安全整数会转成字符串,字符串会 trim,
|
|
2030
|
+
* 再按首次出现顺序去重;`topics` 会 trim、拒绝首尾 `#`,再按首次出现顺序去重。
|
|
2031
|
+
* 预置必须至少保留一个有效的 `topicIds` 或 `topics` 项。
|
|
2032
|
+
*
|
|
2033
|
+
* 开发 Runtime 遇到任一无效项会以 `INVALID_PARAMS` 拒绝,生产 Runtime 则过滤无效项,
|
|
2034
|
+
* 将剩余有效项交给客户端;没有有效项时省略整个 `post`,但继续截图。预置只填充
|
|
2035
|
+
* 客户端发帖页,用户仍可修改或取消,不会直接发布内容。
|
|
2036
|
+
* 当前小程序来源由 Runtime 使用 Host 确认的 canonical identity 自动关联,调用方不能
|
|
2037
|
+
* 也无需传入小程序 ID 或其他来源字段。
|
|
2038
|
+
*
|
|
2039
|
+
* @see {@link MiniProgramSharePostOptions}
|
|
2040
|
+
* @see {@link https://docs.xiaoheihe.cn/hb_sdk/recipes/community-share | 社区分享预置}
|
|
2041
|
+
*/
|
|
2042
|
+
post?: MiniProgramSharePostOptions | null;
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
/**
|
|
2046
|
+
* 导航栏关闭按钮与状态栏图标/文字的前景样式。
|
|
2047
|
+
*
|
|
2048
|
+
* @remarks
|
|
2049
|
+
* `light` 请求 Host 使用白色或浅色前景,适合深色背景;`dark` 请求 Host 使用黑色
|
|
2050
|
+
* 或深色前景,适合浅色背景。该类型没有 `auto`、`system` 或恢复默认值;需要跟随
|
|
2051
|
+
* 页面主题时,应在主题变化后重新调用
|
|
2052
|
+
* {@link MiniProgramViewportModule.setNavigationBarStyle}。
|
|
2053
|
+
*
|
|
2054
|
+
* 取值表达的是对比度语义,不是固定色号。具体颜色、透明度以及状态栏和关闭按钮的
|
|
2055
|
+
* 渲染方式由当前 Host 与操作系统决定。
|
|
2056
|
+
*
|
|
2057
|
+
* @see {@link MiniProgramSetNavigationBarStyleOptions.foregroundStyle}
|
|
2058
|
+
*/
|
|
2059
|
+
type MiniProgramNavigationBarForegroundStyle = 'light' | 'dark';
|
|
2060
|
+
/**
|
|
2061
|
+
* 设置导航栏样式的配置。
|
|
2062
|
+
*
|
|
2063
|
+
* @remarks
|
|
2064
|
+
* `options` 必须是对象,且 `foregroundStyle` 是必填字段。Runtime 只接受精确的
|
|
2065
|
+
* `light` 或 `dark` 字符串;缺少字段、传入 `null`、数组或其他值都会以
|
|
2066
|
+
* `INVALID_PARAMS` 拒绝。
|
|
2067
|
+
*
|
|
2068
|
+
* 当前仅开放关闭按钮与状态栏图标/文字的前景明暗样式,不设置导航栏背景色。
|
|
2069
|
+
*
|
|
2070
|
+
* @see {@link MiniProgramNavigationBarForegroundStyle}
|
|
2071
|
+
*/
|
|
2072
|
+
interface MiniProgramSetNavigationBarStyleOptions {
|
|
2073
|
+
/**
|
|
2074
|
+
* 导航栏关闭按钮与状态栏图标/文字的前景样式。
|
|
2075
|
+
*
|
|
2076
|
+
* @remarks
|
|
2077
|
+
* 该字段必填且仅接受 `light` 或 `dark`。`light` 适合深色背景,`dark` 适合浅色
|
|
2078
|
+
* 背景;它不读取网页背景,也不会自动跟随 `prefers-color-scheme`。
|
|
2079
|
+
*/
|
|
2080
|
+
foregroundStyle: MiniProgramNavigationBarForegroundStyle;
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
export type { CreateOptions, DirectoryHandle, DownloadBaseOptions, DownloadOptions, DownloadProgress, FileHandle, FileMode, FileStat, FileSystem, FileSystemEntity, FilesModule, GetSteamGameListOptions, ListOptions, LoginOptions, MiniProgramEventHandler, MiniProgramNetworkRequestConfig, MiniProgramNetworkResponse, MiniProgramNetworkValidateStatus, MiniProgramScreenshotOptions, MiniProgramSetNavigationBarStyleOptions, MiniProgramShowShareMenuOptions, PathRoot, PickDirectoryOptions, PickFilesOptions, RemoveOptions, SaveFileOptions };
|