@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.
Files changed (417) hide show
  1. package/CHANGELOG.md +361 -0
  2. package/LICENSE.md +213 -573
  3. package/README.md +83 -470
  4. package/dist/adapter/nuxt/module.d.ts +41 -34
  5. package/dist/adapter/nuxt/module.js +1 -93
  6. package/dist/adapter/nuxt/node_modules/.bin/nuxi +22 -0
  7. package/dist/adapter/nuxt/node_modules/.bin/nuxt +22 -0
  8. package/dist/adapter/nuxt/package.json +0 -6
  9. package/dist/ai/ai-sdk/index.d.ts +113 -0
  10. package/dist/ai/ai-sdk/index.js +1 -0
  11. package/dist/ai/claude/index.d.ts +177 -0
  12. package/dist/ai/claude/index.js +1 -0
  13. package/dist/ai/openai/index.d.ts +205 -0
  14. package/dist/ai/openai/index.js +1 -0
  15. package/dist/ai/tanstack/index.d.ts +115 -0
  16. package/dist/ai/tanstack/index.js +1 -0
  17. package/dist/handler/http/fetch/index.d.ts +303 -4
  18. package/dist/handler/http/fetch/index.js +1 -4
  19. package/dist/handler/http/hono/index.d.ts +73 -64
  20. package/dist/handler/http/hono/index.js +1 -65
  21. package/dist/handler/http/nextjs/index.d.ts +66 -58
  22. package/dist/handler/http/nextjs/index.js +1 -37
  23. package/dist/handler/http/node/index.d.ts +361 -4
  24. package/dist/handler/http/node/index.js +1 -4
  25. package/dist/handler/http/solid-start/index.d.ts +66 -57
  26. package/dist/handler/http/solid-start/index.js +1 -44
  27. package/dist/index.d.ts +58 -17
  28. package/dist/index.js +1 -13
  29. package/dist/openapi/index.d.ts +24 -5
  30. package/dist/openapi/index.js +1 -5
  31. package/dist/packem_shared/AwsLightFile-BSqjc_rD.js +1 -0
  32. package/dist/packem_shared/AwsLightMetaStorage-B-iQbToR.js +1 -0
  33. package/dist/packem_shared/AwsLightStorage-w21RxjUm.js +1 -0
  34. package/dist/packem_shared/AzureFile-Dgj2Tef4.js +1 -0
  35. package/dist/packem_shared/AzureSMetaStorage-CR-lfQNQ.js +1 -0
  36. package/dist/packem_shared/AzureStorage-2kl7JDXs.js +1 -0
  37. package/dist/packem_shared/BaseTransformer-Fpcuz4kj.js +1 -0
  38. package/dist/packem_shared/BoxFile-Be0S4N1L.js +1 -0
  39. package/dist/packem_shared/BoxMetaStorage-DLdXbZaV.js +1 -0
  40. package/dist/packem_shared/BoxStorage-BUeEJoGL.js +1 -0
  41. package/dist/packem_shared/BunS3File-D-SRiyrm.js +1 -0
  42. package/dist/packem_shared/BunS3MetaStorage-Bv_CTTMz.js +1 -0
  43. package/dist/packem_shared/BunS3Storage-WM3rF6Fw.js +1 -0
  44. package/dist/packem_shared/BunnyFile-Dotl-lO9.js +1 -0
  45. package/dist/packem_shared/BunnyMetaStorage-DNMTSeoN.js +1 -0
  46. package/dist/packem_shared/BunnyStorage-D3s2fRB3.js +1 -0
  47. package/dist/packem_shared/CloudinaryFile-B5-m33eS.js +1 -0
  48. package/dist/packem_shared/CloudinaryMetaStorage-DEBk5eQy.js +1 -0
  49. package/dist/packem_shared/CloudinaryStorage-BBE2-aVz.js +1 -0
  50. package/dist/packem_shared/DiskStorage-DL0GiG6k.js +1 -0
  51. package/dist/packem_shared/DiskStorageWithChecksum-BvUTn7O-.js +1 -0
  52. package/dist/packem_shared/DropboxFile-BGVG2kXM.js +1 -0
  53. package/dist/packem_shared/DropboxMetaStorage-C6vj1QDA.js +1 -0
  54. package/dist/packem_shared/DropboxStorage-BL3OIdE_.js +1 -0
  55. package/dist/packem_shared/ERRORS-CyOuSMLY.js +1 -0
  56. package/dist/packem_shared/File-BhfUgJjs.js +1 -0
  57. package/dist/packem_shared/Files-CJh9_N-9.js +1 -0
  58. package/dist/packem_shared/FirebaseFile-JEu3plMP.js +1 -0
  59. package/dist/packem_shared/FirebaseMetaStorage-CzyOim-J.js +1 -0
  60. package/dist/packem_shared/FirebaseStorage-lXMXy3Pm.js +2 -0
  61. package/dist/packem_shared/FtpFile-B8jaICTB.js +1 -0
  62. package/dist/packem_shared/FtpMetaStorage-1Njy0DpU.js +1 -0
  63. package/dist/packem_shared/FtpStorage-Dw94efNW.js +1 -0
  64. package/dist/packem_shared/GCSConfig-BQ0OpVhe.js +1 -0
  65. package/dist/packem_shared/GCSFile-CDQ6IWAz.js +1 -0
  66. package/dist/packem_shared/GCSMetaStorage-udgXA5ia.js +1 -0
  67. package/dist/packem_shared/GCStorage-ChY6uJuO.js +1 -0
  68. package/dist/packem_shared/GoogleDriveFile-D0aGfGbL.js +1 -0
  69. package/dist/packem_shared/GoogleDriveMetaStorage-WGuUZPyx.js +1 -0
  70. package/dist/packem_shared/GoogleDriveStorage-C0NhBBWH.js +1 -0
  71. package/dist/packem_shared/LocalMetaStorage-QMKL7McF.js +1 -0
  72. package/dist/packem_shared/MediaTransformer-D-1c9Q_k.js +1 -0
  73. package/dist/packem_shared/MetaStorage-Y4m1dWgd.js +1 -0
  74. package/dist/packem_shared/Metadata-B6Ir0KO7.js +1 -0
  75. package/dist/packem_shared/Multipart-CIFfQksD.js +1 -0
  76. package/dist/packem_shared/Multipart-D9WIud9R.js +1 -0
  77. package/dist/packem_shared/NetlifyBlobFile-PMZLJ8AC.js +1 -0
  78. package/dist/packem_shared/NetlifyBlobMetaStorage-ClIFdTkT.js +1 -0
  79. package/dist/packem_shared/NetlifyBlobStorage-CO89TGvF.js +1 -0
  80. package/dist/packem_shared/NoOpMetrics-Dky06sf1.js +1 -0
  81. package/dist/packem_shared/OneDriveFile-XbVVKIJh.js +1 -0
  82. package/dist/packem_shared/OneDriveMetaStorage-DS4f83X2.js +1 -0
  83. package/dist/packem_shared/OneDriveStorage-jAN46vRm.js +1 -0
  84. package/dist/packem_shared/OpenTelemetryMetrics-9uxQMSlg.js +1 -0
  85. package/dist/packem_shared/PocketBaseFile-CkAiSBb0.js +1 -0
  86. package/dist/packem_shared/PocketBaseMetaStorage-B6utPncj.js +1 -0
  87. package/dist/packem_shared/PocketBaseStorage-DpOjOKAt.js +1 -0
  88. package/dist/packem_shared/Rest-BuD3ySAg.js +1 -0
  89. package/dist/packem_shared/Rest-URrQ5FYM.js +1 -0
  90. package/dist/packem_shared/S3File-BfmCOET4.js +1 -0
  91. package/dist/packem_shared/S3MetaStorage-vcriiosn.js +1 -0
  92. package/dist/packem_shared/S3Storage-n1ohEZj4.js +1 -0
  93. package/dist/packem_shared/SftpFile-CQCxZNVq.js +1 -0
  94. package/dist/packem_shared/SftpMetaStorage-DYqXwCdM.js +1 -0
  95. package/dist/packem_shared/SftpStorage-Ban-WN8v.js +1 -0
  96. package/dist/packem_shared/SharePointFile-BA6X9Sxr.js +1 -0
  97. package/dist/packem_shared/SharePointMetaStorage-DVM5-X6g.js +1 -0
  98. package/dist/packem_shared/SharePointStorage-BY90zh1c.js +1 -0
  99. package/dist/packem_shared/SupabaseFile-DZ1iv9gM.js +1 -0
  100. package/dist/packem_shared/SupabaseMetaStorage-ivXoYVUu.js +1 -0
  101. package/dist/packem_shared/SupabaseStorage-pNbHAE1Y.js +1 -0
  102. package/dist/packem_shared/TUS_RESUMABLE-B7KtPVeC.js +1 -0
  103. package/dist/packem_shared/Tus-Fp_hx5ug.js +1 -0
  104. package/dist/packem_shared/Tus-TNG9HAY8.js +1 -0
  105. package/dist/packem_shared/UploadThingFile-BpG9mE8K.js +1 -0
  106. package/dist/packem_shared/UploadThingMetaStorage-BvKNzgm7.js +1 -0
  107. package/dist/packem_shared/UploadThingStorage-BcmIE2dI.js +1 -0
  108. package/dist/packem_shared/ValidationError-D8KKJiKA.js +1 -0
  109. package/dist/packem_shared/VercelBlobFile-Cni_1qwD.js +1 -0
  110. package/dist/packem_shared/VercelBlobMetaStorage-CwaqWucZ.js +1 -0
  111. package/dist/packem_shared/VercelBlobStorage-s260zfFo.js +1 -0
  112. package/dist/packem_shared/_commonjsHelpers-D6W6KoPK.js +1 -0
  113. package/dist/packem_shared/agentsListFiles-R-CnGKc4.js +1 -0
  114. package/dist/packem_shared/akamai-BYS9pP8S.js +1 -0
  115. package/dist/packem_shared/alibaba-BJQ6ijoK.js +1 -0
  116. package/dist/packem_shared/approval-BBeX3o4E.js +1 -0
  117. package/dist/packem_shared/approval.d-CMAYH9GF.d.ts +75 -0
  118. package/dist/packem_shared/aws-light-meta-storage-CstQBYXG.js +4 -0
  119. package/dist/packem_shared/azure-meta-storage-C4SrMtT2.js +1 -0
  120. package/dist/packem_shared/backblaze-CvdtCvJL.js +1 -0
  121. package/dist/packem_shared/base-handler-core-BYDQditz.js +1 -0
  122. package/dist/packem_shared/base-handler-fetch-DWzsPkmV.js +1 -0
  123. package/dist/packem_shared/base-handler-node-Dety2rQB.js +1 -0
  124. package/dist/packem_shared/cache-qV_5Umeq.js +1 -0
  125. package/dist/packem_shared/claudeListFiles-DAezbKEi.js +1 -0
  126. package/dist/packem_shared/cloudflare-Bm_Pg6yx.js +1 -0
  127. package/dist/packem_shared/createResponsesFileTools-BCep-qdO.js +1 -0
  128. package/dist/packem_shared/defaultCloudStorageFileNameValidation-shIZX_7L.js +1 -0
  129. package/dist/packem_shared/detect-file-type-5JhzC9RU.js +1 -0
  130. package/dist/packem_shared/digitalOcean-Lj1NfDzc.js +1 -0
  131. package/dist/packem_shared/disk-storage-CKAJvhcj.js +1 -0
  132. package/dist/packem_shared/disk-storage-with-checksum.d-mHcg2uLw.d.ts +150 -0
  133. package/dist/packem_shared/executors-DG6hGtvm.js +1 -0
  134. package/dist/packem_shared/executors.d-X4hz3zfu.d.ts +65 -0
  135. package/dist/packem_shared/exoscale-O0HzxoDz.js +1 -0
  136. package/dist/packem_shared/filebase-D-urO4Ob.js +1 -0
  137. package/dist/packem_shared/gcs-meta-storage-mZiqlX-9.js +1 -0
  138. package/dist/packem_shared/has-content-Bx2p8Okx.js +1 -0
  139. package/dist/packem_shared/headers-DC2MEOrK.js +27 -0
  140. package/dist/packem_shared/hetzner-DDxE7Gy7.js +1 -0
  141. package/dist/packem_shared/ibmCos-Rx_yku4H.js +1 -0
  142. package/dist/packem_shared/idriveE2-BFhw0Vwy.js +1 -0
  143. package/dist/packem_shared/index-B4ETk0Lu.js +5 -0
  144. package/dist/packem_shared/index.d-C4Fivh4I.d.ts +94 -0
  145. package/dist/packem_shared/is-expired-1JuZjDtb.js +1 -0
  146. package/dist/packem_shared/isRetryableError-BhizNeAz.js +1 -0
  147. package/dist/packem_shared/isValidMediaType-B-2UKjZx.js +1 -0
  148. package/dist/packem_shared/listFiles-B6VF05d-.js +1 -0
  149. package/dist/packem_shared/listFiles-BtP6VnUp.js +1 -0
  150. package/dist/packem_shared/local-meta-storage-Bi0mK6gD.js +1 -0
  151. package/dist/packem_shared/local-meta-storage.d-B11vHYNm.d.ts +21 -0
  152. package/dist/packem_shared/media-transformer.d-C3QvECD7.d.ts +331 -0
  153. package/dist/packem_shared/minio-T_Z3iEy7.js +1 -0
  154. package/dist/packem_shared/multipart-base-BxckfvQf.js +1 -0
  155. package/dist/packem_shared/oauth-refresh-Dg2ybc6_.js +1 -0
  156. package/dist/packem_shared/oracleCloud-D5T9s4JV.js +1 -0
  157. package/dist/packem_shared/ovhCloud-DCwef2fe.js +1 -0
  158. package/dist/packem_shared/part-match-B5fLLmFw.js +1 -0
  159. package/dist/packem_shared/path-D7rMc9nq-B718mbm6.js +1 -0
  160. package/dist/packem_shared/posix-dirname-CiHXPPnw.js +1 -0
  161. package/dist/packem_shared/response-builder-Wdo_fvcF.js +1 -0
  162. package/dist/packem_shared/rest-base-DI7xFXr5.js +1 -0
  163. package/dist/packem_shared/restOpenApiSpec-PaIVbESh.js +1 -0
  164. package/dist/packem_shared/s3-base-storage-Dbexfg7p.js +1 -0
  165. package/dist/packem_shared/s3-base-storage.d-V3N2nKCt.d.ts +260 -0
  166. package/dist/packem_shared/scaleway-ygRXOss9.js +1 -0
  167. package/dist/packem_shared/sharedGet-Ce7WGAsc.js +1 -0
  168. package/dist/packem_shared/storage-Dh0tJh7j.js +1 -0
  169. package/dist/packem_shared/storage.d-RteRC-cG.d.ts +1106 -0
  170. package/dist/packem_shared/storj-CVA9mM-7.js +1 -0
  171. package/dist/packem_shared/tencent-CAcAGaIW.js +1 -0
  172. package/dist/packem_shared/tigris-wmhjfsH2.js +1 -0
  173. package/dist/packem_shared/transformOpenApiSpec-C0vEbDTO.js +1 -0
  174. package/dist/packem_shared/tus-base.d-CygntIPM.d.ts +99 -0
  175. package/dist/packem_shared/tusOpenApiSpec-DF0-hlWV.js +1 -0
  176. package/dist/packem_shared/types.d-ChNXbbHG.d.ts +104 -0
  177. package/dist/packem_shared/types.d-DxonY4XS.d.ts +720 -0
  178. package/dist/packem_shared/types.d-cI_cMxcZ.d.ts +49 -0
  179. package/dist/packem_shared/update-size-DANV7aa2.js +1 -0
  180. package/dist/packem_shared/vultr-lK9L-sFk.js +1 -0
  181. package/dist/packem_shared/waitForStorage-ChSBLhLc.js +1 -0
  182. package/dist/packem_shared/wasabi-JQzxdrFy.js +1 -0
  183. package/dist/packem_shared/xhrOpenApiSpec-nyoboz83.js +1 -0
  184. package/dist/packem_shared/yandex-ZwvE77v4.js +1 -0
  185. package/dist/storage/aws/clients/index.d.ts +612 -6
  186. package/dist/storage/aws/clients/index.js +1 -6
  187. package/dist/storage/aws/index.d.ts +321 -4
  188. package/dist/storage/aws/index.js +1 -3
  189. package/dist/storage/aws-light/index.d.ts +254 -4
  190. package/dist/storage/aws-light/index.js +1 -3
  191. package/dist/storage/azure/index.d.ts +217 -4
  192. package/dist/storage/azure/index.js +1 -3
  193. package/dist/storage/box/index.d.ts +189 -0
  194. package/dist/storage/box/index.js +1 -0
  195. package/dist/storage/bun-s3/index.d.ts +200 -0
  196. package/dist/storage/bun-s3/index.js +1 -0
  197. package/dist/storage/bunny/index.d.ts +119 -0
  198. package/dist/storage/bunny/index.js +1 -0
  199. package/dist/storage/cloudinary/index.d.ts +121 -0
  200. package/dist/storage/cloudinary/index.js +1 -0
  201. package/dist/storage/dropbox/index.d.ts +132 -0
  202. package/dist/storage/dropbox/index.js +1 -0
  203. package/dist/storage/firebase/index.d.ts +192 -0
  204. package/dist/storage/firebase/index.js +1 -0
  205. package/dist/storage/ftp/index.d.ts +85 -0
  206. package/dist/storage/ftp/index.js +1 -0
  207. package/dist/storage/gcs/index.d.ts +181 -5
  208. package/dist/storage/gcs/index.js +1 -4
  209. package/dist/storage/google-drive/index.d.ts +148 -0
  210. package/dist/storage/google-drive/index.js +1 -0
  211. package/dist/storage/local/index.d.ts +7 -4
  212. package/dist/storage/local/index.js +1 -3
  213. package/dist/storage/netlify-blob/index.d.ts +147 -4
  214. package/dist/storage/netlify-blob/index.js +1 -3
  215. package/dist/storage/onedrive/index.d.ts +103 -0
  216. package/dist/storage/onedrive/index.js +1 -0
  217. package/dist/storage/pocketbase/index.d.ts +172 -0
  218. package/dist/storage/pocketbase/index.js +1 -0
  219. package/dist/storage/sftp/index.d.ts +86 -0
  220. package/dist/storage/sftp/index.js +1 -0
  221. package/dist/storage/sharepoint/index.d.ts +180 -0
  222. package/dist/storage/sharepoint/index.js +1 -0
  223. package/dist/storage/supabase/index.d.ts +115 -0
  224. package/dist/storage/supabase/index.js +1 -0
  225. package/dist/storage/uploadthing/index.d.ts +95 -0
  226. package/dist/storage/uploadthing/index.js +1 -0
  227. package/dist/storage/vercel-blob/index.d.ts +189 -4
  228. package/dist/storage/vercel-blob/index.js +1 -3
  229. package/dist/transformer/audio-transformer.d.ts +127 -125
  230. package/dist/transformer/audio-transformer.js +1 -278
  231. package/dist/transformer/image-transformer.d.ts +573 -568
  232. package/dist/transformer/image-transformer.js +1 -1100
  233. package/dist/transformer/index.d.ts +62 -5
  234. package/dist/transformer/index.js +1 -4
  235. package/dist/transformer/video-transformer.d.ts +144 -142
  236. package/dist/transformer/video-transformer.js +1 -310
  237. package/package.json +195 -47
  238. package/dist/handler/base/base-handler-core.d.ts +0 -91
  239. package/dist/handler/base/base-handler-fetch.d.ts +0 -76
  240. package/dist/handler/base/base-handler-node.d.ts +0 -137
  241. package/dist/handler/multipart/multipart-base.d.ts +0 -84
  242. package/dist/handler/multipart/multipart-fetch.d.ts +0 -64
  243. package/dist/handler/multipart/multipart.d.ts +0 -49
  244. package/dist/handler/rest/rest-base.d.ts +0 -106
  245. package/dist/handler/rest/rest-fetch.d.ts +0 -88
  246. package/dist/handler/rest/rest.d.ts +0 -93
  247. package/dist/handler/tus/tus-base.d.ts +0 -152
  248. package/dist/handler/tus/tus-fetch.d.ts +0 -72
  249. package/dist/handler/tus/tus.d.ts +0 -78
  250. package/dist/handler/types.d.ts +0 -53
  251. package/dist/handler/utils/request-parser.d.ts +0 -72
  252. package/dist/handler/utils/response-builder.d.ts +0 -83
  253. package/dist/handler/utils/storage-utils.d.ts +0 -10
  254. package/dist/handler/utils/stream-utils.d.ts +0 -29
  255. package/dist/handler/utils/upload-handlers.d.ts +0 -76
  256. package/dist/metrics/index.d.ts +0 -2
  257. package/dist/metrics/no-op-metrics.d.ts +0 -15
  258. package/dist/metrics/opentelemetry-metrics.d.ts +0 -55
  259. package/dist/openapi/rest.d.ts +0 -7
  260. package/dist/openapi/shared.d.ts +0 -13
  261. package/dist/openapi/transform.d.ts +0 -3
  262. package/dist/openapi/tus.d.ts +0 -7
  263. package/dist/openapi/xhr.d.ts +0 -7
  264. package/dist/packem_shared/AwsLightFile-tTneXZgG.js +0 -11
  265. package/dist/packem_shared/AwsLightMetaStorage-BWSOtVaN.js +0 -4
  266. package/dist/packem_shared/AwsLightStorage-Blv-GP4v.js +0 -133
  267. package/dist/packem_shared/AzureFile-CesgFzps.js +0 -8
  268. package/dist/packem_shared/AzureSMetaStorage-CFs-OYJT.js +0 -88
  269. package/dist/packem_shared/AzureStorage-B0v048hG.js +0 -357
  270. package/dist/packem_shared/BaseTransformer-C2gLib6v.js +0 -82
  271. package/dist/packem_shared/DiskStorage-BlltBst6.js +0 -12
  272. package/dist/packem_shared/DiskStorageWithChecksum-BJTmMklc.js +0 -238
  273. package/dist/packem_shared/ERRORS-D0apMqnc.js +0 -97
  274. package/dist/packem_shared/File-Bb3P23dr.js +0 -69
  275. package/dist/packem_shared/GCSConfig-vPP22kN6.js +0 -11
  276. package/dist/packem_shared/GCSFile-BIEunhAN.js +0 -8
  277. package/dist/packem_shared/GCSMetaStorage-BMFEdzJ7.js +0 -7
  278. package/dist/packem_shared/GCStorage-DnhiwaS9.js +0 -406
  279. package/dist/packem_shared/LocalMetaStorage-CZHhKkMd.js +0 -7
  280. package/dist/packem_shared/MediaTransformer-D6658DL1.js +0 -1197
  281. package/dist/packem_shared/MetaStorage-pECeFOad.js +0 -46
  282. package/dist/packem_shared/Metadata-DRLXeJ0F.js +0 -89
  283. package/dist/packem_shared/Multipart-CNFK_Okz.js +0 -163
  284. package/dist/packem_shared/Multipart-CtUL7BQw.js +0 -128
  285. package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +0 -14
  286. package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +0 -9
  287. package/dist/packem_shared/NetlifyBlobStorage-CLPtjHqd.js +0 -376
  288. package/dist/packem_shared/NoOpMetrics-DhAk5rXc.js +0 -10
  289. package/dist/packem_shared/OpenTelemetryMetrics-BnxhqIaH.js +0 -67
  290. package/dist/packem_shared/Rest-CAOAEkOj.js +0 -267
  291. package/dist/packem_shared/Rest-DNuLwBrK.js +0 -228
  292. package/dist/packem_shared/S3File-DZiyk9Qt.js +0 -11
  293. package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +0 -76
  294. package/dist/packem_shared/S3Storage-DHmTk-hU.js +0 -316
  295. package/dist/packem_shared/TUS_RESUMABLE-GJzZ9R-f.js +0 -434
  296. package/dist/packem_shared/Tus-B8PmlMgR.js +0 -200
  297. package/dist/packem_shared/Tus-C4F1aYOl.js +0 -195
  298. package/dist/packem_shared/ValidationError-BfF1aE4h.js +0 -26
  299. package/dist/packem_shared/VercelBlobFile-BCg4aTEq.js +0 -18
  300. package/dist/packem_shared/VercelBlobMetaStorage-Bd9F-VFm.js +0 -9
  301. package/dist/packem_shared/VercelBlobStorage-DD9LMOS6.js +0 -261
  302. package/dist/packem_shared/_commonjsHelpers-B85MJLTf.js +0 -5
  303. package/dist/packem_shared/aws-light-meta-storage-DKJBgbR6.js +0 -446
  304. package/dist/packem_shared/backblaze-BlMnIcBC.js +0 -20
  305. package/dist/packem_shared/base-handler-core-BKuf4YLT.js +0 -303
  306. package/dist/packem_shared/base-handler-fetch-Cr0hLiqg.js +0 -291
  307. package/dist/packem_shared/base-handler-node-gk5aN9Cx.js +0 -730
  308. package/dist/packem_shared/cache-B88MXQ_2.js +0 -18
  309. package/dist/packem_shared/cloudflare-Bi1q8wXE.js +0 -21
  310. package/dist/packem_shared/defaultCloudStorageFileNameValidation-DUuacjWv.js +0 -11
  311. package/dist/packem_shared/digitalOcean-CWQRJM3L.js +0 -21
  312. package/dist/packem_shared/disk-storage-Bh2wy3YW.js +0 -810
  313. package/dist/packem_shared/gcs-meta-storage-0tgMNnPO.js +0 -158
  314. package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
  315. package/dist/packem_shared/headers-DoS5nwM-.js +0 -3220
  316. package/dist/packem_shared/is-expired-CTThU1q5.js +0 -8
  317. package/dist/packem_shared/isRetryableError-Dycp7127.js +0 -82
  318. package/dist/packem_shared/isValidMediaType-BeDgiObq.js +0 -35
  319. package/dist/packem_shared/local-meta-storage-By-3SNBI.js +0 -649
  320. package/dist/packem_shared/minio-C2YBZQOw.js +0 -22
  321. package/dist/packem_shared/multipart-base-B3i67SSX.js +0 -102
  322. package/dist/packem_shared/part-match-BMNqHDYD.js +0 -96
  323. package/dist/packem_shared/path-CR6YkPXX-7R1-9CMk.js +0 -161
  324. package/dist/packem_shared/response-builder-BtnRiBUI.js +0 -45
  325. package/dist/packem_shared/rest-base-GRCcnan7.js +0 -457
  326. package/dist/packem_shared/restOpenApiSpec-CwcHHY2C.js +0 -800
  327. package/dist/packem_shared/s3-base-storage-C1DIHTYY.js +0 -510
  328. package/dist/packem_shared/sharedGet-Cpo7QUyu.js +0 -1019
  329. package/dist/packem_shared/storage-C6NSXb8h.js +0 -1175
  330. package/dist/packem_shared/tigris-Hac8TKnX.js +0 -21
  331. package/dist/packem_shared/transformOpenApiSpec-DWM5WtnN.js +0 -975
  332. package/dist/packem_shared/tusOpenApiSpec-6ohiToBy.js +0 -740
  333. package/dist/packem_shared/update-size-CCGm6i1J.js +0 -8
  334. package/dist/packem_shared/validator-BeX_lJet.js +0 -78
  335. package/dist/packem_shared/waitForStorage-Cscw85sx.js +0 -18
  336. package/dist/packem_shared/wasabi-DIyflHSd.js +0 -21
  337. package/dist/packem_shared/xhrOpenApiSpec-DS17brnx.js +0 -264
  338. package/dist/storage/aws/clients/backblaze.d.ts +0 -12
  339. package/dist/storage/aws/clients/cloudflare.d.ts +0 -13
  340. package/dist/storage/aws/clients/digital-ocean.d.ts +0 -12
  341. package/dist/storage/aws/clients/minio.d.ts +0 -13
  342. package/dist/storage/aws/clients/tigris.d.ts +0 -12
  343. package/dist/storage/aws/clients/types.d.ts +0 -95
  344. package/dist/storage/aws/clients/wasabi.d.ts +0 -12
  345. package/dist/storage/aws/s3-base-storage.d.ts +0 -248
  346. package/dist/storage/aws/s3-client-adapter.d.ts +0 -110
  347. package/dist/storage/aws/s3-file.d.ts +0 -10
  348. package/dist/storage/aws/s3-meta-storage.d.ts +0 -15
  349. package/dist/storage/aws/s3-storage.d.ts +0 -70
  350. package/dist/storage/aws/types.d.ts +0 -119
  351. package/dist/storage/aws-light/aws-light-api-adapter.d.ts +0 -130
  352. package/dist/storage/aws-light/aws-light-file.d.ts +0 -10
  353. package/dist/storage/aws-light/aws-light-meta-storage.d.ts +0 -19
  354. package/dist/storage/aws-light/aws-light-storage.d.ts +0 -65
  355. package/dist/storage/aws-light/types.d.ts +0 -37
  356. package/dist/storage/azure/azure-file.d.ts +0 -6
  357. package/dist/storage/azure/azure-meta-storage.d.ts +0 -15
  358. package/dist/storage/azure/azure-storage.d.ts +0 -69
  359. package/dist/storage/azure/types.d.ts +0 -62
  360. package/dist/storage/gcs/fetch-error.d.ts +0 -11
  361. package/dist/storage/gcs/gcs-config.d.ts +0 -2
  362. package/dist/storage/gcs/gcs-file.d.ts +0 -6
  363. package/dist/storage/gcs/gcs-meta-storage.d.ts +0 -27
  364. package/dist/storage/gcs/gcs-storage.d.ts +0 -91
  365. package/dist/storage/gcs/types.d.ts +0 -55
  366. package/dist/storage/gcs/utils.d.ts +0 -7
  367. package/dist/storage/local/disk-storage-with-checksum.d.ts +0 -15
  368. package/dist/storage/local/disk-storage.d.ts +0 -135
  369. package/dist/storage/local/local-meta-storage.d.ts +0 -32
  370. package/dist/storage/meta-storage.d.ts +0 -30
  371. package/dist/storage/netlify-blob/netlify-blob-file.d.ts +0 -12
  372. package/dist/storage/netlify-blob/netlify-blob-meta-storage.d.ts +0 -7
  373. package/dist/storage/netlify-blob/netlify-blob-storage.d.ts +0 -93
  374. package/dist/storage/netlify-blob/types.d.ts +0 -30
  375. package/dist/storage/storage.d.ts +0 -353
  376. package/dist/storage/types.d.ts +0 -221
  377. package/dist/storage/utils/file/file.d.ts +0 -25
  378. package/dist/storage/utils/file/get-file-status.d.ts +0 -9
  379. package/dist/storage/utils/file/has-content.d.ts +0 -9
  380. package/dist/storage/utils/file/index.d.ts +0 -10
  381. package/dist/storage/utils/file/is-expired.d.ts +0 -8
  382. package/dist/storage/utils/file/metadata.d.ts +0 -18
  383. package/dist/storage/utils/file/part-match.d.ts +0 -11
  384. package/dist/storage/utils/file/types.d.ts +0 -37
  385. package/dist/storage/utils/file/update-metadata.d.ts +0 -10
  386. package/dist/storage/utils/file/update-size.d.ts +0 -10
  387. package/dist/storage/vercel-blob/types.d.ts +0 -32
  388. package/dist/storage/vercel-blob/vercel-blob-file.d.ts +0 -16
  389. package/dist/storage/vercel-blob/vercel-blob-meta-storage.d.ts +0 -7
  390. package/dist/storage/vercel-blob/vercel-blob-storage.d.ts +0 -76
  391. package/dist/transformer/base-transformer.d.ts +0 -63
  392. package/dist/transformer/media-transformer.d.ts +0 -332
  393. package/dist/transformer/types.d.ts +0 -652
  394. package/dist/transformer/utils.d.ts +0 -33
  395. package/dist/transformer/validation-error.d.ts +0 -23
  396. package/dist/utils/cache.d.ts +0 -32
  397. package/dist/utils/chunked-upload.d.ts +0 -65
  398. package/dist/utils/detect-file-type.d.ts +0 -28
  399. package/dist/utils/errors.d.ts +0 -74
  400. package/dist/utils/file-path-url-matcher.d.ts +0 -18
  401. package/dist/utils/headers.d.ts +0 -111
  402. package/dist/utils/http.d.ts +0 -92
  403. package/dist/utils/locker.d.ts +0 -26
  404. package/dist/utils/pipes/stream-checksum.d.ts +0 -47
  405. package/dist/utils/pipes/stream-length.d.ts +0 -22
  406. package/dist/utils/primitives/get-last-one.d.ts +0 -3
  407. package/dist/utils/primitives/is-record.d.ts +0 -2
  408. package/dist/utils/primitives/map-values.d.ts +0 -9
  409. package/dist/utils/primitives/pick.d.ts +0 -2
  410. package/dist/utils/primitives/to-milliseconds.d.ts +0 -12
  411. package/dist/utils/primitives/to-seconds.d.ts +0 -12
  412. package/dist/utils/range-checksum.d.ts +0 -33
  413. package/dist/utils/range-hasher.d.ts +0 -46
  414. package/dist/utils/retry.d.ts +0 -64
  415. package/dist/utils/types.d.ts +0 -108
  416. package/dist/utils/validation-error.d.ts +0 -22
  417. 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
- ## Features
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
- ```sh
50
- npm install @visulima/upload
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
- ### Google Cloud Storage
34
+ Both surfaces wrap the same adapters — swap providers without touching call sites.
94
35
 
95
- ```sh
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
- pnpm add @google-cloud/storage node-fetch gaxios
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
- For more information, see the [BentoCache documentation](https://bentocache.dev/docs/introduction).
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
- ## Retry Mechanism
45
+ ## Quick start with `Files`
243
46
 
244
- All storage backends (AWS S3, Azure, GCS, Vercel Blob, Netlify Blob) include automatic retry logic for transient failures. This ensures your uploads and file operations are resilient to network issues, rate limits, and temporary service unavailability.
47
+ ```ts
48
+ import { Files } from "@visulima/storage";
49
+ import { S3Storage } from "@visulima/storage/provider/aws";
245
50
 
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
- },
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
- /** HTTP status codes that should trigger a retry (default: [408, 429, 500, 502, 503, 504]) */
330
- retryableStatusCodes?: number[];
55
+ await files.upload("avatars/abc.png", buffer, { contentType: "image/png" });
331
56
 
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
- }
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
- ### 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
- });
61
+ Swap the adapter to change provider — everything else stays the same:
364
62
 
365
- const result = await retryWrapper(async () => {
366
- return await someOperation();
367
- });
63
+ ```ts
64
+ import { Files, DiskStorage } from "@visulima/storage";
65
+ import { BunnyStorage } from "@visulima/storage/provider/bunny";
368
66
 
369
- // Check if an error is retryable
370
- if (isRetryableError(error)) {
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
- ### Supported Error Types
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
- - **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)
73
+ ## Building an upload server?
383
74
 
384
- ### Examples by Storage Backend
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
- #### AWS S3
387
-
388
- ```typescript
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
- ```typescript
404
- import { AzureStorage } from "@visulima/storage";
81
+ const storage = new DiskStorage({ directory: "./uploads" });
405
82
 
406
- const storage = new AzureStorage({
407
- containerName: "uploads",
408
- accountName: "myaccount",
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
- GCS already has built-in retry support via `gaxios`. The retry mechanism works alongside GCS's native retry logic:
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
- #### Vercel Blob
92
+ Three handlers cover the common upload patterns:
435
93
 
436
- ```typescript
437
- import { VercelBlobStorage } from "@visulima/storage";
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
- const storage = new VercelBlobStorage({
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
- #### Netlify Blob
100
+ ## Choosing your surface
449
101
 
450
- ```typescript
451
- import { NetlifyBlobStorage } from "@visulima/storage";
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
- const storage = new NetlifyBlobStorage({
454
- storeName: "uploads",
455
- retryConfig: {
456
- maxRetries: 3,
457
- },
458
- });
459
- ```
112
+ ## Providers
460
113
 
461
- ## Chunked Uploads
114
+ Object storage (service credentials, presigned URLs, S3-style):
462
115
 
463
- The REST handler supports client-side chunked uploads for large files. This allows you to upload files in smaller pieces, reducing memory usage and enabling resumable uploads.
116
+ - AWS S3 · Azure Blob · Google Cloud Storage · Vercel Blob · Netlify Blobs · Local disk
464
117
 
465
- ### Initializing a Chunked Upload
118
+ S3-compatible (branded client configs under `provider/aws/s3/clients`):
466
119
 
467
- ```typescript
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
- const rest = new Rest({ storage });
122
+ Consumer providers (user OAuth or service-credential, all peer-dep gated):
471
123
 
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
- });
124
+ - Dropbox · Google Drive · Microsoft OneDrive · SharePoint · Box · Supabase · UploadThing · Bunny Storage · Cloudinary · Firebase Storage · PocketBase
482
125
 
483
- const { id } = await initResponse.json();
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
- ### 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
- });
128
+ ## AI tool integrations
500
129
 
501
- // Upload chunk 2 (bytes 524288-1048576) - can be out of order
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
- ### Checking Upload Progress
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
- ```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}`);
137
+ const files = new Files({ adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }) });
138
+ const tools = createFileTools({ files });
526
139
  ```
527
140
 
528
- ### Features
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
- ### Response Headers
143
+ ## Documentation
537
144
 
538
- - `X-Upload-ID`: Upload session ID (returned on initialization)
539
- - `X-Chunked-Upload`: Indicates chunked upload mode
540
- - `X-Upload-Offset`: Current upload offset in bytes
541
- - `X-Upload-Complete`: "true" when upload is complete, "false" otherwise
542
- - `X-Received-Chunks`: JSON array of received chunks `[{ offset, length }]`
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 uploads is open-sourced software licensed under the [MIT][license]
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/upload?style=for-the-badge
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/upload?style=for-the-badge
574
- [npm-downloads]: https://www.npmjs.com/package/@visulima/upload
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