@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
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
</a>
|
|
8
8
|
|
|
9
|
-
<h3 align="center">
|
|
9
|
+
<h3 align="center">Server-side file-storage abstraction - store files in a web-accessible location via a simplified API. Includes S3, Azure, GCS, local filesystem and 20+ other backends with TUS/multipart/REST upload handlers and the most convenient features of each.</h3>
|
|
10
10
|
|
|
11
11
|
<!-- END_PACKAGE_OG_IMAGE_PLACEHOLDER -->
|
|
12
12
|
|
|
@@ -26,520 +26,136 @@
|
|
|
26
26
|
<sub>Built with ❤︎ by <a href="https://twitter.com/_prisis_">Daniel Bannert</a></sub>
|
|
27
27
|
</div>
|
|
28
28
|
|
|
29
|
-
##
|
|
30
|
-
|
|
31
|
-
- **Multiple Upload Handlers**: Multipart (form-based), REST (direct binary), and TUS (resumable) uploads
|
|
32
|
-
- **Chunked Uploads**: REST handler supports client-side chunked uploads for large files
|
|
33
|
-
- **Automatic Retry**: Built-in retry mechanism with exponential backoff for all storage backends (S3, Azure, GCS, Vercel Blob, Netlify Blob)
|
|
34
|
-
- Parent directories are created automatically as needed (like S3 and Azure)
|
|
35
|
-
- Content types are inferred from file extensions (like the filesystem)
|
|
36
|
-
- Files are by default marked as readable via the web (like a filesystem + web server)
|
|
37
|
-
- Images can be automatically scaled to multiple sizes
|
|
38
|
-
- Images can be cropped
|
|
39
|
-
- Images are automatically rotated if necessary for proper display on the web (i.e. iPhone photos with rotation hints are right side up)
|
|
40
|
-
- Image width, image height and correct file extension are made available to the developer
|
|
41
|
-
- Non-image files are also supported
|
|
42
|
-
- Web access to files can be disabled and reenabled
|
|
43
|
-
- GIF is supported, including animation, with full support for scaling and cropping
|
|
44
|
-
- Batch operations: Delete multiple files in a single request
|
|
45
|
-
- On fire about minimizing file sizes for your resized images? You can plug in `imagemin` and compatible tools using the `postprocessors` option.
|
|
46
|
-
|
|
47
|
-
## Installation
|
|
29
|
+
## Two surfaces, one library
|
|
48
30
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
```sh
|
|
54
|
-
yarn add @visulima/upload
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
```sh
|
|
58
|
-
pnpm add @visulima/upload
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Install requirements peer storage
|
|
62
|
-
|
|
63
|
-
### AWS S3
|
|
64
|
-
|
|
65
|
-
```sh
|
|
66
|
-
npm install @aws-sdk/client-s3 @aws-sdk/credential-providers @aws-sdk/s3-request-presigner @aws-sdk/signature-v4-crt aws-crt @aws-sdk/types
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
```sh
|
|
70
|
-
yarn add @aws-sdk/client-s3 @aws-sdk/credential-providers @aws-sdk/s3-request-presigner @aws-sdk/signature-v4-crt aws-crt @aws-sdk/types
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
```sh
|
|
74
|
-
pnpm add @aws-sdk/client-s3 @aws-sdk/credential-providers @aws-sdk/s3-request-presigner @aws-sdk/signature-v4-crt aws-crt @aws-sdk/types
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Azure Blob Storage
|
|
78
|
-
|
|
79
|
-
```sh
|
|
80
|
-
npm install @azure/storage-blob
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
```sh
|
|
84
|
-
yarn add @azure/storage-blob
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
```sh
|
|
88
|
-
pnpm add @azure/storage-blob
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
> Note: If you hit this error: "TypeError: Expected signal to be an instanceof AbortSignal" [#784](https://github.com/node-fetch/node-fetch/issues/784) you need to install node-fetch 4.0.0-beta or higher.
|
|
31
|
+
- **`Files`** — one-liner API for ad-hoc storage operations. Web-standard body types (`Blob`, `Uint8Array`, `ReadableStream`), bulk-array overloads, per-call retry/timeout/abort, lifecycle hooks, and a `.raw` escape hatch. Use this when you just need to put files somewhere.
|
|
32
|
+
- **`BaseStorage` adapters** (`S3Storage`, `DiskStorage`, `BunnyStorage`, …) — the full upload-server framework. TUS / multipart / REST handlers, lifecycle hooks, validators, image / video / audio transformers, OpenAPI export. Use this when you're hosting an upload service.
|
|
92
33
|
|
|
93
|
-
|
|
34
|
+
Both surfaces wrap the same adapters — swap providers without touching call sites.
|
|
94
35
|
|
|
95
|
-
|
|
96
|
-
npm install @google-cloud/storage node-fetch gaxios
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
```sh
|
|
100
|
-
yarn add @google-cloud/storage node-fetch gaxios
|
|
101
|
-
```
|
|
36
|
+
## Install
|
|
102
37
|
|
|
103
38
|
```sh
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
## Caching
|
|
108
|
-
|
|
109
|
-
The storage package supports caching to improve performance and reduce API calls. You provide your own cache implementation that follows the simple `Cache` interface.
|
|
110
|
-
|
|
111
|
-
### LRU Cache
|
|
112
|
-
|
|
113
|
-
Use the built-in LRU cache for simple in-memory caching:
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
import { LRUCache } from "lru-cache";
|
|
117
|
-
import { DiskStorage } from "@visulima/storage";
|
|
118
|
-
|
|
119
|
-
const cache = new LRUCache({
|
|
120
|
-
max: 1000, // Maximum number of items
|
|
121
|
-
ttl: 3600000, // 1 hour in milliseconds
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
const storage = new DiskStorage({
|
|
125
|
-
directory: "/uploads",
|
|
126
|
-
cache,
|
|
127
|
-
});
|
|
39
|
+
npm install @visulima/storage
|
|
40
|
+
# or yarn add / pnpm add
|
|
128
41
|
```
|
|
129
42
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
Implement the `Cache` interface for any cache provider:
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
import { DiskStorage, type Cache } from "@visulima/storage";
|
|
136
|
-
import { Redis } from "ioredis";
|
|
137
|
-
|
|
138
|
-
// Custom Redis cache implementation
|
|
139
|
-
class RedisCache implements Cache<string, any> {
|
|
140
|
-
constructor(private redis: Redis) {}
|
|
141
|
-
|
|
142
|
-
async get(key: string): Promise<any | undefined> {
|
|
143
|
-
const value = await this.redis.get(key);
|
|
144
|
-
return value ? JSON.parse(value) : undefined;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
async set(key: string, value: any): Promise<boolean> {
|
|
148
|
-
await this.redis.set(key, JSON.stringify(value));
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
async delete(key: string): Promise<boolean> {
|
|
153
|
-
await this.redis.del(key);
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async clear(): Promise<void> {
|
|
158
|
-
await this.redis.flushall();
|
|
159
|
-
}
|
|
43
|
+
Each provider has its own peer dependency (e.g. `@aws-sdk/client-s3` for S3, `@azure/storage-blob` for Azure). See the relevant [service page](https://visulima.com/docs/packages/storage/services) for the exact install command.
|
|
160
44
|
|
|
161
|
-
|
|
162
|
-
const exists = await this.redis.exists(key);
|
|
163
|
-
return exists === 1;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
45
|
+
## Quick start with `Files`
|
|
166
46
|
|
|
167
|
-
|
|
168
|
-
|
|
47
|
+
```ts
|
|
48
|
+
import { Files } from "@visulima/storage";
|
|
49
|
+
import { S3Storage } from "@visulima/storage/provider/aws";
|
|
169
50
|
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
cache,
|
|
51
|
+
const files = new Files({
|
|
52
|
+
adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }),
|
|
173
53
|
});
|
|
174
|
-
```
|
|
175
54
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
For advanced multi-tier caching, use BentoCache with the adapter:
|
|
179
|
-
|
|
180
|
-
```typescript
|
|
181
|
-
import { BentoCache, bentostore } from "bentocache";
|
|
182
|
-
import { memoryDriver } from "bentocache/drivers/memory";
|
|
183
|
-
import { redisDriver } from "bentocache/drivers/redis";
|
|
184
|
-
import { BentoCacheAdapter } from "@visulima/storage/utils/cache";
|
|
185
|
-
|
|
186
|
-
const bento = new BentoCache({
|
|
187
|
-
default: "storage",
|
|
188
|
-
stores: {
|
|
189
|
-
storage: bentostore()
|
|
190
|
-
.useL1Layer(memoryDriver({ maxSize: "10mb" }))
|
|
191
|
-
.useL2Layer(
|
|
192
|
-
redisDriver({
|
|
193
|
-
connection: { host: "127.0.0.1", port: 6379 },
|
|
194
|
-
}),
|
|
195
|
-
),
|
|
196
|
-
},
|
|
197
|
-
});
|
|
55
|
+
await files.upload("avatars/abc.png", buffer, { contentType: "image/png" });
|
|
198
56
|
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
namespace: "storage",
|
|
202
|
-
defaultTtl: 3600000, // 1 hour
|
|
203
|
-
});
|
|
57
|
+
const url = await files.url("avatars/abc.png", { expiresIn: 900 });
|
|
58
|
+
const { body } = await files.download("avatars/abc.png");
|
|
204
59
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
cache,
|
|
208
|
-
});
|
|
60
|
+
// Stream large objects without buffering the whole payload in memory:
|
|
61
|
+
const { body: stream } = await files.downloadStream("avatars/abc.png");
|
|
209
62
|
```
|
|
210
63
|
|
|
211
|
-
|
|
64
|
+
Swap the adapter to change provider — everything else stays the same:
|
|
212
65
|
|
|
213
|
-
```
|
|
214
|
-
import {
|
|
215
|
-
import
|
|
216
|
-
import VideoTransformer from "@visulima/upload/transformer/video";
|
|
217
|
-
import { LRUCache } from "lru-cache";
|
|
66
|
+
```ts
|
|
67
|
+
import { Files, DiskStorage } from "@visulima/storage";
|
|
68
|
+
import { BunnyStorage } from "@visulima/storage/provider/bunny";
|
|
218
69
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
ImageTransformer: ImageTransformer,
|
|
222
|
-
VideoTransformer: VideoTransformer,
|
|
223
|
-
});
|
|
70
|
+
new Files({ adapter: new DiskStorage({ directory: "./uploads" }) });
|
|
71
|
+
new Files({ adapter: new BunnyStorage({ zone, accessKey, region: "de" }) });
|
|
224
72
|
```
|
|
225
73
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
Any cache implementation must implement this interface:
|
|
74
|
+
→ See the [Files facade reference](https://visulima.com/docs/packages/storage/files-facade) for the full method surface (`upload`, `download`, `downloadStream`, `head`, `exists`, `delete`, `copy`, `move`, `list`, `listAll`, `url`, `signedUploadUrl`, `.raw`) and body-type matrix. `list({ delimiter: "/" })` returns directory-style `{ files, prefixes }`; pass `{ readonly: true }` (or call `files.readonly()`) for a locked view, and read `files.capabilities` to branch on adapter support. Top-level `transfer(source, destination)` streams whole buckets between adapters; `sync(source, destination)` does an incremental, optionally-pruning mirror (with `dryRun`).
|
|
229
75
|
|
|
230
|
-
|
|
231
|
-
interface Cache<K = string, V = any> {
|
|
232
|
-
get(key: K): V | undefined | Promise<V | undefined>;
|
|
233
|
-
set(key: K, value: V, options?: { ttl?: number }): boolean | Promise<boolean>;
|
|
234
|
-
delete(key: K): boolean | Promise<boolean>;
|
|
235
|
-
clear(): void | Promise<void>;
|
|
236
|
-
has(key: K): boolean | Promise<boolean>;
|
|
237
|
-
}
|
|
238
|
-
```
|
|
76
|
+
## Building an upload server?
|
|
239
77
|
|
|
240
|
-
|
|
78
|
+
If you're handling client uploads from a browser — large files, resumable transfers, form posts — use the adapter directly with one of the HTTP handlers.
|
|
241
79
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
### Default Behavior
|
|
247
|
-
|
|
248
|
-
By default, storage operations will retry up to 3 times with exponential backoff:
|
|
249
|
-
|
|
250
|
-
- Initial delay: 1 second
|
|
251
|
-
- Backoff multiplier: 2x (delays double each retry: 1s → 2s → 4s)
|
|
252
|
-
- Maximum delay: 30 seconds
|
|
253
|
-
- Retryable status codes: 408, 429, 500, 502, 503, 504
|
|
254
|
-
|
|
255
|
-
### Basic Configuration
|
|
256
|
-
|
|
257
|
-
Configure retry behavior when creating your storage instance:
|
|
258
|
-
|
|
259
|
-
```typescript
|
|
260
|
-
import { S3Storage } from "@visulima/storage";
|
|
261
|
-
|
|
262
|
-
const storage = new S3Storage({
|
|
263
|
-
bucket: "my-bucket",
|
|
264
|
-
region: "us-east-1",
|
|
265
|
-
retryConfig: {
|
|
266
|
-
maxRetries: 5,
|
|
267
|
-
initialDelay: 2000,
|
|
268
|
-
backoffMultiplier: 1.5,
|
|
269
|
-
maxDelay: 60_000,
|
|
270
|
-
},
|
|
271
|
-
});
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### Advanced Configuration
|
|
275
|
-
|
|
276
|
-
Customize retry logic with backend-specific error detection:
|
|
277
|
-
|
|
278
|
-
```typescript
|
|
279
|
-
import { AzureStorage } from "@visulima/storage";
|
|
280
|
-
|
|
281
|
-
const storage = new AzureStorage({
|
|
282
|
-
containerName: "uploads",
|
|
283
|
-
accountName: "myaccount",
|
|
284
|
-
accountKey: "mykey",
|
|
285
|
-
retryConfig: {
|
|
286
|
-
maxRetries: 3,
|
|
287
|
-
initialDelay: 1000,
|
|
288
|
-
backoffMultiplier: 2,
|
|
289
|
-
maxDelay: 30_000,
|
|
290
|
-
retryableStatusCodes: [408, 429, 500, 502, 503, 504],
|
|
291
|
-
shouldRetry: (error: unknown) => {
|
|
292
|
-
// Custom retry logic
|
|
293
|
-
if (error instanceof Error) {
|
|
294
|
-
const errorCode = (error as any).code;
|
|
295
|
-
|
|
296
|
-
// Retry on network errors
|
|
297
|
-
if (errorCode === "ECONNRESET" || errorCode === "ETIMEDOUT") {
|
|
298
|
-
return true;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Retry on specific HTTP status codes
|
|
303
|
-
if ((error as any).statusCode && [429, 503].includes((error as any).statusCode)) {
|
|
304
|
-
return true;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
return false;
|
|
308
|
-
},
|
|
309
|
-
},
|
|
310
|
-
});
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
### Retry Configuration Options
|
|
314
|
-
|
|
315
|
-
```typescript
|
|
316
|
-
interface RetryConfig {
|
|
317
|
-
/** Maximum number of retry attempts (default: 3) */
|
|
318
|
-
maxRetries?: number;
|
|
319
|
-
|
|
320
|
-
/** Initial delay in milliseconds before first retry (default: 1000) */
|
|
321
|
-
initialDelay?: number;
|
|
322
|
-
|
|
323
|
-
/** Multiplier for exponential backoff (default: 2) */
|
|
324
|
-
backoffMultiplier?: number;
|
|
325
|
-
|
|
326
|
-
/** Maximum delay in milliseconds between retries (default: 30000) */
|
|
327
|
-
maxDelay?: number;
|
|
328
|
-
|
|
329
|
-
/** HTTP status codes that should trigger a retry (default: [408, 429, 500, 502, 503, 504]) */
|
|
330
|
-
retryableStatusCodes?: number[];
|
|
331
|
-
|
|
332
|
-
/** Custom function to determine if an error should be retried */
|
|
333
|
-
shouldRetry?: (error: unknown) => boolean;
|
|
334
|
-
|
|
335
|
-
/** Custom function to calculate delay for a specific retry attempt */
|
|
336
|
-
calculateDelay?: (attempt: number, error: unknown) => number | undefined;
|
|
337
|
-
}
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
### Using Retry Utilities Directly
|
|
341
|
-
|
|
342
|
-
You can also use the retry utilities for custom operations:
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
import { retry, createRetryWrapper, isRetryableError } from "@visulima/storage";
|
|
346
|
-
|
|
347
|
-
// One-off retry
|
|
348
|
-
const result = await retry(
|
|
349
|
-
async () => {
|
|
350
|
-
// Your operation here
|
|
351
|
-
return await someOperation();
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
maxRetries: 3,
|
|
355
|
-
initialDelay: 1000,
|
|
356
|
-
},
|
|
357
|
-
);
|
|
358
|
-
|
|
359
|
-
// Create a reusable retry wrapper
|
|
360
|
-
const retryWrapper = createRetryWrapper({
|
|
361
|
-
maxRetries: 5,
|
|
362
|
-
initialDelay: 2000,
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
const result = await retryWrapper(async () => {
|
|
366
|
-
return await someOperation();
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
// Check if an error is retryable
|
|
370
|
-
if (isRetryableError(error)) {
|
|
371
|
-
// Handle retryable error
|
|
372
|
-
}
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
### Supported Error Types
|
|
376
|
-
|
|
377
|
-
The retry mechanism automatically handles:
|
|
378
|
-
|
|
379
|
-
- **Network errors**: `ECONNRESET`, `ETIMEDOUT`, `ENOTFOUND`, `ECONNREFUSED`, `EAI_AGAIN`
|
|
380
|
-
- **AWS SDK errors**: Server faults, retryable status codes, SDK v2/v3 error formats
|
|
381
|
-
- **Azure Storage errors**: HTTP status codes, network connection issues
|
|
382
|
-
- **HTTP errors**: 408 (Request Timeout), 429 (Too Many Requests), 5xx (Server Errors)
|
|
383
|
-
|
|
384
|
-
### Examples by Storage Backend
|
|
385
|
-
|
|
386
|
-
#### AWS S3
|
|
80
|
+
```ts
|
|
81
|
+
import { DiskStorage } from "@visulima/storage";
|
|
82
|
+
import { Multipart, Rest } from "@visulima/storage/handler/http/node";
|
|
387
83
|
|
|
388
|
-
|
|
389
|
-
import { S3Storage } from "@visulima/storage";
|
|
84
|
+
const storage = new DiskStorage({ directory: "./uploads" });
|
|
390
85
|
|
|
391
|
-
const
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
retryConfig: {
|
|
395
|
-
maxRetries: 3,
|
|
396
|
-
// AWS SDK errors are automatically detected
|
|
397
|
-
},
|
|
86
|
+
const multipart = new Multipart({ storage });
|
|
87
|
+
app.use("/upload", multipart.handle, (req, res) => {
|
|
88
|
+
res.json(req.body); // handler writes the stored file metadata to req.body
|
|
398
89
|
});
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
#### Azure Blob Storage
|
|
402
90
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
const storage = new AzureStorage({
|
|
407
|
-
containerName: "uploads",
|
|
408
|
-
accountName: "myaccount",
|
|
409
|
-
accountKey: "mykey",
|
|
410
|
-
retryConfig: {
|
|
411
|
-
maxRetries: 5,
|
|
412
|
-
initialDelay: 2000,
|
|
413
|
-
},
|
|
414
|
-
});
|
|
91
|
+
const rest = new Rest({ storage });
|
|
92
|
+
app.use("/files", rest.handle);
|
|
415
93
|
```
|
|
416
94
|
|
|
417
|
-
|
|
95
|
+
Three handlers cover the common upload patterns:
|
|
418
96
|
|
|
419
|
-
|
|
97
|
+
- **Multipart** — `multipart/form-data` from HTML forms.
|
|
98
|
+
- **REST** — direct binary `POST` / `PUT`. Optional client-side chunking for large files.
|
|
99
|
+
- **TUS** — resumable uploads ([tus.io](https://tus.io)) for unreliable networks and very large files.
|
|
420
100
|
|
|
421
|
-
|
|
422
|
-
import { GCStorage } from "@visulima/storage";
|
|
101
|
+
→ Runtime adapters live under `@visulima/storage/handler/http/{node,fetch,hono,nextjs,solid-start,bun,deno,cloudflare,edge}`. See [framework integrations](https://visulima.com/docs/packages/storage/framework).
|
|
423
102
|
|
|
424
|
-
|
|
425
|
-
bucket: "my-bucket",
|
|
426
|
-
projectId: "my-project",
|
|
427
|
-
retryConfig: {
|
|
428
|
-
maxRetries: 3,
|
|
429
|
-
// Works with GCS's existing retryOptions
|
|
430
|
-
},
|
|
431
|
-
});
|
|
432
|
-
```
|
|
103
|
+
## Choosing your surface
|
|
433
104
|
|
|
434
|
-
|
|
105
|
+
| You want to… | Use |
|
|
106
|
+
| ------------------------------------------------------ | ------------------------------------------- |
|
|
107
|
+
| Save a `Blob` / `Buffer` to S3 and get a signed URL | `Files` |
|
|
108
|
+
| Drop in a file picker / "import from cloud" flow | `Files` with a consumer-provider adapter |
|
|
109
|
+
| Expose ad-hoc storage to an AI agent or LLM tool | `Files` + `@visulima/storage/ai/*` subpaths |
|
|
110
|
+
| Build a TUS / multipart / chunked upload endpoint | adapter + handler |
|
|
111
|
+
| Transform images / video / audio on the fly | adapter + transformer |
|
|
112
|
+
| Hook `onCreate` / `onComplete` / `onDelete` lifecycles | adapter |
|
|
113
|
+
| Export OpenAPI for an upload endpoint | adapter |
|
|
435
114
|
|
|
436
|
-
|
|
437
|
-
import { VercelBlobStorage } from "@visulima/storage";
|
|
115
|
+
## Providers
|
|
438
116
|
|
|
439
|
-
|
|
440
|
-
token: process.env.BLOB_READ_WRITE_TOKEN,
|
|
441
|
-
retryConfig: {
|
|
442
|
-
maxRetries: 3,
|
|
443
|
-
retryableStatusCodes: [408, 429, 500, 502, 503, 504],
|
|
444
|
-
},
|
|
445
|
-
});
|
|
446
|
-
```
|
|
117
|
+
Object storage (service credentials, presigned URLs, S3-style):
|
|
447
118
|
|
|
448
|
-
|
|
119
|
+
- AWS S3 · Azure Blob · Google Cloud Storage · Vercel Blob · Netlify Blobs · Local disk
|
|
449
120
|
|
|
450
|
-
|
|
451
|
-
import { NetlifyBlobStorage } from "@visulima/storage";
|
|
121
|
+
S3-compatible (branded client configs under `provider/aws/s3/clients`):
|
|
452
122
|
|
|
453
|
-
|
|
454
|
-
storeName: "uploads",
|
|
455
|
-
retryConfig: {
|
|
456
|
-
maxRetries: 3,
|
|
457
|
-
},
|
|
458
|
-
});
|
|
459
|
-
```
|
|
123
|
+
- Cloudflare R2 · DigitalOcean Spaces · MinIO · Hetzner · Storj · Backblaze B2 · Tigris · Wasabi · Akamai · Scaleway · Vultr · Exoscale · Filebase · iDrive e2 · IBM Cloud Object Storage · Oracle Cloud (OCI) · OVHcloud · Alibaba Cloud OSS · Tencent Cloud COS · Yandex Object Storage
|
|
460
124
|
|
|
461
|
-
|
|
125
|
+
Consumer providers (user OAuth or service-credential, all peer-dep gated):
|
|
462
126
|
|
|
463
|
-
|
|
127
|
+
- Dropbox · Google Drive · Microsoft OneDrive · SharePoint · Box · Supabase · UploadThing · Bunny Storage · Cloudinary · Firebase Storage · PocketBase
|
|
464
128
|
|
|
465
|
-
|
|
129
|
+
→ See the [capability matrix](https://visulima.com/docs/packages/storage/services/capabilities) for what each provider supports (presign, copy, list, signed uploads, …).
|
|
466
130
|
|
|
467
|
-
|
|
468
|
-
import { Rest } from "@visulima/upload/handler/rest";
|
|
131
|
+
## AI tool integrations
|
|
469
132
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
// Initialize chunked upload
|
|
473
|
-
const initResponse = await fetch("/files", {
|
|
474
|
-
method: "POST",
|
|
475
|
-
headers: {
|
|
476
|
-
"X-Chunked-Upload": "true",
|
|
477
|
-
"X-Total-Size": "10485760", // Total file size in bytes
|
|
478
|
-
"Content-Length": "0",
|
|
479
|
-
"Content-Type": "application/octet-stream",
|
|
480
|
-
},
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
const { id } = await initResponse.json();
|
|
484
|
-
// id is the upload session ID
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
### Uploading Chunks
|
|
488
|
-
|
|
489
|
-
```typescript
|
|
490
|
-
// Upload chunk 1 (bytes 0-524288)
|
|
491
|
-
await fetch(`/files/${id}`, {
|
|
492
|
-
method: "PATCH",
|
|
493
|
-
headers: {
|
|
494
|
-
"X-Chunk-Offset": "0",
|
|
495
|
-
"Content-Length": "524288",
|
|
496
|
-
"Content-Type": "application/octet-stream",
|
|
497
|
-
},
|
|
498
|
-
body: chunk1,
|
|
499
|
-
});
|
|
133
|
+
The package ships four optional subpaths that expose `Files` as tools an LLM can call — same eight canonical operations wrapped in each SDK's native tool format, with per-tool approval gating.
|
|
500
134
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
"X-Chunk-Offset": "524288",
|
|
506
|
-
"Content-Length": "524288",
|
|
507
|
-
"Content-Type": "application/octet-stream",
|
|
508
|
-
},
|
|
509
|
-
body: chunk2,
|
|
510
|
-
});
|
|
511
|
-
```
|
|
135
|
+
```ts
|
|
136
|
+
import { Files } from "@visulima/storage";
|
|
137
|
+
import { S3Storage } from "@visulima/storage/provider/aws";
|
|
138
|
+
import { createFileTools } from "@visulima/storage/ai/sdk";
|
|
512
139
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
```typescript
|
|
516
|
-
// Check upload status
|
|
517
|
-
const statusResponse = await fetch(`/files/${id}`, {
|
|
518
|
-
method: "HEAD",
|
|
519
|
-
});
|
|
520
|
-
|
|
521
|
-
const offset = statusResponse.headers.get("X-Upload-Offset");
|
|
522
|
-
const complete = statusResponse.headers.get("X-Upload-Complete");
|
|
523
|
-
const chunks = JSON.parse(statusResponse.headers.get("X-Received-Chunks") || "[]");
|
|
524
|
-
|
|
525
|
-
console.log(`Uploaded: ${offset} bytes, Complete: ${complete}`);
|
|
140
|
+
const files = new Files({ adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }) });
|
|
141
|
+
const tools = createFileTools({ files });
|
|
526
142
|
```
|
|
527
143
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
- **Out-of-Order Chunks**: Chunks can be uploaded in any order
|
|
531
|
-
- **Idempotency**: Duplicate chunks are safely ignored
|
|
532
|
-
- **Resumable**: Check progress and resume from last uploaded chunk
|
|
533
|
-
- **Progress Tracking**: Real-time upload progress via HEAD requests
|
|
534
|
-
- **Chunk Size Limits**: Maximum 100MB per chunk (configurable)
|
|
144
|
+
Subpaths: `@visulima/storage/ai/{sdk,openai,claude,tanstack}` — Vercel AI SDK, OpenAI Responses + Agents (both under `/openai`), Claude Agent SDK, and TanStack AI.
|
|
535
145
|
|
|
536
|
-
|
|
146
|
+
## Documentation
|
|
537
147
|
|
|
538
|
-
-
|
|
539
|
-
-
|
|
540
|
-
-
|
|
541
|
-
-
|
|
542
|
-
-
|
|
148
|
+
- [Introduction](https://visulima.com/docs/packages/storage/introduction) — the two surfaces, when to use each
|
|
149
|
+
- [Files facade](https://visulima.com/docs/packages/storage/files-facade) — the eight-method reference
|
|
150
|
+
- [Services](https://visulima.com/docs/packages/storage/services) — per-provider configuration and capability matrix
|
|
151
|
+
- [Framework integrations](https://visulima.com/docs/packages/storage/framework) — Node, Fetch, Hono, Next.js, SolidStart, Bun, Deno, Cloudflare
|
|
152
|
+
- [Custom storage](https://visulima.com/docs/packages/storage/custom-storage) — write your own adapter against `BaseStorage`
|
|
153
|
+
- [Transformers](https://visulima.com/docs/packages/storage/transformers) — image / video / audio pipelines, caching
|
|
154
|
+
- [TUS handler](https://visulima.com/docs/packages/storage/tus-handler) · [Chunked uploads](https://visulima.com/docs/packages/storage/chunked-uploads) · [Authenticated uploads](https://visulima.com/docs/packages/storage/authenticated-file-uploads)
|
|
155
|
+
- [Batch operations](https://visulima.com/docs/packages/storage/batch-operations) · [Retry mechanism](https://visulima.com/docs/packages/storage/retry-mechanism) · [Caching](https://visulima.com/docs/packages/storage/caching)
|
|
156
|
+
- [Error handling](https://visulima.com/docs/packages/storage/error-handling) — `UploadError`, `ERRORS` enum, `wrapStorageError`
|
|
157
|
+
- [Observability](https://visulima.com/docs/packages/storage/observability) — metrics, OpenTelemetry, structured logs
|
|
158
|
+
- [OpenAPI export](https://visulima.com/docs/packages/storage/openapi)
|
|
543
159
|
|
|
544
160
|
## Supported Node.js Versions
|
|
545
161
|
|