wcz-layout
Version:
151 lines (150 loc) • 5.59 kB
JavaScript
import { _ as serverEnv, f as getSessionUser } from "./utils-KaM5VMTJ.mjs";
import { n as getAppToken, t as getAccessToken } from "./tokens-D8CVIFTb.mjs";
import { uuidv7 } from "./utils.mjs";
import { t as createApi } from "./createApi-CLYWCzR2.mjs";
import { t as FileMetaSchema } from "./FileMeta-DDqUju1Y.mjs";
import { z as z$1 } from "zod";
import { createServerOnlyFn } from "@tanstack/react-start";
import { DefaultHttpStack, Upload } from "tus-js-client";
import https from "node:https";
import { Readable } from "node:stream";
//#region src/data/server/file.ts
const GetFileMetasSchema = z$1.object({
appName: z$1.string().min(1).max(255),
subId: z$1.uuid()
});
const FileSchema = z$1.object({
appName: z$1.string().min(1).max(255),
id: z$1.uuid()
});
const UpdateFileMetaSchema = FileMetaSchema.extend({ fileName: z$1.string().min(1).max(255) });
const DeleteFileSchema = FileSchema;
const BatchDeleteFilesSchema = GetFileMetasSchema;
const UploadFileMetaSchema = z$1.object({
id: z$1.uuid().default(uuidv7),
appName: z$1.string().min(1).max(255),
subId: z$1.uuid(),
file: z$1.instanceof(File)
});
const fileApi = () => createApi({
baseURL: "FILE_BASE_URL",
scopeKey: "file"
});
function toFileResponse(response, disposition) {
const headers = new Headers({
"Cache-Control": "private, max-age=3600, immutable",
"Content-Type": String(response.headers["content-type"] ?? "application/octet-stream")
});
const contentLength = response.headers["content-length"];
if (contentLength) headers.set("Content-Length", String(contentLength));
if (disposition) headers.set("Content-Disposition", disposition);
return new Response(Readable.toWeb(response.data), { headers });
}
const getFileMetas = createServerOnlyFn(async ({ data }) => {
const input = GetFileMetasSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("subId", input.subId);
const { data: fileMetas } = await (await fileApi()).request({
url: `/v1/meta?${queryParams.toString()}`,
method: "GET"
});
return fileMetas;
});
const getFileThumbnail = createServerOnlyFn(async ({ data }) => {
const input = FileSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("id", input.id);
return toFileResponse(await (await fileApi()).request({
url: `/v1/thumbnail?${queryParams.toString()}`,
method: "GET",
responseType: "stream"
}));
});
const getFile = createServerOnlyFn(async ({ data }) => {
const input = FileSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("id", input.id);
return toFileResponse(await (await fileApi()).request({
url: `/v1?${queryParams.toString()}`,
method: "GET",
responseType: "stream"
}), "inline");
});
const downloadFile = createServerOnlyFn(async ({ data }) => {
const input = FileSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("id", input.id);
return toFileResponse(await (await fileApi()).request({
url: `/v1/download?${queryParams.toString()}`,
method: "GET",
responseType: "stream"
}));
});
const updateFileMeta = createServerOnlyFn(async ({ data }) => {
const input = UpdateFileMetaSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("id", input.id);
await (await fileApi()).request({
url: `/v1/meta?${queryParams.toString()}`,
method: "PUT",
data: input
});
});
const deleteFile = createServerOnlyFn(async ({ data }) => {
const input = DeleteFileSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("id", input.id);
await (await fileApi()).request({
url: `/v1?${queryParams.toString()}`,
method: "DELETE"
});
});
const batchDeleteFiles = createServerOnlyFn(async ({ data }) => {
const input = BatchDeleteFilesSchema.parse(data);
const queryParams = new URLSearchParams();
queryParams.append("appName", input.appName);
queryParams.append("subId", input.subId);
await (await fileApi()).request({
url: `/v1?${queryParams.toString()}`,
method: "DELETE"
});
});
const insecureHttpsAgent = new https.Agent({ rejectUnauthorized: false });
const uploadFile = createServerOnlyFn(async ({ data }) => {
const input = UploadFileMetaSchema.parse(data);
const accessToken = await getSessionUser() ? await getAccessToken("file") : await getAppToken("file");
const stream = Readable.fromWeb(input.file.stream());
await new Promise((resolve, reject) => {
new Upload(stream, {
endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`,
httpStack: new DefaultHttpStack({ agent: insecureHttpsAgent }),
uploadSize: input.file.size,
chunkSize: 1048576,
metadata: {
id: input.id,
appName: input.appName,
subId: input.subId,
filename: input.file.name,
filetype: input.file.type
},
headers: { Authorization: `Bearer ${accessToken}` },
onError: reject,
onSuccess: () => resolve()
}).start();
});
return {
id: input.id,
appName: input.appName,
subId: input.subId,
fileName: input.file.name
};
});
//#endregion
export { batchDeleteFiles as a, getFile as c, updateFileMeta as d, uploadFile as f, UploadFileMetaSchema as i, getFileMetas as l, GetFileMetasSchema as n, deleteFile as o, UpdateFileMetaSchema as r, downloadFile as s, FileSchema as t, getFileThumbnail as u };
//# sourceMappingURL=file-CZwQfvTU.mjs.map