@streetjs/storage 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 (363) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +719 -0
  3. package/dist/access.d.ts +95 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +114 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/cli/commands.d.ts +88 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +369 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/generators.d.ts +41 -0
  12. package/dist/cli/generators.d.ts.map +1 -0
  13. package/dist/cli/generators.js +119 -0
  14. package/dist/cli/generators.js.map +1 -0
  15. package/dist/directory.d.ts +88 -0
  16. package/dist/directory.d.ts.map +1 -0
  17. package/dist/directory.js +148 -0
  18. package/dist/directory.js.map +1 -0
  19. package/dist/driver.d.ts +83 -0
  20. package/dist/driver.d.ts.map +1 -0
  21. package/dist/driver.js +16 -0
  22. package/dist/driver.js.map +1 -0
  23. package/dist/drivers/azure.d.ts +239 -0
  24. package/dist/drivers/azure.d.ts.map +1 -0
  25. package/dist/drivers/azure.js +476 -0
  26. package/dist/drivers/azure.js.map +1 -0
  27. package/dist/drivers/backblaze.d.ts +105 -0
  28. package/dist/drivers/backblaze.d.ts.map +1 -0
  29. package/dist/drivers/backblaze.js +279 -0
  30. package/dist/drivers/backblaze.js.map +1 -0
  31. package/dist/drivers/gcs.d.ts +239 -0
  32. package/dist/drivers/gcs.d.ts.map +1 -0
  33. package/dist/drivers/gcs.js +454 -0
  34. package/dist/drivers/gcs.js.map +1 -0
  35. package/dist/drivers/local.d.ts +126 -0
  36. package/dist/drivers/local.d.ts.map +1 -0
  37. package/dist/drivers/local.js +321 -0
  38. package/dist/drivers/local.js.map +1 -0
  39. package/dist/drivers/memory.d.ts +104 -0
  40. package/dist/drivers/memory.d.ts.map +1 -0
  41. package/dist/drivers/memory.js +197 -0
  42. package/dist/drivers/memory.js.map +1 -0
  43. package/dist/drivers/minio.d.ts +90 -0
  44. package/dist/drivers/minio.d.ts.map +1 -0
  45. package/dist/drivers/minio.js +276 -0
  46. package/dist/drivers/minio.js.map +1 -0
  47. package/dist/drivers/r2.d.ts +100 -0
  48. package/dist/drivers/r2.d.ts.map +1 -0
  49. package/dist/drivers/r2.js +240 -0
  50. package/dist/drivers/r2.js.map +1 -0
  51. package/dist/drivers/s3-base.d.ts +270 -0
  52. package/dist/drivers/s3-base.d.ts.map +1 -0
  53. package/dist/drivers/s3-base.js +436 -0
  54. package/dist/drivers/s3-base.js.map +1 -0
  55. package/dist/drivers/s3.d.ts +111 -0
  56. package/dist/drivers/s3.d.ts.map +1 -0
  57. package/dist/drivers/s3.js +311 -0
  58. package/dist/drivers/s3.js.map +1 -0
  59. package/dist/drivers/supabase.d.ts +246 -0
  60. package/dist/drivers/supabase.d.ts.map +1 -0
  61. package/dist/drivers/supabase.js +502 -0
  62. package/dist/drivers/supabase.js.map +1 -0
  63. package/dist/errors.d.ts +115 -0
  64. package/dist/errors.d.ts.map +1 -0
  65. package/dist/errors.js +131 -0
  66. package/dist/errors.js.map +1 -0
  67. package/dist/examples/storage-demo.d.ts +53 -0
  68. package/dist/examples/storage-demo.d.ts.map +1 -0
  69. package/dist/examples/storage-demo.js +242 -0
  70. package/dist/examples/storage-demo.js.map +1 -0
  71. package/dist/facade.d.ts +192 -0
  72. package/dist/facade.d.ts.map +1 -0
  73. package/dist/facade.js +898 -0
  74. package/dist/facade.js.map +1 -0
  75. package/dist/image.d.ts +94 -0
  76. package/dist/image.d.ts.map +1 -0
  77. package/dist/image.js +224 -0
  78. package/dist/image.js.map +1 -0
  79. package/dist/index.d.ts +47 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +53 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/integrations/events.d.ts +108 -0
  84. package/dist/integrations/events.d.ts.map +1 -0
  85. package/dist/integrations/events.js +111 -0
  86. package/dist/integrations/events.js.map +1 -0
  87. package/dist/integrations/queue.d.ts +89 -0
  88. package/dist/integrations/queue.d.ts.map +1 -0
  89. package/dist/integrations/queue.js +91 -0
  90. package/dist/integrations/queue.js.map +1 -0
  91. package/dist/integrations/realtime.d.ts +95 -0
  92. package/dist/integrations/realtime.d.ts.map +1 -0
  93. package/dist/integrations/realtime.js +90 -0
  94. package/dist/integrations/realtime.js.map +1 -0
  95. package/dist/lifecycle.d.ts +137 -0
  96. package/dist/lifecycle.d.ts.map +1 -0
  97. package/dist/lifecycle.js +240 -0
  98. package/dist/lifecycle.js.map +1 -0
  99. package/dist/metadata.d.ts +109 -0
  100. package/dist/metadata.d.ts.map +1 -0
  101. package/dist/metadata.js +139 -0
  102. package/dist/metadata.js.map +1 -0
  103. package/dist/multipart.d.ts +108 -0
  104. package/dist/multipart.d.ts.map +1 -0
  105. package/dist/multipart.js +200 -0
  106. package/dist/multipart.js.map +1 -0
  107. package/dist/observability.d.ts +82 -0
  108. package/dist/observability.d.ts.map +1 -0
  109. package/dist/observability.js +175 -0
  110. package/dist/observability.js.map +1 -0
  111. package/dist/plugin.d.ts +82 -0
  112. package/dist/plugin.d.ts.map +1 -0
  113. package/dist/plugin.js +100 -0
  114. package/dist/plugin.js.map +1 -0
  115. package/dist/resumable.d.ts +118 -0
  116. package/dist/resumable.d.ts.map +1 -0
  117. package/dist/resumable.js +223 -0
  118. package/dist/resumable.js.map +1 -0
  119. package/dist/search.d.ts +57 -0
  120. package/dist/search.d.ts.map +1 -0
  121. package/dist/search.js +172 -0
  122. package/dist/search.js.map +1 -0
  123. package/dist/signed-url.d.ts +110 -0
  124. package/dist/signed-url.d.ts.map +1 -0
  125. package/dist/signed-url.js +237 -0
  126. package/dist/signed-url.js.map +1 -0
  127. package/dist/testing/index.d.ts +219 -0
  128. package/dist/testing/index.d.ts.map +1 -0
  129. package/dist/testing/index.js +393 -0
  130. package/dist/testing/index.js.map +1 -0
  131. package/dist/tests/access.test.d.ts +2 -0
  132. package/dist/tests/access.test.d.ts.map +1 -0
  133. package/dist/tests/access.test.js +270 -0
  134. package/dist/tests/access.test.js.map +1 -0
  135. package/dist/tests/azure-driver.test.d.ts +2 -0
  136. package/dist/tests/azure-driver.test.d.ts.map +1 -0
  137. package/dist/tests/azure-driver.test.js +183 -0
  138. package/dist/tests/azure-driver.test.js.map +1 -0
  139. package/dist/tests/backblaze-driver.test.d.ts +2 -0
  140. package/dist/tests/backblaze-driver.test.d.ts.map +1 -0
  141. package/dist/tests/backblaze-driver.test.js +185 -0
  142. package/dist/tests/backblaze-driver.test.js.map +1 -0
  143. package/dist/tests/bridge-degradation.test.d.ts +2 -0
  144. package/dist/tests/bridge-degradation.test.d.ts.map +1 -0
  145. package/dist/tests/bridge-degradation.test.js +138 -0
  146. package/dist/tests/bridge-degradation.test.js.map +1 -0
  147. package/dist/tests/cli.test.d.ts +2 -0
  148. package/dist/tests/cli.test.d.ts.map +1 -0
  149. package/dist/tests/cli.test.js +127 -0
  150. package/dist/tests/cli.test.js.map +1 -0
  151. package/dist/tests/contract.d.ts +131 -0
  152. package/dist/tests/contract.d.ts.map +1 -0
  153. package/dist/tests/contract.js +222 -0
  154. package/dist/tests/contract.js.map +1 -0
  155. package/dist/tests/contract.test.d.ts +2 -0
  156. package/dist/tests/contract.test.d.ts.map +1 -0
  157. package/dist/tests/contract.test.js +110 -0
  158. package/dist/tests/contract.test.js.map +1 -0
  159. package/dist/tests/directory.test.d.ts +2 -0
  160. package/dist/tests/directory.test.d.ts.map +1 -0
  161. package/dist/tests/directory.test.js +125 -0
  162. package/dist/tests/directory.test.js.map +1 -0
  163. package/dist/tests/errors.test.d.ts +2 -0
  164. package/dist/tests/errors.test.d.ts.map +1 -0
  165. package/dist/tests/errors.test.js +93 -0
  166. package/dist/tests/errors.test.js.map +1 -0
  167. package/dist/tests/events-bridge.test.d.ts +2 -0
  168. package/dist/tests/events-bridge.test.d.ts.map +1 -0
  169. package/dist/tests/events-bridge.test.js +228 -0
  170. package/dist/tests/events-bridge.test.js.map +1 -0
  171. package/dist/tests/example-smoke.test.d.ts +2 -0
  172. package/dist/tests/example-smoke.test.d.ts.map +1 -0
  173. package/dist/tests/example-smoke.test.js +34 -0
  174. package/dist/tests/example-smoke.test.js.map +1 -0
  175. package/dist/tests/gcs-driver.test.d.ts +2 -0
  176. package/dist/tests/gcs-driver.test.d.ts.map +1 -0
  177. package/dist/tests/gcs-driver.test.js +197 -0
  178. package/dist/tests/gcs-driver.test.js.map +1 -0
  179. package/dist/tests/image.test.d.ts +2 -0
  180. package/dist/tests/image.test.d.ts.map +1 -0
  181. package/dist/tests/image.test.js +102 -0
  182. package/dist/tests/image.test.js.map +1 -0
  183. package/dist/tests/lifecycle.test.d.ts +2 -0
  184. package/dist/tests/lifecycle.test.d.ts.map +1 -0
  185. package/dist/tests/lifecycle.test.js +171 -0
  186. package/dist/tests/lifecycle.test.js.map +1 -0
  187. package/dist/tests/local-driver.test.d.ts +2 -0
  188. package/dist/tests/local-driver.test.d.ts.map +1 -0
  189. package/dist/tests/local-driver.test.js +153 -0
  190. package/dist/tests/local-driver.test.js.map +1 -0
  191. package/dist/tests/local-streaming.test.d.ts +2 -0
  192. package/dist/tests/local-streaming.test.d.ts.map +1 -0
  193. package/dist/tests/local-streaming.test.js +121 -0
  194. package/dist/tests/local-streaming.test.js.map +1 -0
  195. package/dist/tests/memory-driver.test.d.ts +2 -0
  196. package/dist/tests/memory-driver.test.d.ts.map +1 -0
  197. package/dist/tests/memory-driver.test.js +180 -0
  198. package/dist/tests/memory-driver.test.js.map +1 -0
  199. package/dist/tests/memory-streaming.test.d.ts +2 -0
  200. package/dist/tests/memory-streaming.test.d.ts.map +1 -0
  201. package/dist/tests/memory-streaming.test.js +92 -0
  202. package/dist/tests/memory-streaming.test.js.map +1 -0
  203. package/dist/tests/minio-driver.test.d.ts +2 -0
  204. package/dist/tests/minio-driver.test.d.ts.map +1 -0
  205. package/dist/tests/minio-driver.test.js +146 -0
  206. package/dist/tests/minio-driver.test.js.map +1 -0
  207. package/dist/tests/non-s3-integration.test.d.ts +2 -0
  208. package/dist/tests/non-s3-integration.test.d.ts.map +1 -0
  209. package/dist/tests/non-s3-integration.test.js +201 -0
  210. package/dist/tests/non-s3-integration.test.js.map +1 -0
  211. package/dist/tests/observability.registration.test.d.ts +2 -0
  212. package/dist/tests/observability.registration.test.d.ts.map +1 -0
  213. package/dist/tests/observability.registration.test.js +103 -0
  214. package/dist/tests/observability.registration.test.js.map +1 -0
  215. package/dist/tests/observability.test.d.ts +2 -0
  216. package/dist/tests/observability.test.d.ts.map +1 -0
  217. package/dist/tests/observability.test.js +240 -0
  218. package/dist/tests/observability.test.js.map +1 -0
  219. package/dist/tests/plugin.test.d.ts +2 -0
  220. package/dist/tests/plugin.test.d.ts.map +1 -0
  221. package/dist/tests/plugin.test.js +112 -0
  222. package/dist/tests/plugin.test.js.map +1 -0
  223. package/dist/tests/prop-concurrent.test.d.ts +2 -0
  224. package/dist/tests/prop-concurrent.test.d.ts.map +1 -0
  225. package/dist/tests/prop-concurrent.test.js +59 -0
  226. package/dist/tests/prop-concurrent.test.js.map +1 -0
  227. package/dist/tests/prop-copy.test.d.ts +2 -0
  228. package/dist/tests/prop-copy.test.d.ts.map +1 -0
  229. package/dist/tests/prop-copy.test.js +63 -0
  230. package/dist/tests/prop-copy.test.js.map +1 -0
  231. package/dist/tests/prop-delete.test.d.ts +2 -0
  232. package/dist/tests/prop-delete.test.d.ts.map +1 -0
  233. package/dist/tests/prop-delete.test.js +35 -0
  234. package/dist/tests/prop-delete.test.js.map +1 -0
  235. package/dist/tests/prop-directory.test.d.ts +2 -0
  236. package/dist/tests/prop-directory.test.d.ts.map +1 -0
  237. package/dist/tests/prop-directory.test.js +118 -0
  238. package/dist/tests/prop-directory.test.js.map +1 -0
  239. package/dist/tests/prop-driver-conformance.test.d.ts +2 -0
  240. package/dist/tests/prop-driver-conformance.test.d.ts.map +1 -0
  241. package/dist/tests/prop-driver-conformance.test.js +110 -0
  242. package/dist/tests/prop-driver-conformance.test.js.map +1 -0
  243. package/dist/tests/prop-driver-equivalence.test.d.ts +2 -0
  244. package/dist/tests/prop-driver-equivalence.test.d.ts.map +1 -0
  245. package/dist/tests/prop-driver-equivalence.test.js +163 -0
  246. package/dist/tests/prop-driver-equivalence.test.js.map +1 -0
  247. package/dist/tests/prop-lifecycle.test.d.ts +2 -0
  248. package/dist/tests/prop-lifecycle.test.d.ts.map +1 -0
  249. package/dist/tests/prop-lifecycle.test.js +83 -0
  250. package/dist/tests/prop-lifecycle.test.js.map +1 -0
  251. package/dist/tests/prop-list.test.d.ts +2 -0
  252. package/dist/tests/prop-list.test.d.ts.map +1 -0
  253. package/dist/tests/prop-list.test.js +53 -0
  254. package/dist/tests/prop-list.test.js.map +1 -0
  255. package/dist/tests/prop-metadata.test.d.ts +2 -0
  256. package/dist/tests/prop-metadata.test.d.ts.map +1 -0
  257. package/dist/tests/prop-metadata.test.js +87 -0
  258. package/dist/tests/prop-metadata.test.js.map +1 -0
  259. package/dist/tests/prop-move.test.d.ts +2 -0
  260. package/dist/tests/prop-move.test.d.ts.map +1 -0
  261. package/dist/tests/prop-move.test.js +67 -0
  262. package/dist/tests/prop-move.test.js.map +1 -0
  263. package/dist/tests/prop-multipart-abort.test.d.ts +2 -0
  264. package/dist/tests/prop-multipart-abort.test.d.ts.map +1 -0
  265. package/dist/tests/prop-multipart-abort.test.js +48 -0
  266. package/dist/tests/prop-multipart-abort.test.js.map +1 -0
  267. package/dist/tests/prop-multipart.test.d.ts +2 -0
  268. package/dist/tests/prop-multipart.test.d.ts.map +1 -0
  269. package/dist/tests/prop-multipart.test.js +65 -0
  270. package/dist/tests/prop-multipart.test.js.map +1 -0
  271. package/dist/tests/prop-resumable.test.d.ts +2 -0
  272. package/dist/tests/prop-resumable.test.d.ts.map +1 -0
  273. package/dist/tests/prop-resumable.test.js +78 -0
  274. package/dist/tests/prop-resumable.test.js.map +1 -0
  275. package/dist/tests/prop-search.test.d.ts +2 -0
  276. package/dist/tests/prop-search.test.d.ts.map +1 -0
  277. package/dist/tests/prop-search.test.js +120 -0
  278. package/dist/tests/prop-search.test.js.map +1 -0
  279. package/dist/tests/prop-signed-url.test.d.ts +2 -0
  280. package/dist/tests/prop-signed-url.test.d.ts.map +1 -0
  281. package/dist/tests/prop-signed-url.test.js +74 -0
  282. package/dist/tests/prop-signed-url.test.js.map +1 -0
  283. package/dist/tests/prop-streaming.test.d.ts +2 -0
  284. package/dist/tests/prop-streaming.test.d.ts.map +1 -0
  285. package/dist/tests/prop-streaming.test.js +34 -0
  286. package/dist/tests/prop-streaming.test.js.map +1 -0
  287. package/dist/tests/prop-upload-download.test.d.ts +2 -0
  288. package/dist/tests/prop-upload-download.test.d.ts.map +1 -0
  289. package/dist/tests/prop-upload-download.test.js +30 -0
  290. package/dist/tests/prop-upload-download.test.js.map +1 -0
  291. package/dist/tests/prop-validation.test.d.ts +2 -0
  292. package/dist/tests/prop-validation.test.d.ts.map +1 -0
  293. package/dist/tests/prop-validation.test.js +50 -0
  294. package/dist/tests/prop-validation.test.js.map +1 -0
  295. package/dist/tests/prop-versioning.test.d.ts +2 -0
  296. package/dist/tests/prop-versioning.test.d.ts.map +1 -0
  297. package/dist/tests/prop-versioning.test.js +74 -0
  298. package/dist/tests/prop-versioning.test.js.map +1 -0
  299. package/dist/tests/queue-bridge.test.d.ts +2 -0
  300. package/dist/tests/queue-bridge.test.d.ts.map +1 -0
  301. package/dist/tests/queue-bridge.test.js +111 -0
  302. package/dist/tests/queue-bridge.test.js.map +1 -0
  303. package/dist/tests/r2-driver.test.d.ts +2 -0
  304. package/dist/tests/r2-driver.test.d.ts.map +1 -0
  305. package/dist/tests/r2-driver.test.js +143 -0
  306. package/dist/tests/r2-driver.test.js.map +1 -0
  307. package/dist/tests/realtime-bridge.test.d.ts +2 -0
  308. package/dist/tests/realtime-bridge.test.d.ts.map +1 -0
  309. package/dist/tests/realtime-bridge.test.js +106 -0
  310. package/dist/tests/realtime-bridge.test.js.map +1 -0
  311. package/dist/tests/resumable.test.d.ts +2 -0
  312. package/dist/tests/resumable.test.d.ts.map +1 -0
  313. package/dist/tests/resumable.test.js +104 -0
  314. package/dist/tests/resumable.test.js.map +1 -0
  315. package/dist/tests/s3-base.test.d.ts +2 -0
  316. package/dist/tests/s3-base.test.d.ts.map +1 -0
  317. package/dist/tests/s3-base.test.js +289 -0
  318. package/dist/tests/s3-base.test.js.map +1 -0
  319. package/dist/tests/s3-integration.test.d.ts +2 -0
  320. package/dist/tests/s3-integration.test.d.ts.map +1 -0
  321. package/dist/tests/s3-integration.test.js +270 -0
  322. package/dist/tests/s3-integration.test.js.map +1 -0
  323. package/dist/tests/s3.test.d.ts +2 -0
  324. package/dist/tests/s3.test.d.ts.map +1 -0
  325. package/dist/tests/s3.test.js +203 -0
  326. package/dist/tests/s3.test.js.map +1 -0
  327. package/dist/tests/scaffold.test.d.ts +2 -0
  328. package/dist/tests/scaffold.test.d.ts.map +1 -0
  329. package/dist/tests/scaffold.test.js +13 -0
  330. package/dist/tests/scaffold.test.js.map +1 -0
  331. package/dist/tests/search.test.d.ts +2 -0
  332. package/dist/tests/search.test.d.ts.map +1 -0
  333. package/dist/tests/search.test.js +106 -0
  334. package/dist/tests/search.test.js.map +1 -0
  335. package/dist/tests/supabase-driver.test.d.ts +2 -0
  336. package/dist/tests/supabase-driver.test.d.ts.map +1 -0
  337. package/dist/tests/supabase-driver.test.js +196 -0
  338. package/dist/tests/supabase-driver.test.js.map +1 -0
  339. package/dist/tests/testing-utilities.test.d.ts +2 -0
  340. package/dist/tests/testing-utilities.test.d.ts.map +1 -0
  341. package/dist/tests/testing-utilities.test.js +138 -0
  342. package/dist/tests/testing-utilities.test.js.map +1 -0
  343. package/dist/tests/validation.test.d.ts +2 -0
  344. package/dist/tests/validation.test.d.ts.map +1 -0
  345. package/dist/tests/validation.test.js +135 -0
  346. package/dist/tests/validation.test.js.map +1 -0
  347. package/dist/tests/versioning.test.d.ts +2 -0
  348. package/dist/tests/versioning.test.d.ts.map +1 -0
  349. package/dist/tests/versioning.test.js +128 -0
  350. package/dist/tests/versioning.test.js.map +1 -0
  351. package/dist/types.d.ts +232 -0
  352. package/dist/types.d.ts.map +1 -0
  353. package/dist/types.js +23 -0
  354. package/dist/types.js.map +1 -0
  355. package/dist/validation.d.ts +105 -0
  356. package/dist/validation.d.ts.map +1 -0
  357. package/dist/validation.js +225 -0
  358. package/dist/validation.js.map +1 -0
  359. package/dist/versioning.d.ts +100 -0
  360. package/dist/versioning.d.ts.map +1 -0
  361. package/dist/versioning.js +179 -0
  362. package/dist/versioning.js.map +1 -0
  363. package/package.json +137 -0
@@ -0,0 +1,476 @@
1
+ /**
2
+ * @streetjs/storage — Azure Blob Storage driver submodule (`@streetjs/storage/azure`).
3
+ *
4
+ * Azure Blob Storage does **not** speak the S3 wire shape, so — unlike
5
+ * `s3.ts`/`r2.ts`/`minio.ts`/`backblaze.ts`, which specialize the shared
6
+ * {@link createS3StyleDriver} base — this driver maps the {@link StorageDriver}
7
+ * contract **directly** onto a structural Azure Blob client
8
+ * ({@link AzureBlobClientLike}). It computes object identity fields
9
+ * (`size`/`checksum`/`etag`) and timestamps locally and assembles every
10
+ * {@link StorageObjectMetadata} through the shared metadata layer
11
+ * ({@link buildObjectMetadata}) so the field set is identical to Memory/Local
12
+ * and every other provider (Requirement 2.1, 10.1).
13
+ *
14
+ * ## SDK isolation (Requirements 3.1, 3.3)
15
+ *
16
+ * This module imports **no provider SDK** at the top level — only Node built-ins,
17
+ * `streetjs` (for the injected {@link Clock}), and this package's own type
18
+ * surface. There are two ways to obtain a driver:
19
+ *
20
+ * 1. **Inject a structural client.** {@link createAzureBlobDriver} accepts an
21
+ * already-built {@link AzureBlobClientLike} (real SDK adapter or a test
22
+ * double) and maps the contract onto it. The `@azure/storage-blob` SDK stays
23
+ * an optional peer concern of the consumer and is never touched by this
24
+ * package.
25
+ *
26
+ * 2. **Let the driver build its own client.** {@link connectAzureBlobDriver}
27
+ * resolves the optional `@azure/storage-blob` peer SDK with a **lazy dynamic
28
+ * `import()`** performed *inside the function* (never at module top level),
29
+ * constructs a container-scoped client, adapts it to
30
+ * {@link AzureBlobClientLike}, and hands it to {@link createAzureBlobDriver}.
31
+ * If the SDK is absent, it throws {@link StorageConfigError} rather than a raw
32
+ * module-resolution error.
33
+ *
34
+ * Because the driver lives behind the `./azure` subpath export
35
+ * (`dist/drivers/azure.js`) and is *not* re-exported from the package index, a
36
+ * consumer only loads this code — and any SDK it lazily resolves — when they
37
+ * import `@streetjs/storage/azure`. `package.json` lists `@azure/storage-blob`
38
+ * as an optional peer dependency, never a runtime dependency, keeping `streetjs`
39
+ * the only runtime dependency.
40
+ *
41
+ * ## Capability delegation (Requirement 2.3)
42
+ *
43
+ * Only the **mandatory primitives** (`put`/`get`/`exists`/`delete`/`stat`/
44
+ * `list`/`putStream`/`getStream`) are implemented. The advanced capabilities
45
+ * (`multipart`/`resumable`/`versioning`/`signedUrl`/`lifecycle`) are left
46
+ * `undefined` so the facade's cross-cutting layer supplies a provider-agnostic
47
+ * simulation over the primitives, keeping observable behavior identical across
48
+ * providers.
49
+ *
50
+ * _Requirements: 2.1, 2.3, 3.3_
51
+ */
52
+ import { createHash } from "node:crypto";
53
+ import { Readable, Writable } from "node:stream";
54
+ import { pipeline } from "node:stream/promises";
55
+ import { systemClock } from "streetjs";
56
+ import { StorageConfigError, NotFoundError } from "../errors.js";
57
+ import { buildObjectMetadata } from "../metadata.js";
58
+ /** The stable {@link StorageDriver.name} surfaced by every Azure Blob driver. */
59
+ const AZURE_DRIVER_NAME = "azure";
60
+ // ── Metadata encoding keys ────────────────────────────────────────────────────
61
+ /**
62
+ * Reserved blob-metadata keys used to round-trip the typed metadata field set
63
+ * through Azure's string→string blob metadata map. Azure blob metadata names
64
+ * must be valid C# identifiers (letters/digits/underscore, no hyphens), so these
65
+ * keys are underscore-delimited rather than the `x-...-` style used by the
66
+ * S3-style base. The `street_` prefix keeps them from colliding with a caller's
67
+ * own custom fields.
68
+ */
69
+ const MK = {
70
+ checksum: "street_checksum",
71
+ createdAt: "street_created_at",
72
+ updatedAt: "street_updated_at",
73
+ owner: "street_owner",
74
+ tenant: "street_tenant",
75
+ accessLevel: "street_access_level",
76
+ custom: "street_custom",
77
+ };
78
+ // ── The Azure Blob driver ──────────────────────────────────────────────────────
79
+ /**
80
+ * Maps the {@link StorageDriver} contract directly onto an injected
81
+ * {@link AzureBlobClientLike}.
82
+ *
83
+ * Unlike the S3-compatible providers, Azure Blob does not share the S3 wire
84
+ * shape, so this driver does not build on {@link createS3StyleDriver}. It
85
+ * computes size/checksum/etag and timestamps locally, encodes the typed metadata
86
+ * into the blob metadata map so it round-trips on read, and reports a missing
87
+ * key consistently ({@link MaybeObject} `{ found: false }` for `get`, `null` for
88
+ * `stat`, {@link NotFoundError} for `getStream`).
89
+ */
90
+ export class AzureBlobDriver {
91
+ /** Stable driver name. */
92
+ name = AZURE_DRIVER_NAME;
93
+ client;
94
+ clock;
95
+ constructor(client, options = {}) {
96
+ this.client = client;
97
+ this.clock = options.clock ?? systemClock;
98
+ }
99
+ // ── Mandatory primitives ──────────────────────────────────────────────────
100
+ /**
101
+ * Store `bytes` under `key`, computing size and sha-256 checksum locally and
102
+ * taking timestamps from the injected clock. When overwriting, the original
103
+ * `createdAt` is preserved (a preceding attribute read). The typed metadata is
104
+ * encoded into the blob metadata map so it round-trips on read
105
+ * (Requirements 4.1, 10.1, 10.2).
106
+ */
107
+ async put(key, bytes, metadata) {
108
+ const stored = bytes.slice();
109
+ const checksum = sha256Hex(stored);
110
+ const now = this.clock();
111
+ const existing = await this.stat(key);
112
+ const objectMetadata = buildObjectMetadata({
113
+ key,
114
+ size: stored.byteLength,
115
+ checksum,
116
+ createdAt: existing?.createdAt ?? now,
117
+ updatedAt: now,
118
+ write: metadata,
119
+ });
120
+ await this.client.upload({
121
+ blobName: key,
122
+ body: stored,
123
+ contentType: objectMetadata.contentType,
124
+ metadata: encodeMetadata(objectMetadata),
125
+ });
126
+ return objectMetadata;
127
+ }
128
+ /**
129
+ * Read the object at `key`, returning a discriminated {@link MaybeObject} so
130
+ * absence is reported rather than thrown (Requirements 4.2, 2.4). Metadata is
131
+ * rebuilt from the blob attributes and encoded metadata via the shared layer.
132
+ */
133
+ async get(key) {
134
+ const out = await this.client.download({ blobName: key });
135
+ if (out === null) {
136
+ return { found: false };
137
+ }
138
+ const bytes = out.body.slice();
139
+ const metadata = this.decodeMeta(key, {
140
+ contentType: out.contentType,
141
+ etag: out.etag,
142
+ contentLength: bytes.byteLength,
143
+ lastModified: out.lastModified,
144
+ metadata: out.metadata,
145
+ });
146
+ return { found: true, bytes, metadata };
147
+ }
148
+ /** Report whether an object is stored under `key` (Requirement 4.3). */
149
+ async exists(key) {
150
+ return this.client.exists({ blobName: key });
151
+ }
152
+ /** Delete the object at `key`; deleting a missing key is a no-op (Requirement 4.4). */
153
+ async delete(key) {
154
+ await this.client.deleteBlob({ blobName: key });
155
+ }
156
+ /**
157
+ * Return the metadata for `key` without its content, or `null` when absent
158
+ * (Requirement 4.10).
159
+ */
160
+ async stat(key) {
161
+ const props = await this.client.getProperties({ blobName: key });
162
+ if (props === null) {
163
+ return null;
164
+ }
165
+ return this.decodeMeta(key, props);
166
+ }
167
+ /** List objects whose key begins with `prefix` (Requirement 4.9). */
168
+ async list(prefix, options) {
169
+ const items = await this.client.listBlobs({ prefix, limit: options?.limit });
170
+ const sorted = [...items].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
171
+ const limited = typeof options?.limit === "number" ? sorted.slice(0, options.limit) : sorted;
172
+ return limited.map((item) => ({
173
+ key: item.name,
174
+ size: item.contentLength,
175
+ updatedAt: item.lastModified,
176
+ }));
177
+ }
178
+ // ── Streaming ───────────────────────────────────────────────────────────────
179
+ /**
180
+ * Consume a Node {@link Readable} and persist the assembled bytes under `key`
181
+ * with the same computed metadata as {@link put} (Requirement 5.1). Chunks are
182
+ * drained through a `pipeline` (correct backpressure and error propagation),
183
+ * then handed to {@link put}.
184
+ */
185
+ async putStream(key, stream, metadata) {
186
+ const chunks = [];
187
+ const collector = new Writable({
188
+ write(chunk, _encoding, callback) {
189
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
190
+ callback();
191
+ },
192
+ });
193
+ await pipeline(stream, collector);
194
+ return this.put(key, new Uint8Array(Buffer.concat(chunks)), metadata);
195
+ }
196
+ /**
197
+ * Return a Node {@link Readable} of the stored bytes at `key` (Requirement
198
+ * 5.2). Throws {@link NotFoundError} for a missing key (Requirement 5.5).
199
+ */
200
+ async getStream(key) {
201
+ const out = await this.client.download({ blobName: key });
202
+ if (out === null) {
203
+ throw new NotFoundError(key);
204
+ }
205
+ return Readable.from([Buffer.from(out.body)]);
206
+ }
207
+ // ── Internal helpers ──────────────────────────────────────────────────────
208
+ /**
209
+ * Rebuild the typed {@link StorageObjectMetadata} field set from blob
210
+ * attributes and the encoded metadata map, applying the shared layer's
211
+ * canonical defaults. Provider-supplied values back-fill identity/timestamp
212
+ * fields when the encoded ones are absent (e.g. a blob written outside this
213
+ * driver), keeping the shape consistent across providers.
214
+ */
215
+ decodeMeta(key, props) {
216
+ const bm = props.metadata ?? {};
217
+ const now = this.clock();
218
+ const checksum = bm[MK.checksum] ?? props.etag ?? "";
219
+ const createdAt = parseEpoch(bm[MK.createdAt]) ?? props.lastModified ?? now;
220
+ const updatedAt = parseEpoch(bm[MK.updatedAt]) ?? props.lastModified ?? createdAt;
221
+ const write = {
222
+ contentType: props.contentType,
223
+ owner: bm[MK.owner],
224
+ tenant: bm[MK.tenant],
225
+ accessLevel: decodeAccessLevel(bm[MK.accessLevel]),
226
+ custom: parseCustom(bm[MK.custom]),
227
+ };
228
+ return buildObjectMetadata({
229
+ key,
230
+ size: props.contentLength ?? 0,
231
+ checksum,
232
+ etag: props.etag ?? checksum,
233
+ createdAt,
234
+ updatedAt,
235
+ write,
236
+ });
237
+ }
238
+ }
239
+ /**
240
+ * Create an Azure-Blob-backed {@link StorageDriver} over an **injected**
241
+ * structural {@link AzureBlobClientLike}.
242
+ *
243
+ * This is the primary, SDK-free entry point: the caller supplies a client that
244
+ * already speaks the {@link AzureBlobClientLike} shape (built from
245
+ * `@azure/storage-blob`, or a test double), and this function maps the contract
246
+ * onto it. No provider SDK is imported.
247
+ *
248
+ * @throws {StorageConfigError} when no client is injected — use
249
+ * {@link connectAzureBlobDriver} to build a client from connection options.
250
+ */
251
+ export function createAzureBlobDriver(client, options = {}) {
252
+ if (client === undefined || client === null) {
253
+ throw new StorageConfigError("createAzureBlobDriver requires an injected Azure Blob client. " +
254
+ "Pass an AzureBlobClientLike, or use connectAzureBlobDriver(options) to " +
255
+ "build one from a connection string using the optional " +
256
+ "'@azure/storage-blob' peer dependency.", { provider: AZURE_DRIVER_NAME });
257
+ }
258
+ return new AzureBlobDriver(client, options);
259
+ }
260
+ /**
261
+ * Build an Azure-Blob-backed {@link StorageDriver}, constructing the underlying
262
+ * client from `connection` options using the optional `@azure/storage-blob` peer
263
+ * SDK.
264
+ *
265
+ * The SDK is resolved with a **lazy dynamic `import()`** performed inside this
266
+ * function, so the peer dependency is only touched when a caller actually asks
267
+ * the driver to build its own client. The resolved SDK client is adapted to the
268
+ * structural {@link AzureBlobClientLike} and handed to {@link createAzureBlobDriver}.
269
+ *
270
+ * @throws {StorageConfigError} when the `@azure/storage-blob` SDK is not
271
+ * installed, or when the client cannot be constructed from the supplied options.
272
+ */
273
+ export async function connectAzureBlobDriver(connection, options = {}) {
274
+ const sdk = await loadAzureSdk();
275
+ let containerClient;
276
+ try {
277
+ const service = sdk.BlobServiceClient.fromConnectionString(connection.connectionString);
278
+ containerClient = service.getContainerClient(connection.container);
279
+ }
280
+ catch (cause) {
281
+ throw new StorageConfigError(`Failed to construct an Azure Blob client for container "${connection.container}".`, { provider: AZURE_DRIVER_NAME, cause });
282
+ }
283
+ const client = adaptAzureContainerClient(containerClient);
284
+ return createAzureBlobDriver(client, options);
285
+ }
286
+ /**
287
+ * Lazily resolve the optional `@azure/storage-blob` peer SDK. The module
288
+ * specifier is held in a variable so the compiler does not statically resolve
289
+ * (and therefore require) the optional peer at build time; the resolution
290
+ * happens only at call time.
291
+ *
292
+ * @throws {StorageConfigError} when the SDK is not installed.
293
+ */
294
+ async function loadAzureSdk() {
295
+ const specifier = "@azure/storage-blob";
296
+ try {
297
+ return (await import(specifier));
298
+ }
299
+ catch (cause) {
300
+ throw new StorageConfigError("The optional '@azure/storage-blob' peer dependency is not installed. " +
301
+ "Install it (`npm install @azure/storage-blob`) to build an Azure Blob " +
302
+ "client from a connection string, or inject your own AzureBlobClientLike " +
303
+ "via createAzureBlobDriver(client).", { provider: AZURE_DRIVER_NAME, cause });
304
+ }
305
+ }
306
+ // ── SDK → AzureBlobClientLike adapter ──────────────────────────────────────────
307
+ /**
308
+ * Adapt an Azure `ContainerClient` into the structural {@link AzureBlobClientLike}
309
+ * the driver consumes, scoping every call to that container. Not-found responses
310
+ * (a 404 `RestError`/`BlobNotFound`) are mapped to `null`/no-op so absence is
311
+ * reported consistently rather than thrown.
312
+ */
313
+ function adaptAzureContainerClient(container) {
314
+ return {
315
+ async upload(input) {
316
+ const blob = container.getBlockBlobClient(input.blobName);
317
+ const body = Buffer.from(input.body);
318
+ const result = await blob.upload(body, body.byteLength, {
319
+ blobHTTPHeaders: input.contentType !== undefined
320
+ ? { blobContentType: input.contentType }
321
+ : undefined,
322
+ metadata: input.metadata,
323
+ });
324
+ return { etag: result.etag };
325
+ },
326
+ async download(input) {
327
+ const blob = container.getBlockBlobClient(input.blobName);
328
+ let response;
329
+ try {
330
+ response = await blob.download();
331
+ }
332
+ catch (error) {
333
+ if (isNotFound(error)) {
334
+ return null;
335
+ }
336
+ throw error;
337
+ }
338
+ const body = response.readableStreamBody
339
+ ? await collectStream(response.readableStreamBody)
340
+ : new Uint8Array(0);
341
+ return {
342
+ body,
343
+ contentType: response.contentType,
344
+ etag: response.etag,
345
+ contentLength: response.contentLength ?? body.byteLength,
346
+ lastModified: response.lastModified?.getTime(),
347
+ metadata: response.metadata,
348
+ };
349
+ },
350
+ async getProperties(input) {
351
+ const blob = container.getBlockBlobClient(input.blobName);
352
+ try {
353
+ const props = await blob.getProperties();
354
+ return {
355
+ contentType: props.contentType,
356
+ etag: props.etag,
357
+ contentLength: props.contentLength,
358
+ lastModified: props.lastModified?.getTime(),
359
+ metadata: props.metadata,
360
+ };
361
+ }
362
+ catch (error) {
363
+ if (isNotFound(error)) {
364
+ return null;
365
+ }
366
+ throw error;
367
+ }
368
+ },
369
+ async deleteBlob(input) {
370
+ const blob = container.getBlockBlobClient(input.blobName);
371
+ await blob.deleteIfExists();
372
+ },
373
+ async exists(input) {
374
+ const blob = container.getBlockBlobClient(input.blobName);
375
+ return blob.exists();
376
+ },
377
+ async listBlobs(input) {
378
+ const items = [];
379
+ for await (const blob of container.listBlobsFlat({ prefix: input.prefix })) {
380
+ items.push({
381
+ name: blob.name,
382
+ contentLength: blob.properties?.contentLength ?? 0,
383
+ lastModified: blob.properties?.lastModified?.getTime() ?? 0,
384
+ });
385
+ if (typeof input.limit === "number" && items.length >= input.limit) {
386
+ break;
387
+ }
388
+ }
389
+ return items;
390
+ },
391
+ };
392
+ }
393
+ // ── Metadata encode/decode helpers ──────────────────────────────────────────────
394
+ /** Encode a built object's typed metadata into the Azure blob metadata map. */
395
+ function encodeMetadata(metadata) {
396
+ const map = {
397
+ [MK.checksum]: metadata.checksum,
398
+ [MK.createdAt]: String(metadata.createdAt),
399
+ [MK.updatedAt]: String(metadata.updatedAt),
400
+ [MK.accessLevel]: metadata.accessLevel,
401
+ [MK.custom]: JSON.stringify(metadata.custom ?? {}),
402
+ };
403
+ if (metadata.owner !== undefined) {
404
+ map[MK.owner] = metadata.owner;
405
+ }
406
+ if (metadata.tenant !== undefined) {
407
+ map[MK.tenant] = metadata.tenant;
408
+ }
409
+ return map;
410
+ }
411
+ /** Compute the lowercase sha-256 hex digest of `bytes`. */
412
+ function sha256Hex(bytes) {
413
+ return createHash("sha256").update(bytes).digest("hex");
414
+ }
415
+ /** Collect a Node readable stream into a single {@link Uint8Array}. */
416
+ async function collectStream(stream) {
417
+ const chunks = [];
418
+ for await (const chunk of stream) {
419
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : Buffer.from(chunk));
420
+ }
421
+ return new Uint8Array(Buffer.concat(chunks));
422
+ }
423
+ /**
424
+ * Detect an Azure "blob does not exist" error so absence maps to `null`/no-op
425
+ * rather than a thrown error, keeping not-found semantics identical across
426
+ * providers.
427
+ */
428
+ function isNotFound(error) {
429
+ if (error === null || typeof error !== "object") {
430
+ return false;
431
+ }
432
+ const code = error.code;
433
+ const statusCode = error.statusCode;
434
+ return code === "BlobNotFound" || code === "ContainerNotFound" || statusCode === 404;
435
+ }
436
+ /** Parse an epoch-ms string, returning `undefined` when absent or non-numeric. */
437
+ function parseEpoch(value) {
438
+ if (value === undefined) {
439
+ return undefined;
440
+ }
441
+ const parsed = Number(value);
442
+ return Number.isFinite(parsed) ? parsed : undefined;
443
+ }
444
+ /** Parse the encoded custom-field JSON, tolerating malformed values. */
445
+ function parseCustom(value) {
446
+ if (value === undefined) {
447
+ return {};
448
+ }
449
+ try {
450
+ const parsed = JSON.parse(value);
451
+ if (parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)) {
452
+ return parsed;
453
+ }
454
+ }
455
+ catch {
456
+ // Fall through to the empty default on malformed JSON.
457
+ }
458
+ return {};
459
+ }
460
+ /** The recognized access levels, used to validate the decoded value. */
461
+ const ACCESS_LEVELS = [
462
+ "public",
463
+ "private",
464
+ "signed",
465
+ "authenticated",
466
+ "role-based",
467
+ "tenant-aware",
468
+ ];
469
+ /** Decode an access-level string, returning `undefined` for an unknown value. */
470
+ function decodeAccessLevel(value) {
471
+ if (value !== undefined && ACCESS_LEVELS.includes(value)) {
472
+ return value;
473
+ }
474
+ return undefined;
475
+ }
476
+ //# sourceMappingURL=azure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../src/drivers/azure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @streetjs/storage — the Backblaze B2 driver submodule (`@streetjs/storage/backblaze`).
3
+ *
4
+ * Backblaze B2 exposes a **fully S3-compatible API**, so this driver is a thin
5
+ * specialization of the shared S3-style base ({@link createS3StyleDriver} in
6
+ * `s3-base.ts`): it only differs in how the underlying client is
7
+ * built/configured (a B2 S3 endpoint and B2 application-key credentials), never
8
+ * in how the {@link StorageDriver} contract is satisfied. The driver name is
9
+ * fixed to `"backblaze"`.
10
+ *
11
+ * ## SDK isolation (Requirements 3.1, 3.3)
12
+ *
13
+ * This module imports **no provider SDK at the top level** — only this package's
14
+ * own type surface and the shared S3-style base. It supports two construction
15
+ * modes:
16
+ *
17
+ * 1. **Injected structural client** — the caller passes an {@link S3ClientLike}
18
+ * (the minimal, SDK-shaped structural interface the base depends on). The SDK
19
+ * is then entirely a concern of the caller; this package resolves nothing.
20
+ * ({@link createBackblazeB2Driver} with a client, synchronous.)
21
+ * 2. **Self-built client from connection config** — the driver constructs its own
22
+ * S3-compatible client for the B2 endpoint using a **lazy dynamic `import()`**
23
+ * performed inside the factory at construction time (never at module top
24
+ * level), so `@aws-sdk/client-s3` is resolved only when this submodule is
25
+ * actually used to build a client. If that optional peer SDK is absent (and no
26
+ * client was injected), a descriptive {@link StorageConfigError} is thrown.
27
+ * ({@link createBackblazeB2Driver} with a config, asynchronous.)
28
+ *
29
+ * Because this driver lives behind the `./backblaze` subpath export and the base
30
+ * package never imports it, `streetjs` stays the only runtime dependency and the
31
+ * B2/S3 SDK remains an optional peer dependency.
32
+ *
33
+ * _Requirements: 2.1, 2.3, 3.3_
34
+ */
35
+ import { type Clock } from "streetjs";
36
+ import type { StorageDriver } from "../driver.js";
37
+ import { S3StyleDriver, type S3ClientLike, type S3NativeCapabilities } from "./s3-base.js";
38
+ /** The stable driver name surfaced as {@link StorageDriver.name}. */
39
+ export declare const BACKBLAZE_DRIVER_NAME = "backblaze";
40
+ /**
41
+ * Options shared by both construction modes. Native capability objects supplied
42
+ * here are delegated by the base; anything omitted is simulated by the facade
43
+ * over the mandatory primitives (identical behavior across providers).
44
+ */
45
+ export interface BackblazeB2DriverOptions {
46
+ /** Overrides the driver name. Defaults to `"backblaze"`; changing it is rare. */
47
+ readonly name?: string;
48
+ /** Injected clock for deterministic timestamps in tests. Default `systemClock`. */
49
+ readonly clock?: Clock;
50
+ /** Native capability objects (versioning/lifecycle/signed URLs) to delegate. */
51
+ readonly capabilities?: S3NativeCapabilities;
52
+ }
53
+ /**
54
+ * B2 application-key credentials, expressed in S3 terms. The B2 `keyId` maps to
55
+ * `accessKeyId` and the B2 `applicationKey` maps to `secretAccessKey`.
56
+ */
57
+ export interface BackblazeB2Credentials {
58
+ readonly accessKeyId: string;
59
+ readonly secretAccessKey: string;
60
+ }
61
+ /**
62
+ * Connection config used when the driver **builds its own** S3-compatible client
63
+ * for the Backblaze B2 endpoint (the lazy-`import()` path).
64
+ */
65
+ export interface BackblazeB2ConnectionConfig extends BackblazeB2DriverOptions {
66
+ /** The B2 bucket name every object operation targets. */
67
+ readonly bucket: string;
68
+ /**
69
+ * The B2 S3-compatible endpoint, e.g. `https://s3.us-west-002.backblazeb2.com`.
70
+ */
71
+ readonly endpoint: string;
72
+ /**
73
+ * The B2 region label embedded in the endpoint, e.g. `us-west-002`. Defaults to
74
+ * `"auto"` when omitted (the S3 client requires some region value).
75
+ */
76
+ readonly region?: string;
77
+ /** The B2 application-key credentials (as S3 access/secret keys). */
78
+ readonly credentials: BackblazeB2Credentials;
79
+ /**
80
+ * Use path-style addressing (`endpoint/bucket/key`) instead of virtual-hosted
81
+ * style. Defaults to `false`; B2's S3 endpoint supports virtual-hosted style.
82
+ */
83
+ readonly forcePathStyle?: boolean;
84
+ }
85
+ /**
86
+ * Create a Backblaze B2 {@link StorageDriver} from an **injected**
87
+ * {@link S3ClientLike}. Synchronous: no SDK is resolved by this package.
88
+ */
89
+ export declare function createBackblazeB2Driver(client: S3ClientLike, options?: BackblazeB2DriverOptions): StorageDriver;
90
+ /**
91
+ * Create a Backblaze B2 {@link StorageDriver} that **builds its own** client for
92
+ * the B2 S3 endpoint. Asynchronous: the SDK is resolved through a lazy dynamic
93
+ * `import()`; a {@link StorageConfigError} is thrown when it is absent.
94
+ */
95
+ export declare function createBackblazeB2Driver(config: BackblazeB2ConnectionConfig): Promise<StorageDriver>;
96
+ /**
97
+ * A Backblaze B2 driver as a concrete class over an injected {@link S3ClientLike},
98
+ * for callers who prefer `new` construction. Equivalent to
99
+ * {@link createBackblazeB2Driver} with an injected client; the name defaults to
100
+ * `"backblaze"`.
101
+ */
102
+ export declare class BackblazeB2Driver extends S3StyleDriver {
103
+ constructor(client: S3ClientLike, options?: BackblazeB2DriverOptions);
104
+ }
105
+ //# sourceMappingURL=backblaze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backblaze.d.ts","sourceRoot":"","sources":["../../src/drivers/backblaze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAEL,aAAa,EACb,KAAK,YAAY,EAIjB,KAAK,oBAAoB,EAG1B,MAAM,cAAc,CAAC;AAEtB,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,cAAc,CAAC;AAOjD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,gFAAgF;IAChF,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,wBAAwB;IAC3E,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,wBAAwB,GACjC,aAAa,CAAC;AACjB;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,aAAa,CAAC,CAAC;AAW1B;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,wBAA6B;CAOzE"}