@visulima/storage 1.0.0-alpha.9 → 1.0.1
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 +562 -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-CiPEMcuo.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-BK-WPL0h.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-1UvDIQZd.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-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/BoxStorage-DbGqBLux.js +1 -0
- package/dist/packem_shared/BunS3File-BcYmsz1n.js +1 -0
- package/dist/packem_shared/BunS3MetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/BunS3Storage-DNvimm9e.js +1 -0
- package/dist/packem_shared/BunnyFile-BgEOlcYI.js +1 -0
- package/dist/packem_shared/BunnyMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/BunnyStorage-C7d0opLL.js +1 -0
- package/dist/packem_shared/CloudinaryFile-Bo5B-vM1.js +1 -0
- package/dist/packem_shared/CloudinaryMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/CloudinaryStorage-Dc3XA2lP.js +1 -0
- package/dist/packem_shared/DiskStorage-CI07TVNu.js +1 -0
- package/dist/packem_shared/DiskStorageWithChecksum-vFCubS6K.js +1 -0
- package/dist/packem_shared/DropboxFile-BFb7eOzy.js +1 -0
- package/dist/packem_shared/DropboxMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/DropboxStorage-CY9Ggu3m.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-CpIcMjP0.js +1 -0
- package/dist/packem_shared/FirebaseFile-BLaBxa2A.js +1 -0
- package/dist/packem_shared/FirebaseMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/FirebaseStorage-D6O9CJXN.js +2 -0
- package/dist/packem_shared/FtpFile-ClWDYnt2.js +1 -0
- package/dist/packem_shared/FtpMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/FtpStorage-DbEjbq8z.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-BuPA0DDW.js +1 -0
- package/dist/packem_shared/GCStorage-i9t5TQc1.js +1 -0
- package/dist/packem_shared/GoogleDriveFile-DHpLhzg9.js +1 -0
- package/dist/packem_shared/GoogleDriveMetaStorage-Cbwa1CHV.js +1 -0
- package/dist/packem_shared/GoogleDriveStorage-Bklsz7Bh.js +1 -0
- package/dist/packem_shared/LocalMetaStorage-BhicZnNl.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-9gbWd09l.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-CQjYqU--.js +1 -0
- package/dist/packem_shared/Multipart-D0ok6BBy.js +1 -0
- package/dist/packem_shared/NetlifyBlobFile-DoFhkzaH.js +1 -0
- package/dist/packem_shared/NetlifyBlobMetaStorage-DPVnmNe5.js +1 -0
- package/dist/packem_shared/NetlifyBlobStorage-CkpCCoN1.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-Cbwa1CHV.js +1 -0
- package/dist/packem_shared/OneDriveStorage-CP6MvGAa.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-DOTLwVE7.js +1 -0
- package/dist/packem_shared/PocketBaseStorage-2qhbI2PW.js +1 -0
- package/dist/packem_shared/Rest-CI_BiZPv.js +1 -0
- package/dist/packem_shared/Rest-DvfN4-kf.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-YGeNk3Tt.js +1 -0
- package/dist/packem_shared/SftpFile-ClWDYnt2.js +1 -0
- package/dist/packem_shared/SftpMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/SftpStorage-2Hz396Xr.js +1 -0
- package/dist/packem_shared/SharePointFile-Blz9FS4h.js +1 -0
- package/dist/packem_shared/SharePointMetaStorage-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/SharePointStorage-CrX2Pk6C.js +1 -0
- package/dist/packem_shared/SupabaseFile-Bo5B-vM1.js +1 -0
- package/dist/packem_shared/SupabaseMetaStorage-Cbwa1CHV.js +1 -0
- package/dist/packem_shared/SupabaseStorage-Dc_DBX29.js +1 -0
- package/dist/packem_shared/TUS_RESUMABLE-CyTSRvPU.js +1 -0
- package/dist/packem_shared/Tus-BBVt2ky3.js +1 -0
- package/dist/packem_shared/Tus-BlBZykIL.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-DPVnmNe5.js +1 -0
- package/dist/packem_shared/UploadThingStorage-BChykYSe.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-BSn6Qfnf.js +1 -0
- package/dist/packem_shared/VercelBlobStorage-CsRyPfw3.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-D-9Ku1h-.js +1 -0
- package/dist/packem_shared/base-handler-fetch-CfkNakv8.js +1 -0
- package/dist/packem_shared/base-handler-node-BF1v1qDa.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-CsQcYW3s.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-B1RrMqH3.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-iuJnu90B.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-DvWvbDbh.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-e0reNDE_.js +1 -0
- package/dist/packem_shared/restOpenApiSpec-Csv513qf.js +1 -0
- package/dist/packem_shared/s3-base-storage-BoTyhuzO.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-0j5nCAUp.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 +218 -67
- 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-Ck5yGQsq.js +0 -12
- package/dist/packem_shared/DiskStorageWithChecksum-BRl-V5x2.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-CHZKMe7N.js +0 -7
- package/dist/packem_shared/GCStorage-C-gAuP0j.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-CRV21AUU.js +0 -128
- package/dist/packem_shared/Multipart-D2ryPMjD.js +0 -163
- 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-DcxBMBjU.js +0 -228
- package/dist/packem_shared/Rest-DjwU3puo.js +0 -267
- 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-Dtfsffnj.js +0 -434
- package/dist/packem_shared/Tus-DFVlZHaX.js +0 -200
- package/dist/packem_shared/Tus-DaN0FmOy.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-BqLXS_qQ.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-BoAqTyz7.js +0 -303
- package/dist/packem_shared/base-handler-fetch-D4u2xits.js +0 -291
- package/dist/packem_shared/base-handler-node-DGzcHHAy.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-CD47QI30.js +0 -810
- package/dist/packem_shared/gcs-meta-storage-CJ8Uts_d.js +0 -158
- package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
- package/dist/packem_shared/headers-YLRp1dLo.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-C994naBi.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-D9URIFkc.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,195 +0,0 @@
|
|
|
1
|
-
import { format } from 'node:url';
|
|
2
|
-
import { c as createHttpError } from './headers-YLRp1dLo.js';
|
|
3
|
-
import { a as getHeader, b as getRequestStream, g as getIdFromRequest, c as getBaseUrl } from './base-handler-core-BoAqTyz7.js';
|
|
4
|
-
import { B as BaseHandlerNode } from './base-handler-node-DGzcHHAy.js';
|
|
5
|
-
import { TusBase } from './TUS_RESUMABLE-Dtfsffnj.js';
|
|
6
|
-
export { TUS_RESUMABLE, TUS_VERSION } from './TUS_RESUMABLE-Dtfsffnj.js';
|
|
7
|
-
|
|
8
|
-
class Tus extends BaseHandlerNode {
|
|
9
|
-
/**
|
|
10
|
-
* Limiting enabled http method handler
|
|
11
|
-
*/
|
|
12
|
-
static methods = ["delete", "download", "get", "head", "options", "patch", "post"];
|
|
13
|
-
disableTerminationForFinishedUploads = false;
|
|
14
|
-
tusBase;
|
|
15
|
-
constructor(options) {
|
|
16
|
-
super(options);
|
|
17
|
-
this.disableTerminationForFinishedUploads = options.disableTerminationForFinishedUploads ?? false;
|
|
18
|
-
const tusInstance = this;
|
|
19
|
-
this.tusBase = new class extends TusBase {
|
|
20
|
-
// eslint-disable-next-line class-methods-use-this
|
|
21
|
-
get storage() {
|
|
22
|
-
return tusInstance.storage;
|
|
23
|
-
}
|
|
24
|
-
// eslint-disable-next-line class-methods-use-this
|
|
25
|
-
get disableTerminationForFinishedUploads() {
|
|
26
|
-
return tusInstance.disableTerminationForFinishedUploads;
|
|
27
|
-
}
|
|
28
|
-
// eslint-disable-next-line class-methods-use-this
|
|
29
|
-
buildFileUrl(requestUrl, file) {
|
|
30
|
-
return tusInstance.buildFileUrlForTus(requestUrl, file);
|
|
31
|
-
}
|
|
32
|
-
}();
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Handle OPTIONS requests with TUS protocol capabilities.
|
|
36
|
-
* @returns Promise resolving to ResponseFile with TUS headers
|
|
37
|
-
*/
|
|
38
|
-
async options() {
|
|
39
|
-
return this.tusBase.handleOptions(Tus.methods);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Creates a new TUS upload and optionally starts uploading data.
|
|
43
|
-
* @param request Node.js IncomingMessage with TUS headers.
|
|
44
|
-
* @returns Promise resolving to ResponseFile with upload location and offset.
|
|
45
|
-
*/
|
|
46
|
-
async post(request) {
|
|
47
|
-
this.tusBase.validateTusResumableHeader(getHeader(request, "tus-resumable"));
|
|
48
|
-
const uploadLength = request.headers["upload-length"];
|
|
49
|
-
const uploadDeferLength = request.headers["upload-defer-length"];
|
|
50
|
-
const uploadConcat = request.headers["upload-concat"];
|
|
51
|
-
const metadataHeader = getHeader(request, "upload-metadata", true);
|
|
52
|
-
const contentType = getHeader(request, "content-type") || "";
|
|
53
|
-
const contentLength = Number.parseInt(getHeader(request, "content-length") || "0", 10);
|
|
54
|
-
const requestUrl = request.originalUrl || request.url;
|
|
55
|
-
const bodyStream = getRequestStream(request);
|
|
56
|
-
return this.tusBase.handlePost(uploadLength, uploadDeferLength, uploadConcat, metadataHeader, requestUrl, bodyStream, contentLength, contentType);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Write a chunk of data to an existing TUS upload.
|
|
60
|
-
* @param request Node.js IncomingMessage with chunk data and TUS headers
|
|
61
|
-
* @returns Promise resolving to ResponseFile with updated offset
|
|
62
|
-
*/
|
|
63
|
-
async patch(request) {
|
|
64
|
-
this.tusBase.validateTusResumableHeader(getHeader(request, "tus-resumable"));
|
|
65
|
-
try {
|
|
66
|
-
const id = getIdFromRequest(request);
|
|
67
|
-
if (request.headers["upload-offset"] === void 0) {
|
|
68
|
-
throw createHttpError(412, "Missing Upload-Offset header");
|
|
69
|
-
}
|
|
70
|
-
if (request.headers["content-type"] === void 0) {
|
|
71
|
-
throw createHttpError(412, "Content-Type header required");
|
|
72
|
-
}
|
|
73
|
-
if (request.headers["content-type"] !== "application/offset+octet-stream") {
|
|
74
|
-
throw createHttpError(415, "Unsupported Media Type");
|
|
75
|
-
}
|
|
76
|
-
const uploadOffset = Number.parseInt(getHeader(request, "upload-offset"), 10);
|
|
77
|
-
const uploadLength = request.headers["upload-length"];
|
|
78
|
-
const metadataHeader = getHeader(request, "upload-metadata", true);
|
|
79
|
-
const contentLength = Number(getHeader(request, "content-length"));
|
|
80
|
-
const checksumHeader = getHeader(request, "upload-checksum");
|
|
81
|
-
const { checksum, checksumAlgorithm } = this.tusBase.extractChecksum(checksumHeader);
|
|
82
|
-
const requestUrl = request.originalUrl || request.url;
|
|
83
|
-
const bodyStream = getRequestStream(request);
|
|
84
|
-
return this.tusBase.handlePatch(id, uploadOffset, uploadLength, metadataHeader, checksum, checksumAlgorithm, requestUrl, bodyStream, contentLength);
|
|
85
|
-
} catch (error) {
|
|
86
|
-
this.checkForUndefinedIdOrPath(error);
|
|
87
|
-
const errorWithCode = error;
|
|
88
|
-
if (errorWithCode.UploadErrorCode === "GONE" || errorWithCode.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
89
|
-
throw createHttpError(410, "Upload expired");
|
|
90
|
-
}
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Get current upload offset and metadata for TUS resumable uploads.
|
|
96
|
-
* @param request Node.js IncomingMessage with upload ID
|
|
97
|
-
* @returns Promise resolving to ResponseFile with upload-offset and metadata headers
|
|
98
|
-
*/
|
|
99
|
-
async head(request) {
|
|
100
|
-
this.tusBase.validateTusResumableHeader(getHeader(request, "tus-resumable"));
|
|
101
|
-
try {
|
|
102
|
-
const id = getIdFromRequest(request);
|
|
103
|
-
return this.tusBase.handleHead(id);
|
|
104
|
-
} catch (error) {
|
|
105
|
-
this.checkForUndefinedIdOrPath(error);
|
|
106
|
-
const errorWithCode = error;
|
|
107
|
-
if (errorWithCode.UploadErrorCode === "GONE" || errorWithCode.UploadErrorCode === "FILE_NOT_FOUND") {
|
|
108
|
-
throw createHttpError(410, "Upload expired");
|
|
109
|
-
}
|
|
110
|
-
throw error;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Get TUS upload metadata and current status.
|
|
115
|
-
* @param request Node.js IncomingMessage with upload ID
|
|
116
|
-
* @returns Promise resolving to ResponseFile with file metadata as JSON
|
|
117
|
-
*/
|
|
118
|
-
async get(request) {
|
|
119
|
-
this.tusBase.validateTusResumableHeader(getHeader(request, "tus-resumable"));
|
|
120
|
-
try {
|
|
121
|
-
const id = getIdFromRequest(request);
|
|
122
|
-
return this.tusBase.handleGet(id);
|
|
123
|
-
} catch (error) {
|
|
124
|
-
this.checkForUndefinedIdOrPath(error);
|
|
125
|
-
const errorWithCode = error;
|
|
126
|
-
if (errorWithCode.UploadErrorCode === "GONE") {
|
|
127
|
-
throw createHttpError(410, "Upload expired");
|
|
128
|
-
}
|
|
129
|
-
throw error;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Delete a TUS upload and its associated data.
|
|
134
|
-
* @param request Node.js IncomingMessage with upload ID
|
|
135
|
-
* @returns Promise resolving to ResponseFile with deletion confirmation
|
|
136
|
-
*/
|
|
137
|
-
async delete(request) {
|
|
138
|
-
this.tusBase.validateTusResumableHeader(getHeader(request, "tus-resumable"));
|
|
139
|
-
try {
|
|
140
|
-
const id = getIdFromRequest(request);
|
|
141
|
-
return this.tusBase.handleDelete(id);
|
|
142
|
-
} catch (error) {
|
|
143
|
-
this.checkForUndefinedIdOrPath(error);
|
|
144
|
-
const errorWithCode = error;
|
|
145
|
-
if (errorWithCode.code === "ENOENT") {
|
|
146
|
-
throw createHttpError(404, "File not found");
|
|
147
|
-
}
|
|
148
|
-
throw error;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Send TUS protocol response with required headers.
|
|
153
|
-
* @param response Node.js ServerResponse to send response to
|
|
154
|
-
* @param uploadResponse Response data with body, headers, and status code
|
|
155
|
-
*/
|
|
156
|
-
send(response, { body = "", headers = {}, statusCode = 200 }) {
|
|
157
|
-
const uploadResponse = {
|
|
158
|
-
body,
|
|
159
|
-
headers: {
|
|
160
|
-
...headers,
|
|
161
|
-
"Access-Control-Expose-Headers": "location,upload-expires,upload-offset,upload-length,upload-metadata,upload-defer-length,tus-resumable,tus-extension,tus-max-size,tus-version,tus-checksum-algorithm,cache-control",
|
|
162
|
-
"Tus-Resumable": "1.0.0"
|
|
163
|
-
},
|
|
164
|
-
statusCode: statusCode || 200
|
|
165
|
-
};
|
|
166
|
-
super.send(response, uploadResponse);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Compose and register HTTP method handlers.
|
|
170
|
-
*/
|
|
171
|
-
compose() {
|
|
172
|
-
this.registeredHandlers.set("POST", this.post.bind(this));
|
|
173
|
-
this.registeredHandlers.set("PATCH", this.patch.bind(this));
|
|
174
|
-
this.registeredHandlers.set("HEAD", this.head.bind(this));
|
|
175
|
-
this.registeredHandlers.set("GET", this.get.bind(this));
|
|
176
|
-
this.registeredHandlers.set("DELETE", this.delete.bind(this));
|
|
177
|
-
this.registeredHandlers.set("OPTIONS", this.options.bind(this));
|
|
178
|
-
this.logger?.debug("Registered handler: %s", [...this.registeredHandlers.keys()].join(", "));
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Build file URL for TUS uploads (without file extension).
|
|
182
|
-
* @param requestUrl Request URL string
|
|
183
|
-
* @param file File object containing ID
|
|
184
|
-
* @returns Constructed file URL for TUS protocol
|
|
185
|
-
*/
|
|
186
|
-
buildFileUrlForTus(requestUrl, file) {
|
|
187
|
-
const url = new URL(requestUrl, "http://localhost");
|
|
188
|
-
const { pathname } = url;
|
|
189
|
-
const query = Object.fromEntries(url.searchParams.entries());
|
|
190
|
-
const relative = format({ pathname: `${pathname}/${file.id}`, query });
|
|
191
|
-
return `${this.storage.config.useRelativeLocation ? relative : getBaseUrl({ }) + relative}`;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export { Tus };
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
class ValidationError extends Error {
|
|
2
|
-
code;
|
|
3
|
-
details;
|
|
4
|
-
/**
|
|
5
|
-
* Creates a new ValidationError instance with detailed error information.
|
|
6
|
-
* @param message Human-readable error message describing the validation failure
|
|
7
|
-
* @param code Machine-readable error code for programmatic error handling
|
|
8
|
-
* @param mediaType The media type where validation failed ('image', 'video', or 'audio')
|
|
9
|
-
* @param invalidParameters Array of parameter names that were invalid
|
|
10
|
-
* @param validParameters Array of valid parameter names or values
|
|
11
|
-
* @param suggestions Optional array of suggested corrections or valid values
|
|
12
|
-
*/
|
|
13
|
-
constructor(message, code, mediaType, invalidParameters, validParameters, suggestions) {
|
|
14
|
-
super(message);
|
|
15
|
-
this.name = "ValidationError";
|
|
16
|
-
this.code = code;
|
|
17
|
-
this.details = {
|
|
18
|
-
invalidParams: invalidParameters,
|
|
19
|
-
mediaType,
|
|
20
|
-
suggestions,
|
|
21
|
-
validParams: validParameters
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export { ValidationError as default };
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import File from './File-Bb3P23dr.js';
|
|
2
|
-
|
|
3
|
-
class VercelBlobFile extends File {
|
|
4
|
-
/**
|
|
5
|
-
* The blob's public URL
|
|
6
|
-
*/
|
|
7
|
-
url;
|
|
8
|
-
/**
|
|
9
|
-
* The blob's download URL (may be different from url for private blobs)
|
|
10
|
-
*/
|
|
11
|
-
downloadUrl;
|
|
12
|
-
/**
|
|
13
|
-
* The blob's pathname within the store
|
|
14
|
-
*/
|
|
15
|
-
pathname;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export { VercelBlobFile as default };
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { put, del, copy, list } from '@vercel/blob';
|
|
2
|
-
import { g as getFileStatus, p as partMatch, a as detectFileTypeFromBuffer } from './part-match-BMNqHDYD.js';
|
|
3
|
-
import { B as BaseStorage, t as toMilliseconds } from './storage-C6NSXb8h.js';
|
|
4
|
-
import { L as LocalMetaStorage } from './local-meta-storage-By-3SNBI.js';
|
|
5
|
-
import VercelBlobFile from './VercelBlobFile-BCg4aTEq.js';
|
|
6
|
-
import { u as updateSize } from './update-size-CCGm6i1J.js';
|
|
7
|
-
import { h as hasContent } from './has-content-CY66ehMK.js';
|
|
8
|
-
|
|
9
|
-
class VercelBlobStorage extends BaseStorage {
|
|
10
|
-
static name = "vercel-blob";
|
|
11
|
-
checksumTypes = ["md5"];
|
|
12
|
-
meta;
|
|
13
|
-
token;
|
|
14
|
-
multipart;
|
|
15
|
-
constructor(config) {
|
|
16
|
-
super(config);
|
|
17
|
-
this.token = config.token || process.env.BLOB_READ_WRITE_TOKEN || process.env.VERCEL_BLOB_TOKEN || "";
|
|
18
|
-
if (!this.token) {
|
|
19
|
-
throw new Error("Vercel Blob token is required. Set BLOB_READ_WRITE_TOKEN or VERCEL_BLOB_TOKEN environment variable, or provide token in config.");
|
|
20
|
-
}
|
|
21
|
-
this.multipart = config.multipart ?? false;
|
|
22
|
-
const { metaStorage, metaStorageConfig } = config;
|
|
23
|
-
this.meta = metaStorage || new LocalMetaStorage(metaStorageConfig);
|
|
24
|
-
this.isReady = true;
|
|
25
|
-
}
|
|
26
|
-
async create(config) {
|
|
27
|
-
return this.instrumentOperation("create", async () => {
|
|
28
|
-
const processedConfig = { ...config };
|
|
29
|
-
if (config.ttl) {
|
|
30
|
-
const ttlMs = typeof config.ttl === "string" ? toMilliseconds(config.ttl) : config.ttl;
|
|
31
|
-
processedConfig.expiredAt = ttlMs === void 0 ? void 0 : Date.now() + ttlMs;
|
|
32
|
-
}
|
|
33
|
-
const file = new VercelBlobFile(processedConfig);
|
|
34
|
-
file.name = this.namingFunction(file);
|
|
35
|
-
await this.validate(file);
|
|
36
|
-
try {
|
|
37
|
-
const existing = await this.getMeta(file.id);
|
|
38
|
-
if (existing.bytesWritten >= 0) {
|
|
39
|
-
return existing;
|
|
40
|
-
}
|
|
41
|
-
} catch {
|
|
42
|
-
}
|
|
43
|
-
file.bytesWritten = 0;
|
|
44
|
-
file.status = getFileStatus(file);
|
|
45
|
-
await this.saveMeta(file);
|
|
46
|
-
await this.onCreate(file);
|
|
47
|
-
return file;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
async write(part) {
|
|
51
|
-
return this.instrumentOperation("write", async () => {
|
|
52
|
-
let file;
|
|
53
|
-
if ("contentType" in part && "metadata" in part && !("body" in part) && !("start" in part)) {
|
|
54
|
-
file = part;
|
|
55
|
-
} else {
|
|
56
|
-
file = await this.getMeta(part.id);
|
|
57
|
-
await this.checkIfExpired(file);
|
|
58
|
-
}
|
|
59
|
-
if (file.status === "completed") {
|
|
60
|
-
return file;
|
|
61
|
-
}
|
|
62
|
-
if (part.size !== void 0) {
|
|
63
|
-
updateSize(file, part.size);
|
|
64
|
-
}
|
|
65
|
-
if (!partMatch(part, file)) {
|
|
66
|
-
throw new Error("File part does not match");
|
|
67
|
-
}
|
|
68
|
-
await this.lock(part.id);
|
|
69
|
-
try {
|
|
70
|
-
if (hasContent(part)) {
|
|
71
|
-
if (this.isUnsupportedChecksum(part.checksumAlgorithm)) {
|
|
72
|
-
throw new Error("Unsupported checksum algorithm");
|
|
73
|
-
}
|
|
74
|
-
const chunks = [];
|
|
75
|
-
const stream = part.body;
|
|
76
|
-
for await (const chunk of stream) {
|
|
77
|
-
chunks.push(Buffer.from(chunk));
|
|
78
|
-
}
|
|
79
|
-
const buffer = Buffer.concat(chunks);
|
|
80
|
-
if ((file.bytesWritten === 0 || Number.isNaN(file.bytesWritten)) && (!file.contentType || file.contentType === "application/octet-stream")) {
|
|
81
|
-
try {
|
|
82
|
-
const fileType = await detectFileTypeFromBuffer(buffer);
|
|
83
|
-
if (fileType?.mime) {
|
|
84
|
-
file.contentType = fileType.mime;
|
|
85
|
-
}
|
|
86
|
-
} catch {
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const blob = new Blob([buffer], { type: file.contentType });
|
|
90
|
-
const result = await put(file.name, blob, {
|
|
91
|
-
access: "public",
|
|
92
|
-
multipart: this.shouldUseMultipart(file)
|
|
93
|
-
});
|
|
94
|
-
file.url = result.url;
|
|
95
|
-
file.pathname = result.pathname;
|
|
96
|
-
file.downloadUrl = result.downloadUrl;
|
|
97
|
-
file.bytesWritten = buffer.length;
|
|
98
|
-
}
|
|
99
|
-
file.status = getFileStatus(file);
|
|
100
|
-
if (file.status === "completed") {
|
|
101
|
-
await this.internalOnComplete(file);
|
|
102
|
-
}
|
|
103
|
-
await this.saveMeta(file);
|
|
104
|
-
return file;
|
|
105
|
-
} finally {
|
|
106
|
-
await this.unlock(part.id);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Deletes an upload and its metadata.
|
|
112
|
-
* @param query File query containing the file ID to delete.
|
|
113
|
-
* @param query.id File ID to delete.
|
|
114
|
-
* @returns Promise resolving to the deleted file object with status: "deleted".
|
|
115
|
-
* @throws {UploadError} If the file metadata cannot be found.
|
|
116
|
-
*/
|
|
117
|
-
async delete({ id }) {
|
|
118
|
-
return this.instrumentOperation("delete", async () => {
|
|
119
|
-
const file = await this.getMeta(id);
|
|
120
|
-
if (!file.url) {
|
|
121
|
-
throw new Error(`File ${id} does not have a valid URL`);
|
|
122
|
-
}
|
|
123
|
-
file.status = "deleted";
|
|
124
|
-
try {
|
|
125
|
-
await del(file.url, { token: this.token });
|
|
126
|
-
} catch (error) {
|
|
127
|
-
this.logger?.error("Failed to delete blob from Vercel Blob:", error);
|
|
128
|
-
const httpError = this.normalizeError(error instanceof Error ? error : new Error(String(error)));
|
|
129
|
-
await this.onError(httpError);
|
|
130
|
-
}
|
|
131
|
-
await this.deleteMeta(file.id);
|
|
132
|
-
const deletedFile = { ...file };
|
|
133
|
-
await this.onDelete(deletedFile);
|
|
134
|
-
return deletedFile;
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Checks if a file exists by verifying both metadata and the actual Vercel Blob.
|
|
139
|
-
* Returns true only if both the metadata and the blob exist.
|
|
140
|
-
* @param query File query containing the file ID to check.
|
|
141
|
-
* @returns Promise resolving to true if both metadata and blob exist, false otherwise.
|
|
142
|
-
*/
|
|
143
|
-
async exists({ id }) {
|
|
144
|
-
return this.instrumentOperation("exists", async () => {
|
|
145
|
-
try {
|
|
146
|
-
const file = await this.getMeta(id);
|
|
147
|
-
if (!file.url || file.url.length === 0) {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
const response = await fetch(file.url, { method: "HEAD" });
|
|
151
|
-
return response.ok;
|
|
152
|
-
} catch {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
async get({ id }) {
|
|
158
|
-
return this.instrumentOperation("get", async () => {
|
|
159
|
-
const file = await this.checkIfExpired(await this.getMeta(id));
|
|
160
|
-
if (!file.url || file.url.length === 0) {
|
|
161
|
-
throw new Error("File URL not found");
|
|
162
|
-
}
|
|
163
|
-
const response = await fetch(file.url);
|
|
164
|
-
const content = Buffer.from(await response.arrayBuffer());
|
|
165
|
-
return {
|
|
166
|
-
content,
|
|
167
|
-
contentType: file.contentType,
|
|
168
|
-
ETag: file.ETag,
|
|
169
|
-
expiredAt: file.expiredAt,
|
|
170
|
-
id,
|
|
171
|
-
metadata: file.metadata,
|
|
172
|
-
modifiedAt: file.modifiedAt,
|
|
173
|
-
name: file.name,
|
|
174
|
-
originalName: file.originalName,
|
|
175
|
-
size: file.size || content.length
|
|
176
|
-
};
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Copies an upload file to a new location.
|
|
181
|
-
* @param name Source file name/ID.
|
|
182
|
-
* @param destination Destination file name/ID.
|
|
183
|
-
* @returns Promise resolving to the copied file object.
|
|
184
|
-
* @throws {UploadError} If the source file cannot be found.
|
|
185
|
-
*/
|
|
186
|
-
async copy(name, destination) {
|
|
187
|
-
return this.instrumentOperation("copy", async () => {
|
|
188
|
-
const sourceFile = await this.getMeta(name);
|
|
189
|
-
if (!sourceFile.url) {
|
|
190
|
-
throw new Error("Source file URL not found");
|
|
191
|
-
}
|
|
192
|
-
const result = await copy(sourceFile.url, destination, {
|
|
193
|
-
access: "public"
|
|
194
|
-
});
|
|
195
|
-
return {
|
|
196
|
-
...sourceFile,
|
|
197
|
-
id: destination,
|
|
198
|
-
name: destination,
|
|
199
|
-
pathname: result.pathname,
|
|
200
|
-
url: result.url
|
|
201
|
-
};
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Moves an upload file to a new location.
|
|
206
|
-
* @param name Source file name/ID.
|
|
207
|
-
* @param destination Destination file name/ID.
|
|
208
|
-
* @returns Promise resolving to the moved file object.
|
|
209
|
-
* @throws {UploadError} If the source file cannot be found.
|
|
210
|
-
*/
|
|
211
|
-
async move(name, destination) {
|
|
212
|
-
return this.instrumentOperation("move", async () => {
|
|
213
|
-
const copiedFile = await this.copy(name, destination);
|
|
214
|
-
await this.delete({ id: name });
|
|
215
|
-
return copiedFile;
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
async list(limit = 1e3) {
|
|
219
|
-
return this.instrumentOperation(
|
|
220
|
-
"list",
|
|
221
|
-
async () => {
|
|
222
|
-
const result = await list({ limit });
|
|
223
|
-
return result.blobs.map((blob) => {
|
|
224
|
-
const file = new VercelBlobFile({
|
|
225
|
-
contentType: "application/octet-stream",
|
|
226
|
-
// Default content type
|
|
227
|
-
metadata: {},
|
|
228
|
-
originalName: blob.pathname
|
|
229
|
-
});
|
|
230
|
-
file.createdAt = blob.uploadedAt?.toISOString();
|
|
231
|
-
file.id = blob.pathname;
|
|
232
|
-
file.modifiedAt = blob.uploadedAt?.toISOString();
|
|
233
|
-
file.name = blob.pathname;
|
|
234
|
-
file.pathname = blob.pathname;
|
|
235
|
-
file.size = blob.size;
|
|
236
|
-
file.url = blob.url;
|
|
237
|
-
file.downloadUrl = blob.downloadUrl;
|
|
238
|
-
return file;
|
|
239
|
-
});
|
|
240
|
-
},
|
|
241
|
-
{ limit }
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
internalOnComplete = (file) => this.deleteMeta(file.id);
|
|
245
|
-
/**
|
|
246
|
-
* Determines if multipart upload should be used for the given file.
|
|
247
|
-
* @param file File object to check.
|
|
248
|
-
* @returns True if multipart upload should be used, false otherwise.
|
|
249
|
-
*/
|
|
250
|
-
shouldUseMultipart(file) {
|
|
251
|
-
if (typeof this.multipart === "boolean") {
|
|
252
|
-
return this.multipart;
|
|
253
|
-
}
|
|
254
|
-
if (typeof this.multipart === "number" && file.size !== void 0) {
|
|
255
|
-
return file.size >= this.multipart;
|
|
256
|
-
}
|
|
257
|
-
return false;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
export { VercelBlobStorage as default };
|