@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,182 @@
1
+ import { type DateTime, type Effect, Schema } from "effect";
2
+ import { ActorRef } from "../identity/caller.ts";
3
+ import type { AnyCommand } from "./command.ts";
4
+ import type { EventClass } from "./event.ts";
5
+ /** What a subscription needs of its source: an actor definition's name and declared events. */
6
+ export interface SourceDefinition {
7
+ readonly name: string;
8
+ readonly events: ReadonlyArray<EventClass>;
9
+ }
10
+ /** One committed source event, as the subscriber's handler receives it. */
11
+ export interface DeliveredEvent<E> {
12
+ readonly _tag: "Event";
13
+ /** The subscription's tag. */
14
+ readonly subscription: string;
15
+ /** The publisher. */
16
+ readonly source: ActorRef;
17
+ /** The event's cursor in the publisher's stream. */
18
+ readonly cursor: string;
19
+ readonly event: E;
20
+ /** The publisher's command that emitted it. */
21
+ readonly commandId: string;
22
+ readonly timestamp: DateTime.Utc;
23
+ }
24
+ /** Source history after `after` was pruned; the next delivery comes after `resumeAfter`. */
25
+ export interface DeliveredGap {
26
+ readonly _tag: "RetentionGap";
27
+ readonly subscription: string;
28
+ readonly source: ActorRef;
29
+ readonly after: string;
30
+ readonly resumeAfter: string;
31
+ }
32
+ /** A dynamic subscription the source refused; it is no longer active. */
33
+ export interface DeliveredRejection {
34
+ readonly _tag: "Rejected";
35
+ readonly subscription: string;
36
+ readonly source: ActorRef;
37
+ readonly reason: "UnknownCursor";
38
+ readonly cursor: string;
39
+ }
40
+ /** One subscription delivery: a handler receives exactly one per turn. */
41
+ export type Delivery<E> = DeliveredEvent<E> | DeliveredGap | DeliveredRejection;
42
+ declare const deliverySchema: <E extends ReadonlyArray<EventClass>>(events: E) => Schema.Union<readonly [Schema.TaggedStruct<"Event", {
43
+ readonly subscription: Schema.String;
44
+ readonly source: Schema.Struct<{
45
+ readonly tenant: Schema.NonEmptyString;
46
+ readonly actor: Schema.NonEmptyString;
47
+ readonly id: Schema.NonEmptyString;
48
+ }>;
49
+ readonly cursor: Schema.String;
50
+ readonly event: Schema.Union<E>;
51
+ readonly commandId: Schema.String;
52
+ readonly timestamp: Schema.DateTimeUtc;
53
+ }>, Schema.TaggedStruct<"RetentionGap", {
54
+ readonly subscription: Schema.String;
55
+ readonly source: Schema.Struct<{
56
+ readonly tenant: Schema.NonEmptyString;
57
+ readonly actor: Schema.NonEmptyString;
58
+ readonly id: Schema.NonEmptyString;
59
+ }>;
60
+ readonly after: Schema.String;
61
+ readonly resumeAfter: Schema.String;
62
+ }>, Schema.TaggedStruct<"Rejected", {
63
+ readonly subscription: Schema.String;
64
+ readonly source: Schema.Struct<{
65
+ readonly tenant: Schema.NonEmptyString;
66
+ readonly actor: Schema.NonEmptyString;
67
+ readonly id: Schema.NonEmptyString;
68
+ }>;
69
+ readonly reason: Schema.Literal<"UnknownCursor">;
70
+ readonly cursor: Schema.String;
71
+ }>]>;
72
+ /**
73
+ * The payload schema of a subscription handler, which also records what it
74
+ * delivers: `events` of `source`. A subscription names it as its `delivery`,
75
+ * so the source and events are declared once, and the handler command can be
76
+ * declared before the subscription that references it.
77
+ */
78
+ export type DeliverySchema<S extends SourceDefinition = SourceDefinition, E extends ReadonlyArray<EventClass> = ReadonlyArray<EventClass>> = ReturnType<typeof deliverySchema<E>> & {
79
+ readonly source: S;
80
+ readonly events: E;
81
+ };
82
+ /**
83
+ * `Actor.Delivery`: the payload schema of a subscription handler, one delivery
84
+ * of `events` from `source`. Throws when `events` is empty or names an event
85
+ * `source` does not declare, or one twice.
86
+ *
87
+ * @example
88
+ * const OrderDelivery = Actor.Delivery({ source: Orders, events: [Placed] })
89
+ * const Record = Actor.command("Record", { payload: OrderDelivery })
90
+ */
91
+ export declare const Delivery: <const S extends SourceDefinition, const E extends ReadonlyArray<S["events"][number]>>(options: {
92
+ readonly source: S;
93
+ readonly events: E;
94
+ }) => DeliverySchema<S, E>;
95
+ /** Declared as a method so a route of specific events still fits `AnySubscription`. */
96
+ type RouteFunction<E> = {
97
+ route(event: E, source: ActorRef): string;
98
+ }["route"];
99
+ /** A routed subscription's route: the subscriber's id for one event, or every event to the tenant's singleton. */
100
+ export type Route<E> = RouteFunction<E> | {
101
+ readonly _tag: "Singleton";
102
+ };
103
+ /**
104
+ * A declared subscription of one subscriber type, with the source and events
105
+ * of its delivery. `Routed` is true when it has a `route`, so `turn.subscribe`
106
+ * accepts only dynamic ones.
107
+ */
108
+ export interface Subscription<Tag extends string, E extends ReadonlyArray<EventClass>, Routed extends boolean, H extends AnyCommand = AnyCommand> {
109
+ readonly kind: "subscription";
110
+ readonly tag: Tag;
111
+ /** The source definition, typed loosely so a subscriber's type doesn't embed its source's. */
112
+ readonly source: SourceDefinition;
113
+ readonly events: E;
114
+ readonly retired: ReadonlyArray<string>;
115
+ readonly handler: H;
116
+ readonly route: Route<E[number]["Type"]> | undefined;
117
+ readonly routed: Routed;
118
+ }
119
+ /** Any subscription, whatever its source and events. */
120
+ export type AnySubscription = Subscription<string, ReadonlyArray<EventClass>, boolean>;
121
+ /** A handler command whose payload doesn't accept the subscription's deliveries fails to compile. */
122
+ type Accepting<H extends AnyCommand, E> = [Delivery<E>] extends [H["payload"]["Type"]] ? unknown : {
123
+ readonly "The handler's payload must accept the subscription's delivery": never;
124
+ };
125
+ interface SubscriptionOptions<D extends DeliverySchema, H> {
126
+ /** The source and events this subscription delivers, declared once with `Actor.Delivery`. */
127
+ readonly delivery: D;
128
+ /** The `internal` command each delivery runs as a turn; several subscriptions may share it. */
129
+ readonly handler: H;
130
+ /** Event tags this subscription once delivered; rows carrying them skip them. */
131
+ readonly retired?: ReadonlyArray<string>;
132
+ }
133
+ /**
134
+ * Declares a subscription: every committed event its `delivery` names reaches
135
+ * `handler`, an internal command of the subscriber, as an ordinary command
136
+ * turn. With `route` it is routed: every source of the type in the
137
+ * tenant, to the subscriber `route` names. Without it, it is dynamic: only the
138
+ * sources a subscriber's turn subscribes to.
139
+ */
140
+ export interface SubscriptionFunction {
141
+ <const Tag extends string, const D extends DeliverySchema, const H extends AnyCommand>(tag: Tag, options: SubscriptionOptions<D, H & Accepting<H, D["events"][number]["Type"]>> & {
142
+ readonly route: Route<D["events"][number]["Type"]>;
143
+ }): Subscription<Tag, D["events"], true, H>;
144
+ <const Tag extends string, const D extends DeliverySchema, const H extends AnyCommand>(tag: Tag, options: SubscriptionOptions<D, H & Accepting<H, D["events"][number]["Type"]>>): Subscription<Tag, D["events"], false, H>;
145
+ }
146
+ /**
147
+ * `SubscriptionMember.make` is `Actor.subscription`; see `SubscriptionFunction`
148
+ * for the routed and dynamic forms. Throws on an invalid tag, a delivery that
149
+ * is not an `Actor.Delivery`, a retired-and-delivered tag, a handler that is
150
+ * not a command, or a `route` that is neither a function nor `Actor.singleton`.
151
+ *
152
+ * @example
153
+ * const OnPosted = Actor.subscription("OnPosted", {
154
+ * delivery: PostedDelivery,
155
+ * handler: Record,
156
+ * route: (event, source) => source.id,
157
+ * })
158
+ */
159
+ export declare const SubscriptionMember: {
160
+ make: SubscriptionFunction;
161
+ };
162
+ /** Where a new dynamic subscription starts: after its registration, from the first retained event, or after a cursor. */
163
+ export type SubscribeFrom = "now" | "start" | (string & {});
164
+ /** The part of a command turn that subscribes to and unsubscribes from sources; see `X.Turn`. */
165
+ export interface SubscribeContext<Subs extends AnySubscription> {
166
+ /**
167
+ * Starts following `id` through the dynamic subscription `subscription`
168
+ * when this turn commits; a declared failure or rollback discards it.
169
+ * `from` defaults to `"now"`: events committed after the registration
170
+ * reaches the source.
171
+ */
172
+ readonly subscribe: (subscription: Extract<Subs, {
173
+ readonly routed: false;
174
+ }>, id: string, options?: {
175
+ readonly from?: SubscribeFrom;
176
+ }) => Effect.Effect<void>;
177
+ /** Stops following `id` when this turn commits; no later delivery of it runs the handler. */
178
+ readonly unsubscribe: (subscription: Extract<Subs, {
179
+ readonly routed: false;
180
+ }>, id: string) => Effect.Effect<void>;
181
+ }
182
+ export {};
@@ -0,0 +1,91 @@
1
+ import { Predicate, Schema } from "effect";
2
+ import { ActorRef } from "../identity/caller.js";
3
+ const deliveryFields = { subscription: Schema.String, source: ActorRef };
4
+ const deliverySchema = (events) => Schema.Union([
5
+ Schema.TaggedStruct("Event", {
6
+ ...deliveryFields,
7
+ cursor: Schema.String,
8
+ event: Schema.Union(events),
9
+ commandId: Schema.String,
10
+ timestamp: Schema.DateTimeUtc,
11
+ }),
12
+ Schema.TaggedStruct("RetentionGap", {
13
+ ...deliveryFields,
14
+ after: Schema.String,
15
+ resumeAfter: Schema.String,
16
+ }),
17
+ Schema.TaggedStruct("Rejected", {
18
+ ...deliveryFields,
19
+ reason: Schema.Literal("UnknownCursor"),
20
+ cursor: Schema.String,
21
+ }),
22
+ ]);
23
+ /**
24
+ * `Actor.Delivery`: the payload schema of a subscription handler, one delivery
25
+ * of `events` from `source`. Throws when `events` is empty or names an event
26
+ * `source` does not declare, or one twice.
27
+ *
28
+ * @example
29
+ * const OrderDelivery = Actor.Delivery({ source: Orders, events: [Placed] })
30
+ * const Record = Actor.command("Record", { payload: OrderDelivery })
31
+ */
32
+ export const Delivery = (options) => {
33
+ if (options.events.length === 0)
34
+ throw new Error(`A delivery of ${options.source.name} names no event`);
35
+ const tags = new Set();
36
+ for (const event of options.events) {
37
+ if (!options.source.events.includes(event))
38
+ throw new Error(`${options.source.name} does not declare event ${event.identifier}`);
39
+ if (tags.has(event.identifier))
40
+ throw new Error(`A delivery of ${options.source.name} lists ${event.identifier} twice`);
41
+ tags.add(event.identifier);
42
+ }
43
+ return Object.assign(deliverySchema(options.events), {
44
+ source: options.source,
45
+ events: options.events,
46
+ });
47
+ };
48
+ const SUBSCRIPTION_TAG = /^[A-Za-z][A-Za-z0-9]{0,79}$/;
49
+ const subscription = ((tag, options) => {
50
+ if (!SUBSCRIPTION_TAG.test(tag))
51
+ throw new Error(`Subscription tag ${tag} must be 1-80 letters and digits, starting with a letter`);
52
+ const { delivery } = options;
53
+ if (!Predicate.hasProperty(delivery, "source") || !Predicate.hasProperty(delivery, "events"))
54
+ throw new Error(`Subscription ${tag}'s delivery must be an Actor.Delivery schema`);
55
+ const tags = new Set(delivery.events.map((event) => event.identifier));
56
+ const retired = options.retired ?? [];
57
+ for (const old of retired)
58
+ if (tags.has(old))
59
+ throw new Error(`Subscription ${tag} both delivers and retires ${old}`);
60
+ if (options.handler.kind !== "command")
61
+ throw new Error(`Subscription ${tag}'s handler must be a command`);
62
+ const route = options.route;
63
+ if (route !== undefined &&
64
+ !Predicate.isFunction(route) &&
65
+ !Predicate.isTagged(route, "Singleton"))
66
+ throw new Error(`Subscription ${tag}'s route is a function or Actor.singleton`);
67
+ return {
68
+ kind: "subscription",
69
+ tag,
70
+ source: delivery.source,
71
+ events: delivery.events,
72
+ retired,
73
+ handler: options.handler,
74
+ route,
75
+ routed: route !== undefined,
76
+ };
77
+ });
78
+ /**
79
+ * `SubscriptionMember.make` is `Actor.subscription`; see `SubscriptionFunction`
80
+ * for the routed and dynamic forms. Throws on an invalid tag, a delivery that
81
+ * is not an `Actor.Delivery`, a retired-and-delivered tag, a handler that is
82
+ * not a command, or a `route` that is neither a function nor `Actor.singleton`.
83
+ *
84
+ * @example
85
+ * const OnPosted = Actor.subscription("OnPosted", {
86
+ * delivery: PostedDelivery,
87
+ * handler: Record,
88
+ * route: (event, source) => source.id,
89
+ * })
90
+ */
91
+ export const SubscriptionMember = { make: subscription };
@@ -0,0 +1,99 @@
1
+ import type { Duration, Effect, Option, Schema } from "effect";
2
+ import type { StepIdentity } from "../contexts/workflow.ts";
3
+ import type { DeclaredError, Member, ValueSchema } from "./command.ts";
4
+ import type { EventClass } from "./event.ts";
5
+ /** A version marker's supported range: new executions record `current`, and executions that recorded `min` or later still replay; `ctx.version(name)` reads the recorded value. */
6
+ export interface VersionRange {
7
+ readonly current: number;
8
+ readonly min: number;
9
+ }
10
+ /** One constructor as the manifest records it. */
11
+ export interface StepEntry {
12
+ readonly name: string;
13
+ readonly kind: StepIdentity["kind"];
14
+ /** An activity's payload schema; other kinds read none. */
15
+ readonly payload?: ValueSchema;
16
+ /** The schemas of the value the step records: an activity's or race's success and error, a wait's event. */
17
+ readonly result: ReadonlyArray<ValueSchema>;
18
+ /** The event tag a wait observes. */
19
+ readonly event?: string;
20
+ }
21
+ /** A workflow's module-level constructors, registered in declaration order. */
22
+ export interface StepRegistry {
23
+ readonly steps: Map<string, StepEntry>;
24
+ }
25
+ /** A method signature, so a workflow with a specific payload is still an `AnyWorkflow`. */
26
+ interface KeyFunction<Payload extends ValueSchema> {
27
+ key(payload: Payload["Type"]): string;
28
+ }
29
+ type KeyOf<Payload extends ValueSchema> = KeyFunction<Payload>["key"];
30
+ /**
31
+ * A durable workflow member: a body the runtime replays from recorded steps.
32
+ * Its constructors (`step`, `sleep`, `wait`, `race`) are created at module
33
+ * level, and each records its result once per execution.
34
+ */
35
+ export interface Workflow<Tag extends string, Payload extends ValueSchema, Success extends ValueSchema, Error extends DeclaredError> extends Member<"workflow", Tag, Payload, Success, Error> {
36
+ /** The execution key; the start's command id when omitted. */
37
+ readonly key: KeyOf<Payload> | undefined;
38
+ /** Version markers by name, for branching the body on how an old execution started. */
39
+ readonly versions: Readonly<Record<string, VersionRange>>;
40
+ /** The constructors created on this workflow, so the layer can check that a body uses only declared steps. */
41
+ readonly registry: StepRegistry;
42
+ /** An activity: `run(payload, execute)` records `execute`'s exit once per execution. */
43
+ readonly step: <const Name extends string, P extends ValueSchema = Schema.Void, S extends ValueSchema = Schema.Void, E extends DeclaredError = Schema.Never>(name: Name, options?: {
44
+ readonly payload?: P;
45
+ readonly success?: S;
46
+ readonly error?: E;
47
+ }) => Step<Name, P, S, E>;
48
+ /** A durable clock: calling it with a duration sleeps across restarts. */
49
+ readonly sleep: <const Name extends string>(name: Name) => Sleep<Name>;
50
+ /** An owner-event wait: the first matching event after the execution's cursor. */
51
+ readonly wait: <const Name extends string, Ev extends EventClass>(name: Name, event: Ev) => Wait<Name, Ev>;
52
+ /** The first of several effects to succeed, recorded so a replay returns the same winner. */
53
+ readonly race: <const Name extends string, S extends ValueSchema, E extends DeclaredError = Schema.Never>(name: Name, options: {
54
+ readonly success: S;
55
+ readonly error?: E;
56
+ }) => Race<Name, S, E>;
57
+ }
58
+ /** Any workflow, whatever its schemas. */
59
+ export type AnyWorkflow = Workflow<string, ValueSchema, ValueSchema, DeclaredError>;
60
+ /** An activity constructor: `run` executes once per execution and replays its recorded exit afterwards. */
61
+ export interface Step<Name extends string, P extends ValueSchema, S extends ValueSchema, E extends DeclaredError> {
62
+ readonly name: Name;
63
+ readonly kind: "activity";
64
+ readonly run: <R>(payload: P["Type"], execute: (payload: P["Type"]) => Effect.Effect<S["Type"], E["Type"], R>) => Effect.Effect<S["Type"], E["Type"], R>;
65
+ }
66
+ /** A durable clock: calling it with a duration sleeps across restarts. */
67
+ export interface Sleep<Name extends string> {
68
+ (duration: Duration.Input): Effect.Effect<void>;
69
+ readonly stepName: Name;
70
+ readonly kind: "clock";
71
+ }
72
+ /**
73
+ * An owner-event wait: resolves with the first matching event after the
74
+ * execution's cursor, or none on timeout. A matched event is recorded as the
75
+ * event class's current version encodes it.
76
+ */
77
+ export interface Wait<Name extends string, Ev extends EventClass> {
78
+ (options?: {
79
+ readonly where?: (event: Ev["Type"]) => boolean;
80
+ readonly timeout?: Duration.Input;
81
+ }): Effect.Effect<Option.Option<Ev["Type"]>>;
82
+ readonly stepName: Name;
83
+ readonly kind: "wait";
84
+ }
85
+ /**
86
+ * A recorded race of effects: the first to succeed wins, and a replay returns
87
+ * the same winner. Only a winner or a declared failure is recorded; a
88
+ * suspension, defect, or interruption leaves the race to run again on replay.
89
+ */
90
+ export interface Race<Name extends string, S extends ValueSchema, E extends DeclaredError> {
91
+ readonly name: Name;
92
+ readonly kind: "deferred";
93
+ readonly run: <R>(effects: ReadonlyArray<Effect.Effect<S["Type"], E["Type"], R>>) => Effect.Effect<S["Type"], E["Type"], R>;
94
+ }
95
+ /** Whether a member is a workflow. */
96
+ export declare const isWorkflow: (member: {
97
+ readonly kind: string;
98
+ }) => member is AnyWorkflow;
99
+ export {};
@@ -0,0 +1,2 @@
1
+ /** Whether a member is a workflow. */
2
+ export const isWorkflow = (member) => member.kind === "workflow";
@@ -0,0 +1,35 @@
1
+ import type { Effect } from "effect";
2
+ import type { ActorRef, Caller } from "../identity/caller.ts";
3
+ /** One question an access policy answers: may `caller` do `command` on the actor `ref`? */
4
+ export interface AccessRequest {
5
+ readonly caller: Caller;
6
+ readonly ref: ActorRef;
7
+ readonly command: string;
8
+ /**
9
+ * What is being asked: `command` for commands and reducers, `query` for
10
+ * queries, `open` for a connection, `stream` for a stream, `feed` for an
11
+ * event feed (with `command` set to the event tag), `watch` for a query
12
+ * watch (with `command` set to the query tag), `reauthorize` for a live
13
+ * session's periodic check, and `content` for a content operation on the
14
+ * actor, with `command` set to `<blob>.grant` or `<blob>.get`, and `fleet`
15
+ * for a fleet view subscription, with `command` set to the view and `ref`
16
+ * naming the caller's tenant and the view's source actor type, with the view
17
+ * as its id, since a fleet read spans every actor of the type. A policy
18
+ * should deny kinds it does not know.
19
+ */
20
+ readonly kind: "command" | "query" | "open" | "stream" | "feed" | "watch" | "reauthorize" | "content" | "fleet";
21
+ /** On `reauthorize`, what the session is: an `open` connection, a `stream`, a `feed`, a `watch`, or a `fleet` subscription. */
22
+ readonly of?: "open" | "stream" | "feed" | "watch" | "fleet";
23
+ }
24
+ /**
25
+ * Decides whether a caller may do what a request names. The global
26
+ * `Actors.layer({ authorize })` hook and an actor's own `access` share this
27
+ * shape, and when both exist both must allow.
28
+ */
29
+ export type Access = (request: AccessRequest) => boolean | Effect.Effect<boolean>;
30
+ /**
31
+ * Allows every caller every kind of request, `Anonymous` visitors under
32
+ * `Actor.auth.none` included. It opens the actor to anyone who can reach the
33
+ * server, so use it only for demos and deliberately public actors.
34
+ */
35
+ export declare const publicAccess: Access;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Allows every caller every kind of request, `Anonymous` visitors under
3
+ * `Actor.auth.none` included. It opens the actor to anyone who can reach the
4
+ * server, so use it only for demos and deliberately public actors.
5
+ */
6
+ export const publicAccess = () => true;
@@ -0,0 +1,127 @@
1
+ import { Duration } from "effect";
2
+ import type { AnyCommand } from "../members/command.ts";
3
+ /**
4
+ * Serializable actor limits, retention, and lifecycle settings; each key has
5
+ * exactly one meaning and one default. What the actor does (who creates it,
6
+ * its schedules, its jobs) is declared on the definition, not here.
7
+ */
8
+ export interface Policy {
9
+ /** Idle time before the activation sleeps. Default 60 seconds. */
10
+ readonly hibernateAfter?: Duration.Input;
11
+ /**
12
+ * Deadline for one command turn's transaction and one query's execution.
13
+ * It does not bound a workflow or a live session. Default 30 seconds.
14
+ */
15
+ readonly executionTimeout?: Duration.Input;
16
+ /** Deadline for acquiring the generation lock. Default 2 seconds. */
17
+ readonly lockWait?: Duration.Input;
18
+ /** How long a caller waits for a reply; the turn itself is not cancelled. Default 30 seconds. */
19
+ readonly deliveryTimeout?: Duration.Input;
20
+ /** Maximum UTF-8 bytes of the encoded state object. Default 65,536. */
21
+ readonly maxStateBytes?: number;
22
+ /** Declared mailbox capacity; omitted, the runtime bounds active commands at 1,024 and refuses overload. */
23
+ readonly mailboxCapacity?: number;
24
+ /**
25
+ * How long a receipt is kept after its command id is issued; a timer's
26
+ * receipt counts from its due time. A receipt is never pruned before its id
27
+ * expires, nor while an intent or job with its id is still pending.
28
+ * Default 7 days.
29
+ */
30
+ readonly keepReceipts?: Duration.Input;
31
+ /**
32
+ * How long an event is kept after it is emitted. Pruning removes only an
33
+ * actor's oldest events, and replay after a pruned cursor fails
34
+ * `RetentionGap`. Default 30 days.
35
+ */
36
+ readonly keepEvents?: Duration.Input;
37
+ /**
38
+ * Maximum bytes across all of one actor's blob entries; a write past it is
39
+ * a defect of the turn. Default 67,108,864 (64 MiB).
40
+ */
41
+ readonly maxBlobBytes?: number;
42
+ /**
43
+ * Maximum entries across all of one actor's blobs; a write that would
44
+ * create an entry past it is a defect of the turn, while existing entries
45
+ * stay writable. Default 10,000.
46
+ */
47
+ readonly maxBlobEntries?: number;
48
+ /**
49
+ * How long a finished workflow execution keeps its result for `poll` after
50
+ * it finishes. Must be at least the deployment's retry window. Default 7 days.
51
+ */
52
+ readonly keepWorkflows?: Duration.Input;
53
+ /** A schedule tick later than this after its scheduled time is skipped. Default 1 day. */
54
+ readonly maxScheduleLag?: Duration.Input;
55
+ /**
56
+ * Whether open connections keep the activation awake. `"park"` (default)
57
+ * lets it hibernate with sockets open at their holders; `"keepAwake"`
58
+ * counts an open connection as activity.
59
+ */
60
+ readonly connections?: "park" | "keepAwake";
61
+ /** Longest time a connection runs on one authorization check, 1 second to 1 hour. Default 60 seconds. */
62
+ readonly reauthorizeEvery?: Duration.Input;
63
+ /** Limits on the watches of this actor's `watch: true` queries. */
64
+ readonly watch?: {
65
+ /** Watches open on one actor at once; the next fails `RunnerAtCapacity`. Default 1,000. */
66
+ readonly maxPerActor?: number;
67
+ /** The least time between two reruns of one watch. Default 100 milliseconds. */
68
+ readonly minInterval?: Duration.Input;
69
+ /**
70
+ * How often a watch reruns whether or not a commit signal arrived, so a
71
+ * signal lost to a broadcast gap or an owner's death, or a change no
72
+ * commit reports, is shown within this time. 5 seconds to 1 hour.
73
+ * Default 30 seconds.
74
+ */
75
+ readonly reconcileEvery?: Duration.Input;
76
+ };
77
+ /**
78
+ * The actor types that may subscribe to this actor's events, by name, so
79
+ * this definition never imports its subscribers. These are actor type
80
+ * names, not user principals. A subscription on any other type fails at
81
+ * `Actor.make`. Omitted, every type in the tenant may.
82
+ */
83
+ readonly allowedSubscriberTypes?: ReadonlyArray<string>;
84
+ /**
85
+ * How long past `keepEvents` subscriptions to this actor may hold its
86
+ * events back from pruning. An event older than both is pruned, and a
87
+ * subscriber behind it receives a `RetentionGap`. Default 7 days.
88
+ */
89
+ readonly holdEventsForSubscribers?: Duration.Input;
90
+ }
91
+ /** A `Policy` resolved for the runtime: every default applied and every duration in whole milliseconds. */
92
+ export interface TurnPolicy {
93
+ readonly executionMs: number;
94
+ readonly lockWaitMs: number;
95
+ readonly deliveryMs: number;
96
+ readonly stateMaxBytes: number;
97
+ readonly idleMs: number;
98
+ readonly mailboxCapacity: number | "unbounded";
99
+ readonly createdBy: string | undefined;
100
+ readonly keepReceiptsMs: number;
101
+ readonly keepEventsMs: number;
102
+ readonly blobMaxBytes: number;
103
+ readonly blobMaxEntries: number;
104
+ readonly connections: "park" | "keepAwake";
105
+ readonly reauthorizeMs: number;
106
+ readonly watch: {
107
+ readonly maxPerActor: number;
108
+ readonly minIntervalMs: number;
109
+ readonly reconcileMs: number;
110
+ };
111
+ readonly keepWorkflowsMs: number;
112
+ readonly cronSkipMs: number;
113
+ readonly subscribers: ReadonlyArray<string> | undefined;
114
+ readonly holdEventsMs: number;
115
+ }
116
+ /**
117
+ * Applies the defaults of `declared` and validates each bound: durations run
118
+ * from 1 ms to 2^31 - 1 ms, retention horizons up to about ten years, and
119
+ * `reauthorizeEvery` from 1 second to 1 hour, and `watch.reconcileEvery` from
120
+ * 5 seconds to 1 hour. Throws when a value is out of range or `createdBy` is
121
+ * not one of `commands`.
122
+ */
123
+ export declare const resolvePolicy: (policy: {
124
+ readonly declared: Policy | undefined;
125
+ readonly createdBy: AnyCommand | undefined;
126
+ readonly commands: ReadonlyArray<AnyCommand>;
127
+ }) => TurnPolicy;
@@ -0,0 +1,45 @@
1
+ import { Duration, Schema } from "effect";
2
+ const Positive = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 2_147_483_647 }));
3
+ const milliseconds = (duration) => Positive.make(Duration.toMillis(duration));
4
+ /** Retention horizons may exceed the 32-bit timeouts: up to about ten years. */
5
+ const horizon = (duration) => Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 315_576_000_000 })).make(Duration.toMillis(duration));
6
+ /**
7
+ * Applies the defaults of `declared` and validates each bound: durations run
8
+ * from 1 ms to 2^31 - 1 ms, retention horizons up to about ten years, and
9
+ * `reauthorizeEvery` from 1 second to 1 hour, and `watch.reconcileEvery` from
10
+ * 5 seconds to 1 hour. Throws when a value is out of range or `createdBy` is
11
+ * not one of `commands`.
12
+ */
13
+ export const resolvePolicy = (policy) => {
14
+ const { declared, createdBy, commands } = policy;
15
+ if (createdBy !== undefined && !commands.includes(createdBy))
16
+ throw new Error("createdBy must be a command of this actor");
17
+ return Object.freeze({
18
+ executionMs: milliseconds(declared?.executionTimeout ?? "30 seconds"),
19
+ lockWaitMs: milliseconds(declared?.lockWait ?? "2 seconds"),
20
+ deliveryMs: milliseconds(declared?.deliveryTimeout ?? "30 seconds"),
21
+ stateMaxBytes: Positive.make(declared?.maxStateBytes ?? 65_536),
22
+ idleMs: milliseconds(declared?.hibernateAfter ?? "60 seconds"),
23
+ mailboxCapacity: declared?.mailboxCapacity === undefined
24
+ ? "unbounded"
25
+ : Positive.make(declared.mailboxCapacity),
26
+ createdBy: createdBy?.tag,
27
+ keepReceiptsMs: horizon(declared?.keepReceipts ?? "7 days"),
28
+ keepEventsMs: horizon(declared?.keepEvents ?? "30 days"),
29
+ blobMaxBytes: Positive.make(declared?.maxBlobBytes ?? 67_108_864),
30
+ blobMaxEntries: Positive.make(declared?.maxBlobEntries ?? 10_000),
31
+ connections: declared?.connections ?? "park",
32
+ reauthorizeMs: Schema.Int.check(Schema.isBetween({ minimum: 1_000, maximum: 3_600_000 })).make(Duration.toMillis(declared?.reauthorizeEvery ?? "60 seconds")),
33
+ watch: {
34
+ maxPerActor: Positive.make(declared?.watch?.maxPerActor ?? 1_000),
35
+ minIntervalMs: milliseconds(declared?.watch?.minInterval ?? "100 millis"),
36
+ reconcileMs: Schema.Int.check(Schema.isBetween({ minimum: 5_000, maximum: 3_600_000 })).make(Duration.toMillis(declared?.watch?.reconcileEvery ?? "30 seconds")),
37
+ },
38
+ keepWorkflowsMs: horizon(declared?.keepWorkflows ?? "7 days"),
39
+ cronSkipMs: horizon(declared?.maxScheduleLag ?? "1 day"),
40
+ subscribers: declared?.allowedSubscriberTypes === undefined
41
+ ? undefined
42
+ : [...declared.allowedSubscriberTypes],
43
+ holdEventsMs: horizon(declared?.holdEventsForSubscribers ?? "7 days"),
44
+ });
45
+ };
@@ -0,0 +1,28 @@
1
+ import type { AnyCommand } from "../members/command.ts";
2
+ import type { AnyJobBinding } from "../members/job.ts";
3
+ /** A job binding with every default applied and every duration in whole milliseconds. */
4
+ export interface JobPolicy {
5
+ /** The first attempt plus its retries. */
6
+ readonly attempts: number;
7
+ readonly timeoutMs: number;
8
+ readonly backoff: {
9
+ readonly baseMs: number;
10
+ readonly maxMs: number;
11
+ };
12
+ readonly progressEveryMs: number;
13
+ readonly perActor: number | undefined;
14
+ readonly onSuccess: AnyCommand | undefined;
15
+ readonly onDeadLetter: AnyCommand | undefined;
16
+ readonly onCancelled: AnyCommand | undefined;
17
+ }
18
+ /**
19
+ * Resolves one declared job's binding, throwing on a route that is not one of
20
+ * `commands`, a `concurrency.perActor` outside 1..64, `retry.times` outside
21
+ * 0..100, a duration outside its bounds, or a backoff whose max is below its
22
+ * base. `path` names the binding in those messages.
23
+ */
24
+ export declare const resolveJobPolicy: ({ path, declared, commands, }: {
25
+ readonly path: string;
26
+ readonly declared: AnyJobBinding;
27
+ readonly commands: ReadonlyArray<AnyCommand>;
28
+ }) => JobPolicy;