@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,69 @@
1
+ import { Context, Effect } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ /**
4
+ * The role tenant-scoped transactions run as when row-level security is on.
5
+ * Undefined, they run as the connecting role, which the policies exempt.
6
+ */
7
+ export declare const TenantScope: Context.Reference<{
8
+ readonly role: string | undefined;
9
+ readonly adoption: AdoptionScope | undefined;
10
+ }>;
11
+ /**
12
+ * The writer role a runtime takes for turns of actor types that own an
13
+ * enforced adopted table, and the types that do. The turn binds the role and
14
+ * its tenant together, as row-level security does, because the framework
15
+ * tables' `durable_tenant` policies bind every role that does not bypass them. `enforced` fills as each
16
+ * type registers, before any turn runs.
17
+ */
18
+ export interface AdoptionScope {
19
+ readonly role: string;
20
+ readonly enforced: Set<string>;
21
+ }
22
+ /**
23
+ * The settings that bind the rest of a transaction to `tenant`: its role and
24
+ * the `durable.tenant` setting every `durable_tenant` policy compares with.
25
+ * Both are local, so they end with the transaction and never leak to the
26
+ * next borrower of the connection.
27
+ */
28
+ export declare const tenantSettings: ({ sql, role, tenant, }: {
29
+ readonly sql: SqlClient.SqlClient;
30
+ readonly role: string;
31
+ readonly tenant: string;
32
+ }) => import("effect/sql/Statement").Statement<import("effect/sql/SqlConnection").Row>;
33
+ /**
34
+ * Runs `effect` in a transaction bound to `tenant` as `role`, or unchanged
35
+ * when row-level security is off or `effect` already runs in a transaction,
36
+ * such as a query's, that its caller bound.
37
+ */
38
+ export declare const inTenant: ({ sql, role, tenant, }: {
39
+ readonly sql: SqlClient.SqlClient;
40
+ readonly role: string | undefined;
41
+ readonly tenant: string;
42
+ }) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | import("effect/sql/SqlError").SqlError, R>;
43
+ /** `inTenant` with this runtime's role. */
44
+ export declare const withTenant: (tenant: string) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | import("effect/sql/SqlError").SqlError, R | SqlClient.SqlClient>;
45
+ /**
46
+ * Refuses to start unless `role` confines the runtime to one tenant per
47
+ * transaction: it must be settable by this login, must not bypass the
48
+ * policies, and must be able to write every framework table. Every
49
+ * framework table with a `tenant_id` must carry the policy, including tables
50
+ * later migrations add. Every inspection view must belong to a view-owner
51
+ * role the policies bind, so the views filter by the reader's tenant, and
52
+ * which `role` can't act as, so a turn can't alter or drop a view. Setting
53
+ * the role in a transaction is the one proof that works for every membership
54
+ * rule.
55
+ */
56
+ export declare const checkRowLevelSecurity: (role: string) => Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
57
+ /**
58
+ * Refuses an owned table that would let a tenant-scoped transaction see other
59
+ * tenants' rows, or that `role` cannot use: row-level security must be on with
60
+ * the `durable_tenant` policy its drizzle-kit migration creates, and `role`
61
+ * must not own it, since Postgres exempts a table's owner from its policies.
62
+ */
63
+ export declare const checkOwnedTable: (schema: string, table: string, role: string) => Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
64
+ /**
65
+ * Refuses an adopted table `role` cannot use. An adopted table carries no
66
+ * `durable_tenant` policy unless the application added one, so only the
67
+ * privileges are checked: `role` reads it, and writes it when the runtime does.
68
+ */
69
+ export declare const checkAdoptedTable: (schema: string, table: string, role: string, writable: boolean) => Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
@@ -0,0 +1,145 @@
1
+ import { Context, Effect, Option } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ /**
4
+ * The role tenant-scoped transactions run as when row-level security is on.
5
+ * Undefined, they run as the connecting role, which the policies exempt.
6
+ */
7
+ export const TenantScope = Context.Reference("akter/TenantScope", {
8
+ defaultValue: () => ({ role: undefined, adoption: undefined }),
9
+ });
10
+ /**
11
+ * The settings that bind the rest of a transaction to `tenant`: its role and
12
+ * the `durable.tenant` setting every `durable_tenant` policy compares with.
13
+ * Both are local, so they end with the transaction and never leak to the
14
+ * next borrower of the connection.
15
+ */
16
+ export const tenantSettings = ({ sql, role, tenant, }) => sql `set_config('role', ${role}, true), set_config('durable.tenant', ${tenant}, true)`;
17
+ /**
18
+ * Runs `effect` in a transaction bound to `tenant` as `role`, or unchanged
19
+ * when row-level security is off or `effect` already runs in a transaction,
20
+ * such as a query's, that its caller bound.
21
+ */
22
+ export const inTenant = ({ sql, role, tenant, }) => (effect) => Effect.gen(function* () {
23
+ if (role === undefined)
24
+ return yield* effect;
25
+ if (Option.isSome(yield* Effect.serviceOption(sql.transactionService)))
26
+ return yield* effect;
27
+ return yield* sql.withTransaction(sql `SELECT ${tenantSettings({ sql, role, tenant })}`.pipe(Effect.andThen(effect)));
28
+ });
29
+ /** `inTenant` with this runtime's role. */
30
+ export const withTenant = (tenant) => (effect) => Effect.gen(function* () {
31
+ const { role } = yield* TenantScope;
32
+ const sql = yield* SqlClient.SqlClient;
33
+ return yield* inTenant({ sql, role, tenant })(effect);
34
+ });
35
+ const refuse = (message) => Effect.die(new Error(`Row-level security is misconfigured: ${message}`));
36
+ /**
37
+ * Refuses to start unless `role` confines the runtime to one tenant per
38
+ * transaction: it must be settable by this login, must not bypass the
39
+ * policies, and must be able to write every framework table. Every
40
+ * framework table with a `tenant_id` must carry the policy, including tables
41
+ * later migrations add. Every inspection view must belong to a view-owner
42
+ * role the policies bind, so the views filter by the reader's tenant, and
43
+ * which `role` can't act as, so a turn can't alter or drop a view. Setting
44
+ * the role in a transaction is the one proof that works for every membership
45
+ * rule.
46
+ */
47
+ export const checkRowLevelSecurity = Effect.fnUntraced(function* (role) {
48
+ const sql = yield* SqlClient.SqlClient;
49
+ const [found] = yield* sql `
50
+ SELECT rolsuper OR rolbypassrls AS exempt FROM pg_roles WHERE rolname = ${role}`;
51
+ if (found === undefined)
52
+ return yield* refuse(`role ${role} does not exist`);
53
+ if (found.exempt)
54
+ return yield* refuse(`role ${role} is a superuser or bypasses row-level security`);
55
+ yield* sql `SELECT set_config('role', ${role}, true)`.pipe(sql.withTransaction, Effect.catch(() => refuse(`this login cannot SET ROLE ${role}`)));
56
+ const tables = yield* sql `
57
+ SELECT c.relname AS table,
58
+ pg_has_role(${role}, c.relowner, 'USAGE') AS owned,
59
+ c.relrowsecurity AND EXISTS (
60
+ SELECT 1 FROM pg_policy p WHERE p.polrelid = c.oid AND p.polname = 'durable_tenant'
61
+ ) AS protected,
62
+ has_table_privilege(${role}, c.oid, 'SELECT, INSERT, UPDATE, DELETE') AS writable
63
+ FROM pg_class c
64
+ WHERE c.relnamespace = current_schema()::regnamespace AND c.relkind = 'r'
65
+ AND (c.relname LIKE 'actor\\_%' OR c.relname LIKE 'tenant\\_content%')
66
+ AND EXISTS (
67
+ SELECT 1 FROM pg_attribute a
68
+ WHERE a.attrelid = c.oid AND a.attname = 'tenant_id' AND NOT a.attisdropped
69
+ )
70
+ ORDER BY c.relname`;
71
+ for (const table of tables) {
72
+ if (table.owned)
73
+ return yield* refuse(`role ${role} owns ${table.table}, so no policy binds it`);
74
+ if (!table.protected)
75
+ return yield* refuse(`${table.table} has no durable_tenant policy; apply migration 0018_rls`);
76
+ if (!table.writable)
77
+ return yield* refuse(`role ${role} cannot read and write ${table.table}; grant it`);
78
+ }
79
+ const views = yield* sql `
80
+ SELECT v.relname AS view, o.rolname AS owner,
81
+ o.rolsuper OR o.rolbypassrls OR EXISTS (
82
+ SELECT 1 FROM pg_class t
83
+ WHERE t.relnamespace = current_schema()::regnamespace AND t.relkind = 'r'
84
+ AND t.relrowsecurity AND pg_has_role(o.oid, t.relowner, 'USAGE')
85
+ ) AS exempt,
86
+ pg_has_role(${role}, o.oid, 'MEMBER') AS shared,
87
+ NOT EXISTS (
88
+ SELECT 1 FROM pg_class t
89
+ WHERE t.relnamespace = current_schema()::regnamespace AND t.relkind = 'r'
90
+ AND t.relname LIKE 'actor\\_%'
91
+ AND NOT has_table_privilege(o.oid, t.oid, 'SELECT')
92
+ ) AS readable
93
+ FROM pg_class v JOIN pg_roles o ON o.oid = v.relowner
94
+ WHERE v.relnamespace = 'durable'::regnamespace AND v.relkind = 'v'
95
+ ORDER BY v.relname`;
96
+ for (const view of views) {
97
+ if (view.exempt)
98
+ return yield* refuse(`durable.${view.view} belongs to ${view.owner}, which the policies exempt, so it would show every tenant; give the views to a dedicated view-owner role`);
99
+ if (view.shared)
100
+ return yield* refuse(`durable.${view.view} belongs to ${view.owner}, which ${role} can act as, so a turn could alter or drop it; give the views to a role ${role} is not a member of`);
101
+ if (!view.readable)
102
+ return yield* refuse(`durable.${view.view} belongs to ${view.owner}, which cannot read every actor_* table; grant it SELECT`);
103
+ }
104
+ });
105
+ /**
106
+ * Refuses an owned table that would let a tenant-scoped transaction see other
107
+ * tenants' rows, or that `role` cannot use: row-level security must be on with
108
+ * the `durable_tenant` policy its drizzle-kit migration creates, and `role`
109
+ * must not own it, since Postgres exempts a table's owner from its policies.
110
+ */
111
+ export const checkOwnedTable = Effect.fnUntraced(function* (schema, table, role) {
112
+ const sql = yield* SqlClient.SqlClient;
113
+ const [found] = yield* sql `
114
+ SELECT pg_has_role(${role}, c.relowner, 'USAGE') AS owned,
115
+ c.relrowsecurity AND EXISTS (
116
+ SELECT 1 FROM pg_policy p WHERE p.polrelid = c.oid AND p.polname = 'durable_tenant'
117
+ ) AS protected,
118
+ has_table_privilege(${role}, c.oid, 'SELECT, INSERT, UPDATE, DELETE') AS writable
119
+ FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
120
+ WHERE n.nspname = ${schema} AND c.relname = ${table}`;
121
+ if (found?.protected !== true)
122
+ return yield* refuse(`owned table ${schema}.${table} has no durable_tenant policy; apply its drizzle-kit migration`);
123
+ if (found.owned)
124
+ return yield* refuse(`role ${role} owns ${schema}.${table}, so no policy binds it`);
125
+ if (!found.writable)
126
+ return yield* refuse(`role ${role} cannot read and write ${schema}.${table}; grant it`);
127
+ });
128
+ /**
129
+ * Refuses an adopted table `role` cannot use. An adopted table carries no
130
+ * `durable_tenant` policy unless the application added one, so only the
131
+ * privileges are checked: `role` reads it, and writes it when the runtime does.
132
+ */
133
+ export const checkAdoptedTable = Effect.fnUntraced(function* (schema, table, role, writable) {
134
+ const sql = yield* SqlClient.SqlClient;
135
+ const [found] = yield* sql `
136
+ SELECT has_table_privilege(${role}, c.oid, 'SELECT') AS readable,
137
+ has_table_privilege(${role}, c.oid, 'INSERT') AND has_table_privilege(${role}, c.oid, 'UPDATE')
138
+ AND has_table_privilege(${role}, c.oid, 'DELETE') AS writable
139
+ FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
140
+ WHERE n.nspname = ${schema} AND c.relname = ${table}`;
141
+ if (found?.readable !== true)
142
+ return yield* refuse(`role ${role} cannot read ${schema}.${table}; grant it`);
143
+ if (writable && !found.writable)
144
+ return yield* refuse(`role ${role} cannot read and write ${schema}.${table}; grant it`);
145
+ });
@@ -0,0 +1,10 @@
1
+ import type { SqlError } from "effect/sql";
2
+ /**
3
+ * Whether a SQL failure is worth retrying unchanged: the driver says so, or
4
+ * the server refused the statement for its own state. SQLSTATE `57P01`–`57P03`
5
+ * mean an administrator or crash shutdown or a server still starting or in
6
+ * recovery; `53000`–`53300` cover exhausted resources, disk, memory or slots. The
7
+ * driver reports those as unknown, non-retryable errors, but the same
8
+ * statement succeeds once the server is back.
9
+ */
10
+ export declare const transientSqlError: (error: SqlError.SqlError) => boolean;
@@ -0,0 +1,25 @@
1
+ import { Schema } from "effect";
2
+ /** The SQLSTATE a Postgres error response carries, as the driver keeps it on the error's cause. */
3
+ const ServerResponse = Schema.Struct({ code: Schema.String });
4
+ const isServerResponse = Schema.is(ServerResponse);
5
+ /**
6
+ * Whether a SQL failure is worth retrying unchanged: the driver says so, or
7
+ * the server refused the statement for its own state. SQLSTATE `57P01`–`57P03`
8
+ * mean an administrator or crash shutdown or a server still starting or in
9
+ * recovery; `53000`–`53300` cover exhausted resources, disk, memory or slots. The
10
+ * driver reports those as unknown, non-retryable errors, but the same
11
+ * statement succeeds once the server is back.
12
+ */
13
+ export const transientSqlError = (error) => {
14
+ if (error.isRetryable)
15
+ return true;
16
+ const cause = error.reason.cause;
17
+ return (isServerResponse(cause) &&
18
+ (cause.code === "57P01" ||
19
+ cause.code === "57P02" ||
20
+ cause.code === "57P03" ||
21
+ cause.code === "53000" ||
22
+ cause.code === "53100" ||
23
+ cause.code === "53200" ||
24
+ cause.code === "53300"));
25
+ };
@@ -0,0 +1,132 @@
1
+ import { Context, Duration, Effect, type Scope } from "effect";
2
+ import { ActorError } from "../errors/actor.ts";
3
+ /**
4
+ * Whether this runner should receive traffic. A runner is ready once its
5
+ * storage answers, its schemas are migrated and compatible (checked when the
6
+ * layer builds), it registers at least one actor, job, or query layer, its
7
+ * routing is up, a public runner has its currently assigned shards, and it
8
+ * is not draining. Readiness never waits for actors to
9
+ * wake or workflows to finish.
10
+ */
11
+ export type Readiness = {
12
+ readonly ready: true;
13
+ } | {
14
+ readonly ready: false;
15
+ /**
16
+ * `draining` or `drained` after `drain`; `storage` when the database does
17
+ * not answer; `routing` while acquiring shards or once sharding has
18
+ * shut down; `peering` when a mutual TLS runner's certificate has
19
+ * expired or its credentials have failed to load for too long;
20
+ * `unregistered` before any actor, job, or query layer registers.
21
+ */
22
+ readonly reason: "draining" | "drained" | "storage" | "routing" | "peering" | "unregistered";
23
+ };
24
+ /** What a drain did. */
25
+ export interface DrainReport {
26
+ /**
27
+ * `clean` when claims and background work stopped and every in-flight turn
28
+ * and job attempt finished before the deadline; `deadline-expired`
29
+ * otherwise, when the deadline interrupted what was still in flight.
30
+ */
31
+ readonly outcome: "clean" | "deadline-expired";
32
+ /**
33
+ * Turns the deadline interrupted. Each rolled back, unless its commit had
34
+ * already been sent, in which case its receipt answers the caller's retry.
35
+ */
36
+ readonly interruptedTurns: number;
37
+ /**
38
+ * Job attempts the deadline interrupted. The provider may have applied
39
+ * each call, so each stays ambiguous, and another runner takes it over once
40
+ * its lease ends.
41
+ */
42
+ readonly interruptedJobs: number;
43
+ }
44
+ declare const RuntimeControl_base: Context.ServiceClass<RuntimeControl, "@rikalabs/akter/runtime/drain/RuntimeControl", {
45
+ readonly readiness: Effect.Effect<Readiness>;
46
+ /**
47
+ * Makes the runner unready, refuses new commands, and stops claiming
48
+ * intents, timers, jobs, and subscription deliveries, releasing claimed
49
+ * deliveries to other runners. In-flight turns and job attempts then
50
+ * get until `deadline` to finish before they are interrupted. Pending
51
+ * durable work stays in the database for other runners. The runner keeps
52
+ * its shards until its layer closes, which hands them to the other runners
53
+ * and ends workflow runs still live here, for another runner to replay; so
54
+ * close the layer once the drain returns. A second call waits for the
55
+ * first drain and returns its report.
56
+ */
57
+ readonly drain: (options: {
58
+ readonly deadline: Duration.Input;
59
+ }) => Effect.Effect<DrainReport>;
60
+ }>;
61
+ /**
62
+ * Readiness and bounded graceful drain of this runner. `Actors.layer`
63
+ * provides it.
64
+ */
65
+ export declare class RuntimeControl extends RuntimeControl_base {
66
+ }
67
+ /**
68
+ * Admits turns until a drain closes it, counts the turns in flight, and
69
+ * interrupts them all once the drain's deadline passes.
70
+ */
71
+ export declare const turnGate: () => {
72
+ /**
73
+ * Runs a turn unless the runner drains. A turn the deadline interrupts
74
+ * fails as unavailable once it has rolled back, so its caller retries on
75
+ * the actor's next owner.
76
+ */
77
+ run: <A, E, R>(turn: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ActorError, R>;
78
+ readonly open: boolean;
79
+ /** Refuses new turns and waits until none is in flight. */
80
+ close: Effect.Effect<void, never, never>;
81
+ /**
82
+ * Refuses new turns, interrupts every turn in flight, and returns how many
83
+ * it interrupted, once they have ended.
84
+ */
85
+ expire: Effect.Effect<number, never, never>;
86
+ };
87
+ /** The turn gate a runtime creates once and shares with its drain. */
88
+ export type TurnGate = ReturnType<typeof turnGate>;
89
+ /** The runtime's side of a drain: its relay and background work. */
90
+ interface Drainable {
91
+ readonly gate: TurnGate;
92
+ /** Stops claims and releases claimed deliveries. */
93
+ readonly stopClaims: Effect.Effect<void>;
94
+ readonly attemptsIdle: Effect.Effect<void>;
95
+ /** Interrupts running job attempts and returns how many. */
96
+ readonly interruptAttempts: Effect.Effect<number>;
97
+ /** Stops background maintenance such as retention sweeps. */
98
+ readonly stopBackground: Effect.Effect<void>;
99
+ /** Readiness apart from draining. */
100
+ readonly serving: Effect.Effect<Readiness>;
101
+ }
102
+ /**
103
+ * The drain runs in the runtime's scope, so a caller that stops waiting
104
+ * neither cancels it nor leaves a later caller without its report.
105
+ *
106
+ * The deadline counts from the call and covers stopping claims and background
107
+ * work too: releasing a claimed delivery or ending a sweep writes to the
108
+ * database, which a slow or contended database can hold for longer than the
109
+ * deadline. That stop runs on in the runtime's scope, so claims still end,
110
+ * while the deadline interrupts the turns and job attempts in flight and
111
+ * the report says it expired.
112
+ */
113
+ export declare const runtimeControl: ({ scope, ...runtime }: Drainable & {
114
+ readonly scope: Scope.Scope;
115
+ }) => {
116
+ readonly readiness: Effect.Effect<Readiness>;
117
+ /**
118
+ * Makes the runner unready, refuses new commands, and stops claiming
119
+ * intents, timers, jobs, and subscription deliveries, releasing claimed
120
+ * deliveries to other runners. In-flight turns and job attempts then
121
+ * get until `deadline` to finish before they are interrupted. Pending
122
+ * durable work stays in the database for other runners. The runner keeps
123
+ * its shards until its layer closes, which hands them to the other runners
124
+ * and ends workflow runs still live here, for another runner to replay; so
125
+ * close the layer once the drain returns. A second call waits for the
126
+ * first drain and returns its report.
127
+ */
128
+ readonly drain: (options: {
129
+ readonly deadline: Duration.Input;
130
+ }) => Effect.Effect<DrainReport>;
131
+ };
132
+ export {};
@@ -0,0 +1,109 @@
1
+ import { Context, Deferred, Duration, Effect, Exit, Fiber, Option } from "effect";
2
+ import { ActorError, ActorUnavailable } from "../errors/actor.js";
3
+ /**
4
+ * Readiness and bounded graceful drain of this runner. `Actors.layer`
5
+ * provides it.
6
+ */
7
+ export class RuntimeControl extends Context.Service()("@rikalabs/akter/runtime/drain/RuntimeControl") {
8
+ }
9
+ const refused = () => ActorError.make({
10
+ reason: ActorUnavailable.make({ cause: new Error("Runner is draining") }),
11
+ });
12
+ /**
13
+ * Admits turns until a drain closes it, counts the turns in flight, and
14
+ * interrupts them all once the drain's deadline passes.
15
+ */
16
+ export const turnGate = () => {
17
+ let open = true;
18
+ let inFlight = 0;
19
+ let interrupted = 0;
20
+ let idle;
21
+ const expired = Deferred.makeUnsafe();
22
+ const deadline = Deferred.await(expired).pipe(Effect.andThen(Effect.suspend(() => {
23
+ interrupted += 1;
24
+ return Effect.fail(refused());
25
+ })));
26
+ return {
27
+ /**
28
+ * Runs a turn unless the runner drains. A turn the deadline interrupts
29
+ * fails as unavailable once it has rolled back, so its caller retries on
30
+ * the actor's next owner.
31
+ */
32
+ run: (turn) => Effect.suspend(() => {
33
+ if (!open)
34
+ return Effect.fail(refused());
35
+ inFlight += 1;
36
+ return Effect.raceFirst(turn, deadline).pipe(Effect.ensuring(Effect.sync(() => {
37
+ inFlight -= 1;
38
+ if (inFlight === 0 && idle !== undefined)
39
+ Deferred.doneUnsafe(idle, Exit.void);
40
+ })));
41
+ }),
42
+ get open() {
43
+ return open;
44
+ },
45
+ /** Refuses new turns and waits until none is in flight. */
46
+ close: Effect.suspend(() => {
47
+ open = false;
48
+ if (inFlight === 0)
49
+ return Effect.void;
50
+ idle ??= Deferred.makeUnsafe();
51
+ return Deferred.await(idle);
52
+ }),
53
+ /**
54
+ * Refuses new turns, interrupts every turn in flight, and returns how many
55
+ * it interrupted, once they have ended.
56
+ */
57
+ expire: Effect.suspend(() => {
58
+ open = false;
59
+ Deferred.doneUnsafe(expired, Exit.void);
60
+ if (inFlight > 0)
61
+ idle ??= Deferred.makeUnsafe();
62
+ return (idle === undefined ? Effect.void : Deferred.await(idle)).pipe(Effect.map(() => interrupted));
63
+ }),
64
+ };
65
+ };
66
+ /**
67
+ * The drain runs in the runtime's scope, so a caller that stops waiting
68
+ * neither cancels it nor leaves a later caller without its report.
69
+ *
70
+ * The deadline counts from the call and covers stopping claims and background
71
+ * work too: releasing a claimed delivery or ending a sweep writes to the
72
+ * database, which a slow or contended database can hold for longer than the
73
+ * deadline. That stop runs on in the runtime's scope, so claims still end,
74
+ * while the deadline interrupts the turns and job attempts in flight and
75
+ * the report says it expired.
76
+ */
77
+ export const runtimeControl = ({ scope, ...runtime }) => {
78
+ let state = "serving";
79
+ const report = Deferred.makeUnsafe();
80
+ const run = (deadline) => Effect.gen(function* () {
81
+ const stopping = yield* runtime.stopClaims.pipe(Effect.andThen(runtime.stopBackground), Effect.forkIn(scope));
82
+ const finished = yield* Fiber.join(stopping).pipe(Effect.andThen(Effect.all([runtime.gate.close, runtime.attemptsIdle], {
83
+ concurrency: 2,
84
+ discard: true,
85
+ })), Effect.timeoutOption(deadline));
86
+ const done = Option.isSome(finished)
87
+ ? { outcome: "clean", interruptedTurns: 0, interruptedJobs: 0 }
88
+ : yield* Effect.all({
89
+ interruptedTurns: runtime.gate.expire,
90
+ interruptedJobs: runtime.interruptAttempts,
91
+ }, { concurrency: 2 }).pipe(Effect.map((counts) => ({ outcome: "deadline-expired", ...counts })));
92
+ if (done.outcome === "deadline-expired")
93
+ yield* Effect.logWarning("Drain deadline expired; interrupted in-flight work").pipe(Effect.annotateLogs({
94
+ interruptedTurns: done.interruptedTurns,
95
+ interruptedJobs: done.interruptedJobs,
96
+ }));
97
+ state = "drained";
98
+ yield* Deferred.succeed(report, done);
99
+ });
100
+ return RuntimeControl.of({
101
+ readiness: Effect.suspend(() => state === "serving" ? runtime.serving : Effect.succeed({ ready: false, reason: state })),
102
+ drain: (options) => Effect.suspend(() => {
103
+ if (state !== "serving")
104
+ return Deferred.await(report);
105
+ state = "draining";
106
+ return run(Duration.fromInputUnsafe(options.deadline)).pipe(Effect.forkIn(scope), Effect.andThen(Deferred.await(report)));
107
+ }),
108
+ });
109
+ };
@@ -0,0 +1,86 @@
1
+ import type { Request } from "../request.ts";
2
+ /**
3
+ * The most commands one turn batch runs. It stays below the 64 open
4
+ * subtransactions past which Postgres overflows its per-backend subtransaction
5
+ * cache, since a batch of an actor whose handlers issue statements can hold a
6
+ * savepoint per command.
7
+ */
8
+ export declare const BATCH_CAP = 32;
9
+ /**
10
+ * The most calls of one commutative reducer that one merged turn combines.
11
+ * Merging never waits for calls: it takes only those already waiting.
12
+ */
13
+ export declare const MERGE_CAP = 1024;
14
+ /**
15
+ * The most command ids an activation keeps to run alone after a failed batch.
16
+ * An id leaves the set when its retry is taken, and a caller that never
17
+ * retries would otherwise leave it for the activation's lifetime. Past the
18
+ * cap the oldest go first: an evicted id's late retry may join a batch again,
19
+ * which a retryable failure makes safe.
20
+ */
21
+ export declare const ALONE_CAP: number;
22
+ /** Adds `ids` to `alone` as its newest entries, then drops the oldest past `ALONE_CAP`. */
23
+ export declare const markAlone: ({ alone, ids, }: {
24
+ readonly alone: Set<string>;
25
+ readonly ids: Iterable<string>;
26
+ }) => void;
27
+ /** A waiting command, and whether its reducer merges with its neighbours. */
28
+ interface Mergeable {
29
+ readonly request: Request;
30
+ readonly command: {
31
+ readonly merge?: unknown;
32
+ };
33
+ }
34
+ /** True when `next` joins a merged turn of `previous`'s commutative reducer. */
35
+ export declare const merges: ({ previous, next, }: {
36
+ readonly previous: Mergeable;
37
+ readonly next: Mergeable;
38
+ }) => boolean;
39
+ /**
40
+ * Removes the next batch from the front of `waiting`, in delivery order: the
41
+ * first command, then each command behind it that is already waiting, up to
42
+ * `BATCH_CAP` turns. Consecutive calls of one commutative reducer are one
43
+ * merged turn of up to `MERGE_CAP` calls. Nothing waits for more to arrive. A
44
+ * command joins a batch only once its own `queued` hook has finished, so the
45
+ * batch stops at the first command that is still in it, and takes nothing when
46
+ * that is the first.
47
+ *
48
+ * A batch stops before a command id it already holds, so a retry queued
49
+ * behind its original resolves through the receipt the original commits. It
50
+ * also stops before a command listed in `alone`, and such a command runs in a
51
+ * batch of its own, once: these are the commands of a batch that failed, run
52
+ * one per transaction until each has been processed.
53
+ */
54
+ export declare const takeBatch: <W extends Mergeable & {
55
+ /** Set once the request's `queued` hook has finished. */
56
+ readonly queued: boolean;
57
+ }>({ waiting, alone, }: {
58
+ readonly waiting: Array<W>;
59
+ readonly alone: Set<string>;
60
+ }) => Array<W>;
61
+ /**
62
+ * One activation handler's waiting commands in arrival order, and its
63
+ * worker's wake-up. A command is offered as Cluster delivers it and becomes
64
+ * takeable once its `queued` hook finished; the wake-up stays open while the
65
+ * front command is takeable, so the worker never sleeps past ready work and a
66
+ * command whose hook is still running holds back every command behind it.
67
+ * `alone` outlives the handler: it holds the ids of a failed batch, each run
68
+ * in a transaction of its own once.
69
+ */
70
+ export declare const activationMailbox: <W extends Mergeable & {
71
+ queued: boolean;
72
+ }>(alone: Set<string>) => {
73
+ offer: (entry: W) => void;
74
+ /** Marks `entry`'s `queued` hook finished, so a batch may take it. */
75
+ queued: (entry: W) => void;
76
+ /** Waits until the front command may be takeable. */
77
+ await: import("effect/Effect").Effect<void, never, never>;
78
+ /** The next batch, possibly empty; the wake-up closes once the front command is not takeable. */
79
+ take: () => W[];
80
+ /** Puts taken commands back in front of everything that arrived since. */
81
+ requeue: (entries: ReadonlyArray<W>) => void;
82
+ /** Runs each of `ids` alone once, the next time it is taken. */
83
+ isolate: (ids: Iterable<string>) => void;
84
+ size: () => number;
85
+ };
86
+ export {};