UNPKG

@opengis/fastify-table

Version:

core-plugins

60 lines (59 loc) 2.11 kB
import path from "node:path"; import { randomUUID } from "node:crypto"; import { mkdir, writeFile } from "node:fs/promises"; import getUploadStatus from "./getUploadStatus.js"; import { prefix, fileDir, metaDir, uploadChunkDirectory, fetchTimeoutMs, } from "./index.js"; export default async function startUpload({ host, id, fileName, size, subdir, }) { if (subdir && (typeof subdir !== "string" || subdir.includes(".."))) { return { error: "invalid params: subdir", code: 400, }; } if (!host) { const extension = path.extname(fileName).substring(1); const id1 = id || randomUUID(); const key = id1.split("-").pop(); const meta = { id: id1, key, fileName, size, extension, uploaded: 0, exists: false, }; // check current upload state if (id) { const status = await getUploadStatus({ id }); Object.assign(meta, status); } // resume file upload if (meta.uploaded > 0) { return meta; } // if not started - start new upload const relativeDirpath = path .join(uploadChunkDirectory, subdir || "") .replace(/\\/g, "/"); await mkdir(path.join(fileDir, "tmp"), { recursive: true }); // create metadata for resumable upload const metaData = { ...meta, subdir, metaPath: undefined, relativeDirpath, }; await writeFile(path.join(metaDir, `${id1}.json`), JSON.stringify(metaData, null, 2)); return { ...meta, metaPath: undefined }; } const res = await fetch(`${host}/${prefix}/start`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ fileName, size, subdir, id }), signal: AbortSignal.timeout(fetchTimeoutMs), }).catch((err) => ({ json: () => Promise.resolve({ error: err.toString(), code: 501 }), })); return res.json(); }