@opengis/fastify-table
Version:
core-plugins
60 lines (59 loc) • 2.11 kB
JavaScript
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();
}