UNPKG

wcz-layout

Version:

1 lines 12.4 kB
{"version":3,"file":"file-CZwQfvTU.mjs","names":["createServerOnlyFn","AxiosResponse","https","Readable","DefaultHttpStack","Upload","z","serverEnv","uuidv7","getAccessToken","getAppToken","getSessionUser","createApi","FileMeta","FileMetaSchema","GetFileMetasSchema","object","appName","string","min","max","subId","uuid","FileSchema","id","UpdateFileMetaSchema","extend","fileName","DeleteFileSchema","BatchDeleteFilesSchema","UploadFileResult","UploadFileMetaSchema","default","file","instanceof","File","fileApi","baseURL","scopeKey","toFileResponse","response","disposition","Response","headers","Headers","String","contentLength","set","toWeb","data","ReadableStream","getFileMetas","input","Promise","Array","parse","queryParams","URLSearchParams","append","api","fileMetas","request","url","toString","method","getFileThumbnail","responseType","getFile","downloadFile","updateFileMeta","deleteFile","batchDeleteFiles","insecureHttpsAgent","Agent","rejectUnauthorized","uploadFile","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 { createServerOnlyFn } from \"@tanstack/react-start\";\nimport type { AxiosResponse } from \"axios\";\nimport https from \"node:https\";\nimport { Readable } from \"node:stream\";\nimport { DefaultHttpStack, Upload } from \"tus-js-client\";\nimport { z } from \"zod\";\nimport { serverEnv } from \"~/env\";\nimport { uuidv7 } from \"~/exports/utils\";\nimport { getAccessToken, getAppToken } from \"~/lib/auth/tokens\";\nimport { getSessionUser } from \"~/lib/auth/user\";\nimport { createApi } from \"~/lib/createApi\";\nimport type { FileMeta } from \"~/models/file/FileMeta\";\nimport { FileMetaSchema } from \"~/models/file/FileMeta\";\n\nexport const GetFileMetasSchema = z.object({\n appName: z.string().min(1).max(255),\n subId: z.uuid(),\n});\n\nexport const FileSchema = z.object({\n appName: z.string().min(1).max(255),\n id: z.uuid(),\n});\n\nexport const UpdateFileMetaSchema = FileMetaSchema.extend({\n fileName: z.string().min(1).max(255),\n});\n\nconst DeleteFileSchema = FileSchema;\n\nconst BatchDeleteFilesSchema = GetFileMetasSchema;\n\nexport interface UploadFileResult {\n id: string;\n appName: string;\n subId: string;\n fileName: string;\n}\n\nexport const UploadFileMetaSchema = z.object({\n id: z.uuid().default(uuidv7),\n appName: z.string().min(1).max(255),\n subId: z.uuid(),\n file: z.instanceof(File),\n});\n\nconst fileApi = () => createApi({ baseURL: \"FILE_BASE_URL\", scopeKey: \"file\" });\n\nfunction toFileResponse(response: AxiosResponse<Readable>, disposition?: string): Response {\n const headers = new Headers({\n \"Cache-Control\": \"private, max-age=3600, immutable\",\n \"Content-Type\": String(response.headers[\"content-type\"] ?? \"application/octet-stream\"),\n });\n const contentLength = response.headers[\"content-length\"];\n if (contentLength) headers.set(\"Content-Length\", String(contentLength));\n if (disposition) headers.set(\"Content-Disposition\", disposition);\n\n return new Response(Readable.toWeb(response.data) as ReadableStream, { headers });\n}\n\nexport const getFileMetas = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof GetFileMetasSchema> }): Promise<Array<FileMeta>> => {\n const input = GetFileMetasSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"subId\", input.subId);\n\n const api = await fileApi();\n const { data: fileMetas } = await api.request<Array<FileMeta>>({\n url: `/v1/meta?${queryParams.toString()}`,\n method: \"GET\",\n });\n return fileMetas;\n },\n);\n\nexport const getFileThumbnail = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof FileSchema> }): Promise<Response> => {\n const input = FileSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"id\", input.id);\n\n const api = await fileApi();\n const response = await api.request<Readable>({\n url: `/v1/thumbnail?${queryParams.toString()}`,\n method: \"GET\",\n responseType: \"stream\",\n });\n\n return toFileResponse(response);\n },\n);\n\nexport const getFile = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof FileSchema> }): Promise<Response> => {\n const input = FileSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"id\", input.id);\n\n const api = await fileApi();\n const response = await api.request<Readable>({\n url: `/v1?${queryParams.toString()}`,\n method: \"GET\",\n responseType: \"stream\",\n });\n\n return toFileResponse(response, \"inline\");\n },\n);\n\nexport const downloadFile = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof FileSchema> }): Promise<Response> => {\n const input = FileSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"id\", input.id);\n\n const api = await fileApi();\n const response = await api.request<Readable>({\n url: `/v1/download?${queryParams.toString()}`,\n method: \"GET\",\n responseType: \"stream\",\n });\n\n return toFileResponse(response);\n },\n);\n\nexport const updateFileMeta = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof UpdateFileMetaSchema> }): Promise<void> => {\n const input = UpdateFileMetaSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"id\", input.id);\n\n const api = await fileApi();\n await api.request({ url: `/v1/meta?${queryParams.toString()}`, method: \"PUT\", data: input });\n },\n);\n\nexport const deleteFile = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof DeleteFileSchema> }): Promise<void> => {\n const input = DeleteFileSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"id\", input.id);\n\n const api = await fileApi();\n await api.request({ url: `/v1?${queryParams.toString()}`, method: \"DELETE\" });\n },\n);\n\nexport const batchDeleteFiles = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof BatchDeleteFilesSchema> }): Promise<void> => {\n const input = BatchDeleteFilesSchema.parse(data);\n const queryParams = new URLSearchParams();\n queryParams.append(\"appName\", input.appName);\n queryParams.append(\"subId\", input.subId);\n\n const api = await fileApi();\n await api.request({ url: `/v1?${queryParams.toString()}`, method: \"DELETE\" });\n },\n);\n\nconst insecureHttpsAgent = new https.Agent({ rejectUnauthorized: false });\n\nexport const uploadFile = createServerOnlyFn(\n async ({ data }: { data: z.input<typeof UploadFileMetaSchema> }): Promise<UploadFileResult> => {\n const input = UploadFileMetaSchema.parse(data);\n const accessToken = (await getSessionUser())\n ? await getAccessToken(\"file\")\n : await getAppToken(\"file\");\n const stream = Readable.fromWeb(\n input.file.stream() as import(\"node:stream/web\").ReadableStream,\n );\n\n await new Promise<void>((resolve, reject) => {\n const upload = new Upload(stream, {\n endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`,\n httpStack: new DefaultHttpStack({ agent: insecureHttpsAgent }),\n uploadSize: input.file.size,\n chunkSize: 1_048_576,\n metadata: {\n id: input.id,\n appName: input.appName,\n subId: input.subId,\n filename: input.file.name,\n filetype: input.file.type,\n },\n headers: { Authorization: `Bearer ${accessToken}` },\n onError: reject,\n onSuccess: () => resolve(),\n });\n upload.start();\n });\n\n return {\n id: input.id,\n appName: input.appName,\n subId: input.subId,\n fileName: input.file.name,\n };\n },\n);\n"],"mappings":";;;;;;;;;;;AAcA,MAAae,qBAAqBT,IAAEU,OAAO;CACzCC,SAASX,IAAEY,OAAO,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,IAAI,GAAG;CAClCC,OAAOf,IAAEgB,KAAK;AAChB,CAAC;AAED,MAAaC,aAAajB,IAAEU,OAAO;CACjCC,SAASX,IAAEY,OAAO,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,IAAI,GAAG;CAClCI,IAAIlB,IAAEgB,KAAK;AACb,CAAC;AAED,MAAaG,uBAAuBX,eAAeY,OAAO,EACxDC,UAAUrB,IAAEY,OAAO,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,IAAI,GAAG,EACrC,CAAC;AAED,MAAMQ,mBAAmBL;AAEzB,MAAMM,yBAAyBd;AAS/B,MAAagB,uBAAuBzB,IAAEU,OAAO;CAC3CQ,IAAIlB,IAAEgB,KAAK,CAAC,CAACU,QAAQxB,MAAM;CAC3BS,SAASX,IAAEY,OAAO,CAAC,CAACC,IAAI,CAAC,CAAC,CAACC,IAAI,GAAG;CAClCC,OAAOf,IAAEgB,KAAK;CACdW,MAAM3B,IAAE4B,WAAWC,IAAI;AACzB,CAAC;AAED,MAAMC,gBAAgBxB,UAAU;CAAEyB,SAAS;CAAiBC,UAAU;AAAO,CAAC;AAE9E,SAASC,eAAeC,UAAmCC,aAAgC;CACzF,MAAME,UAAU,IAAIC,QAAQ;EAC1B,iBAAiB;EACjB,gBAAgBC,OAAOL,SAASG,QAAQ,mBAAmB,0BAA0B;CACvF,CAAC;CACD,MAAMG,gBAAgBN,SAASG,QAAQ;CACvC,IAAIG,eAAeH,QAAQI,IAAI,kBAAkBF,OAAOC,aAAa,CAAC;CACtE,IAAIL,aAAaE,QAAQI,IAAI,uBAAuBN,WAAW;CAE/D,OAAO,IAAIC,SAASvC,SAAS6C,MAAMR,SAASS,IAAI,GAAqB,EAAEN,QAAQ,CAAC;AAClF;AAEA,MAAaQ,eAAenD,mBAC1B,OAAO,EAAEiD,WAAmF;CAC1F,MAAMG,QAAQrC,mBAAmBwC,MAAMN,IAAI;CAC3C,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,SAASN,MAAM/B,KAAK;CAGvC,MAAM,EAAE4B,MAAMW,cAAc,OAAMD,MADhBvB,QAAQ,EAAA,CACYyB,QAAyB;EAC7DC,KAAK,YAAYN,YAAYO,SAAS;EACtCC,QAAQ;CACV,CAAC;CACD,OAAOJ;AACT,CACF;AAEA,MAAaK,mBAAmBjE,mBAC9B,OAAO,EAAEiD,WAAoE;CAC3E,MAAMG,QAAQ7B,WAAWgC,MAAMN,IAAI;CACnC,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,MAAMN,MAAM5B,EAAE;CASjC,OAAOe,eAAeC,OANCmB,MADLvB,QAAQ,EAAA,CACCyB,QAAkB;EAC3CC,KAAK,iBAAiBN,YAAYO,SAAS;EAC3CC,QAAQ;EACRE,cAAc;CAChB,CAAC,CAE6B;AAChC,CACF;AAEA,MAAaC,UAAUnE,mBACrB,OAAO,EAAEiD,WAAoE;CAC3E,MAAMG,QAAQ7B,WAAWgC,MAAMN,IAAI;CACnC,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,MAAMN,MAAM5B,EAAE;CASjC,OAAOe,eAAeC,OANCmB,MADLvB,QAAQ,EAAA,CACCyB,QAAkB;EAC3CC,KAAK,OAAON,YAAYO,SAAS;EACjCC,QAAQ;EACRE,cAAc;CAChB,CAAC,GAE+B,QAAQ;AAC1C,CACF;AAEA,MAAaE,eAAepE,mBAC1B,OAAO,EAAEiD,WAAoE;CAC3E,MAAMG,QAAQ7B,WAAWgC,MAAMN,IAAI;CACnC,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,MAAMN,MAAM5B,EAAE;CASjC,OAAOe,eAAeC,OANCmB,MADLvB,QAAQ,EAAA,CACCyB,QAAkB;EAC3CC,KAAK,gBAAgBN,YAAYO,SAAS;EAC1CC,QAAQ;EACRE,cAAc;CAChB,CAAC,CAE6B;AAChC,CACF;AAEA,MAAaG,iBAAiBrE,mBAC5B,OAAO,EAAEiD,WAA0E;CACjF,MAAMG,QAAQ3B,qBAAqB8B,MAAMN,IAAI;CAC7C,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,MAAMN,MAAM5B,EAAE;CAGjC,OAAMmC,MADYvB,QAAQ,EAAA,CAChByB,QAAQ;EAAEC,KAAK,YAAYN,YAAYO,SAAS;EAAKC,QAAQ;EAAOf,MAAMG;CAAM,CAAC;AAC7F,CACF;AAEA,MAAakB,aAAatE,mBACxB,OAAO,EAAEiD,WAAsE;CAC7E,MAAMG,QAAQxB,iBAAiB2B,MAAMN,IAAI;CACzC,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,MAAMN,MAAM5B,EAAE;CAGjC,OAAMmC,MADYvB,QAAQ,EAAA,CAChByB,QAAQ;EAAEC,KAAK,OAAON,YAAYO,SAAS;EAAKC,QAAQ;CAAS,CAAC;AAC9E,CACF;AAEA,MAAaO,mBAAmBvE,mBAC9B,OAAO,EAAEiD,WAA4E;CACnF,MAAMG,QAAQvB,uBAAuB0B,MAAMN,IAAI;CAC/C,MAAMO,cAAc,IAAIC,gBAAgB;CACxCD,YAAYE,OAAO,WAAWN,MAAMnC,OAAO;CAC3CuC,YAAYE,OAAO,SAASN,MAAM/B,KAAK;CAGvC,OAAMsC,MADYvB,QAAQ,EAAA,CAChByB,QAAQ;EAAEC,KAAK,OAAON,YAAYO,SAAS;EAAKC,QAAQ;CAAS,CAAC;AAC9E,CACF;AAEA,MAAMQ,qBAAqB,IAAItE,MAAMuE,MAAM,EAAEC,oBAAoB,MAAM,CAAC;AAExE,MAAaC,aAAa3E,mBACxB,OAAO,EAAEiD,WAAsF;CAC7F,MAAMG,QAAQrB,qBAAqBwB,MAAMN,IAAI;CAC7C,MAAM2B,cAAe,MAAMjE,eAAe,IACtC,MAAMF,eAAe,MAAM,IAC3B,MAAMC,YAAY,MAAM;CAC5B,MAAMmE,SAAS1E,SAAS2E,QACtB1B,MAAMnB,KAAK4C,OAAO,CACpB;CAEA,MAAM,IAAIxB,SAAe0B,SAASC,WAAW;EAiB3CC,IAhBmB5E,OAAOwE,QAAQ;GAChCK,UAAU,GAAG3E,UAAU4E,cAAa;GACpCC,WAAW,IAAIhF,iBAAiB,EAAEiF,OAAOb,mBAAmB,CAAC;GAC7Dc,YAAYlC,MAAMnB,KAAKsD;GACvBC,WAAW;GACXC,UAAU;IACRjE,IAAI4B,MAAM5B;IACVP,SAASmC,MAAMnC;IACfI,OAAO+B,MAAM/B;IACbqE,UAAUtC,MAAMnB,KAAK0D;IACrBC,UAAUxC,MAAMnB,KAAK4D;GACvB;GACAlD,SAAS,EAAEmD,eAAe,UAAUlB,cAAc;GAClDmB,SAASf;GACTgB,iBAAiBjB,QAAQ;EAC3B,CACAE,CAAM,CAACgB,MAAM;CACf,CAAC;CAED,OAAO;EACLzE,IAAI4B,MAAM5B;EACVP,SAASmC,MAAMnC;EACfI,OAAO+B,MAAM/B;EACbM,UAAUyB,MAAMnB,KAAK0D;CACvB;AACF,CACF"}