@visulima/storage 1.0.0-alpha.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/CHANGELOG.md +555 -0
  2. package/LICENSE.md +237 -568
  3. package/README.md +82 -466
  4. package/dist/adapter/nuxt/module.d.ts +41 -34
  5. package/dist/adapter/nuxt/module.js +1 -93
  6. package/dist/adapter/nuxt/package.json +0 -6
  7. package/dist/ai/ai-sdk/index.d.ts +113 -0
  8. package/dist/ai/ai-sdk/index.js +1 -0
  9. package/dist/ai/claude/index.d.ts +177 -0
  10. package/dist/ai/claude/index.js +1 -0
  11. package/dist/ai/openai/index.d.ts +205 -0
  12. package/dist/ai/openai/index.js +1 -0
  13. package/dist/ai/tanstack/index.d.ts +115 -0
  14. package/dist/ai/tanstack/index.js +1 -0
  15. package/dist/handler/http/fetch/index.d.ts +303 -4
  16. package/dist/handler/http/fetch/index.js +1 -4
  17. package/dist/handler/http/hono/index.d.ts +73 -64
  18. package/dist/handler/http/hono/index.js +1 -65
  19. package/dist/handler/http/nextjs/index.d.ts +66 -58
  20. package/dist/handler/http/nextjs/index.js +1 -37
  21. package/dist/handler/http/node/index.d.ts +368 -4
  22. package/dist/handler/http/node/index.js +1 -8
  23. package/dist/handler/http/solid-start/index.d.ts +66 -57
  24. package/dist/handler/http/solid-start/index.js +1 -44
  25. package/dist/index.d.ts +106 -17
  26. package/dist/index.js +1 -13
  27. package/dist/openapi/index.d.ts +24 -5
  28. package/dist/openapi/index.js +1 -5
  29. package/dist/packem_shared/AbstractBaseStorage-Ba7cLu-t.js +1 -0
  30. package/dist/packem_shared/AwsLightFile-CpZrubaV.js +1 -0
  31. package/dist/packem_shared/AwsLightMetaStorage-DPqJ9LTr.js +1 -0
  32. package/dist/packem_shared/AwsLightStorage-DTBVxHXO.js +1 -0
  33. package/dist/packem_shared/AzureFile-DFSaVe25.js +1 -0
  34. package/dist/packem_shared/AzureSMetaStorage-ByzM6Aix.js +1 -0
  35. package/dist/packem_shared/AzureStorage-BFsD4qbF.js +1 -0
  36. package/dist/packem_shared/BaseTransformer-Buw5lX_3.js +1 -0
  37. package/dist/packem_shared/BoxFile-CseIoPW1.js +1 -0
  38. package/dist/packem_shared/BoxMetaStorage-DFwhEI9C.js +1 -0
  39. package/dist/packem_shared/BoxStorage-B_t-OVzf.js +1 -0
  40. package/dist/packem_shared/BunS3File-BcYmsz1n.js +1 -0
  41. package/dist/packem_shared/BunS3MetaStorage-DFwhEI9C.js +1 -0
  42. package/dist/packem_shared/BunS3Storage-CB_pZWlV.js +1 -0
  43. package/dist/packem_shared/BunnyFile-BgEOlcYI.js +1 -0
  44. package/dist/packem_shared/BunnyMetaStorage-DFwhEI9C.js +1 -0
  45. package/dist/packem_shared/BunnyStorage-CILSK4_Z.js +1 -0
  46. package/dist/packem_shared/CloudinaryFile-Bo5B-vM1.js +1 -0
  47. package/dist/packem_shared/CloudinaryMetaStorage-D_vNzewL.js +1 -0
  48. package/dist/packem_shared/CloudinaryStorage-DiCbdAi_.js +1 -0
  49. package/dist/packem_shared/DiskStorage-Kp5t3vnF.js +1 -0
  50. package/dist/packem_shared/DiskStorageWithChecksum-Bh6w-Iu8.js +1 -0
  51. package/dist/packem_shared/DropboxFile-BFb7eOzy.js +1 -0
  52. package/dist/packem_shared/DropboxMetaStorage-DFwhEI9C.js +1 -0
  53. package/dist/packem_shared/DropboxStorage-H8bd8hEz.js +1 -0
  54. package/dist/packem_shared/ERRORS-BIBxE2oR.js +1 -0
  55. package/dist/packem_shared/File-W8aOo15X.js +1 -0
  56. package/dist/packem_shared/Files-BA3mpDwz.js +1 -0
  57. package/dist/packem_shared/FirebaseFile-BLaBxa2A.js +1 -0
  58. package/dist/packem_shared/FirebaseMetaStorage-D_vNzewL.js +1 -0
  59. package/dist/packem_shared/FirebaseStorage-Dgk4XyMr.js +2 -0
  60. package/dist/packem_shared/FtpFile-ClWDYnt2.js +1 -0
  61. package/dist/packem_shared/FtpMetaStorage-DFwhEI9C.js +1 -0
  62. package/dist/packem_shared/FtpStorage-g_DjiR-C.js +1 -0
  63. package/dist/packem_shared/GCSConfig-BQ0OpVhe.js +1 -0
  64. package/dist/packem_shared/GCSFile-Cero7qZN.js +1 -0
  65. package/dist/packem_shared/GCSMetaStorage-3fLTlRd4.js +1 -0
  66. package/dist/packem_shared/GCStorage-DUfwVFd3.js +1 -0
  67. package/dist/packem_shared/GoogleDriveFile-DHpLhzg9.js +1 -0
  68. package/dist/packem_shared/GoogleDriveMetaStorage-DqkgoE46.js +1 -0
  69. package/dist/packem_shared/GoogleDriveStorage-D0-5egHE.js +1 -0
  70. package/dist/packem_shared/LocalMetaStorage-Bp5mVc76.js +1 -0
  71. package/dist/packem_shared/MediaTransformer-D2kUsklW.js +1 -0
  72. package/dist/packem_shared/MemoryMetaStorage-Ksgh9pe7.js +1 -0
  73. package/dist/packem_shared/MemoryStorage-DzSTdlAq.js +1 -0
  74. package/dist/packem_shared/MetaStorage-DPEUyWgN.js +1 -0
  75. package/dist/packem_shared/Metadata-B7CcBueg.js +1 -0
  76. package/dist/packem_shared/Multipart-Btj2mo9r.js +1 -0
  77. package/dist/packem_shared/Multipart-C4GpuHMU.js +1 -0
  78. package/dist/packem_shared/NetlifyBlobFile-DoFhkzaH.js +1 -0
  79. package/dist/packem_shared/NetlifyBlobMetaStorage-D_vNzewL.js +1 -0
  80. package/dist/packem_shared/NetlifyBlobStorage-DZdCmOVW.js +1 -0
  81. package/dist/packem_shared/NoOpMetrics-BLo6u4NY.js +1 -0
  82. package/dist/packem_shared/OneDriveFile-CNNJYI43.js +1 -0
  83. package/dist/packem_shared/OneDriveMetaStorage-DqkgoE46.js +1 -0
  84. package/dist/packem_shared/OneDriveStorage-CvJetV7_.js +1 -0
  85. package/dist/packem_shared/OpenTelemetryMetrics-DJDQsNKp.js +1 -0
  86. package/dist/packem_shared/PocketBaseFile-DpJpxl3e.js +1 -0
  87. package/dist/packem_shared/PocketBaseMetaStorage-CpvDRnSu.js +1 -0
  88. package/dist/packem_shared/PocketBaseStorage-BPil-koe.js +1 -0
  89. package/dist/packem_shared/Rest-BehVaxbl.js +1 -0
  90. package/dist/packem_shared/Rest-ymPCZkKR.js +1 -0
  91. package/dist/packem_shared/S3File-CpZrubaV.js +1 -0
  92. package/dist/packem_shared/S3MetaStorage-CMonflzp.js +1 -0
  93. package/dist/packem_shared/S3Storage-wslqssvr.js +1 -0
  94. package/dist/packem_shared/SftpFile-ClWDYnt2.js +1 -0
  95. package/dist/packem_shared/SftpMetaStorage-DFwhEI9C.js +1 -0
  96. package/dist/packem_shared/SftpStorage-BVbMtS2b.js +1 -0
  97. package/dist/packem_shared/SharePointFile-Blz9FS4h.js +1 -0
  98. package/dist/packem_shared/SharePointMetaStorage-DFwhEI9C.js +1 -0
  99. package/dist/packem_shared/SharePointStorage-DWjvR5oZ.js +1 -0
  100. package/dist/packem_shared/SupabaseFile-Bo5B-vM1.js +1 -0
  101. package/dist/packem_shared/SupabaseMetaStorage-DqkgoE46.js +1 -0
  102. package/dist/packem_shared/SupabaseStorage-BiKmYKb6.js +1 -0
  103. package/dist/packem_shared/TUS_RESUMABLE-CyTSRvPU.js +1 -0
  104. package/dist/packem_shared/Tus-BgbON_wQ.js +1 -0
  105. package/dist/packem_shared/Tus-v6jzkaIO.js +1 -0
  106. package/dist/packem_shared/UploadControl-DZJhI9Wh.js +1 -0
  107. package/dist/packem_shared/UploadThingFile-BTFMpcIA.js +1 -0
  108. package/dist/packem_shared/UploadThingMetaStorage-D_vNzewL.js +1 -0
  109. package/dist/packem_shared/UploadThingStorage-jrEnANC5.js +1 -0
  110. package/dist/packem_shared/ValidationError-3B06DFyE.js +1 -0
  111. package/dist/packem_shared/VercelBlobFile-CVQwKlZk.js +1 -0
  112. package/dist/packem_shared/VercelBlobMetaStorage-DFwhEI9C.js +1 -0
  113. package/dist/packem_shared/VercelBlobStorage-Y-cDgH30.js +1 -0
  114. package/dist/packem_shared/_commonjsHelpers-CWAkuNXM.js +1 -0
  115. package/dist/packem_shared/agentsCopyFile-Dl5iffdH.js +1 -0
  116. package/dist/packem_shared/akamai-DthkaFul.js +1 -0
  117. package/dist/packem_shared/alibaba-BEi25O1g.js +1 -0
  118. package/dist/packem_shared/approval-fVHwBp7u.js +1 -0
  119. package/dist/packem_shared/approval.d-CMAYH9GF.d.ts +75 -0
  120. package/dist/packem_shared/aws-light-meta-storage-DGrn72VJ.js +4 -0
  121. package/dist/packem_shared/azure-meta-storage-ClbEsfI4.js +1 -0
  122. package/dist/packem_shared/backblaze-m1N5NZ9q.js +1 -0
  123. package/dist/packem_shared/base-handler-core-EeV8gZck.js +1 -0
  124. package/dist/packem_shared/base-handler-fetch-CHzsgb7C.js +1 -0
  125. package/dist/packem_shared/base-handler-node-BjpW8pGi.js +1 -0
  126. package/dist/packem_shared/cache-Cw3QjoVN.js +1 -0
  127. package/dist/packem_shared/claudeCopyFile-BX9O4ORk.js +1 -0
  128. package/dist/packem_shared/cloudflare-CdUTErlo.js +1 -0
  129. package/dist/packem_shared/copyFile-49FtxXcm.js +1 -0
  130. package/dist/packem_shared/copyFile-BUPezT_c.js +1 -0
  131. package/dist/packem_shared/createResponsesFileTools-6Tvt2PNr.js +1 -0
  132. package/dist/packem_shared/createRetryWrapper-CxgiV_hH.js +1 -0
  133. package/dist/packem_shared/detect-file-type-BA7UBLKA.js +1 -0
  134. package/dist/packem_shared/digitalOcean-B2uB6pgz.js +1 -0
  135. package/dist/packem_shared/disk-storage-DIn-VnCh.js +1 -0
  136. package/dist/packem_shared/disk-storage-with-checksum.d-B-VGEsfl.d.ts +156 -0
  137. package/dist/packem_shared/executors-BDzMjc4y.js +1 -0
  138. package/dist/packem_shared/executors.d-BZP2rWo3.d.ts +69 -0
  139. package/dist/packem_shared/exoscale-BDa1Gjth.js +1 -0
  140. package/dist/packem_shared/filebase-CsFYJIwB.js +1 -0
  141. package/dist/packem_shared/files.d-CH0iLBNC.d.ts +655 -0
  142. package/dist/packem_shared/gcs-meta-storage-Dy37wCjI.js +1 -0
  143. package/dist/packem_shared/get-file-status-y3wTtDQs.js +1 -0
  144. package/dist/packem_shared/getFormatFromContentType-DCTTPQHm.js +1 -0
  145. package/dist/packem_shared/has-content-50BsqrWw.js +1 -0
  146. package/dist/packem_shared/headers-BAiAKekR.js +26 -0
  147. package/dist/packem_shared/hetzner-BGGFiRGD.js +1 -0
  148. package/dist/packem_shared/ibmCos-j-3TfJ5p.js +1 -0
  149. package/dist/packem_shared/idriveE2-C6pQ5pQ0.js +1 -0
  150. package/dist/packem_shared/index-nZWCQrSe.js +5 -0
  151. package/dist/packem_shared/internal-D_cZIFwI.js +1 -0
  152. package/dist/packem_shared/is-expired-CBEk6XBi.js +1 -0
  153. package/dist/packem_shared/local-meta-storage-C2T92TYb.js +11 -0
  154. package/dist/packem_shared/local-meta-storage.d-D9PBfkn6.d.ts +21 -0
  155. package/dist/packem_shared/media-transformer.d-Quf4ai47.d.ts +331 -0
  156. package/dist/packem_shared/memory-storage.d-4EU1cMt1.d.ts +101 -0
  157. package/dist/packem_shared/minio-NKquuBfS.js +1 -0
  158. package/dist/packem_shared/multipart-base-BOzY19lb.js +1 -0
  159. package/dist/packem_shared/oauth-refresh-EdGzlcOZ.js +1 -0
  160. package/dist/packem_shared/oracleCloud-DslqNpn6.js +1 -0
  161. package/dist/packem_shared/ovhCloud-CMHE6uLV.js +1 -0
  162. package/dist/packem_shared/part-match-D-9dGX42.js +1 -0
  163. package/dist/packem_shared/path-0oTTdkvl-BVg7lYf5.js +1 -0
  164. package/dist/packem_shared/posix-dirname-CfpH5wZi.js +1 -0
  165. package/dist/packem_shared/response-builder-CbSA8qPa.js +1 -0
  166. package/dist/packem_shared/rest-base-CynUg0mH.js +1 -0
  167. package/dist/packem_shared/restOpenApiSpec-Csv513qf.js +1 -0
  168. package/dist/packem_shared/s3-base-storage-DXZYN24h.js +1 -0
  169. package/dist/packem_shared/s3-base-storage.d-BQgP5B-t.d.ts +287 -0
  170. package/dist/packem_shared/scaleway-U1In3v70.js +1 -0
  171. package/dist/packem_shared/sharedErrorSchemaObject-YN65aAKj.js +1 -0
  172. package/dist/packem_shared/storage-Cyy73Y6r.js +1 -0
  173. package/dist/packem_shared/storage.d-CEM1upWM.d.ts +1176 -0
  174. package/dist/packem_shared/storj-Cb59q9kF.js +1 -0
  175. package/dist/packem_shared/sync-DhR3536K.js +1 -0
  176. package/dist/packem_shared/tencent-Q1y2GENc.js +1 -0
  177. package/dist/packem_shared/tigris-BELKoyyp.js +1 -0
  178. package/dist/packem_shared/transformOpenApiSpec-CIEAgpBD.js +1 -0
  179. package/dist/packem_shared/tus-base.d-DLzKE54M.d.ts +106 -0
  180. package/dist/packem_shared/tusOpenApiSpec-D96B03t5.js +1 -0
  181. package/dist/packem_shared/types.d-Bon9GVVe.d.ts +104 -0
  182. package/dist/packem_shared/types.d-CggTCgXr.d.ts +49 -0
  183. package/dist/packem_shared/types.d-CrUWY4On.d.ts +720 -0
  184. package/dist/packem_shared/update-size-DuNuLyxj.js +1 -0
  185. package/dist/packem_shared/vultr-B491cQ4e.js +1 -0
  186. package/dist/packem_shared/waitForStorage-ByQmG4xF.js +1 -0
  187. package/dist/packem_shared/wasabi-DFrwIoab.js +1 -0
  188. package/dist/packem_shared/xhrOpenApiSpec-DQR4h6M8.js +1 -0
  189. package/dist/packem_shared/yandex-CwzHuEKP.js +1 -0
  190. package/dist/storage/aws/clients/index.d.ts +612 -6
  191. package/dist/storage/aws/clients/index.js +1 -6
  192. package/dist/storage/aws/index.d.ts +332 -4
  193. package/dist/storage/aws/index.js +1 -3
  194. package/dist/storage/aws-light/index.d.ts +259 -4
  195. package/dist/storage/aws-light/index.js +1 -3
  196. package/dist/storage/azure/index.d.ts +236 -4
  197. package/dist/storage/azure/index.js +1 -3
  198. package/dist/storage/box/index.d.ts +189 -0
  199. package/dist/storage/box/index.js +1 -0
  200. package/dist/storage/bun-s3/index.d.ts +200 -0
  201. package/dist/storage/bun-s3/index.js +1 -0
  202. package/dist/storage/bunny/index.d.ts +119 -0
  203. package/dist/storage/bunny/index.js +1 -0
  204. package/dist/storage/cloudinary/index.d.ts +121 -0
  205. package/dist/storage/cloudinary/index.js +1 -0
  206. package/dist/storage/dropbox/index.d.ts +132 -0
  207. package/dist/storage/dropbox/index.js +1 -0
  208. package/dist/storage/firebase/index.d.ts +192 -0
  209. package/dist/storage/firebase/index.js +1 -0
  210. package/dist/storage/ftp/index.d.ts +91 -0
  211. package/dist/storage/ftp/index.js +1 -0
  212. package/dist/storage/gcs/index.d.ts +195 -5
  213. package/dist/storage/gcs/index.js +1 -4
  214. package/dist/storage/google-drive/index.d.ts +148 -0
  215. package/dist/storage/google-drive/index.js +1 -0
  216. package/dist/storage/local/index.d.ts +7 -4
  217. package/dist/storage/local/index.js +1 -3
  218. package/dist/storage/memory/index.d.ts +6 -0
  219. package/dist/storage/memory/index.js +1 -0
  220. package/dist/storage/netlify-blob/index.d.ts +147 -4
  221. package/dist/storage/netlify-blob/index.js +1 -3
  222. package/dist/storage/onedrive/index.d.ts +103 -0
  223. package/dist/storage/onedrive/index.js +1 -0
  224. package/dist/storage/pocketbase/index.d.ts +172 -0
  225. package/dist/storage/pocketbase/index.js +1 -0
  226. package/dist/storage/sftp/index.d.ts +92 -0
  227. package/dist/storage/sftp/index.js +1 -0
  228. package/dist/storage/sharepoint/index.d.ts +180 -0
  229. package/dist/storage/sharepoint/index.js +1 -0
  230. package/dist/storage/supabase/index.d.ts +115 -0
  231. package/dist/storage/supabase/index.js +1 -0
  232. package/dist/storage/uploadthing/index.d.ts +95 -0
  233. package/dist/storage/uploadthing/index.js +1 -0
  234. package/dist/storage/vercel-blob/index.d.ts +189 -4
  235. package/dist/storage/vercel-blob/index.js +1 -3
  236. package/dist/transformer/audio-transformer.d.ts +127 -125
  237. package/dist/transformer/audio-transformer.js +1 -278
  238. package/dist/transformer/image-transformer.d.ts +573 -568
  239. package/dist/transformer/image-transformer.js +1 -1100
  240. package/dist/transformer/index.d.ts +62 -5
  241. package/dist/transformer/index.js +1 -4
  242. package/dist/transformer/video-transformer.d.ts +144 -142
  243. package/dist/transformer/video-transformer.js +1 -310
  244. package/package.json +202 -51
  245. package/dist/handler/base/base-handler-core.d.ts +0 -91
  246. package/dist/handler/base/base-handler-fetch.d.ts +0 -76
  247. package/dist/handler/base/base-handler-node.d.ts +0 -137
  248. package/dist/handler/multipart/multipart-base.d.ts +0 -84
  249. package/dist/handler/multipart/multipart-fetch.d.ts +0 -64
  250. package/dist/handler/multipart/multipart.d.ts +0 -49
  251. package/dist/handler/rest/rest-base.d.ts +0 -106
  252. package/dist/handler/rest/rest-fetch.d.ts +0 -88
  253. package/dist/handler/rest/rest.d.ts +0 -93
  254. package/dist/handler/tus/tus-base.d.ts +0 -152
  255. package/dist/handler/tus/tus-fetch.d.ts +0 -72
  256. package/dist/handler/tus/tus.d.ts +0 -78
  257. package/dist/handler/types.d.ts +0 -53
  258. package/dist/handler/utils/request-parser.d.ts +0 -72
  259. package/dist/handler/utils/response-builder.d.ts +0 -83
  260. package/dist/handler/utils/storage-utils.d.ts +0 -10
  261. package/dist/handler/utils/stream-utils.d.ts +0 -29
  262. package/dist/handler/utils/upload-handlers.d.ts +0 -76
  263. package/dist/metrics/index.d.ts +0 -2
  264. package/dist/metrics/no-op-metrics.d.ts +0 -15
  265. package/dist/metrics/opentelemetry-metrics.d.ts +0 -55
  266. package/dist/openapi/rest.d.ts +0 -7
  267. package/dist/openapi/shared.d.ts +0 -13
  268. package/dist/openapi/transform.d.ts +0 -3
  269. package/dist/openapi/tus.d.ts +0 -7
  270. package/dist/openapi/xhr.d.ts +0 -7
  271. package/dist/packem_shared/AwsLightFile-tTneXZgG.js +0 -11
  272. package/dist/packem_shared/AwsLightMetaStorage-BWSOtVaN.js +0 -4
  273. package/dist/packem_shared/AwsLightStorage-Blv-GP4v.js +0 -133
  274. package/dist/packem_shared/AzureFile-CesgFzps.js +0 -8
  275. package/dist/packem_shared/AzureSMetaStorage-CFs-OYJT.js +0 -88
  276. package/dist/packem_shared/AzureStorage-B0v048hG.js +0 -357
  277. package/dist/packem_shared/BaseTransformer-C2gLib6v.js +0 -82
  278. package/dist/packem_shared/DiskStorage-Ck5yGQsq.js +0 -12
  279. package/dist/packem_shared/DiskStorageWithChecksum-BRl-V5x2.js +0 -238
  280. package/dist/packem_shared/ERRORS-D0apMqnc.js +0 -97
  281. package/dist/packem_shared/File-Bb3P23dr.js +0 -69
  282. package/dist/packem_shared/GCSConfig-vPP22kN6.js +0 -11
  283. package/dist/packem_shared/GCSFile-BIEunhAN.js +0 -8
  284. package/dist/packem_shared/GCSMetaStorage-CHZKMe7N.js +0 -7
  285. package/dist/packem_shared/GCStorage-C-gAuP0j.js +0 -406
  286. package/dist/packem_shared/LocalMetaStorage-CZHhKkMd.js +0 -7
  287. package/dist/packem_shared/MediaTransformer-D6658DL1.js +0 -1197
  288. package/dist/packem_shared/MetaStorage-pECeFOad.js +0 -46
  289. package/dist/packem_shared/Metadata-DRLXeJ0F.js +0 -89
  290. package/dist/packem_shared/Multipart-CRV21AUU.js +0 -128
  291. package/dist/packem_shared/Multipart-D2ryPMjD.js +0 -163
  292. package/dist/packem_shared/NetlifyBlobFile-CXzyjqrD.js +0 -14
  293. package/dist/packem_shared/NetlifyBlobMetaStorage-DxZ5aDvD.js +0 -9
  294. package/dist/packem_shared/NetlifyBlobStorage-CLPtjHqd.js +0 -376
  295. package/dist/packem_shared/NoOpMetrics-DhAk5rXc.js +0 -10
  296. package/dist/packem_shared/OpenTelemetryMetrics-BnxhqIaH.js +0 -67
  297. package/dist/packem_shared/Rest-DcxBMBjU.js +0 -228
  298. package/dist/packem_shared/Rest-DjwU3puo.js +0 -267
  299. package/dist/packem_shared/S3File-DZiyk9Qt.js +0 -11
  300. package/dist/packem_shared/S3MetaStorage-Dz9aDabA.js +0 -76
  301. package/dist/packem_shared/S3Storage-DHmTk-hU.js +0 -316
  302. package/dist/packem_shared/TUS_RESUMABLE-Dtfsffnj.js +0 -434
  303. package/dist/packem_shared/Tus-DFVlZHaX.js +0 -200
  304. package/dist/packem_shared/Tus-DaN0FmOy.js +0 -195
  305. package/dist/packem_shared/ValidationError-BfF1aE4h.js +0 -26
  306. package/dist/packem_shared/VercelBlobFile-BCg4aTEq.js +0 -18
  307. package/dist/packem_shared/VercelBlobMetaStorage-Bd9F-VFm.js +0 -9
  308. package/dist/packem_shared/VercelBlobStorage-DD9LMOS6.js +0 -261
  309. package/dist/packem_shared/_commonjsHelpers-BqLXS_qQ.js +0 -5
  310. package/dist/packem_shared/aws-light-meta-storage-DKJBgbR6.js +0 -446
  311. package/dist/packem_shared/backblaze-BlMnIcBC.js +0 -20
  312. package/dist/packem_shared/base-handler-core-BoAqTyz7.js +0 -303
  313. package/dist/packem_shared/base-handler-fetch-D4u2xits.js +0 -291
  314. package/dist/packem_shared/base-handler-node-DGzcHHAy.js +0 -730
  315. package/dist/packem_shared/cache-B88MXQ_2.js +0 -18
  316. package/dist/packem_shared/cloudflare-Bi1q8wXE.js +0 -21
  317. package/dist/packem_shared/defaultCloudStorageFileNameValidation-DUuacjWv.js +0 -11
  318. package/dist/packem_shared/digitalOcean-CWQRJM3L.js +0 -21
  319. package/dist/packem_shared/disk-storage-CD47QI30.js +0 -810
  320. package/dist/packem_shared/gcs-meta-storage-CJ8Uts_d.js +0 -158
  321. package/dist/packem_shared/has-content-CY66ehMK.js +0 -3
  322. package/dist/packem_shared/headers-YLRp1dLo.js +0 -1318
  323. package/dist/packem_shared/is-expired-CTThU1q5.js +0 -8
  324. package/dist/packem_shared/isRetryableError-Dycp7127.js +0 -82
  325. package/dist/packem_shared/isValidMediaType-BeDgiObq.js +0 -35
  326. package/dist/packem_shared/local-meta-storage-By-3SNBI.js +0 -649
  327. package/dist/packem_shared/minio-C2YBZQOw.js +0 -22
  328. package/dist/packem_shared/multipart-base-C994naBi.js +0 -102
  329. package/dist/packem_shared/part-match-BMNqHDYD.js +0 -96
  330. package/dist/packem_shared/path-CR6YkPXX-7R1-9CMk.js +0 -161
  331. package/dist/packem_shared/response-builder-BtnRiBUI.js +0 -45
  332. package/dist/packem_shared/rest-base-D9URIFkc.js +0 -457
  333. package/dist/packem_shared/restOpenApiSpec-D1JC_Jto.js +0 -800
  334. package/dist/packem_shared/s3-base-storage-C1DIHTYY.js +0 -510
  335. package/dist/packem_shared/sharedGet-Cpo7QUyu.js +0 -1019
  336. package/dist/packem_shared/storage-C6NSXb8h.js +0 -1175
  337. package/dist/packem_shared/tigris-Hac8TKnX.js +0 -21
  338. package/dist/packem_shared/transformOpenApiSpec-DWM5WtnN.js +0 -975
  339. package/dist/packem_shared/tusOpenApiSpec-mBZkl7he.js +0 -740
  340. package/dist/packem_shared/update-size-CCGm6i1J.js +0 -8
  341. package/dist/packem_shared/validator-BeX_lJet.js +0 -78
  342. package/dist/packem_shared/waitForStorage-Cscw85sx.js +0 -18
  343. package/dist/packem_shared/wasabi-DIyflHSd.js +0 -21
  344. package/dist/packem_shared/xhrOpenApiSpec-B1V5Dxrj.js +0 -264
  345. package/dist/storage/aws/clients/backblaze.d.ts +0 -12
  346. package/dist/storage/aws/clients/cloudflare.d.ts +0 -13
  347. package/dist/storage/aws/clients/digital-ocean.d.ts +0 -12
  348. package/dist/storage/aws/clients/minio.d.ts +0 -13
  349. package/dist/storage/aws/clients/tigris.d.ts +0 -12
  350. package/dist/storage/aws/clients/types.d.ts +0 -95
  351. package/dist/storage/aws/clients/wasabi.d.ts +0 -12
  352. package/dist/storage/aws/s3-base-storage.d.ts +0 -248
  353. package/dist/storage/aws/s3-client-adapter.d.ts +0 -110
  354. package/dist/storage/aws/s3-file.d.ts +0 -10
  355. package/dist/storage/aws/s3-meta-storage.d.ts +0 -15
  356. package/dist/storage/aws/s3-storage.d.ts +0 -70
  357. package/dist/storage/aws/types.d.ts +0 -119
  358. package/dist/storage/aws-light/aws-light-api-adapter.d.ts +0 -130
  359. package/dist/storage/aws-light/aws-light-file.d.ts +0 -10
  360. package/dist/storage/aws-light/aws-light-meta-storage.d.ts +0 -19
  361. package/dist/storage/aws-light/aws-light-storage.d.ts +0 -65
  362. package/dist/storage/aws-light/types.d.ts +0 -37
  363. package/dist/storage/azure/azure-file.d.ts +0 -6
  364. package/dist/storage/azure/azure-meta-storage.d.ts +0 -15
  365. package/dist/storage/azure/azure-storage.d.ts +0 -69
  366. package/dist/storage/azure/types.d.ts +0 -62
  367. package/dist/storage/gcs/fetch-error.d.ts +0 -11
  368. package/dist/storage/gcs/gcs-config.d.ts +0 -2
  369. package/dist/storage/gcs/gcs-file.d.ts +0 -6
  370. package/dist/storage/gcs/gcs-meta-storage.d.ts +0 -27
  371. package/dist/storage/gcs/gcs-storage.d.ts +0 -91
  372. package/dist/storage/gcs/types.d.ts +0 -55
  373. package/dist/storage/gcs/utils.d.ts +0 -7
  374. package/dist/storage/local/disk-storage-with-checksum.d.ts +0 -15
  375. package/dist/storage/local/disk-storage.d.ts +0 -135
  376. package/dist/storage/local/local-meta-storage.d.ts +0 -32
  377. package/dist/storage/meta-storage.d.ts +0 -30
  378. package/dist/storage/netlify-blob/netlify-blob-file.d.ts +0 -12
  379. package/dist/storage/netlify-blob/netlify-blob-meta-storage.d.ts +0 -7
  380. package/dist/storage/netlify-blob/netlify-blob-storage.d.ts +0 -93
  381. package/dist/storage/netlify-blob/types.d.ts +0 -30
  382. package/dist/storage/storage.d.ts +0 -353
  383. package/dist/storage/types.d.ts +0 -221
  384. package/dist/storage/utils/file/file.d.ts +0 -25
  385. package/dist/storage/utils/file/get-file-status.d.ts +0 -9
  386. package/dist/storage/utils/file/has-content.d.ts +0 -9
  387. package/dist/storage/utils/file/index.d.ts +0 -10
  388. package/dist/storage/utils/file/is-expired.d.ts +0 -8
  389. package/dist/storage/utils/file/metadata.d.ts +0 -18
  390. package/dist/storage/utils/file/part-match.d.ts +0 -11
  391. package/dist/storage/utils/file/types.d.ts +0 -37
  392. package/dist/storage/utils/file/update-metadata.d.ts +0 -10
  393. package/dist/storage/utils/file/update-size.d.ts +0 -10
  394. package/dist/storage/vercel-blob/types.d.ts +0 -32
  395. package/dist/storage/vercel-blob/vercel-blob-file.d.ts +0 -16
  396. package/dist/storage/vercel-blob/vercel-blob-meta-storage.d.ts +0 -7
  397. package/dist/storage/vercel-blob/vercel-blob-storage.d.ts +0 -76
  398. package/dist/transformer/base-transformer.d.ts +0 -63
  399. package/dist/transformer/media-transformer.d.ts +0 -332
  400. package/dist/transformer/types.d.ts +0 -652
  401. package/dist/transformer/utils.d.ts +0 -33
  402. package/dist/transformer/validation-error.d.ts +0 -23
  403. package/dist/utils/cache.d.ts +0 -32
  404. package/dist/utils/chunked-upload.d.ts +0 -65
  405. package/dist/utils/detect-file-type.d.ts +0 -28
  406. package/dist/utils/errors.d.ts +0 -74
  407. package/dist/utils/file-path-url-matcher.d.ts +0 -18
  408. package/dist/utils/headers.d.ts +0 -111
  409. package/dist/utils/http.d.ts +0 -92
  410. package/dist/utils/locker.d.ts +0 -26
  411. package/dist/utils/pipes/stream-checksum.d.ts +0 -47
  412. package/dist/utils/pipes/stream-length.d.ts +0 -22
  413. package/dist/utils/primitives/get-last-one.d.ts +0 -3
  414. package/dist/utils/primitives/is-record.d.ts +0 -2
  415. package/dist/utils/primitives/map-values.d.ts +0 -9
  416. package/dist/utils/primitives/pick.d.ts +0 -2
  417. package/dist/utils/primitives/to-milliseconds.d.ts +0 -12
  418. package/dist/utils/primitives/to-seconds.d.ts +0 -12
  419. package/dist/utils/range-checksum.d.ts +0 -33
  420. package/dist/utils/range-hasher.d.ts +0 -46
  421. package/dist/utils/retry.d.ts +0 -64
  422. package/dist/utils/types.d.ts +0 -108
  423. package/dist/utils/validation-error.d.ts +0 -22
  424. package/dist/utils/validator.d.ts +0 -36
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  </a>
8
8
 
9
- <h3 align="center">Visulima upload - Store files in a web-accessible location via a simplified API. Can automatically scale and rotate images. Includes S3, Azure, GCS and local filesystem-based backends with the most convenient features of each.</h3>
9
+ <h3 align="center">Server-side file-storage abstraction - store files in a web-accessible location via a simplified API. Includes S3, Azure, GCS, local filesystem and 20+ other backends with TUS/multipart/REST upload handlers and the most convenient features of each.</h3>
10
10
 
11
11
  <!-- END_PACKAGE_OG_IMAGE_PLACEHOLDER -->
12
12
 
@@ -26,520 +26,136 @@
26
26
  <sub>Built with ❤︎ by <a href="https://twitter.com/_prisis_">Daniel Bannert</a></sub>
27
27
  </div>
28
28
 
29
- ## 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`), bulk-array overloads, per-call retry/timeout/abort, lifecycle hooks, and a `.raw` escape hatch. Use this when you just need to put files somewhere.
32
+ - **`BaseStorage` adapters** (`S3Storage`, `DiskStorage`, `BunnyStorage`, …) — the full upload-server framework. TUS / multipart / REST handlers, lifecycle hooks, validators, image / video / audio transformers, OpenAPI export. Use this when you're hosting an upload service.
92
33
 
93
- ### 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
- });
39
+ npm install @visulima/storage
40
+ # or yarn add / pnpm add
128
41
  ```
129
42
 
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
- }
43
+ Each provider has its own peer dependency (e.g. `@aws-sdk/client-s3` for S3, `@azure/storage-blob` for Azure). See the relevant [service page](https://visulima.com/docs/packages/storage/services) for the exact install command.
160
44
 
161
- async has(key: string): Promise<boolean> {
162
- const exists = await this.redis.exists(key);
163
- return exists === 1;
164
- }
165
- }
45
+ ## Quick start with `Files`
166
46
 
167
- const redis = new Redis();
168
- const cache = new RedisCache(redis);
47
+ ```ts
48
+ import { Files } from "@visulima/storage";
49
+ import { S3Storage } from "@visulima/storage/provider/aws";
169
50
 
170
- const storage = new DiskStorage({
171
- directory: "/uploads",
172
- cache,
51
+ const files = new Files({
52
+ adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }),
173
53
  });
174
- ```
175
54
 
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
- });
55
+ await files.upload("avatars/abc.png", buffer, { contentType: "image/png" });
198
56
 
199
- const cache = new BentoCacheAdapter({
200
- bento,
201
- namespace: "storage",
202
- defaultTtl: 3600000, // 1 hour
203
- });
57
+ const url = await files.url("avatars/abc.png", { expiresIn: 900 });
58
+ const { body } = await files.download("avatars/abc.png");
204
59
 
205
- const storage = new DiskStorage({
206
- directory: "/uploads",
207
- cache,
208
- });
60
+ // Stream large objects without buffering the whole payload in memory:
61
+ const { body: stream } = await files.downloadStream("avatars/abc.png");
209
62
  ```
210
63
 
211
- ### Transformer Caching
64
+ Swap the adapter to change provider — everything else stays the same:
212
65
 
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";
66
+ ```ts
67
+ import { Files, DiskStorage } from "@visulima/storage";
68
+ import { BunnyStorage } from "@visulima/storage/provider/bunny";
218
69
 
219
- const transformer = new MediaTransformer(storage, {
220
- cache: new LRUCache({ max: 100, ttl: 3600000 }),
221
- ImageTransformer: ImageTransformer,
222
- VideoTransformer: VideoTransformer,
223
- });
70
+ new Files({ adapter: new DiskStorage({ directory: "./uploads" }) });
71
+ new Files({ adapter: new BunnyStorage({ zone, accessKey, region: "de" }) });
224
72
  ```
225
73
 
226
- ### Cache Interface
227
-
228
- Any cache implementation must implement this interface:
74
+ → See the [Files facade reference](https://visulima.com/docs/packages/storage/files-facade) for the full method surface (`upload`, `download`, `downloadStream`, `head`, `exists`, `delete`, `copy`, `move`, `list`, `listAll`, `url`, `signedUploadUrl`, `.raw`) and body-type matrix. `list({ delimiter: "/" })` returns directory-style `{ files, prefixes }`; pass `{ readonly: true }` (or call `files.readonly()`) for a locked view, and read `files.capabilities` to branch on adapter support. Top-level `transfer(source, destination)` streams whole buckets between adapters; `sync(source, destination)` does an incremental, optionally-pruning mirror (with `dryRun`).
229
75
 
230
- ```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
- }
238
- ```
76
+ ## Building an upload server?
239
77
 
240
- For more information, see the [BentoCache documentation](https://bentocache.dev/docs/introduction).
78
+ If you're handling client uploads from a browser — large files, resumable transfers, form posts — use the adapter directly with one of the HTTP handlers.
241
79
 
242
- ## Retry Mechanism
243
-
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.
245
-
246
- ### Default Behavior
247
-
248
- By default, storage operations will retry up to 3 times with exponential backoff:
249
-
250
- - Initial delay: 1 second
251
- - Backoff multiplier: 2x (delays double each retry: 1s → 2s → 4s)
252
- - Maximum delay: 30 seconds
253
- - Retryable status codes: 408, 429, 500, 502, 503, 504
254
-
255
- ### Basic Configuration
256
-
257
- Configure retry behavior when creating your storage instance:
258
-
259
- ```typescript
260
- import { S3Storage } from "@visulima/storage";
261
-
262
- const storage = new S3Storage({
263
- bucket: "my-bucket",
264
- region: "us-east-1",
265
- retryConfig: {
266
- maxRetries: 5,
267
- initialDelay: 2000,
268
- backoffMultiplier: 1.5,
269
- maxDelay: 60_000,
270
- },
271
- });
272
- ```
273
-
274
- ### Advanced Configuration
275
-
276
- Customize retry logic with backend-specific error detection:
277
-
278
- ```typescript
279
- import { AzureStorage } from "@visulima/storage";
280
-
281
- const storage = new AzureStorage({
282
- containerName: "uploads",
283
- accountName: "myaccount",
284
- accountKey: "mykey",
285
- retryConfig: {
286
- maxRetries: 3,
287
- initialDelay: 1000,
288
- backoffMultiplier: 2,
289
- maxDelay: 30_000,
290
- retryableStatusCodes: [408, 429, 500, 502, 503, 504],
291
- shouldRetry: (error: unknown) => {
292
- // Custom retry logic
293
- if (error instanceof Error) {
294
- const errorCode = (error as any).code;
295
-
296
- // Retry on network errors
297
- if (errorCode === "ECONNRESET" || errorCode === "ETIMEDOUT") {
298
- return true;
299
- }
300
- }
301
-
302
- // Retry on specific HTTP status codes
303
- if ((error as any).statusCode && [429, 503].includes((error as any).statusCode)) {
304
- return true;
305
- }
306
-
307
- return false;
308
- },
309
- },
310
- });
311
- ```
312
-
313
- ### Retry Configuration Options
314
-
315
- ```typescript
316
- interface RetryConfig {
317
- /** Maximum number of retry attempts (default: 3) */
318
- maxRetries?: number;
319
-
320
- /** Initial delay in milliseconds before first retry (default: 1000) */
321
- initialDelay?: number;
322
-
323
- /** Multiplier for exponential backoff (default: 2) */
324
- backoffMultiplier?: number;
325
-
326
- /** Maximum delay in milliseconds between retries (default: 30000) */
327
- maxDelay?: number;
328
-
329
- /** HTTP status codes that should trigger a retry (default: [408, 429, 500, 502, 503, 504]) */
330
- retryableStatusCodes?: number[];
331
-
332
- /** Custom function to determine if an error should be retried */
333
- shouldRetry?: (error: unknown) => boolean;
334
-
335
- /** Custom function to calculate delay for a specific retry attempt */
336
- calculateDelay?: (attempt: number, error: unknown) => number | undefined;
337
- }
338
- ```
339
-
340
- ### Using Retry Utilities Directly
341
-
342
- You can also use the retry utilities for custom operations:
343
-
344
- ```typescript
345
- import { retry, createRetryWrapper, isRetryableError } from "@visulima/storage";
346
-
347
- // One-off retry
348
- const result = await retry(
349
- async () => {
350
- // Your operation here
351
- return await someOperation();
352
- },
353
- {
354
- maxRetries: 3,
355
- initialDelay: 1000,
356
- },
357
- );
358
-
359
- // Create a reusable retry wrapper
360
- const retryWrapper = createRetryWrapper({
361
- maxRetries: 5,
362
- initialDelay: 2000,
363
- });
364
-
365
- const result = await retryWrapper(async () => {
366
- return await someOperation();
367
- });
368
-
369
- // Check if an error is retryable
370
- if (isRetryableError(error)) {
371
- // Handle retryable error
372
- }
373
- ```
374
-
375
- ### Supported Error Types
376
-
377
- The retry mechanism automatically handles:
378
-
379
- - **Network errors**: `ECONNRESET`, `ETIMEDOUT`, `ENOTFOUND`, `ECONNREFUSED`, `EAI_AGAIN`
380
- - **AWS SDK errors**: Server faults, retryable status codes, SDK v2/v3 error formats
381
- - **Azure Storage errors**: HTTP status codes, network connection issues
382
- - **HTTP errors**: 408 (Request Timeout), 429 (Too Many Requests), 5xx (Server Errors)
383
-
384
- ### Examples by Storage Backend
385
-
386
- #### AWS S3
80
+ ```ts
81
+ import { DiskStorage } from "@visulima/storage";
82
+ import { Multipart, Rest } from "@visulima/storage/handler/http/node";
387
83
 
388
- ```typescript
389
- import { S3Storage } from "@visulima/storage";
84
+ const storage = new DiskStorage({ directory: "./uploads" });
390
85
 
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
- },
86
+ const multipart = new Multipart({ storage });
87
+ app.use("/upload", multipart.handle, (req, res) => {
88
+ res.json(req.body); // handler writes the stored file metadata to req.body
398
89
  });
399
- ```
400
-
401
- #### Azure Blob Storage
402
90
 
403
- ```typescript
404
- import { AzureStorage } from "@visulima/storage";
405
-
406
- const storage = new AzureStorage({
407
- containerName: "uploads",
408
- accountName: "myaccount",
409
- accountKey: "mykey",
410
- retryConfig: {
411
- maxRetries: 5,
412
- initialDelay: 2000,
413
- },
414
- });
91
+ const rest = new Rest({ storage });
92
+ app.use("/files", rest.handle);
415
93
  ```
416
94
 
417
- #### Google Cloud Storage
95
+ Three handlers cover the common upload patterns:
418
96
 
419
- GCS already has built-in retry support via `gaxios`. The retry mechanism works alongside GCS's native retry logic:
97
+ - **Multipart** — `multipart/form-data` from HTML forms.
98
+ - **REST** — direct binary `POST` / `PUT`. Optional client-side chunking for large files.
99
+ - **TUS** — resumable uploads ([tus.io](https://tus.io)) for unreliable networks and very large files.
420
100
 
421
- ```typescript
422
- import { GCStorage } from "@visulima/storage";
101
+ → Runtime adapters live under `@visulima/storage/handler/http/{node,fetch,hono,nextjs,solid-start,bun,deno,cloudflare,edge}`. See [framework integrations](https://visulima.com/docs/packages/storage/framework).
423
102
 
424
- 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
- });
432
- ```
103
+ ## Choosing your surface
433
104
 
434
- #### Vercel Blob
105
+ | You want to… | Use |
106
+ | ------------------------------------------------------ | ------------------------------------------- |
107
+ | Save a `Blob` / `Buffer` to S3 and get a signed URL | `Files` |
108
+ | Drop in a file picker / "import from cloud" flow | `Files` with a consumer-provider adapter |
109
+ | Expose ad-hoc storage to an AI agent or LLM tool | `Files` + `@visulima/storage/ai/*` subpaths |
110
+ | Build a TUS / multipart / chunked upload endpoint | adapter + handler |
111
+ | Transform images / video / audio on the fly | adapter + transformer |
112
+ | Hook `onCreate` / `onComplete` / `onDelete` lifecycles | adapter |
113
+ | Export OpenAPI for an upload endpoint | adapter |
435
114
 
436
- ```typescript
437
- import { VercelBlobStorage } from "@visulima/storage";
115
+ ## Providers
438
116
 
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
- ```
117
+ Object storage (service credentials, presigned URLs, S3-style):
447
118
 
448
- #### Netlify Blob
119
+ - AWS S3 · Azure Blob · Google Cloud Storage · Vercel Blob · Netlify Blobs · Local disk
449
120
 
450
- ```typescript
451
- import { NetlifyBlobStorage } from "@visulima/storage";
121
+ S3-compatible (branded client configs under `provider/aws/s3/clients`):
452
122
 
453
- const storage = new NetlifyBlobStorage({
454
- storeName: "uploads",
455
- retryConfig: {
456
- maxRetries: 3,
457
- },
458
- });
459
- ```
123
+ - Cloudflare R2 · DigitalOcean Spaces · MinIO · Hetzner · Storj · Backblaze B2 · Tigris · Wasabi · Akamai · Scaleway · Vultr · Exoscale · Filebase · iDrive e2 · IBM Cloud Object Storage · Oracle Cloud (OCI) · OVHcloud · Alibaba Cloud OSS · Tencent Cloud COS · Yandex Object Storage
460
124
 
461
- ## Chunked Uploads
125
+ Consumer providers (user OAuth or service-credential, all peer-dep gated):
462
126
 
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.
127
+ - Dropbox · Google Drive · Microsoft OneDrive · SharePoint · Box · Supabase · UploadThing · Bunny Storage · Cloudinary · Firebase Storage · PocketBase
464
128
 
465
- ### Initializing a Chunked Upload
129
+ → See the [capability matrix](https://visulima.com/docs/packages/storage/services/capabilities) for what each provider supports (presign, copy, list, signed uploads, …).
466
130
 
467
- ```typescript
468
- import { Rest } from "@visulima/upload/handler/rest";
131
+ ## AI tool integrations
469
132
 
470
- const rest = new Rest({ storage });
471
-
472
- // Initialize chunked upload
473
- const initResponse = await fetch("/files", {
474
- method: "POST",
475
- headers: {
476
- "X-Chunked-Upload": "true",
477
- "X-Total-Size": "10485760", // Total file size in bytes
478
- "Content-Length": "0",
479
- "Content-Type": "application/octet-stream",
480
- },
481
- });
482
-
483
- const { id } = await initResponse.json();
484
- // id is the upload session ID
485
- ```
486
-
487
- ### Uploading Chunks
488
-
489
- ```typescript
490
- // Upload chunk 1 (bytes 0-524288)
491
- await fetch(`/files/${id}`, {
492
- method: "PATCH",
493
- headers: {
494
- "X-Chunk-Offset": "0",
495
- "Content-Length": "524288",
496
- "Content-Type": "application/octet-stream",
497
- },
498
- body: chunk1,
499
- });
133
+ The package ships four optional subpaths that expose `Files` as tools an LLM can call — same eight canonical operations wrapped in each SDK's native tool format, with per-tool approval gating.
500
134
 
501
- // 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
- ```
135
+ ```ts
136
+ import { Files } from "@visulima/storage";
137
+ import { S3Storage } from "@visulima/storage/provider/aws";
138
+ import { createFileTools } from "@visulima/storage/ai/sdk";
512
139
 
513
- ### Checking Upload Progress
514
-
515
- ```typescript
516
- // Check upload status
517
- const statusResponse = await fetch(`/files/${id}`, {
518
- method: "HEAD",
519
- });
520
-
521
- const offset = statusResponse.headers.get("X-Upload-Offset");
522
- const complete = statusResponse.headers.get("X-Upload-Complete");
523
- const chunks = JSON.parse(statusResponse.headers.get("X-Received-Chunks") || "[]");
524
-
525
- console.log(`Uploaded: ${offset} bytes, Complete: ${complete}`);
140
+ const files = new Files({ adapter: new S3Storage({ bucket: "uploads", region: "us-east-1" }) });
141
+ const tools = createFileTools({ files });
526
142
  ```
527
143
 
528
- ### 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)
144
+ Subpaths: `@visulima/storage/ai/{sdk,openai,claude,tanstack}` — Vercel AI SDK, OpenAI Responses + Agents (both under `/openai`), Claude Agent SDK, and TanStack AI.
535
145
 
536
- ### Response Headers
146
+ ## Documentation
537
147
 
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 }]`
148
+ - [Introduction](https://visulima.com/docs/packages/storage/introduction) — the two surfaces, when to use each
149
+ - [Files facade](https://visulima.com/docs/packages/storage/files-facade) — the eight-method reference
150
+ - [Services](https://visulima.com/docs/packages/storage/services) — per-provider configuration and capability matrix
151
+ - [Framework integrations](https://visulima.com/docs/packages/storage/framework) — Node, Fetch, Hono, Next.js, SolidStart, Bun, Deno, Cloudflare
152
+ - [Custom storage](https://visulima.com/docs/packages/storage/custom-storage) — write your own adapter against `BaseStorage`
153
+ - [Transformers](https://visulima.com/docs/packages/storage/transformers) — image / video / audio pipelines, caching
154
+ - [TUS handler](https://visulima.com/docs/packages/storage/tus-handler) · [Chunked uploads](https://visulima.com/docs/packages/storage/chunked-uploads) · [Authenticated uploads](https://visulima.com/docs/packages/storage/authenticated-file-uploads)
155
+ - [Batch operations](https://visulima.com/docs/packages/storage/batch-operations) · [Retry mechanism](https://visulima.com/docs/packages/storage/retry-mechanism) · [Caching](https://visulima.com/docs/packages/storage/caching)
156
+ - [Error handling](https://visulima.com/docs/packages/storage/error-handling) — `UploadError`, `ERRORS` enum, `wrapStorageError`
157
+ - [Observability](https://visulima.com/docs/packages/storage/observability) — metrics, OpenTelemetry, structured logs
158
+ - [OpenAPI export](https://visulima.com/docs/packages/storage/openapi)
543
159
 
544
160
  ## Supported Node.js Versions
545
161