@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,56 @@
1
+ import { Effect } from "effect";
2
+ import { Socket } from "effect/socket";
3
+ import type { ServedConnection } from "../../actor/served.ts";
4
+ import { ActorError } from "../../errors/actor.ts";
5
+ import { type ActorRef } from "../../identity/caller.ts";
6
+ import { type Holder } from "../../runtime/connections/holder.ts";
7
+ import type { Authenticated } from "../auth.ts";
8
+ /** Sockets one runner holds between their upgrade and their `hello`. */
9
+ export declare const MAX_AWAITING_HELLO = 1000;
10
+ /** What `socketSession` needs to run one upgraded socket. */
11
+ interface SessionOptions {
12
+ /** The upgraded socket. */
13
+ readonly socket: Socket.Socket;
14
+ /** The served connection member the session belongs to. */
15
+ readonly connection: ServedConnection;
16
+ /** Opens and drives the connection on the actor's owner. */
17
+ readonly holder: Holder;
18
+ /** The actor the session's connection belongs to, in the authenticated tenant. */
19
+ readonly ref: (tenant: string) => ActorRef;
20
+ /** The principal the upgrade request's own credential proved, if it carried one. */
21
+ readonly upgrade: Authenticated | undefined;
22
+ /** Authenticates a frame credential, or, with `undefined`, the upgrade request as it is. */
23
+ readonly authenticate: (credential: string | undefined) => Effect.Effect<Authenticated, ActorError>;
24
+ /** Authenticates a `reauthenticate` frame's credential. */
25
+ readonly reauthenticate: (credential: string) => Effect.Effect<Authenticated, ActorError>;
26
+ /** Frees the socket's place among those awaiting `hello`; runs once. */
27
+ readonly greeted: Effect.Effect<void>;
28
+ }
29
+ /**
30
+ * Runs one upgraded connection socket until it ends: `hello`, the holder's
31
+ * open, then member frames both ways with the holder's control messages in
32
+ * their own envelope, renewal of the credential before it expires, and an
33
+ * `end` message and close code as the session's last words.
34
+ *
35
+ * Ordering and guarantees:
36
+ * - `hello` comes first; nothing is authenticated or woken before it decodes.
37
+ * - Only text messages are read. Each is bounded as a whole, so a frame inside
38
+ * it is too, and an unknown `t` fails to decode; both end the session.
39
+ * - However the session stops, even by interruption when the server drops the
40
+ * socket or shuts down, the holder closes the connection and the owner its
41
+ * row. Once close publishes the ended session, cleanup cannot be interrupted
42
+ * by the outbound reader finishing first, or the durable row would remain.
43
+ * - A failed write means the peer is gone; it ends the session like a close.
44
+ * - Frames carry cursors only when the holder stamped them; `stampCursor:
45
+ * false` has none. Executor progress has its own message, never `frame`, and
46
+ * no cursor: it is not replayed.
47
+ * - Backpressure: the socket is not read while the holder has a full window of
48
+ * frames in flight.
49
+ * - Identity never changes mid-session, and a bound credential also names its
50
+ * session, which never changes either; a different caller reconnects. A
51
+ * refused renewal ends the session at the holder, which reports it.
52
+ * - The client is asked for a fresh credential ahead of the current one's
53
+ * expiry; a renewal that arrives before it was asked for moves the next ask.
54
+ */
55
+ export declare const socketSession: (options: SessionOptions) => Effect.Effect<void, never, import("effect/Scope").Scope>;
56
+ export {};
@@ -0,0 +1,212 @@
1
+ import { Data, DateTime, Effect, Match, Option, Predicate, Queue, Result, Schema, Stream, } from "effect";
2
+ import { Socket } from "effect/socket";
3
+ import { ActorError, SessionEnded, Unauthorized } from "../../errors/actor.js";
4
+ import { callerKey } from "../../identity/caller.js";
5
+ import { MAX_INBOUND_BYTES } from "../../runtime/connections/holder.js";
6
+ import { ClientMessage } from "../../runtime/connections/protocol.js";
7
+ import { ClientWireMessage, ServerWireMessage } from "../../protocol/frames.js";
8
+ import { actorErrorBody, closeCodeOf } from "../../protocol/wire.js";
9
+ import { invalidInput, undecodable } from "../wire.js";
10
+ /** How long a socket may wait after its upgrade for `hello`. */
11
+ const HELLO_TIMEOUT_MS = 10_000;
12
+ /** Sockets one runner holds between their upgrade and their `hello`. */
13
+ export const MAX_AWAITING_HELLO = 1_000;
14
+ /** Renewal is asked for this long before a credential expires, or at half its life if sooner. */
15
+ const REAUTHENTICATE_LEAD_MS = 60_000;
16
+ /** Binary messages are refused with this close code. */
17
+ const UNSUPPORTED_DATA = 1003;
18
+ /** An inbound message over the frame limit closes with this code. */
19
+ const MESSAGE_TOO_BIG = 1009;
20
+ /** A declared `open` failure closes with this code. */
21
+ const DECLARED_FAILURE = 4400;
22
+ const utf8 = new TextEncoder();
23
+ const encodeServerMessage = Schema.encodeEffect(Schema.fromJsonString(ServerWireMessage));
24
+ const decodeClientMessage = Schema.decodeUnknownEffect(Schema.fromJsonString(ClientWireMessage));
25
+ /** A progress frame as the effect's progress schema encoded it, as the JSON value a client reads. */
26
+ const progressFrame = Schema.decodeEffect(Schema.fromJsonString(Schema.Json));
27
+ /** Ends a session: the `end` message's error and the close code after it. */
28
+ class Refusal extends Data.TaggedError("Refusal") {
29
+ }
30
+ const refuse = (error, code = closeCodeOf(error.reason)) => new Refusal({ error, code });
31
+ const decodeFailed = () => refuse(invalidInput("decode"));
32
+ const expiryOf = (authenticated) => authenticated.expiresAt === undefined
33
+ ? undefined
34
+ : DateTime.toEpochMillis(authenticated.expiresAt);
35
+ /** Whether two credentials name the same tenant, caller, and, when bound, session. */
36
+ const samePrincipal = (left, right) => left.tenant === right.tenant &&
37
+ callerKey(left.caller) === callerKey(right.caller) &&
38
+ left.binding?.session === right.binding?.session;
39
+ const differentIdentity = () => refuse(ActorError.make({ reason: Unauthorized.make({ code: "invalid_credentials" }) }));
40
+ const isHello = (message) => message.t === "hello";
41
+ /**
42
+ * Runs one upgraded connection socket until it ends: `hello`, the holder's
43
+ * open, then member frames both ways with the holder's control messages in
44
+ * their own envelope, renewal of the credential before it expires, and an
45
+ * `end` message and close code as the session's last words.
46
+ *
47
+ * Ordering and guarantees:
48
+ * - `hello` comes first; nothing is authenticated or woken before it decodes.
49
+ * - Only text messages are read. Each is bounded as a whole, so a frame inside
50
+ * it is too, and an unknown `t` fails to decode; both end the session.
51
+ * - However the session stops, even by interruption when the server drops the
52
+ * socket or shuts down, the holder closes the connection and the owner its
53
+ * row. Once close publishes the ended session, cleanup cannot be interrupted
54
+ * by the outbound reader finishing first, or the durable row would remain.
55
+ * - A failed write means the peer is gone; it ends the session like a close.
56
+ * - Frames carry cursors only when the holder stamped them; `stampCursor:
57
+ * false` has none. Executor progress has its own message, never `frame`, and
58
+ * no cursor: it is not replayed.
59
+ * - Backpressure: the socket is not read while the holder has a full window of
60
+ * frames in flight.
61
+ * - Identity never changes mid-session, and a bound credential also names its
62
+ * session, which never changes either; a different caller reconnects. A
63
+ * refused renewal ends the session at the holder, which reports it.
64
+ * - The client is asked for a fresh credential ahead of the current one's
65
+ * expiry; a renewal that arrives before it was asked for moves the next ask.
66
+ */
67
+ export const socketSession = Effect.fnUntraced(function* (options) {
68
+ const { connection, holder } = options;
69
+ const writer = yield* options.socket.writer;
70
+ const reader = yield* options.socket.reader.pipe(Effect.option);
71
+ if (Option.isNone(reader))
72
+ return;
73
+ let finished = false;
74
+ let buffered = [];
75
+ const write = (message) => encodeServerMessage(message).pipe(Effect.orDie, Effect.flatMap(writer.write));
76
+ const send = (message) => Effect.suspend(() => (finished ? Effect.void : write(message)));
77
+ const finish = (error, code) => Effect.suspend(() => {
78
+ if (finished)
79
+ return Effect.void;
80
+ finished = true;
81
+ return write({ t: "end", error }).pipe(Effect.andThen(writer.write(new Socket.CloseEvent(code))), Effect.ignore);
82
+ });
83
+ const finishWith = (refusal) => actorErrorBody(refusal.error).pipe(Effect.flatMap((body) => finish(body, refusal.code)));
84
+ const nextRaw = Effect.suspend(() => {
85
+ const head = buffered.shift();
86
+ if (head !== undefined)
87
+ return Effect.succeed(head);
88
+ return reader.value.pull.pipe(Effect.map((batch) => {
89
+ buffered = batch.slice(1);
90
+ return batch[0];
91
+ }));
92
+ });
93
+ const parse = (raw) => Effect.gen(function* () {
94
+ if (!Predicate.isString(raw))
95
+ return yield* refuse(invalidInput("decode"), UNSUPPORTED_DATA);
96
+ if (utf8.encode(raw).byteLength > MAX_INBOUND_BYTES)
97
+ return yield* refuse(ActorError.make({ reason: SessionEnded.make({ cause: "Defect", resync: false }) }), MESSAGE_TOO_BIG);
98
+ return yield* decodeClientMessage(raw).pipe(Effect.mapError((error) => error.pipe(undecodable, refuse)));
99
+ });
100
+ const hello = yield* nextRaw.pipe(Effect.timeoutOption(HELLO_TIMEOUT_MS), Effect.flatMap(Option.match({ onNone: () => Effect.fail(decodeFailed()), onSome: parse })), Effect.filterOrFail(isHello, decodeFailed), Effect.ensuring(options.greeted), Effect.result);
101
+ if (Result.isFailure(hello)) {
102
+ if (Predicate.isTagged(hello.failure, "Refusal"))
103
+ yield* finishWith(hello.failure);
104
+ return;
105
+ }
106
+ const opened = yield* Effect.gen(function* () {
107
+ const proved = hello.success.authorization === undefined
108
+ ? undefined
109
+ : yield* options.authenticate(hello.success.authorization).pipe(Effect.mapError(refuse));
110
+ if (proved !== undefined &&
111
+ options.upgrade !== undefined &&
112
+ !samePrincipal(proved, options.upgrade))
113
+ return yield* differentIdentity();
114
+ const principal = proved ??
115
+ options.upgrade ??
116
+ (yield* options.authenticate(undefined).pipe(Effect.mapError(refuse)));
117
+ const params = yield* connection
118
+ .openParams(hello.success.params)
119
+ .pipe(Effect.mapError((error) => error.pipe(undecodable, refuse)));
120
+ const held = yield* holder
121
+ .open({
122
+ ref: options.ref(principal.tenant),
123
+ member: connection.tag,
124
+ caller: principal.caller,
125
+ params,
126
+ expiresAt: expiryOf(principal),
127
+ })
128
+ .pipe(Effect.catchTag("OpenRejected", (rejected) => connection.openFailure(rejected.value).pipe(Effect.orDie, Effect.flatMap((error) => finish(error, DECLARED_FAILURE)), Effect.andThen(Effect.fail(undefined)))), Effect.mapError((error) => (error === undefined ? undefined : refuse(error))));
129
+ return { held, principal };
130
+ }).pipe(Effect.result);
131
+ if (Result.isFailure(opened)) {
132
+ if (opened.failure !== undefined)
133
+ yield* finishWith(opened.failure);
134
+ return;
135
+ }
136
+ const { held, principal } = opened.success;
137
+ const close = Effect.uninterruptible(held.close);
138
+ const shutdown = refuse(ActorError.make({ reason: SessionEnded.make({ cause: "HolderShutdown", resync: true }) }));
139
+ yield* Effect.addFinalizer(() => finishWith(shutdown).pipe(Effect.andThen(close)));
140
+ let expiresAt = expiryOf(principal);
141
+ const renewed = yield* Queue.sliding(1);
142
+ const gone = Effect.sync(() => {
143
+ finished = true;
144
+ }).pipe(Effect.andThen(close));
145
+ const opening = send({
146
+ t: "open",
147
+ connectionId: held.connectionId,
148
+ baseline: connection.stampCursor ? held.cursor : undefined,
149
+ reauthenticateBy: expiresAt,
150
+ });
151
+ const wire = ClientMessage.match({
152
+ Frame: (message) => connection.serverFrame(message.frame).pipe(Effect.orDie, Effect.map((frame) => ({
153
+ t: "frame",
154
+ frame,
155
+ cursor: message.cursor,
156
+ event: message.event,
157
+ }))),
158
+ Resync: (message) => Effect.succeed({
159
+ t: "resync",
160
+ after: connection.stampCursor ? message.after : undefined,
161
+ reason: message.reason,
162
+ deadline: message.deadlineMs,
163
+ }),
164
+ ResyncReplayed: () => Effect.succeed({ t: "resyncReplayed" }),
165
+ Progress: (message) => progressFrame(message.frame).pipe(Effect.orDie, Effect.map((frame) => ({
166
+ t: "progress",
167
+ job: message.job,
168
+ jobId: message.jobId,
169
+ attempt: message.attempt,
170
+ seq: message.seq,
171
+ frame,
172
+ }))),
173
+ });
174
+ const outbound = held.messages.pipe(Stream.runForEach((message) => wire(message).pipe(Effect.flatMap(send))), Effect.matchEffect({
175
+ onFailure: (error) => Predicate.isTagged(error, "SocketError") ? gone : error.pipe(refuse, finishWith),
176
+ onSuccess: () => finish(undefined, 1000),
177
+ }));
178
+ const renew = (credential) => Effect.gen(function* () {
179
+ const fresh = yield* options.reauthenticate(credential).pipe(Effect.mapError(refuse));
180
+ if (!samePrincipal(fresh, principal))
181
+ return yield* differentIdentity();
182
+ const next = expiryOf(fresh);
183
+ const accepted = yield* held.reauthenticate(next).pipe(Effect.as(true), Effect.orElseSucceed(() => false));
184
+ if (!accepted)
185
+ return;
186
+ expiresAt = next;
187
+ yield* send({ t: "reauthenticated", by: next });
188
+ yield* Queue.offer(renewed, undefined);
189
+ });
190
+ const handle = Match.type().pipe(Match.discriminatorsExhaustive("t")({
191
+ frame: (message) => connection.clientFrame(message.frame).pipe(Effect.mapError((error) => error.pipe(undecodable, refuse)), Effect.tap(() => held.writable), Effect.flatMap((frame) => held.send(frame).pipe(Effect.ignore))),
192
+ resyncDone: () => held.resyncDone,
193
+ reauthenticate: (message) => renew(message.authorization),
194
+ hello: () => Effect.fail(decodeFailed()),
195
+ }));
196
+ const inbound = nextRaw.pipe(Effect.flatMap(parse), Effect.flatMap(handle), Effect.forever, Effect.catchTag("Refusal", (refusal) => finishWith(refusal).pipe(Effect.andThen(close))), Effect.catch(() => close));
197
+ const reauthenticate = Effect.gen(function* () {
198
+ while (true) {
199
+ const deadline = expiresAt;
200
+ if (deadline === undefined)
201
+ return yield* Effect.never;
202
+ const now = yield* holder.now;
203
+ const askAt = Math.min(deadline - REAUTHENTICATE_LEAD_MS, now + (deadline - now) / 2);
204
+ const early = yield* Queue.take(renewed).pipe(Effect.timeoutOption(Math.max(0, askAt - now)));
205
+ if (Option.isSome(early))
206
+ continue;
207
+ yield* send({ t: "reauthenticate", by: deadline });
208
+ yield* Queue.take(renewed);
209
+ }
210
+ }).pipe(Effect.catchTag("SocketError", () => gone));
211
+ yield* opening.pipe(Effect.andThen(Effect.raceAll([outbound, inbound, reauthenticate])), Effect.catchTag("SocketError", () => gone));
212
+ });
@@ -0,0 +1,27 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { ActorError } from "../../errors/actor.ts";
3
+ /** A comment line this often keeps idle proxies from closing a quiet response. */
4
+ export declare const KEEPALIVE_MS = 15000;
5
+ /**
6
+ * One SSE message: `event` and JSON `data`, and `id` when the protocol gives
7
+ * the message a position. A message without `id` writes no `id` line, so a
8
+ * standard reader sees it inherit the previous one.
9
+ */
10
+ export declare const message: ({ event, data, id, }: {
11
+ readonly event: string;
12
+ readonly data: Schema.Json;
13
+ readonly id?: string | undefined;
14
+ }) => Effect.Effect<string, never, never>;
15
+ /** The JSON of an encoded member output, as a live runtime frame carries it: `null` for none. */
16
+ export declare const valueJson: (encoded: string) => Effect.Effect<string | number | boolean | Schema.JsonArray | Schema.JsonObject | null, never, never>;
17
+ /** What ended a live session: an `ActorError`, or a declared failure in its encoded form. */
18
+ export type SessionFailure = ActorError | {
19
+ readonly failure: string;
20
+ };
21
+ /** The body a session's `end` carries for `error`, as a served response would. */
22
+ export declare const failureJson: (error: SessionFailure) => Effect.Effect<Schema.Json>;
23
+ /**
24
+ * SSE text as bytes, with a `: keepalive` comment every `KEEPALIVE_MS` while
25
+ * `messages` is open; the response ends when `messages` does.
26
+ */
27
+ export declare const withKeepalive: <E>(messages: Stream.Stream<string, E>) => Stream.Stream<Uint8Array<ArrayBufferLike>, E, never>;
@@ -0,0 +1,26 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { Sse } from "effect/encoding";
3
+ import { ActorError } from "../../errors/actor.js";
4
+ import { actorErrorBody } from "../../protocol/wire.js";
5
+ /** A comment line this often keeps idle proxies from closing a quiet response. */
6
+ export const KEEPALIVE_MS = 15_000;
7
+ const encodeJson = Schema.encodeEffect(Schema.fromJsonString(Schema.Json));
8
+ const decodeJson = Schema.decodeEffect(Schema.fromJsonString(Schema.Json));
9
+ const decodeValue = Schema.decodeEffect(Schema.fromJsonString(Schema.Struct({ value: Schema.optionalKey(Schema.Json) })));
10
+ /**
11
+ * One SSE message: `event` and JSON `data`, and `id` when the protocol gives
12
+ * the message a position. A message without `id` writes no `id` line, so a
13
+ * standard reader sees it inherit the previous one.
14
+ */
15
+ export const message = ({ event, data, id, }) => encodeJson(data).pipe(Effect.orDie, Effect.map((text) => Sse.encoder.write(Sse.Event.make({ id, event, data: text }))));
16
+ /** The JSON of an encoded member output, as a live runtime frame carries it: `null` for none. */
17
+ export const valueJson = (encoded) => decodeValue(encoded).pipe(Effect.orDie, Effect.map(({ value }) => value ?? null));
18
+ /** The body a session's `end` carries for `error`, as a served response would. */
19
+ export const failureJson = (error) => Schema.is(ActorError)(error)
20
+ ? actorErrorBody(error)
21
+ : decodeJson(error.failure).pipe(Effect.orDie);
22
+ /**
23
+ * SSE text as bytes, with a `: keepalive` comment every `KEEPALIVE_MS` while
24
+ * `messages` is open; the response ends when `messages` does.
25
+ */
26
+ export const withKeepalive = (messages) => messages.pipe(Stream.merge(Stream.tick(KEEPALIVE_MS).pipe(Stream.drop(1), Stream.map(() => ": keepalive\n\n")), { haltStrategy: "left" }), Stream.encodeText);
@@ -0,0 +1,9 @@
1
+ import { Stream } from "effect";
2
+ import { type SessionFailure } from "./sse.ts";
3
+ /**
4
+ * A subscription as SSE text: each element as `event: element` with its
5
+ * encoded value as `data`, then one `end` message: `null` when the stream
6
+ * ended by itself, else the `ActorError` envelope or the member's declared
7
+ * error that ended it. Streams have no cursor, so there is no `id`.
8
+ */
9
+ export declare const streamResponse: (elements: Stream.Stream<string, SessionFailure>) => Stream.Stream<Uint8Array<ArrayBufferLike>, never, never>;
@@ -0,0 +1,9 @@
1
+ import { Effect, Stream } from "effect";
2
+ import { failureJson, message, valueJson, withKeepalive } from "./sse.js";
3
+ /**
4
+ * A subscription as SSE text: each element as `event: element` with its
5
+ * encoded value as `data`, then one `end` message: `null` when the stream
6
+ * ended by itself, else the `ActorError` envelope or the member's declared
7
+ * error that ended it. Streams have no cursor, so there is no `id`.
8
+ */
9
+ export const streamResponse = (elements) => elements.pipe(Stream.mapEffect((element) => valueJson(element).pipe(Effect.flatMap((json) => message({ event: "element", data: json })))), Stream.concat(Stream.fromEffect(message({ event: "end", data: null }))), Stream.catch((error) => Stream.fromEffect(failureJson(error).pipe(Effect.flatMap((body) => message({ event: "end", data: body }))))), withKeepalive);
@@ -0,0 +1,12 @@
1
+ import { Stream } from "effect";
2
+ import type { WatchResult } from "../../runtime/members.ts";
3
+ import { type SessionFailure } from "./sse.ts";
4
+ /**
5
+ * A watch as SSE text: each result as `event: result` with the encoded output
6
+ * as `data`, and as `id` the commit version its rerun waited for when there was
7
+ * one. A watch is state, not history, so there is no `Last-Event-ID` resume: a
8
+ * reconnect opens a new watch whose first result is the current state. The last
9
+ * message is `end`, carrying the `ActorError` envelope or the query's declared
10
+ * error that ended it.
11
+ */
12
+ export declare const watchResponse: (results: Stream.Stream<WatchResult, SessionFailure>) => Stream.Stream<Uint8Array<ArrayBufferLike>, never, never>;
@@ -0,0 +1,11 @@
1
+ import { Effect, Stream } from "effect";
2
+ import { failureJson, message, valueJson, withKeepalive } from "./sse.js";
3
+ /**
4
+ * A watch as SSE text: each result as `event: result` with the encoded output
5
+ * as `data`, and as `id` the commit version its rerun waited for when there was
6
+ * one. A watch is state, not history, so there is no `Last-Event-ID` resume: a
7
+ * reconnect opens a new watch whose first result is the current state. The last
8
+ * message is `end`, carrying the `ActorError` envelope or the query's declared
9
+ * error that ended it.
10
+ */
11
+ export const watchResponse = (results) => results.pipe(Stream.mapEffect(({ version, value }) => valueJson(value).pipe(Effect.flatMap((json) => message({ event: "result", data: json, id: version })))), Stream.catch((error) => Stream.fromEffect(failureJson(error).pipe(Effect.flatMap((body) => message({ event: "end", data: body }))))), withKeepalive);
@@ -0,0 +1,16 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { HttpServerResponse } from "effect/http";
3
+ import { ActorError, InvalidInput } from "../errors/actor.ts";
4
+ /**
5
+ * The HTTP response an `ActorError` is served as: its status, the JSON body,
6
+ * `retry-after` in whole seconds when the error has a retry delay, and
7
+ * `www-authenticate: Bearer` for credential failures.
8
+ */
9
+ export declare const actorErrorResponse: (error: ActorError) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, never>;
10
+ /** An `ActorError` wrapping `InvalidInput` with the given code. */
11
+ export declare const invalidInput: (code: InvalidInput["code"]) => ActorError;
12
+ /**
13
+ * A body, id, or payload that failed its schema. Issues carry a path and a
14
+ * fixed message, so a response never echoes the value that failed.
15
+ */
16
+ export declare const undecodable: (error: Schema.SchemaError) => ActorError;
@@ -0,0 +1,50 @@
1
+ import { Effect, Option, Schema, SchemaIssue } from "effect";
2
+ import { HttpServerResponse } from "effect/http";
3
+ import { ActorError, InvalidInput, Unauthorized } from "../errors/actor.js";
4
+ import { actorErrorBody, retryAfterSeconds, statusOf } from "../protocol/wire.js";
5
+ /**
6
+ * The HTTP response an `ActorError` is served as: its status, the JSON body,
7
+ * `retry-after` in whole seconds when the error has a retry delay, and
8
+ * `www-authenticate: Bearer` for credential failures.
9
+ */
10
+ export const actorErrorResponse = Effect.fnUntraced(function* (error) {
11
+ const retryAfter = error.retryAfter;
12
+ const body = yield* actorErrorBody(error);
13
+ const headers = {};
14
+ if (Option.isSome(retryAfter))
15
+ headers["retry-after"] = retryAfterSeconds(retryAfter.value);
16
+ if (Schema.is(Unauthorized)(error.reason) && error.reason.isCredential)
17
+ headers["www-authenticate"] = "Bearer";
18
+ return HttpServerResponse.jsonUnsafe(body, { status: statusOf(error.reason), headers });
19
+ });
20
+ const LEAF_MESSAGES = {
21
+ InvalidType: "Invalid type",
22
+ InvalidValue: "Invalid value",
23
+ MissingKey: "Missing key",
24
+ UnexpectedKey: "Unexpected key",
25
+ Forbidden: "Forbidden operation",
26
+ OneOf: "Expected exactly one member to match",
27
+ };
28
+ const formatIssues = SchemaIssue.makeFormatterStandardSchemaV1({
29
+ leafHook: (issue) => LEAF_MESSAGES[issue._tag],
30
+ checkHook: () => "Failed check",
31
+ });
32
+ /** An `ActorError` wrapping `InvalidInput` with the given code. */
33
+ export const invalidInput = (code) => ActorError.make({ reason: InvalidInput.make({ code }) });
34
+ /**
35
+ * A body, id, or payload that failed its schema. Issues carry a path and a
36
+ * fixed message, so a response never echoes the value that failed.
37
+ */
38
+ export const undecodable = (error) => ActorError.make({
39
+ reason: InvalidInput.make({
40
+ code: "decode",
41
+ issues: formatIssues(error.issue).issues.map((issue) => ({
42
+ path: (issue.path ?? [])
43
+ .map((segment) => String(Schema.is(Schema.Struct({ key: Schema.PropertyKey }))(segment)
44
+ ? segment.key
45
+ : segment))
46
+ .join("."),
47
+ message: issue.message,
48
+ })),
49
+ }),
50
+ });
@@ -0,0 +1,71 @@
1
+ import type { Cause, Effect, Option, Stream } from "effect";
2
+ import type { InvalidContentRef } from "../errors/content.ts";
3
+ import type { ContentEntry, ContentRef } from "../identity/content.ts";
4
+ import type { AnyBlob, AnyContent } from "../members/blob.ts";
5
+ import type { TableScope } from "../tables/owned.ts";
6
+ /** Read-only access to the current actor's entries of one blob. */
7
+ export interface BlobRead {
8
+ /** The entry's bytes, every appended chunk in order; none when it was never set. */
9
+ readonly get: (name: string) => Effect.Effect<Option.Option<Uint8Array>>;
10
+ }
11
+ /** Turn-bound access to the current actor's entries; writes commit or roll back with the turn. */
12
+ export interface BlobWrite extends BlobRead {
13
+ /** Replaces the entry with `bytes` as its only chunk. */
14
+ readonly set: (name: string, bytes: Uint8Array) => Effect.Effect<void>;
15
+ /** Adds `bytes` as a new chunk after the existing ones, creating the entry if needed. */
16
+ readonly append: (name: string, bytes: Uint8Array) => Effect.Effect<void>;
17
+ /** Merges the entry's chunks into one without changing its bytes. */
18
+ readonly compact: (name: string) => Effect.Effect<void>;
19
+ /** Removes the entry and its bytes, so `get` returns none; removing a missing entry does nothing. */
20
+ readonly delete: (name: string) => Effect.Effect<void>;
21
+ }
22
+ /**
23
+ * Off-turn access to the content the current actor references. A read never
24
+ * returns partial bytes: content swept after its reference was resolved reads
25
+ * as a missing name.
26
+ */
27
+ export interface ContentRead {
28
+ /** The referenced content's bytes; none when the actor holds no reference under `name`. */
29
+ readonly get: (name: string) => Effect.Effect<Option.Option<Uint8Array>>;
30
+ /**
31
+ * The referenced content's bytes in chunks from one snapshot, so a
32
+ * concurrent sweep never truncates them. A missing name fails before any
33
+ * chunk with `NoSuchElementError`.
34
+ */
35
+ readonly stream: (name: string) => Stream.Stream<Uint8Array, Cause.NoSuchElementError>;
36
+ /** Every reference under this blob, by name. */
37
+ readonly list: Effect.Effect<ReadonlyArray<ContentEntry>>;
38
+ }
39
+ /**
40
+ * Turn-bound references to shared content. Writes touch only the actor's own
41
+ * rows and commit or roll back with the turn; a turn never sees content bytes.
42
+ */
43
+ export interface ContentWrite {
44
+ /**
45
+ * References the content `ref` names under `name`, replacing any earlier
46
+ * reference. Fails `InvalidContentRef` unless `ref.grant` was issued by this
47
+ * deployment for this tenant, hash, and size, and stays valid past the skew margin.
48
+ */
49
+ readonly attach: (name: string, ref: ContentRef) => Effect.Effect<void, InvalidContentRef>;
50
+ /** Drops the reference under `name`; dropping a missing one does nothing. */
51
+ readonly detach: (name: string) => Effect.Effect<void>;
52
+ /** Every reference under this blob, by name, including this turn's changes. */
53
+ readonly list: Effect.Effect<ReadonlyArray<ContentEntry>>;
54
+ }
55
+ /** What `read.blob(B)` returns for a declared blob `B`. */
56
+ export type BlobReadOf<B extends AnyBlob> = B extends AnyContent ? ContentRead : BlobRead;
57
+ /** What `turn.blob(B)` returns for a declared blob `B`. */
58
+ export type BlobWriteOf<B extends AnyBlob> = B extends AnyContent ? ContentWrite : BlobWrite;
59
+ /** Whose blob entries a capability reaches and how long it lives, as for owned tables. */
60
+ export interface BlobScope extends Omit<TableScope, "tables"> {
61
+ /** The blobs the actor type declares; `blob` refuses any other. */
62
+ readonly blobs: ReadonlyArray<AnyBlob>;
63
+ /** Bytes all of the actor's entries may hold together: `policy.maxBlobBytes`. */
64
+ readonly maxBytes: number;
65
+ /** Entries and content references of all the actor's blobs together: `policy.maxBlobEntries`. */
66
+ readonly maxEntries: number;
67
+ /** `executionTimeout`: how long a content stream may hold its snapshot. */
68
+ readonly timeoutMs: number;
69
+ }
70
+ /** Turn-bound access returns the write interfaces; read access only the read ones. */
71
+ export type BlobAccess = (blob: AnyBlob) => BlobRead | BlobWrite | ContentRead | ContentWrite;
File without changes
@@ -0,0 +1,53 @@
1
+ import { Schema } from "effect";
2
+ import type { ValueSchema } from "../members/command.ts";
3
+ type Fields = Readonly<Record<string, ValueSchema>>;
4
+ /**
5
+ * One step of a schema's history: `from` is the stored shape, `to` the next
6
+ * one, and `upcast` a pure conversion. A chain's last `to` is the declared
7
+ * shape, so a stored value upcasts through every later step in order.
8
+ * `downcast` converts back; an event or effect needs it only for the steps
9
+ * above its `writeVersion`, while a rolling deploy still writes the old shape.
10
+ * `upcast` and `downcast` are declared as methods so their parameters stay
11
+ * bivariant and any migration fits a chain.
12
+ */
13
+ export interface StateMigration<From extends Fields = Fields, To extends Fields = Fields> {
14
+ readonly from: From;
15
+ readonly to: To;
16
+ upcast(previous: Schema.Struct<From>["Type"]): Schema.Struct<To>["Type"];
17
+ downcast?(next: Schema.Struct<To>["Type"]): Schema.Struct<From>["Type"];
18
+ }
19
+ declare const migration: <const From extends Fields, const To extends Fields>(from: From, to: To, upcast: StateMigration<From, To>["upcast"], options?: {
20
+ readonly downcast?: (next: Schema.Struct<To>["Type"]) => Schema.Struct<From>["Type"];
21
+ }) => StateMigration<From, To>;
22
+ /** Stored with the actor's state rows; version `n` means `n` migrations have been applied. */
23
+ export declare const VERSION_KEY = "$version";
24
+ /** A chain is valid when each `to` is the next `from` and the last `to` is the declared state. */
25
+ declare const validateChain: (fields: Fields, chain: ReadonlyArray<StateMigration>) => void;
26
+ /**
27
+ * An actor's keyed state: the current fields and the migrations that upcast
28
+ * older stored shapes to them. The last migration's `to` must be `fields`.
29
+ */
30
+ export interface ActorState<F extends Fields = Fields> {
31
+ readonly fields: F;
32
+ readonly migrations: ReadonlyArray<StateMigration>;
33
+ }
34
+ declare const state: <const F extends Fields>(fields: F, options?: {
35
+ readonly migrations?: ReadonlyArray<StateMigration>;
36
+ }) => ActorState<F>;
37
+ /**
38
+ * `ActorStates` carries `Actor.state`, which declares an actor's keyed state
39
+ * fields and their migrations, `Actor.migration`, which builds one step of a
40
+ * chain, and `validateChain`, which `Actor.make` uses to reject a chain whose
41
+ * steps do not join or whose last `to` is not the declared state.
42
+ *
43
+ * @example
44
+ * const Counter = Actor.state({
45
+ * count: Schema.Int.pipe(Schema.withDecodingDefault(Effect.succeed(0))),
46
+ * })
47
+ */
48
+ export declare const ActorStates: {
49
+ make: typeof state;
50
+ migration: typeof migration;
51
+ validateChain: typeof validateChain;
52
+ };
53
+ export {};
@@ -0,0 +1,29 @@
1
+ import { Schema } from "effect";
2
+ const migration = (from, to, upcast, options) => options?.downcast === undefined
3
+ ? { from, to, upcast }
4
+ : { from, to, upcast, downcast: options.downcast };
5
+ /** Stored with the actor's state rows; version `n` means `n` migrations have been applied. */
6
+ export const VERSION_KEY = "$version";
7
+ /** A chain is valid when each `to` is the next `from` and the last `to` is the declared state. */
8
+ const validateChain = (fields, chain) => {
9
+ for (let index = 1; index < chain.length; index++)
10
+ if (chain[index - 1].to !== chain[index].from)
11
+ throw new Error(`State migration ${index} must start from the previous migration's result`);
12
+ if (chain.length > 0 && chain.at(-1).to !== fields)
13
+ throw new Error("The last state migration must produce the declared state");
14
+ if (VERSION_KEY in fields)
15
+ throw new Error(`State key '${VERSION_KEY}' is reserved`);
16
+ };
17
+ const state = (fields, options) => ({ fields, migrations: options?.migrations ?? [] });
18
+ /**
19
+ * `ActorStates` carries `Actor.state`, which declares an actor's keyed state
20
+ * fields and their migrations, `Actor.migration`, which builds one step of a
21
+ * chain, and `validateChain`, which `Actor.make` uses to reject a chain whose
22
+ * steps do not join or whose last `to` is not the declared state.
23
+ *
24
+ * @example
25
+ * const Counter = Actor.state({
26
+ * count: Schema.Int.pipe(Schema.withDecodingDefault(Effect.succeed(0))),
27
+ * })
28
+ */
29
+ export const ActorStates = { make: state, migration, validateChain };