memory.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import multer from 'multer';
  2. import mime from 'mime-types';
  3. import { Duplex } from 'stream';
  4. import { uid } from '../../uid.js';
  5. const bufferToStream = (buffer) => {
  6. let stream = new Duplex();
  7. stream.push(buffer);
  8. stream.push(null);
  9. return stream;
  10. };
  11. const MemoryFileBackend = () => {
  12. const fileMap = {};
  13. const upload = multer({ storage: multer.memoryStorage() });
  14. return {
  15. uploadManager: upload.single('file'),
  16. async list(siteId, boxId, resourceId) {
  17. const store = fileMap[`${siteId}/${boxId}/${resourceId}`] || {};
  18. return Object.keys(store);
  19. },
  20. async store(siteId, boxId, resourceId, file) {
  21. const ext = mime.extension(file.mimetype);
  22. const filename = `${uid()}.${ext}`;
  23. file.filename = filename;
  24. const store = fileMap[`${siteId}/${boxId}/${resourceId}`] || {};
  25. store[filename] = {
  26. buffer: file.buffer,
  27. mimetype: file.mimetype,
  28. };
  29. fileMap[`${siteId}/${boxId}/${resourceId}`] = store;
  30. return filename;
  31. },
  32. async exists(siteId, boxId, resourceId, filename) {
  33. return (
  34. fileMap[`${siteId}/${boxId}/${resourceId}`] !== undefined &&
  35. fileMap[`${siteId}/${boxId}/${resourceId}`][filename] !== undefined
  36. );
  37. },
  38. async get(siteId, boxId, resourceId, filename) {
  39. const fileBuffer = fileMap[`${siteId}/${boxId}/${resourceId}`][filename];
  40. return {
  41. mimetype: fileBuffer.mimetype,
  42. stream: bufferToStream(fileBuffer.buffer),
  43. };
  44. },
  45. async delete(siteId, boxId, resourceId, filename) {
  46. delete fileMap[`${siteId}/${boxId}/${resourceId}`][filename];
  47. },
  48. };
  49. };
  50. export default MemoryFileBackend;