@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,155 @@
1
+ import { Context, type Effect, type Scope, type Stream } from "effect";
2
+ import type { Transport } from "./connections/transport.ts";
3
+ import type { Holder } from "./connections/holder.ts";
4
+ import type { ProgressMessage } from "./jobs/progress.ts";
5
+ import type { ActorError } from "../errors/actor.ts";
6
+ import type { RetentionGap, UnknownCursor } from "../errors/events.ts";
7
+ import type { ActorRef, Caller } from "../identity/caller.ts";
8
+ import type { Seed } from "./operators/seed.ts";
9
+ import type { MintInput } from "../identity/mint.ts";
10
+ import type { Swept } from "./storage/retention.ts";
11
+ import type { BlobAccess, BlobScope } from "../state/blob.ts";
12
+ import type { TableAccess, TableScope } from "../tables/owned.ts";
13
+ import type { Executed, Outcome, Request } from "./request.ts";
14
+ import type { FleetRequest } from "./fleet/subscribe.ts";
15
+ import type { JobRegistration, QueryRegistration, Registration, StoredEvent, WatchResult, WorkflowStatus } from "./members.ts";
16
+ declare const InternalActors_base: Context.ServiceClass<InternalActors, "@rikalabs/akter/runtime/actors/InternalActors", {
17
+ readonly register: (actor: Registration) => Effect.Effect<void, never, Scope.Scope>;
18
+ readonly transport: Transport;
19
+ /** This runner's in-process connection holder. */
20
+ readonly holder: Holder;
21
+ /** Ends the actor's activation on this runner as idle expiry would. */
22
+ readonly hibernate: (ref: ActorRef) => Effect.Effect<void>;
23
+ readonly execute: (request: Request) => Effect.Effect<Executed, ActorError>;
24
+ /**
25
+ * Whether `execute` would refuse a served command without waiting, before
26
+ * its request is read or decoded.
27
+ */
28
+ readonly overloaded: () => boolean;
29
+ /** Bounds command request processing before authentication or body parsing starts. */
30
+ readonly admitRequest: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ActorError, R>;
31
+ /**
32
+ * Delivers a committed intent. The obligation was admitted by its sending
33
+ * turn, so external access and command-id expiry are not checked again.
34
+ */
35
+ readonly deliver: (request: Request) => Effect.Effect<Outcome, ActorError>;
36
+ /** Runs relay passes until no due intent remains; used by `ActorTest.advance`. */
37
+ readonly drainOutbox: Effect.Effect<void>;
38
+ /** Runs one retention sweep now; used by `ActorTest.cleanup`. */
39
+ readonly cleanup: Effect.Effect<Swept>;
40
+ /**
41
+ * Sweeps every tenant's unreferenced content now, whenever each was last
42
+ * swept, and returns how many contents it deleted; for tests.
43
+ */
44
+ readonly sweepContent: Effect.Effect<number>;
45
+ /**
46
+ * Moves the leases of this runner's running effect attempts forward and
47
+ * runs `jump`, with no relay pass between them; used by `ActorTest.advance`.
48
+ */
49
+ readonly extendOutboxLeases: (millis: number, jump: Effect.Effect<void>) => Effect.Effect<void>;
50
+ readonly registerQueries: (actor: QueryRegistration) => Effect.Effect<void, never, Scope.Scope>;
51
+ readonly registerJobs: (actor: JobRegistration) => Effect.Effect<void, never, Scope.Scope>;
52
+ /**
53
+ * Reads committed state. With `minVersion`, a configured replica answers
54
+ * only once it has replayed that commit version; otherwise the primary does.
55
+ */
56
+ readonly query: (request: Request, minVersion?: string) => Effect.Effect<Outcome, ActorError>;
57
+ /** The highest commit version any command sent through this runtime has returned. */
58
+ readonly observedVersion: () => string | undefined;
59
+ /** Sends one progress message to its actor's owner as an executor pool would; for tests. */
60
+ readonly deliverProgress: (message: ProgressMessage) => Effect.Effect<void>;
61
+ /** Whether the actor has a generation row, read without waking or creating it. */
62
+ readonly exists: (ref: ActorRef) => Effect.Effect<boolean, ActorError>;
63
+ /**
64
+ * Reads up to `limit` committed events of `tags` after an exclusive
65
+ * cursor, like a query, without waking the actor; an actor with no
66
+ * generation row fails `NotCreated` and gets none. Values are upcast to
67
+ * the current version of their class.
68
+ */
69
+ readonly readFeed: (ref: ActorRef, tags: ReadonlyArray<string>, after: string | undefined, limit: number) => Effect.Effect<ReadonlyArray<Omit<StoredEvent, "version"> & {
70
+ readonly tag: string;
71
+ }>, ActorError | UnknownCursor | RetentionGap>;
72
+ /**
73
+ * Subscribes to a stream member on the actor's owner: `request.command`
74
+ * is the member and `request.payload` its encoded input. Elements arrive
75
+ * encoded; a declared failure fails with its encoding.
76
+ */
77
+ readonly subscribe: (request: Request) => Stream.Stream<string, ActorError | {
78
+ readonly failure: string;
79
+ }>;
80
+ /**
81
+ * Watches a query declared `watch: true`: `request.command` is the query
82
+ * and `request.payload` its encoded input. The effect opens the watch at
83
+ * this runner's holder, which authorizes it with `kind: "watch"`, and
84
+ * fails `NotCreated` for an actor no command has created. The stream
85
+ * starts with the current result, then sends the newest result after each
86
+ * commit that wrote something the last run read, skipping intermediate
87
+ * results and results equal to the last one. A declared failure fails it
88
+ * with its encoding. `minVersion` is a commit version the first result
89
+ * reflects at least, and `expiresAt` the credential's expiry in epoch
90
+ * milliseconds, which ends the watch with `Unauthorized`.
91
+ */
92
+ readonly watch: (request: Request, options: {
93
+ readonly minVersion: string | undefined;
94
+ readonly expiresAt: number | undefined;
95
+ }) => Effect.Effect<Stream.Stream<WatchResult, ActorError | {
96
+ readonly failure: string;
97
+ }>, ActorError>;
98
+ /**
99
+ * Subscribes to a fleet view for the caller's tenant: the effect
100
+ * authorizes it with `kind: "fleet"` and fails `RunnerAtCapacity` past
101
+ * the view's subscriptions on this runner. The stream starts with the
102
+ * current page, `{ asOf, stale, rows }` encoded as a watch result, then
103
+ * sends a page each time the view's state changed and its page differs;
104
+ * it ends `Unauthorized` once reauthorization is refused or the
105
+ * credential expires.
106
+ */
107
+ readonly fleet: (request: FleetRequest) => Effect.Effect<Stream.Stream<WatchResult, ActorError>, ActorError>;
108
+ /** The fleet views this runtime registered, by name. */
109
+ readonly fleetViews: ReadonlySet<string>;
110
+ /**
111
+ * Reads one execution's status like a query: `request.command` is the
112
+ * workflow member, `request.payload` the execution id.
113
+ */
114
+ readonly pollWorkflow: (request: Request) => Effect.Effect<WorkflowStatus | undefined, ActorError>;
115
+ readonly mintActorId: Effect.Effect<string>;
116
+ /** Derives the id a parent turn mints for a child actor. */
117
+ readonly mintChildId: (input: MintInput) => Effect.Effect<string>;
118
+ /** The deployment's command retry window: every id's `expiresAt - issuedAt`. */
119
+ readonly retryWindowMs: number;
120
+ /** The database clock in epoch milliseconds, the only clock command ids are checked against. */
121
+ readonly databaseNow: Effect.Effect<number, ActorError>;
122
+ /** A fresh command id issued at the database clock, as `Actors.mintCommandId` returns. */
123
+ readonly mintCommandId: Effect.Effect<string, ActorError>;
124
+ /**
125
+ * Binds owned-table capabilities to the calling fiber's turn or query.
126
+ * Writable access requires the turn transaction and never opens its own.
127
+ */
128
+ readonly tables: (scope: TableScope, write: boolean) => Effect.Effect<TableAccess>;
129
+ /** The Cluster shard that places `ref`'s activation, as stored in runner shard locks. */
130
+ readonly shardId: (ref: ActorRef) => Effect.Effect<string>;
131
+ /** Binds blob capabilities the same way; writable access requires the turn transaction. */
132
+ readonly blobs: (scope: BlobScope, write: boolean) => Effect.Effect<BlobAccess>;
133
+ /** Which layers of an actor type this process registered. */
134
+ readonly registered: (actor: string) => {
135
+ readonly commands: boolean;
136
+ readonly queries: boolean;
137
+ };
138
+ /** The blob names a registered actor type declares, for test inspection. */
139
+ readonly declaredBlobs: (actor: string) => ReadonlyArray<string>;
140
+ /**
141
+ * Starts the actor `ref` from `seed` in one transaction, staging its
142
+ * pending work as `caller`; dies, writing nothing, when the seed is of
143
+ * another type, names an effect the actor does not register, or the
144
+ * actor already exists.
145
+ */
146
+ readonly seed: (request: {
147
+ readonly ref: ActorRef;
148
+ readonly caller: Caller;
149
+ readonly seed: Seed;
150
+ }) => Effect.Effect<void>;
151
+ }>;
152
+ /** Runtime-only capabilities; package entry points export only Actors. */
153
+ export declare class InternalActors extends InternalActors_base {
154
+ }
155
+ export {};
@@ -0,0 +1,4 @@
1
+ import { Context } from "effect";
2
+ /** Runtime-only capabilities; package entry points export only Actors. */
3
+ export class InternalActors extends Context.Service()("@rikalabs/akter/runtime/actors/InternalActors") {
4
+ }
@@ -0,0 +1,34 @@
1
+ import { Duration, Effect, type Scope } from "effect";
2
+ import { ActorError } from "../errors/actor.ts";
3
+ /**
4
+ * The cause of an `ActorUnavailable` that refused a command before it reached
5
+ * any queue: the runner could not admit it within its admission wait, or the
6
+ * actor's activation already held its limit of waiting commands. Nothing of
7
+ * the command ran.
8
+ */
9
+ export declare const overloaded: (queue: "runner" | "activation") => ActorError;
10
+ /** Whether `error` is a refusal for overload, which a delivery never retries in place. */
11
+ export declare const isOverloaded: (error: ActorError) => boolean;
12
+ /**
13
+ * Admits at most `limit` effects at once. The next `limit` callers wait for a
14
+ * slot in arrival order, each for at most `wait`; a caller past them, or one
15
+ * whose wait runs out, is refused with `ActorUnavailable`. Work past what the
16
+ * runner can serve therefore waits in its callers' retries instead of in the
17
+ * runner's mailboxes and pool queues, while a burst shorter than `wait` is
18
+ * absorbed rather than refused. A refusal happens before the effect starts, so
19
+ * a refused command never reaches admission, a mailbox, or a turn.
20
+ *
21
+ * A slot freed while callers wait goes straight to the oldest, never back to
22
+ * the free count, so a newcomer cannot overtake a waiter. A waiter whose wait
23
+ * ends after it was handed a slot passes the slot on, so a slot is never lost.
24
+ */
25
+ export declare const admissionLimit: ({ limit, wait, }: {
26
+ readonly limit: number;
27
+ readonly wait: Duration.Duration;
28
+ }) => {
29
+ /** Whether the next caller would be refused without waiting. */
30
+ full: () => boolean;
31
+ /** Holds a slot until its scope closes, including after the acquiring fiber stops waiting. */
32
+ take: Effect.Effect<void, ActorError, Scope.Scope>;
33
+ admit: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ActorError, R>;
34
+ };
@@ -0,0 +1,72 @@
1
+ import { Duration, Effect, Schema } from "effect";
2
+ import { ActorError, ActorUnavailable } from "../errors/actor.js";
3
+ /**
4
+ * The cause of an `ActorUnavailable` that refused a command before it reached
5
+ * any queue: the runner could not admit it within its admission wait, or the
6
+ * actor's activation already held its limit of waiting commands. Nothing of
7
+ * the command ran.
8
+ */
9
+ export const overloaded = (queue) => ActorError.make({
10
+ reason: ActorUnavailable.make({
11
+ overloaded: true,
12
+ cause: new Error(queue === "runner"
13
+ ? "The runner holds its limit of commands in flight"
14
+ : "The activation holds its limit of waiting commands"),
15
+ }),
16
+ });
17
+ /** Whether `error` is a refusal for overload, which a delivery never retries in place. */
18
+ export const isOverloaded = (error) => Schema.is(ActorUnavailable)(error.reason) && error.reason.overloaded === true;
19
+ /**
20
+ * Admits at most `limit` effects at once. The next `limit` callers wait for a
21
+ * slot in arrival order, each for at most `wait`; a caller past them, or one
22
+ * whose wait runs out, is refused with `ActorUnavailable`. Work past what the
23
+ * runner can serve therefore waits in its callers' retries instead of in the
24
+ * runner's mailboxes and pool queues, while a burst shorter than `wait` is
25
+ * absorbed rather than refused. A refusal happens before the effect starts, so
26
+ * a refused command never reaches admission, a mailbox, or a turn.
27
+ *
28
+ * A slot freed while callers wait goes straight to the oldest, never back to
29
+ * the free count, so a newcomer cannot overtake a waiter. A waiter whose wait
30
+ * ends after it was handed a slot passes the slot on, so a slot is never lost.
31
+ */
32
+ export const admissionLimit = ({ limit, wait, }) => {
33
+ let free = limit;
34
+ const waiters = new Set();
35
+ const release = Effect.sync(() => {
36
+ const next = waiters.values().next();
37
+ if (next.done === true) {
38
+ free += 1;
39
+ return;
40
+ }
41
+ waiters.delete(next.value);
42
+ next.value.granted = true;
43
+ next.value.resume();
44
+ });
45
+ const enter = (restore) => Effect.suspend(() => {
46
+ if (free > 0) {
47
+ free -= 1;
48
+ return Effect.void;
49
+ }
50
+ if (Duration.isZero(wait) || waiters.size >= limit)
51
+ return Effect.fail(overloaded("runner"));
52
+ let waiter;
53
+ return restore(Effect.callback((resume) => {
54
+ const queued = { granted: false, resume: () => resume(Effect.void) };
55
+ waiter = queued;
56
+ waiters.add(queued);
57
+ return Effect.sync(() => {
58
+ waiters.delete(queued);
59
+ });
60
+ }).pipe(Effect.onInterrupt(() => (waiter?.granted === true ? release : Effect.void)), Effect.timeoutOrElse({
61
+ duration: wait,
62
+ orElse: () => Effect.fail(overloaded("runner")),
63
+ })));
64
+ });
65
+ return {
66
+ /** Whether the next caller would be refused without waiting. */
67
+ full: () => free === 0 && (Duration.isZero(wait) || waiters.size >= limit),
68
+ /** Holds a slot until its scope closes, including after the acquiring fiber stops waiting. */
69
+ take: Effect.uninterruptibleMask((restore) => Effect.andThen(enter(restore), Effect.addFinalizer(() => release))),
70
+ admit: (effect) => Effect.uninterruptibleMask((restore) => Effect.andThen(enter(restore), restore(effect).pipe(Effect.ensuring(release)))),
71
+ };
72
+ };
@@ -0,0 +1,27 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { AdoptionRefused } from "./target.ts";
4
+ /** What a backfill did for one table. */
5
+ export interface BackfillResult {
6
+ readonly table: string;
7
+ /** Rows given a `routing_key`. */
8
+ readonly filled: number;
9
+ /** Full passes over the table; the last one found nothing left to fill. */
10
+ readonly passes: number;
11
+ }
12
+ /**
13
+ * Fills `routing_key` of every row of each observed table of `actors`, in
14
+ * primary-key batches that are each their own transaction, with the runtime's
15
+ * own `routingKey` and the type's placement so a row's key equals the key of
16
+ * an actor that writes it. Nothing is stored between batches: a killed run
17
+ * starts again and finds only the rows still without a key. Rows written by
18
+ * legacy code meanwhile carry none, so it repeats until a pass fills nothing.
19
+ * A table with a NULL or empty mapped column is refused and its rows listed,
20
+ * because no actor owns them.
21
+ */
22
+ export declare const backfillAdoption: (actors: readonly WeakKey[], options: {
23
+ readonly only?: string | undefined;
24
+ readonly batch?: number | undefined;
25
+ }) => Effect.Effect<BackfillResult[], AdoptionRefused | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
26
+ /** One line per table: how many rows were filled and how many passes it took. */
27
+ export declare const formatBackfill: (result: BackfillResult) => string;
@@ -0,0 +1,144 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { ActorRef } from "../../identity/caller.js";
4
+ import { routingKey } from "../storage/codec.js";
5
+ import { quotedTable } from "./plan.js";
6
+ import { AdoptionRefused, adoptionTargets, qualifiedName } from "./target.js";
7
+ const identifier = (name) => `"${name.replaceAll('"', '""')}"`;
8
+ const literal = (value) => `'${value.replaceAll("'", "''")}'`;
9
+ const UNOWNED_SAMPLE = 20;
10
+ /**
11
+ * Fills `routing_key` of every row of each observed table of `actors`, in
12
+ * primary-key batches that are each their own transaction, with the runtime's
13
+ * own `routingKey` and the type's placement so a row's key equals the key of
14
+ * an actor that writes it. Nothing is stored between batches: a killed run
15
+ * starts again and finds only the rows still without a key. Rows written by
16
+ * legacy code meanwhile carry none, so it repeats until a pass fills nothing.
17
+ * A table with a NULL or empty mapped column is refused and its rows listed,
18
+ * because no actor owns them.
19
+ */
20
+ export const backfillAdoption = Effect.fnUntraced(function* (actors, options) {
21
+ const batch = options.batch ?? 1000;
22
+ if (!Number.isInteger(batch) || batch < 1)
23
+ return yield* AdoptionRefused.make({ message: "--batch is a positive integer" });
24
+ const results = [];
25
+ for (const target of yield* adoptionTargets(actors, options.only)) {
26
+ if (target.access === "read") {
27
+ if (options.only !== undefined)
28
+ return yield* AdoptionRefused.make({
29
+ message: `${qualifiedName(target)} is adopted for reading only and has no routing_key`,
30
+ });
31
+ continue;
32
+ }
33
+ results.push(yield* backfillTable(target, batch));
34
+ }
35
+ return results;
36
+ });
37
+ const backfillTable = Effect.fnUntraced(function* (target, batch) {
38
+ const sql = yield* SqlClient.SqlClient;
39
+ const name = qualifiedName(target);
40
+ const [adoption] = yield* sql `
41
+ SELECT mode, actor_type FROM actor_adoptions
42
+ WHERE table_schema = ${target.schema} AND table_name = ${target.table}`;
43
+ if (adoption === undefined)
44
+ return yield* AdoptionRefused.make({
45
+ message: `${name} is not observed; run durable adopt observe ${target.table} first`,
46
+ });
47
+ if (adoption.mode === "enforce")
48
+ return yield* AdoptionRefused.make({
49
+ message: `${name} is enforced, so every row already has a routing_key`,
50
+ });
51
+ const table = quotedTable(target);
52
+ const tenant = identifier(target.tenantColumn);
53
+ const actor = identifier(target.actorColumn);
54
+ const keys = target.primaryKey.map(identifier);
55
+ const owned = `${tenant} IS NOT NULL AND ${actor} IS NOT NULL AND ${tenant}::text <> '' AND ${actor}::text <> ''`;
56
+ const unowned = yield* sql.unsafe(`SELECT ${keys.map((key, index) => `${key}::text AS k${index}`).join(", ")}
57
+ FROM ${table} WHERE NOT (${owned}) ORDER BY ${keys.join(", ")} LIMIT ${UNOWNED_SAMPLE}`);
58
+ if (unowned.length > 0)
59
+ return yield* AdoptionRefused.make({
60
+ message: `${name} has rows whose ${target.tenantColumn} or ${target.actorColumn} is NULL or empty, so no actor owns them; fix them first. First rows by primary key (${target.primaryKey.join(", ")}): ${unowned
61
+ .map((row) => `(${Object.values(row).join(", ")})`)
62
+ .join(" ")}`,
63
+ });
64
+ const types = yield* sql `
65
+ SELECT a.attname AS name, format_type(a.atttypid, a.atttypmod) AS type
66
+ FROM pg_attribute a JOIN pg_class c ON c.oid = a.attrelid
67
+ JOIN pg_namespace n ON n.oid = c.relnamespace
68
+ WHERE n.nspname = ${target.schema} AND c.relname = ${target.table}
69
+ AND a.attname IN ${sql.in([...target.primaryKey, target.tenantColumn, target.actorColumn])}`;
70
+ const typeOf = (column) => types.find((type) => type.name === column).type;
71
+ const keyTypes = target.primaryKey.map(typeOf);
72
+ const tenantType = typeOf(target.tenantColumn);
73
+ const actorType = typeOf(target.actorColumn);
74
+ let filled = 0;
75
+ let passes = 0;
76
+ for (;;) {
77
+ passes += 1;
78
+ let cursor;
79
+ let passFilled = 0;
80
+ for (;;) {
81
+ const after = cursor === undefined
82
+ ? ""
83
+ : `AND (${keys.join(", ")}) > (${cursor.map((value, index) => `${literal(value)}::${keyTypes[index]}`).join(", ")})`;
84
+ const rows = yield* sql.unsafe(`SELECT ${tenant}::text AS tenant, ${actor}::text AS actor,
85
+ ${keys.map((key, index) => `${key}::text AS k${index}`).join(", ")}
86
+ FROM ${table} WHERE routing_key IS NULL AND ${owned} ${after}
87
+ ORDER BY ${keys.join(", ")} LIMIT ${batch}`);
88
+ if (rows.length === 0)
89
+ break;
90
+ const values = yield* Effect.forEach(rows, (row) => Effect.try({
91
+ try: () => routingKey({
92
+ ref: ActorRef.make({
93
+ tenant: row["tenant"],
94
+ actor: target.actor,
95
+ id: row["actor"],
96
+ }),
97
+ placement: target.placement,
98
+ }),
99
+ catch: (cause) => AdoptionRefused.make({
100
+ message: `${name} row ${target.primaryKey.map((_, index) => row[`k${index}`]).join(", ")}: ${cause instanceof Error ? cause.message : String(cause)}`,
101
+ }),
102
+ }));
103
+ const parameters = rows.flatMap((row, index) => [
104
+ row["tenant"],
105
+ row["actor"],
106
+ ...target.primaryKey.map((_, key) => row[`k${key}`]),
107
+ values[index].toString(),
108
+ ]);
109
+ const width = 3 + target.primaryKey.length;
110
+ const tuples = rows
111
+ .map((_, index) => {
112
+ const base = index * width;
113
+ const cast = [
114
+ `$${base + 1}::${tenantType}`,
115
+ `$${base + 2}::${actorType}`,
116
+ ...keyTypes.map((type, key) => `$${base + 3 + key}::${type}`),
117
+ `$${base + width}::bigint`,
118
+ ];
119
+ return `(${cast.join(", ")})`;
120
+ })
121
+ .join(", ");
122
+ const match = [
123
+ `t.${tenant} = v.tenant`,
124
+ `t.${actor} = v.actor`,
125
+ ...keys.map((key, index) => `t.${key} = v.k${index}`),
126
+ ].join(" AND ");
127
+ const updated = yield* Effect.gen(function* () {
128
+ yield* sql `SELECT set_config('durable.backfill', 'on', true)`;
129
+ return yield* sql.unsafe(`WITH changed AS (
130
+ UPDATE ${table} AS t SET routing_key = v.routing_key
131
+ FROM (VALUES ${tuples}) AS v (tenant, actor, ${keys.map((_, index) => `k${index}`).join(", ")}, routing_key)
132
+ WHERE ${match} AND t.routing_key IS NULL RETURNING 1)
133
+ SELECT count(*)::text AS n FROM changed`, parameters);
134
+ }).pipe(sql.withTransaction);
135
+ passFilled += Number(updated[0].n);
136
+ cursor = target.primaryKey.map((_, index) => rows[rows.length - 1][`k${index}`]);
137
+ }
138
+ filled += passFilled;
139
+ if (passFilled === 0)
140
+ return { table: name, filled, passes };
141
+ }
142
+ });
143
+ /** One line per table: how many rows were filled and how many passes it took. */
144
+ export const formatBackfill = (result) => `${result.table}: filled routing_key on ${result.filled} rows in ${result.passes} pass${result.passes === 1 ? "" : "es"}`;
@@ -0,0 +1,55 @@
1
+ import { Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { AdoptionRefused, type AdoptionTarget } from "./target.ts";
4
+ /** The default window a table must have been observed and quiet for before it is enforced. */
5
+ export declare const DEFAULT_QUIET_MS: number;
6
+ /** The grantees holding a write privilege on `target`, with the privilege, as the catalog records them. */
7
+ export declare const writeGrants: (target: Pick<AdoptionTarget, "schema" | "table">) => Effect.Effect<readonly {
8
+ grantee: string;
9
+ privilege: string;
10
+ }[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
11
+ /** The trigger arguments the guard is installed with, in the order `actor_adoption_guard()` reads them. */
12
+ export declare const guardArguments: ({ target, writerRole, allowedRoles, }: {
13
+ readonly target: Pick<AdoptionTarget, "tenantColumn" | "actorColumn" | "actor">;
14
+ readonly writerRole: string;
15
+ readonly allowedRoles: ReadonlyArray<string>;
16
+ }) => string[];
17
+ /** What `enforce` did for one table. */
18
+ export interface EnforceResult {
19
+ readonly table: string;
20
+ readonly writerRole: string;
21
+ readonly allowedRoles: ReadonlyArray<string>;
22
+ /** Privileges taken away, which `release` gives back. */
23
+ readonly revoked: number;
24
+ }
25
+ /**
26
+ * Enforces each named adopted table of `actors`, in one transaction under a
27
+ * `lock_timeout`. Nothing changes unless every check passes: the table has
28
+ * been observed for the whole quiet window, no legacy write outside `allow`
29
+ * roles fell inside it, no login wrote both in and out of turns, every row
30
+ * has its `routing_key` and owner columns, the owner is a role no login can
31
+ * act as, no other login can take the writer role, and no cascade reaches the
32
+ * table. It then revokes write privileges from every role but the writer and
33
+ * the allowed ones, adds the constraint that keeps `routing_key` and the
34
+ * mapped columns filled, and installs the guard triggers, always enabled.
35
+ */
36
+ export declare const enforceAdoption: (actors: readonly WeakKey[], options: {
37
+ readonly only: string;
38
+ readonly writerRole: string;
39
+ readonly allowedRoles?: ReadonlyArray<string> | undefined;
40
+ readonly quietMs?: number | undefined;
41
+ readonly lockTimeoutMs?: number | undefined;
42
+ readonly nowMs: number;
43
+ }) => Effect.Effect<EnforceResult[], AdoptionRefused | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
44
+ /**
45
+ * Returns `only` from enforced to observed: drops the guard and the
46
+ * constraint that legacy writers, which supply no `routing_key`, would
47
+ * violate, gives back the privileges `enforce` recorded, and reinstalls the
48
+ * plain observing triggers. It never removes `routing_key` or the record.
49
+ */
50
+ export declare const releaseAdoption: (actors: readonly WeakKey[], options: {
51
+ readonly only: string;
52
+ readonly lockTimeoutMs?: number | undefined;
53
+ }) => Effect.Effect<string[], AdoptionRefused | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
54
+ /** One line per enforced table. */
55
+ export declare const formatEnforce: (result: EnforceResult) => string;