@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/mirror.js ADDED
@@ -0,0 +1,290 @@
1
+ import { ObjectHeaders } from "./core/object.js";
2
+ import { digestText } from "./runtime/portable-hash.js";
3
+ import { StorageError, storageError } from "./core/errors.js";
4
+ import { DeleteRequest, PutRequest } from "./core/requests.js";
5
+ import { Storage } from "./core/storage.js";
6
+ import { TransferDriver, endpointStoreIds } from "./transfers/dependencies.js";
7
+ import { Transfers } from "./transfers.js";
8
+ import { makeRecordStore, workflowError } from "./workflows/store.js";
9
+ import { buildEndpoint } from "./workflows/endpoint.js";
10
+ import { pin } from "./workflows/objects.js";
11
+ import { makeStaging } from "./composition/representation/staging.js";
12
+ import { MirrorOperation, MirrorPointer, MirrorRepairPlan } from "./workflows/mirror/schema.js";
13
+ import { makeOperations, marker, pointerKey } from "./workflows/mirror/operations.js";
14
+ import { makeView } from "./workflows/mirror/view.js";
15
+ import { Context, Effect, Layer, Schema, Stream } from "effect";
16
+ import { SecureRandom } from "effect/crypto";
17
+
18
+ // src/workflows/mirror/index.ts
19
+ var MirrorStore = class MirrorStore extends Context.Service()("@effect-kit/storage/MirrorStore") {
20
+ static make(options) {
21
+ return makeRecordStore(options, "mirror");
22
+ }
23
+ static layer(options) {
24
+ return Layer.effect(MirrorStore, MirrorStore.make(options));
25
+ }
26
+ };
27
+ const ensureRequired = (operation) => operation.outcomes.every((outcome) => !outcome.required || outcome.state === "succeeded") ? Effect.void : Effect.fail(new StorageError({
28
+ operation: operation.kind,
29
+ provider: "mirror",
30
+ reason: { _tag: "PartialFailure" },
31
+ mutationOutcome: "partial",
32
+ requestId: operation.id
33
+ }));
34
+ const make = Effect.fnUntraced(function* (configuration) {
35
+ const store = yield* MirrorStore;
36
+ const random = yield* SecureRandom.SecureRandom;
37
+ const stage = yield* makeStaging;
38
+ const selected = [{
39
+ endpoint: configuration.primary,
40
+ required: true
41
+ }, ...configuration.replicas.map((replica) => ({
42
+ endpoint: replica.storage,
43
+ required: replica.required
44
+ }))];
45
+ const physicalStores = selected.flatMap(({ endpoint }) => endpointStoreIds(endpoint));
46
+ if (!configuration.configurationId || !Number.isSafeInteger(configuration.maxBytes) || configuration.maxBytes < 1 || selected.length < 2 || selected.length > 9 || new Set(physicalStores).size !== physicalStores.length) return yield* workflowError("InvalidMirrorConfiguration");
47
+ const endpoints = yield* Effect.forEach(selected, (value) => Transfers.make(configuration.transfer).pipe(Effect.provideService(Storage, value.endpoint.storage), Effect.provideService(TransferDriver, value.endpoint), Effect.map((transfers) => ({
48
+ ...value,
49
+ transfers
50
+ }))));
51
+ const maximumObjectBytes = Math.min(configuration.maxBytes, configuration.primary.maximumSingleUploadBytes, ...selected.filter((entry) => entry.required).map((entry) => entry.endpoint.maximumObjectBytes));
52
+ const putConditions = ["create-only", "if-match"].filter((condition) => selected.every((entry) => !entry.required || entry.endpoint.storage.capabilities.putConditions.includes(condition)));
53
+ const binding = digestText(JSON.stringify([configuration.configurationId, endpoints.map((entry) => [entry.endpoint.storage.storeId, entry.required])]));
54
+ yield* store.exclusive(Effect.gen(function* () {
55
+ const previous = yield* store.read("configuration", Schema.String);
56
+ if (previous && previous !== binding) return yield* workflowError("MirrorStoreConfigurationConflict");
57
+ if (!previous) yield* store.write("configuration", Schema.String, binding);
58
+ }));
59
+ const storeId = `mirror:${binding}`;
60
+ const operations = makeOperations(store, binding, endpoints);
61
+ const { virtual, current, resolve, listPage } = makeView(store, binding, endpoints, operations);
62
+ const write = (request) => store.exclusive(Effect.scoped(Effect.gen(function* () {
63
+ if (request.condition && !putConditions.includes(request.condition._tag === "CreateOnly" ? "create-only" : "if-match")) return yield* storageError("put", "mirror", {
64
+ _tag: "Unsupported",
65
+ capability: "write-condition"
66
+ }, "not-started");
67
+ yield* Schema.decodeUnknownEffect(PutRequest)(request).pipe(Effect.mapError(() => workflowError("InvalidWrite")));
68
+ if (!(request.body instanceof Uint8Array) && !Stream.isStream(request.body)) return yield* workflowError("InvalidBody");
69
+ const headers = yield* Schema.decodeUnknownEffect(ObjectHeaders)(request).pipe(Effect.mapError(() => workflowError("InvalidHeaders")));
70
+ if (headers.customMetadata?.["effect-storage-mirror"] !== void 0) return yield* workflowError("ReservedMetadata");
71
+ const staged = yield* stage(request.body instanceof Uint8Array ? Stream.succeed(request.body) : request.body, Math.min(maximumObjectBytes, request.maxBytes ?? maximumObjectBytes));
72
+ if (request.contentLength !== void 0 && request.contentLength !== staged.size) return yield* workflowError("LengthMismatch");
73
+ const id = request.id ?? (yield* random.uuidV4());
74
+ if (!/^[A-Za-z0-9_-]{1,128}$/u.test(id)) return yield* workflowError("InvalidOperationId");
75
+ const requestHash = digestText(JSON.stringify([
76
+ request.key,
77
+ headers,
78
+ request.condition,
79
+ staged.size,
80
+ staged.checksum.value
81
+ ]));
82
+ const existing = yield* store.read(`operation:${id}`, MirrorOperation);
83
+ if (existing) {
84
+ if (existing.binding !== binding || existing.key !== request.key || existing.kind !== "put" || existing.requestHash !== requestHash) return yield* workflowError("OperationConflict");
85
+ const repaired = yield* operations.repair(existing);
86
+ if (repaired.outcomes[0]?.state === "succeeded" || repaired.state === "superseded") return {
87
+ operation: repaired,
88
+ metadata: repaired.outcomes[0]?.metadata ? virtual(repaired, repaired.outcomes[0].metadata) : void 0
89
+ };
90
+ }
91
+ const previous = yield* store.read(pointerKey(request.key), MirrorPointer);
92
+ if (existing && previous && previous.generation > existing.generation) return yield* workflowError("SupersededOperation");
93
+ const previousOperation = previous?.kind === "put" ? yield* operations.load(previous.id) : void 0;
94
+ if (request.condition?._tag === "CreateOnly" && previousOperation && previousOperation.id !== id) return yield* storageError("put", "mirror", { _tag: "PreconditionFailed" }, "not-started");
95
+ if (request.condition?._tag === "IfMatch" && (!previousOperation || request.condition.etag !== `"mirror:${previousOperation.id}"`)) return yield* storageError("put", "mirror", { _tag: "PreconditionFailed" }, "not-started");
96
+ const operation = existing ?? (yield* operations.create(id, request.key, "put", staged.size, staged.checksum.value, requestHash));
97
+ const previousMetadata = previousOperation?.outcomes[0]?.metadata;
98
+ const physical = yield* Effect.result(configuration.primary.storage.put({
99
+ ...headers,
100
+ key: request.key,
101
+ body: staged.stream(),
102
+ contentLength: staged.size,
103
+ maxBytes: maximumObjectBytes,
104
+ customMetadata: {
105
+ ...headers.customMetadata,
106
+ [marker]: id
107
+ },
108
+ condition: previousMetadata?.etag ? {
109
+ _tag: "IfMatch",
110
+ etag: previousMetadata.etag
111
+ } : { _tag: "CreateOnly" }
112
+ }));
113
+ if (physical._tag === "Failure") yield* operations.save({
114
+ ...operation,
115
+ outcomes: operation.outcomes.map((outcome, index) => index === 0 ? {
116
+ ...outcome,
117
+ state: "unknown",
118
+ error: physical.failure
119
+ } : outcome)
120
+ });
121
+ const repaired = yield* operations.repair(yield* operations.load(operation.id));
122
+ return {
123
+ operation: repaired,
124
+ metadata: repaired.outcomes[0]?.metadata ? virtual(repaired, repaired.outcomes[0].metadata) : void 0
125
+ };
126
+ })));
127
+ const remove = (request) => store.exclusive(Effect.gen(function* () {
128
+ yield* Schema.decodeUnknownEffect(DeleteRequest)(request).pipe(Effect.mapError(() => workflowError("InvalidDelete")));
129
+ const key = "key" in request ? request.key : request.ref.key;
130
+ if ("ref" in request && request.ref.storeId !== storeId) return yield* workflowError("ForeignReference");
131
+ const previous = yield* store.read(pointerKey(key), MirrorPointer);
132
+ if (previous?.kind === "delete") return yield* operations.repair(yield* operations.load(previous.id));
133
+ const operation = yield* current(request, false);
134
+ if (request.condition && request.condition.etag !== `"mirror:${operation.id}"`) return yield* storageError("delete", "mirror", { _tag: "PreconditionFailed" }, "not-started");
135
+ const tombstone = yield* operations.create(yield* random.uuidV4(), operation.key, "delete", 0, "");
136
+ yield* operations.activate(tombstone);
137
+ return yield* operations.repair(tombstone);
138
+ }));
139
+ const storage = Storage.make({
140
+ provider: "mirror",
141
+ storeId,
142
+ capabilities: {
143
+ putConditions,
144
+ getConditions: ["if-match", "if-none-match"],
145
+ deleteConditions: ["if-match"],
146
+ versionedReads: "current-only",
147
+ ranges: configuration.primary.storage.capabilities.ranges.filter((range) => endpoints.every((endpoint) => endpoint.endpoint.storage.capabilities.ranges.includes(range))),
148
+ list: {
149
+ maxPageSize: 1e3,
150
+ delimiter: false,
151
+ cursorPersistence: "provider",
152
+ snapshot: false
153
+ }
154
+ },
155
+ put: (request) => write(request).pipe(Effect.flatMap((receipt) => ensureRequired(receipt.operation).pipe(Effect.flatMap(() => receipt.metadata ? Effect.succeed(receipt.metadata) : Effect.fail(workflowError("MissingPrimaryReceipt")))))),
156
+ delete: (request) => remove(request).pipe(Effect.flatMap(ensureRequired)),
157
+ head: (request) => store.exclusive(Effect.gen(function* () {
158
+ const operation = yield* current(request);
159
+ const source = yield* resolve(operation);
160
+ return virtual(operation, source.metadata);
161
+ })),
162
+ get: (request) => store.exclusive(Effect.gen(function* () {
163
+ const operation = yield* current(request);
164
+ const source = yield* resolve(operation);
165
+ const metadata = virtual(operation, source.metadata);
166
+ if (request.condition?._tag === "IfMatch" && request.condition.etag !== metadata.etag && request.condition.etag !== "*") return yield* storageError("get", "mirror", { _tag: "PreconditionFailed" });
167
+ if (request.condition?._tag === "IfNoneMatch" && (request.condition.etag === metadata.etag || request.condition.etag === "*")) return {
168
+ _tag: "NotModified",
169
+ metadata
170
+ };
171
+ const value = yield* source.endpoint.storage.get({
172
+ ...yield* pin(source.metadata),
173
+ ...request.range ? { range: request.range } : {}
174
+ });
175
+ if (value._tag !== "Object") return yield* workflowError("ReplicaChanged");
176
+ return {
177
+ ...value,
178
+ metadata
179
+ };
180
+ })),
181
+ listPage
182
+ });
183
+ const applyRepair = Effect.fnUntraced(function* (id, limit = 100) {
184
+ let plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);
185
+ if (!plan || plan.binding !== binding || !Number.isSafeInteger(limit) || limit < 1 || limit > 1e3) return yield* workflowError("InvalidRepairPlan");
186
+ if (plan.state === "partial") plan = {
187
+ ...plan,
188
+ offset: 0,
189
+ unresolved: 0
190
+ };
191
+ for (let attempted = 0; plan.offset < plan.count && attempted < limit; attempted++) {
192
+ const operationId = yield* store.read(`repair:${id}:${plan.offset}`, Schema.String);
193
+ const repaired = operationId ? yield* operations.repair(yield* operations.load(operationId)) : void 0;
194
+ const unresolved = plan.unresolved + (repaired && ["pending", "partial"].includes(repaired.state) ? 1 : 0);
195
+ plan = {
196
+ id: plan.id,
197
+ binding: plan.binding,
198
+ count: plan.count,
199
+ prefix: plan.prefix,
200
+ unresolved,
201
+ offset: plan.offset + 1,
202
+ state: plan.offset + 1 >= plan.count ? unresolved ? "partial" : "completed" : "applying"
203
+ };
204
+ yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);
205
+ }
206
+ return plan;
207
+ });
208
+ return {
209
+ storage,
210
+ maximumObjectBytes,
211
+ write,
212
+ remove,
213
+ status: (id) => store.exclusive(operations.load(id)),
214
+ statusFor: (key) => store.exclusive(Effect.gen(function* () {
215
+ const pointer = yield* store.read(pointerKey(key), MirrorPointer);
216
+ return pointer ? yield* operations.load(pointer.id) : void 0;
217
+ })),
218
+ planRepair: (request) => store.exclusive(Effect.gen(function* () {
219
+ yield* Schema.decodeUnknownEffect(Schema.String)(request.prefix).pipe(Effect.mapError(() => workflowError("InvalidPrefix")));
220
+ const id = yield* random.uuidV4();
221
+ let count = 0;
222
+ const upper = (yield* store.read("sequence", Schema.Natural)) ?? 0;
223
+ for (let index = 1; index <= upper; index++) {
224
+ const operationId = yield* store.read(`index:${index}`, Schema.String);
225
+ if (!operationId) continue;
226
+ const operation = yield* operations.load(operationId);
227
+ const pointer = yield* store.read(pointerKey(operation.key), MirrorPointer);
228
+ if (!operation.key.startsWith(request.prefix) || pointer && pointer.generation > operation.generation) continue;
229
+ yield* store.write(`repair:${id}:${count++}`, Schema.String, operation.id);
230
+ }
231
+ const plan = {
232
+ id,
233
+ binding,
234
+ prefix: request.prefix,
235
+ count,
236
+ unresolved: 0,
237
+ offset: 0,
238
+ state: count ? "planned" : "completed"
239
+ };
240
+ yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);
241
+ return plan;
242
+ })),
243
+ inspectRepair: (id, page = {}) => store.exclusive(Effect.gen(function* () {
244
+ const plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);
245
+ if (!plan || plan.binding !== binding) return yield* workflowError("InvalidRepairPlan");
246
+ const offset = page.offset ?? 0;
247
+ const limit = page.limit ?? 100;
248
+ if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(limit) || limit < 1 || limit > 1e3) return yield* workflowError("InvalidPage");
249
+ const entries = [];
250
+ for (let index = offset; index < Math.min(plan.count, offset + limit); index++) {
251
+ const operationId = yield* store.read(`repair:${id}:${index}`, Schema.String);
252
+ if (operationId) entries.push(yield* operations.load(operationId));
253
+ }
254
+ return {
255
+ plan,
256
+ entries,
257
+ ...offset + entries.length < plan.count ? { nextOffset: offset + entries.length } : {}
258
+ };
259
+ })),
260
+ applyRepair: (id, options) => store.exclusive(applyRepair(id, options?.limit))
261
+ };
262
+ });
263
+ var StorageMirror = class StorageMirror extends Context.Service()("@effect-kit/storage/StorageMirror") {
264
+ static make = make;
265
+ static layer(options) {
266
+ return Layer.effectContext(Effect.gen(function* () {
267
+ const primary = yield* buildEndpoint(options.primary);
268
+ const replicas = yield* Effect.forEach(options.replicas, (replica) => buildEndpoint(replica.storage).pipe(Effect.map((endpoint) => ({
269
+ storage: endpoint,
270
+ required: replica.required
271
+ }))));
272
+ const mirror = yield* make({
273
+ ...options,
274
+ primary,
275
+ replicas
276
+ });
277
+ return Context.make(StorageMirror, mirror).pipe(Context.add(Storage, mirror.storage), Context.add(TransferDriver, {
278
+ storage: mirror.storage,
279
+ maximumObjectBytes: mirror.maximumObjectBytes,
280
+ maximumSingleUploadBytes: mirror.maximumObjectBytes,
281
+ transportOverheadBytes: primary.transportOverheadBytes,
282
+ underlyingStoreId: primary.underlyingStoreId ?? primary.storage.storeId,
283
+ underlyingStoreIds: [...endpointStoreIds(primary), ...replicas.flatMap((replica) => endpointStoreIds(replica.storage))]
284
+ }));
285
+ }));
286
+ }
287
+ };
288
+
289
+ export { MirrorOperation, MirrorRepairPlan, MirrorStore, StorageMirror };
290
+ //# sourceMappingURL=mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.js","names":[],"sources":["../src/workflows/mirror/index.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema, Stream } from \"effect\";\nimport type { Scope } from \"effect\";\nimport { SecureRandom } from \"effect/crypto\";\n\nimport { makeStaging } from \"../../composition/representation/staging.js\";\nimport { StorageError, storageError } from \"../../core/errors.js\";\nimport { ObjectHeaders } from \"../../core/object.js\";\nimport { DeleteRequest, PutRequest } from \"../../core/requests.js\";\nimport type { GetResult } from \"../../core/requests.js\";\nimport { Storage } from \"../../core/storage.js\";\nimport { digestText } from \"../../runtime/portable-hash.js\";\nimport { endpointStoreIds, TransferDriver } from \"../../transfers/dependencies.js\";\nimport { Transfers } from \"../../transfers/index.js\";\nimport type { TransferEndpoint, TransferPolicy } from \"../../transfers/models.js\";\nimport { buildEndpoint } from \"../endpoint.js\";\nimport { pin } from \"../objects.js\";\nimport { makeRecordStore, workflowError } from \"../store.js\";\nimport type { RecordStore, WorkflowStoreOptions } from \"../store.js\";\nimport { makeOperations, marker, pointerKey } from \"./operations.js\";\nimport { MirrorOperation, MirrorPointer, MirrorRepairPlan } from \"./schema.js\";\nimport { makeView } from \"./view.js\";\n\nexport { MirrorOperation, MirrorRepairPlan };\nexport type { WorkflowStoreOptions as MirrorStoreOptions } from \"../store.js\";\nexport class MirrorStore extends Context.Service<MirrorStore, RecordStore>()(\n \"@effect-kit/storage/MirrorStore\",\n) {\n static make(options: WorkflowStoreOptions) {\n return makeRecordStore(options, \"mirror\");\n }\n static layer(options: WorkflowStoreOptions) {\n return Layer.effect(MirrorStore, MirrorStore.make(options));\n }\n}\nexport interface MirrorOptions {\n readonly configurationId: string;\n readonly primary: TransferEndpoint;\n readonly replicas: ReadonlyArray<{\n readonly storage: TransferEndpoint;\n readonly required: boolean;\n }>;\n readonly maxBytes: number;\n readonly transfer?: TransferPolicy;\n}\nconst ensureRequired = (operation: MirrorOperation): Effect.Effect<void, StorageError> =>\n operation.outcomes.every((outcome) => !outcome.required || outcome.state === \"succeeded\")\n ? Effect.void\n : Effect.fail(\n new StorageError({\n operation: operation.kind,\n provider: \"mirror\",\n reason: { _tag: \"PartialFailure\" },\n mutationOutcome: \"partial\",\n requestId: operation.id,\n }),\n );\n\nconst make = Effect.fnUntraced(function* (configuration: MirrorOptions) {\n const store = yield* MirrorStore;\n const random = yield* SecureRandom.SecureRandom;\n const stage = yield* makeStaging;\n const selected = [\n { endpoint: configuration.primary, required: true },\n ...configuration.replicas.map((replica) => ({\n endpoint: replica.storage,\n required: replica.required,\n })),\n ];\n const physicalStores = selected.flatMap(({ endpoint }) => endpointStoreIds(endpoint));\n if (\n !configuration.configurationId ||\n !Number.isSafeInteger(configuration.maxBytes) ||\n configuration.maxBytes < 1 ||\n selected.length < 2 ||\n selected.length > 9 ||\n new Set(physicalStores).size !== physicalStores.length\n )\n return yield* workflowError(\"InvalidMirrorConfiguration\");\n const endpoints = yield* Effect.forEach(selected, (value) =>\n Transfers.make(configuration.transfer).pipe(\n Effect.provideService(Storage, value.endpoint.storage),\n Effect.provideService(TransferDriver, value.endpoint),\n Effect.map((transfers) => ({ ...value, transfers })),\n ),\n );\n const maximumObjectBytes = Math.min(\n configuration.maxBytes,\n configuration.primary.maximumSingleUploadBytes,\n ...selected.filter((entry) => entry.required).map((entry) => entry.endpoint.maximumObjectBytes),\n );\n const putConditions = ([\"create-only\", \"if-match\"] as const).filter((condition) =>\n selected.every(\n (entry) =>\n !entry.required || entry.endpoint.storage.capabilities.putConditions.includes(condition),\n ),\n );\n const binding = digestText(\n JSON.stringify([\n configuration.configurationId,\n endpoints.map((entry) => [entry.endpoint.storage.storeId, entry.required]),\n ]),\n );\n yield* store.exclusive(\n Effect.gen(function* () {\n const previous = yield* store.read(\"configuration\", Schema.String);\n if (previous && previous !== binding)\n return yield* workflowError(\"MirrorStoreConfigurationConflict\");\n if (!previous) yield* store.write(\"configuration\", Schema.String, binding);\n }),\n );\n const storeId = `mirror:${binding}`;\n const operations = makeOperations(store, binding, endpoints);\n const { virtual, current, resolve, listPage } = makeView(store, binding, endpoints, operations);\n const write = <E = never, R = never>(request: PutRequest<E, R> & { readonly id?: string }) =>\n store.exclusive(\n Effect.scoped(\n Effect.gen(function* () {\n if (\n request.condition &&\n !putConditions.includes(\n request.condition._tag === \"CreateOnly\" ? \"create-only\" : \"if-match\",\n )\n )\n return yield* storageError(\n \"put\",\n \"mirror\",\n { _tag: \"Unsupported\", capability: \"write-condition\" },\n \"not-started\",\n );\n yield* Schema.decodeUnknownEffect(PutRequest)(request).pipe(\n Effect.mapError(() => workflowError(\"InvalidWrite\")),\n );\n if (!(request.body instanceof Uint8Array) && !Stream.isStream(request.body))\n return yield* workflowError(\"InvalidBody\");\n const headers = yield* Schema.decodeUnknownEffect(ObjectHeaders)(request).pipe(\n Effect.mapError(() => workflowError(\"InvalidHeaders\")),\n );\n if (headers.customMetadata?.[marker] !== undefined)\n return yield* workflowError(\"ReservedMetadata\");\n const staged = yield* stage(\n request.body instanceof Uint8Array ? Stream.succeed(request.body) : request.body,\n Math.min(maximumObjectBytes, request.maxBytes ?? maximumObjectBytes),\n );\n if (request.contentLength !== undefined && request.contentLength !== staged.size)\n return yield* workflowError(\"LengthMismatch\");\n const id = request.id ?? (yield* random.uuidV4());\n if (!/^[A-Za-z0-9_-]{1,128}$/u.test(id))\n return yield* workflowError(\"InvalidOperationId\");\n const requestHash = digestText(\n JSON.stringify([\n request.key,\n headers,\n request.condition,\n staged.size,\n staged.checksum.value,\n ]),\n );\n const existing = yield* store.read(`operation:${id}`, MirrorOperation);\n if (existing) {\n if (\n existing.binding !== binding ||\n existing.key !== request.key ||\n existing.kind !== \"put\" ||\n existing.requestHash !== requestHash\n )\n return yield* workflowError(\"OperationConflict\");\n const repaired = yield* operations.repair(existing);\n if (repaired.outcomes[0]?.state === \"succeeded\" || repaired.state === \"superseded\")\n return {\n operation: repaired,\n metadata: repaired.outcomes[0]?.metadata\n ? virtual(repaired, repaired.outcomes[0].metadata)\n : undefined,\n };\n }\n const previous = yield* store.read(pointerKey(request.key), MirrorPointer);\n if (existing && previous && previous.generation > existing.generation)\n return yield* workflowError(\"SupersededOperation\");\n const previousOperation =\n previous?.kind === \"put\" ? yield* operations.load(previous.id) : undefined;\n if (\n request.condition?._tag === \"CreateOnly\" &&\n previousOperation &&\n previousOperation.id !== id\n )\n return yield* storageError(\n \"put\",\n \"mirror\",\n { _tag: \"PreconditionFailed\" },\n \"not-started\",\n );\n if (\n request.condition?._tag === \"IfMatch\" &&\n (!previousOperation || request.condition.etag !== `\"mirror:${previousOperation.id}\"`)\n )\n return yield* storageError(\n \"put\",\n \"mirror\",\n { _tag: \"PreconditionFailed\" },\n \"not-started\",\n );\n const operation =\n existing ??\n (yield* operations.create(\n id,\n request.key,\n \"put\",\n staged.size,\n staged.checksum.value,\n requestHash,\n ));\n const previousMetadata = previousOperation?.outcomes[0]?.metadata;\n const physical = yield* Effect.result(\n configuration.primary.storage.put({\n ...headers,\n key: request.key,\n body: staged.stream(),\n contentLength: staged.size,\n maxBytes: maximumObjectBytes,\n customMetadata: { ...headers.customMetadata, [marker]: id },\n condition: previousMetadata?.etag\n ? { _tag: \"IfMatch\", etag: previousMetadata.etag }\n : { _tag: \"CreateOnly\" },\n }),\n );\n if (physical._tag === \"Failure\")\n yield* operations.save({\n ...operation,\n outcomes: operation.outcomes.map((outcome, index) =>\n index === 0 ? { ...outcome, state: \"unknown\", error: physical.failure } : outcome,\n ),\n });\n const repaired = yield* operations.repair(yield* operations.load(operation.id));\n return {\n operation: repaired,\n metadata: repaired.outcomes[0]?.metadata\n ? virtual(repaired, repaired.outcomes[0].metadata)\n : undefined,\n };\n }),\n ),\n );\n const remove = (request: DeleteRequest) =>\n store.exclusive(\n Effect.gen(function* () {\n yield* Schema.decodeUnknownEffect(DeleteRequest)(request).pipe(\n Effect.mapError(() => workflowError(\"InvalidDelete\")),\n );\n const key = \"key\" in request ? request.key : request.ref.key;\n if (\"ref\" in request && request.ref.storeId !== storeId)\n return yield* workflowError(\"ForeignReference\");\n const previous = yield* store.read(pointerKey(key), MirrorPointer);\n if (previous?.kind === \"delete\")\n return yield* operations.repair(yield* operations.load(previous.id));\n const operation = yield* current(request, false);\n if (request.condition && request.condition.etag !== `\"mirror:${operation.id}\"`)\n return yield* storageError(\n \"delete\",\n \"mirror\",\n { _tag: \"PreconditionFailed\" },\n \"not-started\",\n );\n const tombstone = yield* operations.create(\n yield* random.uuidV4(),\n operation.key,\n \"delete\",\n 0,\n \"\",\n );\n yield* operations.activate(tombstone);\n return yield* operations.repair(tombstone);\n }),\n );\n const storage = Storage.make({\n provider: \"mirror\",\n storeId,\n capabilities: {\n putConditions,\n getConditions: [\"if-match\", \"if-none-match\"],\n deleteConditions: [\"if-match\"],\n versionedReads: \"current-only\",\n ranges: configuration.primary.storage.capabilities.ranges.filter((range) =>\n endpoints.every((endpoint) =>\n endpoint.endpoint.storage.capabilities.ranges.includes(range),\n ),\n ),\n list: { maxPageSize: 1000, delimiter: false, cursorPersistence: \"provider\", snapshot: false },\n },\n put: (request) =>\n write(request).pipe(\n Effect.flatMap((receipt) =>\n ensureRequired(receipt.operation).pipe(\n Effect.flatMap(() =>\n receipt.metadata\n ? Effect.succeed(receipt.metadata)\n : Effect.fail(workflowError(\"MissingPrimaryReceipt\")),\n ),\n ),\n ),\n ),\n delete: (request) => remove(request).pipe(Effect.flatMap(ensureRequired)),\n head: (request) =>\n store.exclusive(\n Effect.gen(function* () {\n const operation = yield* current(request);\n const source = yield* resolve(operation);\n return virtual(operation, source.metadata);\n }),\n ),\n get: (request): Effect.Effect<GetResult, StorageError, Scope.Scope> =>\n store.exclusive(\n Effect.gen(function* () {\n const operation = yield* current(request);\n const source = yield* resolve(operation);\n const metadata = virtual(operation, source.metadata);\n if (\n request.condition?._tag === \"IfMatch\" &&\n request.condition.etag !== metadata.etag &&\n request.condition.etag !== \"*\"\n )\n return yield* storageError(\"get\", \"mirror\", { _tag: \"PreconditionFailed\" });\n if (\n request.condition?._tag === \"IfNoneMatch\" &&\n (request.condition.etag === metadata.etag || request.condition.etag === \"*\")\n )\n return { _tag: \"NotModified\", metadata };\n const value = yield* source.endpoint.storage.get({\n ...(yield* pin(source.metadata)),\n ...(request.range ? { range: request.range } : {}),\n });\n if (value._tag !== \"Object\") return yield* workflowError(\"ReplicaChanged\");\n return { ...value, metadata };\n }),\n ),\n listPage,\n });\n const applyRepair = Effect.fnUntraced(function* (id: string, limit = 100) {\n let plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);\n if (\n !plan ||\n plan.binding !== binding ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n return yield* workflowError(\"InvalidRepairPlan\");\n if (plan.state === \"partial\") plan = { ...plan, offset: 0, unresolved: 0 };\n for (let attempted = 0; plan.offset < plan.count && attempted < limit; attempted++) {\n const operationId = yield* store.read(`repair:${id}:${plan.offset}`, Schema.String);\n const repaired = operationId\n ? yield* operations.repair(yield* operations.load(operationId))\n : undefined;\n const unresolved: number =\n plan.unresolved + (repaired && [\"pending\", \"partial\"].includes(repaired.state) ? 1 : 0);\n plan = {\n id: plan.id,\n binding: plan.binding,\n count: plan.count,\n prefix: plan.prefix,\n unresolved,\n offset: plan.offset + 1,\n state: plan.offset + 1 >= plan.count ? (unresolved ? \"partial\" : \"completed\") : \"applying\",\n };\n yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);\n }\n return plan;\n });\n return {\n storage,\n maximumObjectBytes,\n write,\n remove,\n status: (id: string) => store.exclusive(operations.load(id)),\n statusFor: (key: string) =>\n store.exclusive(\n Effect.gen(function* () {\n const pointer = yield* store.read(pointerKey(key), MirrorPointer);\n return pointer ? yield* operations.load(pointer.id) : undefined;\n }),\n ),\n planRepair: (request: { readonly prefix: string }) =>\n store.exclusive(\n Effect.gen(function* () {\n yield* Schema.decodeUnknownEffect(Schema.String)(request.prefix).pipe(\n Effect.mapError(() => workflowError(\"InvalidPrefix\")),\n );\n const id = yield* random.uuidV4();\n let count = 0;\n const upper = (yield* store.read(\"sequence\", Schema.Natural)) ?? 0;\n for (let index = 1; index <= upper; index++) {\n const operationId = yield* store.read(`index:${index}`, Schema.String);\n if (!operationId) continue;\n const operation = yield* operations.load(operationId);\n const pointer = yield* store.read(pointerKey(operation.key), MirrorPointer);\n if (\n !operation.key.startsWith(request.prefix) ||\n (pointer && pointer.generation > operation.generation)\n )\n continue;\n yield* store.write(`repair:${id}:${count++}`, Schema.String, operation.id);\n }\n const plan: MirrorRepairPlan = {\n id,\n binding,\n prefix: request.prefix,\n count,\n unresolved: 0,\n offset: 0,\n state: count ? \"planned\" : \"completed\",\n };\n yield* store.write(`repair:${id}`, MirrorRepairPlan, plan);\n return plan;\n }),\n ),\n inspectRepair: (id: string, page: { readonly offset?: number; readonly limit?: number } = {}) =>\n store.exclusive(\n Effect.gen(function* () {\n const plan = yield* store.read(`repair:${id}`, MirrorRepairPlan);\n if (!plan || plan.binding !== binding) return yield* workflowError(\"InvalidRepairPlan\");\n const offset = page.offset ?? 0;\n const limit = page.limit ?? 100;\n if (\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n return yield* workflowError(\"InvalidPage\");\n const entries: MirrorOperation[] = [];\n for (let index = offset; index < Math.min(plan.count, offset + limit); index++) {\n const operationId = yield* store.read(`repair:${id}:${index}`, Schema.String);\n if (operationId) entries.push(yield* operations.load(operationId));\n }\n return {\n plan,\n entries,\n ...(offset + entries.length < plan.count\n ? { nextOffset: offset + entries.length }\n : {}),\n };\n }),\n ),\n applyRepair: (id: string, options?: { readonly limit?: number }) =>\n store.exclusive(applyRepair(id, options?.limit)),\n };\n});\n\nexport class StorageMirror extends Context.Service<\n StorageMirror,\n Effect.Success<ReturnType<typeof make>>\n>()(\"@effect-kit/storage/StorageMirror\") {\n static readonly make = make;\n static layer<EP, RP, ER, RR>(\n options: Omit<MirrorOptions, \"primary\" | \"replicas\"> & {\n readonly primary: Layer.Layer<Storage | TransferDriver, EP, RP>;\n readonly replicas: ReadonlyArray<{\n readonly storage: Layer.Layer<Storage | TransferDriver, ER, RR>;\n readonly required: boolean;\n }>;\n },\n ) {\n return Layer.effectContext(\n Effect.gen(function* () {\n const primary = yield* buildEndpoint(options.primary);\n const replicas = yield* Effect.forEach(options.replicas, (replica) =>\n buildEndpoint(replica.storage).pipe(\n Effect.map((endpoint) => ({\n storage: endpoint,\n required: replica.required,\n })),\n ),\n );\n const mirror = yield* make({ ...options, primary, replicas });\n return Context.make(StorageMirror, mirror).pipe(\n Context.add(Storage, mirror.storage),\n Context.add(TransferDriver, {\n storage: mirror.storage,\n maximumObjectBytes: mirror.maximumObjectBytes,\n maximumSingleUploadBytes: mirror.maximumObjectBytes,\n transportOverheadBytes: primary.transportOverheadBytes,\n underlyingStoreId: primary.underlyingStoreId ?? primary.storage.storeId,\n underlyingStoreIds: [\n ...endpointStoreIds(primary),\n ...replicas.flatMap((replica) => endpointStoreIds(replica.storage)),\n ],\n }),\n );\n }),\n );\n }\n}\n"],"mappings":"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"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { StorageError } from "./core/errors.js";
2
+ import "./index.js";
3
+ import { TransferHash } from "./transfers/dependencies.js";
4
+ import { UploadSessionStore } from "./sessions/store.js";
5
+ import { sha256 } from "./runtime/node-hash.js";
6
+ import { aes256Gcm } from "./runtime/node-protection.js";
7
+ import { FileSessionStoreOptions } from "./runtime/session-store.js";
8
+ import { atomicFileStore } from "./runtime/filesystem.js";
9
+ import { fileDownloadTarget } from "./runtime/file-target.js";
10
+ import { Layer } from "effect";
11
+ export declare const layer: Layer.Layer<import("effect/crypto/Digest").Digest | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom | TransferHash, never, never>;
12
+ export declare const sessionStore: (options: FileSessionStoreOptions) => Layer.Layer<UploadSessionStore, import("effect/persistence/KeyValueStore").KeyValueStoreError | StorageError, import("effect/crypto/Digest").Digest | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom>;
13
+ export { type FileSessionStoreOptions, aes256Gcm, atomicFileStore, fileDownloadTarget, sha256 };
14
+ //# sourceMappingURL=node.d.ts.map
package/dist/node.js ADDED
@@ -0,0 +1,17 @@
1
+ import { TransferHash } from "./transfers/dependencies.js";
2
+ import { sha256 } from "./runtime/node-hash.js";
3
+ import { aes256Gcm } from "./runtime/node-protection.js";
4
+ import { atomicFileStore } from "./runtime/filesystem.js";
5
+ import { fileSessionStore } from "./runtime/session-store.js";
6
+ import { fileDownloadTarget } from "./runtime/file-target.js";
7
+ import { Effect, Layer } from "effect";
8
+ import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
9
+ import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
10
+ import * as NodePath from "@effect/platform-node/NodePath";
11
+
12
+ // src/runtime/node.ts
13
+ const layer = Layer.mergeAll(NodeFileSystem.layer, NodePath.layer, NodeCrypto.layerSecureRandom, NodeCrypto.layerDigest, Layer.succeed(TransferHash, sha256));
14
+ const sessionStore = (options) => fileSessionStore(options, Effect.sync(() => aes256Gcm(options.key)));
15
+
16
+ export { aes256Gcm, atomicFileStore, fileDownloadTarget, layer, sessionStore, sha256 };
17
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","names":[],"sources":["../src/runtime/node.ts"],"sourcesContent":["import * as NodeCrypto from \"@effect/platform-node/NodeCrypto\";\nimport * as NodeFileSystem from \"@effect/platform-node/NodeFileSystem\";\nimport * as NodePath from \"@effect/platform-node/NodePath\";\nimport { Effect, Layer } from \"effect\";\n\nimport { TransferHash } from \"../transfers/dependencies.js\";\nimport { sha256 } from \"./node-hash.js\";\nimport { aes256Gcm } from \"./node-protection.js\";\nimport { fileSessionStore } from \"./session-store.js\";\nimport type { FileSessionStoreOptions } from \"./session-store.js\";\n\nexport { sha256, aes256Gcm };\nexport { atomicFileStore } from \"./filesystem.js\";\nexport { fileDownloadTarget } from \"./file-target.js\";\nexport type { FileSessionStoreOptions } from \"./session-store.js\";\n\nexport const layer = Layer.mergeAll(\n NodeFileSystem.layer,\n NodePath.layer,\n NodeCrypto.layerSecureRandom,\n NodeCrypto.layerDigest,\n Layer.succeed(TransferHash, sha256),\n);\nexport const sessionStore = (options: FileSessionStoreOptions) =>\n fileSessionStore(\n options,\n Effect.sync(() => aes256Gcm(options.key)),\n );\n"],"mappings":";;;;;;;;;;;;AAgBA,MAAa,QAAQ,MAAM,SACzB,eAAe,OACf,SAAS,OACT,WAAW,mBACX,WAAW,aACX,MAAM,QAAQ,cAAc,MAAM,CACpC;AACA,MAAa,gBAAgB,YAC3B,iBACE,SACA,OAAO,WAAW,UAAU,QAAQ,GAAG,CAAC,CAC1C"}
@@ -0,0 +1,94 @@
1
+ import { storageError } from "../../core/errors.js";
2
+ import { uploadBody } from "../../internal/node/upload-body.js";
3
+ import { encryption, lease } from "./config.js";
4
+ import { condition, metadata, nativeHeaders, target, writeMetadata } from "./mapping.js";
5
+ import { request } from "./transport.js";
6
+ import { Effect, Schema } from "effect";
7
+
8
+ // src/providers/azure/blocks.ts
9
+ const BlockId = Schema.NonEmptyString.check(Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u), Schema.isMaxLength(88));
10
+ const mapBlocks = (blocks) => (blocks ?? []).map((block) => ({
11
+ blockId: block.name,
12
+ size: block.size
13
+ }));
14
+ function blockUploads(connection) {
15
+ const blob = Effect.fnUntraced(function* (ref) {
16
+ const address = yield* target(connection, { ref }, "blocks");
17
+ if (ref.version) return yield* storageError("blocks", "azure", {
18
+ _tag: "InvalidInput",
19
+ field: "ref.version"
20
+ }, "not-started");
21
+ return connection.client.getBlockBlobClient(address.ref.key);
22
+ });
23
+ return {
24
+ limits: {
25
+ maximumBlockBytes: 4194304e3,
26
+ maximumBlocks: 5e4
27
+ },
28
+ stage: Effect.fnUntraced(function* (input) {
29
+ const client = yield* blob(input.ref);
30
+ yield* Schema.decodeUnknownEffect(BlockId)(input.blockId).pipe(Effect.mapError(() => storageError("stageBlock", "azure", {
31
+ _tag: "InvalidInput",
32
+ field: "blockId"
33
+ }, "not-started")));
34
+ if (!input.contentLength || input.contentLength > 4194304e3) return yield* storageError("stageBlock", "azure", {
35
+ _tag: "InvalidInput",
36
+ field: "contentLength"
37
+ }, "not-started");
38
+ yield* uploadBody({
39
+ provider: "azure",
40
+ maxUnknownLengthBytes: connection.config.maxUnknownLengthBytes
41
+ }, input, "stageBlock", (body, length) => request(connection, "stageBlock", true, (signal) => client.stageBlock(input.blockId, body, length, {
42
+ abortSignal: signal,
43
+ conditions: lease(connection.config),
44
+ ...encryption(connection.config),
45
+ contentChecksumAlgorithm: connection.config.checksumAlgorithm
46
+ })));
47
+ }),
48
+ list: Effect.fnUntraced(function* (ref) {
49
+ const client = yield* blob(ref);
50
+ const result = yield* request(connection, "listBlocks", false, (signal) => client.getBlockList("all", {
51
+ abortSignal: signal,
52
+ conditions: lease(connection.config)
53
+ })).pipe(Effect.catchReason("StorageError", "NotFound", () => Effect.succeed({
54
+ committedBlocks: [],
55
+ uncommittedBlocks: []
56
+ })));
57
+ return {
58
+ committed: mapBlocks(result.committedBlocks),
59
+ uncommitted: mapBlocks(result.uncommittedBlocks)
60
+ };
61
+ }),
62
+ commit: Effect.fnUntraced(function* (input) {
63
+ const client = yield* blob(input.ref);
64
+ if (input.blockIds.length > 5e4 || new Set(input.blockIds).size !== input.blockIds.length || new Set(input.blockIds.map((id) => Buffer.from(id, "base64").length)).size > 1) return yield* storageError("commitBlocks", "azure", {
65
+ _tag: "InvalidInput",
66
+ field: "blockIds"
67
+ }, "not-started");
68
+ yield* Effect.forEach(input.blockIds, (id) => Schema.decodeUnknownEffect(BlockId)(id).pipe(Effect.mapError(() => storageError("commitBlocks", "azure", {
69
+ _tag: "InvalidInput",
70
+ field: "blockId"
71
+ }, "not-started"))));
72
+ const headers = input.headers ?? {};
73
+ const customMetadata = yield* writeMetadata(headers);
74
+ const result = yield* request(connection, "commitBlocks", true, (signal) => client.commitBlockList([...input.blockIds], {
75
+ abortSignal: signal,
76
+ conditions: {
77
+ ...condition(input.condition),
78
+ ...lease(connection.config)
79
+ },
80
+ blobHTTPHeaders: nativeHeaders(headers),
81
+ metadata: customMetadata,
82
+ ...encryption(connection.config)
83
+ }));
84
+ return metadata(connection, input.ref.key, {
85
+ ...result,
86
+ ...headers,
87
+ metadata: customMetadata
88
+ });
89
+ })
90
+ };
91
+ }
92
+
93
+ export { blockUploads };
94
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","names":[],"sources":["../../../src/providers/azure/blocks.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport type { BlockUploads } from \"../../core/contracts/resumable.js\";\nimport { storageError } from \"../../core/errors.js\";\nimport type { ObjectRef } from \"../../core/object.js\";\nimport { uploadBody } from \"../../internal/node/upload-body.js\";\nimport { encryption, lease } from \"./config.js\";\nimport type { AzureConnection } from \"./config.js\";\nimport { condition, metadata, nativeHeaders, target, writeMetadata } from \"./mapping.js\";\nimport { request } from \"./transport.js\";\n\nconst BlockId = Schema.NonEmptyString.check(\n Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u),\n Schema.isMaxLength(88),\n);\nconst mapBlocks = (blocks: ReadonlyArray<{ name: string; size: number }> | undefined) =>\n (blocks ?? []).map((block) => ({ blockId: block.name, size: block.size }));\n\nexport function blockUploads(connection: AzureConnection): BlockUploads {\n const blob = Effect.fnUntraced(function* (ref: ObjectRef) {\n const address = yield* target(connection, { ref }, \"blocks\");\n if (ref.version)\n return yield* storageError(\n \"blocks\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"ref.version\" },\n \"not-started\",\n );\n return connection.client.getBlockBlobClient(address.ref.key);\n });\n return {\n limits: { maximumBlockBytes: 4000 * 1024 * 1024, maximumBlocks: 50_000 },\n stage: Effect.fnUntraced(function* (input) {\n const client = yield* blob(input.ref);\n yield* Schema.decodeUnknownEffect(BlockId)(input.blockId).pipe(\n Effect.mapError(() =>\n storageError(\n \"stageBlock\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"blockId\" },\n \"not-started\",\n ),\n ),\n );\n if (!input.contentLength || input.contentLength > 4000 * 1024 * 1024)\n return yield* storageError(\n \"stageBlock\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"contentLength\" },\n \"not-started\",\n );\n yield* uploadBody(\n { provider: \"azure\", maxUnknownLengthBytes: connection.config.maxUnknownLengthBytes },\n input,\n \"stageBlock\",\n (body, length) =>\n request(connection, \"stageBlock\", true, (signal) =>\n client.stageBlock(input.blockId, body, length, {\n abortSignal: signal,\n conditions: lease(connection.config),\n ...encryption(connection.config),\n contentChecksumAlgorithm: connection.config.checksumAlgorithm,\n }),\n ),\n );\n }),\n list: Effect.fnUntraced(function* (ref) {\n const client = yield* blob(ref);\n const result = yield* request(connection, \"listBlocks\", false, (signal) =>\n client.getBlockList(\"all\", { abortSignal: signal, conditions: lease(connection.config) }),\n ).pipe(\n Effect.catchReason(\"StorageError\", \"NotFound\", () =>\n Effect.succeed({ committedBlocks: [], uncommittedBlocks: [] }),\n ),\n );\n return {\n committed: mapBlocks(result.committedBlocks),\n uncommitted: mapBlocks(result.uncommittedBlocks),\n };\n }),\n commit: Effect.fnUntraced(function* (input) {\n const client = yield* blob(input.ref);\n if (\n input.blockIds.length > 50_000 ||\n new Set(input.blockIds).size !== input.blockIds.length ||\n new Set(input.blockIds.map((id) => Buffer.from(id, \"base64\").length)).size > 1\n )\n return yield* storageError(\n \"commitBlocks\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"blockIds\" },\n \"not-started\",\n );\n yield* Effect.forEach(input.blockIds, (id) =>\n Schema.decodeUnknownEffect(BlockId)(id).pipe(\n Effect.mapError(() =>\n storageError(\n \"commitBlocks\",\n \"azure\",\n { _tag: \"InvalidInput\", field: \"blockId\" },\n \"not-started\",\n ),\n ),\n ),\n );\n const headers = input.headers ?? {};\n const customMetadata = yield* writeMetadata(headers);\n const result = yield* request(connection, \"commitBlocks\", true, (signal) =>\n client.commitBlockList([...input.blockIds], {\n abortSignal: signal,\n conditions: { ...condition(input.condition), ...lease(connection.config) },\n blobHTTPHeaders: nativeHeaders(headers),\n metadata: customMetadata,\n ...encryption(connection.config),\n }),\n );\n return metadata(connection, input.ref.key, {\n ...result,\n ...headers,\n metadata: customMetadata,\n });\n }),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { StorageError } from "../../core/errors.js";
2
+ import "../../index.js";
3
+ import { Effect, Redacted } from "effect";
4
+ import { ContainerClient, newPipeline } from "@azure/storage-blob";
5
+ export interface AzureConfig {
6
+ /** Complete container URL; an existing SAS must be wrapped in Redacted. */
7
+ readonly containerUrl: string | Redacted.Redacted<string>;
8
+ readonly storeId?: string;
9
+ readonly credential?: Parameters<typeof newPipeline>[0];
10
+ readonly requestTimeoutMillis?: number;
11
+ readonly maxUnknownLengthBytes?: number;
12
+ readonly leaseId?: Redacted.Redacted<string>;
13
+ readonly encryption?: {
14
+ readonly scope: string;
15
+ } | {
16
+ readonly key: Redacted.Redacted<string>;
17
+ readonly keySHA256: string;
18
+ };
19
+ readonly checksumAlgorithm?: "None" | "StorageCrc64";
20
+ readonly profile?: "block-blob";
21
+ }
22
+ export declare const resolveConfig: (input: AzureConfig) => Effect.Effect<{
23
+ containerUrl: string;
24
+ storeId: string;
25
+ requestTimeoutMillis: number;
26
+ maxUnknownLengthBytes: number;
27
+ checksumAlgorithm: "None" | "StorageCrc64";
28
+ leaseId: Redacted.Redacted<string> | undefined;
29
+ encryption: {
30
+ scope: string;
31
+ } | {
32
+ key: Redacted.Redacted<string>;
33
+ keySHA256: string;
34
+ } | undefined;
35
+ }, StorageError, never>;
36
+ export type ResolvedAzureConfig = Effect.Success<ReturnType<typeof resolveConfig>>;
37
+ export interface AzureConnection {
38
+ readonly client: ContainerClient;
39
+ readonly config: ResolvedAzureConfig;
40
+ }
41
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1,62 @@
1
+ import { HeaderValue } from "../../core/object.js";
2
+ import { storageError } from "../../core/errors.js";
3
+ import { Effect, Redacted, Schema } from "effect";
4
+ import { createHash } from "node:crypto";
5
+
6
+ // src/providers/azure/config.ts
7
+ const resolveConfig = Effect.fnUntraced(function* (input) {
8
+ yield* Schema.decodeUnknownEffect(Schema.Struct({
9
+ containerUrl: Schema.Union([Schema.String, Schema.Redacted(Schema.String)]),
10
+ storeId: Schema.optional(Schema.NonEmptyString),
11
+ credential: Schema.optional(Schema.Unknown),
12
+ requestTimeoutMillis: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),
13
+ maxUnknownLengthBytes: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),
14
+ leaseId: Schema.optional(Schema.Redacted(Schema.NonEmptyString)),
15
+ encryption: Schema.optional(Schema.Union([Schema.Struct({ scope: HeaderValue.check(Schema.isNonEmpty()) }), Schema.Struct({
16
+ key: Schema.Redacted(Schema.NonEmptyString),
17
+ keySHA256: Schema.NonEmptyString
18
+ })])),
19
+ checksumAlgorithm: Schema.optional(Schema.Literals(["None", "StorageCrc64"])),
20
+ profile: Schema.optional(Schema.Literal("block-blob"))
21
+ }), { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => storageError("make", "azure", {
22
+ _tag: "InvalidConfiguration",
23
+ field: "config"
24
+ })));
25
+ const rawUrl = Redacted.isRedacted(input.containerUrl) ? Redacted.value(input.containerUrl) : input.containerUrl;
26
+ const url = URL.parse(rawUrl);
27
+ if (!url || !["http:", "https:"].includes(url.protocol) || url.username || url.password || url.hash || url.pathname === "/" || url.search && !Redacted.isRedacted(input.containerUrl) || input.encryption && url.protocol !== "https:") return yield* storageError("make", "azure", {
28
+ _tag: "InvalidConfiguration",
29
+ field: "containerUrl-or-encryption"
30
+ });
31
+ if (input.encryption && "key" in input.encryption) {
32
+ const encoded = Redacted.value(input.encryption.key);
33
+ const bytes = Buffer.from(encoded, "base64");
34
+ if (bytes.length !== 32 || bytes.toString("base64") !== encoded || createHash("sha256").update(bytes).digest("base64") !== input.encryption.keySHA256) return yield* storageError("make", "azure", {
35
+ _tag: "InvalidConfiguration",
36
+ field: "encryption.key"
37
+ });
38
+ }
39
+ const publicUrl = `${url.origin}${url.pathname.replace(/\/$/u, "")}`;
40
+ return {
41
+ containerUrl: publicUrl,
42
+ storeId: input.storeId ?? `azure:${createHash("sha256").update(publicUrl).digest("hex")}`,
43
+ requestTimeoutMillis: input.requestTimeoutMillis ?? 3e4,
44
+ maxUnknownLengthBytes: input.maxUnknownLengthBytes ?? 16777216,
45
+ checksumAlgorithm: input.checksumAlgorithm ?? "None",
46
+ leaseId: input.leaseId,
47
+ encryption: input.encryption ? { ...input.encryption } : void 0
48
+ };
49
+ });
50
+ function encryption(config) {
51
+ return !config.encryption ? {} : "scope" in config.encryption ? { encryptionScope: config.encryption.scope } : { customerProvidedKey: {
52
+ encryptionAlgorithm: "AES256",
53
+ encryptionKey: Redacted.value(config.encryption.key),
54
+ encryptionKeySha256: config.encryption.keySHA256
55
+ } };
56
+ }
57
+ function lease(config) {
58
+ return config.leaseId ? { leaseId: Redacted.value(config.leaseId) } : {};
59
+ }
60
+
61
+ export { encryption, lease, resolveConfig };
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../src/providers/azure/config.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { Effect, Redacted, Schema } from \"effect\";\n\nimport type { ContainerClient, newPipeline } from \"@azure/storage-blob\";\n\nimport { storageError } from \"../../core/errors.js\";\nimport { HeaderValue } from \"../../core/object.js\";\n\nexport interface AzureConfig {\n /** Complete container URL; an existing SAS must be wrapped in Redacted. */\n readonly containerUrl: string | Redacted.Redacted<string>;\n readonly storeId?: string;\n readonly credential?: Parameters<typeof newPipeline>[0];\n readonly requestTimeoutMillis?: number;\n readonly maxUnknownLengthBytes?: number;\n readonly leaseId?: Redacted.Redacted<string>;\n readonly encryption?:\n | { readonly scope: string }\n | { readonly key: Redacted.Redacted<string>; readonly keySHA256: string };\n readonly checksumAlgorithm?: \"None\" | \"StorageCrc64\";\n readonly profile?: \"block-blob\";\n}\nexport const resolveConfig = Effect.fnUntraced(function* (input: AzureConfig) {\n yield* Schema.decodeUnknownEffect(\n Schema.Struct({\n containerUrl: Schema.Union([Schema.String, Schema.Redacted(Schema.String)]),\n storeId: Schema.optional(Schema.NonEmptyString),\n credential: Schema.optional(Schema.Unknown),\n requestTimeoutMillis: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),\n maxUnknownLengthBytes: Schema.optional(Schema.Int.check(Schema.isGreaterThan(0))),\n leaseId: Schema.optional(Schema.Redacted(Schema.NonEmptyString)),\n encryption: Schema.optional(\n Schema.Union([\n Schema.Struct({ scope: HeaderValue.check(Schema.isNonEmpty()) }),\n Schema.Struct({\n key: Schema.Redacted(Schema.NonEmptyString),\n keySHA256: Schema.NonEmptyString,\n }),\n ]),\n ),\n checksumAlgorithm: Schema.optional(Schema.Literals([\"None\", \"StorageCrc64\"])),\n profile: Schema.optional(Schema.Literal(\"block-blob\")),\n }),\n { onExcessProperty: \"error\" },\n )(input).pipe(\n Effect.mapError(() =>\n storageError(\"make\", \"azure\", { _tag: \"InvalidConfiguration\", field: \"config\" }),\n ),\n );\n const rawUrl = Redacted.isRedacted(input.containerUrl)\n ? Redacted.value(input.containerUrl)\n : input.containerUrl;\n const url = URL.parse(rawUrl);\n if (\n !url ||\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.hash ||\n url.pathname === \"/\" ||\n (url.search && !Redacted.isRedacted(input.containerUrl)) ||\n (input.encryption && url.protocol !== \"https:\")\n )\n return yield* storageError(\"make\", \"azure\", {\n _tag: \"InvalidConfiguration\",\n field: \"containerUrl-or-encryption\",\n });\n if (input.encryption && \"key\" in input.encryption) {\n const encoded = Redacted.value(input.encryption.key);\n const bytes = Buffer.from(encoded, \"base64\");\n if (\n bytes.length !== 32 ||\n bytes.toString(\"base64\") !== encoded ||\n createHash(\"sha256\").update(bytes).digest(\"base64\") !== input.encryption.keySHA256\n )\n return yield* storageError(\"make\", \"azure\", {\n _tag: \"InvalidConfiguration\",\n field: \"encryption.key\",\n });\n }\n const publicUrl = `${url.origin}${url.pathname.replace(/\\/$/u, \"\")}`;\n return {\n containerUrl: publicUrl,\n storeId: input.storeId ?? `azure:${createHash(\"sha256\").update(publicUrl).digest(\"hex\")}`,\n requestTimeoutMillis: input.requestTimeoutMillis ?? 30_000,\n maxUnknownLengthBytes: input.maxUnknownLengthBytes ?? 16 * 1024 * 1024,\n checksumAlgorithm: input.checksumAlgorithm ?? \"None\",\n leaseId: input.leaseId,\n encryption: input.encryption ? { ...input.encryption } : undefined,\n };\n});\nexport type ResolvedAzureConfig = Effect.Success<ReturnType<typeof resolveConfig>>;\nexport interface AzureConnection {\n readonly client: ContainerClient;\n readonly config: ResolvedAzureConfig;\n}\nexport function encryption(config: ResolvedAzureConfig) {\n return !config.encryption\n ? {}\n : \"scope\" in config.encryption\n ? { encryptionScope: config.encryption.scope }\n : {\n customerProvidedKey: {\n encryptionAlgorithm: \"AES256\" as const,\n encryptionKey: Redacted.value(config.encryption.key),\n encryptionKeySha256: config.encryption.keySHA256,\n },\n };\n}\nexport function lease(config: ResolvedAzureConfig) {\n return config.leaseId ? { leaseId: Redacted.value(config.leaseId) } : {};\n}\n"],"mappings":"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"}