rcu-express
Version:
Express handler for Resumable Chunk Upload
90 lines (87 loc) • 2.37 kB
JavaScript
// src/index.ts
import { JsonStoreProvider, RCUService } from "rcu-back-core";
// src/handler.ts
import { Router } from "express";
import { ZodError, z } from "zod";
import multer from "multer";
var uploadStatusSchema = z.object({
fileId: z.string().min(1),
chunkCount: z.coerce.number()
});
var uploadSchema = z.object({
fileId: z.string().min(1),
chunkNumber: z.coerce.number(),
originalFilename: z.string().min(1),
chunkCount: z.coerce.number(),
chunkSize: z.coerce.number(),
fileSize: z.coerce.number(),
file: z.instanceof(Buffer)
});
function handler(service, config) {
const { uploadStatusPath = "/uploadStatus", uploadPath = "/upload" } = config ?? {};
const multerUpload = multer();
const router = Router();
router.get(uploadStatusPath, async (req, res) => {
try {
const query = uploadStatusSchema.parse(req.query);
const response = await service.uploadStatus(query);
return res.json(response);
} catch (error) {
if (error instanceof ZodError) {
return res.status(400).send({ message: "Invalid parameter" });
}
return res.status(500).json({ message: "Internal server error" });
}
});
router.post(
uploadPath,
multerUpload.single("file"),
async (req, res, next) => {
try {
const dto = await uploadSchema.parse({
...req.body,
file: req.file?.buffer
});
const response = await service.upload(dto);
return res.json(response);
} catch (error) {
if (error instanceof ZodError) {
return res.status(400).send({ message: "Invalid parameter" });
}
return res.status(500).json({ message: "Internal server error" });
}
}
);
return router;
}
// src/index.ts
import {
JsonStoreProvider as JsonStoreProvider2,
StoreProviderInterface,
Upload,
RCUConfig as RCUConfig2
} from "rcu-back-core";
function resumableChunkUpload(config = {}) {
const {
store = new JsonStoreProvider("./tmp/rcu.json"),
tmpDir = "./tmp",
outputDir,
onCompleted
} = config;
return handler(
new RCUService({
store,
tmpDir,
outputDir: outputDir ?? tmpDir,
onCompleted
}),
config
);
}
export {
JsonStoreProvider2 as JsonStoreProvider,
RCUConfig2 as RCUConfig,
StoreProviderInterface,
Upload,
resumableChunkUpload
};