@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
package/dist/errors.js ADDED
@@ -0,0 +1,131 @@
1
+ /**
2
+ * @streetjs/storage — typed error hierarchy
3
+ *
4
+ * Every error thrown by the storage framework derives from {@link StorageError},
5
+ * so consumers can catch the whole family with a single `instanceof StorageError`
6
+ * check while still discriminating on concrete subclasses for specific handling.
7
+ *
8
+ * Each subclass carries descriptive, strongly typed fields appropriate to its
9
+ * purpose (the offending key, the validation message, the access context, the
10
+ * unsupported image source, etc.) and sets `this.name`. Because TypeScript emits
11
+ * to ES2022 with `Error` subclassing, we call `Object.setPrototypeOf` in every
12
+ * constructor to keep the prototype chain intact for `instanceof` under ESM/TS.
13
+ *
14
+ * _Requirements: 1.5, 5.5, 9.4, 11.3, 14.4_
15
+ */
16
+ /**
17
+ * Base class for every error raised by `@streetjs/storage`.
18
+ *
19
+ * Catch this to handle any storage failure; narrow to a subclass for specific
20
+ * cases. Carries an optional `cause` (the underlying error, when this error
21
+ * wraps another) following the standard `Error` `cause` convention.
22
+ */
23
+ export class StorageError extends Error {
24
+ /** The underlying error this error wraps, when applicable. */
25
+ cause;
26
+ constructor(message, options) {
27
+ super(message);
28
+ this.name = "StorageError";
29
+ if (options && "cause" in options) {
30
+ this.cause = options.cause;
31
+ }
32
+ Object.setPrototypeOf(this, StorageError.prototype);
33
+ }
34
+ }
35
+ /**
36
+ * Raised when `createStorage` (or another configuration step) receives an
37
+ * invalid or unusable configuration — for example an unknown provider name.
38
+ *
39
+ * Carries the optional `provider` that triggered the failure so callers can
40
+ * surface a precise, descriptive configuration error (Requirement 1.5).
41
+ */
42
+ export class StorageConfigError extends StorageError {
43
+ /** The provider name (or other config value) that was rejected, if known. */
44
+ provider;
45
+ constructor(message, options) {
46
+ super(message, options);
47
+ this.name = "StorageConfigError";
48
+ this.provider = options?.provider;
49
+ Object.setPrototypeOf(this, StorageConfigError.prototype);
50
+ }
51
+ }
52
+ /**
53
+ * Raised when an operation targets an object key that does not exist — for
54
+ * example `getStream` on a missing key (Requirement 5.5).
55
+ *
56
+ * Carries the offending `key` so callers know exactly which object was absent.
57
+ */
58
+ export class NotFoundError extends StorageError {
59
+ /** The object key that was not found. */
60
+ key;
61
+ constructor(key, message, options) {
62
+ super(message ?? `Object not found for key "${key}"`, options);
63
+ this.name = "NotFoundError";
64
+ this.key = key;
65
+ Object.setPrototypeOf(this, NotFoundError.prototype);
66
+ }
67
+ }
68
+ /**
69
+ * Raised when the validation pipeline rejects an upload before any content is
70
+ * persisted, leaving no partial object stored (Requirement 9.4).
71
+ *
72
+ * Carries the human-readable `validationError` text describing why the upload
73
+ * was rejected, plus the optional `key` the upload targeted.
74
+ */
75
+ export class ValidationError extends StorageError {
76
+ /** The descriptive text explaining why validation failed. */
77
+ validationError;
78
+ /** The object key the rejected upload targeted, when known. */
79
+ key;
80
+ constructor(validationError, options) {
81
+ super(options?.message ?? `Upload validation failed: ${validationError}`, options);
82
+ this.name = "ValidationError";
83
+ this.validationError = validationError;
84
+ this.key = options?.key;
85
+ Object.setPrototypeOf(this, ValidationError.prototype);
86
+ }
87
+ }
88
+ /**
89
+ * Raised when a caller lacks the access required by an object's access level,
90
+ * denying the operation (Requirement 11.3).
91
+ *
92
+ * Carries the access context — the `key`, the attempted `operation`, and the
93
+ * object's `accessLevel` — so the denial can be logged and explained precisely.
94
+ */
95
+ export class AuthorizationError extends StorageError {
96
+ /** The object key the denied operation targeted, when known. */
97
+ key;
98
+ /** The operation that was denied (e.g. "read", "write", "delete"). */
99
+ operation;
100
+ /** The access level that governed the denied object, when known. */
101
+ accessLevel;
102
+ constructor(message, options) {
103
+ super(message, options);
104
+ this.name = "AuthorizationError";
105
+ this.key = options?.key;
106
+ this.operation = options?.operation;
107
+ this.accessLevel = options?.accessLevel;
108
+ Object.setPrototypeOf(this, AuthorizationError.prototype);
109
+ }
110
+ }
111
+ /**
112
+ * Raised when the image processor is asked to transform a source that is not a
113
+ * supported image format; the source object is left unmodified (Requirement 14.4).
114
+ *
115
+ * Carries the offending source `format` and/or `key` so the error precisely
116
+ * identifies what could not be processed.
117
+ */
118
+ export class UnsupportedImageError extends StorageError {
119
+ /** The detected/declared source format that is not supported, when known. */
120
+ format;
121
+ /** The source object key that could not be processed, when known. */
122
+ key;
123
+ constructor(message, options) {
124
+ super(message, options);
125
+ this.name = "UnsupportedImageError";
126
+ this.format = options?.format;
127
+ this.key = options?.key;
128
+ Object.setPrototypeOf(this, UnsupportedImageError.prototype);
129
+ }
130
+ }
131
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @streetjs/storage — runnable end-to-end example (task 31.1).
3
+ *
4
+ * This is the example application required by Requirement 25. It demonstrates
5
+ * the storage framework working end to end **entirely in-process**: it uses a
6
+ * Zero_Dependency_Driver (the in-memory provider) with no external services,
7
+ * no network calls, and no real image library (Requirements 25.1, 25.2, 25.3).
8
+ *
9
+ * The demo walks through the full "avatar" lifecycle a typical application
10
+ * exercises:
11
+ *
12
+ * 1. Upload an avatar (`put`).
13
+ * 2. Download it back and confirm the bytes round-trip (`get`).
14
+ * 3. Replace the avatar with new content (`put` over the same key).
15
+ * 4. List stored objects (`list`).
16
+ * 5. Delete an object (`delete`).
17
+ * 6. Generate a signed URL (`signedUrl`, backed by `config.signingSecret`).
18
+ * 7. Show upload progress — both via a Realtime bridge that logs
19
+ * `upload.*` events and via a per-chunk progress callback feeding
20
+ * `putStream`.
21
+ * 8. Resize an image (`images.transform` with `resize`).
22
+ * 9. Generate a thumbnail (`images.transform` with `thumbnail`).
23
+ * 10. Inspect metadata (`stat`).
24
+ *
25
+ * Image work is delegated to a tiny in-process **fake** {@link ImageCodec}
26
+ * (`config.imageCodec`) so resize/thumbnail run without a real image library.
27
+ * The codec simply records the requested transform in the produced bytes; it is
28
+ * illustrative, not a real encoder.
29
+ *
30
+ * The module exports {@link runStorageDemo} so the smoke test (task 31.2) can
31
+ * import and run it, and it is directly runnable via `npm run example`
32
+ * (`node dist/examples/storage-demo.js`).
33
+ *
34
+ * _Requirements: 25.1, 25.2, 25.3_
35
+ */
36
+ /**
37
+ * Run the storage demo end to end against the zero-dependency in-memory
38
+ * provider. Accepts an optional `log` sink (defaults to `console.log`) so the
39
+ * smoke test can capture output. Returns a small summary of the demonstrated
40
+ * operations so callers can assert on the outcome (Requirement 25.3).
41
+ */
42
+ export declare function runStorageDemo(log?: (line: string) => void): Promise<{
43
+ readonly downloaded: string;
44
+ readonly replaced: string;
45
+ readonly listedKeys: readonly string[];
46
+ readonly deletedKey: string;
47
+ readonly signedUrl: string;
48
+ readonly progressUpdates: number;
49
+ readonly resizedKey: string;
50
+ readonly thumbnailKey: string;
51
+ readonly avatarSize: number;
52
+ }>;
53
+ //# sourceMappingURL=storage-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-demo.d.ts","sourceRoot":"","sources":["../../src/examples/storage-demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAoFH;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkC,GACxD,OAAO,CAAC;IACT,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC,CAgJD"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * @streetjs/storage — runnable end-to-end example (task 31.1).
3
+ *
4
+ * This is the example application required by Requirement 25. It demonstrates
5
+ * the storage framework working end to end **entirely in-process**: it uses a
6
+ * Zero_Dependency_Driver (the in-memory provider) with no external services,
7
+ * no network calls, and no real image library (Requirements 25.1, 25.2, 25.3).
8
+ *
9
+ * The demo walks through the full "avatar" lifecycle a typical application
10
+ * exercises:
11
+ *
12
+ * 1. Upload an avatar (`put`).
13
+ * 2. Download it back and confirm the bytes round-trip (`get`).
14
+ * 3. Replace the avatar with new content (`put` over the same key).
15
+ * 4. List stored objects (`list`).
16
+ * 5. Delete an object (`delete`).
17
+ * 6. Generate a signed URL (`signedUrl`, backed by `config.signingSecret`).
18
+ * 7. Show upload progress — both via a Realtime bridge that logs
19
+ * `upload.*` events and via a per-chunk progress callback feeding
20
+ * `putStream`.
21
+ * 8. Resize an image (`images.transform` with `resize`).
22
+ * 9. Generate a thumbnail (`images.transform` with `thumbnail`).
23
+ * 10. Inspect metadata (`stat`).
24
+ *
25
+ * Image work is delegated to a tiny in-process **fake** {@link ImageCodec}
26
+ * (`config.imageCodec`) so resize/thumbnail run without a real image library.
27
+ * The codec simply records the requested transform in the produced bytes; it is
28
+ * illustrative, not a real encoder.
29
+ *
30
+ * The module exports {@link runStorageDemo} so the smoke test (task 31.2) can
31
+ * import and run it, and it is directly runnable via `npm run example`
32
+ * (`node dist/examples/storage-demo.js`).
33
+ *
34
+ * _Requirements: 25.1, 25.2, 25.3_
35
+ */
36
+ import { Buffer } from "node:buffer";
37
+ import { Readable } from "node:stream";
38
+ import { pathToFileURL } from "node:url";
39
+ import { createStorage } from "../index.js";
40
+ /**
41
+ * A minimal, dependency-free fake image codec. A real deployment would supply
42
+ * a `sharp`/`jimp`-backed codec here; for the demo we only need something that
43
+ * proves the framework's resize/thumbnail/format orchestration works without a
44
+ * real image library. It returns new bytes that encode the requested operation
45
+ * so the produced variant is deterministic and distinguishable from the source.
46
+ */
47
+ const fakeImageCodec = {
48
+ transform(bytes, operation) {
49
+ const width = operation.resize?.width ?? "auto";
50
+ const height = operation.resize?.height ?? "auto";
51
+ const format = operation.format ?? "png";
52
+ const quality = operation.quality ?? "default";
53
+ // The "encoded" variant: a small header describing the transform followed by
54
+ // a length-scaled slice of the source bytes. Purely illustrative.
55
+ const header = Buffer.from(`FAKE-IMG;format=${format};w=${width};h=${height};q=${quality};src=${bytes.byteLength}\n`, "utf8");
56
+ return Buffer.concat([header, Buffer.from(bytes.slice(0, 16))]);
57
+ },
58
+ };
59
+ /**
60
+ * A tiny in-process Realtime bridge that just logs every broadcast. In a real
61
+ * app this would be the `@streetjs/realtime` server; here it demonstrates that
62
+ * upload state transitions (`upload.started` / `upload.completed` / ...) flow
63
+ * through the configured bridge with no external service.
64
+ */
65
+ function loggingRealtimeBridge(log) {
66
+ return {
67
+ broadcast(channel, event, payload) {
68
+ log(` [realtime] ${channel} → ${event} ${JSON.stringify(payload)}`);
69
+ },
70
+ };
71
+ }
72
+ /**
73
+ * Build a Node Readable stream from `data`, emitting it in fixed-size chunks and
74
+ * invoking `onProgress(bytesSoFar, total)` as each chunk is produced. This is
75
+ * how the demo surfaces byte-level upload progress via a progress callback,
76
+ * complementing the Realtime bridge's state-transition events.
77
+ */
78
+ function chunkedStream(data, chunkSize, onProgress) {
79
+ let offset = 0;
80
+ const total = data.byteLength;
81
+ return new Readable({
82
+ read() {
83
+ if (offset >= total) {
84
+ this.push(null);
85
+ return;
86
+ }
87
+ const end = Math.min(offset + chunkSize, total);
88
+ const chunk = Buffer.from(data.slice(offset, end));
89
+ offset = end;
90
+ onProgress(offset, total);
91
+ this.push(chunk);
92
+ },
93
+ });
94
+ }
95
+ /** A trivial deterministic PNG-ish payload for the demo avatar (not a real PNG). */
96
+ function makeAvatarBytes(label, size) {
97
+ const bytes = Buffer.alloc(size);
98
+ // Fake PNG signature so it reads as image-like content; content type is what
99
+ // actually drives the image processor, but this keeps the payload plausible.
100
+ Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]).copy(bytes, 0);
101
+ Buffer.from(label, "utf8").copy(bytes, 8);
102
+ return bytes;
103
+ }
104
+ /**
105
+ * Run the storage demo end to end against the zero-dependency in-memory
106
+ * provider. Accepts an optional `log` sink (defaults to `console.log`) so the
107
+ * smoke test can capture output. Returns a small summary of the demonstrated
108
+ * operations so callers can assert on the outcome (Requirement 25.3).
109
+ */
110
+ export async function runStorageDemo(log = (line) => console.log(line)) {
111
+ log("=== @streetjs/storage demo (zero-dependency, no external services) ===\n");
112
+ const realtimeLog = [];
113
+ // 1. Construct the facade against the in-memory provider. A signing secret
114
+ // enables signed URLs; the fake codec enables image processing; the
115
+ // realtime bridge surfaces upload progress — all in-process.
116
+ const storage = createStorage({
117
+ provider: "memory",
118
+ signingSecret: "demo-signing-secret-not-for-production",
119
+ imageCodec: fakeImageCodec,
120
+ bridges: {
121
+ realtime: loggingRealtimeBridge((line) => {
122
+ realtimeLog.push(line);
123
+ log(line);
124
+ }),
125
+ },
126
+ });
127
+ const avatarKey = "avatars/user-42.png";
128
+ // 2. Upload an avatar.
129
+ log("1. Uploading avatar…");
130
+ const original = makeAvatarBytes("original-avatar", 128);
131
+ const uploaded = await storage.put(avatarKey, original, {
132
+ contentType: "image/png",
133
+ owner: "user-42",
134
+ });
135
+ log(` uploaded ${uploaded.key} (${uploaded.size} bytes, etag=${uploaded.etag})\n`);
136
+ // 3. Download it back and confirm the round-trip.
137
+ log("2. Downloading avatar…");
138
+ const got = await storage.get(avatarKey);
139
+ if (!got.found || got.bytes === undefined) {
140
+ throw new Error("demo failed: uploaded avatar could not be downloaded");
141
+ }
142
+ const downloadedMatches = Buffer.from(got.bytes).equals(Buffer.from(original));
143
+ log(` downloaded ${got.bytes.byteLength} bytes, matches upload: ${downloadedMatches}\n`);
144
+ if (!downloadedMatches) {
145
+ throw new Error("demo failed: downloaded avatar bytes did not match the upload");
146
+ }
147
+ // 4. Replace the avatar with new content (same key).
148
+ log("3. Replacing avatar…");
149
+ const replacement = makeAvatarBytes("replacement-avatar", 256);
150
+ const replaced = await storage.put(avatarKey, replacement, {
151
+ contentType: "image/png",
152
+ owner: "user-42",
153
+ });
154
+ log(` replaced ${replaced.key} → now ${replaced.size} bytes (etag=${replaced.etag})\n`);
155
+ // 5. Upload a second object then list everything.
156
+ log("4. Listing objects…");
157
+ await storage.put("avatars/user-7.png", makeAvatarBytes("seven", 64), {
158
+ contentType: "image/png",
159
+ owner: "user-7",
160
+ });
161
+ const listed = await storage.list("avatars/");
162
+ for (const item of listed) {
163
+ log(` • ${item.key} (${item.size} bytes)`);
164
+ }
165
+ log("");
166
+ const listedKeys = listed.map((item) => item.key);
167
+ // 6. Delete an object.
168
+ log("5. Deleting an object…");
169
+ const deletedKey = "avatars/user-7.png";
170
+ await storage.delete(deletedKey);
171
+ const stillThere = await storage.exists(deletedKey);
172
+ log(` deleted ${deletedKey}, still exists: ${stillThere}\n`);
173
+ // 7. Generate a signed URL for the avatar.
174
+ log("6. Generating a signed URL…");
175
+ const url = await storage.signedUrl(avatarKey, "GET", { expiresInMs: 60_000 });
176
+ log(` signed URL: ${url}\n`);
177
+ // 8. Show upload progress via putStream: the Realtime bridge logs the
178
+ // started/completed transitions, and the chunked stream reports byte-level
179
+ // progress through the callback below.
180
+ log("7. Streaming upload with progress…");
181
+ let progressUpdates = 0;
182
+ const streamData = makeAvatarBytes("streamed-upload", 200);
183
+ const stream = chunkedStream(streamData, 32, (transferred, total) => {
184
+ progressUpdates += 1;
185
+ log(` [progress] ${transferred}/${total} bytes`);
186
+ });
187
+ const streamedKey = "avatars/user-42-streamed.png";
188
+ const streamed = await storage.putStream(streamedKey, stream, {
189
+ contentType: "image/png",
190
+ owner: "user-42",
191
+ });
192
+ log(` streamed ${streamed.key} (${streamed.size} bytes) in ${progressUpdates} chunks\n`);
193
+ // 9. Resize the avatar image (through the fake codec).
194
+ log("8. Resizing the avatar image…");
195
+ const resized = await storage.images.transform(avatarKey, {
196
+ resize: { width: 128, height: 128 },
197
+ format: "webp",
198
+ });
199
+ log(` resized variant: ${resized.key} (${resized.size} bytes, ${resized.contentType})\n`);
200
+ // 10. Generate a thumbnail.
201
+ log("9. Generating a thumbnail…");
202
+ const thumbnail = await storage.images.transform(avatarKey, {
203
+ thumbnail: { size: 32 },
204
+ format: "png",
205
+ });
206
+ log(` thumbnail variant: ${thumbnail.key} (${thumbnail.size} bytes, ${thumbnail.contentType})\n`);
207
+ // 11. Inspect metadata for the avatar.
208
+ log("10. Inspecting metadata…");
209
+ const metadata = await storage.stat(avatarKey);
210
+ if (metadata === null) {
211
+ throw new Error("demo failed: avatar metadata could not be inspected");
212
+ }
213
+ log(` ${metadata.key}: size=${metadata.size}, contentType=${metadata.contentType}, ` +
214
+ `owner=${metadata.owner ?? "-"}, access=${metadata.accessLevel}, ` +
215
+ `checksum=${metadata.checksum.slice(0, 12)}…`);
216
+ log(` createdAt=${metadata.createdAt}, updatedAt=${metadata.updatedAt}\n`);
217
+ // Surface the in-flight stats gathered along the way.
218
+ const stats = storage.stats();
219
+ log(`Stats: uploads=${stats.uploads}, downloads=${stats.downloads}, ` +
220
+ `bytesUploaded=${stats.bytesUploaded}, storageUsage=${stats.storageUsage}`);
221
+ await storage.close();
222
+ log("\n=== demo complete ===");
223
+ return {
224
+ downloaded: downloadedMatches ? "ok" : "mismatch",
225
+ replaced: replaced.key,
226
+ listedKeys,
227
+ deletedKey,
228
+ signedUrl: url,
229
+ progressUpdates,
230
+ resizedKey: resized.key,
231
+ thumbnailKey: thumbnail.key,
232
+ avatarSize: metadata.size,
233
+ };
234
+ }
235
+ // Make the module runnable directly: `node dist/examples/storage-demo.js`.
236
+ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
237
+ runStorageDemo().catch((error) => {
238
+ console.error("storage demo failed:", error);
239
+ process.exitCode = 1;
240
+ });
241
+ }
242
+ //# sourceMappingURL=storage-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-demo.js","sourceRoot":"","sources":["../../src/examples/storage-demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @streetjs/storage — the storage facade and configuration-driven construction.
3
+ *
4
+ * Application code talks only to the {@link Storage} facade returned by
5
+ * {@link createStorage}. The facade presents one public surface that is
6
+ * identical no matter which {@link StorageDriver} backs it, delegating the
7
+ * actual byte persistence to the driver while running (in later tasks) the
8
+ * cross-cutting layers (validation, access control, versioning, lifecycle,
9
+ * streaming/multipart/resumable sessions, signed URLs, images, directory,
10
+ * search, observability, integration bridges).
11
+ *
12
+ * This module (task 5.1) implements **construction and provider selection**:
13
+ *
14
+ * - A built-in driver registry resolves the zero-dependency providers `memory`
15
+ * ({@link MemoryStorageDriver}) and `local` ({@link LocalStorageDriver},
16
+ * which requires `config.root`).
17
+ * - Cloud providers are supplied as an already-constructed `config.driver`
18
+ * instance (imported from the relevant submodule), which takes precedence and
19
+ * works for any provider name.
20
+ * - An unknown provider name with no supplied driver yields a descriptive
21
+ * {@link StorageConfigError} and **no** {@link Storage} instance is produced
22
+ * (Requirement 1.5). Because the error is simply thrown (never caught and
23
+ * swallowed into a fabricated instance), if constructing the error object
24
+ * itself fails for some unexpected internal reason, that internal failure
25
+ * surfaces as a thrown error and, again, no instance is produced
26
+ * (Requirement 1.6).
27
+ *
28
+ * The object-operation method bodies (`put`/`get`/`exists`/`delete`/`copy`/
29
+ * `move`/`rename`/`list`/`stat`), streaming, multipart, resumable, signed URLs,
30
+ * versioning, images, directory, search, and observability are implemented in
31
+ * later tasks (5.2 onward). They are stubbed here so the file compiles, while
32
+ * the facade is structured as a class holding the resolved `driver` + `config`
33
+ * so those tasks can fill in the behavior cleanly.
34
+ *
35
+ * _Requirements: 1.1, 1.2, 1.4, 1.5, 1.6_
36
+ */
37
+ import type { NodeReadable, StoredPart } from "./driver.js";
38
+ import type { CopyResult, GetResult, LifecycleOutcome, LifecycleRule, ListOptions, MoveResult, SearchFilters, SignedOperation, SignedUrlOptions, StorageConfig, StorageListItem, StorageMetadataMap, StorageObjectMetadata, StorageStats, DriverProbe, VersionInfo, WriteMetadata } from "./types.js";
39
+ /**
40
+ * Options accepted by write operations (`put`/`putStream`/`createMultipartUpload`/
41
+ * `startUpload`). These are the write-time metadata fields carried onto the
42
+ * stored object (Requirement 4.1). Additional write-time concerns (validation
43
+ * overrides, versioning toggles) are layered on by later tasks.
44
+ */
45
+ export interface PutOptions extends WriteMetadata {
46
+ }
47
+ /**
48
+ * The output image formats the {@link ImageProcessor} can emit (Requirement
49
+ * 14.2).
50
+ */
51
+ export type ImageFormat = "webp" | "avif" | "png" | "jpeg";
52
+ /** A resize transformation: at least one of width/height (pixels). */
53
+ export interface ImageResize {
54
+ readonly width?: number;
55
+ readonly height?: number;
56
+ }
57
+ /** A crop transformation: a rectangular region (pixels) of the source. */
58
+ export interface ImageCrop {
59
+ readonly x: number;
60
+ readonly y: number;
61
+ readonly width: number;
62
+ readonly height: number;
63
+ }
64
+ /** A fit transformation: fit the image within a bounding box (pixels). */
65
+ export interface ImageFit {
66
+ readonly width: number;
67
+ readonly height: number;
68
+ /** Optional fit strategy hint for codecs that support it. */
69
+ readonly mode?: "cover" | "contain" | "fill" | "inside" | "outside";
70
+ }
71
+ /**
72
+ * The transformation / format-conversion parameters accepted by
73
+ * {@link ImageProcessor.transform}. Every field is optional so a caller
74
+ * combines only the operations they need; all supported transformations
75
+ * (resize, crop, rotate, fit, thumbnail, compress — Requirement 14.1) and the
76
+ * output `format` selection (Requirement 14.2) are expressed here.
77
+ */
78
+ export interface ImageOperations {
79
+ /** Resize to the given width/height. */
80
+ readonly resize?: ImageResize;
81
+ /** Crop to the given rectangle. */
82
+ readonly crop?: ImageCrop;
83
+ /** Rotate by the given number of degrees. */
84
+ readonly rotate?: number;
85
+ /** Fit within the given bounding box. */
86
+ readonly fit?: ImageFit;
87
+ /** Produce a square thumbnail of the given edge size (pixels). */
88
+ readonly thumbnail?: {
89
+ readonly size: number;
90
+ };
91
+ /** Compress at the given quality (0–100). */
92
+ readonly compress?: {
93
+ readonly quality: number;
94
+ };
95
+ /** Convert the output to this format (defaults to the source format). */
96
+ readonly format?: ImageFormat;
97
+ /** Output quality (0–100) applied by the codec when it supports it. */
98
+ readonly quality?: number;
99
+ }
100
+ /**
101
+ * The image processing surface exposed as `storage.images` (Requirement 14).
102
+ *
103
+ * The concrete implementation lives in `src/image.ts`
104
+ * ({@link StorageImageProcessor}); this interface is the stable public type,
105
+ * owned here so it re-exports cleanly from `index.ts`. It supports the
106
+ * resize/crop/rotate/fit/thumbnail/compress transformations and webp/avif/png/
107
+ * jpeg output formats, performed through the optional structural
108
+ * `config.imageCodec`.
109
+ */
110
+ export interface ImageProcessor {
111
+ /**
112
+ * Produce a transformed / reformatted variant of the image stored at `key`,
113
+ * returning the variant's {@link StorageObjectMetadata}. A non-image source
114
+ * yields a descriptive error without modifying the source object
115
+ * (Requirement 14.4).
116
+ */
117
+ transform(key: string, operations: ImageOperations): Promise<StorageObjectMetadata>;
118
+ }
119
+ /**
120
+ * Placeholder for the directory surface exposed as `storage.directory`.
121
+ *
122
+ * The full {@link DirectoryApi} is implemented in `src/directory.ts` (task 17),
123
+ * at which point this facade imports it from that module. It is declared here
124
+ * only so the {@link Storage} interface type-checks in the interim.
125
+ */
126
+ export interface DirectoryApi {
127
+ mkdir(path: string): Promise<void>;
128
+ listDirectory(path: string): Promise<StorageListItem[]>;
129
+ removeDirectory(path: string): Promise<{
130
+ readonly removed: boolean;
131
+ }>;
132
+ walk(path: string): Promise<string[]>;
133
+ }
134
+ /**
135
+ * The single public storage surface. Every method signature is identical across
136
+ * all providers so switching the configured driver never changes application
137
+ * code (Requirement 1.4). Backed by exactly one {@link StorageDriver}.
138
+ *
139
+ * @typeParam T - Optional per-application custom metadata map.
140
+ */
141
+ export interface Storage<T extends StorageMetadataMap = StorageMetadataMap> {
142
+ put(key: string, content: Uint8Array | string, options?: PutOptions): Promise<StorageObjectMetadata>;
143
+ get(key: string): Promise<GetResult>;
144
+ exists(key: string): Promise<boolean>;
145
+ delete(key: string): Promise<void>;
146
+ copy(source: string, destination: string): Promise<CopyResult>;
147
+ move(source: string, destination: string): Promise<MoveResult>;
148
+ rename(key: string, newKey: string): Promise<MoveResult>;
149
+ list(prefix: string, options?: ListOptions): Promise<StorageListItem[]>;
150
+ stat(key: string): Promise<StorageObjectMetadata | null>;
151
+ putStream(key: string, stream: NodeReadable, options?: PutOptions): Promise<StorageObjectMetadata>;
152
+ getStream(key: string): Promise<NodeReadable>;
153
+ createMultipartUpload(key: string, options?: PutOptions): Promise<string>;
154
+ uploadPart(uploadId: string, partNumber: number, content: Uint8Array): Promise<StoredPart>;
155
+ completeMultipartUpload(uploadId: string, parts: readonly StoredPart[]): Promise<StorageObjectMetadata>;
156
+ abortMultipartUpload(uploadId: string): Promise<void>;
157
+ startUpload(key: string, options?: PutOptions): Promise<string>;
158
+ resumeUpload(sessionId: string, stream: NodeReadable): Promise<StorageObjectMetadata>;
159
+ cancelUpload(sessionId: string): Promise<void>;
160
+ signedUrl(key: string, op: SignedOperation, options?: SignedUrlOptions): Promise<string>;
161
+ listVersions(key: string): Promise<VersionInfo[]>;
162
+ restoreVersion(key: string, versionId: string): Promise<StorageObjectMetadata>;
163
+ deleteVersion(key: string, versionId: string): Promise<void>;
164
+ applyLifecycle(rule: LifecycleRule): Promise<LifecycleOutcome[]>;
165
+ readonly images: ImageProcessor;
166
+ readonly directory: DirectoryApi;
167
+ search(filters: SearchFilters): Promise<StorageListItem[]>;
168
+ stats(): StorageStats;
169
+ probe(): Promise<DriverProbe>;
170
+ close(): Promise<void>;
171
+ }
172
+ /**
173
+ * Construct a {@link Storage} instance backed by the driver selected in `config`
174
+ * (Requirements 1.1, 1.2). The returned facade exposes an identical public
175
+ * method set for every provider (Requirement 1.4).
176
+ *
177
+ * Provider selection:
178
+ * - `config.driver`, when supplied, is used directly (cloud providers imported
179
+ * from `@streetjs/storage/*` submodules).
180
+ * - Otherwise `config.provider` selects a built-in zero-dependency driver
181
+ * (`memory` or `local`; `local` requires `config.root`).
182
+ *
183
+ * @throws StorageConfigError when the provider name is unknown and no `driver`
184
+ * is supplied — no {@link Storage} instance is produced (Requirement 1.5). If
185
+ * constructing that error object itself fails unexpectedly, the internal
186
+ * failure surfaces as a thrown error and, likewise, no instance is produced
187
+ * (Requirement 1.6).
188
+ *
189
+ * @typeParam T - Optional per-application custom metadata map.
190
+ */
191
+ export declare function createStorage<T extends StorageMetadataMap = StorageMetadataMap>(config: StorageConfig): Storage<T>;
192
+ //# sourceMappingURL=facade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../src/facade.ts"],"names":[],"mappings":"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"}