UNPKG

@tsed/platform-multer

Version:
54 lines (53 loc) 1.77 kB
import { promisify } from "node:util"; import { injectable } from "@tsed/di"; import fp from "fastify-plugin"; import { MULTER_MODULE } from "../../common/index.js"; const kMultipart = Symbol("multipart"); function setMultipart(req, _payload, done) { // nothing to do, it will be done by multer in beforeHandler method req[kMultipart] = true; done(null); } function fastifyMulter(fastify, _options, next) { fastify.addContentTypeParser("multipart/form-data", setMultipart); next(); } const multerPlugin = fp(fastifyMulter, { fastify: ">= 5.0.0", name: "fastify-multer" }); async function factory() { const { default: multer } = await import("multer"); return { multer, get(options) { const instance = multer(options); const makePromise = (multer, name) => { // istanbul ignore next if (!multer[name]) return; const fn = multer[name]; multer[name] = function apply(...args) { const middleware = Reflect.apply(fn, this, args); return async (req, res) => { await promisify(middleware)(req.raw, res.raw); req.files = req.raw.files; req.body = req.raw.body; }; }; }; makePromise(instance, "any"); makePromise(instance, "array"); makePromise(instance, "fields"); makePromise(instance, "none"); makePromise(instance, "single"); return instance; } }; } injectable(MULTER_MODULE) .asyncFactory(factory) .configuration({ plugins: [multerPlugin] }) .token();