@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,108 @@
1
+ import { PgClient, PgPool } from "@effect/sql-pg";
2
+ import { Duration, Effect, Schedule, Schema } from "effect";
3
+ import { SqlClient, SqlError, Statement } from "effect/sql";
4
+ import { admissionLimit, isOverloaded } from "../admission.js";
5
+ import { ActorError } from "../../errors/actor.js";
6
+ import { asSqlConnection } from "./connection.js";
7
+ import { fairGate } from "./gate.js";
8
+ /** Extra checkouts each pool holds beyond its connections before refusing further work. */
9
+ export const POOL_WAITERS = 64;
10
+ /** SQL-compatible overload keeps caller-facing reads retryable without exposing the internal cause. */
11
+ export const poolRefusal = (cause) => SqlError.SqlError.make({
12
+ reason: SqlError.ConnectionError.make({ cause, message: "Postgres pool admission is full" }),
13
+ });
14
+ /** Recognizes only our pre-statement checkout refusal, never a failed statement or unknown commit. */
15
+ export const isPoolRefusal = (cause) => SqlError.isSqlError(cause) &&
16
+ Schema.is(ActorError)(cause.reason.cause) &&
17
+ isOverloaded(cause.reason.cause);
18
+ /** Retries a pre-statement checkout refusal for scoped startup and background work. */
19
+ export const retryPoolRefusal = (effect) => effect.pipe(Effect.retry({
20
+ while: isPoolRefusal,
21
+ schedule: Schedule.min([Schedule.exponential("10 millis", 2), Schedule.spaced("250 millis")]),
22
+ }));
23
+ /** Postgres can answer COMMIT with ROLLBACK when a transaction has already aborted. */
24
+ const commit = (connection) => Effect.flatMap(connection.executeRaw("COMMIT", []), (result) => result.command === "ROLLBACK"
25
+ ? Effect.fail(SqlError.SqlError.make({
26
+ reason: SqlError.UnknownError.make({
27
+ cause: new Error("COMMIT rolled back an aborted transaction"),
28
+ message: "PgClient: COMMIT rolled back an aborted transaction",
29
+ operation: "commit",
30
+ }),
31
+ }))
32
+ : Effect.void);
33
+ const PgJson = Statement.custom("PgJson");
34
+ const direct = (statement) => statement;
35
+ /**
36
+ * The native Postgres client with at most 64 queued checkouts beyond its
37
+ * connection capacity, handing its connections out first come, first served.
38
+ * All SQL entry points share admission, including reservations,
39
+ * transactions, streams and listeners; bounding only command dispatch would
40
+ * leave queries and background callers able to grow the pool's waiter list.
41
+ * A refused checkout sent no statement.
42
+ *
43
+ * A checkout passes three stages in order: the bounded admission slot,
44
+ * refused at once past the limit; a first-come, first-served gate with one
45
+ * slot per connection, so a caller never waits behind one that asked after
46
+ * it, which Effect's pool allows because it hands a freed connection to
47
+ * whichever fiber asks next; then the pool, which therefore never has a
48
+ * waiter of its own. Both slots belong to the checkout's scope, or to the
49
+ * borrowed statement, and return with the connection, so cancellation never
50
+ * leaks either. A statement inside a transaction reuses its connection and
51
+ * takes neither.
52
+ *
53
+ * Apart from the gates it is `PgClient.make`: the same compiler, transforms,
54
+ * span attributes, commit check, savepoint release, JSON fragments, and
55
+ * notifications, which use a checkout of their own rather than the caller's
56
+ * transaction.
57
+ */
58
+ export const boundedPool = Effect.fnUntraced(function* (options) {
59
+ const pool = yield* PgPool.make(options);
60
+ const slots = options.maxConnections ?? 10;
61
+ const admission = admissionLimit({ limit: slots + POOL_WAITERS, wait: Duration.zero });
62
+ const fair = fairGate(slots);
63
+ const enter = Effect.andThen(admission.take.pipe(Effect.mapError(poolRefusal)), fair.take);
64
+ const connection = (session) => asSqlConnection({ connection: session, send: direct });
65
+ const acquire = Effect.andThen(enter, Effect.map(pool.get, connection));
66
+ const sql = yield* SqlClient.make({
67
+ acquirer: acquire,
68
+ transactionAcquirer: Effect.andThen(enter, Effect.map(pool.reserve, connection)),
69
+ borrower: (use) => admission
70
+ .admit(fair.use(pool.use((session) => use(connection(session)))))
71
+ .pipe(Effect.mapError((error) => (Schema.is(ActorError)(error) ? poolRefusal(error) : error))),
72
+ compiler: PgClient.makeCompiler(options.transformQueryNames, options.transformJson),
73
+ spanAttributes: [
74
+ ...(options.spanAttributes === undefined ? [] : Object.entries(options.spanAttributes)),
75
+ ["db.system.name", "postgresql"],
76
+ ["db.namespace", options.database ?? options.username ?? "postgres"],
77
+ ["server.address", options.host ?? "localhost"],
78
+ ["server.port", options.port ?? 5432],
79
+ ],
80
+ transformRows: options.transformResultNames === undefined
81
+ ? undefined
82
+ : Statement.defaultTransforms(options.transformResultNames, options.transformJson).array,
83
+ prepareTransactionControls: true,
84
+ commit,
85
+ releaseSavepoint: (name) => `RELEASE SAVEPOINT ${name}`,
86
+ });
87
+ return Object.assign(sql, {
88
+ [PgClient.TypeId]: PgClient.TypeId,
89
+ config: options,
90
+ json: ((value) => Statement.fragment([PgJson(value)])),
91
+ listen: (channel) => Effect.andThen(enter, Effect.flatMap(pool.reserve, (session) => session.listen(channel))),
92
+ notify: (channel, payload) => {
93
+ if (new TextEncoder().encode(channel).byteLength > 63) {
94
+ const message = "PostgreSQL channel names must not exceed 63 UTF-8 bytes";
95
+ return Effect.fail(SqlError.SqlError.make({
96
+ reason: SqlError.UnknownError.make({
97
+ cause: new Error(message),
98
+ message,
99
+ operation: "notify",
100
+ }),
101
+ }));
102
+ }
103
+ return Effect.asVoid(Effect.scoped(Effect.flatMap(acquire, (conn) => conn.executeRaw("SELECT pg_notify($1, $2)", [channel, payload]))));
104
+ },
105
+ });
106
+ });
107
+ /** Provides the bounded primary/off-turn client without changing its connection configuration. */
108
+ export const boundedLayer = (options) => PgClient.layerFrom(boundedPool(options));
@@ -0,0 +1,8 @@
1
+ import type { PgConnection } from "@effect/sql-pg";
2
+ import { Effect } from "effect";
3
+ import type { SqlConnection, SqlError } from "effect/sql";
4
+ /** A leased session as a `SqlClient` connection, so the runtime's statements reach it. */
5
+ export declare const asSqlConnection: ({ connection, send, }: {
6
+ readonly connection: PgConnection.PgConnection;
7
+ readonly send: <A>(statement: Effect.Effect<A, SqlError.SqlError>) => Effect.Effect<A, SqlError.SqlError>;
8
+ }) => SqlConnection.Connection;
@@ -0,0 +1,18 @@
1
+ import { Effect, Stream } from "effect";
2
+ /** A leased session as a `SqlClient` connection, so the runtime's statements reach it. */
3
+ export const asSqlConnection = ({ connection, send, }) => {
4
+ const rows = (prepare) => (sql, params, transformRows) => {
5
+ const found = send(Effect.map(connection.query(sql, params, prepare), (result) => result.rows));
6
+ return transformRows === undefined ? found : Effect.map(found, transformRows);
7
+ };
8
+ return {
9
+ execute: rows(true),
10
+ executeRaw: (sql, params) => send(connection.query(sql, params)),
11
+ executeStream: (sql, params, transformRows) => Stream.unwrap(Effect.as(send(Effect.void), transformRows === undefined
12
+ ? connection.stream(sql, params)
13
+ : Stream.map(connection.stream(sql, params), (row) => transformRows([row])[0]))),
14
+ executeValues: (sql, params) => send(connection.queryValues(sql, params)),
15
+ executeValuesUnprepared: (sql, params) => send(connection.queryValues(sql, params, false)),
16
+ executeUnprepared: rows(false),
17
+ };
18
+ };
@@ -0,0 +1,19 @@
1
+ import { PgClient } from "@effect/sql-pg";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { SqlClient } from "effect/sql";
4
+ /** The deployment's unsharded authority, shared by every runner regardless of its data shard. */
5
+ export declare const Coordination: Context.Reference<SqlClient.SqlClient | undefined>;
6
+ /** Supplies an independent client so coordination transactions never borrow a data transaction's connection. */
7
+ export declare const coordinationLayer: (options: PgClient.PgPoolConfig | undefined) => Layer.Layer<never, import("effect/sql/SqlError").SqlError, never>;
8
+ /**
9
+ * Serializes one resource on the authoritative database until the guarded work
10
+ * has committed or rolled back. The row lock is the ownership fence: there is
11
+ * no clock-based expiry that could admit a second owner while the first writes.
12
+ * Row identities are retained so deleting an idle resource cannot split its lock.
13
+ * The local fence has its own namespace because independent clients may point
14
+ * to the same database and must not wait on their own authority transaction.
15
+ */
16
+ export declare const coordinated: <A, E, R>({ resource, work, }: {
17
+ readonly resource: string;
18
+ readonly work: Effect.Effect<A, E, R>;
19
+ }) => Effect.Effect<A, E | import("effect/sql/SqlError").SqlError, R | SqlClient.SqlClient>;
@@ -0,0 +1,72 @@
1
+ import { PgClient } from "@effect/sql-pg";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { Reactivity } from "effect/reactivity";
4
+ import { Migrator, SqlClient } from "effect/sql";
5
+ import { boundedPool } from "./bounded.js";
6
+ import { NekiTurnSessions } from "./neki/session.js";
7
+ import { MigrationBarrier, MigrationBoundary, withMigrationCoordination, } from "./neki/migrations.js";
8
+ /** The deployment's unsharded authority, shared by every runner regardless of its data shard. */
9
+ export const Coordination = Context.Reference("@rikalabs/akter/runtime/database/coordination/Coordination", { defaultValue: () => undefined });
10
+ /** Creates the transaction-owned coordination rows on the authoritative database. */
11
+ const prepareCoordination = Effect.gen(function* () {
12
+ const sql = yield* SqlClient.SqlClient;
13
+ yield* sql `CREATE TABLE IF NOT EXISTS actor_coordination (
14
+ resource text PRIMARY KEY
15
+ )`;
16
+ });
17
+ /** Fixed, existence-guarded bootstrap steps can be replayed after any interrupted propagation. */
18
+ const prepareNekiCoordination = Effect.gen(function* () {
19
+ const sql = yield* SqlClient.SqlClient;
20
+ const connection = yield* sql.reserve;
21
+ const barrier = yield* MigrationBarrier;
22
+ const boundary = yield* MigrationBoundary;
23
+ for (const [name, ddl] of [
24
+ [
25
+ "history",
26
+ "CREATE TABLE IF NOT EXISTS actor_coordination_migrations (migration_id integer PRIMARY KEY, created_at timestamptz NOT NULL DEFAULT now(), name text NOT NULL)",
27
+ ],
28
+ ["resources", "CREATE TABLE IF NOT EXISTS actor_coordination (resource text PRIMARY KEY)"],
29
+ ]) {
30
+ yield* barrier(connection);
31
+ yield* sql.unsafe(ddl);
32
+ yield* boundary(`coordination:${name}:ddl`);
33
+ yield* barrier(connection);
34
+ yield* boundary(`coordination:${name}:propagated`);
35
+ }
36
+ yield* sql `INSERT INTO actor_coordination_migrations (migration_id, name)
37
+ VALUES (1, 'coordination') ON CONFLICT (migration_id) DO NOTHING`;
38
+ yield* boundary("coordination:recorded");
39
+ });
40
+ /** Supplies an independent client so coordination transactions never borrow a data transaction's connection. */
41
+ export const coordinationLayer = (options) => Layer.effect(Coordination, Effect.gen(function* () {
42
+ if (options === undefined)
43
+ return undefined;
44
+ const sql = yield* boundedPool(options);
45
+ const neki = yield* NekiTurnSessions;
46
+ yield* withMigrationCoordination(neki
47
+ ? prepareNekiCoordination
48
+ : Migrator.make({})({
49
+ table: "actor_coordination_migrations",
50
+ loader: Migrator.fromRecord({ "0001_coordination": prepareCoordination }),
51
+ })).pipe(Effect.provideService(SqlClient.SqlClient, sql), Effect.orDie);
52
+ return sql;
53
+ })).pipe(Layer.provide(Reactivity.layer));
54
+ /**
55
+ * Serializes one resource on the authoritative database until the guarded work
56
+ * has committed or rolled back. The row lock is the ownership fence: there is
57
+ * no clock-based expiry that could admit a second owner while the first writes.
58
+ * Row identities are retained so deleting an idle resource cannot split its lock.
59
+ * The local fence has its own namespace because independent clients may point
60
+ * to the same database and must not wait on their own authority transaction.
61
+ */
62
+ export const coordinated = ({ resource, work, }) => Effect.gen(function* () {
63
+ const data = yield* SqlClient.SqlClient;
64
+ const sql = (yield* Coordination) ?? data;
65
+ const guarded = sql === data
66
+ ? work
67
+ : data.withTransaction(data `INSERT INTO actor_coordination (resource) VALUES (${`local/${resource}`})
68
+ ON CONFLICT (resource) DO UPDATE SET resource = EXCLUDED.resource`.pipe(Effect.andThen(work), Effect.tap(() => sql `SELECT 1`)));
69
+ const alive = sql `SELECT 1`.pipe(Effect.andThen(Effect.sleep("200 millis")), Effect.forever);
70
+ return yield* sql.withTransaction(sql `INSERT INTO actor_coordination (resource) VALUES (${resource})
71
+ ON CONFLICT (resource) DO UPDATE SET resource = EXCLUDED.resource`.pipe(Effect.andThen(sql === data ? guarded : Effect.raceFirst(guarded, alive))));
72
+ });
@@ -0,0 +1,10 @@
1
+ import { Effect } from "effect";
2
+ /**
3
+ * Tries to take an exclusive, non-blocking `flock` on `path` for the scope and
4
+ * answers whether it did; a file already locked answers false and registers
5
+ * nothing. The lock belongs to the open descriptor, so the kernel drops it when
6
+ * the holder dies, SIGKILL included, and a second descriptor in this process is
7
+ * refused like another process's. The file and its directory are created first;
8
+ * the lock is on the open file, not its bytes.
9
+ */
10
+ export declare const flockExclusive: (path: string) => Effect.Effect<boolean, never, import("effect/Scope").Scope>;
@@ -0,0 +1,60 @@
1
+ import { Effect } from "effect";
2
+ const LOCK_EX = 2;
3
+ const LOCK_NB = 4;
4
+ const O_RDWR = 2;
5
+ /** Keeps a child process from inheriting the lock descriptor, which would outlive this process. */
6
+ const O_CLOEXEC = process.platform === "darwin" ? 0x1000000 : 0o2000000;
7
+ const library = process.platform === "darwin" ? "libc.dylib" : "libc.so.6";
8
+ /** Bun reaches libc through `bun:ffi`, imported here so no other runtime ever resolves that specifier. */
9
+ const loadBun = () => import("bun:ffi").then(({ dlopen, FFIType }) => {
10
+ const { symbols } = dlopen(library, {
11
+ open: { args: [FFIType.cstring, FFIType.i32], returns: FFIType.i32 },
12
+ flock: { args: [FFIType.i32, FFIType.i32], returns: FFIType.i32 },
13
+ close: { args: [FFIType.i32], returns: FFIType.i32 },
14
+ });
15
+ return {
16
+ open: (path) => symbols.open(new TextEncoder().encode(`${path}\0`), O_RDWR | O_CLOEXEC),
17
+ lock: (fd) => symbols.flock(fd, LOCK_EX | LOCK_NB) === 0,
18
+ close: (fd) => void symbols.close(fd),
19
+ };
20
+ });
21
+ /** Node has no built-in `flock`, so it calls the same three libc functions through koffi's prebuilt native binding. */
22
+ const loadNode = () => import("koffi").then(({ default: koffi }) => {
23
+ const libc = koffi.load(library);
24
+ const open = libc.func("int open(const char *path, int flags)");
25
+ const flock = libc.func("int flock(int fd, int operation)");
26
+ const close = libc.func("int close(int fd)");
27
+ return {
28
+ open: (path) => open(path, O_RDWR | O_CLOEXEC),
29
+ lock: (fd) => flock(fd, LOCK_EX | LOCK_NB) === 0,
30
+ close: (fd) => void close(fd),
31
+ };
32
+ });
33
+ let libc;
34
+ const loadLibc = () => (libc ??= (process.versions.bun === undefined ? loadNode() : loadBun()).catch((cause) => {
35
+ libc = undefined;
36
+ throw cause;
37
+ }));
38
+ /**
39
+ * Tries to take an exclusive, non-blocking `flock` on `path` for the scope and
40
+ * answers whether it did; a file already locked answers false and registers
41
+ * nothing. The lock belongs to the open descriptor, so the kernel drops it when
42
+ * the holder dies, SIGKILL included, and a second descriptor in this process is
43
+ * refused like another process's. The file and its directory are created first;
44
+ * the lock is on the open file, not its bytes.
45
+ */
46
+ export const flockExclusive = (path) => Effect.acquireRelease(Effect.gen(function* () {
47
+ if (process.platform !== "linux" && process.platform !== "darwin")
48
+ return yield* Effect.die(new Error(`A file-backed PGlite database needs flock, which ${process.platform} lacks`));
49
+ const { open, lock, close } = yield* Effect.tryPromise(loadLibc).pipe(Effect.orDie);
50
+ yield* Effect.promise(() => import("node:fs/promises").then(({ mkdir, open }) => mkdir(path.slice(0, path.lastIndexOf("/")), { recursive: true })
51
+ .then(() => open(path, "a"))
52
+ .then((handle) => handle.close())));
53
+ const fd = open(path);
54
+ if (fd < 0)
55
+ return yield* Effect.die(new Error(`Cannot open the lock file ${path}`));
56
+ if (lock(fd))
57
+ return { fd, close };
58
+ close(fd);
59
+ return undefined;
60
+ }), (held) => Effect.sync(() => held?.close(held.fd))).pipe(Effect.map((held) => held !== undefined));
@@ -0,0 +1,26 @@
1
+ import { Effect } from "effect";
2
+ import type { Scope } from "effect";
3
+ /**
4
+ * A first-come, first-served gate of `permits` slots. A slot freed while
5
+ * fibers wait goes straight to the oldest waiter, never back into the free
6
+ * count.
7
+ *
8
+ * Effect's `Pool` and `Semaphore` free a slot and then schedule the waiter
9
+ * they wake. A fiber that asks in between, typically the one that just freed
10
+ * the slot and loops for its next statement, takes the slot first, and the
11
+ * woken waiter queues again at the back. Under steady load the same holders
12
+ * keep the slots and a waiter waits for as long as the load lasts. Putting
13
+ * this gate in front of a pool, with as many slots as the pool has
14
+ * connections, means the pool never has a waiter to pass over.
15
+ *
16
+ * A waiter interrupted after it was handed a slot passes the slot on, so an
17
+ * interrupt never leaks one.
18
+ */
19
+ export declare const fairGate: (permits: number) => {
20
+ /** Holds one slot until the enclosing scope closes, waiting behind every earlier caller. */
21
+ take: Effect.Effect<void, never, Scope.Scope>;
22
+ /** Holds one slot while `effect` runs, waiting behind every earlier caller. */
23
+ use: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
24
+ /** Callers waiting for a slot now. */
25
+ waiting: () => number;
26
+ };
@@ -0,0 +1,54 @@
1
+ import { Effect } from "effect";
2
+ /**
3
+ * A first-come, first-served gate of `permits` slots. A slot freed while
4
+ * fibers wait goes straight to the oldest waiter, never back into the free
5
+ * count.
6
+ *
7
+ * Effect's `Pool` and `Semaphore` free a slot and then schedule the waiter
8
+ * they wake. A fiber that asks in between, typically the one that just freed
9
+ * the slot and loops for its next statement, takes the slot first, and the
10
+ * woken waiter queues again at the back. Under steady load the same holders
11
+ * keep the slots and a waiter waits for as long as the load lasts. Putting
12
+ * this gate in front of a pool, with as many slots as the pool has
13
+ * connections, means the pool never has a waiter to pass over.
14
+ *
15
+ * A waiter interrupted after it was handed a slot passes the slot on, so an
16
+ * interrupt never leaks one.
17
+ */
18
+ export const fairGate = (permits) => {
19
+ let free = permits;
20
+ const waiters = new Set();
21
+ const release = Effect.sync(() => {
22
+ const next = waiters.values().next();
23
+ if (next.done === true) {
24
+ free += 1;
25
+ return;
26
+ }
27
+ waiters.delete(next.value);
28
+ next.value.granted = true;
29
+ next.value.resume();
30
+ });
31
+ const enter = (restore) => Effect.suspend(() => {
32
+ if (free > 0) {
33
+ free -= 1;
34
+ return Effect.void;
35
+ }
36
+ let waiter;
37
+ return restore(Effect.callback((resume) => {
38
+ const queued = { granted: false, resume: () => resume(Effect.void) };
39
+ waiter = queued;
40
+ waiters.add(queued);
41
+ return Effect.sync(() => {
42
+ waiters.delete(queued);
43
+ });
44
+ })).pipe(Effect.onInterrupt(() => (waiter?.granted === true ? release : Effect.void)));
45
+ });
46
+ return {
47
+ /** Holds one slot until the enclosing scope closes, waiting behind every earlier caller. */
48
+ take: Effect.uninterruptibleMask((restore) => Effect.andThen(enter(restore), Effect.addFinalizer(() => release))),
49
+ /** Holds one slot while `effect` runs, waiting behind every earlier caller. */
50
+ use: (effect) => Effect.uninterruptibleMask((restore) => Effect.andThen(enter(restore), restore(effect).pipe(Effect.ensuring(release)))),
51
+ /** Callers waiting for a slot now. */
52
+ waiting: () => waiters.size,
53
+ };
54
+ };
@@ -0,0 +1,11 @@
1
+ import { Redacted } from "effect";
2
+ /**
3
+ * Server-side probes let idle backends release a vanished runner's sessions
4
+ * and locks instead of waiting for the operating system's long defaults.
5
+ * Callers can tune the probes or restore the operating system's defaults.
6
+ */
7
+ export declare const withKeepalives: <A extends {
8
+ readonly url?: Redacted.Redacted<string> | undefined;
9
+ readonly startupParameters?: Readonly<Record<string, string>> | undefined;
10
+ readonly startupOptions?: string | undefined;
11
+ }>(config: A) => A;
@@ -0,0 +1,22 @@
1
+ import { Redacted } from "effect";
2
+ /**
3
+ * Server-side probes let idle backends release a vanished runner's sessions
4
+ * and locks instead of waiting for the operating system's long defaults.
5
+ * Callers can tune the probes or restore the operating system's defaults.
6
+ */
7
+ export const withKeepalives = (config) => {
8
+ const url = config.url === undefined ? undefined : Redacted.value(config.url);
9
+ const options = config.startupOptions ??
10
+ (url !== undefined && URL.canParse(url) ? new URL(url).searchParams.get("options") : null) ??
11
+ "";
12
+ const named = new Set(Object.keys(config.startupParameters ?? {}).map((key) => key.toLowerCase()));
13
+ const defaults = Object.entries({
14
+ tcp_keepalives_idle: "5",
15
+ tcp_keepalives_interval: "2",
16
+ tcp_keepalives_count: "3",
17
+ })
18
+ .filter(([key]) => !named.has(key))
19
+ .map(([key, value]) => `-c ${key}=${value}`)
20
+ .join(" ");
21
+ return { ...config, startupOptions: `${defaults} ${options}`.trim() };
22
+ };
@@ -0,0 +1,177 @@
1
+ import { Effect } from "effect";
2
+ import { Migrator, SqlClient } from "effect/sql";
3
+ /** Every framework migration by id, applied in order above the latest applied id. */
4
+ export declare const migrations: {
5
+ "0001_foundation": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
6
+ "0002_creation": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
7
+ /**
8
+ * Every framework row carries its routing key, leading the primary key so a shard index can
9
+ * place it; state is opaque bytea.
10
+ *
11
+ * Placement and its encoding decide every row's routing key, so a change would fork each
12
+ * existing actor into a second identity.
13
+ */
14
+ "0003_routing_state": Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
15
+ /**
16
+ * Every intent and timer lives on its sender's shard. `bucket` is the top eight bits of
17
+ * `routing_key`, so the relay probes `(bucket, due_at_ms)` and never reads actors with
18
+ * nothing due.
19
+ */
20
+ "0004_outbox": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
21
+ /**
22
+ * Application tables come from drizzle-kit; the framework only records which actor type owns
23
+ * each one, so a second owner cannot read its rows.
24
+ */
25
+ "0005_tables": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
26
+ /**
27
+ * Events share the actor's routing key and commit with its turn. The sequence counter lives
28
+ * on the fenced generation row, so a pruned stream never reissues a cursor.
29
+ */
30
+ "0006_events": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
31
+ /**
32
+ * An effect is an outbox row whose executor runs when it is due. On success or exhaustion it
33
+ * becomes an intent to its route, so the route is delivered like any intent, with the effect
34
+ * id as its command id. `ambiguous` records whether the last attempt's outcome is unknown.
35
+ *
36
+ * Exhausted effects stay visible to operators after their row settles.
37
+ */
38
+ "0008_effects": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
39
+ /**
40
+ * Blob entries are chunked bytea beside the actor's other rows: `append` adds a chunk
41
+ * without rewriting earlier ones, and `compact` folds them into chunk 0.
42
+ */
43
+ "0009_blobs": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
44
+ /**
45
+ * Cleanup reads each actor type's oldest receipts and events by age, and keeps a receipt
46
+ * while an outbox row with its id can still be redelivered; these indexes keep every cleanup
47
+ * batch a range read.
48
+ */
49
+ "0010_retention": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
50
+ /**
51
+ * Claims and backoff move `due_at_ms`, so `scheduled_at_ms` keeps the time a row first
52
+ * became due. `kind` follows `bucket` in the due index so intent scans never read effect
53
+ * rows waiting for an executor, and the reverse.
54
+ */
55
+ "0011_relay": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
56
+ /**
57
+ * Workflow executions, their recorded steps, and the manifests deployments accepted. Every
58
+ * execution and step row lives on its owner's shard; a step row is written pending before
59
+ * its work starts and settled once.
60
+ */
61
+ "0012_workflows": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
62
+ /**
63
+ * The placement join keeps every view from being automatically updatable, so writes fail
64
+ * without triggers or rules to maintain.
65
+ *
66
+ * The catalog is how a tool checks which view versions a database has.
67
+ */
68
+ "0013_inspection_views": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
69
+ /**
70
+ * A connection's session lives beside the actor's rows; its socket and buffers live at the
71
+ * holder runner named by `holder` and `holder_epoch`.
72
+ */
73
+ "0014_connections": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
74
+ "0015_effect_control": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
75
+ /**
76
+ * An attempt can end an effect before its retries run out, as when its route rejects the
77
+ * result. `final_failure` records that, with the outcome, so a dead letter that fails to
78
+ * commit is retried without another provider call.
79
+ */
80
+ "0016_final_effect_failures": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
81
+ /**
82
+ * Subscriptions fan out on the source's shard after commit: one row per (source,
83
+ * subscription, subscriber), routed rows with subscriber_id = ''. The tag summary makes the
84
+ * publisher's probe a key lookup per emitted tag, and the subscriber's cursor, on its own
85
+ * shard, deduplicates every delivery after its receipt is pruned. The due index leads with
86
+ * `subscriber_type` so a runner never scans types it doesn't register.
87
+ *
88
+ * The routed declarations of the deployment, by source type: a runner that serves a source
89
+ * must register every subscriber type routing from it, because the publishing turn creates
90
+ * the routed rows.
91
+ */
92
+ "0017_subscriptions": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
93
+ /**
94
+ * Every tenant row admits only the tenant its transaction names. The table owner and
95
+ * superusers are exempt, so nothing changes until a deployment runs its turns and views as a
96
+ * role that is neither.
97
+ */
98
+ "0018_rls": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
99
+ /**
100
+ * Content is stored once per tenant on the tenant's routing key; actors hold references on
101
+ * their own shard. Nothing counts references and no key points from a reference or a chunk
102
+ * to a content row: the sweep finds unreferenced content by scanning references, and grants
103
+ * gate it.
104
+ *
105
+ * Grants name the database they were issued by, so a key shared with another deployment
106
+ * never makes its grants valid here.
107
+ *
108
+ * Every tenant that ever uploaded, and when its content was last swept.
109
+ *
110
+ * A query reads references and chunks as the tenant role when row-level security is on;
111
+ * uploads, grants, and the sweep keep the exempt connecting role.
112
+ *
113
+ * The longest turn of each actor type that declares content, which the sweep waits out; it
114
+ * only grows, so a runner still on an earlier deploy with longer turns stays covered.
115
+ *
116
+ * The sweep join shows how far each tenant's collection lags, and keeps the view from being
117
+ * automatically updatable.
118
+ */
119
+ "0020_content_blobs": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
120
+ /**
121
+ * Stored events and effect payloads carry the version of their class's migration chain they
122
+ * were written at; readers upcast from it. A settled effect row becomes its route intent and
123
+ * goes back to 0. The two tables let startup refuse a deploy that would strand a stored
124
+ * version: `actor_payload_versions` records each version some runtime has written, and
125
+ * `actor_payload_writers` is each runtime's heartbeat per version it writes, which a clear
126
+ * waits out before it scans. Nothing written before it has a recorded version, so a database
127
+ * that already holds events or effect rows is refused rather than guessed at.
128
+ *
129
+ * Columns are added at the end, which a view version allows.
130
+ */
131
+ "0021_payload_versions": Effect.Effect<undefined, Migrator.MigrationError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
132
+ /**
133
+ * A parent-placed type routes through its parent type's placement, so the parent is part of
134
+ * the record a later build must match.
135
+ */
136
+ "0022_parent_placement": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
137
+ /**
138
+ * Every authorized operator action, and every authenticated one refused by scope. A repair
139
+ * writes its row in its own transaction, on the target actor's routing key, so the two
140
+ * commit together on one shard; a tenant-wide action uses the tenant's routing key. Rows are
141
+ * never pruned.
142
+ *
143
+ * The join keeps the view read-only, as every other `durable` view is.
144
+ */
145
+ "0023_operator_audit": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
146
+ "0024_adoption": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
147
+ /**
148
+ * Per-view state of the fleet maintainer: its source, the hash of the
149
+ * definition that built its rows, its status, and how far it has applied
150
+ * the change feed. Framework state without a tenant, like `actor_tables`,
151
+ * so it carries no policy and no `durable` view.
152
+ */
153
+ "0025_fleet": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
154
+ /**
155
+ * Staged external work is named a job everywhere it is stored: the outbox kind, keyed-job
156
+ * timer keys, dead-letter columns, payload-version kinds, and the inspection views. Rows keep
157
+ * their ids, attempts, ambiguity, and cancellation marks, so a job in flight settles under the
158
+ * same id. Dropping the renamed views drops any grants on them.
159
+ *
160
+ * A subscription change lowers a tag count in place and deletes a count it
161
+ * lowered to 0 before its transaction commits, so a summary row may hold 0
162
+ * only inside that transaction.
163
+ */
164
+ "0026_jobs": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
165
+ "0027_coordination": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
166
+ "0029_runner_configuration": Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
167
+ };
168
+ /**
169
+ * Runs `record` like `Migrator`, but first refuses a database where a
170
+ * registered id below the latest applied one was never applied: `Migrator`
171
+ * would skip it forever, leaving its tables missing. The check runs again
172
+ * after the migrations because a concurrent runner with fewer migrations can
173
+ * commit a higher id between the first check and the migration lock.
174
+ */
175
+ export declare const migrator: <E>(record: Record<string, Effect.Effect<void, E, SqlClient.SqlClient>>) => Effect.Effect<readonly (readonly [id: number, name: string])[], Migrator.MigrationError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
176
+ /** Applies every framework migration not yet recorded in `actor_migrations`, refusing a database that skipped one. */
177
+ export declare const migrate: Effect.Effect<readonly (readonly [id: number, name: string])[], Migrator.MigrationError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;