{"version":3,"file":"main.cjs","sources":["../src/std/assert/assertions.ts","../src/macros/env.ts","../src/std/fs/fs_helpers.ts","../src/std/utils/mod.ts","../src/std/fs/mina_fs_shared.ts","../src/std/fs/mina_fs_async.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/codec/mina_codec.ts","../src/std/codec/web_codec.ts","../src/std/codec/mod.ts","../src/std/base64/base64.ts","../src/std/base64/mina_base64.ts","../src/std/base64/web_base64.ts","../src/std/base64/mod.ts","../src/std/clipboard/mina_clipboard.ts","../src/std/clipboard/web_clipboard.ts","../src/std/clipboard/mod.ts","../src/std/crypto/hmac/mina_hmac.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/mina_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/device.ts","../src/std/platform/target.ts","../src/std/platform/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"],"sourcesContent":["import invariant from 'tiny-invariant';\n\n/**\n * 断言传入的是一个字符串。\n * @param str - 需要断言的字符串。\n */\nexport function assertString(str: string): void {\n    invariant(typeof str === 'string', () => `Param must be a string but received ${ str }`);\n}\n\n/**\n * 断言传入的 URL 是否为 `https` 协议。\n * @param url - 需要断言的 URL 字符串。\n */\nexport function assertSafeUrl(url: string): void {\n    invariant(typeof url === 'string', () => `Url must be a string but received ${ url }`);\n    invariant(url.startsWith('https://'), () => `Url must start with https:// but received ${ url }`);\n}\n\n/**\n * 断言传入的 WebSocket URL 是否为 `wss` 协议。\n * @param url - 需要断言的 WebSocket URL 字符串。\n */\nexport function assertSafeSocketUrl(url: string): void {\n    invariant(typeof url === 'string', () => `SocketUrl must be a string but received ${ url }`);\n    invariant(url.startsWith('wss://'), () => `SocketUrl must start with wss:// but received ${ url }`);\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}","import { ABORT_ERROR, toFileSystemHandleLike, type FileSystemFileHandleLike, type FileSystemHandleLike } from 'happy-opfs';\n\n/**\n * 将 `FileSystemHandleLike` 转换为小游戏 `Stats`。\n * @param handleLike - FileSystemHandleLike\n * @returns\n */\nexport function convertFileSystemHandleLikeToStats(handleLike: FileSystemHandleLike): WechatMinigame.Stats {\n    const { kind } = handleLike;\n    const isFile = kind === 'file';\n    const isDirectory = kind === 'directory';\n\n    let size = 0;\n    let lastModifiedTime = 0;\n\n    if (isFile) {\n        const file = handleLike as FileSystemFileHandleLike;\n\n        size = file.size\n        lastModifiedTime = file.lastModified;\n    }\n\n    const stats: WechatMinigame.Stats = {\n        isFile: (): boolean => isFile,\n        isDirectory: (): boolean => isDirectory,\n        size,\n        lastModifiedTime,\n        lastAccessedTime: 0,\n        mode: 0,\n    };\n\n    return stats;\n}\n\n/**\n * 将`FileSystemHandle`转换为小游戏 `Stats`。\n * @param handle - FileSystemHandle\n * @returns\n */\nexport async function convertFileSystemHandleToStats(handle: FileSystemHandle): Promise<WechatMinigame.Stats> {\n    const handleLike = await toFileSystemHandleLike(handle);\n    return convertFileSystemHandleLikeToStats(handleLike);\n}\n\n/**\n * Creates an `AbortError` Error.\n * @returns An `AbortError` Error.\n */\nexport function createAbortError(): Error {\n    const error = new Error();\n    error.name = ABORT_ERROR;\n\n    return error;\n}","import { Err, Ok, type AsyncIOResult, type IOResult } from 'happy-rusty';\n\n/**\n * 将小游戏失败回调的结果转换为 `Error` 类型。\n *\n * 如果是异步 API 的 `fail` 回调返回的结果通常是 `WechatMinigame.GeneralCallbackResult` 或者变体类型，\n * 如果是同步 API throw 的异常通常是一个类似 `Error` 的类型。\n * @param err - 小游戏错误对象。\n * @returns 转换后的 `Error` 对象。\n */\nexport function miniGameFailureToError(err: WechatMinigame.GeneralCallbackResult | Error): Error {\n    return new Error((err as WechatMinigame.GeneralCallbackResult).errMsg ?? (err as Error).message);\n}\n\n/**\n * 将错误对象转换为 IOResult 类型。\n * @typeParam T - Result 的 Ok 类型。\n * @param err - 错误对象。\n * @returns 转换后的 IOResult 对象。\n */\nexport function miniGameFailureToResult<T>(err: WechatMinigame.GeneralCallbackResult): IOResult<T> {\n    return Err(miniGameFailureToError(err));\n}\n\n/**\n * 执行同步函数，预期异常都是 `WechatMinigame.GeneralCallbackResult`。\n * @param op - 需要执行的同步函数。\n * @returns IOResult。\n */\nexport function tryGeneralSyncOp<T>(op: () => T): IOResult<T> {\n    try {\n        return Ok(op());\n    } catch (e) {\n        return miniGameFailureToResult(e as WechatMinigame.GeneralCallbackResult);\n    }\n}\n\n/**\n * 执行异步函数，预期异常都是 `WechatMinigame.GeneralCallbackResult`。\n * @param op - 需要执行的异步函数。\n * @returns AsyncIOResult。\n */\nexport async function tryGeneralAsyncOp<T>(op: () => Promise<T>): AsyncIOResult<T> {\n    try {\n        return Ok(await op());\n    } catch (e) {\n        return miniGameFailureToResult(e as WechatMinigame.GeneralCallbackResult);\n    }\n}\n\n/**\n * 执行同步函数，预期异常都是 `DOMException`。\n * @param op - 需要执行的同步函数。\n * @returns IOResult。\n */\nexport function tryDOMSyncOp<T>(op: () => T): IOResult<T> {\n    try {\n        return Ok(op());\n    } catch (e) {\n        return Err(e as DOMException);\n    }\n}\n\n/**\n * 执行异步函数，预期异常都是 `DOMException`。\n * @param op - 需要执行的异步函数。\n * @returns AsyncIOResult。\n */\nexport async function tryDOMAsyncOp<T>(op: () => Promise<T>): AsyncIOResult<T> {\n    try {\n        return Ok(await op());\n    } catch (e) {\n        return Err(e as DOMException);\n    }\n}\n\n/**\n * 将 BufferSource 转换为 Uint8Array。\n * @param data - 需要转换的 BufferSource。\n * @returns Uint8Array。\n */\nexport function bufferSource2U8a(data: BufferSource): Uint8Array {\n    if (data instanceof Uint8Array) {\n        return data;\n    }\n\n    if (data instanceof ArrayBuffer) {\n        return new Uint8Array(data);\n    }\n\n    if (ArrayBuffer.isView(data)) {\n        return new Uint8Array(data.byteOffset === 0 ? data.buffer : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));\n    }\n\n    throw new TypeError(`BufferSource is not ArrayBuffer or ArrayBufferView`);\n}\n\n/**\n * 将 BufferSource 转换为 ArrayBuffer。\n * @param data - 需要转换的 BufferSource。\n * @returns ArrayBuffer。\n */\nexport function bufferSource2Ab(data: BufferSource): ArrayBuffer {\n    if (data instanceof ArrayBuffer) {\n        return data;\n    }\n\n    if (ArrayBuffer.isView(data)) {\n        return (data.byteOffset === 0 ? data.buffer : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)) as ArrayBuffer;\n    }\n\n    throw new TypeError(`BufferSource is not ArrayBuffer or ArrayBufferView`);\n}","/**\n * 同步/异步的公共代码。\n */\n\nimport { assertAbsolutePath, NOT_FOUND_ERROR, type ExistsOptions } from 'happy-opfs';\nimport { Err, Ok, RESULT_FALSE, RESULT_VOID, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { assertString } from '../assert/assertions.ts';\nimport { bufferSource2Ab, miniGameFailureToError } from '../utils/mod.ts';\nimport type { FileEncoding, ReadOptions, WriteFileContent } from './fs_define.ts';\n\n/**\n * 小游戏文件系统管理器实例。\n *\n * for tree shake\n */\nlet fs: WechatMinigame.FileSystemManager;\n\n/**\n * 获取小游戏文件系统管理器实例。\n * @returns 文件系统管理器实例。\n */\nexport function getFs(): WechatMinigame.FileSystemManager {\n    fs ??= wx.getFileSystemManager();\n    return fs;\n}\n\n/**\n * 根路径，`wxfile://` 或 `http://`。\n *\n * for tree shake\n */\nlet rootPath: string;\n\n/**\n * 用户可写的根路径， `wxfile://usr` 或 `http://usr`。\n *\n * for tree shake\n */\nlet rootUsrPath: string;\n\n/**\n * 获取文件系统的根路径。\n * @returns 文件系统的根路径。\n */\nexport function getRootUsrPath(): string {\n    rootUsrPath ??= wx.env.USER_DATA_PATH;\n    // trim `usr`\n    rootPath ??= rootUsrPath.slice(0, rootUsrPath.indexOf('usr'));\n\n    return rootUsrPath;\n}\n\n/**\n * 获取给定路径的绝对路径。\n * @param path - 相对USER_DATA_PATH的相对路径，也必须以`/`开头。\n * @returns 转换后的绝对路径。\n */\nexport function getAbsolutePath(path: string): string {\n    assertString(path);\n\n    const usrPath = getRootUsrPath();\n\n    // usr or tmp\n    if (path.startsWith(rootPath)) {\n        return path;\n    }\n\n    assertAbsolutePath(path);\n    return usrPath + path;\n}\n\n/**\n * 判断是否文件或者文件夹不存在。\n * @param err - 错误对象。\n */\nexport function isNotFoundIOError(err: WechatMinigame.FileError): boolean {\n    // 1300002\tno such file or directory ${path}\n    // 可能没有errCode\n    // 同步接口抛出异常是 `Error`，但 instanceof Error 却是 false\n    return err.errCode === 1300002 || (err.errMsg ?? (err as unknown as Error).message).includes('no such file or directory');\n}\n\n/**\n * 判断是否文件或者文件夹已存在。\n * @param err - 错误对象。\n */\nexport function isAlreadyExistsIOError(err: WechatMinigame.FileError): boolean {\n    // 1301005\tfile already exists ${dirPath}\t已有同名文件或目录\n    // 可能没有errCode\n    // 同步接口抛出异常是 `Error`，但 instanceof Error 却是 false\n    return err.errCode === 1301005 || (err.errMsg ?? (err as unknown as Error).message).includes('already exists');\n}\n\n/**\n * 将错误对象转换为 IOResult 类型。\n * @typeParam T - Result 的 Ok 类型。\n * @param err - 错误对象。\n * @returns 转换后的 IOResult 对象。\n */\nexport function fileErrorToResult<T>(err: WechatMinigame.FileError): IOResult<T> {\n    const error = miniGameFailureToError(err);\n\n    if (isNotFoundIOError(err)) {\n        error.name = NOT_FOUND_ERROR;\n    }\n\n    return Err(error);\n}\n\n/**\n * Whether the error is a `NotFoundError`.\n * @param err - The error to check.\n * @returns `true` if the error is a `NotFoundError`, otherwise `false`.\n */\nexport function isNotFoundError(err: Error): boolean {\n    return err.name === NOT_FOUND_ERROR;\n}\n\n/**\n * 处理 `mkdir` 的错误。\n */\nexport function errToMkdirResult(err: WechatMinigame.FileError): VoidIOResult {\n    // 已存在当做成功\n    return isAlreadyExistsIOError(err) ? RESULT_VOID : fileErrorToResult(err);\n}\n\n/**\n * 获取读取文件的编码。\n */\nexport function getReadFileEncoding(options?: ReadOptions): FileEncoding | undefined {\n    // NOTE: 想要读取 ArrayBuffer 就不能传 encoding\n    // 如果传了 'binary'，读出来的是字符串\n    let encoding: FileEncoding | undefined = options?.encoding;\n    if (!encoding || encoding === 'binary') {\n        encoding = undefined;\n    }\n\n    return encoding;\n}\n\n/**\n * 处理 `remove` 的错误。\n */\nexport function errToRemoveResult(err: WechatMinigame.FileError): VoidIOResult {\n    // 目标 path 本就不存在，当做成功\n    return isNotFoundIOError(err) ? RESULT_VOID : fileErrorToResult(err);\n}\n\ninterface GetWriteFileContents {\n    data: string | ArrayBuffer;\n    encoding: FileEncoding;\n}\n/**\n * 获取写入文件的参数。\n */\nexport function getWriteFileContents(contents: WriteFileContent): GetWriteFileContents {\n    const isBin = typeof contents !== 'string';\n\n    const encoding = isBin ? 'binary' : 'utf8'\n    const data = isBin ? bufferSource2Ab(contents) : contents;\n\n    const res: GetWriteFileContents = {\n        data,\n        encoding,\n    };\n\n    return res;\n}\n\n/**\n * 获取 `exists` 的结果。\n */\nexport function getExistsResult(statsResult: IOResult<WechatMinigame.Stats>, options?: ExistsOptions): IOResult<boolean> {\n    return statsResult.andThen(stats => {\n        const { isDirectory = false, isFile = false } = options ?? {};\n\n        if (isDirectory && isFile) {\n            throw new TypeError('ExistsOptions.isDirectory and ExistsOptions.isFile must not be true together.');\n        }\n\n        const notExist =\n            (isDirectory && stats.isFile())\n            || (isFile && stats.isDirectory());\n\n        return Ok(!notExist);\n    }).orElse((err): IOResult<boolean> => {\n        return isNotFoundError(err) ? RESULT_FALSE : Err(err);\n    });\n}","import type { FetchResponse, FetchTask } from '@happy-ts/fetch-t';\nimport { basename, dirname, join } from '@std/path/posix';\nimport * as fflate from 'fflate/browser';\nimport type { ExistsOptions, WriteOptions, ZipOptions } from 'happy-opfs';\nimport { Err, Ok, RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { assertSafeUrl } from '../assert/assertions.ts';\nimport { miniGameFailureToResult } from '../utils/mod.ts';\nimport type { DownloadFileOptions, ReadFileContent, ReadOptions, StatOptions, UploadFileOptions, WriteFileContent } from './fs_define.ts';\nimport { createAbortError } from './fs_helpers.ts';\nimport { errToMkdirResult, errToRemoveResult, fileErrorToResult, getAbsolutePath, getExistsResult, getFs, getReadFileEncoding, getRootUsrPath, getWriteFileContents, isNotFoundError } from './mina_fs_shared.ts';\n\n/**\n * 递归创建文件夹，相当于`mkdir -p`。\n * @param dirPath - 需要创建的目录路径。\n * @returns 创建结果的异步操作，成功时返回 true。\n */\nexport async function mkdir(dirPath: string): AsyncVoidIOResult {\n    const absPath = getAbsolutePath(dirPath);\n\n    // 根目录无需创建\n    if (absPath === getRootUsrPath()) {\n        return RESULT_VOID;\n    }\n\n    const statRes = await stat(absPath);\n\n    if (statRes.isOk()) {\n        // 存在则不创建\n        return RESULT_VOID;\n    }\n\n    const future = new Future<VoidIOResult>();\n\n    getFs().mkdir({\n        dirPath: absPath,\n        recursive: true,\n        success(): void {\n            future.resolve(RESULT_VOID);\n        },\n        fail(err): void {\n            future.resolve(errToMkdirResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\n/**\n * 重命名文件或目录。\n * @param srcPath - 原路径。\n * @param destPath - 新路径。\n * @returns 重命名操作的异步结果，成功时返回 true。\n */\nexport function move(srcPath: string, destPath: string): AsyncVoidIOResult {\n    const absSrcPath = getAbsolutePath(srcPath);\n    const absDestPath = getAbsolutePath(destPath);\n\n    const future = new Future<VoidIOResult>();\n\n    getFs().rename({\n        oldPath: absSrcPath,\n        newPath: absDestPath,\n        success(): void {\n            future.resolve(RESULT_VOID);\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\n/**\n * 读取目录下的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 包含目录内容的字符串数组的异步操作。\n */\nexport function readDir(dirPath: string): AsyncIOResult<string[]> {\n    const absPath = getAbsolutePath(dirPath);\n\n    const future = new Future<IOResult<string[]>>();\n\n    getFs().readdir({\n        dirPath: absPath,\n        success(res): void {\n            future.resolve(Ok(res.files));\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\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 - 读取选项，指定编码为 'binary'。\n * @returns 包含文件内容的 ArrayBuffer 的异步操作。\n */\nexport function readFile(filePath: string, options?: ReadOptions & {\n    encoding: 'binary',\n}): AsyncIOResult<ArrayBuffer>;\n\n/**\n * 读取文件内容，可选地指定编码和返回类型。\n * @template T - 返回内容的类型。\n * @param filePath - 文件路径。\n * @param options - 可选的读取选项。\n * @returns 包含文件内容的异步操作。\n */\nexport function readFile<T extends ReadFileContent>(filePath: string, options?: ReadOptions): AsyncIOResult<T> {\n    const absPath = getAbsolutePath(filePath);\n    const encoding = getReadFileEncoding(options);\n\n    const future = new Future<IOResult<T>>();\n\n    getFs().readFile({\n        filePath: absPath,\n        encoding,\n        success(res): void {\n            future.resolve(Ok(res.data as T));\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\n/**\n * 删除指定路径的文件或目录。\n * @param path - 需要删除的文件或目录的路径。\n * @returns 删除操作的异步结果，成功时返回 true。\n */\nexport async function remove(path: string): AsyncVoidIOResult {\n    const statRes = await stat(path);\n\n    if (statRes.isErr()) {\n        // 不存在当做成功\n        return isNotFoundError(statRes.unwrapErr()) ? RESULT_VOID : statRes.asErr();\n    }\n\n    const absPath = getAbsolutePath(path);\n\n    const future = new Future<VoidIOResult>();\n\n    // 文件夹还是文件\n    if (statRes.unwrap().isDirectory()) {\n        getFs().rmdir({\n            dirPath: absPath,\n            recursive: true,\n            success(): void {\n                future.resolve(RESULT_VOID);\n            },\n            fail(err): void {\n                future.resolve(errToRemoveResult(err));\n            },\n        });\n    } else {\n        getFs().unlink({\n            filePath: absPath,\n            success(): void {\n                future.resolve(RESULT_VOID);\n            },\n            fail(err): void {\n                future.resolve(errToRemoveResult(err));\n            },\n        });\n    }\n\n    return future.promise;\n}\n\n/**\n * 获取文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @param options - 可选选项。\n * @returns 包含状态信息的异步操作。\n */\nexport function stat(path: string): 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 function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    type T = WechatMinigame.Stats | WechatMinigame.FileStats[];\n\n    const absPath = getAbsolutePath(path);\n\n    const future = new Future<IOResult<T>>();\n\n    getFs().stat({\n        path: absPath,\n        recursive: options?.recursive ?? false,\n        success(res): void {\n            future.resolve(Ok(res.stats));\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\n/**\n * 将内容写入文件。\n * @param filePath - 文件路径。\n * @param contents - 要写入的内容。\n * @param options - 可选的写入选项。\n * @returns 写入操作的异步结果，成功时返回 true。\n */\nexport async function writeFile(filePath: string, contents: WriteFileContent, options?: WriteOptions): AsyncVoidIOResult {\n    const absPath = getAbsolutePath(filePath);\n\n    // 默认创建\n    const { append = false, create = true } = options ?? {};\n\n    if (create) {\n        const res = await mkdir(dirname(absPath));\n        if (res.isErr()) {\n            return res;\n        }\n    }\n\n    const fs = getFs();\n    let method: typeof fs.appendFile | typeof fs.writeFile = fs.writeFile;\n\n    if (append) {\n        // append先判断文件是否存在\n        const res = await exists(absPath);\n        if (res.isErr()) {\n            return res.asErr();\n        }\n\n        if (res.unwrap()) {\n            // 文件存在才能使用appendFile\n            method = fs.appendFile;\n        }\n    }\n\n    const { data, encoding } = getWriteFileContents(contents);\n\n    const future = new Future<VoidIOResult>();\n\n    method({\n        filePath: absPath,\n        data,\n        encoding,\n        success(): void {\n            future.resolve(RESULT_VOID);\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\n/**\n * 向文件追加内容。\n * @param filePath - 文件路径。\n * @param contents - 要追加的内容。\n * @returns 追加操作的异步结果，成功时返回 true。\n */\nexport function appendFile(filePath: string, contents: WriteFileContent): AsyncVoidIOResult {\n    return writeFile(filePath, contents, {\n        append: true,\n    });\n}\n\nfunction copyFile(srcPath: string, destPath: string): AsyncVoidIOResult {\n    const future = new Future<VoidIOResult>();\n\n    getFs().copyFile({\n        srcPath,\n        destPath,\n        success(): void {\n            future.resolve(RESULT_VOID);\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\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 absSrcPath = getAbsolutePath(srcPath);\n    const absDestPath = getAbsolutePath(destPath);\n\n    return (await stat(absSrcPath, {\n        recursive: true,\n    })).andThenAsync(async statsArray => {\n        // directory\n        if (Array.isArray(statsArray)) {\n            for (const { path, stats } of statsArray) {\n                // 不能用join\n                const srcEntryPath = absSrcPath + path;\n                const destEntryPath = absDestPath + path;\n\n                const res = await (stats.isDirectory()\n                    ? mkdir(destEntryPath)\n                    : copyFile(srcEntryPath, destEntryPath));\n\n                if (res.isErr()) {\n                    return res;\n                }\n            }\n\n            return RESULT_VOID;\n        } else {\n            // file\n            return (await mkdir(dirname(absDestPath))).andThenAsync(() => {\n                return copyFile(absSrcPath, absDestPath);\n            });\n        }\n    });\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 res = await stat(path);\n    return getExistsResult(res, options);\n}\n\n/**\n * 清空目录中的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 清空操作的异步结果，成功时返回 true。\n */\nexport async function emptyDir(dirPath: string): AsyncVoidIOResult {\n    const res = await readDir(dirPath);\n    if (res.isErr()) {\n        // 不存在则创建\n        return isNotFoundError(res.unwrapErr()) ? mkdir(dirPath) : res.asErr();\n    }\n\n    const tasks = res.unwrap().map(name => remove(join(dirPath, name)));\n\n    const allRes = await Promise.all(tasks);\n    // anyone failed?\n    const fail = allRes.find(x => x.isErr());\n\n    return fail ?? RESULT_VOID;\n}\n\n/**\n * 读取文件并解析为 JSON。\n * @param filePath - 文件路径。\n * @returns 读取结果。\n */\nexport async function readJsonFile<T>(filePath: string): AsyncIOResult<T> {\n    return (await readTextFile(filePath)).andThenAsync(async contents => {\n        try {\n            return Ok(JSON.parse(contents));\n        } catch (e) {\n            return Err(e as Error);\n        }\n    });\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 * 下载文件并保存到临时文件。\n * @param fileUrl - 文件的网络 URL。\n * @param options - 可选参数。\n * @returns 下载操作的异步结果，成功时返回 true。\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 下载操作的异步结果，成功时返回 true。\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    assertSafeUrl(fileUrl);\n\n    let absFilePath: string | undefined = undefined;\n    if (typeof filePath === 'string') {\n        absFilePath = getAbsolutePath(filePath);\n    } else {\n        options = filePath;\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    const task = wx.downloadFile({\n        ...rest,\n        url: fileUrl,\n        filePath: absFilePath,\n        async success(res): Promise<void> {\n            if (aborted) {\n                future.resolve(Err(createAbortError()));\n                return;\n            }\n\n            const { statusCode } = res;\n\n            if (statusCode >= 200 && statusCode < 300) {\n                future.resolve(Ok(res));\n                return;\n            }\n\n            // remove the not expected file but no need to actively delete the temporary file\n            if (res.filePath) {\n                await remove(res.filePath);\n            }\n\n            future.resolve(Err(new Error(statusCode.toString())));\n        },\n        fail(err): void {\n            future.resolve(aborted ? Err(createAbortError()) : miniGameFailureToResult(err));\n        },\n    });\n\n    if (typeof onProgress === 'function') {\n        task.onProgressUpdate(res => {\n            const { totalBytesExpectedToWrite, totalBytesWritten } = res;\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    return {\n        abort(): void {\n            aborted = true;\n            task?.abort();\n        },\n\n        get aborted(): boolean {\n            return aborted;\n        },\n\n        get response(): FetchResponse<T> {\n            return future.promise;\n        },\n    };\n}\n\n/**\n * 文件上传。\n * @param filePath - 需要上传的文件路径。\n * @param fileUrl - 目标网络 URL。\n * @param options - 可选参数。\n * @returns 上传操作的异步结果，成功时返回 true。\n */\nexport function uploadFile(filePath: string, fileUrl: string, options?: UploadFileOptions): FetchTask<WechatMinigame.UploadFileSuccessCallbackResult> {\n    type T = WechatMinigame.UploadFileSuccessCallbackResult;\n\n    assertSafeUrl(fileUrl);\n    const absPath = getAbsolutePath(filePath);\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: absPath,\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 response(): FetchResponse<T> {\n            return future.promise;\n        },\n    };\n}\n\n/**\n * 解压 zip 文件。\n * @param zipFilePath - 要解压的 zip 文件路径。\n * @param targetPath - 要解压到的目标文件夹路径。\n * @returns 解压操作的异步结果。\n */\nexport function unzip(zipFilePath: string, targetPath: string): AsyncVoidIOResult {\n    const absZipPath = getAbsolutePath(zipFilePath);\n    const absTargetPath = getAbsolutePath(targetPath);\n\n    const future = new Future<VoidIOResult>();\n\n    getFs().unzip({\n        zipFilePath: absZipPath,\n        targetPath: absTargetPath,\n        success(): void {\n            future.resolve(RESULT_VOID);\n        },\n        fail(err): void {\n            future.resolve(fileErrorToResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\n/**\n * 从网络下载 zip 文件并解压。\n * @param zipFileUrl - Zip 文件的网络地址。\n * @param targetPath - 要解压到的目标文件夹路径。\n * @param options - 可选的下载参数。\n * @returns 下载并解压操作的异步结果。\n */\nexport async function unzipFromUrl(zipFileUrl: string, targetPath: string, options?: DownloadFileOptions): AsyncVoidIOResult {\n    return (await downloadFile(zipFileUrl, options).response).andThenAsync(({ tempFilePath }) => {\n        return unzip(tempFilePath, targetPath);\n    });\n}\n\n/**\n * 压缩文件到内存。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩成功的异步结果。\n */\nexport async function zip(sourcePath: string, options?: ZipOptions): AsyncIOResult<Uint8Array>;\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<T>(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): AsyncIOResult<T> {\n    const absSourcePath = getAbsolutePath(sourcePath);\n\n    let absZipFilePath: string;\n    if (typeof zipFilePath === 'string') {\n        absZipFilePath = getAbsolutePath(zipFilePath);\n    } else {\n        options = zipFilePath;\n    }\n\n    return (await stat(absSourcePath)).andThenAsync(async stats => {\n        const zipped: fflate.AsyncZippable = {};\n\n        const sourceName = basename(absSourcePath);\n\n        if (stats.isFile()) {\n            // file\n            const res = await readFile(absSourcePath);\n            if (res.isErr()) {\n                return res.asErr();\n            }\n\n            zipped[sourceName] = new Uint8Array(res.unwrap());\n        } else {\n            // directory\n            const res = await stat(absSourcePath, {\n                recursive: true,\n            });\n            if (res.isErr()) {\n                return res.asErr();\n            }\n\n            // default to preserve root\n            const preserveRoot = options?.preserveRoot ?? true;\n\n            for (const { path, stats } of res.unwrap()) {\n                if (stats.isFile()) {\n                    const entryName = preserveRoot ? join(sourceName, path) : path;\n                    // 不能用 join，否则 http://usr 会变成 http:/usr\n                    const res = await readFile(absSourcePath + path);\n                    if (res.isErr()) {\n                        return res.asErr();\n                    }\n\n                    zipped[entryName] = new Uint8Array(res.unwrap());\n                }\n            }\n        }\n\n        const future = new Future<IOResult<T>>();\n\n        fflate.zip(zipped, {\n            consume: true,\n        }, async (err, u8a) => {\n            if (err) {\n                future.resolve(Err(err));\n                return;\n            }\n\n            if (absZipFilePath) {\n                const res = await writeFile(absZipFilePath, u8a);\n                future.resolve(res as IOResult<T>);\n            } else {\n                future.resolve(Ok(u8a as T));\n            }\n        });\n\n        return await future.promise;\n    });\n}\n\ntype ZipFromUrlOptions = DownloadFileOptions & ZipOptions;\n/**\n * 下载文件并压缩到内存。\n * @param sourceUrl - 要下载的文件 URL。\n * @param options - 合并的下载和压缩选项。\n */\nexport async function zipFromUrl(sourceUrl: string, options?: ZipFromUrlOptions): AsyncIOResult<Uint8Array>;\n/**\n * 下载文件并压缩为 zip 文件。\n * @param sourceUrl - 要下载的文件 URL。\n * @param zipFilePath - 要输出的 zip 文件路径。\n * @param options - 合并的下载和压缩选项。\n */\nexport async function zipFromUrl(sourceUrl: string, zipFilePath: string, options?: ZipFromUrlOptions): AsyncVoidIOResult;\nexport async function zipFromUrl<T>(sourceUrl: string, zipFilePath?: string | ZipFromUrlOptions, options?: ZipFromUrlOptions): AsyncIOResult<T> {\n    if (typeof zipFilePath !== 'string') {\n        options = zipFilePath;\n        zipFilePath = undefined;\n    }\n\n    return (await downloadFile(sourceUrl, options).response).andThenAsync(async ({ tempFilePath }) => {\n        return await (zipFilePath\n            ? zip(tempFilePath, zipFilePath, options)\n            : zip(tempFilePath, options)) as IOResult<T>;\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    readDir as webReadDir,\n    readFile as webReadFile,\n    readJsonFile as webReadJsonFile,\n    readTextFile as webReadTextFile,\n    remove as webRemove,\n    stat as webStat,\n    unzip as webUnzip,\n    unzipFromUrl as webUnzipFromUrl,\n    uploadFile as webUploadFile,\n    writeFile as webWriteFile,\n    zip as webZip,\n    zipFromUrl as webZipFromUrl,\n    type DownloadFileTempResponse,\n    type WriteOptions,\n    type ZipOptions,\n} from 'happy-opfs';\nimport { Ok, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport type { StatOptions, UnionDownloadFileOptions, UnionUploadFileOptions, WriteFileContent, ZipFromUrlOptions } from './fs_define.ts';\nimport { convertFileSystemHandleToStats } from './fs_helpers.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    zip as minaZip,\n    zipFromUrl as minaZipFromUrl,\n} from './mina_fs_async.ts';\n\n/**\n * 递归创建文件夹，相当于`mkdir -p`。\n * @param dirPath - 将要创建的目录的路径。\n * @returns 创建成功返回 true 的异步操作结果。\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 重命名成功返回 true 的异步操作结果。\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 */\nexport async function readDir(dirPath: string): AsyncIOResult<string[]> {\n    if (isMinaEnv()) {\n        return minaReadDir(dirPath);\n    }\n\n    return (await webReadDir(dirPath)).andThenAsync(async entries => {\n        const items: string[] = [];\n        for await (const { path } of entries) {\n            items.push(path);\n        }\n        return Ok(items);\n    });\n}\n\n/**\n * 读取文件内容。\n * @param filePath - 文件的路径。\n * @returns 包含文件内容的 ArrayBuffer 的异步操作结果。\n */\nexport function readFile(filePath: string): AsyncIOResult<ArrayBuffer> {\n    return (isMinaEnv() ? minaReadFile : webReadFile)(filePath);\n}\n\n/**\n * 删除文件或目录。\n * @param path - 要删除的文件或目录的路径。\n * @returns 删除成功返回 true 的异步操作结果。\n */\nexport function remove(path: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaRemove : webRemove)(path);\n}\n\nexport async function stat(path: string): AsyncIOResult<WechatMinigame.Stats>;\nexport async function stat(path: string, options: StatOptions & {\n    recursive: true;\n}): AsyncIOResult<WechatMinigame.FileStats[]>;\nexport async function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]>\n/**\n * 获取文件或目录的状态信息。\n * @param path - 文件或目录的路径。\n * @param options - 可选选项。\n * @returns 包含状态信息的异步操作结果。\n */\nexport async function stat(path: string, options?: StatOptions): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> {\n    if (isMinaEnv()) {\n        return await minaStat(path, options);\n    }\n\n    return (await webStat(path)).andThenAsync(async (handle): AsyncIOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> => {\n        const entryStats = await convertFileSystemHandleToStats(handle);\n\n        if (entryStats.isFile() || !options?.recursive) {\n            return Ok(entryStats);\n        }\n\n        // 递归读取目录\n        return (await webReadDir(path)).andThenAsync(async entries => {\n            const statsArr: WechatMinigame.FileStats[] = [{\n                path,\n                stats: entryStats,\n            }];\n\n            for await (const { path, handle } of entries) {\n                statsArr.push({\n                    path,\n                    stats: await convertFileSystemHandleToStats(handle),\n                })\n            }\n\n            return Ok(statsArr);\n        });\n    });\n}\n\n/**\n * 写入文件，不存在则创建，同时创建对应目录，contents只支持ArrayBuffer和string，并且需要确保string一定是utf8编码的。\n * @param filePath - 文件路径。\n * @param contents - 要写入的内容。\n * @param options - 可选选项。\n * @returns 写入成功返回 true 的异步操作结果。\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 * @returns 追加成功返回 true 的异步操作结果。\n */\nexport function appendFile(filePath: string, contents: WriteFileContent): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaAppendFile : webAppendFile)(filePath, contents);\n}\n\n/**\n * 复制文件或文件夹。\n *\n * @param srcPath - 源文件或文件夹路径。\n * @param destPath - 目标文件或文件夹路径。\n * @returns 操作的异步结果。\n */\nexport function copy(srcPath: string, destPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaCopy : webCopy)(srcPath, destPath);\n}\n\n/**\n * 检查指定路径的文件或目录是否存在。\n * @param path - 文件或目录的路径。\n * @returns 存在返回 true 的异步操作结果。\n */\nexport function exists(path: string): AsyncIOResult<boolean> {\n    return (isMinaEnv() ? minaExists : webExists)(path);\n}\n\n/**\n * 清空指定目录下的所有文件和子目录。\n * @param dirPath - 目录路径。\n * @returns 清空成功返回 true 的异步操作结果。\n */\nexport function emptyDir(dirPath: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaEmptyDir : webEmptyDir)(dirPath);\n}\n\n/**\n * 读取文件并解析为 JSON。\n * @param filePath - 文件路径。\n * @returns 读取结果。\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 */\nexport function readTextFile(filePath: string): AsyncIOResult<string> {\n    return (isMinaEnv() ? minaReadTextFile : webReadTextFile)(filePath);\n}\n\n/**\n * 下载文件并保存到临时文件。\n * @param fileUrl - 文件的网络 URL。\n * @param options - 可选参数。\n * @returns 下载操作的异步结果，成功时返回 true。\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 下载成功返回原始结果。\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 上传成功返回原始结果。\n */\nexport function uploadFile(filePath: string, fileUrl: string, options?: UnionUploadFileOptions): FetchTask<WechatMinigame.UploadFileSuccessCallbackResult | Response> {\n    return (isMinaEnv() ? minaUploadFile : webUploadFile)(filePath, fileUrl, options);\n}\n\n/**\n * 解压 zip 文件。\n * @param zipFilePath - 要解压的 zip 文件路径。\n * @param targetPath - 要解压到的目标文件夹路径。\n * @returns 解压操作的异步结果。\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 */\nexport async 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 压缩成功的异步结果。\n */\nexport function zip(sourcePath: string, options?: ZipOptions): AsyncIOResult<Uint8Array>;\n/**\n * 压缩文件。\n * @param sourcePath - 需要压缩的文件（夹）路径。\n * @param zipFilePath - 压缩后的 zip 文件路径。\n * @param options - 可选的压缩参数。\n * @returns 压缩成功的异步结果。\n */\nexport function zip(sourcePath: string, zipFilePath: string, options?: ZipOptions): AsyncVoidIOResult;\nexport function zip(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): AsyncVoidIOResult | AsyncIOResult<Uint8Array> {\n    if (typeof zipFilePath === 'string') {\n        return isMinaEnv()\n            ? minaZip(sourcePath, zipFilePath, options)\n            : webZip(sourcePath, zipFilePath, options);\n    } else {\n        return isMinaEnv()\n            ? minaZip(sourcePath, zipFilePath)\n            : webZip(sourcePath, zipFilePath);\n    }\n}\n\n/**\n * 下载文件并压缩到内存。\n * @param sourceUrl - 要下载的文件 URL。\n * @param options - 合并的下载和压缩选项。\n */\nexport function zipFromUrl(sourceUrl: string, options?: ZipFromUrlOptions): AsyncIOResult<Uint8Array>;\n/**\n * 下载文件并压缩为 zip 文件。\n * @param sourceUrl - 要下载的文件 URL。\n * @param zipFilePath - 要输出的 zip 文件路径。\n * @param options - 合并的下载和压缩选项。\n */\nexport function zipFromUrl(sourceUrl: string, zipFilePath: string, options?: ZipFromUrlOptions): AsyncVoidIOResult;\nexport function zipFromUrl(sourceUrl: string, zipFilePath?: string | ZipFromUrlOptions, options?: ZipFromUrlOptions): AsyncVoidIOResult | AsyncIOResult<Uint8Array> {\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}","import { basename, dirname, join, SEPARATOR } from '@std/path/posix';\nimport * as fflate from 'fflate/browser';\nimport { type ExistsOptions, type WriteOptions, type ZipOptions } from 'happy-opfs';\nimport { Err, Ok, RESULT_VOID, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport type { ReadFileContent, ReadOptions, StatOptions, WriteFileContent } from './fs_define.ts';\nimport { errToMkdirResult, errToRemoveResult, fileErrorToResult, getAbsolutePath, getExistsResult, getFs, getReadFileEncoding, getWriteFileContents, isNotFoundError } from './mina_fs_shared.ts';\n\n/**\n * 安全地调用同步接口。\n * @param op - 同步操作。\n * @param errToResult - 错误处理函数。\n * @returns\n */\nfunction trySyncOp<T>(op: () => T, errToResult: (err: WechatMinigame.FileError) => IOResult<T> = fileErrorToResult): IOResult<T> {\n    try {\n        const res = op();\n        return Ok(res);\n    } catch (e: unknown) {\n        return errToResult(e as WechatMinigame.FileError);\n    }\n}\n\n/**\n * `mkdir` 的同步版本。\n */\nexport function mkdirSync(dirPath: string): VoidIOResult {\n    const absPath = getAbsolutePath(dirPath);\n\n    return trySyncOp(() => getFs().mkdirSync(absPath, true), errToMkdirResult);\n}\n\n/**\n * `move` 的同步版本。\n */\nexport function moveSync(srcPath: string, destPath: string): VoidIOResult {\n    const absSrcPath = getAbsolutePath(srcPath);\n    const absDestPath = getAbsolutePath(destPath);\n\n    return trySyncOp(() => getFs().renameSync(absSrcPath, absDestPath));\n}\n\n/**\n * `readDir` 的同步版本。\n */\nexport function readDirSync(dirPath: string): IOResult<string[]> {\n    const absPath = getAbsolutePath(dirPath);\n\n    return trySyncOp(() => getFs().readdirSync(absPath));\n}\n\n/**\n * `readFile` 的同步版本。\n */\nexport function readFileSync(filePath: string, options: ReadOptions & {\n    encoding: 'utf8',\n}): IOResult<string>;\nexport function readFileSync(filePath: string, options?: ReadOptions & {\n    encoding: 'binary',\n}): IOResult<ArrayBuffer>;\nexport function readFileSync<T extends ReadFileContent>(filePath: string, options?: ReadOptions): IOResult<T> {\n    const absPath = getAbsolutePath(filePath);\n    const encoding = getReadFileEncoding(options);\n\n    return trySyncOp(() => getFs().readFileSync(absPath, encoding) as T);\n}\n\n/**\n * `remove` 的同步版本。\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    const absPath = getAbsolutePath(path);\n\n    return trySyncOp(() => {\n        // 文件夹还是文件\n        if (statRes.unwrap().isDirectory()) {\n            getFs().rmdirSync(absPath, true);\n        } else {\n            getFs().unlinkSync(absPath);\n        }\n    }, errToRemoveResult);\n}\n\n/**\n * `stat` 的同步版本。\n */\nexport function statSync(path: string): 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 absPath = getAbsolutePath(path);\n\n    return trySyncOp(() => getFs().statSync(absPath, options?.recursive ?? false));\n}\n\n/**\n * `writeFile` 的同步版本。\n */\nexport function writeFileSync(filePath: string, contents: WriteFileContent, options?: WriteOptions): VoidIOResult {\n    const absPath = getAbsolutePath(filePath);\n\n    // 默认创建\n    const { append = false, create = true } = options ?? {};\n\n    if (create) {\n        const res = mkdirSync(dirname(absPath));\n        if (res.isErr()) {\n            return res;\n        }\n    }\n\n    const { data, encoding } = getWriteFileContents(contents);\n\n    return trySyncOp(() => (append ? getFs().appendFileSync : getFs().writeFileSync)(absPath, data, encoding));\n}\n\n/**\n * `appendFile` 的同步版本。\n */\nexport function appendFileSync(filePath: string, contents: WriteFileContent): VoidIOResult {\n    return writeFileSync(filePath, contents, {\n        append: true,\n    });\n}\n\nfunction copyFileSync(srcPath: string, destPath: string): VoidIOResult {\n    return trySyncOp(() => (getFs().copyFile({\n        srcPath,\n        destPath,\n    })));\n}\n\n/**\n * `copy` 的同步版本。\n */\nexport function copySync(srcPath: string, destPath: string): VoidIOResult {\n    const absSrcPath = getAbsolutePath(srcPath);\n    const absDestPath = getAbsolutePath(destPath);\n\n    return statSync(absSrcPath, {\n        recursive: true,\n    }).andThen(statsArray => {\n        // directory\n        if (Array.isArray(statsArray)) {\n            for (const { path, stats } of statsArray) {\n                // 不能用join\n                const srcEntryPath = absSrcPath + path;\n                const destEntryPath = absDestPath + path;\n\n                const res = (stats.isDirectory()\n                    ? mkdirSync(destEntryPath)\n                    : copyFileSync(srcEntryPath, destEntryPath));\n\n                if (res.isErr()) {\n                    return res;\n                }\n            }\n\n            return RESULT_VOID;\n        } else {\n            // file\n            return copyFileSync(absSrcPath, absDestPath);\n        }\n    });\n}\n\n/**\n * `exists` 的同步版本。\n */\nexport function existsSync(path: string, options?: ExistsOptions): IOResult<boolean> {\n    const res = statSync(path);\n    return getExistsResult(res, options);\n}\n\n/**\n * `emptyDir` 的同步版本。\n */\nexport function emptyDirSync(dirPath: string): VoidIOResult {\n    const res = readDirSync(dirPath);\n    if (res.isErr()) {\n        return isNotFoundError(res.unwrapErr()) ? mkdirSync(dirPath) : res.asErr();\n    }\n\n    for (const name of res.unwrap()) {\n        const res = removeSync(join(dirPath, name));\n        if (res.isErr()) {\n            return res.asErr();\n        }\n    }\n\n    return RESULT_VOID;\n}\n\n/**\n * `readJsonFile` 的同步版本。\n */\nexport function readJsonFileSync<T>(filePath: string): IOResult<T> {\n    return readTextFileSync(filePath).andThen(contents => {\n        try {\n            return Ok(JSON.parse(contents));\n        } catch (e) {\n            return Err(e as Error);\n        }\n    });\n}\n\n/**\n * `readTextFile` 的同步版本。\n */\nexport function readTextFileSync(filePath: string): IOResult<string> {\n    return readFileSync(filePath, {\n        encoding: 'utf8',\n    });\n}\n\n/**\n * `unzip` 的同步版本。\n */\nexport function unzipSync(zipFilePath: string, targetPath: string): VoidIOResult {\n    const absZipPath = getAbsolutePath(zipFilePath);\n    const absTargetPath = getAbsolutePath(targetPath);\n\n    return readFileSync(absZipPath).andThen(buffer => {\n        const data = new Uint8Array(buffer);\n\n        try {\n            const unzipped = fflate.unzipSync(data);\n\n            for (const path in unzipped) {\n                // ignore directory\n                if (path.at(-1) !== SEPARATOR) {\n                    // 不能用 json，否则 http://usr 会变成 http:/usr\n                    const res = writeFileSync(`${ absTargetPath }/${ path }`, unzipped[path]);\n                    if (res.isErr()) {\n                        return res.asErr();\n                    }\n                }\n            }\n\n            return RESULT_VOID;\n        } catch (e) {\n            return Err(e as fflate.FlateError);\n        }\n    });\n}\n\n/**\n * `zip` 的同步版本。\n */\nexport function zipSync(sourcePath: string, zipFilePath: string, options?: ZipOptions): VoidIOResult {\n    const absSourcePath = getAbsolutePath(sourcePath);\n    const absZipPath = getAbsolutePath(zipFilePath);\n\n    return statSync(absSourcePath).andThen(stats => {\n        const zipped: fflate.AsyncZippable = {};\n\n        const sourceName = basename(absSourcePath);\n\n        if (stats.isFile()) {\n            // file\n            const res = readFileSync(absSourcePath);\n            if (res.isErr()) {\n                return res.asErr();\n            }\n\n            zipped[sourceName] = new Uint8Array(res.unwrap());\n        } else {\n            // directory\n            const res = statSync(absSourcePath, {\n                recursive: true,\n            });\n            if (res.isErr()) {\n                return res.asErr();\n            }\n\n            // default to preserve root\n            const preserveRoot = options?.preserveRoot ?? true;\n\n            for (const { path, stats } of res.unwrap()) {\n                if (stats.isFile()) {\n                    const entryName = preserveRoot ? join(sourceName, path) : path;\n                    // 不能用 join，否则 http://usr 会变成 http:/usr\n                    const res = readFileSync(absSourcePath + path);\n                    if (res.isErr()) {\n                        return res.asErr();\n                    }\n\n                    zipped[entryName] = new Uint8Array(res.unwrap());\n                }\n            }\n        }\n\n        try {\n            const u8a = fflate.zipSync(zipped);\n            return writeFileSync(absZipPath, u8a);\n        } catch (e) {\n            return Err(e as fflate.FlateError);\n        }\n    });\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    readDirSync as webReadDirSync,\n    readFileSync as webReadFileSync,\n    readJsonFileSync as webReadJsonFileSync,\n    readTextFileSync as webReadTextFileSync,\n    removeSync as webRemoveSync,\n    statSync as webStatSync,\n    unzipSync as webUnzipSync,\n    writeFileSync as webWriteFileSync,\n    zipSync as webZipSync,\n    type ZipOptions,\n} from 'happy-opfs';\nimport { Ok, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport type { StatOptions, WriteFileContent } from './fs_define.ts';\nimport { convertFileSystemHandleLikeToStats } from './fs_helpers.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    zipSync as minaZipSync,\n} from './mina_fs_sync.ts';\n\n/**\n * `mkdir` 的同步版本。\n */\nexport function mkdirSync(dirPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaMkdirSync : webMkdirSync)(dirPath);\n}\n\n/**\n * `move` 的同步版本。\n */\nexport function moveSync(srcPath: string, destPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaMoveSync : webMoveSync)(srcPath, destPath);\n}\n\n/**\n * `readDir` 的同步版本。\n */\nexport function readDirSync(dirPath: string): IOResult<string[]> {\n    return isMinaEnv()\n        ? minaReadDirSync(dirPath)\n        : webReadDirSync(dirPath).map(x => {\n            return x.map(y => y.path);\n        });\n}\n\n/**\n * `readFile` 的同步版本。\n */\nexport function readFileSync(filePath: string): IOResult<ArrayBuffer> {\n    return (isMinaEnv() ? minaReadFileSync : webReadFileSync)(filePath);\n}\n\n/**\n * `remove` 的同步版本。\n */\nexport function removeSync(path: string): VoidIOResult {\n    return (isMinaEnv() ? minaRemoveSync : webRemoveSync)(path);\n}\n\n/**\n * `stat` 的同步版本。\n */\nexport function statSync(path: string): 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    if (isMinaEnv()) {\n        return minaStatSync(path, options);\n    }\n\n    return webStatSync(path).andThen((handleLike): IOResult<WechatMinigame.Stats | WechatMinigame.FileStats[]> => {\n        const entryStats = convertFileSystemHandleLikeToStats(handleLike);\n\n        if (entryStats.isFile() || !options?.recursive) {\n            return Ok(entryStats);\n        }\n\n        // 递归读取目录\n        return webReadDirSync(path).andThen(entries => {\n            const statsArr: WechatMinigame.FileStats[] = [{\n                path,\n                stats: entryStats,\n            }];\n\n            for (const { path, handle } of entries) {\n                statsArr.push({\n                    path,\n                    stats: convertFileSystemHandleLikeToStats(handle),\n                })\n            }\n\n            return Ok(statsArr);\n        });\n    });\n}\n\n/**\n * `writeFile` 的同步版本。\n */\nexport function writeFileSync(filePath: string, contents: WriteFileContent): VoidIOResult {\n    return (isMinaEnv() ? minaWriteFileSync : webWriteFileSync)(filePath, contents);\n}\n\n/**\n * `copy` 的同步版本。\n */\nexport function copySync(srcPath: string, destPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaCopySync : webCopySync)(srcPath, destPath);\n}\n\n/**\n * `appendFile` 的同步版本。\n */\nexport function appendFileSync(filePath: string, contents: WriteFileContent): VoidIOResult {\n    return (isMinaEnv() ? minaAppendFileSync : webAppendFileSync)(filePath, contents);\n}\n\n/**\n * `exists` 的同步版本。\n */\nexport function existsSync(path: string): IOResult<boolean> {\n    return (isMinaEnv() ? minaExistsSync : webExistsSync)(path);\n}\n\n/**\n * `emptyDir` 的同步版本。\n */\nexport function emptyDirSync(dirPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaEmptyDirSync : webEmptyDirSync)(dirPath);\n}\n\n/**\n * `readJsonFile` 的同步版本。\n */\nexport function readJsonFileSync<T>(filePath: string): IOResult<T> {\n    return (isMinaEnv() ? minaReadJsonFileSync : webReadJsonFileSync)(filePath);\n}\n\n/**\n * `readTextFile` 的同步版本。\n */\nexport function readTextFileSync(filePath: string): IOResult<string> {\n    return (isMinaEnv() ? minaReadTextFileSync : webReadTextFileSync)(filePath);\n}\n\n/**\n * `unzip` 的同步版本。\n */\nexport function unzipSync(zipFilePath: string, targetPath: string): VoidIOResult {\n    return (isMinaEnv() ? minaUnzipSync : webUnzipSync)(zipFilePath, targetPath);\n}\n\n/**\n * `zip` 的同步版本。\n */\nexport function zipSync(sourcePath: string, zipFilePath: string, options?: ZipOptions): VoidIOResult {\n    return (isMinaEnv() ? minaZipSync : webZipSync)(sourcePath, zipFilePath, options);\n}","import { Err, Ok, RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { readFile } from '../fs/mod.ts';\nimport { bufferSource2Ab } from '../utils/mod.ts';\nimport type { PlayOptions } from './audio_defines.ts';\n\n/**\n * Cache AudioContext.\n */\nlet audioContext: AudioContext | null;\n\n/**\n * 获取缓存的 AudioContext。\n * @returns 返回缓存的 AudioContext。\n */\nexport function getGlobalAudioContext(): AudioContext {\n    audioContext ??= createWebAudioContext();\n    return audioContext;\n}\n\n/**\n * 关闭缓存的 AudioContext。\n * @returns 返回一个 AsyncVoidIOResult。\n */\nexport async function closeGlobalAudioContext(): AsyncVoidIOResult {\n    try {\n        await audioContext?.close();\n        audioContext = null;\n\n        return RESULT_VOID;\n    } catch (e) {\n        return Err(e as DOMException);\n    }\n}\n\n/**\n * 创建一个 AudioContext。\n * 如果要获取缓存的实例，请使用 `getGlobalAudioContext`。\n * @returns 返回一个 AudioContext实例。\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 */\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 */\nexport async function playWebAudioFromArrayBuffer(buffer: BufferSource, options?: PlayOptions): Promise<AudioBufferSourceNode> {\n    const context = getGlobalAudioContext();\n    const audioBuffer = await context.decodeAudioData(bufferSource2Ab(buffer));\n\n    return playWebAudioFromAudioBuffer(audioBuffer, options);\n}\n\n/**\n * 读取文件并播放。\n * @param filePath - 文件路径。\n * @param options - 播放选项。\n * @returns 正在播放的 AudioBufferSourceNode。\n */\nexport async function playWebAudioFromFile(filePath: string, options?: PlayOptions): AsyncIOResult<AudioBufferSourceNode> {\n    return (await readFile(filePath)).andThenAsync(async buffer => {\n        return Ok(await playWebAudioFromArrayBuffer(buffer, options));\n    })\n}","/**\n * 小游戏环境的编解码\n */\n\nconst FORMAT = 'utf8' as const;\n\n/**\n * 将字符串数据编码为 ArrayBuffer。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 ArrayBuffer。\n */\nexport function textEncode(data: string): ArrayBuffer {\n    // 兼容某些平台没有 `encode` 方法\n    return typeof wx.encode === 'function'\n        ? wx.encode({\n            data,\n            format: FORMAT,\n        })\n        : utf8String2AB(data);\n}\n\n/**\n * 将 ArrayBuffer 数据解码为字符串。\n * @param data - 需要解码的 ArrayBuffer。\n * @returns 解码后的字符串。\n */\nexport function textDecode(data: ArrayBuffer): string {\n    // 兼容某些平台没有 `decode` 方法\n    return typeof wx.decode === 'function'\n        ? wx.decode({\n            data,\n            format: FORMAT,\n        })\n        : ab2Utf8String(data);\n}\n\n/**\n * 将 utf8 字符串转换为 ArrayBuffer。\n * @param str - 需要转换的字符串。\n * @returns ArrayBuffer。\n */\nfunction utf8String2AB(str: string): ArrayBuffer {\n    // 创建一个 Uint8Array，长度为字符串的 UTF-8 编码后的字节数\n    const utf8: number[] = [];\n\n    for (let i = 0; i < str.length; i++) {\n        const codePoint = str.charCodeAt(i);\n\n        // 处理不同的 Unicode 范围\n        if (codePoint < 0x80) {\n            // 1字节\n            utf8.push(codePoint);\n        } else if (codePoint < 0x800) {\n            // 2字节\n            utf8.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));\n        } else if (codePoint < 0x10000) {\n            // 3字节\n            utf8.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));\n        } else if (codePoint < 0x110000) {\n            // 4字节\n            utf8.push(0xf0 | (codePoint >> 18), 0x80 | ((codePoint >> 12) & 0x3f), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));\n        }\n    }\n\n    return new Uint8Array(utf8).buffer;\n}\n\n/**\n * 将 ArrayBuffer 数据解码为 utf8 字符串。\n * @param data - 需要解码的 ArrayBuffer。\n * @returns 解码后的字符串。\n */\nfunction ab2Utf8String(data: ArrayBuffer): string {\n    const u8a = new Uint8Array(data);\n    let str = '';\n    let i = 0;\n\n    while (i < u8a.length) {\n        const byte1 = u8a[i];\n\n        if (byte1 < 0x80) {\n            // 1字节字符\n            str += String.fromCharCode(byte1);\n            i += 1;\n        } else if (byte1 < 0xe0) {\n            // 2字节字符\n            const byte2 = u8a[i + 1];\n            str += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n            i += 2;\n        } else if (byte1 < 0xf0) {\n            // 3字节字符\n            const byte2 = u8a[i + 1];\n            const byte3 = u8a[i + 2];\n            str += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n            i += 3;\n        } else if (byte1 < 0xF8) {\n            // 4字节字符\n            const byte2 = u8a[i + 1];\n            const byte3 = u8a[i + 2];\n            const byte4 = u8a[i + 3];\n            str += String.fromCharCode(((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f));\n            i += 4;\n        } else {\n            // 无效的 UTF-8 字节序列\n            throw new Error('Invalid UTF-8 byte sequence');\n        }\n    }\n\n    return str;\n}","/**\n * Web环境的编解码\n */\n\nlet encoder: TextEncoder;\nlet decoder: TextDecoder;\n\nfunction getEncoder(): TextEncoder {\n    encoder ??= new TextEncoder();\n    return encoder;\n}\n\nfunction getDecoder(): TextDecoder {\n    decoder ??= new TextDecoder();\n    return decoder;\n}\n\n/**\n * 将字符串数据编码为 `Uint8Array`\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 `Uint8Array`\n */\nexport function textEncode(data: string): Uint8Array {\n    return getEncoder().encode(data);\n}\n\n/**\n * 将二进制数据解码为字符串。\n * @param data - 需要解码的二进制数据。\n * @returns 解码后的字符串。\n */\nexport function textDecode(data: BufferSource): string {\n    return getDecoder().decode(data);\n}","import { isMinaEnv } from '../../macros/env.ts';\nimport type { DataSource } from '../defines.ts';\nimport { bufferSource2Ab, bufferSource2U8a } from '../utils/mod.ts';\nimport { textDecode as minaTextDecode, textEncode as minaTextEncode } from './mina_codec.ts';\nimport { textDecode as webTextDecode, textEncode as webTextEncode } from './web_codec.ts';\n\n/**\n * 将字符串数据编码为 `Uint8Array`\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 `Uint8Array`\n */\nexport function textEncode(data: string): Uint8Array {\n    return isMinaEnv()\n        ? bufferSource2U8a(minaTextEncode(data))\n        : webTextEncode(data);\n}\n\n/**\n * 将二进制数据解码为字符串。\n * @param data - 需要解码的二进制数据。\n * @returns 解码后的字符串。\n */\nexport function textDecode(data: BufferSource): string {\n    return isMinaEnv()\n        ? minaTextDecode(bufferSource2Ab(data))\n        : webTextDecode(data);\n}\n\n/**\n * 将 BufferSource 转换为十六进制字符串。\n * @param buffer - 需要转换的 BufferSource。\n * @returns 十六进制字符串。\n */\nexport function hexFromBuffer(buffer: BufferSource): string {\n    return Array.from(bufferSource2U8a(buffer)).map(byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * 将字符串转换为 Uint8Array。\n * @param str - 需要转换的字符串。\n * @returns Uint8Array。\n */\nexport function byteStringToBuffer(str: string): Uint8Array {\n    const { length } = str;\n    const u8a = new Uint8Array(length);\n\n    for (let i = 0; i < length; i++) {\n        u8a[i] = str.charCodeAt(i);\n    }\n\n    return u8a;\n}\n\n/**\n * 将 Buffer 转换为 ByteString。\n * @param buffer - 需要转换的 Buffer。\n * @returns ByteString。\n */\nexport function byteStringFromBuffer(buffer: BufferSource): string {\n    return String.fromCharCode(...bufferSource2U8a(buffer));\n}\n\n/**\n * 将 UTF-8 字符串转换为 ByteString。\n *\n * @param data - 需要转换的字符串或 BufferSource。\n * @returns 转换后的 ByteString。\n */\nexport function toByteString(data: DataSource): string {\n    const buffer = typeof data === 'string'\n        ? textEncode(data)\n        : data;\n\n    return byteStringFromBuffer(buffer);\n}","/**\n * @fileoverview Encode/Decode between Uint8Array and base64 encoded string.\n *\n * Forked from @std/encoding/base64 and https://github.com/cross-org/base64\n */\n\nimport { bufferSource2U8a } from '../utils/mod.ts';\n\n/**\n * A string containing standard base64 characters\n */\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n/**\n * Standard base64 characters\n */\nconst base64abc = chars.split('');\n\n/**\n * Lookup table for standard base64 characters\n */\nconst lookup = ((): Uint8Array => {\n    const lookupTemp = new Uint8Array(256); // base64abc.length * 4\n\n    for (let i = 0; i < base64abc.length; i++) {\n        lookupTemp[base64abc[i].charCodeAt(0)] = i;\n    }\n\n    return lookupTemp;\n})();\n\n/**\n * Converts BufferSource into a base64 encoded string.\n *\n * @param data - The data to encode.\n * @returns The base64 encoded string.\n */\nexport function base64FromBuffer(data: BufferSource): string {\n    let result = '';\n\n    const u8a = bufferSource2U8a(data);\n\n    const len = u8a.length;\n    let i: number;\n\n    for (i = 2; i < len; i += 3) {\n        result += base64abc[(u8a[i - 2]) >> 2];\n        result += base64abc[\n            (((u8a[i - 2]) & 0x03) << 4)\n            | ((u8a[i - 1]) >> 4)\n        ];\n        result += base64abc[\n            (((u8a[i - 1]) & 0x0f) << 2)\n            | ((u8a[i]) >> 6)\n        ];\n        result += base64abc[(u8a[i]) & 0x3f];\n    }\n\n    if (i === len + 1) {\n        // 1 octet yet to write\n        result += base64abc[(u8a[i - 2]) >> 2];\n        result += base64abc[((u8a[i - 2]) & 0x03) << 4];\n        result += '==';\n    }\n\n    if (i === len) {\n        // 2 octets yet to write\n        result += base64abc[(u8a[i - 2]) >> 2];\n        result += base64abc[\n            (((u8a[i - 2]) & 0x03) << 4)\n            | ((u8a[i - 1]) >> 4)\n        ];\n        result += base64abc[((u8a[i - 1]) & 0x0f) << 2];\n        result += '=';\n    }\n\n    return result;\n}\n\n/**\n * Converts a base64 encoded string to an Uint8Array\n *\n * @param data - Base64 encoded string\n * @returns The decoded data as an Uint8Array.\n */\nexport function base64ToBuffer(data: string): Uint8Array {\n    const len = data.length;\n\n    let bufferLength = len * 0.75;\n\n    if (data[len - 1] === '=') {\n        bufferLength--;\n        if (data[len - 2] === '=') {\n            bufferLength--;\n        }\n    }\n\n    const u8a = new Uint8Array(bufferLength);\n\n    let pos = 0;\n\n    for (let i = 0; i < len; i += 4) {\n        const encoded1 = lookup[data.charCodeAt(i)];\n        const encoded2 = lookup[data.charCodeAt(i + 1)];\n        const encoded3 = lookup[data.charCodeAt(i + 2)];\n        const encoded4 = lookup[data.charCodeAt(i + 3)];\n\n        u8a[pos++] = (encoded1 << 2) | (encoded2 >> 4);\n        u8a[pos++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        u8a[pos++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return u8a;\n}","import { textDecode, textEncode } from '../codec/mod.ts';\nimport { base64FromBuffer, base64ToBuffer } from './base64.ts';\n\n/**\n * 将字符串数据编码为 Base64 格式。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 Base64 字符串。\n */\nexport function encodeBase64(data: string): string {\n    return base64FromBuffer(textEncode(data));\n}\n\n/**\n * 将 Base64 格式的字符串数据解码。\n * @param data - 需要解码的 Base64 字符串。\n * @returns 解码后的字符串。\n */\nexport function decodeBase64(data: string): string {\n    return textDecode(base64ToBuffer(data));\n}","import { byteStringFromBuffer, byteStringToBuffer, textDecode, textEncode } from '../codec/mod.ts';\n\n/**\n * 将字符串数据编码为 Base64 格式。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 Base64 字符串。\n */\nexport function encodeBase64(data: string): string {\n    return btoa(byteStringFromBuffer(textEncode(data)));\n}\n\n/**\n * 将 Base64 格式的字符串数据解码。\n * @param data - 需要解码的 Base64 字符串。\n * @returns 解码后的字符串。\n */\nexport function decodeBase64(data: string): string {\n    return textDecode(byteStringToBuffer(atob(data)));\n}","import { isMinaEnv } from '../../macros/env.ts';\nimport { decodeBase64 as minaDecodeBase64, encodeBase64 as minaEncodeBase64 } from './mina_base64.ts';\nimport { decodeBase64 as webDecodeBase64, encodeBase64 as webEncodeBase64 } from './web_base64.ts';\nexport { base64FromBuffer, base64ToBuffer } from './base64.ts';\n\n/**\n * 将字符串数据编码为 Base64 格式。\n * @param data - 需要编码的字符串数据。\n * @returns 编码后的 Base64 字符串。\n */\nexport function encodeBase64(data: string): string {\n    return (isMinaEnv() ? minaEncodeBase64 : webEncodeBase64)(data);\n}\n\n/**\n * 将 Base64 格式的字符串数据解码。\n * @param data - 需要解码的 Base64 字符串。\n * @returns 解码后的字符串。\n */\nexport function decodeBase64(data: string): string {\n    return (isMinaEnv() ? minaDecodeBase64 : webDecodeBase64)(data);\n}","import type { AsyncIOResult, AsyncVoidIOResult } from 'happy-rusty';\nimport { assertString } from '../assert/assertions.ts';\nimport { tryGeneralAsyncOp } from '../utils/mod.ts';\n\n/**\n * 异步写入文本数据到剪贴板。\n * @param data - 需要写入的文本数据。\n * @returns 写入操作的结果。\n */\nexport async function writeText(data: string): AsyncVoidIOResult {\n    assertString(data);\n\n    return tryGeneralAsyncOp(async () => {\n        await wx.setClipboardData({\n            data,\n        });\n    });\n}\n\n/**\n * 异步读取剪贴板文本数据。\n * @returns 读取操作的结果。\n */\nexport async function readText(): AsyncIOResult<string> {\n    return tryGeneralAsyncOp(async () => {\n        const res = await wx.getClipboardData();\n        return res.data;\n    });\n}","import type { AsyncIOResult, AsyncVoidIOResult } from 'happy-rusty';\nimport { assertString } from '../assert/assertions.ts';\nimport { tryDOMAsyncOp } from '../utils/mod.ts';\n\n/**\n * 异步写入文本数据到剪贴板。\n * @param data - 需要写入的文本数据。\n * @returns 写入操作的结果。\n */\nexport async function writeText(data: string): AsyncVoidIOResult {\n    assertString(data);\n\n    return tryDOMAsyncOp(async () => {\n        await navigator.clipboard.writeText(data);\n    });\n}\n\n/**\n * 异步读取剪贴板文本数据。\n * @returns 读取操作的结果。\n */\nexport async function readText(): AsyncIOResult<string> {\n    return tryDOMAsyncOp(async () => {\n        const data = await navigator.clipboard.readText();\n        return data;\n    });\n}","import type { AsyncIOResult, AsyncVoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.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 */\nexport function writeText(data: string): AsyncVoidIOResult {\n    return (isMinaEnv() ? minaWriteText : webWriteText)(data);\n}\n\n/**\n * 异步读取剪贴板文本数据。\n * @returns 读取操作的结果。\n */\nexport function readText(): AsyncIOResult<string> {\n    return (isMinaEnv() ? minaReadText : webReadText)();\n}","/**\n * Hash-based Message Authentication Code implementation. Requires a message\n * digest object that can be obtained, for example, from forge.md.sha1 or\n * forge.md.md5.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2012 Digital Bazaar, Inc. All rights reserved.\n */\n\nimport { ByteStringBuffer, sha1, sha256, sha384, sha512, type HashAlgorithmCreator } from 'rsa-oaep-encryption';\nimport type { SHA } from '../crypto_defines.ts';\n\n/**\n * Creates an HMAC object that uses the given message digest object.\n *\n * @return an HMAC object.\n */\nexport function createHMAC(sha: SHA, key: string) {\n    let shaAlgorithmCreator: HashAlgorithmCreator;\n\n    switch (sha.replace('-', '').toLowerCase()) {\n        case 'sha1': {\n            shaAlgorithmCreator = sha1;\n            break;\n        }\n        case 'sha256': {\n            shaAlgorithmCreator = sha256;\n            break;\n        }\n        case 'sha384': {\n            shaAlgorithmCreator = sha384;\n            break;\n        }\n        case 'sha512': {\n            shaAlgorithmCreator = sha512;\n            break;\n        }\n        default: {\n            throw new Error(`Unsupported hash algorithm ${ sha }`);\n        }\n    }\n\n    const shaAlgorithm = shaAlgorithmCreator.create();\n\n    let keyBuffer = new ByteStringBuffer(key);\n\n    // if key is longer than blocksize, hash it\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    // mix key into inner and outer padding\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    // if key is shorter than blocksize, add additional padding\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    // digest is done like so: hash(opadding | hash(ipadding | message))\n\n    // prepare to do inner hash\n    // hash(ipadding | message)\n    shaAlgorithm.start();\n    shaAlgorithm.update(ipadding.bytes());\n\n    // hmac context\n    const ctx = {\n        /**\n         * Updates the HMAC with the given message bytes.\n         *\n         * @param bytes the bytes to update with.\n         */\n        update(bytes: string) {\n            shaAlgorithm.update(bytes);\n        },\n\n        /**\n         * Produces the Message Authentication Code (MAC).\n         *\n         * @return a byte buffer containing the digest value.\n         */\n        digest() {\n            // digest is done like so: hash(opadding | hash(ipadding | message))\n            // here we do the outer hashing\n            const inner = shaAlgorithm.digest().bytes();\n            shaAlgorithm.start();\n            shaAlgorithm.update(opadding.bytes());\n            shaAlgorithm.update(inner);\n            return shaAlgorithm.digest();\n        },\n    };\n\n    return ctx;\n}\n","import { hexFromBuffer, textEncode } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { SHA } from '../crypto_defines.ts';\n\nexport async function createHMAC(hash: SHA, key: DataSource, data: DataSource): Promise<string> {\n    const encodedKey = typeof key === 'string'\n        ? textEncode(key)\n        : key;\n\n    const encodedData = typeof data === 'string'\n            ? textEncode(data)\n            : 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 hexFromBuffer(hashBuffer);\n}","import { isMinaEnv } from '../../../macros/env.ts';\nimport { toByteString } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport type { SHA } from '../crypto_defines.ts';\nimport { createHMAC as minaCreateHMAC } from './mina_hmac.ts';\nimport { createHMAC as webCreateHMAC } from './web_hmac.ts';\n\nfunction shaHMAC(sha: SHA, key: DataSource, data: DataSource): Promise<string> {\n    if (isMinaEnv()) {\n        const hmac = minaCreateHMAC(sha, toByteString(key));\n        hmac.update(toByteString(data));\n        return Promise.resolve(hmac.digest().toHex());\n    }\n\n    return webCreateHMAC(sha, key, data);\n}\n\n/**\n * 计算 SHA-1 HMAC。\n */\nexport function sha1HMAC(key: DataSource, data: DataSource): Promise<string> {\n    return shaHMAC('SHA-1', key, data);\n}\n\n/**\n * 计算 SHA-256 HMAC。\n */\nexport function sha256HMAC(key: DataSource, data: DataSource): Promise<string> {\n    return shaHMAC('SHA-256', key, data);\n}\n\n/**\n * 计算 SHA-384 HMAC。\n */\nexport function sha384HMAC(key: DataSource, data: DataSource): Promise<string> {\n    return shaHMAC('SHA-384', key, data);\n}\n\n/**\n * 计算 SHA-512 HMAC。\n */\nexport function sha512HMAC(key: DataSource, data: DataSource): Promise<string> {\n    return shaHMAC('SHA-512', key, data);\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 { hexFromBuffer, textEncode } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport { bufferSource2U8a } from '../../utils/mod.ts';\n\nconst BLOCK_SIZE = 64 as const;\n\n/**\n * Md5 hash\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    private addLength(len: number): void {\n        let n0 = this.n0;\n        n0 += len;\n        if (n0 > 0xffffffff) this.n1 += 1;\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        // round 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        // round 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        // round 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        // round 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     * Update internal state.\n     * @param data data to update, data cannot exceed 2^32 bytes.\n     */\n    update(data: DataSource): this {\n        const msg = typeof data === 'string'\n            ? textEncode(data)\n            : bufferSource2U8a(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            // hash first block\n            this.block.set(msg.slice(0, free), pos);\n            this.hash(this.block);\n\n            // hash as many blocks as possible\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            // store leftover\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     * Returns final hash.\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     * Returns hash as a hex string.\n     */\n    toString(): string {\n        return hexFromBuffer(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 值，结果用16进制字符串表示。\n * @param data - 需要计算 MD5 值的数据。\n * @returns 计算得到的 MD5 十六进制字符串。\n */\nexport function md5(data: DataSource): string {\n    return new Md5().update(data).toString();\n}","import { Ok, type AsyncIOResult, type IOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { hexFromBuffer } from '../../codec/mod.ts';\nimport { miniGameFailureToResult } from '../../utils/mod.ts';\nimport type { UUID } from './random_defines.ts';\n\nexport function getRandomValues(length: number): AsyncIOResult<Uint8Array> {\n    const future = new Future<IOResult<Uint8Array>>();\n\n    wx.getUserCryptoManager().getRandomValues({\n        length,\n        success(res): void {\n            future.resolve(Ok(new Uint8Array(res.randomValues)));\n        },\n        fail(err): void {\n            future.resolve(miniGameFailureToResult(err));\n        },\n    });\n\n    return future.promise;\n}\n\nexport async function randomUUID(): AsyncIOResult<UUID> {\n    return (await getRandomValues(16)).map(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 = hexFromBuffer(bytes);\n        return `${ hex.slice(0, 8) }-${ hex.slice(8, 12) }-${ hex.slice(12, 16) }-${ hex.slice(16, 20) }-${ hex.slice(20) }` as UUID;\n    });\n}","import type { UUID } from './random_defines.ts';\n\nexport function getRandomValues(length: number): Uint8Array {\n    const u8a = new Uint8Array(length);\n    crypto.getRandomValues(u8a);\n\n    return u8a;\n}\n\nexport function randomUUID(): UUID {\n    return crypto.randomUUID();\n}","import { Ok, type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../../macros/env.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 生成的随机数 Buffer。\n */\nexport function getRandomValues(length: number): AsyncIOResult<Uint8Array> {\n    return isMinaEnv()\n        ? minaGetRandomValues(length)\n        : Promise.resolve(Ok(webGetRandomValues(length)))\n}\n\n/**\n * 生成 UUID。\n * @returns UUID 字符串。\n */\nexport function randomUUID(): AsyncIOResult<UUID> {\n    return isMinaEnv()\n        ? minaRandomUUID()\n        : Promise.resolve(Ok(webRandomUUID()))\n}","import { importPublicKey as importKey, sha1, sha256, sha384, sha512 } from 'rsa-oaep-encryption';\nimport { base64FromBuffer } from '../../base64/mod.ts';\nimport type { RSAPublicKey, SHA } from '../crypto_defines.ts';\n\nconst SHAs = {\n    'sha1': sha1,\n    'sha256': sha256,\n    'sha384': sha384,\n    'sha512': sha512,\n};\n\n/**\n * Import a public key from a PEM encoded string for encryption.\n * @param pem - PEM encoded string.\n * @param hash - Hash algorithm.\n * @returns\n */\nexport function importPublicKey(pem: string, hash: SHA): RSAPublicKey {\n    const publicKey = importKey(pem);\n\n    const encrypt = (data: string): ArrayBuffer => {\n        // eg: SHA-1 => sha1\n        const sha = hash.replace('-', '').toLowerCase();\n        // bypassing type check\n        return publicKey.encrypt(data, SHAs[sha as 'sha1'].create());\n    };\n\n    return {\n        encrypt(data: string): Promise<ArrayBuffer> {\n            return Promise.resolve(encrypt(data));\n        },\n\n        encryptToString(data: string): Promise<string> {\n            return Promise.resolve(base64FromBuffer(encrypt(data)));\n        },\n    };\n}","import { base64FromBuffer } from '../../base64/mod.ts';\nimport { byteStringToBuffer, textEncode } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\nimport { bufferSource2U8a } from '../../utils/mod.ts';\nimport type { RSAPublicKey, SHA } from '../crypto_defines.ts';\n\n/**\n * Encrypt data with a public key.\n * @param publicKey - The public key.\n * @param data - The data to encrypt.\n * @returns\n */\nfunction encrypt(publicKey: CryptoKey, data: DataSource): Promise<ArrayBuffer> {\n    const encodedData = typeof data === 'string'\n        ? textEncode(data)\n        : bufferSource2U8a(data);\n\n    return crypto.subtle.encrypt(\n        {\n            name: 'RSA-OAEP',\n        },\n        publicKey,\n        encodedData\n    );\n}\n\n/**\n * Import a public key from a PEM encoded string for encryption.\n * @param pem - PEM encoded string.\n * @param hash - Hash algorithm.\n * @returns\n */\nexport async function importPublicKey(pem: string, hash: SHA): Promise<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        throw new Error('Invalid PEM formatted message.');\n    }\n\n    pem = match[3];\n\n    const keyData = byteStringToBuffer(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): Promise<ArrayBuffer> {\n            return encrypt(publicKey, data);\n        },\n\n        async encryptToString(data: DataSource): Promise<string> {\n            return base64FromBuffer(await encrypt(publicKey, data));\n        },\n    };\n}","import invariant from 'tiny-invariant';\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 * Import a public key from a PEM encoded string for encryption.\n * @param pem - PEM encoded string.\n * @param hash - Hash algorithm.\n * @returns\n */\nexport function importPublicKey(pem: string, hash: SHA): Promise<RSAPublicKey> {\n    invariant(\n        hash === 'SHA-1'\n        || hash === 'SHA-256'\n        || hash === 'SHA-384'\n        || hash === 'SHA-512',\n        'Unsupported hash algorithm.'\n    );\n    return isMinaEnv()\n        ? Promise.resolve(minaImportPublicKey(pem, hash))\n        : webImportPublicKey(pem, hash);\n}","import { sha1 as SHA1, sha256 as SHA256, sha384 as SHA384, sha512 as SHA512 } from 'rsa-oaep-encryption';\nimport { toByteString } from '../../codec/mod.ts';\nimport type { DataSource } from '../../defines.ts';\n\nexport function sha1(data: DataSource): string {\n    return SHA1.create().update(toByteString(data)).digest().toHex();\n}\n\nexport function sha256(data: DataSource): string {\n    return SHA256.create().update(toByteString(data)).digest().toHex();\n}\n\nexport function sha384(data: DataSource): string {\n    return SHA384.create().update(toByteString(data)).digest().toHex();\n}\n\nexport function sha512(data: DataSource): string {\n    return SHA512.create().update(toByteString(data)).digest().toHex();\n}","import { hexFromBuffer, textEncode } 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 async function sha(data: DataSource, hash: SHA): Promise<string> {\n    const encodedData = typeof data === 'string'\n        ? textEncode(data)\n        : data;\n    const hashBuffer = await crypto.subtle.digest(hash, encodedData);\n\n    return hexFromBuffer(hashBuffer);\n}","import { isMinaEnv } from '../../../macros/env.ts';\nimport type { DataSource } from '../../defines.ts';\nimport {\n    sha1 as minaSHA1,\n    sha256 as minaSHA256,\n    sha384 as minaSHA384,\n    sha512 as minaSHA512,\n} from './mina_sha.ts';\nimport { sha as webSHA } from './web_sha.ts';\n\n/**\n * 计算 SHA-1。\n */\nexport function sha1(data: DataSource): Promise<string> {\n    return isMinaEnv()\n        ? Promise.resolve(minaSHA1(data))\n        : webSHA(data, 'SHA-1');\n}\n\n/**\n * 计算 SHA-256。\n */\nexport function sha256(data: DataSource): Promise<string> {\n    return isMinaEnv()\n        ? Promise.resolve(minaSHA256(data))\n        : webSHA(data, 'SHA-256');\n}\n\n/**\n * 计算 SHA-384。\n */\nexport function sha384(data: DataSource): Promise<string> {\n    return isMinaEnv()\n        ? Promise.resolve(minaSHA384(data))\n        : webSHA(data, 'SHA-384');\n}\n\n/**\n * 计算 SHA-512。\n */\nexport function sha512(data: DataSource): Promise<string> {\n    return isMinaEnv()\n        ? Promise.resolve(minaSHA512(data))\n        : webSHA(data, 'SHA-512');\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\nexport function addResizeListener(listener: WechatMinigame.OnWindowResizeCallback): () => void {\n    wx.onWindowResize(listener);\n\n    return (): void => {\n        wx.offWindowResize(listener);\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\nexport function addResizeListener(listener: (ev: UIEvent) => void): () => void {\n    addEventListener('resize', listener);\n\n    return (): void => {\n        removeEventListener('resize', listener);\n    };\n}","import { 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 */\nexport function addErrorListener(listener: (ev: WechatMinigame.Error) => void): () => void {\n    if (isMinaEnv()) {\n        return minaAddErrorListener(listener);\n    }\n\n    const webListener = (ev: ErrorEvent) => {\n        listener({\n            message: ev.message,\n            stack: ev.error.stack,\n        });\n    };\n\n    return webAddErrorListener(webListener);\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns  返回一个函数，调用该函数可以移除监听器。\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 */\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}","import { ABORT_ERROR, FetchError, TIMEOUT_ERROR, type FetchTask } from '@happy-ts/fetch-t';\nimport { Err, Ok, type AsyncIOResult, type IOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { assertSafeUrl } from '../assert/assertions.ts';\nimport { miniGameFailureToError } from '../utils/mod.ts';\nimport 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    assertSafeUrl(url);\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        // default responseType is text\n        options.responseType = responseType;\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 response(): AsyncIOResult<T> {\n            return future.promise;\n        },\n    };\n}","import { 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 */\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 */\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 */\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 */\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 */\nexport function fetchT<T>(url: string, init?: UnionFetchInit): FetchTask<T> {\n    const defaultInit = init ?? {};\n    // default is text type\n    defaultInit.responseType ??= 'text';\n\n    return (isMinaEnv() ? minaFetch(url, defaultInit) : webFetch(url, {\n        ...defaultInit,\n        abortable: true,\n    })) as FetchTask<T>;\n}","export function createImageFromUrl(url: string): WechatMinigame.Image {\n    const img = wx.createImage();\n    img.src = url;\n\n    return img;\n}\n\nexport function createImageFromFile(filePath: string): WechatMinigame.Image {\n    return createImageFromUrl(filePath);\n}","import { readBlobFile } from 'happy-opfs';\nimport { Ok, type AsyncIOResult } from 'happy-rusty';\n\nexport function createImageFromUrl(url: string): HTMLImageElement {\n    const img = new Image();\n    img.src = url;\n\n    return img;\n}\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        return Ok(img);\n    });\n}","import { 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 */\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 */\nexport function createImageFromFile(filePath: string): AsyncIOResult<HTMLImageElement | WechatMinigame.Image> {\n    return isMinaEnv()\n        ? Promise.resolve(Ok(minaCreateImageFromFile(filePath)))\n        : webCreateImageFromFile(filePath);\n}","import { Err, Ok, type AsyncResult, type Result } from 'happy-rusty';\nimport { Future } from 'tiny-future';\n\nexport async function getCurrentPosition(): AsyncResult<WechatMinigame.GetFuzzyLocationSuccessCallbackResult, WechatMinigame.GeneralCallbackResult> {\n    const future = new Future<Result<WechatMinigame.GetFuzzyLocationSuccessCallbackResult, WechatMinigame.GeneralCallbackResult>>();\n\n    try {\n        if (typeof wx.getFuzzyLocation === 'function') {\n            await wx.authorize({\n                scope: 'scope.userFuzzyLocation',\n            });\n\n            wx.getFuzzyLocation({\n                type: 'wgs84',\n                success(res) {\n                    future.resolve(Ok(res));\n                },\n                fail(err) {\n                    future.resolve(Err(err));\n                },\n            });\n        } else {\n            await wx.authorize({\n                scope: 'scope.userLocation',\n            });\n\n            wx.getLocation({\n                type: 'wgs84',\n                success(res) {\n                    future.resolve(Ok(res));\n                },\n                fail(err) {\n                    future.resolve(Err(err));\n                },\n            });\n        }\n    } catch (e) {\n        future.resolve(Err(e as WechatMinigame.GeneralCallbackResult));\n    }\n\n    return future.promise;\n}","import { Err, Ok, type AsyncResult, type Result } from 'happy-rusty';\nimport { Future } from 'tiny-future';\n\nexport function getCurrentPosition(): AsyncResult<GeolocationPosition, GeolocationPositionError> {\n    const future = new Future<Result<GeolocationPosition, GeolocationPositionError>>();\n\n    navigator.geolocation.getCurrentPosition(\n        position => {\n            future.resolve(Ok(position));\n        },\n        err => {\n            future.resolve(Err(err));\n        }\n    );\n\n    return future.promise;\n}","import { type AsyncIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.ts';\nimport { miniGameFailureToError } from '../utils/mod.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 */\nexport async function getCurrentPosition(): AsyncIOResult<GeoPosition> {\n    return isMinaEnv()\n        ? (await minaGetCurrentPosition())\n            .map(pos => ({ latitude: pos.latitude, longitude: pos.longitude }))\n            .mapErr(miniGameFailureToError)\n        : (await webGetCurrentPosition())\n            .map(pos => ({ latitude: pos.coords.latitude, longitude: pos.coords.longitude }))\n            .mapErr(err => new Error(err.message));\n}","import 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    try {\n        const res = await wx.getNetworkType();\n        return res.networkType;\n    } catch {\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 = (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}","import type { NetworkType } from './network_define.ts';\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 * Waiting for typescript support.\n *\n * extend Navigator.\n */\ninterface Navigator {\n    connection?: NetworkInformation;\n}\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}","import { 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 */\nexport function getNetworkType(): Promise<NetworkType> {\n    return isMinaEnv()\n        ? minaGetNetworkType()\n        : Promise.resolve(webGetNetworkType());\n}\n\n/**\n * 监听网络状态变化。\n * @param listener - 网络状态变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addNetworkChangeListener(listener: (type: NetworkType) => void): () => void {\n    return (isMinaEnv() ? minaAddNetworkChangeListener : webAddNetworkChangeListener)(listener);\n}","let deviceInfo: WechatMinigame.DeviceInfo;\n\n/**\n * 获取设备信息。\n * @returns 返回小游戏的设备信息对象。\n */\nexport function getDeviceInfo(): WechatMinigame.DeviceInfo {\n    // 兼容基础库低版本\n    // TODO 暂时只用了platform属性，可安全强转类型\n    deviceInfo ??= wx.getDeviceInfo ? wx.getDeviceInfo() : (wx.getSystemInfoSync() as unknown as WechatMinigame.DeviceInfo);\n    return deviceInfo;\n}","import { getDeviceInfo } from './device.ts';\n\n/**\n * 平台类型，Web 或者小游戏。\n */\nexport type TargetType = 'minigame' | 'web';\n\n/**\n * 获取当前的平台类型。\n * @returns 返回当前的运行环境类型，可能是 'minigame' 或 'web'。\n */\nexport function getTargetType(): TargetType {\n    return 'wx' in globalThis ? 'minigame' : 'web';\n}\n\n/**\n * 判断当前是否在小游戏环境中。\n * @returns 如果在小游戏环境中返回 true，否则返回 false。\n */\nexport function isMiniGame(): boolean {\n    return getTargetType() === 'minigame';\n}\n\n/**\n * 判断当前是否在小游戏的运行时环境中。\n * @returns 如果在小游戏的运行时环境中返回 true，否则返回 false。\n */\nexport function isMiniGameRuntime(): boolean {\n    return isMiniGame() && getDeviceInfo().platform !== 'devtools';\n}\n\n/**\n * 判断当前是否在小游戏的开发者工具中。\n * @returns 如果在小游戏的开发者工具中返回 true，否则返回 false。\n */\nexport function isMiniGameDevtools(): boolean {\n    return isMiniGame() && getDeviceInfo().platform === 'devtools';\n}\n\n/**\n * 判断当前是否在 Web 环境中。\n * @returns 如果在 Web 现境中返回 true，否则返回 false。\n */\nexport function isWeb(): boolean {\n    return getTargetType() === 'web';\n}","import { isMinaEnv } from '../../macros/env.ts';\n\nexport * from './target.ts';\n\n/**\n * 获取窗口信息。\n * @returns\n */\nexport function getWindowInfo(): Pick<WechatMinigame.WindowInfo, 'pixelRatio' | 'screenHeight' | 'screenTop' | 'screenWidth' | 'windowHeight' | 'windowWidth'> {\n    return isMinaEnv()\n        ? wx.getWindowInfo()\n        : {\n            pixelRatio: devicePixelRatio,\n            screenHeight: screen.height,\n            screenTop,\n            screenWidth: screen.width,\n            windowHeight: innerHeight,\n            windowWidth: innerWidth,\n        };\n}","import type { AsyncVoidIOResult } from 'happy-rusty';\nimport type { DataSource } from '../defines.ts';\n\n/**\n * WebSocket 连接状态，小游戏环境可用。\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 */\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 */\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 */\nexport type SocketOptions = Omit<WechatMinigame.ConnectSocketOption, 'url' | 'complete' | 'success' | 'fail'>;","import { RESULT_VOID, type AsyncVoidIOResult, type VoidIOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { assertSafeSocketUrl } from '../assert/assertions.ts';\nimport type { DataSource } from '../defines.ts';\nimport { bufferSource2Ab, miniGameFailureToError, miniGameFailureToResult } 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    assertSafeSocketUrl(url);\n\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 Error(`Invalid socket event type: ${ type }`);\n                }\n            }\n        },\n\n        send(data: DataSource): AsyncVoidIOResult {\n            const future = new Future<VoidIOResult>();\n\n            const sendData = typeof data === 'string'\n                ? data\n                : bufferSource2Ab(data);\n\n            socket.send({\n                data: sendData,\n                success(): void {\n                    future.resolve(RESULT_VOID);\n                },\n                fail(err): void {\n                    future.resolve(miniGameFailureToResult(err));\n                },\n            });\n\n            return future.promise;\n        },\n\n        close(code?: number, reason?: string): void {\n            readyState = SocketReadyState.CLOSING;\n            socket.close({\n                code,\n                reason,\n            });\n        },\n    };\n}","import { RESULT_VOID, type AsyncVoidIOResult } from 'happy-rusty';\nimport { assertSafeSocketUrl } from '../assert/assertions.ts';\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    assertSafeSocketUrl(url);\n\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 Error(`Invalid socket event type: ${ type }`);\n                }\n            }\n        },\n\n        send(data: DataSource): AsyncVoidIOResult {\n            socket.send(data);\n            return Promise.resolve(RESULT_VOID);\n        },\n\n        close: socket.close.bind(socket),\n    };\n}","import { isMinaEnv } from '../../macros/env.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 */\nexport function connectSocket(url: string, options?: SocketOptions): ISocket {\n    return isMinaEnv()\n        ? minaConnectSocket(url, options)\n        : webConnectSocket(url, options?.protocols);\n}","import { type AsyncIOResult, type AsyncVoidIOResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { assertString } from '../assert/assertions.ts';\nimport { tryGeneralAsyncOp, tryGeneralSyncOp } from '../utils/mod.ts';\n\nexport async function setItem(key: string, data: string): AsyncVoidIOResult {\n    assertString(key);\n    assertString(data);\n\n    return tryGeneralAsyncOp(async () => {\n        await wx.setStorage({\n            key,\n            data,\n        });\n    });\n}\n\nexport async function getItem(key: string): AsyncIOResult<string> {\n    assertString(key);\n\n    return tryGeneralAsyncOp(async () => {\n        const res = await wx.getStorage<string>({\n            key,\n        });\n        return res.data;\n    });\n}\n\nexport async function removeItem(key: string): AsyncVoidIOResult {\n    assertString(key);\n\n    return tryGeneralAsyncOp(async () => {\n        await wx.removeStorage({\n            key,\n        });\n    });\n}\n\nexport async function clear(): AsyncVoidIOResult {\n    return tryGeneralAsyncOp(async () => {\n        await wx.clearStorage();\n    });\n}\n\nexport async function getLength(): AsyncIOResult<number> {\n    return tryGeneralAsyncOp(async () => {\n        const info = await wx.getStorageInfo();\n        return info.keys.length;\n    });\n}\n\nexport function setItemSync(key: string, data: string): VoidIOResult {\n    assertString(key);\n    assertString(data);\n\n    return tryGeneralSyncOp(() => {\n        wx.setStorageSync(key, data);\n    });\n}\n\nexport function getItemSync(key: string): IOResult<string> {\n    assertString(key);\n\n    return tryGeneralSyncOp(() => {\n        return wx.getStorageSync<string>(key);\n    });\n}\n\nexport function removeItemSync(key: string): VoidIOResult {\n    assertString(key);\n\n    return tryGeneralSyncOp(() => {\n        wx.removeStorageSync(key);\n    });\n}\n\nexport function clearSync(): VoidIOResult {\n    return tryGeneralSyncOp(() => {\n        wx.clearStorageSync();\n    });\n}\n\nexport function getLengthSync(): IOResult<number> {\n    return tryGeneralSyncOp(() => {\n        const info = wx.getStorageInfoSync();\n        return info.keys.length;\n    });\n}","import { Err, Ok, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { assertString } from '../assert/assertions.ts';\nimport { tryDOMSyncOp } from '../utils/mod.ts';\n\nfunction callOp<T>(op: () => T): IOResult<T> {\n    const res = op();\n    return Ok(res);\n}\n\nexport function setItem(key: string, data: string): VoidIOResult {\n    assertString(key);\n    assertString(data);\n\n    return tryDOMSyncOp(() => {\n        localStorage.setItem(key, data);\n    });\n}\n\nexport function getItem(key: string): IOResult<string> {\n    assertString(key);\n\n    const data = localStorage.getItem(key);\n    return data == null ? Err(new Error(`${ key } not exists`)) : Ok(data);\n}\n\nexport function removeItem(key: string): VoidIOResult {\n    assertString(key);\n\n    return callOp(() => {\n        localStorage.removeItem(key);\n    });\n}\n\nexport function clear(): VoidIOResult {\n    return callOp(() => {\n        localStorage.clear();\n    });\n}\n\nexport function getLength(): IOResult<number> {\n    return callOp(() => {\n        return localStorage.length;\n    });\n}","import type { AsyncIOResult, AsyncVoidIOResult, IOResult, VoidIOResult } from 'happy-rusty';\nimport { isMinaEnv } from '../../macros/env.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    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    removeItem as webRemoveItem,\n    setItem as webSetItem,\n} from './web_storage.ts';\n\n/**\n * 将数据存储在本地缓存中。\n * @param key - 数据的键名。\n * @param data - 要存储的数据。\n * @returns 返回一个 Promise，表示操作完成。\n */\nexport async function setItem(key: string, data: string): AsyncVoidIOResult {\n    return isMinaEnv()\n        ? await minaSetItem(key, data)\n        : Promise.resolve(webSetItem(key, data));\n}\n\n/**\n * 从本地缓存中读取数据。\n * @param key - 数据的键名。\n * @returns 返回一个 Promise，表示操作完成。\n */\nexport async function getItem(key: string): AsyncIOResult<string> {\n    return isMinaEnv()\n        ? minaGetItem(key)\n        : Promise.resolve(webGetItem(key));\n}\n\n/**\n * 从本地缓存中移除指定的数据。\n * @param key - 数据的键名。\n * @returns 返回一个 Promise，表示操作完成。\n */\nexport async function removeItem(key: string): AsyncVoidIOResult {\n    return isMinaEnv()\n        ? await minaRemoveItem(key)\n        : Promise.resolve(webRemoveItem(key));\n}\n\n/**\n * 清除所有的本地存储数据。\n * @returns 返回一个 Promise，表示操作完成。\n */\nexport async function clear(): AsyncVoidIOResult {\n    return isMinaEnv()\n        ? await minaClear()\n        : Promise.resolve(webClear());\n}\n\n/**\n * 获取本地存储数据的长度。\n * @returns 返回一个 Promise，表示操作完成。\n */\nexport async function getLength(): AsyncIOResult<number> {\n    return isMinaEnv()\n        ? await minaGetLength()\n        : Promise.resolve(getLength());\n}\n\n/**\n * `setItem` 的同步版本。\n */\nexport function setItemSync(key: string, data: string): VoidIOResult {\n    return (isMinaEnv() ? minaSetItemSync : webSetItem)(key, data);\n}\n\n/**\n * `getItem` 的同步版本。\n */\nexport function getItemSync(key: string): IOResult<string> {\n    return (isMinaEnv() ? minaGetItemSync : webGetItem)(key);\n}\n\n/**\n * `removeItem` 的同步版本。\n */\nexport function removeItemSync(key: string): VoidIOResult {\n    return (isMinaEnv() ? minaRemoveItemSync : webRemoveItem)(key);\n}\n\n/**\n * `clear` 的同步版本。\n */\nexport function clearSync(): VoidIOResult {\n    return (isMinaEnv() ? minaClearSync : webClear)();\n}\n\n/**\n * `getLength` 的同步版本。\n */\nexport function getLengthSync(): IOResult<number> {\n    return (isMinaEnv() ? minaGetLengthSync : webGetLength)();\n}"],"names":["toFileSystemHandleLike","ABORT_ERROR","Err","Ok","assertAbsolutePath","NOT_FOUND_ERROR","RESULT_VOID","RESULT_FALSE","mkdir","stat","Future","move","readDir","readFile","remove","writeFile","dirname","exists","appendFile","copy","emptyDir","join","readJsonFile","readTextFile","downloadFile","uploadFile","basename","unzip","unzipFromUrl","zip","stats","res","fflate","zipFromUrl","minaMkdir","webMkdir","minaMove","webMove","minaReadDir","webReadDir","minaReadFile","webReadFile","minaRemove","webRemove","minaStat","webStat","path","handle","minaWriteFile","webWriteFile","minaAppendFile","webAppendFile","minaCopy","webCopy","minaExists","webExists","minaEmptyDir","webEmptyDir","minaReadJsonFile","webReadJsonFile","minaReadTextFile","webReadTextFile","minaDownloadFile","webDownloadFile","minaUploadFile","webUploadFile","minaUnzip","webUnzip","minaUnzipFromUrl","webUnzipFromUrl","minaZip","webZip","minaZipFromUrl","webZipFromUrl","mkdirSync","moveSync","readDirSync","readFileSync","removeSync","statSync","writeFileSync","appendFileSync","copySync","existsSync","emptyDirSync","readJsonFileSync","readTextFileSync","unzipSync","SEPARATOR","zipSync","minaMkdirSync","webMkdirSync","minaMoveSync","webMoveSync","minaReadDirSync","webReadDirSync","minaReadFileSync","webReadFileSync","minaRemoveSync","webRemoveSync","minaStatSync","webStatSync","minaWriteFileSync","webWriteFileSync","minaCopySync","webCopySync","minaAppendFileSync","webAppendFileSync","minaExistsSync","webExistsSync","minaEmptyDirSync","webEmptyDirSync","minaReadJsonFileSync","webReadJsonFileSync","minaReadTextFileSync","webReadTextFileSync","minaUnzipSync","webUnzipSync","minaZipSync","webZipSync","textEncode","textDecode","minaTextEncode","webTextEncode","minaTextDecode","webTextDecode","encodeBase64","decodeBase64","minaEncodeBase64","webEncodeBase64","minaDecodeBase64","webDecodeBase64","writeText","readText","minaWriteText","webWriteText","minaReadText","webReadText","createHMAC","sha1","sha256","sha384","sha512","ByteStringBuffer","minaCreateHMAC","webCreateHMAC","getRandomValues","randomUUID","minaGetRandomValues","webGetRandomValues","minaRandomUUID","webRandomUUID","importPublicKey","importKey","minaImportPublicKey","webImportPublicKey","SHA1","SHA256","SHA384","SHA512","minaSHA1","webSHA","minaSHA256","minaSHA384","minaSHA512","addErrorListener","addUnhandledrejectionListener","addResizeListener","minaAddErrorListener","webAddErrorListener","minaAddUnhandledrejectionListener","webAddUnhandledrejectionListener","minaAddResizeListener","webAddResizeListener","FetchError","TIMEOUT_ERROR","webFetch","createImageFromUrl","createImageFromFile","readBlobFile","minaCreateImageFromUrl","webCreateImageFromUrl","minaCreateImageFromFile","webCreateImageFromFile","getCurrentPosition","minaGetCurrentPosition","webGetCurrentPosition","getNetworkType","addNetworkChangeListener","minaGetNetworkType","webGetNetworkType","minaAddNetworkChangeListener","webAddNetworkChangeListener","connectSocket","minaConnectSocket","webConnectSocket","setItem","getItem","removeItem","clear","getLength","setItemSync","getItemSync","removeItemSync","clearSync","getLengthSync","minaSetItem","webSetItem","minaGetItem","webGetItem","minaRemoveItem","webRemoveItem","minaClear","webClear","minaGetLength","minaSetItemSync","minaGetItemSync","minaRemoveItemSync","minaClearSync","minaGetLengthSync","webGetLength"],"mappings":"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"}