wcz-layout
Version:
184 lines (183 loc) • 6.69 kB
JavaScript
import { l as getAccessToken } from "./utils-Bt_Hs0N8.mjs";
import { t as serverEnv } from "./env-CoveIivr.mjs";
import { i as uuidv7 } from "./utils-D39-w_ij.mjs";
import { n as getTokenOnBehalfOf, t as getAppToken } from "./msalServer-B3iBsafS.mjs";
import { t as FileMetaSchema } from "./FileMeta-DDqUju1Y.mjs";
import "virtual:wcz-layout";
import { z as z$1 } from "zod";
import { createServerOnlyFn } from "@tanstack/react-start";
import axios, { AxiosError } from "axios";
import { DefaultHttpStack, Upload } from "tus-js-client";
import https from "node:https";
import { Readable } from "node:stream";
import { getRequest } from "@tanstack/react-start/server";
//#region src/data/server/utils/createApi.ts
const httpsAgent = new https.Agent({ rejectUnauthorized: false });
const createApi = createServerOnlyFn(async ({ baseURL, scopeKey }) => {
const resolvedBaseURL = process.env[baseURL];
if (!resolvedBaseURL) throw new Error(`"${baseURL}" env variable is not set.`);
const authHeader = getRequest().headers.get("Authorization");
let accessToken;
if (authHeader?.startsWith("Bearer ")) accessToken = await getTokenOnBehalfOf(authHeader.substring(7), scopeKey);
else try {
accessToken = await getAccessToken(scopeKey);
} catch {
accessToken = await getAppToken(scopeKey);
}
const api = axios.create({
baseURL: resolvedBaseURL,
httpsAgent,
headers: { Authorization: `Bearer ${accessToken}` }
});
api.interceptors.response.use(void 0, (error) => {
if (error instanceof AxiosError) throw new Error(error.response?.data?.message ?? error.message);
throw error;
});
return api;
});
//#endregion
//#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({
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);
let accessToken;
try {
accessToken = await getAccessToken("file");
} catch {
accessToken = await getAppToken("file");
}
const stream = Readable.fromWeb(input.file.stream());
const id = uuidv7();
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,
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,
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, createApi as p, UpdateFileMetaSchema as r, downloadFile as s, FileSchema as t, getFileThumbnail as u };
//# sourceMappingURL=file-DUtvlVZX.mjs.map