@effect-kit/storage 0.0.0-stage → 0.1.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 (615) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +204 -0
  3. package/README.md +369 -2
  4. package/dist/_virtual/_rolldown/runtime.js +17 -0
  5. package/dist/azure/account-admin.d.ts +116 -0
  6. package/dist/azure/account-admin.js +90 -0
  7. package/dist/azure/account-admin.js.map +1 -0
  8. package/dist/azure/admin.d.ts +68 -0
  9. package/dist/azure/admin.js +85 -0
  10. package/dist/azure/admin.js.map +1 -0
  11. package/dist/azure/archive.d.ts +95 -0
  12. package/dist/azure/archive.js +52 -0
  13. package/dist/azure/archive.js.map +1 -0
  14. package/dist/azure/events.d.ts +40 -0
  15. package/dist/azure/events.js +62 -0
  16. package/dist/azure/events.js.map +1 -0
  17. package/dist/azure/governance.d.ts +139 -0
  18. package/dist/azure/governance.js +59 -0
  19. package/dist/azure/governance.js.map +1 -0
  20. package/dist/azure/identity.d.ts +4 -0
  21. package/dist/azure/identity.js +8 -0
  22. package/dist/azure/identity.js.map +1 -0
  23. package/dist/azure/lifecycle.d.ts +21 -0
  24. package/dist/azure/lifecycle.js +193 -0
  25. package/dist/azure/lifecycle.js.map +1 -0
  26. package/dist/azure/signing.d.ts +17 -0
  27. package/dist/azure/signing.js +71 -0
  28. package/dist/azure/signing.js.map +1 -0
  29. package/dist/azure/uploads.d.ts +11 -0
  30. package/dist/azure/uploads.js +83 -0
  31. package/dist/azure/uploads.js.map +1 -0
  32. package/dist/azure.d.ts +427 -0
  33. package/dist/azure.js +77 -0
  34. package/dist/azure.js.map +1 -0
  35. package/dist/b2/admin.d.ts +149 -0
  36. package/dist/b2/admin.js +157 -0
  37. package/dist/b2/admin.js.map +1 -0
  38. package/dist/b2.d.ts +15 -0
  39. package/dist/b2.js +15 -0
  40. package/dist/b2.js.map +1 -0
  41. package/dist/browser.d.ts +7 -0
  42. package/dist/browser.js +11 -0
  43. package/dist/browser.js.map +1 -0
  44. package/dist/bun.d.ts +14 -0
  45. package/dist/bun.js +17 -0
  46. package/dist/bun.js.map +1 -0
  47. package/dist/cache.d.ts +18 -0
  48. package/dist/cache.js +116 -0
  49. package/dist/cache.js.map +1 -0
  50. package/dist/client/atoms/controller.d.ts +10 -0
  51. package/dist/client/atoms/controller.js +267 -0
  52. package/dist/client/atoms/controller.js.map +1 -0
  53. package/dist/client/atoms/state.d.ts +17 -0
  54. package/dist/client/atoms/state.js +11 -0
  55. package/dist/client/atoms/state.js.map +1 -0
  56. package/dist/client/atoms.d.ts +59 -0
  57. package/dist/client/atoms.js +39 -0
  58. package/dist/client/atoms.js.map +1 -0
  59. package/dist/client/fingerprint.js +28 -0
  60. package/dist/client/fingerprint.js.map +1 -0
  61. package/dist/client/store.d.ts +31 -0
  62. package/dist/client/store.js +56 -0
  63. package/dist/client/store.js.map +1 -0
  64. package/dist/client/transport.d.ts +11 -0
  65. package/dist/client/transport.js +78 -0
  66. package/dist/client/transport.js.map +1 -0
  67. package/dist/client.d.ts +259 -0
  68. package/dist/client.js +350 -0
  69. package/dist/client.js.map +1 -0
  70. package/dist/composition/layer.js +22 -0
  71. package/dist/composition/layer.js.map +1 -0
  72. package/dist/composition/representation/staging.js +46 -0
  73. package/dist/composition/representation/staging.js.map +1 -0
  74. package/dist/composition/representation/storage.js +188 -0
  75. package/dist/composition/representation/storage.js.map +1 -0
  76. package/dist/composition.d.ts +20 -0
  77. package/dist/composition.js +124 -0
  78. package/dist/composition.js.map +1 -0
  79. package/dist/compression.d.ts +16 -0
  80. package/dist/compression.js +38 -0
  81. package/dist/compression.js.map +1 -0
  82. package/dist/content.d.ts +590 -0
  83. package/dist/content.js +168 -0
  84. package/dist/content.js.map +1 -0
  85. package/dist/core/capabilities.d.ts +53 -0
  86. package/dist/core/capabilities.js +9 -0
  87. package/dist/core/capabilities.js.map +1 -0
  88. package/dist/core/contracts/multipart.d.ts +56 -0
  89. package/dist/core/contracts/resumable.d.ts +70 -0
  90. package/dist/core/errors.d.ts +55 -0
  91. package/dist/core/errors.js +55 -0
  92. package/dist/core/errors.js.map +1 -0
  93. package/dist/core/object.d.ts +97 -0
  94. package/dist/core/object.js +55 -0
  95. package/dist/core/object.js.map +1 -0
  96. package/dist/core/ranges.d.ts +17 -0
  97. package/dist/core/ranges.js +27 -0
  98. package/dist/core/ranges.js.map +1 -0
  99. package/dist/core/requests.d.ts +185 -0
  100. package/dist/core/requests.js +42 -0
  101. package/dist/core/requests.js.map +1 -0
  102. package/dist/core/storage.d.ts +249 -0
  103. package/dist/core/storage.js +173 -0
  104. package/dist/core/storage.js.map +1 -0
  105. package/dist/deno.d.ts +14 -0
  106. package/dist/deno.js +17 -0
  107. package/dist/deno.js.map +1 -0
  108. package/dist/encryption/age.d.ts +14 -0
  109. package/dist/encryption/age.js +46 -0
  110. package/dist/encryption/age.js.map +1 -0
  111. package/dist/encryption.d.ts +16 -0
  112. package/dist/encryption.js +16 -0
  113. package/dist/encryption.js.map +1 -0
  114. package/dist/events.d.ts +57 -0
  115. package/dist/events.js +106 -0
  116. package/dist/events.js.map +1 -0
  117. package/dist/filesystem.d.ts +23 -0
  118. package/dist/filesystem.js +75 -0
  119. package/dist/filesystem.js.map +1 -0
  120. package/dist/gcs/admin.d.ts +470 -0
  121. package/dist/gcs/admin.js +206 -0
  122. package/dist/gcs/admin.js.map +1 -0
  123. package/dist/gcs/events.d.ts +41 -0
  124. package/dist/gcs/events.js +45 -0
  125. package/dist/gcs/events.js.map +1 -0
  126. package/dist/gcs/governance.d.ts +158 -0
  127. package/dist/gcs/governance.js +100 -0
  128. package/dist/gcs/governance.js.map +1 -0
  129. package/dist/gcs/lifecycle.d.ts +161 -0
  130. package/dist/gcs/lifecycle.js +174 -0
  131. package/dist/gcs/lifecycle.js.map +1 -0
  132. package/dist/gcs/post.d.ts +31 -0
  133. package/dist/gcs/post.js +70 -0
  134. package/dist/gcs/post.js.map +1 -0
  135. package/dist/gcs/signing.d.ts +10 -0
  136. package/dist/gcs/signing.js +61 -0
  137. package/dist/gcs/signing.js.map +1 -0
  138. package/dist/gcs/uploads.d.ts +10 -0
  139. package/dist/gcs/uploads.js +76 -0
  140. package/dist/gcs/uploads.js.map +1 -0
  141. package/dist/gcs.d.ts +888 -0
  142. package/dist/gcs.js +91 -0
  143. package/dist/gcs.js.map +1 -0
  144. package/dist/hetzner/admin.d.ts +112 -0
  145. package/dist/hetzner/admin.js +19 -0
  146. package/dist/hetzner/admin.js.map +1 -0
  147. package/dist/hetzner.d.ts +15 -0
  148. package/dist/hetzner.js +15 -0
  149. package/dist/hetzner.js.map +1 -0
  150. package/dist/http/api.d.ts +236 -0
  151. package/dist/http/api.js +54 -0
  152. package/dist/http/api.js.map +1 -0
  153. package/dist/http/download.js +99 -0
  154. package/dist/http/download.js.map +1 -0
  155. package/dist/http/schema.d.ts +3 -0
  156. package/dist/http/schema.js +4 -0
  157. package/dist/http.d.ts +35 -0
  158. package/dist/http.js +178 -0
  159. package/dist/http.js.map +1 -0
  160. package/dist/index.d.ts +10 -0
  161. package/dist/index.js +9 -0
  162. package/dist/internal/http/control-plane.js +71 -0
  163. package/dist/internal/http/control-plane.js.map +1 -0
  164. package/dist/internal/listing-cursor.js +44 -0
  165. package/dist/internal/listing-cursor.js.map +1 -0
  166. package/dist/internal/node/provider-errors.js +16 -0
  167. package/dist/internal/node/provider-errors.js.map +1 -0
  168. package/dist/internal/node/upload-body.js +111 -0
  169. package/dist/internal/node/upload-body.js.map +1 -0
  170. package/dist/internal/provider-response.js +14 -0
  171. package/dist/internal/provider-response.js.map +1 -0
  172. package/dist/internal/public-urls.js +30 -0
  173. package/dist/internal/public-urls.js.map +1 -0
  174. package/dist/internal/read-condition.js +11 -0
  175. package/dist/internal/read-condition.js.map +1 -0
  176. package/dist/internal/request-validation.js +24 -0
  177. package/dist/internal/request-validation.js.map +1 -0
  178. package/dist/internal/signing-request.js +22 -0
  179. package/dist/internal/signing-request.js.map +1 -0
  180. package/dist/internal/web-upload-body.js +71 -0
  181. package/dist/internal/web-upload-body.js.map +1 -0
  182. package/dist/lifecycle/configuration-state.js +26 -0
  183. package/dist/lifecycle/configuration-state.js.map +1 -0
  184. package/dist/lifecycle/metadata.js +28 -0
  185. package/dist/lifecycle/metadata.js.map +1 -0
  186. package/dist/lifecycle.d.ts +269 -0
  187. package/dist/lifecycle.js +72 -0
  188. package/dist/lifecycle.js.map +1 -0
  189. package/dist/migrations.d.ts +537 -0
  190. package/dist/migrations.js +296 -0
  191. package/dist/migrations.js.map +1 -0
  192. package/dist/minio/admin.d.ts +112 -0
  193. package/dist/minio/admin.js +19 -0
  194. package/dist/minio/admin.js.map +1 -0
  195. package/dist/minio.d.ts +15 -0
  196. package/dist/minio.js +15 -0
  197. package/dist/minio.js.map +1 -0
  198. package/dist/mirror.d.ts +830 -0
  199. package/dist/mirror.js +290 -0
  200. package/dist/mirror.js.map +1 -0
  201. package/dist/node.d.ts +14 -0
  202. package/dist/node.js +17 -0
  203. package/dist/node.js.map +1 -0
  204. package/dist/providers/azure/blocks.js +94 -0
  205. package/dist/providers/azure/blocks.js.map +1 -0
  206. package/dist/providers/azure/config.d.ts +41 -0
  207. package/dist/providers/azure/config.js +62 -0
  208. package/dist/providers/azure/config.js.map +1 -0
  209. package/dist/providers/azure/mapping.js +83 -0
  210. package/dist/providers/azure/mapping.js.map +1 -0
  211. package/dist/providers/azure/native.js +88 -0
  212. package/dist/providers/azure/native.js.map +1 -0
  213. package/dist/providers/azure/primitives.js +203 -0
  214. package/dist/providers/azure/primitives.js.map +1 -0
  215. package/dist/providers/azure/properties.d.ts +180 -0
  216. package/dist/providers/azure/properties.js +55 -0
  217. package/dist/providers/azure/properties.js.map +1 -0
  218. package/dist/providers/azure/transport.js +14 -0
  219. package/dist/providers/azure/transport.js.map +1 -0
  220. package/dist/providers/azure/validation.js +11 -0
  221. package/dist/providers/azure/validation.js.map +1 -0
  222. package/dist/providers/filesystem/envelope.js +56 -0
  223. package/dist/providers/filesystem/envelope.js.map +1 -0
  224. package/dist/providers/filesystem/identity.js +68 -0
  225. package/dist/providers/filesystem/identity.js.map +1 -0
  226. package/dist/providers/filesystem/layout.d.ts +15 -0
  227. package/dist/providers/filesystem/layout.js +112 -0
  228. package/dist/providers/filesystem/layout.js.map +1 -0
  229. package/dist/providers/filesystem/list.js +82 -0
  230. package/dist/providers/filesystem/list.js.map +1 -0
  231. package/dist/providers/filesystem/operations.js +134 -0
  232. package/dist/providers/filesystem/operations.js.map +1 -0
  233. package/dist/providers/gcs/config.d.ts +34 -0
  234. package/dist/providers/gcs/config.js +60 -0
  235. package/dist/providers/gcs/config.js.map +1 -0
  236. package/dist/providers/gcs/iam.js +45 -0
  237. package/dist/providers/gcs/iam.js.map +1 -0
  238. package/dist/providers/gcs/mapping.js +118 -0
  239. package/dist/providers/gcs/mapping.js.map +1 -0
  240. package/dist/providers/gcs/native.d.ts +11 -0
  241. package/dist/providers/gcs/native.js +122 -0
  242. package/dist/providers/gcs/native.js.map +1 -0
  243. package/dist/providers/gcs/primitives.js +194 -0
  244. package/dist/providers/gcs/primitives.js.map +1 -0
  245. package/dist/providers/gcs/resumable.js +145 -0
  246. package/dist/providers/gcs/resumable.js.map +1 -0
  247. package/dist/providers/gcs/tier.d.ts +176 -0
  248. package/dist/providers/gcs/tier.js +34 -0
  249. package/dist/providers/gcs/tier.js.map +1 -0
  250. package/dist/providers/gcs/transport.js +123 -0
  251. package/dist/providers/gcs/transport.js.map +1 -0
  252. package/dist/providers/gcs/upload.js +28 -0
  253. package/dist/providers/gcs/upload.js.map +1 -0
  254. package/dist/providers/gcs/validation.js +10 -0
  255. package/dist/providers/gcs/validation.js.map +1 -0
  256. package/dist/providers/r2-workers/binding.d.ts +102 -0
  257. package/dist/providers/r2-workers/body.js +82 -0
  258. package/dist/providers/r2-workers/body.js.map +1 -0
  259. package/dist/providers/r2-workers/list.js +62 -0
  260. package/dist/providers/r2-workers/list.js.map +1 -0
  261. package/dist/providers/r2-workers/mapping.js +140 -0
  262. package/dist/providers/r2-workers/mapping.js.map +1 -0
  263. package/dist/providers/r2-workers/multipart.js +121 -0
  264. package/dist/providers/r2-workers/multipart.js.map +1 -0
  265. package/dist/providers/r2-workers/primitives.js +80 -0
  266. package/dist/providers/r2-workers/primitives.js.map +1 -0
  267. package/dist/providers/s3/admin-configuration.d.ts +19 -0
  268. package/dist/providers/s3/admin-configuration.js +171 -0
  269. package/dist/providers/s3/admin-configuration.js.map +1 -0
  270. package/dist/providers/s3/bulk-delete.d.ts +43 -0
  271. package/dist/providers/s3/bulk-delete.js +58 -0
  272. package/dist/providers/s3/bulk-delete.js.map +1 -0
  273. package/dist/providers/s3/config.d.ts +43 -0
  274. package/dist/providers/s3/config.js +89 -0
  275. package/dist/providers/s3/config.js.map +1 -0
  276. package/dist/providers/s3/copy.d.ts +115 -0
  277. package/dist/providers/s3/copy.js +122 -0
  278. package/dist/providers/s3/copy.js.map +1 -0
  279. package/dist/providers/s3/lifecycle-validation.js +33 -0
  280. package/dist/providers/s3/lifecycle-validation.js.map +1 -0
  281. package/dist/providers/s3/listing.js +56 -0
  282. package/dist/providers/s3/listing.js.map +1 -0
  283. package/dist/providers/s3/metadata.d.ts +10 -0
  284. package/dist/providers/s3/metadata.js +90 -0
  285. package/dist/providers/s3/metadata.js.map +1 -0
  286. package/dist/providers/s3/multipart.d.ts +41 -0
  287. package/dist/providers/s3/multipart.js +299 -0
  288. package/dist/providers/s3/multipart.js.map +1 -0
  289. package/dist/providers/s3/native-models.d.ts +82 -0
  290. package/dist/providers/s3/native-models.js +91 -0
  291. package/dist/providers/s3/native-models.js.map +1 -0
  292. package/dist/providers/s3/object-mapping.js +114 -0
  293. package/dist/providers/s3/object-mapping.js.map +1 -0
  294. package/dist/providers/s3/primitives.d.ts +8 -0
  295. package/dist/providers/s3/primitives.js +235 -0
  296. package/dist/providers/s3/primitives.js.map +1 -0
  297. package/dist/providers/s3/profile.d.ts +25 -0
  298. package/dist/providers/s3/profile.js +46 -0
  299. package/dist/providers/s3/profile.js.map +1 -0
  300. package/dist/providers/s3/request-extension.js +29 -0
  301. package/dist/providers/s3/request-extension.js.map +1 -0
  302. package/dist/providers/s3/service.js +55 -0
  303. package/dist/providers/s3/service.js.map +1 -0
  304. package/dist/providers/s3/signing-credentials.js +32 -0
  305. package/dist/providers/s3/signing-credentials.js.map +1 -0
  306. package/dist/providers/s3/tags.d.ts +10 -0
  307. package/dist/providers/s3/tags.js +65 -0
  308. package/dist/providers/s3/tags.js.map +1 -0
  309. package/dist/providers/s3/tier.d.ts +171 -0
  310. package/dist/providers/s3/tier.js +100 -0
  311. package/dist/providers/s3/tier.js.map +1 -0
  312. package/dist/providers/s3/transfer-driver.js +72 -0
  313. package/dist/providers/s3/transfer-driver.js.map +1 -0
  314. package/dist/providers/s3/transport.js +94 -0
  315. package/dist/providers/s3/transport.js.map +1 -0
  316. package/dist/providers/s3/upload-body.js +10 -0
  317. package/dist/providers/s3/upload-body.js.map +1 -0
  318. package/dist/providers/s3/validation.js +31 -0
  319. package/dist/providers/s3/validation.js.map +1 -0
  320. package/dist/providers/s3/versions.d.ts +10 -0
  321. package/dist/providers/s3/versions.js +143 -0
  322. package/dist/providers/s3/versions.js.map +1 -0
  323. package/dist/providers/s3-compatible/config.d.ts +36 -0
  324. package/dist/providers/s3-compatible/config.js +174 -0
  325. package/dist/providers/s3-compatible/config.js.map +1 -0
  326. package/dist/providers/s3-compatible/service.js +48 -0
  327. package/dist/providers/s3-compatible/service.js.map +1 -0
  328. package/dist/providers/supabase/config.d.ts +20 -0
  329. package/dist/providers/supabase/config.js +41 -0
  330. package/dist/providers/supabase/config.js.map +1 -0
  331. package/dist/providers/supabase/mapping.js +60 -0
  332. package/dist/providers/supabase/mapping.js.map +1 -0
  333. package/dist/providers/supabase/primitives.js +205 -0
  334. package/dist/providers/supabase/primitives.js.map +1 -0
  335. package/dist/providers/supabase/transport.js +64 -0
  336. package/dist/providers/supabase/transport.js.map +1 -0
  337. package/dist/providers/supabase/tus.js +163 -0
  338. package/dist/providers/supabase/tus.js.map +1 -0
  339. package/dist/providers/tigris/configuration.js +118 -0
  340. package/dist/providers/tigris/configuration.js.map +1 -0
  341. package/dist/providers/tigris/snapshots.js +87 -0
  342. package/dist/providers/tigris/snapshots.js.map +1 -0
  343. package/dist/providers/tigris/transport.js +18 -0
  344. package/dist/providers/tigris/transport.js.map +1 -0
  345. package/dist/providers/vercel/config.d.ts +16 -0
  346. package/dist/providers/vercel/config.js +48 -0
  347. package/dist/providers/vercel/config.js.map +1 -0
  348. package/dist/providers/vercel/mapping.js +79 -0
  349. package/dist/providers/vercel/mapping.js.map +1 -0
  350. package/dist/providers/vercel/multipart.js +113 -0
  351. package/dist/providers/vercel/multipart.js.map +1 -0
  352. package/dist/providers/vercel/primitives.js +168 -0
  353. package/dist/providers/vercel/primitives.js.map +1 -0
  354. package/dist/providers/vercel/transport.js +32 -0
  355. package/dist/providers/vercel/transport.js.map +1 -0
  356. package/dist/providers/wasabi/compliance.d.ts +52 -0
  357. package/dist/providers/wasabi/compliance.js +89 -0
  358. package/dist/providers/wasabi/compliance.js.map +1 -0
  359. package/dist/providers/wasabi/xml.js +55 -0
  360. package/dist/providers/wasabi/xml.js.map +1 -0
  361. package/dist/r2/admin.d.ts +126 -0
  362. package/dist/r2/admin.js +138 -0
  363. package/dist/r2/admin.js.map +1 -0
  364. package/dist/r2/events.d.ts +41 -0
  365. package/dist/r2/events.js +37 -0
  366. package/dist/r2/events.js.map +1 -0
  367. package/dist/r2-workers.d.ts +24 -0
  368. package/dist/r2-workers.js +115 -0
  369. package/dist/r2-workers.js.map +1 -0
  370. package/dist/r2.d.ts +15 -0
  371. package/dist/r2.js +15 -0
  372. package/dist/r2.js.map +1 -0
  373. package/dist/react.d.ts +73 -0
  374. package/dist/react.js +49 -0
  375. package/dist/react.js.map +1 -0
  376. package/dist/representation.d.ts +24 -0
  377. package/dist/representation.js +7 -0
  378. package/dist/representation.js.map +1 -0
  379. package/dist/runtime/bun-filesystem.js +136 -0
  380. package/dist/runtime/bun-filesystem.js.map +1 -0
  381. package/dist/runtime/file-target.d.ts +10 -0
  382. package/dist/runtime/file-target.js +66 -0
  383. package/dist/runtime/file-target.js.map +1 -0
  384. package/dist/runtime/filesystem.d.ts +6 -0
  385. package/dist/runtime/filesystem.js +68 -0
  386. package/dist/runtime/filesystem.js.map +1 -0
  387. package/dist/runtime/node-hash.d.ts +4 -0
  388. package/dist/runtime/node-hash.js +31 -0
  389. package/dist/runtime/node-hash.js.map +1 -0
  390. package/dist/runtime/node-protection.d.ts +4 -0
  391. package/dist/runtime/node-protection.js +46 -0
  392. package/dist/runtime/node-protection.js.map +1 -0
  393. package/dist/runtime/portable-hash.d.ts +3 -0
  394. package/dist/runtime/portable-hash.js +31 -0
  395. package/dist/runtime/portable-hash.js.map +1 -0
  396. package/dist/runtime/session-store.d.ts +12 -0
  397. package/dist/runtime/session-store.js +19 -0
  398. package/dist/runtime/session-store.js.map +1 -0
  399. package/dist/runtime/web-protection.d.ts +7 -0
  400. package/dist/runtime/web-protection.js +54 -0
  401. package/dist/runtime/web-protection.js.map +1 -0
  402. package/dist/s3/admin.d.ts +183 -0
  403. package/dist/s3/admin.js +197 -0
  404. package/dist/s3/admin.js.map +1 -0
  405. package/dist/s3/archive.d.ts +25 -0
  406. package/dist/s3/archive.js +113 -0
  407. package/dist/s3/archive.js.map +1 -0
  408. package/dist/s3/events.d.ts +42 -0
  409. package/dist/s3/events.js +69 -0
  410. package/dist/s3/events.js.map +1 -0
  411. package/dist/s3/governance.d.ts +319 -0
  412. package/dist/s3/governance.js +108 -0
  413. package/dist/s3/governance.js.map +1 -0
  414. package/dist/s3/lifecycle.d.ts +4 -0
  415. package/dist/s3/lifecycle.js +5 -0
  416. package/dist/s3/post.d.ts +31 -0
  417. package/dist/s3/post.js +93 -0
  418. package/dist/s3/post.js.map +1 -0
  419. package/dist/s3/signing.d.ts +105 -0
  420. package/dist/s3/signing.js +198 -0
  421. package/dist/s3/signing.js.map +1 -0
  422. package/dist/s3/uploads.d.ts +11 -0
  423. package/dist/s3/uploads.js +173 -0
  424. package/dist/s3/uploads.js.map +1 -0
  425. package/dist/s3.d.ts +37 -0
  426. package/dist/s3.js +114 -0
  427. package/dist/s3.js.map +1 -0
  428. package/dist/scaleway/admin.d.ts +112 -0
  429. package/dist/scaleway/admin.js +19 -0
  430. package/dist/scaleway/admin.js.map +1 -0
  431. package/dist/scaleway.d.ts +15 -0
  432. package/dist/scaleway.js +15 -0
  433. package/dist/scaleway.js.map +1 -0
  434. package/dist/session-events.d.ts +22 -0
  435. package/dist/session-events.js +22 -0
  436. package/dist/session-events.js.map +1 -0
  437. package/dist/sessions/checkpoint.d.ts +423 -0
  438. package/dist/sessions/checkpoint.js +102 -0
  439. package/dist/sessions/checkpoint.js.map +1 -0
  440. package/dist/sessions/download.d.ts +17 -0
  441. package/dist/sessions/download.js +111 -0
  442. package/dist/sessions/download.js.map +1 -0
  443. package/dist/sessions/native-upload.js +168 -0
  444. package/dist/sessions/native-upload.js.map +1 -0
  445. package/dist/sessions/store.d.ts +40 -0
  446. package/dist/sessions/store.js +77 -0
  447. package/dist/sessions/store.js.map +1 -0
  448. package/dist/sessions/upload.d.ts +10 -0
  449. package/dist/sessions/upload.js +329 -0
  450. package/dist/sessions/upload.js.map +1 -0
  451. package/dist/sessions.d.ts +98 -0
  452. package/dist/sessions.js +268 -0
  453. package/dist/sessions.js.map +1 -0
  454. package/dist/spaces/admin.d.ts +112 -0
  455. package/dist/spaces/admin.js +19 -0
  456. package/dist/spaces/admin.js.map +1 -0
  457. package/dist/spaces.d.ts +15 -0
  458. package/dist/spaces.js +15 -0
  459. package/dist/spaces.js.map +1 -0
  460. package/dist/supabase/admin.d.ts +77 -0
  461. package/dist/supabase/admin.js +74 -0
  462. package/dist/supabase/admin.js.map +1 -0
  463. package/dist/supabase/s3.d.ts +311 -0
  464. package/dist/supabase/s3.js +153 -0
  465. package/dist/supabase/s3.js.map +1 -0
  466. package/dist/supabase/signing.d.ts +23 -0
  467. package/dist/supabase/signing.js +93 -0
  468. package/dist/supabase/signing.js.map +1 -0
  469. package/dist/supabase/tus-uploads.d.ts +13 -0
  470. package/dist/supabase/tus-uploads.js +109 -0
  471. package/dist/supabase/tus-uploads.js.map +1 -0
  472. package/dist/supabase/uploads.d.ts +5 -0
  473. package/dist/supabase/uploads.js +32 -0
  474. package/dist/supabase/uploads.js.map +1 -0
  475. package/dist/supabase.d.ts +100 -0
  476. package/dist/supabase.js +50 -0
  477. package/dist/supabase.js.map +1 -0
  478. package/dist/testing/body-failure.js +18 -0
  479. package/dist/testing/body-failure.js.map +1 -0
  480. package/dist/testing/conformance/assertions.d.ts +10 -0
  481. package/dist/testing/conformance/assertions.js +21 -0
  482. package/dist/testing/conformance/assertions.js.map +1 -0
  483. package/dist/testing/conformance/core-cases.js +107 -0
  484. package/dist/testing/conformance/core-cases.js.map +1 -0
  485. package/dist/testing/conformance/list-cases.js +72 -0
  486. package/dist/testing/conformance/list-cases.js.map +1 -0
  487. package/dist/testing/conformance/read-cases.js +105 -0
  488. package/dist/testing/conformance/read-cases.js.map +1 -0
  489. package/dist/testing/conformance.d.ts +23 -0
  490. package/dist/testing/conformance.js +37 -0
  491. package/dist/testing/conformance.js.map +1 -0
  492. package/dist/testing/faults.d.ts +258 -0
  493. package/dist/testing/faults.js +111 -0
  494. package/dist/testing/faults.js.map +1 -0
  495. package/dist/testing/memory-list.js +79 -0
  496. package/dist/testing/memory-list.js.map +1 -0
  497. package/dist/testing/memory-state.d.ts +18 -0
  498. package/dist/testing/memory-state.js +57 -0
  499. package/dist/testing/memory-state.js.map +1 -0
  500. package/dist/testing/memory-upload.js +123 -0
  501. package/dist/testing/memory-upload.js.map +1 -0
  502. package/dist/testing/memory.d.ts +23 -0
  503. package/dist/testing/memory.js +121 -0
  504. package/dist/testing/memory.js.map +1 -0
  505. package/dist/testing.d.ts +6 -0
  506. package/dist/testing.js +6 -0
  507. package/dist/tigris/events.d.ts +42 -0
  508. package/dist/tigris/events.js +42 -0
  509. package/dist/tigris/events.js.map +1 -0
  510. package/dist/tigris/native.d.ts +438 -0
  511. package/dist/tigris/native.js +166 -0
  512. package/dist/tigris/native.js.map +1 -0
  513. package/dist/tigris.d.ts +15 -0
  514. package/dist/tigris.js +15 -0
  515. package/dist/tigris.js.map +1 -0
  516. package/dist/transfers/budget.js +50 -0
  517. package/dist/transfers/budget.js.map +1 -0
  518. package/dist/transfers/copy.js +250 -0
  519. package/dist/transfers/copy.js.map +1 -0
  520. package/dist/transfers/dependencies.d.ts +10 -0
  521. package/dist/transfers/dependencies.js +11 -0
  522. package/dist/transfers/dependencies.js.map +1 -0
  523. package/dist/transfers/download.js +132 -0
  524. package/dist/transfers/download.js.map +1 -0
  525. package/dist/transfers/managed-runtime.d.ts +34 -0
  526. package/dist/transfers/managed-runtime.js +30 -0
  527. package/dist/transfers/managed-runtime.js.map +1 -0
  528. package/dist/transfers/models.d.ts +160 -0
  529. package/dist/transfers/native-upload.js +195 -0
  530. package/dist/transfers/native-upload.js.map +1 -0
  531. package/dist/transfers/part-receipts.js +32 -0
  532. package/dist/transfers/part-receipts.js.map +1 -0
  533. package/dist/transfers/planner.d.ts +19 -0
  534. package/dist/transfers/planner.js +153 -0
  535. package/dist/transfers/planner.js.map +1 -0
  536. package/dist/transfers/reader.js +81 -0
  537. package/dist/transfers/reader.js.map +1 -0
  538. package/dist/transfers/runtime.d.ts +19 -0
  539. package/dist/transfers/runtime.js +132 -0
  540. package/dist/transfers/runtime.js.map +1 -0
  541. package/dist/transfers/sources.d.ts +22 -0
  542. package/dist/transfers/sources.js +83 -0
  543. package/dist/transfers/sources.js.map +1 -0
  544. package/dist/transfers/upload.js +235 -0
  545. package/dist/transfers/upload.js.map +1 -0
  546. package/dist/transfers.d.ts +31 -0
  547. package/dist/transfers.js +82 -0
  548. package/dist/transfers.js.map +1 -0
  549. package/dist/uploads/driver.d.ts +22 -0
  550. package/dist/uploads/driver.js +18 -0
  551. package/dist/uploads/driver.js.map +1 -0
  552. package/dist/uploads/policy.d.ts +39 -0
  553. package/dist/uploads/schema.d.ts +278 -0
  554. package/dist/uploads/schema.js +167 -0
  555. package/dist/uploads/schema.js.map +1 -0
  556. package/dist/uploads/signed-driver.d.ts +8 -0
  557. package/dist/uploads/signed-driver.js +36 -0
  558. package/dist/uploads/signed-driver.js.map +1 -0
  559. package/dist/uploads/store.d.ts +26 -0
  560. package/dist/uploads/store.js +51 -0
  561. package/dist/uploads/store.js.map +1 -0
  562. package/dist/uploads/verification.js +86 -0
  563. package/dist/uploads/verification.js.map +1 -0
  564. package/dist/uploads.d.ts +518 -0
  565. package/dist/uploads.js +330 -0
  566. package/dist/uploads.js.map +1 -0
  567. package/dist/vercel/authorized-uploads.d.ts +7 -0
  568. package/dist/vercel/authorized-uploads.js +15 -0
  569. package/dist/vercel/authorized-uploads.js.map +1 -0
  570. package/dist/vercel/client.d.ts +16 -0
  571. package/dist/vercel/client.js +28 -0
  572. package/dist/vercel/client.js.map +1 -0
  573. package/dist/vercel/signing.d.ts +19 -0
  574. package/dist/vercel/signing.js +120 -0
  575. package/dist/vercel/signing.js.map +1 -0
  576. package/dist/vercel/uploads.d.ts +36 -0
  577. package/dist/vercel/uploads.js +161 -0
  578. package/dist/vercel/uploads.js.map +1 -0
  579. package/dist/vercel.d.ts +86 -0
  580. package/dist/vercel.js +46 -0
  581. package/dist/vercel.js.map +1 -0
  582. package/dist/wasabi/admin.d.ts +112 -0
  583. package/dist/wasabi/admin.js +19 -0
  584. package/dist/wasabi/admin.js.map +1 -0
  585. package/dist/wasabi/native.d.ts +200 -0
  586. package/dist/wasabi/native.js +132 -0
  587. package/dist/wasabi/native.js.map +1 -0
  588. package/dist/wasabi.d.ts +15 -0
  589. package/dist/wasabi.js +15 -0
  590. package/dist/wasabi.js.map +1 -0
  591. package/dist/workflows/content/collection.js +122 -0
  592. package/dist/workflows/content/collection.js.map +1 -0
  593. package/dist/workflows/content/references.js +113 -0
  594. package/dist/workflows/content/references.js.map +1 -0
  595. package/dist/workflows/content/schema.d.ts +58 -0
  596. package/dist/workflows/content/schema.js +64 -0
  597. package/dist/workflows/content/schema.js.map +1 -0
  598. package/dist/workflows/endpoint.js +16 -0
  599. package/dist/workflows/endpoint.js.map +1 -0
  600. package/dist/workflows/migrations/schema.d.ts +149 -0
  601. package/dist/workflows/migrations/schema.js +58 -0
  602. package/dist/workflows/migrations/schema.js.map +1 -0
  603. package/dist/workflows/mirror/operations.js +175 -0
  604. package/dist/workflows/mirror/operations.js.map +1 -0
  605. package/dist/workflows/mirror/schema.d.ts +68 -0
  606. package/dist/workflows/mirror/schema.js +57 -0
  607. package/dist/workflows/mirror/schema.js.map +1 -0
  608. package/dist/workflows/mirror/view.js +103 -0
  609. package/dist/workflows/mirror/view.js.map +1 -0
  610. package/dist/workflows/objects.js +54 -0
  611. package/dist/workflows/objects.js.map +1 -0
  612. package/dist/workflows/store.d.ts +13 -0
  613. package/dist/workflows/store.js +58 -0
  614. package/dist/workflows/store.js.map +1 -0
  615. package/package.json +513 -3
@@ -0,0 +1,123 @@
1
+ import { storageError } from "../../core/errors.js";
2
+ import { customerEncryption } from "./config.js";
3
+ import { providerError } from "../../internal/node/provider-errors.js";
4
+ import { Effect, Schema, Stream } from "effect";
5
+ import { request } from "node:http";
6
+ import { Readable } from "node:stream";
7
+ import { request as request$1 } from "node:https";
8
+
9
+ // src/providers/gcs/transport.ts
10
+ /** SDK authorization/refresh plus a single abortable HTTP exchange. No File numeric IDs or hidden retries. */
11
+ const openResponse = (connection, operation, mutation, options) => Effect.acquireRelease(Effect.interruptible(Effect.callback((resume) => {
12
+ let pending;
13
+ let response;
14
+ let cancelled = false;
15
+ const preparation = connection.client.makeAuthenticatedRequest({
16
+ uri: options.uri,
17
+ method: options.method ?? "GET",
18
+ headers: { ...options.headers }
19
+ }, { onAuthenticated: (error, authenticated) => {
20
+ if (cancelled) return;
21
+ if (error || !authenticated) {
22
+ resume(Effect.fail(providerError("gcs", operation, mutation, error)));
23
+ return;
24
+ }
25
+ const url = new URL(options.uri);
26
+ for (const [key, value] of Object.entries(options.qs ?? {})) if (value !== void 0) url.searchParams.set(key, String(value));
27
+ const json = options.json !== void 0 && typeof options.json !== "boolean" ? Buffer.from(JSON.stringify(options.json)) : void 0;
28
+ const body = json ?? options.body;
29
+ pending = (url.protocol === "https:" ? request$1 : request)(url, {
30
+ method: options.method ?? "GET",
31
+ headers: {
32
+ ...Object.fromEntries(new Headers(authenticated.headers).entries()),
33
+ .../\/o(?:\/|$)/u.test(url.pathname) ? customerEncryption(connection.config) : {},
34
+ ...url.pathname.includes("/rewriteTo/") ? customerEncryption(connection.config, true) : {},
35
+ ...options.headers,
36
+ ...json ? {
37
+ "Content-Type": "application/json",
38
+ "Content-Length": String(json.length)
39
+ } : {}
40
+ }
41
+ }, (incoming) => {
42
+ response = incoming;
43
+ incoming.on("error", () => {});
44
+ resume(Effect.succeed(incoming));
45
+ });
46
+ pending.on("error", (failure) => resume(Effect.fail(providerError("gcs", operation, mutation, failure))));
47
+ pending.setTimeout(connection.config.requestTimeoutMillis, () => pending?.destroy(/* @__PURE__ */ new Error("Storage request timeout")));
48
+ if (body instanceof Readable) {
49
+ body.once("error", () => pending?.destroy());
50
+ body.pipe(pending);
51
+ } else pending.end(body);
52
+ } });
53
+ return Effect.sync(() => {
54
+ cancelled = true;
55
+ if (preparation && "abort" in preparation) preparation.abort();
56
+ pending?.destroy();
57
+ response?.destroy();
58
+ if (options.body instanceof Readable) options.body.destroy();
59
+ });
60
+ })), (response) => Effect.sync(() => {
61
+ response.destroy();
62
+ if (options.body instanceof Readable) options.body.destroy();
63
+ }));
64
+ function headersOf(response) {
65
+ return Object.fromEntries(Object.entries(response.headers).flatMap(([key, value]) => value === void 0 ? [] : [[key, Array.isArray(value) ? value.join(",") : value]]));
66
+ }
67
+ const jsonRequest = Effect.fnUntraced(function* (connection, operation, mutation, options, acceptedStatuses = []) {
68
+ if (options.json !== void 0 && typeof options.json !== "boolean") yield* Effect.try({
69
+ try: () => JSON.stringify(options.json),
70
+ catch: () => storageError(operation, "gcs", {
71
+ _tag: "InvalidInput",
72
+ field: "json"
73
+ }, mutation ? "not-started" : "not-applicable")
74
+ });
75
+ return yield* Effect.scoped(Effect.gen(function* () {
76
+ const response = yield* openResponse(connection, operation, mutation, options);
77
+ const status = response.statusCode ?? 0;
78
+ if (status === 304 && mutation) return yield* storageError(operation, "gcs", { _tag: "PreconditionFailed" }, "rejected");
79
+ if ((status < 200 || status >= 300) && !acceptedStatuses.includes(status)) return yield* providerError("gcs", operation, mutation, { code: status });
80
+ const body = yield* Effect.tryPromise({
81
+ try: async () => {
82
+ const chunks = [];
83
+ let length = 0;
84
+ for await (const chunk of response) {
85
+ length += chunk.length;
86
+ if (length > 4194304) throw new Error("Metadata limit");
87
+ chunks.push(Buffer.from(chunk));
88
+ }
89
+ const text = Buffer.concat(chunks).toString("utf8");
90
+ return !text ? void 0 : response.headers["content-type"]?.includes("application/json") || options.json !== void 0 && status !== 308 ? JSON.parse(text) : text;
91
+ },
92
+ catch: (error) => providerError("gcs", operation, mutation, error)
93
+ });
94
+ return {
95
+ status,
96
+ headers: headersOf(response),
97
+ body
98
+ };
99
+ }));
100
+ });
101
+ const mutationOperations = /* @__PURE__ */ new Set([
102
+ "put",
103
+ "initiate",
104
+ "write",
105
+ "updateMetadata",
106
+ "rewrite",
107
+ "compose",
108
+ "resumable"
109
+ ]);
110
+ const decodeJson = (schema, body, operation) => Schema.decodeUnknownEffect(schema)(body).pipe(Effect.mapError(() => storageError(operation, "gcs", { _tag: "ProviderFailure" }, mutationOperations.has(operation) ? "unknown" : "not-applicable")));
111
+ const mediaRequest = Effect.fnUntraced(function* (connection, options) {
112
+ const response = yield* openResponse(connection, "get", false, options);
113
+ const status = response.statusCode ?? 0;
114
+ if (status >= 400) return yield* providerError("gcs", "get", false, { code: status });
115
+ return {
116
+ status,
117
+ headers: headersOf(response),
118
+ body: Stream.fromAsyncIterable(response, (error) => providerError("gcs", "get", false, error))
119
+ };
120
+ });
121
+
122
+ export { decodeJson, jsonRequest, mediaRequest };
123
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","names":["httpsRequest","httpRequest"],"sources":["../../../src/providers/gcs/transport.ts"],"sourcesContent":["import { request as httpRequest } from \"node:http\";\nimport type { IncomingMessage } from \"node:http\";\nimport { request as httpsRequest } from \"node:https\";\nimport { Readable } from \"node:stream\";\n\nimport { Effect, Schema, Stream } from \"effect\";\nimport type { Scope } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { providerError } from \"../../internal/node/provider-errors.js\";\nimport { customerEncryption } from \"./config.js\";\nimport type { GcsConnection } from \"./config.js\";\n\nexport interface Options {\n readonly uri: string;\n readonly method?: string;\n readonly qs?: Readonly<Record<string, string | number | undefined>>;\n readonly headers?: Readonly<Record<string, string>>;\n readonly json?: unknown;\n readonly body?: Uint8Array | Readable;\n}\nexport interface JsonResponse {\n readonly status: number;\n readonly headers: Record<string, string>;\n readonly body: unknown;\n}\n\n/** SDK authorization/refresh plus a single abortable HTTP exchange. No File numeric IDs or hidden retries. */\nconst openResponse = (\n connection: GcsConnection,\n operation: string,\n mutation: boolean,\n options: Options,\n) =>\n Effect.acquireRelease(\n Effect.interruptible(\n Effect.callback<IncomingMessage, ReturnType<typeof providerError>>((resume) => {\n let pending: ReturnType<typeof httpRequest> | undefined;\n let response: IncomingMessage | undefined;\n let cancelled = false;\n const preparation = connection.client.makeAuthenticatedRequest(\n { uri: options.uri, method: options.method ?? \"GET\", headers: { ...options.headers } },\n {\n onAuthenticated: (error, authenticated) => {\n if (cancelled) return;\n if (error || !authenticated) {\n resume(Effect.fail(providerError(\"gcs\", operation, mutation, error)));\n return;\n }\n const url = new URL(options.uri);\n for (const [key, value] of Object.entries(options.qs ?? {}))\n if (value !== undefined) url.searchParams.set(key, String(value));\n const json =\n options.json !== undefined && typeof options.json !== \"boolean\"\n ? Buffer.from(JSON.stringify(options.json))\n : undefined;\n const body = json ?? options.body;\n pending = (url.protocol === \"https:\" ? httpsRequest : httpRequest)(\n url,\n {\n method: options.method ?? \"GET\",\n headers: {\n ...Object.fromEntries(new Headers(authenticated.headers).entries()),\n ...(/\\/o(?:\\/|$)/u.test(url.pathname)\n ? customerEncryption(connection.config)\n : {}),\n ...(url.pathname.includes(\"/rewriteTo/\")\n ? customerEncryption(connection.config, true)\n : {}),\n ...options.headers,\n ...(json\n ? {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": String(json.length),\n }\n : {}),\n },\n },\n (incoming) => {\n response = incoming;\n incoming.on(\"error\", () => {});\n resume(Effect.succeed(incoming));\n },\n );\n pending.on(\"error\", (failure) =>\n resume(Effect.fail(providerError(\"gcs\", operation, mutation, failure))),\n );\n pending.setTimeout(connection.config.requestTimeoutMillis, () =>\n pending?.destroy(new Error(\"Storage request timeout\")),\n );\n if (body instanceof Readable) {\n body.once(\"error\", () => pending?.destroy());\n body.pipe(pending);\n } else pending.end(body);\n },\n },\n );\n return Effect.sync(() => {\n cancelled = true;\n if (preparation && \"abort\" in preparation) preparation.abort();\n pending?.destroy();\n response?.destroy();\n if (options.body instanceof Readable) options.body.destroy();\n });\n }),\n ),\n (response) =>\n Effect.sync(() => {\n response.destroy();\n if (options.body instanceof Readable) options.body.destroy();\n }),\n );\n\nfunction headersOf(response: IncomingMessage) {\n return Object.fromEntries(\n Object.entries(response.headers).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, Array.isArray(value) ? value.join(\",\") : value]],\n ),\n );\n}\nexport const jsonRequest = Effect.fnUntraced(function* (\n connection: GcsConnection,\n operation: string,\n mutation: boolean,\n options: Options,\n acceptedStatuses: ReadonlyArray<number> = [],\n) {\n if (options.json !== undefined && typeof options.json !== \"boolean\")\n yield* Effect.try({\n try: () => JSON.stringify(options.json),\n catch: () =>\n storageError(\n operation,\n \"gcs\",\n { _tag: \"InvalidInput\", field: \"json\" },\n mutation ? \"not-started\" : \"not-applicable\",\n ),\n });\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const response = yield* openResponse(connection, operation, mutation, options);\n const status = response.statusCode ?? 0;\n if (status === 304 && mutation)\n return yield* storageError(operation, \"gcs\", { _tag: \"PreconditionFailed\" }, \"rejected\");\n if ((status < 200 || status >= 300) && !acceptedStatuses.includes(status))\n return yield* providerError(\"gcs\", operation, mutation, { code: status });\n const body = yield* Effect.tryPromise({\n try: async () => {\n const chunks: Buffer[] = [];\n let length = 0;\n for await (const chunk of response) {\n length += chunk.length;\n if (length > 4 * 1024 * 1024) throw new Error(\"Metadata limit\");\n chunks.push(Buffer.from(chunk));\n }\n const text = Buffer.concat(chunks).toString(\"utf8\");\n return !text\n ? undefined\n : response.headers[\"content-type\"]?.includes(\"application/json\") ||\n (options.json !== undefined && status !== 308)\n ? (JSON.parse(text) as unknown)\n : text;\n },\n catch: (error) => providerError(\"gcs\", operation, mutation, error),\n });\n return { status, headers: headersOf(response), body };\n }),\n );\n});\nconst mutationOperations = new Set([\n \"put\",\n \"initiate\",\n \"write\",\n \"updateMetadata\",\n \"rewrite\",\n \"compose\",\n \"resumable\",\n]);\nexport const decodeJson = <S extends Schema.Top>(schema: S, body: unknown, operation: string) =>\n Schema.decodeUnknownEffect(schema)(body).pipe(\n Effect.mapError(() =>\n storageError(\n operation,\n \"gcs\",\n { _tag: \"ProviderFailure\" },\n mutationOperations.has(operation) ? \"unknown\" : \"not-applicable\",\n ),\n ),\n );\n\nexport const mediaRequest: (\n connection: GcsConnection,\n options: Options,\n) => Effect.Effect<\n {\n status: number;\n headers: Record<string, string>;\n body: Stream.Stream<Uint8Array, ReturnType<typeof providerError>>;\n },\n ReturnType<typeof providerError>,\n Scope.Scope\n> = Effect.fnUntraced(function* (connection: GcsConnection, options: Options) {\n const response = yield* openResponse(connection, \"get\", false, options);\n const status = response.statusCode ?? 0;\n if (status >= 400) return yield* providerError(\"gcs\", \"get\", false, { code: status });\n return {\n status,\n headers: headersOf(response),\n body: Stream.fromAsyncIterable(response, (error) => providerError(\"gcs\", \"get\", false, error)),\n };\n});\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { nativeHeaders } from "./mapping.js";
2
+ import { randomUUID } from "node:crypto";
3
+ import { Readable } from "node:stream";
4
+
5
+ // src/providers/gcs/upload.ts
6
+ /** One JSON multipart exchange keeps primitive PUT request accounting exact. */
7
+ function multipartBody(key, headers, body, length, crc32c) {
8
+ const boundary = randomUUID();
9
+ const prefix = Buffer.from(`--${boundary}\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n${JSON.stringify({
10
+ name: key,
11
+ ...nativeHeaders(headers),
12
+ ...crc32c ? { crc32c } : {}
13
+ })}\r\n--${boundary}\r\nContent-Type: ${headers.contentType ?? "application/octet-stream"}\r\n\r\n`);
14
+ const suffix = Buffer.from(`\r\n--${boundary}--\r\n`);
15
+ return {
16
+ length: prefix.length + length + suffix.length,
17
+ contentType: `multipart/related; boundary=${boundary}`,
18
+ body: Readable.from((async function* () {
19
+ yield prefix;
20
+ if (body instanceof Readable) for await (const chunk of body) yield chunk;
21
+ else yield body;
22
+ yield suffix;
23
+ })())
24
+ };
25
+ }
26
+
27
+ export { multipartBody };
28
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","names":[],"sources":["../../../src/providers/gcs/upload.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { Readable } from \"node:stream\";\n\nimport type { ObjectHeaders } from \"../../core/object.js\";\nimport { nativeHeaders } from \"./mapping.js\";\n\n/** One JSON multipart exchange keeps primitive PUT request accounting exact. */\nexport function multipartBody(\n key: string,\n headers: ObjectHeaders,\n body: Uint8Array | Readable,\n length: number,\n crc32c?: string,\n) {\n const boundary = randomUUID();\n const prefix = Buffer.from(\n `--${boundary}\\r\\nContent-Type: application/json; charset=UTF-8\\r\\n\\r\\n${JSON.stringify({ name: key, ...nativeHeaders(headers), ...(crc32c ? { crc32c } : {}) })}\\r\\n--${boundary}\\r\\nContent-Type: ${headers.contentType ?? \"application/octet-stream\"}\\r\\n\\r\\n`,\n );\n const suffix = Buffer.from(`\\r\\n--${boundary}--\\r\\n`);\n return {\n length: prefix.length + length + suffix.length,\n contentType: `multipart/related; boundary=${boundary}`,\n body: Readable.from(\n (async function* () {\n yield prefix;\n if (body instanceof Readable) {\n for await (const chunk of body) yield chunk;\n } else yield body;\n yield suffix;\n })(),\n ),\n };\n}\n"],"mappings":";;;;;;AAOA,SAAgB,cACd,KACA,SACA,MACA,QACA,QACA;CACA,MAAM,WAAW,WAAW;CAC5B,MAAM,SAAS,OAAO,KACpB,KAAK,SAAS,2DAA2D,KAAK,UAAU;EAAE,MAAM;EAAK,GAAG,cAAc,OAAO;EAAG,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAAG,CAAC,EAAE,QAAQ,SAAS,oBAAoB,QAAQ,eAAe,2BAA2B,SAC1P;CACA,MAAM,SAAS,OAAO,KAAK,SAAS,SAAS,OAAO;CACpD,OAAO;EACL,QAAQ,OAAO,SAAS,SAAS,OAAO;EACxC,aAAa,+BAA+B;EAC5C,MAAM,SAAS,MACZ,mBAAmB;GAClB,MAAM;GACN,IAAI,gBAAgB,UAClB,WAAW,MAAM,SAAS,MAAM,MAAM;QACjC,MAAM;GACb,MAAM;EACR,EAAC,CAAE,CACL;CACF;AACF"}
@@ -0,0 +1,10 @@
1
+ import { ObjectKey } from "../../core/object.js";
2
+ import { decodeRequest } from "../../internal/request-validation.js";
3
+ import { Schema } from "effect";
4
+
5
+ // src/providers/gcs/validation.ts
6
+ const GcsKey = ObjectKey.check(Schema.makeFilter((key) => key !== "." && key !== ".." && new TextEncoder().encode(key).length <= 1024, { expected: "a GCS object name within 1024 UTF-8 bytes, excluding dot and dot-dot" }));
7
+ const validateKey = (key, operation, mutation = false) => decodeRequest(GcsKey, key, operation, "gcs", mutation);
8
+
9
+ export { GcsKey, validateKey };
10
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","names":[],"sources":["../../../src/providers/gcs/validation.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport { ObjectKey } from \"../../core/object.js\";\nimport { decodeRequest } from \"../../internal/request-validation.js\";\n\nexport const GcsKey = ObjectKey.check(\n Schema.makeFilter(\n (key) => key !== \".\" && key !== \"..\" && new TextEncoder().encode(key).length <= 1024,\n { expected: \"a GCS object name within 1024 UTF-8 bytes, excluding dot and dot-dot\" },\n ),\n);\nexport const validateKey = (key: string, operation: string, mutation = false) =>\n decodeRequest(GcsKey, key, operation, \"gcs\", mutation);\n"],"mappings":";;;;;AAKA,MAAa,SAAS,UAAU,MAC9B,OAAO,YACJ,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,MAChF,EAAE,UAAU,uEAAuE,CACrF,CACF;AACA,MAAa,eAAe,KAAa,WAAmB,WAAW,UACrE,cAAc,QAAQ,KAAK,WAAW,OAAO,QAAQ"}
@@ -0,0 +1,102 @@
1
+ export interface R2ReadableBody {
2
+ readonly locked: boolean;
3
+ cancel(reason?: unknown): Promise<void>;
4
+ getReader(): {
5
+ read(): Promise<{
6
+ done: boolean;
7
+ value?: Uint8Array | undefined;
8
+ }>;
9
+ cancel(reason?: unknown): Promise<void>;
10
+ releaseLock(): void;
11
+ };
12
+ }
13
+ /** Narrow structural binding types avoid importing or installing global Workers declarations. */
14
+ export interface R2HttpMetadata {
15
+ readonly contentType?: string;
16
+ readonly contentEncoding?: string;
17
+ readonly contentLanguage?: string;
18
+ readonly contentDisposition?: string;
19
+ readonly cacheControl?: string;
20
+ }
21
+ export interface R2ObjectLike {
22
+ readonly key: string;
23
+ readonly size: number;
24
+ readonly etag: string;
25
+ readonly httpEtag: string;
26
+ readonly uploaded: Date;
27
+ readonly httpMetadata?: R2HttpMetadata | undefined;
28
+ readonly customMetadata?: Record<string, string> | undefined;
29
+ readonly checksums: {
30
+ readonly md5?: ArrayBuffer | undefined;
31
+ readonly sha1?: ArrayBuffer | undefined;
32
+ readonly sha256?: ArrayBuffer | undefined;
33
+ readonly sha384?: ArrayBuffer | undefined;
34
+ readonly sha512?: ArrayBuffer | undefined;
35
+ };
36
+ readonly range?: {
37
+ readonly offset?: number | undefined;
38
+ readonly length?: number | undefined;
39
+ readonly suffix?: number;
40
+ } | undefined;
41
+ readonly body?: R2ReadableBody | undefined;
42
+ }
43
+ export interface R2Conditional {
44
+ readonly etagMatches?: string;
45
+ readonly etagDoesNotMatch?: string;
46
+ }
47
+ export interface R2PutOptions {
48
+ readonly onlyIf?: R2Conditional;
49
+ readonly httpMetadata?: R2HttpMetadata;
50
+ readonly customMetadata?: Record<string, string>;
51
+ }
52
+ export interface R2Part {
53
+ readonly partNumber: number;
54
+ readonly etag: string;
55
+ }
56
+ export interface R2MultipartTransport {
57
+ readonly key: string;
58
+ readonly uploadId: string;
59
+ uploadPart(partNumber: number, value: Uint8Array | ReadableStream<Uint8Array>): Promise<R2Part>;
60
+ complete(parts: R2Part[]): Promise<R2ObjectLike>;
61
+ abort(): Promise<void>;
62
+ }
63
+ export interface R2BucketTransport {
64
+ head(key: string): Promise<R2ObjectLike | null>;
65
+ get(key: string, options?: {
66
+ onlyIf?: R2Conditional;
67
+ range?: {
68
+ offset: number;
69
+ length?: number;
70
+ } | {
71
+ offset?: number;
72
+ length: number;
73
+ } | {
74
+ suffix: number;
75
+ };
76
+ }): Promise<R2ObjectLike | null>;
77
+ put(key: string, value: Uint8Array | ReadableStream<Uint8Array>, options?: R2PutOptions): Promise<R2ObjectLike | null>;
78
+ delete(key: string): Promise<void>;
79
+ list(options?: {
80
+ prefix?: string;
81
+ delimiter?: string;
82
+ limit?: number;
83
+ cursor?: string;
84
+ include?: ("httpMetadata" | "customMetadata")[];
85
+ }): Promise<{
86
+ objects: R2ObjectLike[];
87
+ truncated: boolean;
88
+ cursor?: string;
89
+ delimitedPrefixes: string[];
90
+ }>;
91
+ createMultipartUpload(key: string, options?: Omit<R2PutOptions, "onlyIf">): Promise<R2MultipartTransport>;
92
+ resumeMultipartUpload(key: string, uploadId: string): R2MultipartTransport;
93
+ }
94
+ export interface R2MultipartBinding extends Omit<R2MultipartTransport, "uploadPart"> {
95
+ uploadPart(...args: never[]): Promise<R2Part>;
96
+ }
97
+ export interface R2BucketBinding extends Omit<R2BucketTransport, "put" | "createMultipartUpload" | "resumeMultipartUpload"> {
98
+ put(...args: never[]): Promise<R2ObjectLike | null>;
99
+ createMultipartUpload(key: string, options?: Omit<R2PutOptions, "onlyIf">): Promise<R2MultipartBinding>;
100
+ resumeMultipartUpload(key: string, uploadId: string): R2MultipartBinding;
101
+ }
102
+ //# sourceMappingURL=binding.d.ts.map
@@ -0,0 +1,82 @@
1
+ import { storageError } from "../../core/errors.js";
2
+ import { call } from "./mapping.js";
3
+ import { Effect, Predicate, Stream } from "effect";
4
+
5
+ // src/providers/r2-workers/body.ts
6
+ const collect = Effect.fnUntraced(function* (source, limit) {
7
+ const chunks = [];
8
+ let length = 0;
9
+ yield* Stream.runForEach(source, (chunk) => Effect.gen(function* () {
10
+ if (!Predicate.isUint8Array(chunk)) return yield* storageError("put", "r2-workers", {
11
+ _tag: "InvalidInput",
12
+ field: "body"
13
+ }, "not-started");
14
+ if (chunk.length > limit - length) return yield* storageError("put", "r2-workers", {
15
+ _tag: "LimitExceeded",
16
+ limit
17
+ }, "not-started");
18
+ chunks.push(Uint8Array.from(chunk));
19
+ length += chunk.length;
20
+ }));
21
+ const bytes = new Uint8Array(length);
22
+ let offset = 0;
23
+ for (const chunk of chunks) {
24
+ bytes.set(chunk, offset);
25
+ offset += chunk.length;
26
+ }
27
+ return bytes;
28
+ });
29
+ const uploadBody = Effect.fnUntraced(function* (input, maximumBytes, unknownLimit, execute) {
30
+ if (!Predicate.isUint8Array(input.body) && !Stream.isStream(input.body)) return yield* storageError("put", "r2-workers", {
31
+ _tag: "InvalidInput",
32
+ field: "body"
33
+ }, "not-started");
34
+ const limit = Math.min(input.maxBytes ?? maximumBytes, maximumBytes);
35
+ if (input.contentLength !== void 0 && input.contentLength > limit) return yield* storageError("put", "r2-workers", {
36
+ _tag: "LimitExceeded",
37
+ limit
38
+ }, "not-started");
39
+ if (Predicate.isUint8Array(input.body) || input.contentLength === void 0) {
40
+ const bytes = Predicate.isUint8Array(input.body) ? input.body : yield* collect(input.body, Math.min(limit, unknownLimit));
41
+ if (bytes.length > limit) return yield* storageError("put", "r2-workers", {
42
+ _tag: "LimitExceeded",
43
+ limit
44
+ }, "not-started");
45
+ if (input.contentLength !== void 0 && input.contentLength !== bytes.length) return yield* storageError("put", "r2-workers", {
46
+ _tag: "LengthMismatch",
47
+ expected: input.contentLength,
48
+ actual: bytes.length
49
+ }, "not-started");
50
+ return yield* execute(bytes);
51
+ }
52
+ const Constructor = globalThis.FixedLengthStream;
53
+ if (!Constructor) return yield* storageError("put", "r2-workers", {
54
+ _tag: "Unsupported",
55
+ capability: "WorkerFixedLengthStream"
56
+ }, "not-started");
57
+ const stream = new Constructor(input.contentLength);
58
+ const writer = stream.writable.getWriter();
59
+ const expected = input.contentLength;
60
+ let length = 0;
61
+ const producer = Stream.runForEach(input.body, (chunk) => Effect.gen(function* () {
62
+ if (!Predicate.isUint8Array(chunk)) return yield* storageError("put", "r2-workers", {
63
+ _tag: "InvalidInput",
64
+ field: "body"
65
+ }, "unknown");
66
+ if (chunk.length > expected - length) return yield* storageError("put", "r2-workers", {
67
+ _tag: "LengthMismatch",
68
+ expected,
69
+ actual: length + chunk.length
70
+ }, "unknown");
71
+ length += chunk.length;
72
+ yield* call("put.stream", () => writer.write(chunk), "unknown");
73
+ })).pipe(Effect.andThen(Effect.suspend(() => length === expected ? call("put.stream", () => writer.close(), "unknown") : Effect.fail(storageError("put", "r2-workers", {
74
+ _tag: "LengthMismatch",
75
+ expected,
76
+ actual: length
77
+ }, "unknown")))));
78
+ return yield* Effect.acquireUseRelease(Effect.succeed(writer), () => Effect.all([producer, execute(stream.readable)], { concurrency: 2 }).pipe(Effect.map(([, result]) => result)), () => Effect.promise(() => writer.abort().then(() => void 0, () => void 0)).pipe(Effect.ensuring(Effect.sync(() => writer.releaseLock()))));
79
+ });
80
+
81
+ export { uploadBody };
82
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","names":[],"sources":["../../../src/providers/r2-workers/body.ts"],"sourcesContent":["import { Effect, Predicate, Stream } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport type { StorageError } from \"../../core/errors.js\";\nimport type { UploadBody } from \"../../core/requests.js\";\nimport { call } from \"./mapping.js\";\n\nconst collect = Effect.fnUntraced(function* <E, R>(\n source: Stream.Stream<Uint8Array, E, R>,\n limit: number,\n) {\n const chunks: Uint8Array[] = [];\n let length = 0;\n yield* Stream.runForEach(source, (chunk) =>\n Effect.gen(function* () {\n if (!Predicate.isUint8Array(chunk))\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"InvalidInput\", field: \"body\" },\n \"not-started\",\n );\n if (chunk.length > limit - length)\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"LimitExceeded\", limit },\n \"not-started\",\n );\n chunks.push(Uint8Array.from(chunk));\n length += chunk.length;\n }),\n );\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n});\n\ninterface LengthStream {\n readonly readable: ReadableStream<Uint8Array>;\n readonly writable: WritableStream<Uint8Array>;\n}\n\nexport const uploadBody = Effect.fnUntraced(function* <A, E, R>(\n input: {\n body: UploadBody<E, R>;\n contentLength?: number | undefined;\n maxBytes?: number | undefined;\n },\n maximumBytes: number,\n unknownLimit: number,\n execute: (body: Uint8Array | ReadableStream<Uint8Array>) => Effect.Effect<A, StorageError>,\n): Effect.fn.Return<A, StorageError | E, R> {\n if (!Predicate.isUint8Array(input.body) && !Stream.isStream(input.body))\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"InvalidInput\", field: \"body\" },\n \"not-started\",\n );\n const limit = Math.min(input.maxBytes ?? maximumBytes, maximumBytes);\n if (input.contentLength !== undefined && input.contentLength > limit)\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"LimitExceeded\", limit },\n \"not-started\",\n );\n if (Predicate.isUint8Array(input.body) || input.contentLength === undefined) {\n const bytes = Predicate.isUint8Array(input.body)\n ? input.body\n : yield* collect(input.body, Math.min(limit, unknownLimit));\n if (bytes.length > limit)\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"LimitExceeded\", limit },\n \"not-started\",\n );\n if (input.contentLength !== undefined && input.contentLength !== bytes.length)\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"LengthMismatch\", expected: input.contentLength, actual: bytes.length },\n \"not-started\",\n );\n return yield* execute(bytes);\n }\n\n const Constructor = (\n globalThis as unknown as { FixedLengthStream?: new (length: number) => LengthStream }\n ).FixedLengthStream;\n if (!Constructor)\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"Unsupported\", capability: \"WorkerFixedLengthStream\" },\n \"not-started\",\n );\n const stream = new Constructor(input.contentLength);\n const writer = stream.writable.getWriter();\n const expected = input.contentLength;\n let length = 0;\n const producer = Stream.runForEach(input.body, (chunk) =>\n Effect.gen(function* () {\n if (!Predicate.isUint8Array(chunk))\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"InvalidInput\", field: \"body\" },\n \"unknown\",\n );\n if (chunk.length > expected - length)\n return yield* storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"LengthMismatch\", expected, actual: length + chunk.length },\n \"unknown\",\n );\n length += chunk.length;\n yield* call(\"put.stream\", () => writer.write(chunk), \"unknown\");\n }),\n ).pipe(\n Effect.andThen(\n Effect.suspend(() =>\n length === expected\n ? call(\"put.stream\", () => writer.close(), \"unknown\")\n : Effect.fail(\n storageError(\n \"put\",\n \"r2-workers\",\n { _tag: \"LengthMismatch\", expected, actual: length },\n \"unknown\",\n ),\n ),\n ),\n ),\n );\n\n return yield* Effect.acquireUseRelease(\n Effect.succeed(writer),\n () =>\n Effect.all([producer, execute(stream.readable)], { concurrency: 2 }).pipe(\n Effect.map(([, result]) => result),\n ),\n // Abort rejection means the local writer is already terminal. It cannot cancel remote R2 work.\n () =>\n Effect.promise(() =>\n writer.abort().then(\n () => undefined,\n () => undefined,\n ),\n ).pipe(Effect.ensuring(Effect.sync(() => writer.releaseLock()))),\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { storageError } from "../../core/errors.js";
2
+ import { call, metadata } from "./mapping.js";
3
+ import { Effect, Schema } from "effect";
4
+ import { Base64Url } from "effect/encoding";
5
+
6
+ // src/providers/r2-workers/list.ts
7
+ const Cursor = Schema.fromJsonString(Schema.Struct({
8
+ version: Schema.Literal(1),
9
+ storeId: Schema.String,
10
+ prefix: Schema.String,
11
+ delimiter: Schema.NullOr(Schema.String),
12
+ limit: Schema.Natural,
13
+ token: Schema.NonEmptyString
14
+ }));
15
+ const invalid = () => storageError("listPage", "r2-workers", {
16
+ _tag: "InvalidInput",
17
+ field: "cursor"
18
+ });
19
+ const list = Effect.fnUntraced(function* (bucket, storeId, request = {}) {
20
+ const { prefix = "", delimiter, limit = 100 } = request;
21
+ let token;
22
+ if (request.cursor) {
23
+ if (request.cursor.length > 32768) return yield* invalid();
24
+ const text = yield* Effect.fromResult(Base64Url.decodeString(request.cursor)).pipe(Effect.mapError(invalid));
25
+ const cursor = yield* Schema.decodeUnknownEffect(Cursor)(text).pipe(Effect.mapError(invalid));
26
+ if (cursor.storeId !== storeId || cursor.prefix !== prefix || cursor.delimiter !== (delimiter ?? null) || cursor.limit !== limit) return yield* invalid();
27
+ token = cursor.token;
28
+ }
29
+ const page = yield* call("listPage", () => bucket.list({
30
+ prefix,
31
+ ...delimiter === void 0 ? {} : { delimiter },
32
+ limit,
33
+ ...token === void 0 ? {} : { cursor: token },
34
+ include: ["httpMetadata", "customMetadata"]
35
+ }));
36
+ if (page.truncated && !page.cursor) return yield* storageError("listPage", "r2-workers", {
37
+ _tag: "ProviderFailure",
38
+ code: "MissingCursor"
39
+ });
40
+ const objects = yield* Effect.forEach(page.objects, (object) => metadata(storeId, object).pipe(Effect.map((saved) => ({
41
+ _tag: "Object",
42
+ metadata: saved
43
+ }))));
44
+ const prefixes = page.delimitedPrefixes.map((common) => ({
45
+ _tag: "CommonPrefix",
46
+ prefix: common
47
+ }));
48
+ return {
49
+ entries: [...objects, ...prefixes],
50
+ ...page.truncated && page.cursor ? { cursor: Base64Url.encode(Schema.encodeSync(Cursor)({
51
+ version: 1,
52
+ storeId,
53
+ prefix,
54
+ delimiter: delimiter ?? null,
55
+ limit,
56
+ token: page.cursor
57
+ })) } : {}
58
+ };
59
+ });
60
+
61
+ export { list };
62
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","names":[],"sources":["../../../src/providers/r2-workers/list.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport { Base64Url } from \"effect/encoding\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport type { ListEntry, ListRequest } from \"../../core/requests.js\";\nimport type { R2BucketTransport } from \"./binding.js\";\nimport { call, metadata } from \"./mapping.js\";\n\nconst Cursor = Schema.fromJsonString(\n Schema.Struct({\n version: Schema.Literal(1),\n storeId: Schema.String,\n prefix: Schema.String,\n delimiter: Schema.NullOr(Schema.String),\n limit: Schema.Natural,\n token: Schema.NonEmptyString,\n }),\n);\nconst invalid = () =>\n storageError(\"listPage\", \"r2-workers\", { _tag: \"InvalidInput\", field: \"cursor\" });\n\nexport const list = Effect.fnUntraced(function* (\n bucket: R2BucketTransport,\n storeId: string,\n request: ListRequest = {},\n) {\n const { prefix = \"\", delimiter, limit = 100 } = request;\n let token: string | undefined;\n if (request.cursor) {\n if (request.cursor.length > 32768) return yield* invalid();\n const text = yield* Effect.fromResult(Base64Url.decodeString(request.cursor)).pipe(\n Effect.mapError(invalid),\n );\n const cursor = yield* Schema.decodeUnknownEffect(Cursor)(text).pipe(Effect.mapError(invalid));\n if (\n cursor.storeId !== storeId ||\n cursor.prefix !== prefix ||\n cursor.delimiter !== (delimiter ?? null) ||\n cursor.limit !== limit\n )\n return yield* invalid();\n token = cursor.token;\n }\n const page = yield* call(\"listPage\", () =>\n bucket.list({\n prefix,\n ...(delimiter === undefined ? {} : { delimiter }),\n limit,\n ...(token === undefined ? {} : { cursor: token }),\n include: [\"httpMetadata\", \"customMetadata\"],\n }),\n );\n if (page.truncated && !page.cursor)\n return yield* storageError(\"listPage\", \"r2-workers\", {\n _tag: \"ProviderFailure\",\n code: \"MissingCursor\",\n });\n const objects = yield* Effect.forEach(page.objects, (object) =>\n metadata(storeId, object).pipe(\n Effect.map((saved): ListEntry => ({ _tag: \"Object\", metadata: saved })),\n ),\n );\n const prefixes: ListEntry[] = page.delimitedPrefixes.map((common) => ({\n _tag: \"CommonPrefix\",\n prefix: common,\n }));\n return {\n entries: [...objects, ...prefixes],\n ...(page.truncated && page.cursor\n ? {\n cursor: Base64Url.encode(\n Schema.encodeSync(Cursor)({\n version: 1,\n storeId,\n prefix,\n delimiter: delimiter ?? null,\n limit,\n token: page.cursor,\n }),\n ),\n }\n : {}),\n };\n});\n"],"mappings":";;;;;;AAQA,MAAM,SAAS,OAAO,eACpB,OAAO,OAAO;CACZ,SAAS,OAAO,QAAQ,CAAC;CACzB,SAAS,OAAO;CAChB,QAAQ,OAAO;CACf,WAAW,OAAO,OAAO,OAAO,MAAM;CACtC,OAAO,OAAO;CACd,OAAO,OAAO;AAChB,CAAC,CACH;AACA,MAAM,gBACJ,aAAa,YAAY,cAAc;CAAE,MAAM;CAAgB,OAAO;AAAS,CAAC;AAElF,MAAa,OAAO,OAAO,WAAW,WACpC,QACA,SACA,UAAuB,CAAC,GACxB;CACA,MAAM,EAAE,SAAS,IAAI,WAAW,QAAQ,QAAQ;CAChD,IAAI;CACJ,IAAI,QAAQ,QAAQ;EAClB,IAAI,QAAQ,OAAO,SAAS,OAAO,OAAO,OAAO,QAAQ;EACzD,MAAM,OAAO,OAAO,OAAO,WAAW,UAAU,aAAa,QAAQ,MAAM,CAAC,CAAC,CAAC,KAC5E,OAAO,SAAS,OAAO,CACzB;EACA,MAAM,SAAS,OAAO,OAAO,oBAAoB,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO,SAAS,OAAO,CAAC;EAC5F,IACE,OAAO,YAAY,WACnB,OAAO,WAAW,UAClB,OAAO,eAAe,aAAa,SACnC,OAAO,UAAU,OAEjB,OAAO,OAAO,QAAQ;EACxB,QAAQ,OAAO;CACjB;CACA,MAAM,OAAO,OAAO,KAAK,kBACvB,OAAO,KAAK;EACV;EACA,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;EAC/C;EACA,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,QAAQ,MAAM;EAC/C,SAAS,CAAC,gBAAgB,gBAAgB;CAC5C,CAAC,CACH;CACA,IAAI,KAAK,aAAa,CAAC,KAAK,QAC1B,OAAO,OAAO,aAAa,YAAY,cAAc;EACnD,MAAM;EACN,MAAM;CACR,CAAC;CACH,MAAM,UAAU,OAAO,OAAO,QAAQ,KAAK,UAAU,WACnD,SAAS,SAAS,MAAM,CAAC,CAAC,KACxB,OAAO,KAAK,WAAsB;EAAE,MAAM;EAAU,UAAU;CAAM,EAAE,CACxE,CACF;CACA,MAAM,WAAwB,KAAK,kBAAkB,KAAK,YAAY;EACpE,MAAM;EACN,QAAQ;CACV,EAAE;CACF,OAAO;EACL,SAAS,CAAC,GAAG,SAAS,GAAG,QAAQ;EACjC,GAAI,KAAK,aAAa,KAAK,SACvB,EACE,QAAQ,UAAU,OAChB,OAAO,WAAW,MAAM,CAAC,CAAC;GACxB,SAAS;GACT;GACA;GACA,WAAW,aAAa;GACxB;GACA,OAAO,KAAK;EACd,CAAC,CACH,EACF,IACA,CAAC;CACP;AACF,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { ObjectMetadata } from "../../core/object.js";
2
+ import { storageError } from "../../core/errors.js";
3
+ import { Effect, Option, Schema } from "effect";
4
+ import { Hex } from "effect/encoding";
5
+
6
+ // src/providers/r2-workers/mapping.ts
7
+ const NativeError = Schema.Struct({
8
+ status: Schema.optional(Schema.Number),
9
+ httpStatus: Schema.optional(Schema.Number),
10
+ message: Schema.optional(Schema.String),
11
+ code: Schema.optional(Schema.Union([Schema.String, Schema.Number]))
12
+ });
13
+ const invalidCodes = /* @__PURE__ */ new Set([
14
+ "10011",
15
+ "10012",
16
+ "10020",
17
+ "10022",
18
+ "10025",
19
+ "10029",
20
+ "10048",
21
+ "100100",
22
+ "10013",
23
+ "10014",
24
+ "10033"
25
+ ]);
26
+ const nativeReason = (status, code) => {
27
+ if (status === 403 || [
28
+ "10002",
29
+ "10003",
30
+ "10035",
31
+ "10042",
32
+ "10069"
33
+ ].includes(code ?? "")) return { _tag: "AccessDenied" };
34
+ if (status === 404 || code === "10007" || code === "10024") return { _tag: "NotFound" };
35
+ if (status === 412 || code === "10031") return { _tag: "PreconditionFailed" };
36
+ if (status === 416 || code === "10039") return { _tag: "RangeNotSatisfiable" };
37
+ if (status === 429 || code === "10058") return { _tag: "Throttled" };
38
+ if (code === "10018") return { _tag: "Expired" };
39
+ if (code === "10054") return {
40
+ _tag: "TransportFailure",
41
+ code: "ClientDisconnect"
42
+ };
43
+ if (code === "10037") return { _tag: "IntegrityMismatch" };
44
+ if (status === 503 || code === "10043") return {
45
+ _tag: "ProviderFailure",
46
+ code: "ServiceUnavailable"
47
+ };
48
+ if (code === "10001") return {
49
+ _tag: "ProviderFailure",
50
+ code: "InternalError"
51
+ };
52
+ if (invalidCodes.has(code ?? "")) return {
53
+ _tag: "InvalidInput",
54
+ field: "native-request"
55
+ };
56
+ return {
57
+ _tag: "ProviderFailure",
58
+ code: "R2BindingFailure"
59
+ };
60
+ };
61
+ const bindingError = (operation, outcome) => (error) => {
62
+ const parsed = Schema.decodeUnknownOption(NativeError)(error);
63
+ const details = Option.isSome(parsed) ? parsed.value : void 0;
64
+ const status = details?.httpStatus ?? details?.status;
65
+ const code = details?.code === void 0 ? details?.message?.match(/\((100\d{2,3})\)\s*$/u)?.[1] : String(details.code);
66
+ const reason = nativeReason(status, code);
67
+ const rejected = [
68
+ "NotFound",
69
+ "AccessDenied",
70
+ "PreconditionFailed",
71
+ "RangeNotSatisfiable",
72
+ "IntegrityMismatch",
73
+ "Throttled",
74
+ "InvalidInput",
75
+ "Expired"
76
+ ].includes(reason._tag);
77
+ return storageError(operation, "r2-workers", reason, outcome === "unknown" && rejected ? "rejected" : outcome);
78
+ };
79
+ const call = (operation, run, outcome = "not-applicable") => Effect.tryPromise({
80
+ try: run,
81
+ catch: bindingError(operation, outcome)
82
+ });
83
+ const metadata = Effect.fnUntraced(function* (storeId, object) {
84
+ const checksums = [
85
+ "md5",
86
+ "sha1",
87
+ "sha256",
88
+ "sha384",
89
+ "sha512"
90
+ ].flatMap((algorithm) => {
91
+ const bytes = object.checksums[algorithm];
92
+ return bytes ? [{
93
+ algorithm,
94
+ encoding: "hex",
95
+ scope: "full-object",
96
+ value: Hex.encode(new Uint8Array(bytes))
97
+ }] : [];
98
+ });
99
+ const encoded = yield* Effect.try({
100
+ try: () => ({
101
+ ...object.httpMetadata,
102
+ customMetadata: object.customMetadata,
103
+ ref: {
104
+ storeId,
105
+ key: object.key
106
+ },
107
+ size: object.size,
108
+ etag: object.httpEtag,
109
+ lastModified: object.uploaded.toISOString(),
110
+ checksums
111
+ }),
112
+ catch: () => storageError("metadata", "r2-workers", {
113
+ _tag: "ProviderFailure",
114
+ code: "InvalidMetadata"
115
+ })
116
+ });
117
+ return yield* Schema.decodeUnknownEffect(ObjectMetadata)(encoded).pipe(Effect.mapError(() => storageError("metadata", "r2-workers", {
118
+ _tag: "ProviderFailure",
119
+ code: "InvalidMetadata"
120
+ })));
121
+ });
122
+ const headers = (input) => ({
123
+ httpMetadata: {
124
+ ...input.contentType === void 0 ? {} : { contentType: input.contentType },
125
+ ...input.contentEncoding === void 0 ? {} : { contentEncoding: input.contentEncoding },
126
+ ...input.contentLanguage === void 0 ? {} : { contentLanguage: input.contentLanguage },
127
+ ...input.contentDisposition === void 0 ? {} : { contentDisposition: input.contentDisposition },
128
+ ...input.cacheControl === void 0 ? {} : { cacheControl: input.cacheControl }
129
+ },
130
+ ...input.customMetadata ? { customMetadata: { ...input.customMetadata } } : {}
131
+ });
132
+ const validateKey = (key, operation) => new TextEncoder().encode(key).length <= 1024 ? Effect.void : Effect.fail(storageError(operation, "r2-workers", {
133
+ _tag: "InvalidInput",
134
+ field: "key"
135
+ }, operation === "put" || operation.startsWith("multipart") ? "not-started" : "not-applicable"));
136
+ /** Structured R2 conditions reject HTTP quotes; portable validators retain their wire spelling. */
137
+ const conditionalEtag = (etag) => etag.startsWith("\"") && etag.endsWith("\"") ? etag.slice(1, -1) : etag;
138
+
139
+ export { bindingError, call, conditionalEtag, headers, metadata, validateKey };
140
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","names":[],"sources":["../../../src/providers/r2-workers/mapping.ts"],"sourcesContent":["import { Effect, Option, Schema } from \"effect\";\nimport { Hex } from \"effect/encoding\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport type { MutationOutcome, StorageReason } from \"../../core/errors.js\";\nimport { ObjectMetadata } from \"../../core/object.js\";\nimport type { ObjectHeaders } from \"../../core/object.js\";\nimport type { R2ObjectLike, R2PutOptions } from \"./binding.js\";\n\nconst NativeError = Schema.Struct({\n status: Schema.optional(Schema.Number),\n httpStatus: Schema.optional(Schema.Number),\n message: Schema.optional(Schema.String),\n code: Schema.optional(Schema.Union([Schema.String, Schema.Number])),\n});\nconst invalidCodes = new Set([\n \"10011\",\n \"10012\",\n \"10020\",\n \"10022\",\n \"10025\",\n \"10029\",\n \"10048\",\n \"100100\",\n \"10013\",\n \"10014\",\n \"10033\",\n]);\nconst nativeReason = (status: number | undefined, code: string | undefined): StorageReason => {\n if (status === 403 || [\"10002\", \"10003\", \"10035\", \"10042\", \"10069\"].includes(code ?? \"\"))\n return { _tag: \"AccessDenied\" };\n if (status === 404 || code === \"10007\" || code === \"10024\") return { _tag: \"NotFound\" };\n if (status === 412 || code === \"10031\") return { _tag: \"PreconditionFailed\" };\n if (status === 416 || code === \"10039\") return { _tag: \"RangeNotSatisfiable\" };\n if (status === 429 || code === \"10058\") return { _tag: \"Throttled\" };\n if (code === \"10018\") return { _tag: \"Expired\" };\n if (code === \"10054\") return { _tag: \"TransportFailure\", code: \"ClientDisconnect\" };\n if (code === \"10037\") return { _tag: \"IntegrityMismatch\" };\n if (status === 503 || code === \"10043\")\n return { _tag: \"ProviderFailure\", code: \"ServiceUnavailable\" };\n if (code === \"10001\") return { _tag: \"ProviderFailure\", code: \"InternalError\" };\n if (invalidCodes.has(code ?? \"\")) return { _tag: \"InvalidInput\", field: \"native-request\" };\n return { _tag: \"ProviderFailure\", code: \"R2BindingFailure\" };\n};\n\nexport const bindingError = (operation: string, outcome: MutationOutcome) => (error: unknown) => {\n const parsed = Schema.decodeUnknownOption(NativeError)(error);\n const details = Option.isSome(parsed) ? parsed.value : undefined;\n const status = details?.httpStatus ?? details?.status;\n // workerd exposes numeric R2 codes in Error messages. Only recognized codes become public reasons.\n const code =\n details?.code === undefined\n ? details?.message?.match(/\\((100\\d{2,3})\\)\\s*$/u)?.[1]\n : String(details.code);\n const reason = nativeReason(status, code);\n const rejected = [\n \"NotFound\",\n \"AccessDenied\",\n \"PreconditionFailed\",\n \"RangeNotSatisfiable\",\n \"IntegrityMismatch\",\n \"Throttled\",\n \"InvalidInput\",\n \"Expired\",\n ].includes(reason._tag);\n return storageError(\n operation,\n \"r2-workers\",\n reason,\n outcome === \"unknown\" && rejected ? \"rejected\" : outcome,\n );\n};\n\nexport const call = <A>(\n operation: string,\n run: () => Promise<A>,\n outcome: MutationOutcome = \"not-applicable\",\n) => Effect.tryPromise({ try: run, catch: bindingError(operation, outcome) });\n\nexport const metadata = Effect.fnUntraced(function* (storeId: string, object: R2ObjectLike) {\n const checksums = ([\"md5\", \"sha1\", \"sha256\", \"sha384\", \"sha512\"] as const).flatMap(\n (algorithm) => {\n const bytes = object.checksums[algorithm];\n return bytes\n ? [\n {\n algorithm,\n encoding: \"hex\" as const,\n scope: \"full-object\" as const,\n value: Hex.encode(new Uint8Array(bytes)),\n },\n ]\n : [];\n },\n );\n const encoded = yield* Effect.try({\n try: () => ({\n ...object.httpMetadata,\n customMetadata: object.customMetadata,\n ref: { storeId, key: object.key },\n size: object.size,\n etag: object.httpEtag,\n lastModified: object.uploaded.toISOString(),\n checksums,\n }),\n catch: () =>\n storageError(\"metadata\", \"r2-workers\", { _tag: \"ProviderFailure\", code: \"InvalidMetadata\" }),\n });\n return yield* Schema.decodeUnknownEffect(ObjectMetadata)(encoded).pipe(\n Effect.mapError(() =>\n storageError(\"metadata\", \"r2-workers\", { _tag: \"ProviderFailure\", code: \"InvalidMetadata\" }),\n ),\n );\n});\n\nexport const headers = (input: ObjectHeaders): Omit<R2PutOptions, \"onlyIf\"> => ({\n httpMetadata: {\n ...(input.contentType === undefined ? {} : { contentType: input.contentType }),\n ...(input.contentEncoding === undefined ? {} : { contentEncoding: input.contentEncoding }),\n ...(input.contentLanguage === undefined ? {} : { contentLanguage: input.contentLanguage }),\n ...(input.contentDisposition === undefined\n ? {}\n : { contentDisposition: input.contentDisposition }),\n ...(input.cacheControl === undefined ? {} : { cacheControl: input.cacheControl }),\n },\n ...(input.customMetadata ? { customMetadata: { ...input.customMetadata } } : {}),\n});\n\nexport const validateKey = (key: string, operation: string) =>\n new TextEncoder().encode(key).length <= 1024\n ? Effect.void\n : Effect.fail(\n storageError(\n operation,\n \"r2-workers\",\n { _tag: \"InvalidInput\", field: \"key\" },\n operation === \"put\" || operation.startsWith(\"multipart\")\n ? \"not-started\"\n : \"not-applicable\",\n ),\n );\n\n/** Structured R2 conditions reject HTTP quotes; portable validators retain their wire spelling. */\nexport const conditionalEtag = (etag: string) =>\n etag.startsWith('\"') && etag.endsWith('\"') ? etag.slice(1, -1) : etag;\n"],"mappings":"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"}