redis-smq-common
Version:
Provides essential components and utilities shared across RedisSMQ packages.
82 lines • 2.66 kB
JavaScript
import axios from 'axios';
import fs, { readdir } from 'fs';
import { access, constants, mkdir } from 'node:fs/promises';
import { join } from 'path';
export async function doesPathExist(filePath) {
try {
await access(filePath, constants.F_OK);
return true;
}
catch {
return false;
}
}
export async function ensureDirectoryExists(dirPath) {
try {
await access(dirPath, constants.F_OK);
}
catch {
await mkdir(dirPath, { recursive: true });
}
}
export async function downloadFile(url, savePath) {
const response = await axios({
url,
responseType: 'stream',
});
const writer = fs.createWriteStream(savePath);
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
}
export function findFilesByPattern(directoryPath, pattern, callback) {
const scanDirectory = (dir, onComplete) => {
readdir(dir, { withFileTypes: true }, (error, entries) => {
if (error) {
return onComplete(error);
}
const foundFiles = [];
let pendingOperations = 0;
let hasError = false;
if (entries.length === 0) {
return onComplete(null, []);
}
const checkComplete = () => {
if (--pendingOperations === 0 && !hasError) {
onComplete(null, foundFiles);
}
};
const handleError = (error) => {
if (!hasError) {
hasError = true;
onComplete(error);
}
};
for (const entry of entries) {
const fullPath = join(dir, entry.name);
if (entry.isDirectory()) {
pendingOperations++;
scanDirectory(fullPath, (error, nestedFiles) => {
if (error) {
handleError(error);
}
else if (nestedFiles) {
foundFiles.push(...nestedFiles);
}
checkComplete();
});
}
else if (entry.isFile() && entry.name.endsWith(pattern)) {
foundFiles.push(fullPath);
}
}
if (pendingOperations === 0) {
onComplete(null, foundFiles);
}
});
};
scanDirectory(directoryPath, callback);
}
//# sourceMappingURL=filesystem.js.map