UNPKG

sfs-express

Version:

Express.js implementation of SFS

1 lines 9.15 kB
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import { Request, Response } from \"express\";\r\nimport initCore, { sfsConfig, UploadedFile } from \"sfs-node\";\r\n\r\nexport default function initFunctions({\r\n publicFolder,\r\n mask,\r\n getFileById,\r\n getFileByHash,\r\n createFile,\r\n logger,\r\n allowDuplicates,\r\n}: sfsConfig) {\r\n const {\r\n resolveFilePath,\r\n idToUrl,\r\n urlToId,\r\n saveFile,\r\n deleteFileByHash,\r\n deleteFileById,\r\n getDiskUsage,\r\n } = initCore({\r\n publicFolder,\r\n mask,\r\n getFileById,\r\n getFileByHash,\r\n createFile,\r\n logger,\r\n allowDuplicates,\r\n });\r\n\r\n const optimisticUrls = new Set();\r\n\r\n const ONE_YEAR_S = 31536000;\r\n\r\n const getFile = async (req: Request, res: Response) => {\r\n let fullUrl;\r\n try {\r\n const id = req.params.id;\r\n fullUrl = idToUrl(id);\r\n logger &&\r\n logger(\r\n \"SFS Express: trying to return requested file: \" + fullUrl,\r\n \"info\"\r\n );\r\n if (optimisticUrls.has(fullUrl)) {\r\n return res.status(428);\r\n }\r\n const fileId = urlToId(fullUrl);\r\n const { filePath, fileName } = await resolveFilePath(fileId);\r\n logger &&\r\n logger(\r\n `SFS Express: sedning file '${fileName}' with path '${filePath}'`\r\n );\r\n\r\n res.setHeader(\"ETag\", `\"${fileId}\"`);\r\n res.setHeader(\"Content-Disposition\", `inline; filename=\"${fileName}\"`);\r\n return res.status(200).sendFile(filePath, {\r\n lastModified: true,\r\n headers: {\r\n \"Cache-Control\": `public, max-age=${ONE_YEAR_S}, immutable`,\r\n },\r\n });\r\n } catch (err) {\r\n logger && logger(\"SFS Express: unable to return file:\" + fullUrl);\r\n logger && logger(err);\r\n\r\n return res.status(404).send();\r\n }\r\n };\r\n\r\n const prepareOptimisticUpload = async (req, res) => {\r\n const id = req.body.id;\r\n const optimisticUrl = idToUrl(id);\r\n try {\r\n optimisticUrls.add(optimisticUrl);\r\n return res.status(200).send(optimisticUrl);\r\n } catch (err) {\r\n logger && logger(err, \"error\");\r\n return res.status(500).send();\r\n }\r\n };\r\n\r\n const uploadFile = async (\r\n req,\r\n res: Response,\r\n options: {\r\n pathParamKey: string;\r\n fileParamKey: string;\r\n optimisticIdKey: string;\r\n additionalFields: any;\r\n } = {\r\n pathParamKey: \"path\",\r\n fileParamKey: \"file\",\r\n optimisticIdKey: \"id\",\r\n additionalFields: {},\r\n }\r\n ) => {\r\n if (!req.files) {\r\n return res.status(400).send(\"Request doesn't contain any files\");\r\n }\r\n const { pathParamKey, fileParamKey, optimisticIdKey, additionalFields } =\r\n options;\r\n const file = req.files[fileParamKey];\r\n const path = req.body[pathParamKey];\r\n const id = req.body[optimisticIdKey];\r\n let optimisticUrl;\r\n try {\r\n if (id) {\r\n optimisticUrl = idToUrl(id);\r\n }\r\n const fileInfo = await saveFile(file, {\r\n filePath: path,\r\n id,\r\n additionalFields,\r\n });\r\n if (fileInfo && optimisticUrl) {\r\n optimisticUrls.delete(optimisticUrl); // Delete the URL, not the id\r\n }\r\n return res.status(200).send(fileInfo);\r\n } catch (err) {\r\n logger && logger(err, \"error\");\r\n\r\n if (optimisticUrl) {\r\n optimisticUrls.delete(optimisticUrl); // Delete the URL, not the id\r\n }\r\n return res.status(500).send();\r\n }\r\n };\r\n\r\n const uploadFiles = async (\r\n req,\r\n res: Response,\r\n options: { pathParamKey: string } = {\r\n pathParamKey: \"path\",\r\n }\r\n ) => {\r\n if (!req.files) {\r\n return res.status(400).send(\"Request doesn't contain any files\");\r\n }\r\n const { pathParamKey } = options;\r\n\r\n try {\r\n const path = req.body[pathParamKey];\r\n const files = req.files;\r\n const allFiles: UploadedFile[] = [];\r\n\r\n Object.values(files).forEach((file) => {\r\n if (Array.isArray(file)) {\r\n allFiles.push(...file);\r\n } else {\r\n // @ts-ignore\r\n allFiles.push(file);\r\n }\r\n });\r\n\r\n const fileInfo = await Promise.all(\r\n allFiles.map((file) => saveFile(file, path))\r\n );\r\n return res.status(200).send(fileInfo);\r\n } catch (err) {\r\n logger && logger(err, \"error\");\r\n\r\n return res.status(500).send();\r\n }\r\n };\r\n\r\n const deleteFile = async (req, res) => {\r\n try {\r\n const id = req.params.id;\r\n const fullUrl = idToUrl(id);\r\n const fileId = urlToId(fullUrl);\r\n await deleteFileById(fileId);\r\n return res.status(200).send(\"ok\");\r\n } catch (err) {\r\n logger && logger(err, \"error\");\r\n return res.status(500).send();\r\n }\r\n };\r\n\r\n return {\r\n getFile,\r\n idToUrl,\r\n urlToId,\r\n saveFile,\r\n prepareOptimisticUpload,\r\n deleteFileByHash,\r\n deleteFileById,\r\n deleteFile,\r\n getDiskUsage,\r\n uploadFile,\r\n uploadFiles,\r\n };\r\n}\r\n"],"names":["_ref","logger","_initCore","initCore","publicFolder","mask","getFileById","getFileByHash","createFile","allowDuplicates","resolveFilePath","idToUrl","urlToId","saveFile","deleteFileByHash","deleteFileById","getDiskUsage","optimisticUrls","Set","getFile","req","res","fullUrl","Promise","resolve","_catch","params","id","has","status","fileId","then","_ref2","filePath","fileName","setHeader","sendFile","lastModified","headers","err","send","e","reject","prepareOptimisticUpload","optimisticUrl","body","add","deleteFile","uploadFile","options","pathParamKey","fileParamKey","optimisticIdKey","additionalFields","files","file","path","fileInfo","uploadFiles","allFiles","Object","values","forEach","Array","isArray","push","apply","all","map"],"mappings":"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"}