UNPKG

wcz-layout

Version:

1 lines 13.8 kB
{"version":3,"file":"file-BdW8lbKO.mjs","names":["createServerFn","AxiosResponse","https","Readable","DefaultHttpStack","Upload","z","serverEnv","uuidv7","getAppToken","getAccessToken","apiMiddleware","authenticationMiddleware","FileMeta","FileMetaSchema","GetFileMetasSchema","object","appName","string","min","max","subId","uuid","FileSchema","id","UpdateFileMetaSchema","extend","fileName","DeleteFileSchema","BatchDeleteFilesSchema","UploadFileResult","UploadFileMetaSchema","file","instanceof","File","toFileResponse","response","disposition","Response","headers","Headers","String","contentLength","set","toWeb","data","ReadableStream","getFileMetas","method","validator","middleware","baseURL","scopeKey","handler","context","queryParams","URLSearchParams","append","fileMetas","api","request","Array","url","toString","getFileThumbnail","responseType","getFile","downloadFile","updateFileMeta","deleteFile","batchDeleteFiles","insecureHttpsAgent","Agent","rejectUnauthorized","uploadFile","FormData","parse","get","Promise","accessToken","stream","fromWeb","resolve","reject","upload","endpoint","FILE_BASE_URL","httpStack","agent","uploadSize","size","chunkSize","metadata","filename","name","filetype","type","Authorization","onError","onSuccess","start"],"sources":["../src/data/server/file.ts"],"sourcesContent":["import { createServerFn } from \"@tanstack/react-start\";\r\nimport type { AxiosResponse } from \"axios\";\r\nimport https from \"node:https\";\r\nimport { Readable } from \"node:stream\";\r\nimport { DefaultHttpStack, Upload } from \"tus-js-client\";\r\nimport { z } from \"zod\";\r\nimport { serverEnv } from \"~/env\";\r\nimport { uuidv7 } from \"~/exports/utils\";\r\nimport { getAppToken } from \"~/lib/auth/msalServer\";\r\nimport { getAccessToken } from \"~/lib/auth/user\";\r\nimport { apiMiddleware } from \"~/middleware/apiMiddleware\";\r\nimport { authenticationMiddleware } from \"~/middleware/authMiddleware\";\r\nimport type { FileMeta } from \"~/models/file/FileMeta\";\r\nimport { FileMetaSchema } from \"~/models/file/FileMeta\";\r\n\r\nexport const GetFileMetasSchema = z.object({\r\n appName: z.string().min(1).max(255),\r\n subId: z.uuid(),\r\n});\r\n\r\nexport const FileSchema = z.object({\r\n appName: z.string().min(1).max(255),\r\n id: z.uuid(),\r\n});\r\n\r\nexport const UpdateFileMetaSchema = FileMetaSchema.extend({\r\n fileName: z.string().min(1).max(255),\r\n});\r\n\r\nconst DeleteFileSchema = FileSchema;\r\n\r\nconst BatchDeleteFilesSchema = GetFileMetasSchema;\r\n\r\nexport interface UploadFileResult {\r\n id: string;\r\n appName: string;\r\n subId: string;\r\n fileName: string;\r\n}\r\n\r\nexport const UploadFileMetaSchema = z.object({\r\n appName: z.string().min(1).max(255),\r\n subId: z.uuid(),\r\n file: z.instanceof(File),\r\n});\r\n\r\nfunction toFileResponse(response: AxiosResponse<Readable>, disposition?: string): Response {\r\n const headers = new Headers({\r\n \"Cache-Control\": \"private, max-age=3600, immutable\",\r\n \"Content-Type\": String(response.headers[\"content-type\"] ?? \"application/octet-stream\"),\r\n });\r\n const contentLength = response.headers[\"content-length\"];\r\n if (contentLength) headers.set(\"Content-Length\", String(contentLength));\r\n if (disposition) headers.set(\"Content-Disposition\", disposition);\r\n\r\n return new Response(Readable.toWeb(response.data) as ReadableStream, { headers });\r\n}\r\n\r\nexport const getFileMetas = createServerFn({ method: \"GET\" })\r\n .validator(GetFileMetasSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"subId\", data.subId);\r\n\r\n const { data: fileMetas } = await context.api.request<Array<FileMeta>>({\r\n url: `/v1/meta?${queryParams.toString()}`,\r\n method: \"GET\",\r\n });\r\n return fileMetas;\r\n });\r\n\r\nexport const getFileThumbnail = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"id\", data.id);\r\n\r\n const response = await context.api.request<Readable>({\r\n url: `/v1/thumbnail?${queryParams.toString()}`,\r\n method: \"GET\",\r\n responseType: \"stream\",\r\n });\r\n\r\n return toFileResponse(response);\r\n });\r\n\r\nexport const getFile = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"id\", data.id);\r\n\r\n const response = await context.api.request<Readable>({\r\n url: `/v1?${queryParams.toString()}`,\r\n method: \"GET\",\r\n responseType: \"stream\",\r\n });\r\n\r\n return toFileResponse(response, \"inline\");\r\n });\r\n\r\nexport const downloadFile = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"id\", data.id);\r\n\r\n const response = await context.api.request<Readable>({\r\n url: `/v1/download?${queryParams.toString()}`,\r\n method: \"GET\",\r\n responseType: \"stream\",\r\n });\r\n\r\n return toFileResponse(response);\r\n });\r\n\r\nexport const updateFileMeta = createServerFn({ method: \"POST\" })\r\n .validator(UpdateFileMetaSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"id\", data.id);\r\n\r\n await context.api.request({ url: `/v1/meta?${queryParams.toString()}`, method: \"PUT\", data });\r\n });\r\n\r\nexport const deleteFile = createServerFn({ method: \"POST\" })\r\n .validator(DeleteFileSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"id\", data.id);\r\n\r\n await context.api.request({ url: `/v1?${queryParams.toString()}`, method: \"DELETE\" });\r\n });\r\n\r\nexport const batchDeleteFiles = createServerFn({ method: \"POST\" })\r\n .validator(BatchDeleteFilesSchema)\r\n .middleware([apiMiddleware({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" })])\r\n .handler(async ({ data, context }) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", data.appName);\r\n queryParams.append(\"subId\", data.subId);\r\n\r\n await context.api.request({ url: `/v1?${queryParams.toString()}`, method: \"DELETE\" });\r\n });\r\n\r\nconst insecureHttpsAgent = new https.Agent({ rejectUnauthorized: false });\r\n\r\nexport const uploadFile = createServerFn({ method: \"POST\" })\r\n .validator((data: FormData) =>\r\n UploadFileMetaSchema.parse({\r\n appName: data.get(\"appName\"),\r\n subId: data.get(\"subId\"),\r\n file: data.get(\"file\"),\r\n }),\r\n )\r\n .middleware([authenticationMiddleware()])\r\n .handler(async ({ data }): Promise<UploadFileResult> => {\r\n let accessToken: string;\r\n try {\r\n accessToken = await getAccessToken(\"file\");\r\n } catch {\r\n accessToken = await getAppToken(\"file\");\r\n }\r\n const stream = Readable.fromWeb(data.file.stream() as import(\"node:stream/web\").ReadableStream);\r\n\r\n const id = uuidv7();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const upload = new Upload(stream, {\r\n endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`,\r\n httpStack: new DefaultHttpStack({ agent: insecureHttpsAgent }),\r\n uploadSize: data.file.size,\r\n chunkSize: 1_048_576,\r\n metadata: {\r\n id,\r\n appName: data.appName,\r\n subId: data.subId,\r\n filename: data.file.name,\r\n filetype: data.file.type,\r\n },\r\n headers: { Authorization: `Bearer ${accessToken}` },\r\n onError: reject,\r\n onSuccess: () => resolve(),\r\n });\r\n upload.start();\r\n });\r\n\r\n return {\r\n id,\r\n appName: data.appName,\r\n subId: data.subId,\r\n fileName: data.file.name,\r\n };\r\n });\r\n"],"mappings":"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"}