@visulima/storage 1.0.0-alpha.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +578 -0
- package/LICENSE.md +237 -568
- package/README.md +82 -466
- package/dist/adapter/nuxt/module.d.ts +41 -34
- package/dist/adapter/nuxt/module.js +1 -93
- package/dist/adapter/nuxt/package.json +0 -6
- package/dist/ai/ai-sdk/index.d.ts +113 -0
- package/dist/ai/ai-sdk/index.js +1 -0
- package/dist/ai/claude/index.d.ts +177 -0
- package/dist/ai/claude/index.js +1 -0
- package/dist/ai/openai/index.d.ts +205 -0
- package/dist/ai/openai/index.js +1 -0
- package/dist/ai/tanstack/index.d.ts +115 -0
- package/dist/ai/tanstack/index.js +1 -0
- package/dist/handler/http/fetch/index.d.ts +303 -4
- package/dist/handler/http/fetch/index.js +1 -4
- package/dist/handler/http/hono/index.d.ts +73 -64
- package/dist/handler/http/hono/index.js +1 -65
- package/dist/handler/http/nextjs/index.d.ts +66 -58
- package/dist/handler/http/nextjs/index.js +1 -37
- package/dist/handler/http/node/index.d.ts +368 -4
- package/dist/handler/http/node/index.js +1 -8
- package/dist/handler/http/solid-start/index.d.ts +66 -57
- package/dist/handler/http/solid-start/index.js +1 -44
- package/dist/index.d.ts +106 -17
- package/dist/index.js +1 -13
- package/dist/openapi/index.d.ts +24 -5
- package/dist/openapi/index.js +1 -5
- package/dist/packem_shared/AbstractBaseStorage-Ba7cLu-t.js +1 -0
- package/dist/packem_shared/AwsLightFile-CpZrubaV.js +1 -0
- package/dist/packem_shared/AwsLightMetaStorage-DPqJ9LTr.js +1 -0
- package/dist/packem_shared/AwsLightStorage-DTBVxHXO.js +1 -0
- package/dist/packem_shared/AzureFile-DFSaVe25.js +1 -0
- package/dist/packem_shared/AzureSMetaStorage-ByzM6Aix.js +1 -0
- package/dist/packem_shared/AzureStorage-BFsD4qbF.js +1 -0
- package/dist/packem_shared/BaseTransformer-Buw5lX_3.js +1 -0
- package/dist/packem_shared/BoxFile-CseIoPW1.js +1 -0
- package/dist/packem_shared/BoxMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/BoxStorage-B_t-OVzf.js +1 -0
- package/dist/packem_shared/BunS3File-BcYmsz1n.js +1 -0
- package/dist/packem_shared/BunS3MetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/BunS3Storage-CB_pZWlV.js +1 -0
- package/dist/packem_shared/BunnyFile-BgEOlcYI.js +1 -0
- package/dist/packem_shared/BunnyMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/BunnyStorage-CILSK4_Z.js +1 -0
- package/dist/packem_shared/CloudinaryFile-Bo5B-vM1.js +1 -0
- package/dist/packem_shared/CloudinaryMetaStorage-D_vNzewL.js +1 -0
- package/dist/packem_shared/CloudinaryStorage-DiCbdAi_.js +1 -0
- package/dist/packem_shared/DiskStorage-Kp5t3vnF.js +1 -0
- package/dist/packem_shared/DiskStorageWithChecksum-Bh6w-Iu8.js +1 -0
- package/dist/packem_shared/DropboxFile-BFb7eOzy.js +1 -0
- package/dist/packem_shared/DropboxMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/DropboxStorage-H8bd8hEz.js +1 -0
- package/dist/packem_shared/ERRORS-BIBxE2oR.js +1 -0
- package/dist/packem_shared/File-W8aOo15X.js +1 -0
- package/dist/packem_shared/Files-BA3mpDwz.js +1 -0
- package/dist/packem_shared/FirebaseFile-BLaBxa2A.js +1 -0
- package/dist/packem_shared/FirebaseMetaStorage-D_vNzewL.js +1 -0
- package/dist/packem_shared/FirebaseStorage-Dgk4XyMr.js +2 -0
- package/dist/packem_shared/FtpFile-ClWDYnt2.js +1 -0
- package/dist/packem_shared/FtpMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/FtpStorage-g_DjiR-C.js +1 -0
- package/dist/packem_shared/GCSConfig-BQ0OpVhe.js +1 -0
- package/dist/packem_shared/GCSFile-Cero7qZN.js +1 -0
- package/dist/packem_shared/GCSMetaStorage-3fLTlRd4.js +1 -0
- package/dist/packem_shared/GCStorage-DUfwVFd3.js +1 -0
- package/dist/packem_shared/GoogleDriveFile-DHpLhzg9.js +1 -0
- package/dist/packem_shared/GoogleDriveMetaStorage-DqkgoE46.js +1 -0
- package/dist/packem_shared/GoogleDriveStorage-D0-5egHE.js +1 -0
- package/dist/packem_shared/LocalMetaStorage-Bp5mVc76.js +1 -0
- package/dist/packem_shared/MediaTransformer-D2kUsklW.js +1 -0
- package/dist/packem_shared/MemoryMetaStorage-Ksgh9pe7.js +1 -0
- package/dist/packem_shared/MemoryStorage-DzSTdlAq.js +1 -0
- package/dist/packem_shared/MetaStorage-DPEUyWgN.js +1 -0
- package/dist/packem_shared/Metadata-B7CcBueg.js +1 -0
- package/dist/packem_shared/Multipart-Btj2mo9r.js +1 -0
- package/dist/packem_shared/Multipart-C4GpuHMU.js +1 -0
- package/dist/packem_shared/NetlifyBlobFile-DoFhkzaH.js +1 -0
- package/dist/packem_shared/NetlifyBlobMetaStorage-D_vNzewL.js +1 -0
- package/dist/packem_shared/NetlifyBlobStorage-DZdCmOVW.js +1 -0
- package/dist/packem_shared/NoOpMetrics-BLo6u4NY.js +1 -0
- package/dist/packem_shared/OneDriveFile-CNNJYI43.js +1 -0
- package/dist/packem_shared/OneDriveMetaStorage-DqkgoE46.js +1 -0
- package/dist/packem_shared/OneDriveStorage-CvJetV7_.js +1 -0
- package/dist/packem_shared/OpenTelemetryMetrics-DJDQsNKp.js +1 -0
- package/dist/packem_shared/PocketBaseFile-DpJpxl3e.js +1 -0
- package/dist/packem_shared/PocketBaseMetaStorage-CpvDRnSu.js +1 -0
- package/dist/packem_shared/PocketBaseStorage-BPil-koe.js +1 -0
- package/dist/packem_shared/Rest-BehVaxbl.js +1 -0
- package/dist/packem_shared/Rest-ymPCZkKR.js +1 -0
- package/dist/packem_shared/S3File-CpZrubaV.js +1 -0
- package/dist/packem_shared/S3MetaStorage-CMonflzp.js +1 -0
- package/dist/packem_shared/S3Storage-wslqssvr.js +1 -0
- package/dist/packem_shared/SftpFile-ClWDYnt2.js +1 -0
- package/dist/packem_shared/SftpMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/SftpStorage-BVbMtS2b.js +1 -0
- package/dist/packem_shared/SharePointFile-Blz9FS4h.js +1 -0
- package/dist/packem_shared/SharePointMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/SharePointStorage-DWjvR5oZ.js +1 -0
- package/dist/packem_shared/SupabaseFile-Bo5B-vM1.js +1 -0
- package/dist/packem_shared/SupabaseMetaStorage-DqkgoE46.js +1 -0
- package/dist/packem_shared/SupabaseStorage-BiKmYKb6.js +1 -0
- package/dist/packem_shared/TUS_RESUMABLE-CyTSRvPU.js +1 -0
- package/dist/packem_shared/Tus-BgbON_wQ.js +1 -0
- package/dist/packem_shared/Tus-v6jzkaIO.js +1 -0
- package/dist/packem_shared/UploadControl-DZJhI9Wh.js +1 -0
- package/dist/packem_shared/UploadThingFile-BTFMpcIA.js +1 -0
- package/dist/packem_shared/UploadThingMetaStorage-D_vNzewL.js +1 -0
- package/dist/packem_shared/UploadThingStorage-jrEnANC5.js +1 -0
- package/dist/packem_shared/ValidationError-3B06DFyE.js +1 -0
- package/dist/packem_shared/VercelBlobFile-CVQwKlZk.js +1 -0
- package/dist/packem_shared/VercelBlobMetaStorage-DFwhEI9C.js +1 -0
- package/dist/packem_shared/VercelBlobStorage-Y-cDgH30.js +1 -0
- package/dist/packem_shared/_commonjsHelpers-CWAkuNXM.js +1 -0
- package/dist/packem_shared/agentsCopyFile-Dl5iffdH.js +1 -0
- package/dist/packem_shared/akamai-DthkaFul.js +1 -0
- package/dist/packem_shared/alibaba-BEi25O1g.js +1 -0
- package/dist/packem_shared/approval-fVHwBp7u.js +1 -0
- package/dist/packem_shared/approval.d-CMAYH9GF.d.ts +75 -0
- package/dist/packem_shared/aws-light-meta-storage-DGrn72VJ.js +4 -0
- package/dist/packem_shared/azure-meta-storage-ClbEsfI4.js +1 -0
- package/dist/packem_shared/backblaze-m1N5NZ9q.js +1 -0
- package/dist/packem_shared/base-handler-core-EeV8gZck.js +1 -0
- package/dist/packem_shared/base-handler-fetch-CHzsgb7C.js +1 -0
- package/dist/packem_shared/base-handler-node-BjpW8pGi.js +1 -0
- package/dist/packem_shared/cache-Cw3QjoVN.js +1 -0
- package/dist/packem_shared/claudeCopyFile-BX9O4ORk.js +1 -0
- package/dist/packem_shared/cloudflare-CdUTErlo.js +1 -0
- package/dist/packem_shared/copyFile-49FtxXcm.js +1 -0
- package/dist/packem_shared/copyFile-BUPezT_c.js +1 -0
- package/dist/packem_shared/createResponsesFileTools-6Tvt2PNr.js +1 -0
- package/dist/packem_shared/createRetryWrapper-CxgiV_hH.js +1 -0
- package/dist/packem_shared/detect-file-type-BA7UBLKA.js +1 -0
- package/dist/packem_shared/digitalOcean-B2uB6pgz.js +1 -0
- package/dist/packem_shared/disk-storage-DIn-VnCh.js +1 -0
- package/dist/packem_shared/disk-storage-with-checksum.d-B-VGEsfl.d.ts +156 -0
- package/dist/packem_shared/executors-BDzMjc4y.js +1 -0
- package/dist/packem_shared/executors.d-BZP2rWo3.d.ts +69 -0
- package/dist/packem_shared/exoscale-BDa1Gjth.js +1 -0
- package/dist/packem_shared/filebase-CsFYJIwB.js +1 -0
- package/dist/packem_shared/files.d-CH0iLBNC.d.ts +655 -0
- package/dist/packem_shared/gcs-meta-storage-Dy37wCjI.js +1 -0
- package/dist/packem_shared/get-file-status-y3wTtDQs.js +1 -0
- package/dist/packem_shared/getFormatFromContentType-DCTTPQHm.js +1 -0
- package/dist/packem_shared/has-content-50BsqrWw.js +1 -0
- package/dist/packem_shared/headers-BAiAKekR.js +26 -0
- package/dist/packem_shared/hetzner-BGGFiRGD.js +1 -0
- package/dist/packem_shared/ibmCos-j-3TfJ5p.js +1 -0
- package/dist/packem_shared/idriveE2-C6pQ5pQ0.js +1 -0
- package/dist/packem_shared/index-nZWCQrSe.js +5 -0
- package/dist/packem_shared/internal-D_cZIFwI.js +1 -0
- package/dist/packem_shared/is-expired-CBEk6XBi.js +1 -0
- package/dist/packem_shared/local-meta-storage-C2T92TYb.js +11 -0
- package/dist/packem_shared/local-meta-storage.d-D9PBfkn6.d.ts +21 -0
- package/dist/packem_shared/media-transformer.d-Quf4ai47.d.ts +331 -0
- package/dist/packem_shared/memory-storage.d-4EU1cMt1.d.ts +101 -0
- package/dist/packem_shared/minio-NKquuBfS.js +1 -0
- package/dist/packem_shared/multipart-base-BOzY19lb.js +1 -0
- package/dist/packem_shared/oauth-refresh-EdGzlcOZ.js +1 -0
- package/dist/packem_shared/oracleCloud-DslqNpn6.js +1 -0
- package/dist/packem_shared/ovhCloud-CMHE6uLV.js +1 -0
- package/dist/packem_shared/part-match-D-9dGX42.js +1 -0
- package/dist/packem_shared/path-0oTTdkvl-BVg7lYf5.js +1 -0
- package/dist/packem_shared/posix-dirname-CfpH5wZi.js +1 -0
- package/dist/packem_shared/response-builder-CbSA8qPa.js +1 -0
- package/dist/packem_shared/rest-base-CynUg0mH.js +1 -0
- package/dist/packem_shared/restOpenApiSpec-Csv513qf.js +1 -0
- package/dist/packem_shared/s3-base-storage-DXZYN24h.js +1 -0
- package/dist/packem_shared/s3-base-storage.d-BQgP5B-t.d.ts +287 -0
- package/dist/packem_shared/scaleway-U1In3v70.js +1 -0
- package/dist/packem_shared/sharedErrorSchemaObject-YN65aAKj.js +1 -0
- package/dist/packem_shared/storage-Cyy73Y6r.js +1 -0
- package/dist/packem_shared/storage.d-CEM1upWM.d.ts +1176 -0
- package/dist/packem_shared/storj-Cb59q9kF.js +1 -0
- package/dist/packem_shared/sync-DhR3536K.js +1 -0
- package/dist/packem_shared/tencent-Q1y2GENc.js +1 -0
- package/dist/packem_shared/tigris-BELKoyyp.js +1 -0
- package/dist/packem_shared/transformOpenApiSpec-CIEAgpBD.js +1 -0
- package/dist/packem_shared/tus-base.d-DLzKE54M.d.ts +106 -0
- package/dist/packem_shared/tusOpenApiSpec-D96B03t5.js +1 -0
- package/dist/packem_shared/types.d-Bon9GVVe.d.ts +104 -0
- package/dist/packem_shared/types.d-CggTCgXr.d.ts +49 -0
- package/dist/packem_shared/types.d-CrUWY4On.d.ts +720 -0
- package/dist/packem_shared/update-size-DuNuLyxj.js +1 -0
- package/dist/packem_shared/vultr-B491cQ4e.js +1 -0
- package/dist/packem_shared/waitForStorage-ByQmG4xF.js +1 -0
- package/dist/packem_shared/wasabi-DFrwIoab.js +1 -0
- package/dist/packem_shared/xhrOpenApiSpec-DQR4h6M8.js +1 -0
- package/dist/packem_shared/yandex-CwzHuEKP.js +1 -0
- package/dist/storage/aws/clients/index.d.ts +612 -6
- package/dist/storage/aws/clients/index.js +1 -6
- package/dist/storage/aws/index.d.ts +332 -4
- package/dist/storage/aws/index.js +1 -3
- package/dist/storage/aws-light/index.d.ts +259 -4
- package/dist/storage/aws-light/index.js +1 -3
- package/dist/storage/azure/index.d.ts +236 -4
- package/dist/storage/azure/index.js +1 -3
- package/dist/storage/box/index.d.ts +189 -0
- package/dist/storage/box/index.js +1 -0
- package/dist/storage/bun-s3/index.d.ts +200 -0
- package/dist/storage/bun-s3/index.js +1 -0
- package/dist/storage/bunny/index.d.ts +119 -0
- package/dist/storage/bunny/index.js +1 -0
- package/dist/storage/cloudinary/index.d.ts +121 -0
- package/dist/storage/cloudinary/index.js +1 -0
- package/dist/storage/dropbox/index.d.ts +132 -0
- package/dist/storage/dropbox/index.js +1 -0
- package/dist/storage/firebase/index.d.ts +192 -0
- package/dist/storage/firebase/index.js +1 -0
- package/dist/storage/ftp/index.d.ts +91 -0
- package/dist/storage/ftp/index.js +1 -0
- package/dist/storage/gcs/index.d.ts +195 -5
- package/dist/storage/gcs/index.js +1 -4
- package/dist/storage/google-drive/index.d.ts +148 -0
- package/dist/storage/google-drive/index.js +1 -0
- package/dist/storage/local/index.d.ts +7 -4
- package/dist/storage/local/index.js +1 -3
- package/dist/storage/memory/index.d.ts +6 -0
- package/dist/storage/memory/index.js +1 -0
- package/dist/storage/netlify-blob/index.d.ts +147 -4
- package/dist/storage/netlify-blob/index.js +1 -3
- package/dist/storage/onedrive/index.d.ts +103 -0
- package/dist/storage/onedrive/index.js +1 -0
- package/dist/storage/pocketbase/index.d.ts +172 -0
- package/dist/storage/pocketbase/index.js +1 -0
- package/dist/storage/sftp/index.d.ts +92 -0
- package/dist/storage/sftp/index.js +1 -0
- package/dist/storage/sharepoint/index.d.ts +180 -0
- package/dist/storage/sharepoint/index.js +1 -0
- package/dist/storage/supabase/index.d.ts +115 -0
- package/dist/storage/supabase/index.js +1 -0
- package/dist/storage/uploadthing/index.d.ts +95 -0
- package/dist/storage/uploadthing/index.js +1 -0
- package/dist/storage/vercel-blob/index.d.ts +189 -4
- package/dist/storage/vercel-blob/index.js +1 -3
- package/dist/transformer/audio-transformer.d.ts +127 -125
- package/dist/transformer/audio-transformer.js +1 -278
- package/dist/transformer/image-transformer.d.ts +573 -568
- package/dist/transformer/image-transformer.js +1 -1100
- package/dist/transformer/index.d.ts +62 -5
- package/dist/transformer/index.js +1 -4
- package/dist/transformer/video-transformer.d.ts +144 -142
- package/dist/transformer/video-transformer.js +1 -310
- package/package.json +202 -50
- package/dist/handler/base/base-handler-core.d.ts +0 -91
- package/dist/handler/base/base-handler-fetch.d.ts +0 -76
- package/dist/handler/base/base-handler-node.d.ts +0 -137
- package/dist/handler/multipart/multipart-base.d.ts +0 -84
- package/dist/handler/multipart/multipart-fetch.d.ts +0 -64
- package/dist/handler/multipart/multipart.d.ts +0 -49
- package/dist/handler/rest/rest-base.d.ts +0 -106
- package/dist/handler/rest/rest-fetch.d.ts +0 -88
- package/dist/handler/rest/rest.d.ts +0 -93
- package/dist/handler/tus/tus-base.d.ts +0 -152
- package/dist/handler/tus/tus-fetch.d.ts +0 -72
- package/dist/handler/tus/tus.d.ts +0 -78
- package/dist/handler/types.d.ts +0 -53
- package/dist/handler/utils/request-parser.d.ts +0 -72
- package/dist/handler/utils/response-builder.d.ts +0 -83
- package/dist/handler/utils/storage-utils.d.ts +0 -10
- package/dist/handler/utils/stream-utils.d.ts +0 -29
- package/dist/handler/utils/upload-handlers.d.ts +0 -76
- package/dist/metrics/index.d.ts +0 -2
- package/dist/metrics/no-op-metrics.d.ts +0 -15
- package/dist/metrics/opentelemetry-metrics.d.ts +0 -55
- package/dist/openapi/rest.d.ts +0 -7
- package/dist/openapi/shared.d.ts +0 -13
- package/dist/openapi/transform.d.ts +0 -3
- package/dist/openapi/tus.d.ts +0 -7
- package/dist/openapi/xhr.d.ts +0 -7
- package/dist/packem_shared/AwsLightFile-tTneXZgG.js +0 -11
- package/dist/packem_shared/AwsLightMetaStorage-BWSOtVaN.js +0 -4
- package/dist/packem_shared/AwsLightStorage-Blv-GP4v.js +0 -133
- package/dist/packem_shared/AzureFile-CesgFzps.js +0 -8
- package/dist/packem_shared/AzureSMetaStorage-CFs-OYJT.js +0 -88
- package/dist/packem_shared/AzureStorage-B0v048hG.js +0 -357
- package/dist/packem_shared/BaseTransformer-C2gLib6v.js +0 -82
- package/dist/packem_shared/DiskStorage-BlltBst6.js +0 -12
- package/dist/packem_shared/DiskStorageWithChecksum-BJTmMklc.js +0 -238
- package/dist/packem_shared/ERRORS-D0apMqnc.js +0 -97
- package/dist/packem_shared/File-Bb3P23dr.js +0 -69
- package/dist/packem_shared/GCSConfig-vPP22kN6.js +0 -11
- package/dist/packem_shared/GCSFile-BIEunhAN.js +0 -8
- package/dist/packem_shared/GCSMetaStorage-BYhwecZl.js +0 -7
- package/dist/packem_shared/GCStorage-BmnoK7Rz.js +0 -406
- package/dist/packem_shared/LocalMetaStorage-CZHhKkMd.js +0 -7
- package/dist/packem_shared/MediaTransformer-D6658DL1.js +0 -1197
- package/dist/packem_shared/MetaStorage-pECeFOad.js +0 -46
- package/dist/packem_shared/Metadata-DRLXeJ0F.js +0 -89
- package/dist/packem_shared/Multipart-5Xpy7WhY.js +0 -163
- package/dist/packem_shared/Multipart-C-iU9LXj.js +0 -128
- package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +0 -14
- package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +0 -9
- package/dist/packem_shared/NetlifyBlobStorage-CLPtjHqd.js +0 -376
- package/dist/packem_shared/NoOpMetrics-DhAk5rXc.js +0 -10
- package/dist/packem_shared/OpenTelemetryMetrics-BnxhqIaH.js +0 -67
- package/dist/packem_shared/Rest-DO7OslCs.js +0 -267
- package/dist/packem_shared/Rest-DTaszQ6n.js +0 -228
- package/dist/packem_shared/S3File-DZiyk9Qt.js +0 -11
- package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +0 -76
- package/dist/packem_shared/S3Storage-DHmTk-hU.js +0 -316
- package/dist/packem_shared/TUS_RESUMABLE-BfguFdM1.js +0 -434
- package/dist/packem_shared/Tus-BQItPVAC.js +0 -200
- package/dist/packem_shared/Tus-BibjweWH.js +0 -195
- package/dist/packem_shared/ValidationError-BfF1aE4h.js +0 -26
- package/dist/packem_shared/VercelBlobFile-BCg4aTEq.js +0 -18
- package/dist/packem_shared/VercelBlobMetaStorage-Bd9F-VFm.js +0 -9
- package/dist/packem_shared/VercelBlobStorage-DD9LMOS6.js +0 -261
- package/dist/packem_shared/_commonjsHelpers-B85MJLTf.js +0 -5
- package/dist/packem_shared/aws-light-meta-storage-DKJBgbR6.js +0 -446
- package/dist/packem_shared/backblaze-BlMnIcBC.js +0 -20
- package/dist/packem_shared/base-handler-core-DLEVHemv.js +0 -303
- package/dist/packem_shared/base-handler-fetch-A7V0N6AJ.js +0 -291
- package/dist/packem_shared/base-handler-node-Dx7ce3sU.js +0 -730
- package/dist/packem_shared/cache-B88MXQ_2.js +0 -18
- package/dist/packem_shared/cloudflare-Bi1q8wXE.js +0 -21
- package/dist/packem_shared/defaultCloudStorageFileNameValidation-DUuacjWv.js +0 -11
- package/dist/packem_shared/digitalOcean-CWQRJM3L.js +0 -21
- package/dist/packem_shared/disk-storage-Bh2wy3YW.js +0 -810
- package/dist/packem_shared/gcs-meta-storage-DqNjM7DP.js +0 -158
- package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
- package/dist/packem_shared/headers-C9DasoT1.js +0 -1318
- package/dist/packem_shared/is-expired-CTThU1q5.js +0 -8
- package/dist/packem_shared/isRetryableError-Dycp7127.js +0 -82
- package/dist/packem_shared/isValidMediaType-BeDgiObq.js +0 -35
- package/dist/packem_shared/local-meta-storage-By-3SNBI.js +0 -649
- package/dist/packem_shared/minio-C2YBZQOw.js +0 -22
- package/dist/packem_shared/multipart-base-BY0rhkw5.js +0 -102
- package/dist/packem_shared/part-match-BMNqHDYD.js +0 -96
- package/dist/packem_shared/path-CR6YkPXX-7R1-9CMk.js +0 -161
- package/dist/packem_shared/response-builder-BtnRiBUI.js +0 -45
- package/dist/packem_shared/rest-base-Bt9Np3M8.js +0 -457
- package/dist/packem_shared/restOpenApiSpec-D1JC_Jto.js +0 -800
- package/dist/packem_shared/s3-base-storage-C1DIHTYY.js +0 -510
- package/dist/packem_shared/sharedGet-Cpo7QUyu.js +0 -1019
- package/dist/packem_shared/storage-C6NSXb8h.js +0 -1175
- package/dist/packem_shared/tigris-Hac8TKnX.js +0 -21
- package/dist/packem_shared/transformOpenApiSpec-DWM5WtnN.js +0 -975
- package/dist/packem_shared/tusOpenApiSpec-mBZkl7he.js +0 -740
- package/dist/packem_shared/update-size-CCGm6i1J.js +0 -8
- package/dist/packem_shared/validator-BeX_lJet.js +0 -78
- package/dist/packem_shared/waitForStorage-Cscw85sx.js +0 -18
- package/dist/packem_shared/wasabi-DIyflHSd.js +0 -21
- package/dist/packem_shared/xhrOpenApiSpec-B1V5Dxrj.js +0 -264
- package/dist/storage/aws/clients/backblaze.d.ts +0 -12
- package/dist/storage/aws/clients/cloudflare.d.ts +0 -13
- package/dist/storage/aws/clients/digital-ocean.d.ts +0 -12
- package/dist/storage/aws/clients/minio.d.ts +0 -13
- package/dist/storage/aws/clients/tigris.d.ts +0 -12
- package/dist/storage/aws/clients/types.d.ts +0 -95
- package/dist/storage/aws/clients/wasabi.d.ts +0 -12
- package/dist/storage/aws/s3-base-storage.d.ts +0 -248
- package/dist/storage/aws/s3-client-adapter.d.ts +0 -110
- package/dist/storage/aws/s3-file.d.ts +0 -10
- package/dist/storage/aws/s3-meta-storage.d.ts +0 -15
- package/dist/storage/aws/s3-storage.d.ts +0 -70
- package/dist/storage/aws/types.d.ts +0 -119
- package/dist/storage/aws-light/aws-light-api-adapter.d.ts +0 -130
- package/dist/storage/aws-light/aws-light-file.d.ts +0 -10
- package/dist/storage/aws-light/aws-light-meta-storage.d.ts +0 -19
- package/dist/storage/aws-light/aws-light-storage.d.ts +0 -65
- package/dist/storage/aws-light/types.d.ts +0 -37
- package/dist/storage/azure/azure-file.d.ts +0 -6
- package/dist/storage/azure/azure-meta-storage.d.ts +0 -15
- package/dist/storage/azure/azure-storage.d.ts +0 -69
- package/dist/storage/azure/types.d.ts +0 -62
- package/dist/storage/gcs/fetch-error.d.ts +0 -11
- package/dist/storage/gcs/gcs-config.d.ts +0 -2
- package/dist/storage/gcs/gcs-file.d.ts +0 -6
- package/dist/storage/gcs/gcs-meta-storage.d.ts +0 -27
- package/dist/storage/gcs/gcs-storage.d.ts +0 -91
- package/dist/storage/gcs/types.d.ts +0 -55
- package/dist/storage/gcs/utils.d.ts +0 -7
- package/dist/storage/local/disk-storage-with-checksum.d.ts +0 -15
- package/dist/storage/local/disk-storage.d.ts +0 -135
- package/dist/storage/local/local-meta-storage.d.ts +0 -32
- package/dist/storage/meta-storage.d.ts +0 -30
- package/dist/storage/netlify-blob/netlify-blob-file.d.ts +0 -12
- package/dist/storage/netlify-blob/netlify-blob-meta-storage.d.ts +0 -7
- package/dist/storage/netlify-blob/netlify-blob-storage.d.ts +0 -93
- package/dist/storage/netlify-blob/types.d.ts +0 -30
- package/dist/storage/storage.d.ts +0 -353
- package/dist/storage/types.d.ts +0 -221
- package/dist/storage/utils/file/file.d.ts +0 -25
- package/dist/storage/utils/file/get-file-status.d.ts +0 -9
- package/dist/storage/utils/file/has-content.d.ts +0 -9
- package/dist/storage/utils/file/index.d.ts +0 -10
- package/dist/storage/utils/file/is-expired.d.ts +0 -8
- package/dist/storage/utils/file/metadata.d.ts +0 -18
- package/dist/storage/utils/file/part-match.d.ts +0 -11
- package/dist/storage/utils/file/types.d.ts +0 -37
- package/dist/storage/utils/file/update-metadata.d.ts +0 -10
- package/dist/storage/utils/file/update-size.d.ts +0 -10
- package/dist/storage/vercel-blob/types.d.ts +0 -32
- package/dist/storage/vercel-blob/vercel-blob-file.d.ts +0 -16
- package/dist/storage/vercel-blob/vercel-blob-meta-storage.d.ts +0 -7
- package/dist/storage/vercel-blob/vercel-blob-storage.d.ts +0 -76
- package/dist/transformer/base-transformer.d.ts +0 -63
- package/dist/transformer/media-transformer.d.ts +0 -332
- package/dist/transformer/types.d.ts +0 -652
- package/dist/transformer/utils.d.ts +0 -33
- package/dist/transformer/validation-error.d.ts +0 -23
- package/dist/utils/cache.d.ts +0 -32
- package/dist/utils/chunked-upload.d.ts +0 -65
- package/dist/utils/detect-file-type.d.ts +0 -28
- package/dist/utils/errors.d.ts +0 -74
- package/dist/utils/file-path-url-matcher.d.ts +0 -18
- package/dist/utils/headers.d.ts +0 -111
- package/dist/utils/http.d.ts +0 -92
- package/dist/utils/locker.d.ts +0 -26
- package/dist/utils/pipes/stream-checksum.d.ts +0 -47
- package/dist/utils/pipes/stream-length.d.ts +0 -22
- package/dist/utils/primitives/get-last-one.d.ts +0 -3
- package/dist/utils/primitives/is-record.d.ts +0 -2
- package/dist/utils/primitives/map-values.d.ts +0 -9
- package/dist/utils/primitives/pick.d.ts +0 -2
- package/dist/utils/primitives/to-milliseconds.d.ts +0 -12
- package/dist/utils/primitives/to-seconds.d.ts +0 -12
- package/dist/utils/range-checksum.d.ts +0 -33
- package/dist/utils/range-hasher.d.ts +0 -46
- package/dist/utils/retry.d.ts +0 -64
- package/dist/utils/types.d.ts +0 -108
- package/dist/utils/validation-error.d.ts +0 -22
- package/dist/utils/validator.d.ts +0 -36
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
import { c as createHttpError, H as HeaderUtilities } from './headers-C9DasoT1.js';
|
|
2
|
-
import { Metadata } from './Metadata-DRLXeJ0F.js';
|
|
3
|
-
|
|
4
|
-
const TUS_RESUMABLE_VERSION = "1.0.0";
|
|
5
|
-
const TUS_VERSION_VERSION = "1.0.0";
|
|
6
|
-
const parseMetadata = (encoded = "") => {
|
|
7
|
-
const kvPairs = encoded.split(",").map((kv) => kv.split(" "));
|
|
8
|
-
const metadata = Object.create(Metadata.prototype);
|
|
9
|
-
Object.values(kvPairs).forEach(([key, value]) => {
|
|
10
|
-
if (key) {
|
|
11
|
-
metadata[key] = value ? Buffer.from(value, "base64").toString() : "";
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
return metadata;
|
|
15
|
-
};
|
|
16
|
-
const serializeMetadata = (object) => {
|
|
17
|
-
if (!object || Object.keys(object).length === 0) {
|
|
18
|
-
return "";
|
|
19
|
-
}
|
|
20
|
-
return Object.entries(object).map(([key, value]) => {
|
|
21
|
-
if (value === void 0) {
|
|
22
|
-
return key;
|
|
23
|
-
}
|
|
24
|
-
return `${key} ${Buffer.from(String(value)).toString("base64")}`;
|
|
25
|
-
}).toString();
|
|
26
|
-
};
|
|
27
|
-
class TusBase {
|
|
28
|
-
/**
|
|
29
|
-
* Storage instance for file operations.
|
|
30
|
-
*/
|
|
31
|
-
// eslint-disable-next-line class-methods-use-this
|
|
32
|
-
get storage() {
|
|
33
|
-
throw new Error("storage must be implemented");
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Build file URL from request URL and file data.
|
|
37
|
-
* @param _requestUrl Request URL string
|
|
38
|
-
* @param _file File object containing ID
|
|
39
|
-
* @returns Constructed file URL for TUS protocol
|
|
40
|
-
*/
|
|
41
|
-
// eslint-disable-next-line class-methods-use-this
|
|
42
|
-
buildFileUrl(_requestUrl, _file) {
|
|
43
|
-
throw new Error("buildFileUrl must be implemented");
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Handle OPTIONS request with TUS protocol capabilities.
|
|
47
|
-
* @param methods Array of supported HTTP methods
|
|
48
|
-
* @returns ResponseFile with TUS headers
|
|
49
|
-
*/
|
|
50
|
-
handleOptions(methods) {
|
|
51
|
-
const headers = {
|
|
52
|
-
"Access-Control-Allow-Headers": "Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size, Tus-Resumable, Tus-Version, Upload-Concat, Upload-Defer-Length, Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override, X-Requested-With",
|
|
53
|
-
"Access-Control-Allow-Methods": methods.map((method) => method.toUpperCase()).join(", "),
|
|
54
|
-
"Access-Control-Max-Age": 86400,
|
|
55
|
-
"Tus-Checksum-Algorithm": this.storage.checksumTypes.join(","),
|
|
56
|
-
"Tus-Extension": this.storage.tusExtension.toString(),
|
|
57
|
-
"Tus-Max-Size": this.storage.maxUploadSize,
|
|
58
|
-
"Tus-Version": TUS_VERSION_VERSION
|
|
59
|
-
};
|
|
60
|
-
return { headers, statusCode: 204 };
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Handle TUS POST (create upload).
|
|
64
|
-
* @param uploadLength Upload length header value
|
|
65
|
-
* @param uploadDeferLength Upload defer length header value
|
|
66
|
-
* @param uploadConcat Upload concat header value
|
|
67
|
-
* @param metadataHeader Upload metadata header value
|
|
68
|
-
* @param requestUrl Request URL for Location header
|
|
69
|
-
* @param bodyStream Request body stream (for creation-with-upload)
|
|
70
|
-
* @param contentLength Content length (for creation-with-upload)
|
|
71
|
-
* @param contentType Content type (for creation-with-upload)
|
|
72
|
-
* @returns Promise resolving to ResponseFile with upload result
|
|
73
|
-
*/
|
|
74
|
-
async handlePost(uploadLength, uploadDeferLength, uploadConcat, metadataHeader, requestUrl, bodyStream, contentLength, contentType) {
|
|
75
|
-
if (uploadDeferLength !== void 0) {
|
|
76
|
-
if (!this.storage.tusExtension.includes("creation-defer-length")) {
|
|
77
|
-
throw createHttpError(501, "creation-defer-length extension is not (yet) supported.");
|
|
78
|
-
}
|
|
79
|
-
if (uploadLength === void 0) {
|
|
80
|
-
const metadata2 = metadataHeader ? parseMetadata(metadataHeader) : {};
|
|
81
|
-
const config2 = { metadata: metadata2 };
|
|
82
|
-
let file2 = await this.storage.create(config2);
|
|
83
|
-
if (contentType === "application/offset+octet-stream" && contentLength > 0) {
|
|
84
|
-
file2 = await this.storage.write({
|
|
85
|
-
...file2,
|
|
86
|
-
body: bodyStream,
|
|
87
|
-
contentLength,
|
|
88
|
-
start: 0
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
let headers2 = {};
|
|
92
|
-
if (this.storage.tusExtension.includes("expiration") && typeof file2.expiredAt === "number" && file2.size === void 0) {
|
|
93
|
-
headers2 = { "Upload-Expires": new Date(file2.expiredAt).toUTCString() };
|
|
94
|
-
}
|
|
95
|
-
const locationUrl2 = this.buildFileUrl(requestUrl, file2);
|
|
96
|
-
headers2 = { ...headers2, ...this.buildHeaders(file2, { Location: locationUrl2 }) };
|
|
97
|
-
if (!headers2.Location) {
|
|
98
|
-
headers2.Location = locationUrl2;
|
|
99
|
-
}
|
|
100
|
-
if (file2.bytesWritten > 0) {
|
|
101
|
-
headers2["Upload-Offset"] = file2.bytesWritten.toString();
|
|
102
|
-
}
|
|
103
|
-
headers2["Upload-Defer-Length"] = "1";
|
|
104
|
-
const statusCode2 = file2.bytesWritten > 0 ? 200 : 201;
|
|
105
|
-
return { ...file2, headers: headers2, statusCode: statusCode2 };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (uploadConcat) {
|
|
109
|
-
if (!this.storage.tusExtension.includes("concatenation")) {
|
|
110
|
-
throw createHttpError(501, "Concatenation extension is not (yet) supported. Disable parallel upload in the tus client.");
|
|
111
|
-
}
|
|
112
|
-
const parsedMetadata = metadataHeader ? parseMetadata(metadataHeader) : {};
|
|
113
|
-
if (uploadConcat === "partial") {
|
|
114
|
-
const config2 = {
|
|
115
|
-
metadata: { ...parsedMetadata, uploadConcat: "partial" },
|
|
116
|
-
size: uploadLength
|
|
117
|
-
};
|
|
118
|
-
let file2 = await this.storage.create(config2);
|
|
119
|
-
if (contentType === "application/offset+octet-stream" && contentLength > 0) {
|
|
120
|
-
file2 = await this.storage.write({
|
|
121
|
-
...file2,
|
|
122
|
-
body: bodyStream,
|
|
123
|
-
contentLength,
|
|
124
|
-
start: 0
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
let headers2 = {};
|
|
128
|
-
if (this.storage.tusExtension.includes("expiration") && typeof file2.expiredAt === "number" && file2.bytesWritten !== (file2.size ?? 0)) {
|
|
129
|
-
headers2 = { "Upload-Expires": new Date(file2.expiredAt).toUTCString() };
|
|
130
|
-
}
|
|
131
|
-
const locationUrl2 = this.buildFileUrl(requestUrl, file2);
|
|
132
|
-
headers2 = { ...headers2, ...this.buildHeaders(file2, { Location: locationUrl2 }) };
|
|
133
|
-
if (!headers2.Location) {
|
|
134
|
-
headers2.Location = locationUrl2;
|
|
135
|
-
}
|
|
136
|
-
if (file2.bytesWritten > 0) {
|
|
137
|
-
headers2["Upload-Offset"] = file2.bytesWritten.toString();
|
|
138
|
-
}
|
|
139
|
-
headers2["Upload-Concat"] = "partial";
|
|
140
|
-
const statusCode2 = file2.bytesWritten > 0 ? 200 : 201;
|
|
141
|
-
return { ...file2, headers: headers2, statusCode: statusCode2 };
|
|
142
|
-
}
|
|
143
|
-
if (uploadConcat.startsWith("final;")) {
|
|
144
|
-
const partialIds = uploadConcat.slice(6).trim().split(/\s+/).filter(Boolean);
|
|
145
|
-
if (partialIds.length === 0) {
|
|
146
|
-
throw createHttpError(400, "Upload-Concat final must include at least one partial upload ID");
|
|
147
|
-
}
|
|
148
|
-
let totalSize = 0;
|
|
149
|
-
const partialFiles = [];
|
|
150
|
-
for (const partialId of partialIds) {
|
|
151
|
-
try {
|
|
152
|
-
const partialFile = await this.storage.getMeta(partialId);
|
|
153
|
-
await this.storage.checkIfExpired(partialFile);
|
|
154
|
-
if (partialFile.metadata?.uploadConcat !== "partial") {
|
|
155
|
-
throw createHttpError(400, `Upload ${partialId} is not a partial upload`);
|
|
156
|
-
}
|
|
157
|
-
if (partialFile.status !== "completed" || partialFile.size === void 0) {
|
|
158
|
-
throw createHttpError(409, `Partial upload ${partialId} is not completed`);
|
|
159
|
-
}
|
|
160
|
-
partialFiles.push(partialFile);
|
|
161
|
-
totalSize += partialFile.size;
|
|
162
|
-
} catch (error) {
|
|
163
|
-
const errorWithCode = error;
|
|
164
|
-
if (errorWithCode.statusCode === 404 || errorWithCode.statusCode === 410) {
|
|
165
|
-
throw createHttpError(409, `Partial upload ${partialId} not found or expired`);
|
|
166
|
-
}
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const config2 = {
|
|
171
|
-
metadata: {
|
|
172
|
-
...parsedMetadata,
|
|
173
|
-
partialIds,
|
|
174
|
-
uploadConcat: `final;${partialIds.join(" ")}`
|
|
175
|
-
},
|
|
176
|
-
size: totalSize
|
|
177
|
-
};
|
|
178
|
-
const file2 = await this.storage.create(config2);
|
|
179
|
-
await this.concatenateFiles(file2, partialFiles);
|
|
180
|
-
const locationUrl2 = this.buildFileUrl(requestUrl, file2);
|
|
181
|
-
const headers2 = {
|
|
182
|
-
...this.buildHeaders(file2, { Location: locationUrl2 }),
|
|
183
|
-
"Upload-Concat": uploadConcat
|
|
184
|
-
};
|
|
185
|
-
return { ...file2, headers: headers2, statusCode: 201 };
|
|
186
|
-
}
|
|
187
|
-
throw createHttpError(400, "Invalid Upload-Concat header format");
|
|
188
|
-
}
|
|
189
|
-
if (uploadLength === void 0 && uploadDeferLength === void 0) {
|
|
190
|
-
throw createHttpError(400, "Either upload-length or upload-defer-length must be specified.");
|
|
191
|
-
}
|
|
192
|
-
if (uploadLength !== void 0 && Number.isNaN(Number(uploadLength))) {
|
|
193
|
-
throw createHttpError(400, "Invalid upload-length");
|
|
194
|
-
}
|
|
195
|
-
const metadata = metadataHeader ? parseMetadata(metadataHeader) : {};
|
|
196
|
-
const config = { metadata, size: uploadLength };
|
|
197
|
-
let file = await this.storage.create(config);
|
|
198
|
-
if (contentType === "application/offset+octet-stream" && contentLength > 0) {
|
|
199
|
-
file = await this.storage.write({
|
|
200
|
-
...file,
|
|
201
|
-
body: bodyStream,
|
|
202
|
-
contentLength,
|
|
203
|
-
start: 0
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
let headers = {};
|
|
207
|
-
if (this.storage.tusExtension.includes("expiration") && typeof file.expiredAt === "number" && file.bytesWritten !== Number.parseInt(uploadLength, 10)) {
|
|
208
|
-
headers = { "Upload-Expires": new Date(file.expiredAt).toUTCString() };
|
|
209
|
-
}
|
|
210
|
-
const locationUrl = this.buildFileUrl(requestUrl, file);
|
|
211
|
-
headers = { ...headers, ...this.buildHeaders(file, { Location: locationUrl }) };
|
|
212
|
-
if (!headers.Location) {
|
|
213
|
-
headers.Location = locationUrl;
|
|
214
|
-
}
|
|
215
|
-
if (file.bytesWritten > 0) {
|
|
216
|
-
headers["Upload-Offset"] = file.bytesWritten.toString();
|
|
217
|
-
}
|
|
218
|
-
const statusCode = file.bytesWritten > 0 ? 200 : 201;
|
|
219
|
-
return { ...file, headers, statusCode };
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Handle TUS PATCH (write chunk).
|
|
223
|
-
* @param id File ID from URL
|
|
224
|
-
* @param uploadOffset Upload offset header value
|
|
225
|
-
* @param uploadLength Optional upload length header value (for defer-length)
|
|
226
|
-
* @param metadataHeader Optional upload metadata header value
|
|
227
|
-
* @param checksum Optional checksum
|
|
228
|
-
* @param checksumAlgorithm Optional checksum algorithm
|
|
229
|
-
* @param requestUrl Request URL for Location header
|
|
230
|
-
* @param bodyStream Request body stream
|
|
231
|
-
* @param contentLength Content length
|
|
232
|
-
* @returns Promise resolving to ResponseFile with upload progress
|
|
233
|
-
*/
|
|
234
|
-
async handlePatch(id, uploadOffset, uploadLength, metadataHeader, checksum, checksumAlgorithm, _requestUrl, bodyStream, contentLength) {
|
|
235
|
-
const metadata = metadataHeader ? parseMetadata(metadataHeader) : void 0;
|
|
236
|
-
if (metadata) {
|
|
237
|
-
try {
|
|
238
|
-
await this.storage.update({ id }, { id, metadata });
|
|
239
|
-
} catch (error) {
|
|
240
|
-
const errorWithCode = error;
|
|
241
|
-
if (errorWithCode.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
242
|
-
throw createHttpError(410, "Upload expired");
|
|
243
|
-
}
|
|
244
|
-
throw error;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
let currentFile;
|
|
248
|
-
try {
|
|
249
|
-
currentFile = await this.storage.getMeta(id);
|
|
250
|
-
await this.storage.checkIfExpired(currentFile);
|
|
251
|
-
} catch (error) {
|
|
252
|
-
const errorWithCode = error;
|
|
253
|
-
if (errorWithCode.UploadErrorCode === "GONE" || errorWithCode.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
254
|
-
throw createHttpError(410, "Upload expired");
|
|
255
|
-
}
|
|
256
|
-
throw error;
|
|
257
|
-
}
|
|
258
|
-
const uploadConcatValue = currentFile.metadata?.uploadConcat;
|
|
259
|
-
if (typeof uploadConcatValue === "string" && uploadConcatValue.startsWith("final;")) {
|
|
260
|
-
throw createHttpError(403, "Cannot PATCH a final concatenation upload");
|
|
261
|
-
}
|
|
262
|
-
let file = await this.storage.write({
|
|
263
|
-
body: bodyStream,
|
|
264
|
-
checksum,
|
|
265
|
-
checksumAlgorithm,
|
|
266
|
-
contentLength,
|
|
267
|
-
id,
|
|
268
|
-
start: uploadOffset
|
|
269
|
-
});
|
|
270
|
-
if (uploadLength !== void 0) {
|
|
271
|
-
if (!this.storage.tusExtension.includes("creation-defer-length")) {
|
|
272
|
-
throw createHttpError(501, "creation-defer-length extension is not (yet) supported.");
|
|
273
|
-
}
|
|
274
|
-
if (file.size !== void 0 && !Number.isNaN(file.size)) {
|
|
275
|
-
throw createHttpError(412, "Upload-Length has already been set for this upload");
|
|
276
|
-
}
|
|
277
|
-
const size = Number.parseInt(uploadLength, 10);
|
|
278
|
-
if (Number.isNaN(size)) {
|
|
279
|
-
throw createHttpError(400, "Invalid Upload-Length value");
|
|
280
|
-
}
|
|
281
|
-
if (size < file.bytesWritten) {
|
|
282
|
-
throw createHttpError(400, "Upload-Length is smaller than the current offset");
|
|
283
|
-
}
|
|
284
|
-
file = await this.storage.update({ id }, { size });
|
|
285
|
-
if (file.bytesWritten === file.size) {
|
|
286
|
-
file = { ...file, status: "completed" };
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
return {
|
|
290
|
-
...file,
|
|
291
|
-
headers: this.buildHeaders(file, {
|
|
292
|
-
"Upload-Offset": file.bytesWritten
|
|
293
|
-
}),
|
|
294
|
-
statusCode: file.status === "completed" ? 200 : 204
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Handle TUS HEAD (get upload status).
|
|
299
|
-
* @param id File ID from URL
|
|
300
|
-
* @returns Promise resolving to ResponseFile with upload status headers
|
|
301
|
-
*/
|
|
302
|
-
async handleHead(id) {
|
|
303
|
-
const file = await this.storage.getMeta(id);
|
|
304
|
-
await this.storage.checkIfExpired(file);
|
|
305
|
-
const headers = {
|
|
306
|
-
...typeof file.size === "number" && !Number.isNaN(file.size) ? {
|
|
307
|
-
"Upload-Length": file.size
|
|
308
|
-
} : {
|
|
309
|
-
"Upload-Defer-Length": "1"
|
|
310
|
-
},
|
|
311
|
-
...this.buildHeaders(file, {
|
|
312
|
-
"Cache-Control": HeaderUtilities.createCacheControlPreset("no-store"),
|
|
313
|
-
"Upload-Metadata": serializeMetadata(file.metadata),
|
|
314
|
-
"Upload-Offset": file.bytesWritten
|
|
315
|
-
})
|
|
316
|
-
};
|
|
317
|
-
const uploadConcatValue = file.metadata?.uploadConcat;
|
|
318
|
-
if (typeof uploadConcatValue === "string") {
|
|
319
|
-
headers["Upload-Concat"] = uploadConcatValue;
|
|
320
|
-
}
|
|
321
|
-
return { headers, statusCode: 200 };
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Handle TUS GET (get upload metadata).
|
|
325
|
-
* @param id File ID from URL
|
|
326
|
-
* @returns Promise resolving to ResponseFile with file metadata as JSON
|
|
327
|
-
*/
|
|
328
|
-
async handleGet(id) {
|
|
329
|
-
const file = await this.storage.getMeta(id);
|
|
330
|
-
return {
|
|
331
|
-
...file,
|
|
332
|
-
body: file,
|
|
333
|
-
// Return file metadata as JSON
|
|
334
|
-
headers: this.buildHeaders(file, {
|
|
335
|
-
"Content-Type": HeaderUtilities.createContentType({
|
|
336
|
-
mediaType: "application/json"
|
|
337
|
-
})
|
|
338
|
-
}),
|
|
339
|
-
statusCode: 200
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Handle TUS DELETE (terminate upload).
|
|
344
|
-
* @param id File ID from URL
|
|
345
|
-
* @returns Promise resolving to ResponseFile with deletion confirmation
|
|
346
|
-
*/
|
|
347
|
-
async handleDelete(id) {
|
|
348
|
-
if (this.disableTerminationForFinishedUploads) {
|
|
349
|
-
const file2 = await this.storage.getMeta(id);
|
|
350
|
-
if (file2.status === "completed") {
|
|
351
|
-
throw createHttpError(400, "Termination of finished uploads is disabled");
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
const file = await this.storage.delete({ id });
|
|
355
|
-
if (file.status === void 0) {
|
|
356
|
-
throw createHttpError(404, "File not found");
|
|
357
|
-
}
|
|
358
|
-
return {
|
|
359
|
-
...file,
|
|
360
|
-
headers: this.buildHeaders(file),
|
|
361
|
-
statusCode: 204
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Build TUS protocol headers including required Tus-Resumable and optional Upload-Expires.
|
|
366
|
-
* @param file Upload file object with metadata
|
|
367
|
-
* @param headers Additional headers to include
|
|
368
|
-
* @returns Headers object with TUS protocol headers
|
|
369
|
-
*/
|
|
370
|
-
buildHeaders(file, headers = {}) {
|
|
371
|
-
headers["Tus-Resumable"] = TUS_RESUMABLE_VERSION;
|
|
372
|
-
if (this.storage.tusExtension.includes("expiration") && file.expiredAt !== void 0) {
|
|
373
|
-
headers["Upload-Expires"] = new Date(file.expiredAt).toUTCString();
|
|
374
|
-
}
|
|
375
|
-
return headers;
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Extract checksum algorithm and value from Upload-Checksum header.
|
|
379
|
-
* @param checksumHeader Upload-Checksum header value
|
|
380
|
-
* @returns Object containing checksum algorithm and value
|
|
381
|
-
*/
|
|
382
|
-
// eslint-disable-next-line class-methods-use-this
|
|
383
|
-
extractChecksum(checksumHeader) {
|
|
384
|
-
if (!checksumHeader) {
|
|
385
|
-
return { checksum: void 0, checksumAlgorithm: void 0 };
|
|
386
|
-
}
|
|
387
|
-
const [checksumAlgorithm, checksum] = checksumHeader.split(/\s+/).filter(Boolean);
|
|
388
|
-
return { checksum, checksumAlgorithm };
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Validate Tus-Resumable header value.
|
|
392
|
-
* @param tusResumable Tus-Resumable header value
|
|
393
|
-
* @throws {Error} 412 if version doesn't match or header is missing
|
|
394
|
-
*/
|
|
395
|
-
// eslint-disable-next-line class-methods-use-this
|
|
396
|
-
validateTusResumableHeader(tusResumable) {
|
|
397
|
-
if (!tusResumable) {
|
|
398
|
-
throw createHttpError(412, "Missing Tus-Resumable header");
|
|
399
|
-
}
|
|
400
|
-
if (tusResumable !== TUS_RESUMABLE_VERSION) {
|
|
401
|
-
throw createHttpError(412, `Unsupported TUS version: ${tusResumable}. Server supports: ${TUS_RESUMABLE_VERSION}`);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Concatenate partial uploads into a final upload.
|
|
406
|
-
* @param finalFile Final file that will contain concatenated content
|
|
407
|
-
* @param partialFiles Array of partial upload files to concatenate
|
|
408
|
-
* @returns Promise resolving when concatenation is complete
|
|
409
|
-
*/
|
|
410
|
-
async concatenateFiles(finalFile, partialFiles) {
|
|
411
|
-
let offset = 0;
|
|
412
|
-
for (const partialFile of partialFiles) {
|
|
413
|
-
if (!this.storage.getStream) {
|
|
414
|
-
throw createHttpError(501, "getStream is not supported by this storage backend");
|
|
415
|
-
}
|
|
416
|
-
const { size, stream } = await this.storage.getStream({ id: partialFile.id });
|
|
417
|
-
if (size === void 0) {
|
|
418
|
-
throw createHttpError(500, "Partial upload size is undefined");
|
|
419
|
-
}
|
|
420
|
-
const updatedFile = await this.storage.write({
|
|
421
|
-
...finalFile,
|
|
422
|
-
body: stream,
|
|
423
|
-
contentLength: size,
|
|
424
|
-
start: offset
|
|
425
|
-
});
|
|
426
|
-
Object.assign(finalFile, updatedFile);
|
|
427
|
-
offset += size;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
const TUS_RESUMABLE = TUS_RESUMABLE_VERSION;
|
|
432
|
-
const TUS_VERSION = TUS_VERSION_VERSION;
|
|
433
|
-
|
|
434
|
-
export { TUS_RESUMABLE, TUS_VERSION, TusBase, parseMetadata, serializeMetadata };
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { c as createHttpError } from './headers-C9DasoT1.js';
|
|
2
|
-
import { B as BaseHandlerFetch } from './base-handler-fetch-A7V0N6AJ.js';
|
|
3
|
-
import { TusBase } from './TUS_RESUMABLE-BfguFdM1.js';
|
|
4
|
-
export { TUS_RESUMABLE, TUS_VERSION } from './TUS_RESUMABLE-BfguFdM1.js';
|
|
5
|
-
|
|
6
|
-
const getIdFromRequestUrl = (url) => {
|
|
7
|
-
try {
|
|
8
|
-
const urlObject = new URL(url);
|
|
9
|
-
const pathParts = urlObject.pathname.split("/").filter(Boolean);
|
|
10
|
-
return pathParts[pathParts.length - 1] || void 0;
|
|
11
|
-
} catch {
|
|
12
|
-
return void 0;
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
class Tus extends BaseHandlerFetch {
|
|
16
|
-
/**
|
|
17
|
-
* Limiting enabled http method handler
|
|
18
|
-
*/
|
|
19
|
-
static methods = ["delete", "download", "get", "head", "options", "patch", "post"];
|
|
20
|
-
tusBase;
|
|
21
|
-
constructor(options) {
|
|
22
|
-
super(options);
|
|
23
|
-
this.disableTerminationForFinishedUploads = options.disableTerminationForFinishedUploads ?? false;
|
|
24
|
-
const tusInstance = this;
|
|
25
|
-
this.tusBase = new class extends TusBase {
|
|
26
|
-
// eslint-disable-next-line class-methods-use-this
|
|
27
|
-
get storage() {
|
|
28
|
-
return tusInstance.storage;
|
|
29
|
-
}
|
|
30
|
-
// eslint-disable-next-line class-methods-use-this
|
|
31
|
-
get disableTerminationForFinishedUploads() {
|
|
32
|
-
return tusInstance.disableTerminationForFinishedUploads ?? false;
|
|
33
|
-
}
|
|
34
|
-
// eslint-disable-next-line class-methods-use-this
|
|
35
|
-
buildFileUrl(requestUrl, file) {
|
|
36
|
-
return tusInstance.buildFileUrlForTus(requestUrl, file);
|
|
37
|
-
}
|
|
38
|
-
}();
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Handle OPTIONS requests with TUS protocol capabilities.
|
|
42
|
-
* @returns Promise resolving to ResponseFile with TUS headers
|
|
43
|
-
*/
|
|
44
|
-
async options() {
|
|
45
|
-
return this.tusBase.handleOptions(Tus.methods);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Creates a new TUS upload and optionally starts uploading data.
|
|
49
|
-
* @param request Web API Request with TUS headers.
|
|
50
|
-
* @returns Promise resolving to ResponseFile with upload location and offset.
|
|
51
|
-
*/
|
|
52
|
-
async post(request) {
|
|
53
|
-
const tusResumable = request.headers.get("tus-resumable");
|
|
54
|
-
this.tusBase.validateTusResumableHeader(tusResumable || void 0);
|
|
55
|
-
const uploadLength = request.headers.get("upload-length") || void 0;
|
|
56
|
-
const uploadDeferLength = request.headers.get("upload-defer-length") || void 0;
|
|
57
|
-
const uploadConcat = request.headers.get("upload-concat") || void 0;
|
|
58
|
-
const metadataHeader = request.headers.get("upload-metadata") || void 0;
|
|
59
|
-
const contentType = request.headers.get("content-type") || "";
|
|
60
|
-
const contentLengthHeader = request.headers.get("content-length");
|
|
61
|
-
const contentLength = contentLengthHeader ? Number.parseInt(contentLengthHeader, 10) : 0;
|
|
62
|
-
const requestUrl = request.url;
|
|
63
|
-
const bodyStream = request.body;
|
|
64
|
-
return this.tusBase.handlePost(uploadLength, uploadDeferLength, uploadConcat, metadataHeader, requestUrl, bodyStream, contentLength, contentType);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Write a chunk of data to an existing TUS upload.
|
|
68
|
-
* @param request Web API Request with chunk data and TUS headers
|
|
69
|
-
* @returns Promise resolving to ResponseFile with updated offset
|
|
70
|
-
*/
|
|
71
|
-
async patch(request) {
|
|
72
|
-
const tusResumable = request.headers.get("tus-resumable");
|
|
73
|
-
this.tusBase.validateTusResumableHeader(tusResumable || void 0);
|
|
74
|
-
const id = getIdFromRequestUrl(request.url);
|
|
75
|
-
if (!id) {
|
|
76
|
-
throw createHttpError(404, "File not found");
|
|
77
|
-
}
|
|
78
|
-
const uploadOffsetHeader = request.headers.get("upload-offset");
|
|
79
|
-
if (!uploadOffsetHeader) {
|
|
80
|
-
throw createHttpError(412, "Missing Upload-Offset header");
|
|
81
|
-
}
|
|
82
|
-
const contentType = request.headers.get("content-type");
|
|
83
|
-
if (!contentType) {
|
|
84
|
-
throw createHttpError(412, "Content-Type header required");
|
|
85
|
-
}
|
|
86
|
-
if (contentType !== "application/offset+octet-stream") {
|
|
87
|
-
throw createHttpError(415, "Unsupported Media Type");
|
|
88
|
-
}
|
|
89
|
-
const uploadOffset = Number.parseInt(uploadOffsetHeader, 10);
|
|
90
|
-
const uploadLength = request.headers.get("upload-length") || void 0;
|
|
91
|
-
const metadataHeader = request.headers.get("upload-metadata") || void 0;
|
|
92
|
-
const contentLengthHeader = request.headers.get("content-length");
|
|
93
|
-
const contentLength = contentLengthHeader ? Number.parseInt(contentLengthHeader, 10) : 0;
|
|
94
|
-
const checksumHeader = request.headers.get("upload-checksum") || void 0;
|
|
95
|
-
const { checksum, checksumAlgorithm } = this.tusBase.extractChecksum(checksumHeader);
|
|
96
|
-
const requestUrl = request.url;
|
|
97
|
-
const bodyStream = request.body;
|
|
98
|
-
try {
|
|
99
|
-
return this.tusBase.handlePatch(id, uploadOffset, uploadLength, metadataHeader, checksum, checksumAlgorithm, requestUrl, bodyStream, contentLength);
|
|
100
|
-
} catch (error) {
|
|
101
|
-
const errorWithCode = error;
|
|
102
|
-
if (errorWithCode.UploadErrorCode === "GONE" || errorWithCode.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
103
|
-
throw createHttpError(410, "Upload expired");
|
|
104
|
-
}
|
|
105
|
-
throw error;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Get current upload offset and metadata for TUS resumable uploads.
|
|
110
|
-
* @param request Web API Request with upload ID
|
|
111
|
-
* @returns Promise resolving to ResponseFile with upload-offset and metadata headers
|
|
112
|
-
*/
|
|
113
|
-
async head(request) {
|
|
114
|
-
const tusResumable = request.headers.get("tus-resumable");
|
|
115
|
-
this.tusBase.validateTusResumableHeader(tusResumable || void 0);
|
|
116
|
-
const id = getIdFromRequestUrl(request.url);
|
|
117
|
-
if (!id) {
|
|
118
|
-
throw createHttpError(404, "File not found");
|
|
119
|
-
}
|
|
120
|
-
try {
|
|
121
|
-
return this.tusBase.handleHead(id);
|
|
122
|
-
} catch (error) {
|
|
123
|
-
const errorWithCode = error;
|
|
124
|
-
if (errorWithCode.UploadErrorCode === "GONE" || errorWithCode.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
125
|
-
throw createHttpError(410, "Upload expired");
|
|
126
|
-
}
|
|
127
|
-
throw error;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Get TUS upload metadata and current status.
|
|
132
|
-
* @param request Web API Request with upload ID
|
|
133
|
-
* @returns Promise resolving to ResponseFile with file metadata as JSON
|
|
134
|
-
*/
|
|
135
|
-
async get(request) {
|
|
136
|
-
const tusResumable = request.headers.get("tus-resumable");
|
|
137
|
-
this.tusBase.validateTusResumableHeader(tusResumable || void 0);
|
|
138
|
-
const id = getIdFromRequestUrl(request.url);
|
|
139
|
-
if (!id) {
|
|
140
|
-
throw createHttpError(404, "File not found");
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
return this.tusBase.handleGet(id);
|
|
144
|
-
} catch (error) {
|
|
145
|
-
const errorWithCode = error;
|
|
146
|
-
if (errorWithCode.UploadErrorCode === "GONE") {
|
|
147
|
-
throw createHttpError(410, "Upload expired");
|
|
148
|
-
}
|
|
149
|
-
throw error;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Delete a TUS upload and its associated data.
|
|
154
|
-
* @param request Web API Request with upload ID
|
|
155
|
-
* @returns Promise resolving to ResponseFile with deletion confirmation
|
|
156
|
-
*/
|
|
157
|
-
async delete(request) {
|
|
158
|
-
const tusResumable = request.headers.get("tus-resumable");
|
|
159
|
-
this.tusBase.validateTusResumableHeader(tusResumable || void 0);
|
|
160
|
-
const id = getIdFromRequestUrl(request.url);
|
|
161
|
-
if (!id) {
|
|
162
|
-
throw createHttpError(404, "File not found");
|
|
163
|
-
}
|
|
164
|
-
try {
|
|
165
|
-
return this.tusBase.handleDelete(id);
|
|
166
|
-
} catch (error) {
|
|
167
|
-
const errorWithCode = error;
|
|
168
|
-
if (errorWithCode.code === "ENOENT") {
|
|
169
|
-
throw createHttpError(404, "File not found");
|
|
170
|
-
}
|
|
171
|
-
throw error;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Compose and register HTTP method handlers.
|
|
176
|
-
*/
|
|
177
|
-
compose() {
|
|
178
|
-
this.registeredHandlers.set("POST", this.post.bind(this));
|
|
179
|
-
this.registeredHandlers.set("PATCH", this.patch.bind(this));
|
|
180
|
-
this.registeredHandlers.set("HEAD", this.head.bind(this));
|
|
181
|
-
this.registeredHandlers.set("GET", this.get.bind(this));
|
|
182
|
-
this.registeredHandlers.set("DELETE", this.delete.bind(this));
|
|
183
|
-
this.registeredHandlers.set("OPTIONS", this.options.bind(this));
|
|
184
|
-
this.logger?.debug("Registered handler: %s", [...this.registeredHandlers.keys()].join(", "));
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Build file URL for TUS uploads (without file extension).
|
|
188
|
-
* @param requestUrl Request URL string
|
|
189
|
-
* @param file File object containing ID
|
|
190
|
-
* @returns Constructed file URL for TUS protocol
|
|
191
|
-
*/
|
|
192
|
-
buildFileUrlForTus(requestUrl, file) {
|
|
193
|
-
const url = new URL(requestUrl);
|
|
194
|
-
const { pathname, search } = url;
|
|
195
|
-
const relative = `${pathname}/${file.id}${search}`;
|
|
196
|
-
return this.storage.config.useRelativeLocation ? relative : url.origin + relative;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export { Tus };
|