Skip to content

Commit

Permalink
perf: skip maxDepth filtering if natively supported (#560)
Browse files Browse the repository at this point in the history
  • Loading branch information
43081j authored Jan 3, 2025
1 parent cc0b0ca commit aec28a8
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 2 deletions.
3 changes: 3 additions & 0 deletions src/drivers/fs-lite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ export default defineDriver((opts: FSStorageOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
flags: {
maxDepth: true,
},
hasItem(key) {
return existsSync(r(key));
},
Expand Down
3 changes: 3 additions & 0 deletions src/drivers/fs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ export default defineDriver((opts: FSStorageOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
flags: {
maxDepth: true,
},
hasItem(key) {
return existsSync(r(key));
},
Expand Down
9 changes: 7 additions & 2 deletions src/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,11 @@ export function createStorage<T extends StorageValue>(
const mounts = getMounts(base, true);
let maskedMounts: string[] = [];
const allKeys = [];
let allMountsSupportMaxDepth = true;
for (const mount of mounts) {
if (!mount.driver.flags?.maxDepth) {
allMountsSupportMaxDepth = false;
}
const rawKeys = await asyncCall(
mount.driver.getKeys,
mount.relativeBase,
Expand All @@ -368,10 +372,11 @@ export function createStorage<T extends StorageValue>(
...maskedMounts.filter((p) => !p.startsWith(mount.mountpoint)),
];
}
const shouldFilterByDepth =
opts.maxDepth !== undefined && !allMountsSupportMaxDepth;
return allKeys.filter(
(key) =>
(opts.maxDepth === undefined ||
filterKeyByDepth(key, opts.maxDepth)) &&
(!shouldFilterByDepth || filterKeyByDepth(key, opts.maxDepth)) &&
filterKeyByBase(key, base)
);
},
Expand Down
27 changes: 27 additions & 0 deletions test/storage.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { describe, it, expect, vi } from "vitest";
import { resolve } from "node:path";
import {
createStorage,
snapshot,
restoreSnapshot,
prefixStorage,
} from "../src";
import memory from "../src/drivers/memory";
import fs from "../src/drivers/fs";

const data = {
"etc:conf": "test",
Expand Down Expand Up @@ -222,4 +224,29 @@ describe("Regression", () => {
await pStorage.remove("y");
expect(await pStorage.has("y")).toBe(false);
});

it("getKeys supports maxDepth with mixed native support", async () => {
const base = resolve(__dirname, "tmp/fs");
const mainStorage = memory();
const secondaryStorage = fs({ base });
const storage = createStorage({ driver: mainStorage });

storage.mount("/storage_b", secondaryStorage);

try {
await storage.setItem("/storage_a/file_depth1", "contents");
await storage.setItem("/storage_a/depth1/file_depth2", "contents");
await storage.setItem("/storage_b/file_depth1", "contents");
await storage.setItem("/storage_b/depth1/file_depth2", "contents");

const keys = await storage.getKeys(undefined, { maxDepth: 1 });

expect(keys.sort()).toMatchObject([
"storage_a:file_depth1",
"storage_b:file_depth1",
]);
} finally {
await storage.clear();
}
});
});

0 comments on commit aec28a8

Please sign in to comment.