{"version":3,"file":"main.mjs","sources":["../src/fs/constants.ts","../src/fs/assertions.ts","../src/fs/helpers.ts","../src/fs/utils.ts","../src/fs/opfs_core.ts","../src/fs/opfs_download.ts","../src/fs/opfs_ext.ts","../src/fs/opfs_tmp.ts","../src/fs/opfs_unzip.ts","../src/fs/opfs_upload.ts","../src/fs/opfs_zip.ts","../src/fs/support.ts","../src/worker/helpers.ts","../src/worker/shared.ts","../src/worker/opfs_worker.ts","../src/worker/opfs_worker_adapter.ts"],"sourcesContent":["export { ABORT_ERROR, TIMEOUT_ERROR } from '@happy-ts/fetch-t';\n\n/**\n * A constant representing the error thrown when a file or directory is not found.\n * Name of DOMException.NOT_FOUND_ERR.\n */\nexport const NOT_FOUND_ERROR = 'NotFoundError' as const;\n\n/**\n * A constant representing the root directory path.\n */\nexport const ROOT_DIR = '/' as const;\n\n/**\n * A constant representing the current directory path.\n */\nexport const CURRENT_DIR = '.' as const;\n\n/**\n * A constant representing the temporary directory path.\n */\nexport const TMP_DIR = '/tmp' as const;","import invariant from 'tiny-invariant';\nimport { ROOT_DIR } from './constants.ts';\n\n/**\n * Asserts that the provided path is an absolute path.\n *\n * @param path - The file path to validate.\n * @throws Will throw an error if the path is not an absolute path.\n */\nexport function assertAbsolutePath(path: string): void {\n    invariant(typeof path === 'string', () => `Path must be a string but received ${ path }`);\n    invariant(path[0] === ROOT_DIR, () => `Path must start with / but received ${ path }`);\n}\n\n/**\n * Asserts that the provided URL is a valid file URL.\n *\n * @param fileUrl - The file URL to validate.\n * @throws Will throw an error if the URL is not a valid file URL.\n */\nexport function assertFileUrl(fileUrl: string): void {\n    invariant(typeof fileUrl === 'string', () => `File url must be a string but received ${ fileUrl }`);\n}","import { SEPARATOR, basename, dirname } from '@std/path/posix';\nimport { Err, Ok, RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { ABORT_ERROR, CURRENT_DIR, NOT_FOUND_ERROR, ROOT_DIR } from './constants.ts';\n\n/**\n * The root directory handle of the file system.\n */\nlet fsRoot: FileSystemDirectoryHandle;\n\n/**\n * Retrieves the root directory handle of the file system.\n *\n * @returns A promise that resolves to the `FileSystemDirectoryHandle` of the root directory.\n */\nasync function getFsRoot(): Promise<FileSystemDirectoryHandle> {\n    fsRoot ??= await navigator.storage.getDirectory();\n    return fsRoot;\n}\n\n/**\n * Checks if the provided path is the root directory path.\n *\n * @param path - The path to check.\n * @returns A boolean indicating whether the path is the root directory path.\n */\nexport function isRootPath(path: string): boolean {\n    return path === ROOT_DIR;\n}\n\n/**\n * Checks if the provided directory path is the current directory.\n *\n * @param dirPath - The directory path to check.\n * @returns A boolean indicating whether the directory path is the current directory.\n */\nexport function isCurrentDir(dirPath: string): boolean {\n    return dirPath === CURRENT_DIR;\n}\n\n/**\n * Asynchronously obtains a handle to a child directory from the given parent directory handle.\n *\n * @param dirHandle - The handle to the parent directory.\n * @param dirName - The name of the child directory to retrieve.\n * @param options - Optional parameters that specify options such as whether to create the directory if it does not exist.\n * @returns A promise that resolves to an `AsyncIOResult` containing the `FileSystemDirectoryHandle` for the child directory.\n */\nasync function getChildDirHandle(dirHandle: FileSystemDirectoryHandle, dirName: string, options?: FileSystemGetDirectoryOptions): AsyncIOResult<FileSystemDirectoryHandle> {\n    try {\n        const handle = await dirHandle.getDirectoryHandle(dirName, options);\n\n        return Ok(handle);\n    } catch (e) {\n        const err = e as DOMException;\n        const error = new Error(`${ err.name }: ${ err.message } When get child directory '${ dirName }' from directory '${ dirHandle.name || ROOT_DIR }'.`);\n        error.name = err.name;\n\n        return Err(error);\n    }\n}\n\n/**\n * Retrieves a file handle for a child file within a directory.\n *\n * @param dirHandle - The directory handle to search within.\n * @param fileName - The name of the file to retrieve.\n * @param options - Optional parameters for getting the file handle.\n * @returns A promise that resolves to an `AsyncIOResult` containing the `FileSystemFileHandle`.\n */\nasync function getChildFileHandle(dirHandle: FileSystemDirectoryHandle, fileName: string, options?: FileSystemGetFileOptions): AsyncIOResult<FileSystemFileHandle> {\n    try {\n        const handle = await dirHandle.getFileHandle(fileName, options);\n\n        return Ok(handle);\n    } catch (e) {\n        const err = e as DOMException;\n        const error = new Error(`${ err.name }: ${ err.message } When get child file '${ fileName }' from directory '${ dirHandle.name || ROOT_DIR }'.`);\n        error.name = err.name;\n\n        return Err(error);\n    }\n}\n\n/**\n * Retrieves a directory handle given a path.\n *\n * @param dirPath - The path of the directory to retrieve.\n * @param options - Optional parameters for getting the directory handle.\n * @returns A promise that resolves to an `AsyncIOResult` containing the `FileSystemDirectoryHandle`.\n */\nexport async function getDirHandle(dirPath: string, options?: FileSystemGetDirectoryOptions): AsyncIOResult<FileSystemDirectoryHandle> {\n    // create from root\n    let dirHandle = await getFsRoot();\n\n    if (isRootPath(dirPath)) {\n        // root is already the a handle\n        return Ok(dirHandle);\n    }\n\n    // start with /\n    let childDirPath = dirPath.slice(1);\n\n    while (childDirPath) {\n        let dirName = '';\n        const index = childDirPath.indexOf(SEPARATOR);\n\n        if (index === -1) {\n            dirName = childDirPath;\n            childDirPath = '';\n        } else {\n            dirName = childDirPath.slice(0, index);\n            childDirPath = childDirPath.slice(index + 1);\n\n            // skip //\n            if (index === 0) {\n                continue;\n            }\n        }\n\n        const dirHandleRes = await getChildDirHandle(dirHandle, dirName, options);\n        if (dirHandleRes.isErr()) {\n            // stop\n            return dirHandleRes;\n        }\n\n        dirHandle = dirHandleRes.unwrap();\n    }\n\n    return Ok(dirHandle);\n}\n\n/**\n * Retrieves a file handle given a file path.\n *\n * @param filePath - The path of the file to retrieve.\n * @param options - Optional parameters for getting the file handle.\n * @returns A promise that resolves to an `AsyncIOResult` containing the `FileSystemFileHandle`.\n */\nexport async function getFileHandle(filePath: string, options?: FileSystemGetFileOptions): AsyncIOResult<FileSystemFileHandle> {\n    const isCreate = options?.create ?? false;\n\n    const dirPath = dirname(filePath);\n    const fileName = basename(filePath);\n\n    const dirHandleRes = await getDirHandle(dirPath, {\n        create: isCreate,\n    });\n\n    return dirHandleRes.andThenAsync(dirHandle => {\n        return getChildFileHandle(dirHandle, fileName, {\n            create: isCreate,\n        });\n    });\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 * Gets the final result from a list of AsyncVoidIOResult tasks.\n * @param tasks - The list of tasks to get the final result from.\n * @returns The final result from the list of tasks.\n */\nexport async function getFinalResult(tasks: AsyncVoidIOResult[]): AsyncVoidIOResult {\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 * 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 { join, SEPARATOR } from '@std/path/posix';\nimport { TMP_DIR } from './constants.ts';\nimport type { FileSystemFileHandleLike, FileSystemHandleLike, TempOptions } from './defines.ts';\n\n/**\n * Generate a temporary path but not create it.\n *\n * @param options - Options and flags.\n * @returns The temporary path.\n */\nexport function generateTempPath(options?: TempOptions): string {\n    const {\n        isDirectory = false,\n        basename = 'tmp',\n        extname = '',\n    } = options ?? {};\n\n    const base = basename ? `${ basename }-` : '';\n    const ext = isDirectory ? '' : extname;\n\n    // use uuid to generate a unique name\n    return join(TMP_DIR, `${ base }${ crypto.randomUUID() }${ ext }`);\n}\n\n/**\n * Check whether the path is a temporary path.\n * @param path - The path to check.\n * @returns `true` if the path is a temporary path otherwise `false`.\n */\nexport function isTempPath(path: string): boolean {\n    return path.startsWith(`${ TMP_DIR }${ SEPARATOR }`);\n}\n\n/**\n * Serialize a `FileSystemHandle` to plain object.\n * @param handle - `FileSystemHandle` object.\n * @returns Serializable version of FileSystemHandle that is FileSystemHandleLike.\n */\nexport async function toFileSystemHandleLike(handle: FileSystemHandle): Promise<FileSystemHandleLike> {\n    const { name, kind } = handle;\n\n    if (isFileHandle(handle)) {\n        const file = await handle.getFile();\n        const { size, lastModified, type } = file;\n\n        const fileHandle: FileSystemFileHandleLike = {\n            name,\n            kind,\n            type,\n            size,\n            lastModified,\n        };\n\n        return fileHandle;\n    }\n\n    const handleLike: FileSystemHandleLike= {\n        name,\n        kind,\n    };\n\n    return handleLike;\n}\n\n/**\n * Whether the handle is a file.\n * @param handle - The handle which is a FileSystemHandle.\n * @returns `true` if the handle is a file, otherwise `false`.\n */\nexport function isFileHandle(handle: FileSystemHandle): handle is FileSystemFileHandle {\n    return handle.kind === 'file';\n}\n\n/**\n * Whether the handle is a directory.\n * @param handle - The handle which is a FileSystemHandle.\n * @returns `true` if the handle is a directory, otherwise `false`.\n */\nexport function isDirectoryHandle(handle: FileSystemHandle): handle is FileSystemDirectoryHandle {\n    return handle.kind === 'directory';\n}\n\n/**\n * Whether the handle is a file-like.\n * @param handle -  The handle which is a FileSystemHandleLike.\n * @returns `true` if the handle is a file, otherwise `false`.\n */\nexport function isFileHandleLike(handle: FileSystemHandleLike): handle is FileSystemFileHandleLike {\n    return handle.kind === 'file';\n}\n\n/**\n * Gets the data of a file handle.\n * @param handle - The file handle.\n * @returns A promise that resolves to the data of the file.\n */\nexport async function getFileDataByHandle(handle: FileSystemFileHandle): Promise<Uint8Array> {\n    const file = await handle.getFile();\n    const ab = await file.arrayBuffer();\n    return new Uint8Array(ab);\n}","import { basename, dirname, join } from '@std/path/posix';\nimport { Err, Ok, RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport { assertAbsolutePath } from './assertions.ts';\nimport { NOT_FOUND_ERROR } from './constants.ts';\nimport type { ReadDirEntry, ReadDirOptions, ReadFileContent, ReadOptions, WriteFileContent, WriteOptions } from './defines.ts';\nimport { getDirHandle, getFileHandle, isNotFoundError, isRootPath } from './helpers.ts';\nimport { isDirectoryHandle } from './utils.ts';\n\n/**\n * Creates a new file at the specified path same as `touch`.\n *\n * @param filePath - The path of the file to create.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the file was successfully created.\n */\nexport async function createFile(filePath: string): AsyncVoidIOResult {\n    assertAbsolutePath(filePath);\n\n    const fileHandleRes = await getFileHandle(filePath, {\n        create: true,\n    });\n\n    return fileHandleRes.and(RESULT_VOID);\n}\n\n/**\n * Creates a new directory at the specified path same as `mkdir -p`.\n *\n * @param dirPath - The path where the new directory will be created.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the directory was successfully created.\n */\nexport async function mkdir(dirPath: string): AsyncVoidIOResult {\n    assertAbsolutePath(dirPath);\n\n    const dirHandleRes = await getDirHandle(dirPath, {\n        create: true,\n    });\n\n    return dirHandleRes.and(RESULT_VOID);\n}\n\n/**\n * Reads the contents of a directory at the specified path.\n *\n * @param dirPath - The path of the directory to read.\n * @param options - Options of readdir.\n * @returns A promise that resolves to an `AsyncIOResult` containing an async iterable iterator over the entries of the directory.\n */\nexport async function readDir(dirPath: string, options?: ReadDirOptions): AsyncIOResult<AsyncIterableIterator<ReadDirEntry>> {\n    assertAbsolutePath(dirPath);\n\n    const dirHandleRes = await getDirHandle(dirPath);\n\n    async function* read(dirHandle: FileSystemDirectoryHandle, subDirPath: string): AsyncIterableIterator<ReadDirEntry> {\n        const entries = dirHandle.entries();\n\n        for await (const [name, handle] of entries) {\n            // relative path from `dirPath`\n            const path = subDirPath === dirPath ? name : join(subDirPath, name);\n            yield {\n                path,\n                handle,\n            };\n\n            if (isDirectoryHandle(handle) && options?.recursive) {\n                yield* read(await dirHandle.getDirectoryHandle(name), path);\n            }\n        }\n    }\n\n    return dirHandleRes.andThen(x => Ok(read(x, dirPath)));\n}\n\n/**\n * Reads the content of a file at the specified path as a File.\n *\n * @param filePath - The path of the file to read.\n * @param options - Read options specifying the 'blob' encoding.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content as a File.\n */\nexport function readFile(filePath: string, options: ReadOptions & {\n    encoding: 'blob';\n}): AsyncIOResult<File>;\n\n/**\n * Reads the content of a file at the specified path as a string.\n *\n * @param filePath - The path of the file to read.\n * @param options - Read options specifying the 'utf8' encoding.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content as a string.\n */\nexport function readFile(filePath: string, options: ReadOptions & {\n    encoding: 'utf8';\n}): AsyncIOResult<string>;\n\n/**\n * Reads the content of a file at the specified path as an ArrayBuffer by default.\n *\n * @param filePath - The path of the file to read.\n * @param options - Read options specifying the 'binary' encoding.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content as an ArrayBuffer.\n */\nexport function readFile(filePath: string, options?: ReadOptions & {\n    encoding: 'binary';\n}): AsyncIOResult<ArrayBuffer>;\n\n/**\n * Reads the content of a file at the specified path with the specified options.\n *\n * @template T The type of the content to read from the file.\n * @param filePath - The path of the file to read.\n * @param options - Optional read options.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content.\n */\nexport async function readFile<T extends ReadFileContent>(filePath: string, options?: ReadOptions): AsyncIOResult<T> {\n    assertAbsolutePath(filePath);\n\n    const fileHandleRes = await getFileHandle(filePath);\n\n    return fileHandleRes.andThenAsync(async fileHandle => {\n        const file = await fileHandle.getFile();\n        switch (options?.encoding) {\n            case 'blob': {\n                return Ok(file as unknown as T);\n            }\n            case 'utf8': {\n                const text = await file.text();\n                return Ok(text as unknown as T);\n            }\n            default: {\n                const data = await file.arrayBuffer();\n                return Ok(data as unknown as T);\n            }\n        }\n    });\n}\n\n/**\n * Removes a file or directory at the specified path same as `rm -rf`.\n *\n * @param path - The path of the file or directory to remove.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the file or directory was successfully removed.\n */\nexport async function remove(path: string): AsyncVoidIOResult {\n    assertAbsolutePath(path);\n\n    const dirPath = dirname(path);\n    const childName = basename(path);\n\n    const dirHandleRes = await getDirHandle(dirPath);\n\n    return (await dirHandleRes.andThenAsync(async (dirHandle): AsyncVoidIOResult => {\n        try {\n            // root\n            if (isRootPath(dirPath) && isRootPath(childName)) {\n                // TODO ts not support yet\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                await (dirHandle as any).remove({\n                    recursive: true,\n                });\n            } else {\n                await dirHandle.removeEntry(childName, {\n                    recursive: true,\n                });\n            }\n        } catch (e) {\n            return Err(e as DOMException);\n        }\n\n        return RESULT_VOID;\n    })).orElse<Error>(err => {\n        // not found as success\n        return isNotFoundError(err) ? RESULT_VOID : Err(err);\n    });\n}\n\n/**\n * Retrieves the status of a file or directory at the specified path.\n *\n * @param path - The path of the file or directory to retrieve status for.\n * @returns A promise that resolves to an `AsyncIOResult` containing the `FileSystemHandle`.\n */\nexport async function stat(path: string): AsyncIOResult<FileSystemHandle> {\n    assertAbsolutePath(path);\n\n    const dirPath = dirname(path);\n    const childName = basename(path);\n\n    const dirHandleRes = await getDirHandle(dirPath);\n    if (!childName) {\n        // root\n        return dirHandleRes;\n    }\n\n    return dirHandleRes.andThenAsync(async dirHandle => {\n        // currently only rely on traversal inspection\n        for await (const [name, handle] of dirHandle.entries()) {\n            if (name === childName) {\n                return Ok(handle);\n            }\n        }\n\n        const err = new Error(`${ NOT_FOUND_ERROR }: '${ childName }' does not exist. Full path is '${ path }'.`);\n        err.name = NOT_FOUND_ERROR;\n\n        return Err(err);\n    });\n}\n\n/**\n * Writes content to a file at the specified path.\n *\n * @param filePath - The path of the file to write to.\n * @param contents - The content to write to the file.\n * @param options - Optional write options.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the file was successfully written.\n */\nexport async function writeFile(filePath: string, contents: WriteFileContent, options?: WriteOptions): AsyncVoidIOResult {\n    assertAbsolutePath(filePath);\n\n    // create as default\n    const { append = false, create = true } = options ?? {};\n\n    const fileHandleRes = await getFileHandle(filePath, {\n        create,\n    });\n\n    return fileHandleRes.andThenAsync(async fileHandle => {\n        const writable = await fileHandle.createWritable({\n            keepExistingData: append,\n        });\n        const params: WriteParams = {\n            type: 'write',\n            data: contents,\n        };\n\n        // append?\n        if (append) {\n            const { size } = await fileHandle.getFile();\n            params.position = size;\n        }\n\n        await writable.write(params);\n        await writable.close();\n\n        return RESULT_VOID;\n    });\n}","import { fetchT, type FetchResponse, type FetchTask } from '@happy-ts/fetch-t';\nimport { extname } from '@std/path/posix';\nimport { Err, Ok } from 'happy-rusty';\nimport { assertAbsolutePath, assertFileUrl } from './assertions.ts';\nimport type { DownloadFileTempResponse, FsRequestInit } from './defines.ts';\nimport { createAbortError } from './helpers.ts';\nimport { writeFile } from './opfs_core.ts';\nimport { generateTempPath } from './utils.ts';\n\n/**\n * Downloads a file from a URL and saves it to a temporary file.\n * The returned response will contain the temporary file path.\n *\n * @param fileUrl - The URL of the file to download.\n * @param requestInit - Optional request initialization parameters.\n * @returns A task that can be aborted and contains the result of the download.\n */\nexport function downloadFile(fileUrl: string, requestInit?: FsRequestInit): FetchTask<DownloadFileTempResponse>;\n/**\n * Downloads a file from a URL and saves it to the specified path.\n *\n * @param fileUrl - The URL of the file to download.\n * @param filePath - The path where the downloaded file will be saved.\n * @param requestInit - Optional request initialization parameters.\n * @returns A task that can be aborted and contains the result of the download.\n */\nexport function downloadFile(fileUrl: string, filePath: string, requestInit?: FsRequestInit): FetchTask<Response>;\nexport function downloadFile(fileUrl: string, filePath?: string | FsRequestInit, requestInit?: FsRequestInit): FetchTask<Response | DownloadFileTempResponse> {\n    assertFileUrl(fileUrl);\n\n    let saveToTemp = false;\n\n    if (typeof filePath === 'string') {\n        assertAbsolutePath(filePath);\n    } else {\n        requestInit = filePath;\n        // save to a temporary file, reserve the extension\n        filePath = generateTempPath({\n            extname: extname(fileUrl),\n        });\n        saveToTemp = true;\n    }\n\n    let aborted = false;\n\n    const fetchTask = fetchT(fileUrl, {\n        redirect: 'follow',\n        ...requestInit,\n        abortable: true,\n    });\n\n    const response = (async (): FetchResponse<Response> => {\n        const responseRes = await fetchTask.response;\n\n        return responseRes.andThenAsync(async response => {\n            const blob = await response.blob();\n\n            // maybe aborted\n            if (aborted) {\n                return Err(createAbortError());\n            }\n\n            const writeRes = await writeFile(filePath, blob);\n\n            return writeRes.and(Ok(response));\n        });\n    })();\n\n    return {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        abort(reason?: any): void {\n            aborted = true;\n            fetchTask.abort(reason);\n        },\n\n        get aborted(): boolean {\n            return aborted;\n        },\n\n        get response(): FetchResponse<Response | DownloadFileTempResponse> {\n            return saveToTemp\n                ? response.then(res => {\n                    return res.map<DownloadFileTempResponse>(rawResponse => {\n                        return {\n                            tempFilePath: filePath,\n                            rawResponse,\n                        };\n                    });\n                })\n                : response;\n        },\n    };\n}","import { basename, dirname, join } from '@std/path/posix';\nimport { Err, Ok, RESULT_FALSE, RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult, type IOResult } from 'happy-rusty';\nimport invariant from 'tiny-invariant';\nimport { assertAbsolutePath } from './assertions.ts';\nimport type { CopyOptions, ExistsOptions, MoveOptions, WriteFileContent } from './defines.ts';\nimport { getDirHandle, getFinalResult, isNotFoundError } from './helpers.ts';\nimport { mkdir, readDir, readFile, remove, stat, writeFile } from './opfs_core.ts';\nimport { isDirectoryHandle, isFileHandle } from './utils.ts';\n\n/**\n * Moves a file handle to a new path.\n *\n * @param fileHandle - The file handle to move.\n * @param newPath - The new path of the file handle.\n * @returns A promise that resolves to an `AsyncVoidIOResult` indicating whether the file handle was successfully moved.\n */\nasync function moveHandle(fileHandle: FileSystemFileHandle, newPath: string): AsyncVoidIOResult {\n    const newDirPath = dirname(newPath);\n\n    return (await getDirHandle(newDirPath, {\n        create: true,\n    })).andThenAsync(async newDirHandle => {\n        const newName = basename(newPath);\n\n        try {\n            // TODO ts not support yet\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            await (fileHandle as any).move(newDirHandle, newName);\n            return RESULT_VOID;\n        } catch (e) {\n            return Err(e as DOMException);\n        }\n    });\n}\n\n/**\n * @param srcFileHandle - The source file handle to move or copy.\n * @param destFilePath - The destination file path.\n */\ntype handleSrcFileToDest = (srcFileHandle: FileSystemFileHandle, destFilePath: string) => AsyncVoidIOResult;\n/**\n * Copy or move a file or directory from one path to another.\n * @param srcPath - The source file/directory path.\n * @param destPath - The destination file/directory path.\n * @param handler - How to handle the file handle to the destination.\n * @param overwrite - Whether to overwrite the destination file if it exists.\n * @returns A promise that resolves to an `AsyncVoidIOResult` indicating whether the file was successfully copied/moved.\n */\nasync function mkDestFromSrc(srcPath: string, destPath: string, handler: handleSrcFileToDest, overwrite = true): AsyncVoidIOResult {\n    assertAbsolutePath(destPath);\n\n    return (await stat(srcPath)).andThenAsync(async srcHandle => {\n        // if overwrite is false, we need this flag to determine whether to write file.\n        let destExists = false;\n        const destHandleRes = await stat(destPath);\n\n        if (destHandleRes.isErr()) {\n            if (!isNotFoundError(destHandleRes.unwrapErr())) {\n                return destHandleRes.asErr();\n            }\n        } else {\n            destExists = true;\n            // check\n            const destHandle = destHandleRes.unwrap();\n            if (!((isFileHandle(srcHandle) && isFileHandle(destHandle))\n                || (isDirectoryHandle(srcHandle) && isDirectoryHandle(destHandle)))) {\n                return Err(new Error(`Both 'srcPath' and 'destPath' must both be a file or directory.`));\n            }\n        }\n\n        // both are files\n        if (isFileHandle(srcHandle)) {\n            return (overwrite || !destExists) ? await handler(srcHandle, destPath) : RESULT_VOID;\n        }\n\n        // both are directories\n        const readDirRes = await readDir(srcPath, {\n            recursive: true,\n        });\n        return readDirRes.andThenAsync(async entries => {\n            const tasks: AsyncVoidIOResult[] = [\n                // make sure new dir created\n                mkdir(destPath),\n            ];\n\n            for await (const { path, handle } of entries) {\n                const newEntryPath = join(destPath, path);\n\n                let newPathExists = false;\n                if (destExists) {\n                    // should check every file\n                    const existsRes = await exists(newEntryPath);\n                    if (existsRes.isErr()) {\n                        tasks.push(Promise.resolve(existsRes.asErr()));\n                        continue;\n                    }\n\n                    newPathExists = existsRes.unwrap();\n                }\n\n                const res: AsyncVoidIOResult = isFileHandle(handle)\n                    ? (overwrite || !newPathExists ? handler(handle, newEntryPath) : Promise.resolve(RESULT_VOID))\n                    : mkdir(newEntryPath);\n\n                tasks.push(res);\n            }\n\n            return getFinalResult(tasks);\n        });\n    });\n}\n\n/**\n * Appends content to a file at the specified path.\n *\n * @param filePath - The path of the file to append to.\n * @param contents - The content to append to the file.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the content was successfully appended.\n */\nexport function appendFile(filePath: string, contents: WriteFileContent): AsyncVoidIOResult {\n    return writeFile(filePath, contents, {\n        append: true,\n    });\n}\n\n/**\n * Copies a file or directory from one location to another same as `cp -r`.\n *\n * Both `srcPath` and `destPath` must both be a file or directory.\n *\n * @param srcPath - The source file/directory path.\n * @param destPath - The destination file/directory path.\n * @param options - The copy options.\n * @returns A promise that resolves to an `AsyncVoidIOResult` indicating whether the file was successfully copied.\n */\nexport async function copy(srcPath: string, destPath: string, options?: CopyOptions): AsyncVoidIOResult {\n    const {\n        overwrite = true,\n    } = options ?? {};\n\n    return mkDestFromSrc(srcPath, destPath, async (srcHandle, destPath) => {\n        return await writeFile(destPath, await srcHandle.getFile());\n    }, overwrite);\n}\n\n/**\n * Empties the contents of a directory at the specified path.\n *\n * @param dirPath - The path of the directory to empty.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the directory was successfully emptied.\n */\nexport async function emptyDir(dirPath: string): AsyncVoidIOResult {\n    const readDirRes = await readDir(dirPath);\n\n    if (readDirRes.isErr()) {\n        // create if not exist\n        return isNotFoundError(readDirRes.unwrapErr()) ? mkdir(dirPath) : readDirRes.asErr();\n    }\n\n    const tasks: AsyncVoidIOResult[] = [];\n\n    for await (const { path } of readDirRes.unwrap()) {\n        tasks.push(remove(join(dirPath, path)));\n    }\n\n    return getFinalResult(tasks);\n}\n\n/**\n * Checks whether a file or directory exists at the specified path.\n *\n * @param path - The path of the file or directory to check for existence.\n * @param options - Optional existence options.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the file or directory exists.\n */\nexport async function exists(path: string, options?: ExistsOptions): AsyncIOResult<boolean> {\n    const { isDirectory = false, isFile = false } = options ?? {};\n\n    invariant(!(isDirectory && isFile), () => 'ExistsOptions.isDirectory and ExistsOptions.isFile must not be true together.');\n\n    const statRes = await stat(path);\n\n    return statRes.andThen(handle => {\n        const notExist =\n            (isDirectory && isFileHandle(handle))\n            || (isFile && isDirectoryHandle(handle));\n\n        return Ok(!notExist);\n    }).orElse((err): IOResult<boolean> => {\n        return isNotFoundError(err) ? RESULT_FALSE : statRes.asErr();\n    });\n}\n\n/**\n * Move a file or directory from an old path to a new path.\n *\n * @param srcPath - The current path of the file or directory.\n * @param destPath - The new path of the file or directory.\n * @param options - Options of move.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the file or directory was successfully moved.\n */\nexport async function move(srcPath: string, destPath: string, options?: MoveOptions): AsyncVoidIOResult {\n    const {\n        overwrite = true,\n    } = options ?? {};\n\n    return (await mkDestFromSrc(srcPath, destPath, moveHandle, overwrite)).andThenAsync(() => {\n        // finally remove src\n        return remove(srcPath);\n    });\n}\n\n/**\n * Reads the content of a file at the specified path as a File.\n *\n * @param filePath - The path of the file to read.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content as a File.\n */\nexport function readBlobFile(filePath: string): AsyncIOResult<File> {\n    return readFile(filePath, {\n        encoding: 'blob',\n    });\n}\n\n/**\n * Reads the content of a file at the specified path as a string and returns it as a JSON object.\n *\n * @param filePath - The path of the file to read.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content as a JSON object.\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 * Reads the content of a file at the specified path as a string.\n *\n * @param filePath - The path of the file to read.\n * @returns A promise that resolves to an `AsyncIOResult` containing the file content as a string.\n */\nexport function readTextFile(filePath: string): AsyncIOResult<string> {\n    return readFile(filePath, {\n        encoding: 'utf8',\n    });\n}","import { Err, Ok, RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult } from 'happy-rusty';\nimport invariant from 'tiny-invariant';\nimport { TMP_DIR } from './constants.ts';\nimport type { TempOptions } from './defines.ts';\nimport { createFile, mkdir, readDir, remove } from './opfs_core.ts';\nimport { generateTempPath, isFileHandle } from './utils.ts';\n\n/**\n * Create a temporary file or directory.\n *\n * @param options - Options and flags.\n * @returns A promise that resolves the result of the temporary file or directory path.\n */\nexport async function mkTemp(options?: TempOptions): AsyncIOResult<string> {\n    const {\n        isDirectory = false,\n    } = options ?? {};\n\n    const path = generateTempPath(options);\n    const res = await (isDirectory ? mkdir : createFile)(path);\n\n    return res.and(Ok(path));\n}\n\n/**\n * Delete the temporary directory and all its contents.\n * @returns A promise that resolves to an `AsyncVoidIOResult` indicating whether the temporary directory was successfully deleted.\n */\nexport function deleteTemp(): AsyncVoidIOResult {\n    return remove(TMP_DIR);\n}\n\n/**\n * Prune the temporary directory and delete all expired files.\n * @param expired - The date to determine whether a file is expired.\n * @returns A promise that resolves to an `AsyncVoidIOResult` indicating whether the temporary directory was successfully pruned.\n */\nexport async function pruneTemp(expired: Date): AsyncVoidIOResult {\n    invariant(expired instanceof Date, () => `Expired must be a Date but received ${ expired }`);\n\n    const readDirRes = await readDir(TMP_DIR, {\n        recursive: true,\n    });\n\n    return readDirRes.andThenAsync(async entries => {\n        try {\n            for await (const { handle } of entries) {\n                if (isFileHandle(handle) && (await handle.getFile()).lastModified <= expired.getTime()) {\n                    // TODO ts not support yet\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    await (handle as any).remove();\n                }\n            }\n        } catch (e) {\n            return Err(e as DOMException);\n        }\n\n        return RESULT_VOID;\n    });\n}","import { fetchT } from '@happy-ts/fetch-t';\nimport { join, SEPARATOR } from '@std/path/posix';\nimport * as fflate from 'fflate/browser';\nimport { Err, type AsyncVoidIOResult, type VoidIOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { assertAbsolutePath, assertFileUrl } from './assertions.ts';\nimport type { FsRequestInit } from './defines.ts';\nimport { getFinalResult } from './helpers.ts';\nimport { readFile, writeFile } from './opfs_core.ts';\n\n/**\n * Unzip a buffer then write to the target path.\n * @param buffer - Zipped ArrayBuffer.\n * @param targetPath - Target directory path.\n */\nasync function unzipBufferToTarget(buffer: ArrayBuffer, targetPath: string): AsyncVoidIOResult {\n    const data = new Uint8Array(buffer);\n\n    const future = new Future<VoidIOResult>();\n\n    fflate.unzip(data, async (err, unzipped) => {\n        if (err) {\n            future.resolve(Err(err));\n            return;\n        }\n\n        const tasks: AsyncVoidIOResult[] = [];\n\n        for (const path in unzipped) {\n            // ignore directory\n            if (path.at(-1) !== SEPARATOR) {\n                tasks.push(writeFile(join(targetPath, path), unzipped[path]));\n            }\n        }\n\n        future.resolve(getFinalResult(tasks));\n    });\n\n    return await future.promise;\n}\n\n/**\n * Unzip a zip file to a directory.\n * Equivalent to `unzip -o <zipFilePath> -d <targetPath>\n *\n * Use [fflate](https://github.com/101arrowz/fflate) as the unzip backend.\n * @param zipFilePath - Zip file path.\n * @param targetPath - The directory to unzip to.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the zip file was successfully unzipped.\n */\nexport async function unzip(zipFilePath: string, targetPath: string): AsyncVoidIOResult {\n    assertAbsolutePath(targetPath);\n\n    const fileRes = await readFile(zipFilePath);\n\n    return fileRes.andThenAsync(buffer => {\n        return unzipBufferToTarget(buffer, targetPath);\n    });\n}\n\n/**\n * Unzip a remote zip file to a directory.\n * Equivalent to `unzip -o <zipFilePath> -d <targetPath>\n *\n * Use [fflate](https://github.com/101arrowz/fflate) as the unzip backend.\n * @param zipFileUrl - Zip file url.\n * @param targetPath - The directory to unzip to.\n * @param requestInit - Optional request initialization parameters.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the zip file was successfully unzipped.\n */\nexport async function unzipFromUrl(zipFileUrl: string, targetPath: string, requestInit?: FsRequestInit): AsyncVoidIOResult {\n    assertFileUrl(zipFileUrl);\n    assertAbsolutePath(targetPath);\n\n    const fetchRes = await fetchT(zipFileUrl, {\n        redirect: 'follow',\n        ...requestInit,\n        responseType: 'arraybuffer',\n        abortable: false,\n    });\n\n    return fetchRes.andThenAsync(buffer => {\n        return unzipBufferToTarget(buffer, targetPath);\n    });\n}","import { fetchT, type FetchResponse, type FetchTask } from '@happy-ts/fetch-t';\nimport { basename } from '@std/path/posix';\nimport { Err } from 'happy-rusty';\nimport { assertFileUrl } from './assertions.ts';\nimport type { UploadRequestInit } from './defines.ts';\nimport { createAbortError } from './helpers.ts';\nimport { readBlobFile } from './opfs_ext.ts';\n\n/**\n * Uploads a file from the specified path to a URL.\n *\n * @param filePath - The path of the file to upload.\n * @param fileUrl - The URL where the file will be uploaded.\n * @param requestInit - Optional request initialization parameters.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the file was successfully uploaded.\n */\nexport function uploadFile(filePath: string, fileUrl: string, requestInit?: UploadRequestInit): FetchTask<Response> {\n    type T = Response;\n\n    assertFileUrl(fileUrl);\n\n    let aborted = false;\n\n    let fetchTask: FetchTask<T>;\n\n    const response = (async (): FetchResponse<T> => {\n        const fileRes = await readBlobFile(filePath)\n\n        return fileRes.andThenAsync(async file => {\n            // maybe aborted\n            if (aborted) {\n                return Err(createAbortError());\n            }\n\n            const {\n                // default file name\n                filename = basename(filePath),\n                ...rest\n            } = requestInit ?? {};\n\n            const formData = new FormData();\n            formData.append(filename, file, filename);\n\n            fetchTask = fetchT(fileUrl, {\n                method: 'POST',\n                ...rest,\n                abortable: true,\n                body: formData,\n            });\n\n            return fetchTask.response;\n        });\n    })();\n\n    return {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        abort(reason?: any): void {\n            aborted = true;\n            fetchTask?.abort(reason);\n        },\n\n        get aborted(): boolean {\n            return aborted;\n        },\n\n        get response(): FetchResponse<T> {\n            return response;\n        },\n    };\n}","import { fetchT } from '@happy-ts/fetch-t';\nimport { basename, join } from '@std/path/posix';\nimport * as fflate from 'fflate/browser';\nimport { Err, Ok, type AsyncIOResult, type AsyncVoidIOResult, type IOResult } from 'happy-rusty';\nimport { Future } from 'tiny-future';\nimport { assertAbsolutePath, assertFileUrl } from './assertions.ts';\nimport type { FsRequestInit, ZipOptions } from './defines.ts';\nimport { readDir, stat, writeFile } from './opfs_core.ts';\nimport { getFileDataByHandle, isFileHandle } from './utils.ts';\n\n/**\n * Zip a zippable data then write to the target path.\n * @param zippable - Zippable data.\n * @param zipFilePath - Target zip file path.\n */\nasync function zipTo<T>(zippable: fflate.AsyncZippable, zipFilePath?: string): AsyncIOResult<T> {\n    const future = new Future<IOResult<T>>();\n\n    fflate.zip(zippable, {\n        consume: true,\n    }, async (err, u8a) => {\n        if (err) {\n            future.resolve(Err(err));\n            return;\n        }\n\n        // whether to write to file\n        if (zipFilePath) {\n            const res = await writeFile(zipFilePath, 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/**\n * Zip a file or directory and write to a zip file.\n * Equivalent to `zip -r <zipFilePath> <targetPath>`.\n *\n * Use [fflate](https://github.com/101arrowz/fflate) as the zip backend.\n * @param sourcePath - The path to be zipped.\n * @param zipFilePath - The path to the zip file.\n * @param options - Options of zip.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the source was successfully zipped.\n */\nexport async function zip(sourcePath: string, zipFilePath: string, options?: ZipOptions): AsyncVoidIOResult;\n\n/**\n * Zip a file or directory and return the zip file data.\n * Equivalent to `zip -r <zipFilePath> <targetPath>`.\n *\n * Use [fflate](https://github.com/101arrowz/fflate) as the zip backend.\n * @param sourcePath - The path to be zipped.\n * @param options - Options of zip.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the source was successfully zipped.\n */\nexport async function zip(sourcePath: string, options?: ZipOptions): AsyncIOResult<Uint8Array>;\nexport async function zip<T>(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): AsyncIOResult<T> {\n    if (typeof zipFilePath === 'string') {\n        assertAbsolutePath(zipFilePath);\n    } else {\n        options = zipFilePath;\n        zipFilePath = undefined;\n    }\n\n    const statRes = await stat(sourcePath);\n\n    return statRes.andThenAsync(async handle => {\n        const sourceName = basename(sourcePath);\n        const zippable: fflate.AsyncZippable = {};\n\n        if (isFileHandle(handle)) {\n            // file\n            const data = await getFileDataByHandle(handle);\n            zippable[sourceName] = data;\n        } else {\n            // directory\n            const readDirRes = await readDir(sourcePath, {\n                recursive: true,\n            });\n            if (readDirRes.isErr()) {\n                return readDirRes.asErr();\n            }\n\n            // default to preserve root\n            const preserveRoot = options?.preserveRoot ?? true;\n\n            for await (const { path, handle } of readDirRes.unwrap()) {\n                // path\n                if (isFileHandle(handle)) {\n                    const entryName = preserveRoot ? join(sourceName, path) : path;\n                    const data = await getFileDataByHandle(handle);\n                    zippable[entryName] = data;\n                }\n            }\n        }\n\n        return zipTo(zippable, zipFilePath);\n    });\n}\n\n/**\n * Zip a remote file and write to a zip file.\n *\n * Use [fflate](https://github.com/101arrowz/fflate) as the zip backend.\n * @param sourceUrl - The url to be zipped.\n * @param zipFilePath - The path to the zip file.\n * @param requestInit - Optional request initialization parameters.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the source was successfully zipped.\n */\nexport async function zipFromUrl(sourceUrl: string, zipFilePath: string, requestInit?: FsRequestInit): AsyncVoidIOResult;\n\n/**\n * Zip a remote file and return the zip file data.\n *\n * Use [fflate](https://github.com/101arrowz/fflate) as the zip backend.\n * @param sourceUrl - The url to be zipped.\n * @param requestInit - Optional request initialization parameters.\n * @returns A promise that resolves to an `AsyncIOResult` indicating whether the source was successfully zipped.\n */\nexport async function zipFromUrl(sourceUrl: string, requestInit?: FsRequestInit): AsyncIOResult<Uint8Array>;\nexport async function zipFromUrl<T>(sourceUrl: string, zipFilePath?: string | FsRequestInit, requestInit?: FsRequestInit): AsyncIOResult<T> {\n    assertFileUrl(sourceUrl);\n\n    if (typeof zipFilePath === 'string') {\n        assertAbsolutePath(zipFilePath);\n    } else {\n        requestInit = zipFilePath;\n        zipFilePath = undefined;\n    }\n\n    const fetchRes = await fetchT(sourceUrl, {\n        redirect: 'follow',\n        ...requestInit,\n        responseType: 'arraybuffer',\n        abortable: false,\n    });\n\n    return fetchRes.andThenAsync(buffer => {\n        const sourceName = basename(sourceUrl);\n        const zippable: fflate.AsyncZippable = {};\n\n        zippable[sourceName] = new Uint8Array(buffer);\n\n        return zipTo(zippable, zipFilePath);\n    });\n}","/**\n * Checks if the Origin Private File System (OPFS) is supported in the current environment.\n *\n * @returns A boolean indicating whether OPFS is supported.\n */\nexport function isOPFSSupported(): boolean {\n    return typeof navigator?.storage?.getDirectory === 'function';\n}","import { TIMEOUT_ERROR } from '../fs/constants.ts';\nimport type { ErrorLike, FileLike } from '../fs/defines.ts';\n\n/**\n * Serialize an `Error` to plain object.\n * @param error - `Error` object.\n * @returns Serializable version of Error.\n */\nexport function serializeError(error: Error | null): ErrorLike | null {\n    return error ? {\n        name: error.name,\n        message: error.message,\n    } : error;\n}\n\n/**\n * Deserialize an `Error` from plain object.\n * @param error - Serializable version of Error.\n * @returns `Error` object.\n */\nexport function deserializeError(error: ErrorLike): Error {\n    const err = new Error(error.message);\n    err.name = error.name;\n\n    return err;\n}\n\n/**\n * Serialize a `File` to plain object.\n * @param file - `File` object.\n * @returns Serializable version of File.\n */\nexport async function serializeFile(file: File): Promise<FileLike> {\n    const ab = await file.arrayBuffer();\n    return {\n        name: file.name,\n        type: file.type,\n        lastModified: file.lastModified,\n        size: ab.byteLength,\n        data: ab,\n    };\n}\n\n/**\n * Deserialize a `File` from plain object.\n * @param file - Serializable version of File.\n * @returns `File` object.\n */\nexport function deserializeFile(file: FileLike): File {\n    const blob = new Blob([file.data]);\n\n    return new File([blob], file.name, {\n        type: file.type,\n        lastModified: file.lastModified,\n    });\n}\n\n/**\n * Global timeout of per sync I/O operation.\n */\nlet globalOpTimeout = 1000;\n\n/**\n * Set global timeout of per sync I/O operation.\n * @param timeout - Timeout in milliseconds.\n */\nexport function setGlobalOpTimeout(timeout: number): void {\n    globalOpTimeout = timeout;\n}\n\n/**\n * Sleep until a condition is met.\n * @param condition - Condition to be met.\n */\nexport function sleepUntil(condition: () => boolean) {\n    const start = Date.now();\n    while (!condition()) {\n        if (Date.now() - start > globalOpTimeout) {\n            const error = new Error('Operating Timeout');\n            error.name = TIMEOUT_ERROR;\n\n            throw error;\n        }\n    }\n}","import { sleepUntil } from './helpers.ts';\n\n/**\n * Async I/O operations called from main thread to worker thread.\n */\nexport const enum WorkerAsyncOp {\n    // core\n    createFile,\n    mkdir,\n    move,\n    readDir,\n    remove,\n    stat,\n    writeFile,\n    // ext\n    appendFile,\n    copy,\n    emptyDir,\n    exists,\n    deleteTemp,\n    mkTemp,\n    pruneTemp,\n    readBlobFile,\n    unzip,\n    zip,\n}\n\n/**\n * Main thread lock index used in Int32Array.\n */\nconst MAIN_LOCK_INDEX = 0;\n\n/**\n * Worker thread lock index used in Int32Array.\n */\nconst WORKER_LOCK_INDEX = 1;\n\n/**\n * Data index used in Int32Array.\n */\nconst DATA_INDEX = 2;\n\n/**\n * Main thread locked value.\n */\nconst MAIN_LOCKED = 1;\n\n/**\n * Main thread unlocked value.\n * Default.\n */\nconst MAIN_UNLOCKED = 0;\n\n/**\n * Worker thread locked value.\n * Default.\n */\nconst WORKER_LOCKED = MAIN_UNLOCKED;\n\n/**\n * Worker thread unlocked value.\n */\nconst WORKER_UNLOCKED = MAIN_LOCKED;\n\n/**\n * Cache the `TextEncoder` instance.\n */\nlet encoder: TextEncoder;\n\n/**\n * Cache the `TextDecoder` instance.\n */\nlet decoder: TextDecoder;\n\n/**\n * Get the cached `TextEncoder` instance.\n * @returns Instance of `TextEncoder`.\n */\nfunction getEncoder(): TextEncoder {\n    encoder ??= new TextEncoder();\n    return encoder;\n}\n\n/**\n * Get the cached `TextDecoder` instance.\n * @returns Instance of `TextDecoder`.\n */\nfunction getDecoder(): TextDecoder {\n    decoder ??= new TextDecoder();\n    return decoder;\n}\n\n/**\n * Used to encode parameters and return values.\n * @param data - Any data to encode.\n * @returns Encoded binary data.\n */\nexport function encodeToBuffer<T>(data: T): Uint8Array {\n    const str = JSON.stringify(data);\n    return getEncoder().encode(str);\n}\n\n/**\n * Used to decode parameters and return values.\n * @param data - Binary data to decode.\n * @returns Decoded data.\n */\nexport function decodeFromBuffer<T>(data: Uint8Array): T {\n    const str = decodeToString(data);\n    return JSON.parse(str);\n}\n\n/**\n * Commonly decode binary data to string.\n * @param data - Binary data to decode.\n * @returns Decoded string.\n */\nexport function decodeToString(data: Uint8Array): string {\n    return getDecoder().decode(data);\n}\n\n/**\n * Inspired by [memfs](https://github.com/streamich/memfs/blob/master/src/fsa-to-node/worker/SyncMessenger.ts).\n *\n * Used both in main thread and worker thread.\n */\nexport class SyncMessenger {\n    // View of SharedArrayBuffer, used to communicate between main thread and worker.\n    readonly i32a: Int32Array;\n    // View of the same SharedArrayBuffer, used to read and write binary data.\n    readonly u8a: Uint8Array;\n    // 4 int: MAIN_LOCK_INDEX WORKER_LOCK_INDEX DATA_INDEX NOT_USE\n    readonly headerLength = 4 * 4;\n    // maximum length of data to be sent. If data is longer than this, it will throw an error.\n    readonly maxDataLength: number;\n\n    constructor(sab: SharedArrayBuffer) {\n        this.i32a = new Int32Array(sab);\n        this.u8a = new Uint8Array(sab);\n        this.maxDataLength = sab.byteLength - this.headerLength;\n    }\n}\n\n/**\n * Calls a function in worker thread from main tread and returns the result.\n * Used in main thread.\n * @param messenger - SyncMessenger\n * @param data - Request buffer which is encoded parameters.\n * @returns - Response buffer which is encoded return value.\n */\nexport function callWorkerFromMain(messenger: SyncMessenger, data: Uint8Array): Uint8Array {\n    const { i32a, u8a, headerLength, maxDataLength } = messenger;\n    const requestLength = data.byteLength;\n\n    // check whether request is too large\n    if (requestLength > maxDataLength) {\n        throw new RangeError(`Request is too large: ${ requestLength } > ${ maxDataLength }. Consider grow the size of SharedArrayBuffer.`);\n    }\n\n    // lock main thread\n    Atomics.store(i32a, MAIN_LOCK_INDEX, MAIN_LOCKED);\n\n    // payload and length\n    i32a[DATA_INDEX] = requestLength;\n    u8a.set(data, headerLength);\n\n    // wakeup worker\n    // Atomics.notify(i32a, WORKER_LOCK_INDEX); // this may not work\n    Atomics.store(i32a, WORKER_LOCK_INDEX, WORKER_UNLOCKED);\n\n    // wait for worker to finish\n    sleepUntil(() => Atomics.load(i32a, MAIN_LOCK_INDEX) === MAIN_UNLOCKED);\n\n    // worker return\n    const responseLength = i32a[DATA_INDEX];\n    const response = u8a.slice(headerLength, headerLength + responseLength);\n\n    return response;\n}\n\n/**\n * Responds to main thread from worker thread.\n * Used in worker thread.\n * @param messenger - SyncMessenger\n * @param transfer - Function to transfer request data.\n */\nexport async function respondToMainFromWorker(messenger: SyncMessenger, transfer: (data: Uint8Array) => Promise<Uint8Array>): Promise<void> {\n    const { i32a, u8a, headerLength, maxDataLength } = messenger;\n\n    while (true) {\n        if (Atomics.load(i32a, WORKER_LOCK_INDEX) === WORKER_UNLOCKED) {\n            break;\n        }\n    }\n\n    // because of `Atomics.notify` may not work\n    // const waitRes = Atomics.wait(i32a, WORKER_LOCK_INDEX, WORKER_LOCKED);\n    // if (waitRes !== 'ok') {\n    //     throw new Error(`Unexpected Atomics.wait result: ${ waitRes }`);\n    // }\n\n    // payload and length\n    const requestLength = i32a[DATA_INDEX];\n    // console.log(`requestLength: ${ requestLength }`);\n    const data = u8a.slice(headerLength, headerLength + requestLength);\n\n    // call async I/O operation\n    let response = await transfer(data);\n    const responseLength = response.byteLength;\n\n    // check whether response is too large\n    if (responseLength > maxDataLength) {\n        const message = `Response is too large: ${ responseLength } > ${ maxDataLength }. Consider grow the size of SharedArrayBuffer.`;\n\n        response = encodeToBuffer([{\n            name: 'RangeError',\n            message,\n        }]);\n\n        // the error is too large?\n        if (response.byteLength > maxDataLength) {\n            // lock worker thread before throw\n            Atomics.store(i32a, WORKER_LOCK_INDEX, WORKER_LOCKED);\n\n            throw new RangeError(message);\n        }\n    }\n\n    // write response data\n    i32a[DATA_INDEX] = response.byteLength;\n    u8a.set(response, headerLength);\n\n    // lock worker thread\n    Atomics.store(i32a, WORKER_LOCK_INDEX, WORKER_LOCKED);\n\n    // wakeup main thread\n    Atomics.store(i32a, MAIN_LOCK_INDEX, MAIN_UNLOCKED);\n}","import type { IOResult } from 'happy-rusty';\nimport type { ReadDirEntry, ReadDirEntrySync } from '../fs/defines.ts';\nimport { createFile, mkdir, readDir, remove, stat, writeFile } from '../fs/opfs_core.ts';\nimport { appendFile, copy, emptyDir, exists, move, readBlobFile, } from '../fs/opfs_ext.ts';\nimport { deleteTemp, mkTemp, pruneTemp } from '../fs/opfs_tmp.ts';\nimport { unzip } from '../fs/opfs_unzip.ts';\nimport { zip } from '../fs/opfs_zip.ts';\nimport { toFileSystemHandleLike } from '../fs/utils.ts';\nimport { serializeError, serializeFile } from './helpers.ts';\nimport { decodeFromBuffer, encodeToBuffer, respondToMainFromWorker, SyncMessenger, WorkerAsyncOp } from './shared.ts';\n\n/**\n * Async I/O operations which allow to call from main thread.\n */\nconst asyncOps = {\n    [WorkerAsyncOp.createFile]: createFile,\n    [WorkerAsyncOp.mkdir]: mkdir,\n    [WorkerAsyncOp.move]: move,\n    [WorkerAsyncOp.readDir]: readDir,\n    [WorkerAsyncOp.remove]: remove,\n    [WorkerAsyncOp.stat]: stat,\n    [WorkerAsyncOp.writeFile]: writeFile,\n    [WorkerAsyncOp.appendFile]: appendFile,\n    [WorkerAsyncOp.copy]: copy,\n    [WorkerAsyncOp.emptyDir]: emptyDir,\n    [WorkerAsyncOp.exists]: exists,\n    [WorkerAsyncOp.deleteTemp]: deleteTemp,\n    [WorkerAsyncOp.mkTemp]: mkTemp,\n    [WorkerAsyncOp.pruneTemp]: pruneTemp,\n    [WorkerAsyncOp.readBlobFile]: readBlobFile,\n    [WorkerAsyncOp.unzip]: unzip,\n    [WorkerAsyncOp.zip]: zip,\n};\n\n/**\n * Cache the messenger instance.\n */\nlet messenger: SyncMessenger;\n\n/**\n * Start worker agent.\n * Listens to postMessage from main thread.\n * Start runner loop.\n */\nexport function startSyncAgent() {\n    if (typeof window !== 'undefined') {\n        throw new Error('Only can use in worker');\n    }\n\n    if (messenger) {\n        throw new Error('Worker messenger already started');\n    }\n\n    addEventListener('message', (event: MessageEvent<SharedArrayBuffer>) => {\n        // created at main thread and transfer to worker\n        const sab = event.data;\n\n        if (!(sab instanceof SharedArrayBuffer)) {\n            throw new TypeError('Only can post SharedArrayBuffer to Worker');\n        }\n\n        messenger = new SyncMessenger(sab);\n\n        // notify main thread that worker is ready\n        postMessage(true);\n\n        // start waiting for request\n        runWorkerLoop();\n    });\n}\n\n/**\n * Run worker loop.\n */\nasync function runWorkerLoop(): Promise<void> {\n    // loop forever\n    while (true) {\n        try {\n            await respondToMainFromWorker(messenger, async (data) => {\n                const [op, ...args] = decodeFromBuffer(data) as [WorkerAsyncOp, ...Parameters<typeof asyncOps[WorkerAsyncOp]>];\n\n                // handling unequal parameters for serialization and deserialization\n                if (op === WorkerAsyncOp.writeFile || op === WorkerAsyncOp.appendFile) {\n                    // actually is an byte array\n                    if (Array.isArray(args[1])) {\n                        args[1] = new Uint8Array(args[1]);\n                    }\n                } else if (op === WorkerAsyncOp.pruneTemp) {\n                    // actually is a Date string\n                    args[0] = new Date(args[0] as Date);\n                }\n\n                let response: Uint8Array;\n\n                const handle = asyncOps[op];\n\n                try {\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    const res: IOResult<any> = await (handle as any)(...args);\n\n                    if (res.isErr()) {\n                        // without result success\n                        response = encodeToBuffer([serializeError(res.unwrapErr())]);\n                    } else {\n                        // manually serialize response\n                        let rawResponse;\n\n                        if (op === WorkerAsyncOp.readBlobFile) {\n                            const file: File = res.unwrap();\n\n                            const fileLike = await serializeFile(file);\n\n                            rawResponse = {\n                                ...fileLike,\n                                // for serialize\n                                data: [...new Uint8Array(fileLike.data)],\n                            };\n                        } else if (op === WorkerAsyncOp.readDir) {\n                            const iterator: AsyncIterableIterator<ReadDirEntry> = res.unwrap();\n                            const entries: ReadDirEntrySync[] = [];\n\n                            for await (const { path, handle } of iterator) {\n                                const handleLike = await toFileSystemHandleLike(handle);\n                                entries.push({\n                                    path,\n                                    handle: handleLike,\n                                });\n                            }\n\n                            rawResponse = entries;\n                        } else if (op === WorkerAsyncOp.stat) {\n                            const handle: FileSystemHandle = res.unwrap();\n                            const data = await toFileSystemHandleLike(handle);\n\n                            rawResponse = data;\n                        } else if (op === WorkerAsyncOp.zip) {\n                            const data: Uint8Array | undefined = res.unwrap();\n\n                            rawResponse = data instanceof Uint8Array ? [...data] : data;\n                        } else {\n                            // others are all boolean\n                            rawResponse = res.unwrap();\n                        }\n\n                        // without error\n                        response = encodeToBuffer([null, rawResponse]);\n                    }\n                } catch (e) {\n                    response = encodeToBuffer([serializeError(e as Error)]);\n                }\n\n                return response;\n            });\n        } catch (err) {\n            console.error(err instanceof Error ? err.stack : err);\n        }\n    }\n}","import { Err, Ok, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport invariant from 'tiny-invariant';\nimport type { CopyOptions, ExistsOptions, FileLike, FileSystemHandleLike, MoveOptions, ReadDirEntrySync, ReadDirOptions, ReadFileContent, ReadOptions, SyncAgentOptions, TempOptions, WriteOptions, WriteSyncFileContent, ZipOptions } from '../fs/defines.ts';\nimport { deserializeError, setGlobalOpTimeout } from './helpers.ts';\nimport { callWorkerFromMain, decodeFromBuffer, decodeToString, encodeToBuffer, SyncMessenger, WorkerAsyncOp } from './shared.ts';\n\n/**\n * Cache the messenger instance.\n */\nlet messenger: SyncMessenger;\n\n/**\n * Communicate with worker.\n * @param options - SyncAgentOptions\n * @returns\n */\nexport function connectSyncAgent(options: SyncAgentOptions): Promise<void> {\n    if (typeof window === 'undefined') {\n        throw new Error('Only can use in main thread');\n    }\n\n    if (messenger) {\n        throw new Error('Main messenger already started');\n    }\n\n    return new Promise(resolve => {\n        const {\n            worker,\n            bufferLength = 1024 * 1024,\n            opTimeout = 1000,\n        } = options;\n\n        // check parameters\n        invariant(worker instanceof Worker || worker instanceof URL || (typeof worker === 'string' && worker), () => 'worker must be Worker or valid URL(string)');\n        invariant(bufferLength > 16 && bufferLength % 4 === 0, () => 'bufferLength must be a multiple of 4')\n        invariant(Number.isInteger(opTimeout) && opTimeout > 0, () => 'opTimeout must be integer and greater than 0');\n\n        setGlobalOpTimeout(opTimeout);\n\n        const workerAdapter = worker instanceof Worker\n            ? worker\n            : new Worker(worker);\n\n        const sab = new SharedArrayBuffer(bufferLength);\n\n        workerAdapter.addEventListener('message', (event: MessageEvent<boolean>) => {\n            if (event.data) {\n                messenger = new SyncMessenger(sab);\n\n                resolve();\n            }\n        });\n\n        workerAdapter.postMessage(sab);\n    });\n}\n\n/**\n * Get messenger instance.\n * Use `setSyncMessenger` to pass the messenger to other environments for sharing.\n *\n * @returns SyncMessenger instance.\n */\nexport function getSyncMessenger(): SyncMessenger {\n    return messenger;\n}\n\n/**\n * Set messenger instance.\n * Use this method to share messenger with other environments.\n *\n * @param syncMessenger - SyncMessenger instance.\n */\nexport function setSyncMessenger(syncMessenger: SyncMessenger): void {\n    invariant(syncMessenger != null, () => 'syncMessenger is null or undefined');\n    messenger = syncMessenger;\n}\n\n/**\n * Call worker I/O operation.\n * @param op - I/O operation enum.\n * @param args - I/O operation arguments.\n * @returns - I/O operation result.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction callWorkerOp<T>(op: WorkerAsyncOp, ...args: any[]): IOResult<T> {\n    if (!messenger) {\n        // too early\n        return Err(new Error('Worker not initialized. Come back later.'));\n    }\n\n    const request = [op, ...args];\n    const requestData = encodeToBuffer(request);\n\n    try {\n        const response = callWorkerFromMain(messenger, requestData);\n\n        const decodedResponse = decodeFromBuffer(response) as [Error, T];\n        const err = decodedResponse[0];\n        const result: IOResult<T> = err ? Err(deserializeError(err)) : Ok((decodedResponse[1] ?? undefined) as T);\n\n        return result;\n    } catch (err) {\n        return Err(err as Error);\n    }\n}\n\n/**\n * Sync version of `createFile`.\n */\nexport function createFileSync(filePath: string): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.createFile, filePath);\n}\n\n/**\n * Sync version of `mkdir`.\n */\nexport function mkdirSync(dirPath: string): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.mkdir, dirPath);\n}\n\n/**\n * Sync version of `move`.\n */\nexport function moveSync(srcPath: string, destPath: string, options?: MoveOptions): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.move, srcPath, destPath, options);\n}\n\n/**\n * Sync version of `readDir`.\n */\nexport function readDirSync(dirPath: string, options?: ReadDirOptions): IOResult<ReadDirEntrySync[]> {\n    return callWorkerOp(WorkerAsyncOp.readDir, dirPath, options);\n}\n\n/**\n * Sync version of `readFile`.\n */\nexport function readFileSync(filePath: string, options: ReadOptions & {\n    encoding: 'blob';\n}): IOResult<FileLike>;\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 res: IOResult<FileLike> = callWorkerOp(WorkerAsyncOp.readBlobFile, filePath);\n\n    return res.map(file => {\n        // actually data is number array\n        const u8a = new Uint8Array(file.data);\n        file.data = u8a.buffer.slice(u8a.byteOffset, u8a.byteOffset + u8a.byteLength);\n\n        switch (options?.encoding) {\n            case 'blob': {\n                return file as unknown as T;\n            }\n            case 'utf8': {\n                return decodeToString(new Uint8Array(file.data)) as unknown as T;\n            }\n            default: {\n                return file.data as unknown as T;\n            }\n        }\n    });\n}\n\n/**\n * Sync version of `remove`.\n */\nexport function removeSync(path: string): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.remove, path);\n}\n\n/**\n * Sync version of `stat`.\n */\nexport function statSync(path: string): IOResult<FileSystemHandleLike> {\n    return callWorkerOp(WorkerAsyncOp.stat, path);\n}\n\n/**\n * Serialize contents to an byte array or a string that can be sent to worker.\n * @param contents\n * @returns\n */\nfunction serializeWriteContents(contents: WriteSyncFileContent): number[] | string {\n    return contents instanceof ArrayBuffer\n        ? [...new Uint8Array(contents)]\n        : ArrayBuffer.isView(contents)\n            ? [...new Uint8Array(contents.buffer)]\n            : contents;\n}\n\n/**\n * Sync version of `writeFile`.\n */\nexport function writeFileSync(filePath: string, contents: WriteSyncFileContent, options?: WriteOptions): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.writeFile, filePath, serializeWriteContents(contents), options);\n}\n\n/**\n * Sync version of `appendFile`.\n */\nexport function appendFileSync(filePath: string, contents: WriteSyncFileContent): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.appendFile, filePath, serializeWriteContents(contents));\n}\n\n/**\n * Sync version of `copy`.\n */\nexport function copySync(srcPath: string, destPath: string, options?: CopyOptions): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.copy, srcPath, destPath, options);\n}\n\n/**\n * Sync version of `emptyDir`.\n */\nexport function emptyDirSync(dirPath: string): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.emptyDir, dirPath);\n}\n\n/**\n * Sync version of `exists`.\n */\nexport function existsSync(path: string, options?: ExistsOptions): IOResult<boolean> {\n    return callWorkerOp(WorkerAsyncOp.exists, path, options);\n}\n\n/**\n * Sync version of `deleteTemp`.\n */\nexport function deleteTempSync(): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.deleteTemp);\n}\n\n/**\n * Sync version of `mkTemp`.\n */\nexport function mkTempSync(options?: TempOptions): IOResult<string> {\n    return callWorkerOp(WorkerAsyncOp.mkTemp, options);\n}\n\n/**\n * Sync version of `pruneTemp`.\n */\nexport function pruneTempSync(expired: Date): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.pruneTemp, expired);\n}\n\n/**\n * Sync version of `readBlobFile`.\n */\nexport function readBlobFileSync(filePath: string): IOResult<FileLike> {\n    return readFileSync(filePath, {\n        encoding: 'blob',\n    });\n}\n\n/**\n * Sync version of `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 * Sync version of `readTextFile`.\n */\nexport function readTextFileSync(filePath: string): IOResult<string> {\n    return readFileSync(filePath, {\n        encoding: 'utf8',\n    });\n}\n\n/**\n * Sync version of `unzip`.\n */\nexport function unzipSync(zipFilePath: string, targetPath: string): VoidIOResult {\n    return callWorkerOp(WorkerAsyncOp.unzip, zipFilePath, targetPath);\n}\n\n/**\n * Sync version of `zip`.\n */\nexport function zipSync(sourcePath: string, zipFilePath: string, options?: ZipOptions): VoidIOResult;\n\n/**\n * Sync version of `zip`.\n */\nexport function zipSync(sourcePath: string, options?: ZipOptions): IOResult<Uint8Array>;\n\n/**\n * Sync version of `zip`.\n */\nexport function zipSync<T>(sourcePath: string, zipFilePath?: string | ZipOptions, options?: ZipOptions): IOResult<T> {\n    const res = callWorkerOp(WorkerAsyncOp.zip, sourcePath, zipFilePath, options) as IOResult<number[]> | VoidIOResult;\n\n    return res.map(data => {\n        return (data ? new Uint8Array(data) : data) as T;\n    });\n}"],"names":["response","destPath","handle","WorkerAsyncOp","messenger","data"],"mappings":"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"}