@fdm-monster/server
Version:
FDM Monster is a bulk OctoPrint manager to set up, configure and monitor 3D printers. Our aim is to provide extremely optimized websocket performance and reliability.
170 lines (169 loc) • 7.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "MulterService", {
enumerable: true,
get: function() {
return MulterService;
}
});
const _multer = /*#__PURE__*/ _interop_require_wildcard(require("multer"));
const _path = require("path");
const _fs = require("fs");
const _fsutils = require("../../utils/fs.utils");
const _serverconstants = require("../../server.constants");
const _nodefs = require("node:fs");
const _errorutils = require("../../utils/error.utils");
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
class MulterService {
fileUploadTrackerCache;
httpClientFactory;
logger;
constructor(loggerFactory, fileUploadTrackerCache, httpClientFactory){
this.fileUploadTrackerCache = fileUploadTrackerCache;
this.httpClientFactory = httpClientFactory;
this.orderRecentFiles = (dir)=>{
return (0, _fs.readdirSync)(dir).filter((file)=>(0, _fs.lstatSync)((0, _path.join)(dir, file)).isFile()).map((file)=>({
file,
mtime: (0, _fs.lstatSync)((0, _path.join)(dir, file)).mtime
})).sort((a, b)=>b.mtime.getTime() - a.mtime.getTime());
};
this.logger = loggerFactory(MulterService.name);
}
startTrackingSession(multerFile, printerId) {
return this.fileUploadTrackerCache.addUploadTracker(multerFile, printerId);
}
clearUploadsFolder() {
const fileStoragePath = (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder);
if (!(0, _fs.existsSync)(fileStoragePath)) return;
const files = (0, _fs.readdirSync)(fileStoragePath, {
withFileTypes: true
}).filter((item)=>!item.isDirectory()).map((item)=>item.name);
for (const file of files){
try {
(0, _nodefs.rmSync)((0, _path.join)(fileStoragePath, file));
} catch (error) {
this.logger.error(`Could not clear upload file in temporary folder ${(0, _errorutils.errorSummary)(error)}`);
}
}
}
clearUploadedFile(multerFile) {
if ((0, _fs.existsSync)(multerFile.path)) {
(0, _nodefs.rmSync)(multerFile.path);
} else {
this.logger.warn("Cannot unlink temporarily uploaded file as it was not found");
}
}
getNewestFile(collection) {
const dirPath = this.collectionPath(collection);
const files = this.orderRecentFiles(dirPath);
const latestFile = files.length ? files[0] : undefined;
return latestFile ? (0, _path.join)(dirPath, latestFile.file) : undefined;
}
fileExists(downloadFilename, collection) {
const downloadPath = (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder, collection, downloadFilename);
return (0, _fs.existsSync)(downloadPath);
}
async downloadFile(downloadUrl, downloadFilename, collection) {
const downloadFolder = (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder, collection);
if (!(0, _fs.existsSync)(downloadFolder)) {
(0, _fs.mkdirSync)(downloadFolder, {
recursive: true
});
}
const downloadPath = (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder, collection, downloadFilename);
const fileStream = (0, _fs.createWriteStream)(downloadPath);
const defaultHttpClient = this.httpClientFactory.createDefaultClient();
const res = await defaultHttpClient.get(downloadUrl);
return await new Promise((resolve, reject)=>{
fileStream.write(res.data);
fileStream.on("error", (err)=>{
return reject(err);
});
fileStream.on("finish", async ()=>{
return resolve(null);
});
fileStream.on("close", async ()=>{
return resolve(null);
});
resolve(null);
});
}
getMulterGCodeFileFilter(storeAsFile = true) {
return this.getMulterFileFilter(_serverconstants.AppConstants.defaultAcceptedGcodeExtensions, storeAsFile);
}
async multerLoadFileAsync(req, res, fileExtensions, storeAsFile = true) {
return await new Promise((resolve, reject)=>this.getMulterFileFilter(fileExtensions, storeAsFile)(req, res, (err)=>{
if (err) {
return reject(err);
}
resolve(req.files);
}));
}
getMulterFileFilter(fileExtensions, storeAsFile = true) {
return (0, _multer.default)({
storage: storeAsFile ? (0, _multer.diskStorage)({
destination: (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder)
}) : (0, _multer.memoryStorage)(),
fileFilter: this.multerFileFilter(fileExtensions)
}).any();
}
multerFileFilter(extensions) {
return (_, file, callback)=>{
const ext = (0, _path.extname)(file.originalname);
if (extensions?.length && !extensions.includes(ext?.toLowerCase())) {
return callback(new Error(`Only files with extensions ${extensions} are allowed`));
}
return callback(null, true);
};
}
getSessions() {
return this.fileUploadTrackerCache.getUploads();
}
orderRecentFiles;
collectionPath(collection) {
return (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder, collection);
}
}
//# sourceMappingURL=multer.service.js.map