shareoverlan
Version:
Simple local file sharing over LAN.
72 lines • 3.24 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const GetFiles = (req, res) => {
const baseDir = path_1.default.resolve(process.cwd());
let requestedDir = req.query.currentDir;
if (!requestedDir)
requestedDir = "./";
const resolvedPath = path_1.default.resolve(baseDir, requestedDir);
if (!resolvedPath.startsWith(baseDir)) {
console.warn(`Blocked attempt to access outside: ${resolvedPath}`);
res.set("parentdir", "true");
res.send(JSON.stringify([]));
return;
}
if (resolvedPath === baseDir) {
res.set("parentdir", "true");
}
else {
res.set("parentdir", "false");
}
const resObjArr = [];
fs_1.default.readdir(resolvedPath, { withFileTypes: true }, (err, files) => __awaiter(void 0, void 0, void 0, function* () {
if (err || !files || files.length === 0) {
if (err) {
console.error(`Error reading directory ${resolvedPath}:`, err);
}
res.send(JSON.stringify([]));
return;
}
// Use Promise.all to handle async stats safely
const fileStatsPromises = files.map(file => {
return new Promise((resolve) => {
const fullPath = path_1.default.join(resolvedPath, file.name);
fs_1.default.stat(fullPath, (err, stats) => {
if (err) {
// Locked, permission denied, etc. → skip it
console.warn(`Could not stat ${fullPath}: ${err.code}`);
resolve(null);
return;
}
const obj = {
fileName: file.name,
fileSize: file.isDirectory() ? 0 : stats.size,
fileModifiedTime: new Date(stats.mtime).getTime(),
realname: file.name,
isDir: file.isDirectory()
};
resolve(obj);
});
});
});
const results = yield Promise.all(fileStatsPromises);
const safeFiles = results.filter((f) => f !== null);
res.send(JSON.stringify(safeFiles));
}));
};
exports.default = GetFiles;
//# sourceMappingURL=GetFiles.js.map