Use readdir instead of repeated pathExists calls
This commit is contained in:
@@ -437,23 +437,31 @@ async function getStorageFolder(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const realpath = await fs_realpath(storagePath);
|
const realpath = await fs_realpath(storagePath);
|
||||||
let folderName = join(realpath, lastName);
|
let folderName = lastName;
|
||||||
|
|
||||||
|
// get all existing files instead of calling pathExists on every
|
||||||
|
// single combination of realpath and folderName
|
||||||
|
const existingFiles = await readdir(realpath);
|
||||||
|
|
||||||
// avoid overwriting existing folders
|
// avoid overwriting existing folders
|
||||||
let counter = 0;
|
let counter = 0;
|
||||||
while (await pathExists(folderName)) {
|
while (existingFiles.includes(basename(folderName))) {
|
||||||
counter++;
|
counter++;
|
||||||
folderName = join(realpath, `${lastName}-${counter}`);
|
folderName = `${lastName}-${counter}`;
|
||||||
if (counter > 100) {
|
if (counter > 10_000) {
|
||||||
// If there are more than 100 similarly named databases,
|
// If there are more than 10,000 similarly named databases,
|
||||||
// give up on using a counter and use a random string instead.
|
// give up on using a counter and use a random string instead.
|
||||||
folderName = join(realpath, `${lastName}-${nanoid()}`);
|
folderName = `${lastName}-${nanoid()}`;
|
||||||
}
|
}
|
||||||
if (counter > 200) {
|
if (counter > 20_000) {
|
||||||
throw new Error("Could not find a unique name for downloaded database.");
|
// This should never happen, but just in case, we don't want to
|
||||||
|
// get stuck in an infinite loop.
|
||||||
|
throw new Error(
|
||||||
|
"Could not find a unique name for downloaded database. Please remove some databases and try again.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return folderName;
|
return join(realpath, folderName);
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateUrl(databaseUrl: string) {
|
function validateUrl(databaseUrl: string) {
|
||||||
|
|||||||
Reference in New Issue
Block a user