@internxt/scan
Version:
Use Node JS to scan files on your server with ClamAV's clamscan/clamdscan binary or via TCP to a remote server or local UNIX Domain socket. This is especially useful for scanning uploaded files provided by un-trusted sources.
56 lines (46 loc) • 1.47 kB
JavaScript
const { resolve: resolvePath } = require('path');
const { readdir } = require('fs').promises;
const isPermissionError = require('./isPermissionError');
/**
*
* @param dir
* @param recursive
*/
async function getFiles(dir, recursive = true) {
let items;
try {
items = await readdir(dir, { withFileTypes: true });
} catch (err) {
if (isPermissionError(err)) {
console.warn(`Skipping directory "${dir}" due to permission error.`);
return null;
}
throw err;
}
const filePromises = items.map(async (item) => {
const fullPath = resolvePath(dir, item.name);
if (!recursive && item.isDirectory()) {
return null;
}
if (item.isDirectory()) {
try {
const subitems = await readdir(fullPath, { withFileTypes: true });
if (subitems.length === 0) {
return null;
}
return await getFiles(fullPath, true);
} catch (err) {
if (isPermissionError(err)) {
console.warn(`Skipping subdirectory "${fullPath}" due to permission error.`);
return null;
}
throw err;
}
} else {
return fullPath;
}
});
const results = await Promise.all(filePromises);
return results.filter(Boolean).flat();
}
module.exports = getFiles;