@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,332 @@
1
+ import { Context, DateTime, Duration, Effect, Fiber, Option, Result, Schema } from "effect";
2
+ import { InsideTurn } from "../contexts/command.js";
3
+ import { Due, emptyOutbox, InTurn, jobKey, openOutbox } from "../handles/intents.js";
4
+ import { ActorRef, principal } from "../identity/caller.js";
5
+ import { childId } from "../identity/child.js";
6
+ import { isCursor } from "../runtime/events/cursor.js";
7
+ import { Outcome } from "../runtime/request.js";
8
+ import { broadcastsTo } from "./connections.js";
9
+ import { descriptorOf } from "./descriptor.js";
10
+ const utf8 = new TextEncoder();
11
+ /**
12
+ * Encoded bytes of every event one turn may emit. The turn appends them in
13
+ * one statement inside its transaction, so the budget bounds that statement.
14
+ */
15
+ const MAX_EMIT_BYTES = 1_048_576;
16
+ /** When and under which key `turn.enqueue` stages a job. */
17
+ const enqueueSchedule = (options) => {
18
+ if (options?.key !== undefined)
19
+ jobKey(options.key);
20
+ if (options?.after !== undefined && options.at !== undefined)
21
+ throw new Error("turn.enqueue takes after or at, not both");
22
+ let due;
23
+ if (options?.after !== undefined) {
24
+ const millis = Duration.toMillis(Duration.fromInputUnsafe(options.after));
25
+ if (!Number.isFinite(millis) || millis < 0)
26
+ throw new Error("turn.enqueue after needs a finite, non-negative duration");
27
+ due = Due.cases.After.make({ millis: Math.ceil(millis) });
28
+ }
29
+ if (options?.at !== undefined)
30
+ due = Due.cases.At.make({ epochMillis: DateTime.toEpochMillis(options.at) });
31
+ return { due, key: options?.key };
32
+ };
33
+ /** A declared failure as the turn's failure outcome; any other error is a defect. */
34
+ const declaredFailure = Effect.fnUntraced(function* ({ isError, encodeError }, error) {
35
+ if (!isError(error))
36
+ return yield* Effect.die(error);
37
+ const value = yield* encodeError(error).pipe(Effect.orDie);
38
+ return yield* Effect.fail({
39
+ outcome: Outcome.cases.Failure.make({ value }),
40
+ state: [],
41
+ complete: false,
42
+ events: [],
43
+ outbox: emptyOutbox,
44
+ });
45
+ });
46
+ /** Job tags each actor type has already warned about, so each warns once per process. */
47
+ const warned = new WeakMap();
48
+ /**
49
+ * Logs once per job tag that a keyed job routes neither cancellation nor dead
50
+ * letters, since an ambiguous cancellation is then only dead-lettered.
51
+ */
52
+ const warnUnrouted = (descriptor, tag) => Effect.suspend(() => {
53
+ const policy = descriptor.jobs.get(tag).policy;
54
+ const tags = warned.get(descriptor) ?? new Set();
55
+ if (tags.has(tag) || policy.onCancelled !== undefined || policy.onDeadLetter !== undefined)
56
+ return Effect.void;
57
+ warned.set(descriptor, tags.add(tag));
58
+ return Effect.logWarning(`Keyed job ${tag} has neither onCancelled nor onDeadLetter; an ambiguous cancellation is only dead-lettered`);
59
+ });
60
+ /**
61
+ * One command member's turn. Its capabilities die once the handler returns
62
+ * and when used from a fiber other than the handler's, because the turn's one
63
+ * connection takes no concurrent statements; forked fibers inherit
64
+ * `InsideTurn`, so the owning fiber is compared as well and a misuse is
65
+ * recorded so a swallowed defect still fails the turn. The turn's services are
66
+ * provided as one merged context, since each nested provide copies it.
67
+ */
68
+ const commandTurn = (descriptor, Turn, handle, codecs, services, actors) => Effect.fnUntraced(function* (request, rows, { head, connections: listConnections, }) {
69
+ const { name, fields } = descriptor;
70
+ let open = true;
71
+ const broadcasts = [];
72
+ const turn = Symbol();
73
+ const dirty = new Set();
74
+ const emitted = [];
75
+ let emittedBytes = 0;
76
+ const loaded = yield* descriptor.state.decodeStored(rows);
77
+ let current = loaded.state;
78
+ if (loaded.upcast)
79
+ for (const key of Object.keys(fields))
80
+ dirty.add(key);
81
+ const set = Effect.fnUntraced(function* (patch) {
82
+ if (!open || (yield* InsideTurn) !== turn)
83
+ return yield* Effect.die(new Error("State capability escaped its turn"));
84
+ for (const key of Object.keys(patch)) {
85
+ if (!(key in fields))
86
+ return yield* Effect.die(new Error(`Undeclared state key: ${key}`));
87
+ dirty.add(key);
88
+ }
89
+ current = yield* descriptor.state.roundTrip({ ...current, ...patch });
90
+ });
91
+ const emit = Effect.fnUntraced(function* (event) {
92
+ if (!open || (yield* InsideTurn) !== turn)
93
+ return yield* Effect.die(new Error("Event capability escaped its turn"));
94
+ const declared = descriptor.events.get(event._tag);
95
+ if (declared === undefined || !Schema.is(declared)(event))
96
+ return yield* Effect.die(new Error(`Undeclared event: ${event._tag}`));
97
+ const { value, version } = yield* descriptor.eventCodecs
98
+ .get(declared.identifier)
99
+ .encode(event)
100
+ .pipe(Effect.orDie);
101
+ emittedBytes += utf8.encode(value).byteLength;
102
+ if (emittedBytes > MAX_EMIT_BYTES)
103
+ return yield* Effect.die(new Error(`Events emitted in one turn exceed ${MAX_EMIT_BYTES} bytes`));
104
+ emitted.push({ tag: declared.identifier, value, version });
105
+ });
106
+ const view = { set };
107
+ const owner = Fiber.getCurrent();
108
+ let misused;
109
+ const escaped = (capability) => Effect.gen(function* () {
110
+ if (!open || (yield* InsideTurn) !== turn)
111
+ return yield* Effect.die(new Error(`${capability} capability escaped its turn`));
112
+ if (Fiber.getCurrent() !== owner) {
113
+ misused = `${capability} capability used from a fiber other than its turn's; timeout, race, and concurrent combinators run on other fibers`;
114
+ return yield* Effect.die(new Error(misused));
115
+ }
116
+ });
117
+ const wroteTables = new Set();
118
+ const wroteBlobs = new Set();
119
+ const bindings = yield* Effect.context();
120
+ let tables;
121
+ let blobs;
122
+ /**
123
+ * Binds the turn's owned tables on first use, in the context the turn
124
+ * started with. Most turns touch no table, and binding builds the
125
+ * actor's row predicates.
126
+ */
127
+ const tableAccess = () => (tables ??= Effect.runSyncWith(bindings)(actors.tables({
128
+ ref: request.ref,
129
+ placement: descriptor.placement,
130
+ tables: descriptor.tables,
131
+ guard: escaped("Table"),
132
+ wrote: (table) => wroteTables.add(table),
133
+ }, true)));
134
+ /** Binds the turn's blobs on first use, like `tableAccess`. */
135
+ const blobAccess = () => (blobs ??= Effect.runSyncWith(bindings)(actors.blobs({
136
+ ref: request.ref,
137
+ placement: descriptor.placement,
138
+ blobs: descriptor.blobs,
139
+ guard: escaped("Blob"),
140
+ wrote: (blobName) => wroteBlobs.add(blobName),
141
+ maxBytes: descriptor.policy.blobMaxBytes,
142
+ maxEntries: descriptor.policy.blobMaxEntries,
143
+ timeoutMs: descriptor.policy.executionMs,
144
+ }, true)));
145
+ for (const key of Object.keys(fields))
146
+ Object.defineProperty(view, key, { enumerable: true, get: () => current[key] });
147
+ const outbox = openOutbox({
148
+ sender: request.ref,
149
+ commandId: request.commandId,
150
+ head,
151
+ onBehalfOf: Option.getOrUndefined(principal(request.caller)),
152
+ });
153
+ const mint = Effect.fnUntraced(function* (child) {
154
+ yield* escaped("Mint");
155
+ const target = descriptorOf(child);
156
+ if (target === undefined || !target.mintable)
157
+ return yield* Effect.die(new Error("turn.mint needs an unkeyed actor that declares createdBy"));
158
+ if (target.parent !== undefined && target.parent.name !== name)
159
+ return yield* Effect.die(new Error(`turn.mint(${target.name}) needs a turn of its parent ${target.parent.name}`));
160
+ const proof = outbox.nextMint();
161
+ const minted = yield* actors.mintChildId({
162
+ parent: descriptor.singleton ? { ...request.ref, id: "" } : request.ref,
163
+ commandId: request.commandId,
164
+ ordinal: proof.ordinal,
165
+ child: target.name,
166
+ });
167
+ const id = target.parent === undefined ? minted : childId({ parent: request.ref.id, local: minted });
168
+ outbox.minted(ActorRef.make({ tenant: request.ref.tenant, actor: target.name, id }), target.policy.createdBy, proof);
169
+ return id;
170
+ });
171
+ const enqueue = Effect.fnUntraced(function* (instance, options) {
172
+ if (!open || (yield* InsideTurn) !== turn)
173
+ return yield* Effect.die(new Error("Job capability escaped its turn"));
174
+ const declared = descriptor.jobs.get(instance._tag);
175
+ if (declared === undefined)
176
+ return yield* Effect.die(new Error(`Unbound job: ${instance._tag}`));
177
+ const scheduled = yield* Effect.sync(() => enqueueSchedule(options));
178
+ if (scheduled.key !== undefined)
179
+ yield* warnUnrouted(descriptor, instance._tag);
180
+ const { value, version } = yield* declared.codec.encode(instance).pipe(Effect.orDie);
181
+ outbox.enqueue({
182
+ job: instance._tag,
183
+ payload: value,
184
+ version,
185
+ capped: declared.policy.perActor !== undefined,
186
+ ...scheduled,
187
+ });
188
+ });
189
+ const changeSubscription = (op) => Effect.fnUntraced(function* (declared, id, options) {
190
+ yield* escaped("Subscription");
191
+ if (!descriptor.subscriptions.includes(declared) || declared.route !== undefined)
192
+ return yield* Effect.die(new Error(`${declared.tag} is not a dynamic subscription of ${name}`));
193
+ const source = descriptorOf(declared.source);
194
+ const from = options?.from ?? "now";
195
+ if (from !== "now" && from !== "start" && !isCursor(from))
196
+ return yield* Effect.die(new Error(`subscribe from is "now", "start", or a cursor, not ${from}`));
197
+ outbox.subscribe({
198
+ subscription: declared.tag,
199
+ source: ActorRef.make({
200
+ tenant: request.ref.tenant,
201
+ actor: declared.source.name,
202
+ id: yield* source.decodeId(id).pipe(Effect.orDie),
203
+ }),
204
+ op,
205
+ from,
206
+ events: declared.events.map((event) => event.identifier),
207
+ });
208
+ });
209
+ const cancelJob = Effect.fnUntraced(function* (key) {
210
+ if (!open || (yield* InsideTurn) !== turn)
211
+ return yield* Effect.die(new Error("Job capability escaped its turn"));
212
+ yield* Effect.sync(() => jobKey(key));
213
+ outbox.cancelJob(key);
214
+ });
215
+ const context = {
216
+ id: request.ref.id,
217
+ ref: request.ref,
218
+ caller: request.caller,
219
+ principal: principal(request.caller),
220
+ commandId: request.commandId,
221
+ state: Object.freeze(view),
222
+ emit,
223
+ rows: (table) => tableAccess().rows(table),
224
+ group: ((build) => Effect.suspend(() => tableAccess().group(build))),
225
+ blob: (declared) => blobAccess()(declared),
226
+ mint,
227
+ enqueue,
228
+ cancelJob,
229
+ broadcast: broadcastsTo({ descriptor, broadcasts, guard: escaped }),
230
+ subscribe: changeSubscription("subscribe"),
231
+ unsubscribe: (declared, id) => changeSubscription("remove")(declared, id),
232
+ connections: (member) => Effect.gen(function* () {
233
+ yield* escaped("Connections");
234
+ if (listConnections === undefined)
235
+ return [];
236
+ return (yield* listConnections(member.tag)).map(({ connectionId, caller }) => ({
237
+ connectionId,
238
+ caller,
239
+ }));
240
+ }),
241
+ };
242
+ return yield* Effect.gen(function* () {
243
+ const input = yield* codecs.decodePayload(request.payload).pipe(Effect.orDie);
244
+ const output = yield* handle(input.value);
245
+ if (misused !== undefined)
246
+ return yield* Effect.die(new Error(misused));
247
+ const uncreated = outbox.uncreated();
248
+ if (uncreated !== undefined)
249
+ return yield* Effect.die(new Error(`Minted actor ${uncreated.actor}/${uncreated.id} has no creating intent`));
250
+ const keyed = outbox.keyedCreation();
251
+ if (keyed !== undefined)
252
+ return yield* Effect.die(new Error(`Minted actor ${keyed.actor}/${keyed.id} has a keyed creating intent`));
253
+ const value = yield* codecs.encodeSuccess({ value: output }).pipe(Effect.orDie);
254
+ return {
255
+ outcome: Outcome.cases.Success.make({ value }),
256
+ state: yield* descriptor.state.writes(current, dirty),
257
+ complete: loaded.upcast,
258
+ events: emitted,
259
+ outbox: outbox.close(),
260
+ broadcasts,
261
+ writes: { tables: [...wroteTables], blobs: [...wroteBlobs] },
262
+ };
263
+ }).pipe(Effect.catch((error) => declaredFailure(codecs, error)), Effect.ensuring(Effect.sync(() => {
264
+ open = false;
265
+ outbox.close();
266
+ })), Effect.provideContext(services.pipe(Context.add(InsideTurn, turn), Context.add(InTurn, outbox.marker), Context.add(Turn, context))));
267
+ });
268
+ /**
269
+ * A reducer's turns. `reduce` receives its own decoded copy of state, so
270
+ * mutating it in place cannot hide a change, and its result round-trips
271
+ * through the state schema. A batched reducer's queued inputs are combined in
272
+ * order and reduced once; it declares no errors, so a combined turn fails only
273
+ * by defect.
274
+ */
275
+ const reducerTurns = (descriptor, reducer) => {
276
+ const codecs = descriptor.codecs.get(reducer.tag);
277
+ const reduceOnce = Effect.fnUntraced(function* (rows, input) {
278
+ const loaded = yield* descriptor.state.decodeStored(rows);
279
+ const given = yield* descriptor.state.roundTrip(loaded.state);
280
+ const reduced = reducer.reduce(given, input);
281
+ if (Result.isFailure(reduced))
282
+ return yield* declaredFailure(codecs, reduced.failure);
283
+ const next = yield* descriptor.state.roundTrip(reduced.success);
284
+ const dirty = new Set(Object.keys(descriptor.fields).filter((key) => loaded.upcast || !descriptor.state.equivalences[key](loaded.state[key], next[key])));
285
+ const value = yield* codecs
286
+ .encodeSuccess({ value: reducer.batch === undefined ? next : undefined })
287
+ .pipe(Effect.orDie);
288
+ return {
289
+ outcome: Outcome.cases.Success.make({ value }),
290
+ state: yield* descriptor.state.writes(next, dirty),
291
+ complete: loaded.upcast,
292
+ events: [],
293
+ outbox: emptyOutbox,
294
+ };
295
+ });
296
+ const decodePayload = (request) => codecs.decodePayload(request.payload).pipe(Effect.orDie, Effect.map((input) => input.value));
297
+ const single = {
298
+ internal: false,
299
+ handler: false,
300
+ run: Effect.fnUntraced(function* (request, rows) {
301
+ return yield* reduceOnce(rows, yield* decodePayload(request));
302
+ }),
303
+ };
304
+ const batch = reducer.batch;
305
+ if (batch === undefined)
306
+ return single;
307
+ return {
308
+ ...single,
309
+ merge: Effect.fnUntraced(function* (requests, rows) {
310
+ const inputs = yield* Effect.forEach(requests, decodePayload);
311
+ const combined = inputs.reduce((first, second) => batch.combine(first, second));
312
+ return yield* reduceOnce(rows, combined).pipe(Effect.catch(() => Effect.die(new Error(`Batched reducer ${reducer.tag} failed`))));
313
+ }),
314
+ };
315
+ };
316
+ /** Every command and reducer turn of one activation, keyed by tag. */
317
+ export const turnsOf = ({ descriptor, Turn, handlers, services, actors, }) => Effect.gen(function* () {
318
+ const commands = new Map();
319
+ for (const member of descriptor.commands) {
320
+ const handle = handlers[member.tag];
321
+ if (handle === undefined)
322
+ return yield* Effect.die(new Error(`Missing handler ${member.tag}`));
323
+ commands.set(member.tag, {
324
+ internal: descriptor.internalMembers.has(member),
325
+ handler: descriptor.handlerTags.has(member.tag),
326
+ run: commandTurn(descriptor, Turn, handle, descriptor.codecs.get(member.tag), services, actors),
327
+ });
328
+ }
329
+ for (const reducer of descriptor.reducers)
330
+ commands.set(reducer.tag, reducerTurns(descriptor, reducer));
331
+ return commands;
332
+ });
@@ -0,0 +1,16 @@
1
+ import { Context, Effect } from "effect";
2
+ import type { RegisteredWorkflow } from "../runtime/members.ts";
3
+ import type { Handler } from "./codecs.ts";
4
+ import type { Descriptor } from "./descriptor.ts";
5
+ /**
6
+ * Every workflow's body. A body runs outside turns with the layer's context
7
+ * minus its `Scope`, since a body's scope is its run's, and calls as the
8
+ * execution's recorded principal through a `System({ source: "workflow" })`
9
+ * caller.
10
+ */
11
+ export declare const workflowsOf: ({ descriptor, Workflow, bodies, services, }: {
12
+ readonly descriptor: Descriptor;
13
+ readonly Workflow: Context.Key<object, object>;
14
+ readonly bodies: Readonly<Record<string, Handler>>;
15
+ readonly services: Context.Context<never>;
16
+ }) => Effect.Effect<ReadonlyMap<string, RegisteredWorkflow>, never, never>;
@@ -0,0 +1,37 @@
1
+ import { Context, Effect, Option } from "effect";
2
+ import { CurrentCaller, System, Tenant } from "../identity/caller.js";
3
+ import { checkExecutionKey } from "../identity/execution.js";
4
+ /**
5
+ * Every workflow's body. A body runs outside turns with the layer's context
6
+ * minus its `Scope`, since a body's scope is its run's, and calls as the
7
+ * execution's recorded principal through a `System({ source: "workflow" })`
8
+ * caller.
9
+ */
10
+ export const workflowsOf = ({ descriptor, Workflow, bodies, services, }) => Effect.gen(function* () {
11
+ const registered = new Map();
12
+ for (const member of descriptor.workflows) {
13
+ const body = bodies[member.tag];
14
+ if (body === undefined)
15
+ return yield* Effect.die(new Error(`Missing workflow ${member.tag}`));
16
+ const codecs = descriptor.codecs.get(member.tag);
17
+ registered.set(member.tag, {
18
+ member,
19
+ steps: new Map(member.registry.steps),
20
+ key: (payload, fallback) => Effect.gen(function* () {
21
+ if (member.key === undefined)
22
+ return fallback;
23
+ const input = yield* codecs.decodePayload(payload);
24
+ const key = member.key(input.value);
25
+ yield* checkExecutionKey(key);
26
+ return key;
27
+ }).pipe(Effect.orDie),
28
+ run: (payload, context) => codecs.decodePayload(payload).pipe(Effect.orDie, Effect.flatMap((input) => body(input.value)), Effect.exit, Effect.provideContext(Context.merge(Context.make(Workflow, context), services).pipe(Context.add(Tenant, context.ref.tenant), Context.add(CurrentCaller, System.make({
29
+ source: "workflow",
30
+ ref: context.ref,
31
+ onBehalfOf: Option.getOrUndefined(context.principal),
32
+ }))))),
33
+ encodeExit: descriptor.workflowExits.get(member.tag).encode,
34
+ });
35
+ }
36
+ return registered;
37
+ });
@@ -0,0 +1,47 @@
1
+ import { Effect, Option, Schema } from "effect";
2
+ import type { ServedDefinition, ServedMember } from "../actor/served.ts";
3
+ import { ActorError } from "../errors/actor.ts";
4
+ import { ConsistencyToken } from "./clock.ts";
5
+ import type { ClientOptions, QueryOptions } from "./make.ts";
6
+ import { type Failure, type Reply } from "./transport.ts";
7
+ /** A failed attempt, with the response it came from when there was one. */
8
+ interface Attempted {
9
+ readonly failure: Failure;
10
+ readonly reply: Reply | undefined;
11
+ }
12
+ /** `path` under `baseUrl`, without doubling the slash between them. */
13
+ export declare const joinUrl: ({ baseUrl, path }: {
14
+ readonly baseUrl: string;
15
+ readonly path: string;
16
+ }) => string;
17
+ /** A random RFC 9562 UUID of `version` 4 or 7; a v7 carries the local clock in its first 48 bits. */
18
+ export declare const uuid: (version: 4 | 7) => Effect.Effect<string, never, never>;
19
+ export declare const declaredDecoder: (member: ServedMember) => (body: Schema.Json) => Option.Option<Failure>;
20
+ /**
21
+ * The transport attempt policy of one actor type's client at one base URL:
22
+ * fresh headers and credentials for each attempt, the database clock and
23
+ * retry window its ids are minted from, which minted ids might have been
24
+ * admitted, bounded retries under one id, and the offline queue. The typed
25
+ * handle projection lives in `clientOf`; nothing here knows member types.
26
+ */
27
+ export declare const callsOf: ({ definition, options, }: {
28
+ readonly definition: ServedDefinition;
29
+ readonly options: ClientOptions;
30
+ }) => {
31
+ authorization: Effect.Effect<string | undefined, never, never>;
32
+ token: ConsistencyToken;
33
+ openEvents: (path: Effect.Effect<string, ActorError>, signal: AbortSignal, init: {
34
+ readonly method?: string;
35
+ readonly body?: string | undefined;
36
+ readonly headers: Readonly<Record<string, string>>;
37
+ }) => Effect.Effect<Response, ActorError, never>;
38
+ mint: Effect.Effect<string, Failure, never>;
39
+ waiting: <A>(work: Effect.Effect<A, Failure>, call: QueryOptions, commandId: () => string | undefined) => Promise<A>;
40
+ withRetries: <A>(attempt: Effect.Effect<A, Attempted>, call: QueryOptions, commandId: () => string | undefined, after?: Promise<void>) => Promise<A>;
41
+ asAttempt: (commandId: string | undefined) => (error: Attempted | Failure) => Attempted;
42
+ poster: (member: ServedMember) => (path: string, payload: string | undefined, commandId: string | undefined) => Effect.Effect<unknown, Attempted, never>;
43
+ queue: import("./offline/queue.ts").CommandQueue<unknown> | undefined;
44
+ /** A fresh command id, retried like a call until it is minted. */
45
+ commandId: () => Promise<string>;
46
+ };
47
+ export {};