@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,337 @@
1
+ import { Context, Crypto, Data, DateTime, Deferred, Duration, Effect, FileSystem, Layer, Redacted, Schema, Option, Predicate, Stream, } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { CurrentCaller, Tenant, System, principal, } from "../identity/caller.js";
4
+ import { descriptorOf } from "../actor/descriptor.js";
5
+ import { OpenRejected } from "../runtime/connections/holder.js";
6
+ import { ClientMessage } from "../runtime/connections/protocol.js";
7
+ import { WatchTap } from "../runtime/connections/watch.js";
8
+ import {} from "../handles/actors.js";
9
+ import { InternalActors } from "../runtime/actors.js";
10
+ import {} from "../runtime/request.js";
11
+ import { SeedJson } from "../runtime/operators/seed.js";
12
+ import { Database, layer as runtimeLayer } from "../runtime/layer.js";
13
+ import { LocalRequestSerialization } from "../runtime/runner.js";
14
+ import { compress, decompress, routingKey } from "../runtime/storage/codec.js";
15
+ import { recordedPlacement } from "../runtime/storage/placements.js";
16
+ import { VERSION_KEY } from "../state/migration.js";
17
+ import { CleanupHooks, RetryTurn, TurnHooks } from "../runtime/turn/hooks.js";
18
+ import { ProgressTap } from "../runtime/jobs/progress.js";
19
+ import { databaseTime, FrameworkClock } from "../runtime/turn/admission.js";
20
+ import { ActorCluster, clusterLayer } from "./cluster.js";
21
+ import { simulate } from "./simulate.js";
22
+ import { simulateCluster, } from "./simulate-cluster.js";
23
+ /**
24
+ * Present while `ActorTest.cluster` builds one of its runners: the runner
25
+ * shares the cluster's tenant and opens its database connections through
26
+ * `connect`, so killing it can cut them.
27
+ */
28
+ export class ClusterMember extends Context.Service()("@rikalabs/akter/testing/actor-test/ClusterMember") {
29
+ }
30
+ /** The grant key tests sign content grants with unless they configure their own. */
31
+ export const TEST_CONTENT_KEY = {
32
+ id: "test",
33
+ secret: Redacted.make("akter test content grant key, never for production"),
34
+ };
35
+ const decodeJson = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown));
36
+ const valueCodec = (schema) => Schema.fromJsonString(Schema.toCodecJson(Schema.Struct({ value: schema })));
37
+ const testActors = new WeakMap();
38
+ /** Package-internal escape hatch for deterministic runtime conformance cases. */
39
+ export const executeForTest = (request) => Effect.gen(function* () {
40
+ const test = yield* ActorTest;
41
+ const actors = testActors.get(test);
42
+ if (actors === undefined)
43
+ return yield* Effect.die(new Error("ActorTest runtime unavailable"));
44
+ return (yield* actors.execute(request)).outcome;
45
+ });
46
+ /**
47
+ * Runs one retention sweep in the current runtime now, as its background loop
48
+ * does every minute; for benchmarks and tests that use the production layer.
49
+ */
50
+ export const cleanup = Effect.gen(function* () {
51
+ return yield* (yield* InternalActors).cleanup;
52
+ });
53
+ /**
54
+ * Sweeps every tenant's unreferenced content now, however recently each was
55
+ * swept, and returns how many contents it deleted; for benchmarks and tests.
56
+ */
57
+ export const sweepContent = Effect.gen(function* () {
58
+ return yield* (yield* InternalActors).sweepContent;
59
+ });
60
+ export const ProgressRecord = Data.taggedEnum();
61
+ export class ActorTest extends Context.Service()("@rikalabs/akter/testing/actor-test/ActorTest") {
62
+ /**
63
+ * Runs `runners` runtimes in this process against one Postgres database,
64
+ * each a distinct Cluster runner with its own address, connection pool, and
65
+ * expiring shard locks. Provides `ActorCluster`; see its controls.
66
+ */
67
+ static cluster = (options) => clusterLayer(options);
68
+ /**
69
+ * Runs `program` on the current test runtime under a fault schedule drawn
70
+ * from `seed`, then checks exactly-once receipts and outbox delivery; a
71
+ * failure dies with the seed that reproduces it.
72
+ */
73
+ static simulate = (options, program) => Effect.gen(function* () {
74
+ return yield* simulate(yield* ActorTest)(options, program);
75
+ });
76
+ /**
77
+ * Runs `program` on the current `ActorTest.cluster` under a fault schedule
78
+ * drawn from `seed`, with runner kills, lost heartbeats, and primary
79
+ * failovers as well as crashes, then checks exactly-once receipts and
80
+ * outbox delivery; a failure dies with the seed that reproduces it.
81
+ */
82
+ static simulateCluster = (options, program) => Effect.gen(function* () {
83
+ return yield* simulateCluster(yield* ActorCluster)(options, program);
84
+ });
85
+ static layer = (options = {}) => Layer.unwrap(Effect.gen(function* () {
86
+ const crypto = yield* Crypto.Crypto;
87
+ const member = Option.getOrUndefined(yield* Effect.serviceOption(ClusterMember));
88
+ const tenant = member?.tenant ?? (yield* crypto.randomUUIDv4.pipe(Effect.orDie));
89
+ const faults = new Map();
90
+ const outer = yield* TurnHooks;
91
+ let clockOffset = 0;
92
+ const progress = [];
93
+ let dropProgress = () => false;
94
+ let dropCommitted = false;
95
+ const hooks = Layer.mergeAll(Layer.succeed(TurnHooks, {
96
+ at: (point, request) => Effect.suspend(() => {
97
+ const queue = faults.get(point) ?? [];
98
+ const index = queue.findIndex(({ commandId }) => commandId === undefined || commandId === request.commandId);
99
+ return index < 0 ? outer.at(point, request) : queue.splice(index, 1)[0].fault;
100
+ }),
101
+ }), Layer.succeed(FrameworkClock, { offsetMillis: () => clockOffset }), Layer.succeed(WatchTap, { dropsCommitted: () => dropCommitted }), Layer.succeed(ProgressTap, {
102
+ send: (message) => Effect.sync(() => {
103
+ const dropped = dropProgress(message);
104
+ progress.push(ProgressRecord.Progress({ ...message, dropped }));
105
+ return !dropped;
106
+ }),
107
+ closed: (message) => Effect.sync(() => {
108
+ const dropped = dropProgress(message);
109
+ progress.push(ProgressRecord.ProgressClosed({ ...message, dropped }));
110
+ return !dropped;
111
+ }),
112
+ }), Layer.succeed(CleanupHooks, {
113
+ batchSize: 1000,
114
+ afterBatch: Effect.void,
115
+ periodic: false,
116
+ }));
117
+ const addFault = (point, fault, options) => Effect.sync(() => {
118
+ const queue = faults.get(point) ?? [];
119
+ queue.push({ commandId: options?.commandId, fault });
120
+ faults.set(point, queue);
121
+ });
122
+ const test = Layer.effect(ActorTest, Effect.gen(function* () {
123
+ const sql = yield* SqlClient.SqlClient;
124
+ const storedRoutingKey = Effect.fnUntraced(function* (ref) {
125
+ const placement = yield* recordedPlacement(ref.actor).pipe(Effect.provideService(SqlClient.SqlClient, sql));
126
+ if (placement === undefined)
127
+ return yield* Effect.die(new Error(`Actor ${ref.actor} is not registered`));
128
+ return routingKey({ ref, placement });
129
+ });
130
+ const internalActors = yield* InternalActors;
131
+ const service = ActorTest.of({
132
+ tenant,
133
+ actor: Effect.fnUntraced(function* (definition, id = "singleton", actorOptions) {
134
+ const { as } = options;
135
+ const caller = as === undefined
136
+ ? System.make({ source: "actor" })
137
+ : Schema.is(System)(as)
138
+ ? as
139
+ : System.make({
140
+ source: "actor",
141
+ onBehalfOf: Option.getOrUndefined(principal(as)),
142
+ });
143
+ const internal = descriptorOf(definition)?.internal;
144
+ if (internal === undefined)
145
+ return yield* Effect.die(new Error("Unknown actor definition"));
146
+ const system = yield* internal
147
+ .handle(id, tenant, caller)
148
+ .pipe(Effect.provideService(InternalActors, internalActors));
149
+ if (actorOptions?.seed !== undefined) {
150
+ const fs = yield* FileSystem.FileSystem;
151
+ const seed = yield* fs
152
+ .readFileString(actorOptions.seed)
153
+ .pipe(Effect.flatMap(Schema.decodeEffect(SeedJson)), Effect.orDie);
154
+ yield* internalActors.seed({ ref: system.ref, caller, seed });
155
+ }
156
+ return { system, inspect: service.inspect(system.ref) };
157
+ }),
158
+ crashNext: (point, faultOptions) => addFault(point, Effect.die(RetryTurn.make({ message: `Injected ${point} crash` })), faultOptions),
159
+ clearFaults: Effect.sync(() => {
160
+ const left = Array.from(faults, ([point, queue]) => queue.map(() => point)).flat();
161
+ faults.clear();
162
+ return left;
163
+ }),
164
+ pauseNext: Effect.fnUntraced(function* (point, faultOptions) {
165
+ const reached = yield* Deferred.make();
166
+ const release = yield* Deferred.make();
167
+ yield* addFault(point, Deferred.succeed(reached, undefined).pipe(Effect.andThen(Deferred.await(release))), faultOptions);
168
+ return {
169
+ reached: Deferred.await(reached),
170
+ release: Deferred.succeed(release, undefined).pipe(Effect.asVoid),
171
+ };
172
+ }),
173
+ inspect: Effect.fnUntraced(function* (ref) {
174
+ const routing = yield* storedRoutingKey(ref);
175
+ const generations = yield* sql `SELECT generation::text AS generation FROM actor_generations
176
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor} AND actor_id = ${ref.id}`;
177
+ const state = (yield* sql `SELECT key, value FROM actor_state
178
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor} AND actor_id = ${ref.id}
179
+ AND key <> ${VERSION_KEY}`).map(({ key, value }) => ({
180
+ key,
181
+ value: decompress(value),
182
+ }));
183
+ const [counted] = yield* sql `SELECT
184
+ (SELECT count(*)::integer FROM actor_receipts
185
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor} AND actor_id = ${ref.id}) AS receipts,
186
+ (SELECT count(*)::integer FROM actor_events
187
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor} AND actor_id = ${ref.id}) AS events`;
188
+ const outbox = yield* sql `SELECT count(*) FILTER (WHERE kind = 'intent')::integer AS intents,
189
+ count(*) FILTER (WHERE kind = 'job')::integer AS jobs FROM actor_outbox
190
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor} AND actor_id = ${ref.id}`;
191
+ const tables = yield* sql `
192
+ SELECT table_schema, table_name, CASE WHEN table_schema = current_schema()
193
+ THEN table_name ELSE table_schema || '.' || table_name END AS label
194
+ FROM actor_tables WHERE actor_type = ${ref.actor} ORDER BY label`;
195
+ const rows = {};
196
+ for (const { table_schema, table_name, label } of tables)
197
+ rows[label] = (yield* sql `
198
+ SELECT count(*)::integer AS count FROM ${sql(table_schema)}.${sql(table_name)}
199
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_id = ${ref.id}`)[0].count;
200
+ const declared = internalActors.declaredBlobs(ref.actor);
201
+ const stored = yield* sql `
202
+ SELECT blob, count(DISTINCT name)::integer AS entries FROM actor_blobs
203
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant}
204
+ AND actor_type = ${ref.actor} AND actor_id = ${ref.id}
205
+ GROUP BY blob`;
206
+ const blobs = Object.fromEntries(declared.map((name) => [name, 0]));
207
+ for (const { blob, entries } of stored)
208
+ blobs[blob] = entries;
209
+ const inspection = {
210
+ generation: generations[0]?.generation,
211
+ state: Object.fromEntries(yield* Effect.forEach(state, Effect.fnUntraced(function* ({ key, value }) {
212
+ return [
213
+ key,
214
+ yield* Schema.decodeEffect(Schema.fromJsonString(Schema.Json))(value).pipe(Effect.orDie),
215
+ ];
216
+ }))),
217
+ receipts: counted.receipts,
218
+ events: counted.events,
219
+ outbox: outbox[0].intents,
220
+ jobs: outbox[0].jobs,
221
+ };
222
+ const withRows = tables.length > 0 ? { ...inspection, rows } : inspection;
223
+ return declared.length > 0 ? { ...withRows, blobs } : withRows;
224
+ }, Effect.orDie),
225
+ seed: Effect.fnUntraced(function* (ref, state, version) {
226
+ const key = yield* storedRoutingKey(ref);
227
+ yield* sql `INSERT INTO actor_generations (routing_key, tenant_id, actor_type, actor_id)
228
+ VALUES (${key}, ${ref.tenant}, ${ref.actor}, ${ref.id}) ON CONFLICT DO NOTHING`;
229
+ const rows = Object.entries(state).map(([name, value]) => [name, JSON.stringify(value)]);
230
+ if (version > 0)
231
+ rows.push([VERSION_KEY, String(version)]);
232
+ for (const [name, value] of rows)
233
+ yield* sql `INSERT INTO actor_state (routing_key, tenant_id, actor_type, actor_id, key, value)
234
+ VALUES (${key}, ${ref.tenant}, ${ref.actor}, ${ref.id}, ${name}, ${compress(value)})`;
235
+ }, Effect.orDie),
236
+ advance: Effect.fnUntraced(function* (duration) {
237
+ const millis = Duration.toMillis(duration);
238
+ if (!Number.isFinite(millis) || millis < 0)
239
+ return yield* Effect.die(new Error("advance needs a finite, non-negative duration"));
240
+ yield* internalActors.extendOutboxLeases(millis, Effect.sync(() => {
241
+ clockOffset += millis;
242
+ }));
243
+ yield* internalActors.drainOutbox;
244
+ }),
245
+ now: databaseTime.pipe(Effect.map((millis) => DateTime.makeUnsafe(millis)), Effect.provideService(SqlClient.SqlClient, sql), Effect.provideService(FrameworkClock, { offsetMillis: () => clockOffset }), Effect.orDie),
246
+ cleanup: internalActors.cleanup,
247
+ receiptsFor: Effect.fnUntraced(function* (ref, command) {
248
+ const routing = yield* storedRoutingKey(ref);
249
+ const rows = yield* sql `
250
+ SELECT count(*)::integer AS count FROM actor_receipts
251
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor}
252
+ AND actor_id = ${ref.id} AND command = ${command}`;
253
+ return rows[0].count;
254
+ }, Effect.orDie),
255
+ connect: Effect.fnUntraced(function* (ref, member, params) {
256
+ const server = valueCodec(member.server);
257
+ const decodeServer = Schema.decodeEffect(server);
258
+ const encodeClient = Schema.encodeEffect(valueCodec(member.client));
259
+ const decodeError = Schema.decodeEffect(Schema.fromJsonString(Schema.toCodecJson(member.error)));
260
+ const encoded = yield* Schema.encodeEffect(valueCodec(member.payload))({
261
+ value: params,
262
+ }).pipe(Effect.orDie);
263
+ const held = yield* internalActors.holder
264
+ .open({
265
+ ref,
266
+ member: member.tag,
267
+ caller: yield* CurrentCaller,
268
+ params: encoded,
269
+ })
270
+ .pipe(Effect.catchTag("OpenRejected", (rejected) => Effect.flatMap(decodeError(rejected.value).pipe(Effect.orDie), (error) => Effect.fail(error))));
271
+ const messages = held.messages.pipe(Stream.mapEffect((message) => ClientMessage.guards.Frame(message)
272
+ ? Effect.map(decodeServer(message.frame).pipe(Effect.orDie), ({ value }) => ({
273
+ ...message,
274
+ frame: value,
275
+ }))
276
+ : ClientMessage.guards.Progress(message)
277
+ ? Effect.map(decodeJson(message.frame).pipe(Effect.orDie), (frame) => ({
278
+ ...message,
279
+ frame,
280
+ }))
281
+ : Effect.succeed(message)));
282
+ const connection = {
283
+ connectionId: held.connectionId,
284
+ cursor: held.cursor,
285
+ send: (frame) => Effect.flatMap(encodeClient({ value: frame }).pipe(Effect.orDie), held.send),
286
+ frames: messages.pipe(Stream.filter((message) => Predicate.isTagged(message, "Frame")), Stream.map((message) => message.frame)),
287
+ messages,
288
+ resyncDone: held.resyncDone,
289
+ close: held.close,
290
+ };
291
+ return connection;
292
+ }),
293
+ hibernate: internalActors.hibernate,
294
+ invalidate: Effect.fnUntraced(function* (ref) {
295
+ const routing = yield* storedRoutingKey(ref);
296
+ yield* sql `UPDATE actor_generations SET generation = generation + 1
297
+ WHERE routing_key = ${routing} AND tenant_id = ${ref.tenant} AND actor_type = ${ref.actor} AND actor_id = ${ref.id}`;
298
+ }, Effect.orDie),
299
+ progress: Effect.sync(() => [...progress]),
300
+ resendProgress: internalActors.deliverProgress,
301
+ dropProgress: (predicate) => Effect.sync(() => {
302
+ dropProgress = predicate;
303
+ }),
304
+ dropCommitted: (dropping) => Effect.sync(() => {
305
+ dropCommitted = dropping;
306
+ }),
307
+ });
308
+ testActors.set(service, internalActors);
309
+ return service;
310
+ }));
311
+ const runtime = runtimeLayer({
312
+ authorize: options.authorize,
313
+ retryWindowMs: options.retryWindowMs,
314
+ maxResidentActors: options.maxResidentActors,
315
+ admission: options.admission,
316
+ relay: options.relay,
317
+ executors: options.executors,
318
+ observability: options.observability,
319
+ rowLevelSecurity: options.rowLevelSecurity,
320
+ adoption: options.adoption,
321
+ payloadWriterWindow: options.payloadWriterWindow,
322
+ content: options.content ?? { keys: [TEST_CONTENT_KEY] },
323
+ fleet: options.fleet,
324
+ });
325
+ return Layer.mergeAll(runtime, test.pipe(Layer.provide(runtime)), Layer.succeed(CurrentCaller, options.as ?? System.make({ source: "process" })), Layer.succeed(Tenant, tenant), Layer.succeed(FrameworkClock, { offsetMillis: () => clockOffset })).pipe(Layer.provide(hooks), Layer.provide(Layer.succeed(LocalRequestSerialization, true)), Layer.provideMerge(options.database !== undefined && Redacted.isRedacted(options.database)
326
+ ? Database.postgres({
327
+ url: options.database,
328
+ maxConnections: options.maxConnections ?? 10,
329
+ offTurnConnections: options.maxConnections,
330
+ stream: member?.connect,
331
+ replica: options.replica === undefined
332
+ ? undefined
333
+ : { url: options.replica, maxConnections: 4 },
334
+ })
335
+ : Database.pglite(options.database)));
336
+ }));
337
+ }
@@ -0,0 +1,93 @@
1
+ import { Context, Crypto, Duration, Effect, Layer, Scope } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { InternalActors } from "../runtime/actors.ts";
4
+ import type { ActorRef } from "../identity/caller.ts";
5
+ import { ActorTest, type TestOptions } from "./actor-test.ts";
6
+ /** Services each runner provides to effects run with `cluster.on(runner)`. */
7
+ export type RunnerServices = Layer.Success<ReturnType<typeof ActorTest.layer>>;
8
+ export interface ClusterOptions<ROut, E, RIn> extends TestOptions {
9
+ /** Number of runners, at least 1. */
10
+ readonly runners: number;
11
+ /** How long a runner's shard locks outlive its last heartbeat. Whole seconds; Cluster rounds up. */
12
+ readonly shardLockExpiration: Duration.Input;
13
+ /** Application layers (`X.toLayer`, `X.toQueryLayer`, ...) that every runner builds. */
14
+ readonly actors: Layer.Layer<ROut, E, RIn>;
15
+ /** Layers only some runners build, such as an effect layer one runner lacks. */
16
+ readonly runnerActors?: (runner: number) => Layer.Layer<never, never, RunnerServices>;
17
+ /**
18
+ * Runners that hold connections but are never assigned actor shards, so an
19
+ * actor is always owned by another runner and killing its owner leaves the
20
+ * holder alive.
21
+ */
22
+ readonly holdersOnly?: ReadonlyArray<number>;
23
+ }
24
+ declare const ActorCluster_base: Context.ServiceClass<ActorCluster, "@rikalabs/akter/testing/cluster/ActorCluster", {
25
+ readonly runners: number;
26
+ /** The tenant every runner of this cluster runs its actors under. */
27
+ readonly tenant: string;
28
+ /**
29
+ * A connection pool of the cluster's own to the shared database, for
30
+ * inspection: `kill` never cuts it.
31
+ */
32
+ readonly sql: SqlClient.SqlClient;
33
+ /**
34
+ * Runs `effect` on `runner`: its handles dispatch through that runner, and
35
+ * its `ActorTest` fault points and inspection belong to that runner. An
36
+ * effect already running when its runner is killed is not interrupted; its
37
+ * calls fail or time out, so call through a surviving runner.
38
+ */
39
+ readonly on: (runner: number) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, RunnerServices>>;
40
+ /**
41
+ * Stops `runner` the way a crash does: its connections close, rolling back
42
+ * open turns, and its shard locks and heartbeat are left to expire.
43
+ */
44
+ readonly kill: (runner: number) => Effect.Effect<void>;
45
+ /**
46
+ * Stops `runner` the way a graceful process exit does: its layer closes,
47
+ * so its activations end and it releases its shard locks for the others
48
+ * to take at once. Drain it first to finish or interrupt its work.
49
+ */
50
+ readonly shutdown: (runner: number) => Effect.Effect<void>;
51
+ /**
52
+ * Delays every database reply to every runner, without dropping it, as a
53
+ * partition between the database and its clients would: statements a turn
54
+ * sends still run, but it hears nothing back until `failover`. A COMMIT
55
+ * sent meanwhile is made by the database and unknown to its runner.
56
+ */
57
+ readonly holdReplies: Effect.Effect<void>;
58
+ /**
59
+ * Cuts every runner's open database connections at once, discarding held
60
+ * replies, and lets the runners reconnect to the same database, as they
61
+ * do when a primary fails over to a promoted standby at the same address:
62
+ * open turns lose their connection, and shard locks, which are table
63
+ * rows, survive.
64
+ */
65
+ readonly failover: Effect.Effect<void>;
66
+ /** Starts a stopped runner again as a new process, under a new address. */
67
+ readonly restart: (runner: number) => Effect.Effect<void>;
68
+ /**
69
+ * Stops `runner` writing heartbeats and lock refreshes while it keeps
70
+ * serving the shards it holds: other runners take its shards once its
71
+ * locks expire, and only the database fence stands between the two.
72
+ */
73
+ readonly pauseHeartbeat: (runner: number) => Effect.Effect<{
74
+ readonly resume: Effect.Effect<void>;
75
+ }>;
76
+ /**
77
+ * The runner holding an unexpired lock on the shard that places `ref`.
78
+ * While a runner's heartbeat is paused, it may still serve the actor too.
79
+ */
80
+ readonly owner: (ref: ActorRef) => Effect.Effect<number | undefined>;
81
+ /** Waits until every running runner holds exactly the shards assigned to it. */
82
+ readonly ready: Effect.Effect<void>;
83
+ }>;
84
+ export declare class ActorCluster extends ActorCluster_base {
85
+ }
86
+ /**
87
+ * Provides an `ActorCluster` of `options.runners` real runners sharing one Postgres database, each serving runner RPCs on its own listener.
88
+ * The first runner migrates the database and the rest start together. Runner rows carry the cluster's tenant, so rows another cluster left in the same database are never mistaken for this one's.
89
+ * `kill` cuts a runner's database and runner connections at once so Postgres rolls back its open turns; a graceful exit closes its layer first so it releases its locks.
90
+ * Fails to build when `database` is missing or is not a Postgres URL, since PGlite has a single connection.
91
+ */
92
+ export declare const clusterLayer: <ROut, E, RIn>(options: ClusterOptions<ROut, E, RIn>) => Layer.Layer<ActorCluster, never, Crypto.Crypto | Exclude<Exclude<RIn, ActorTest | import("../index.ts").Actors | import("../index.ts").ContentStore | import("../runtime/index.ts").DefectLog | InternalActors | import("../runtime/operators/repair.ts").OperatorRuntime | import("@effect/sql-pglite/PgliteClient").PgliteClient | import("../runtime/drain.ts").RuntimeControl | SqlClient.SqlClient | import("../runtime/index.ts").TelemetrySampler>, Scope.Scope>>;
93
+ export {};