UNPKG

@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
"use strict"; 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