diff --git a/common/spaces/disk_space_primitives.ts b/common/spaces/disk_space_primitives.ts index 15140ec..3322df2 100644 --- a/common/spaces/disk_space_primitives.ts +++ b/common/spaces/disk_space_primitives.ts @@ -9,6 +9,7 @@ import { base64DecodeDataUrl, base64EncodedDataUrl, } from "../../plugos/asset_bundle/base64.ts"; +import { walk } from "../../plugos/deps.ts"; function lookupContentType(path: string): string { return mime.getType(path) || "application/octet-stream"; @@ -149,32 +150,26 @@ export class DiskSpacePrimitives implements SpacePrimitives { } async fetchFileList(): Promise { - const fileList: FileMeta[] = []; + const allFiles: FileMeta[] = []; + for await ( + const file of walk(this.rootPath, { + includeDirs: false, + // Exclude hidden directories + skip: [/^.*\/\..+$/], + }) + ) { + const fullPath = file.path; + const s = await Deno.stat(fullPath); + allFiles.push({ + name: fullPath.substring(this.rootPath.length + 1), + lastModified: s.mtime!.getTime(), + contentType: mime.getType(fullPath) || "application/octet-stream", + size: s.size, + perm: "rw", + }); + } - const walkPath = async (dir: string) => { - for await (const file of Deno.readDir(dir)) { - if (file.name.startsWith(".")) { - continue; - } - const fullPath = path.join(dir, file.name); - const s = await Deno.stat(fullPath); - if (file.isDirectory) { - await walkPath(fullPath); - } else { - if (!file.name.startsWith(".")) { - fileList.push({ - name: this.pathToFilename(fullPath), - size: s.size, - contentType: lookupContentType(fullPath), - lastModified: s.mtime!.getTime(), - perm: "rw", - }); - } - } - } - }; - await walkPath(this.rootPath); - return fileList; + return allFiles; } // Plugs diff --git a/plugos/syscalls/fs.deno.test.ts b/plugos/syscalls/fs.deno.test.ts new file mode 100644 index 0000000..a26ae0b --- /dev/null +++ b/plugos/syscalls/fs.deno.test.ts @@ -0,0 +1,17 @@ +import { assert } from "../../test_deps.ts"; +import { FileMeta } from "../../common/types.ts"; +import { path } from "../deps.ts"; +import fileSystemSyscalls from "./fs.deno.ts"; + +const fakeCtx = {} as any; + +Deno.test("Test FS operations", async () => { + const thisFolder = path.dirname(new URL(import.meta.url).pathname); + const syscalls = fileSystemSyscalls(thisFolder); + const allFiles: FileMeta[] = await syscalls["fs.listFiles"]( + fakeCtx, + thisFolder, + true, + ); + assert(allFiles.find((f) => f.name === "fs.deno.test.ts")); +}); diff --git a/plugos/syscalls/fs.deno.ts b/plugos/syscalls/fs.deno.ts index de197e0..46cd590 100644 --- a/plugos/syscalls/fs.deno.ts +++ b/plugos/syscalls/fs.deno.ts @@ -1,5 +1,5 @@ import type { SysCallMapping } from "../system.ts"; -import { mime, path } from "../deps.ts"; +import { mime, path, walk } from "../deps.ts"; import { base64DecodeDataUrl, base64Encode } from "../asset_bundle/base64.ts"; import { FileMeta } from "../../common/types.ts"; @@ -72,26 +72,24 @@ export default function fileSystemSyscalls(root = "/"): SysCallMapping { ): Promise => { dirPath = resolvedPath(dirPath); const allFiles: FileMeta[] = []; - - async function walkPath(dir: string) { - const files = await Deno.readDir(dir); - for await (const file of files) { - const fullPath = path.join(dir, file.name); - const s = await Deno.stat(fullPath); - if (s.isDirectory && recursive) { - await walkPath(fullPath); - } else { - allFiles.push({ - name: fullPath.substring(dirPath.length + 1), - lastModified: s.mtime!.getTime(), - contentType: mime.getType(fullPath) || "application/octet-stream", - size: s.size, - perm: "rw", - }); - } - } + for await ( + const file of walk(dirPath, { + includeDirs: false, + // Exclude hidden files + skip: [/^.*\/\..+$/], + maxDepth: recursive ? Infinity : 1, + }) + ) { + const fullPath = file.path; + const s = await Deno.stat(fullPath); + allFiles.push({ + name: fullPath.substring(dirPath.length + 1), + lastModified: s.mtime!.getTime(), + contentType: mime.getType(fullPath) || "application/octet-stream", + size: s.size, + perm: "rw", + }); } - await walkPath(dirPath); return allFiles; }, };