@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,403 @@
1
+ import { Schema, SchemaAST } from "effect";
2
+ import { HttpApi, HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/http-api";
3
+ import { declaredStatus, } from "../actor/served.js";
4
+ import { Credential } from "./auth.js";
5
+ import { ASSERTION_HEADER } from "./assertion/binding.js";
6
+ import { SUBPROTOCOL } from "../protocol/frames.js";
7
+ import { ContentRef } from "../identity/content.js";
8
+ import { Defect, envelope } from "../protocol/wire.js";
9
+ const COMMAND_ERRORS = {
10
+ 400: ["InvalidCommandId", "InvalidInput"],
11
+ 401: ["Unauthorized"],
12
+ 403: ["Unauthorized", "InvalidInput"],
13
+ 404: ["NotCreated", "InvalidInput"],
14
+ 409: ["CommandConflict"],
15
+ 410: ["CommandExpired"],
16
+ 413: ["InvalidInput"],
17
+ 415: ["InvalidInput"],
18
+ 429: ["MailboxFull"],
19
+ 503: ["ActorUnavailable", "RunnerAtCapacity"],
20
+ 504: ["Timeout"],
21
+ };
22
+ const QUERY_ERRORS = {
23
+ 400: ["InvalidInput"],
24
+ 401: ["Unauthorized"],
25
+ 403: ["Unauthorized", "InvalidInput"],
26
+ 404: ["InvalidInput"],
27
+ 413: ["InvalidInput"],
28
+ 415: ["InvalidInput"],
29
+ 503: ["ActorUnavailable"],
30
+ 504: ["Timeout"],
31
+ };
32
+ const errorSchemas = (errors, prefix) => Object.entries(errors).map(([status, tags]) => envelope({ tags, identifier: `${prefix}ActorError${status}` }).annotate({
33
+ httpApiStatus: Number(status),
34
+ }));
35
+ /** A refused upgrade; once upgraded, a session ends with an `end` message instead. */
36
+ const UPGRADE_ERRORS = {
37
+ 400: ["InvalidInput"],
38
+ 401: ["Unauthorized"],
39
+ 403: ["InvalidInput"],
40
+ 404: ["InvalidInput"],
41
+ 413: ["InvalidInput"],
42
+ 503: ["RunnerAtCapacity"],
43
+ };
44
+ /** A refused feed; a feed that ends later sends an `end` message instead. */
45
+ const FEED_ERRORS = {
46
+ 400: ["InvalidInput"],
47
+ 401: ["Unauthorized"],
48
+ 403: ["Unauthorized", "InvalidInput"],
49
+ 404: ["NotCreated", "InvalidInput"],
50
+ 503: ["ActorUnavailable", "RunnerAtCapacity"],
51
+ };
52
+ /** A refused content operation; a download a sweep cut short ends its body early instead. */
53
+ const CONTENT_ERRORS = {
54
+ 400: ["InvalidInput"],
55
+ 401: ["Unauthorized"],
56
+ 403: ["Unauthorized", "InvalidInput"],
57
+ 404: ["InvalidInput"],
58
+ 413: ["InvalidInput"],
59
+ 503: ["ActorUnavailable"],
60
+ };
61
+ const contentErrors = errorSchemas(CONTENT_ERRORS, "Content");
62
+ const commandErrors = errorSchemas(COMMAND_ERRORS, "Command");
63
+ const feedErrors = errorSchemas(FEED_ERRORS, "Feed");
64
+ const upgradeErrors = errorSchemas(UPGRADE_ERRORS, "Upgrade");
65
+ const queryErrors = errorSchemas(QUERY_ERRORS, "Query");
66
+ const defect = Defect.annotate({ httpApiStatus: 500 });
67
+ const ProtocolInfo = Schema.Struct({
68
+ protocol: Schema.Literal(1),
69
+ retryWindowMs: Schema.Int,
70
+ now: Schema.Int,
71
+ }).annotate({ identifier: "Protocol" });
72
+ const ReadinessReason = Schema.Literals([
73
+ "draining",
74
+ "drained",
75
+ "storage",
76
+ "routing",
77
+ "peering",
78
+ "unregistered",
79
+ ]);
80
+ const Ready = Schema.Struct({ ready: Schema.Literal(true) }).annotate({ identifier: "Ready" });
81
+ const NotReady = Schema.Struct({ ready: Schema.Literal(false), reason: ReadinessReason }).annotate({
82
+ identifier: "NotReady",
83
+ httpApiStatus: 503,
84
+ });
85
+ /** The body of `POST /command-ids`. */
86
+ const MintedCommandId = Schema.Struct({ commandId: Schema.String }).annotate({
87
+ identifier: "MintedCommandId",
88
+ });
89
+ const IdempotencyKey = Schema.String.annotate({
90
+ description: "The command id, v1.<issuedAtMs>.<expiresAtMs>.<uuidv4>; retries send the same one.",
91
+ });
92
+ /** The path of a served member below the base path, as the router and the OpenAPI document both spell it. */
93
+ export const memberPath = ({ definition, member }) => definition.key === "singleton"
94
+ ? `/actors/${definition.name}/${member.tag}`
95
+ : `/actors/${definition.name}/:id/${member.tag}`;
96
+ const endpoint = (basePath, definition, member) => {
97
+ const isQuery = member.kind === "query";
98
+ const path = `${basePath}${memberPath({ definition, member })}`;
99
+ const declared = member.errors.map((error) => SchemaAST.resolveAt("httpApiStatus")(error.ast) === undefined
100
+ ? error.annotate({ httpApiStatus: declaredStatus(error) })
101
+ : error);
102
+ return HttpApiEndpoint.post(member.tag, path, {
103
+ params: definition.key === "singleton" ? undefined : { id: Schema.String },
104
+ headers: isQuery ? undefined : { "idempotency-key": IdempotencyKey },
105
+ payload: SchemaAST.isVoid(member.input.ast) ? undefined : member.input,
106
+ success: SchemaAST.isVoid(member.output.ast) ? HttpApiSchema.NoContent : member.output,
107
+ error: [...declared, ...(isQuery ? queryErrors : commandErrors), defect],
108
+ });
109
+ };
110
+ const frameSchemaName = (definition, connection, part) => `${definition.name}.${connection.tag}.${part}`;
111
+ /** The schemas a connection's messages carry: `hello` params, and frames each way. */
112
+ const frameParts = (connection) => ({
113
+ params: connection.params,
114
+ server: connection.server,
115
+ client: connection.client,
116
+ });
117
+ /**
118
+ * OpenAPI can't describe a socket's message flow, so a connection is an upgrade
119
+ * operation that names its frame schemas; the envelope is the served protocol's.
120
+ */
121
+ const connectionEndpoint = (basePath, definition, connection) => HttpApiEndpoint.get(connection.tag, `${basePath}${memberPath({ definition, member: connection })}`, {
122
+ params: definition.key === "singleton" ? undefined : { id: Schema.String },
123
+ error: [...upgradeErrors, defect],
124
+ }).annotate(OpenApi.Transform, (operation) => {
125
+ const { 204: _, ...refusals } = operation.responses ?? {};
126
+ return {
127
+ ...operation,
128
+ responses: {
129
+ 101: { description: `WebSocket upgrade with subprotocol ${SUBPROTOCOL}` },
130
+ ...refusals,
131
+ },
132
+ "x-durable-transport": "websocket",
133
+ "x-durable-subprotocol": SUBPROTOCOL,
134
+ "x-durable-frames": Object.fromEntries(Object.keys(frameParts(connection)).map((part) => [
135
+ part,
136
+ { $ref: `#/components/schemas/${frameSchemaName(definition, connection, part)}` },
137
+ ])),
138
+ };
139
+ });
140
+ /** An event feed is served over SSE: one message per event, its cursor as the `id`. */
141
+ const feedEndpoint = (basePath, definition) => HttpApiEndpoint.get("events", `${basePath}${memberPath({ definition, member: { tag: "events" } })}`, {
142
+ params: definition.key === "singleton" ? undefined : { id: Schema.String },
143
+ query: {
144
+ event: Schema.Array(Schema.Literals(definition.feeds)),
145
+ after: Schema.optionalKey(Schema.String),
146
+ },
147
+ error: [...feedErrors, defect],
148
+ }).annotate(OpenApi.Transform, (operation) => {
149
+ const { 204: _, ...refusals } = operation.responses ?? {};
150
+ return {
151
+ ...operation,
152
+ responses: {
153
+ 200: {
154
+ description: "Server-sent events: `id` is the event cursor, `event` its tag; `Last-Event-ID` resumes after it",
155
+ content: { "text/event-stream": { schema: { type: "string" } } },
156
+ },
157
+ ...refusals,
158
+ 410: { description: "RetentionGap: events after the cursor were pruned" },
159
+ },
160
+ "x-durable-transport": "sse",
161
+ };
162
+ });
163
+ /** A refused subscription; one that ends later sends an `end` message instead. */
164
+ const STREAM_ERRORS = {
165
+ 400: ["InvalidInput"],
166
+ 401: ["Unauthorized"],
167
+ 403: ["InvalidInput"],
168
+ 404: ["InvalidInput"],
169
+ 413: ["InvalidInput"],
170
+ 415: ["InvalidInput"],
171
+ };
172
+ const streamErrors = errorSchemas(STREAM_ERRORS, "Stream");
173
+ /** A stream is served over SSE: `element` messages, then one `end`; OpenAPI names its element schema. */
174
+ const streamEndpoint = (basePath, definition, member) => HttpApiEndpoint.post(member.tag, `${basePath}${memberPath({ definition, member })}`, {
175
+ params: definition.key === "singleton" ? undefined : { id: Schema.String },
176
+ payload: SchemaAST.isVoid(member.input.ast) ? undefined : member.input,
177
+ error: [...streamErrors, defect],
178
+ }).annotate(OpenApi.Transform, (operation) => {
179
+ const { 204: _, ...refusals } = operation.responses ?? {};
180
+ return {
181
+ ...operation,
182
+ responses: {
183
+ 200: {
184
+ description: "Server-sent events: `element` with each encoded output, then `end` with null or the error that ended the stream",
185
+ content: { "text/event-stream": { schema: { type: "string" } } },
186
+ },
187
+ ...refusals,
188
+ },
189
+ "x-durable-transport": "sse",
190
+ "x-durable-element": {
191
+ $ref: `#/components/schemas/${definition.name}.${member.tag}.element`,
192
+ },
193
+ };
194
+ });
195
+ /** A refused watch; one that ends later sends an `end` message instead. */
196
+ const WATCH_ERRORS = {
197
+ 400: ["InvalidInput"],
198
+ 401: ["Unauthorized"],
199
+ 403: ["Unauthorized", "InvalidInput"],
200
+ 404: ["NotCreated", "InvalidInput"],
201
+ 413: ["InvalidInput"],
202
+ 415: ["InvalidInput"],
203
+ 503: ["ActorUnavailable", "RunnerAtCapacity"],
204
+ };
205
+ const watchErrors = errorSchemas(WATCH_ERRORS, "Watch");
206
+ const watchEndpoint = (basePath, definition, member) => HttpApiEndpoint.post(`${member.tag}.watch`, `${basePath}${memberPath({ definition, member })}/watch`, {
207
+ params: definition.key === "singleton" ? undefined : { id: Schema.String },
208
+ payload: SchemaAST.isVoid(member.input.ast) ? undefined : member.input,
209
+ error: [...watchErrors, defect],
210
+ }).annotate(OpenApi.Transform, (operation) => {
211
+ const { 204: _, ...refusals } = operation.responses ?? {};
212
+ return {
213
+ ...operation,
214
+ responses: {
215
+ 200: {
216
+ description: "Server-sent events: `result` with each encoded output, whose `id` is the commit version the rerun waited for when there was one, then `end` with the error that ended the watch. A watch is state, not history: intermediate results are skipped, and a reconnect sends the current result first",
217
+ content: { "text/event-stream": { schema: { type: "string" } } },
218
+ },
219
+ ...refusals,
220
+ },
221
+ "x-durable-transport": "sse",
222
+ "x-durable-element": {
223
+ $ref: `#/components/schemas/${definition.name}.${member.tag}.element`,
224
+ },
225
+ };
226
+ });
227
+ /** A refused fleet subscription; one that ends later sends an `end` message instead. */
228
+ const FLEET_ERRORS = {
229
+ 400: ["InvalidInput"],
230
+ 401: ["Unauthorized"],
231
+ 403: ["Unauthorized", "InvalidInput"],
232
+ 503: ["ActorUnavailable", "RunnerAtCapacity"],
233
+ };
234
+ const fleetErrors = errorSchemas(FLEET_ERRORS, "Fleet");
235
+ /**
236
+ * A fleet view is served over SSE for the caller's tenant: equality filters on
237
+ * its group keys and `limit` in the query, then `result` pages of
238
+ * `{ asOf, stale, rows }`.
239
+ */
240
+ const fleetEndpoint = (basePath, view) => HttpApiEndpoint.get(`fleet.${view.name}`, `${basePath}/fleet/${view.name}`, {
241
+ query: {
242
+ ...Object.fromEntries(view.groupBy.map((key) => [key, Schema.optionalKey(Schema.String)])),
243
+ limit: Schema.optionalKey(Schema.String),
244
+ },
245
+ error: [...fleetErrors, defect],
246
+ }).annotate(OpenApi.Transform, (operation) => {
247
+ const { 204: _, ...refusals } = operation.responses ?? {};
248
+ return {
249
+ ...operation,
250
+ responses: {
251
+ 200: {
252
+ description: "Server-sent events: `result` with `{ asOf, stale, rows }`, the caller's tenant's groups in group-key order, first at once and again whenever the view changed; an identical page is not sent. `end` carries the error that ended the subscription. A fleet subscription is state, not history, so there is no resume",
253
+ content: { "text/event-stream": { schema: { type: "string" } } },
254
+ },
255
+ ...refusals,
256
+ },
257
+ "x-durable-transport": "sse",
258
+ };
259
+ });
260
+ const frameSchemas = (definition, connection) => Object.entries(frameParts(connection)).map(([part, schema]) => schema.annotate({ identifier: frameSchemaName(definition, connection, part) }));
261
+ const ContentRefSchema = ContentRef.annotate({ identifier: "ContentRef" });
262
+ const OCTETS = { "application/octet-stream": { schema: { type: "string", format: "binary" } } };
263
+ /** The path segment an actor's content routes are served under, so no member may take it. */
264
+ export const CONTENT_ROUTE = "content";
265
+ const contentPath = (basePath, definition) => `${basePath}${memberPath({ definition, member: { tag: CONTENT_ROUTE } })}/:blob/:name`;
266
+ const contentParams = (definition) => {
267
+ const entry = { blob: Schema.Literals(definition.contents), name: Schema.String };
268
+ return definition.key === "singleton" ? entry : { id: Schema.String, ...entry };
269
+ };
270
+ /** Downloads stream the entry's bytes; grants answer a fresh `ContentRef`. */
271
+ const contentEndpoints = (basePath, definition) => [
272
+ HttpApiEndpoint.get(CONTENT_ROUTE, contentPath(basePath, definition), {
273
+ params: contentParams(definition),
274
+ error: [...contentErrors, defect],
275
+ }).annotate(OpenApi.Transform, (operation) => {
276
+ const { 204: _, ...refusals } = operation.responses ?? {};
277
+ return {
278
+ ...operation,
279
+ responses: {
280
+ 200: { description: "The referenced content's bytes", content: OCTETS },
281
+ ...refusals,
282
+ },
283
+ };
284
+ }),
285
+ HttpApiEndpoint.post(`${CONTENT_ROUTE}.grant`, `${contentPath(basePath, definition)}/grant`, {
286
+ params: contentParams(definition),
287
+ success: ContentRefSchema,
288
+ error: [...contentErrors, defect],
289
+ }),
290
+ ];
291
+ const uploadEndpoint = (basePath) => HttpApiEndpoint.post("uploadContent", `${basePath}/content`, {
292
+ success: ContentRefSchema,
293
+ error: [...contentErrors, defect],
294
+ }).annotate(OpenApi.Transform, (operation) => ({
295
+ ...operation,
296
+ requestBody: { required: true, content: OCTETS },
297
+ }));
298
+ /** Protocol routes live in their own group. */
299
+ const PROTOCOL_GROUP = "durable";
300
+ /** The operation id of the route that mints command ids. */
301
+ export const MINT_OPERATION = `${PROTOCOL_GROUP}.commandIds`;
302
+ /** Operation ids of the protocol routes; no served member may reuse one. */
303
+ export const PROTOCOL_OPERATIONS = new Set([
304
+ `${PROTOCOL_GROUP}.protocol`,
305
+ MINT_OPERATION,
306
+ `${PROTOCOL_GROUP}.uploadContent`,
307
+ `${PROTOCOL_GROUP}.ready`,
308
+ ]);
309
+ /** Paths of the protocol routes under the base path; `openapi.path` may not take one. */
310
+ export const PROTOCOL_PATHS = new Set([
311
+ "/protocol",
312
+ "/command-ids",
313
+ "/ready",
314
+ "/content",
315
+ ]);
316
+ /** Protocol operations that take no credentials. */
317
+ const UNAUTHENTICATED = new Set([
318
+ `${PROTOCOL_GROUP}.protocol`,
319
+ `${PROTOCOL_GROUP}.ready`,
320
+ ]);
321
+ /** The `HttpApi` of the served actors: the protocol group, then one group per actor with members, connections, feed, content, and streams. */
322
+ export const buildServedApi = ({ definitions, fleet, basePath, content }) => {
323
+ const groups = [
324
+ HttpApiGroup.make(PROTOCOL_GROUP).add(HttpApiEndpoint.get("protocol", `${basePath}/protocol`, {
325
+ success: ProtocolInfo,
326
+ }), HttpApiEndpoint.get("ready", `${basePath}/ready`, {
327
+ success: Ready,
328
+ error: NotReady,
329
+ }), HttpApiEndpoint.post("commandIds", `${basePath}/command-ids`, {
330
+ success: MintedCommandId,
331
+ error: [
332
+ ...errorSchemas({ 401: ["Unauthorized"], 503: ["ActorUnavailable"] }, "Mint"),
333
+ defect,
334
+ ],
335
+ }), ...(content ? [uploadEndpoint(basePath)] : []), ...fleet.map((view) => fleetEndpoint(basePath, view))),
336
+ ];
337
+ for (const definition of definitions) {
338
+ const endpoints = [
339
+ ...definition.members.map((member) => endpoint(basePath, definition, member)),
340
+ ...definition.connections.map((connection) => connectionEndpoint(basePath, definition, connection)),
341
+ ...(definition.feeds.length > 0 ? [feedEndpoint(basePath, definition)] : []),
342
+ ...(content && definition.contents.length > 0 ? contentEndpoints(basePath, definition) : []),
343
+ ...definition.streams.map((member) => streamEndpoint(basePath, definition, member)),
344
+ ...definition.members
345
+ .filter((member) => member.watch)
346
+ .map((member) => watchEndpoint(basePath, definition, member)),
347
+ ];
348
+ if (endpoints.length > 0)
349
+ groups.push(HttpApiGroup.make(definition.name).add(endpoints[0], ...endpoints.slice(1)));
350
+ }
351
+ const api = HttpApi.make("akter")
352
+ .add(groups[0], ...groups.slice(1))
353
+ .annotate(HttpApi.AdditionalSchemas, definitions.flatMap((definition) => [
354
+ ...definition.connections.flatMap((connection) => frameSchemas(definition, connection)),
355
+ ...[...definition.streams, ...definition.members.filter((member) => member.watch)].map((member) => member.output.annotate({ identifier: `${definition.name}.${member.tag}.element` })),
356
+ ]));
357
+ return api;
358
+ };
359
+ /** The OpenAPI security scheme a credential is documented as; a provider has at most one per scheme. */
360
+ export const schemeName = Credential.$match({
361
+ Bearer: () => "bearer",
362
+ Jwt: () => "bearer",
363
+ Cookie: () => "cookie",
364
+ Assertion: () => "assertion",
365
+ });
366
+ const securityScheme = Credential.$match({
367
+ Bearer: () => ({ type: "http", scheme: "bearer" }),
368
+ Jwt: () => ({ type: "http", scheme: "bearer", bearerFormat: "JWT" }),
369
+ Cookie: ({ name }) => ({ type: "apiKey", in: "cookie", name }),
370
+ Assertion: () => ({ type: "apiKey", in: "header", name: ASSERTION_HEADER }),
371
+ });
372
+ /**
373
+ * The OpenAPI 3.1 document of `api`. Every authenticated operation lists the
374
+ * provider's credentials as alternatives, since any one of them authenticates.
375
+ */
376
+ export const openApiDocument = ({ api, auth, title, version }) => {
377
+ const spec = OpenApi.fromApi(api);
378
+ const security = auth.credentials.map((credential) => ({
379
+ [schemeName(credential)]: [],
380
+ }));
381
+ const paths = Object.fromEntries(Object.entries(spec.paths).map(([path, item]) => [
382
+ path,
383
+ Object.fromEntries(Object.entries(item).map(([method, operation]) => [
384
+ method,
385
+ Array.isArray(operation)
386
+ ? operation
387
+ : Object.assign({}, operation, {
388
+ security: "operationId" in operation && UNAUTHENTICATED.has(operation.operationId)
389
+ ? []
390
+ : security,
391
+ }),
392
+ ])),
393
+ ]));
394
+ return {
395
+ ...spec,
396
+ info: { ...spec.info, title, version },
397
+ paths,
398
+ components: {
399
+ ...spec.components,
400
+ securitySchemes: Object.fromEntries(auth.credentials.map((credential) => [schemeName(credential), securityScheme(credential)])),
401
+ },
402
+ };
403
+ };
@@ -0,0 +1,41 @@
1
+ import { Effect } from "effect";
2
+ /**
3
+ * The canonical request binding of a hosted edge assertion. The edge signs
4
+ * the SHA-256 of the canonical string of the request it forwards; the runner
5
+ * rebuilds the string from the request it received and compares, so an
6
+ * assertion can't be moved to another actor, member, command id, or body.
7
+ */
8
+ /** The header that carries an assertion from the edge to a runner. */
9
+ export declare const ASSERTION_HEADER = "durable-assertion";
10
+ /** The JWS `typ` of an assertion. */
11
+ export declare const ASSERTION_TYPE = "durable-assertion+jwt";
12
+ /** The JWS `typ` of the edge's push asking a runner to reread its key set. */
13
+ export declare const KEY_REFRESH_TYPE = "durable-key-refresh+jwt";
14
+ /** The route, under a served layer's base path, that takes the edge's key-set refresh push. */
15
+ export declare const KEY_REFRESH_PATH = "/assertion-keys/refresh";
16
+ /** What the canonical string binds, as the edge forwards and the runner receives it. */
17
+ export interface BoundRequest {
18
+ readonly method: string;
19
+ /** The request target: a path with an optional `?query`, as it arrives. */
20
+ readonly target: string;
21
+ /** The raw `Idempotency-Key` header value, if the request has one. */
22
+ readonly idempotencyKey: string | undefined;
23
+ /** The body bytes exactly as forwarded; empty when there is none. */
24
+ readonly body: Uint8Array;
25
+ }
26
+ /** A path with percent-encoding normalized to uppercase hex and no dot segments. */
27
+ export declare const canonicalPath: (path: string) => string;
28
+ /** Query parameters sorted by name then value, each percent-encoded, joined by `&`. */
29
+ export declare const canonicalQuery: (query: string) => string;
30
+ /** The canonical string of a request, before hashing. */
31
+ export declare const canonicalRequest: (request: BoundRequest) => Effect.Effect<string, never, never>;
32
+ /** The `req` claim of an assertion for `request`: the SHA-256 of its canonical string. */
33
+ export declare const requestDigest: (request: BoundRequest) => Effect.Effect<string, never, never>;
34
+ /**
35
+ * The `req` claim of a streaming session's reauthentication assertion: it
36
+ * binds the session's upgrade path and its session id, not a request.
37
+ */
38
+ export declare const reauthenticationDigest: (options: {
39
+ readonly path: string;
40
+ readonly session: string;
41
+ }) => Effect.Effect<string, never, never>;
@@ -0,0 +1,92 @@
1
+ import { Effect } from "effect";
2
+ /**
3
+ * The canonical request binding of a hosted edge assertion. The edge signs
4
+ * the SHA-256 of the canonical string of the request it forwards; the runner
5
+ * rebuilds the string from the request it received and compares, so an
6
+ * assertion can't be moved to another actor, member, command id, or body.
7
+ */
8
+ /** The header that carries an assertion from the edge to a runner. */
9
+ export const ASSERTION_HEADER = "durable-assertion";
10
+ /** The JWS `typ` of an assertion. */
11
+ export const ASSERTION_TYPE = "durable-assertion+jwt";
12
+ /** The JWS `typ` of the edge's push asking a runner to reread its key set. */
13
+ export const KEY_REFRESH_TYPE = "durable-key-refresh+jwt";
14
+ /** The route, under a served layer's base path, that takes the edge's key-set refresh push. */
15
+ export const KEY_REFRESH_PATH = "/assertion-keys/refresh";
16
+ const VERSION = "durable-assertion/v1";
17
+ const utf8 = new TextEncoder();
18
+ const hex = (bytes) => Array.from(new Uint8Array(bytes), (byte) => byte.toString(16).padStart(2, "0")).join("");
19
+ const sha256 = (bytes) => Effect.promise(() => crypto.subtle.digest("SHA-256", new Uint8Array(bytes))).pipe(Effect.map(hex));
20
+ /** RFC 3986 unreserved characters, which percent-encoding never changes the meaning of. */
21
+ const UNRESERVED = /^[A-Za-z0-9\-._~]$/;
22
+ /** Uppercases percent-encoding hex, and decodes it where it encodes an unreserved character. */
23
+ const normalizeEscapes = (segment) => segment.replace(/%([0-9A-Fa-f]{2})/g, (_, digits) => {
24
+ const character = String.fromCharCode(Number.parseInt(digits, 16));
25
+ return UNRESERVED.test(character) ? character : `%${digits.toUpperCase()}`;
26
+ });
27
+ /** RFC 3986 section 5.2.4: removes `.` and `..` segments. `..` never climbs above the root, the path's leading empty segment. */
28
+ const removeDotSegments = (path) => {
29
+ const output = [];
30
+ const segments = path.split("/");
31
+ for (const [index, segment] of segments.entries()) {
32
+ const last = index === segments.length - 1;
33
+ if (segment === ".") {
34
+ if (last)
35
+ output.push("");
36
+ continue;
37
+ }
38
+ if (segment === "..") {
39
+ if (output.length > 1)
40
+ output.pop();
41
+ if (last)
42
+ output.push("");
43
+ continue;
44
+ }
45
+ output.push(segment);
46
+ }
47
+ return output.join("/");
48
+ };
49
+ /** A path with percent-encoding normalized to uppercase hex and no dot segments. */
50
+ export const canonicalPath = (path) => {
51
+ const normalized = removeDotSegments(path.split("/").map(normalizeEscapes).join("/"));
52
+ return normalized.startsWith("/") ? normalized : `/${normalized}`;
53
+ };
54
+ /** Encodes everything but unreserved characters, so both sides agree whatever the client escaped. */
55
+ const strictEncode = (value) => encodeURIComponent(value).replace(/[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
56
+ const compare = (left, right) => (left < right ? -1 : left > right ? 1 : 0);
57
+ /** Query parameters sorted by name then value, each percent-encoded, joined by `&`. */
58
+ export const canonicalQuery = (query) => [...new URLSearchParams(query)]
59
+ .map(([name, value]) => [strictEncode(name), strictEncode(value)])
60
+ .sort(([leftName, leftValue], [rightName, rightValue]) => leftName === rightName ? compare(leftValue, rightValue) : compare(leftName, rightName))
61
+ .map(([name, value]) => `${name}=${value}`)
62
+ .join("&");
63
+ const splitTarget = (target) => {
64
+ const mark = target.indexOf("?");
65
+ return mark === -1
66
+ ? { path: target, query: "" }
67
+ : { path: target.slice(0, mark), query: target.slice(mark + 1) };
68
+ };
69
+ /** The canonical string of a request, before hashing. */
70
+ export const canonicalRequest = Effect.fnUntraced(function* (request) {
71
+ const { path, query } = splitTarget(request.target);
72
+ return [
73
+ VERSION,
74
+ request.method.toUpperCase(),
75
+ canonicalPath(path),
76
+ canonicalQuery(query),
77
+ request.idempotencyKey ?? "",
78
+ yield* sha256(request.body),
79
+ ].join("\n");
80
+ });
81
+ /** The `req` claim of an assertion for `request`: the SHA-256 of its canonical string. */
82
+ export const requestDigest = (request) => canonicalRequest(request).pipe(Effect.flatMap((text) => sha256(utf8.encode(text))));
83
+ /**
84
+ * The `req` claim of a streaming session's reauthentication assertion: it
85
+ * binds the session's upgrade path and its session id, not a request.
86
+ */
87
+ export const reauthenticationDigest = (options) => sha256(utf8.encode([
88
+ VERSION,
89
+ "REAUTHENTICATE",
90
+ canonicalPath(splitTarget(options.path).path),
91
+ options.session,
92
+ ].join("\n")));
@@ -0,0 +1,93 @@
1
+ import { Duration, Schema } from "effect";
2
+ import { HttpClient } from "effect/http";
3
+ import { type AuthProvider } from "../auth.ts";
4
+ /** An edge verification key: an Ed25519 public JWK, valid from `nbf` until `exp` (epoch seconds). */
5
+ export declare const AssertionKey: Schema.Struct<{
6
+ readonly kid: Schema.NonEmptyString;
7
+ readonly kty: Schema.Literal<"OKP">;
8
+ readonly crv: Schema.Literal<"Ed25519">;
9
+ readonly x: Schema.NonEmptyString;
10
+ readonly nbf: Schema.optionalKey<Schema.Finite>;
11
+ readonly exp: Schema.optionalKey<Schema.Finite>;
12
+ }>;
13
+ /** An edge verification key. */
14
+ export type AssertionKey = typeof AssertionKey.Type;
15
+ /** The key set the control plane publishes for runners. */
16
+ export declare const AssertionKeySet: Schema.Struct<{
17
+ readonly keys: Schema.$Array<Schema.Struct<{
18
+ readonly kid: Schema.NonEmptyString;
19
+ readonly kty: Schema.Literal<"OKP">;
20
+ readonly crv: Schema.Literal<"Ed25519">;
21
+ readonly x: Schema.NonEmptyString;
22
+ readonly nbf: Schema.optionalKey<Schema.Finite>;
23
+ readonly exp: Schema.optionalKey<Schema.Finite>;
24
+ }>>;
25
+ }>;
26
+ /** The key set the control plane publishes for runners. */
27
+ export type AssertionKeySet = typeof AssertionKeySet.Type;
28
+ /** Options of `Actor.auth.assertion`. */
29
+ export interface AssertionOptions<Keys extends URL | AssertionKeySet> {
30
+ /** The edge's issuer; `iss` must equal it. */
31
+ readonly issuer: string;
32
+ /** The deployment id; `aud` must equal it. */
33
+ readonly audience: string;
34
+ /** The runner's region; an assertion routed to another region is refused. */
35
+ readonly region: string;
36
+ /** The published key-set URL, reread every `refreshEvery`, or static keys. */
37
+ readonly keys: Keys;
38
+ /**
39
+ * How often a key-set URL is reread, which bounds how long a removed key is
40
+ * still accepted. Default 5 minutes.
41
+ */
42
+ readonly refreshEvery?: Duration.Input;
43
+ }
44
+ /** The most an assertion may live, from `iat` to `exp`. */
45
+ export declare const MAX_ASSERTION_SECONDS = 60;
46
+ /** Clock skew allowed on `iat` and `exp`; edge and runners run synchronized clocks. */
47
+ export declare const ASSERTION_SKEW_MS = 5000;
48
+ /** The claims of an edge's key-set refresh push. */
49
+ export declare const KeyRefreshClaims: Schema.Struct<{
50
+ readonly iss: Schema.String;
51
+ readonly aud: Schema.String;
52
+ readonly iat: Schema.Finite;
53
+ readonly exp: Schema.Finite;
54
+ }>;
55
+ /** The claims of an edge's key-set refresh push. */
56
+ export type KeyRefreshClaims = typeof KeyRefreshClaims.Type;
57
+ /** The claims an edge signs; `actor`, `id`, `member`, and `cid` are there for logs. */
58
+ export declare const AssertionClaims: Schema.Struct<{
59
+ readonly iss: Schema.String;
60
+ readonly aud: Schema.String;
61
+ readonly region: Schema.String;
62
+ readonly iat: Schema.Finite;
63
+ readonly exp: Schema.Finite;
64
+ readonly tenant: Schema.String;
65
+ readonly caller: Schema.Union<readonly [Schema.TaggedStruct<"User", {
66
+ readonly subject: Schema.NonEmptyString;
67
+ }>, Schema.TaggedStruct<"Anonymous", {}>]>;
68
+ readonly req: Schema.String;
69
+ /** The streaming session id, on assertions for a WebSocket open or renewal. */
70
+ readonly sid: Schema.optionalKey<Schema.NonEmptyString>;
71
+ /** The external credential's own expiry in epoch seconds, which caps a live session. */
72
+ readonly cexp: Schema.optionalKey<Schema.Finite>;
73
+ readonly actor: Schema.optionalKey<Schema.String>;
74
+ readonly id: Schema.optionalKey<Schema.String>;
75
+ readonly member: Schema.optionalKey<Schema.String>;
76
+ readonly cid: Schema.optionalKey<Schema.String>;
77
+ }>;
78
+ /** The claims an edge signs. */
79
+ export type AssertionClaims = typeof AssertionClaims.Type;
80
+ /**
81
+ * Verifies the hosted edge's signed assertion, the only provider a hosted
82
+ * runner uses. It checks the signature, key, issuer, deployment, region, and
83
+ * lifetime here; the server then checks the request binding against the
84
+ * request it received before any turn.
85
+ *
86
+ * A key set older than `refreshEvery` is reread before use, and a runner that
87
+ * can't reread it refuses with `ActorUnavailable` rather than keep trusting
88
+ * keys the control plane may have removed. The provider's `refreshKeys` takes
89
+ * the edge's signed push and rereads the key set at once, however recently it
90
+ * was read, so a revoked key stops verifying without waiting for
91
+ * `refreshEvery`; repeating a push is harmless.
92
+ */
93
+ export declare const assertion: <Keys extends URL | AssertionKeySet>(options: AssertionOptions<Keys>) => AuthProvider<Keys extends URL ? HttpClient.HttpClient : never>;