@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,219 @@
1
+ /**
2
+ * @streetjs/storage/testing — in-process test doubles (task 25.1).
3
+ *
4
+ * This submodule provides zero-network, in-process test doubles that let
5
+ * application code exercise the storage surface without any external service:
6
+ *
7
+ * - {@link MemoryStorage} — a convenience factory that returns a real
8
+ * {@link Storage} facade backed by the zero-dependency in-memory driver (via
9
+ * `createStorage({ provider: "memory", ... })`). Because it is a genuine
10
+ * facade over {@link MemoryStorageDriver}, it exercises the exact same code
11
+ * paths as production and is fully substitutable for a production facade
12
+ * (Requirements 22.2, 22.3).
13
+ * - {@link FakeStorage} — an in-process {@link Storage} double wrapping the
14
+ * memory-backed facade and adding an advanceable {@link AdvanceableClock} so
15
+ * tests can deterministically control time-sensitive behavior (signed-URL
16
+ * expiry, lifecycle age) while remaining drop-in substitutable for the facade
17
+ * (Requirement 22.3).
18
+ * - {@link StorageHarness} — bundles an advanceable clock, a {@link Storage}
19
+ * built on that clock, and a set of async assertion helpers for concise
20
+ * storage tests.
21
+ * - {@link FakeUpload} / {@link FakeDownload} — simple in-process upload and
22
+ * download doubles for chunked/progress-style flows, backed by any
23
+ * {@link Storage}.
24
+ * - {@link MemoryStorageDriver} is re-exported so tests that need to substitute
25
+ * at the {@link StorageDriver} level (rather than the facade level) can do so.
26
+ *
27
+ * None of these require network or external services (Requirement 22.2) and all
28
+ * sit on the same {@link StorageDriver}/{@link Storage} contract as production
29
+ * code (Requirements 22.1, 22.3).
30
+ *
31
+ * The package's `./testing` subpath export maps to this module's built output
32
+ * (`dist/testing/index.js`).
33
+ *
34
+ * _Requirements: 22.1, 22.2, 22.3_
35
+ */
36
+ import type { Clock } from "streetjs";
37
+ import type { PutOptions, Storage } from "../facade.js";
38
+ import type { StorageConfig, StorageMetadataMap, StorageObjectMetadata } from "../types.js";
39
+ export { MemoryStorageDriver } from "../drivers/memory.js";
40
+ /** Config accepted by the in-process doubles: everything except the fixed provider. */
41
+ export type TestingStorageConfig = Omit<StorageConfig, "provider" | "driver">;
42
+ /**
43
+ * A {@link Clock} (`() => number`) whose value tests can advance or set
44
+ * explicitly. Passed as `config.clock` so every timestamp the storage layer
45
+ * derives (object `createdAt`/`updatedAt`, signed-URL expiry, lifecycle age) is
46
+ * deterministic and controllable from a test.
47
+ */
48
+ export interface AdvanceableClock extends Clock {
49
+ /** Return the current epoch-ms reading (same as calling the clock). */
50
+ now(): number;
51
+ /** Set the clock to an absolute epoch-ms value. */
52
+ set(epochMs: number): void;
53
+ /** Advance the clock forward by `deltaMs` milliseconds. */
54
+ advance(deltaMs: number): void;
55
+ }
56
+ /**
57
+ * Create an {@link AdvanceableClock} starting at `start` (defaults to a fixed,
58
+ * deterministic epoch so tests are reproducible unless they opt into wall
59
+ * time).
60
+ */
61
+ export declare function createAdvanceableClock(start?: number): AdvanceableClock;
62
+ /**
63
+ * Convenience factory returning a real {@link Storage} facade backed by the
64
+ * zero-dependency {@link MemoryStorageDriver} (via `createStorage`). This is the
65
+ * simplest substitute for a production facade in tests: it needs no network and
66
+ * runs entirely in-process (Requirements 22.2, 22.3).
67
+ *
68
+ * A default `signingSecret` is supplied when none is given so signed-URL helpers
69
+ * work out of the box; any provided config field overrides the defaults.
70
+ */
71
+ export declare function MemoryStorage<T extends StorageMetadataMap = StorageMetadataMap>(config?: TestingStorageConfig): Storage<T>;
72
+ /**
73
+ * An in-process {@link Storage} double that wraps a memory-backed facade and
74
+ * exposes an advanceable {@link AdvanceableClock}. It implements the full
75
+ * {@link Storage} contract by delegating to the wrapped facade, so it is a
76
+ * drop-in substitute for a production facade (Requirement 22.3) while giving
77
+ * tests deterministic control over time.
78
+ *
79
+ * @typeParam T - Optional per-application custom metadata map.
80
+ */
81
+ export declare class FakeStorage<T extends StorageMetadataMap = StorageMetadataMap> implements Storage<T> {
82
+ /** The advanceable clock backing every timestamp/expiry the double derives. */
83
+ readonly clock: AdvanceableClock;
84
+ /** The wrapped, memory-backed facade every method delegates to. */
85
+ private readonly inner;
86
+ constructor(config?: TestingStorageConfig);
87
+ put(key: string, content: Uint8Array | string, options?: PutOptions): Promise<StorageObjectMetadata>;
88
+ get(key: string): ReturnType<Storage<T>["get"]>;
89
+ exists(key: string): Promise<boolean>;
90
+ delete(key: string): Promise<void>;
91
+ copy(source: string, destination: string): ReturnType<Storage<T>["copy"]>;
92
+ move(source: string, destination: string): ReturnType<Storage<T>["move"]>;
93
+ rename(key: string, newKey: string): ReturnType<Storage<T>["rename"]>;
94
+ list(prefix: string, options?: Parameters<Storage<T>["list"]>[1]): ReturnType<Storage<T>["list"]>;
95
+ stat(key: string): Promise<StorageObjectMetadata | null>;
96
+ putStream(key: string, stream: Parameters<Storage<T>["putStream"]>[1], options?: PutOptions): Promise<StorageObjectMetadata>;
97
+ getStream(key: string): ReturnType<Storage<T>["getStream"]>;
98
+ createMultipartUpload(key: string, options?: PutOptions): Promise<string>;
99
+ uploadPart(uploadId: string, partNumber: number, content: Uint8Array): ReturnType<Storage<T>["uploadPart"]>;
100
+ completeMultipartUpload(uploadId: string, parts: Parameters<Storage<T>["completeMultipartUpload"]>[1]): Promise<StorageObjectMetadata>;
101
+ abortMultipartUpload(uploadId: string): Promise<void>;
102
+ startUpload(key: string, options?: PutOptions): Promise<string>;
103
+ resumeUpload(sessionId: string, stream: Parameters<Storage<T>["resumeUpload"]>[1]): Promise<StorageObjectMetadata>;
104
+ cancelUpload(sessionId: string): Promise<void>;
105
+ signedUrl(key: string, op: Parameters<Storage<T>["signedUrl"]>[1], options?: Parameters<Storage<T>["signedUrl"]>[2]): Promise<string>;
106
+ listVersions(key: string): ReturnType<Storage<T>["listVersions"]>;
107
+ restoreVersion(key: string, versionId: string): Promise<StorageObjectMetadata>;
108
+ deleteVersion(key: string, versionId: string): Promise<void>;
109
+ applyLifecycle(rule: Parameters<Storage<T>["applyLifecycle"]>[0]): ReturnType<Storage<T>["applyLifecycle"]>;
110
+ get images(): Storage<T>["images"];
111
+ get directory(): Storage<T>["directory"];
112
+ search(filters: Parameters<Storage<T>["search"]>[0]): ReturnType<Storage<T>["search"]>;
113
+ stats(): ReturnType<Storage<T>["stats"]>;
114
+ probe(): ReturnType<Storage<T>["probe"]>;
115
+ close(): Promise<void>;
116
+ /** Advance the double's clock forward by `deltaMs` milliseconds. */
117
+ advanceTime(deltaMs: number): void;
118
+ /** Set the double's clock to an absolute epoch-ms value. */
119
+ setTime(epochMs: number): void;
120
+ }
121
+ /**
122
+ * A test harness bundling an advanceable {@link AdvanceableClock}, a
123
+ * {@link Storage} built on that clock, and a set of async assertion helpers for
124
+ * concise, readable storage tests. Everything runs in-process with no network
125
+ * (Requirement 22.2).
126
+ *
127
+ * @typeParam T - Optional per-application custom metadata map.
128
+ */
129
+ export declare class StorageHarness<T extends StorageMetadataMap = StorageMetadataMap> {
130
+ /** The advanceable clock the harness's storage derives all timestamps from. */
131
+ readonly clock: AdvanceableClock;
132
+ /** The memory-backed {@link Storage} under test, wired to {@link clock}. */
133
+ readonly storage: Storage<T>;
134
+ constructor(config?: TestingStorageConfig);
135
+ /** Advance the harness clock forward by `deltaMs` milliseconds. */
136
+ advance(deltaMs: number): void;
137
+ /** Set the harness clock to an absolute epoch-ms value. */
138
+ setTime(epochMs: number): void;
139
+ /** Assert an object exists at `key`. */
140
+ assertExists(key: string): Promise<void>;
141
+ /** Assert no object exists at `key`. */
142
+ assertMissing(key: string): Promise<void>;
143
+ /**
144
+ * Assert the object at `key` holds exactly `expected` bytes (a string is
145
+ * compared as its UTF-8 encoding).
146
+ */
147
+ assertContent(key: string, expected: Uint8Array | string): Promise<void>;
148
+ /** Assert the stored object at `key` reports exactly `size` bytes. */
149
+ assertSize(key: string, size: number): Promise<void>;
150
+ /** Assert the set of keys under `prefix` equals `expected` (order-insensitive). */
151
+ assertKeys(prefix: string, expected: readonly string[]): Promise<void>;
152
+ /** Release any resources held by the harness's storage. */
153
+ close(): Promise<void>;
154
+ }
155
+ /**
156
+ * A simple in-process upload double for chunked / progress-style flows. Bytes
157
+ * written via {@link FakeUpload.write} are buffered in memory; {@link
158
+ * FakeUpload.complete} persists the assembled bytes to the backing
159
+ * {@link Storage} and returns the resulting metadata. Requires no network
160
+ * (Requirement 22.2).
161
+ */
162
+ export declare class FakeUpload {
163
+ private readonly storage;
164
+ /** The destination key the completed upload is written to. */
165
+ readonly key: string;
166
+ private readonly options?;
167
+ private readonly chunks;
168
+ private completed;
169
+ private aborted;
170
+ constructor(storage: Storage,
171
+ /** The destination key the completed upload is written to. */
172
+ key: string, options?: PutOptions | undefined);
173
+ /** Total number of bytes buffered so far. */
174
+ get bytesWritten(): number;
175
+ /** Whether {@link complete} has already run. */
176
+ get isCompleted(): boolean;
177
+ /** Whether the upload was aborted. */
178
+ get isAborted(): boolean;
179
+ /**
180
+ * Buffer another chunk of upload content. A `string` chunk is encoded as
181
+ * UTF-8. Throws if the upload has already completed or been aborted.
182
+ */
183
+ write(chunk: Uint8Array | string): void;
184
+ /**
185
+ * Persist all buffered chunks to the backing storage under {@link key} and
186
+ * return the stored object's metadata. Throws if already completed or aborted.
187
+ */
188
+ complete(): Promise<StorageObjectMetadata>;
189
+ /** Discard buffered content; nothing is persisted. */
190
+ abort(): void;
191
+ }
192
+ /**
193
+ * A simple in-process download double. Reads the object at `key` from the
194
+ * backing {@link Storage} and exposes its content as bytes, text, or an async
195
+ * chunk iterator. Requires no network (Requirement 22.2).
196
+ */
197
+ export declare class FakeDownload {
198
+ private readonly storage;
199
+ /** The source key this download reads from. */
200
+ readonly key: string;
201
+ constructor(storage: Storage,
202
+ /** The source key this download reads from. */
203
+ key: string);
204
+ /** Whether an object currently exists at {@link key}. */
205
+ found(): Promise<boolean>;
206
+ /**
207
+ * Read and return the full object bytes. Throws {@link NotFoundError} when no
208
+ * object exists at {@link key}.
209
+ */
210
+ bytes(): Promise<Uint8Array>;
211
+ /** Read the full object content decoded as a UTF-8 string. */
212
+ text(): Promise<string>;
213
+ /**
214
+ * Yield the object content in fixed-size chunks of at most `chunkSize` bytes,
215
+ * simulating a streamed download. Throws {@link NotFoundError} when absent.
216
+ */
217
+ chunks(chunkSize?: number): AsyncGenerator<Uint8Array>;
218
+ }
219
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,393 @@
1
+ /**
2
+ * @streetjs/storage/testing — in-process test doubles (task 25.1).
3
+ *
4
+ * This submodule provides zero-network, in-process test doubles that let
5
+ * application code exercise the storage surface without any external service:
6
+ *
7
+ * - {@link MemoryStorage} — a convenience factory that returns a real
8
+ * {@link Storage} facade backed by the zero-dependency in-memory driver (via
9
+ * `createStorage({ provider: "memory", ... })`). Because it is a genuine
10
+ * facade over {@link MemoryStorageDriver}, it exercises the exact same code
11
+ * paths as production and is fully substitutable for a production facade
12
+ * (Requirements 22.2, 22.3).
13
+ * - {@link FakeStorage} — an in-process {@link Storage} double wrapping the
14
+ * memory-backed facade and adding an advanceable {@link AdvanceableClock} so
15
+ * tests can deterministically control time-sensitive behavior (signed-URL
16
+ * expiry, lifecycle age) while remaining drop-in substitutable for the facade
17
+ * (Requirement 22.3).
18
+ * - {@link StorageHarness} — bundles an advanceable clock, a {@link Storage}
19
+ * built on that clock, and a set of async assertion helpers for concise
20
+ * storage tests.
21
+ * - {@link FakeUpload} / {@link FakeDownload} — simple in-process upload and
22
+ * download doubles for chunked/progress-style flows, backed by any
23
+ * {@link Storage}.
24
+ * - {@link MemoryStorageDriver} is re-exported so tests that need to substitute
25
+ * at the {@link StorageDriver} level (rather than the facade level) can do so.
26
+ *
27
+ * None of these require network or external services (Requirement 22.2) and all
28
+ * sit on the same {@link StorageDriver}/{@link Storage} contract as production
29
+ * code (Requirements 22.1, 22.3).
30
+ *
31
+ * The package's `./testing` subpath export maps to this module's built output
32
+ * (`dist/testing/index.js`).
33
+ *
34
+ * _Requirements: 22.1, 22.2, 22.3_
35
+ */
36
+ import assert from "node:assert/strict";
37
+ import { Buffer } from "node:buffer";
38
+ import { createStorage } from "../facade.js";
39
+ import { NotFoundError } from "../errors.js";
40
+ // Re-export the zero-dependency driver so tests can substitute at the driver
41
+ // level (Requirement 22.3) in addition to the facade-level doubles below.
42
+ export { MemoryStorageDriver } from "../drivers/memory.js";
43
+ /** Default signing secret so {@link FakeStorage}/{@link StorageHarness} can mint signed URLs out of the box. */
44
+ const DEFAULT_SIGNING_SECRET = "streetjs-storage-testing-secret";
45
+ /**
46
+ * Create an {@link AdvanceableClock} starting at `start` (defaults to a fixed,
47
+ * deterministic epoch so tests are reproducible unless they opt into wall
48
+ * time).
49
+ */
50
+ export function createAdvanceableClock(start = 1_700_000_000_000) {
51
+ let current = start;
52
+ const clock = (() => current);
53
+ clock.now = () => current;
54
+ clock.set = (epochMs) => {
55
+ current = epochMs;
56
+ };
57
+ clock.advance = (deltaMs) => {
58
+ current += deltaMs;
59
+ };
60
+ return clock;
61
+ }
62
+ // ── MemoryStorage ──────────────────────────────────────────────────────────
63
+ /**
64
+ * Convenience factory returning a real {@link Storage} facade backed by the
65
+ * zero-dependency {@link MemoryStorageDriver} (via `createStorage`). This is the
66
+ * simplest substitute for a production facade in tests: it needs no network and
67
+ * runs entirely in-process (Requirements 22.2, 22.3).
68
+ *
69
+ * A default `signingSecret` is supplied when none is given so signed-URL helpers
70
+ * work out of the box; any provided config field overrides the defaults.
71
+ */
72
+ export function MemoryStorage(config = {}) {
73
+ return createStorage({
74
+ signingSecret: DEFAULT_SIGNING_SECRET,
75
+ ...config,
76
+ provider: "memory",
77
+ });
78
+ }
79
+ // ── FakeStorage ──────────────────────────────────────────────────────────────
80
+ /**
81
+ * An in-process {@link Storage} double that wraps a memory-backed facade and
82
+ * exposes an advanceable {@link AdvanceableClock}. It implements the full
83
+ * {@link Storage} contract by delegating to the wrapped facade, so it is a
84
+ * drop-in substitute for a production facade (Requirement 22.3) while giving
85
+ * tests deterministic control over time.
86
+ *
87
+ * @typeParam T - Optional per-application custom metadata map.
88
+ */
89
+ export class FakeStorage {
90
+ /** The advanceable clock backing every timestamp/expiry the double derives. */
91
+ clock;
92
+ /** The wrapped, memory-backed facade every method delegates to. */
93
+ inner;
94
+ constructor(config = {}) {
95
+ this.clock = createAdvanceableClock();
96
+ this.inner = createStorage({
97
+ signingSecret: DEFAULT_SIGNING_SECRET,
98
+ ...config,
99
+ clock: this.clock,
100
+ provider: "memory",
101
+ });
102
+ }
103
+ // ── Object operations ──────────────────────────────────────────────────────
104
+ put(key, content, options) {
105
+ return this.inner.put(key, content, options);
106
+ }
107
+ get(key) {
108
+ return this.inner.get(key);
109
+ }
110
+ exists(key) {
111
+ return this.inner.exists(key);
112
+ }
113
+ delete(key) {
114
+ return this.inner.delete(key);
115
+ }
116
+ copy(source, destination) {
117
+ return this.inner.copy(source, destination);
118
+ }
119
+ move(source, destination) {
120
+ return this.inner.move(source, destination);
121
+ }
122
+ rename(key, newKey) {
123
+ return this.inner.rename(key, newKey);
124
+ }
125
+ list(prefix, options) {
126
+ return this.inner.list(prefix, options);
127
+ }
128
+ stat(key) {
129
+ return this.inner.stat(key);
130
+ }
131
+ // ── Streaming ────────────────────────────────────────────────────────────────
132
+ putStream(key, stream, options) {
133
+ return this.inner.putStream(key, stream, options);
134
+ }
135
+ getStream(key) {
136
+ return this.inner.getStream(key);
137
+ }
138
+ // ── Multipart ────────────────────────────────────────────────────────────────
139
+ createMultipartUpload(key, options) {
140
+ return this.inner.createMultipartUpload(key, options);
141
+ }
142
+ uploadPart(uploadId, partNumber, content) {
143
+ return this.inner.uploadPart(uploadId, partNumber, content);
144
+ }
145
+ completeMultipartUpload(uploadId, parts) {
146
+ return this.inner.completeMultipartUpload(uploadId, parts);
147
+ }
148
+ abortMultipartUpload(uploadId) {
149
+ return this.inner.abortMultipartUpload(uploadId);
150
+ }
151
+ // ── Resumable ────────────────────────────────────────────────────────────────
152
+ startUpload(key, options) {
153
+ return this.inner.startUpload(key, options);
154
+ }
155
+ resumeUpload(sessionId, stream) {
156
+ return this.inner.resumeUpload(sessionId, stream);
157
+ }
158
+ cancelUpload(sessionId) {
159
+ return this.inner.cancelUpload(sessionId);
160
+ }
161
+ // ── Signed URLs ──────────────────────────────────────────────────────────────
162
+ signedUrl(key, op, options) {
163
+ return this.inner.signedUrl(key, op, options);
164
+ }
165
+ // ── Versioning ───────────────────────────────────────────────────────────────
166
+ listVersions(key) {
167
+ return this.inner.listVersions(key);
168
+ }
169
+ restoreVersion(key, versionId) {
170
+ return this.inner.restoreVersion(key, versionId);
171
+ }
172
+ deleteVersion(key, versionId) {
173
+ return this.inner.deleteVersion(key, versionId);
174
+ }
175
+ // ── Lifecycle ────────────────────────────────────────────────────────────────
176
+ applyLifecycle(rule) {
177
+ return this.inner.applyLifecycle(rule);
178
+ }
179
+ // ── Image processing ─────────────────────────────────────────────────────────
180
+ get images() {
181
+ return this.inner.images;
182
+ }
183
+ // ── Directory API ────────────────────────────────────────────────────────────
184
+ get directory() {
185
+ return this.inner.directory;
186
+ }
187
+ // ── Search ───────────────────────────────────────────────────────────────────
188
+ search(filters) {
189
+ return this.inner.search(filters);
190
+ }
191
+ // ── Observability ────────────────────────────────────────────────────────────
192
+ stats() {
193
+ return this.inner.stats();
194
+ }
195
+ probe() {
196
+ return this.inner.probe();
197
+ }
198
+ close() {
199
+ return this.inner.close();
200
+ }
201
+ // ── Time control convenience ─────────────────────────────────────────────────
202
+ /** Advance the double's clock forward by `deltaMs` milliseconds. */
203
+ advanceTime(deltaMs) {
204
+ this.clock.advance(deltaMs);
205
+ }
206
+ /** Set the double's clock to an absolute epoch-ms value. */
207
+ setTime(epochMs) {
208
+ this.clock.set(epochMs);
209
+ }
210
+ }
211
+ // ── StorageHarness ─────────────────────────────────────────────────────────
212
+ /**
213
+ * A test harness bundling an advanceable {@link AdvanceableClock}, a
214
+ * {@link Storage} built on that clock, and a set of async assertion helpers for
215
+ * concise, readable storage tests. Everything runs in-process with no network
216
+ * (Requirement 22.2).
217
+ *
218
+ * @typeParam T - Optional per-application custom metadata map.
219
+ */
220
+ export class StorageHarness {
221
+ /** The advanceable clock the harness's storage derives all timestamps from. */
222
+ clock;
223
+ /** The memory-backed {@link Storage} under test, wired to {@link clock}. */
224
+ storage;
225
+ constructor(config = {}) {
226
+ this.clock = createAdvanceableClock();
227
+ this.storage = createStorage({
228
+ signingSecret: DEFAULT_SIGNING_SECRET,
229
+ ...config,
230
+ clock: this.clock,
231
+ provider: "memory",
232
+ });
233
+ }
234
+ /** Advance the harness clock forward by `deltaMs` milliseconds. */
235
+ advance(deltaMs) {
236
+ this.clock.advance(deltaMs);
237
+ }
238
+ /** Set the harness clock to an absolute epoch-ms value. */
239
+ setTime(epochMs) {
240
+ this.clock.set(epochMs);
241
+ }
242
+ /** Assert an object exists at `key`. */
243
+ async assertExists(key) {
244
+ assert.equal(await this.storage.exists(key), true, `expected object to exist at "${key}"`);
245
+ }
246
+ /** Assert no object exists at `key`. */
247
+ async assertMissing(key) {
248
+ assert.equal(await this.storage.exists(key), false, `expected no object at "${key}"`);
249
+ }
250
+ /**
251
+ * Assert the object at `key` holds exactly `expected` bytes (a string is
252
+ * compared as its UTF-8 encoding).
253
+ */
254
+ async assertContent(key, expected) {
255
+ const result = await this.storage.get(key);
256
+ assert.equal(result.found, true, `expected object to exist at "${key}"`);
257
+ const expectedBytes = typeof expected === "string" ? new TextEncoder().encode(expected) : expected;
258
+ assert.deepEqual(Buffer.from(result.bytes ?? new Uint8Array()), Buffer.from(expectedBytes), `content mismatch at "${key}"`);
259
+ }
260
+ /** Assert the stored object at `key` reports exactly `size` bytes. */
261
+ async assertSize(key, size) {
262
+ const metadata = await this.storage.stat(key);
263
+ assert.notEqual(metadata, null, `expected object to exist at "${key}"`);
264
+ assert.equal(metadata?.size, size, `size mismatch at "${key}"`);
265
+ }
266
+ /** Assert the set of keys under `prefix` equals `expected` (order-insensitive). */
267
+ async assertKeys(prefix, expected) {
268
+ const items = await this.storage.list(prefix);
269
+ const actual = items.map((item) => item.key).sort();
270
+ assert.deepEqual(actual, [...expected].sort(), `key set mismatch under "${prefix}"`);
271
+ }
272
+ /** Release any resources held by the harness's storage. */
273
+ async close() {
274
+ await this.storage.close();
275
+ }
276
+ }
277
+ // ── FakeUpload ─────────────────────────────────────────────────────────────
278
+ /**
279
+ * A simple in-process upload double for chunked / progress-style flows. Bytes
280
+ * written via {@link FakeUpload.write} are buffered in memory; {@link
281
+ * FakeUpload.complete} persists the assembled bytes to the backing
282
+ * {@link Storage} and returns the resulting metadata. Requires no network
283
+ * (Requirement 22.2).
284
+ */
285
+ export class FakeUpload {
286
+ storage;
287
+ key;
288
+ options;
289
+ chunks = [];
290
+ completed = false;
291
+ aborted = false;
292
+ constructor(storage,
293
+ /** The destination key the completed upload is written to. */
294
+ key, options) {
295
+ this.storage = storage;
296
+ this.key = key;
297
+ this.options = options;
298
+ }
299
+ /** Total number of bytes buffered so far. */
300
+ get bytesWritten() {
301
+ return this.chunks.reduce((total, chunk) => total + chunk.byteLength, 0);
302
+ }
303
+ /** Whether {@link complete} has already run. */
304
+ get isCompleted() {
305
+ return this.completed;
306
+ }
307
+ /** Whether the upload was aborted. */
308
+ get isAborted() {
309
+ return this.aborted;
310
+ }
311
+ /**
312
+ * Buffer another chunk of upload content. A `string` chunk is encoded as
313
+ * UTF-8. Throws if the upload has already completed or been aborted.
314
+ */
315
+ write(chunk) {
316
+ if (this.completed) {
317
+ throw new Error("FakeUpload: cannot write after complete()");
318
+ }
319
+ if (this.aborted) {
320
+ throw new Error("FakeUpload: cannot write after abort()");
321
+ }
322
+ this.chunks.push(typeof chunk === "string" ? Buffer.from(chunk, "utf8") : Buffer.from(chunk));
323
+ }
324
+ /**
325
+ * Persist all buffered chunks to the backing storage under {@link key} and
326
+ * return the stored object's metadata. Throws if already completed or aborted.
327
+ */
328
+ async complete() {
329
+ if (this.completed) {
330
+ throw new Error("FakeUpload: already completed");
331
+ }
332
+ if (this.aborted) {
333
+ throw new Error("FakeUpload: cannot complete an aborted upload");
334
+ }
335
+ this.completed = true;
336
+ const bytes = new Uint8Array(Buffer.concat(this.chunks));
337
+ return this.storage.put(this.key, bytes, this.options);
338
+ }
339
+ /** Discard buffered content; nothing is persisted. */
340
+ abort() {
341
+ this.aborted = true;
342
+ this.chunks.length = 0;
343
+ }
344
+ }
345
+ // ── FakeDownload ───────────────────────────────────────────────────────────
346
+ /**
347
+ * A simple in-process download double. Reads the object at `key` from the
348
+ * backing {@link Storage} and exposes its content as bytes, text, or an async
349
+ * chunk iterator. Requires no network (Requirement 22.2).
350
+ */
351
+ export class FakeDownload {
352
+ storage;
353
+ key;
354
+ constructor(storage,
355
+ /** The source key this download reads from. */
356
+ key) {
357
+ this.storage = storage;
358
+ this.key = key;
359
+ }
360
+ /** Whether an object currently exists at {@link key}. */
361
+ found() {
362
+ return this.storage.exists(this.key);
363
+ }
364
+ /**
365
+ * Read and return the full object bytes. Throws {@link NotFoundError} when no
366
+ * object exists at {@link key}.
367
+ */
368
+ async bytes() {
369
+ const result = await this.storage.get(this.key);
370
+ if (!result.found || result.bytes === undefined) {
371
+ throw new NotFoundError(this.key);
372
+ }
373
+ return result.bytes;
374
+ }
375
+ /** Read the full object content decoded as a UTF-8 string. */
376
+ async text() {
377
+ return Buffer.from(await this.bytes()).toString("utf8");
378
+ }
379
+ /**
380
+ * Yield the object content in fixed-size chunks of at most `chunkSize` bytes,
381
+ * simulating a streamed download. Throws {@link NotFoundError} when absent.
382
+ */
383
+ async *chunks(chunkSize = 64 * 1024) {
384
+ if (chunkSize <= 0) {
385
+ throw new Error("FakeDownload: chunkSize must be a positive integer");
386
+ }
387
+ const bytes = await this.bytes();
388
+ for (let offset = 0; offset < bytes.byteLength; offset += chunkSize) {
389
+ yield bytes.subarray(offset, Math.min(offset + chunkSize, bytes.byteLength));
390
+ }
391
+ }
392
+ }
393
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=access.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.test.d.ts","sourceRoot":"","sources":["../../src/tests/access.test.ts"],"names":[],"mappings":""}