{"version":3,"file":"main.cjs","sources":["../src/macros/env.ts","../src/std/internal/constants.ts","../src/std/internal/helpers.ts","../src/std/internal/validations.ts","../src/std/utils/resultify.ts","../src/std/fs/mina_fs_shared.ts","../src/std/fs/mina_fs_async.ts","../src/std/fs/web_fs_helpers.ts","../src/std/fs/fs_async.ts","../src/std/fs/mina_fs_sync.ts","../src/std/fs/fs_sync.ts","../src/std/audio/web_audio.ts","../src/std/clipboard/mina_clipboard.ts","../src/std/clipboard/web_clipboard.ts","../src/std/clipboard/mod.ts","../src/std/codec/mina_utf8.ts","../src/std/codec/mod.ts","../src/std/crypto/hmac/hmac.ts","../src/std/codec/helpers.ts","../src/std/crypto/hmac/web_hmac.ts","../src/std/crypto/hmac/mod.ts","../src/std/crypto/md/md5.ts","../src/std/crypto/md/mod.ts","../src/std/crypto/random/mina_random.ts","../src/std/crypto/random/web_random.ts","../src/std/crypto/random/mod.ts","../src/std/crypto/rsa/mina_rsa.ts","../src/std/crypto/rsa/web_rsa.ts","../src/std/crypto/rsa/mod.ts","../src/std/crypto/sha/sha.ts","../src/std/crypto/sha/web_sha.ts","../src/std/crypto/sha/mod.ts","../src/std/event/mina_event.ts","../src/std/event/web_event.ts","../src/std/event/mod.ts","../src/std/fetch/mina_fetch.ts","../src/std/fetch/mod.ts","../src/std/image/mina_image.ts","../src/std/image/web_image.ts","../src/std/image/mod.ts","../src/std/lbs/mina_lbs.ts","../src/std/lbs/web_lbs.ts","../src/std/lbs/mod.ts","../src/std/network/mina_network.ts","../src/std/network/web_network.ts","../src/std/network/mod.ts","../src/std/platform/base.ts","../src/std/platform/user_agent.ts","../src/std/platform/device.ts","../src/std/platform/target.ts","../src/std/performance/mod.ts","../src/std/socket/socket_define.ts","../src/std/socket/mina_socket.ts","../src/std/socket/web_socket.ts","../src/std/socket/mod.ts","../src/std/storage/mina_storage.ts","../src/std/storage/web_storage.ts","../src/std/storage/mod.ts","../src/std/video/web_video.ts","../src/std/video/mod.ts"],"sourcesContent":["/**\n * @internal\n * 小游戏环境宏模块。\n */\n\n/**\n * 小游戏环境宏。\n *\n * 可通过打包工具在build时修改，如esbuild、webpack等。\n */\ndeclare const __MINIGAME_STD_MINA__ = false;\n\n/**\n * 判断当前环境是否为小游戏环境。\n * @returns 如果在小游戏环境中返回 true，否则返回 false。\n */\nexport function isMinaEnv(): boolean {\n    return __MINIGAME_STD_MINA__;\n}\n","/**\n * @internal\n * 内部常量。\n */\n\nimport { RESULT_VOID, type AsyncVoidResult } from 'happy-rusty';\n\n/**\n * 异步返回 void 的成功结果常量。\n */\nexport const ASYNC_RESULT_VOID: AsyncVoidResult<never> = Promise.resolve(RESULT_VOID);","/**\n * @internal\n * 内部辅助函数。\n */\n\nimport type { FetchTask } from '@happy-ts/fetch-t';\nimport { type IOResult } from 'happy-rusty';\n\n/**\n * 将小游戏失败回调的结果转换为 `Error` 类型。\n *\n * 如果是异步 API 的 `fail` 回调返回的结果通常是 `WechatMinigame.GeneralCallbackResult` 或者变体类型，\n * 如果是同步 API throw 的异常通常是一个类似 `Error` 的类型。\n * @param error - 小游戏错误对象。\n * @returns 转换后的 `Error` 对象。\n */\nexport function miniGameFailureToError(error: WechatMinigame.GeneralCallbackResult | Error): Error {\n    return error instanceof Error\n        ? error\n        // NOTE: 有可能 error 是一个长得像 Error 但不是 Error 实例的对象, 例如: \"statSync:fail no such file or directory\"\n        : new Error(error.errMsg ?? (error as unknown as { message: string; }).message);\n}\n\n/**\n * 将 BufferSource 转换为 Uint8Array。\n * @param data - 需要转换的 BufferSource。\n * @returns Uint8Array。\n */\nexport function bufferSourceToBytes(data: BufferSource): Uint8Array<ArrayBuffer> {\n    if (data instanceof Uint8Array) {\n        return data as Uint8Array<ArrayBuffer>;\n    }\n\n    if (data instanceof ArrayBuffer) {\n        return new Uint8Array(data);\n    }\n\n    if (ArrayBuffer.isView(data)) {\n        return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n    }\n\n    throw new TypeError('Input argument must be an ArrayBuffer or ArrayBufferView');\n}\n\n/**\n * 将 BufferSource 转换为 ArrayBuffer。\n * @param data - 需要转换的 BufferSource。\n * @returns ArrayBuffer。\n */\nexport function bufferSourceToAb(data: BufferSource): ArrayBuffer {\n    if (data instanceof ArrayBuffer) {\n        return data;\n    }\n\n    if (ArrayBuffer.isView(data)) {\n        // 可能存在偏移\n        return data.byteOffset === 0\n            ? data.buffer\n            : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);\n    }\n\n    throw new TypeError('Input argument must be an ArrayBuffer or ArrayBufferView');\n}\n\n/**\n * 创建一个已失败的 FetchTask 对象。\n * @param errResult - 错误结果。\n * @returns 返回一个已完成的失败 FetchTask。\n */\nexport function createFailedFetchTask<T>(errResult: IOResult<unknown>): FetchTask<T> {\n    return {\n        abort(): void { /* noop */ },\n        get aborted(): boolean { return false; },\n        get result() { return Promise.resolve(errResult.asErr<T>()); },\n    };\n}","/**\n * @internal\n * 断言相关辅助函数。\n */\n\nimport { Err, RESULT_VOID, type VoidIOResult } from 'happy-rusty';\n\n/**\n * 验证传入的值是否为正整数。\n * @param input - 需要验证的值。\n * @param name - 参数名称，用于错误信息。\n * @returns 验证结果，如果不是数字则返回包含 TypeError 的 Err，如果不是正整数则返回包含 Error 的 Err。\n */\nexport function validatePositiveInteger(input: number, name: string): VoidIOResult {\n    if (typeof input !== 'number') {\n        return Err(new TypeError(`Param '${name}' must be a number but received ${typeof input}`));\n    }\n    if (input <= 0 || !Number.isInteger(input)) {\n        return Err(new Error(`Param '${name}' must be a positive integer but received ${input}`));\n    }\n    return RESULT_VOID;\n}\n\n/**\n * 验证传入的值是否为字符串。\n * @param str - 需要验证的值。\n * @param name - 参数名称，用于错误信息。\n * @returns 验证结果，如果不是字符串则返回包含 TypeError 的 Err。\n */\nexport function validateString(str: string, name: string): VoidIOResult {\n    if (typeof str !== 'string') {\n        return Err(new TypeError(`Param '${name}' must be a string but received ${typeof str}`));\n    }\n    return RESULT_VOID;\n}\n\n/**\n * 验证传入的 URL 是否为 `https` 协议。\n * @param url - 需要验证的 URL 字符串。\n * @returns 验证结果，如果不是 https 协议则返回 Err。\n */\nexport function validateSafeUrl(url: string): VoidIOResult {\n    return validateString(url, 'url')\n        .andThen(() => {\n            if (!url.startsWith('https://')) {\n                return Err(new Error(`Param url must start with https:// but received ${url}`));\n            }\n            return RESULT_VOID;\n        });\n}\n\n/**\n * 验证传入的 WebSocket URL 是否为 `wss` 协议。\n * @param socketUrl - 需要验证的 WebSocket URL 字符串。\n * @returns 验证结果，如果不是 wss 协议则返回 Err。\n */\nexport function validateSafeSocketUrl(socketUrl: string): VoidIOResult {\n    return validateString(socketUrl, 'socketUrl')\n        .andThen(() => {\n            if (!socketUrl.startsWith('wss://')) {\n                return Err(new Error(`Param socketUrl must start with wss:// but received ${socketUrl}`));\n            }\n            return RESULT_VOID;\n        });\n}","import { Err, Ok, tryAsyncResult, type AsyncIOResult, type AsyncResult, type IOResult, type Result } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { miniGameFailureToError } from '../internal/helpers.js';\n\n/**\n * 将小游戏异步 API 转换为返回 `AsyncResult<T, E>` 的新函数，需要转换的 API 必须是接受可选 `success` 和 `fail` 回调的函数，并且其返回值必须是 `void` 或 `PromiseLike`。\n *\n * 其中 `T` 为 `success` 回调的参数类型，`E` 为 `fail` 回调的参数类型。\n *\n * @param api - 小游戏异步 API。\n * @returns 返回一个新的函数，该函数返回 `AsyncResult<T, E>`。\n * @since 2.0.0\n * @example\n * ```ts\n * // 将 wx.setStorage 转换为 AsyncResult 风格\n * const setStorageAsync = asyncResultify(wx.setStorage);\n * const result = await setStorageAsync({ key: 'test', data: 'value' });\n * if (result.isOk()) {\n *     console.log('存储成功');\n * } else {\n *     console.error('存储失败:', result.unwrapErr());\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 函数泛型约束需要 any 以兼容所有函数签名\nexport function asyncResultify<F extends (...args: any[]) => unknown, T = ResultifySuccessType<F>, E = ResultifyFailType<F>>(api: F): ResultifyValidAPI<F> extends true\n    ? (...args: Parameters<F>) => AsyncResult<T, E>\n    : never {\n    return ((...args: Parameters<F>): AsyncResult<T, E> => {\n        const future = new Future<Result<T, E>>();\n\n        const options = args[0] ?? {};\n        const { success, fail } = options;\n\n        // 强制使用callback的方式调用，即使支持Promise\n        options.success = (res: T) => {\n            // success 回调依旧执行\n            success?.(res);\n            future.resolve(Ok(res));\n        };\n        options.fail = (err: E) => {\n            // fail 回调依旧执行\n            fail?.(err);\n            future.resolve(Err(err));\n        };\n\n        const ret = api(options);\n\n        // 也支持其他返回 PromiseLike 的 API（鸭子类型检查）\n        if (ret != null && typeof ret === 'object' && typeof (ret as PromiseLike<T>).then === 'function') {\n            // Convert PromiseLike to AsyncResult\n            return tryAsyncResult(ret as PromiseLike<T>);\n        } else if (ret !== undefined) {\n            // 实测发现某些小游戏平台的 API 可能会返回非 void 非 PromiseLike 的值，虽然官方文档通常只描述了 void 或 PromiseLike 的返回类型。\n            // 为了兼容这些实际情况，我们暂时不抛出错误，而是允许这种情况存在。\n            // throw new TypeError('API must return void or PromiseLike. Otherwise the return value will be discarded');\n        }\n\n        return future.promise;\n    }) as ResultifyValidAPI<F> extends true ? (...args: Parameters<F>) => AsyncResult<T, E> : never;\n}\n\n/**\n * `asyncResultify` 的变体，将小游戏异步 API 转换为返回 `AsyncIOResult<T>` 的新函数。\n *\n * 与 `asyncResultify` 不同的是，此函数会将 `fail` 回调的 `WechatMinigame.GeneralCallbackResult` 转换为 `Error` 类型。\n *\n * @param api - 小游戏异步 API。\n * @returns 返回一个新的函数，该函数返回 `AsyncIOResult<T>`。\n * @since 2.0.0\n * @example\n * ```ts\n * // 将 wx.setStorage 转换为 AsyncIOResult 风格\n * const setStorageAsync = asyncIOResultify(wx.setStorage);\n * const result = await setStorageAsync({ key: 'test', data: 'value' });\n * if (result.isOk()) {\n *     console.log('存储成功');\n * } else {\n *     console.error('存储失败:', result.unwrapErr().message);\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 函数泛型约束需要 any 以兼容所有函数签名\nexport function asyncIOResultify<F extends (...args: any[]) => unknown, T = ResultifySuccessType<F>>(api: F): IOResultifyValidAPI<F> extends true\n    ? (...args: Parameters<F>) => AsyncIOResult<T>\n    : never {\n    const wrapped = asyncResultify<F, T, WechatMinigame.GeneralCallbackResult>(api);\n\n    return (async (...args: Parameters<F>): AsyncIOResult<T> => {\n        const result = await wrapped(...args);\n        return result.mapErr(miniGameFailureToError);\n    }) as IOResultifyValidAPI<F> extends true ? (...args: Parameters<F>) => AsyncIOResult<T> : never;\n}\n\n/**\n * 将小游戏同步 API 转换为返回 `IOResult<T>` 的新函数。\n *\n * 功能类似于 `tryGeneralSyncOp`，但以函数包装的方式使用，将可能抛出的异常捕获并转换为 `IOResult`。\n *\n * @param api - 小游戏同步 API。\n * @returns 返回一个新的函数，该函数返回 `IOResult<T>`。\n * @since 2.0.0\n * @example\n * ```ts\n * // 将 wx.getStorageSync 转换为 IOResult 风格\n * const getStorageSync = syncIOResultify(wx.getStorageSync);\n * const result = getStorageSync('test');\n * if (result.isOk()) {\n *     console.log('获取成功:', result.unwrap());\n * } else {\n *     console.error('获取失败:', result.unwrapErr().message);\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 函数泛型约束需要 any 以兼容所有函数签名\nexport function syncIOResultify<F extends (...args: any[]) => unknown>(api: F): (...args: Parameters<F>) => IOResult<ReturnType<F>> {\n    return (...args: Parameters<F>): IOResult<ReturnType<F>> => {\n        try {\n            return Ok(api(...args) as ReturnType<F>);\n        } catch (e) {\n            return Err(miniGameFailureToError(e as WechatMinigame.GeneralCallbackResult));\n        }\n    };\n}\n\n// #region Internal Types\n\n/**\n * 通用回调函数类型。\n */\ntype AnyCallback = (...args: never[]) => unknown;\n\n/**\n * 类型工具：判断 API 是否符合 resultify 条件。\n *\n * 要求 API 返回 `void` 或 `PromiseLike`，且参数包含 `success` 或 `fail` 回调。\n * @typeParam T - 待检查的 API 函数类型。\n */\ntype ResultifyValidAPI<T> = T extends (params: infer P) => infer R\n    ? R extends void | PromiseLike<unknown>\n    ? P extends { success?: AnyCallback; } | undefined\n    ? true\n    : P extends { fail?: AnyCallback; } | undefined\n    ? true\n    : false\n    : false\n    : false;\n\n/**\n * 类型工具：判断 API 是否符合 asyncIOResultify 条件。\n *\n * 在 `ResultifyValidAPI` 基础上，额外要求 `fail` 回调参数类型必须精确为 `GeneralCallbackResult`。\n * @typeParam T - 待检查的 API 函数类型。\n */\ntype IOResultifyValidAPI<T> = ResultifyValidAPI<T> extends true\n    ? ResultifyFailType<T> extends WechatMinigame.GeneralCallbackResult\n    ? WechatMinigame.GeneralCallbackResult extends ResultifyFailType<T>\n    ? true\n    : false\n    : false\n    : false;\n\n/**\n * 类型工具：提取成功回调参数类型。\n *\n * 从 API 函数的 `success` 回调中提取返回类型。\n * @typeParam T - API 函数类型。\n */\ntype ResultifySuccessType<T> = T extends (params: infer P) => unknown\n    ? P extends { success?: (res: infer S) => unknown; }\n    ? S\n    : never\n    : never;\n\n/**\n * 类型工具：提取失败回调参数类型。\n *\n * 从 API 函数的 `fail` 回调中提取错误类型。\n * @typeParam T - API 函数类型。\n */\ntype ResultifyFailType<T> = T extends (params: infer P) => unknown\n    ? P extends { fail?: (err: infer E) => unknown; }\n    ? E\n    : never\n    : never;\n\n// #endregion\n","/**\n * @internal\n * 同步/异步的公共代码。\n */\n\nimport { normalize } from '@std/path/posix';\nimport { NOT_FOUND_ERROR, NOTHING_TO_ZIP_ERROR, ROOT_DIR, type ExistsOptions } from 'happy-opfs';\nimport { Err, Lazy, Ok, RESULT_FALSE, RESULT_VOID, tryResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { bufferSourceToAb, miniGameFailureToError } from '../internal/mod.ts';\nimport type { ReadOptions, WriteFileContent } from './fs_define.ts';\n\n// #region Internal Variables\n\n/**\n * 小游戏文件系统管理器实例。\n *\n */\nconst fs = Lazy(() => wx.getFileSystemManager());\n\n/**\n * 用户数据根目录，`wxfile://usr` 或 `http://usr`。\n *\n */\nconst usrPath = Lazy(() => wx.env.USER_DATA_PATH);\n\n/**\n * 根路径，`wxfile://` 或 `http://`。\n *\n */\nconst rootPath = Lazy(() => {\n    const path = usrPath.force();\n    // 剥离 `usr`\n    return `${path.split('://')[0]}://`;\n});\n\n// #endregion\n\n/**\n * zip 操作的结果。\n */\nexport type ZipIOResult = IOResult<Uint8Array<ArrayBuffer> | void>;\n\nexport const EMPTY_BYTES: Uint8Array<ArrayBuffer> = new Uint8Array(0);\n\n/**\n * 获取小游戏文件系统管理器实例。\n * @returns 文件系统管理器实例。\n */\nexport function getFs(): WechatMinigame.FileSystemManager {\n    return fs.force();\n}\n\n/**\n * 获取文件系统的根路径。\n * @returns 文件系统的根路径。\n */\nexport function getUsrPath(): string {\n    return usrPath.force();\n}\n\n/**\n * 验证并标准化路径，返回绝对路径。\n *\n * 支持两种输入格式：\n * 1. 完整路径：以 `wxfile://` 或 `http://` 开头（如 `wxfile://usr/test`）\n * 2. 相对路径：以 `/` 开头（如 `/test`），会自动拼接 `wx.env.USER_DATA_PATH`\n *\n * @param path - 待验证的路径。\n * @returns 验证成功返回标准化后的绝对路径，失败返回错误信息。\n */\nexport function validateAbsolutePath(path: string): IOResult<string> {\n    const typeError = validatePathType(path);\n    if (typeError) return typeError;\n\n    // 是否已经是完整路径\n    let isFullPath = false;\n    // 检查是否为完整路径（以 `wxfile://` 或 `http://` 开头）\n    if (path.startsWith(rootPath.force())) {\n        isFullPath = true;\n        // 先剥离协议前缀，避免 normalize 将 `://` 转换为 `:/`\n        path = path.slice(rootPath.force().length);\n        // 传根路径没意义\n        if (!path) {\n            return Err(new Error('Path must not be root directory'));\n        }\n    }\n\n    // 标准化路径（处理 `.`、`..` 等）并去除末尾的 `/`\n    const normalized = normalize(path);\n    path = normalized.length > 1 && normalized[normalized.length - 1] === ROOT_DIR\n        ? normalized.slice(0, -1)\n        : normalized;\n\n    // 完整路径：重新拼接协议前缀\n    if (isFullPath) {\n        // 还是根路径\n        if (path === ROOT_DIR) {\n            return Err(new Error('Path must not be root directory'));\n        }\n        // 确保路径不是以 `/` 开头，避免 `wxfile:///usr` 这样的多斜杠情况\n        if (path[0] === ROOT_DIR) {\n            path = path.slice(1);\n        }\n        return Ok(rootPath.force() + path);\n    }\n\n    // 相对路径：必须以 `/` 开头\n    if (path[0] !== ROOT_DIR) {\n        return Err(new Error(`Path must be absolute (start with '/'): '${path}'`));\n    }\n\n    // 拼接用户数据根目录\n    return Ok(usrPath.force() + path);\n}\n\n/**\n * 验证可读路径（用于只读操作：readFile、stat、readDir）。\n *\n * 支持三种输入格式：\n * 1. 完整路径：以 `wxfile://` 或 `http://` 开头（如 `wxfile://usr/test`）\n * 2. 用户数据相对路径：以 `/` 开头（如 `/test`），会自动拼接 `wx.env.USER_DATA_PATH`\n * 3. 代码包路径：不以 `./`、`../` 开头的相对路径（如 `images/logo.png`），直接返回原路径\n *\n * @param path - 待验证的路径。\n * @returns 验证成功返回标准化后的路径，失败返回错误信息。\n */\nexport function validateReadablePath(path: string): IOResult<string> {\n    const typeError = validatePathType(path);\n    if (typeError) return typeError;\n\n    // 对于完整路径和以 / 开头的路径，使用现有的绝对路径验证\n    if (path.startsWith(rootPath.force()) || path.startsWith(ROOT_DIR)) {\n        return validateAbsolutePath(path);\n    }\n\n    // 既不是完整路径，也不以 / 开头，检查是否为代码包路径（不以 ./、../ 开头）\n    if (path.startsWith('./') || path.startsWith('../')) {\n        return Err(new Error(`Invalid path: '${path}'. Code package paths must not start with './' or '../'`));\n    }\n\n    // 代码包路径返回标准化后的结果\n    const normalized = normalize(path);\n    return Ok(normalized);\n}\n\n/**\n * 验证提供的 ExistsOptions 是否有效。\n * `isDirectory` 和 `isFile` 不能同时为 `true`。\n *\n * @param options - 要验证的 ExistsOptions。\n * @returns 表示成功或错误的 VoidIOResult。\n */\nexport function validateExistsOptions(options?: ExistsOptions): VoidIOResult {\n    const { isDirectory = false, isFile = false } = options ?? {};\n\n    return isDirectory && isFile\n        ? Err(new Error('isDirectory and isFile cannot both be true'))\n        : RESULT_VOID;\n}\n\n/**\n * 判断错误是否为 `NotFoundError`。\n * @param error - 要检查的错误。\n * @returns 如果是 `NotFoundError` 返回 `true`，否则返回 `false`。\n */\nexport function isNotFoundError(error: Error): boolean {\n    return error.name === NOT_FOUND_ERROR;\n}\n\n/**\n * 将错误对象转换为 IOResult 类型。\n * @typeParam T - Result 的 Ok 类型。\n * @param error - IO 操作的错误对象, 可以是同步(Error)或者异步(WechatMinigame.FileError)的。\n * @returns 转换后的 IOResult 对象。\n */\nexport function fileErrorToResult<T>(error: FileError): IOResult<T> {\n    const err = miniGameFailureToError(error);\n\n    if (isNotFoundFileError(err)) {\n        err.name = NOT_FOUND_ERROR;\n    }\n\n    return Err(err);\n}\n\n/**\n * 处理 `mkdir` 的错误。\n */\nexport function fileErrorToMkdirResult(error: FileError): VoidIOResult {\n    // 已存在当做成功\n    return isAlreadyExistsFileError(error) ? RESULT_VOID : fileErrorToResult(error);\n}\n\n/**\n * 处理 `remove` 的错误。\n */\nexport function fileErrorToRemoveResult(error: FileError): VoidIOResult {\n    // 目标 path 本就不存在，当做成功\n    return isNotFoundFileError(error) ? RESULT_VOID : fileErrorToResult(error);\n}\n\n/*\n * 创建 `NothingToZipError` 错误。\n */\nexport function createNothingToZipError(): IOResult<never> {\n    const error = new Error('Nothing to zip');\n    error.name = NOTHING_TO_ZIP_ERROR;\n\n    return Err(error);\n}\n\n/*\n * 创建\"文件不存在且 create 为 false\"的错误。\n * @param filePath - 文件路径。\n * @returns 错误结果。\n */\nexport function createFileNotExistsError(filePath: string): IOResult<never> {\n    return Err(new Error(`Cannot append to non-existent file: ${filePath}`));\n}\n\n/*\n * 创建\"目录已存在但是文件\"的错误。\n * @param dirPath - 目录路径。\n * @returns 错误结果。\n */\nexport function createDirIsFileError(dirPath: string): IOResult<never> {\n    return Err(new Error(`Path already exists but is a file: ${dirPath}`));\n}\n\n/**\n * 获取读取文件的编码。\n * @returns 返回 `'utf8'` 或 `undefined`（读取二进制时不传 encoding）。\n */\nexport function getReadFileEncoding(options?: ReadOptions): 'utf8' | undefined {\n    // NOTE: 想要读取 ArrayBuffer 就不能传 encoding\n    // 如果传了 'bytes' 或不传，返回 undefined\n    return options?.encoding === 'utf8' ? 'utf8' : undefined;\n}\n\n/**\n * 获取写入文件的参数。\n */\nexport function getWriteFileContents(contents: WriteFileContent): IOResult<GetWriteFileContents> {\n    const isBin = typeof contents !== 'string';\n\n    let data: string | ArrayBuffer;\n\n    if (isBin) {\n        const result = tryResult(() => bufferSourceToAb(contents));\n        if (result.isErr()) return result.asErr();\n\n        data = result.unwrap();\n    } else {\n        data = contents;\n    }\n\n    const encoding = isBin ? undefined : 'utf8';\n\n    return Ok({\n        data,\n        encoding,\n    });\n}\n\n/**\n * 获取 `exists` 的结果。\n */\nexport function getExistsResult(statResult: IOResult<WechatMinigame.Stats>, options?: ExistsOptions): IOResult<boolean> {\n    return statResult.map(stats => {\n        const { isDirectory = false, isFile = false } = options ?? {};\n\n        const notExist =\n            (isDirectory && stats.isFile())\n            || (isFile && stats.isDirectory());\n\n        return !notExist;\n    }).orElse(err => {\n        return isNotFoundError(err) ? RESULT_FALSE : statResult.asErr();\n    });\n}\n\n/**\n * 根据 `recursive` 不同标准化 `stat` 的结果(recursive=true 的时候开发者工具对于文件和空文件夹会返回单个 Stats)。\n * - `recursive=false`: 返回单个 `Stats` 或 `FileStats[]`\n * - `recursive=true`: 始终返回 `FileStats[]`，即使是单个文件或空目录\n *   - 如果是单个 `Stats`，包装成数组，path 设为 '' 表示当前项目\n */\nexport function normalizeStats(statsOrFileStats: WechatMinigame.Stats | WechatMinigame.FileStats[], recursive: boolean): WechatMinigame.Stats | WechatMinigame.FileStats[] {\n    if (Array.isArray(statsOrFileStats)) {\n        return statsOrFileStats.map(({ path, stats }) => ({\n            path: path.replace(/^\\/+/, ''), // 返回相对路径, 去掉开头的 `/`(安卓子项目 path 不以 `/` 开头)\n            stats,\n        })).sort((a, b) => a.path.localeCompare(b.path)); // 按 path 排序\n    }\n\n    // 只要是 recursive 就返回数组(即使是文件或者空目录))\n    return recursive\n        ? [{\n            path: '', // 当前文件夹本身的相对路径\n            stats: statsOrFileStats,\n        }]\n        : statsOrFileStats;\n}\n\n// #region Internal Types\n\ntype FileError = WechatMinigame.FileError | (Error & {\n    errno?: number;\n});\n\ninterface GetWriteFileContents {\n    data: string | ArrayBuffer;\n    encoding?: 'utf8';\n}\n\n// #endregion\n\n// #region Internal Functions\n\n/**\n * 标准化同步或异步的文件错误对象。\n * @param error - IO 操作的错误对象, 可以是同步(Error)或者异步(WechatMinigame.FileError)的。\n */\nfunction normalizeFileError(error: FileError): WechatMinigame.FileError {\n    return error instanceof Error\n        ? {\n            errCode: error.errno ?? 0,\n            errMsg: error.message,\n        }\n        : error;\n}\n\n/**\n * 判断是否文件或者文件夹不存在。\n * @param error - IO 操作的错误对象, 可以是同步(Error)或者异步(WechatMinigame.FileError)的。\n */\nfunction isNotFoundFileError(error: FileError): boolean {\n    // 1300002\tno such file or directory ${path}\n    const { errCode, errMsg } = normalizeFileError(error);\n    // 可能没有errCode\n    return errCode === 1300002\n        || errMsg.includes('no such file or directory');\n}\n\n/**\n * 判断是否文件或者文件夹已存在。\n * @param error - IO 操作的错误对象, 可以是同步(Error)或者异步(WechatMinigame.FileError)的。\n */\nfunction isAlreadyExistsFileError(error: FileError): boolean {\n    // 1301005\tfile already exists ${dirPath}\t已有同名文件或目录\n    const { errCode, errMsg } = normalizeFileError(error);\n    // 可能没有errCode\n    return errCode === 1301005\n        || errMsg.includes('already exists');\n}\n\n/**\n * 验证 path 是否为字符串类型。\n * @param path - 待验证的路径。\n * @returns 如果不是字符串返回错误，否则返回 undefined。\n */\nfunction validatePathType(path: unknown): IOResult<never> | undefined {\n    if (typeof path !== 'string') {\n        return Err(new TypeError(`Path must be a string but received ${typeof path}`));\n    }\n}\n\n// #endregion\n","/**\n * @internal\n * 小游戏平台的异步文件系统操作实现。\n */\n\nimport { ABORT_ERROR, FetchError, type FetchResult } from '@happy-ts/fetch-t';\nimport { basename, dirname, SEPARATOR } from '@std/path/posix';\nimport { zipSync as compressSync, type AsyncZippable } from 'fflate/browser';\nimport { type AppendOptions, type ExistsOptions, type WriteOptions, type ZipOptions } from 'happy-opfs';\nimport { Err, Ok, RESULT_VOID, tryResult, type AsyncIOResult, type AsyncVoidIOResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport type { FetchTask } from '../fetch/fetch_defines.ts';\nimport { createFailedFetchTask, miniGameFailureToError, validateSafeUrl } from '../internal/mod.ts';\nimport { asyncResultify } from '../utils/mod.ts';\nimport type { DownloadFileOptions, ReadFileContent, ReadOptions, StatOptions, UploadFileOptions, WriteFileContent } from './fs_define.ts';\nimport { createDirIsFileError, createFileNotExistsError, createNothingToZipError, EMPTY_BYTES, fileErrorToMkdirResult, fileErrorToRemoveResult, fileErrorToResult, getExistsResult, getFs, getReadFileEncoding, getUsrPath, getWriteFileContents, isNotFoundError, normalizeStats, validateAbsolutePath, validateExistsOptions, validateReadablePath, type ZipIOResult } from './mina_fs_shared.ts';\n\n/**\n * 递归创建文件夹，相当于`mkdir -p`。\n * @param dirPath - 需要创建的目录路径。\n * @returns 创建操作的异步结果。\n */\nexport async function mkdir(dirPath: string): AsyncVoidIOResult {\n    // 为了检查根路径, 提前 validateAbsolutePath\n    const dirPathRes = validateAbsolutePath(dirPath);\n    if (dirPathRes.isErr()) return dirPathRes.asErr();\n    dirPath = dirPathRes.unwrap();\n\n    // 根目录无需创建\n    if (dirPath === getUsrPath()) {\n        return RESULT_VOID;\n    }\n\n    const statRes = await stat(dirPath);\n    if (statRes.isOk()) {\n        // 已存在并且是文件\n        if (statRes.unwrap().isFile()) {\n            return createDirIsFileError(dirPath);\n        }\n\n        // 存在文件夹则不创建\n        return RESULT_VOID;\n    }\n\n    // 递归创建\n    const mkdirRes = await asyncResultify(getFs().mkdir)({\n        dirPath,\n        recursive: true,\n    });\n\n    return mkdirRes\n        .and(RESULT_VOID)\n        .orElse(fileErrorToMkdirResult);\n}\n\n/**\n * 移动或重命名文件或目录。\n * @param srcPath - 原路径。\n * @param destPath - 新路径。\n * @returns 移动操作的异步结果。\n */\nexport async function move(srcPath: string, destPath: string): AsyncVoidIOResult {\n    const srcPathRes = validateAbsolutePath(srcPath);\n    if (srcPathRes.isErr()) return srcPathRes.asErr();\n    srcPath = srcPathRes.unwrap();\n\n    const destPathRes = validateAbsolutePath(destPath);\n    if (destPathRes.isErr()) return destPathRes.asErr();\n    destPath = destPathRes.unwrap();\n\n    const moveRes = await asyncResultify(getFs().rename)({\n        oldPath: srcPath,\n        newPath: destPath,\n    });\n\n    return moveRes\n        .and(RESULT_VOID)\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 读取目录下的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 包含目录内容的字符串数组的异步结果。\n */\nexport async function readDir(dirPath: string): AsyncIOResult<string[]> {\n    const dirPathRes = validateReadablePath(dirPath);\n    if (dirPathRes.isErr()) return dirPathRes.asErr();\n    dirPath = dirPathRes.unwrap();\n\n    const readDirRes = await asyncResultify(getFs().readdir)({\n        dirPath,\n    });\n\n    return readDirRes\n        .map(x => x.files)\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 以 UTF-8 格式读取文件。\n * @param filePath - 文件路径。\n * @param options - 读取选项，指定编码为 'utf8'。\n * @returns 包含文件内容的字符串的异步结果。\n */\nexport function readFile(filePath: string, options: ReadOptions & {\n    encoding: 'utf8';\n}): AsyncIOResult<string>;\n\n/**\n * 以二进制格式读取文件。\n * @param filePath - 文件路径。\n * @param options - 读取选项，指定编码为 'bytes'。\n * @returns 包含文件内容的 Uint8Array<ArrayBuffer> 的异步结果。\n */\nexport function readFile(filePath: string, options?: ReadOptions & {\n    encoding: 'bytes';\n}): AsyncIOResult<Uint8Array<ArrayBuffer>>;\n\n/**\n * 读取文件内容。\n * @param filePath - 文件路径。\n * @param options - 读取选项。\n * @returns 包含文件内容的异步结果。\n */\nexport function readFile(filePath: string, options?: ReadOptions): AsyncIOResult<ReadFileContent>;\n\n/**\n * 读取文件内容，可选地指定编码和返回类型。\n * @template T - 返回内容的类型。\n * @param filePath - 文件路径。\n * @param options - 可选的读取选项。\n * @returns 包含文件内容的异步结果。\n */\nexport async function readFile(filePath: string, options?: ReadOptions): AsyncIOResult<ReadFileContent> {\n    const filePathRes = validateReadablePath(filePath);\n    if (filePathRes.isErr()) return filePathRes.asErr();\n    filePath = filePathRes.unwrap();\n\n    const encoding = getReadFileEncoding(options);\n    const readFileRes = await asyncResultify(getFs().readFile)({\n        filePath,\n        encoding,\n    });\n\n    return readFileRes\n        .map(x => {\n            const { data } = x;\n            // 小游戏返回的是 ArrayBuffer，需要转换为 Uint8Array\n            return typeof data === 'string' ? data : new Uint8Array(data);\n        })\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 删除指定路径的文件或目录。\n * @param path - 需要删除的文件或目录的路径。\n * @returns 删除操作的异步结果。\n */\nexport async function remove(path: string): AsyncVoidIOResult {\n    const statRes = await stat(path);\n    if (statRes.isErr()) {\n        // 不存在当做成功\n        return isNotFoundError(statRes.unwrapErr()) ? RESULT_VOID : statRes.asErr();\n    }\n\n    // stat 已经校验通过了\n    path = validateAbsolutePath(path).unwrap();\n\n    // 文件夹还是文件\n    const removeRes = await (statRes.unwrap().isDirectory()\n        ? asyncResultify(getFs().rmdir)({\n            dirPath: path,\n            recursive: true,\n        })\n        : asyncResultify(getFs().unlink)({\n            filePath: path,\n        }));\n\n    return removeRes\n        .and(RESULT_VOID)\n        .orElse(fileErrorToRemoveResult);\n}\n\n/**\n * 获取文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @param options - 可选选项。\n * @returns 包含状态信息的异步结果。\n */\nexport function stat(path: string, options?: StatOptions & {\n    recursive: false;\n}): AsyncIOResult<WechatMinigame.Stats>;\nexport function stat(path: string, options: StatOptions & {\n    recursive: true;\n}): AsyncIOResult<WechatMinigame.FileStats[]>;\nexport function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]>;\nexport async function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    const pathRes = validateReadablePath(path);\n    if (pathRes.isErr()) return pathRes.asErr();\n    path = pathRes.unwrap();\n\n    const { recursive = false } = options ?? {};\n    const statRes = await asyncResultify(getFs().stat)({\n        path,\n        recursive,\n    });\n\n    return statRes\n        .map(x => normalizeStats(x.stats, recursive))\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 将内容写入文件。\n * @param filePath - 文件路径。\n * @param contents - 要写入的内容。\n * @param options - 可选的写入选项。\n * @returns 写入操作的异步结果。\n */\nexport async function writeFile(filePath: string, contents: WriteFileContent, options?: WriteOptions): AsyncVoidIOResult {\n    // 默认创建\n    const { append = false, create = true } = options ?? {};\n\n    const fs = getFs();\n    let writeMethod: typeof fs.appendFile | typeof fs.writeFile = fs.writeFile;\n\n    if (append) {\n        // append 先判断文件是否存在\n        const existsRes = await exists(filePath);\n        if (existsRes.isErr()) return existsRes.asErr();\n\n        if (existsRes.unwrap()) {\n            // 文件存在才使用 appendFile\n            writeMethod = fs.appendFile;\n        } else {\n            // 文件不存在，根据 create 参数决定\n            if (!create) {\n                return createFileNotExistsError(filePath);\n            }\n            // create=true 时使用 writeFile 创建文件\n            writeMethod = fs.writeFile;\n        }\n    }\n\n    // 减少可能的重复校验\n    const filePathRes = validateAbsolutePath(filePath);\n    if (filePathRes.isErr()) return filePathRes.asErr();\n    filePath = filePathRes.unwrap();\n\n    // 使用 writeFile 时（文件不存在或非 append 模式）需要创建目录\n    if (create && writeMethod === fs.writeFile) {\n        const mkdirRes = await mkdir(dirname(filePath));\n        if (mkdirRes.isErr()) return mkdirRes;\n    }\n\n    const contentsRes = getWriteFileContents(contents);\n    if (contentsRes.isErr()) return contentsRes.asErr();\n    const { data, encoding } = contentsRes.unwrap();\n\n    const writeRes = await asyncResultify(writeMethod)({\n        filePath,\n        data,\n        encoding,\n    });\n\n    return writeRes\n        .and(RESULT_VOID)\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 向文件追加内容。\n * @param filePath - 文件路径。\n * @param contents - 要追加的内容。\n * @param options - 可选的追加选项。\n * @returns 追加操作的异步结果。\n */\nexport function appendFile(filePath: string, contents: WriteFileContent, options?: AppendOptions): AsyncVoidIOResult {\n    return writeFile(filePath, contents, {\n        append: true,\n        create: options?.create ?? true,\n    });\n}\n\n/**\n * 复制文件或文件夹。\n *\n * @param srcPath - 源文件或文件夹路径。\n * @param destPath - 目标文件或文件夹路径。\n * @returns 操作的异步结果。\n */\nexport async function copy(srcPath: string, destPath: string): AsyncVoidIOResult {\n    const destPathRes = validateAbsolutePath(destPath);\n    if (destPathRes.isErr()) return destPathRes.asErr();\n    destPath = destPathRes.unwrap();\n\n    const statRes = await stat(srcPath, {\n        recursive: true,\n    });\n    if (statRes.isErr()) return statRes.asErr();\n\n    // stat 已经校验通过了\n    srcPath = validateAbsolutePath(srcPath).unwrap();\n\n    for (const { path, stats } of statRes.unwrap()) {\n        let copyRes: VoidIOResult;\n\n        if (!path) {\n            // 根目录或者文件\n            if (stats.isDirectory()) {\n                copyRes = await mkdir(destPath);\n            } else {\n                const mkdirRes = await mkdir(dirname(destPath));\n                copyRes = await mkdirRes.andThenAsync(() => {\n                    return copyFile(srcPath, destPath);\n                });\n            }\n        } else {\n            // 不能用join\n            const srcEntryPath = srcPath + SEPARATOR + path;\n            const destEntryPath = destPath + SEPARATOR + path;\n\n            copyRes = await (stats.isDirectory()\n                ? mkdir(destEntryPath)\n                // 由于串行执行, 文件的父目录一定先于文件创建, 所以不需要额外 mkdir\n                : copyFile(srcEntryPath, destEntryPath));\n        }\n\n        if (copyRes.isErr()) return copyRes;\n    }\n\n    return RESULT_VOID;\n}\n\n/**\n * 检查指定路径的文件或目录是否存在。\n * @param path - 文件或目录的路径。\n * @param options - 可选的检查选项。\n * @returns 检查存在性的异步结果，存在时返回 true。\n */\nexport async function exists(path: string, options?: ExistsOptions): AsyncIOResult<boolean> {\n    const optionsRes = validateExistsOptions(options);\n    if (optionsRes.isErr()) return optionsRes.asErr();\n\n    const statRes = await stat(path);\n    return getExistsResult(statRes, options);\n}\n\n/**\n * 清空目录中的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 清空操作的异步结果。\n */\nexport async function emptyDir(dirPath: string): AsyncVoidIOResult {\n    const readDirRes = await readDir(dirPath);\n    if (readDirRes.isErr()) {\n        // 不存在则创建\n        return isNotFoundError(readDirRes.unwrapErr())\n            ? mkdir(dirPath)\n            : readDirRes.asErr();\n    }\n\n    // readDir 已经校验通过了\n    dirPath = validateAbsolutePath(dirPath).unwrap();\n\n    const tasks = readDirRes.unwrap().map(name => remove(dirPath + SEPARATOR + name));\n    const taskResults = await Promise.all(tasks);\n    // 是否有失败？\n    const failed = taskResults.find(x => x.isErr());\n\n    return failed ?? RESULT_VOID;\n}\n\n/**\n * 读取文本文件的内容。\n * @param filePath - 文件路径。\n * @returns 包含文件文本内容的异步结果。\n */\nexport function readTextFile(filePath: string): AsyncIOResult<string> {\n    return readFile(filePath, {\n        encoding: 'utf8',\n    });\n}\n\n/**\n * 读取文件并解析为 JSON。\n * @param filePath - 文件路径。\n * @returns 读取结果。\n */\nexport async function readJsonFile<T>(filePath: string): AsyncIOResult<T> {\n    const readFileRes = await readTextFile(filePath);\n\n    return readFileRes.andThen(contents => {\n        return tryResult(JSON.parse, contents);\n    });\n}\n\n/**\n * 将数据序列化为 JSON 并写入文件。\n * @param filePath - 文件路径。\n * @param data - 要写入的数据。\n * @returns 写入结果。\n */\nexport async function writeJsonFile<T>(filePath: string, data: T): AsyncVoidIOResult {\n    const result = tryResult(JSON.stringify, data);\n\n    return result.andThenAsync(text => writeFile(filePath, text));\n}\n\n/**\n * 下载文件并保存到临时文件。\n * @param fileUrl - 文件的网络 URL。\n * @param options - 可选参数。\n * @returns 下载操作的异步结果。\n */\nexport function downloadFile(fileUrl: string, options?: DownloadFileOptions): FetchTask<WechatMinigame.DownloadFileSuccessCallbackResult>;\n/**\n * 下载文件。\n * @param fileUrl - 文件的网络 URL。\n * @param filePath - 可选的下载后文件存储的路径，没传则存到临时文件。\n * @param options - 可选参数。\n * @returns 下载操作的异步结果。\n */\nexport function downloadFile(fileUrl: string, filePath: string, options?: DownloadFileOptions): FetchTask<WechatMinigame.DownloadFileSuccessCallbackResult>;\nexport function downloadFile(fileUrl: string, filePath?: string | DownloadFileOptions, options?: DownloadFileOptions): FetchTask<WechatMinigame.DownloadFileSuccessCallbackResult> {\n    type T = WechatMinigame.DownloadFileSuccessCallbackResult;\n\n    const fileUrlRes = validateSafeUrl(fileUrl);\n    if (fileUrlRes.isErr()) return createFailedFetchTask(fileUrlRes);\n\n    if (typeof filePath === 'string') {\n        const filePathRes = validateAbsolutePath(filePath);\n        if (filePathRes.isErr()) return createFailedFetchTask(filePathRes);\n        filePath = filePathRes.unwrap();\n    } else {\n        options = filePath;\n        filePath = undefined;\n    }\n\n    const {\n        onProgress,\n        ...rest\n    } = options ?? {};\n\n    let aborted = false;\n\n    const future = new Future<IOResult<T>>();\n\n    let task: WechatMinigame.DownloadTask;\n\n    const download = () => {\n        task = wx.downloadFile({\n            ...rest,\n            url: fileUrl,\n            filePath: filePath as string,\n            async success(response): Promise<void> {\n                if (aborted) {\n                    future.resolve(Err(createAbortError()));\n                    return;\n                }\n\n                const { statusCode } = response;\n\n                if (statusCode >= 200 && statusCode < 300) {\n                    future.resolve(Ok(response));\n                    return;\n                }\n\n                // 删除不符合预期的文件，但无需主动删除临时文件\n                if (response.filePath) {\n                    await remove(response.filePath);\n                }\n\n                future.resolve(Err(new FetchError(response.errMsg, statusCode)));\n            },\n            fail(err): void {\n                future.resolve(aborted ? Err(createAbortError()) : miniGameFailureToResult(err));\n            },\n        });\n\n        if (typeof onProgress === 'function') {\n            task.onProgressUpdate(progress => {\n                const { totalBytesExpectedToWrite, totalBytesWritten } = progress;\n                onProgress(typeof totalBytesExpectedToWrite === 'number' && typeof totalBytesWritten === 'number' ? Ok({\n                    totalByteLength: totalBytesExpectedToWrite,\n                    completedByteLength: totalBytesWritten,\n                }) : Err(new Error(`Unknown download progress ${totalBytesWritten}/${totalBytesExpectedToWrite}`)));\n            });\n        }\n    };\n\n    if (typeof filePath === 'string') {\n        // 如果目录不存在则创建\n        mkdir(dirname(filePath)).then(mkdirRes => {\n            if (aborted) {\n                future.resolve(Err(createAbortError()));\n                return;\n            }\n\n            if (mkdirRes.isErr()) {\n                future.resolve(mkdirRes.asErr());\n                return;\n            }\n\n            download();\n        });\n    } else {\n        // 可能下载到临时文件\n        download();\n    }\n\n    return {\n        abort(): void {\n            aborted = true;\n            task?.abort();\n        },\n\n        get aborted(): boolean {\n            return aborted;\n        },\n\n        get result(): FetchResult<T> {\n            return future.promise;\n        },\n    };\n}\n\n/**\n * 文件上传。\n * @param filePath - 需要上传的文件路径。\n * @param fileUrl - 目标网络 URL。\n * @param options - 可选参数。\n * @returns 上传操作的异步结果。\n */\nexport function uploadFile(filePath: string, fileUrl: string, options?: UploadFileOptions): FetchTask<WechatMinigame.UploadFileSuccessCallbackResult> {\n    type T = WechatMinigame.UploadFileSuccessCallbackResult;\n\n    const fileUrlRes = validateSafeUrl(fileUrl);\n    if (fileUrlRes.isErr()) return createFailedFetchTask(fileUrlRes);\n\n    const filePathRes = validateAbsolutePath(filePath);\n    if (filePathRes.isErr()) return createFailedFetchTask(filePathRes);\n    filePath = filePathRes.unwrap();\n\n    let aborted = false;\n\n    const future = new Future<IOResult<T>>();\n\n    const task = wx.uploadFile({\n        name: basename(filePath),\n        ...options,\n        url: fileUrl,\n        filePath,\n        success(res): void {\n            future.resolve(Ok(res));\n        },\n        fail(err): void {\n            future.resolve(miniGameFailureToResult(err));\n        },\n    });\n\n    return {\n        abort(): void {\n            aborted = true;\n            task?.abort();\n        },\n\n        get aborted(): boolean {\n            return aborted;\n        },\n\n        get result(): FetchResult<T> {\n            return future.promise;\n        },\n    };\n}\n\n/**\n * 解压 zip 文件。\n * @param zipFilePath - 要解压的 zip 文件路径。\n * @param destDir - 要解压到的目标文件夹路径。\n * @returns 解压操作的异步结果。\n */\nexport async function unzip(zipFilePath: string, destDir: string): AsyncVoidIOResult {\n    const zipFilePathRes = validateAbsolutePath(zipFilePath);\n    if (zipFilePathRes.isErr()) return zipFilePathRes.asErr();\n    zipFilePath = zipFilePathRes.unwrap();\n\n    const destDirRes = validateAbsolutePath(destDir);\n    if (destDirRes.isErr()) return destDirRes.asErr();\n    destDir = destDirRes.unwrap();\n\n    const unzipRes = await asyncResultify(getFs().unzip)({\n        zipFilePath,\n        targetPath: destDir,\n    });\n\n    return unzipRes\n        .and(RESULT_VOID)\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 从网络下载 zip 文件并解压。\n * @param zipFileUrl - Zip 文件的网络地址。\n * @param destDir - 要解压到的目标文件夹路径。\n * @param options - 可选的下载参数。\n * @returns 下载并解压操作的异步结果。\n */\nexport async function unzipFromUrl(zipFileUrl: string, destDir: string, options?: DownloadFileOptions): AsyncVoidIOResult {\n    const destDirRes = validateAbsolutePath(destDir);\n    if (destDirRes.isErr()) return destDirRes.asErr();\n    destDir = destDirRes.unwrap();\n\n    const downloadRes = await downloadFile(zipFileUrl, options).result;\n\n    return downloadRes.andThenAsync(({ tempFilePath }) => {\n        return unzip(tempFilePath, destDir);\n    });\n}\n\n/**\n * 压缩文件到内存。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩成功的异步结果。\n */\nexport async function zip(sourcePath: string, options?: ZipOptions): AsyncIOResult<Uint8Array<ArrayBuffer>>;\n/**\n * 压缩文件。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param zipFilePath - 压缩后的 zip 文件路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩成功的异步结果。\n */\nexport async function zip(sourcePath: string, zipFilePath: string, options?: ZipOptions): AsyncVoidIOResult;\nexport async function zip(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): AsyncZipIOResult {\n    if (typeof zipFilePath === 'string') {\n        const zipFilePathRes = validateAbsolutePath(zipFilePath);\n        if (zipFilePathRes.isErr()) return zipFilePathRes.asErr();\n        zipFilePath = zipFilePathRes.unwrap();\n    } else {\n        options = zipFilePath;\n        zipFilePath = undefined;\n    }\n\n    const statRes = await stat(sourcePath, {\n        recursive: true,\n    });\n    if (statRes.isErr()) return statRes.asErr();\n    const statsArray = statRes.unwrap();\n\n    // stat 已经校验通过了\n    sourcePath = validateAbsolutePath(sourcePath).unwrap();\n    const sourceName = basename(sourcePath);\n\n    const zippable: AsyncZippable = {};\n\n    if (statsArray.length === 1 && statsArray[0].stats.isFile()) {\n        // sourcePath 是文件\n        const readFileRes = await readFile(sourcePath);\n        if (readFileRes.isErr()) return readFileRes;\n\n        zippable[sourceName] = readFileRes.unwrap();\n    } else {\n        // sourcePath 是目录\n        // 默认保留根目录\n        const preserveRoot = options?.preserveRoot ?? true;\n        if (preserveRoot) {\n            // 添加根目录条目\n            zippable[sourceName + SEPARATOR] = EMPTY_BYTES;\n        }\n\n        const tasks: AsyncIOResult<{\n            entryName: string;\n            data: Uint8Array<ArrayBuffer>;\n        }>[] = [];\n\n        for (const { path, stats } of statRes.unwrap()) {\n            // 这里就跳过根目录了\n            if (!path) continue;\n\n            const entryName = preserveRoot ? sourceName + SEPARATOR + path : path;\n\n            if (stats.isFile()) {\n                // 不能用 join，否则 http://usr 会变成 http:/usr\n                tasks.push((async () => {\n                    const readFileRes = await readFile(sourcePath + SEPARATOR + path);\n                    return readFileRes.map(data => ({\n                        entryName,\n                        data,\n                    }));\n                })());\n            } else {\n                // 文件夹 - 添加带有尾部斜杠和空内容的条目\n                zippable[entryName + SEPARATOR] = EMPTY_BYTES;\n            }\n        }\n\n        if (tasks.length > 0) {\n            const results = await Promise.all(tasks);\n            for (const result of results) {\n                if (result.isErr()) return result.asErr();\n\n                const { entryName, data } = result.unwrap();\n                zippable[entryName] = data;\n            }\n        }\n    }\n\n    // Nothing to zip - 和标准 zip 命令的行为一致\n    if (Object.keys(zippable).length === 0) {\n        return createNothingToZipError();\n    }\n\n    return zipTo(zippable, zipFilePath);\n}\n\n/**\n * 下载文件并压缩到内存。\n * @param sourceUrl - 要下载的文件 URL。\n * @param options - 下载选项。\n */\nexport async function zipFromUrl(sourceUrl: string, options?: DownloadFileOptions): AsyncIOResult<Uint8Array<ArrayBuffer>>;\n/**\n * 下载文件并压缩为 zip 文件。\n * @param sourceUrl - 要下载的文件 URL。\n * @param zipFilePath - 要输出的 zip 文件路径。\n * @param options - 下载选项。\n */\nexport async function zipFromUrl(sourceUrl: string, zipFilePath: string, options?: DownloadFileOptions): AsyncVoidIOResult;\nexport async function zipFromUrl(sourceUrl: string, zipFilePath?: string | DownloadFileOptions, options?: DownloadFileOptions): AsyncZipIOResult {\n    if (typeof zipFilePath === 'string') {\n        const zipFilePathRes = validateAbsolutePath(zipFilePath);\n        if (zipFilePathRes.isErr()) return zipFilePathRes.asErr();\n        zipFilePath = zipFilePathRes.unwrap();\n    } else {\n        options = zipFilePath;\n        zipFilePath = undefined;\n    }\n\n    const downloadRes = await downloadFile(sourceUrl, options).result;\n\n    return downloadRes.andThenAsync(async ({ tempFilePath }) => {\n        const readFileRes = await readFile(tempFilePath);\n        if (readFileRes.isErr()) return readFileRes;\n\n        const sourceName = basename(tempFilePath);\n        const zippable = {\n            [sourceName]: readFileRes.unwrap(),\n        };\n\n        return zipTo(zippable, zipFilePath);\n    });\n}\n\n// #region Internal Types\n\n/**\n * 异步的 zip 操作的结果。\n */\ntype AsyncZipIOResult = Promise<ZipIOResult>;\n\n// #endregion\n\n// #region Internal Functions\n\n/**\n * 将错误对象转换为 IOResult 类型。\n */\nfunction miniGameFailureToResult<T>(error: WechatMinigame.GeneralCallbackResult): IOResult<T> {\n    return Err(miniGameFailureToError(error));\n}\n\n/**\n * 创建一个 `AbortError` 错误。\n */\nfunction createAbortError(): Error {\n    const error = new Error();\n    error.name = ABORT_ERROR;\n\n    return error;\n}\n\n/**\n * 复制文件。\n */\nasync function copyFile(srcPath: string, destPath: string): AsyncVoidIOResult {\n    const copyRes = await asyncResultify(getFs().copyFile)({\n        srcPath,\n        destPath,\n    });\n\n    return copyRes\n        .and(RESULT_VOID)\n        .orElse(fileErrorToResult);\n}\n\n/**\n * 将 zippable 对象压缩为 zip 文件。\n */\nfunction zipTo(zippable: AsyncZippable, zipFilePath?: string): AsyncZipIOResult {\n    // 小游戏不支持 Web Worker(fflate 异步接口内部使用了), 退化到同步接口\n    return tryResult(() => compressSync(zippable))\n        .andThenAsync(bytesLike => {\n            const bytes = bytesLike as Uint8Array<ArrayBuffer>;\n            // 有文件路径则写入文件\n            return zipFilePath\n                ? writeFile(zipFilePath, bytes)\n                : Promise.resolve(Ok(bytes)) as AsyncZipIOResult;\n        });\n}\n\n// #endregion\n","/**\n * @internal\n * 文件系统辅助函数。\n */\n\nimport { isFileHandle, isFileHandleLike, readDir, readDirSync, stat, statSync, type FileSystemHandleLike } from 'happy-opfs';\nimport { Ok, tryAsyncResult, type AsyncIOResult, type IOResult } from 'happy-rusty';\nimport type { StatOptions } from './fs_define.ts';\n\n/**\n * 将 `FileSystemHandleLike` 转换为小游戏 `Stats`。\n * @param handleLike - 要转换的 `FileSystemHandleLike` 对象。\n * @returns 小游戏的 `Stats` 对象。\n */\nexport function convertFileSystemHandleLikeToStats(handleLike: FileSystemHandleLike): WechatMinigame.Stats {\n    const isFile = isFileHandleLike(handleLike);\n\n    return {\n        isFile: (): boolean => isFile,\n        isDirectory: (): boolean => !isFile,\n        size: isFile ? handleLike.size : 0,\n        lastModifiedTime: isFile ? handleLike.lastModified : 0,\n        lastAccessedTime: 0,\n        mode: 0,\n    };\n}\n\n/**\n * 将 `FileSystemHandle` 转换为小游戏 `Stats`。\n * @param handle - 要转换的 `FileSystemHandle` 对象。\n * @returns 小游戏的 `Stats` 对象。\n */\nexport async function convertFileSystemHandleToStats(handle: FileSystemHandle): Promise<WechatMinigame.Stats> {\n    const isFile = isFileHandle(handle);\n    let size = 0;\n    let lastModified = 0;\n\n    if (isFile) {\n        const file = await handle.getFile();\n        ({ size, lastModified } = file);\n    }\n\n    return {\n        isFile: (): boolean => isFile,\n        isDirectory: (): boolean => !isFile,\n        size,\n        lastModifiedTime: lastModified,\n        lastAccessedTime: 0,\n        mode: 0,\n    };\n}\n\n/**\n * 将 Web 端的读取目录结果转换为小游戏端的读取目录结果。\n * @param dirPath - 要读取的目录路径。\n * @returns 目录内容路径数组。\n */\nexport async function webToMinaReadDir(dirPath: string): AsyncIOResult<string[]> {\n    // 小游戏不支持 recursive 选项\n    const readDirRes = await readDir(dirPath);\n    return readDirRes.andTryAsync(async entries => {\n        if (typeof Array.fromAsync === 'function') {\n            return Array.fromAsync(entries, ({ path }) => path);\n        }\n\n        const items: string[] = [];\n        for await (const { path } of entries) {\n            items.push(path);\n        }\n        return items;\n    });\n}\n\n/**\n * 将 Web 端的 stat 结果转换为小游戏端的 stat 结果。\n * @param path - 要获取状态的路径。\n * @param options - 可选的 stat 选项。\n * @returns 文件或目录的状态信息。\n */\nexport async function webToMinaStat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    const statRes = await stat(path);\n    if (statRes.isErr()) return statRes.asErr();\n\n    const handle = statRes.unwrap();\n\n    const entryStatsRes = await tryAsyncResult(convertFileSystemHandleToStats(handle));\n    if (entryStatsRes.isErr()) return entryStatsRes;\n\n    // 非递归模式直接返回\n    if (!options?.recursive) {\n        return entryStatsRes;\n    }\n\n    const entryStats = entryStatsRes.unwrap();\n    if (entryStats.isFile()) {\n        return Ok([{\n            path: '', // 当前文件本身的相对路径\n            stats: entryStats,\n        }]);\n    }\n\n    // 递归读取目录\n    const readDirRes = await readDir(path);\n    return readDirRes.andTryAsync(async entries => {\n        // 只要是 recursive 模式下的目录, 就返回数组(即使空目录)\n        const tasks = [Promise.resolve({\n            path: '', // 当前文件夹本身的相对路径\n            stats: entryStats,\n        })];\n\n        for await (const { path, handle } of entries) {\n            tasks.push((async () => {\n                const stats = await convertFileSystemHandleToStats(handle);\n                return {\n                    path,\n                    stats,\n                };\n            })());\n        }\n\n        return Promise.all(tasks);\n    });\n}\n\n/**\n * 将 Web 端的读取目录结果转换为小游戏端的读取目录结果。\n * @param dirPath - 要读取的目录路径。\n * @returns 目录内容路径数组。\n */\nexport function webToMinaReadDirSync(dirPath: string): IOResult<string[]> {\n    // 小游戏不支持 recursive 选项\n    const readDirRes = readDirSync(dirPath);\n    return readDirRes.map(entries => {\n        return entries.map(({ path }) => path);\n    });\n}\n\n/**\n * 将 Web 端的 stat 结果转换为小游戏端的 stat 结果。\n * @param path - 要获取状态的路径。\n * @param options - 可选的 stat 选项。\n * @returns 文件或目录的状态信息。\n */\nexport function webToMinaStatSync(path: string, options?: StatOptions): IOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    const statRes = statSync(path);\n    if (statRes.isErr()) return statRes.asErr();\n\n    const handleLike = statRes.unwrap();\n\n    const entryStats = convertFileSystemHandleLikeToStats(handleLike);\n\n    // 非递归模式直接返回\n    if (!options?.recursive) {\n        return Ok(entryStats);\n    }\n\n    if (entryStats.isFile()) {\n        return Ok([{\n            path: '', // 当前文件本身的相对路径\n            stats: entryStats,\n        }]);\n    }\n\n    // 递归读取目录\n    const readDirRes = readDirSync(path);\n    return readDirRes.map(entries => {\n        const statsArr = entries.map(({ path, handle }) => ({\n            path,\n            stats: convertFileSystemHandleLikeToStats(handle),\n        }));\n\n        // 只要是 recursive 模式下的目录, 就返回数组(即使是空目录)\n        statsArr.unshift({\n            path: '', // 当前文件夹本身的相对路径\n            stats: entryStats,\n        });\n\n        return statsArr;\n    });\n}\n","import type { FetchTask } from '@happy-ts/fetch-t';\nimport {\n    appendFile as webAppendFile,\n    copy as webCopy,\n    downloadFile as webDownloadFile,\n    emptyDir as webEmptyDir,\n    exists as webExists,\n    mkdir as webMkdir,\n    move as webMove,\n    readFile as webReadFile,\n    readJsonFile as webReadJsonFile,\n    readTextFile as webReadTextFile,\n    remove as webRemove,\n    unzip as webUnzip,\n    unzipFromUrl as webUnzipFromUrl,\n    uploadFile as webUploadFile,\n    writeFile as webWriteFile,\n    writeJsonFile as webWriteJsonFile,\n    zip as webZip,\n    zipFromUrl as webZipFromUrl,\n    type AppendOptions,\n    type DownloadFileTempResponse,\n    type ExistsOptions,\n    type WriteOptions,\n    type ZipOptions,\n} from 'happy-opfs';\nimport { type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport type { ReadFileContent, ReadOptions, StatOptions, UnionDownloadFileOptions, UnionUploadFileOptions, WriteFileContent, ZipFromUrlOptions } from './fs_define.ts';\nimport {\n    appendFile as minaAppendFile,\n    copy as minaCopy,\n    downloadFile as minaDownloadFile,\n    emptyDir as minaEmptyDir,\n    exists as minaExists,\n    mkdir as minaMkdir,\n    move as minaMove,\n    readDir as minaReadDir,\n    readFile as minaReadFile,\n    readJsonFile as minaReadJsonFile,\n    readTextFile as minaReadTextFile,\n    remove as minaRemove,\n    stat as minaStat,\n    unzip as minaUnzip,\n    unzipFromUrl as minaUnzipFromUrl,\n    uploadFile as minaUploadFile,\n    writeFile as minaWriteFile,\n    writeJsonFile as minaWriteJsonFile,\n    zip as minaZip,\n    zipFromUrl as minaZipFromUrl,\n} from './mina_fs_async.ts';\nimport { webToMinaReadDir, webToMinaStat } from './web_fs_helpers.ts';\n\n/**\n * 递归创建文件夹，相当于 `mkdir -p`。\n * @param dirPath - 将要创建的目录的路径。\n * @returns 创建成功返回的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await mkdir('/path/to/dir');\n * if (result.isOk()) {\n *     console.log('目录创建成功');\n * }\n * ```\n */\nexport function mkdir(dirPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaMkdir : webMkdir)(dirPath);\n}\n\n/**\n * 移动或重命名文件或目录。\n * @param srcPath - 原始路径。\n * @param destPath - 新路径。\n * @returns 操作成功返回的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await move('/old/path', '/new/path');\n * if (result.isOk()) {\n *     console.log('移动成功');\n * }\n * ```\n */\nexport function move(srcPath: string, destPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaMove : webMove)(srcPath, destPath);\n}\n\n/**\n * 异步读取指定目录下的所有文件和子目录。\n * @param dirPath - 需要读取的目录路径。\n * @returns 包含目录内容的字符串数组的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await readDir('/path/to/dir');\n * if (result.isOk()) {\n *     console.log(result.unwrap()); // ['file1.txt', 'file2.txt', 'subdir']\n * }\n * ```\n */\nexport async function readDir(dirPath: string): AsyncIOResult<string[]> {\n    return (isMinaEnv() ? minaReadDir : webToMinaReadDir)(dirPath);\n}\n\n/**\n * 以 UTF-8 格式读取文件。\n * @param filePath - 文件路径。\n * @param options - 读取选项，指定编码为 'utf8'。\n * @returns 包含文件内容的字符串的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await readFile('/path/to/file.txt', { encoding: 'utf8' });\n * if (result.isOk()) {\n *     console.log(result.unwrap());\n * }\n * ```\n */\nexport function readFile(filePath: string, options: ReadOptions & {\n    encoding: 'utf8';\n}): AsyncIOResult<string>;\n\n/**\n * 以二进制格式读取文件。\n * @param filePath - 文件路径。\n * @param options - 读取选项，指定编码为 'bytes'。\n * @returns 包含文件内容的 Uint8Array<ArrayBuffer> 的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await readFile('/path/to/file.txt', { encoding: 'bytes' });\n * if (result.isOk()) {\n *     const bytes = result.unwrap();\n *     console.log(decodeUtf8(bytes));\n * }\n * ```\n */\nexport function readFile(filePath: string, options?: ReadOptions & {\n    encoding: 'bytes';\n}): AsyncIOResult<Uint8Array<ArrayBuffer>>;\n\n/**\n * 读取文件内容。\n * @param filePath - 文件的路径。\n * @param options - 可选的读取选项。\n * @returns 包含文件内容的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await readFile('/path/to/file.txt');\n * if (result.isOk()) {\n *     const bytes = result.unwrap();\n *     console.log(decodeUtf8(bytes));\n * }\n * ```\n */\nexport function readFile(filePath: string, options?: ReadOptions): AsyncIOResult<ReadFileContent>;\n/**\n * 读取文件内容，可选地指定编码和返回类型。\n * @template T - 返回内容的类型。\n * @param filePath - 文件路径。\n * @param options - 可选的读取选项。\n * @returns 包含文件内容的异步操作结果。\n */\nexport function readFile(filePath: string, options?: ReadOptions): AsyncIOResult<ReadFileContent> {\n    return isMinaEnv()\n        ? minaReadFile(filePath, options)\n        : webReadFile(filePath, options) as AsyncIOResult<ReadFileContent>;\n}\n\n/**\n * 删除文件或目录。\n * @param path - 要删除的文件或目录的路径。\n * @returns 删除成功返回的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await remove('/path/to/file.txt');\n * if (result.isOk()) {\n *     console.log('删除成功');\n * }\n * ```\n */\nexport function remove(path: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaRemove : webRemove)(path);\n}\n\n/**\n * 获取单个文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @param options - 可选选项，recursive 设置为 false（默认）获取单个文件状态。\n * @returns 包含状态信息的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await stat('/path/to/file.txt');\n * if (result.isOk()) {\n *     const stats = result.unwrap();\n *     console.log(stats.isFile()); // true\n * }\n * ```\n */\nexport function stat(path: string, options?: StatOptions & {\n    recursive: false;\n}): AsyncIOResult<WechatMinigame.Stats>;\n/**\n * 递归获取目录下所有文件和子目录的状态信息。\n * @param path - 目录的路径。\n * @param options - 选项，recursive 设置为 true 以递归获取。\n * @returns 包含所有文件状态信息数组的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await stat('/path/to/dir', { recursive: true });\n * if (result.isOk()) {\n *     const fileStats = result.unwrap();\n *     fileStats.forEach(file => console.log(file.path));\n * }\n * ```\n */\nexport function stat(path: string, options: StatOptions & {\n    recursive: true;\n}): AsyncIOResult<WechatMinigame.FileStats[]>;\nexport function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]>;\n/**\n * 获取文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @param options - 可选选项，包含 recursive 可递归获取目录下所有文件状态。\n * @returns 包含状态信息的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await stat('/path/to/file.txt');\n * if (result.isOk()) {\n *     const stats = result.unwrap();\n *     console.log(stats.isFile()); // true\n * }\n * ```\n */\nexport async function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    return (isMinaEnv() ? minaStat : webToMinaStat)(path, options);\n}\n\n/**\n * 写入文件，文件不存在则创建，同时创建对应目录。\n * @param filePath - 文件路径。\n * @param contents - 要写入的内容，支持 ArrayBuffer 和 string（需确保是 UTF-8 编码）。\n * @param options - 可选写入选项。\n * @returns 写入成功返回的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await writeFile('/path/to/file.txt', 'Hello, World!');\n * if (result.isOk()) {\n *     console.log('写入成功');\n * }\n * ```\n */\nexport function writeFile(filePath: string, contents: WriteFileContent, options?: WriteOptions): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaWriteFile : webWriteFile)(filePath, contents, options);\n}\n\n/**\n * 向文件追加内容。\n * @param filePath - 文件路径。\n * @param contents - 要追加的内容。\n * @param options - 可选的追加选项。\n * @returns 追加成功返回的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await appendFile('/path/to/file.txt', '\\nNew content');\n * if (result.isOk()) {\n *     console.log('追加成功');\n * }\n * ```\n */\nexport function appendFile(filePath: string, contents: WriteFileContent, options?: AppendOptions): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaAppendFile : webAppendFile)(filePath, contents, options);\n}\n\n/**\n * 复制文件或文件夹。\n * @param srcPath - 源文件或文件夹路径。\n * @param destPath - 目标文件或文件夹路径。\n * @returns 操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await copy('/src/file.txt', '/dest/file.txt');\n * if (result.isOk()) {\n *     console.log('复制成功');\n * }\n * ```\n */\nexport function copy(srcPath: string, destPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaCopy : webCopy)(srcPath, destPath);\n}\n\n/**\n * 检查指定路径的文件或目录是否存在。\n * @param path - 文件或目录的路径。\n * @param options - 可选的检查选项。\n * @returns 存在返回 true 的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await exists('/path/to/file.txt');\n * if (result.isOk() && result.unwrap()) {\n *     console.log('文件存在');\n * }\n * ```\n */\nexport function exists(path: string, options?: ExistsOptions): AsyncIOResult<boolean> {\n    return (isMinaEnv() ? minaExists : webExists)(path, options);\n}\n\n/**\n * 清空指定目录下的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 清空成功返回的异步操作结果。\n * @since 1.0.1\n * @example\n * ```ts\n * const result = await emptyDir('/path/to/dir');\n * if (result.isOk()) {\n *     console.log('目录已清空');\n * }\n * ```\n */\nexport function emptyDir(dirPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaEmptyDir : webEmptyDir)(dirPath);\n}\n\n/**\n * 读取 JSON 文件并解析为对象。\n * @typeParam T - JSON 解析后的类型。\n * @param filePath - 文件路径。\n * @returns 解析后的对象。\n * @since 1.6.0\n * @example\n * ```ts\n * const result = await readJsonFile<{ name: string }>('/path/to/config.json');\n * if (result.isOk()) {\n *     console.log(result.unwrap().name);\n * }\n * ```\n */\nexport function readJsonFile<T>(filePath: string): AsyncIOResult<T> {\n    return (isMinaEnv() ? minaReadJsonFile : webReadJsonFile)(filePath);\n}\n\n/**\n * 读取文本文件的内容。\n * @param filePath - 文件路径。\n * @returns 包含文件文本内容的异步操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await readTextFile('/path/to/file.txt');\n * if (result.isOk()) {\n *     console.log(result.unwrap());\n * }\n * ```\n */\nexport function readTextFile(filePath: string): AsyncIOResult<string> {\n    return (isMinaEnv() ? minaReadTextFile : webReadTextFile)(filePath);\n}\n\n/**\n * 将数据序列化为 JSON 并写入文件。\n * @typeParam T - 要写入数据的类型。\n * @param filePath - 文件路径。\n * @param data - 要写入的数据。\n * @returns 写入操作的异步结果。\n * @since 2.0.0\n * @example\n * ```ts\n * const result = await writeJsonFile('/path/to/config.json', { name: 'test' });\n * if (result.isOk()) {\n *     console.log('写入成功');\n * }\n * ```\n */\nexport function writeJsonFile<T>(filePath: string, data: T): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaWriteJsonFile : webWriteJsonFile)(filePath, data);\n}\n\n/**\n * 下载文件并保存到临时文件。\n * @param fileUrl - 文件的网络 URL。\n * @param options - 可选的下载参数。\n * @returns 下载操作的 FetchTask，可用于取消或监听进度。\n * @since 1.0.0\n * @example\n * ```ts\n * const task = downloadFile('https://example.com/file.zip');\n * const result = await task.result;\n * if (result.isOk()) {\n *     console.log('下载完成:', result.unwrap().tempFilePath);\n * }\n * ```\n */\nexport function downloadFile(fileUrl: string, options?: UnionDownloadFileOptions): FetchTask<WechatMinigame.DownloadFileSuccessCallbackResult | DownloadFileTempResponse>;\n/**\n * 下载文件并保存到指定路径。\n * @param fileUrl - 文件的网络 URL。\n * @param filePath - 下载后文件存储的路径。\n * @param options - 可选的请求初始化参数。\n * @returns 下载操作的 FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * const task = downloadFile('https://example.com/file.zip', '/path/to/save.zip');\n * const result = await task.result;\n * if (result.isOk()) {\n *     console.log('下载完成');\n * }\n * ```\n */\nexport function downloadFile(fileUrl: string, filePath: string, options?: UnionDownloadFileOptions): FetchTask<WechatMinigame.DownloadFileSuccessCallbackResult | Response>;\nexport function downloadFile(fileUrl: string, filePath?: string | UnionDownloadFileOptions, options?: UnionDownloadFileOptions): FetchTask<WechatMinigame.DownloadFileSuccessCallbackResult | DownloadFileTempResponse | Response> {\n    if (typeof filePath === 'string') {\n        return isMinaEnv()\n            ? minaDownloadFile(fileUrl, filePath, options)\n            : webDownloadFile(fileUrl, filePath, options);\n    } else {\n        return isMinaEnv()\n            ? minaDownloadFile(fileUrl, filePath)\n            : webDownloadFile(fileUrl, filePath);\n    }\n}\n\n/**\n * 上传本地文件到服务器。\n * @param filePath - 需要上传的文件路径。\n * @param fileUrl - 目标服务器的 URL。\n * @param options - 可选的请求初始化参数。\n * @returns 上传操作的 FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * const task = uploadFile('/path/to/file.txt', 'https://example.com/upload');\n * const result = await task.result;\n * if (result.isOk()) {\n *     console.log('上传成功');\n * }\n * ```\n */\nexport function uploadFile(filePath: string, fileUrl: string, options?: UnionUploadFileOptions): FetchTask<WechatMinigame.UploadFileSuccessCallbackResult | Response> {\n    return isMinaEnv()\n        ? minaUploadFile(filePath, fileUrl, options)\n        : webUploadFile(filePath, fileUrl, options);\n}\n\n/**\n * 解压 zip 文件。\n * @param zipFilePath - 要解压的 zip 文件路径。\n * @param targetPath - 要解压到的目标文件夹路径。\n * @returns 解压操作的异步结果。\n * @since 1.3.0\n * @example\n * ```ts\n * const result = await unzip('/path/to/archive.zip', '/path/to/output');\n * if (result.isOk()) {\n *     console.log('解压成功');\n * }\n * ```\n */\nexport function unzip(zipFilePath: string, targetPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaUnzip : webUnzip)(zipFilePath, targetPath);\n}\n\n/**\n * 从网络下载 zip 文件并解压。\n * @param zipFileUrl - Zip 文件的网络地址。\n * @param targetPath - 要解压到的目标文件夹路径。\n * @param options - 可选的下载参数。\n * @returns 下载并解压操作的异步结果。\n * @since 1.4.0\n * @example\n * ```ts\n * const result = await unzipFromUrl('https://example.com/archive.zip', '/path/to/output');\n * if (result.isOk()) {\n *     console.log('下载并解压成功');\n * }\n * ```\n */\nexport function unzipFromUrl(zipFileUrl: string, targetPath: string, options?: UnionDownloadFileOptions): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaUnzipFromUrl : webUnzipFromUrl)(zipFileUrl, targetPath, options);\n}\n\n/**\n * 压缩文件或文件夹到内存。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩后的 Uint8Array。\n * @since 1.3.0\n * @example\n * ```ts\n * const result = await zip('/path/to/source');\n * if (result.isOk()) {\n *     console.log('压缩成功:', result.unwrap().length, 'bytes');\n * }\n * ```\n */\nexport function zip(sourcePath: string, options?: ZipOptions): AsyncIOResult<Uint8Array<ArrayBuffer>>;\n/**\n * 压缩文件或文件夹并保存到指定路径。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param zipFilePath - 压缩后的 zip 文件路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩操作的异步结果。\n * @since 1.3.0\n * @example\n * ```ts\n * const result = await zip('/path/to/source', '/path/to/archive.zip');\n * if (result.isOk()) {\n *     console.log('压缩成功');\n * }\n * ```\n */\nexport function zip(sourcePath: string, zipFilePath: string, options?: ZipOptions): AsyncVoidIOResult;\nexport function zip(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): AsyncIOResult<Uint8Array<ArrayBuffer> | void> {\n    if (typeof zipFilePath === 'string') {\n        return (isMinaEnv() ? minaZip : webZip)(sourcePath, zipFilePath, options);\n    } else {\n        return (isMinaEnv() ? minaZip : webZip)(sourcePath, zipFilePath);\n    }\n}\n\n/**\n * 下载文件并压缩到内存。\n * @param sourceUrl - 要下载的文件 URL。\n * @param options - 合并的下载和压缩选项。\n * @returns 压缩后的 Uint8Array。\n * @since 1.4.0\n * @example\n * ```ts\n * const result = await zipFromUrl('https://example.com/file.txt');\n * if (result.isOk()) {\n *     console.log('下载并压缩成功');\n * }\n * ```\n */\nexport function zipFromUrl(sourceUrl: string, options?: ZipFromUrlOptions): AsyncIOResult<Uint8Array<ArrayBuffer>>;\n/**\n * 下载文件并压缩为 zip 文件。\n * @param sourceUrl - 要下载的文件 URL。\n * @param zipFilePath - 要输出的 zip 文件路径。\n * @param options - 合并的下载和压缩选项。\n * @returns 操作的异步结果。\n * @since 1.4.0\n * @example\n * ```ts\n * const result = await zipFromUrl('https://example.com/file.txt', '/path/to/archive.zip');\n * if (result.isOk()) {\n *     console.log('下载并压缩成功');\n * }\n * ```\n */\nexport function zipFromUrl(sourceUrl: string, zipFilePath: string, options?: ZipFromUrlOptions): AsyncVoidIOResult;\nexport function zipFromUrl(sourceUrl: string, zipFilePath?: string | ZipFromUrlOptions, options?: ZipFromUrlOptions): AsyncIOResult<Uint8Array<ArrayBuffer> | void> {\n    if (typeof zipFilePath === 'string') {\n        return isMinaEnv()\n            ? minaZipFromUrl(sourceUrl, zipFilePath, options)\n            : webZipFromUrl(sourceUrl, zipFilePath, options);\n    } else {\n        return isMinaEnv()\n            ? minaZipFromUrl(sourceUrl, zipFilePath)\n            : webZipFromUrl(sourceUrl, zipFilePath);\n    }\n}\n","/**\n * @internal\n * 小游戏平台的同步文件系统操作实现。\n */\n\nimport { basename, dirname, SEPARATOR } from '@std/path/posix';\nimport { zipSync as compressSync, unzipSync as decompressSync, type AsyncZippable } from 'fflate/browser';\nimport { type AppendOptions, type ExistsOptions, type WriteOptions, type ZipOptions } from 'happy-opfs';\nimport { Ok, RESULT_VOID, tryResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport type { ReadFileContent, ReadOptions, StatOptions, WriteFileContent } from './fs_define.ts';\nimport { createDirIsFileError, createFileNotExistsError, createNothingToZipError, EMPTY_BYTES, fileErrorToMkdirResult, fileErrorToRemoveResult, fileErrorToResult, getExistsResult, getFs, getReadFileEncoding, getUsrPath, getWriteFileContents, isNotFoundError, normalizeStats, validateAbsolutePath, validateExistsOptions, validateReadablePath, type ZipIOResult } from './mina_fs_shared.ts';\n\n/**\n * `mkdir` 的同步版本。\n * @param dirPath - 要创建的目录路径。\n * @returns 操作结果。\n */\nexport function mkdirSync(dirPath: string): VoidIOResult {\n    const dirPathRes = validateAbsolutePath(dirPath);\n    if (dirPathRes.isErr()) return dirPathRes.asErr();\n    dirPath = dirPathRes.unwrap();\n\n    // 根目录无需创建\n    if (dirPath === getUsrPath()) {\n        return RESULT_VOID;\n    }\n\n    const statRes = statSync(dirPath);\n    if (statRes.isOk()) {\n        // 已存在并且是文件\n        if (statRes.unwrap().isFile()) {\n            return createDirIsFileError(dirPath);\n        }\n\n        // 存在文件夹则不创建\n        return RESULT_VOID;\n    }\n\n    // 递归创建\n    return trySyncOp(() => getFs().mkdirSync(dirPath, true), fileErrorToMkdirResult);\n}\n\n/**\n * `move` 的同步版本。\n * @param srcPath - 源路径。\n * @param destPath - 目标路径。\n * @returns 操作结果。\n */\nexport function moveSync(srcPath: string, destPath: string): VoidIOResult {\n    const srcPathRes = validateAbsolutePath(srcPath);\n    if (srcPathRes.isErr()) return srcPathRes.asErr();\n    srcPath = srcPathRes.unwrap();\n\n    const destPathRes = validateAbsolutePath(destPath);\n    if (destPathRes.isErr()) return destPathRes.asErr();\n    destPath = destPathRes.unwrap();\n\n    return trySyncOp(() => getFs().renameSync(srcPath, destPath));\n}\n\n/**\n * `readDir` 的同步版本。\n * @param dirPath - 要读取的目录路径。\n * @returns 目录中的文件和子目录名称数组。\n */\nexport function readDirSync(dirPath: string): IOResult<string[]> {\n    const dirPathRes = validateReadablePath(dirPath);\n    if (dirPathRes.isErr()) return dirPathRes.asErr();\n    dirPath = dirPathRes.unwrap();\n\n    return trySyncOp(() => getFs().readdirSync(dirPath));\n}\n\n/**\n * `readFile` 的同步版本。\n * @param filePath - 要读取的文件路径。\n * @param options - 读取选项。\n * @returns 文件内容。\n */\nexport function readFileSync(filePath: string, options: ReadOptions & {\n    encoding: 'utf8';\n}): IOResult<string>;\nexport function readFileSync(filePath: string, options?: ReadOptions & {\n    encoding: 'bytes';\n}): IOResult<Uint8Array<ArrayBuffer>>;\nexport function readFileSync(filePath: string, options?: ReadOptions): IOResult<ReadFileContent>;\nexport function readFileSync(filePath: string, options?: ReadOptions): IOResult<ReadFileContent> {\n    const filePathRes = validateReadablePath(filePath);\n    if (filePathRes.isErr()) return filePathRes.asErr();\n    filePath = filePathRes.unwrap();\n\n    const encoding = getReadFileEncoding(options);\n\n    return trySyncOp(() => {\n        const data = getFs().readFileSync(filePath, encoding);\n        // 小游戏返回的是 ArrayBuffer，需要转换为 Uint8Array\n        return typeof data === 'string' ? data : new Uint8Array(data);\n    });\n}\n\n/**\n * `remove` 的同步版本。\n * @param path - 要删除的文件或目录路径。\n * @returns 操作结果。\n */\nexport function removeSync(path: string): VoidIOResult {\n    const statRes = statSync(path);\n\n    if (statRes.isErr()) {\n        // 不存在当做成功\n        return isNotFoundError(statRes.unwrapErr()) ? RESULT_VOID : statRes.asErr();\n    }\n\n    // statSync 已经校验通过了\n    path = validateAbsolutePath(path).unwrap();\n\n    return trySyncOp(() => {\n        // 文件夹还是文件\n        if (statRes.unwrap().isDirectory()) {\n            getFs().rmdirSync(path, true);\n        } else {\n            getFs().unlinkSync(path);\n        }\n    }, fileErrorToRemoveResult);\n}\n\n/**\n * `stat` 的同步版本。\n * @param path - 文件或目录路径。\n * @param options - 统计选项。\n * @returns 文件或目录的统计信息。\n */\nexport function statSync(path: string, options?: StatOptions & {\n    recursive: false;\n}): IOResult<WechatMinigame.Stats>;\nexport function statSync(path: string, options: StatOptions & {\n    recursive: true;\n}): IOResult<WechatMinigame.FileStats[]>;\nexport function statSync(path: string, options?: StatOptions): IOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]>;\nexport function statSync(path: string, options?: StatOptions): IOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    const pathRes = validateReadablePath(path);\n    if (pathRes.isErr()) return pathRes.asErr();\n    path = pathRes.unwrap();\n\n    const { recursive = false } = options ?? {};\n\n    return trySyncOp(() => getFs().statSync(path, recursive))\n        .map(x => normalizeStats(x, recursive));\n}\n\n/**\n * `writeFile` 的同步版本。\n * @param filePath - 要写入的文件路径。\n * @param contents - 要写入的内容。\n * @param options - 写入选项。\n * @returns 操作结果。\n */\nexport function writeFileSync(filePath: string, contents: WriteFileContent, options?: WriteOptions): VoidIOResult {\n    // 默认创建\n    const { append = false, create = true } = options ?? {};\n\n    const fs = getFs();\n    let writeMethod: typeof fs.appendFileSync | typeof fs.writeFileSync = fs.writeFileSync;\n\n    if (append) {\n        // append 模式，先检查文件是否存在\n        const existsRes = existsSync(filePath);\n        if (existsRes.isErr()) return existsRes.asErr();\n\n        if (existsRes.unwrap()) {\n            // 文件存在，使用 appendFileSync\n            writeMethod = fs.appendFileSync;\n        } else {\n            // 文件不存在，根据 create 参数决定\n            if (!create) {\n                return createFileNotExistsError(filePath);\n            }\n            // create=true 时使用 writeFileSync 创建文件\n            writeMethod = fs.writeFileSync;\n        }\n    }\n\n    // 减少可能的重复校验\n    const filePathRes = validateAbsolutePath(filePath);\n    if (filePathRes.isErr()) return filePathRes.asErr();\n    filePath = filePathRes.unwrap();\n\n    // 使用 writeFileSync 时（文件不存在或非 append 模式）需要创建目录\n    if (create && writeMethod === fs.writeFileSync) {\n        const result = mkdirSync(dirname(filePath));\n        if (result.isErr()) return result;\n    }\n\n    const contentsRes = getWriteFileContents(contents);\n    if (contentsRes.isErr()) return contentsRes.asErr();\n\n    const { data, encoding } = contentsRes.unwrap();\n\n    return trySyncOp(() => writeMethod(filePath, data, encoding));\n}\n\n/**\n * `appendFile` 的同步版本。\n * @param filePath - 文件路径。\n * @param contents - 要追加的内容。\n * @param options - 可选的追加选项。\n * @returns 操作结果。\n */\nexport function appendFileSync(filePath: string, contents: WriteFileContent, options?: AppendOptions): VoidIOResult {\n    return writeFileSync(filePath, contents, {\n        append: true,\n        create: options?.create ?? true,\n    });\n}\n\n/**\n * `copy` 的同步版本。\n * @param srcPath - 源路径。\n * @param destPath - 目标路径。\n * @returns 操作结果。\n */\nexport function copySync(srcPath: string, destPath: string): VoidIOResult {\n    const destPathRes = validateAbsolutePath(destPath);\n    if (destPathRes.isErr()) return destPathRes.asErr();\n    destPath = destPathRes.unwrap();\n\n    const statRes = statSync(srcPath, {\n        recursive: true,\n    });\n    if (statRes.isErr()) return statRes.asErr();\n\n    // statSync 已经校验通过了\n    srcPath = validateAbsolutePath(srcPath).unwrap();\n\n    for (const { path, stats } of statRes.unwrap()) {\n        let copyRes: VoidIOResult;\n\n        if (!path) {\n            // 根目录或者文件\n            if (stats.isDirectory()) {\n                copyRes = mkdirSync(destPath);\n            } else {\n                const mkdirRes = mkdirSync(dirname(destPath));\n                copyRes = mkdirRes.andThen(() => {\n                    return copyFileSync(srcPath, destPath);\n                });\n            }\n        } else {\n            // 不能用join\n            const srcEntryPath = srcPath + SEPARATOR + path;\n            const destEntryPath = destPath + SEPARATOR + path;\n\n            copyRes = (stats.isDirectory()\n                ? mkdirSync(destEntryPath)\n                // 由于串行执行, 文件的父目录一定先于文件创建, 所以不需要额外 mkdir\n                : copyFileSync(srcEntryPath, destEntryPath));\n        }\n\n        if (copyRes.isErr()) return copyRes;\n    }\n\n    return RESULT_VOID;\n}\n\n/**\n * `exists` 的同步版本。\n * @param path - 文件或目录路径。\n * @param options - 检查选项。\n * @returns 是否存在。\n */\nexport function existsSync(path: string, options?: ExistsOptions): IOResult<boolean> {\n    const optionsRes = validateExistsOptions(options);\n    if (optionsRes.isErr()) return optionsRes.asErr();\n\n    const statRes = statSync(path);\n    return getExistsResult(statRes, options);\n}\n\n/**\n * `emptyDir` 的同步版本。\n * @param dirPath - 要清空的目录路径。\n * @returns 操作结果。\n */\nexport function emptyDirSync(dirPath: string): VoidIOResult {\n    const readDirRes = readDirSync(dirPath);\n    if (readDirRes.isErr()) {\n        // 不存在则创建\n        return isNotFoundError(readDirRes.unwrapErr())\n            ? mkdirSync(dirPath)\n            : readDirRes.asErr();\n    }\n\n    // readDirSync 已经校验通过了\n    dirPath = validateAbsolutePath(dirPath).unwrap();\n\n    for (const name of readDirRes.unwrap()) {\n        const removeRes = removeSync(dirPath + SEPARATOR + name);\n        if (removeRes.isErr()) return removeRes.asErr();\n    }\n\n    return RESULT_VOID;\n}\n\n/**\n * `readTextFile` 的同步版本。\n * @param filePath - 要读取的文件路径。\n * @returns 文件的文本内容。\n */\nexport function readTextFileSync(filePath: string): IOResult<string> {\n    return readFileSync(filePath, {\n        encoding: 'utf8',\n    });\n}\n\n/**\n * `readJsonFile` 的同步版本。\n * @param filePath - 要读取的 JSON 文件路径。\n * @returns 解析后的 JSON 对象。\n */\nexport function readJsonFileSync<T>(filePath: string): IOResult<T> {\n    const readFileRes = readTextFileSync(filePath);\n\n    return readFileRes.andThen(contents => {\n        return tryResult(JSON.parse, contents);\n    });\n}\n\n/**\n * `writeJsonFile` 的同步版本。\n * @param filePath - 要写入的文件路径。\n * @param data - 要序列化并写入的数据。\n * @returns 操作结果。\n */\nexport function writeJsonFileSync<T>(filePath: string, data: T): VoidIOResult {\n    const result = tryResult(JSON.stringify, data);\n\n    return result.andThen(text => writeFileSync(filePath, text));\n}\n\n/**\n * `unzip` 的同步版本。\n * @param zipFilePath - 要解压的 ZIP 文件路径。\n * @param destDir - 解压目标目录。\n * @returns 操作结果。\n */\nexport function unzipSync(zipFilePath: string, destDir: string): VoidIOResult {\n    const destDirRes = validateAbsolutePath(destDir);\n    if (destDirRes.isErr()) return destDirRes.asErr();\n    destDir = destDirRes.unwrap();\n\n    const readFileRes = readFileSync(zipFilePath);\n    if (readFileRes.isErr()) return readFileRes.asErr();\n    const bytes = readFileRes.unwrap();\n\n    const unzippedRes = tryResult(() => decompressSync(bytes));\n    if (unzippedRes.isErr()) return unzippedRes.asErr();\n    const unzipped = unzippedRes.unwrap();\n\n    for (const path in unzipped) {\n        if (path.at(-1) === SEPARATOR) {\n            // 文件夹\n            const mkdirRes = mkdirSync(destDir + SEPARATOR + path.slice(1));\n            if (mkdirRes.isErr()) return mkdirRes.asErr();\n        } else {\n            const writeFileRes = writeFileSync(destDir + SEPARATOR + path, unzipped[path] as Uint8Array<ArrayBuffer>);\n            if (writeFileRes.isErr()) return writeFileRes.asErr();\n        }\n    }\n\n    return RESULT_VOID;\n}\n\n/**\n * `zip` 的同步版本，返回压缩后的字节数组。\n * @param sourcePath - 要压缩的源路径。\n * @param options - 压缩选项。\n * @returns 压缩后的字节数组。\n */\nexport function zipSync(sourcePath: string, options?: ZipOptions): IOResult<Uint8Array<ArrayBuffer>>;\n/**\n * `zip` 的同步版本，将压缩结果写入指定文件。\n * @param sourcePath - 要压缩的源路径。\n * @param zipFilePath - ZIP 文件输出路径。\n * @param options - 压缩选项。\n * @returns 操作结果。\n */\nexport function zipSync(sourcePath: string, zipFilePath: string, options?: ZipOptions): VoidIOResult;\nexport function zipSync(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): ZipIOResult {\n    if (typeof zipFilePath === 'string') {\n        const zipFilePathRes = validateAbsolutePath(zipFilePath);\n        if (zipFilePathRes.isErr()) return zipFilePathRes.asErr();\n        zipFilePath = zipFilePathRes.unwrap();\n    } else {\n        options = zipFilePath;\n        zipFilePath = undefined;\n    }\n\n    const statRes = statSync(sourcePath, {\n        recursive: true,\n    });\n    if (statRes.isErr()) return statRes.asErr();\n    const statsArray = statRes.unwrap();\n\n    // statSync 已经校验通过了\n    sourcePath = validateAbsolutePath(sourcePath).unwrap();\n    const sourceName = basename(sourcePath);\n\n    const zippable: AsyncZippable = {};\n\n    if (statsArray.length === 1 && statsArray[0].stats.isFile()) {\n        // sourcePath 是文件\n        const readFileRes = readFileSync(sourcePath);\n        if (readFileRes.isErr()) return readFileRes;\n\n        zippable[sourceName] = readFileRes.unwrap();\n    } else {\n        // sourcePath 是目录\n        // 默认保留根目录\n        const preserveRoot = options?.preserveRoot ?? true;\n        if (preserveRoot) {\n            // 添加根目录条目\n            zippable[sourceName + SEPARATOR] = EMPTY_BYTES;\n        }\n\n        for (const { path, stats } of statsArray) {\n            // 这里就跳过根目录了\n            if (!path) continue;\n\n            const entryName = preserveRoot ? sourceName + SEPARATOR + path : path;\n\n            if (stats.isFile()) {\n                // 不能用 join，否则 http://usr 会变成 http:/usr\n                const readFileRes = readFileSync(sourcePath + SEPARATOR + path);\n                if (readFileRes.isErr()) return readFileRes;\n\n                zippable[entryName] = readFileRes.unwrap();\n            } else {\n                // 文件夹 - 添加带有尾部斜杠和空内容的条目\n                zippable[entryName + SEPARATOR] = EMPTY_BYTES;\n            }\n        }\n    }\n\n    // Nothing to zip - 和标准 zip 命令的行为一致\n    if (Object.keys(zippable).length === 0) {\n        return createNothingToZipError();\n    }\n\n    return tryResult(() => compressSync(zippable))\n        .andThen<Uint8Array<ArrayBuffer> | void>(bytesLike => {\n            const bytes = bytesLike as Uint8Array<ArrayBuffer>;\n            // 有文件路径则写入文件\n            return zipFilePath\n                ? writeFileSync(zipFilePath, bytes)\n                : Ok(bytes);\n        });\n}\n\n// #region Internal Functions\n\n/**\n * 安全地调用同步接口。\n */\nfunction trySyncOp<T>(op: () => T, errToResult: (err: Error) => IOResult<T> = fileErrorToResult): IOResult<T> {\n    return tryResult<T, Error>(op).orElse(errToResult);\n}\n\n/**\n * 复制单个文件。\n */\nfunction copyFileSync(srcPath: string, destPath: string): VoidIOResult {\n    return trySyncOp(() => getFs().copyFileSync(srcPath, destPath));\n}\n\n// #endregion\n","import {\n    appendFileSync as webAppendFileSync,\n    copySync as webCopySync,\n    emptyDirSync as webEmptyDirSync,\n    existsSync as webExistsSync,\n    mkdirSync as webMkdirSync,\n    moveSync as webMoveSync,\n    readFileSync as webReadFileSync,\n    readJsonFileSync as webReadJsonFileSync,\n    readTextFileSync as webReadTextFileSync,\n    removeSync as webRemoveSync,\n    unzipSync as webUnzipSync,\n    writeFileSync as webWriteFileSync,\n    writeJsonFileSync as webWriteJsonFileSync,\n    zipSync as webZipSync,\n    type AppendOptions,\n    type ExistsOptions,\n    type ZipOptions,\n} from 'happy-opfs';\nimport { type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport type { ReadFileContent, ReadOptions, StatOptions, WriteFileContent } from './fs_define.ts';\nimport {\n    appendFileSync as minaAppendFileSync,\n    copySync as minaCopySync,\n    emptyDirSync as minaEmptyDirSync,\n    existsSync as minaExistsSync,\n    mkdirSync as minaMkdirSync,\n    moveSync as minaMoveSync,\n    readDirSync as minaReadDirSync,\n    readFileSync as minaReadFileSync,\n    readJsonFileSync as minaReadJsonFileSync,\n    readTextFileSync as minaReadTextFileSync,\n    removeSync as minaRemoveSync,\n    statSync as minaStatSync,\n    unzipSync as minaUnzipSync,\n    writeFileSync as minaWriteFileSync,\n    writeJsonFileSync as minaWriteJsonFileSync,\n    zipSync as minaZipSync,\n} from './mina_fs_sync.ts';\nimport { webToMinaReadDirSync, webToMinaStatSync } from './web_fs_helpers.ts';\n\n/**\n * `mkdir` 的同步版本，递归创建文件夹。\n * @param dirPath - 将要创建的目录的路径。\n * @returns 创建成功返回的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = mkdirSync('/path/to/dir');\n * if (result.isOk()) {\n *     console.log('目录创建成功');\n * }\n * ```\n */\nexport function mkdirSync(dirPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaMkdirSync : webMkdirSync)(dirPath);\n}\n\n/**\n * `move` 的同步版本，移动或重命名文件或目录。\n * @param srcPath - 原始路径。\n * @param destPath - 新路径。\n * @returns 操作成功返回的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = moveSync('/old/path', '/new/path');\n * if (result.isOk()) {\n *     console.log('移动成功');\n * }\n * ```\n */\nexport function moveSync(srcPath: string, destPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaMoveSync : webMoveSync)(srcPath, destPath);\n}\n\n/**\n * `readDir` 的同步版本，读取指定目录下的所有文件和子目录。\n * @param dirPath - 需要读取的目录路径。\n * @returns 包含目录内容的字符串数组的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = readDirSync('/path/to/dir');\n * if (result.isOk()) {\n *     console.log(result.unwrap()); // ['file1.txt', 'file2.txt']\n * }\n * ```\n */\nexport function readDirSync(dirPath: string): IOResult<string[]> {\n    return (isMinaEnv() ? minaReadDirSync : webToMinaReadDirSync)(dirPath);\n}\n\n/**\n * 以 UTF-8 格式读取文件。\n * @param filePath - 文件路径。\n * @param options - 读取选项，指定编码为 'utf8'。\n * @returns 包含文件内容的字符串的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = readFileSync('/path/to/file.txt', { encoding: 'utf8' });\n * if (result.isOk()) {\n *     console.log(result.unwrap());\n * }\n * ```\n */\nexport function readFileSync(filePath: string, options: ReadOptions & {\n    encoding: 'utf8';\n}): IOResult<string>;\n\n/**\n * 以二进制格式读取文件。\n * @param filePath - 文件路径。\n * @param options - 读取选项，指定编码为 'bytes'。\n * @returns 包含文件内容的 Uint8Array<ArrayBuffer> 的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = readFileSync('/path/to/file.txt', { encoding: 'bytes' });\n * if (result.isOk()) {\n *     const bytes = result.unwrap();\n *     console.log(decodeUtf8(bytes));\n * }\n * ```\n */\nexport function readFileSync(filePath: string, options?: ReadOptions & {\n    encoding: 'bytes';\n}): IOResult<Uint8Array<ArrayBuffer>>;\n\n/**\n * `readFile` 的同步版本，读取文件内容。\n * @param filePath - 文件的路径。\n * @param options - 可选的读取选项。\n * @returns 包含文件内容的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = readFileSync('/path/to/file.txt');\n * if (result.isOk()) {\n *     const bytes = result.unwrap();\n *     console.log(decodeUtf8(bytes));\n * }\n * ```\n */\nexport function readFileSync(filePath: string, options?: ReadOptions): IOResult<ReadFileContent>;\nexport function readFileSync(filePath: string, options?: ReadOptions): IOResult<ReadFileContent> {\n    return isMinaEnv()\n        ? minaReadFileSync(filePath, options)\n        : webReadFileSync(filePath, options) as IOResult<ReadFileContent>;\n}\n\n/**\n * `remove` 的同步版本，删除文件或目录。\n * @param path - 要删除的文件或目录的路径。\n * @returns 删除成功返回的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = removeSync('/path/to/file.txt');\n * if (result.isOk()) {\n *     console.log('删除成功');\n * }\n * ```\n */\nexport function removeSync(path: string): VoidIOResult {\n    return (isMinaEnv() ? minaRemoveSync : webRemoveSync)(path);\n}\n\n/**\n * `stat` 的同步版本，获取文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @returns 包含状态信息的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = statSync('/path/to/file.txt');\n * if (result.isOk()) {\n *     console.log(result.unwrap().isFile()); // true\n * }\n * ```\n */\nexport function statSync(path: string, options?: StatOptions & {\n    recursive: false;\n}): IOResult<WechatMinigame.Stats>;\n/**\n * `stat` 的同步版本，递归获取目录下所有文件和子目录的状态信息。\n * @param path - 目录的路径。\n * @param options - 选项，recursive 设置为 true 时递归获取。\n * @returns 包含目录下所有文件状态信息数组的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = statSync('/path/to/dir', { recursive: true });\n * if (result.isOk()) {\n *     result.unwrap().forEach(item => {\n *         console.log(item.path, item.stats.isDirectory());\n *     });\n * }\n * ```\n */\nexport function statSync(path: string, options: StatOptions & {\n    recursive: true;\n}): IOResult<WechatMinigame.FileStats[]>;\n/**\n * `stat` 的同步版本，获取文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @param options - 可选选项，包含 recursive 可递归获取目录下所有文件状态。\n * @returns 包含状态信息的操作结果，根据 options.recursive 返回单个 Stats 或 FileStats 数组。\n * @since 1.1.0\n */\nexport function statSync(path: string, options?: StatOptions): IOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]>;\nexport function statSync(path: string, options?: StatOptions): IOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    return (isMinaEnv() ? minaStatSync : webToMinaStatSync)(path, options);\n}\n\n/**\n * `writeFile` 的同步版本，写入文件。\n * @param filePath - 文件路径。\n * @param contents - 要写入的内容。\n * @returns 写入成功返回的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = writeFileSync('/path/to/file.txt', 'Hello, World!');\n * if (result.isOk()) {\n *     console.log('写入成功');\n * }\n * ```\n */\nexport function writeFileSync(filePath: string, contents: WriteFileContent): VoidIOResult {\n    return (isMinaEnv() ? minaWriteFileSync : webWriteFileSync)(filePath, contents);\n}\n\n/**\n * `appendFile` 的同步版本，向文件追加内容。\n * @param filePath - 文件路径。\n * @param contents - 要追加的内容。\n * @param options - 可选的追加选项。\n * @returns 追加成功返回的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = appendFileSync('/path/to/file.txt', '\\nNew content');\n * if (result.isOk()) {\n *     console.log('追加成功');\n * }\n * ```\n */\nexport function appendFileSync(filePath: string, contents: WriteFileContent, options?: AppendOptions): VoidIOResult {\n    return (isMinaEnv() ? minaAppendFileSync : webAppendFileSync)(filePath, contents, options);\n}\n\n/**\n * `copy` 的同步版本，复制文件或文件夹。\n * @param srcPath - 源文件或文件夹路径。\n * @param destPath - 目标文件或文件夹路径。\n * @returns 操作的结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = copySync('/src/file.txt', '/dest/file.txt');\n * if (result.isOk()) {\n *     console.log('复制成功');\n * }\n * ```\n */\nexport function copySync(srcPath: string, destPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaCopySync : webCopySync)(srcPath, destPath);\n}\n\n/**\n * `exists` 的同步版本，检查指定路径的文件或目录是否存在。\n * @param path - 文件或目录的路径。\n * @param options - 可选的检查选项。\n * @returns 存在返回 true 的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = existsSync('/path/to/file.txt');\n * if (result.isOk() && result.unwrap()) {\n *     console.log('文件存在');\n * }\n * ```\n */\nexport function existsSync(path: string, options?: ExistsOptions): IOResult<boolean> {\n    return (isMinaEnv() ? minaExistsSync : webExistsSync)(path, options);\n}\n\n/**\n * `emptyDir` 的同步版本，清空指定目录下的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 清空成功返回的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = emptyDirSync('/path/to/dir');\n * if (result.isOk()) {\n *     console.log('目录已清空');\n * }\n * ```\n */\nexport function emptyDirSync(dirPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaEmptyDirSync : webEmptyDirSync)(dirPath);\n}\n\n/**\n * `readJsonFile` 的同步版本，读取 JSON 文件并解析为对象。\n * @typeParam T - JSON 解析后的类型。\n * @param filePath - 文件路径。\n * @returns 解析后的对象。\n * @since 1.6.0\n * @example\n * ```ts\n * const result = readJsonFileSync<{ name: string }>('/path/to/config.json');\n * if (result.isOk()) {\n *     console.log(result.unwrap().name);\n * }\n * ```\n */\nexport function readJsonFileSync<T>(filePath: string): IOResult<T> {\n    return (isMinaEnv() ? minaReadJsonFileSync : webReadJsonFileSync)(filePath);\n}\n\n/**\n * `readTextFile` 的同步版本，读取文本文件的内容。\n * @param filePath - 文件路径。\n * @returns 包含文件文本内容的操作结果。\n * @since 1.1.0\n * @example\n * ```ts\n * const result = readTextFileSync('/path/to/file.txt');\n * if (result.isOk()) {\n *     console.log(result.unwrap());\n * }\n * ```\n */\nexport function readTextFileSync(filePath: string): IOResult<string> {\n    return (isMinaEnv() ? minaReadTextFileSync : webReadTextFileSync)(filePath);\n}\n\n/**\n * `writeJsonFile` 的同步版本，将数据序列化为 JSON 并写入文件。\n * @typeParam T - 要写入数据的类型。\n * @param filePath - 文件路径。\n * @param data - 要写入的数据。\n * @returns 写入操作的结果。\n * @since 2.0.0\n * @example\n * ```ts\n * const result = writeJsonFileSync('/path/to/config.json', { name: 'test' });\n * if (result.isOk()) {\n *     console.log('写入成功');\n * }\n * ```\n */\nexport function writeJsonFileSync<T>(filePath: string, data: T): VoidIOResult {\n    return (isMinaEnv() ? minaWriteJsonFileSync : webWriteJsonFileSync)(filePath, data);\n}\n\n/**\n * `unzip` 的同步版本，解压 zip 文件。\n * @param zipFilePath - 要解压的 zip 文件路径。\n * @param targetPath - 要解压到的目标文件夹路径。\n * @returns 解压操作的结果。\n * @since 1.3.0\n * @example\n * ```ts\n * const result = unzipSync('/path/to/archive.zip', '/path/to/output');\n * if (result.isOk()) {\n *     console.log('解压成功');\n * }\n * ```\n */\nexport function unzipSync(zipFilePath: string, targetPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaUnzipSync : webUnzipSync)(zipFilePath, targetPath);\n}\n\n/**\n * 压缩文件或文件夹到内存。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩后的 Uint8Array。\n * @since 1.3.0\n * @example\n * ```ts\n * const result = zipSync('/path/to/source');\n * if (result.isOk()) {\n *     console.log('压缩成功:', result.unwrap().length, 'bytes');\n * }\n * ```\n */\nexport function zipSync(sourcePath: string, options?: ZipOptions): IOResult<Uint8Array<ArrayBuffer>>;\n/**\n * `zip` 的同步版本，压缩文件或文件夹。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param zipFilePath - 压缩后的 zip 文件路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩操作的结果。\n * @since 1.3.0\n * @example\n * ```ts\n * const result = zipSync('/path/to/source', '/path/to/archive.zip');\n * if (result.isOk()) {\n *     console.log('压缩成功');\n * }\n * ```\n */\nexport function zipSync(sourcePath: string, zipFilePath: string, options?: ZipOptions): VoidIOResult;\nexport function zipSync(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): IOResult<Uint8Array<ArrayBuffer> | void> {\n    if (typeof zipFilePath === 'string') {\n        return (isMinaEnv() ? minaZipSync : webZipSync)(sourcePath, zipFilePath, options);\n    } else {\n        return (isMinaEnv() ? minaZipSync : webZipSync)(sourcePath, zipFilePath);\n    }\n}\n","/**\n * Web/小游戏 平台的音频播放实现。\n */\n\nimport { Once, tryAsyncResult, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { readFile } from '../fs/mod.ts';\nimport { ASYNC_RESULT_VOID, bufferSourceToAb } from '../internal/mod.ts';\nimport type { PlayOptions } from './audio_defines.ts';\n\n// #region Internal Variables\n\n/**\n * 缓存的 AudioContext。\n */\nconst audioContext = Once<AudioContext>();\n\n// #endregion\n\n/**\n * 获取缓存的 AudioContext。\n * @returns 返回缓存的 AudioContext。\n * @since 1.5.0\n * @example\n * ```ts\n * const context = audio.getGlobalAudioContext();\n * ```\n */\nexport function getGlobalAudioContext(): AudioContext {\n    return audioContext.getOrInit(createWebAudioContext);\n}\n\n/**\n * 关闭缓存的 AudioContext。\n * @returns 返回一个 AsyncVoidIOResult。\n * @since 1.5.0\n * @example\n * ```ts\n * await audio.closeGlobalAudioContext();\n * ```\n */\nexport function closeGlobalAudioContext(): AsyncVoidIOResult {\n    if (!audioContext.isInitialized()) {\n        return ASYNC_RESULT_VOID;\n    }\n\n    // 重置 Once 以便下次重新创建\n    return tryAsyncResult(audioContext.take().unwrap().close());\n}\n\n/**\n * 创建一个 AudioContext。\n * 如果要获取缓存的实例，请使用 `getGlobalAudioContext`。\n * @returns 返回一个 AudioContext实例。\n * @since 1.5.0\n * @example\n * ```ts\n * const context = audio.createWebAudioContext();\n * ```\n */\nexport function createWebAudioContext(): AudioContext {\n    return isMinaEnv()\n        // 两者 API 基本兼容\n        ? (wx.createWebAudioContext() as unknown as AudioContext)\n        : new AudioContext();\n}\n\n/**\n * 播放一个 AudioBuffer。\n * @param buffer - 解码后的 AudioBuffer。\n * @param options - 播放选项。\n * @returns 正在播放的 AudioBufferSourceNode。\n * @since 1.5.0\n * @example\n * ```ts\n * const source = audio.playWebAudioFromAudioBuffer(audioBuffer, { loop: true });\n * ```\n */\nexport function playWebAudioFromAudioBuffer(buffer: AudioBuffer, options?: PlayOptions): AudioBufferSourceNode {\n    const {\n        loop = false,\n        autoDisconnect = true,\n    } = options ?? {};\n\n    const context = getGlobalAudioContext();\n    const source = context.createBufferSource();\n\n    source.buffer = buffer;\n    source.loop = loop;\n    source.connect(context.destination);\n\n    if (autoDisconnect) {\n        source.onended = () => {\n            source.disconnect();\n        };\n    }\n\n    source.start();\n\n    return source;\n}\n\n/**\n * 使用 Buffer 进行解码播放。\n * @param buffer - 需要解码的 Buffer。\n * @param options - 播放选项。\n * @returns 正在播放的 AudioBufferSourceNode。\n * @since 1.5.0\n * @example\n * ```ts\n * const result = await audio.playWebAudioFromBufferSource(buffer);\n * if (result.isOk()) {\n *     const source = result.unwrap();\n * }\n * ```\n */\nexport async function playWebAudioFromBufferSource(buffer: BufferSource, options?: PlayOptions): AsyncIOResult<AudioBufferSourceNode> {\n    const context = getGlobalAudioContext();\n    const audioBufferRes = await tryAsyncResult(() => context.decodeAudioData(bufferSourceToAb(buffer)));\n\n    return audioBufferRes.map(audioBuffer => playWebAudioFromAudioBuffer(audioBuffer, options));\n}\n\n/**\n * 读取文件并播放。\n * @param filePath - 文件路径。\n * @param options - 播放选项。\n * @returns 正在播放的 AudioBufferSourceNode。\n * @since 1.5.0\n * @example\n * ```ts\n * const result = await audio.playWebAudioFromFile('/path/to/audio.mp3');\n * if (result.isOk()) {\n *     const source = result.unwrap();\n * }\n * ```\n */\nexport async function playWebAudioFromFile(filePath: string, options?: PlayOptions): AsyncIOResult<AudioBufferSourceNode> {\n    const bufferRes = await readFile(filePath);\n\n    return bufferRes.andThenAsync(bytes => playWebAudioFromBufferSource(bytes.buffer, options));\n}\n","/**\n * @internal\n * 小游戏平台的剪贴板操作实现。\n */\n\nimport { RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { asyncIOResultify } from '../utils/mod.ts';\n\n/**\n * 异步写入文本数据到剪贴板。\n * @param data - 需要写入的文本数据。\n * @returns 写入操作的结果。\n */\nexport async function writeText(data: string): AsyncVoidIOResult {\n    const setRes = await asyncIOResultify(wx.setClipboardData)({\n        data,\n    });\n\n    return setRes.and(RESULT_VOID);\n}\n\n/**\n * 异步读取剪贴板文本数据。\n * @returns 读取操作的结果。\n */\nexport async function readText(): AsyncIOResult<string> {\n    const getRes = await asyncIOResultify(wx.getClipboardData)();\n\n    return getRes.map(x => x.data);\n}","/**\n * Web 平台的剪贴板操作实现。\n *\n * @internal\n */\n\nimport { tryAsyncResult, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\n\n/**\n * 异步写入文本数据到剪贴板。\n * @param data - 需要写入的文本数据。\n * @returns 写入操作的结果。\n */\nexport function writeText(data: string): AsyncVoidIOResult {\n    return tryAsyncResult(navigator.clipboard.writeText(data));\n}\n\n/**\n * 异步读取剪贴板文本数据。\n * @returns 读取操作的结果。\n */\nexport function readText(): AsyncIOResult<string> {\n    return tryAsyncResult(navigator.clipboard.readText());\n}","/**\n * 剪贴板操作模块，提供读取和写入剪贴板文本的功能。\n * @module clipboard\n */\nimport type { AsyncIOResult, AsyncVoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { validateString } from '../internal/mod.ts';\nimport { readText as minaReadText, writeText as minaWriteText } from './mina_clipboard.ts';\nimport { readText as webReadText, writeText as webWriteText } from './web_clipboard.ts';\n\n/**\n * 异步写入文本数据到剪贴板。\n * @param data - 需要写入的文本数据。\n * @returns 写入操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await writeText('Hello, World!');\n * if (result.isOk()) {\n *     console.log('文本已复制到剪贴板');\n * } else {\n *     console.error('复制失败:', result.unwrapErr());\n * }\n * ```\n */\nexport function writeText(data: string): AsyncVoidIOResult {\n    const dataRes = validateString(data, 'data');\n    if (dataRes.isErr()) return Promise.resolve(dataRes);\n\n    return (isMinaEnv() ? minaWriteText : webWriteText)(data);\n}\n\n/**\n * 异步读取剪贴板文本数据。\n * @returns 读取操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await readText();\n * if (result.isOk()) {\n *     console.log('剪贴板内容:', result.unwrap());\n * } else {\n *     console.error('读取失败:', result.unwrapErr());\n * }\n * ```\n */\nexport function readText(): AsyncIOResult<string> {\n    return (isMinaEnv() ? minaReadText : webReadText)();\n}","/**\n * 小游戏环境的 UTF-8 编解码\n *\n * @internal\n */\n\nimport { decodeUtf8 as webDecodeUtf8, encodeUtf8 as webEncodeUtf8 } from 'happy-codec';\nimport { bufferSourceToAb } from '../internal/mod.ts';\n\n// #region Internal Variables\n\nconst FORMAT = 'utf8' as const;\n\n// #endregion\n\n/**\n * 将字符串数据编码为 Uint8Array。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 Uint8Array。\n */\nexport function encodeUtf8(data: string): Uint8Array<ArrayBuffer> {\n    // 兼容某些平台没有 `encode` 方法\n    return typeof wx.encode === 'function'\n        ? new Uint8Array(\n            wx.encode({\n                data,\n                format: FORMAT,\n            }),\n        )\n        : webEncodeUtf8(data);\n}\n\n/**\n * 将 BufferSource 数据解码为字符串。\n *\n * 当 `options` 为默认值（`fatal = false` 且 `ignoreBOM = false`）时，优先使用 `wx.decode` 以获得更好的性能；\n * 否则回退到 `happy-codec` 实现以支持完整的 `TextDecoderOptions` 功能。\n *\n * @param data - 需要解码的 BufferSource。\n * @param options - 解码选项（可选）。\n * @param options.fatal - 如果为 `true`，遇到无效 UTF-8 序列会抛出异常；默认为 `false`，使用 U+FFFD 替换。\n * @param options.ignoreBOM - 如果为 `true`，保留 BOM；默认为 `false`，自动删除 BOM。\n * @returns 解码后的字符串。\n */\nexport function decodeUtf8(data: BufferSource, options?: TextDecoderOptions): string {\n    const {\n        fatal = false,\n        ignoreBOM = false,\n    } = options ?? {};\n\n    // `wx.decode` 的行为和 `fatal = false(不会报错) && ignoreBOM = false(丢弃BOM)` 的行为一致\n    // 兼容某些平台没有 `decode` 方法\n    if (!fatal && !ignoreBOM && typeof wx.decode === 'function') {\n        const ab = bufferSourceToAb(data);\n        return wx.decode({\n            data: ab,\n            format: FORMAT,\n        });\n    }\n\n    return webDecodeUtf8(data, options);\n}\n","/**\n * Codec 模块：提供各种编码/解码功能。\n * 除了 UTF-8 编码/解码功能外，其余编码/解码功能直接从 `happy-codec` 包中导出。\n *\n * @module codec\n */\n\nimport { decodeUtf8 as webDecodeUtf8, encodeUtf8 as webEncodeUtf8 } from 'happy-codec';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { decodeUtf8 as minaDecodeUtf8, encodeUtf8 as minaEncodeUtf8 } from './mina_utf8.ts';\n\nexport { decodeBase64, decodeByteString, decodeHex, encodeBase64, encodeByteString, encodeHex, type DecodeBase64Options, type EncodeBase64Options } from 'happy-codec';\n\n/**\n * 将字符串数据编码为 `Uint8Array`（UTF-8 编码）。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 `Uint8Array`。\n * @since 1.0.0\n * @example\n * ```ts\n * const encoded = encodeUtf8('你好');\n * console.log(encoded); // Uint8Array [228, 189, 160, 229, 165, 189]\n * ```\n */\nexport function encodeUtf8(data: string): Uint8Array<ArrayBuffer> {\n    return (isMinaEnv() ? minaEncodeUtf8 : webEncodeUtf8)(data);\n}\n\n/**\n * 将二进制数据解码为字符串（UTF-8 解码）。\n * @param data - 需要解码的二进制数据。\n * @param options - 解码选项（可选）。\n * @param options.fatal - 如果为 `true`，遇到无效的 UTF-8 序列会抛出异常；如果为 `false`（默认），使用替换字符 U+FFFD 代替。\n * @param options.ignoreBOM - 如果为 `true`，保留字节顺序标记（BOM）；如果为 `false`（默认），自动删除 BOM。\n * @returns 解码后的字符串。\n * @throws {TypeError} 当 `options.fatal` 为 `true` 且输入包含无效的 UTF-8 序列时。\n * @since 1.0.0\n * @example\n * ```ts\n * // 基本用法\n * const decoded = decodeUtf8(new Uint8Array([228, 189, 160, 229, 165, 189]));\n * console.log(decoded); // '你好'\n *\n * // 使用 fatal 选项处理无效字节\n * const withReplacement = decodeUtf8(new Uint8Array([0xff, 0xfe]));\n * console.log(withReplacement); // '��'（使用替换字符）\n *\n * // 使用 ignoreBOM 选项保留 BOM\n * const withBOM = new Uint8Array([0xef, 0xbb, 0xbf, 0x48, 0x69]); // BOM + 'Hi'\n * decodeUtf8(withBOM); // 'Hi'（删除 BOM）\n * decodeUtf8(withBOM, { ignoreBOM: true }); // '\\uFEFFHi'（保留 BOM）\n * ```\n */\nexport function decodeUtf8(data: BufferSource, options?: TextDecoderOptions): string {\n    return (isMinaEnv() ? minaDecodeUtf8 : webDecodeUtf8)(data, options);\n}\n","/**\n * @internal\n * 基于哈希的消息认证码实现。需要一个消息摘要对象，\n * 例如可以从 forge.md.sha1 或 forge.md.md5 获取。\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2012 Digital Bazaar, Inc. All rights reserved.\n */\n\nimport { tryAsyncResult, type AsyncIOResult } from 'happy-rusty';\nimport { ByteStringBuffer, sha1, sha256, sha384, sha512, type HashAlgorithmCreator } from 'rsa-oaep-encryption';\nimport { encodeByteString } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { SHA } from '../crypto_defines.ts';\n\n/**\n * 创建一个使用指定消息摘要对象的 HMAC 对象。\n *\n * @param sha - SHA 哈希算法。\n * @param key - 密钥，可以是字符串或 BufferSource。\n * @param data - 需要计算 HMAC 的数据，可以是字符串或 BufferSource。\n * @returns HMAC 计算结果的十六进制字符串。\n */\nexport function createHMAC(sha: SHA, key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return tryAsyncResult(() => {\n        let shaAlgorithmCreator: HashAlgorithmCreator;\n\n        switch (sha) {\n            case 'SHA-1': {\n                shaAlgorithmCreator = sha1;\n                break;\n            }\n            case 'SHA-256': {\n                shaAlgorithmCreator = sha256;\n                break;\n            }\n            case 'SHA-384': {\n                shaAlgorithmCreator = sha384;\n                break;\n            }\n            case 'SHA-512': {\n                shaAlgorithmCreator = sha512;\n                break;\n            }\n        }\n\n        const shaAlgorithm = shaAlgorithmCreator.create();\n\n        let keyBuffer = new ByteStringBuffer(encodeByteString(key));\n\n        // 如果密钥长度超过 blocksize，则对其进行哈希\n        let keylen = keyBuffer.length();\n        if (keylen > shaAlgorithm.blockLength) {\n            shaAlgorithm.start();\n            shaAlgorithm.update(keyBuffer.bytes());\n            keyBuffer = shaAlgorithm.digest();\n        }\n\n        // 将密钥混合到内部和外部填充中\n        // ipadding = [0x36 * blocksize] ^ key\n        // opadding = [0x5C * blocksize] ^ key\n        const ipadding = new ByteStringBuffer();\n        const opadding = new ByteStringBuffer();\n\n        keylen = keyBuffer.length();\n        for (let i = 0; i < keylen; ++i) {\n            const tmp = keyBuffer.at(i);\n            ipadding.putByte(0x36 ^ tmp);\n            opadding.putByte(0x5c ^ tmp);\n        }\n\n        // 如果密钥短于 blocksize，添加额外的填充\n        if (keylen < shaAlgorithm.blockLength) {\n            const tmp = shaAlgorithm.blockLength - keylen;\n            for (let i = 0; i < tmp; ++i) {\n                ipadding.putByte(0x36);\n                opadding.putByte(0x5c);\n            }\n        }\n\n        // 摘要计算方式如下: hash(opadding | hash(ipadding | message))\n\n        // 准备进行内部哈希\n        // hash(ipadding | message)\n        shaAlgorithm.start();\n        shaAlgorithm.update(ipadding.bytes());\n\n        // 更新消息\n        shaAlgorithm.update(encodeByteString(data));\n\n        // 计算最终摘要: hash(opadding | hash(ipadding | message))\n        const inner = shaAlgorithm.digest().bytes();\n        shaAlgorithm.start();\n        shaAlgorithm.update(opadding.bytes());\n        shaAlgorithm.update(inner);\n\n        return shaAlgorithm.digest().toHex();\n    });\n}\n","/**\n * @internal\n * 内部使用的编解码辅助函数。\n */\n\nimport type { DataSource } from '../defines.ts';\nimport { bufferSourceToBytes } from '../internal/mod.ts';\nimport { encodeUtf8 } from './mod.ts';\n\n/**\n * 将 DataSource 转换为 Uint8Array。\n * - 字符串：先 UTF-8 编码\n * - BufferSource：转换为 Uint8Array\n * @param data - 需要转换的数据。\n * @returns 转换后的 `Uint8Array`。\n */\nexport function dataSourceToBytes(data: DataSource): Uint8Array<ArrayBuffer> {\n    return typeof data === 'string'\n        ? encodeUtf8(data)\n        : bufferSourceToBytes(data);\n}\n","/**\n * @internal\n * Web 平台的 HMAC 实现。\n */\n\nimport { tryAsyncResult, type AsyncIOResult } from 'happy-rusty';\nimport { dataSourceToBytes } from '../../codec/helpers.ts';\nimport { encodeHex } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { SHA } from '../crypto_defines.ts';\n\n/**\n * 使用 Web Crypto API 创建 HMAC。\n * @param hash - SHA 哈希算法。\n * @param key - 密钥，可以是字符串或 BufferSource。\n * @param data - 需要计算 HMAC 的数据，可以是字符串或 BufferSource。\n * @returns HMAC 计算结果的十六进制字符串。\n */\nexport function createHMAC(hash: SHA, key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return tryAsyncResult(async () => {\n        const encodedKey = dataSourceToBytes(key);\n        const encodedData = dataSourceToBytes(data);\n\n        // 导入密钥\n        const cryptoKey = await crypto.subtle.importKey(\n            'raw', // 密钥格式\n            encodedKey, // 密钥数据\n            { name: 'HMAC', hash: { name: hash } }, // 算法\n            false, // 是否可导出\n            ['sign'], // 用途\n        );\n\n        // 生成 HMAC\n        const hashBuffer = await crypto.subtle.sign(\n            'HMAC', // 算法\n            cryptoKey, // 密钥\n            encodedData, // 消息\n        );\n\n        return encodeHex(hashBuffer);\n    });\n}","import type { AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../../macros/env.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { SHA } from '../crypto_defines.ts';\nimport { createHMAC as pureCreateHMAC } from './hmac.ts';\nimport { createHMAC as webCreateHMAC } from './web_hmac.ts';\n\n/**\n * 使用 SHA-1 算法计算 HMAC。\n * @param key - 密钥，可以是字符串或 BufferSource。\n * @param data - 需要计算 HMAC 的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的 HMAC 字符串。\n * @since 1.8.0\n * @example\n * ```ts\n * const hmac = (await sha1HMAC('secret-key', 'Hello, World!')).unwrap();\n * console.log(hmac); // 十六进制 HMAC 字符串\n * ```\n */\nexport function sha1HMAC(key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return shaHMAC('SHA-1', key, data);\n}\n\n/**\n * 使用 SHA-256 算法计算 HMAC。\n * @param key - 密钥，可以是字符串或 BufferSource。\n * @param data - 需要计算 HMAC 的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的 HMAC 字符串。\n * @since 1.8.0\n * @example\n * ```ts\n * const hmac = (await sha256HMAC('secret-key', 'Hello, World!')).unwrap();\n * console.log(hmac); // 十六进制 HMAC 字符串\n * ```\n */\nexport function sha256HMAC(key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return shaHMAC('SHA-256', key, data);\n}\n\n/**\n * 使用 SHA-384 算法计算 HMAC。\n * @param key - 密钥，可以是字符串或 BufferSource。\n * @param data - 需要计算 HMAC 的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的 HMAC 字符串。\n * @since 1.8.0\n * @example\n * ```ts\n * const hmac = (await sha384HMAC('secret-key', 'Hello, World!')).unwrap();\n * console.log(hmac); // 十六进制 HMAC 字符串\n * ```\n */\nexport function sha384HMAC(key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return shaHMAC('SHA-384', key, data);\n}\n\n/**\n * 使用 SHA-512 算法计算 HMAC。\n * @param key - 密钥，可以是字符串或 BufferSource。\n * @param data - 需要计算 HMAC 的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的 HMAC 字符串。\n * @since 1.8.0\n * @example\n * ```ts\n * const hmac = (await sha512HMAC('secret-key', 'Hello, World!')).unwrap();\n * console.log(hmac); // 十六进制 HMAC 字符串\n * ```\n */\nexport function sha512HMAC(key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return shaHMAC('SHA-512', key, data);\n}\n\n// #region Internal Functions\n\n/**\n * 使用指定 SHA 算法计算 HMAC。\n */\nfunction shaHMAC(sha: SHA, key: DataSource, data: DataSource): AsyncIOResult<string> {\n    return (isMinaEnv() ? pureCreateHMAC : webCreateHMAC)(sha, key, data);\n}\n\n// #endregion\n","// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\n/**\n * Forked from https://github.com/denoland/std/blob/0.160.0/hash/md5.ts\n */\n\nimport { dataSourceToBytes } from '../../codec/helpers.ts';\nimport { encodeHex } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\n\n// #region Internal Variables\n\nconst BLOCK_SIZE = 64 as const;\n\n// #endregion\n\n/**\n * MD5 哈希计算类，支持流式更新。\n * @since 1.0.0\n * @example\n * ```ts\n * // 基本用法\n * const hash = new Md5().update('Hello, World!').toString();\n * console.log(hash); // '65a8e27d8879283831b664bd8b7f0ad4'\n *\n * // 流式更新\n * const md5 = new Md5();\n * md5.update('Hello, ');\n * md5.update('World!');\n * console.log(md5.toString()); // '65a8e27d8879283831b664bd8b7f0ad4'\n *\n * // 获取 ArrayBuffer\n * const buffer = new Md5().update('test').digest();\n * ```\n */\nexport class Md5 {\n    private a = 0x67452301;\n    private b = 0xefcdab89;\n    private c = 0x98badcfe;\n    private d = 0x10325476;\n    private block = new Uint8Array(BLOCK_SIZE);\n    private pos = 0;\n    private n0 = 0;\n    private n1 = 0;\n\n    /**\n     * 累加已处理的消息长度。\n     *\n     * n0 和 n1 共同组成一个 64 位计数器，用于记录消息的总字节数。\n     * - n0: 低 32 位\n     * - n1: 高 32 位\n     *\n     * 当 n0 溢出（超过 0xffffffff，即 2^32 - 1）时，需要向 n1 进位。\n     *\n     * @param len - 本次处理的字节数\n     */\n    private addLength(len: number): void {\n        let n0 = this.n0;\n        n0 += len;\n        /*\n         * v8 ignore: 此分支仅在处理超过 4GB（2^32 字节）数据时触发。\n         * 在常规测试环境中无法覆盖此边界条件，故排除在覆盖率统计之外。\n         */\n        /* v8 ignore start */\n        if (n0 > 0xffffffff) this.n1 += 1;\n        /* v8 ignore stop */\n        this.n0 = n0 >>> 0;\n    }\n\n    private hash(block: Uint8Array): void {\n        let a = this.a;\n        let b = this.b;\n        let c = this.c;\n        let d = this.d;\n\n        const blk = (i: number): number =>\n            block[i] |\n            (block[i + 1] << 8) |\n            (block[i + 2] << 16) |\n            (block[i + 3] << 24);\n\n        const rol32 = (x: number, n: number): number => (x << n) | (x >>> (32 - n));\n\n        const x0 = blk(0);\n        const x1 = blk(4);\n        const x2 = blk(8);\n        const x3 = blk(12);\n        const x4 = blk(16);\n        const x5 = blk(20);\n        const x6 = blk(24);\n        const x7 = blk(28);\n        const x8 = blk(32);\n        const x9 = blk(36);\n        const xa = blk(40);\n        const xb = blk(44);\n        const xc = blk(48);\n        const xd = blk(52);\n        const xe = blk(56);\n        const xf = blk(60);\n\n        // 第 1 轮\n        a = b + rol32((((c ^ d) & b) ^ d) + a + x0 + 0xd76aa478, 7);\n        d = a + rol32((((b ^ c) & a) ^ c) + d + x1 + 0xe8c7b756, 12);\n        c = d + rol32((((a ^ b) & d) ^ b) + c + x2 + 0x242070db, 17);\n        b = c + rol32((((d ^ a) & c) ^ a) + b + x3 + 0xc1bdceee, 22);\n        a = b + rol32((((c ^ d) & b) ^ d) + a + x4 + 0xf57c0faf, 7);\n        d = a + rol32((((b ^ c) & a) ^ c) + d + x5 + 0x4787c62a, 12);\n        c = d + rol32((((a ^ b) & d) ^ b) + c + x6 + 0xa8304613, 17);\n        b = c + rol32((((d ^ a) & c) ^ a) + b + x7 + 0xfd469501, 22);\n        a = b + rol32((((c ^ d) & b) ^ d) + a + x8 + 0x698098d8, 7);\n        d = a + rol32((((b ^ c) & a) ^ c) + d + x9 + 0x8b44f7af, 12);\n        c = d + rol32((((a ^ b) & d) ^ b) + c + xa + 0xffff5bb1, 17);\n        b = c + rol32((((d ^ a) & c) ^ a) + b + xb + 0x895cd7be, 22);\n        a = b + rol32((((c ^ d) & b) ^ d) + a + xc + 0x6b901122, 7);\n        d = a + rol32((((b ^ c) & a) ^ c) + d + xd + 0xfd987193, 12);\n        c = d + rol32((((a ^ b) & d) ^ b) + c + xe + 0xa679438e, 17);\n        b = c + rol32((((d ^ a) & c) ^ a) + b + xf + 0x49b40821, 22);\n\n        // 第 2 轮\n        a = b + rol32((((b ^ c) & d) ^ c) + a + x1 + 0xf61e2562, 5);\n        d = a + rol32((((a ^ b) & c) ^ b) + d + x6 + 0xc040b340, 9);\n        c = d + rol32((((d ^ a) & b) ^ a) + c + xb + 0x265e5a51, 14);\n        b = c + rol32((((c ^ d) & a) ^ d) + b + x0 + 0xe9b6c7aa, 20);\n        a = b + rol32((((b ^ c) & d) ^ c) + a + x5 + 0xd62f105d, 5);\n        d = a + rol32((((a ^ b) & c) ^ b) + d + xa + 0x02441453, 9);\n        c = d + rol32((((d ^ a) & b) ^ a) + c + xf + 0xd8a1e681, 14);\n        b = c + rol32((((c ^ d) & a) ^ d) + b + x4 + 0xe7d3fbc8, 20);\n        a = b + rol32((((b ^ c) & d) ^ c) + a + x9 + 0x21e1cde6, 5);\n        d = a + rol32((((a ^ b) & c) ^ b) + d + xe + 0xc33707d6, 9);\n        c = d + rol32((((d ^ a) & b) ^ a) + c + x3 + 0xf4d50d87, 14);\n        b = c + rol32((((c ^ d) & a) ^ d) + b + x8 + 0x455a14ed, 20);\n        a = b + rol32((((b ^ c) & d) ^ c) + a + xd + 0xa9e3e905, 5);\n        d = a + rol32((((a ^ b) & c) ^ b) + d + x2 + 0xfcefa3f8, 9);\n        c = d + rol32((((d ^ a) & b) ^ a) + c + x7 + 0x676f02d9, 14);\n        b = c + rol32((((c ^ d) & a) ^ d) + b + xc + 0x8d2a4c8a, 20);\n\n        // 第 3 轮\n        a = b + rol32((b ^ c ^ d) + a + x5 + 0xfffa3942, 4);\n        d = a + rol32((a ^ b ^ c) + d + x8 + 0x8771f681, 11);\n        c = d + rol32((d ^ a ^ b) + c + xb + 0x6d9d6122, 16);\n        b = c + rol32((c ^ d ^ a) + b + xe + 0xfde5380c, 23);\n        a = b + rol32((b ^ c ^ d) + a + x1 + 0xa4beea44, 4);\n        d = a + rol32((a ^ b ^ c) + d + x4 + 0x4bdecfa9, 11);\n        c = d + rol32((d ^ a ^ b) + c + x7 + 0xf6bb4b60, 16);\n        b = c + rol32((c ^ d ^ a) + b + xa + 0xbebfbc70, 23);\n        a = b + rol32((b ^ c ^ d) + a + xd + 0x289b7ec6, 4);\n        d = a + rol32((a ^ b ^ c) + d + x0 + 0xeaa127fa, 11);\n        c = d + rol32((d ^ a ^ b) + c + x3 + 0xd4ef3085, 16);\n        b = c + rol32((c ^ d ^ a) + b + x6 + 0x04881d05, 23);\n        a = b + rol32((b ^ c ^ d) + a + x9 + 0xd9d4d039, 4);\n        d = a + rol32((a ^ b ^ c) + d + xc + 0xe6db99e5, 11);\n        c = d + rol32((d ^ a ^ b) + c + xf + 0x1fa27cf8, 16);\n        b = c + rol32((c ^ d ^ a) + b + x2 + 0xc4ac5665, 23);\n\n        // 第 4 轮\n        a = b + rol32((c ^ (b | ~d)) + a + x0 + 0xf4292244, 6);\n        d = a + rol32((b ^ (a | ~c)) + d + x7 + 0x432aff97, 10);\n        c = d + rol32((a ^ (d | ~b)) + c + xe + 0xab9423a7, 15);\n        b = c + rol32((d ^ (c | ~a)) + b + x5 + 0xfc93a039, 21);\n        a = b + rol32((c ^ (b | ~d)) + a + xc + 0x655b59c3, 6);\n        d = a + rol32((b ^ (a | ~c)) + d + x3 + 0x8f0ccc92, 10);\n        c = d + rol32((a ^ (d | ~b)) + c + xa + 0xffeff47d, 15);\n        b = c + rol32((d ^ (c | ~a)) + b + x1 + 0x85845dd1, 21);\n        a = b + rol32((c ^ (b | ~d)) + a + x8 + 0x6fa87e4f, 6);\n        d = a + rol32((b ^ (a | ~c)) + d + xf + 0xfe2ce6e0, 10);\n        c = d + rol32((a ^ (d | ~b)) + c + x6 + 0xa3014314, 15);\n        b = c + rol32((d ^ (c | ~a)) + b + xd + 0x4e0811a1, 21);\n        a = b + rol32((c ^ (b | ~d)) + a + x4 + 0xf7537e82, 6);\n        d = a + rol32((b ^ (a | ~c)) + d + xb + 0xbd3af235, 10);\n        c = d + rol32((a ^ (d | ~b)) + c + x2 + 0x2ad7d2bb, 15);\n        b = c + rol32((d ^ (c | ~a)) + b + x9 + 0xeb86d391, 21);\n\n        this.a = (this.a + a) >>> 0;\n        this.b = (this.b + b) >>> 0;\n        this.c = (this.c + c) >>> 0;\n        this.d = (this.d + d) >>> 0;\n    }\n\n    /**\n     * 更新内部状态。\n     * @param data - 要更新的数据，数据大小不能超过 2^32 字节。\n     */\n    update(data: DataSource): this {\n        const msg = dataSourceToBytes(data);\n\n        let pos = this.pos;\n        const free = BLOCK_SIZE - pos;\n\n        if (msg.length < free) {\n            this.block.set(msg, pos);\n            pos += msg.length;\n        } else {\n            // 哈希第一个块\n            this.block.set(msg.slice(0, free), pos);\n            this.hash(this.block);\n\n            // 哈希尽可能多的块\n            let i = free;\n            while (i + BLOCK_SIZE <= msg.length) {\n                this.hash(msg.slice(i, i + BLOCK_SIZE));\n                i += BLOCK_SIZE;\n            }\n\n            // 存储剩余数据\n            this.block.fill(0).set(msg.slice(i), 0);\n            pos = msg.length - i;\n        }\n\n        this.pos = pos;\n        this.addLength(msg.length);\n\n        return this;\n    }\n\n    /**\n     * 返回最终的哈希值。\n     */\n    digest(): ArrayBuffer {\n        let padLen = BLOCK_SIZE - this.pos;\n        if (padLen < 9) padLen += BLOCK_SIZE;\n\n        const pad = new Uint8Array(padLen);\n\n        pad[0] = 0x80;\n\n        const n0 = this.n0 << 3;\n        const n1 = (this.n1 << 3) | (this.n0 >>> 29);\n        pad[pad.length - 8] = n0 & 0xff;\n        pad[pad.length - 7] = (n0 >>> 8) & 0xff;\n        pad[pad.length - 6] = (n0 >>> 16) & 0xff;\n        pad[pad.length - 5] = (n0 >>> 24) & 0xff;\n        pad[pad.length - 4] = n1 & 0xff;\n        pad[pad.length - 3] = (n1 >>> 8) & 0xff;\n        pad[pad.length - 2] = (n1 >>> 16) & 0xff;\n        pad[pad.length - 1] = (n1 >>> 24) & 0xff;\n\n        this.update(pad.buffer);\n\n        const hash = new ArrayBuffer(16);\n        const hashView = new DataView(hash);\n        hashView.setUint32(0, this.a, true);\n        hashView.setUint32(4, this.b, true);\n        hashView.setUint32(8, this.c, true);\n        hashView.setUint32(12, this.d, true);\n\n        return hash;\n    }\n\n    /**\n     * 以十六进制字符串形式返回哈希值。\n     */\n    toString(): string {\n        return encodeHex(this.digest());\n    }\n}","import type { DataSource } from '../../defines.ts';\nimport { Md5 } from './md5.ts';\n\nexport { Md5 } from './md5.ts';\n\n/**\n * 计算字符串或 Buffer 的 MD5 值。\n * @param data - 需要计算 MD5 值的数据，可以是字符串或 BufferSource。\n * @returns 计算得到的 MD5 十六进制字符串（32 位）。\n * @since 1.0.0\n * @example\n * ```ts\n * const hash = md5('Hello, World!');\n * console.log(hash); // '65a8e27d8879283831b664bd8b7f0ad4'\n * ```\n */\nexport function md5(data: DataSource): string {\n    return new Md5().update(data).toString();\n}","/**\n * @internal\n * 小游戏平台的随机数生成实现。\n */\n\nimport { Lazy, type AsyncIOResult } from 'happy-rusty';\nimport { encodeHex } from '../../codec/mod.ts';\nimport { asyncIOResultify } from '../../utils/mod.ts';\nimport type { UUID } from './random_defines.ts';\n\n/**\n * 缓存加密模块。\n */\nconst cryptoManager = Lazy(() => wx.getUserCryptoManager());\n\n/**\n * 生成指定长度的加密随机字节数组。\n * @param length - 要生成的随机字节数。\n * @returns 返回包含随机字节的 Uint8Array。\n */\nexport async function getRandomValues(length: number): AsyncIOResult<Uint8Array<ArrayBuffer>> {\n    const result = await asyncIOResultify(cryptoManager.force().getRandomValues)({\n        length,\n    });\n\n    return result.map(x => new Uint8Array(x.randomValues));\n}\n\n/**\n * 生成符合 RFC 4122 规范的 UUID v4。\n * @returns 返回生成的 UUID 字符串。\n */\nexport async function randomUUID(): AsyncIOResult<UUID> {\n    const bytesRes = await getRandomValues(16);\n\n    return bytesRes.map<UUID>(bytes => {\n        // 设置版本号（4）和变体（8, 9, A, B）\n        bytes[6] = (bytes[6] & 0x0f) | 0x40; // 0100xxxx\n        bytes[8] = (bytes[8] & 0x3f) | 0x80; // 10xxxxxx\n\n        const hex = encodeHex(bytes);\n        return `${ hex.slice(0, 8) }-${ hex.slice(8, 12) }-${ hex.slice(12, 16) }-${ hex.slice(16, 20) }-${ hex.slice(20) }`;\n    });\n}","/**\n * @internal\n * Web 平台的随机数生成实现。\n */\n\nimport { tryResult, type IOResult } from 'happy-rusty';\nimport type { UUID } from './random_defines.ts';\n\n/**\n * 生成指定长度的加密随机字节数组。\n * @param length - 要生成的随机字节数。\n * @returns 返回包含随机字节的 Uint8Array。\n */\nexport function getRandomValues(length: number): IOResult<Uint8Array<ArrayBuffer>> {\n    const bytes = new Uint8Array(length);\n\n    return tryResult(() => crypto.getRandomValues(bytes));\n}\n\n/**\n * 生成符合 RFC 4122 规范的 UUID v4。\n * @returns 返回生成的 UUID 字符串。\n */\nexport function randomUUID(): UUID {\n    return crypto.randomUUID();\n}","import { Ok, type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../../macros/env.ts';\nimport { validatePositiveInteger } from '../../internal/mod.ts';\nimport {\n    getRandomValues as minaGetRandomValues,\n    randomUUID as minaRandomUUID,\n} from './mina_random.ts';\nimport type { UUID } from './random_defines.ts';\nimport {\n    getRandomValues as webGetRandomValues,\n    randomUUID as webRandomUUID,\n} from './web_random.ts';\n\nexport * from './random_defines.ts';\n\n/**\n * 获取密码学安全的随机数。\n * @param length - 要生成的随机字节数。\n * @returns 包含随机数据的 Uint8Array，封装在 IOResult 中。\n * @since 1.7.0\n * @example\n * ```ts\n * const result = await getRandomValues(16);\n * if (result.isOk()) {\n *     console.log(result.unwrap()); // Uint8Array(16) [...]\n * }\n * ```\n */\nexport function getRandomValues(length: number): AsyncIOResult<Uint8Array<ArrayBuffer>> {\n    const validateResult = validatePositiveInteger(length, 'length');\n    if (validateResult.isErr()) {\n        return Promise.resolve(validateResult.asErr());\n    }\n\n    return isMinaEnv()\n        ? minaGetRandomValues(length)\n        : Promise.resolve(webGetRandomValues(length));\n}\n\n/**\n * 生成符合 RFC 4122 标准的 UUID v4。\n * @returns UUID 字符串，封装在 IOResult 中。\n * @since 1.7.0\n * @example\n * ```ts\n * const result = await randomUUID();\n * if (result.isOk()) {\n *     console.log(result.unwrap()); // 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n * }\n * ```\n */\nexport function randomUUID(): AsyncIOResult<UUID> {\n    return isMinaEnv()\n        ? minaRandomUUID()\n        : Promise.resolve(Ok(webRandomUUID()));\n}","/**\n * @internal\n * 小游戏平台的 RSA 加密实现。\n */\n\nimport { Ok, tryResult, type AsyncIOResult, type IOResult } from 'happy-rusty';\nimport { importPublicKey as importKey, sha1, sha256, sha384, sha512 } from 'rsa-oaep-encryption';\nimport { decodeUtf8, encodeBase64 } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { RSAPublicKey, SHA } from '../crypto_defines.ts';\n\n/**\n * 从 PEM 编码的字符串导入用于加密的公钥。\n * @param pem - PEM 编码的字符串。\n * @param hash - 哈希算法。\n * @returns RSA 公钥对象。\n */\nexport function importPublicKey(pem: string, hash: SHA): AsyncIOResult<RSAPublicKey> {\n    const publicKeyRes = tryResult(() => importKey(pem));\n    if (publicKeyRes.isErr()) return Promise.resolve(publicKeyRes.asErr());\n\n    const shaFactory = getShaFactory(hash);\n    const publicKey = publicKeyRes.unwrap();\n\n    const encrypt = (data: DataSource): IOResult<ArrayBuffer> => {\n        return tryResult(() => {\n            const decodedData = typeof data === 'string'\n                ? data\n                // 可能抛异常\n                : decodeUtf8(data);\n            return publicKey.encrypt(decodedData, shaFactory.create());\n        });\n    };\n\n    return Promise.resolve(Ok({\n        encrypt(data: DataSource): AsyncIOResult<ArrayBuffer> {\n            return Promise.resolve(encrypt(data));\n        },\n\n        encryptToString(data: DataSource): AsyncIOResult<string> {\n            return Promise.resolve(encrypt(data).map(encodeBase64));\n        },\n    }));\n}\n\n// #region Internal Functions\n\n/**\n * 根据算法名称获取 SHA 哈希工厂。\n */\nfunction getShaFactory(hash: SHA): typeof sha1 {\n    switch (hash) {\n        case 'SHA-1': {\n            return sha1;\n        }\n        case 'SHA-256': {\n            return sha256;\n        }\n        case 'SHA-384': {\n            return sha384;\n        }\n        case 'SHA-512': {\n            return sha512;\n        }\n    }\n}\n\n// #endregion","/**\n * @internal\n * Web 平台的 RSA 加密实现。\n */\n\nimport { Err, tryAsyncResult, type AsyncIOResult } from 'happy-rusty';\nimport { dataSourceToBytes } from '../../codec/helpers.ts';\nimport { decodeByteString, encodeBase64 } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { RSAPublicKey, SHA } from '../crypto_defines.ts';\n\n/**\n * 从 PEM 编码的字符串导入用于加密的公钥。\n * @param pem - PEM 编码的字符串。\n * @param hash - 哈希算法。\n * @returns RSA 公钥对象。\n */\nexport function importPublicKey(pem: string, hash: SHA): AsyncIOResult<RSAPublicKey> {\n    const rMessage = /\\s*-----BEGIN ([A-Z0-9- ]+)-----\\r?\\n?([\\x21-\\x7e\\s]+?(?:\\r?\\n\\r?\\n))?([:A-Za-z0-9+/=\\s]+?)-----END \\1-----/g;\n    const match = rMessage.exec(pem);\n\n    if (!match) {\n        return Promise.resolve(Err(new TypeError('Invalid PEM formatted message')));\n    }\n\n    pem = match[3];\n\n    return tryAsyncResult(async () => {\n        const keyData = decodeByteString(atob(pem));\n\n        const publicKey = await crypto.subtle.importKey(\n            'spki',\n            keyData,\n            {\n                name: 'RSA-OAEP',\n                hash,\n            },\n            false,\n            [\n                'encrypt',\n            ],\n        );\n\n        return {\n            encrypt(data: DataSource): AsyncIOResult<ArrayBuffer> {\n                return encrypt(publicKey, data);\n            },\n\n            async encryptToString(data: DataSource): AsyncIOResult<string> {\n                const result = await encrypt(publicKey, data);\n                return result.map(encodeBase64);\n            },\n        };\n    });\n}\n\n// #region Internal Functions\n\n/**\n * 使用公钥加密数据。\n */\nfunction encrypt(publicKey: CryptoKey, data: DataSource): AsyncIOResult<ArrayBuffer> {\n    return tryAsyncResult(() => {\n        return crypto.subtle.encrypt(\n            {\n                name: 'RSA-OAEP',\n            },\n            publicKey,\n            dataSourceToBytes(data),\n        );\n    });\n}\n\n// #endregion","import { Err, type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../../macros/env.ts';\nimport type { RSAPublicKey, SHA } from '../crypto_defines.ts';\nimport { importPublicKey as minaImportPublicKey } from './mina_rsa.ts';\nimport { importPublicKey as webImportPublicKey } from './web_rsa.ts';\n\n/**\n * 从 PEM 格式的字符串导入 RSA 公钥，用于加密操作。\n * @param pem - PEM 格式的公钥字符串。\n * @param hash - 用于 OAEP 填充的哈希算法（SHA-1、SHA-256、SHA-384 或 SHA-512）。\n * @returns RSA 公钥对象，包含 encrypt 方法用于加密数据。\n * @since 1.6.0\n * @example\n * ```ts\n * const publicKey = (await importPublicKey(pemString, 'SHA-256')).unwrap();\n *\n * // 加密并返回 ArrayBuffer\n * const encrypted = (await publicKey.encrypt('Hello, World!')).unwrap();\n *\n * // 加密并返回 Base64 字符串\n * const encryptedStr = (await publicKey.encryptToString('Hello, World!')).unwrap();\n * ```\n */\nexport function importPublicKey(pem: string, hash: SHA): AsyncIOResult<RSAPublicKey> {\n    if (\n        hash !== 'SHA-1'\n        && hash !== 'SHA-256'\n        && hash !== 'SHA-384'\n        && hash !== 'SHA-512'\n    ) {\n        return Promise.resolve(Err(new TypeError(`Unsupported hash algorithm: ${hash}`)));\n    }\n\n    return (isMinaEnv() ? minaImportPublicKey : webImportPublicKey)(pem, hash);\n}","/**\n * @internal\n * 小游戏平台的 SHA 哈希实现。\n */\n\nimport { sha1 as SHA1, sha256 as SHA256, sha384 as SHA384, sha512 as SHA512 } from 'rsa-oaep-encryption';\nimport { encodeByteString } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\n\n/**\n * 计算 SHA-1 哈希值。\n * @param data - 要计算哈希的数据。\n * @returns 返回十六进制格式的哈希字符串。\n */\nexport function sha1(data: DataSource): string {\n    return SHA1.create().update(encodeByteString(data)).digest().toHex();\n}\n\n/**\n * 计算 SHA-256 哈希值。\n * @param data - 要计算哈希的数据。\n * @returns 返回十六进制格式的哈希字符串。\n */\nexport function sha256(data: DataSource): string {\n    return SHA256.create().update(encodeByteString(data)).digest().toHex();\n}\n\n/**\n * 计算 SHA-384 哈希值。\n * @param data - 要计算哈希的数据。\n * @returns 返回十六进制格式的哈希字符串。\n */\nexport function sha384(data: DataSource): string {\n    return SHA384.create().update(encodeByteString(data)).digest().toHex();\n}\n\n/**\n * 计算 SHA-512 哈希值。\n * @param data - 要计算哈希的数据。\n * @returns 返回十六进制格式的哈希字符串。\n */\nexport function sha512(data: DataSource): string {\n    return SHA512.create().update(encodeByteString(data)).digest().toHex();\n}","/**\n * @internal\n * Web 平台的 SHA 哈希实现。\n */\n\nimport { tryAsyncResult, type AsyncIOResult } from 'happy-rusty';\nimport { dataSourceToBytes } from '../../codec/helpers.ts';\nimport { encodeHex } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { SHA } from '../crypto_defines.ts';\n\n/**\n * 根据不同 SHA 算法计算字符串或者 buffer 的哈希值，结果用16进制字符串表示。\n * @param data - 需要计算哈希值的数据。\n * @param hash - SHA 算法。\n * @returns 计算得到的哈希值。\n */\nexport function sha(data: DataSource, hash: SHA): AsyncIOResult<string> {\n    return tryAsyncResult(async () => {\n        const digest = await crypto.subtle.digest(hash, dataSourceToBytes(data));\n        return encodeHex(digest);\n    });\n}","import { Ok, type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../../macros/env.ts';\nimport type { DataSource } from '../../defines.ts';\nimport { sha1 as pureSha1, sha256 as pureSha256, sha384 as pureSha384, sha512 as pureSha512 } from './sha.ts';\nimport { sha as webSHA } from './web_sha.ts';\n\n/**\n * 计算数据的 SHA-1 哈希值。\n * @param data - 需要计算哈希的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的哈希字符串。\n * @since 1.6.0\n * @example\n * ```ts\n * const hash = await sha1('Hello, World!');\n * if (hash.isOk()) {\n *     console.log(hash.unwrap()); // 十六进制哈希字符串\n * }\n * ```\n */\nexport function sha1(data: DataSource): AsyncIOResult<string> {\n    return isMinaEnv()\n        ? Promise.resolve(Ok(pureSha1(data)))\n        : webSHA(data, 'SHA-1');\n}\n\n/**\n * 计算数据的 SHA-256 哈希值。\n * @param data - 需要计算哈希的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的哈希字符串。\n * @since 1.0.0\n * @example\n * ```ts\n * const hash = await sha256('Hello, World!');\n * if (hash.isOk()) {\n *     console.log(hash.unwrap()); // 十六进制哈希字符串\n * }\n * ```\n */\nexport function sha256(data: DataSource): AsyncIOResult<string> {\n    return isMinaEnv()\n        ? Promise.resolve(Ok(pureSha256(data)))\n        : webSHA(data, 'SHA-256');\n}\n\n/**\n * 计算数据的 SHA-384 哈希值。\n * @param data - 需要计算哈希的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的哈希字符串。\n * @since 1.6.0\n * @example\n * ```ts\n * const hash = await sha384('Hello, World!');\n * if (hash.isOk()) {\n *     console.log(hash.unwrap()); // 十六进制哈希字符串\n * }\n * ```\n */\nexport function sha384(data: DataSource): AsyncIOResult<string> {\n    return isMinaEnv()\n        ? Promise.resolve(Ok(pureSha384(data)))\n        : webSHA(data, 'SHA-384');\n}\n\n/**\n * 计算数据的 SHA-512 哈希值。\n * @param data - 需要计算哈希的数据，可以是字符串或 BufferSource。\n * @returns 返回十六进制格式的哈希字符串。\n * @since 1.6.0\n * @example\n * ```ts\n * const hash = await sha512('Hello, World!');\n * if (hash.isOk()) {\n *     console.log(hash.unwrap()); // 十六进制哈希字符串\n * }\n * ```\n */\nexport function sha512(data: DataSource): AsyncIOResult<string> {\n    return isMinaEnv()\n        ? Promise.resolve(Ok(pureSha512(data)))\n        : webSHA(data, 'SHA-512');\n}\n","/**\n * @internal\n * 小游戏平台的事件监听实现。\n */\n\n/**\n * 添加错误监听器，用于监听微信小游戏中的错误事件。\n * @param listener - 错误事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addErrorListener(listener: WechatMinigame.WxOnErrorCallback): () => void {\n    wx.onError(listener);\n\n    return (): void => {\n        wx.offError(listener as unknown as WechatMinigame.WxOffErrorCallback);\n    };\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addUnhandledrejectionListener(listener: (WechatMinigame.OnUnhandledRejectionCallback)): () => void {\n    wx.onUnhandledRejection(listener);\n\n    return (): void => {\n        wx.offUnhandledRejection(listener);\n    };\n}\n\n/**\n * 添加窗口大小改变事件监听器。\n * @param listener - 窗口大小改变事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addResizeListener(listener: WechatMinigame.OnWindowResizeCallback): () => void {\n    wx.onWindowResize(listener);\n\n    return (): void => {\n        wx.offWindowResize(listener);\n    };\n}","/**\n * @internal\n * Web 平台的事件监听实现。\n */\n\n/**\n * 添加错误监听器，用于监听标准的错误事件。\n * @param listener - 错误事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addErrorListener(listener: (ev: ErrorEvent) => void): () => void {\n    addEventListener('error', listener);\n\n    return (): void => {\n        removeEventListener('error', listener);\n    };\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addUnhandledrejectionListener(listener: (ev: PromiseRejectionEvent) => void): () => void {\n    addEventListener('unhandledrejection', listener);\n\n    return (): void => {\n        removeEventListener('unhandledrejection', listener);\n    };\n}\n\n/**\n * 添加窗口大小改变事件监听器。\n * @param listener - 窗口大小改变事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addResizeListener(listener: (ev: UIEvent) => void): () => void {\n    addEventListener('resize', listener);\n\n    return (): void => {\n        removeEventListener('resize', listener);\n    };\n}","/**\n * 事件监听模块，提供错误、未处理 Promise 拒绝、窗口大小变化等事件监听功能。\n * @module event\n */\nimport { isMinaEnv } from '../../macros/env.ts';\nimport {\n    addErrorListener as minaAddErrorListener,\n    addResizeListener as minaAddResizeListener,\n    addUnhandledrejectionListener as minaAddUnhandledrejectionListener,\n} from './mina_event.ts';\nimport {\n    addErrorListener as webAddErrorListener,\n    addResizeListener as webAddResizeListener,\n    addUnhandledrejectionListener as webAddUnhandledrejectionListener,\n} from './web_event.ts';\n\n/**\n * 添加错误监听器，用于监听标准的错误事件。\n * @param listener - 错误事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 1.0.0\n * @example\n * ```ts\n * const removeListener = addErrorListener((ev) => {\n *     console.error('捕获到错误:', ev.message);\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addErrorListener(listener: (ev: WechatMinigame.ListenerError) => void): () => void {\n    if (isMinaEnv()) {\n        return minaAddErrorListener(listener);\n    }\n\n    const webListener = (ev: ErrorEvent) => {\n        listener({\n            message: `${ ev.message }${ ev.error?.stack ? `\\n${ ev.error.stack }` : '' }`,\n        });\n    };\n\n    return webAddErrorListener(webListener);\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns  返回一个函数，调用该函数可以移除监听器。\n * @since 1.0.0\n * @example\n * ```ts\n * const removeListener = addUnhandledrejectionListener((ev) => {\n *     console.error('未处理的 Promise 拒绝:', ev.reason);\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addUnhandledrejectionListener(listener: (ev: Pick<PromiseRejectionEvent, 'reason' | 'promise'>) => void): () => void {\n    return isMinaEnv()\n        ? minaAddUnhandledrejectionListener(listener as unknown as WechatMinigame.OnUnhandledRejectionCallback)\n        : webAddUnhandledrejectionListener(listener);\n}\n\n/**\n * 添加窗口大小变化监听器。\n * @param listener - 窗口大小变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 1.7.0\n * @example\n * ```ts\n * const removeListener = addResizeListener((size) => {\n *     console.log('窗口大小变化:', size.windowWidth, 'x', size.windowHeight);\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addResizeListener(listener: WechatMinigame.OnWindowResizeCallback): () => void {\n    return isMinaEnv()\n        ? minaAddResizeListener(listener)\n        : webAddResizeListener(ev => {\n            listener({\n                windowWidth: (ev.target as Window).innerWidth,\n                windowHeight: (ev.target as Window).innerHeight,\n            });\n        });\n}","/**\n * @internal\n * 小游戏平台的 HTTP 请求实现。\n */\n\nimport type { FetchResult } from '@happy-ts/fetch-t';\nimport { Err, Ok, type IOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { createFailedFetchTask, miniGameFailureToError, validateSafeUrl } from '../internal/mod.ts';\nimport { ABORT_ERROR, FetchError, TIMEOUT_ERROR, type FetchTask, type MinaFetchInit } from './fetch_defines.ts';\n\n/**\n * 发起一个可中断的 ArrayBuffer 类型响应的网络请求。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定响应类型为 ArrayBuffer 且请求可中断。\n * @returns 返回一个 ArrayBuffer 类型的 FetchTask。\n */\nexport function minaFetch(url: string, init: MinaFetchInit & {\n    responseType: 'arraybuffer';\n}): FetchTask<ArrayBuffer>;\n\n/**\n * 发起一个可中断的 JSON 类型响应的网络请求。\n * @typeParam T - 预期的 JSON 响应数据类型。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定响应类型为 JSON 且请求可中断。\n * @returns 返回一个 JSON 类型的 FetchTask。\n */\nexport function minaFetch<T>(url: string, init: MinaFetchInit & {\n    responseType: 'json';\n}): FetchTask<T>;\n\n/**\n * 发起一个可中断的文本类型响应的网络请求。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定响应类型为文本且请求可中断。\n * @returns 返回一个文本类型的 FetchTask。\n */\nexport function minaFetch(url: string, init?: MinaFetchInit & {\n    responseType: 'text';\n}): FetchTask<string>;\n\n/**\n * 发起一个可中断的网络请求，默认返回文本类型响应。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定请求可中断。\n * @returns {FetchTask<string>} 返回一个文本类型的 FetchTask。\n */\nexport function minaFetch(url: string, init: MinaFetchInit): FetchTask<string>;\n\n/**\n * 发起一个网络请求，根据初始化配置返回对应类型的 FetchTask。\n * @typeParam T - 预期的响应数据类型。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置。\n * @returns 根据配置返回 FetchTask。\n */\nexport function minaFetch<T>(url: string, init?: MinaFetchInit): FetchTask<T> {\n    const urlRes = validateSafeUrl(url);\n    if (urlRes.isErr()) return createFailedFetchTask(urlRes);\n\n    const {\n        responseType,\n        onChunk,\n        ...rest\n    } = init ?? {};\n\n    let aborted = false;\n\n    const future = new Future<IOResult<T>>();\n\n    const options: WechatMinigame.RequestOption = {\n        ...rest,\n        url,\n        success(res) {\n            const { statusCode } = res;\n\n            if (statusCode >= 200 && statusCode < 300) {\n                future.resolve(Ok(res.data as T));\n            } else {\n                future.resolve(Err(new FetchError(res.errMsg, statusCode)));\n            }\n        },\n        fail(err) {\n            const error = miniGameFailureToError(err);\n            const { errMsg } = err;\n\n            if (errMsg.includes('abort')) {\n                error.name = ABORT_ERROR;\n            } else if (errMsg.includes('timeout')) {\n                error.name = TIMEOUT_ERROR;\n            }\n\n            future.resolve(Err(error));\n        },\n    };\n\n    if (responseType === 'arraybuffer') {\n        options.responseType = responseType;\n    } else if (responseType === 'json') {\n        options.dataType = responseType;\n    } else {\n        // 默认 responseType 是 text\n        options.responseType = responseType;\n        // responseType设置为text还不够，否则返回类型还是json\n        options.dataType = '其他';\n    }\n\n    const task = wx.request(options);\n\n    if (typeof onChunk === 'function') {\n        task.onChunkReceived(res => {\n            onChunk(new Uint8Array(res.data));\n        });\n    }\n\n    return {\n        abort(): void {\n            aborted = true;\n            task.abort();\n        },\n\n        get aborted(): boolean {\n            return aborted;\n        },\n\n        get result(): FetchResult<T> {\n            return future.promise;\n        },\n    };\n}","/**\n * 网络请求模块，提供可中断的 fetch 请求功能，支持 text、JSON、ArrayBuffer 等响应类型。\n * @module fetch\n */\nimport { fetchT as webFetch, type FetchTask } from '@happy-ts/fetch-t';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport type { UnionFetchInit } from './fetch_defines.ts';\nimport { minaFetch } from './mina_fetch.ts';\n\nexport * from './fetch_defines.ts';\n\n/**\n * 发起一个可中断的文本类型响应的网络请求。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定响应类型为文本且请求可中断。\n * @returns 返回一个文本类型的 FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * const task = fetchT('https://api.example.com/data', { responseType: 'text' });\n * const result = await task.result;\n * if (result.isOk()) {\n *     console.log(result.unwrap()); // 文本内容\n * }\n * // 如需中断请求\n * task.abort();\n * ```\n */\nexport function fetchT(url: string, init: UnionFetchInit & {\n    responseType: 'text';\n}): FetchTask<string>;\n\n/**\n * 发起一个可中断的 ArrayBuffer 类型响应的网络请求。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定响应类型为 ArrayBuffer 且请求可中断。\n * @returns 返回一个 ArrayBuffer 类型的 FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * const task = fetchT('https://api.example.com/file', { responseType: 'arraybuffer' });\n * const result = await task.result;\n * if (result.isOk()) {\n *     const buffer = result.unwrap();\n *     console.log('文件大小:', buffer.byteLength);\n * }\n * ```\n */\nexport function fetchT(url: string, init: UnionFetchInit & {\n    responseType: 'arraybuffer';\n}): FetchTask<ArrayBuffer>;\n\n/**\n * 发起一个可中断的 JSON 类型响应的网络请求。\n * @typeParam T - 预期的 JSON 响应数据类型。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定响应类型为 JSON 且请求可中断。\n * @returns 返回一个 JSON 类型的 FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * interface User {\n *     id: number;\n *     name: string;\n * }\n * const task = fetchT<User>('https://api.example.com/user/1', { responseType: 'json' });\n * const result = await task.result;\n * if (result.isOk()) {\n *     const user = result.unwrap();\n *     console.log(user.name);\n * }\n * ```\n */\nexport function fetchT<T>(url: string, init: UnionFetchInit & {\n    responseType: 'json';\n}): FetchTask<T>;\n\n/**\n * 发起一个可中断的网络请求，默认返回文本类型响应。\n * @typeParam T - 预期的响应数据类型。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置，指定请求可中断。\n * @returns FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * const task = fetchT('https://api.example.com/data');\n * const result = await task.result;\n * if (result.isOk()) {\n *     console.log(result.unwrap());\n * }\n * ```\n */\nexport function fetchT(url: string, init?: UnionFetchInit): FetchTask<string | Response>;\n\n/**\n * 发起一个网络请求，根据初始化配置返回对应类型的 FetchTask。\n * @typeParam T - 预期的响应数据类型。\n * @param url - 请求的 URL 地址。\n * @param init - 请求的初始化配置。\n * @returns FetchTask。\n * @since 1.0.0\n * @example\n * ```ts\n * // 发起 POST 请求\n * const task = fetchT('https://api.example.com/submit', {\n *     method: 'POST',\n *     headers: { 'Content-Type': 'application/json' },\n *     body: JSON.stringify({ key: 'value' }),\n *     responseType: 'json',\n * });\n * const result = await task.result;\n * ```\n */\nexport function fetchT<T>(url: string, init?: UnionFetchInit): FetchTask<T> {\n    const defaultInit = init ?? {};\n    // 默认是 text 类型\n    defaultInit.responseType ??= 'text';\n\n    return (isMinaEnv() ? minaFetch(url, defaultInit) : webFetch(url, {\n        ...defaultInit,\n        abortable: true,\n    })) as FetchTask<T>;\n}\n","/**\n * @internal\n * 小游戏平台的图片创建实现。\n */\n\n/**\n * 从 URL 创建图片对象。\n * @param url - 图片的 URL 地址。\n * @returns 返回小游戏平台的图片对象。\n */\nexport function createImageFromUrl(url: string): WechatMinigame.Image {\n    const img = wx.createImage();\n    img.src = url;\n\n    return img;\n}\n\n/**\n * 从本地文件路径创建图片对象。\n * @param filePath - 图片文件的本地路径。\n * @returns 返回小游戏平台的图片对象。\n */\nexport function createImageFromFile(filePath: string): WechatMinigame.Image {\n    return createImageFromUrl(filePath);\n}","/**\n * @internal\n * Web 平台的图片创建实现。\n */\n\nimport { readBlobFile } from 'happy-opfs';\nimport { Ok, type AsyncIOResult } from 'happy-rusty';\n\n/**\n * 从 URL 创建图片元素。\n * @param url - 图片的 URL 地址。\n * @returns 返回 HTML 图片元素。\n */\nexport function createImageFromUrl(url: string): HTMLImageElement {\n    const img = new Image();\n    img.src = url;\n\n    return img;\n}\n\n/**\n * 从本地文件路径创建图片元素。\n * @param filePath - 图片文件的本地路径。\n * @returns 返回包含 HTML 图片元素的异步结果。\n */\nexport async function createImageFromFile(filePath: string): AsyncIOResult<HTMLImageElement> {\n    const readRes = await readBlobFile(filePath);\n\n    return readRes.andThen(blob => {\n        const url = URL.createObjectURL(blob);\n\n        const img = new Image();\n        img.src = url;\n\n        img.addEventListener('load', () => {\n            URL.revokeObjectURL(url);\n        });\n        img.addEventListener('error', () => {\n            URL.revokeObjectURL(url);\n        });\n\n        return Ok(img);\n    });\n}","/**\n * 图片处理模块，提供从 URL 或文件创建图片的功能。\n * @module image\n */\nimport { Ok, type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport {\n    createImageFromFile as minaCreateImageFromFile,\n    createImageFromUrl as minaCreateImageFromUrl,\n} from './mina_image.ts';\nimport {\n    createImageFromFile as webCreateImageFromFile,\n    createImageFromUrl as webCreateImageFromUrl,\n} from './web_image.ts';\n\n/**\n * 从URL创建图片。\n * @param url - 图片URL。\n * @returns Image对象。\n * @since 1.7.0\n * @example\n * ```ts\n * const img = createImageFromUrl('https://example.com/image.png');\n * img.onload = () => {\n *     console.log('图片加载完成', img.width, img.height);\n * };\n * ```\n */\nexport function createImageFromUrl(url: string): HTMLImageElement | WechatMinigame.Image {\n    return (isMinaEnv() ? minaCreateImageFromUrl : webCreateImageFromUrl)(url);\n}\n\n/**\n * 从文件创建图片。\n * @param filePath - 文件路径。\n * @returns 异步的Image对象。\n * @since 1.7.0\n * @example\n * ```ts\n * const result = await createImageFromFile('/path/to/image.png');\n * if (result.isOk()) {\n *     const img = result.unwrap();\n *     console.log('图片尺寸:', img.width, 'x', img.height);\n * }\n * ```\n */\nexport function createImageFromFile(filePath: string): AsyncIOResult<HTMLImageElement | WechatMinigame.Image> {\n    return isMinaEnv()\n        ? Promise.resolve(Ok(minaCreateImageFromFile(filePath)))\n        : webCreateImageFromFile(filePath);\n}","/**\n * @internal\n * 小游戏平台的地理位置服务实现。\n */\n\nimport { type AsyncIOResult } from 'happy-rusty';\nimport { asyncIOResultify } from '../utils/mod.ts';\nimport type { GeoPosition } from './lbs_defines.ts';\n\n/**\n * 获取当前 geo 坐标。\n * @returns 异步的经纬度结果。\n */\nexport async function getCurrentPosition(): AsyncIOResult<GeoPosition> {\n    const hasFuzzy = typeof wx.getFuzzyLocation === 'function';\n\n    const getLocation = hasFuzzy ? wx.getFuzzyLocation : wx.getLocation;\n    const scope = hasFuzzy ? 'scope.userFuzzyLocation' : 'scope.userLocation';\n\n    const authRes = await asyncIOResultify(wx.authorize)({\n        scope,\n    });\n\n    if (authRes.isErr()) {\n        return authRes.asErr();\n    }\n\n    const locationRes = await asyncIOResultify(getLocation)({\n        type: 'wgs84',\n    });\n\n    return locationRes.map(pos => ({\n        latitude: pos.latitude,\n        longitude: pos.longitude,\n    }));\n}","/**\n * @internal\n * Web 平台的地理位置服务实现。\n */\n\nimport { Err, Ok, type AsyncIOResult, type IOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport type { GeoPosition } from './lbs_defines.ts';\n\n/**\n * 获取当前 geo 坐标。\n * @returns 异步的经纬度结果。\n */\nexport function getCurrentPosition(): AsyncIOResult<GeoPosition> {\n    const future = new Future<IOResult<GeoPosition>>();\n\n    navigator.geolocation.getCurrentPosition(\n        position => {\n            future.resolve(Ok({\n                latitude: position.coords.latitude,\n                longitude: position.coords.longitude,\n            }));\n        },\n        err => {\n            future.resolve(Err(new Error(err.message)));\n        },\n    );\n\n    return future.promise;\n}","/**\n * 位置服务模块（Location Based Service），提供获取地理位置坐标的功能。\n * @module lbs\n */\nimport { type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport type { GeoPosition } from './lbs_defines.ts';\nimport { getCurrentPosition as minaGetCurrentPosition } from './mina_lbs.ts';\nimport { getCurrentPosition as webGetCurrentPosition } from './web_lbs.ts';\n\nexport * from './lbs_defines.ts';\n\n/**\n * 获取当前 geo 坐标。\n * @returns 当前经纬度。\n * @since 1.7.0\n * @example\n * ```ts\n * const result = await getCurrentPosition();\n * if (result.isOk()) {\n *     const pos = result.unwrap();\n *     console.log('纬度:', pos.latitude);\n *     console.log('经度:', pos.longitude);\n * } else {\n *     console.error('获取位置失败:', result.unwrapErr());\n * }\n * ```\n */\nexport function getCurrentPosition(): AsyncIOResult<GeoPosition> {\n    return isMinaEnv()\n        ? minaGetCurrentPosition()\n        : webGetCurrentPosition();\n}","/**\n * @internal\n * 小游戏平台的网络状态实现。\n */\n\nimport { asyncResultify } from '../utils/mod.ts';\nimport type { NetworkType } from './network_define.ts';\n\n/**\n * 获取网络状态。\n * @returns 返回值可能为 `wifi` | `none` | `unknown` | `2g` | `3g` | `4g`\n */\nexport async function getNetworkType(): Promise<NetworkType> {\n    return (await asyncResultify(wx.getNetworkType)())\n        .mapOr('unknown', x => x.networkType);\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    const networkListener = (res: WechatMinigame.OnNetworkStatusChangeListenerResult): void => {\n        const { isConnected, networkType } = res;\n        const type = isConnected ? networkType : 'none';\n\n        listener(type);\n    };\n\n    wx.onNetworkStatusChange(networkListener);\n\n    return () => {\n        wx.offNetworkStatusChange(networkListener as unknown as WechatMinigame.OffNetworkStatusChangeCallback);\n    };\n}","/**\n * @internal\n * Web 平台的网络状态实现。\n */\n\nimport type { NetworkType } from './network_define.ts';\n\n/**\n * 获取网络状态。\n * @returns 根据浏览器支持情况不同，返回值可能为 `wifi` | `none` | `unknown` | `slow-2g` | `2g` | `3g` | `4g`\n */\nexport function getNetworkType(): NetworkType {\n    if (!navigator.onLine) {\n        return 'none';\n    }\n\n    const nav = (navigator as Navigator);\n\n    // 进一步判断\n    if (nav.connection) {\n        return nav.connection.type === 'wifi'\n            ? 'wifi'\n            : nav.connection.effectiveType;\n    } else {\n        return 'unknown';\n    }\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    const networkListener = (): void => {\n        listener(getNetworkType());\n    };\n\n    const nav = (navigator as Navigator);\n\n    nav.connection?.addEventListener('change', networkListener);\n\n    return () => {\n        nav.connection?.removeEventListener('change', networkListener);\n    };\n}\n\n// #region Internal Types\n\n/**\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation)\n */\ninterface NetworkInformation extends EventTarget {\n    type: 'bluetooth' | 'cellular' | 'ethernet' | 'none' | 'wifi' | 'wimax' | 'other' | 'unknown';\n    effectiveType: 'slow-2g' | '2g' | '3g' | '4g';\n}\n\n/**\n * [Global augmentation](https://jsr.io/docs/about-slow-types#global-augmentation)\n *\n * 等待 TypeScript 支持。\n *\n * 扩展 Navigator。\n */\ninterface Navigator {\n    connection?: NetworkInformation;\n}\n\n// #endregion","/**\n * 网络状态模块，提供获取网络类型和监听网络状态变化的功能。\n * @module network\n */\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { addNetworkChangeListener as minaAddNetworkChangeListener, getNetworkType as minaGetNetworkType } from './mina_network.ts';\nimport type { NetworkType } from './network_define.ts';\nimport { addNetworkChangeListener as webAddNetworkChangeListener, getNetworkType as webGetNetworkType } from './web_network.ts';\n\nexport * from './network_define.ts';\n\n/**\n * 获取网络状态。\n * @returns 根据浏览器支持情况不同，返回值可能为 `wifi` | `none` | `unknown` | `slow-2g` | `2g` | `3g` | `4g`\n * @since 1.0.9\n * @example\n * ```ts\n * const networkType = await getNetworkType();\n * console.log('当前网络类型:', networkType);\n * if (networkType === 'none') {\n *     console.log('当前无网络连接');\n * }\n * ```\n */\nexport function getNetworkType(): Promise<NetworkType> {\n    return isMinaEnv()\n        ? minaGetNetworkType()\n        : Promise.resolve(webGetNetworkType());\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 1.0.9\n * @example\n * ```ts\n * const removeListener = addNetworkChangeListener((type) => {\n *     console.log('网络状态变化:', type);\n *     if (type === 'none') {\n *         console.log('网络已断开');\n *     }\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    return (isMinaEnv() ? minaAddNetworkChangeListener : webAddNetworkChangeListener)(listener);\n}","/**\n * 平台类型，Web 或者小游戏。\n * @since 1.0.0\n * @example\n * ```ts\n * import { platform, type TargetType } from 'minigame-std';\n *\n * const type: TargetType = platform.getTargetType();\n * console.log(type); // 'minigame' 或 'web'\n * ```\n */\nexport type TargetType = 'minigame' | 'web';\n\n/**\n * 获取当前的平台类型。\n * @returns 返回当前的运行环境类型，可能是 'minigame' 或 'web'。\n * @since 1.0.0\n * @example\n * ```ts\n * const type = getTargetType();\n * console.log('当前平台:', type); // 'minigame' 或 'web'\n * ```\n */\nexport function getTargetType(): TargetType {\n    return 'wx' in globalThis ? 'minigame' : 'web';\n}\n\n/**\n * 判断当前是否在 Web 环境中。\n * @returns 如果在 Web 环境中返回 true，否则返回 false。\n * @since 1.0.0\n * @example\n * ```ts\n * if (isWeb()) {\n *     console.log('当前在浏览器环境');\n * }\n * ```\n */\nexport function isWeb(): boolean {\n    return getTargetType() === 'web';\n}\n\n/**\n * 判断当前是否在小游戏环境中。\n * @returns 如果在小游戏环境中返回 true，否则返回 false。\n * @since 1.0.0\n * @example\n * ```ts\n * if (isMiniGame()) {\n *     console.log('当前在小游戏环境');\n * }\n * ```\n */\nexport function isMiniGame(): boolean {\n    return getTargetType() === 'minigame';\n}","/**\n * 解析 userAgent 获取设备信息。\n * @param ua - 要解析的 userAgent 字符串，默认为 navigator.userAgent。\n * @returns 解析后的设备信息，包含 model、platform 和 system。\n * @internal\n */\nexport function parseUserAgent(ua: string = navigator.userAgent): { model: string; platform: string; system: string; } {\n    // iOS 设备: iPhone/iPad/iPod\n    // 示例: Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X)\n    // wx.getDeviceInfo: model=\"iPhone 17 Pro<iPhone18,1>\", system=\"iOS 26.2\"\n    const iosMatch = ua.match(/\\((iPhone|iPad|iPod);.*?OS (\\d+[_\\d]*)/);\n    if (iosMatch) {\n        const model = iosMatch[1];\n        const version = iosMatch[2].replace(/_/g, '.');\n        return { model, platform: 'ios', system: `iOS ${version}` };\n    }\n\n    // Android 设备\n    // 示例1: Linux; Android 12; ELS-AN00 Build/HUAWEIELS-AN00\n    // wx.getDeviceInfo: model=\"ELS-AN00\", system=\"Android 12\"\n    // 示例2: Linux; U; Android 13; zh-cn; 22127RK46C Build/TKQ1.220905.001\n    // wx.getDeviceInfo: model=\"22127RK46C\", system=\"Android 13\"\n    // 注意: model 是 Build/ 前面的最后一个字段\n    const androidMatch = ua.match(/Android\\s+([\\d.]+);(?:.*?;\\s*)?([^;]+)\\s+Build/);\n    if (androidMatch) {\n        const version = androidMatch[1];\n        const model = androidMatch[2].trim();\n        return { model, platform: 'android', system: `Android ${version}` };\n    }\n\n    // Mac\n    // 示例: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)\n    const macMatch = ua.match(/Mac OS X (\\d+[_\\d]*)/);\n    if (macMatch) {\n        const version = macMatch[1].replace(/_/g, '.');\n        return { model: 'Mac', platform: 'mac', system: `macOS ${version}` };\n    }\n\n    // Windows\n    // 示例: Mozilla/5.0 (Windows NT 10.0; Win64; x64)\n    const winMatch = ua.match(/Windows NT ([\\d.]+)/);\n    if (winMatch) {\n        return { model: 'PC', platform: 'windows', system: `Windows NT ${winMatch[1]}` };\n    }\n\n    // Linux\n    if (ua.includes('Linux')) {\n        return { model: 'Linux', platform: 'linux', system: 'Linux' };\n    }\n\n    return { model: 'unknown', platform: 'unknown', system: 'unknown' };\n}\n","import { Lazy, Ok, OnceAsync, type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { asyncIOResultify } from '../utils/mod.ts';\nimport { parseUserAgent } from './user_agent.ts';\n\n// #region Internal Variables\n\n// 以下变量一旦获取则不会变化\n// 兼容基础库低版本\nconst deviceInfo = Lazy<DeviceInfo>(() => isMinaEnv()\n    ? (wx.getDeviceInfo ? wx.getDeviceInfo() : wx.getSystemInfoSync()) as unknown as DeviceInfo\n    : getWebDeviceInfo(),\n);\nconst benchmarkLevel = OnceAsync<number>();\n\n// #endregion\n\n/**\n * 获取设备信息。\n * @returns 返回小游戏的设备信息对象。\n * @since 1.0.0\n * @example\n * ```ts\n * const info = getDeviceInfo();\n * console.log('设备平台:', info.platform);\n * console.log('设备品牌:', info.brand);\n * console.log('设备型号:', info.model);\n * ```\n */\nexport function getDeviceInfo(): DeviceInfo {\n    return deviceInfo.force();\n}\n\n/**\n * 获取设备性能等级， web 环境返回 -2。\n * @returns 返回设备性能等级。\n * @since 1.10.0\n * @example\n * ```ts\n * const result = await getDeviceBenchmarkLevel();\n * if (result.isOk()) {\n *     const level = result.unwrap();\n *     if (level >= 30) {\n *         console.log('高性能设备');\n *     } else if (level >= 20) {\n *         console.log('中等性能设备');\n *     } else {\n *         console.log('低性能设备');\n *     }\n * }\n * ```\n */\nexport async function getDeviceBenchmarkLevel(): AsyncIOResult<number> {\n    // 小游戏从-1开始，-2表示web环境\n    if (!isMinaEnv()) {\n        return Ok(-2);\n    }\n\n    if (benchmarkLevel.isInitialized()) {\n        return Ok(benchmarkLevel.get().unwrap());\n    }\n\n    // 优先使用新 API\n    if (typeof wx.getDeviceBenchmarkInfo === 'function') {\n        return await benchmarkLevel.getOrTryInit(async () => {\n            const benchmarkInfoRes = await asyncIOResultify(wx.getDeviceBenchmarkInfo)();\n\n            return benchmarkInfoRes.map(x => x.benchmarkLevel);\n        });\n    }\n\n    // 兼容低版本基础库\n    const level = getDeviceInfo().benchmarkLevel;\n    benchmarkLevel.set(level);\n\n    return Ok(level);\n}\n\n/**\n * 获取窗口信息。\n * @returns 包含窗口和屏幕相关信息的对象。\n * @since 1.7.0\n * @example\n * ```ts\n * const info = getWindowInfo();\n * console.log('窗口尺寸:', info.windowWidth, 'x', info.windowHeight);\n * console.log('屏幕尺寸:', info.screenWidth, 'x', info.screenHeight);\n * console.log('设备像素比:', info.pixelRatio);\n * ```\n */\nexport function getWindowInfo(): WechatMinigame.WindowInfo {\n    return isMinaEnv() ? wx.getWindowInfo() : getWebWindowInfo();\n}\n\n/**\n * 平台类型。\n * @since 1.0.0\n * @example\n * ```ts\n * import { platform, type Platform } from 'minigame-std';\n *\n * const info = platform.getDeviceInfo();\n * const devicePlatform: Platform = info.platform;\n * console.log(devicePlatform); // 'ios' | 'android' | 'mac' | ...\n * ```\n */\nexport type Platform = 'ios' | 'android' | 'mac' | 'windows' | 'ohos' | 'ohos_pc' | 'devtools' | 'linux' | 'unknown';\n\n/**\n * 设备信息类型。\n * 修正了 `memorySize` 的类型为 `number`（小游戏 API 实际返回数字，但官方类型定义错误地声明为 string）。\n * @see https://github.com/wechat-miniprogram/minigame-api-typings/issues/27\n * @since 1.0.0\n * @example\n * ```ts\n * import { platform, type DeviceInfo } from 'minigame-std';\n *\n * const info: DeviceInfo = platform.getDeviceInfo();\n * console.log('平台:', info.platform);\n * console.log('内存:', info.memorySize, 'MB');\n * ```\n */\nexport type DeviceInfo = Omit<WechatMinigame.DeviceInfo, 'abi' | 'cpuType' | 'deviceAbi' | 'memorySize' | 'platform'> & {\n    abi?: string;\n    cpuType?: string;\n    deviceAbi?: string;\n    /** 设备内存大小，单位为 MB */\n    memorySize: number;\n    /** 设备平台 */\n    platform: Platform;\n};\n\n// #region Internal Functions\n\n/**\n * 获取 Web 环境下的设备信息。\n */\nfunction getWebDeviceInfo(): DeviceInfo {\n    const { model, platform, system } = parseUserAgent();\n    const memorySize = ((navigator as Navigator & { deviceMemory?: number; }).deviceMemory ?? 0) * 1024;\n\n    return {\n        benchmarkLevel: -2, // Web 环境固定返回 -2\n        brand: '', // Web 环境无法可靠获取品牌信息\n        memorySize,\n        model,\n        platform: platform as Platform,\n        system,\n    };\n}\n\n/**\n * 获取 Web 环境下的窗口信息。\n */\nfunction getWebWindowInfo(): WechatMinigame.WindowInfo {\n    return {\n        pixelRatio: devicePixelRatio,\n        screenHeight: screen.height,\n        screenTop,\n        screenWidth: screen.width,\n        windowHeight: innerHeight,\n        windowWidth: innerWidth,\n        statusBarHeight: 0,\n        safeArea: {\n            left: 0,\n            right: innerWidth,\n            top: 0,\n            bottom: innerHeight,\n            width: innerWidth,\n            height: innerHeight,\n        },\n    };\n}\n\n// #endregion\n","import { isMiniGame } from './base.ts';\nimport { getDeviceInfo } from './device.ts';\n\n/**\n * 判断当前是否在小游戏的运行时环境中。\n * @returns 如果在小游戏的运行时环境中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameRuntime()) {\n *     console.log('在小游戏真机环境中');\n * }\n * ```\n */\nexport function isMiniGameRuntime(): boolean {\n    return isMiniGame() && getPlatform() !== 'devtools';\n}\n\n/**\n * 判断当前是否在小游戏的开发者工具中。\n * @returns 如果在小游戏的开发者工具中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameDevtools()) {\n *     console.log('在开发者工具中');\n * }\n * ```\n */\nexport function isMiniGameDevtools(): boolean {\n    return isMiniGame() && getPlatform() === 'devtools';\n}\n\n/**\n * 判断当前是否在小游戏的 iOS 环境中。\n * @returns 如果在小游戏的 iOS 环境中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameIOS()) {\n *     console.log('在 iOS 设备上运行');\n * }\n * ```\n */\nexport function isMiniGameIOS(): boolean {\n    return isMiniGame() && getPlatform() === 'ios';\n}\n\n/**\n * 判断当前是否在小游戏的 Android 环境中。\n * @returns 如果在小游戏的 Android 环境中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameAndroid()) {\n *     console.log('在 Android 设备上运行');\n * }\n * ```\n */\nexport function isMiniGameAndroid(): boolean {\n    return isMiniGame() && getPlatform() === 'android';\n}\n\n/**\n * 判断当前是否在小游戏的 Windows 环境中。\n * @returns 如果在小游戏的 Windows 环境中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameWin()) {\n *     console.log('在 Windows 设备上运行');\n * }\n * ```\n */\nexport function isMiniGameWin(): boolean {\n    return isMiniGame() && getPlatform() === 'windows';\n}\n\n/**\n * 判断当前是否在小游戏的 Mac 环境中。\n * @returns 如果在小游戏的 Mac 环境中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameMac()) {\n *     console.log('在 Mac 设备上运行');\n * }\n * ```\n */\nexport function isMiniGameMac(): boolean {\n    return isMiniGame() && getPlatform() === 'mac';\n}\n\n/**\n * 判断当前是否在小游戏的 HarmonyOS 环境中。\n * @returns 如果在小游戏的 HarmonyOS 环境中返回 true，否则返回 false。\n * @since 1.9.0\n * @example\n * ```ts\n * if (isMiniGameHarmonyOS()) {\n *     console.log('在 HarmonyOS 设备上运行');\n * }\n * ```\n */\nexport function isMiniGameHarmonyOS(): boolean {\n    return isMiniGame() && getPlatform() === 'ohos';\n}\n\n// #region Internal Functions\n\n/**\n * 获取当前平台类型。\n */\nfunction getPlatform(): string {\n    return getDeviceInfo().platform.toLowerCase();\n}\n\n// #endregion","/**\n * 性能模块，提供高精度时间戳获取功能。\n * @module performance\n */\nimport { Lazy } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { isMiniGameDevtools } from '../platform/target.ts';\n\n// #region Internal Variables\n\n/**\n * 小游戏性能管理器实例（延迟初始化）。\n */\nconst minaPerformance = Lazy(() => wx.getPerformance());\n\n// #endregion\n\n/**\n * 参见`performance.now()`\n * @returns 当前时间以毫秒为单位的时间戳\n * @since 2.0.0\n * @example\n * ```ts\n * const start = getPerformanceNow();\n * // 执行一些操作...\n * const end = getPerformanceNow();\n * console.log('耗时:', end - start, 'ms');\n * ```\n */\nexport function getPerformanceNow(): number {\n    return isMinaEnv()\n        // 小游戏 的 performance.now() 返回的是微秒\n        // NOTE: 但是小游戏开发者工具返回的是毫秒\n        ? minaPerformance.force().now() / (isMiniGameDevtools() ? 1 : 1000)\n        : performance.now();\n}\n","import type { AsyncVoidIOResult } from 'happy-rusty';\nimport type { DataSource } from '../defines.ts';\n\n/**\n * WebSocket 连接状态，小游戏环境可用。\n * @since 1.6.0\n * @example\n * ```ts\n * import { SocketReadyState, connectSocket } from 'minigame-std';\n *\n * const socket = connectSocket('wss://example.com');\n * if (socket.readyState === SocketReadyState.OPEN) {\n *     console.log('连接已打开');\n * }\n * ```\n */\nexport const SocketReadyState = {\n    /**\n     * WebSocket.CONNECTING\n     */\n    CONNECTING: 0,\n    /**\n     * WebSocket.OPEN\n     */\n    OPEN: 1,\n    /**\n     * WebSocket.CLOSING\n     */\n    CLOSING: 2,\n    /**\n     * WebSocket.CLOSED\n     */\n    CLOSED: 3,\n} as const;\n\n/**\n * WebSocket 事件监听器映射接口，定义了与 WebSocket 事件对应的回调函数类型。\n * @since 1.0.0\n * @example\n * ```ts\n * import type { SocketListenerMap } from 'minigame-std';\n *\n * const onMessage: SocketListenerMap['message'] = (data) => {\n *     console.log('收到消息:', data);\n * };\n * ```\n */\nexport interface SocketListenerMap {\n    /**\n     * 当 WebSocket 连接成功打开时触发。\n     */\n    open(): void;\n\n    /**\n     * 当 WebSocket 连接关闭时触发。\n     * @param code - 表示关闭连接的状态码。\n     * @param reason - 表示关闭连接的原因。\n     */\n    close(code: number, reason: string): void;\n\n    /**\n     * 当 WebSocket 接收到消息时触发。\n     * @param data - 接收到的消息数据，可以是字符串或者 ArrayBuffer。\n     */\n    message(data: string | ArrayBuffer): void;\n\n    /**\n     * 当 WebSocket 连接发生错误时触发。\n     * @param err - 发生的错误对象。\n     */\n    error(err: Error): void;\n}\n\n/**\n * WebSocket 接口定义，描述了 WebSocket 的基本操作方法。\n * @since 1.0.0\n * @example\n * ```ts\n * import type { ISocket } from 'minigame-std';\n *\n * function handleSocket(socket: ISocket) {\n *     socket.addEventListener('message', (data) => {\n *         console.log('收到:', data);\n *     });\n *     socket.send('Hello');\n * }\n * ```\n */\nexport interface ISocket {\n    /**\n     * WebSocket 的连接状态。\n     */\n    readonly readyState: number;\n\n    /**\n     * 添加事件监听器到 WebSocket 对象。\n     * @typeParam K - 限定为 WebSocketEventMap 的键类型。\n     * @param type - 事件类型，如 'open', 'close', 'message', 'error'。\n     * @param listener - 对应事件的监听器回调函数。\n     * @returns 返回对应的`removeEventListener代理函数`。\n     */\n    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: SocketListenerMap[K]): () => void;\n\n    /**\n     * 发送数据到 WebSocket 服务器。\n     * @param data - 要发送的数据，可以是字符串、ArrayBuffer 或 ArrayBufferView。\n     * @returns 返回一个 Promise，其解析为发送结果，成功时返回 true，失败时返回 Error。\n     */\n    send(data: DataSource): AsyncVoidIOResult;\n\n    /**\n     * 关闭 WebSocket 连接。\n     * @param code - 可选的状态码，表示关闭连接的原因。\n     * @param reason - 可选的字符串，解释为什么要关闭连接。\n     */\n    close(code?: number, reason?: string): void;\n}\n\n/**\n * 创建Socket的可选参数。\n * @since 1.0.0\n * @example\n * ```ts\n * import { connectSocket, type SocketOptions } from 'minigame-std';\n *\n * const options: SocketOptions = {\n *     protocols: ['protocol1', 'protocol2'],\n *     header: { 'Authorization': 'Bearer token' },\n * };\n * const socket = connectSocket('wss://example.com', options);\n * ```\n */\nexport type SocketOptions = Omit<WechatMinigame.ConnectSocketOption, 'url' | 'complete' | 'success' | 'fail'>;","/**\n * @internal\n * 小游戏平台的 WebSocket 实现。\n */\n\nimport { RESULT_VOID, tryResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport type { DataSource } from '../defines.ts';\nimport { bufferSourceToAb, miniGameFailureToError } from '../internal/mod.ts';\nimport { asyncIOResultify } from '../utils/mod.ts';\nimport { SocketReadyState, type ISocket, type SocketListenerMap, type SocketOptions } from './socket_define.ts';\n\n/**\n * 创建并返回一个 WebSocket 连接。\n * @param url - WebSocket 服务器的 URL。\n * @param options - 透传给`wx.connectSocket`。\n * @returns 返回一个实现了 ISocket 接口的 WebSocket 对象。\n */\nexport function connectSocket(url: string, options?: SocketOptions): ISocket {\n    const socket = wx.connectSocket({\n        ...options,\n        url,\n    });\n\n    // mock WebSocket readyState\n    let readyState: number = SocketReadyState.CONNECTING;\n\n    return {\n        get readyState(): number {\n            return readyState;\n        },\n\n        addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: SocketListenerMap[K]): () => void {\n            switch (type) {\n                case 'open': {\n                    socket.onOpen(() => {\n                        readyState = SocketReadyState.OPEN;\n                        (listener as SocketListenerMap['open'])();\n                    });\n\n                    return (): void => {\n                        // 小游戏没有实现\n                    };\n                }\n                case 'close': {\n                    socket.onClose((res) => {\n                        readyState = SocketReadyState.CLOSED;\n                        (listener as SocketListenerMap['close'])(res.code, res.reason);\n                    });\n\n\n                    return (): void => {\n                        // 小游戏没有实现\n                    };\n                }\n                case 'message': {\n                    socket.onMessage((res) => {\n                        (listener as SocketListenerMap['message'])(res.data);\n                    });\n\n                    return (): void => {\n                        // 小游戏没有实现\n                    };\n                }\n                case 'error': {\n                    socket.onError((err) => {\n                        (listener as SocketListenerMap['error'])(miniGameFailureToError(err));\n                    });\n\n                    return (): void => {\n                        // 小游戏没有实现\n                    };\n                }\n                default: {\n                    throw new TypeError(`Invalid socket event type: ${type}`);\n                }\n            }\n        },\n\n        async send(data: DataSource): AsyncVoidIOResult {\n            const sendDataRes = tryResult(() => typeof data === 'string'\n                ? data\n                : bufferSourceToAb(data));\n            if (sendDataRes.isErr()) return sendDataRes.asErr();\n\n            const result = await asyncIOResultify(socket.send)({\n                data: sendDataRes.unwrap(),\n            });\n\n            return result.and(RESULT_VOID);\n        },\n\n        close(code?: number, reason?: string): void {\n            readyState = SocketReadyState.CLOSING;\n            socket.close({\n                code,\n                reason,\n            });\n        },\n    };\n}","/**\n * Web 平台的 WebSocket 实现。\n *\n * @internal\n */\n\nimport { tryAsyncResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport type { DataSource } from '../defines.ts';\nimport type { ISocket, SocketListenerMap } from './socket_define.ts';\n\n/**\n * 创建并返回一个 WebSocket 连接。\n * @param url - WebSocket 服务器的 URL。\n * @param protocols - 子协议数组。\n * @returns 返回一个实现了 ISocket 接口的 WebSocket 对象。\n */\nexport function connectSocket(url: string, protocols?: string | string[]): ISocket {\n    const socket = new WebSocket(url, protocols);\n    // 考虑到小游戏只支持string和arraybuffer，二进制强制使用arraybuffer通信\n    socket.binaryType = 'arraybuffer';\n\n    return {\n        get readyState(): number {\n            return socket.readyState;\n        },\n\n        addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: SocketListenerMap[K]): () => void {\n            switch (type) {\n                case 'open': {\n                    const socketListener = listener as SocketListenerMap['open'];\n\n                    socket.addEventListener('open', socketListener);\n\n                    return (): void => {\n                        socket.removeEventListener('open', socketListener);\n                    };\n                }\n                case 'close': {\n                    const socketListener = (ev: CloseEvent) => {\n                        (listener as SocketListenerMap['close'])(ev.code, ev.reason);\n                    };\n\n                    socket.addEventListener('close', socketListener);\n\n                    return (): void => {\n                        socket.removeEventListener('close', socketListener);\n                    };\n                }\n                case 'message': {\n                    const socketListener = (ev: MessageEvent<string | ArrayBuffer>) => {\n                        (listener as SocketListenerMap['message'])(ev.data);\n                    };\n\n                    socket.addEventListener('message', socketListener);\n\n                    return (): void => {\n                        socket.removeEventListener('message', socketListener);\n                    };\n                }\n                case 'error': {\n                    const socketListener = () => {\n                        (listener as SocketListenerMap['error'])(new Error('WebSocket error'));\n                    };\n\n                    socket.addEventListener('error', socketListener);\n\n                    return (): void => {\n                        socket.removeEventListener('error', socketListener);\n                    };\n                }\n                default: {\n                    throw new TypeError(`Invalid socket event type: ${type}`);\n                }\n            }\n        },\n\n        send(data: DataSource): AsyncVoidIOResult {\n            return tryAsyncResult(() => {\n                socket.send(data);\n            });\n        },\n\n        close: socket.close.bind(socket),\n    };\n}","/**\n * WebSocket 模块，提供创建和管理 WebSocket 连接的功能。\n * @module socket\n */\nimport { Ok, type IOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { validateSafeSocketUrl } from '../internal/validations.ts';\nimport { connectSocket as minaConnectSocket } from './mina_socket.ts';\nimport type { ISocket, SocketOptions } from './socket_define.ts';\nimport { connectSocket as webConnectSocket } from './web_socket.ts';\n\nexport * from './socket_define.ts';\n\n/**\n * 创建并返回一个 WebSocket 连接。\n * @param url - WebSocket 服务器的 URL。\n * @param options - 可选的参数。\n * @returns 返回一个实现了 ISocket 接口的 WebSocket 对象。\n * @since 1.0.0\n * @example\n * ```ts\n * const socket = connectSocket('wss://echo.websocket.org');\n *\n * socket.addEventListener('open', () => {\n *     console.log('连接已建立');\n *     socket.send('Hello, Server!');\n * });\n *\n * socket.addEventListener('message', (data) => {\n *     console.log('收到消息:', data);\n * });\n *\n * socket.addEventListener('close', (code, reason) => {\n *     console.log('连接已关闭:', code, reason);\n * });\n *\n * socket.addEventListener('error', (error) => {\n *     console.error('连接错误:', error);\n * });\n *\n * // 关闭连接\n * socket.close();\n * ```\n */\nexport function connectSocket(url: string, options?: SocketOptions): IOResult<ISocket> {\n    const urlRes = validateSafeSocketUrl(url);\n    if (urlRes.isErr()) return urlRes.asErr();\n\n    return Ok(isMinaEnv()\n        ? minaConnectSocket(url, options)\n        : webConnectSocket(url, options?.protocols));\n}","/**\n * @internal\n * 小游戏平台的存储操作实现。\n */\n\nimport { RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { asyncIOResultify, syncIOResultify } from '../utils/mod.ts';\n\n/**\n * 异步设置存储项。\n * @param key - 存储键名。\n * @param data - 要存储的字符串数据。\n * @returns 返回操作结果。\n */\nexport async function setItem(key: string, data: string): AsyncVoidIOResult {\n    const setRes = await asyncIOResultify(wx.setStorage)({\n        key,\n        data,\n    });\n\n    return setRes.and(RESULT_VOID);\n}\n\n/**\n * 异步获取存储项。\n * @param key - 存储键名。\n * @returns 返回存储的字符串数据。\n */\nexport async function getItem(key: string): AsyncIOResult<string> {\n    const getRes = await asyncIOResultify(wx.getStorage<string>)({\n        key,\n    });\n\n    return getRes.map(x => x.data);\n}\n\n/**\n * 异步移除存储项。\n * @param key - 要移除的存储键名。\n * @returns 返回操作结果。\n */\nexport async function removeItem(key: string): AsyncVoidIOResult {\n    const removeRes = await asyncIOResultify(wx.removeStorage)({\n        key,\n    });\n\n    return removeRes.and(RESULT_VOID);\n}\n\n/**\n * 异步清空所有存储数据。\n * @returns 返回操作结果。\n */\nexport async function clear(): AsyncVoidIOResult {\n    const clearRes = await asyncIOResultify(wx.clearStorage)();\n\n    return clearRes.and(RESULT_VOID);\n}\n\n/**\n * 异步获取存储项数量。\n * @returns 返回存储项的数量。\n */\nexport async function getLength(): AsyncIOResult<number> {\n    const getRes = await getStorageKeys();\n\n    return getRes.map(x => x.length);\n}\n\n/**\n * 异步检查存储项是否存在。\n * @param key - 要检查的存储键名。\n * @returns 返回是否存在的布尔值。\n */\nexport async function hasItem(key: string): AsyncIOResult<boolean> {\n    const getRes = await getStorageKeys();\n\n    return getRes.map(x => x.includes(key));\n}\n\n/**\n * 同步设置存储项。\n * @param key - 存储键名。\n * @param data - 要存储的字符串数据。\n * @returns 返回操作结果。\n */\nexport function setItemSync(key: string, data: string): VoidIOResult {\n    return syncIOResultify(wx.setStorageSync)(key, data);\n}\n\n/**\n * 同步获取存储项。\n * @param key - 存储键名。\n * @returns 返回存储的字符串数据。\n */\nexport function getItemSync(key: string): IOResult<string> {\n    return syncIOResultify(wx.getStorageSync<string>)(key);\n}\n\n/**\n * 同步移除存储项。\n * @param key - 要移除的存储键名。\n * @returns 返回操作结果。\n */\nexport function removeItemSync(key: string): VoidIOResult {\n    return syncIOResultify(wx.removeStorageSync)(key);\n}\n\n/**\n * 同步清空所有存储数据。\n * @returns 返回操作结果。\n */\nexport function clearSync(): VoidIOResult {\n    return syncIOResultify(wx.clearStorageSync)();\n}\n\n/**\n * 同步获取存储项数量。\n * @returns 返回存储项的数量。\n */\nexport function getLengthSync(): IOResult<number> {\n    return getStorageKeysSync()\n        .map(x => x.length);\n}\n\n/**\n * 同步检查存储项是否存在。\n * @param key - 要检查的存储键名。\n * @returns 返回是否存在的布尔值。\n */\nexport function hasItemSync(key: string): IOResult<boolean> {\n    return getStorageKeysSync()\n        .map(x => x.includes(key));\n}\n\n// #region Internal Functions\n\n/**\n * 获取所有存储键名。\n */\nasync function getStorageKeys(): AsyncIOResult<string[]> {\n    const getRes = await asyncIOResultify(wx.getStorageInfo)();\n\n    return getRes.map(x => x.keys);\n}\n\n/**\n * 同步获取所有存储键名。\n */\nfunction getStorageKeysSync(): IOResult<string[]> {\n    return syncIOResultify(wx.getStorageInfoSync)()\n        .map(x => x.keys);\n}\n\n// #endregion","/**\n * @internal\n * Web 平台的存储操作实现。\n */\n\nimport { Err, Ok, RESULT_VOID, tryResult, type IOResult, type VoidIOResult } from 'happy-rusty';\n\n/**\n * 设置存储项。\n * @param key - 存储键名。\n * @param data - 要存储的字符串数据。\n * @returns 返回操作结果。\n */\nexport function setItem(key: string, data: string): VoidIOResult {\n    return tryResult(() => {\n        // 可能会抛出异常，例如存储空间不足等情况\n        localStorage.setItem(key, data);\n    });\n}\n\n/**\n * 获取存储项。\n * @param key - 存储键名。\n * @returns 返回存储的字符串数据，若不存在则返回错误。\n */\nexport function getItem(key: string): IOResult<string> {\n    const data = localStorage.getItem(key);\n    return data == null ? Err(new Error(`Key '${key}' does not exist`)) : Ok(data);\n}\n\n/**\n * 移除存储项。\n * @param key - 要移除的存储键名。\n * @returns 返回操作结果。\n */\nexport function removeItem(key: string): VoidIOResult {\n    localStorage.removeItem(key);\n    return RESULT_VOID;\n}\n\n/**\n * 清空所有存储数据。\n * @returns 返回操作结果。\n */\nexport function clear(): VoidIOResult {\n    localStorage.clear();\n    return RESULT_VOID;\n}\n\n/**\n * 获取存储项数量。\n * @returns 返回存储项的数量。\n */\nexport function getLength(): IOResult<number> {\n    return Ok(localStorage.length);\n}\n\n/**\n * 检查存储项是否存在。\n * @param key - 要检查的存储键名。\n * @returns 返回是否存在的布尔值。\n */\nexport function hasItem(key: string): IOResult<boolean> {\n    return Ok(localStorage.getItem(key) != null);\n}\n","/**\n * 本地存储模块，提供同步和异步的键值对存储功能。\n * @module storage\n */\nimport type { AsyncIOResult, AsyncVoidIOResult, IOResult, VoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { validateString } from '../internal/mod.ts';\nimport {\n    clear as minaClear,\n    clearSync as minaClearSync,\n    getItem as minaGetItem,\n    getItemSync as minaGetItemSync,\n    getLength as minaGetLength,\n    getLengthSync as minaGetLengthSync,\n    hasItem as minaHasItem,\n    hasItemSync as minaHasItemSync,\n    removeItem as minaRemoveItem,\n    removeItemSync as minaRemoveItemSync,\n    setItem as minaSetItem,\n    setItemSync as minaSetItemSync,\n} from './mina_storage.ts';\nimport {\n    clear as webClear,\n    getItem as webGetItem,\n    getLength as webGetLength,\n    hasItem as webHasItem,\n    removeItem as webRemoveItem,\n    setItem as webSetItem,\n} from './web_storage.ts';\n\n/**\n * 将数据存储在本地缓存中。\n * @param key - 数据的键名。\n * @param data - 要存储的数据。\n * @returns 存储操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await setItem('username', 'john');\n * if (result.isOk()) {\n *     console.log('存储成功');\n * }\n * ```\n */\nexport async function setItem(key: string, data: string): AsyncVoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    const dataRes = validateString(data, 'data');\n    if (dataRes.isErr()) return dataRes;\n\n    return isMinaEnv()\n        ? minaSetItem(key, data)\n        : webSetItem(key, data);\n}\n\n/**\n * 从本地缓存中读取数据。\n * @param key - 数据的键名。\n * @returns 包含数据的异步结果，如果不存在则返回空字符串。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await getItem('username');\n * if (result.isOk()) {\n *     console.log('用户名:', result.unwrap());\n * }\n * ```\n */\nexport async function getItem(key: string): AsyncIOResult<string> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return isMinaEnv()\n        ? minaGetItem(key)\n        : webGetItem(key);\n}\n\n/**\n * 从本地缓存中移除指定的数据。\n * @param key - 数据的键名。\n * @returns 移除操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await removeItem('username');\n * if (result.isOk()) {\n *     console.log('移除成功');\n * }\n * ```\n */\nexport async function removeItem(key: string): AsyncVoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    return isMinaEnv()\n        ? minaRemoveItem(key)\n        : webRemoveItem(key);\n}\n\n/**\n * 清除所有的本地存储数据。\n * @returns 清除操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await clear();\n * if (result.isOk()) {\n *     console.log('所有数据已清除');\n * }\n * ```\n */\nexport function clear(): AsyncVoidIOResult {\n    return isMinaEnv()\n        ? minaClear()\n        : Promise.resolve(webClear());\n}\n\n/**\n * 获取本地存储数据的项数。\n * @returns 包含存储项数的异步结果。\n * @since 1.2.0\n * @example\n * ```ts\n * const result = await getLength();\n * if (result.isOk()) {\n *     console.log('存储项数:', result.unwrap());\n * }\n * ```\n */\nexport function getLength(): AsyncIOResult<number> {\n    return isMinaEnv()\n        ? minaGetLength()\n        : Promise.resolve(webGetLength());\n}\n\n/**\n * 检查本地存储中是否存在指定的数据。\n * @param key - 数据的键名。\n * @returns 包含是否存在的布尔值的异步结果。\n * @since 1.9.3\n * @example\n * ```ts\n * const result = await hasItem('username');\n * if (result.isOk() && result.unwrap()) {\n *     console.log('键存在');\n * }\n * ```\n */\nexport async function hasItem(key: string): AsyncIOResult<boolean> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return isMinaEnv()\n        ? minaHasItem(key)\n        : webHasItem(key);\n}\n\n/**\n * `setItem` 的同步版本，将数据存储在本地缓存中。\n * @param key - 数据的键名。\n * @param data - 要存储的数据。\n * @returns 存储操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = setItemSync('username', 'john');\n * if (result.isOk()) {\n *     console.log('存储成功');\n * }\n * ```\n */\nexport function setItemSync(key: string, data: string): VoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    const dataRes = validateString(data, 'data');\n    if (dataRes.isErr()) return dataRes;\n\n    return (isMinaEnv() ? minaSetItemSync : webSetItem)(key, data);\n}\n\n/**\n * `getItem` 的同步版本，从本地缓存中读取数据。\n * @param key - 数据的键名。\n * @returns 包含数据的操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = getItemSync('username');\n * if (result.isOk()) {\n *     console.log('用户名:', result.unwrap());\n * }\n * ```\n */\nexport function getItemSync(key: string): IOResult<string> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return (isMinaEnv() ? minaGetItemSync : webGetItem)(key);\n}\n\n/**\n * `removeItem` 的同步版本，从本地缓存中移除指定的数据。\n * @param key - 数据的键名。\n * @returns 移除操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = removeItemSync('username');\n * if (result.isOk()) {\n *     console.log('移除成功');\n * }\n * ```\n */\nexport function removeItemSync(key: string): VoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    return (isMinaEnv() ? minaRemoveItemSync : webRemoveItem)(key);\n}\n\n/**\n * `clear` 的同步版本，清除所有的本地存储数据。\n * @returns 清除操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = clearSync();\n * if (result.isOk()) {\n *     console.log('所有数据已清除');\n * }\n * ```\n */\nexport function clearSync(): VoidIOResult {\n    return (isMinaEnv() ? minaClearSync : webClear)();\n}\n\n/**\n * `getLength` 的同步版本，获取本地存储数据的项数。\n * @returns 包含存储项数的操作结果。\n * @since 1.2.0\n * @example\n * ```ts\n * const result = getLengthSync();\n * if (result.isOk()) {\n *     console.log('存储项数:', result.unwrap());\n * }\n * ```\n */\nexport function getLengthSync(): IOResult<number> {\n    return (isMinaEnv() ? minaGetLengthSync : webGetLength)();\n}\n\n/**\n * `hasItem` 的同步版本，检查本地存储中是否存在指定的数据。\n * @param key - 数据的键名。\n * @returns 包含是否存在的布尔值的操作结果。\n * @since 1.9.3\n * @example\n * ```ts\n * const result = hasItemSync('username');\n * if (result.isOk() && result.unwrap()) {\n *     console.log('键存在');\n * }\n * ```\n */\nexport function hasItemSync(key: string): IOResult<boolean> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return (isMinaEnv() ? minaHasItemSync : webHasItem)(key);\n}\n","/**\n * @internal\n * Web 平台的视频播放实现。\n */\n\n/**\n * Web平台创建视频播放器。\n * @param options - 视频配置选项。\n * @returns Video对象，模拟WechatMinigame.Video接口。\n */\nexport function createVideo(options: WechatMinigame.CreateVideoOption): WechatMinigame.Video {\n    const {\n        autoplay = false,\n        backgroundColor,\n        controls = false,\n        height,\n        initialTime,\n        loop = false,\n        muted = false,\n        objectFit,\n        playbackRate = 1,\n        poster,\n        src,\n        width,\n        x,\n        y,\n    } = options;\n\n    const video = document.createElement('video');\n\n    // 设置基本属性\n    video.src = src;\n    video.autoplay = autoplay;\n    video.controls = controls;\n    video.loop = loop;\n    video.muted = muted;\n    video.playbackRate = playbackRate;\n\n    // 设置移动端内联播放\n    video.setAttribute('playsinline', 'true');\n    video.setAttribute('webkit-playsinline', 'true');\n\n    if (poster) {\n        video.poster = poster;\n    }\n\n    // 设置尺寸\n    if (height !== undefined) {\n        video.height = height;\n    }\n    if (width !== undefined) {\n        video.width = width;\n    }\n\n    // 设置样式\n    if (backgroundColor) {\n        video.style.backgroundColor = backgroundColor;\n    }\n    if (objectFit) {\n        video.style.objectFit = objectFit;\n    }\n\n    // 设置定位\n    if (x !== undefined || y !== undefined) {\n        video.style.position = 'absolute';\n        if (x !== undefined) {\n            video.style.left = `${x}px`;\n        }\n        if (y !== undefined) {\n            video.style.top = `${y}px`;\n        }\n    }\n\n    // 添加到DOM\n    document.body.appendChild(video);\n\n    // 如果设置了初始播放位置，在元数据加载后跳转\n    if (initialTime !== undefined) {\n        video.addEventListener('loadedmetadata', () => {\n            video.currentTime = initialTime;\n        }, {\n            once: true,\n        });\n    }\n\n    // 事件监听器存储\n    type Callback = (...args: unknown[]) => void;\n    const listeners = {\n        ended: new Set<Callback>(),\n        error: new Set<Callback>(),\n        pause: new Set<Callback>(),\n        play: new Set<Callback>(),\n        progress: new Set<Callback>(),\n        timeupdate: new Set<Callback>(),\n        waiting: new Set<Callback>(),\n    };\n\n    // 绑定原生事件到监听器\n    video.addEventListener('ended', () => {\n        listeners.ended.forEach(cb => {\n            cb();\n        });\n    });\n    video.addEventListener('error', () => {\n        const errMsg = video.error?.message ?? 'MEDIA_ERR_UNKNOWN';\n        listeners.error.forEach(cb => cb({\n            errMsg,\n        }));\n    });\n    video.addEventListener('pause', () => {\n        listeners.pause.forEach(cb => {\n            cb();\n        });\n    });\n    video.addEventListener('play', () => {\n        listeners.play.forEach(cb => {\n            cb();\n        });\n    });\n    video.addEventListener('progress', () => {\n        const buffered = video.buffered;\n        const { duration } = video;\n        const bufferedPercent = buffered.length > 0 && duration > 0\n            ? (buffered.end(buffered.length - 1) / duration) * 100\n            : 0;\n        listeners.progress.forEach(cb => cb({\n            buffered: bufferedPercent,\n        }));\n    });\n    video.addEventListener('timeupdate', () => {\n        listeners.timeupdate.forEach(cb => cb({\n            position: video.currentTime,\n            duration: video.duration,\n        }));\n    });\n    video.addEventListener('waiting', () => {\n        listeners.waiting.forEach(cb => {\n            cb();\n        });\n    });\n\n    // 构建WechatMinigame.Video兼容对象\n    const videoProxy: WechatMinigame.Video = {\n        // 属性\n        get autoplay() {\n            return video.autoplay;\n        },\n        set autoplay(value) {\n            video.autoplay = value;\n        },\n\n        get backgroundColor() {\n            return video.style.backgroundColor;\n        },\n        set backgroundColor(value) {\n            video.style.backgroundColor = value;\n        },\n\n        get controls() {\n            return video.controls;\n        },\n        set controls(value) {\n            video.controls = value;\n        },\n\n        get enablePlayGesture() {\n            return false;\n        },\n        set enablePlayGesture(_value) {\n            /* web不支持 */\n        },\n\n        get enableProgressGesture() {\n            return false;\n        },\n        set enableProgressGesture(_value) {\n            /* web不支持 */\n        },\n\n        get height() {\n            return video.height;\n        },\n        set height(value) {\n            video.height = value;\n        },\n\n        get initialTime() {\n            return initialTime ?? 0;\n        },\n        set initialTime(value) {\n            video.currentTime = value;\n        },\n\n        get live() {\n            return false;\n        },\n        set live(_value) {\n            /* web不支持 */\n        },\n\n        get loop() {\n            return video.loop;\n        },\n        set loop(value) {\n            video.loop = value;\n        },\n\n        get muted() {\n            return video.muted;\n        },\n        set muted(value) {\n            video.muted = value;\n        },\n\n        get obeyMuteSwitch() {\n            return false;\n        },\n        set obeyMuteSwitch(_value) {\n            /* web不支持 */\n        },\n\n        get objectFit() {\n            return video.style.objectFit;\n        },\n        set objectFit(value) {\n            video.style.objectFit = value;\n        },\n\n        get playbackRate() {\n            return video.playbackRate;\n        },\n        set playbackRate(value) {\n            video.playbackRate = value;\n        },\n\n        get poster() {\n            return video.poster;\n        },\n        set poster(value) {\n            video.poster = value;\n        },\n\n        get showCenterPlayBtn() {\n            return false;\n        },\n        set showCenterPlayBtn(_value) {\n            /* web不支持 */\n        },\n\n        get showProgress() {\n            return video.controls;\n        },\n        set showProgress(_value) {\n            /* web通过controls控制 */\n        },\n\n        get showProgressInControlMode() {\n            return video.controls;\n        },\n        set showProgressInControlMode(_value) {\n            /* web通过controls控制 */\n        },\n\n        get src() {\n            return video.src;\n        },\n        set src(value) {\n            video.src = value;\n        },\n\n        get width() {\n            return video.width;\n        },\n        set width(value) {\n            video.width = value;\n        },\n\n        get x() {\n            return parseFloat(video.style.left) || 0;\n        },\n        set x(value) {\n            video.style.position = 'absolute';\n            video.style.left = `${value}px`;\n        },\n\n        get y() {\n            return parseFloat(video.style.top) || 0;\n        },\n        set y(value) {\n            video.style.position = 'absolute';\n            video.style.top = `${value}px`;\n        },\n\n        // on* 属性形式的事件回调\n        get onended() {\n            return video.onended as WechatMinigame.Video['onended'];\n        },\n        set onended(value) {\n            video.onended = value;\n        },\n\n        get onerror() {\n            return video.onerror as WechatMinigame.Video['onerror'];\n        },\n        set onerror(value) {\n            video.onerror = value as HTMLVideoElement['onerror'];\n        },\n\n        get onpause() {\n            return video.onpause as WechatMinigame.Video['onpause'];\n        },\n        set onpause(value) {\n            video.onpause = value;\n        },\n\n        get onplay() {\n            return video.onplay as WechatMinigame.Video['onplay'];\n        },\n        set onplay(value) {\n            video.onplay = value;\n        },\n\n        get onprogress() {\n            return video.onprogress as WechatMinigame.Video['onprogress'];\n        },\n        set onprogress(value) {\n            video.onprogress = value;\n        },\n\n        get ontimeupdate() {\n            return video.ontimeupdate as WechatMinigame.Video['ontimeupdate'];\n        },\n        set ontimeupdate(value) {\n            video.ontimeupdate = value;\n        },\n\n        get onwaiting() {\n            return video.onwaiting as WechatMinigame.Video['onwaiting'];\n        },\n        set onwaiting(value) {\n            video.onwaiting = value;\n        },\n\n        // 方法\n        play(): Promise<void> {\n            return video.play();\n        },\n\n        pause(): Promise<void> {\n            video.pause();\n            return Promise.resolve();\n        },\n\n        stop(): Promise<void> {\n            video.pause();\n            video.currentTime = 0;\n            return Promise.resolve();\n        },\n\n        seek(time: number): Promise<void> {\n            video.currentTime = time;\n            return Promise.resolve();\n        },\n\n        async requestFullScreen(direction: 0 | 90 | -90): Promise<void> {\n            // 先进入全屏\n            await video.requestFullscreen();\n\n            // 根据 direction 参数锁定屏幕方向\n            // 0: 正常竖向 (portrait)\n            // 90: 屏幕逆时针90度 (landscape-secondary，home键在右)\n            // -90: 屏幕顺时针90度 (landscape-primary，home键在左)\n            const orientationApi = screen.orientation as ScreenOrientation & {\n                lock?: (orientation: string) => Promise<void>;\n            };\n\n            if (orientationApi?.lock) {\n                let orientation: string;\n                switch (direction) {\n                    case 0:\n                        orientation = 'portrait';\n                        break;\n                    case 90:\n                        orientation = 'landscape-secondary';\n                        break;\n                    case -90:\n                        orientation = 'landscape-primary';\n                        break;\n                    default:\n                        return;\n                }\n                try {\n                    await orientationApi.lock(orientation);\n                } catch {\n                    // 屏幕方向锁定可能不被支持或被拒绝，忽略错误\n                }\n            }\n        },\n\n        exitFullScreen(): Promise<void> {\n            document.exitFullscreen();\n            return Promise.resolve();\n        },\n\n        destroy(): void {\n            video.pause();\n            video.src = '';\n            video.load();\n            video.remove();\n            // 清理所有监听器\n            Object.values(listeners).forEach(set => set.clear());\n        },\n\n        // on/off 方法形式的事件监听\n        onEnded(listener: WechatMinigame.OnEndedCallback): void {\n            listeners.ended.add(listener as Callback);\n        },\n        offEnded(listener?: WechatMinigame.OffEndedCallback): void {\n            if (listener) {\n                listeners.ended.delete(listener as Callback);\n            } else {\n                listeners.ended.clear();\n            }\n        },\n\n        onError(listener: WechatMinigame.VideoOnErrorCallback): void {\n            listeners.error.add(listener as Callback);\n        },\n        offError(listener?: WechatMinigame.VideoOffErrorCallback): void {\n            if (listener) {\n                listeners.error.delete(listener as Callback);\n            } else {\n                listeners.error.clear();\n            }\n        },\n\n        onPause(listener: WechatMinigame.OnPauseCallback): void {\n            listeners.pause.add(listener as Callback);\n        },\n        offPause(listener?: WechatMinigame.OffPauseCallback): void {\n            if (listener) {\n                listeners.pause.delete(listener as Callback);\n            } else {\n                listeners.pause.clear();\n            }\n        },\n\n        onPlay(listener: WechatMinigame.OnPlayCallback): void {\n            listeners.play.add(listener as Callback);\n        },\n        offPlay(listener?: WechatMinigame.OffPlayCallback): void {\n            if (listener) {\n                listeners.play.delete(listener as Callback);\n            } else {\n                listeners.play.clear();\n            }\n        },\n\n        onProgress(listener: WechatMinigame.OnProgressCallback): void {\n            listeners.progress.add(listener as Callback);\n        },\n        offProgress(listener?: WechatMinigame.OffProgressCallback): void {\n            if (listener) {\n                listeners.progress.delete(listener as Callback);\n            } else {\n                listeners.progress.clear();\n            }\n        },\n\n        onTimeUpdate(listener: WechatMinigame.VideoOnTimeUpdateCallback): void {\n            listeners.timeupdate.add(listener as Callback);\n        },\n        offTimeUpdate(listener?: WechatMinigame.VideoOffTimeUpdateCallback): void {\n            if (listener) {\n                listeners.timeupdate.delete(listener as Callback);\n            } else {\n                listeners.timeupdate.clear();\n            }\n        },\n\n        onWaiting(listener: WechatMinigame.OnWaitingCallback): void {\n            listeners.waiting.add(listener as Callback);\n        },\n        offWaiting(listener?: WechatMinigame.OffWaitingCallback): void {\n            if (listener) {\n                listeners.waiting.delete(listener as Callback);\n            } else {\n                listeners.waiting.clear();\n            }\n        },\n    };\n\n    return videoProxy;\n}","/**\n * 视频播放模块，提供创建和控制视频播放器的功能。\n * @module video\n */\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { createVideo as webCreateVideo } from './web_video.ts';\n\n/**\n * 创建视频播放器。\n * @param options - 视频配置选项。\n * @returns Video对象。\n * @since 2.0.0\n * @example\n * ```ts\n * const video = createVideo({\n *     src: 'https://example.com/video.mp4',\n *     width: 640,\n *     height: 360,\n *     autoplay: false,\n * });\n * video.play();\n * // 销毁视频\n * video.destroy();\n * ```\n */\nexport function createVideo(options: WechatMinigame.CreateVideoOption): WechatMinigame.Video {\n    return (isMinaEnv() ? wx.createVideo : webCreateVideo)(options);\n}\n"],"names":["RESULT_VOID","Err","Future","Ok","tryAsyncResult","Lazy","normalize","ROOT_DIR","NOT_FOUND_ERROR","NOTHING_TO_ZIP_ERROR","tryResult","RESULT_FALSE","mkdir","stat","move","readDir","readFile","remove","writeFile","exists","dirname","appendFile","copy","SEPARATOR","emptyDir","readTextFile","readJsonFile","writeJsonFile","downloadFile","FetchError","uploadFile","basename","unzip","unzipFromUrl","zip","zipFromUrl","ABORT_ERROR","compressSync","isFileHandleLike","isFileHandle","path","handle","readDirSync","statSync","minaMkdir","webMkdir","minaMove","webMove","minaReadDir","minaReadFile","webReadFile","minaRemove","webRemove","minaStat","minaWriteFile","webWriteFile","minaAppendFile","webAppendFile","minaCopy","webCopy","minaExists","webExists","minaEmptyDir","webEmptyDir","minaReadJsonFile","webReadJsonFile","minaReadTextFile","webReadTextFile","minaWriteJsonFile","webWriteJsonFile","minaDownloadFile","webDownloadFile","minaUploadFile","webUploadFile","minaUnzip","webUnzip","minaUnzipFromUrl","webUnzipFromUrl","minaZip","webZip","minaZipFromUrl","webZipFromUrl","mkdirSync","moveSync","readFileSync","removeSync","writeFileSync","existsSync","appendFileSync","copySync","emptyDirSync","readTextFileSync","readJsonFileSync","writeJsonFileSync","unzipSync","decompressSync","zipSync","minaMkdirSync","webMkdirSync","minaMoveSync","webMoveSync","minaReadDirSync","minaReadFileSync","webReadFileSync","minaRemoveSync","webRemoveSync","minaStatSync","minaWriteFileSync","webWriteFileSync","minaAppendFileSync","webAppendFileSync","minaCopySync","webCopySync","minaExistsSync","webExistsSync","minaEmptyDirSync","webEmptyDirSync","minaReadJsonFileSync","webReadJsonFileSync","minaReadTextFileSync","webReadTextFileSync","minaWriteJsonFileSync","webWriteJsonFileSync","minaUnzipSync","webUnzipSync","minaZipSync","webZipSync","Once","writeText","readText","minaWriteText","webWriteText","minaReadText","webReadText","encodeUtf8","webEncodeUtf8","decodeUtf8","webDecodeUtf8","minaEncodeUtf8","minaDecodeUtf8","createHMAC","sha1","sha256","sha384","sha512","ByteStringBuffer","encodeByteString","encodeHex","pureCreateHMAC","webCreateHMAC","getRandomValues","randomUUID","minaGetRandomValues","webGetRandomValues","minaRandomUUID","webRandomUUID","importPublicKey","importKey","encodeBase64","decodeByteString","minaImportPublicKey","webImportPublicKey","SHA1","SHA256","SHA384","SHA512","pureSha1","webSHA","pureSha256","pureSha384","pureSha512","addErrorListener","addUnhandledrejectionListener","addResizeListener","minaAddErrorListener","webAddErrorListener","minaAddUnhandledrejectionListener","webAddUnhandledrejectionListener","minaAddResizeListener","webAddResizeListener","TIMEOUT_ERROR","webFetch","createImageFromUrl","createImageFromFile","readBlobFile","minaCreateImageFromUrl","webCreateImageFromUrl","minaCreateImageFromFile","webCreateImageFromFile","getCurrentPosition","minaGetCurrentPosition","webGetCurrentPosition","getNetworkType","addNetworkChangeListener","minaGetNetworkType","webGetNetworkType","minaAddNetworkChangeListener","webAddNetworkChangeListener","OnceAsync","connectSocket","minaConnectSocket","webConnectSocket","setItem","getItem","removeItem","clear","getLength","hasItem","setItemSync","getItemSync","removeItemSync","clearSync","getLengthSync","hasItemSync","minaSetItem","webSetItem","minaGetItem","webGetItem","minaRemoveItem","webRemoveItem","minaClear","webClear","minaGetLength","webGetLength","minaHasItem","webHasItem","minaSetItemSync","minaGetItemSync","minaRemoveItemSync","minaClearSync","minaGetLengthSync","minaHasItemSync","createVideo","webCreateVideo"],"mappings":"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"}