@rikalabs/akter 0.1.0-alpha.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 (603) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +8 -0
  4. package/README.md +116 -0
  5. package/dist/actor/codecs.d.ts +77 -0
  6. package/dist/actor/codecs.js +87 -0
  7. package/dist/actor/connections.d.ts +34 -0
  8. package/dist/actor/connections.js +145 -0
  9. package/dist/actor/definition.d.ts +893 -0
  10. package/dist/actor/definition.js +147 -0
  11. package/dist/actor/descriptor.d.ts +172 -0
  12. package/dist/actor/descriptor.js +367 -0
  13. package/dist/actor/handles.d.ts +77 -0
  14. package/dist/actor/handles.js +265 -0
  15. package/dist/actor/jobs.d.ts +10 -0
  16. package/dist/actor/jobs.js +137 -0
  17. package/dist/actor/layers.d.ts +41 -0
  18. package/dist/actor/layers.js +177 -0
  19. package/dist/actor/reads.d.ts +47 -0
  20. package/dist/actor/reads.js +224 -0
  21. package/dist/actor/served.d.ts +120 -0
  22. package/dist/actor/served.js +72 -0
  23. package/dist/actor/turns.d.ts +13 -0
  24. package/dist/actor/turns.js +332 -0
  25. package/dist/actor/workflows.d.ts +16 -0
  26. package/dist/actor/workflows.js +37 -0
  27. package/dist/client/calls.d.ts +47 -0
  28. package/dist/client/calls.js +425 -0
  29. package/dist/client/clock.d.ts +56 -0
  30. package/dist/client/clock.js +119 -0
  31. package/dist/client/fleet-page.d.ts +15 -0
  32. package/dist/client/fleet-page.js +13 -0
  33. package/dist/client/fleet.d.ts +29 -0
  34. package/dist/client/fleet.js +51 -0
  35. package/dist/client/index.d.ts +17 -0
  36. package/dist/client/index.js +6 -0
  37. package/dist/client/make.d.ts +157 -0
  38. package/dist/client/make.js +221 -0
  39. package/dist/client/offline/queue.d.ts +118 -0
  40. package/dist/client/offline/queue.js +292 -0
  41. package/dist/client/offline/store.d.ts +74 -0
  42. package/dist/client/offline/store.js +78 -0
  43. package/dist/client/optimistic.d.ts +57 -0
  44. package/dist/client/optimistic.js +136 -0
  45. package/dist/client/report.d.ts +2 -0
  46. package/dist/client/report.js +8 -0
  47. package/dist/client/sessions/connection.d.ts +118 -0
  48. package/dist/client/sessions/connection.js +162 -0
  49. package/dist/client/sessions/feed.d.ts +42 -0
  50. package/dist/client/sessions/feed.js +43 -0
  51. package/dist/client/sessions/sse.d.ts +47 -0
  52. package/dist/client/sessions/sse.js +112 -0
  53. package/dist/client/sessions/stream.d.ts +28 -0
  54. package/dist/client/sessions/stream.js +35 -0
  55. package/dist/client/sessions/watch.d.ts +34 -0
  56. package/dist/client/sessions/watch.js +40 -0
  57. package/dist/client/transport.d.ts +37 -0
  58. package/dist/client/transport.js +66 -0
  59. package/dist/contexts/command.d.ts +132 -0
  60. package/dist/contexts/command.js +20 -0
  61. package/dist/contexts/connection.d.ts +68 -0
  62. package/dist/contexts/connection.js +0 -0
  63. package/dist/contexts/job.d.ts +49 -0
  64. package/dist/contexts/job.js +0 -0
  65. package/dist/contexts/workflow.d.ts +147 -0
  66. package/dist/contexts/workflow.js +22 -0
  67. package/dist/errors/actor.d.ts +200 -0
  68. package/dist/errors/actor.js +271 -0
  69. package/dist/errors/content.d.ts +19 -0
  70. package/dist/errors/content.js +14 -0
  71. package/dist/errors/database.d.ts +22 -0
  72. package/dist/errors/database.js +23 -0
  73. package/dist/errors/events.d.ts +17 -0
  74. package/dist/errors/events.js +14 -0
  75. package/dist/errors/subscription.d.ts +12 -0
  76. package/dist/errors/subscription.js +8 -0
  77. package/dist/errors/workflow.d.ts +28 -0
  78. package/dist/errors/workflow.js +17 -0
  79. package/dist/handles/actors.d.ts +17 -0
  80. package/dist/handles/actors.js +7 -0
  81. package/dist/handles/content.d.ts +59 -0
  82. package/dist/handles/content.js +36 -0
  83. package/dist/handles/intents.d.ts +164 -0
  84. package/dist/handles/intents.js +214 -0
  85. package/dist/handles/run.d.ts +31 -0
  86. package/dist/handles/run.js +21 -0
  87. package/dist/handles/workflow.d.ts +27 -0
  88. package/dist/handles/workflow.js +23 -0
  89. package/dist/identity/caller.d.ts +105 -0
  90. package/dist/identity/caller.js +68 -0
  91. package/dist/identity/child.d.ts +18 -0
  92. package/dist/identity/child.js +39 -0
  93. package/dist/identity/command.d.ts +19 -0
  94. package/dist/identity/command.js +21 -0
  95. package/dist/identity/connection.d.ts +24 -0
  96. package/dist/identity/connection.js +29 -0
  97. package/dist/identity/content.d.ts +18 -0
  98. package/dist/identity/content.js +12 -0
  99. package/dist/identity/digest.d.ts +4 -0
  100. package/dist/identity/digest.js +5 -0
  101. package/dist/identity/execution.d.ts +32 -0
  102. package/dist/identity/execution.js +63 -0
  103. package/dist/identity/mint.d.ts +51 -0
  104. package/dist/identity/mint.js +76 -0
  105. package/dist/identity/version.d.ts +2 -0
  106. package/dist/identity/version.js +3 -0
  107. package/dist/index.d.ts +159 -0
  108. package/dist/index.js +97 -0
  109. package/dist/members/blob.d.ts +43 -0
  110. package/dist/members/blob.js +29 -0
  111. package/dist/members/command.d.ts +109 -0
  112. package/dist/members/command.js +61 -0
  113. package/dist/members/connection.d.ts +55 -0
  114. package/dist/members/connection.js +49 -0
  115. package/dist/members/event.d.ts +36 -0
  116. package/dist/members/event.js +24 -0
  117. package/dist/members/job.d.ts +157 -0
  118. package/dist/members/job.js +67 -0
  119. package/dist/members/payload.d.ts +93 -0
  120. package/dist/members/payload.js +145 -0
  121. package/dist/members/reducer.d.ts +64 -0
  122. package/dist/members/reducer.js +27 -0
  123. package/dist/members/stream.d.ts +36 -0
  124. package/dist/members/stream.js +14 -0
  125. package/dist/members/subscription.d.ts +182 -0
  126. package/dist/members/subscription.js +91 -0
  127. package/dist/members/workflow.d.ts +99 -0
  128. package/dist/members/workflow.js +2 -0
  129. package/dist/policies/access.d.ts +35 -0
  130. package/dist/policies/access.js +6 -0
  131. package/dist/policies/command.d.ts +127 -0
  132. package/dist/policies/command.js +45 -0
  133. package/dist/policies/job.d.ts +28 -0
  134. package/dist/policies/job.js +60 -0
  135. package/dist/policies/schedules.d.ts +33 -0
  136. package/dist/policies/schedules.js +131 -0
  137. package/dist/protocol/frames.d.ts +66 -0
  138. package/dist/protocol/frames.js +55 -0
  139. package/dist/protocol/inspection.d.ts +807 -0
  140. package/dist/protocol/inspection.js +243 -0
  141. package/dist/protocol/wire.d.ts +184 -0
  142. package/dist/protocol/wire.js +150 -0
  143. package/dist/runtime/actors.d.ts +155 -0
  144. package/dist/runtime/actors.js +4 -0
  145. package/dist/runtime/admission.d.ts +34 -0
  146. package/dist/runtime/admission.js +72 -0
  147. package/dist/runtime/adoption/backfill.d.ts +27 -0
  148. package/dist/runtime/adoption/backfill.js +144 -0
  149. package/dist/runtime/adoption/enforce.d.ts +55 -0
  150. package/dist/runtime/adoption/enforce.js +241 -0
  151. package/dist/runtime/adoption/observe.d.ts +43 -0
  152. package/dist/runtime/adoption/observe.js +139 -0
  153. package/dist/runtime/adoption/plan.d.ts +45 -0
  154. package/dist/runtime/adoption/plan.js +192 -0
  155. package/dist/runtime/adoption/startup.d.ts +32 -0
  156. package/dist/runtime/adoption/startup.js +76 -0
  157. package/dist/runtime/adoption/status.d.ts +23 -0
  158. package/dist/runtime/adoption/status.js +47 -0
  159. package/dist/runtime/adoption/target.d.ts +33 -0
  160. package/dist/runtime/adoption/target.js +49 -0
  161. package/dist/runtime/connections/holder.d.ts +221 -0
  162. package/dist/runtime/connections/holder.js +816 -0
  163. package/dist/runtime/connections/owner.d.ts +263 -0
  164. package/dist/runtime/connections/owner.js +896 -0
  165. package/dist/runtime/connections/protocol.d.ts +441 -0
  166. package/dist/runtime/connections/protocol.js +222 -0
  167. package/dist/runtime/connections/reads.d.ts +24 -0
  168. package/dist/runtime/connections/reads.js +19 -0
  169. package/dist/runtime/connections/streams.d.ts +62 -0
  170. package/dist/runtime/connections/streams.js +128 -0
  171. package/dist/runtime/connections/transport.d.ts +40 -0
  172. package/dist/runtime/connections/transport.js +68 -0
  173. package/dist/runtime/connections/watch.d.ts +52 -0
  174. package/dist/runtime/connections/watch.js +159 -0
  175. package/dist/runtime/content/grant.d.ts +34 -0
  176. package/dist/runtime/content/grant.js +58 -0
  177. package/dist/runtime/content/store.d.ts +63 -0
  178. package/dist/runtime/content/store.js +294 -0
  179. package/dist/runtime/cron/key.d.ts +2 -0
  180. package/dist/runtime/cron/key.js +2 -0
  181. package/dist/runtime/cron/schedule.d.ts +69 -0
  182. package/dist/runtime/cron/schedule.js +144 -0
  183. package/dist/runtime/database/bounded.d.ts +43 -0
  184. package/dist/runtime/database/bounded.js +108 -0
  185. package/dist/runtime/database/connection.d.ts +8 -0
  186. package/dist/runtime/database/connection.js +18 -0
  187. package/dist/runtime/database/coordination.d.ts +19 -0
  188. package/dist/runtime/database/coordination.js +72 -0
  189. package/dist/runtime/database/flock.d.ts +10 -0
  190. package/dist/runtime/database/flock.js +60 -0
  191. package/dist/runtime/database/gate.d.ts +26 -0
  192. package/dist/runtime/database/gate.js +54 -0
  193. package/dist/runtime/database/keepalive.d.ts +11 -0
  194. package/dist/runtime/database/keepalive.js +22 -0
  195. package/dist/runtime/database/migrations.d.ts +177 -0
  196. package/dist/runtime/database/migrations.js +1018 -0
  197. package/dist/runtime/database/neki/migrations.d.ts +31 -0
  198. package/dist/runtime/database/neki/migrations.js +276 -0
  199. package/dist/runtime/database/neki/session.d.ts +23 -0
  200. package/dist/runtime/database/neki/session.js +31 -0
  201. package/dist/runtime/database/pglite.d.ts +21 -0
  202. package/dist/runtime/database/pglite.js +74 -0
  203. package/dist/runtime/database/replica.d.ts +41 -0
  204. package/dist/runtime/database/replica.js +51 -0
  205. package/dist/runtime/database/shards.d.ts +21 -0
  206. package/dist/runtime/database/shards.js +37 -0
  207. package/dist/runtime/database/snapshot.d.ts +7 -0
  208. package/dist/runtime/database/snapshot.js +7 -0
  209. package/dist/runtime/database/tenancy.d.ts +69 -0
  210. package/dist/runtime/database/tenancy.js +145 -0
  211. package/dist/runtime/database/transient.d.ts +10 -0
  212. package/dist/runtime/database/transient.js +25 -0
  213. package/dist/runtime/drain.d.ts +132 -0
  214. package/dist/runtime/drain.js +109 -0
  215. package/dist/runtime/entity/mailbox.d.ts +86 -0
  216. package/dist/runtime/entity/mailbox.js +121 -0
  217. package/dist/runtime/entity/register.d.ts +424 -0
  218. package/dist/runtime/entity/register.js +669 -0
  219. package/dist/runtime/events/append.d.ts +192 -0
  220. package/dist/runtime/events/append.js +128 -0
  221. package/dist/runtime/events/cursor.d.ts +2 -0
  222. package/dist/runtime/events/cursor.js +5 -0
  223. package/dist/runtime/events/replay.d.ts +20 -0
  224. package/dist/runtime/events/replay.js +45 -0
  225. package/dist/runtime/feeds.d.ts +26 -0
  226. package/dist/runtime/feeds.js +100 -0
  227. package/dist/runtime/fleet/checks.d.ts +17 -0
  228. package/dist/runtime/fleet/checks.js +106 -0
  229. package/dist/runtime/fleet/maintainer.d.ts +38 -0
  230. package/dist/runtime/fleet/maintainer.js +383 -0
  231. package/dist/runtime/fleet/pgoutput.d.ts +41 -0
  232. package/dist/runtime/fleet/pgoutput.js +102 -0
  233. package/dist/runtime/fleet/setup.d.ts +36 -0
  234. package/dist/runtime/fleet/setup.js +58 -0
  235. package/dist/runtime/fleet/subscribe.d.ts +42 -0
  236. package/dist/runtime/fleet/subscribe.js +147 -0
  237. package/dist/runtime/index.d.ts +66 -0
  238. package/dist/runtime/index.js +37 -0
  239. package/dist/runtime/inspector/http.d.ts +19 -0
  240. package/dist/runtime/inspector/http.js +36 -0
  241. package/dist/runtime/inspector/layer.d.ts +46 -0
  242. package/dist/runtime/inspector/layer.js +180 -0
  243. package/dist/runtime/inspector/queries.d.ts +711 -0
  244. package/dist/runtime/inspector/queries.js +494 -0
  245. package/dist/runtime/jobs/attempt.d.ts +254 -0
  246. package/dist/runtime/jobs/attempt.js +413 -0
  247. package/dist/runtime/jobs/isolation.d.ts +20 -0
  248. package/dist/runtime/jobs/isolation.js +10 -0
  249. package/dist/runtime/jobs/progress.d.ts +95 -0
  250. package/dist/runtime/jobs/progress.js +144 -0
  251. package/dist/runtime/layer.d.ts +260 -0
  252. package/dist/runtime/layer.js +876 -0
  253. package/dist/runtime/members.d.ts +381 -0
  254. package/dist/runtime/members.js +8 -0
  255. package/dist/runtime/operators/audit.d.ts +64 -0
  256. package/dist/runtime/operators/audit.js +56 -0
  257. package/dist/runtime/operators/auth.d.ts +29 -0
  258. package/dist/runtime/operators/auth.js +42 -0
  259. package/dist/runtime/operators/export.d.ts +68 -0
  260. package/dist/runtime/operators/export.js +137 -0
  261. package/dist/runtime/operators/grants.d.ts +45 -0
  262. package/dist/runtime/operators/grants.js +40 -0
  263. package/dist/runtime/operators/repair.d.ts +206 -0
  264. package/dist/runtime/operators/repair.js +226 -0
  265. package/dist/runtime/operators/routes.d.ts +35 -0
  266. package/dist/runtime/operators/routes.js +190 -0
  267. package/dist/runtime/operators/seed.d.ts +123 -0
  268. package/dist/runtime/operators/seed.js +123 -0
  269. package/dist/runtime/payloads/versions.d.ts +65 -0
  270. package/dist/runtime/payloads/versions.js +240 -0
  271. package/dist/runtime/peering/authority.d.ts +42 -0
  272. package/dist/runtime/peering/authority.js +132 -0
  273. package/dist/runtime/peering/credentials.d.ts +21 -0
  274. package/dist/runtime/peering/credentials.js +13 -0
  275. package/dist/runtime/peering/transport.d.ts +51 -0
  276. package/dist/runtime/peering/transport.js +175 -0
  277. package/dist/runtime/queries.d.ts +18 -0
  278. package/dist/runtime/queries.js +169 -0
  279. package/dist/runtime/readiness.d.ts +36 -0
  280. package/dist/runtime/readiness.js +44 -0
  281. package/dist/runtime/registration.d.ts +58 -0
  282. package/dist/runtime/registration.js +186 -0
  283. package/dist/runtime/request.d.ts +158 -0
  284. package/dist/runtime/request.js +102 -0
  285. package/dist/runtime/retry.d.ts +8 -0
  286. package/dist/runtime/retry.js +11 -0
  287. package/dist/runtime/runner.d.ts +93 -0
  288. package/dist/runtime/runner.js +122 -0
  289. package/dist/runtime/storage/codec.d.ts +39 -0
  290. package/dist/runtime/storage/codec.js +41 -0
  291. package/dist/runtime/storage/generation.d.ts +69 -0
  292. package/dist/runtime/storage/generation.js +49 -0
  293. package/dist/runtime/storage/placements.d.ts +15 -0
  294. package/dist/runtime/storage/placements.js +38 -0
  295. package/dist/runtime/storage/platform.d.ts +6 -0
  296. package/dist/runtime/storage/platform.js +9 -0
  297. package/dist/runtime/storage/retention.d.ts +73 -0
  298. package/dist/runtime/storage/retention.js +158 -0
  299. package/dist/runtime/subscriptions/identity.d.ts +31 -0
  300. package/dist/runtime/subscriptions/identity.js +45 -0
  301. package/dist/runtime/subscriptions/relay.d.ts +175 -0
  302. package/dist/runtime/subscriptions/relay.js +763 -0
  303. package/dist/runtime/subscriptions/storage.d.ts +40 -0
  304. package/dist/runtime/subscriptions/storage.js +98 -0
  305. package/dist/runtime/sweeps.d.ts +39 -0
  306. package/dist/runtime/sweeps.js +54 -0
  307. package/dist/runtime/telemetry/defects.d.ts +57 -0
  308. package/dist/runtime/telemetry/defects.js +43 -0
  309. package/dist/runtime/telemetry/metrics.d.ts +52 -0
  310. package/dist/runtime/telemetry/metrics.js +138 -0
  311. package/dist/runtime/telemetry/routes.d.ts +19 -0
  312. package/dist/runtime/telemetry/routes.js +18 -0
  313. package/dist/runtime/telemetry/sampler.d.ts +26 -0
  314. package/dist/runtime/telemetry/sampler.js +101 -0
  315. package/dist/runtime/telemetry/spans.d.ts +38 -0
  316. package/dist/runtime/telemetry/spans.js +44 -0
  317. package/dist/runtime/telemetry/usage.d.ts +52 -0
  318. package/dist/runtime/telemetry/usage.js +30 -0
  319. package/dist/runtime/topology/admission.d.ts +13 -0
  320. package/dist/runtime/topology/admission.js +36 -0
  321. package/dist/runtime/topology/locks.d.ts +56 -0
  322. package/dist/runtime/topology/locks.js +81 -0
  323. package/dist/runtime/topology/messages.d.ts +15 -0
  324. package/dist/runtime/topology/messages.js +32 -0
  325. package/dist/runtime/turn/admission.d.ts +22 -0
  326. package/dist/runtime/turn/admission.js +41 -0
  327. package/dist/runtime/turn/blobs.d.ts +38 -0
  328. package/dist/runtime/turn/blobs.js +215 -0
  329. package/dist/runtime/turn/execute.d.ts +208 -0
  330. package/dist/runtime/turn/execute.js +972 -0
  331. package/dist/runtime/turn/group.d.ts +165 -0
  332. package/dist/runtime/turn/group.js +326 -0
  333. package/dist/runtime/turn/hooks.d.ts +44 -0
  334. package/dist/runtime/turn/hooks.js +28 -0
  335. package/dist/runtime/turn/outbox.d.ts +159 -0
  336. package/dist/runtime/turn/outbox.js +269 -0
  337. package/dist/runtime/turn/pipeline.d.ts +68 -0
  338. package/dist/runtime/turn/pipeline.js +83 -0
  339. package/dist/runtime/turn/receipt.d.ts +81 -0
  340. package/dist/runtime/turn/receipt.js +32 -0
  341. package/dist/runtime/turn/relay.d.ts +179 -0
  342. package/dist/runtime/turn/relay.js +685 -0
  343. package/dist/runtime/turn/rows.d.ts +43 -0
  344. package/dist/runtime/turn/rows.js +592 -0
  345. package/dist/runtime/workflows/compatibility.d.ts +125 -0
  346. package/dist/runtime/workflows/compatibility.js +285 -0
  347. package/dist/runtime/workflows/engine.d.ts +107 -0
  348. package/dist/runtime/workflows/engine.js +826 -0
  349. package/dist/runtime/workflows/manifest.d.ts +34 -0
  350. package/dist/runtime/workflows/manifest.js +39 -0
  351. package/dist/runtime/workflows/steps.d.ts +33 -0
  352. package/dist/runtime/workflows/steps.js +152 -0
  353. package/dist/serve/api.d.ts +99 -0
  354. package/dist/serve/api.js +403 -0
  355. package/dist/serve/assertion/binding.d.ts +41 -0
  356. package/dist/serve/assertion/binding.js +92 -0
  357. package/dist/serve/assertion/verify.d.ts +93 -0
  358. package/dist/serve/assertion/verify.js +189 -0
  359. package/dist/serve/auth.d.ts +200 -0
  360. package/dist/serve/auth.js +92 -0
  361. package/dist/serve/clock.d.ts +10 -0
  362. package/dist/serve/clock.js +25 -0
  363. package/dist/serve/jwt.d.ts +65 -0
  364. package/dist/serve/jwt.js +202 -0
  365. package/dist/serve/layer.d.ts +98 -0
  366. package/dist/serve/layer.js +809 -0
  367. package/dist/serve/mcp/endpoint.d.ts +39 -0
  368. package/dist/serve/mcp/endpoint.js +187 -0
  369. package/dist/serve/mcp/tools.d.ts +37 -0
  370. package/dist/serve/mcp/tools.js +125 -0
  371. package/dist/serve/origin.d.ts +6 -0
  372. package/dist/serve/origin.js +21 -0
  373. package/dist/serve/sessions/feed.d.ts +79 -0
  374. package/dist/serve/sessions/feed.js +115 -0
  375. package/dist/serve/sessions/socket.d.ts +56 -0
  376. package/dist/serve/sessions/socket.js +212 -0
  377. package/dist/serve/sessions/sse.d.ts +27 -0
  378. package/dist/serve/sessions/sse.js +26 -0
  379. package/dist/serve/sessions/stream.d.ts +9 -0
  380. package/dist/serve/sessions/stream.js +9 -0
  381. package/dist/serve/sessions/watch.d.ts +12 -0
  382. package/dist/serve/sessions/watch.js +11 -0
  383. package/dist/serve/wire.d.ts +16 -0
  384. package/dist/serve/wire.js +50 -0
  385. package/dist/state/blob.d.ts +71 -0
  386. package/dist/state/blob.js +0 -0
  387. package/dist/state/migration.d.ts +53 -0
  388. package/dist/state/migration.js +29 -0
  389. package/dist/tables/fleet.d.ts +170 -0
  390. package/dist/tables/fleet.js +214 -0
  391. package/dist/tables/owned.d.ts +250 -0
  392. package/dist/tables/owned.js +233 -0
  393. package/dist/testing/actor-test.d.ts +360 -0
  394. package/dist/testing/actor-test.js +337 -0
  395. package/dist/testing/cluster.d.ts +93 -0
  396. package/dist/testing/cluster.js +296 -0
  397. package/dist/testing/conformance/access.d.ts +5 -0
  398. package/dist/testing/conformance/access.js +531 -0
  399. package/dist/testing/conformance/admission.d.ts +11 -0
  400. package/dist/testing/conformance/admission.js +182 -0
  401. package/dist/testing/conformance/adoption.d.ts +2 -0
  402. package/dist/testing/conformance/adoption.js +1019 -0
  403. package/dist/testing/conformance/assertions.d.ts +202 -0
  404. package/dist/testing/conformance/assertions.js +849 -0
  405. package/dist/testing/conformance/batches.d.ts +41 -0
  406. package/dist/testing/conformance/batches.js +388 -0
  407. package/dist/testing/conformance/blobs.d.ts +14 -0
  408. package/dist/testing/conformance/blobs.js +405 -0
  409. package/dist/testing/conformance/capacity.d.ts +8 -0
  410. package/dist/testing/conformance/capacity.js +433 -0
  411. package/dist/testing/conformance/client.d.ts +5 -0
  412. package/dist/testing/conformance/client.js +719 -0
  413. package/dist/testing/conformance/cold-serve.d.ts +16 -0
  414. package/dist/testing/conformance/cold-serve.js +254 -0
  415. package/dist/testing/conformance/connections/actors.d.ts +1143 -0
  416. package/dist/testing/conformance/connections/actors.js +180 -0
  417. package/dist/testing/conformance/connections/harness.d.ts +1754 -0
  418. package/dist/testing/conformance/connections/harness.js +142 -0
  419. package/dist/testing/conformance/connections/holders.d.ts +4 -0
  420. package/dist/testing/conformance/connections/holders.js +165 -0
  421. package/dist/testing/conformance/connections/lifecycle.d.ts +4 -0
  422. package/dist/testing/conformance/connections/lifecycle.js +113 -0
  423. package/dist/testing/conformance/connections/limits.d.ts +4 -0
  424. package/dist/testing/conformance/connections/limits.js +127 -0
  425. package/dist/testing/conformance/connections/reauthorization.d.ts +4 -0
  426. package/dist/testing/conformance/connections/reauthorization.js +170 -0
  427. package/dist/testing/conformance/connections/resync.d.ts +4 -0
  428. package/dist/testing/conformance/connections/resync.js +360 -0
  429. package/dist/testing/conformance/connections/takeover.d.ts +4 -0
  430. package/dist/testing/conformance/connections/takeover.js +287 -0
  431. package/dist/testing/conformance/connections.d.ts +4 -0
  432. package/dist/testing/conformance/connections.js +15 -0
  433. package/dist/testing/conformance/content-blobs.d.ts +16 -0
  434. package/dist/testing/conformance/content-blobs.js +534 -0
  435. package/dist/testing/conformance/counter.d.ts +16 -0
  436. package/dist/testing/conformance/counter.js +813 -0
  437. package/dist/testing/conformance/cron.d.ts +5 -0
  438. package/dist/testing/conformance/cron.js +665 -0
  439. package/dist/testing/conformance/drain.d.ts +26 -0
  440. package/dist/testing/conformance/drain.js +540 -0
  441. package/dist/testing/conformance/effect-control.d.ts +38 -0
  442. package/dist/testing/conformance/effect-control.js +1059 -0
  443. package/dist/testing/conformance/effects.d.ts +23 -0
  444. package/dist/testing/conformance/effects.js +432 -0
  445. package/dist/testing/conformance/events.d.ts +28 -0
  446. package/dist/testing/conformance/events.js +335 -0
  447. package/dist/testing/conformance/export.d.ts +2 -0
  448. package/dist/testing/conformance/export.js +368 -0
  449. package/dist/testing/conformance/fleet.d.ts +444 -0
  450. package/dist/testing/conformance/fleet.js +1009 -0
  451. package/dist/testing/conformance/groups.d.ts +7 -0
  452. package/dist/testing/conformance/groups.js +353 -0
  453. package/dist/testing/conformance/heap.d.ts +3 -0
  454. package/dist/testing/conformance/heap.js +149 -0
  455. package/dist/testing/conformance/http.d.ts +2809 -0
  456. package/dist/testing/conformance/http.js +1234 -0
  457. package/dist/testing/conformance/inspection-views.d.ts +8 -0
  458. package/dist/testing/conformance/inspection-views.js +272 -0
  459. package/dist/testing/conformance/inspector.d.ts +7 -0
  460. package/dist/testing/conformance/inspector.js +650 -0
  461. package/dist/testing/conformance/mint.d.ts +58 -0
  462. package/dist/testing/conformance/mint.js +692 -0
  463. package/dist/testing/conformance/multi-runner.d.ts +8 -0
  464. package/dist/testing/conformance/multi-runner.js +403 -0
  465. package/dist/testing/conformance/neki/plan.d.ts +19 -0
  466. package/dist/testing/conformance/neki/plan.js +30 -0
  467. package/dist/testing/conformance/observability.d.ts +3 -0
  468. package/dist/testing/conformance/observability.js +343 -0
  469. package/dist/testing/conformance/offline.d.ts +4 -0
  470. package/dist/testing/conformance/offline.js +474 -0
  471. package/dist/testing/conformance/operator-harness.d.ts +57 -0
  472. package/dist/testing/conformance/operator-harness.js +78 -0
  473. package/dist/testing/conformance/operator.d.ts +3 -0
  474. package/dist/testing/conformance/operator.js +379 -0
  475. package/dist/testing/conformance/outbox-cross-shard.d.ts +14 -0
  476. package/dist/testing/conformance/outbox-cross-shard.js +160 -0
  477. package/dist/testing/conformance/outbox.d.ts +36 -0
  478. package/dist/testing/conformance/outbox.js +437 -0
  479. package/dist/testing/conformance/payload-migrations.d.ts +3 -0
  480. package/dist/testing/conformance/payload-migrations.js +612 -0
  481. package/dist/testing/conformance/pipeline.d.ts +3 -0
  482. package/dist/testing/conformance/pipeline.js +1040 -0
  483. package/dist/testing/conformance/placement.d.ts +22 -0
  484. package/dist/testing/conformance/placement.js +539 -0
  485. package/dist/testing/conformance/platform.d.ts +40 -0
  486. package/dist/testing/conformance/platform.js +101 -0
  487. package/dist/testing/conformance/progress.d.ts +39 -0
  488. package/dist/testing/conformance/progress.js +666 -0
  489. package/dist/testing/conformance/properties.d.ts +6 -0
  490. package/dist/testing/conformance/properties.js +295 -0
  491. package/dist/testing/conformance/protocols.d.ts +4 -0
  492. package/dist/testing/conformance/protocols.js +618 -0
  493. package/dist/testing/conformance/provider/advertise.d.ts +21 -0
  494. package/dist/testing/conformance/provider/advertise.js +44 -0
  495. package/dist/testing/conformance/read-your-writes.d.ts +20 -0
  496. package/dist/testing/conformance/read-your-writes.js +192 -0
  497. package/dist/testing/conformance/reducers.d.ts +8 -0
  498. package/dist/testing/conformance/reducers.js +258 -0
  499. package/dist/testing/conformance/relay.d.ts +42 -0
  500. package/dist/testing/conformance/relay.js +1115 -0
  501. package/dist/testing/conformance/restore.d.ts +43 -0
  502. package/dist/testing/conformance/restore.js +341 -0
  503. package/dist/testing/conformance/retention.d.ts +14 -0
  504. package/dist/testing/conformance/retention.js +463 -0
  505. package/dist/testing/conformance/rls.d.ts +24 -0
  506. package/dist/testing/conformance/rls.js +576 -0
  507. package/dist/testing/conformance/simulation.d.ts +31 -0
  508. package/dist/testing/conformance/simulation.js +167 -0
  509. package/dist/testing/conformance/single-shard.d.ts +2 -0
  510. package/dist/testing/conformance/single-shard.js +125 -0
  511. package/dist/testing/conformance/singleton.d.ts +3 -0
  512. package/dist/testing/conformance/singleton.js +293 -0
  513. package/dist/testing/conformance/statements.d.ts +60 -0
  514. package/dist/testing/conformance/statements.js +108 -0
  515. package/dist/testing/conformance/streams.d.ts +7 -0
  516. package/dist/testing/conformance/streams.js +280 -0
  517. package/dist/testing/conformance/subscriptions/access.d.ts +4 -0
  518. package/dist/testing/conformance/subscriptions/access.js +98 -0
  519. package/dist/testing/conformance/subscriptions/actors.d.ts +4910 -0
  520. package/dist/testing/conformance/subscriptions/actors.js +372 -0
  521. package/dist/testing/conformance/subscriptions/cluster.d.ts +4 -0
  522. package/dist/testing/conformance/subscriptions/cluster.js +89 -0
  523. package/dist/testing/conformance/subscriptions/delivery.d.ts +4 -0
  524. package/dist/testing/conformance/subscriptions/delivery.js +253 -0
  525. package/dist/testing/conformance/subscriptions/deploys.d.ts +4 -0
  526. package/dist/testing/conformance/subscriptions/deploys.js +162 -0
  527. package/dist/testing/conformance/subscriptions/epochs.d.ts +4 -0
  528. package/dist/testing/conformance/subscriptions/epochs.js +169 -0
  529. package/dist/testing/conformance/subscriptions/failures.d.ts +4 -0
  530. package/dist/testing/conformance/subscriptions/failures.js +108 -0
  531. package/dist/testing/conformance/subscriptions/feeds.d.ts +4 -0
  532. package/dist/testing/conformance/subscriptions/feeds.js +218 -0
  533. package/dist/testing/conformance/subscriptions/harness.d.ts +124 -0
  534. package/dist/testing/conformance/subscriptions/harness.js +143 -0
  535. package/dist/testing/conformance/subscriptions/operator.d.ts +4 -0
  536. package/dist/testing/conformance/subscriptions/operator.js +128 -0
  537. package/dist/testing/conformance/subscriptions/retention.d.ts +4 -0
  538. package/dist/testing/conformance/subscriptions/retention.js +288 -0
  539. package/dist/testing/conformance/subscriptions/routing.d.ts +4 -0
  540. package/dist/testing/conformance/subscriptions/routing.js +179 -0
  541. package/dist/testing/conformance/subscriptions.d.ts +4 -0
  542. package/dist/testing/conformance/subscriptions.js +19 -0
  543. package/dist/testing/conformance/tables.d.ts +125 -0
  544. package/dist/testing/conformance/tables.js +664 -0
  545. package/dist/testing/conformance/transports/actors.d.ts +1907 -0
  546. package/dist/testing/conformance/transports/actors.js +163 -0
  547. package/dist/testing/conformance/transports/client.d.ts +3 -0
  548. package/dist/testing/conformance/transports/client.js +237 -0
  549. package/dist/testing/conformance/transports/feeds.d.ts +3 -0
  550. package/dist/testing/conformance/transports/feeds.js +232 -0
  551. package/dist/testing/conformance/transports/harness.d.ts +93 -0
  552. package/dist/testing/conformance/transports/harness.js +84 -0
  553. package/dist/testing/conformance/transports/streams.d.ts +3 -0
  554. package/dist/testing/conformance/transports/streams.js +96 -0
  555. package/dist/testing/conformance/transports/websocket.d.ts +3 -0
  556. package/dist/testing/conformance/transports/websocket.js +384 -0
  557. package/dist/testing/conformance/transports/wire.d.ts +141 -0
  558. package/dist/testing/conformance/transports/wire.js +204 -0
  559. package/dist/testing/conformance/transports.d.ts +3 -0
  560. package/dist/testing/conformance/transports.js +11 -0
  561. package/dist/testing/conformance/watch.d.ts +59 -0
  562. package/dist/testing/conformance/watch.js +879 -0
  563. package/dist/testing/conformance/workflow-engine.d.ts +97 -0
  564. package/dist/testing/conformance/workflow-engine.js +253 -0
  565. package/dist/testing/conformance/workflow-versions.d.ts +3 -0
  566. package/dist/testing/conformance/workflow-versions.js +545 -0
  567. package/dist/testing/conformance/workflows/access.d.ts +4 -0
  568. package/dist/testing/conformance/workflows/access.js +147 -0
  569. package/dist/testing/conformance/workflows/actors.d.ts +2317 -0
  570. package/dist/testing/conformance/workflows/actors.js +305 -0
  571. package/dist/testing/conformance/workflows/basics.d.ts +4 -0
  572. package/dist/testing/conformance/workflows/basics.js +144 -0
  573. package/dist/testing/conformance/workflows/engine.d.ts +4 -0
  574. package/dist/testing/conformance/workflows/engine.js +80 -0
  575. package/dist/testing/conformance/workflows/guards.d.ts +4 -0
  576. package/dist/testing/conformance/workflows/guards.js +172 -0
  577. package/dist/testing/conformance/workflows/harness.d.ts +14 -0
  578. package/dist/testing/conformance/workflows/harness.js +44 -0
  579. package/dist/testing/conformance/workflows/recovery.d.ts +4 -0
  580. package/dist/testing/conformance/workflows/recovery.js +181 -0
  581. package/dist/testing/conformance/workflows/starts.d.ts +4 -0
  582. package/dist/testing/conformance/workflows/starts.js +57 -0
  583. package/dist/testing/conformance/workflows/suspension.d.ts +4 -0
  584. package/dist/testing/conformance/workflows/suspension.js +106 -0
  585. package/dist/testing/conformance/workflows/waits.d.ts +4 -0
  586. package/dist/testing/conformance/workflows/waits.js +284 -0
  587. package/dist/testing/conformance/workflows.d.ts +4 -0
  588. package/dist/testing/conformance/workflows.js +19 -0
  589. package/dist/testing/conformance.d.ts +330 -0
  590. package/dist/testing/conformance.js +364 -0
  591. package/dist/testing/database.d.ts +31 -0
  592. package/dist/testing/database.js +70 -0
  593. package/dist/testing/foundation.d.ts +41 -0
  594. package/dist/testing/foundation.js +517 -0
  595. package/dist/testing/index.d.ts +20 -0
  596. package/dist/testing/index.js +12 -0
  597. package/dist/testing/property.d.ts +40 -0
  598. package/dist/testing/property.js +95 -0
  599. package/dist/testing/simulate-cluster.d.ts +112 -0
  600. package/dist/testing/simulate-cluster.js +257 -0
  601. package/dist/testing/simulate.d.ts +90 -0
  602. package/dist/testing/simulate.js +127 -0
  603. package/package.json +1 -0
@@ -0,0 +1,63 @@
1
+ import { Cause, Crypto, Effect, Option, Stream } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { ContentTooLarge } from "../../errors/content.ts";
4
+ import type { ContentPoint } from "../turn/hooks.ts";
5
+ import { type Grants } from "./grant.ts";
6
+ /** Bytes one content may hold. */
7
+ export declare const MAX_CONTENT_BYTES: number;
8
+ /**
9
+ * Bytes per stored chunk: well below the driver's 16 MiB message limit, so
10
+ * content of any size reads as one row per chunk.
11
+ */
12
+ export declare const CHUNK_BYTES: number;
13
+ /** The runtime's content configuration: grant keys, sweep timing, and connection limits. */
14
+ interface ContentSettings {
15
+ readonly grants: Grants;
16
+ /** How long unreferenced content outlives its last grant, before the turn and skew margins. */
17
+ readonly graceMs: number;
18
+ /** The bound on clock skew between any two shards' databases. */
19
+ readonly skewMs: number;
20
+ /**
21
+ * PGlite has one connection, so no transaction may stay open across a
22
+ * client's upload or download; those buffer in memory instead.
23
+ */
24
+ readonly singleConnection: boolean;
25
+ /** The framework clock's offset from database time; only tests move it. */
26
+ readonly offset: () => number;
27
+ readonly hooks: {
28
+ readonly at: (point: ContentPoint) => Effect.Effect<void>;
29
+ };
30
+ }
31
+ /**
32
+ * Tenant-scoped content storage: uploads, grant-checked reads, and the sweep
33
+ * of unreferenced content. Times come from the database clock plus the
34
+ * framework offset, read inside the statement that uses them so the time and
35
+ * the write come from one shard. Every content has chunk 0, even an empty
36
+ * one, so a content with no rows has been swept. The sweep's reference scan is
37
+ * a scatter across every actor shard on a sharded backend, and it deletes a
38
+ * content row and its chunks in one statement so they go together.
39
+ */
40
+ export declare const tenantContent: (settings: ContentSettings) => {
41
+ uploadBytes: (tenant: string, bytes: Uint8Array<ArrayBufferLike>) => Effect.Effect<{
42
+ readonly hash: string;
43
+ readonly size: number;
44
+ readonly grant: string;
45
+ }, ContentTooLarge | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
46
+ uploadStream: <E>(tenant: string, body: Stream.Stream<Uint8Array, E>, limit: number) => Effect.Effect<{
47
+ readonly hash: string;
48
+ readonly size: number;
49
+ readonly grant: string;
50
+ }, E | ContentTooLarge | import("effect/sql/SqlError").SqlError, Crypto.Crypto | SqlClient.SqlClient>;
51
+ grant: (tenant: string, hash: string, size: number) => Effect.Effect<Option.Option<{
52
+ readonly hash: string;
53
+ readonly size: number;
54
+ readonly grant: string;
55
+ }>, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
56
+ read: (tenant: string, hash: string, size: number) => Effect.Effect<Option.Option<Uint8Array<ArrayBuffer>>, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
57
+ stream: (tenant: string, hash: string, size: number, timeoutMs: number) => Stream.Stream<Uint8Array, Cause.NoSuchElementError, SqlClient.SqlClient>;
58
+ sweep: (force: boolean) => Effect.Effect<number, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
59
+ verify: (grant: string, bound: Omit<import("./grant.ts").Granted, "expiresAt">) => Effect.Effect<import("effect/Result").Result<number, import("../../index.ts").InvalidContentRef["reason"]>>;
60
+ };
61
+ /** The content store as the runtime consumes it. */
62
+ export type ContentStoreImpl = ReturnType<typeof tenantContent>;
63
+ export {};
@@ -0,0 +1,294 @@
1
+ import { Cause, Crypto, Effect, Option, Stream } from "effect";
2
+ import { sha256Bytes, sha256Hasher } from "../../identity/digest.js";
3
+ import { SqlClient } from "effect/sql";
4
+ import { ContentTooLarge } from "../../errors/content.js";
5
+ import { tenantRoutingKey } from "../storage/codec.js";
6
+ import { textArray } from "../turn/outbox.js";
7
+ import { GRANT_LIFETIME_MS } from "./grant.js";
8
+ /** Bytes one content may hold. */
9
+ export const MAX_CONTENT_BYTES = 64 * 1024 * 1024;
10
+ /**
11
+ * Bytes per stored chunk: well below the driver's 16 MiB message limit, so
12
+ * content of any size reads as one row per chunk.
13
+ */
14
+ export const CHUNK_BYTES = 1024 * 1024;
15
+ /** A tenant's content is swept at most this often. */
16
+ const SWEEP_INTERVAL_MS = 3_600_000;
17
+ /** Candidates one sweep statement considers. */
18
+ const SWEEP_BATCH = 500;
19
+ /** Tenants one sweep pass claims. */
20
+ const SWEEP_TENANTS = 100;
21
+ const hex = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
22
+ const concat = (parts, size) => {
23
+ const bytes = new Uint8Array(size);
24
+ let offset = 0;
25
+ for (const part of parts) {
26
+ bytes.set(part, offset);
27
+ offset += part.byteLength;
28
+ }
29
+ return bytes;
30
+ };
31
+ /** Stored chunks, checked against the size its reference recorded; none when any is missing. */
32
+ const complete = (rows, size) => {
33
+ let total = 0;
34
+ for (const [index, row] of rows.entries()) {
35
+ if (row.chunk !== index)
36
+ return Option.none();
37
+ total += row.bytes.byteLength;
38
+ }
39
+ return rows.length > 0 && total === size
40
+ ? Option.some(rows.map((row) => Uint8Array.from(row.bytes)))
41
+ : Option.none();
42
+ };
43
+ /**
44
+ * Tenant-scoped content storage: uploads, grant-checked reads, and the sweep
45
+ * of unreferenced content. Times come from the database clock plus the
46
+ * framework offset, read inside the statement that uses them so the time and
47
+ * the write come from one shard. Every content has chunk 0, even an empty
48
+ * one, so a content with no rows has been swept. The sweep's reference scan is
49
+ * a scatter across every actor shard on a sharded backend, and it deletes a
50
+ * content row and its chunks in one statement so they go together.
51
+ */
52
+ export const tenantContent = (settings) => {
53
+ const { grants, hooks } = settings;
54
+ const clock = (sql) => sql `(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint + ${settings.offset()})`;
55
+ const now = Effect.gen(function* () {
56
+ const sql = yield* SqlClient.SqlClient;
57
+ const [row] = yield* sql `SELECT ${clock(sql)}::text AS now`;
58
+ return Number(row.now);
59
+ });
60
+ const refOf = (tenant, hash, size, expiresAt) => Effect.map(grants.sign({ tenant, hash, size, expiresAt }), (grant) => ({
61
+ hash,
62
+ size,
63
+ grant,
64
+ }));
65
+ /**
66
+ * Creates the content row or raises its grant horizon, and registers the
67
+ * tenant with the sweep. The returned horizon is at least the new grant's expiry.
68
+ */
69
+ const upsert = Effect.fnUntraced(function* (tenant, hash, size) {
70
+ const sql = yield* SqlClient.SqlClient;
71
+ const key = tenantRoutingKey(tenant);
72
+ const [row] = yield* sql `
73
+ WITH swept AS (
74
+ INSERT INTO tenant_content_sweeps (routing_key, tenant_id, swept_at_ms)
75
+ VALUES (${key}, ${tenant}, 0) ON CONFLICT DO NOTHING)
76
+ INSERT INTO tenant_contents (routing_key, tenant_id, hash, size, granted_until_ms)
77
+ VALUES (${key}, ${tenant}, ${hash}, ${size}, ${clock(sql)} + ${GRANT_LIFETIME_MS})
78
+ ON CONFLICT (routing_key, tenant_id, hash) DO UPDATE
79
+ SET granted_until_ms = greatest(tenant_contents.granted_until_ms, EXCLUDED.granted_until_ms)
80
+ RETURNING (xmax = 0) AS inserted, granted_until_ms::text AS granted_until_ms`;
81
+ return { inserted: row.inserted, expiresAt: Number(row.granted_until_ms) };
82
+ });
83
+ const writeChunk = Effect.fnUntraced(function* (tenant, hash, chunk, bytes) {
84
+ const sql = yield* SqlClient.SqlClient;
85
+ yield* sql `INSERT INTO tenant_content_chunks (routing_key, tenant_id, hash, chunk, bytes)
86
+ VALUES (${tenantRoutingKey(tenant)}, ${tenant}, ${hash}, ${chunk}, ${bytes}::bytea)`;
87
+ });
88
+ /** Stores bytes already in memory: hashed first, so existing content writes no bytes. */
89
+ const uploadBytes = Effect.fnUntraced(function* (tenant, bytes) {
90
+ const sql = yield* SqlClient.SqlClient;
91
+ if (bytes.byteLength > MAX_CONTENT_BYTES)
92
+ return yield* ContentTooLarge.make({ maxBytes: MAX_CONTENT_BYTES });
93
+ const hash = hex(sha256Bytes(bytes));
94
+ const size = bytes.byteLength;
95
+ const stored = yield* sql.withTransaction(Effect.gen(function* () {
96
+ const row = yield* upsert(tenant, hash, size);
97
+ if (row.inserted)
98
+ for (let chunk = 0; chunk === 0 || chunk * CHUNK_BYTES < size; chunk += 1)
99
+ yield* writeChunk(tenant, hash, chunk, bytes.subarray(chunk * CHUNK_BYTES, (chunk + 1) * CHUNK_BYTES));
100
+ return row;
101
+ }));
102
+ return yield* refOf(tenant, hash, size, stored.expiresAt);
103
+ });
104
+ /**
105
+ * Stores a body as it arrives, in one transaction: 1 MiB chunks are written
106
+ * under a pending name while the body is hashed, then renamed to the hash,
107
+ * or dropped when the tenant already holds those bytes. Past `limit` the
108
+ * transaction rolls back, so no part of the body stays.
109
+ */
110
+ const uploadStream = (tenant, body, limit) => Effect.gen(function* () {
111
+ const sql = yield* SqlClient.SqlClient;
112
+ if (settings.singleConnection) {
113
+ const parts = [];
114
+ let size = 0;
115
+ yield* body.pipe(Stream.runForEach((part) => {
116
+ size += part.byteLength;
117
+ parts.push(part);
118
+ return size > limit ? ContentTooLarge.make({ maxBytes: limit }) : Effect.void;
119
+ }));
120
+ return yield* uploadBytes(tenant, concat(parts, size));
121
+ }
122
+ const pending = `pending:${yield* (yield* Crypto.Crypto).randomUUIDv4.pipe(Effect.orDie)}`;
123
+ const hasher = sha256Hasher();
124
+ const stored = yield* sql.withTransaction(Effect.gen(function* () {
125
+ let size = 0;
126
+ let chunk = 0;
127
+ let buffer = new Uint8Array(CHUNK_BYTES);
128
+ let filled = 0;
129
+ const flush = Effect.suspend(() => {
130
+ const bytes = buffer.slice(0, filled);
131
+ const index = chunk;
132
+ chunk += 1;
133
+ filled = 0;
134
+ return writeChunk(tenant, pending, index, bytes);
135
+ });
136
+ yield* body.pipe(Stream.runForEach((part) => Effect.gen(function* () {
137
+ size += part.byteLength;
138
+ if (size > limit)
139
+ return yield* ContentTooLarge.make({ maxBytes: limit });
140
+ hasher.update(part);
141
+ let read = 0;
142
+ while (read < part.byteLength) {
143
+ const taken = Math.min(CHUNK_BYTES - filled, part.byteLength - read);
144
+ buffer.set(part.subarray(read, read + taken), filled);
145
+ filled += taken;
146
+ read += taken;
147
+ if (filled === CHUNK_BYTES) {
148
+ yield* flush;
149
+ buffer = new Uint8Array(CHUNK_BYTES);
150
+ }
151
+ }
152
+ })));
153
+ if (filled > 0 || chunk === 0)
154
+ yield* flush;
155
+ const hash = hex(hasher.digest());
156
+ const row = yield* upsert(tenant, hash, size);
157
+ const key = tenantRoutingKey(tenant);
158
+ yield* row.inserted
159
+ ? sql `UPDATE tenant_content_chunks SET hash = ${hash}
160
+ WHERE routing_key = ${key} AND tenant_id = ${tenant} AND hash = ${pending}`
161
+ : sql `DELETE FROM tenant_content_chunks
162
+ WHERE routing_key = ${key} AND tenant_id = ${tenant} AND hash = ${pending}`;
163
+ return { hash, size, expiresAt: row.expiresAt };
164
+ }));
165
+ return yield* refOf(tenant, stored.hash, stored.size, stored.expiresAt);
166
+ });
167
+ /**
168
+ * Raises the content's grant horizon and signs a grant for it; none when
169
+ * the content no longer exists. The row lock orders the raise with a
170
+ * sweep's delete: a raise first moves the horizon past the sweep's re-check.
171
+ */
172
+ const grant = Effect.fnUntraced(function* (tenant, hash, size) {
173
+ const sql = yield* SqlClient.SqlClient;
174
+ yield* hooks.at("beforeRaise");
175
+ const [row] = yield* sql `
176
+ UPDATE tenant_contents
177
+ SET granted_until_ms = greatest(granted_until_ms, ${clock(sql)} + ${GRANT_LIFETIME_MS})
178
+ WHERE routing_key = ${tenantRoutingKey(tenant)} AND tenant_id = ${tenant}
179
+ AND hash = ${hash} AND size = ${size}
180
+ RETURNING granted_until_ms::text AS granted_until_ms`;
181
+ if (row === undefined)
182
+ return Option.none();
183
+ return Option.some(yield* refOf(tenant, hash, size, Number(row.granted_until_ms)));
184
+ });
185
+ const chunksOf = (sql, tenant, hash) => sql `routing_key = ${tenantRoutingKey(tenant)} AND tenant_id = ${tenant} AND hash = ${hash}`;
186
+ /** Every chunk from one statement's snapshot, so a sweep deletes all of them or none. */
187
+ const readRows = Effect.fnUntraced(function* (tenant, hash, size) {
188
+ const sql = yield* SqlClient.SqlClient;
189
+ yield* hooks.at("afterResolve");
190
+ const rows = yield* sql `
191
+ SELECT chunk, bytes FROM tenant_content_chunks WHERE ${chunksOf(sql, tenant, hash)}
192
+ ORDER BY chunk`;
193
+ return complete(rows, size);
194
+ });
195
+ const read = (tenant, hash, size) => Effect.map(readRows(tenant, hash, size), Option.map((parts) => concat(parts, size)));
196
+ /**
197
+ * The content's chunks from one read-only REPEATABLE READ snapshot held for
198
+ * the whole stream, at most `timeoutMs`. The first statement checks every
199
+ * chunk is there before any is emitted.
200
+ */
201
+ const stream = (tenant, hash, size, timeoutMs) => {
202
+ const missing = new Cause.NoSuchElementError(`Content ${hash} is not stored`);
203
+ if (settings.singleConnection)
204
+ return Stream.unwrap(Effect.map(readRows(tenant, hash, size).pipe(Effect.orDie), Option.match({
205
+ onNone: () => Stream.fail(missing),
206
+ onSome: (parts) => Stream.fromArray(parts),
207
+ })));
208
+ return Stream.unwrap(Effect.gen(function* () {
209
+ const sql = yield* SqlClient.SqlClient;
210
+ const connection = yield* sql.reserve;
211
+ const onSnapshot = (effect) => Effect.provideService(effect, sql.transactionService, [connection, 0]);
212
+ yield* Effect.acquireRelease(onSnapshot(sql.unsafe("BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY")), () => onSnapshot(sql.unsafe("ROLLBACK")).pipe(Effect.ignore));
213
+ yield* hooks.at("afterResolve");
214
+ const [head] = yield* onSnapshot(sql `
215
+ SELECT count(*)::int AS chunks, max(chunk) AS last,
216
+ COALESCE(sum(octet_length(bytes)), 0)::float8 AS bytes
217
+ FROM tenant_content_chunks WHERE ${chunksOf(sql, tenant, hash)}`);
218
+ if (head.chunks === 0 || head.last !== head.chunks - 1 || head.bytes !== size)
219
+ return Stream.fail(missing);
220
+ return Stream.range(0, head.chunks - 1).pipe(Stream.mapEffect((chunk) => onSnapshot(sql `SELECT bytes FROM tenant_content_chunks
221
+ WHERE ${chunksOf(sql, tenant, hash)} AND chunk = ${chunk}`).pipe(Effect.map(([row]) => Uint8Array.from(row.bytes)), Effect.orDie)));
222
+ }).pipe(Effect.orDie)).pipe(Stream.interruptWhen(Effect.sleep(timeoutMs).pipe(Effect.andThen(Effect.die(new Error("A content stream outlived commandTimeout"))))));
223
+ };
224
+ /**
225
+ * Deletes content no actor references once its last grant is more than
226
+ * `grace + T` old, where `T` is the longest turn of any actor type that
227
+ * declares content. Candidates come from before a reference scan, and the
228
+ * delete re-checks the grant horizon against `sweep start − T − S`: a
229
+ * reference committed after its shard was scanned was attached under a
230
+ * grant that keeps the horizon past it. Each tenant goes at most once an
231
+ * hour, unless `force`.
232
+ */
233
+ const sweep = Effect.fnUntraced(function* (force) {
234
+ const sql = yield* SqlClient.SqlClient;
235
+ const started = yield* now;
236
+ const tenants = force
237
+ ? yield* sql `
238
+ SELECT routing_key::text AS routing_key, tenant_id FROM tenant_content_sweeps`
239
+ : yield* sql `
240
+ UPDATE tenant_content_sweeps SET swept_at_ms = ${started}
241
+ WHERE (routing_key, tenant_id) IN (
242
+ SELECT routing_key, tenant_id FROM tenant_content_sweeps
243
+ WHERE swept_at_ms <= ${started - SWEEP_INTERVAL_MS}
244
+ LIMIT ${SWEEP_TENANTS} FOR UPDATE SKIP LOCKED)
245
+ RETURNING routing_key::text AS routing_key, tenant_id`;
246
+ const [longest] = yield* sql `
247
+ SELECT COALESCE(max(turn_ms), 0)::float8 AS turn_ms FROM actor_content_types`;
248
+ const turnMs = longest.turn_ms;
249
+ let deleted = 0;
250
+ for (const { routing_key, tenant_id: tenant } of tenants) {
251
+ const key = BigInt(routing_key);
252
+ const sweepStart = yield* now;
253
+ const candidateBefore = sweepStart - settings.graceMs - turnMs - settings.skewMs;
254
+ const recheckBefore = sweepStart - turnMs - settings.skewMs;
255
+ let after = { granted: Number.MIN_SAFE_INTEGER, hash: "" };
256
+ for (;;) {
257
+ const candidates = yield* sql `
258
+ SELECT hash, granted_until_ms::text AS granted_until_ms FROM tenant_contents
259
+ WHERE routing_key = ${key} AND tenant_id = ${tenant}
260
+ AND granted_until_ms < ${candidateBefore}
261
+ AND (granted_until_ms, hash) > (${after.granted}, ${after.hash})
262
+ ORDER BY granted_until_ms, hash LIMIT ${SWEEP_BATCH}`;
263
+ if (candidates.length === 0)
264
+ break;
265
+ const last = candidates.at(-1);
266
+ after = { granted: Number(last.granted_until_ms), hash: last.hash };
267
+ const referenced = new Set((yield* sql `
268
+ SELECT DISTINCT hash FROM actor_content_refs
269
+ WHERE tenant_id = ${tenant}
270
+ AND hash = ANY(${textArray({ sql, values: candidates.map((row) => row.hash) })})`).map((row) => row.hash));
271
+ yield* hooks.at("afterReferenceScan");
272
+ const unreferenced = candidates
273
+ .map((row) => row.hash)
274
+ .filter((hash) => !referenced.has(hash));
275
+ if (unreferenced.length === 0)
276
+ continue;
277
+ const [gone] = yield* sql `
278
+ WITH gone AS (
279
+ DELETE FROM tenant_contents
280
+ WHERE routing_key = ${key} AND tenant_id = ${tenant}
281
+ AND hash = ANY(${textArray({ sql, values: unreferenced })})
282
+ AND granted_until_ms < ${recheckBefore}
283
+ RETURNING hash),
284
+ chunks AS (
285
+ DELETE FROM tenant_content_chunks c USING gone
286
+ WHERE c.routing_key = ${key} AND c.tenant_id = ${tenant} AND c.hash = gone.hash)
287
+ SELECT count(*)::int AS deleted FROM gone`;
288
+ deleted += gone.deleted;
289
+ }
290
+ }
291
+ return deleted;
292
+ });
293
+ return { uploadBytes, uploadStream, grant, read, stream, sweep, verify: grants.verify };
294
+ };
@@ -0,0 +1,2 @@
1
+ /** Timer keys the runtime keeps for `policy.cron`; application intents may not use them. */
2
+ export declare const CRON_PREFIX = "$cron:";
@@ -0,0 +1,2 @@
1
+ /** Timer keys the runtime keeps for `policy.cron`; application intents may not use them. */
2
+ export const CRON_PREFIX = "$cron:";
@@ -0,0 +1,69 @@
1
+ import { Crypto, Effect } from "effect";
2
+ import { SqlClient, type Statement } from "effect/sql";
3
+ import type { CronEntry, CronSchedule } from "../../policies/schedules.ts";
4
+ import { CRON_PREFIX } from "./key.ts";
5
+ export { CRON_PREFIX };
6
+ export type { CronEntry, CronSchedule };
7
+ /**
8
+ * Writes the first tick of every entry `ref` has no pending tick for. The
9
+ * timer-key unique index makes concurrent writers, and entries that already
10
+ * tick, no-ops.
11
+ */
12
+ export declare const writeTicks: (routingKey: bigint, ref: {
13
+ readonly tenant: string;
14
+ readonly actor: string;
15
+ readonly id: string;
16
+ }, entries: readonly CronEntry[], now: number) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, Crypto.Crypto | SqlClient.SqlClient>;
17
+ /**
18
+ * Writes a singleton's missing ticks in its default tenant at startup. Every
19
+ * runner does this; the generation and timer-key unique indexes keep one row
20
+ * per entry however many start at once.
21
+ */
22
+ export declare const bootstrapTicks: (routingKey: bigint, ref: {
23
+ readonly tenant: string;
24
+ readonly actor: string;
25
+ readonly id: string;
26
+ }, entries: readonly CronEntry[]) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, Crypto.Crypto | SqlClient.SqlClient>;
27
+ /** The claimed tick row the relay settles. */
28
+ interface ClaimedTick {
29
+ readonly tenant_id: string;
30
+ readonly actor_type: string;
31
+ readonly actor_id: string;
32
+ readonly routing_key: string;
33
+ readonly intent_id: string;
34
+ readonly command: string;
35
+ readonly payload: string;
36
+ readonly timer_key: string | null;
37
+ readonly scheduled_at: string;
38
+ readonly claimed_until: string;
39
+ }
40
+ /**
41
+ * Settles claimed `$cron:` rows for one relay. A tick is delivered like any
42
+ * intent unless it is older than its type's skip window, and after its
43
+ * receipt commits the row is rewritten, in place and under the same claim, to
44
+ * the first tick after now with a fresh id. A tick whose entry this runner
45
+ * does not declare is deleted once it is past the skip window and otherwise
46
+ * released with backoff, so a runner that still declares it can fire it. A
47
+ * tick whose stored target differs from its entry's delivers the entry's
48
+ * command on this claim, unless a receipt shows the tick already fired under
49
+ * its old command, in which case the row is rewritten instead.
50
+ */
51
+ export declare const cronTicks: ({ sql, crypto, schedules, retryWindowMs, }: {
52
+ readonly sql: SqlClient.SqlClient;
53
+ readonly crypto: Crypto.Crypto;
54
+ readonly schedules: () => ReadonlyMap<string, CronSchedule>;
55
+ readonly retryWindowMs: number;
56
+ }) => {
57
+ /** A tick is a `$cron:` row; application intents may not use the prefix. */
58
+ isTick: (row: ClaimedTick) => boolean;
59
+ /**
60
+ * Settles a tick that must not fire and returns undefined, or returns the
61
+ * command and payload the relay delivers on this claim.
62
+ */
63
+ settleUnfired: (row: ClaimedTick, claim: Statement.Fragment, backoffMs: number) => Effect.Effect<{
64
+ command: string;
65
+ payload: string;
66
+ } | undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
67
+ /** Replaces a delivered tick's row with the entry's next tick. */
68
+ settleFired: (row: ClaimedTick, claim: Statement.Fragment) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
69
+ };
@@ -0,0 +1,144 @@
1
+ import { Crypto, Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { System } from "../../identity/caller.js";
4
+ import { CRON_PREFIX } from "./key.js";
5
+ import { databaseTime } from "../turn/admission.js";
6
+ import { bucketOf, CallerJson, OutboxRuntime } from "../turn/outbox.js";
7
+ export { CRON_PREFIX };
8
+ const tickId = (now, dueAt, retryWindowMs) => Effect.gen(function* () {
9
+ const crypto = yield* Crypto.Crypto;
10
+ const uuid = yield* crypto.randomUUIDv4.pipe(Effect.orDie);
11
+ return `v1.${now}.${Math.max(dueAt, now) + retryWindowMs}.${uuid}`;
12
+ });
13
+ /**
14
+ * Writes the first tick of every entry `ref` has no pending tick for. The
15
+ * timer-key unique index makes concurrent writers, and entries that already
16
+ * tick, no-ops.
17
+ */
18
+ export const writeTicks = Effect.fnUntraced(function* (routingKey, ref, entries, now) {
19
+ if (entries.length === 0)
20
+ return;
21
+ const sql = yield* SqlClient.SqlClient;
22
+ const { retryWindowMs } = yield* OutboxRuntime;
23
+ const caller = yield* Schema.encodeEffect(CallerJson)(System.make({ source: "cron", ref })).pipe(Effect.orDie);
24
+ const rows = [];
25
+ for (const entry of entries) {
26
+ const dueAt = entry.next(now);
27
+ rows.push({
28
+ routing_key: routingKey,
29
+ intent_id: yield* tickId(now, dueAt, retryWindowMs),
30
+ kind: "intent",
31
+ bucket: bucketOf(routingKey),
32
+ due_at_ms: dueAt,
33
+ scheduled_at_ms: dueAt,
34
+ tenant_id: ref.tenant,
35
+ actor_type: ref.actor,
36
+ actor_id: ref.id,
37
+ timer_key: entry.key,
38
+ target_type: ref.actor,
39
+ target_id: ref.id,
40
+ command: entry.command,
41
+ payload: yield* entry.payload,
42
+ caller,
43
+ });
44
+ }
45
+ yield* sql `INSERT INTO actor_outbox ${sql.insert(rows)}
46
+ ON CONFLICT (routing_key, tenant_id, actor_type, actor_id, timer_key)
47
+ WHERE timer_key IS NOT NULL
48
+ DO NOTHING`;
49
+ });
50
+ /**
51
+ * Writes a singleton's missing ticks in its default tenant at startup. Every
52
+ * runner does this; the generation and timer-key unique indexes keep one row
53
+ * per entry however many start at once.
54
+ */
55
+ export const bootstrapTicks = Effect.fnUntraced(function* (routingKey, ref, entries) {
56
+ if (entries.length === 0)
57
+ return;
58
+ const sql = yield* SqlClient.SqlClient;
59
+ yield* sql.withTransaction(Effect.gen(function* () {
60
+ yield* sql `INSERT INTO actor_generations (routing_key, tenant_id, actor_type, actor_id)
61
+ VALUES (${routingKey}, ${ref.tenant}, ${ref.actor}, ${ref.id}) ON CONFLICT DO NOTHING`;
62
+ yield* writeTicks(routingKey, ref, entries, yield* databaseTime);
63
+ }));
64
+ });
65
+ /**
66
+ * Settles claimed `$cron:` rows for one relay. A tick is delivered like any
67
+ * intent unless it is older than its type's skip window, and after its
68
+ * receipt commits the row is rewritten, in place and under the same claim, to
69
+ * the first tick after now with a fresh id. A tick whose entry this runner
70
+ * does not declare is deleted once it is past the skip window and otherwise
71
+ * released with backoff, so a runner that still declares it can fire it. A
72
+ * tick whose stored target differs from its entry's delivers the entry's
73
+ * command on this claim, unless a receipt shows the tick already fired under
74
+ * its old command, in which case the row is rewritten instead.
75
+ */
76
+ export const cronTicks = ({ sql, crypto, schedules, retryWindowMs, }) => {
77
+ const entryOf = (row) => schedules()
78
+ .get(row.actor_type)
79
+ ?.entries.find((entry) => entry.key === row.timer_key);
80
+ const rewrite = Effect.fnUntraced(function* (row, entry, claim) {
81
+ const now = yield* databaseTime;
82
+ const dueAt = entry.next(now);
83
+ const id = yield* tickId(now, dueAt, retryWindowMs).pipe(Effect.provideService(Crypto.Crypto, crypto));
84
+ const payload = yield* entry.payload;
85
+ yield* sql `UPDATE actor_outbox SET intent_id = ${id},
86
+ command = ${entry.command}, payload = ${payload}, due_at_ms = ${dueAt},
87
+ scheduled_at_ms = ${dueAt}, attempts = 0, last_error = NULL, ambiguous = false
88
+ WHERE ${claim}`;
89
+ });
90
+ return {
91
+ /** A tick is a `$cron:` row; application intents may not use the prefix. */
92
+ isTick: (row) => row.timer_key?.startsWith(CRON_PREFIX) === true,
93
+ /**
94
+ * Settles a tick that must not fire and returns undefined, or returns the
95
+ * command and payload the relay delivers on this claim.
96
+ */
97
+ settleUnfired: Effect.fnUntraced(function* (row, claim, backoffMs) {
98
+ const schedule = schedules().get(row.actor_type);
99
+ const entry = entryOf(row);
100
+ const now = yield* databaseTime;
101
+ const scheduledAt = Number(row.scheduled_at);
102
+ const stale = schedule !== undefined && now - scheduledAt > schedule.skipMs;
103
+ const annotations = {
104
+ actor: row.actor_type,
105
+ id: row.actor_id,
106
+ tenant: row.tenant_id,
107
+ timerKey: row.timer_key,
108
+ commandId: row.intent_id,
109
+ };
110
+ if (entry === undefined) {
111
+ if (stale) {
112
+ yield* Effect.logInfo("Cron tick removed").pipe(Effect.annotateLogs(annotations));
113
+ yield* sql `DELETE FROM actor_outbox WHERE ${claim}`;
114
+ }
115
+ else
116
+ yield* sql `UPDATE actor_outbox SET due_at_ms = ${now + backoffMs} WHERE ${claim}`;
117
+ return undefined;
118
+ }
119
+ if (stale) {
120
+ yield* Effect.logInfo("Cron tick skipped").pipe(Effect.annotateLogs({ ...annotations, lateMs: now - scheduledAt }));
121
+ yield* rewrite(row, entry, claim);
122
+ return undefined;
123
+ }
124
+ if (row.command === entry.command)
125
+ return { command: row.command, payload: row.payload };
126
+ const fired = yield* sql `SELECT 1 FROM actor_receipts
127
+ WHERE routing_key = ${BigInt(row.routing_key)} AND tenant_id = ${row.tenant_id}
128
+ AND actor_type = ${row.actor_type} AND actor_id = ${row.actor_id}
129
+ AND command_id = ${row.intent_id}`;
130
+ if (fired.length > 0) {
131
+ yield* rewrite(row, entry, claim);
132
+ return undefined;
133
+ }
134
+ return { command: entry.command, payload: yield* entry.payload };
135
+ }),
136
+ /** Replaces a delivered tick's row with the entry's next tick. */
137
+ settleFired: (row, claim) => Effect.suspend(() => {
138
+ const entry = entryOf(row);
139
+ return entry === undefined
140
+ ? sql `DELETE FROM actor_outbox WHERE ${claim}`.pipe(Effect.asVoid)
141
+ : rewrite(row, entry, claim);
142
+ }),
143
+ };
144
+ };
@@ -0,0 +1,43 @@
1
+ import { PgClient } from "@effect/sql-pg";
2
+ import { Effect } from "effect";
3
+ import { SqlClient, SqlError, Statement } from "effect/sql";
4
+ /** Extra checkouts each pool holds beyond its connections before refusing further work. */
5
+ export declare const POOL_WAITERS = 64;
6
+ /** SQL-compatible overload keeps caller-facing reads retryable without exposing the internal cause. */
7
+ export declare const poolRefusal: (cause: unknown) => SqlError.SqlError;
8
+ /** Recognizes only our pre-statement checkout refusal, never a failed statement or unknown commit. */
9
+ export declare const isPoolRefusal: (cause: unknown) => boolean;
10
+ /** Retries a pre-statement checkout refusal for scoped startup and background work. */
11
+ export declare const retryPoolRefusal: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
12
+ /**
13
+ * The native Postgres client with at most 64 queued checkouts beyond its
14
+ * connection capacity, handing its connections out first come, first served.
15
+ * All SQL entry points share admission, including reservations,
16
+ * transactions, streams and listeners; bounding only command dispatch would
17
+ * leave queries and background callers able to grow the pool's waiter list.
18
+ * A refused checkout sent no statement.
19
+ *
20
+ * A checkout passes three stages in order: the bounded admission slot,
21
+ * refused at once past the limit; a first-come, first-served gate with one
22
+ * slot per connection, so a caller never waits behind one that asked after
23
+ * it, which Effect's pool allows because it hands a freed connection to
24
+ * whichever fiber asks next; then the pool, which therefore never has a
25
+ * waiter of its own. Both slots belong to the checkout's scope, or to the
26
+ * borrowed statement, and return with the connection, so cancellation never
27
+ * leaks either. A statement inside a transaction reuses its connection and
28
+ * takes neither.
29
+ *
30
+ * Apart from the gates it is `PgClient.make`: the same compiler, transforms,
31
+ * span attributes, commit check, savepoint release, JSON fragments, and
32
+ * notifications, which use a checkout of their own rather than the caller's
33
+ * transaction.
34
+ */
35
+ export declare const boundedPool: (options: PgClient.PgPoolConfig) => Effect.Effect<SqlClient.SqlClient & {
36
+ "~@effect/sql-pg/PgClient": "~@effect/sql-pg/PgClient";
37
+ config: PgClient.PgPoolConfig;
38
+ json: (value: unknown) => Statement.Fragment;
39
+ listen: (channel: string) => Effect.Effect<import("effect/Queue").Dequeue<import("@effect/sql-pg/PgConnection").Notification, SqlError.SqlError>, SqlError.SqlError, import("effect/Scope").Scope>;
40
+ notify: (channel: string, payload: string) => Effect.Effect<void, SqlError.SqlError, never>;
41
+ }, SqlError.SqlError, import("effect/reactivity/Reactivity").Reactivity | import("effect/Scope").Scope>;
42
+ /** Provides the bounded primary/off-turn client without changing its connection configuration. */
43
+ export declare const boundedLayer: (options: PgClient.PgPoolConfig) => import("effect/Layer").Layer<PgClient.PgClient | SqlClient.SqlClient, SqlError.SqlError, never>;