@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,284 @@
1
+ import { DateTime, Deferred, Effect, Fiber } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { ActorTest } from "../../actor-test.js";
4
+ import { Keeper, Shipper, Watch } from "./actors.js";
5
+ import { eventually, reset, suspendedRow } from "./harness.js";
6
+ /** Owner-event waits, clocks, and retention pins of workflows. */
7
+ export const workflowWaitConformance = [
8
+ {
9
+ name: "workflows: resolves an event committed between start and registration",
10
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
11
+ yield* reset(fixture);
12
+ const gate = yield* Deferred.make();
13
+ fixture.gates.set("w2-between", gate);
14
+ const shipper = yield* Shipper.get("w2-between");
15
+ const run = yield* shipper.Watch({ mode: "gated", orderId: "w2-between" });
16
+ yield* eventually(Effect.sync(() => fixture.runs.get("hold:w2-between") === 1), "the activity before the wait");
17
+ yield* shipper.Pay({ orderId: "w2-between", amount: 4 });
18
+ yield* Deferred.succeed(gate, undefined);
19
+ expect(yield* run.result).toBe("paid-4");
20
+ }).pipe(Effect.ensuring(Effect.sync(() => fixture.gates.delete("w2-between"))))),
21
+ },
22
+ {
23
+ name: "workflows: resolves an event committed while the run is suspending",
24
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
25
+ yield* reset(fixture);
26
+ const test = yield* ActorTest;
27
+ const shipper = yield* Shipper.get("w2-suspending");
28
+ const pause = yield* test.pauseNext("beforeWorkflowSuspend");
29
+ const run = yield* shipper.Watch({ mode: "plain", orderId: "w2-suspending" });
30
+ yield* pause.reached;
31
+ yield* shipper.Pay({ orderId: "w2-suspending", amount: 5 });
32
+ yield* pause.release;
33
+ expect(yield* run.result).toBe("paid-5");
34
+ })),
35
+ },
36
+ {
37
+ name: "workflows: resolves an event delivered while the run is live",
38
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
39
+ yield* reset(fixture);
40
+ const sql = yield* SqlClient.SqlClient;
41
+ const gate = yield* Deferred.make();
42
+ fixture.gates.set("w2-live", gate);
43
+ const shipper = yield* Shipper.get("w2-live");
44
+ const run = yield* shipper.Watch({ mode: "race", orderId: "w2-live" });
45
+ yield* eventually(Effect.gen(function* () {
46
+ const rows = yield* sql `SELECT step FROM actor_workflow_step
47
+ WHERE execution_id = ${run.executionId} AND step = 'first'`;
48
+ return rows.length === 1 && fixture.runs.get("slow:w2-live") === 1;
49
+ }).pipe(Effect.orDie), "the wait to park beside the running activity");
50
+ yield* shipper.Pay({ orderId: "w2-live", amount: 6 });
51
+ const result = yield* run.result.pipe(Effect.timeoutOrElse({
52
+ duration: "15 seconds",
53
+ orElse: () => Effect.die(new Error("The live run was not preempted for its event")),
54
+ }));
55
+ expect(result).toBe("paid-6");
56
+ }).pipe(Effect.ensuring(Effect.gen(function* () {
57
+ const gate = fixture.gates.get("w2-live");
58
+ if (gate !== undefined)
59
+ yield* Deferred.succeed(gate, undefined);
60
+ fixture.gates.delete("w2-live");
61
+ })))),
62
+ },
63
+ {
64
+ name: "workflows: a parked wait resolves by the event its sibling activity emits as that sibling finishes",
65
+ timeoutMs: 120_000,
66
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
67
+ yield* reset(fixture);
68
+ const sql = yield* SqlClient.SqlClient;
69
+ const gate = yield* Deferred.make();
70
+ fixture.gates.set("sibling-gated", gate);
71
+ const ids = ["sibling-gated", "sibling-0", "sibling-1", "sibling-2", "sibling-3"];
72
+ const runs = yield* Effect.forEach(ids, (id) => Shipper.get(id).pipe(Effect.flatMap((shipper) => shipper.Watch({ mode: "sibling", orderId: id }))));
73
+ yield* eventually(Effect.gen(function* () {
74
+ const rows = yield* sql `SELECT step FROM actor_workflow_step
75
+ WHERE execution_id = ${runs[0].executionId} AND step = 'first' AND exit IS NULL`;
76
+ return rows.length === 1 && fixture.runs.get("emit:sibling-gated") === 1;
77
+ }).pipe(Effect.orDie), "the wait to park beside the gated sibling");
78
+ yield* Deferred.succeed(gate, undefined);
79
+ const results = yield* Effect.forEach(runs, (run) => run.result, {
80
+ concurrency: "unbounded",
81
+ }).pipe(Effect.timeoutOrElse({
82
+ duration: "60 seconds",
83
+ orElse: () => Effect.die(new Error("A run never resumed for its sibling's event")),
84
+ }));
85
+ expect(results).toEqual(ids.map(() => "paid-8|emitted"));
86
+ for (const [index, id] of ids.entries()) {
87
+ const [events] = yield* sql `SELECT count(*)::int AS count
88
+ FROM actor_events WHERE actor_type = 'Shipper' AND actor_id = ${id} AND event = 'Paid'`;
89
+ const [leftover] = yield* sql `SELECT
90
+ (SELECT count(*)::int FROM actor_workflow_step
91
+ WHERE execution_id = ${runs[index].executionId}) AS steps,
92
+ (SELECT count(*)::int FROM actor_outbox
93
+ WHERE timer_key = ${`wf:${runs[index].executionId}`}) AS timers`;
94
+ expect({ id, events: events.count, ...leftover }).toEqual({
95
+ id,
96
+ events: 1,
97
+ steps: 0,
98
+ timers: 0,
99
+ });
100
+ }
101
+ }).pipe(Effect.ensuring(Effect.sync(() => {
102
+ fixture.gates.delete("sibling-gated");
103
+ })))),
104
+ },
105
+ {
106
+ name: "workflows: a workflow command that kicks a running execution commits and answers while the owner call its activity makes waits behind it",
107
+ requiresIndependentConnections: true,
108
+ timeoutMs: 120_000,
109
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
110
+ yield* reset(fixture);
111
+ const sql = yield* SqlClient.SqlClient;
112
+ const test = yield* ActorTest;
113
+ const id = "kick-behind";
114
+ const gate = yield* Deferred.make();
115
+ fixture.gates.set(id, gate);
116
+ const shipper = yield* Shipper.get(id);
117
+ const run = yield* shipper.Watch({ mode: "sibling", orderId: id });
118
+ yield* eventually(Effect.sync(() => fixture.runs.get(`emit:${id}`) === 1), "the sibling activity to start");
119
+ const committing = yield* test.pauseNext("beforeCommit");
120
+ const reattach = yield* shipper
121
+ .Watch({ mode: "sibling", orderId: id })
122
+ .pipe(Effect.forkChild({ startImmediately: true }));
123
+ yield* committing.reached;
124
+ const arriving = yield* test.pauseNext("queued");
125
+ yield* Deferred.succeed(gate, undefined);
126
+ yield* arriving.reached;
127
+ yield* arriving.release;
128
+ yield* Effect.sleep("500 millis");
129
+ yield* committing.release;
130
+ const reattached = yield* Fiber.join(reattach).pipe(Effect.timeoutOrElse({
131
+ duration: "10 seconds",
132
+ orElse: () => Effect.die(new Error("The kicking turn never answered behind the owner call")),
133
+ }));
134
+ expect(reattached.executionId).toBe(run.executionId);
135
+ expect(yield* run.result).toBe("paid-8|emitted");
136
+ expect(fixture.runs.get(`emit:${id}`)).toBe(1);
137
+ expect(yield* test.receiptsFor(shipper.ref, "Pay")).toBe(1);
138
+ const [leftover] = yield* sql `SELECT
139
+ (SELECT count(*)::int FROM actor_workflow_step
140
+ WHERE execution_id = ${run.executionId}) AS steps,
141
+ (SELECT count(*)::int FROM actor_outbox
142
+ WHERE timer_key = ${`wf:${run.executionId}`}) AS timers`;
143
+ expect(leftover).toEqual({ steps: 0, timers: 0 });
144
+ }).pipe(Effect.ensuring(Effect.sync(() => {
145
+ fixture.gates.delete("kick-behind");
146
+ })))),
147
+ },
148
+ {
149
+ name: "workflows: resolves two sequential waits with two events",
150
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
151
+ yield* reset(fixture);
152
+ const shipper = yield* Shipper.get("w2-two");
153
+ const run = yield* shipper.Watch({ mode: "two", orderId: "w2-two" });
154
+ yield* shipper.Pay({ orderId: "w2-two", amount: 1 });
155
+ yield* shipper.Pay({ orderId: "w2-two", amount: 2 });
156
+ expect(yield* run.result).toBe("paid-1|paid-2");
157
+ })),
158
+ },
159
+ {
160
+ name: "workflows: resolves concurrent waits for one tag",
161
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
162
+ yield* reset(fixture);
163
+ const shipper = yield* Shipper.get("w2-concurrent");
164
+ const runs = yield* Effect.forEach(["c1", "c2", "c3"], (orderId) => shipper.Watch({ mode: "any", orderId }));
165
+ yield* Effect.forEach(runs, (run) => suspendedRow(run.executionId));
166
+ yield* shipper.Pay({ orderId: "anyone", amount: 9 });
167
+ expect(yield* Effect.forEach(runs, (run) => run.result, { concurrency: 3 })).toEqual([
168
+ "paid-9",
169
+ "paid-9",
170
+ "paid-9",
171
+ ]);
172
+ })),
173
+ },
174
+ {
175
+ name: "workflows: settles a wait exactly once when its event and timeout race",
176
+ timeoutMs: 120_000,
177
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
178
+ yield* reset(fixture);
179
+ const sql = yield* SqlClient.SqlClient;
180
+ const test = yield* ActorTest;
181
+ for (let round = 0; round < 6; round++) {
182
+ const orderId = `w2-timeout-${round}`;
183
+ const shipper = yield* Shipper.get(orderId);
184
+ const run = yield* shipper.Watch({ mode: "plain", orderId });
185
+ yield* suspendedRow(run.executionId);
186
+ const [wait] = yield* sql `SELECT due_at_ms::text AS due
187
+ FROM actor_workflow_step WHERE execution_id = ${run.executionId} AND step = 'first'`;
188
+ if (round === 0) {
189
+ yield* test.advance("59 seconds");
190
+ yield* shipper.Pay({ orderId, amount: round });
191
+ yield* test.advance("2 seconds");
192
+ }
193
+ else
194
+ yield* Effect.all([shipper.Pay({ orderId, amount: round }), test.advance("61 seconds")], {
195
+ concurrency: 2,
196
+ });
197
+ const result = yield* run.result;
198
+ const [event] = yield* sql `SELECT emitted_at_ms::text AS at
199
+ FROM actor_events WHERE actor_type = 'Shipper' AND actor_id = ${orderId}
200
+ AND tenant_id = ${shipper.ref.tenant}`;
201
+ if (Number(event.at) <= Number(wait.due))
202
+ expect(result).toBe(`paid-${round}`);
203
+ else
204
+ expect([`paid-${round}`, "unpaid"]).toContain(result);
205
+ expect(yield* (yield* Shipper.run(Watch, run.executionId)).result).toBe(result);
206
+ }
207
+ })),
208
+ },
209
+ {
210
+ name: "workflows: resumes two concurrent clocks at their own due times",
211
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
212
+ yield* reset(fixture);
213
+ const test = yield* ActorTest;
214
+ const shipper = yield* Shipper.get("clocks");
215
+ const run = yield* shipper.Watch({ mode: "clocks", orderId: "clocks" });
216
+ yield* suspendedRow(run.executionId);
217
+ const marks = () => ["mark-a", "mark-b"].map((label) => fixture.runs.get(`${label}:clocks`) ?? 0);
218
+ expect(marks()).toEqual([0, 0]);
219
+ yield* test.advance("6 seconds");
220
+ yield* eventually(Effect.sync(() => marks()[0] === 1), "the 5-second clock to resume");
221
+ yield* suspendedRow(run.executionId);
222
+ expect(marks()).toEqual([1, 0]);
223
+ yield* test.advance("5 seconds");
224
+ expect(yield* run.result).toBe("clocks");
225
+ expect(marks()).toEqual([1, 1]);
226
+ })),
227
+ },
228
+ {
229
+ name: "workflows: keeps a clock's due time across replays",
230
+ run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
231
+ yield* reset(fixture);
232
+ const sql = yield* SqlClient.SqlClient;
233
+ const test = yield* ActorTest;
234
+ const shipper = yield* Shipper.get("long");
235
+ const run = yield* shipper.Watch({ mode: "long", orderId: "long" });
236
+ yield* suspendedRow(run.executionId);
237
+ const due = () => sql `SELECT due_at_ms::text AS due FROM actor_workflow_step
238
+ WHERE execution_id = ${run.executionId} AND step = 'long'`.pipe(Effect.map((rows) => rows[0]?.due));
239
+ const recorded = yield* due();
240
+ yield* test.advance("5 seconds");
241
+ yield* test.invalidate(shipper.ref);
242
+ const now = DateTime.toEpochMillis(yield* test.now);
243
+ yield* sql `UPDATE actor_outbox SET due_at_ms = ${now}
244
+ WHERE timer_key = ${`wf:${run.executionId}`}`;
245
+ yield* test.advance("1 second");
246
+ yield* eventually(test
247
+ .receiptsFor(shipper.ref, "$workflow/resume")
248
+ .pipe(Effect.map((count) => count > 0)), "the replay");
249
+ yield* suspendedRow(run.executionId);
250
+ expect(yield* due()).toBe(recorded);
251
+ yield* test.advance("2 seconds");
252
+ expect(fixture.runs.get("slept:long") ?? 0).toBe(0);
253
+ yield* test.advance("3 seconds");
254
+ expect(yield* run.result).toBe("slept");
255
+ expect(fixture.runs.get("slept:long")).toBe(1);
256
+ })),
257
+ },
258
+ {
259
+ name: "workflows: keeps events above an open cursor or pending wait from pruning",
260
+ run: ({ expect, environment }) => environment.run(Effect.gen(function* () {
261
+ const sql = yield* SqlClient.SqlClient;
262
+ const test = yield* ActorTest;
263
+ const keeper = yield* Keeper.get("pinned");
264
+ const sequences = () => sql `SELECT sequence::text AS sequence FROM actor_events
265
+ WHERE tenant_id = ${keeper.ref.tenant} AND actor_type = 'Keeper' AND actor_id = 'pinned'
266
+ ORDER BY sequence`.pipe(Effect.map((rows) => rows.map((row) => Number(row.sequence))));
267
+ for (const amount of [1, 2, 3])
268
+ yield* keeper.Emit({ orderId: "noise", amount });
269
+ const run = yield* keeper.Held({});
270
+ yield* suspendedRow(run.executionId);
271
+ for (const amount of [4, 5])
272
+ yield* keeper.Emit({ orderId: "noise", amount });
273
+ yield* Effect.sleep("200 millis");
274
+ yield* test.advance("2 hours");
275
+ yield* test.cleanup;
276
+ expect(yield* sequences()).toEqual([4, 5]);
277
+ yield* keeper.Emit({ orderId: "k", amount: 6 });
278
+ expect(yield* run.result).toBe("paid-6");
279
+ yield* test.advance("2 hours");
280
+ yield* test.cleanup;
281
+ expect(yield* sequences()).toEqual([]);
282
+ })),
283
+ },
284
+ ];
@@ -0,0 +1,4 @@
1
+ import type { ConformanceCase } from "../conformance.ts";
2
+ import type { WorkflowsFixture } from "./workflows/actors.ts";
3
+ /** Workflow cases: stable execution ids, once-recorded activities, interrupts, and recovery. */
4
+ export declare const workflowsConformance: ReadonlyArray<ConformanceCase<WorkflowsFixture>>;
@@ -0,0 +1,19 @@
1
+ import { workflowAccessConformance } from "./workflows/access.js";
2
+ import { workflowBasicConformance } from "./workflows/basics.js";
3
+ import { engineConformance } from "./workflows/engine.js";
4
+ import { workflowGuardConformance } from "./workflows/guards.js";
5
+ import { workflowRecoveryConformance } from "./workflows/recovery.js";
6
+ import { workflowStartConformance } from "./workflows/starts.js";
7
+ import { workflowSuspensionConformance } from "./workflows/suspension.js";
8
+ import { workflowWaitConformance } from "./workflows/waits.js";
9
+ /** Workflow cases: stable execution ids, once-recorded activities, interrupts, and recovery. */
10
+ export const workflowsConformance = [
11
+ ...engineConformance,
12
+ ...workflowBasicConformance,
13
+ ...workflowSuspensionConformance,
14
+ ...workflowRecoveryConformance,
15
+ ...workflowStartConformance,
16
+ ...workflowAccessConformance,
17
+ ...workflowGuardConformance,
18
+ ...workflowWaitConformance,
19
+ ];
@@ -0,0 +1,330 @@
1
+ import { Effect, Layer, Logger, ManagedRuntime, type Crypto, type Scope } from "effect";
2
+ import type { Redacted } from "effect";
3
+ import type { HttpServer } from "effect/http";
4
+ import { type SqlClient, Statement } from "effect/sql";
5
+ import type { Actors } from "../index.ts";
6
+ import type { InternalActors } from "../runtime/actors.ts";
7
+ import type { RuntimeControl } from "../runtime/drain.ts";
8
+ import type { OperatorRuntime } from "../runtime/operators/repair.ts";
9
+ import type { Request } from "../runtime/request.ts";
10
+ import { type ContentPoint, type TurnPoint } from "../runtime/turn/hooks.ts";
11
+ import type { ContentStore } from "../handles/content.ts";
12
+ import type { Options } from "../runtime/layer.ts";
13
+ import { ActorTest } from "./actor-test.ts";
14
+ import type { ConformanceEdge } from "./conformance/assertions.ts";
15
+ /**
16
+ * Assertions injected by the test framework running the suite, e.g. Vitest's
17
+ * `expect`. The framework itself is never imported here.
18
+ */
19
+ export interface ConformanceMatchers {
20
+ readonly not: ConformanceMatchers;
21
+ readonly toBe: <T>(expected: T) => void;
22
+ readonly toEqual: <T>(expected: T) => void;
23
+ readonly toContain: <T>(expected: T) => void;
24
+ readonly toMatchObject: <T extends object | ReadonlyArray<unknown>>(expected: T) => void;
25
+ readonly toBeInstanceOf: <T>(expected: T) => void;
26
+ }
27
+ export type ConformanceExpect = <T>(actual: T) => ConformanceMatchers;
28
+ /**
29
+ * The subset of `describe`/`it`/lifecycle a registrar must supply. Vitest's
30
+ * exported functions satisfy this shape.
31
+ */
32
+ export interface ConformanceRegistrar {
33
+ readonly describe: (name: string, body: () => void) => void;
34
+ /**
35
+ * Registers one case. A runner that aborts `signal` when the case times
36
+ * out or is cancelled, as Vitest does, interrupts the case's effects so
37
+ * their finalizers run before the next case starts.
38
+ */
39
+ readonly it: (name: string, body: (context: {
40
+ readonly signal?: AbortSignal | undefined;
41
+ }) => Promise<void>, timeout?: number) => void;
42
+ readonly beforeAll: (body: () => Promise<void> | void, timeout?: number) => void;
43
+ readonly afterAll: (body: () => Promise<void> | void) => void;
44
+ readonly expect: ConformanceExpect;
45
+ /** Registers an inapplicable case by name so it is reported, never silently dropped. */
46
+ readonly skip: (name: string) => void;
47
+ }
48
+ export type ConformanceDatabase = NonNullable<NonNullable<Parameters<typeof ActorTest.layer>[0]>["database"]>;
49
+ export interface ConformanceConnection {
50
+ readonly query: (statement: string, parameters?: ReadonlyArray<unknown>) => Effect.Effect<ReadonlyArray<unknown>>;
51
+ }
52
+ /** Services every `environment.run` effect may require; Scope is provided. */
53
+ export type ConformanceServices = Actors | InternalActors | RuntimeControl | ActorTest | SqlClient.SqlClient | Crypto.Crypto | ContentStore | OperatorRuntime;
54
+ export type ConformanceRuntime = ManagedRuntime.ManagedRuntime<ConformanceServices, never>;
55
+ export interface ConformanceEnvironment {
56
+ /** Runs an effect against the current runtime. */
57
+ readonly run: <A, E>(effect: Effect.Effect<A, E, ConformanceServices | Scope.Scope>) => Promise<A>;
58
+ /** Builds a new runtime without installing it; warm it explicitly. */
59
+ readonly build: (options?: {
60
+ readonly retryWindowMs?: number;
61
+ /** Deployment admission settings for cases that deliberately queue more than the defaults allow. */
62
+ readonly admission?: Options["admission"];
63
+ readonly database?: ConformanceDatabase;
64
+ /** Queries read this streaming replica of `database` once it has caught up. */
65
+ readonly replica?: Redacted.Redacted<string> | undefined;
66
+ readonly content?: Options["content"];
67
+ /**
68
+ * Sees every statement the runtime compiles, from any fiber. It replaces
69
+ * the current statement transformer of every fiber the runtime starts, so
70
+ * a case that installs its own on a caller cannot share the runtime.
71
+ */
72
+ readonly observe?: (statement: Statement.Statement<unknown>) => void;
73
+ }) => ConformanceRuntime;
74
+ /** Stops the current runtime; the retained database survives. */
75
+ readonly stop: Effect.Effect<void>;
76
+ /** Restarts the current runtime against the retained database. */
77
+ readonly restart: Effect.Effect<void>;
78
+ /**
79
+ * A second database untouched by the current runtime, for isolation cases.
80
+ * Only a case that declares `requiresFreshDatabase` may open one.
81
+ */
82
+ readonly freshDatabase: Effect.Effect<ConformanceDatabase>;
83
+ /**
84
+ * Copies the retained database whole, as a backup of a stopped deployment
85
+ * would, into a new database no runtime has opened. Requires `stop` first,
86
+ * and a case that declares `requiresFreshDatabase`.
87
+ */
88
+ readonly snapshot: Effect.Effect<ConformanceDatabase>;
89
+ /**
90
+ * Opens an independent SQL connection to the same database. Only present
91
+ * when the backend advertises `independentConnections`.
92
+ */
93
+ readonly connect?: Effect.Effect<ConformanceConnection, never, Scope.Scope>;
94
+ /** The retained database on a streaming replica; only present when the backend has one. */
95
+ readonly replica?: ConformanceReplica | undefined;
96
+ /** A fresh listening HTTP server that supports WebSocket upgrades; each build listens anew. */
97
+ readonly httpServer: Layer.Layer<HttpServer.HttpServer>;
98
+ /** The hosted edge under test, when the backend supplies one. */
99
+ readonly edge?: ConformanceEdge;
100
+ }
101
+ /** A physical streaming replica of the backend's Postgres primary. */
102
+ export interface ConformanceReplica {
103
+ /** The retained database's connection string on the replica. */
104
+ readonly database: Redacted.Redacted<string>;
105
+ /** A superuser connection to the replica, e.g. to pause and resume WAL replay. */
106
+ readonly connect: Effect.Effect<ConformanceConnection, never, Scope.Scope>;
107
+ }
108
+ export interface ConformanceBackend {
109
+ /** True when the backend can open concurrent SQL connections (real Postgres). */
110
+ readonly independentConnections: boolean;
111
+ /** True when `open` returns a streaming replica of the primary. */
112
+ readonly hasReplica?: boolean;
113
+ /**
114
+ * True when the database is a Neki router. Turn sessions then run in
115
+ * single transaction mode and single fanout, and the cases flagged
116
+ * `requiresNeki` run; every other backend reports them through
117
+ * `registrar.skip`.
118
+ */
119
+ readonly neki?: boolean;
120
+ /** True when the server runs `wal_level=logical`, which fleet views need. */
121
+ readonly logicalDecoding?: boolean;
122
+ /**
123
+ * True when `open` can create further databases and snapshots; cases that
124
+ * declare `requiresFreshDatabase` are reported through `registrar.skip`
125
+ * otherwise.
126
+ */
127
+ readonly freshDatabases: boolean;
128
+ /** Extra services merged into every test runtime, e.g. BunCrypto.layer. */
129
+ readonly services: Layer.Layer<Crypto.Crypto, never, never>;
130
+ /**
131
+ * A listening HTTP server on an ephemeral loopback port that supports
132
+ * WebSocket upgrades, e.g. `BunHttpServer.layerServer({ port: 0 })`; the
133
+ * served-transport cases build one per case.
134
+ */
135
+ readonly httpServer: Layer.Layer<HttpServer.HttpServer>;
136
+ /**
137
+ * A hosted edge to run the edge half of the assertion cases against; a
138
+ * backend without one reports those cases through `registrar.skip`.
139
+ */
140
+ readonly edge?: ConformanceEdge;
141
+ readonly open: () => Promise<{
142
+ readonly database: ConformanceDatabase;
143
+ readonly freshDatabase: Effect.Effect<ConformanceDatabase>;
144
+ /** Copies a database that no runtime has open into a new one. */
145
+ readonly copy: (database: ConformanceDatabase) => Effect.Effect<ConformanceDatabase>;
146
+ readonly connect?: Effect.Effect<ConformanceConnection, never, Scope.Scope>;
147
+ readonly replica?: ConformanceReplica | undefined;
148
+ readonly close: Effect.Effect<void>;
149
+ }>;
150
+ }
151
+ /**
152
+ * The test authorization every conformance runtime applies. The harness
153
+ * resets it before each case, so a case that times out holding it closed
154
+ * does not deny the next one.
155
+ */
156
+ export interface ConformanceAccess {
157
+ allowed: boolean;
158
+ /** Commands the test authorization refuses while `allowed` holds. */
159
+ readonly denied: Set<string>;
160
+ /** Principals that lost access: refused as callers and as `onBehalfOf`, as an application would. */
161
+ readonly revoked: Set<string>;
162
+ }
163
+ /**
164
+ * The actors and mutable fixture a group of cases owns. A registration builds
165
+ * each selected suite, and every suite it `uses`, once: its fixture when the
166
+ * registration starts and its layer into every runtime the registration
167
+ * builds. Suites without a fixture receive `undefined`.
168
+ */
169
+ export interface ConformanceSuite<F = undefined> {
170
+ readonly fixture?: () => F;
171
+ /** Declared as a method so its parameter stays bivariant and any suite fits `ConformanceSuite<unknown>`. */
172
+ layer?(fixture: F): Layer.Layer<never, never, ConformanceSuiteServices>;
173
+ /** Other suites whose actors this suite's cases call. */
174
+ readonly uses?: ReadonlyArray<ConformanceSuite<unknown>>;
175
+ /** Runs at every turn fault point, as the process-level `TurnHooks`. */
176
+ turn?(fixture: F): (point: TurnPoint, request: Request) => Effect.Effect<void>;
177
+ /** Runs at every content-store fault point, as `ContentHooks`. */
178
+ content?(fixture: F): (point: ContentPoint) => Effect.Effect<void>;
179
+ /** Receives every log line the runtimes write; conformance runtimes print none. */
180
+ logger?(fixture: F): Logger.Logger<unknown, void>;
181
+ }
182
+ /** Services a suite's layer may require: what `ActorTest.layer` and the backend provide. */
183
+ export type ConformanceSuiteServices = Layer.Success<ReturnType<typeof ActorTest.layer>> | Crypto.Crypto;
184
+ export interface ConformanceContext<F = undefined> {
185
+ readonly expect: ConformanceExpect;
186
+ readonly environment: ConformanceEnvironment;
187
+ /** The fixture of the suite that owns the case. */
188
+ readonly fixture: F;
189
+ readonly access: ConformanceAccess;
190
+ /** The fixture of a suite the case's own suite `uses`. */
191
+ readonly fixtureOf: <G>(suite: ConformanceSuite<G>) => G;
192
+ }
193
+ export interface ConformanceCase<F = undefined> {
194
+ readonly name: string;
195
+ /**
196
+ * Requires `backend.independentConnections`; backends without it register
197
+ * the case through `registrar.skip` instead of running it.
198
+ */
199
+ readonly requiresIndependentConnections?: boolean;
200
+ /** Requires a streaming replica; backends without one skip the case. */
201
+ readonly requiresReplica?: boolean;
202
+ /** Requires `backend.edge`; backends without one register the case through `registrar.skip`. */
203
+ readonly requiresEdge?: boolean;
204
+ /** Requires `backend.neki`; every other backend registers the case through `registrar.skip`. */
205
+ readonly requiresNeki?: boolean;
206
+ /** Requires a server with `wal_level=logical`; backends without one skip the case. */
207
+ readonly requiresLogicalDecoding?: boolean;
208
+ /**
209
+ * Opens `environment.freshDatabase` or `environment.snapshot`. Only a case
210
+ * that declares it may, and backends without `freshDatabases` skip it.
211
+ */
212
+ readonly requiresFreshDatabase?: boolean;
213
+ /** Declared as a method so its parameter stays bivariant and any case fits `ConformanceCase<unknown>`. */
214
+ run(context: ConformanceContext<F>): Promise<void>;
215
+ readonly timeoutMs?: number;
216
+ }
217
+ /** A named group's cases and the suite that owns their actors and fixture. */
218
+ export interface ConformanceGroupCases<F = unknown> {
219
+ readonly suite: ConformanceSuite<F>;
220
+ readonly cases: ReadonlyArray<ConformanceCase<F>>;
221
+ }
222
+ /**
223
+ * Every conformance case, grouped by the file that owns it, with the suite
224
+ * that owns its actors. `describeConformance` runs a subset through `groups`,
225
+ * so a group can run in its own Vitest file and worker; `conformance` is
226
+ * their union and the order within a group is kept.
227
+ */
228
+ export declare const conformanceGroups: {
229
+ foundation: ConformanceGroupCases<unknown>;
230
+ access: ConformanceGroupCases<unknown>;
231
+ admission: ConformanceGroupCases<unknown>;
232
+ http: ConformanceGroupCases<unknown>;
233
+ protocols: ConformanceGroupCases<unknown>;
234
+ assertions: ConformanceGroupCases<unknown>;
235
+ edge: ConformanceGroupCases<unknown>;
236
+ coldServeEdge: ConformanceGroupCases<unknown>;
237
+ client: ConformanceGroupCases<unknown>;
238
+ offline: ConformanceGroupCases<unknown>;
239
+ capacity: ConformanceGroupCases<unknown>;
240
+ heap: ConformanceGroupCases<unknown>;
241
+ events: ConformanceGroupCases<unknown>;
242
+ reducer: ConformanceGroupCases<unknown>;
243
+ outbox: ConformanceGroupCases<unknown>;
244
+ tables: ConformanceGroupCases<unknown>;
245
+ effects: ConformanceGroupCases<unknown>;
246
+ progress: ConformanceGroupCases<unknown>;
247
+ multiRunner: ConformanceGroupCases<unknown>;
248
+ simulation: ConformanceGroupCases<unknown>;
249
+ drain: ConformanceGroupCases<unknown>;
250
+ pipeline: ConformanceGroupCases<unknown>;
251
+ batches: ConformanceGroupCases<unknown>;
252
+ groups: ConformanceGroupCases<unknown>;
253
+ relay: ConformanceGroupCases<unknown>;
254
+ relayCluster: ConformanceGroupCases<unknown>;
255
+ effectControl: ConformanceGroupCases<unknown>;
256
+ effectControlCluster: ConformanceGroupCases<unknown>;
257
+ singleton: ConformanceGroupCases<unknown>;
258
+ cron: ConformanceGroupCases<unknown>;
259
+ cronCluster: ConformanceGroupCases<unknown>;
260
+ blobs: ConformanceGroupCases<unknown>;
261
+ inspectionViews: ConformanceGroupCases<unknown>;
262
+ inspector: ConformanceGroupCases<unknown>;
263
+ rls: ConformanceGroupCases<unknown>;
264
+ retention: ConformanceGroupCases<unknown>;
265
+ restore: ConformanceGroupCases<unknown>;
266
+ workflows: ConformanceGroupCases<unknown>;
267
+ connections: ConformanceGroupCases<unknown>;
268
+ streams: ConformanceGroupCases<unknown>;
269
+ progressDelivery: ConformanceGroupCases<unknown>;
270
+ transports: ConformanceGroupCases<unknown>;
271
+ workflowVersions: ConformanceGroupCases<unknown>;
272
+ payloadMigrations: ConformanceGroupCases<unknown>;
273
+ subscriptions: ConformanceGroupCases<unknown>;
274
+ subscriptionsRetention: ConformanceGroupCases<unknown>;
275
+ subscriptionsCluster: ConformanceGroupCases<unknown>;
276
+ content: ConformanceGroupCases<unknown>;
277
+ counter: ConformanceGroupCases<unknown>;
278
+ properties: ConformanceGroupCases<unknown>;
279
+ mint: ConformanceGroupCases<unknown>;
280
+ readYourWrites: ConformanceGroupCases<unknown>;
281
+ observability: ConformanceGroupCases<unknown>;
282
+ operator: ConformanceGroupCases<unknown>;
283
+ export: ConformanceGroupCases<unknown>;
284
+ coldServe: ConformanceGroupCases<unknown>;
285
+ placement: ConformanceGroupCases<unknown>;
286
+ watch: ConformanceGroupCases<unknown>;
287
+ adoption: ConformanceGroupCases<unknown>;
288
+ singleShard: ConformanceGroupCases<unknown>;
289
+ crossShardOutbox: ConformanceGroupCases<unknown>;
290
+ fleet: ConformanceGroupCases<unknown>;
291
+ };
292
+ export type ConformanceGroup = keyof typeof conformanceGroups;
293
+ /**
294
+ * The shared durable-turn conformance cases. Cases flagged
295
+ * `requiresIndependentConnections` need real Postgres: a second database
296
+ * connection to read committed state while a turn holds its transaction open
297
+ * or to take a competing row lock, or a database outside the JavaScript heap
298
+ * they measure. They never run on single-connection backends such as PGlite.
299
+ */
300
+ export declare const conformance: ReadonlyArray<ConformanceCase<unknown>>;
301
+ /** A backend capability a case can require, as `ConformanceCase` flags name it. */
302
+ export type ConformanceRequirement = "independentConnections" | "replica" | "edge" | "neki" | "logicalDecoding" | "freshDatabase";
303
+ /** The capabilities `conformanceCase` requires, in a fixed order. */
304
+ export declare const requirementsOf: (conformanceCase: ConformanceCase<unknown>) => ReadonlyArray<ConformanceRequirement>;
305
+ /** The capabilities `backend` provides. */
306
+ export declare const capabilitiesOf: (backend: Pick<ConformanceBackend, "independentConnections" | "hasReplica" | "edge" | "neki" | "logicalDecoding" | "freshDatabases">) => ReadonlySet<ConformanceRequirement>;
307
+ /**
308
+ * Registers the named groups' cases, or every group's, against `backend`.
309
+ * Only the selected groups' suites, and the suites they use, build their
310
+ * actors and fixtures. The same case names run on every backend; a case
311
+ * whose requirements the backend lacks is reported through `registrar.skip`.
312
+ *
313
+ * Each case runs under the registrar's abort signal: a timed-out or
314
+ * cancelled case is interrupted, its finalizers run, and the next case waits
315
+ * for them, then restarts a runtime the case left stopped and starts with
316
+ * open test authorization.
317
+ */
318
+ export declare const describeConformance: (options: {
319
+ readonly name: string;
320
+ readonly backend: ConformanceBackend;
321
+ readonly registrar: ConformanceRegistrar;
322
+ readonly groups?: ReadonlyArray<ConformanceGroup>;
323
+ }) => void;
324
+ /** Registers `selected` groups; `describeConformance` passes registry groups, tests pass their own. */
325
+ export declare const registerConformance: (options: {
326
+ readonly name: string;
327
+ readonly backend: ConformanceBackend;
328
+ readonly registrar: ConformanceRegistrar;
329
+ readonly selected: ReadonlyArray<ConformanceGroupCases>;
330
+ }) => void;