@visulima/storage 1.0.0-alpha.3 → 1.0.0-alpha.30
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 +361 -0
- package/LICENSE.md +213 -573
- package/README.md +83 -470
- package/dist/adapter/nuxt/module.d.ts +41 -34
- package/dist/adapter/nuxt/module.js +1 -93
- package/dist/adapter/nuxt/node_modules/.bin/nuxi +22 -0
- package/dist/adapter/nuxt/node_modules/.bin/nuxt +22 -0
- 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 +361 -4
- package/dist/handler/http/node/index.js +1 -4
- 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 +58 -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/AwsLightFile-BSqjc_rD.js +1 -0
- package/dist/packem_shared/AwsLightMetaStorage-B-iQbToR.js +1 -0
- package/dist/packem_shared/AwsLightStorage-w21RxjUm.js +1 -0
- package/dist/packem_shared/AzureFile-Dgj2Tef4.js +1 -0
- package/dist/packem_shared/AzureSMetaStorage-CR-lfQNQ.js +1 -0
- package/dist/packem_shared/AzureStorage-2kl7JDXs.js +1 -0
- package/dist/packem_shared/BaseTransformer-Fpcuz4kj.js +1 -0
- package/dist/packem_shared/BoxFile-Be0S4N1L.js +1 -0
- package/dist/packem_shared/BoxMetaStorage-DLdXbZaV.js +1 -0
- package/dist/packem_shared/BoxStorage-BUeEJoGL.js +1 -0
- package/dist/packem_shared/BunS3File-D-SRiyrm.js +1 -0
- package/dist/packem_shared/BunS3MetaStorage-Bv_CTTMz.js +1 -0
- package/dist/packem_shared/BunS3Storage-WM3rF6Fw.js +1 -0
- package/dist/packem_shared/BunnyFile-Dotl-lO9.js +1 -0
- package/dist/packem_shared/BunnyMetaStorage-DNMTSeoN.js +1 -0
- package/dist/packem_shared/BunnyStorage-D3s2fRB3.js +1 -0
- package/dist/packem_shared/CloudinaryFile-B5-m33eS.js +1 -0
- package/dist/packem_shared/CloudinaryMetaStorage-DEBk5eQy.js +1 -0
- package/dist/packem_shared/CloudinaryStorage-BBE2-aVz.js +1 -0
- package/dist/packem_shared/DiskStorage-DL0GiG6k.js +1 -0
- package/dist/packem_shared/DiskStorageWithChecksum-BvUTn7O-.js +1 -0
- package/dist/packem_shared/DropboxFile-BGVG2kXM.js +1 -0
- package/dist/packem_shared/DropboxMetaStorage-C6vj1QDA.js +1 -0
- package/dist/packem_shared/DropboxStorage-BL3OIdE_.js +1 -0
- package/dist/packem_shared/ERRORS-CyOuSMLY.js +1 -0
- package/dist/packem_shared/File-BhfUgJjs.js +1 -0
- package/dist/packem_shared/Files-CJh9_N-9.js +1 -0
- package/dist/packem_shared/FirebaseFile-JEu3plMP.js +1 -0
- package/dist/packem_shared/FirebaseMetaStorage-CzyOim-J.js +1 -0
- package/dist/packem_shared/FirebaseStorage-lXMXy3Pm.js +2 -0
- package/dist/packem_shared/FtpFile-B8jaICTB.js +1 -0
- package/dist/packem_shared/FtpMetaStorage-1Njy0DpU.js +1 -0
- package/dist/packem_shared/FtpStorage-Dw94efNW.js +1 -0
- package/dist/packem_shared/GCSConfig-BQ0OpVhe.js +1 -0
- package/dist/packem_shared/GCSFile-CDQ6IWAz.js +1 -0
- package/dist/packem_shared/GCSMetaStorage-udgXA5ia.js +1 -0
- package/dist/packem_shared/GCStorage-ChY6uJuO.js +1 -0
- package/dist/packem_shared/GoogleDriveFile-D0aGfGbL.js +1 -0
- package/dist/packem_shared/GoogleDriveMetaStorage-WGuUZPyx.js +1 -0
- package/dist/packem_shared/GoogleDriveStorage-C0NhBBWH.js +1 -0
- package/dist/packem_shared/LocalMetaStorage-QMKL7McF.js +1 -0
- package/dist/packem_shared/MediaTransformer-D-1c9Q_k.js +1 -0
- package/dist/packem_shared/MetaStorage-Y4m1dWgd.js +1 -0
- package/dist/packem_shared/Metadata-B6Ir0KO7.js +1 -0
- package/dist/packem_shared/Multipart-CIFfQksD.js +1 -0
- package/dist/packem_shared/Multipart-D9WIud9R.js +1 -0
- package/dist/packem_shared/NetlifyBlobFile-PMZLJ8AC.js +1 -0
- package/dist/packem_shared/NetlifyBlobMetaStorage-ClIFdTkT.js +1 -0
- package/dist/packem_shared/NetlifyBlobStorage-CO89TGvF.js +1 -0
- package/dist/packem_shared/NoOpMetrics-Dky06sf1.js +1 -0
- package/dist/packem_shared/OneDriveFile-XbVVKIJh.js +1 -0
- package/dist/packem_shared/OneDriveMetaStorage-DS4f83X2.js +1 -0
- package/dist/packem_shared/OneDriveStorage-jAN46vRm.js +1 -0
- package/dist/packem_shared/OpenTelemetryMetrics-9uxQMSlg.js +1 -0
- package/dist/packem_shared/PocketBaseFile-CkAiSBb0.js +1 -0
- package/dist/packem_shared/PocketBaseMetaStorage-B6utPncj.js +1 -0
- package/dist/packem_shared/PocketBaseStorage-DpOjOKAt.js +1 -0
- package/dist/packem_shared/Rest-BuD3ySAg.js +1 -0
- package/dist/packem_shared/Rest-URrQ5FYM.js +1 -0
- package/dist/packem_shared/S3File-BfmCOET4.js +1 -0
- package/dist/packem_shared/S3MetaStorage-vcriiosn.js +1 -0
- package/dist/packem_shared/S3Storage-n1ohEZj4.js +1 -0
- package/dist/packem_shared/SftpFile-CQCxZNVq.js +1 -0
- package/dist/packem_shared/SftpMetaStorage-DYqXwCdM.js +1 -0
- package/dist/packem_shared/SftpStorage-Ban-WN8v.js +1 -0
- package/dist/packem_shared/SharePointFile-BA6X9Sxr.js +1 -0
- package/dist/packem_shared/SharePointMetaStorage-DVM5-X6g.js +1 -0
- package/dist/packem_shared/SharePointStorage-BY90zh1c.js +1 -0
- package/dist/packem_shared/SupabaseFile-DZ1iv9gM.js +1 -0
- package/dist/packem_shared/SupabaseMetaStorage-ivXoYVUu.js +1 -0
- package/dist/packem_shared/SupabaseStorage-pNbHAE1Y.js +1 -0
- package/dist/packem_shared/TUS_RESUMABLE-B7KtPVeC.js +1 -0
- package/dist/packem_shared/Tus-Fp_hx5ug.js +1 -0
- package/dist/packem_shared/Tus-TNG9HAY8.js +1 -0
- package/dist/packem_shared/UploadThingFile-BpG9mE8K.js +1 -0
- package/dist/packem_shared/UploadThingMetaStorage-BvKNzgm7.js +1 -0
- package/dist/packem_shared/UploadThingStorage-BcmIE2dI.js +1 -0
- package/dist/packem_shared/ValidationError-D8KKJiKA.js +1 -0
- package/dist/packem_shared/VercelBlobFile-Cni_1qwD.js +1 -0
- package/dist/packem_shared/VercelBlobMetaStorage-CwaqWucZ.js +1 -0
- package/dist/packem_shared/VercelBlobStorage-s260zfFo.js +1 -0
- package/dist/packem_shared/_commonjsHelpers-D6W6KoPK.js +1 -0
- package/dist/packem_shared/agentsListFiles-R-CnGKc4.js +1 -0
- package/dist/packem_shared/akamai-BYS9pP8S.js +1 -0
- package/dist/packem_shared/alibaba-BJQ6ijoK.js +1 -0
- package/dist/packem_shared/approval-BBeX3o4E.js +1 -0
- package/dist/packem_shared/approval.d-CMAYH9GF.d.ts +75 -0
- package/dist/packem_shared/aws-light-meta-storage-CstQBYXG.js +4 -0
- package/dist/packem_shared/azure-meta-storage-C4SrMtT2.js +1 -0
- package/dist/packem_shared/backblaze-CvdtCvJL.js +1 -0
- package/dist/packem_shared/base-handler-core-BYDQditz.js +1 -0
- package/dist/packem_shared/base-handler-fetch-DWzsPkmV.js +1 -0
- package/dist/packem_shared/base-handler-node-Dety2rQB.js +1 -0
- package/dist/packem_shared/cache-qV_5Umeq.js +1 -0
- package/dist/packem_shared/claudeListFiles-DAezbKEi.js +1 -0
- package/dist/packem_shared/cloudflare-Bm_Pg6yx.js +1 -0
- package/dist/packem_shared/createResponsesFileTools-BCep-qdO.js +1 -0
- package/dist/packem_shared/defaultCloudStorageFileNameValidation-shIZX_7L.js +1 -0
- package/dist/packem_shared/detect-file-type-5JhzC9RU.js +1 -0
- package/dist/packem_shared/digitalOcean-Lj1NfDzc.js +1 -0
- package/dist/packem_shared/disk-storage-CKAJvhcj.js +1 -0
- package/dist/packem_shared/disk-storage-with-checksum.d-mHcg2uLw.d.ts +150 -0
- package/dist/packem_shared/executors-DG6hGtvm.js +1 -0
- package/dist/packem_shared/executors.d-X4hz3zfu.d.ts +65 -0
- package/dist/packem_shared/exoscale-O0HzxoDz.js +1 -0
- package/dist/packem_shared/filebase-D-urO4Ob.js +1 -0
- package/dist/packem_shared/gcs-meta-storage-mZiqlX-9.js +1 -0
- package/dist/packem_shared/has-content-Bx2p8Okx.js +1 -0
- package/dist/packem_shared/headers-DC2MEOrK.js +27 -0
- package/dist/packem_shared/hetzner-DDxE7Gy7.js +1 -0
- package/dist/packem_shared/ibmCos-Rx_yku4H.js +1 -0
- package/dist/packem_shared/idriveE2-BFhw0Vwy.js +1 -0
- package/dist/packem_shared/index-B4ETk0Lu.js +5 -0
- package/dist/packem_shared/index.d-C4Fivh4I.d.ts +94 -0
- package/dist/packem_shared/is-expired-1JuZjDtb.js +1 -0
- package/dist/packem_shared/isRetryableError-BhizNeAz.js +1 -0
- package/dist/packem_shared/isValidMediaType-B-2UKjZx.js +1 -0
- package/dist/packem_shared/listFiles-B6VF05d-.js +1 -0
- package/dist/packem_shared/listFiles-BtP6VnUp.js +1 -0
- package/dist/packem_shared/local-meta-storage-Bi0mK6gD.js +1 -0
- package/dist/packem_shared/local-meta-storage.d-B11vHYNm.d.ts +21 -0
- package/dist/packem_shared/media-transformer.d-C3QvECD7.d.ts +331 -0
- package/dist/packem_shared/minio-T_Z3iEy7.js +1 -0
- package/dist/packem_shared/multipart-base-BxckfvQf.js +1 -0
- package/dist/packem_shared/oauth-refresh-Dg2ybc6_.js +1 -0
- package/dist/packem_shared/oracleCloud-D5T9s4JV.js +1 -0
- package/dist/packem_shared/ovhCloud-DCwef2fe.js +1 -0
- package/dist/packem_shared/part-match-B5fLLmFw.js +1 -0
- package/dist/packem_shared/path-D7rMc9nq-B718mbm6.js +1 -0
- package/dist/packem_shared/posix-dirname-CiHXPPnw.js +1 -0
- package/dist/packem_shared/response-builder-Wdo_fvcF.js +1 -0
- package/dist/packem_shared/rest-base-DI7xFXr5.js +1 -0
- package/dist/packem_shared/restOpenApiSpec-PaIVbESh.js +1 -0
- package/dist/packem_shared/s3-base-storage-Dbexfg7p.js +1 -0
- package/dist/packem_shared/s3-base-storage.d-V3N2nKCt.d.ts +260 -0
- package/dist/packem_shared/scaleway-ygRXOss9.js +1 -0
- package/dist/packem_shared/sharedGet-Ce7WGAsc.js +1 -0
- package/dist/packem_shared/storage-Dh0tJh7j.js +1 -0
- package/dist/packem_shared/storage.d-RteRC-cG.d.ts +1106 -0
- package/dist/packem_shared/storj-CVA9mM-7.js +1 -0
- package/dist/packem_shared/tencent-CAcAGaIW.js +1 -0
- package/dist/packem_shared/tigris-wmhjfsH2.js +1 -0
- package/dist/packem_shared/transformOpenApiSpec-C0vEbDTO.js +1 -0
- package/dist/packem_shared/tus-base.d-CygntIPM.d.ts +99 -0
- package/dist/packem_shared/tusOpenApiSpec-DF0-hlWV.js +1 -0
- package/dist/packem_shared/types.d-ChNXbbHG.d.ts +104 -0
- package/dist/packem_shared/types.d-DxonY4XS.d.ts +720 -0
- package/dist/packem_shared/types.d-cI_cMxcZ.d.ts +49 -0
- package/dist/packem_shared/update-size-DANV7aa2.js +1 -0
- package/dist/packem_shared/vultr-lK9L-sFk.js +1 -0
- package/dist/packem_shared/waitForStorage-ChSBLhLc.js +1 -0
- package/dist/packem_shared/wasabi-JQzxdrFy.js +1 -0
- package/dist/packem_shared/xhrOpenApiSpec-nyoboz83.js +1 -0
- package/dist/packem_shared/yandex-ZwvE77v4.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 +321 -4
- package/dist/storage/aws/index.js +1 -3
- package/dist/storage/aws-light/index.d.ts +254 -4
- package/dist/storage/aws-light/index.js +1 -3
- package/dist/storage/azure/index.d.ts +217 -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 +85 -0
- package/dist/storage/ftp/index.js +1 -0
- package/dist/storage/gcs/index.d.ts +181 -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/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 +86 -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 +195 -47
- package/dist/handler/base/base-handler-core.d.ts +0 -91
- package/dist/handler/base/base-handler-fetch.d.ts +0 -76
- package/dist/handler/base/base-handler-node.d.ts +0 -137
- package/dist/handler/multipart/multipart-base.d.ts +0 -84
- package/dist/handler/multipart/multipart-fetch.d.ts +0 -64
- package/dist/handler/multipart/multipart.d.ts +0 -49
- package/dist/handler/rest/rest-base.d.ts +0 -106
- package/dist/handler/rest/rest-fetch.d.ts +0 -88
- package/dist/handler/rest/rest.d.ts +0 -93
- package/dist/handler/tus/tus-base.d.ts +0 -152
- package/dist/handler/tus/tus-fetch.d.ts +0 -72
- package/dist/handler/tus/tus.d.ts +0 -78
- package/dist/handler/types.d.ts +0 -53
- package/dist/handler/utils/request-parser.d.ts +0 -72
- package/dist/handler/utils/response-builder.d.ts +0 -83
- package/dist/handler/utils/storage-utils.d.ts +0 -10
- package/dist/handler/utils/stream-utils.d.ts +0 -29
- package/dist/handler/utils/upload-handlers.d.ts +0 -76
- package/dist/metrics/index.d.ts +0 -2
- package/dist/metrics/no-op-metrics.d.ts +0 -15
- package/dist/metrics/opentelemetry-metrics.d.ts +0 -55
- package/dist/openapi/rest.d.ts +0 -7
- package/dist/openapi/shared.d.ts +0 -13
- package/dist/openapi/transform.d.ts +0 -3
- package/dist/openapi/tus.d.ts +0 -7
- package/dist/openapi/xhr.d.ts +0 -7
- package/dist/packem_shared/AwsLightFile-tTneXZgG.js +0 -11
- package/dist/packem_shared/AwsLightMetaStorage-BWSOtVaN.js +0 -4
- package/dist/packem_shared/AwsLightStorage-Blv-GP4v.js +0 -133
- package/dist/packem_shared/AzureFile-CesgFzps.js +0 -8
- package/dist/packem_shared/AzureSMetaStorage-CFs-OYJT.js +0 -88
- package/dist/packem_shared/AzureStorage-B0v048hG.js +0 -357
- package/dist/packem_shared/BaseTransformer-C2gLib6v.js +0 -82
- package/dist/packem_shared/DiskStorage-BlltBst6.js +0 -12
- package/dist/packem_shared/DiskStorageWithChecksum-BJTmMklc.js +0 -238
- package/dist/packem_shared/ERRORS-D0apMqnc.js +0 -97
- package/dist/packem_shared/File-Bb3P23dr.js +0 -69
- package/dist/packem_shared/GCSConfig-vPP22kN6.js +0 -11
- package/dist/packem_shared/GCSFile-BIEunhAN.js +0 -8
- package/dist/packem_shared/GCSMetaStorage-BMFEdzJ7.js +0 -7
- package/dist/packem_shared/GCStorage-DnhiwaS9.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-CNFK_Okz.js +0 -163
- package/dist/packem_shared/Multipart-CtUL7BQw.js +0 -128
- package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +0 -14
- package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +0 -9
- package/dist/packem_shared/NetlifyBlobStorage-CLPtjHqd.js +0 -376
- package/dist/packem_shared/NoOpMetrics-DhAk5rXc.js +0 -10
- package/dist/packem_shared/OpenTelemetryMetrics-BnxhqIaH.js +0 -67
- package/dist/packem_shared/Rest-CAOAEkOj.js +0 -267
- package/dist/packem_shared/Rest-DNuLwBrK.js +0 -228
- package/dist/packem_shared/S3File-DZiyk9Qt.js +0 -11
- package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +0 -76
- package/dist/packem_shared/S3Storage-DHmTk-hU.js +0 -316
- package/dist/packem_shared/TUS_RESUMABLE-GJzZ9R-f.js +0 -434
- package/dist/packem_shared/Tus-B8PmlMgR.js +0 -200
- package/dist/packem_shared/Tus-C4F1aYOl.js +0 -195
- package/dist/packem_shared/ValidationError-BfF1aE4h.js +0 -26
- package/dist/packem_shared/VercelBlobFile-BCg4aTEq.js +0 -18
- package/dist/packem_shared/VercelBlobMetaStorage-Bd9F-VFm.js +0 -9
- package/dist/packem_shared/VercelBlobStorage-DD9LMOS6.js +0 -261
- package/dist/packem_shared/_commonjsHelpers-B85MJLTf.js +0 -5
- package/dist/packem_shared/aws-light-meta-storage-DKJBgbR6.js +0 -446
- package/dist/packem_shared/backblaze-BlMnIcBC.js +0 -20
- package/dist/packem_shared/base-handler-core-BKuf4YLT.js +0 -303
- package/dist/packem_shared/base-handler-fetch-Cr0hLiqg.js +0 -291
- package/dist/packem_shared/base-handler-node-gk5aN9Cx.js +0 -730
- package/dist/packem_shared/cache-B88MXQ_2.js +0 -18
- package/dist/packem_shared/cloudflare-Bi1q8wXE.js +0 -21
- package/dist/packem_shared/defaultCloudStorageFileNameValidation-DUuacjWv.js +0 -11
- package/dist/packem_shared/digitalOcean-CWQRJM3L.js +0 -21
- package/dist/packem_shared/disk-storage-Bh2wy3YW.js +0 -810
- package/dist/packem_shared/gcs-meta-storage-0tgMNnPO.js +0 -158
- package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
- package/dist/packem_shared/headers-DoS5nwM-.js +0 -3220
- 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-B3i67SSX.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-GRCcnan7.js +0 -457
- package/dist/packem_shared/restOpenApiSpec-CwcHHY2C.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-6ohiToBy.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-DS17brnx.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
|
@@ -26,520 +26,133 @@
|
|
|
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`), eight methods, 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
|
-
});
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Custom Cache Implementation
|
|
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
|
-
}
|
|
160
|
-
|
|
161
|
-
async has(key: string): Promise<boolean> {
|
|
162
|
-
const exists = await this.redis.exists(key);
|
|
163
|
-
return exists === 1;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const redis = new Redis();
|
|
168
|
-
const cache = new RedisCache(redis);
|
|
169
|
-
|
|
170
|
-
const storage = new DiskStorage({
|
|
171
|
-
directory: "/uploads",
|
|
172
|
-
cache,
|
|
173
|
-
});
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### BentoCache Integration
|
|
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
|
-
});
|
|
198
|
-
|
|
199
|
-
const cache = new BentoCacheAdapter({
|
|
200
|
-
bento,
|
|
201
|
-
namespace: "storage",
|
|
202
|
-
defaultTtl: 3600000, // 1 hour
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
const storage = new DiskStorage({
|
|
206
|
-
directory: "/uploads",
|
|
207
|
-
cache,
|
|
208
|
-
});
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### Transformer Caching
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
import { MediaTransformer } from "@visulima/upload/transformer";
|
|
215
|
-
import ImageTransformer from "@visulima/upload/transformer/image";
|
|
216
|
-
import VideoTransformer from "@visulima/upload/transformer/video";
|
|
217
|
-
import { LRUCache } from "lru-cache";
|
|
218
|
-
|
|
219
|
-
const transformer = new MediaTransformer(storage, {
|
|
220
|
-
cache: new LRUCache({ max: 100, ttl: 3600000 }),
|
|
221
|
-
ImageTransformer: ImageTransformer,
|
|
222
|
-
VideoTransformer: VideoTransformer,
|
|
223
|
-
});
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Cache Interface
|
|
227
|
-
|
|
228
|
-
Any cache implementation must implement this interface:
|
|
229
|
-
|
|
230
|
-
```typescript
|
|
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
|
-
}
|
|
39
|
+
npm install @visulima/storage
|
|
40
|
+
# or yarn add / pnpm add
|
|
238
41
|
```
|
|
239
42
|
|
|
240
|
-
|
|
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.
|
|
241
44
|
|
|
242
|
-
##
|
|
45
|
+
## Quick start with `Files`
|
|
243
46
|
|
|
244
|
-
|
|
47
|
+
```ts
|
|
48
|
+
import { Files } from "@visulima/storage";
|
|
49
|
+
import { S3Storage } from "@visulima/storage/provider/aws";
|
|
245
50
|
|
|
246
|
-
|
|
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
|
-
},
|
|
51
|
+
const files = new Files({
|
|
52
|
+
adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }),
|
|
271
53
|
});
|
|
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
54
|
|
|
329
|
-
|
|
330
|
-
retryableStatusCodes?: number[];
|
|
55
|
+
await files.upload("avatars/abc.png", buffer, { contentType: "image/png" });
|
|
331
56
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
/** Custom function to calculate delay for a specific retry attempt */
|
|
336
|
-
calculateDelay?: (attempt: number, error: unknown) => number | undefined;
|
|
337
|
-
}
|
|
57
|
+
const url = await files.url("avatars/abc.png", { expiresIn: 900 });
|
|
58
|
+
const { body } = await files.download("avatars/abc.png");
|
|
338
59
|
```
|
|
339
60
|
|
|
340
|
-
|
|
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
|
-
});
|
|
61
|
+
Swap the adapter to change provider — everything else stays the same:
|
|
364
62
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
}
|
|
63
|
+
```ts
|
|
64
|
+
import { Files, DiskStorage } from "@visulima/storage";
|
|
65
|
+
import { BunnyStorage } from "@visulima/storage/provider/bunny";
|
|
368
66
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
// Handle retryable error
|
|
372
|
-
}
|
|
67
|
+
new Files({ adapter: new DiskStorage({ directory: "./uploads" }) });
|
|
68
|
+
new Files({ adapter: new BunnyStorage({ zone, accessKey, region: "de" }) });
|
|
373
69
|
```
|
|
374
70
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
The retry mechanism automatically handles:
|
|
71
|
+
→ See the [Files facade reference](https://visulima.com/docs/packages/storage/files-facade) for the full method surface (`upload`, `download`, `head`, `delete`, `copy`, `list`, `url`, `signedUploadUrl`, `.raw`) and body-type matrix.
|
|
378
72
|
|
|
379
|
-
|
|
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)
|
|
73
|
+
## Building an upload server?
|
|
383
74
|
|
|
384
|
-
|
|
75
|
+
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.
|
|
385
76
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
import { S3Storage } from "@visulima/storage";
|
|
390
|
-
|
|
391
|
-
const storage = new S3Storage({
|
|
392
|
-
bucket: "my-bucket",
|
|
393
|
-
region: "us-east-1",
|
|
394
|
-
retryConfig: {
|
|
395
|
-
maxRetries: 3,
|
|
396
|
-
// AWS SDK errors are automatically detected
|
|
397
|
-
},
|
|
398
|
-
});
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
#### Azure Blob Storage
|
|
77
|
+
```ts
|
|
78
|
+
import { DiskStorage } from "@visulima/storage";
|
|
79
|
+
import { Multipart, Rest } from "@visulima/storage/handler/http/node";
|
|
402
80
|
|
|
403
|
-
|
|
404
|
-
import { AzureStorage } from "@visulima/storage";
|
|
81
|
+
const storage = new DiskStorage({ directory: "./uploads" });
|
|
405
82
|
|
|
406
|
-
const
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
accountKey: "mykey",
|
|
410
|
-
retryConfig: {
|
|
411
|
-
maxRetries: 5,
|
|
412
|
-
initialDelay: 2000,
|
|
413
|
-
},
|
|
83
|
+
const multipart = new Multipart({ storage });
|
|
84
|
+
app.use("/upload", multipart.handle, (req, res) => {
|
|
85
|
+
res.json(req.body); // handler writes the stored file metadata to req.body
|
|
414
86
|
});
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
#### Google Cloud Storage
|
|
418
87
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
```typescript
|
|
422
|
-
import { GCStorage } from "@visulima/storage";
|
|
423
|
-
|
|
424
|
-
const storage = new GCStorage({
|
|
425
|
-
bucket: "my-bucket",
|
|
426
|
-
projectId: "my-project",
|
|
427
|
-
retryConfig: {
|
|
428
|
-
maxRetries: 3,
|
|
429
|
-
// Works with GCS's existing retryOptions
|
|
430
|
-
},
|
|
431
|
-
});
|
|
88
|
+
const rest = new Rest({ storage });
|
|
89
|
+
app.use("/files", rest.handle);
|
|
432
90
|
```
|
|
433
91
|
|
|
434
|
-
|
|
92
|
+
Three handlers cover the common upload patterns:
|
|
435
93
|
|
|
436
|
-
|
|
437
|
-
|
|
94
|
+
- **Multipart** — `multipart/form-data` from HTML forms.
|
|
95
|
+
- **REST** — direct binary `POST` / `PUT`. Optional client-side chunking for large files.
|
|
96
|
+
- **TUS** — resumable uploads ([tus.io](https://tus.io)) for unreliable networks and very large files.
|
|
438
97
|
|
|
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
|
-
```
|
|
98
|
+
→ 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).
|
|
447
99
|
|
|
448
|
-
|
|
100
|
+
## Choosing your surface
|
|
449
101
|
|
|
450
|
-
|
|
451
|
-
|
|
102
|
+
| You want to… | Use |
|
|
103
|
+
| ------------------------------------------------------ | ------------------------------------------- |
|
|
104
|
+
| Save a `Blob` / `Buffer` to S3 and get a signed URL | `Files` |
|
|
105
|
+
| Drop in a file picker / "import from cloud" flow | `Files` with a consumer-provider adapter |
|
|
106
|
+
| Expose ad-hoc storage to an AI agent or LLM tool | `Files` + `@visulima/storage/ai/*` subpaths |
|
|
107
|
+
| Build a TUS / multipart / chunked upload endpoint | adapter + handler |
|
|
108
|
+
| Transform images / video / audio on the fly | adapter + transformer |
|
|
109
|
+
| Hook `onCreate` / `onComplete` / `onDelete` lifecycles | adapter |
|
|
110
|
+
| Export OpenAPI for an upload endpoint | adapter |
|
|
452
111
|
|
|
453
|
-
|
|
454
|
-
storeName: "uploads",
|
|
455
|
-
retryConfig: {
|
|
456
|
-
maxRetries: 3,
|
|
457
|
-
},
|
|
458
|
-
});
|
|
459
|
-
```
|
|
112
|
+
## Providers
|
|
460
113
|
|
|
461
|
-
|
|
114
|
+
Object storage (service credentials, presigned URLs, S3-style):
|
|
462
115
|
|
|
463
|
-
|
|
116
|
+
- AWS S3 · Azure Blob · Google Cloud Storage · Vercel Blob · Netlify Blobs · Local disk
|
|
464
117
|
|
|
465
|
-
|
|
118
|
+
S3-compatible (branded client configs under `provider/aws/s3/clients`):
|
|
466
119
|
|
|
467
|
-
|
|
468
|
-
import { Rest } from "@visulima/upload/handler/rest";
|
|
120
|
+
- 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
|
|
469
121
|
|
|
470
|
-
|
|
122
|
+
Consumer providers (user OAuth or service-credential, all peer-dep gated):
|
|
471
123
|
|
|
472
|
-
|
|
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
|
-
});
|
|
124
|
+
- Dropbox · Google Drive · Microsoft OneDrive · SharePoint · Box · Supabase · UploadThing · Bunny Storage · Cloudinary · Firebase Storage · PocketBase
|
|
482
125
|
|
|
483
|
-
|
|
484
|
-
// id is the upload session ID
|
|
485
|
-
```
|
|
126
|
+
→ See the [capability matrix](https://visulima.com/docs/packages/storage/services/capabilities) for what each provider supports (presign, copy, list, signed uploads, …).
|
|
486
127
|
|
|
487
|
-
|
|
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
|
-
});
|
|
128
|
+
## AI tool integrations
|
|
500
129
|
|
|
501
|
-
|
|
502
|
-
await fetch(`/files/${id}`, {
|
|
503
|
-
method: "PATCH",
|
|
504
|
-
headers: {
|
|
505
|
-
"X-Chunk-Offset": "524288",
|
|
506
|
-
"Content-Length": "524288",
|
|
507
|
-
"Content-Type": "application/octet-stream",
|
|
508
|
-
},
|
|
509
|
-
body: chunk2,
|
|
510
|
-
});
|
|
511
|
-
```
|
|
130
|
+
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.
|
|
512
131
|
|
|
513
|
-
|
|
132
|
+
```ts
|
|
133
|
+
import { Files } from "@visulima/storage";
|
|
134
|
+
import { S3Storage } from "@visulima/storage/provider/aws";
|
|
135
|
+
import { createFileTools } from "@visulima/storage/ai/sdk";
|
|
514
136
|
|
|
515
|
-
|
|
516
|
-
|
|
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}`);
|
|
137
|
+
const files = new Files({ adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }) });
|
|
138
|
+
const tools = createFileTools({ files });
|
|
526
139
|
```
|
|
527
140
|
|
|
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)
|
|
141
|
+
Subpaths: `@visulima/storage/ai/{sdk,openai,claude,tanstack}` — Vercel AI SDK, OpenAI Responses + Agents (both under `/openai`), Claude Agent SDK, and TanStack AI.
|
|
535
142
|
|
|
536
|
-
|
|
143
|
+
## Documentation
|
|
537
144
|
|
|
538
|
-
-
|
|
539
|
-
-
|
|
540
|
-
-
|
|
541
|
-
-
|
|
542
|
-
-
|
|
145
|
+
- [Introduction](https://visulima.com/docs/packages/storage/introduction) — the two surfaces, when to use each
|
|
146
|
+
- [Files facade](https://visulima.com/docs/packages/storage/files-facade) — the eight-method reference
|
|
147
|
+
- [Services](https://visulima.com/docs/packages/storage/services) — per-provider configuration and capability matrix
|
|
148
|
+
- [Framework integrations](https://visulima.com/docs/packages/storage/framework) — Node, Fetch, Hono, Next.js, SolidStart, Bun, Deno, Cloudflare
|
|
149
|
+
- [Custom storage](https://visulima.com/docs/packages/storage/custom-storage) — write your own adapter against `BaseStorage`
|
|
150
|
+
- [Transformers](https://visulima.com/docs/packages/storage/transformers) — image / video / audio pipelines, caching
|
|
151
|
+
- [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)
|
|
152
|
+
- [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)
|
|
153
|
+
- [Error handling](https://visulima.com/docs/packages/storage/error-handling) — `UploadError`, `ERRORS` enum, `wrapStorageError`
|
|
154
|
+
- [Observability](https://visulima.com/docs/packages/storage/observability) — metrics, OpenTelemetry, structured logs
|
|
155
|
+
- [OpenAPI export](https://visulima.com/docs/packages/storage/openapi)
|
|
543
156
|
|
|
544
157
|
## Supported Node.js Versions
|
|
545
158
|
|
|
@@ -564,14 +177,14 @@ This is an open source project and will always remain free to use. If you think
|
|
|
564
177
|
|
|
565
178
|
## License
|
|
566
179
|
|
|
567
|
-
The visulima
|
|
180
|
+
The visulima storage is open-sourced software licensed under the [MIT][license]
|
|
568
181
|
|
|
569
182
|
<!-- badges -->
|
|
570
183
|
|
|
571
|
-
[license-badge]: https://img.shields.io/npm/l/@visulima/
|
|
184
|
+
[license-badge]: https://img.shields.io/npm/l/@visulima/storage?style=for-the-badge
|
|
572
185
|
[license]: https://github.com/visulima/visulima/blob/main/LICENSE
|
|
573
|
-
[npm-downloads-badge]: https://img.shields.io/npm/dm/@visulima/
|
|
574
|
-
[npm-downloads]: https://www.npmjs.com/package/@visulima/
|
|
186
|
+
[npm-downloads-badge]: https://img.shields.io/npm/dm/@visulima/storage?style=for-the-badge
|
|
187
|
+
[npm-downloads]: https://www.npmjs.com/package/@visulima/storage
|
|
575
188
|
[prs-welcome-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge
|
|
576
189
|
[prs-welcome]: https://github.com/visulima/visulima/blob/main/.github/CONTRIBUTING.md
|
|
577
190
|
[chat-badge]: https://img.shields.io/discord/932323359193186354.svg?style=for-the-badge
|