@effect-kit/storage 0.0.0-stage → 0.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 (614) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +369 -2
  3. package/dist/_virtual/_rolldown/runtime.js +17 -0
  4. package/dist/azure/account-admin.d.ts +116 -0
  5. package/dist/azure/account-admin.js +90 -0
  6. package/dist/azure/account-admin.js.map +1 -0
  7. package/dist/azure/admin.d.ts +68 -0
  8. package/dist/azure/admin.js +85 -0
  9. package/dist/azure/admin.js.map +1 -0
  10. package/dist/azure/archive.d.ts +95 -0
  11. package/dist/azure/archive.js +52 -0
  12. package/dist/azure/archive.js.map +1 -0
  13. package/dist/azure/events.d.ts +40 -0
  14. package/dist/azure/events.js +62 -0
  15. package/dist/azure/events.js.map +1 -0
  16. package/dist/azure/governance.d.ts +139 -0
  17. package/dist/azure/governance.js +59 -0
  18. package/dist/azure/governance.js.map +1 -0
  19. package/dist/azure/identity.d.ts +4 -0
  20. package/dist/azure/identity.js +8 -0
  21. package/dist/azure/identity.js.map +1 -0
  22. package/dist/azure/lifecycle.d.ts +21 -0
  23. package/dist/azure/lifecycle.js +193 -0
  24. package/dist/azure/lifecycle.js.map +1 -0
  25. package/dist/azure/signing.d.ts +17 -0
  26. package/dist/azure/signing.js +71 -0
  27. package/dist/azure/signing.js.map +1 -0
  28. package/dist/azure/uploads.d.ts +11 -0
  29. package/dist/azure/uploads.js +83 -0
  30. package/dist/azure/uploads.js.map +1 -0
  31. package/dist/azure.d.ts +427 -0
  32. package/dist/azure.js +77 -0
  33. package/dist/azure.js.map +1 -0
  34. package/dist/b2/admin.d.ts +149 -0
  35. package/dist/b2/admin.js +157 -0
  36. package/dist/b2/admin.js.map +1 -0
  37. package/dist/b2.d.ts +15 -0
  38. package/dist/b2.js +15 -0
  39. package/dist/b2.js.map +1 -0
  40. package/dist/browser.d.ts +7 -0
  41. package/dist/browser.js +11 -0
  42. package/dist/browser.js.map +1 -0
  43. package/dist/bun.d.ts +14 -0
  44. package/dist/bun.js +17 -0
  45. package/dist/bun.js.map +1 -0
  46. package/dist/cache.d.ts +18 -0
  47. package/dist/cache.js +116 -0
  48. package/dist/cache.js.map +1 -0
  49. package/dist/client/atoms/controller.d.ts +10 -0
  50. package/dist/client/atoms/controller.js +267 -0
  51. package/dist/client/atoms/controller.js.map +1 -0
  52. package/dist/client/atoms/state.d.ts +17 -0
  53. package/dist/client/atoms/state.js +11 -0
  54. package/dist/client/atoms/state.js.map +1 -0
  55. package/dist/client/atoms.d.ts +59 -0
  56. package/dist/client/atoms.js +39 -0
  57. package/dist/client/atoms.js.map +1 -0
  58. package/dist/client/fingerprint.js +28 -0
  59. package/dist/client/fingerprint.js.map +1 -0
  60. package/dist/client/store.d.ts +31 -0
  61. package/dist/client/store.js +56 -0
  62. package/dist/client/store.js.map +1 -0
  63. package/dist/client/transport.d.ts +11 -0
  64. package/dist/client/transport.js +78 -0
  65. package/dist/client/transport.js.map +1 -0
  66. package/dist/client.d.ts +259 -0
  67. package/dist/client.js +350 -0
  68. package/dist/client.js.map +1 -0
  69. package/dist/composition/layer.js +22 -0
  70. package/dist/composition/layer.js.map +1 -0
  71. package/dist/composition/representation/staging.js +46 -0
  72. package/dist/composition/representation/staging.js.map +1 -0
  73. package/dist/composition/representation/storage.js +188 -0
  74. package/dist/composition/representation/storage.js.map +1 -0
  75. package/dist/composition.d.ts +20 -0
  76. package/dist/composition.js +124 -0
  77. package/dist/composition.js.map +1 -0
  78. package/dist/compression.d.ts +16 -0
  79. package/dist/compression.js +38 -0
  80. package/dist/compression.js.map +1 -0
  81. package/dist/content.d.ts +590 -0
  82. package/dist/content.js +168 -0
  83. package/dist/content.js.map +1 -0
  84. package/dist/core/capabilities.d.ts +53 -0
  85. package/dist/core/capabilities.js +9 -0
  86. package/dist/core/capabilities.js.map +1 -0
  87. package/dist/core/contracts/multipart.d.ts +56 -0
  88. package/dist/core/contracts/resumable.d.ts +70 -0
  89. package/dist/core/errors.d.ts +55 -0
  90. package/dist/core/errors.js +55 -0
  91. package/dist/core/errors.js.map +1 -0
  92. package/dist/core/object.d.ts +97 -0
  93. package/dist/core/object.js +55 -0
  94. package/dist/core/object.js.map +1 -0
  95. package/dist/core/ranges.d.ts +17 -0
  96. package/dist/core/ranges.js +27 -0
  97. package/dist/core/ranges.js.map +1 -0
  98. package/dist/core/requests.d.ts +185 -0
  99. package/dist/core/requests.js +42 -0
  100. package/dist/core/requests.js.map +1 -0
  101. package/dist/core/storage.d.ts +249 -0
  102. package/dist/core/storage.js +173 -0
  103. package/dist/core/storage.js.map +1 -0
  104. package/dist/deno.d.ts +14 -0
  105. package/dist/deno.js +17 -0
  106. package/dist/deno.js.map +1 -0
  107. package/dist/encryption/age.d.ts +14 -0
  108. package/dist/encryption/age.js +46 -0
  109. package/dist/encryption/age.js.map +1 -0
  110. package/dist/encryption.d.ts +16 -0
  111. package/dist/encryption.js +16 -0
  112. package/dist/encryption.js.map +1 -0
  113. package/dist/events.d.ts +57 -0
  114. package/dist/events.js +106 -0
  115. package/dist/events.js.map +1 -0
  116. package/dist/filesystem.d.ts +23 -0
  117. package/dist/filesystem.js +75 -0
  118. package/dist/filesystem.js.map +1 -0
  119. package/dist/gcs/admin.d.ts +470 -0
  120. package/dist/gcs/admin.js +206 -0
  121. package/dist/gcs/admin.js.map +1 -0
  122. package/dist/gcs/events.d.ts +41 -0
  123. package/dist/gcs/events.js +45 -0
  124. package/dist/gcs/events.js.map +1 -0
  125. package/dist/gcs/governance.d.ts +158 -0
  126. package/dist/gcs/governance.js +100 -0
  127. package/dist/gcs/governance.js.map +1 -0
  128. package/dist/gcs/lifecycle.d.ts +161 -0
  129. package/dist/gcs/lifecycle.js +174 -0
  130. package/dist/gcs/lifecycle.js.map +1 -0
  131. package/dist/gcs/post.d.ts +31 -0
  132. package/dist/gcs/post.js +70 -0
  133. package/dist/gcs/post.js.map +1 -0
  134. package/dist/gcs/signing.d.ts +10 -0
  135. package/dist/gcs/signing.js +61 -0
  136. package/dist/gcs/signing.js.map +1 -0
  137. package/dist/gcs/uploads.d.ts +10 -0
  138. package/dist/gcs/uploads.js +76 -0
  139. package/dist/gcs/uploads.js.map +1 -0
  140. package/dist/gcs.d.ts +888 -0
  141. package/dist/gcs.js +91 -0
  142. package/dist/gcs.js.map +1 -0
  143. package/dist/hetzner/admin.d.ts +112 -0
  144. package/dist/hetzner/admin.js +19 -0
  145. package/dist/hetzner/admin.js.map +1 -0
  146. package/dist/hetzner.d.ts +15 -0
  147. package/dist/hetzner.js +15 -0
  148. package/dist/hetzner.js.map +1 -0
  149. package/dist/http/api.d.ts +236 -0
  150. package/dist/http/api.js +54 -0
  151. package/dist/http/api.js.map +1 -0
  152. package/dist/http/download.js +99 -0
  153. package/dist/http/download.js.map +1 -0
  154. package/dist/http/schema.d.ts +3 -0
  155. package/dist/http/schema.js +4 -0
  156. package/dist/http.d.ts +35 -0
  157. package/dist/http.js +178 -0
  158. package/dist/http.js.map +1 -0
  159. package/dist/index.d.ts +10 -0
  160. package/dist/index.js +9 -0
  161. package/dist/internal/http/control-plane.js +71 -0
  162. package/dist/internal/http/control-plane.js.map +1 -0
  163. package/dist/internal/listing-cursor.js +44 -0
  164. package/dist/internal/listing-cursor.js.map +1 -0
  165. package/dist/internal/node/provider-errors.js +16 -0
  166. package/dist/internal/node/provider-errors.js.map +1 -0
  167. package/dist/internal/node/upload-body.js +111 -0
  168. package/dist/internal/node/upload-body.js.map +1 -0
  169. package/dist/internal/provider-response.js +14 -0
  170. package/dist/internal/provider-response.js.map +1 -0
  171. package/dist/internal/public-urls.js +30 -0
  172. package/dist/internal/public-urls.js.map +1 -0
  173. package/dist/internal/read-condition.js +11 -0
  174. package/dist/internal/read-condition.js.map +1 -0
  175. package/dist/internal/request-validation.js +24 -0
  176. package/dist/internal/request-validation.js.map +1 -0
  177. package/dist/internal/signing-request.js +22 -0
  178. package/dist/internal/signing-request.js.map +1 -0
  179. package/dist/internal/web-upload-body.js +71 -0
  180. package/dist/internal/web-upload-body.js.map +1 -0
  181. package/dist/lifecycle/configuration-state.js +26 -0
  182. package/dist/lifecycle/configuration-state.js.map +1 -0
  183. package/dist/lifecycle/metadata.js +28 -0
  184. package/dist/lifecycle/metadata.js.map +1 -0
  185. package/dist/lifecycle.d.ts +269 -0
  186. package/dist/lifecycle.js +72 -0
  187. package/dist/lifecycle.js.map +1 -0
  188. package/dist/migrations.d.ts +537 -0
  189. package/dist/migrations.js +296 -0
  190. package/dist/migrations.js.map +1 -0
  191. package/dist/minio/admin.d.ts +112 -0
  192. package/dist/minio/admin.js +19 -0
  193. package/dist/minio/admin.js.map +1 -0
  194. package/dist/minio.d.ts +15 -0
  195. package/dist/minio.js +15 -0
  196. package/dist/minio.js.map +1 -0
  197. package/dist/mirror.d.ts +830 -0
  198. package/dist/mirror.js +290 -0
  199. package/dist/mirror.js.map +1 -0
  200. package/dist/node.d.ts +14 -0
  201. package/dist/node.js +17 -0
  202. package/dist/node.js.map +1 -0
  203. package/dist/providers/azure/blocks.js +94 -0
  204. package/dist/providers/azure/blocks.js.map +1 -0
  205. package/dist/providers/azure/config.d.ts +41 -0
  206. package/dist/providers/azure/config.js +62 -0
  207. package/dist/providers/azure/config.js.map +1 -0
  208. package/dist/providers/azure/mapping.js +83 -0
  209. package/dist/providers/azure/mapping.js.map +1 -0
  210. package/dist/providers/azure/native.js +88 -0
  211. package/dist/providers/azure/native.js.map +1 -0
  212. package/dist/providers/azure/primitives.js +203 -0
  213. package/dist/providers/azure/primitives.js.map +1 -0
  214. package/dist/providers/azure/properties.d.ts +180 -0
  215. package/dist/providers/azure/properties.js +55 -0
  216. package/dist/providers/azure/properties.js.map +1 -0
  217. package/dist/providers/azure/transport.js +14 -0
  218. package/dist/providers/azure/transport.js.map +1 -0
  219. package/dist/providers/azure/validation.js +11 -0
  220. package/dist/providers/azure/validation.js.map +1 -0
  221. package/dist/providers/filesystem/envelope.js +56 -0
  222. package/dist/providers/filesystem/envelope.js.map +1 -0
  223. package/dist/providers/filesystem/identity.js +68 -0
  224. package/dist/providers/filesystem/identity.js.map +1 -0
  225. package/dist/providers/filesystem/layout.d.ts +15 -0
  226. package/dist/providers/filesystem/layout.js +112 -0
  227. package/dist/providers/filesystem/layout.js.map +1 -0
  228. package/dist/providers/filesystem/list.js +82 -0
  229. package/dist/providers/filesystem/list.js.map +1 -0
  230. package/dist/providers/filesystem/operations.js +134 -0
  231. package/dist/providers/filesystem/operations.js.map +1 -0
  232. package/dist/providers/gcs/config.d.ts +34 -0
  233. package/dist/providers/gcs/config.js +60 -0
  234. package/dist/providers/gcs/config.js.map +1 -0
  235. package/dist/providers/gcs/iam.js +45 -0
  236. package/dist/providers/gcs/iam.js.map +1 -0
  237. package/dist/providers/gcs/mapping.js +118 -0
  238. package/dist/providers/gcs/mapping.js.map +1 -0
  239. package/dist/providers/gcs/native.d.ts +11 -0
  240. package/dist/providers/gcs/native.js +122 -0
  241. package/dist/providers/gcs/native.js.map +1 -0
  242. package/dist/providers/gcs/primitives.js +194 -0
  243. package/dist/providers/gcs/primitives.js.map +1 -0
  244. package/dist/providers/gcs/resumable.js +145 -0
  245. package/dist/providers/gcs/resumable.js.map +1 -0
  246. package/dist/providers/gcs/tier.d.ts +176 -0
  247. package/dist/providers/gcs/tier.js +34 -0
  248. package/dist/providers/gcs/tier.js.map +1 -0
  249. package/dist/providers/gcs/transport.js +123 -0
  250. package/dist/providers/gcs/transport.js.map +1 -0
  251. package/dist/providers/gcs/upload.js +28 -0
  252. package/dist/providers/gcs/upload.js.map +1 -0
  253. package/dist/providers/gcs/validation.js +10 -0
  254. package/dist/providers/gcs/validation.js.map +1 -0
  255. package/dist/providers/r2-workers/binding.d.ts +102 -0
  256. package/dist/providers/r2-workers/body.js +82 -0
  257. package/dist/providers/r2-workers/body.js.map +1 -0
  258. package/dist/providers/r2-workers/list.js +62 -0
  259. package/dist/providers/r2-workers/list.js.map +1 -0
  260. package/dist/providers/r2-workers/mapping.js +140 -0
  261. package/dist/providers/r2-workers/mapping.js.map +1 -0
  262. package/dist/providers/r2-workers/multipart.js +121 -0
  263. package/dist/providers/r2-workers/multipart.js.map +1 -0
  264. package/dist/providers/r2-workers/primitives.js +80 -0
  265. package/dist/providers/r2-workers/primitives.js.map +1 -0
  266. package/dist/providers/s3/admin-configuration.d.ts +19 -0
  267. package/dist/providers/s3/admin-configuration.js +171 -0
  268. package/dist/providers/s3/admin-configuration.js.map +1 -0
  269. package/dist/providers/s3/bulk-delete.d.ts +43 -0
  270. package/dist/providers/s3/bulk-delete.js +58 -0
  271. package/dist/providers/s3/bulk-delete.js.map +1 -0
  272. package/dist/providers/s3/config.d.ts +43 -0
  273. package/dist/providers/s3/config.js +89 -0
  274. package/dist/providers/s3/config.js.map +1 -0
  275. package/dist/providers/s3/copy.d.ts +115 -0
  276. package/dist/providers/s3/copy.js +122 -0
  277. package/dist/providers/s3/copy.js.map +1 -0
  278. package/dist/providers/s3/lifecycle-validation.js +33 -0
  279. package/dist/providers/s3/lifecycle-validation.js.map +1 -0
  280. package/dist/providers/s3/listing.js +56 -0
  281. package/dist/providers/s3/listing.js.map +1 -0
  282. package/dist/providers/s3/metadata.d.ts +10 -0
  283. package/dist/providers/s3/metadata.js +90 -0
  284. package/dist/providers/s3/metadata.js.map +1 -0
  285. package/dist/providers/s3/multipart.d.ts +41 -0
  286. package/dist/providers/s3/multipart.js +299 -0
  287. package/dist/providers/s3/multipart.js.map +1 -0
  288. package/dist/providers/s3/native-models.d.ts +82 -0
  289. package/dist/providers/s3/native-models.js +91 -0
  290. package/dist/providers/s3/native-models.js.map +1 -0
  291. package/dist/providers/s3/object-mapping.js +114 -0
  292. package/dist/providers/s3/object-mapping.js.map +1 -0
  293. package/dist/providers/s3/primitives.d.ts +8 -0
  294. package/dist/providers/s3/primitives.js +235 -0
  295. package/dist/providers/s3/primitives.js.map +1 -0
  296. package/dist/providers/s3/profile.d.ts +25 -0
  297. package/dist/providers/s3/profile.js +46 -0
  298. package/dist/providers/s3/profile.js.map +1 -0
  299. package/dist/providers/s3/request-extension.js +29 -0
  300. package/dist/providers/s3/request-extension.js.map +1 -0
  301. package/dist/providers/s3/service.js +55 -0
  302. package/dist/providers/s3/service.js.map +1 -0
  303. package/dist/providers/s3/signing-credentials.js +32 -0
  304. package/dist/providers/s3/signing-credentials.js.map +1 -0
  305. package/dist/providers/s3/tags.d.ts +10 -0
  306. package/dist/providers/s3/tags.js +65 -0
  307. package/dist/providers/s3/tags.js.map +1 -0
  308. package/dist/providers/s3/tier.d.ts +171 -0
  309. package/dist/providers/s3/tier.js +100 -0
  310. package/dist/providers/s3/tier.js.map +1 -0
  311. package/dist/providers/s3/transfer-driver.js +72 -0
  312. package/dist/providers/s3/transfer-driver.js.map +1 -0
  313. package/dist/providers/s3/transport.js +94 -0
  314. package/dist/providers/s3/transport.js.map +1 -0
  315. package/dist/providers/s3/upload-body.js +10 -0
  316. package/dist/providers/s3/upload-body.js.map +1 -0
  317. package/dist/providers/s3/validation.js +31 -0
  318. package/dist/providers/s3/validation.js.map +1 -0
  319. package/dist/providers/s3/versions.d.ts +10 -0
  320. package/dist/providers/s3/versions.js +143 -0
  321. package/dist/providers/s3/versions.js.map +1 -0
  322. package/dist/providers/s3-compatible/config.d.ts +36 -0
  323. package/dist/providers/s3-compatible/config.js +174 -0
  324. package/dist/providers/s3-compatible/config.js.map +1 -0
  325. package/dist/providers/s3-compatible/service.js +48 -0
  326. package/dist/providers/s3-compatible/service.js.map +1 -0
  327. package/dist/providers/supabase/config.d.ts +20 -0
  328. package/dist/providers/supabase/config.js +41 -0
  329. package/dist/providers/supabase/config.js.map +1 -0
  330. package/dist/providers/supabase/mapping.js +60 -0
  331. package/dist/providers/supabase/mapping.js.map +1 -0
  332. package/dist/providers/supabase/primitives.js +205 -0
  333. package/dist/providers/supabase/primitives.js.map +1 -0
  334. package/dist/providers/supabase/transport.js +64 -0
  335. package/dist/providers/supabase/transport.js.map +1 -0
  336. package/dist/providers/supabase/tus.js +163 -0
  337. package/dist/providers/supabase/tus.js.map +1 -0
  338. package/dist/providers/tigris/configuration.js +118 -0
  339. package/dist/providers/tigris/configuration.js.map +1 -0
  340. package/dist/providers/tigris/snapshots.js +87 -0
  341. package/dist/providers/tigris/snapshots.js.map +1 -0
  342. package/dist/providers/tigris/transport.js +18 -0
  343. package/dist/providers/tigris/transport.js.map +1 -0
  344. package/dist/providers/vercel/config.d.ts +16 -0
  345. package/dist/providers/vercel/config.js +48 -0
  346. package/dist/providers/vercel/config.js.map +1 -0
  347. package/dist/providers/vercel/mapping.js +79 -0
  348. package/dist/providers/vercel/mapping.js.map +1 -0
  349. package/dist/providers/vercel/multipart.js +113 -0
  350. package/dist/providers/vercel/multipart.js.map +1 -0
  351. package/dist/providers/vercel/primitives.js +168 -0
  352. package/dist/providers/vercel/primitives.js.map +1 -0
  353. package/dist/providers/vercel/transport.js +32 -0
  354. package/dist/providers/vercel/transport.js.map +1 -0
  355. package/dist/providers/wasabi/compliance.d.ts +52 -0
  356. package/dist/providers/wasabi/compliance.js +89 -0
  357. package/dist/providers/wasabi/compliance.js.map +1 -0
  358. package/dist/providers/wasabi/xml.js +55 -0
  359. package/dist/providers/wasabi/xml.js.map +1 -0
  360. package/dist/r2/admin.d.ts +126 -0
  361. package/dist/r2/admin.js +138 -0
  362. package/dist/r2/admin.js.map +1 -0
  363. package/dist/r2/events.d.ts +41 -0
  364. package/dist/r2/events.js +37 -0
  365. package/dist/r2/events.js.map +1 -0
  366. package/dist/r2-workers.d.ts +24 -0
  367. package/dist/r2-workers.js +115 -0
  368. package/dist/r2-workers.js.map +1 -0
  369. package/dist/r2.d.ts +15 -0
  370. package/dist/r2.js +15 -0
  371. package/dist/r2.js.map +1 -0
  372. package/dist/react.d.ts +73 -0
  373. package/dist/react.js +49 -0
  374. package/dist/react.js.map +1 -0
  375. package/dist/representation.d.ts +24 -0
  376. package/dist/representation.js +7 -0
  377. package/dist/representation.js.map +1 -0
  378. package/dist/runtime/bun-filesystem.js +136 -0
  379. package/dist/runtime/bun-filesystem.js.map +1 -0
  380. package/dist/runtime/file-target.d.ts +10 -0
  381. package/dist/runtime/file-target.js +66 -0
  382. package/dist/runtime/file-target.js.map +1 -0
  383. package/dist/runtime/filesystem.d.ts +6 -0
  384. package/dist/runtime/filesystem.js +68 -0
  385. package/dist/runtime/filesystem.js.map +1 -0
  386. package/dist/runtime/node-hash.d.ts +4 -0
  387. package/dist/runtime/node-hash.js +31 -0
  388. package/dist/runtime/node-hash.js.map +1 -0
  389. package/dist/runtime/node-protection.d.ts +4 -0
  390. package/dist/runtime/node-protection.js +46 -0
  391. package/dist/runtime/node-protection.js.map +1 -0
  392. package/dist/runtime/portable-hash.d.ts +3 -0
  393. package/dist/runtime/portable-hash.js +31 -0
  394. package/dist/runtime/portable-hash.js.map +1 -0
  395. package/dist/runtime/session-store.d.ts +12 -0
  396. package/dist/runtime/session-store.js +19 -0
  397. package/dist/runtime/session-store.js.map +1 -0
  398. package/dist/runtime/web-protection.d.ts +7 -0
  399. package/dist/runtime/web-protection.js +54 -0
  400. package/dist/runtime/web-protection.js.map +1 -0
  401. package/dist/s3/admin.d.ts +183 -0
  402. package/dist/s3/admin.js +197 -0
  403. package/dist/s3/admin.js.map +1 -0
  404. package/dist/s3/archive.d.ts +25 -0
  405. package/dist/s3/archive.js +113 -0
  406. package/dist/s3/archive.js.map +1 -0
  407. package/dist/s3/events.d.ts +42 -0
  408. package/dist/s3/events.js +69 -0
  409. package/dist/s3/events.js.map +1 -0
  410. package/dist/s3/governance.d.ts +319 -0
  411. package/dist/s3/governance.js +108 -0
  412. package/dist/s3/governance.js.map +1 -0
  413. package/dist/s3/lifecycle.d.ts +4 -0
  414. package/dist/s3/lifecycle.js +5 -0
  415. package/dist/s3/post.d.ts +31 -0
  416. package/dist/s3/post.js +93 -0
  417. package/dist/s3/post.js.map +1 -0
  418. package/dist/s3/signing.d.ts +105 -0
  419. package/dist/s3/signing.js +198 -0
  420. package/dist/s3/signing.js.map +1 -0
  421. package/dist/s3/uploads.d.ts +11 -0
  422. package/dist/s3/uploads.js +173 -0
  423. package/dist/s3/uploads.js.map +1 -0
  424. package/dist/s3.d.ts +37 -0
  425. package/dist/s3.js +114 -0
  426. package/dist/s3.js.map +1 -0
  427. package/dist/scaleway/admin.d.ts +112 -0
  428. package/dist/scaleway/admin.js +19 -0
  429. package/dist/scaleway/admin.js.map +1 -0
  430. package/dist/scaleway.d.ts +15 -0
  431. package/dist/scaleway.js +15 -0
  432. package/dist/scaleway.js.map +1 -0
  433. package/dist/session-events.d.ts +22 -0
  434. package/dist/session-events.js +22 -0
  435. package/dist/session-events.js.map +1 -0
  436. package/dist/sessions/checkpoint.d.ts +423 -0
  437. package/dist/sessions/checkpoint.js +102 -0
  438. package/dist/sessions/checkpoint.js.map +1 -0
  439. package/dist/sessions/download.d.ts +17 -0
  440. package/dist/sessions/download.js +111 -0
  441. package/dist/sessions/download.js.map +1 -0
  442. package/dist/sessions/native-upload.js +168 -0
  443. package/dist/sessions/native-upload.js.map +1 -0
  444. package/dist/sessions/store.d.ts +40 -0
  445. package/dist/sessions/store.js +77 -0
  446. package/dist/sessions/store.js.map +1 -0
  447. package/dist/sessions/upload.d.ts +10 -0
  448. package/dist/sessions/upload.js +329 -0
  449. package/dist/sessions/upload.js.map +1 -0
  450. package/dist/sessions.d.ts +98 -0
  451. package/dist/sessions.js +268 -0
  452. package/dist/sessions.js.map +1 -0
  453. package/dist/spaces/admin.d.ts +112 -0
  454. package/dist/spaces/admin.js +19 -0
  455. package/dist/spaces/admin.js.map +1 -0
  456. package/dist/spaces.d.ts +15 -0
  457. package/dist/spaces.js +15 -0
  458. package/dist/spaces.js.map +1 -0
  459. package/dist/supabase/admin.d.ts +77 -0
  460. package/dist/supabase/admin.js +74 -0
  461. package/dist/supabase/admin.js.map +1 -0
  462. package/dist/supabase/s3.d.ts +311 -0
  463. package/dist/supabase/s3.js +153 -0
  464. package/dist/supabase/s3.js.map +1 -0
  465. package/dist/supabase/signing.d.ts +23 -0
  466. package/dist/supabase/signing.js +93 -0
  467. package/dist/supabase/signing.js.map +1 -0
  468. package/dist/supabase/tus-uploads.d.ts +13 -0
  469. package/dist/supabase/tus-uploads.js +109 -0
  470. package/dist/supabase/tus-uploads.js.map +1 -0
  471. package/dist/supabase/uploads.d.ts +5 -0
  472. package/dist/supabase/uploads.js +32 -0
  473. package/dist/supabase/uploads.js.map +1 -0
  474. package/dist/supabase.d.ts +100 -0
  475. package/dist/supabase.js +50 -0
  476. package/dist/supabase.js.map +1 -0
  477. package/dist/testing/body-failure.js +18 -0
  478. package/dist/testing/body-failure.js.map +1 -0
  479. package/dist/testing/conformance/assertions.d.ts +10 -0
  480. package/dist/testing/conformance/assertions.js +21 -0
  481. package/dist/testing/conformance/assertions.js.map +1 -0
  482. package/dist/testing/conformance/core-cases.js +107 -0
  483. package/dist/testing/conformance/core-cases.js.map +1 -0
  484. package/dist/testing/conformance/list-cases.js +72 -0
  485. package/dist/testing/conformance/list-cases.js.map +1 -0
  486. package/dist/testing/conformance/read-cases.js +105 -0
  487. package/dist/testing/conformance/read-cases.js.map +1 -0
  488. package/dist/testing/conformance.d.ts +23 -0
  489. package/dist/testing/conformance.js +37 -0
  490. package/dist/testing/conformance.js.map +1 -0
  491. package/dist/testing/faults.d.ts +258 -0
  492. package/dist/testing/faults.js +111 -0
  493. package/dist/testing/faults.js.map +1 -0
  494. package/dist/testing/memory-list.js +79 -0
  495. package/dist/testing/memory-list.js.map +1 -0
  496. package/dist/testing/memory-state.d.ts +18 -0
  497. package/dist/testing/memory-state.js +57 -0
  498. package/dist/testing/memory-state.js.map +1 -0
  499. package/dist/testing/memory-upload.js +123 -0
  500. package/dist/testing/memory-upload.js.map +1 -0
  501. package/dist/testing/memory.d.ts +23 -0
  502. package/dist/testing/memory.js +121 -0
  503. package/dist/testing/memory.js.map +1 -0
  504. package/dist/testing.d.ts +6 -0
  505. package/dist/testing.js +6 -0
  506. package/dist/tigris/events.d.ts +42 -0
  507. package/dist/tigris/events.js +42 -0
  508. package/dist/tigris/events.js.map +1 -0
  509. package/dist/tigris/native.d.ts +438 -0
  510. package/dist/tigris/native.js +166 -0
  511. package/dist/tigris/native.js.map +1 -0
  512. package/dist/tigris.d.ts +15 -0
  513. package/dist/tigris.js +15 -0
  514. package/dist/tigris.js.map +1 -0
  515. package/dist/transfers/budget.js +50 -0
  516. package/dist/transfers/budget.js.map +1 -0
  517. package/dist/transfers/copy.js +250 -0
  518. package/dist/transfers/copy.js.map +1 -0
  519. package/dist/transfers/dependencies.d.ts +10 -0
  520. package/dist/transfers/dependencies.js +11 -0
  521. package/dist/transfers/dependencies.js.map +1 -0
  522. package/dist/transfers/download.js +132 -0
  523. package/dist/transfers/download.js.map +1 -0
  524. package/dist/transfers/managed-runtime.d.ts +34 -0
  525. package/dist/transfers/managed-runtime.js +30 -0
  526. package/dist/transfers/managed-runtime.js.map +1 -0
  527. package/dist/transfers/models.d.ts +160 -0
  528. package/dist/transfers/native-upload.js +195 -0
  529. package/dist/transfers/native-upload.js.map +1 -0
  530. package/dist/transfers/part-receipts.js +32 -0
  531. package/dist/transfers/part-receipts.js.map +1 -0
  532. package/dist/transfers/planner.d.ts +19 -0
  533. package/dist/transfers/planner.js +153 -0
  534. package/dist/transfers/planner.js.map +1 -0
  535. package/dist/transfers/reader.js +81 -0
  536. package/dist/transfers/reader.js.map +1 -0
  537. package/dist/transfers/runtime.d.ts +19 -0
  538. package/dist/transfers/runtime.js +132 -0
  539. package/dist/transfers/runtime.js.map +1 -0
  540. package/dist/transfers/sources.d.ts +22 -0
  541. package/dist/transfers/sources.js +83 -0
  542. package/dist/transfers/sources.js.map +1 -0
  543. package/dist/transfers/upload.js +235 -0
  544. package/dist/transfers/upload.js.map +1 -0
  545. package/dist/transfers.d.ts +31 -0
  546. package/dist/transfers.js +82 -0
  547. package/dist/transfers.js.map +1 -0
  548. package/dist/uploads/driver.d.ts +22 -0
  549. package/dist/uploads/driver.js +18 -0
  550. package/dist/uploads/driver.js.map +1 -0
  551. package/dist/uploads/policy.d.ts +39 -0
  552. package/dist/uploads/schema.d.ts +278 -0
  553. package/dist/uploads/schema.js +167 -0
  554. package/dist/uploads/schema.js.map +1 -0
  555. package/dist/uploads/signed-driver.d.ts +8 -0
  556. package/dist/uploads/signed-driver.js +36 -0
  557. package/dist/uploads/signed-driver.js.map +1 -0
  558. package/dist/uploads/store.d.ts +26 -0
  559. package/dist/uploads/store.js +51 -0
  560. package/dist/uploads/store.js.map +1 -0
  561. package/dist/uploads/verification.js +86 -0
  562. package/dist/uploads/verification.js.map +1 -0
  563. package/dist/uploads.d.ts +518 -0
  564. package/dist/uploads.js +330 -0
  565. package/dist/uploads.js.map +1 -0
  566. package/dist/vercel/authorized-uploads.d.ts +7 -0
  567. package/dist/vercel/authorized-uploads.js +15 -0
  568. package/dist/vercel/authorized-uploads.js.map +1 -0
  569. package/dist/vercel/client.d.ts +16 -0
  570. package/dist/vercel/client.js +28 -0
  571. package/dist/vercel/client.js.map +1 -0
  572. package/dist/vercel/signing.d.ts +19 -0
  573. package/dist/vercel/signing.js +120 -0
  574. package/dist/vercel/signing.js.map +1 -0
  575. package/dist/vercel/uploads.d.ts +36 -0
  576. package/dist/vercel/uploads.js +161 -0
  577. package/dist/vercel/uploads.js.map +1 -0
  578. package/dist/vercel.d.ts +86 -0
  579. package/dist/vercel.js +46 -0
  580. package/dist/vercel.js.map +1 -0
  581. package/dist/wasabi/admin.d.ts +112 -0
  582. package/dist/wasabi/admin.js +19 -0
  583. package/dist/wasabi/admin.js.map +1 -0
  584. package/dist/wasabi/native.d.ts +200 -0
  585. package/dist/wasabi/native.js +132 -0
  586. package/dist/wasabi/native.js.map +1 -0
  587. package/dist/wasabi.d.ts +15 -0
  588. package/dist/wasabi.js +15 -0
  589. package/dist/wasabi.js.map +1 -0
  590. package/dist/workflows/content/collection.js +122 -0
  591. package/dist/workflows/content/collection.js.map +1 -0
  592. package/dist/workflows/content/references.js +113 -0
  593. package/dist/workflows/content/references.js.map +1 -0
  594. package/dist/workflows/content/schema.d.ts +58 -0
  595. package/dist/workflows/content/schema.js +64 -0
  596. package/dist/workflows/content/schema.js.map +1 -0
  597. package/dist/workflows/endpoint.js +16 -0
  598. package/dist/workflows/endpoint.js.map +1 -0
  599. package/dist/workflows/migrations/schema.d.ts +149 -0
  600. package/dist/workflows/migrations/schema.js +58 -0
  601. package/dist/workflows/migrations/schema.js.map +1 -0
  602. package/dist/workflows/mirror/operations.js +175 -0
  603. package/dist/workflows/mirror/operations.js.map +1 -0
  604. package/dist/workflows/mirror/schema.d.ts +68 -0
  605. package/dist/workflows/mirror/schema.js +57 -0
  606. package/dist/workflows/mirror/schema.js.map +1 -0
  607. package/dist/workflows/mirror/view.js +103 -0
  608. package/dist/workflows/mirror/view.js.map +1 -0
  609. package/dist/workflows/objects.js +54 -0
  610. package/dist/workflows/objects.js.map +1 -0
  611. package/dist/workflows/store.d.ts +13 -0
  612. package/dist/workflows/store.js +58 -0
  613. package/dist/workflows/store.js.map +1 -0
  614. package/package.json +513 -3
package/dist/client.js ADDED
@@ -0,0 +1,350 @@
1
+ import { GrantResponse, UploadErrorCode, UploadInput, UploadStatus, failUpload } from "./uploads/schema.js";
2
+ import { hashFile } from "./client/fingerprint.js";
3
+ import { UploadClientStore } from "./client/store.js";
4
+ import { fetchTransfer, providerUrl, xhrTransfer } from "./client/transport.js";
5
+ import { Context, Effect, Layer, Schedule, Schema } from "effect";
6
+
7
+ // src/client/index.ts
8
+ const decode = (schema, value) => Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => failUpload("BadRequest")));
9
+ const emit = (onProgress, value) => onProgress ? Effect.try({
10
+ try: () => onProgress(value),
11
+ catch: () => failUpload("Unavailable")
12
+ }) : Effect.void;
13
+ const path = (id) => `/uploads/${encodeURIComponent(id)}`;
14
+ const successful = (response) => response.status >= 200 && response.status < 300 ? Effect.void : Effect.fail(failUpload(response.status === 401 || response.status === 403 ? "Expired" : "Unavailable"));
15
+ const make = Effect.fnUntraced(function* (options) {
16
+ const context = yield* Effect.context();
17
+ const base = options.baseUrl.replace(/\/$/u, "");
18
+ const parsed = URL.parse(base, typeof location === "undefined" ? "http://localhost" : location.href);
19
+ if (!parsed || parsed.username || parsed.password || parsed.search || parsed.hash || !(base.startsWith("/") || parsed.protocol === "https:" || parsed.protocol === "http:" && ["localhost", "127.0.0.1"].includes(parsed.hostname))) return yield* failUpload("BadRequest");
20
+ const deadline = options.deadlineMillis ?? 18e5;
21
+ if (!Number.isSafeInteger(deadline) || deadline <= 0) return yield* failUpload("BadRequest");
22
+ const bounded = (effect) => effect.pipe(Effect.timeoutOrElse({
23
+ duration: deadline,
24
+ orElse: () => Effect.fail(failUpload("Unavailable"))
25
+ }));
26
+ const store = options.store ?? UploadClientStore.memory();
27
+ const api = Effect.fnUntraced(function* (method, resourcePath, schema, body) {
28
+ const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};
29
+ const response = yield* Effect.tryPromise({
30
+ try: (signal) => fetch(base + resourcePath, {
31
+ method,
32
+ credentials: options.credentials ?? "same-origin",
33
+ redirect: "error",
34
+ headers: {
35
+ ...headers,
36
+ ...body !== void 0 ? { "content-type": "application/json" } : {}
37
+ },
38
+ ...body !== void 0 ? { body: JSON.stringify(body) } : {},
39
+ signal
40
+ }),
41
+ catch: () => failUpload("Unavailable")
42
+ });
43
+ const value = yield* Effect.tryPromise({
44
+ try: async (signal) => {
45
+ const reader = response.body?.getReader();
46
+ if (!reader) throw new Error("Missing response");
47
+ const cancel = () => {
48
+ reader.cancel().catch(() => void 0);
49
+ };
50
+ signal.addEventListener("abort", cancel, { once: true });
51
+ let text = "";
52
+ const decoder = new TextDecoder();
53
+ let bytes = 0;
54
+ try {
55
+ while (true) {
56
+ const next = await reader.read();
57
+ if (next.done) break;
58
+ bytes += next.value.length;
59
+ if (bytes > 1048576) throw new Error("Response limit");
60
+ text += decoder.decode(next.value, { stream: true });
61
+ }
62
+ if (signal.aborted) throw new Error("Request interrupted");
63
+ return JSON.parse(text + decoder.decode());
64
+ } finally {
65
+ signal.removeEventListener("abort", cancel);
66
+ await reader.cancel();
67
+ reader.releaseLock();
68
+ }
69
+ },
70
+ catch: () => failUpload("Unavailable")
71
+ });
72
+ if (!response.ok) {
73
+ const error = yield* decode(Schema.Struct({ code: UploadErrorCode }), value);
74
+ return yield* failUpload(error.code);
75
+ }
76
+ return yield* decode(schema, value);
77
+ }, Effect.retry({
78
+ times: 2,
79
+ schedule: Schedule.exponential("100 millis"),
80
+ while: (error) => error.code === "Unavailable"
81
+ }), bounded);
82
+ const ticket = Effect.fnUntraced(function* (id, file, onProgress) {
83
+ const record = yield* store.read(id);
84
+ if (!record || !record.id) return yield* failUpload("NotFound");
85
+ if (record.input.file.size !== file.size || record.input.file.name !== file.name || record.input.file.contentType !== (file.type || "application/octet-stream") || record.input.file.sha256 !== (yield* hashFile(file, onProgress))) return yield* failUpload("Conflict");
86
+ return record;
87
+ });
88
+ const transfer = Effect.fnUntraced(function* (input) {
89
+ const id = (yield* ticket(input.uploadId, input.file, input.onProgress)).id;
90
+ if (!id) return yield* failUpload("NotFound");
91
+ let grant = (yield* api("POST", `${path(id)}/grants`, GrantResponse)).grant;
92
+ const onProtocol = input.onProtocol;
93
+ if (onProtocol) yield* Effect.try({
94
+ try: () => onProtocol(grant._tag === "Multipart" || grant._tag === "Blocks" ? "multipart" : grant._tag === "Resumable" ? "resumable" : grant._tag === "PostForm" ? "post" : grant._tag === "Proxy" ? "proxy" : "single", id),
95
+ catch: () => failUpload("Unavailable")
96
+ });
97
+ let accepted = 0;
98
+ const send = Effect.fnUntraced(function* (url, method, headers, body, offset) {
99
+ const target = yield* providerUrl(url);
100
+ const safeHeaders = Object.fromEntries(Object.entries(headers).filter(([name]) => !["content-length", "host"].includes(name.toLowerCase())));
101
+ return yield* options.transport === "xhr" ? xhrTransfer(target, method, safeHeaders, body, (sent) => input.onProgress?.({
102
+ phase: "uploading",
103
+ bytesSent: offset + sent,
104
+ bytesAccepted: accepted,
105
+ totalBytes: input.file.size,
106
+ measurement: "xhr"
107
+ })) : fetchTransfer(target, method, safeHeaders, body);
108
+ });
109
+ const notify = () => emit(input.onProgress, {
110
+ phase: "uploading",
111
+ bytesAccepted: accepted,
112
+ totalBytes: input.file.size,
113
+ measurement: "provider-accepted"
114
+ });
115
+ const parts = [];
116
+ yield* emit(input.onProgress, {
117
+ phase: "uploading",
118
+ bytesAccepted: 0,
119
+ totalBytes: input.file.size,
120
+ measurement: "indeterminate"
121
+ });
122
+ if (grant._tag === "Proxy") {
123
+ const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};
124
+ const response = yield* Effect.tryPromise({
125
+ try: (signal) => fetch(`${base}${path(id)}/content`, {
126
+ method: "PUT",
127
+ credentials: options.credentials ?? "same-origin",
128
+ headers: {
129
+ ...headers,
130
+ "content-type": input.file.type || "application/octet-stream"
131
+ },
132
+ body: input.file,
133
+ signal,
134
+ redirect: "error"
135
+ }),
136
+ catch: () => failUpload("Unavailable")
137
+ });
138
+ yield* Effect.tryPromise({
139
+ try: async () => {
140
+ await response.body?.cancel();
141
+ },
142
+ catch: () => failUpload("Unavailable")
143
+ });
144
+ yield* successful(response);
145
+ accepted = input.file.size;
146
+ } else if (grant._tag === "SignedRequest") {
147
+ yield* successful(yield* send(grant.url, grant.method, grant.headers, input.file, 0));
148
+ accepted = input.file.size;
149
+ } else if (grant._tag === "PostForm") {
150
+ const form = new FormData();
151
+ for (const [key, value] of Object.entries(grant.fields)) form.append(key, value);
152
+ form.append("file", input.file);
153
+ yield* successful(yield* send(grant.url, "POST", {}, form, 0));
154
+ accepted = input.file.size;
155
+ } else if (grant._tag === "Multipart" || grant._tag === "Blocks") {
156
+ const count = Math.ceil(input.file.size / grant.partBytes);
157
+ if (count > 1e4 || count < 1) return yield* failUpload("BadRequest");
158
+ for (let partNumber = 1; partNumber <= count; partNumber++) {
159
+ const offset = (partNumber - 1) * grant.partBytes;
160
+ const size = Math.min(grant.partBytes, input.file.size - offset);
161
+ const done = grant._tag === "Multipart" ? grant.completed.find((part) => part.partNumber === partNumber) : void 0;
162
+ if (done) {
163
+ parts.push({
164
+ partNumber: done.partNumber,
165
+ receipt: done.etag
166
+ });
167
+ accepted += size;
168
+ continue;
169
+ }
170
+ const selected = (yield* api("POST", `${path(id)}/parts/sign`, GrantResponse, {
171
+ partNumber,
172
+ ...grant._tag === "Multipart" && grant.checksum === "sha256" ? { sha256: yield* hashFile(input.file.slice(offset, offset + size)) } : {}
173
+ })).grant;
174
+ if (selected._tag !== "SignedRequest") return yield* failUpload("BadRequest");
175
+ const response = yield* send(selected.url, selected.method, selected.headers, input.file.slice(offset, offset + size), offset);
176
+ yield* successful(response);
177
+ const etag = selected.partReceipt ?? response.headers.get("etag");
178
+ if (!etag) return yield* failUpload("Unsupported");
179
+ parts.push({
180
+ partNumber,
181
+ receipt: etag
182
+ });
183
+ accepted += size;
184
+ yield* notify();
185
+ }
186
+ } else {
187
+ if (grant.offset > input.file.size) return yield* failUpload("BadRequest");
188
+ accepted = grant.offset;
189
+ for (let attempt = 0; accepted < input.file.size && attempt < 1e5; attempt++) {
190
+ const end = Math.min(accepted + grant.chunkBytes, input.file.size);
191
+ const headers = grant.protocol === "gcs" ? {
192
+ ...grant.headers,
193
+ "content-range": `bytes ${accepted}-${end - 1}/${input.file.size}`
194
+ } : {
195
+ ...grant.headers,
196
+ "tus-resumable": "1.0.0",
197
+ "upload-offset": String(accepted),
198
+ "content-type": "application/offset+octet-stream"
199
+ };
200
+ const response = yield* send(grant.url, grant.protocol === "gcs" ? "PUT" : "PATCH", headers, input.file.slice(accepted, end), accepted);
201
+ if (response.status !== 308) yield* successful(response);
202
+ const observed = (yield* api("POST", `${path(id)}/grants`, GrantResponse)).grant;
203
+ if (observed._tag !== "Resumable" || observed.offset <= accepted || observed.offset > end) return yield* failUpload("Unavailable");
204
+ accepted = observed.offset;
205
+ grant = observed;
206
+ yield* notify();
207
+ }
208
+ if (accepted !== input.file.size) return yield* failUpload("Unavailable");
209
+ }
210
+ yield* notify();
211
+ return {
212
+ uploadId: id,
213
+ parts
214
+ };
215
+ }, bounded);
216
+ const complete = Effect.fnUntraced(function* (input) {
217
+ const result = yield* api("POST", `${path(input.uploadId)}/complete`, UploadStatus, input.parts?.length ? { parts: input.parts } : {});
218
+ if (result.state === "published") {
219
+ const local = yield* store.read(input.uploadId);
220
+ yield* store.remove(input.uploadId);
221
+ if (local) yield* store.remove(local.idempotencyKey);
222
+ yield* emit(input.onProgress, {
223
+ phase: "completed",
224
+ bytesAccepted: local?.input.file.size ?? 0,
225
+ totalBytes: local?.input.file.size ?? 0,
226
+ measurement: "provider-accepted"
227
+ });
228
+ }
229
+ return result;
230
+ });
231
+ const create = Effect.fnUntraced(function* (input) {
232
+ const metadata = yield* decode(UploadInput, {
233
+ purpose: input.purpose,
234
+ file: {
235
+ name: input.file.name,
236
+ size: input.file.size,
237
+ contentType: input.file.type || "application/octet-stream",
238
+ sha256: yield* hashFile(input.file, input.onProgress)
239
+ },
240
+ context: input.context,
241
+ ...input.strategy ? { strategy: input.strategy } : {}
242
+ });
243
+ const key = input.idempotencyKey ?? crypto.randomUUID();
244
+ const local = {
245
+ version: 1,
246
+ idempotencyKey: key,
247
+ input: metadata
248
+ };
249
+ yield* store.write(key, local);
250
+ yield* emit(input.onProgress, {
251
+ phase: "authorizing",
252
+ bytesAccepted: 0,
253
+ totalBytes: input.file.size,
254
+ measurement: "indeterminate"
255
+ });
256
+ const status = yield* api("POST", "/uploads", UploadStatus, {
257
+ version: 1,
258
+ idempotencyKey: key,
259
+ input: metadata
260
+ });
261
+ const saved = {
262
+ ...local,
263
+ id: status.id
264
+ };
265
+ yield* store.write(key, saved);
266
+ yield* store.write(status.id, saved);
267
+ return saved;
268
+ }, bounded);
269
+ return {
270
+ create,
271
+ transfer,
272
+ complete,
273
+ status: (input) => api("GET", path(input.uploadId), UploadStatus),
274
+ abort: (input) => api("DELETE", path(input.uploadId), UploadStatus),
275
+ reconcile: (input) => api("POST", `${path(input.uploadId)}/reconcile`, UploadStatus),
276
+ upload: (input) => Effect.gen(function* () {
277
+ const saved = yield* create(input);
278
+ const sent = yield* transfer({
279
+ uploadId: saved.id,
280
+ file: input.file,
281
+ ...input.onProgress ? { onProgress: input.onProgress } : {}
282
+ });
283
+ yield* emit(input.onProgress, {
284
+ phase: "verifying",
285
+ bytesAccepted: input.file.size,
286
+ totalBytes: input.file.size,
287
+ measurement: "provider-accepted"
288
+ });
289
+ return yield* complete({
290
+ ...sent,
291
+ ...input.onProgress ? { onProgress: input.onProgress } : {}
292
+ });
293
+ }).pipe(Effect.timeoutOrElse({
294
+ duration: deadline,
295
+ orElse: () => Effect.fail(failUpload("Unavailable"))
296
+ })),
297
+ resume: (input) => Effect.gen(function* () {
298
+ const record = yield* store.read(input.uploadId);
299
+ if (!record) return yield* failUpload("NotFound");
300
+ if (record.input.file.size !== input.file.size || record.input.file.name !== input.file.name || record.input.file.contentType !== (input.file.type || "application/octet-stream") || record.input.file.sha256 !== (yield* hashFile(input.file, input.onProgress))) return yield* failUpload("Conflict");
301
+ if (!record.id) yield* create({
302
+ file: input.file,
303
+ purpose: record.input.purpose,
304
+ context: record.input.context,
305
+ idempotencyKey: record.idempotencyKey,
306
+ ...record.input.strategy ? { strategy: record.input.strategy } : {}
307
+ });
308
+ const saved = yield* store.read(input.uploadId);
309
+ if (!saved?.id) return yield* failUpload("NotFound");
310
+ yield* ticket(saved.id, input.file, input.onProgress);
311
+ const status = yield* api("GET", path(saved.id), UploadStatus);
312
+ if (status.state === "published") return yield* complete({
313
+ uploadId: saved.id,
314
+ ...input.onProgress ? { onProgress: input.onProgress } : {}
315
+ });
316
+ if ([
317
+ "uploading",
318
+ "verifying",
319
+ "publishing"
320
+ ].includes(status.state)) {
321
+ const previous = yield* Effect.result(complete({
322
+ uploadId: saved.id,
323
+ ...input.onProgress ? { onProgress: input.onProgress } : {}
324
+ }));
325
+ if (previous._tag === "Success") return previous.success;
326
+ if (status.state !== "uploading" || previous.failure.code !== "Unavailable") return yield* previous.failure;
327
+ }
328
+ const sent = yield* transfer({
329
+ ...input,
330
+ uploadId: saved.id
331
+ });
332
+ return yield* complete({
333
+ ...sent,
334
+ ...input.onProgress ? { onProgress: input.onProgress } : {}
335
+ });
336
+ }).pipe(Effect.timeoutOrElse({
337
+ duration: deadline,
338
+ orElse: () => Effect.fail(failUpload("Unavailable"))
339
+ }))
340
+ };
341
+ });
342
+ var UploadClient = class UploadClient extends Context.Service()("@effect-kit/storage/UploadClient") {
343
+ static make = make;
344
+ static layer(options) {
345
+ return Layer.effect(UploadClient, make(options));
346
+ }
347
+ };
348
+
349
+ export { UploadClient, UploadClientStore };
350
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":[],"sources":["../src/client/index.ts"],"sourcesContent":["import { Context, Effect, Layer, Schedule, Schema } from \"effect\";\n\nimport {\n GrantResponse,\n UploadErrorCode,\n UploadInput,\n UploadStatus,\n failUpload,\n} from \"../uploads/schema.js\";\nimport { hashFile } from \"./fingerprint.js\";\nimport { UploadClientStore } from \"./store.js\";\nimport type { ClientUploadStore, UploadTicket } from \"./store.js\";\nimport { fetchTransfer, providerUrl, xhrTransfer } from \"./transport.js\";\nimport type { Progress } from \"./transport.js\";\nexport { UploadClientStore };\nexport type { ClientUploadStore, UploadTicket } from \"./store.js\";\nexport type { UploadProgress } from \"./transport.js\";\nexport type UploadProtocol = \"single\" | \"post\" | \"multipart\" | \"resumable\" | \"proxy\";\nexport interface UploadClientOptions<R = never> {\n readonly baseUrl: string;\n readonly credentials?: RequestCredentials;\n readonly headers?: () => Effect.Effect<\n Readonly<Record<string, string>>,\n ReturnType<typeof failUpload>,\n R\n >;\n readonly store?: ClientUploadStore;\n readonly transport?: \"fetch\" | \"xhr\";\n readonly deadlineMillis?: number;\n}\nconst decode = <S extends Schema.Constraint>(schema: S, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => failUpload(\"BadRequest\")));\nconst emit = (onProgress: Progress | undefined, value: Parameters<Progress>[0]) =>\n onProgress\n ? Effect.try({ try: () => onProgress(value), catch: () => failUpload(\"Unavailable\") })\n : Effect.void;\n\nconst path = (id: string) => `/uploads/${encodeURIComponent(id)}`;\n\nconst successful = (response: { readonly status: number }) =>\n response.status >= 200 && response.status < 300\n ? Effect.void\n : Effect.fail(\n failUpload(response.status === 401 || response.status === 403 ? \"Expired\" : \"Unavailable\"),\n );\n\nconst make = Effect.fnUntraced(function* <R>(options: UploadClientOptions<R>) {\n const context = yield* Effect.context<R>();\n const base = options.baseUrl.replace(/\\/$/u, \"\");\n const parsed = URL.parse(\n base,\n typeof location === \"undefined\" ? \"http://localhost\" : location.href,\n );\n if (\n !parsed ||\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash ||\n !(\n base.startsWith(\"/\") ||\n parsed.protocol === \"https:\" ||\n (parsed.protocol === \"http:\" && [\"localhost\", \"127.0.0.1\"].includes(parsed.hostname))\n )\n )\n return yield* failUpload(\"BadRequest\");\n const deadline = options.deadlineMillis ?? 30 * 60 * 1000;\n if (!Number.isSafeInteger(deadline) || deadline <= 0) return yield* failUpload(\"BadRequest\");\n const bounded = <A, E, Requirements>(effect: Effect.Effect<A, E, Requirements>) =>\n effect.pipe(\n Effect.timeoutOrElse({\n duration: deadline,\n orElse: () => Effect.fail(failUpload(\"Unavailable\")),\n }),\n );\n const store = options.store ?? UploadClientStore.memory();\n const api = Effect.fnUntraced(\n function* <S extends Schema.Constraint>(\n method: string,\n resourcePath: string,\n schema: S,\n body?: unknown,\n ) {\n const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};\n const response = yield* Effect.tryPromise({\n try: (signal) =>\n fetch(base + resourcePath, {\n method,\n credentials: options.credentials ?? \"same-origin\",\n redirect: \"error\",\n headers: {\n ...headers,\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal,\n }),\n catch: () => failUpload(\"Unavailable\"),\n });\n const value = yield* Effect.tryPromise({\n try: async (signal) => {\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"Missing response\");\n const cancel = () => {\n void reader.cancel().catch(() => undefined);\n };\n signal.addEventListener(\"abort\", cancel, { once: true });\n let text = \"\";\n const decoder = new TextDecoder();\n let bytes = 0;\n try {\n while (true) {\n // oxlint-disable-next-line no-await-in-loop -- Response bytes must be consumed in order under a size bound.\n const next = await reader.read();\n if (next.done) break;\n bytes += next.value.length;\n if (bytes > 1024 * 1024) throw new Error(\"Response limit\");\n text += decoder.decode(next.value, { stream: true });\n }\n if (signal.aborted) throw new Error(\"Request interrupted\");\n return JSON.parse(text + decoder.decode()) as unknown;\n } finally {\n signal.removeEventListener(\"abort\", cancel);\n await reader.cancel();\n reader.releaseLock();\n }\n },\n catch: () => failUpload(\"Unavailable\"),\n });\n if (!response.ok) {\n const error = yield* decode(Schema.Struct({ code: UploadErrorCode }), value);\n return yield* failUpload(error.code);\n }\n return yield* decode(schema, value);\n },\n Effect.retry({\n times: 2,\n schedule: Schedule.exponential(\"100 millis\"),\n while: (error) => error.code === \"Unavailable\",\n }),\n bounded,\n );\n const ticket = Effect.fnUntraced(function* (id: string, file: File, onProgress?: Progress) {\n const record = yield* store.read(id);\n if (!record || !record.id) return yield* failUpload(\"NotFound\");\n if (\n record.input.file.size !== file.size ||\n record.input.file.name !== file.name ||\n record.input.file.contentType !== (file.type || \"application/octet-stream\") ||\n record.input.file.sha256 !== (yield* hashFile(file, onProgress))\n )\n return yield* failUpload(\"Conflict\");\n return record;\n });\n const transfer = Effect.fnUntraced(function* (input: {\n readonly uploadId: string;\n readonly file: File;\n readonly onProgress?: Progress;\n readonly onProtocol?: (protocol: UploadProtocol, uploadId: string) => void;\n }) {\n const record = yield* ticket(input.uploadId, input.file, input.onProgress);\n const id = record.id;\n if (!id) return yield* failUpload(\"NotFound\");\n let grant = (yield* api(\"POST\", `${path(id)}/grants`, GrantResponse)).grant;\n const onProtocol = input.onProtocol;\n if (onProtocol)\n yield* Effect.try({\n try: () =>\n onProtocol(\n grant._tag === \"Multipart\" || grant._tag === \"Blocks\"\n ? \"multipart\"\n : grant._tag === \"Resumable\"\n ? \"resumable\"\n : grant._tag === \"PostForm\"\n ? \"post\"\n : grant._tag === \"Proxy\"\n ? \"proxy\"\n : \"single\",\n id,\n ),\n catch: () => failUpload(\"Unavailable\"),\n });\n let accepted = 0;\n const send = Effect.fnUntraced(function* (\n url: string,\n method: string,\n headers: Readonly<Record<string, string>>,\n body: Blob | FormData,\n offset: number,\n ) {\n const target = yield* providerUrl(url);\n const safeHeaders = Object.fromEntries(\n Object.entries(headers).filter(\n ([name]) => ![\"content-length\", \"host\"].includes(name.toLowerCase()),\n ),\n );\n return yield* options.transport === \"xhr\"\n ? xhrTransfer(target, method, safeHeaders, body, (sent) =>\n input.onProgress?.({\n phase: \"uploading\",\n bytesSent: offset + sent,\n bytesAccepted: accepted,\n totalBytes: input.file.size,\n measurement: \"xhr\",\n }),\n )\n : fetchTransfer(target, method, safeHeaders, body);\n });\n const notify = () =>\n emit(input.onProgress, {\n phase: \"uploading\",\n bytesAccepted: accepted,\n totalBytes: input.file.size,\n measurement: \"provider-accepted\",\n });\n const parts: Array<{ partNumber: number; receipt: string }> = [];\n yield* emit(input.onProgress, {\n phase: \"uploading\",\n bytesAccepted: 0,\n totalBytes: input.file.size,\n measurement: \"indeterminate\",\n });\n if (grant._tag === \"Proxy\") {\n const headers = options.headers ? yield* Effect.provide(options.headers(), context) : {};\n const response = yield* Effect.tryPromise({\n try: (signal) =>\n fetch(`${base}${path(id)}/content`, {\n method: \"PUT\",\n credentials: options.credentials ?? \"same-origin\",\n headers: { ...headers, \"content-type\": input.file.type || \"application/octet-stream\" },\n body: input.file,\n signal,\n redirect: \"error\",\n }),\n catch: () => failUpload(\"Unavailable\"),\n });\n yield* Effect.tryPromise({\n try: async () => {\n await response.body?.cancel();\n },\n catch: () => failUpload(\"Unavailable\"),\n });\n yield* successful(response);\n accepted = input.file.size;\n } else if (grant._tag === \"SignedRequest\") {\n yield* successful(yield* send(grant.url, grant.method, grant.headers, input.file, 0));\n accepted = input.file.size;\n } else if (grant._tag === \"PostForm\") {\n const form = new FormData();\n for (const [key, value] of Object.entries(grant.fields)) form.append(key, value);\n form.append(\"file\", input.file);\n yield* successful(yield* send(grant.url, \"POST\", {}, form, 0));\n accepted = input.file.size;\n } else if (grant._tag === \"Multipart\" || grant._tag === \"Blocks\") {\n const count = Math.ceil(input.file.size / grant.partBytes);\n if (count > 10000 || count < 1) return yield* failUpload(\"BadRequest\");\n for (let partNumber = 1; partNumber <= count; partNumber++) {\n const offset = (partNumber - 1) * grant.partBytes;\n const size = Math.min(grant.partBytes, input.file.size - offset);\n const done =\n grant._tag === \"Multipart\"\n ? grant.completed.find((part) => part.partNumber === partNumber)\n : undefined;\n if (done) {\n parts.push({ partNumber: done.partNumber, receipt: done.etag });\n accepted += size;\n continue;\n }\n const selected = (yield* api(\"POST\", `${path(id)}/parts/sign`, GrantResponse, {\n partNumber,\n ...(grant._tag === \"Multipart\" && grant.checksum === \"sha256\"\n ? { sha256: yield* hashFile(input.file.slice(offset, offset + size)) }\n : {}),\n })).grant;\n if (selected._tag !== \"SignedRequest\") return yield* failUpload(\"BadRequest\");\n const response = yield* send(\n selected.url,\n selected.method,\n selected.headers,\n input.file.slice(offset, offset + size),\n offset,\n );\n yield* successful(response);\n const etag = selected.partReceipt ?? response.headers.get(\"etag\");\n if (!etag) return yield* failUpload(\"Unsupported\");\n parts.push({ partNumber, receipt: etag });\n accepted += size;\n yield* notify();\n }\n } else {\n if (grant.offset > input.file.size) return yield* failUpload(\"BadRequest\");\n accepted = grant.offset;\n for (let attempt = 0; accepted < input.file.size && attempt < 100000; attempt++) {\n const end = Math.min(accepted + grant.chunkBytes, input.file.size);\n const headers =\n grant.protocol === \"gcs\"\n ? {\n ...grant.headers,\n \"content-range\": `bytes ${accepted}-${end - 1}/${input.file.size}`,\n }\n : {\n ...grant.headers,\n \"tus-resumable\": \"1.0.0\",\n \"upload-offset\": String(accepted),\n \"content-type\": \"application/offset+octet-stream\",\n };\n const response = yield* send(\n grant.url,\n grant.protocol === \"gcs\" ? \"PUT\" : \"PATCH\",\n headers,\n input.file.slice(accepted, end),\n accepted,\n );\n if (response.status !== 308) yield* successful(response);\n const observed = (yield* api(\"POST\", `${path(id)}/grants`, GrantResponse)).grant;\n if (observed._tag !== \"Resumable\" || observed.offset <= accepted || observed.offset > end)\n return yield* failUpload(\"Unavailable\");\n accepted = observed.offset;\n grant = observed;\n yield* notify();\n }\n if (accepted !== input.file.size) return yield* failUpload(\"Unavailable\");\n }\n yield* notify();\n return { uploadId: id, parts };\n }, bounded);\n const complete = Effect.fnUntraced(function* (input: {\n readonly uploadId: string;\n readonly parts?: ReadonlyArray<{ readonly partNumber: number; readonly receipt: string }>;\n readonly onProgress?: Progress;\n }) {\n const result = yield* api(\n \"POST\",\n `${path(input.uploadId)}/complete`,\n UploadStatus,\n input.parts?.length ? { parts: input.parts } : {},\n );\n if (result.state === \"published\") {\n const local = yield* store.read(input.uploadId);\n yield* store.remove(input.uploadId);\n if (local) yield* store.remove(local.idempotencyKey);\n yield* emit(input.onProgress, {\n phase: \"completed\",\n bytesAccepted: local?.input.file.size ?? 0,\n totalBytes: local?.input.file.size ?? 0,\n measurement: \"provider-accepted\",\n });\n }\n return result;\n });\n const create = Effect.fnUntraced(function* (input: {\n readonly file: File;\n readonly purpose: string;\n readonly context: Readonly<Record<string, string>>;\n readonly strategy?: UploadInput[\"strategy\"];\n readonly idempotencyKey?: string;\n readonly onProgress?: Progress;\n }) {\n const metadata = yield* decode(UploadInput, {\n purpose: input.purpose,\n file: {\n name: input.file.name,\n size: input.file.size,\n contentType: input.file.type || \"application/octet-stream\",\n sha256: yield* hashFile(input.file, input.onProgress),\n },\n context: input.context,\n ...(input.strategy ? { strategy: input.strategy } : {}),\n });\n const key = input.idempotencyKey ?? crypto.randomUUID();\n const local: UploadTicket = { version: 1, idempotencyKey: key, input: metadata };\n yield* store.write(key, local);\n yield* emit(input.onProgress, {\n phase: \"authorizing\",\n bytesAccepted: 0,\n totalBytes: input.file.size,\n measurement: \"indeterminate\",\n });\n const status = yield* api(\"POST\", \"/uploads\", UploadStatus, {\n version: 1,\n idempotencyKey: key,\n input: metadata,\n });\n const saved = { ...local, id: status.id };\n yield* store.write(key, saved);\n yield* store.write(status.id, saved);\n return saved;\n }, bounded);\n return {\n create,\n transfer,\n complete,\n status: (input: { readonly uploadId: string }) =>\n api(\"GET\", path(input.uploadId), UploadStatus),\n abort: (input: { readonly uploadId: string }) =>\n api(\"DELETE\", path(input.uploadId), UploadStatus),\n reconcile: (input: { readonly uploadId: string }) =>\n api(\"POST\", `${path(input.uploadId)}/reconcile`, UploadStatus),\n upload: (input: Parameters<typeof create>[0]) =>\n Effect.gen(function* () {\n const saved = yield* create(input);\n const sent = yield* transfer({\n uploadId: saved.id,\n file: input.file,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n yield* emit(input.onProgress, {\n phase: \"verifying\",\n bytesAccepted: input.file.size,\n totalBytes: input.file.size,\n measurement: \"provider-accepted\",\n });\n return yield* complete({\n ...sent,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n }).pipe(\n Effect.timeoutOrElse({\n duration: deadline,\n orElse: () => Effect.fail(failUpload(\"Unavailable\")),\n }),\n ),\n resume: (input: {\n readonly uploadId: string;\n readonly file: File;\n readonly onProgress?: Progress;\n readonly onProtocol?: (protocol: UploadProtocol, uploadId: string) => void;\n }) =>\n Effect.gen(function* () {\n const record = yield* store.read(input.uploadId);\n if (!record) return yield* failUpload(\"NotFound\");\n if (\n record.input.file.size !== input.file.size ||\n record.input.file.name !== input.file.name ||\n record.input.file.contentType !== (input.file.type || \"application/octet-stream\") ||\n record.input.file.sha256 !== (yield* hashFile(input.file, input.onProgress))\n )\n return yield* failUpload(\"Conflict\");\n if (!record.id)\n yield* create({\n file: input.file,\n purpose: record.input.purpose,\n context: record.input.context,\n idempotencyKey: record.idempotencyKey,\n ...(record.input.strategy ? { strategy: record.input.strategy } : {}),\n });\n const saved = yield* store.read(input.uploadId);\n if (!saved?.id) return yield* failUpload(\"NotFound\");\n yield* ticket(saved.id, input.file, input.onProgress);\n const status = yield* api(\"GET\", path(saved.id), UploadStatus);\n if (status.state === \"published\")\n return yield* complete({\n uploadId: saved.id,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n if ([\"uploading\", \"verifying\", \"publishing\"].includes(status.state)) {\n const previous = yield* Effect.result(\n complete({\n uploadId: saved.id,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n }),\n );\n if (previous._tag === \"Success\") return previous.success;\n if (status.state !== \"uploading\" || previous.failure.code !== \"Unavailable\")\n return yield* previous.failure;\n }\n const sent = yield* transfer({ ...input, uploadId: saved.id });\n return yield* complete({\n ...sent,\n ...(input.onProgress ? { onProgress: input.onProgress } : {}),\n });\n }).pipe(\n Effect.timeoutOrElse({\n duration: deadline,\n orElse: () => Effect.fail(failUpload(\"Unavailable\")),\n }),\n ),\n };\n});\nexport class UploadClient extends Context.Service<\n UploadClient,\n Effect.Success<ReturnType<typeof make>>\n>()(\"@effect-kit/storage/UploadClient\") {\n static readonly make = make;\n static layer<R>(options: UploadClientOptions<R>) {\n return Layer.effect(UploadClient, make(options));\n }\n}\n"],"mappings":";;;;;;;AA8BA,MAAM,UAAuC,QAAW,UACtD,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,eAAe,WAAW,YAAY,CAAC,CAAC;AAChG,MAAM,QAAQ,YAAkC,UAC9C,aACI,OAAO,IAAI;CAAE,WAAW,WAAW,KAAK;CAAG,aAAa,WAAW,aAAa;AAAE,CAAC,IACnF,OAAO;AAEb,MAAM,QAAQ,OAAe,YAAY,mBAAmB,EAAE;AAE9D,MAAM,cAAc,aAClB,SAAS,UAAU,OAAO,SAAS,SAAS,MACxC,OAAO,OACP,OAAO,KACL,WAAW,SAAS,WAAW,OAAO,SAAS,WAAW,MAAM,YAAY,aAAa,CAC3F;AAEN,MAAM,OAAO,OAAO,WAAW,WAAc,SAAiC;CAC5E,MAAM,UAAU,OAAO,OAAO,QAAW;CACzC,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;CAC/C,MAAM,SAAS,IAAI,MACjB,MACA,OAAO,aAAa,cAAc,qBAAqB,SAAS,IAClE;CACA,IACE,CAAC,UACD,OAAO,YACP,OAAO,YACP,OAAO,UACP,OAAO,QACP,EACE,KAAK,WAAW,GAAG,KACnB,OAAO,aAAa,YACnB,OAAO,aAAa,WAAW,CAAC,aAAa,WAAW,CAAC,CAAC,SAAS,OAAO,QAAQ,IAGrF,OAAO,OAAO,WAAW,YAAY;CACvC,MAAM,WAAW,QAAQ,kBAAkB;CAC3C,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,YAAY,GAAG,OAAO,OAAO,WAAW,YAAY;CAC3F,MAAM,WAA+B,WACnC,OAAO,KACL,OAAO,cAAc;EACnB,UAAU;EACV,cAAc,OAAO,KAAK,WAAW,aAAa,CAAC;CACrD,CAAC,CACH;CACF,MAAM,QAAQ,QAAQ,SAAS,kBAAkB,OAAO;CACxD,MAAM,MAAM,OAAO,WACjB,WACE,QACA,cACA,QACA,MACA;EACA,MAAM,UAAU,QAAQ,UAAU,OAAO,OAAO,QAAQ,QAAQ,QAAQ,GAAG,OAAO,IAAI,CAAC;EACvF,MAAM,WAAW,OAAO,OAAO,WAAW;GACxC,MAAM,WACJ,MAAM,OAAO,cAAc;IACzB;IACA,aAAa,QAAQ,eAAe;IACpC,UAAU;IACV,SAAS;KACP,GAAG;KACH,GAAI,SAAS,SAAY,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;IACrE;IACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;IAC3D;GACF,CAAC;GACH,aAAa,WAAW,aAAa;EACvC,CAAC;EACD,MAAM,QAAQ,OAAO,OAAO,WAAW;GACrC,KAAK,OAAO,WAAW;IACrB,MAAM,SAAS,SAAS,MAAM,UAAU;IACxC,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,kBAAkB;IAC/C,MAAM,eAAe;KACnB,AAAK,OAAO,OAAO,CAAC,CAAC,YAAY,MAAS;IAC5C;IACA,OAAO,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;IACvD,IAAI,OAAO;IACX,MAAM,UAAU,IAAI,YAAY;IAChC,IAAI,QAAQ;IACZ,IAAI;KACF,OAAO,MAAM;MAEX,MAAM,OAAO,MAAM,OAAO,KAAK;MAC/B,IAAI,KAAK,MAAM;MACf,SAAS,KAAK,MAAM;MACpB,IAAI,QAAQ,SAAa,MAAM,IAAI,MAAM,gBAAgB;MACzD,QAAQ,QAAQ,OAAO,KAAK,OAAO,EAAE,QAAQ,KAAK,CAAC;KACrD;KACA,IAAI,OAAO,SAAS,MAAM,IAAI,MAAM,qBAAqB;KACzD,OAAO,KAAK,MAAM,OAAO,QAAQ,OAAO,CAAC;IAC3C,UAAU;KACR,OAAO,oBAAoB,SAAS,MAAM;KAC1C,MAAM,OAAO,OAAO;KACpB,OAAO,YAAY;IACrB;GACF;GACA,aAAa,WAAW,aAAa;EACvC,CAAC;EACD,IAAI,CAAC,SAAS,IAAI;GAChB,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,EAAE,MAAM,gBAAgB,CAAC,GAAG,KAAK;GAC3E,OAAO,OAAO,WAAW,MAAM,IAAI;EACrC;EACA,OAAO,OAAO,OAAO,QAAQ,KAAK;CACpC,GACA,OAAO,MAAM;EACX,OAAO;EACP,UAAU,SAAS,YAAY,YAAY;EAC3C,QAAQ,UAAU,MAAM,SAAS;CACnC,CAAC,GACD,OACF;CACA,MAAM,SAAS,OAAO,WAAW,WAAW,IAAY,MAAY,YAAuB;EACzF,MAAM,SAAS,OAAO,MAAM,KAAK,EAAE;EACnC,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO,OAAO,WAAW,UAAU;EAC9D,IACE,OAAO,MAAM,KAAK,SAAS,KAAK,QAChC,OAAO,MAAM,KAAK,SAAS,KAAK,QAChC,OAAO,MAAM,KAAK,iBAAiB,KAAK,QAAQ,+BAChD,OAAO,MAAM,KAAK,YAAY,OAAO,SAAS,MAAM,UAAU,IAE9D,OAAO,OAAO,WAAW,UAAU;EACrC,OAAO;CACT,CAAC;CACD,MAAM,WAAW,OAAO,WAAW,WAAW,OAK3C;EAED,MAAM,MAAK,OADW,OAAO,MAAM,UAAU,MAAM,MAAM,MAAM,UAAU,EACxD,CAAC;EAClB,IAAI,CAAC,IAAI,OAAO,OAAO,WAAW,UAAU;EAC5C,IAAI,SAAS,OAAO,IAAI,QAAQ,GAAG,KAAK,EAAE,EAAE,UAAU,aAAa,EAAC,CAAE;EACtE,MAAM,aAAa,MAAM;EACzB,IAAI,YACF,OAAO,OAAO,IAAI;GAChB,WACE,WACE,MAAM,SAAS,eAAe,MAAM,SAAS,WACzC,cACA,MAAM,SAAS,cACb,cACA,MAAM,SAAS,aACb,SACA,MAAM,SAAS,UACb,UACA,UACV,EACF;GACF,aAAa,WAAW,aAAa;EACvC,CAAC;EACH,IAAI,WAAW;EACf,MAAM,OAAO,OAAO,WAAW,WAC7B,KACA,QACA,SACA,MACA,QACA;GACA,MAAM,SAAS,OAAO,YAAY,GAAG;GACrC,MAAM,cAAc,OAAO,YACzB,OAAO,QAAQ,OAAO,CAAC,CAAC,QACrB,CAAC,UAAU,CAAC,CAAC,kBAAkB,MAAM,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,CACrE,CACF;GACA,OAAO,OAAO,QAAQ,cAAc,QAChC,YAAY,QAAQ,QAAQ,aAAa,OAAO,SAC9C,MAAM,aAAa;IACjB,OAAO;IACP,WAAW,SAAS;IACpB,eAAe;IACf,YAAY,MAAM,KAAK;IACvB,aAAa;GACf,CAAC,CACH,IACA,cAAc,QAAQ,QAAQ,aAAa,IAAI;EACrD,CAAC;EACD,MAAM,eACJ,KAAK,MAAM,YAAY;GACrB,OAAO;GACP,eAAe;GACf,YAAY,MAAM,KAAK;GACvB,aAAa;EACf,CAAC;EACH,MAAM,QAAwD,CAAC;EAC/D,OAAO,KAAK,MAAM,YAAY;GAC5B,OAAO;GACP,eAAe;GACf,YAAY,MAAM,KAAK;GACvB,aAAa;EACf,CAAC;EACD,IAAI,MAAM,SAAS,SAAS;GAC1B,MAAM,UAAU,QAAQ,UAAU,OAAO,OAAO,QAAQ,QAAQ,QAAQ,GAAG,OAAO,IAAI,CAAC;GACvF,MAAM,WAAW,OAAO,OAAO,WAAW;IACxC,MAAM,WACJ,MAAM,GAAG,OAAO,KAAK,EAAE,EAAE,WAAW;KAClC,QAAQ;KACR,aAAa,QAAQ,eAAe;KACpC,SAAS;MAAE,GAAG;MAAS,gBAAgB,MAAM,KAAK,QAAQ;KAA2B;KACrF,MAAM,MAAM;KACZ;KACA,UAAU;IACZ,CAAC;IACH,aAAa,WAAW,aAAa;GACvC,CAAC;GACD,OAAO,OAAO,WAAW;IACvB,KAAK,YAAY;KACf,MAAM,SAAS,MAAM,OAAO;IAC9B;IACA,aAAa,WAAW,aAAa;GACvC,CAAC;GACD,OAAO,WAAW,QAAQ;GAC1B,WAAW,MAAM,KAAK;EACxB,OAAO,IAAI,MAAM,SAAS,iBAAiB;GACzC,OAAO,WAAW,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM,SAAS,MAAM,MAAM,CAAC,CAAC;GACpF,WAAW,MAAM,KAAK;EACxB,OAAO,IAAI,MAAM,SAAS,YAAY;GACpC,MAAM,OAAO,IAAI,SAAS;GAC1B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,MAAM,GAAG,KAAK,OAAO,KAAK,KAAK;GAC/E,KAAK,OAAO,QAAQ,MAAM,IAAI;GAC9B,OAAO,WAAW,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC;GAC7D,WAAW,MAAM,KAAK;EACxB,OAAO,IAAI,MAAM,SAAS,eAAe,MAAM,SAAS,UAAU;GAChE,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,OAAO,MAAM,SAAS;GACzD,IAAI,QAAQ,OAAS,QAAQ,GAAG,OAAO,OAAO,WAAW,YAAY;GACrE,KAAK,IAAI,aAAa,GAAG,cAAc,OAAO,cAAc;IAC1D,MAAM,UAAU,aAAa,KAAK,MAAM;IACxC,MAAM,OAAO,KAAK,IAAI,MAAM,WAAW,MAAM,KAAK,OAAO,MAAM;IAC/D,MAAM,OACJ,MAAM,SAAS,cACX,MAAM,UAAU,MAAM,SAAS,KAAK,eAAe,UAAU,IAC7D;IACN,IAAI,MAAM;KACR,MAAM,KAAK;MAAE,YAAY,KAAK;MAAY,SAAS,KAAK;KAAK,CAAC;KAC9D,YAAY;KACZ;IACF;IACA,MAAM,YAAY,OAAO,IAAI,QAAQ,GAAG,KAAK,EAAE,EAAE,cAAc,eAAe;KAC5E;KACA,GAAI,MAAM,SAAS,eAAe,MAAM,aAAa,WACjD,EAAE,QAAQ,OAAO,SAAS,MAAM,KAAK,MAAM,QAAQ,SAAS,IAAI,CAAC,EAAE,IACnE,CAAC;IACP,CAAC,EAAC,CAAE;IACJ,IAAI,SAAS,SAAS,iBAAiB,OAAO,OAAO,WAAW,YAAY;IAC5E,MAAM,WAAW,OAAO,KACtB,SAAS,KACT,SAAS,QACT,SAAS,SACT,MAAM,KAAK,MAAM,QAAQ,SAAS,IAAI,GACtC,MACF;IACA,OAAO,WAAW,QAAQ;IAC1B,MAAM,OAAO,SAAS,eAAe,SAAS,QAAQ,IAAI,MAAM;IAChE,IAAI,CAAC,MAAM,OAAO,OAAO,WAAW,aAAa;IACjD,MAAM,KAAK;KAAE;KAAY,SAAS;IAAK,CAAC;IACxC,YAAY;IACZ,OAAO,OAAO;GAChB;EACF,OAAO;GACL,IAAI,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO,OAAO,WAAW,YAAY;GACzE,WAAW,MAAM;GACjB,KAAK,IAAI,UAAU,GAAG,WAAW,MAAM,KAAK,QAAQ,UAAU,KAAQ,WAAW;IAC/E,MAAM,MAAM,KAAK,IAAI,WAAW,MAAM,YAAY,MAAM,KAAK,IAAI;IACjE,MAAM,UACJ,MAAM,aAAa,QACf;KACE,GAAG,MAAM;KACT,iBAAiB,SAAS,SAAS,GAAG,MAAM,EAAE,GAAG,MAAM,KAAK;IAC9D,IACA;KACE,GAAG,MAAM;KACT,iBAAiB;KACjB,iBAAiB,OAAO,QAAQ;KAChC,gBAAgB;IAClB;IACN,MAAM,WAAW,OAAO,KACtB,MAAM,KACN,MAAM,aAAa,QAAQ,QAAQ,SACnC,SACA,MAAM,KAAK,MAAM,UAAU,GAAG,GAC9B,QACF;IACA,IAAI,SAAS,WAAW,KAAK,OAAO,WAAW,QAAQ;IACvD,MAAM,YAAY,OAAO,IAAI,QAAQ,GAAG,KAAK,EAAE,EAAE,UAAU,aAAa,EAAC,CAAE;IAC3E,IAAI,SAAS,SAAS,eAAe,SAAS,UAAU,YAAY,SAAS,SAAS,KACpF,OAAO,OAAO,WAAW,aAAa;IACxC,WAAW,SAAS;IACpB,QAAQ;IACR,OAAO,OAAO;GAChB;GACA,IAAI,aAAa,MAAM,KAAK,MAAM,OAAO,OAAO,WAAW,aAAa;EAC1E;EACA,OAAO,OAAO;EACd,OAAO;GAAE,UAAU;GAAI;EAAM;CAC/B,GAAG,OAAO;CACV,MAAM,WAAW,OAAO,WAAW,WAAW,OAI3C;EACD,MAAM,SAAS,OAAO,IACpB,QACA,GAAG,KAAK,MAAM,QAAQ,EAAE,YACxB,cACA,MAAM,OAAO,SAAS,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC,CAClD;EACA,IAAI,OAAO,UAAU,aAAa;GAChC,MAAM,QAAQ,OAAO,MAAM,KAAK,MAAM,QAAQ;GAC9C,OAAO,MAAM,OAAO,MAAM,QAAQ;GAClC,IAAI,OAAO,OAAO,MAAM,OAAO,MAAM,cAAc;GACnD,OAAO,KAAK,MAAM,YAAY;IAC5B,OAAO;IACP,eAAe,OAAO,MAAM,KAAK,QAAQ;IACzC,YAAY,OAAO,MAAM,KAAK,QAAQ;IACtC,aAAa;GACf,CAAC;EACH;EACA,OAAO;CACT,CAAC;CACD,MAAM,SAAS,OAAO,WAAW,WAAW,OAOzC;EACD,MAAM,WAAW,OAAO,OAAO,aAAa;GAC1C,SAAS,MAAM;GACf,MAAM;IACJ,MAAM,MAAM,KAAK;IACjB,MAAM,MAAM,KAAK;IACjB,aAAa,MAAM,KAAK,QAAQ;IAChC,QAAQ,OAAO,SAAS,MAAM,MAAM,MAAM,UAAU;GACtD;GACA,SAAS,MAAM;GACf,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;EACvD,CAAC;EACD,MAAM,MAAM,MAAM,kBAAkB,OAAO,WAAW;EACtD,MAAM,QAAsB;GAAE,SAAS;GAAG,gBAAgB;GAAK,OAAO;EAAS;EAC/E,OAAO,MAAM,MAAM,KAAK,KAAK;EAC7B,OAAO,KAAK,MAAM,YAAY;GAC5B,OAAO;GACP,eAAe;GACf,YAAY,MAAM,KAAK;GACvB,aAAa;EACf,CAAC;EACD,MAAM,SAAS,OAAO,IAAI,QAAQ,YAAY,cAAc;GAC1D,SAAS;GACT,gBAAgB;GAChB,OAAO;EACT,CAAC;EACD,MAAM,QAAQ;GAAE,GAAG;GAAO,IAAI,OAAO;EAAG;EACxC,OAAO,MAAM,MAAM,KAAK,KAAK;EAC7B,OAAO,MAAM,MAAM,OAAO,IAAI,KAAK;EACnC,OAAO;CACT,GAAG,OAAO;CACV,OAAO;EACL;EACA;EACA;EACA,SAAS,UACP,IAAI,OAAO,KAAK,MAAM,QAAQ,GAAG,YAAY;EAC/C,QAAQ,UACN,IAAI,UAAU,KAAK,MAAM,QAAQ,GAAG,YAAY;EAClD,YAAY,UACV,IAAI,QAAQ,GAAG,KAAK,MAAM,QAAQ,EAAE,aAAa,YAAY;EAC/D,SAAS,UACP,OAAO,IAAI,aAAa;GACtB,MAAM,QAAQ,OAAO,OAAO,KAAK;GACjC,MAAM,OAAO,OAAO,SAAS;IAC3B,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;GAC7D,CAAC;GACD,OAAO,KAAK,MAAM,YAAY;IAC5B,OAAO;IACP,eAAe,MAAM,KAAK;IAC1B,YAAY,MAAM,KAAK;IACvB,aAAa;GACf,CAAC;GACD,OAAO,OAAO,SAAS;IACrB,GAAG;IACH,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;GAC7D,CAAC;EACH,CAAC,CAAC,CAAC,KACD,OAAO,cAAc;GACnB,UAAU;GACV,cAAc,OAAO,KAAK,WAAW,aAAa,CAAC;EACrD,CAAC,CACH;EACF,SAAS,UAMP,OAAO,IAAI,aAAa;GACtB,MAAM,SAAS,OAAO,MAAM,KAAK,MAAM,QAAQ;GAC/C,IAAI,CAAC,QAAQ,OAAO,OAAO,WAAW,UAAU;GAChD,IACE,OAAO,MAAM,KAAK,SAAS,MAAM,KAAK,QACtC,OAAO,MAAM,KAAK,SAAS,MAAM,KAAK,QACtC,OAAO,MAAM,KAAK,iBAAiB,MAAM,KAAK,QAAQ,+BACtD,OAAO,MAAM,KAAK,YAAY,OAAO,SAAS,MAAM,MAAM,MAAM,UAAU,IAE1E,OAAO,OAAO,WAAW,UAAU;GACrC,IAAI,CAAC,OAAO,IACV,OAAO,OAAO;IACZ,MAAM,MAAM;IACZ,SAAS,OAAO,MAAM;IACtB,SAAS,OAAO,MAAM;IACtB,gBAAgB,OAAO;IACvB,GAAI,OAAO,MAAM,WAAW,EAAE,UAAU,OAAO,MAAM,SAAS,IAAI,CAAC;GACrE,CAAC;GACH,MAAM,QAAQ,OAAO,MAAM,KAAK,MAAM,QAAQ;GAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,WAAW,UAAU;GACnD,OAAO,OAAO,MAAM,IAAI,MAAM,MAAM,MAAM,UAAU;GACpD,MAAM,SAAS,OAAO,IAAI,OAAO,KAAK,MAAM,EAAE,GAAG,YAAY;GAC7D,IAAI,OAAO,UAAU,aACnB,OAAO,OAAO,SAAS;IACrB,UAAU,MAAM;IAChB,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;GAC7D,CAAC;GACH,IAAI;IAAC;IAAa;IAAa;GAAY,CAAC,CAAC,SAAS,OAAO,KAAK,GAAG;IACnE,MAAM,WAAW,OAAO,OAAO,OAC7B,SAAS;KACP,UAAU,MAAM;KAChB,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;IAC7D,CAAC,CACH;IACA,IAAI,SAAS,SAAS,WAAW,OAAO,SAAS;IACjD,IAAI,OAAO,UAAU,eAAe,SAAS,QAAQ,SAAS,eAC5D,OAAO,OAAO,SAAS;GAC3B;GACA,MAAM,OAAO,OAAO,SAAS;IAAE,GAAG;IAAO,UAAU,MAAM;GAAG,CAAC;GAC7D,OAAO,OAAO,SAAS;IACrB,GAAG;IACH,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;GAC7D,CAAC;EACH,CAAC,CAAC,CAAC,KACD,OAAO,cAAc;GACnB,UAAU;GACV,cAAc,OAAO,KAAK,WAAW,aAAa,CAAC;EACrD,CAAC,CACH;CACJ;AACF,CAAC;AACD,IAAa,eAAb,MAAa,qBAAqB,QAAQ,QAGxC,CAAC,CAAC,kCAAkC,CAAC,CAAC;CACtC,OAAgB,OAAO;CACvB,OAAO,MAAS,SAAiC;EAC/C,OAAO,MAAM,OAAO,cAAc,KAAK,OAAO,CAAC;CACjD;AACF"}
@@ -0,0 +1,22 @@
1
+ import { Storage } from "../core/storage.js";
2
+ import { TransferDriver } from "../transfers/dependencies.js";
3
+ import { Context, Effect, Layer } from "effect";
4
+
5
+ // src/composition/layer.ts
6
+ /** Facades expose only the capabilities they enforce. Native protocol/admin services stay private. */
7
+ const storageLayer = (make) => Layer.effectContext(Effect.gen(function* () {
8
+ const previous = yield* TransferDriver;
9
+ const storage = yield* make;
10
+ const context = Context.make(Storage, storage);
11
+ return Context.add(context, TransferDriver, {
12
+ storage,
13
+ underlyingStoreId: previous.underlyingStoreId ?? previous.storage.storeId,
14
+ ...previous.underlyingStoreIds ? { underlyingStoreIds: previous.underlyingStoreIds } : {},
15
+ maximumObjectBytes: previous.maximumObjectBytes,
16
+ maximumSingleUploadBytes: previous.maximumSingleUploadBytes,
17
+ transportOverheadBytes: previous.transportOverheadBytes
18
+ });
19
+ }));
20
+
21
+ export { storageLayer };
22
+ //# sourceMappingURL=layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.js","names":[],"sources":["../../src/composition/layer.ts"],"sourcesContent":["import { Context, Effect, Layer } from \"effect\";\n\nimport { Storage } from \"../core/storage.js\";\nimport type { StorageService } from \"../core/storage.js\";\nimport { TransferDriver } from \"../transfers/dependencies.js\";\n\n/** Facades expose only the capabilities they enforce. Native protocol/admin services stay private. */\nexport const storageLayer = <E, R>(make: Effect.Effect<StorageService, E, R>) =>\n Layer.effectContext(\n Effect.gen(function* () {\n const previous = yield* TransferDriver;\n const storage = yield* make;\n const context = Context.make(Storage, storage);\n\n return Context.add(context, TransferDriver, {\n storage,\n underlyingStoreId: previous.underlyingStoreId ?? previous.storage.storeId,\n ...(previous.underlyingStoreIds ? { underlyingStoreIds: previous.underlyingStoreIds } : {}),\n maximumObjectBytes: previous.maximumObjectBytes,\n maximumSingleUploadBytes: previous.maximumSingleUploadBytes,\n transportOverheadBytes: previous.transportOverheadBytes,\n });\n }),\n );\n"],"mappings":";;;;;;AAOA,MAAa,gBAAsB,SACjC,MAAM,cACJ,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO;CACxB,MAAM,UAAU,OAAO;CACvB,MAAM,UAAU,QAAQ,KAAK,SAAS,OAAO;CAE7C,OAAO,QAAQ,IAAI,SAAS,gBAAgB;EAC1C;EACA,mBAAmB,SAAS,qBAAqB,SAAS,QAAQ;EAClE,GAAI,SAAS,qBAAqB,EAAE,oBAAoB,SAAS,mBAAmB,IAAI,CAAC;EACzF,oBAAoB,SAAS;EAC7B,0BAA0B,SAAS;EACnC,wBAAwB,SAAS;CACnC,CAAC;AACH,CAAC,CACH"}
@@ -0,0 +1,46 @@
1
+ import { sha256 } from "../../runtime/portable-hash.js";
2
+ import { storageError } from "../../core/errors.js";
3
+ import { Effect, FileSystem, Path, Sink, Stream } from "effect";
4
+
5
+ // src/composition/representation/staging.ts
6
+ /** Scoped files bound staging without collecting object bytes in memory. */
7
+ const makeStaging = Effect.gen(function* () {
8
+ const fs = yield* FileSystem.FileSystem;
9
+ const path = yield* Path.Path;
10
+ return Effect.fnUntraced(function* (body, maximum) {
11
+ const directory = yield* fs.makeTempDirectoryScoped().pipe(Effect.mapError(() => storageError("stage", "representation", {
12
+ _tag: "ProviderFailure",
13
+ code: "TemporaryDirectory"
14
+ })));
15
+ const filename = path.join(directory, "object");
16
+ const hash = sha256.create();
17
+ let size = 0;
18
+ yield* body.pipe(Stream.tap((chunk) => Effect.suspend(() => {
19
+ size += chunk.length;
20
+ if (size > maximum) return Effect.fail(storageError("stage", "representation", {
21
+ _tag: "LimitExceeded",
22
+ limit: maximum
23
+ }));
24
+ hash.update(chunk);
25
+ return Effect.void;
26
+ })), Stream.run(fs.sink(filename, { mode: 384 }).pipe(Sink.mapError(() => storageError("stage", "representation", {
27
+ _tag: "ProviderFailure",
28
+ code: "TemporaryFile"
29
+ })))));
30
+ return {
31
+ path: filename,
32
+ size,
33
+ checksum: hash.finish(),
34
+ stream: (offset = 0) => fs.stream(filename, {
35
+ offset,
36
+ chunkSize: 65536
37
+ }).pipe(Stream.mapError(() => storageError("stage", "representation", {
38
+ _tag: "ProviderFailure",
39
+ code: "TemporaryRead"
40
+ })))
41
+ };
42
+ });
43
+ });
44
+
45
+ export { makeStaging };
46
+ //# sourceMappingURL=staging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staging.js","names":[],"sources":["../../../src/composition/representation/staging.ts"],"sourcesContent":["import { Effect, FileSystem, Path, Sink, Stream } from \"effect\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { sha256 } from \"../../runtime/portable-hash.js\";\n\n/** Scoped files bound staging without collecting object bytes in memory. */\nexport const makeStaging = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return Effect.fnUntraced(function* <E, R>(\n body: Stream.Stream<Uint8Array, E, R>,\n maximum: number,\n ) {\n const directory = yield* fs.makeTempDirectoryScoped().pipe(\n Effect.mapError(() =>\n storageError(\"stage\", \"representation\", {\n _tag: \"ProviderFailure\",\n code: \"TemporaryDirectory\",\n }),\n ),\n );\n const filename = path.join(directory, \"object\");\n const hash = sha256.create();\n let size = 0;\n yield* body.pipe(\n Stream.tap((chunk) =>\n Effect.suspend(() => {\n size += chunk.length;\n if (size > maximum)\n return Effect.fail(\n storageError(\"stage\", \"representation\", { _tag: \"LimitExceeded\", limit: maximum }),\n );\n hash.update(chunk);\n return Effect.void;\n }),\n ),\n Stream.run(\n fs.sink(filename, { mode: 0o600 }).pipe(\n Sink.mapError(() =>\n storageError(\"stage\", \"representation\", {\n _tag: \"ProviderFailure\",\n code: \"TemporaryFile\",\n }),\n ),\n ),\n ),\n );\n return {\n path: filename,\n size,\n checksum: hash.finish(),\n stream: (offset = 0) =>\n fs.stream(filename, { offset, chunkSize: 65536 }).pipe(\n Stream.mapError(() =>\n storageError(\"stage\", \"representation\", {\n _tag: \"ProviderFailure\",\n code: \"TemporaryRead\",\n }),\n ),\n ),\n };\n });\n});\n"],"mappings":";;;;;;AAMA,MAAa,cAAc,OAAO,IAAI,aAAa;CACjD,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,OAAO,OAAO,KAAK;CACzB,OAAO,OAAO,WAAW,WACvB,MACA,SACA;EACA,MAAM,YAAY,OAAO,GAAG,wBAAwB,CAAC,CAAC,KACpD,OAAO,eACL,aAAa,SAAS,kBAAkB;GACtC,MAAM;GACN,MAAM;EACR,CAAC,CACH,CACF;EACA,MAAM,WAAW,KAAK,KAAK,WAAW,QAAQ;EAC9C,MAAM,OAAO,OAAO,OAAO;EAC3B,IAAI,OAAO;EACX,OAAO,KAAK,KACV,OAAO,KAAK,UACV,OAAO,cAAc;GACnB,QAAQ,MAAM;GACd,IAAI,OAAO,SACT,OAAO,OAAO,KACZ,aAAa,SAAS,kBAAkB;IAAE,MAAM;IAAiB,OAAO;GAAQ,CAAC,CACnF;GACF,KAAK,OAAO,KAAK;GACjB,OAAO,OAAO;EAChB,CAAC,CACH,GACA,OAAO,IACL,GAAG,KAAK,UAAU,EAAE,MAAM,IAAM,CAAC,CAAC,CAAC,KACjC,KAAK,eACH,aAAa,SAAS,kBAAkB;GACtC,MAAM;GACN,MAAM;EACR,CAAC,CACH,CACF,CACF,CACF;EACA,OAAO;GACL,MAAM;GACN;GACA,UAAU,KAAK,OAAO;GACtB,SAAS,SAAS,MAChB,GAAG,OAAO,UAAU;IAAE;IAAQ,WAAW;GAAM,CAAC,CAAC,CAAC,KAChD,OAAO,eACL,aAAa,SAAS,kBAAkB;IACtC,MAAM;IACN,MAAM;GACR,CAAC,CACH,CACF;EACJ;CACF,CAAC;AACH,CAAC"}