UNPKG

wcz-layout

Version:

1 lines 10.2 kB
{"version":3,"file":"file-C5-a_6W6.mjs","names":["createServerFn","serverEnv","getAppToken","getAccessToken","authenticationMiddleware","getFileUploadToken","method","middleware","optional","handler","token","endpoint","FILE_BASE_URL","mutationOptions","queryOptions","Upload","uuidv7","z","FileSchema","GetFileMetasSchema","UpdateFileMetaSchema","UploadFileMetaSchema","UploadFileResult","batchDeleteFiles","deleteFile","downloadFile","getFile","getFileMetas","getFileThumbnail","updateFileMeta","QueryClientParam","getFileUploadToken","QUERY_KEY","HOUR","baseOptions","staleTime","gcTime","refetchOnWindowFocus","streamToObjectUrl","stream","ReadableStream","Promise","blob","Response","URL","createObjectURL","saveBlob","Blob","fileName","url","anchor","document","createElement","href","download","click","revokeObjectURL","fileMetasQueryOptions","params","input","queryKey","appName","subId","queryFn","data","fileThumbnailQueryOptions","id","enabled","fileQueryOptions","downloadFileMutationOptions","mutationFn","fileExtension","openFileMutationOptions","Error","window","open","updateFileMetaMutationOptions","queryClient","onSettled","invalidateQueries","exact","deleteFileMutationOptions","batchDeleteFilesMutationOptions","uploadFileMutationOptions","file","setProgress","progress","token","endpoint","dotIndex","name","lastIndexOf","slice","resolve","reject","upload","chunkSize","metadata","mimeType","type","headers","Authorization","onProgress","bytesUploaded","bytesTotal","onError","onSuccess","start","result"],"sources":["../src/server/actions/file.ts","../src/data/client/file.ts"],"sourcesContent":["import { createServerFn } from \"@tanstack/react-start\";\r\nimport { serverEnv } from \"~/env\";\r\nimport { getAppToken } from \"~/lib/auth/msalServer\";\r\nimport { getAccessToken } from \"~/lib/auth/user\";\r\nimport { authenticationMiddleware } from \"~/middleware/authMiddleware\";\r\n\r\nexport const getFileUploadToken = createServerFn({ method: \"GET\" })\r\n .middleware([authenticationMiddleware({ optional: true })])\r\n .handler(async () => {\r\n let token: string;\r\n try {\r\n token = await getAccessToken(\"file\");\r\n } catch {\r\n token = await getAppToken(\"file\");\r\n }\r\n return { token, endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload` };\r\n });\r\n","import { mutationOptions, queryOptions } from \"@tanstack/react-query\";\nimport { Upload } from \"tus-js-client\";\nimport { uuidv7 } from \"uuidv7\";\nimport type { z } from \"zod\";\nimport type {\n FileSchema,\n GetFileMetasSchema,\n UpdateFileMetaSchema,\n UploadFileMetaSchema,\n UploadFileResult,\n} from \"~/data/server/file\";\nimport {\n batchDeleteFiles,\n deleteFile,\n downloadFile,\n getFile,\n getFileMetas,\n getFileThumbnail,\n updateFileMeta,\n} from \"~/data/server/file\";\nimport type { QueryClientParam } from \"~/models/QueryClientParam\";\nimport { getFileUploadToken } from \"~/server/actions/file\";\n\nconst QUERY_KEY = \"file\";\nconst HOUR = 1000 * 60 * 60;\n\nconst baseOptions = {\n staleTime: HOUR,\n gcTime: HOUR,\n refetchOnWindowFocus: false,\n};\n\nasync function streamToObjectUrl(stream: ReadableStream): Promise<string> {\n const blob = await new Response(stream).blob();\n return URL.createObjectURL(blob);\n}\n\nfunction saveBlob(blob: Blob, fileName: string): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport const fileMetasQueryOptions = (params: z.input<typeof GetFileMetasSchema>) =>\n queryOptions({\n queryKey: [QUERY_KEY, \"meta\", params.appName, params.subId],\n queryFn: () => getFileMetas({ data: params }),\n ...baseOptions,\n });\n\nexport const fileThumbnailQueryOptions = (params: z.input<typeof FileSchema>) =>\n queryOptions({\n queryKey: [QUERY_KEY, \"thumbnail\", params.appName, params.id],\n queryFn: async () => streamToObjectUrl(await getFileThumbnail({ data: params })),\n enabled: !!params.id,\n ...baseOptions,\n });\n\nexport const fileQueryOptions = (params: z.input<typeof FileSchema>) =>\n queryOptions({\n queryKey: [QUERY_KEY, params.appName, params.id],\n queryFn: async () => streamToObjectUrl(await getFile({ data: params })),\n enabled: !!params.id,\n ...baseOptions,\n });\n\nexport const downloadFileMutationOptions = () =>\n mutationOptions({\n mutationFn: async (\n data: z.input<typeof FileSchema> & { fileName: string; fileExtension: string },\n ) => {\n const stream = await downloadFile({ data });\n saveBlob(await new Response(stream).blob(), `${data.fileName}.${data.fileExtension}`);\n },\n });\n\nexport const openFileMutationOptions = () =>\n mutationOptions<void, Error, z.input<typeof FileSchema>>({\n mutationFn: async (data) => {\n const stream = await getFile({ data });\n window.open(await streamToObjectUrl(stream));\n },\n });\n\nexport const updateFileMetaMutationOptions = ({ queryClient }: QueryClientParam) =>\n mutationOptions({\n mutationFn: (data: z.input<typeof UpdateFileMetaSchema>) => updateFileMeta({ data }),\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\n });\n\nexport const deleteFileMutationOptions = ({ queryClient }: QueryClientParam) =>\n mutationOptions({\n mutationFn: (data: z.input<typeof FileSchema>) => deleteFile({ data }),\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\n });\n\nexport const batchDeleteFilesMutationOptions = ({ queryClient }: QueryClientParam) =>\n mutationOptions({\n mutationFn: (data: z.input<typeof GetFileMetasSchema>) => batchDeleteFiles({ data }),\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\n });\n\nexport const uploadFileMutationOptions = ({ queryClient }: QueryClientParam) =>\n mutationOptions({\n mutationFn: async ({\n appName,\n subId,\n file,\n setProgress,\n }: z.input<typeof UploadFileMetaSchema> & {\n setProgress?: (progress: number) => void;\n }): Promise<UploadFileResult> => {\n const { token, endpoint } = await getFileUploadToken();\n const id = uuidv7();\n const dotIndex = file.name.lastIndexOf(\".\");\n const fileExtension = dotIndex >= 0 ? file.name.slice(dotIndex + 1) : \"\";\n\n await new Promise<void>((resolve, reject) => {\n const upload = new Upload(file, {\n endpoint,\n chunkSize: 1_048_576,\n metadata: { id, appName, subId, fileName: file.name, fileExtension, mimeType: file.type },\n headers: { Authorization: `Bearer ${token}` },\n onProgress: (bytesUploaded, bytesTotal) =>\n setProgress?.((bytesUploaded / bytesTotal) * 100),\n onError: reject,\n onSuccess: () => resolve(),\n });\n upload.start();\n });\n\n return { id, appName, subId, fileName: file.name };\n },\n onSuccess: (result) =>\n queryClient.invalidateQueries({\n queryKey: [QUERY_KEY, \"meta\", result.appName, result.subId],\n exact: false,\n }),\n });\n"],"mappings":";;;;;;;;;;AAMA,MAAaK,qBAAqBL,eAAe,EAAEM,QAAQ,MAAM,CAAC,CAAC,CAChEC,WAAW,CAACH,yBAAyB,EAAEI,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1DC,QAAQ,YAAY;CACnB,IAAIC;CACJ,IAAI;EACFA,QAAQ,MAAMP,eAAe,MAAM;CACrC,QAAQ;EACNO,QAAQ,MAAMR,YAAY,MAAM;CAClC;CACA,OAAO;EAAEQ;EAAOC,UAAU,GAAGV,UAAUW,cAAa;CAAa;AACnE,CAAC;;;ACOH,MAAMoB,YAAY;AAClB,MAAMC,OAAO,MAAO,KAAK;AAEzB,MAAMC,cAAc;CAClBC,WAAWF;CACXG,QAAQH;CACRI,sBAAsB;AACxB;AAEA,eAAeC,kBAAkBC,QAAyC;CACxE,MAAMG,OAAO,MAAM,IAAIC,SAASJ,MAAM,CAAC,CAACG,KAAK;CAC7C,OAAOE,IAAIC,gBAAgBH,IAAI;AACjC;AAEA,SAASI,SAASJ,MAAYM,UAAwB;CACpD,MAAMC,MAAML,IAAIC,gBAAgBH,IAAI;CACpC,MAAMQ,SAASC,SAASC,cAAc,GAAG;CACzCF,OAAOG,OAAOJ;CACdC,OAAOI,WAAWN;CAClBE,OAAOK,MAAM;CACbX,IAAIY,gBAAgBP,GAAG;AACzB;AAEA,MAAaQ,yBAAyBC,WACpC5C,aAAa;CACX8C,UAAU;EAAC5B;EAAW;EAAQ0B,OAAOG;EAASH,OAAOI;CAAK;CAC1DC,eAAepC,aAAa,EAAEqC,MAAMN,OAAO,CAAC;CAC5C,GAAGxB;AACL,CAAC;AAEH,MAAa+B,6BAA6BP,WACxC5C,aAAa;CACX8C,UAAU;EAAC5B;EAAW;EAAa0B,OAAOG;EAASH,OAAOQ;CAAE;CAC5DH,SAAS,YAAYzB,kBAAkB,MAAMV,iBAAiB,EAAEoC,MAAMN,OAAO,CAAC,CAAC;CAC/ES,SAAS,CAAC,CAACT,OAAOQ;CAClB,GAAGhC;AACL,CAAC;AAEH,MAAakC,oBAAoBV,WAC/B5C,aAAa;CACX8C,UAAU;EAAC5B;EAAW0B,OAAOG;EAASH,OAAOQ;CAAE;CAC/CH,SAAS,YAAYzB,kBAAkB,MAAMZ,QAAQ,EAAEsC,MAAMN,OAAO,CAAC,CAAC;CACtES,SAAS,CAAC,CAACT,OAAOQ;CAClB,GAAGhC;AACL,CAAC;AAEH,MAAamC,oCACXxD,gBAAgB,EACdyD,YAAY,OACVN,SACG;CACH,MAAMzB,SAAS,MAAMd,aAAa,EAAEuC,KAAK,CAAC;CAC1ClB,SAAS,MAAM,IAAIH,SAASJ,MAAM,CAAC,CAACG,KAAK,GAAG,GAAGsB,KAAKhB,SAAQ,GAAIgB,KAAKO,eAAe;AACtF,EACF,CAAC;AAEH,MAAaC,gCACX3D,gBAAyD,EACvDyD,YAAY,OAAON,SAAS;CAC1B,MAAMzB,SAAS,MAAMb,QAAQ,EAAEsC,KAAK,CAAC;CACrCU,OAAOC,KAAK,MAAMrC,kBAAkBC,MAAM,CAAC;AAC7C,EACF,CAAC;AAEH,MAAaqC,iCAAiC,EAAEC,kBAC9ChE,gBAAgB;CACdyD,aAAaN,SAA+CnC,eAAe,EAAEmC,KAAK,CAAC;CACnFc,iBAAiBD,YAAYE,kBAAkB;EAAEnB,UAAU,CAAC5B,WAAW,MAAM;EAAGgD,OAAO;CAAM,CAAC;AAChG,CAAC;AAEH,MAAaC,6BAA6B,EAAEJ,kBAC1ChE,gBAAgB;CACdyD,aAAaN,SAAqCxC,WAAW,EAAEwC,KAAK,CAAC;CACrEc,iBAAiBD,YAAYE,kBAAkB;EAAEnB,UAAU,CAAC5B,WAAW,MAAM;EAAGgD,OAAO;CAAM,CAAC;AAChG,CAAC;AAEH,MAAaE,mCAAmC,EAAEL,kBAChDhE,gBAAgB;CACdyD,aAAaN,SAA6CzC,iBAAiB,EAAEyC,KAAK,CAAC;CACnFc,iBAAiBD,YAAYE,kBAAkB;EAAEnB,UAAU,CAAC5B,WAAW,MAAM;EAAGgD,OAAO;CAAM,CAAC;AAChG,CAAC;AAEH,MAAaG,6BAA6B,EAAEN,kBAC1ChE,gBAAgB;CACdyD,YAAY,OAAO,EACjBT,SACAC,OACAsB,MACAC,kBAG+B;EAC/B,MAAM,EAAEE,OAAOC,aAAa,MAAMzD,mBAAmB;EACrD,MAAMmC,KAAKlD,OAAO;EAClB,MAAMyE,WAAWL,KAAKM,KAAKC,YAAY,GAAG;EAC1C,MAAMpB,gBAAgBkB,YAAY,IAAIL,KAAKM,KAAKE,MAAMH,WAAW,CAAC,IAAI;EAEtE,MAAM,IAAIhD,SAAeoD,SAASC,WAAW;GAW3CC,IAVmBhF,OAAOqE,MAAM;IAC9BI;IACAQ,WAAW;IACXC,UAAU;KAAE/B;KAAIL;KAASC;KAAOd,UAAUoC,KAAKM;KAAMnB;KAAe2B,UAAUd,KAAKe;IAAK;IACxFC,SAAS,EAAEC,eAAe,UAAUd,QAAQ;IAC5Ce,aAAaC,eAAeC,eAC1BnB,cAAekB,gBAAgBC,aAAc,GAAG;IAClDC,SAASX;IACTY,iBAAiBb,QAAQ;GAC3B,CACAE,CAAM,CAACY,MAAM;EACf,CAAC;EAED,OAAO;GAAEzC;GAAIL;GAASC;GAAOd,UAAUoC,KAAKM;EAAK;CACnD;CACAgB,YAAYE,WACV/B,YAAYE,kBAAkB;EAC5BnB,UAAU;GAAC5B;GAAW;GAAQ4E,OAAO/C;GAAS+C,OAAO9C;EAAK;EAC1DkB,OAAO;CACT,CAAC;AACL,CAAC"}