@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,165 @@
1
+ import type { PgConnection } from "@effect/sql-pg";
2
+ import { Cause, Context, Duration, Effect, Exit, Fiber, Data, Layer, Scope } from "effect";
3
+ import type { SqlError } from "effect/sql";
4
+ import { type Send, TurnConnections } from "./pipeline.ts";
5
+ type Statement = Effect.Effect<void, SqlError.SqlError>;
6
+ type Replies = ReadonlyArray<Fiber.Fiber<void, SqlError.SqlError>>;
7
+ /**
8
+ * How a member's turn ended in its group: committed with the group, at the
9
+ * version and clock read after the group's transaction ended, or to be run
10
+ * again in a transaction of its own because the group ended without it.
11
+ */
12
+ export type Shared = Data.TaggedEnum<{
13
+ Committed: {
14
+ readonly version: string;
15
+ readonly endedAtMs: number;
16
+ /** The replies of the chained admission when the member took the group's session. */
17
+ readonly chained: Replies | undefined;
18
+ };
19
+ Alone: {};
20
+ }>;
21
+ export declare const Shared: {
22
+ readonly $is: <Tag extends "Alone" | "Committed">(tag: Tag) => (u: unknown) => u is Extract<{
23
+ readonly _tag: "Alone";
24
+ }, {
25
+ readonly _tag: Tag;
26
+ }> | Extract<{
27
+ readonly _tag: "Committed";
28
+ readonly version: string;
29
+ readonly endedAtMs: number;
30
+ readonly chained: Replies | undefined;
31
+ }, {
32
+ readonly _tag: Tag;
33
+ }>;
34
+ readonly $match: {
35
+ <Cases extends { readonly [Tag in "Alone" | "Committed"]: (args: Extract<{
36
+ readonly _tag: "Alone";
37
+ } | {
38
+ readonly _tag: "Committed";
39
+ readonly version: string;
40
+ readonly endedAtMs: number;
41
+ readonly chained: Replies | undefined;
42
+ }, {
43
+ readonly _tag: Tag;
44
+ }>) => any; }>(cases: Cases): (value: {
45
+ readonly _tag: "Alone";
46
+ } | {
47
+ readonly _tag: "Committed";
48
+ readonly version: string;
49
+ readonly endedAtMs: number;
50
+ readonly chained: Replies | undefined;
51
+ }) => import("effect/Unify").Unify<ReturnType<Cases["Alone" | "Committed"]>>;
52
+ <Cases extends { readonly [Tag in "Alone" | "Committed"]: (args: Extract<{
53
+ readonly _tag: "Alone";
54
+ } | {
55
+ readonly _tag: "Committed";
56
+ readonly version: string;
57
+ readonly endedAtMs: number;
58
+ readonly chained: Replies | undefined;
59
+ }, {
60
+ readonly _tag: Tag;
61
+ }>) => any; }>(value: {
62
+ readonly _tag: "Alone";
63
+ } | {
64
+ readonly _tag: "Committed";
65
+ readonly version: string;
66
+ readonly endedAtMs: number;
67
+ readonly chained: Replies | undefined;
68
+ }, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Alone" | "Committed"]>>;
69
+ };
70
+ readonly Alone: Data.TaggedEnum.ConstructorFrom<{
71
+ readonly _tag: "Alone";
72
+ }, "_tag">;
73
+ readonly Committed: Data.TaggedEnum.ConstructorFrom<{
74
+ readonly _tag: "Committed";
75
+ readonly version: string;
76
+ readonly endedAtMs: number;
77
+ readonly chained: Replies | undefined;
78
+ }, "_tag">;
79
+ };
80
+ /**
81
+ * A member whose actor already has its next batch waiting asks to take the
82
+ * group's session after the commit, with that batch's `BEGIN` and admission
83
+ * sent right behind the group's `COMMIT`. `adopt` receives the session and
84
+ * the scope that returns it to the pool, and answers false when the member
85
+ * can no longer take it, so the group discards the session instead.
86
+ */
87
+ export interface Handoff {
88
+ readonly chain: (connection: PgConnection.PgConnection) => ReadonlyArray<Statement>;
89
+ readonly adopt: (connection: PgConnection.PgConnection, scope: Scope.Closeable) => Effect.Effect<boolean>;
90
+ }
91
+ declare const Unseated_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
92
+ readonly _tag: "Unseated";
93
+ } & Readonly<A>;
94
+ /**
95
+ * Raised by a member's connection when the member sends a statement outside
96
+ * its admission and its writes. The member leaves its group and runs again
97
+ * alone, so nothing it sends while its handlers run can commit with others.
98
+ */
99
+ export declare class Unseated extends Unseated_base<{}> {
100
+ }
101
+ /** Postgres refused the statement only because an earlier one aborted the transaction. */
102
+ export declare const abortedBefore: (error: SqlError.SqlError) => boolean;
103
+ export declare const errorOf: (exit: Exit.Exit<unknown, SqlError.SqlError>) => SqlError.SqlError | undefined;
104
+ /** Members a group holds at most, which also bounds its commit flight. */
105
+ export declare const GROUP_MEMBERS = 32;
106
+ /**
107
+ * How long a closed group waits for members still running before it commits
108
+ * without them. Tests change it to place an eviction or an interruption.
109
+ */
110
+ export declare const TurnGroupSettings: Context.Reference<{
111
+ readonly wait: Duration.Duration;
112
+ }>;
113
+ /** One member's view of its group. */
114
+ export interface Member {
115
+ /** The group's session, once the member's admission is queued. */
116
+ readonly connection: () => PgConnection.PgConnection;
117
+ /** The replies of the member's admission statements, in order. */
118
+ readonly replies: () => Replies;
119
+ /** From here the member's handlers run and its connection refuses statements; false once evicted. */
120
+ readonly handling: Effect.Effect<boolean>;
121
+ /** Passes a statement only while the member admits or the group sends its writes. */
122
+ readonly send: Send;
123
+ /**
124
+ * Hands the member's commit writes to the group and waits for the shared
125
+ * commit. Interrupted before the group sends them, the writes are withdrawn.
126
+ */
127
+ readonly commit: (writes: ReadonlyArray<Statement>, handoff?: Handoff) => Effect.Effect<Shared, SqlError.SqlError>;
128
+ /** Leaves without writes; `aborted` says one of the member's statements failed. */
129
+ readonly leave: (aborted: boolean) => Effect.Effect<void>;
130
+ }
131
+ declare const TurnGroups_base: Context.ServiceClass<TurnGroups, "@rikalabs/akter/runtime/turn/group/TurnGroups", {
132
+ readonly join: (options: {
133
+ readonly key: string;
134
+ readonly settings: (connection: PgConnection.PgConnection) => Statement;
135
+ /** Cancels the statement the session's backend is running. */
136
+ readonly cancel: (connection: PgConnection.PgConnection) => Effect.Effect<void>;
137
+ readonly admission: (member: Member) => ReadonlyArray<Statement>;
138
+ }) => Effect.Effect<Member, SqlError.SqlError>;
139
+ }>;
140
+ /**
141
+ * Concurrent warm turns of different actors sharing one transaction, one
142
+ * `COMMIT` and one WAL flush. Each group leases one turn session and admits
143
+ * members that would set the same transaction settings, until its first
144
+ * member hands over its writes, every member has left, or it is full. Every member sends
145
+ * its own admission on the group's session and waits for its own replies;
146
+ * the first ones ride with `BEGIN` and the settings. Once every member has
147
+ * handed over or left, or the wait after closing runs out and the members
148
+ * still running are sent to run alone, one flight carries every member's
149
+ * writes, `COMMIT` and the version and clock read.
150
+ *
151
+ * A warm admission writes nothing, so a member that leaves takes nothing with
152
+ * it and its neighbours commit unaffected. A statement error aborts the whole
153
+ * transaction: the member whose own statement failed gets its error, and every
154
+ * other member runs again alone. A lost reply after the writes were sent is a
155
+ * commit-unknown outcome for every member that handed over writes, and each
156
+ * resolves through its receipt. A member's interruption cancels the group's
157
+ * backend only once every member waiting on the sent commit was interrupted,
158
+ * as a lone turn's would; the group's own interruption discards the session. The
159
+ * session returns to the pool once nothing is in flight, before any member
160
+ * publishes.
161
+ */
162
+ export declare class TurnGroups extends TurnGroups_base {
163
+ }
164
+ export declare const turnGroups: Layer.Layer<TurnGroups, never, TurnConnections>;
165
+ export {};
@@ -0,0 +1,326 @@
1
+ import { Cause, Clock, Context, Deferred, Duration, Effect, Exit, Fiber, Data, Layer, Option, Predicate, Scope, } from "effect";
2
+ import { COMMIT_VERSION } from "../database/replica.js";
3
+ import { Metrics, record } from "../telemetry/metrics.js";
4
+ import { queueStatements, TurnConnections } from "./pipeline.js";
5
+ export const Shared = Data.taggedEnum();
6
+ const alone = Shared.Alone();
7
+ /**
8
+ * Raised by a member's connection when the member sends a statement outside
9
+ * its admission and its writes. The member leaves its group and runs again
10
+ * alone, so nothing it sends while its handlers run can commit with others.
11
+ */
12
+ export class Unseated extends Data.TaggedError("Unseated") {
13
+ }
14
+ /** Postgres refused the statement only because an earlier one aborted the transaction. */
15
+ export const abortedBefore = (error) => error.reason.cause?.code === "25P02";
16
+ export const errorOf = (exit) => Exit.isSuccess(exit) ? undefined : Option.getOrUndefined(Cause.findErrorOption(exit.cause));
17
+ /** Members a group holds at most, which also bounds its commit flight. */
18
+ export const GROUP_MEMBERS = 32;
19
+ /**
20
+ * How long a closed group waits for members still running before it commits
21
+ * without them. Tests change it to place an eviction or an interruption.
22
+ */
23
+ export const TurnGroupSettings = Context.Reference("akter/TurnGroupSettings", { defaultValue: () => ({ wait: Duration.millis(100) }) });
24
+ /**
25
+ * Concurrent warm turns of different actors sharing one transaction, one
26
+ * `COMMIT` and one WAL flush. Each group leases one turn session and admits
27
+ * members that would set the same transaction settings, until its first
28
+ * member hands over its writes, every member has left, or it is full. Every member sends
29
+ * its own admission on the group's session and waits for its own replies;
30
+ * the first ones ride with `BEGIN` and the settings. Once every member has
31
+ * handed over or left, or the wait after closing runs out and the members
32
+ * still running are sent to run alone, one flight carries every member's
33
+ * writes, `COMMIT` and the version and clock read.
34
+ *
35
+ * A warm admission writes nothing, so a member that leaves takes nothing with
36
+ * it and its neighbours commit unaffected. A statement error aborts the whole
37
+ * transaction: the member whose own statement failed gets its error, and every
38
+ * other member runs again alone. A lost reply after the writes were sent is a
39
+ * commit-unknown outcome for every member that handed over writes, and each
40
+ * resolves through its receipt. A member's interruption cancels the group's
41
+ * backend only once every member waiting on the sent commit was interrupted,
42
+ * as a lone turn's would; the group's own interruption discards the session. The
43
+ * session returns to the pool once nothing is in flight, before any member
44
+ * publishes.
45
+ */
46
+ export class TurnGroups extends Context.Service()("@rikalabs/akter/runtime/turn/group/TurnGroups") {
47
+ }
48
+ export const turnGroups = Layer.effect(TurnGroups, Effect.gen(function* () {
49
+ const turns = yield* TurnConnections;
50
+ const { wait } = yield* TurnGroupSettings;
51
+ const layer = yield* Effect.scope;
52
+ const waitMs = Duration.toMillis(wait);
53
+ const forming = new Map();
54
+ const wake = (group) => {
55
+ Deferred.doneUnsafe(group.signal, Effect.void);
56
+ };
57
+ const close = (group) => Effect.map(Clock.currentTimeMillis, (now) => {
58
+ if (!group.open)
59
+ return;
60
+ group.open = false;
61
+ group.closedAtMs = now;
62
+ if (forming.get(group.key) === group)
63
+ forming.delete(group.key);
64
+ });
65
+ const leave = (group, seat, aborted) => Effect.suspend(() => {
66
+ if (seat.phase === "left" || seat.phase === "committing" || seat.phase === "ended")
67
+ return Effect.void;
68
+ seat.phase = "left";
69
+ seat.writes = [];
70
+ if (aborted)
71
+ group.aborted = true;
72
+ return Effect.andThen(group.seats.every(({ phase }) => phase === "left") ? close(group) : Effect.void, Effect.sync(() => wake(group)));
73
+ });
74
+ const queue = (group, seat) => Effect.suspend(() => {
75
+ if (seat.sent || seat.phase !== "admitting")
76
+ return Effect.void;
77
+ seat.sent = true;
78
+ return Effect.flatMap(queueStatements({ scope: group.scope, group: seat.admission }), (replies) => Deferred.succeed(seat.queued, replies));
79
+ });
80
+ /** Waits for the group's next change, at most `ms` when given; true when it changed. */
81
+ const changed = (group, ms) => Effect.suspend(() => {
82
+ const signal = group.signal;
83
+ const waiting = Deferred.await(signal);
84
+ return Effect.map(ms === undefined ? waiting : Effect.timeoutOption(waiting, Duration.millis(ms)), () => {
85
+ const fired = Deferred.isDoneUnsafe(signal);
86
+ if (fired)
87
+ group.signal = Deferred.makeUnsafe();
88
+ return fired;
89
+ });
90
+ });
91
+ const settled = (group) => group.seats.every(({ phase }) => phase === "deposited" || phase === "left");
92
+ /**
93
+ * Ends the group's transaction, then returns or hands over the session,
94
+ * and only then answers every member that handed over writes, so no
95
+ * member publishes while the session is still out. A member whose turn
96
+ * ended moves to a terminal phase, so its connection refuses any later
97
+ * statement. The hand-off goes only to a member still waiting; an
98
+ * interrupted one's session is discarded with its chained transaction.
99
+ */
100
+ const commit = Effect.fnUntraced(function* (group) {
101
+ group.sent = true;
102
+ const members = group.seats.filter(({ phase }) => phase === "deposited");
103
+ for (const seat of members)
104
+ seat.phase = "committing";
105
+ const writes = group.aborted ? [] : members.flatMap(({ writes }) => writes);
106
+ const ending = writes.length > 0 ? "COMMIT" : "ROLLBACK";
107
+ const connection = group.connection;
108
+ const held = group.scope;
109
+ const handoff = group.aborted ? undefined : members.find((seat) => seat.handoff !== undefined);
110
+ let tag;
111
+ let version = "";
112
+ let endedAtMs = 0;
113
+ const replies = yield* queueStatements({
114
+ scope: held,
115
+ group: [
116
+ ...writes,
117
+ Effect.map(connection.query(ending, [], true), (result) => {
118
+ tag = result.command;
119
+ }),
120
+ Effect.map(connection.query(COMMIT_VERSION, [], true), (result) => {
121
+ const ended = result.rows[0];
122
+ version = ended.version;
123
+ endedAtMs = Number(ended.now);
124
+ }),
125
+ ...(handoff === undefined ? [] : handoff.handoff.chain(connection)),
126
+ ],
127
+ });
128
+ const chained = replies.slice(writes.length + 2);
129
+ const exits = yield* Effect.forEach(replies.slice(0, writes.length + 2), Fiber.await);
130
+ group.done = true;
131
+ const errors = exits.map(errorOf);
132
+ const lost = errors.find((error) => error !== undefined && Predicate.isTagged(error.reason, "ConnectionError"));
133
+ const ended = exits[writes.length];
134
+ const read = errors[writes.length + 1];
135
+ const committed = Exit.isSuccess(ended) && tag === "COMMIT";
136
+ const outcomes = [];
137
+ let offset = 0;
138
+ for (const seat of members) {
139
+ const own = group.aborted ? [] : errors.slice(offset, offset + seat.writes.length);
140
+ offset += own.length;
141
+ if (lost !== undefined) {
142
+ outcomes.push([seat, Exit.fail(lost)]);
143
+ continue;
144
+ }
145
+ if (seat.writes.length === 0 ? !Exit.isSuccess(ended) : !committed) {
146
+ const error = own.find((failure) => failure !== undefined && !abortedBefore(failure));
147
+ outcomes.push([seat, error === undefined ? Exit.succeed(alone) : Exit.fail(error)]);
148
+ continue;
149
+ }
150
+ const unknown = own.find((failure) => failure !== undefined) ?? read;
151
+ outcomes.push([
152
+ seat,
153
+ unknown === undefined
154
+ ? Exit.succeed(Shared.Committed({ version, endedAtMs, chained: undefined }))
155
+ : Exit.fail(unknown),
156
+ ]);
157
+ }
158
+ const taking = outcomes.some(([seat, outcome]) => seat === handoff &&
159
+ !seat.interrupted &&
160
+ !group.cancelled &&
161
+ lost === undefined &&
162
+ Exit.isSuccess(outcome) &&
163
+ Shared.$is("Committed")(outcome.value));
164
+ const handed = taking && (yield* handoff.handoff.adopt(connection, held));
165
+ if (lost !== undefined || group.cancelled || (handoff !== undefined && !handed))
166
+ yield* turns.invalidate(connection);
167
+ if (!handed)
168
+ yield* Scope.close(held, Exit.void);
169
+ for (const [seat, outcome] of outcomes) {
170
+ seat.phase = "ended";
171
+ yield* Deferred.done(seat.result, handed &&
172
+ seat === handoff &&
173
+ Exit.isSuccess(outcome) &&
174
+ Shared.$is("Committed")(outcome.value)
175
+ ? Exit.succeed(Shared.Committed({ ...outcome.value, chained }))
176
+ : outcome);
177
+ }
178
+ });
179
+ /**
180
+ * One group from lease to commit. A lease that fails, a refusal included,
181
+ * fails every member before anything of theirs was sent. An interrupted
182
+ * group discards its session, so an unsent `COMMIT` rolls back with it.
183
+ */
184
+ const drive = Effect.fnUntraced(function* (group) {
185
+ const held = yield* Scope.make();
186
+ const leasing = yield* Clock.currentTimeMillis;
187
+ const leased = yield* Scope.provide(turns.lease, held).pipe(Effect.exit);
188
+ if (Exit.isFailure(leased)) {
189
+ yield* close(group);
190
+ yield* Scope.close(held, leased);
191
+ const error = errorOf(leased);
192
+ for (const seat of group.seats) {
193
+ yield* Deferred.failCause(seat.queued, error === undefined ? Cause.die(Cause.squash(leased.cause)) : Cause.fail(error));
194
+ }
195
+ return;
196
+ }
197
+ yield* record(Metrics.poolWait, {}, (yield* Clock.currentTimeMillis) - leasing);
198
+ group.connection = leased.value;
199
+ group.scope = held;
200
+ yield* Effect.gen(function* () {
201
+ while (!group.seats.some(({ phase }) => phase === "admitting") && group.open)
202
+ yield* changed(group);
203
+ if (!group.seats.some(({ phase }) => phase === "admitting")) {
204
+ yield* close(group);
205
+ return yield* Scope.close(held, Exit.void);
206
+ }
207
+ yield* Effect.uninterruptible(Effect.gen(function* () {
208
+ yield* queueStatements({
209
+ scope: held,
210
+ group: [
211
+ Effect.asVoid(leased.value.query("BEGIN", [], true)),
212
+ group.settings(leased.value),
213
+ ],
214
+ });
215
+ group.begun = true;
216
+ for (const seat of group.seats)
217
+ yield* queue(group, seat);
218
+ }));
219
+ while (group.open || !settled(group)) {
220
+ if (group.open) {
221
+ yield* changed(group);
222
+ continue;
223
+ }
224
+ const left = waitMs - ((yield* Clock.currentTimeMillis) - group.closedAtMs);
225
+ if (left <= 0 || !(yield* changed(group, left))) {
226
+ for (const seat of group.seats)
227
+ if (seat.phase === "admitting" || seat.phase === "handling") {
228
+ seat.phase = "ended";
229
+ yield* Deferred.succeed(seat.result, alone);
230
+ }
231
+ break;
232
+ }
233
+ }
234
+ yield* Effect.uninterruptible(commit(group));
235
+ }).pipe(Effect.onInterrupt(() => Effect.gen(function* () {
236
+ group.sent = true;
237
+ yield* close(group);
238
+ if (group.begun)
239
+ yield* turns.invalidate(leased.value);
240
+ yield* Scope.close(held, Exit.void);
241
+ for (const seat of group.seats) {
242
+ yield* Deferred.interrupt(seat.queued);
243
+ yield* Deferred.interrupt(seat.result);
244
+ }
245
+ })));
246
+ });
247
+ const join = (options) => Effect.uninterruptibleMask((restore) => Effect.suspend(() => {
248
+ const found = forming.get(options.key);
249
+ const group = found ?? {
250
+ key: options.key,
251
+ seats: [],
252
+ settings: options.settings,
253
+ cancel: options.cancel,
254
+ connection: undefined,
255
+ scope: undefined,
256
+ open: true,
257
+ begun: false,
258
+ sent: false,
259
+ done: false,
260
+ cancelled: false,
261
+ aborted: false,
262
+ closedAtMs: 0,
263
+ signal: Deferred.makeUnsafe(),
264
+ };
265
+ if (found === undefined)
266
+ forming.set(options.key, group);
267
+ const seat = {
268
+ phase: "admitting",
269
+ admission: [],
270
+ sent: false,
271
+ queued: Deferred.makeUnsafe(),
272
+ writes: [],
273
+ handoff: undefined,
274
+ interrupted: false,
275
+ result: Deferred.makeUnsafe(),
276
+ };
277
+ let replies = [];
278
+ const member = {
279
+ connection: () => group.connection,
280
+ replies: () => replies,
281
+ handling: Effect.sync(() => {
282
+ if (seat.phase !== "admitting")
283
+ return false;
284
+ seat.phase = "handling";
285
+ return true;
286
+ }),
287
+ send: (statement) => Effect.suspend(() => seat.phase === "admitting" || seat.phase === "committing"
288
+ ? statement
289
+ : Effect.die(new Unseated())),
290
+ commit: (writes, handoff) => Effect.suspend(() => {
291
+ if (seat.phase !== "handling")
292
+ return Effect.succeed(alone);
293
+ seat.phase = "deposited";
294
+ seat.writes = writes;
295
+ seat.handoff = handoff;
296
+ return close(group).pipe(Effect.andThen(Effect.sync(() => {
297
+ wake(group);
298
+ })), Effect.andThen(restore(Deferred.await(seat.result))), Effect.onInterrupt(() => Effect.suspend(() => {
299
+ if (!group.sent)
300
+ return leave(group, seat, false);
301
+ seat.interrupted = true;
302
+ if (group.done ||
303
+ group.cancelled ||
304
+ group.seats.some((each) => each.phase === "committing" && !each.interrupted))
305
+ return Effect.void;
306
+ group.cancelled = true;
307
+ return group.cancel(group.connection);
308
+ })));
309
+ }),
310
+ leave: (aborted) => leave(group, seat, aborted),
311
+ };
312
+ seat.admission = options.admission(member);
313
+ group.seats.push(seat);
314
+ const full = group.seats.length >= GROUP_MEMBERS ? close(group) : Effect.void;
315
+ const start = found === undefined
316
+ ? Effect.asVoid(Effect.forkIn(drive(group), layer))
317
+ : group.begun
318
+ ? queue(group, seat)
319
+ : Effect.sync(() => wake(group));
320
+ return full.pipe(Effect.andThen(start), Effect.andThen(restore(Deferred.await(seat.queued))), Effect.map((queued) => {
321
+ replies = queued;
322
+ return member;
323
+ }), Effect.onInterrupt(() => leave(group, seat, false)));
324
+ }));
325
+ return TurnGroups.of({ join });
326
+ }));
@@ -0,0 +1,44 @@
1
+ import { Context, Effect, Schema } from "effect";
2
+ import type { Request } from "../request.ts";
3
+ /**
4
+ * A named moment in command delivery, turn execution, and the outbox and
5
+ * subscription relays where a test can pause, fail, or crash the runtime.
6
+ */
7
+ export type TurnPoint = "beforeDelivery" | "queued" | "beforeHandler" | "beforeCommit" | "afterCommit" | "beforeFlush" | "afterClaim" | "beforeOutboxDelete" | "beforeExecute" | "afterExecute" | "beforeRenew" | "beforeDeadLetterCommit" | "beforeSettle" | "afterSettleSnapshot" | "afterExpand" | "beforeWorkflowSuspend";
8
+ declare const RetryTurn_base: Schema.Class<RetryTurn, Schema.TaggedStruct<"RetryTurn", {
9
+ readonly message: Schema.String;
10
+ }>, import("effect/Cause").YieldableError>;
11
+ /**
12
+ * A defect that says nothing about the command: the activation restarts and
13
+ * the caller retries the same command id. Tests raise it to inject a crash.
14
+ */
15
+ export declare class RetryTurn extends RetryTurn_base {
16
+ }
17
+ /**
18
+ * Called at each `TurnPoint` with the request in flight. The default does
19
+ * nothing; a test hook can wait, fail, or die at that point. A hook that dies
20
+ * with `RetryTurn` simulates a crash the runtime recovers from.
21
+ */
22
+ export declare const TurnHooks: Context.Reference<{
23
+ readonly at: (point: TurnPoint, request: Request) => Effect.Effect<void>;
24
+ }>;
25
+ /**
26
+ * Where a test can pause a content operation between its two single-shard
27
+ * statements: a read after resolving the reference, the sweep after its
28
+ * reference scan, and `Content.grant` before it raises the grant horizon.
29
+ */
30
+ export type ContentPoint = "afterResolve" | "afterReferenceScan" | "beforeRaise";
31
+ export declare const ContentHooks: Context.Reference<{
32
+ readonly at: (point: ContentPoint) => Effect.Effect<void>;
33
+ }>;
34
+ /**
35
+ * Test controls for retention cleanup: rows per batch statement, a point
36
+ * after each committed batch where a test can pause or crash the sweep, and
37
+ * whether the runtime sweeps on its own every minute.
38
+ */
39
+ export declare const CleanupHooks: Context.Reference<{
40
+ readonly batchSize: number;
41
+ readonly afterBatch: Effect.Effect<void>;
42
+ readonly periodic: boolean;
43
+ }>;
44
+ export {};
@@ -0,0 +1,28 @@
1
+ import { Context, Effect, Schema } from "effect";
2
+ /**
3
+ * A defect that says nothing about the command: the activation restarts and
4
+ * the caller retries the same command id. Tests raise it to inject a crash.
5
+ */
6
+ export class RetryTurn extends Schema.TaggedError()("RetryTurn", {
7
+ message: Schema.String,
8
+ }) {
9
+ }
10
+ /**
11
+ * Called at each `TurnPoint` with the request in flight. The default does
12
+ * nothing; a test hook can wait, fail, or die at that point. A hook that dies
13
+ * with `RetryTurn` simulates a crash the runtime recovers from.
14
+ */
15
+ export const TurnHooks = Context.Reference("akter/TurnHooks", {
16
+ defaultValue: () => ({ at: () => Effect.void }),
17
+ });
18
+ export const ContentHooks = Context.Reference("akter/ContentHooks", {
19
+ defaultValue: () => ({ at: () => Effect.void }),
20
+ });
21
+ /**
22
+ * Test controls for retention cleanup: rows per batch statement, a point
23
+ * after each committed batch where a test can pause or crash the sweep, and
24
+ * whether the runtime sweeps on its own every minute.
25
+ */
26
+ export const CleanupHooks = Context.Reference("akter/CleanupHooks", {
27
+ defaultValue: () => ({ batchSize: 1000, afterBatch: Effect.void, periodic: true }),
28
+ });