@rivetkit/engine 1.0.0 → 2.2.1-pr.4600.b74ff3b

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 (1038) hide show
  1. package/CLAUDE.md +38 -0
  2. package/artifacts/config-schema.json +1140 -0
  3. package/artifacts/errors/actor.kv_storage_quota_exceeded.json +5 -0
  4. package/artifacts/errors/actor.no_runner_config_configured.json +5 -0
  5. package/artifacts/errors/guard.actor_runner_failed.json +5 -0
  6. package/artifacts/errors/guard.invalid_request.json +5 -0
  7. package/artifacts/errors/guard.invalid_request_body.json +5 -0
  8. package/artifacts/errors/guard.invalid_response_body.json +5 -0
  9. package/artifacts/errors/guard.missing_query_parameter.json +5 -0
  10. package/artifacts/errors/guard.query_ambiguous_runner_configs.json +5 -0
  11. package/artifacts/errors/guard.query_duplicate_param.json +5 -0
  12. package/artifacts/errors/guard.query_empty_actor_name.json +5 -0
  13. package/artifacts/errors/guard.query_get_disallowed_params.json +5 -0
  14. package/artifacts/errors/guard.query_invalid_base64_input.json +5 -0
  15. package/artifacts/errors/guard.query_invalid_cbor_input.json +5 -0
  16. package/artifacts/errors/guard.query_invalid_params.json +5 -0
  17. package/artifacts/errors/guard.query_invalid_percent_encoding.json +5 -0
  18. package/artifacts/errors/guard.query_missing_runner_name.json +5 -0
  19. package/artifacts/errors/guard.query_no_runner_configs.json +5 -0
  20. package/artifacts/errors/guard.query_param_missing_equals.json +5 -0
  21. package/artifacts/errors/guard.query_path_token_syntax.json +5 -0
  22. package/artifacts/errors/guard.query_unknown_param.json +5 -0
  23. package/artifacts/errors/guard.request_body_too_large.json +5 -0
  24. package/artifacts/errors/guard.response_body_too_large.json +5 -0
  25. package/artifacts/errors/serverless_runner_pool.failed_to_fetch_metadata.json +5 -0
  26. package/artifacts/errors/serverless_runner_pool.not_found.json +5 -0
  27. package/artifacts/errors/{api.rate_limited.json → test.api_rate_limited.json} +2 -2
  28. package/artifacts/errors/{namespace.invalid_name.json → test.namespace_invalid_name.json} +2 -2
  29. package/artifacts/errors/ws.going_away.json +5 -0
  30. package/artifacts/openapi.json +458 -6
  31. package/docker/builder-base/linux-gnu.Dockerfile +21 -0
  32. package/docker/builder-base/linux-musl.Dockerfile +53 -0
  33. package/docker/builder-base/osxcross.Dockerfile +42 -0
  34. package/docker/builder-base/windows-mingw.Dockerfile +41 -0
  35. package/docker/builder-base/windows-msvc.Dockerfile +25 -0
  36. package/docker/dev/docker-compose.yml +43 -18
  37. package/docker/dev/grafana/dashboards/api.json +1077 -1239
  38. package/docker/dev/grafana/dashboards/cache.json +911 -1074
  39. package/docker/dev/grafana/dashboards/epoxy.json +1606 -0
  40. package/docker/dev/grafana/dashboards/futures.json +242 -229
  41. package/docker/dev/grafana/dashboards/gasoline.json +2663 -2476
  42. package/docker/dev/grafana/dashboards/guard.json +1433 -1273
  43. package/docker/dev/grafana/dashboards/operation.json +871 -0
  44. package/docker/dev/grafana/dashboards/pegboard.json +1274 -0
  45. package/docker/dev/grafana/dashboards/tokio.json +930 -1004
  46. package/docker/dev/grafana/dashboards/traces.json +35 -13
  47. package/docker/dev/grafana/provisioning/datasources/datasources.yaml +8 -0
  48. package/docker/{dev-multinode/otel-collector-server → dev/otel-collector}/config.yaml +18 -13
  49. package/docker/dev/prometheus/prometheus.yml +4 -0
  50. package/docker/dev/rivet-engine/config.jsonc +9 -16
  51. package/docker/dev-host/docker-compose.yml +38 -16
  52. package/docker/dev-host/grafana/dashboards/api.json +1077 -1239
  53. package/docker/dev-host/grafana/dashboards/cache.json +911 -1074
  54. package/docker/dev-host/grafana/dashboards/epoxy.json +1606 -0
  55. package/docker/dev-host/grafana/dashboards/futures.json +242 -229
  56. package/docker/dev-host/grafana/dashboards/gasoline.json +2663 -2476
  57. package/docker/dev-host/grafana/dashboards/guard.json +1433 -1273
  58. package/docker/dev-host/grafana/dashboards/operation.json +871 -0
  59. package/docker/dev-host/grafana/dashboards/pegboard.json +1274 -0
  60. package/docker/dev-host/grafana/dashboards/tokio.json +930 -1004
  61. package/docker/dev-host/grafana/dashboards/traces.json +35 -13
  62. package/docker/dev-host/grafana/provisioning/datasources/datasources.yaml +8 -0
  63. package/docker/dev-host/{otel-collector-server → otel-collector}/config.yaml +18 -13
  64. package/docker/dev-host/prometheus/prometheus.yml +4 -0
  65. package/docker/dev-host/rivet-engine/config.jsonc +9 -16
  66. package/docker/dev-multidc/core/grafana/dashboards/api.json +1077 -1239
  67. package/docker/dev-multidc/core/grafana/dashboards/cache.json +911 -1074
  68. package/docker/dev-multidc/core/grafana/dashboards/epoxy.json +1606 -0
  69. package/docker/dev-multidc/core/grafana/dashboards/futures.json +242 -229
  70. package/docker/dev-multidc/core/grafana/dashboards/gasoline.json +2663 -2476
  71. package/docker/dev-multidc/core/grafana/dashboards/guard.json +1433 -1273
  72. package/docker/dev-multidc/core/grafana/dashboards/operation.json +871 -0
  73. package/docker/dev-multidc/core/grafana/dashboards/pegboard.json +1274 -0
  74. package/docker/dev-multidc/core/grafana/dashboards/tokio.json +930 -1004
  75. package/docker/dev-multidc/core/grafana/dashboards/traces.json +35 -13
  76. package/docker/dev-multidc/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  77. package/docker/dev-multidc/core/prometheus/prometheus.yml +4 -0
  78. package/docker/dev-multidc/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +18 -13
  79. package/docker/dev-multidc/datacenters/dc-a/rivet-engine/config.jsonc +23 -22
  80. package/docker/{dev-multidc-multinode/datacenters/dc-b/otel-collector-server → dev-multidc/datacenters/dc-b/otel-collector}/config.yaml +18 -13
  81. package/docker/dev-multidc/datacenters/dc-b/rivet-engine/config.jsonc +23 -22
  82. package/docker/dev-multidc/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +18 -13
  83. package/docker/dev-multidc/datacenters/dc-c/rivet-engine/config.jsonc +23 -22
  84. package/docker/dev-multidc/docker-compose.yml +71 -64
  85. package/docker/dev-multidc-multinode/core/grafana/dashboards/api.json +1077 -1239
  86. package/docker/dev-multidc-multinode/core/grafana/dashboards/cache.json +911 -1074
  87. package/docker/dev-multidc-multinode/core/grafana/dashboards/epoxy.json +1606 -0
  88. package/docker/dev-multidc-multinode/core/grafana/dashboards/futures.json +242 -229
  89. package/docker/dev-multidc-multinode/core/grafana/dashboards/gasoline.json +2663 -2476
  90. package/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json +1433 -1273
  91. package/docker/dev-multidc-multinode/core/grafana/dashboards/operation.json +871 -0
  92. package/docker/dev-multidc-multinode/core/grafana/dashboards/pegboard.json +1274 -0
  93. package/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json +930 -1004
  94. package/docker/dev-multidc-multinode/core/grafana/dashboards/traces.json +35 -13
  95. package/docker/dev-multidc-multinode/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  96. package/docker/dev-multidc-multinode/core/prometheus/prometheus.yml +4 -0
  97. package/docker/dev-multidc-multinode/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +28 -13
  98. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/0/config.jsonc +23 -22
  99. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/1/config.jsonc +23 -22
  100. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/2/config.jsonc +23 -22
  101. package/docker/{dev-multidc/datacenters/dc-b/otel-collector-server → dev-multidc-multinode/datacenters/dc-b/otel-collector}/config.yaml +28 -13
  102. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/0/config.jsonc +23 -22
  103. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/1/config.jsonc +23 -22
  104. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/2/config.jsonc +23 -22
  105. package/docker/dev-multidc-multinode/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +28 -13
  106. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/0/config.jsonc +23 -22
  107. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/1/config.jsonc +23 -22
  108. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/2/config.jsonc +23 -22
  109. package/docker/dev-multidc-multinode/docker-compose.yml +113 -88
  110. package/docker/dev-multinode/docker-compose.yml +57 -26
  111. package/docker/dev-multinode/grafana/dashboards/api.json +1077 -1239
  112. package/docker/dev-multinode/grafana/dashboards/cache.json +911 -1074
  113. package/docker/dev-multinode/grafana/dashboards/epoxy.json +1606 -0
  114. package/docker/dev-multinode/grafana/dashboards/futures.json +242 -229
  115. package/docker/dev-multinode/grafana/dashboards/gasoline.json +2663 -2476
  116. package/docker/dev-multinode/grafana/dashboards/guard.json +1433 -1273
  117. package/docker/dev-multinode/grafana/dashboards/operation.json +871 -0
  118. package/docker/dev-multinode/grafana/dashboards/pegboard.json +1274 -0
  119. package/docker/dev-multinode/grafana/dashboards/tokio.json +930 -1004
  120. package/docker/dev-multinode/grafana/dashboards/traces.json +35 -13
  121. package/docker/dev-multinode/grafana/provisioning/datasources/datasources.yaml +8 -0
  122. package/docker/{dev/otel-collector-server → dev-multinode/otel-collector}/config.yaml +28 -13
  123. package/docker/dev-multinode/prometheus/prometheus.yml +4 -0
  124. package/docker/dev-multinode/rivet-engine/0/config.jsonc +9 -16
  125. package/docker/dev-multinode/rivet-engine/1/config.jsonc +9 -16
  126. package/docker/dev-multinode/rivet-engine/2/config.jsonc +9 -16
  127. package/docker/engine/linux-aarch64.Dockerfile +9 -49
  128. package/docker/engine/linux-x86_64.Dockerfile +7 -57
  129. package/docker/engine/macos-aarch64.Dockerfile +8 -54
  130. package/docker/engine/macos-x86_64.Dockerfile +9 -55
  131. package/docker/engine/windows.Dockerfile +5 -53
  132. package/docker/template/grafana-dashboards/api.json +1077 -1239
  133. package/docker/template/grafana-dashboards/cache.json +911 -1074
  134. package/docker/template/grafana-dashboards/epoxy.json +1606 -0
  135. package/docker/template/grafana-dashboards/futures.json +242 -229
  136. package/docker/template/grafana-dashboards/gasoline.json +2663 -2476
  137. package/docker/template/grafana-dashboards/guard.json +1433 -1273
  138. package/docker/template/grafana-dashboards/operation.json +871 -0
  139. package/docker/template/grafana-dashboards/pegboard.json +1274 -0
  140. package/docker/template/grafana-dashboards/tokio.json +930 -1004
  141. package/docker/template/grafana-dashboards/traces.json +35 -13
  142. package/docker/template/node_modules/.bin/js-yaml +4 -4
  143. package/docker/template/node_modules/.bin/tsc +4 -4
  144. package/docker/template/node_modules/.bin/tsserver +4 -4
  145. package/docker/template/node_modules/.bin/tsx +4 -4
  146. package/docker/template/src/docker-compose.ts +42 -29
  147. package/docker/template/src/main.ts +4 -4
  148. package/docker/template/src/services/core/grafana.ts +14 -1
  149. package/docker/template/src/services/core/prometheus.ts +20 -0
  150. package/docker/template/src/services/edge/{otel-collector-server.ts → otel-collector.ts} +55 -24
  151. package/docker/template/src/services/edge/rivet-engine.ts +4 -16
  152. package/docker/template/src/services/edge/runner.ts +2 -3
  153. package/docker/universal/Dockerfile +5 -3
  154. package/package.json +2 -5
  155. package/packages/api-builder/src/global_context.rs +1 -1
  156. package/packages/api-builder/src/metrics.rs +28 -24
  157. package/packages/api-builder/src/middleware.rs +30 -48
  158. package/packages/api-builder/src/router.rs +13 -1
  159. package/packages/api-peer/Cargo.toml +7 -9
  160. package/packages/api-peer/src/actors/delete.rs +56 -57
  161. package/packages/api-peer/src/actors/get_or_create.rs +139 -0
  162. package/packages/api-peer/src/actors/kv_get.rs +40 -28
  163. package/packages/api-peer/src/actors/list.rs +31 -14
  164. package/packages/api-peer/src/actors/list_names.rs +6 -6
  165. package/packages/api-peer/src/actors/mod.rs +3 -0
  166. package/packages/api-peer/src/actors/reschedule.rs +55 -0
  167. package/packages/api-peer/src/actors/sleep.rs +55 -0
  168. package/packages/api-peer/src/envoys.rs +57 -0
  169. package/packages/api-peer/src/internal.rs +441 -24
  170. package/packages/api-peer/src/lib.rs +2 -1
  171. package/packages/api-peer/src/namespaces.rs +24 -9
  172. package/packages/api-peer/src/router.rs +31 -7
  173. package/packages/api-peer/src/runner_configs.rs +66 -19
  174. package/packages/api-peer/src/runners.rs +30 -32
  175. package/packages/api-public/Cargo.toml +2 -0
  176. package/packages/api-public/src/actors/create.rs +8 -17
  177. package/packages/api-public/src/actors/delete.rs +11 -35
  178. package/packages/api-public/src/actors/get_or_create.rs +23 -95
  179. package/packages/api-public/src/actors/kv_get.rs +12 -29
  180. package/packages/api-public/src/actors/list.rs +56 -78
  181. package/packages/api-public/src/actors/list_names.rs +15 -14
  182. package/packages/api-public/src/actors/mod.rs +2 -0
  183. package/packages/api-public/src/actors/reschedule.rs +65 -0
  184. package/packages/api-public/src/actors/sleep.rs +64 -0
  185. package/packages/api-public/src/actors/utils.rs +12 -60
  186. package/packages/api-public/src/ctx.rs +14 -6
  187. package/packages/api-public/src/datacenters.rs +5 -5
  188. package/packages/api-public/src/envoys.rs +57 -0
  189. package/packages/api-public/src/errors.rs +0 -7
  190. package/packages/api-public/src/health.rs +51 -44
  191. package/packages/api-public/src/lib.rs +2 -1
  192. package/packages/api-public/src/metadata.rs +44 -14
  193. package/packages/api-public/src/namespaces.rs +11 -11
  194. package/packages/api-public/src/router.rs +22 -5
  195. package/packages/api-public/src/runner_configs/delete.rs +13 -10
  196. package/packages/api-public/src/runner_configs/list.rs +5 -2
  197. package/packages/api-public/src/runner_configs/refresh_metadata.rs +1 -1
  198. package/packages/api-public/src/runner_configs/serverless_health_check.rs +2 -2
  199. package/packages/api-public/src/runner_configs/upsert.rs +12 -9
  200. package/packages/api-public/src/runner_configs/utils.rs +35 -175
  201. package/packages/api-public/src/runners.rs +17 -45
  202. package/packages/{dump-openapi → api-public-openapi-gen}/Cargo.toml +1 -1
  203. package/packages/api-types/src/actors/create.rs +1 -0
  204. package/packages/api-types/src/actors/delete.rs +20 -0
  205. package/packages/api-types/src/actors/get_or_create.rs +30 -0
  206. package/packages/api-types/src/actors/kv_get.rs +25 -0
  207. package/packages/api-types/src/actors/list.rs +8 -1
  208. package/packages/api-types/src/actors/mod.rs +5 -0
  209. package/packages/api-types/src/actors/reschedule.rs +26 -0
  210. package/packages/api-types/src/actors/sleep.rs +26 -0
  211. package/packages/api-types/src/datacenters/list.rs +2 -2
  212. package/packages/api-types/src/envoys/list.rs +24 -0
  213. package/packages/api-types/src/envoys/mod.rs +1 -0
  214. package/packages/api-types/src/lib.rs +1 -0
  215. package/packages/api-types/src/namespaces/list.rs +4 -0
  216. package/packages/api-types/src/namespaces/runner_configs.rs +23 -2
  217. package/packages/api-types/src/runner_configs/list.rs +6 -1
  218. package/packages/api-types/src/runner_configs/mod.rs +12 -0
  219. package/packages/api-types/src/runners/list.rs +4 -0
  220. package/packages/api-types/src/runners/list_names.rs +21 -0
  221. package/packages/api-types/src/runners/mod.rs +1 -0
  222. package/packages/api-util/src/lib.rs +44 -21
  223. package/packages/bootstrap/Cargo.toml +7 -4
  224. package/packages/bootstrap/src/backfill.rs +53 -0
  225. package/packages/bootstrap/src/lib.rs +43 -7
  226. package/packages/cache/Cargo.toml +3 -1
  227. package/packages/cache/src/driver.rs +43 -151
  228. package/packages/cache/src/getter_ctx.rs +48 -70
  229. package/packages/cache/src/inner.rs +28 -18
  230. package/packages/cache/src/key.rs +17 -3
  231. package/packages/cache/src/lib.rs +0 -2
  232. package/packages/cache/src/metrics.rs +43 -31
  233. package/packages/cache/src/req_config.rs +219 -156
  234. package/packages/cache/tests/fetch.rs +91 -0
  235. package/packages/cache/tests/in_flight.rs +361 -0
  236. package/packages/cache/tests/ttl.rs +314 -0
  237. package/packages/cache-purge/src/lib.rs +1 -1
  238. package/packages/config/Cargo.toml +1 -0
  239. package/packages/config/src/config/cache.rs +10 -3
  240. package/packages/config/src/config/clickhouse.rs +0 -30
  241. package/packages/config/src/config/{db.rs → db/mod.rs} +3 -18
  242. package/packages/config/src/config/db/postgres.rs +59 -0
  243. package/packages/config/src/config/guard.rs +19 -0
  244. package/packages/config/src/config/metrics.rs +22 -0
  245. package/packages/config/src/config/mod.rs +44 -10
  246. package/packages/config/src/config/pegboard.rs +242 -16
  247. package/packages/config/src/config/pubsub.rs +11 -0
  248. package/packages/config/src/config/runtime.rs +58 -0
  249. package/packages/config/src/config/telemetry.rs +1 -0
  250. package/packages/config/src/config/topology.rs +78 -19
  251. package/packages/config/src/defaults.rs +3 -0
  252. package/packages/config/src/lib.rs +10 -1
  253. package/packages/config-schema-gen/Cargo.toml +11 -0
  254. package/packages/config-schema-gen/build.rs +26 -0
  255. package/packages/config-schema-gen/src/lib.rs +2 -0
  256. package/packages/engine/Cargo.toml +11 -2
  257. package/packages/engine/src/commands/db/mod.rs +0 -10
  258. package/packages/engine/src/commands/epoxy.rs +395 -0
  259. package/packages/engine/src/commands/mod.rs +1 -1
  260. package/packages/engine/src/commands/start.rs +43 -63
  261. package/packages/engine/src/commands/udb/cli.rs +148 -4
  262. package/packages/engine/src/commands/wf/mod.rs +83 -12
  263. package/packages/engine/src/commands/wf/signal.rs +38 -0
  264. package/packages/engine/src/lib.rs +6 -3
  265. package/packages/engine/src/main.rs +1 -1
  266. package/packages/engine/src/run_config.rs +6 -7
  267. package/packages/engine/src/util/db.rs +1 -25
  268. package/packages/engine/src/util/wf/mod.rs +39 -5
  269. package/packages/engine/tests/common/actors.rs +50 -332
  270. package/packages/engine/tests/common/api/mod.rs +7 -0
  271. package/packages/engine/tests/common/api/peer.rs +364 -0
  272. package/packages/engine/tests/common/api/public.rs +473 -0
  273. package/packages/engine/tests/common/ctx.rs +15 -3
  274. package/packages/engine/tests/common/mod.rs +8 -5
  275. package/packages/engine/tests/common/test_envoy.rs +87 -0
  276. package/packages/engine/tests/common/test_helpers.rs +218 -130
  277. package/packages/engine/tests/common/test_runner.rs +273 -0
  278. package/packages/engine/tests/envoy/actors_lifecycle.rs +1277 -0
  279. package/packages/engine/tests/envoy/mod.rs +1 -0
  280. package/packages/engine/tests/mod.rs +3 -0
  281. package/packages/engine/tests/runner/actors_alarm.rs +1453 -0
  282. package/packages/engine/tests/runner/actors_kv_crud.rs +996 -0
  283. package/packages/engine/tests/runner/actors_kv_delete_range.rs +126 -0
  284. package/packages/engine/tests/runner/actors_kv_drop.rs +255 -0
  285. package/packages/engine/tests/runner/actors_kv_list.rs +1061 -0
  286. package/packages/engine/tests/runner/actors_kv_misc.rs +882 -0
  287. package/packages/engine/tests/runner/actors_lifecycle.rs +1284 -0
  288. package/packages/engine/tests/runner/actors_scheduling_errors.rs +1005 -0
  289. package/packages/engine/tests/runner/api_actors_create.rs +422 -0
  290. package/packages/engine/tests/runner/api_actors_delete.rs +487 -0
  291. package/packages/engine/tests/runner/api_actors_get_or_create.rs +634 -0
  292. package/packages/engine/tests/runner/api_actors_list.rs +1771 -0
  293. package/packages/engine/tests/runner/api_actors_list_names.rs +691 -0
  294. package/packages/engine/tests/runner/api_namespaces_create.rs +428 -0
  295. package/packages/engine/tests/runner/api_namespaces_list.rs +760 -0
  296. package/packages/engine/tests/runner/api_runner_configs_list.rs +646 -0
  297. package/packages/engine/tests/runner/api_runner_configs_upsert.rs +651 -0
  298. package/packages/engine/tests/runner/api_runners_list.rs +166 -0
  299. package/packages/engine/tests/runner/api_runners_list_names.rs +386 -0
  300. package/packages/engine/tests/runner/mod.rs +20 -0
  301. package/packages/engine/tests/runner/runner_drain_on_version.rs +620 -0
  302. package/packages/env/Cargo.toml +0 -4
  303. package/packages/env/src/lib.rs +0 -18
  304. package/packages/epoxy/Cargo.toml +3 -2
  305. package/packages/epoxy/README.md +554 -93
  306. package/packages/epoxy/src/consts.rs +4 -36
  307. package/packages/epoxy/src/http_client.rs +59 -26
  308. package/packages/epoxy/src/http_routes.rs +73 -10
  309. package/packages/epoxy/src/keys/keys.rs +260 -11
  310. package/packages/epoxy/src/keys/mod.rs +11 -1
  311. package/packages/epoxy/src/keys/replica.rs +5 -260
  312. package/packages/epoxy/src/lib.rs +2 -1
  313. package/packages/epoxy/src/metrics.rs +118 -0
  314. package/packages/epoxy/src/ops/kv/get_local.rs +15 -24
  315. package/packages/epoxy/src/ops/kv/get_optimistic.rs +102 -64
  316. package/packages/epoxy/src/ops/kv/mod.rs +1 -0
  317. package/packages/epoxy/src/ops/kv/purge_local.rs +18 -9
  318. package/packages/epoxy/src/ops/kv/read_value.rs +92 -0
  319. package/packages/epoxy/src/ops/mod.rs +0 -1
  320. package/packages/epoxy/src/ops/propose.rs +1079 -194
  321. package/packages/epoxy/src/replica/ballot.rs +162 -102
  322. package/packages/epoxy/src/replica/changelog.rs +147 -0
  323. package/packages/epoxy/src/replica/commit_kv.rs +69 -66
  324. package/packages/epoxy/src/replica/message_request.rs +33 -48
  325. package/packages/epoxy/src/replica/messages/accept.rs +82 -41
  326. package/packages/epoxy/src/replica/messages/commit.rs +21 -33
  327. package/packages/epoxy/src/replica/messages/mod.rs +0 -8
  328. package/packages/epoxy/src/replica/messages/prepare.rs +68 -69
  329. package/packages/epoxy/src/replica/mod.rs +1 -6
  330. package/packages/epoxy/src/replica/update_config.rs +3 -1
  331. package/packages/epoxy/src/types.rs +30 -54
  332. package/packages/epoxy/src/utils.rs +149 -16
  333. package/packages/epoxy/src/workflows/backfill.rs +233 -0
  334. package/packages/epoxy/src/workflows/coordinator/mod.rs +33 -7
  335. package/packages/epoxy/src/workflows/coordinator/reconfigure.rs +44 -0
  336. package/packages/epoxy/src/workflows/coordinator/replica_status_change.rs +4 -3
  337. package/packages/epoxy/src/workflows/mod.rs +1 -1
  338. package/packages/epoxy/src/workflows/replica/mod.rs +4 -6
  339. package/packages/epoxy/src/workflows/replica/setup.rs +130 -771
  340. package/packages/epoxy/tests/backfill.rs +65 -0
  341. package/packages/epoxy/tests/backfill_snapshot.rs +233 -0
  342. package/packages/epoxy/tests/common/mod.rs +77 -21
  343. package/packages/epoxy/tests/common/utils.rs +366 -10
  344. package/packages/epoxy/tests/consensus_regressions.rs +285 -0
  345. package/packages/epoxy/tests/kv.rs +128 -167
  346. package/packages/epoxy/tests/kv_get_optimistic.rs +257 -157
  347. package/packages/epoxy/tests/migration.rs +75 -0
  348. package/packages/epoxy/tests/proposal.rs +133 -28
  349. package/packages/epoxy/tests/reconfigure.rs +92 -474
  350. package/packages/error/tests/basic.rs +8 -8
  351. package/packages/gasoline/Cargo.toml +1 -0
  352. package/packages/gasoline/src/builder/common/message.rs +19 -47
  353. package/packages/gasoline/src/builder/common/signal.rs +37 -21
  354. package/packages/gasoline/src/builder/common/workflow.rs +19 -15
  355. package/packages/gasoline/src/builder/workflow/lupe.rs +295 -0
  356. package/packages/gasoline/src/builder/workflow/message.rs +24 -47
  357. package/packages/gasoline/src/builder/workflow/mod.rs +1 -0
  358. package/packages/gasoline/src/builder/workflow/signal.rs +68 -22
  359. package/packages/gasoline/src/builder/workflow/sub_workflow.rs +6 -15
  360. package/packages/gasoline/src/ctx/activity.rs +46 -6
  361. package/packages/gasoline/src/ctx/common.rs +26 -23
  362. package/packages/gasoline/src/ctx/listen.rs +33 -50
  363. package/packages/gasoline/src/ctx/message.rs +76 -64
  364. package/packages/gasoline/src/ctx/operation.rs +15 -5
  365. package/packages/gasoline/src/ctx/standalone.rs +32 -4
  366. package/packages/gasoline/src/ctx/test.rs +31 -6
  367. package/packages/gasoline/src/ctx/versioned_workflow.rs +33 -7
  368. package/packages/gasoline/src/ctx/workflow.rs +194 -384
  369. package/packages/gasoline/src/db/debug.rs +49 -9
  370. package/packages/gasoline/src/db/kv/debug.rs +905 -15
  371. package/packages/gasoline/src/db/kv/keys/history.rs +434 -9
  372. package/packages/gasoline/src/db/kv/keys/metric.rs +70 -47
  373. package/packages/gasoline/src/db/kv/keys/signal.rs +19 -3
  374. package/packages/gasoline/src/db/kv/keys/workflow.rs +349 -3
  375. package/packages/gasoline/src/db/kv/mod.rs +975 -514
  376. package/packages/gasoline/src/db/kv/system.rs +155 -18
  377. package/packages/gasoline/src/db/mod.rs +29 -7
  378. package/packages/gasoline/src/error.rs +26 -21
  379. package/packages/gasoline/src/executable.rs +3 -1
  380. package/packages/gasoline/src/history/cursor.rs +436 -336
  381. package/packages/gasoline/src/history/event.rs +24 -15
  382. package/packages/gasoline/src/listen.rs +2 -14
  383. package/packages/gasoline/src/message.rs +1 -1
  384. package/packages/gasoline/src/metrics.rs +260 -143
  385. package/packages/gasoline/src/prelude.rs +1 -1
  386. package/packages/gasoline/src/registry.rs +6 -2
  387. package/packages/gasoline/src/signal.rs +34 -31
  388. package/packages/gasoline/src/utils/mod.rs +1 -18
  389. package/packages/gasoline/src/utils/topic.rs +35 -0
  390. package/packages/gasoline/src/worker.rs +71 -14
  391. package/packages/gasoline/src/workflow.rs +13 -0
  392. package/packages/gasoline/tests/workflows/eviction_test.rs +2 -2
  393. package/packages/gasoline-macros/src/lib.rs +74 -12
  394. package/packages/gasoline-runtime/Cargo.toml +18 -0
  395. package/packages/gasoline-runtime/src/lib.rs +12 -0
  396. package/packages/gasoline-runtime/src/workflows/mod.rs +1 -0
  397. package/packages/gasoline-runtime/src/workflows/pruner.rs +55 -0
  398. package/packages/guard/Cargo.toml +16 -8
  399. package/packages/guard/src/cache/mod.rs +63 -43
  400. package/packages/guard/src/cache/pegboard_gateway.rs +144 -0
  401. package/packages/guard/src/errors.rs +105 -0
  402. package/packages/guard/src/lib.rs +5 -15
  403. package/packages/guard/src/metrics.rs +12 -0
  404. package/packages/guard/src/routing/actor_path.rs +409 -0
  405. package/packages/guard/src/routing/api_public.rs +6 -14
  406. package/packages/guard/src/routing/envoy.rs +98 -0
  407. package/packages/guard/src/routing/mod.rs +152 -206
  408. package/packages/guard/src/routing/pegboard_gateway/mod.rs +572 -0
  409. package/packages/guard/src/routing/pegboard_gateway/resolve_actor_query.rs +236 -0
  410. package/packages/guard/src/routing/runner.rs +24 -54
  411. package/packages/guard/src/routing/ws_health.rs +61 -0
  412. package/packages/guard/src/shared_state.rs +11 -2
  413. package/packages/guard/tests/parse_actor_path.rs +418 -165
  414. package/packages/guard-core/Cargo.toml +3 -10
  415. package/packages/guard-core/src/custom_serve.rs +4 -10
  416. package/packages/guard-core/src/errors.rs +20 -4
  417. package/packages/guard-core/src/lib.rs +6 -4
  418. package/packages/guard-core/src/metrics.rs +66 -53
  419. package/packages/guard-core/src/proxy_service.rs +618 -1520
  420. package/packages/guard-core/src/request_context.rs +149 -169
  421. package/packages/guard-core/src/response_body.rs +65 -0
  422. package/packages/guard-core/src/route.rs +76 -0
  423. package/packages/guard-core/src/server.rs +60 -26
  424. package/packages/guard-core/src/task_group.rs +4 -0
  425. package/packages/guard-core/src/utils.rs +296 -0
  426. package/packages/guard-core/src/websocket_handle.rs +3 -3
  427. package/packages/guard-core/tests/common/mod.rs +0 -1
  428. package/packages/guard-core/tests/custom_serve.rs +4 -6
  429. package/packages/guard-core/tests/simple_websocket.rs +19 -19
  430. package/packages/guard-core/tests/streaming_response.rs +4 -9
  431. package/packages/metrics/Cargo.toml +3 -2
  432. package/packages/metrics/src/buckets.rs +5 -11
  433. package/packages/metrics/src/lib.rs +6 -3
  434. package/packages/metrics/src/providers.rs +2 -42
  435. package/packages/metrics/src/registry.rs +7 -0
  436. package/packages/metrics/src/server.rs +57 -0
  437. package/packages/namespace/Cargo.toml +0 -3
  438. package/packages/namespace/src/keys/metric.rs +301 -0
  439. package/packages/namespace/src/keys/mod.rs +1 -1
  440. package/packages/namespace/src/ops/get_global.rs +7 -4
  441. package/packages/namespace/src/ops/get_local.rs +32 -16
  442. package/packages/namespace/src/ops/mod.rs +0 -1
  443. package/packages/namespace/src/ops/resolve_for_name_global.rs +7 -4
  444. package/packages/namespace/src/ops/resolve_for_name_local.rs +39 -19
  445. package/packages/namespace/src/workflows/namespace.rs +3 -3
  446. package/packages/pegboard/Cargo.toml +22 -0
  447. package/packages/pegboard/src/actor_kv/entry.rs +47 -0
  448. package/packages/pegboard/src/actor_kv/metrics.rs +19 -0
  449. package/packages/pegboard/src/actor_kv/mod.rs +530 -0
  450. package/packages/pegboard/src/actor_kv/preload.rs +363 -0
  451. package/packages/{actor-kv/src → pegboard/src/actor_kv}/utils.rs +36 -35
  452. package/packages/pegboard/src/errors.rs +39 -5
  453. package/packages/pegboard/src/keys/actor.rs +285 -2
  454. package/packages/{actor-kv/src/entry.rs → pegboard/src/keys/actor_kv.rs} +73 -39
  455. package/packages/pegboard/src/keys/backfill.rs +49 -0
  456. package/packages/pegboard/src/keys/envoy.rs +1070 -0
  457. package/packages/pegboard/src/keys/epoxy/ns.rs +1 -1
  458. package/packages/pegboard/src/keys/mod.rs +4 -6
  459. package/packages/pegboard/src/keys/ns.rs +493 -14
  460. package/packages/pegboard/src/keys/runner.rs +281 -0
  461. package/packages/{namespace → pegboard}/src/keys/runner_config.rs +53 -0
  462. package/packages/pegboard/src/lib.rs +15 -2
  463. package/packages/pegboard/src/metrics.rs +57 -16
  464. package/packages/pegboard/src/ops/actor/create.rs +123 -53
  465. package/packages/pegboard/src/ops/actor/get.rs +14 -45
  466. package/packages/pegboard/src/ops/actor/get_for_gateway.rs +16 -0
  467. package/packages/pegboard/src/ops/actor/get_for_key.rs +3 -0
  468. package/packages/pegboard/src/ops/actor/get_for_kv.rs +43 -0
  469. package/packages/pegboard/src/ops/actor/get_for_runner.rs +99 -0
  470. package/packages/pegboard/src/ops/actor/get_reservation_for_key.rs +1 -0
  471. package/packages/pegboard/src/ops/actor/list_for_ns.rs +10 -38
  472. package/packages/pegboard/src/ops/actor/list_names.rs +3 -3
  473. package/packages/pegboard/src/ops/actor/mod.rs +3 -1
  474. package/packages/pegboard/src/ops/actor/util.rs +263 -0
  475. package/packages/pegboard/src/ops/envoy/drain.rs +101 -0
  476. package/packages/pegboard/src/ops/envoy/evict_actors.rs +54 -0
  477. package/packages/pegboard/src/ops/envoy/expire.rs +92 -0
  478. package/packages/pegboard/src/ops/envoy/get.rs +135 -0
  479. package/packages/pegboard/src/ops/envoy/list.rs +131 -0
  480. package/packages/pegboard/src/ops/envoy/mod.rs +6 -0
  481. package/packages/pegboard/src/ops/envoy/update_ping.rs +92 -0
  482. package/packages/pegboard/src/ops/mod.rs +3 -0
  483. package/packages/pegboard/src/ops/runner/drain.rs +110 -0
  484. package/packages/pegboard/src/ops/runner/list_names.rs +3 -3
  485. package/packages/pegboard/src/ops/runner/list_runner_config_enabled_dcs.rs +199 -0
  486. package/packages/pegboard/src/ops/runner/list_runner_config_epoxy_replica_ids.rs +51 -0
  487. package/packages/pegboard/src/ops/runner/mod.rs +3 -1
  488. package/packages/pegboard/src/ops/runner/update_alloc_idx.rs +17 -5
  489. package/packages/{namespace → pegboard}/src/ops/runner_config/delete.rs +18 -9
  490. package/packages/pegboard/src/ops/runner_config/ensure_normal_if_missing.rs +62 -0
  491. package/packages/{namespace → pegboard}/src/ops/runner_config/get.rs +15 -5
  492. package/packages/pegboard/src/ops/runner_config/get_error.rs +146 -0
  493. package/packages/{namespace → pegboard}/src/ops/runner_config/list.rs +13 -12
  494. package/packages/pegboard/src/ops/runner_config/mod.rs +7 -0
  495. package/packages/pegboard/src/ops/runner_config/refresh_metadata.rs +124 -0
  496. package/packages/pegboard/src/ops/runner_config/upsert.rs +206 -0
  497. package/packages/pegboard/src/ops/serverless_metadata/fetch.rs +223 -0
  498. package/packages/pegboard/src/ops/serverless_metadata/mod.rs +1 -0
  499. package/packages/pegboard/src/pubsub_subjects.rs +52 -0
  500. package/packages/pegboard/src/utils.rs +36 -2
  501. package/packages/pegboard/src/workflows/actor/destroy.rs +135 -99
  502. package/packages/pegboard/src/workflows/actor/keys.rs +59 -5
  503. package/packages/pegboard/src/workflows/actor/metrics.rs +345 -0
  504. package/packages/pegboard/src/workflows/actor/mod.rs +848 -204
  505. package/packages/pegboard/src/workflows/actor/runtime.rs +785 -212
  506. package/packages/pegboard/src/workflows/actor/setup.rs +61 -0
  507. package/packages/pegboard/src/workflows/actor2/keys.rs +337 -0
  508. package/packages/pegboard/src/workflows/actor2/metrics.rs +334 -0
  509. package/packages/pegboard/src/workflows/actor2/mod.rs +1251 -0
  510. package/packages/pegboard/src/workflows/actor2/runtime.rs +1005 -0
  511. package/packages/pegboard/src/workflows/actor_runner_name_selector_backfill.rs +266 -0
  512. package/packages/pegboard/src/workflows/metrics_aggregator.rs +282 -0
  513. package/packages/pegboard/src/workflows/mod.rs +8 -0
  514. package/packages/pegboard/src/workflows/runner.rs +62 -56
  515. package/packages/pegboard/src/workflows/runner2.rs +978 -0
  516. package/packages/pegboard/src/workflows/runner_pool.rs +298 -0
  517. package/packages/pegboard/src/workflows/runner_pool_error_tracker.rs +173 -0
  518. package/packages/pegboard/src/workflows/runner_pool_metadata_poller.rs +237 -0
  519. package/packages/pegboard/src/workflows/serverless/backfill.rs +120 -0
  520. package/packages/pegboard/src/workflows/serverless/conn.rs +702 -0
  521. package/packages/pegboard/src/workflows/serverless/mod.rs +3 -0
  522. package/packages/pegboard/src/workflows/serverless/receiver.rs +87 -0
  523. package/packages/pegboard/tests/actor_v1_pre_migration.rs +77 -0
  524. package/packages/{actor-kv/tests/list_edge_cases.rs → pegboard/tests/kv_list_edge_cases.rs} +74 -59
  525. package/packages/{actor-kv → pegboard}/tests/kv_operations.rs +77 -48
  526. package/packages/pegboard-envoy/Cargo.toml +43 -0
  527. package/packages/pegboard-envoy/src/actor_event_demuxer.rs +165 -0
  528. package/packages/pegboard-envoy/src/conn.rs +417 -0
  529. package/packages/pegboard-envoy/src/errors.rs +38 -0
  530. package/packages/pegboard-envoy/src/lib.rs +250 -0
  531. package/packages/pegboard-envoy/src/metrics.rs +44 -0
  532. package/packages/pegboard-envoy/src/ping_task.rs +61 -0
  533. package/packages/pegboard-envoy/src/tunnel_to_ws_task.rs +183 -0
  534. package/packages/pegboard-envoy/src/utils.rs +68 -0
  535. package/packages/pegboard-envoy/src/ws_to_tunnel_task.rs +536 -0
  536. package/packages/pegboard-envoy/tests/support/ws_to_tunnel_task.rs +82 -0
  537. package/packages/pegboard-gateway/Cargo.toml +2 -0
  538. package/packages/pegboard-gateway/src/keepalive_task.rs +1 -1
  539. package/packages/pegboard-gateway/src/lib.rs +506 -128
  540. package/packages/pegboard-gateway/src/metrics.rs +7 -11
  541. package/packages/pegboard-gateway/src/metrics_task.rs +80 -0
  542. package/packages/pegboard-gateway/src/ping_task.rs +9 -2
  543. package/packages/pegboard-gateway/src/shared_state.rs +110 -74
  544. package/packages/pegboard-gateway/src/tunnel_to_ws_task.rs +21 -7
  545. package/packages/pegboard-gateway/src/ws_to_tunnel_task.rs +12 -6
  546. package/packages/pegboard-gateway2/Cargo.toml +37 -0
  547. package/packages/pegboard-gateway2/src/keepalive_task.rs +61 -0
  548. package/packages/pegboard-gateway2/src/lib.rs +1044 -0
  549. package/packages/pegboard-gateway2/src/metrics.rs +10 -0
  550. package/packages/pegboard-gateway2/src/metrics_task.rs +80 -0
  551. package/packages/pegboard-gateway2/src/ping_task.rs +30 -0
  552. package/packages/pegboard-gateway2/src/shared_state.rs +601 -0
  553. package/packages/pegboard-gateway2/src/tunnel_to_ws_task.rs +99 -0
  554. package/packages/pegboard-gateway2/src/ws_to_tunnel_task.rs +71 -0
  555. package/packages/{pegboard-serverless → pegboard-outbound}/Cargo.toml +9 -9
  556. package/packages/pegboard-outbound/src/lib.rs +487 -0
  557. package/packages/pegboard-outbound/src/metrics.rs +17 -0
  558. package/packages/pegboard-runner/Cargo.toml +11 -5
  559. package/packages/pegboard-runner/src/actor_event_demuxer.rs +163 -0
  560. package/packages/pegboard-runner/src/conn.rs +358 -122
  561. package/packages/pegboard-runner/src/errors.rs +5 -0
  562. package/packages/pegboard-runner/src/lib.rs +62 -36
  563. package/packages/pegboard-runner/src/metrics.rs +44 -0
  564. package/packages/pegboard-runner/src/ping_task.rs +60 -13
  565. package/packages/pegboard-runner/src/tunnel_to_ws_task.rs +249 -110
  566. package/packages/pegboard-runner/src/ws_to_tunnel_task.rs +738 -113
  567. package/packages/pegboard-runner/tests/support/ws_to_tunnel_task.rs +150 -0
  568. package/packages/pools/Cargo.toml +1 -2
  569. package/packages/pools/src/db/clickhouse.rs +7 -6
  570. package/packages/pools/src/db/udb.rs +16 -3
  571. package/packages/pools/src/db/ups.rs +27 -5
  572. package/packages/pools/src/error.rs +0 -3
  573. package/packages/pools/src/lib.rs +0 -2
  574. package/packages/pools/src/metrics.rs +33 -28
  575. package/packages/pools/src/pools.rs +15 -39
  576. package/packages/pools/src/prelude.rs +1 -1
  577. package/packages/postgres-util/Cargo.toml +13 -0
  578. package/packages/postgres-util/src/lib.rs +84 -0
  579. package/packages/runner-protocol/build.rs +157 -0
  580. package/packages/runner-protocol/src/lib.rs +16 -0
  581. package/packages/runner-protocol/src/util.rs +14 -0
  582. package/packages/runner-protocol/src/versioned.rs +4345 -0
  583. package/packages/runtime/src/lib.rs +46 -46
  584. package/packages/runtime/src/metrics.rs +39 -30
  585. package/packages/runtime/src/term_signal.rs +25 -12
  586. package/packages/runtime/src/traces.rs +5 -8
  587. package/packages/service-manager/src/lib.rs +66 -15
  588. package/packages/test-deps/src/datacenter.rs +22 -8
  589. package/packages/test-deps/src/lib.rs +47 -25
  590. package/packages/test-deps-docker/src/database.rs +45 -36
  591. package/packages/test-snapshot-gen/Cargo.toml +39 -0
  592. package/packages/test-snapshot-gen/snapshots/.gitkeep +0 -0
  593. package/packages/test-snapshot-gen/snapshots/epoxy-v1/metadata.json +3 -0
  594. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000008.log +0 -0
  595. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000009.sst +3 -0
  596. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/CURRENT +3 -0
  597. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/MANIFEST-000005 +3 -0
  598. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/OPTIONS-000007 +3 -0
  599. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000008.log +0 -0
  600. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000009.sst +3 -0
  601. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/CURRENT +3 -0
  602. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/MANIFEST-000005 +3 -0
  603. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/OPTIONS-000007 +3 -0
  604. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/metadata.json +3 -0
  605. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000008.log +0 -0
  606. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000009.sst +3 -0
  607. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/CURRENT +3 -0
  608. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/MANIFEST-000005 +3 -0
  609. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/OPTIONS-000007 +3 -0
  610. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000008.log +0 -0
  611. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000009.sst +3 -0
  612. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/CURRENT +3 -0
  613. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/MANIFEST-000005 +3 -0
  614. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/OPTIONS-000007 +3 -0
  615. package/packages/test-snapshot-gen/src/lib.rs +328 -0
  616. package/packages/test-snapshot-gen/src/main.rs +145 -0
  617. package/packages/test-snapshot-gen/src/scenarios/epoxy_keys.rs +60 -0
  618. package/packages/test-snapshot-gen/src/scenarios/mod.rs +27 -0
  619. package/packages/test-snapshot-gen/src/scenarios/pb_actor_v1_pre_migration.rs +56 -0
  620. package/packages/test-snapshot-gen/src/test_cluster.rs +234 -0
  621. package/packages/tracing-reconfigure/src/lib.rs +1 -1
  622. package/packages/tracing-utils/src/lib.rs +12 -20
  623. package/packages/types/src/actor/error.rs +59 -0
  624. package/packages/types/src/actor/mod.rs +2 -0
  625. package/packages/types/src/actors.rs +5 -0
  626. package/packages/types/src/envoys.rs +21 -0
  627. package/packages/types/src/keys/backfill.rs +5 -0
  628. package/packages/types/src/keys/mod.rs +1 -0
  629. package/packages/types/src/lib.rs +2 -1
  630. package/packages/types/src/runner_configs.rs +43 -14
  631. package/packages/universaldb/Cargo.toml +4 -0
  632. package/packages/universaldb/src/database.rs +50 -5
  633. package/packages/universaldb/src/driver/mod.rs +12 -2
  634. package/packages/universaldb/src/driver/postgres/database.rs +88 -27
  635. package/packages/universaldb/src/driver/postgres/mod.rs +1 -1
  636. package/packages/universaldb/src/driver/postgres/transaction.rs +4 -7
  637. package/packages/universaldb/src/driver/postgres/transaction_task.rs +30 -52
  638. package/packages/universaldb/src/driver/rocksdb/database.rs +13 -7
  639. package/packages/universaldb/src/driver/rocksdb/transaction_conflict_tracker.rs +5 -5
  640. package/packages/universaldb/src/driver/rocksdb/transaction_task.rs +2 -1
  641. package/packages/universaldb/src/metrics.rs +39 -23
  642. package/packages/universaldb/src/prelude.rs +1 -1
  643. package/packages/universaldb/src/transaction.rs +9 -2
  644. package/packages/universaldb/src/utils/cherry_pick.rs +46 -46
  645. package/packages/universaldb/src/utils/keys.rs +21 -2
  646. package/packages/universaldb/src/utils/mod.rs +8 -0
  647. package/packages/universaldb/src/utils/subspace.rs +9 -4
  648. package/packages/universaldb/tests/integration.rs +5 -3
  649. package/packages/universaldb/tests/integration_gas.rs +5 -3
  650. package/packages/universaldb/tests/rocksdb.rs +152 -19
  651. package/packages/universalpubsub/Cargo.toml +8 -2
  652. package/packages/universalpubsub/benches/simple.rs +28 -8
  653. package/packages/universalpubsub/src/chunking.rs +27 -5
  654. package/packages/universalpubsub/src/driver/memory/mod.rs +131 -20
  655. package/packages/universalpubsub/src/driver/mod.rs +5 -0
  656. package/packages/universalpubsub/src/driver/nats/mod.rs +8 -0
  657. package/packages/universalpubsub/src/driver/postgres/mod.rs +505 -96
  658. package/packages/universalpubsub/src/lib.rs +3 -0
  659. package/packages/universalpubsub/src/metrics.rs +60 -0
  660. package/packages/universalpubsub/src/pubsub.rs +227 -87
  661. package/packages/universalpubsub/src/subject.rs +32 -0
  662. package/packages/universalpubsub/tests/chunking.rs +298 -0
  663. package/packages/universalpubsub/tests/integration.rs +148 -7
  664. package/packages/universalpubsub/tests/reconnect.rs +8 -6
  665. package/packages/util/Cargo.toml +1 -3
  666. package/packages/util/build.rs +6 -0
  667. package/packages/util/src/lib.rs +7 -2
  668. package/packages/util/src/metric.rs +1 -0
  669. package/packages/util/src/serde.rs +1 -516
  670. package/packages/{internal → util-serde}/Cargo.toml +4 -5
  671. package/packages/util-serde/src/lib.rs +517 -0
  672. package/packages/workflow-worker/Cargo.toml +4 -4
  673. package/packages/workflow-worker/src/lib.rs +3 -2
  674. package/sdks/go/api-full/client/client.go +17 -4
  675. package/sdks/go/api-full/metadata/client.go +50 -0
  676. package/sdks/go/api-full/namespaces/client.go +3 -0
  677. package/sdks/go/api-full/namespaces.go +6 -4
  678. package/sdks/go/api-full/runners/client.go +3 -0
  679. package/sdks/go/api-full/runners.go +8 -6
  680. package/sdks/go/api-full/types.go +107 -23
  681. package/sdks/rust/api-full/rust/.openapi-generator/FILES +6 -0
  682. package/sdks/rust/api-full/rust/Cargo.toml +1 -1
  683. package/sdks/rust/api-full/rust/README.md +5 -2
  684. package/sdks/rust/api-full/rust/docs/Actor.md +1 -0
  685. package/sdks/rust/api-full/rust/docs/ActorsDeleteApi.md +1 -1
  686. package/sdks/rust/api-full/rust/docs/ActorsKvGetApi.md +2 -1
  687. package/sdks/rust/api-full/rust/docs/ActorsListApi.md +3 -2
  688. package/sdks/rust/api-full/rust/docs/MetadataApi.md +34 -0
  689. package/sdks/rust/api-full/rust/docs/MetadataGetResponse.md +18 -0
  690. package/sdks/rust/api-full/rust/docs/NamespacesApi.md +3 -2
  691. package/sdks/rust/api-full/rust/docs/RunnerConfig.md +1 -0
  692. package/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf1Serverless.md +1 -0
  693. package/sdks/rust/api-full/rust/docs/RunnerConfigResponse.md +15 -0
  694. package/sdks/rust/api-full/rust/docs/RunnerConfigsListApi.md +3 -2
  695. package/sdks/rust/api-full/rust/docs/RunnerConfigsListResponseRunnerConfigsValue.md +1 -1
  696. package/sdks/rust/api-full/rust/docs/RunnersApi.md +3 -2
  697. package/sdks/rust/api-full/rust/src/apis/actors_create_api.rs +1 -1
  698. package/sdks/rust/api-full/rust/src/apis/actors_delete_api.rs +3 -5
  699. package/sdks/rust/api-full/rust/src/apis/actors_get_or_create_api.rs +1 -1
  700. package/sdks/rust/api-full/rust/src/apis/actors_kv_get_api.rs +4 -2
  701. package/sdks/rust/api-full/rust/src/apis/actors_list_api.rs +9 -2
  702. package/sdks/rust/api-full/rust/src/apis/actors_list_names_api.rs +1 -1
  703. package/sdks/rust/api-full/rust/src/apis/configuration.rs +2 -2
  704. package/sdks/rust/api-full/rust/src/apis/datacenters_api.rs +1 -1
  705. package/sdks/rust/api-full/rust/src/apis/health_api.rs +1 -1
  706. package/sdks/rust/api-full/rust/src/apis/metadata_api.rs +62 -0
  707. package/sdks/rust/api-full/rust/src/apis/mod.rs +1 -0
  708. package/sdks/rust/api-full/rust/src/apis/namespaces_api.rs +9 -2
  709. package/sdks/rust/api-full/rust/src/apis/runner_configs_delete_api.rs +1 -1
  710. package/sdks/rust/api-full/rust/src/apis/runner_configs_list_api.rs +9 -2
  711. package/sdks/rust/api-full/rust/src/apis/runner_configs_refresh_metadata_api.rs +1 -1
  712. package/sdks/rust/api-full/rust/src/apis/runner_configs_serverless_health_check_api.rs +1 -1
  713. package/sdks/rust/api-full/rust/src/apis/runner_configs_upsert_api.rs +1 -1
  714. package/sdks/rust/api-full/rust/src/apis/runners_api.rs +9 -2
  715. package/sdks/rust/api-full/rust/src/models/actor.rs +5 -1
  716. package/sdks/rust/api-full/rust/src/models/actor_name.rs +1 -1
  717. package/sdks/rust/api-full/rust/src/models/actors_create_request.rs +1 -1
  718. package/sdks/rust/api-full/rust/src/models/actors_create_response.rs +1 -1
  719. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_request.rs +1 -1
  720. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_response.rs +1 -1
  721. package/sdks/rust/api-full/rust/src/models/actors_kv_get_response.rs +1 -1
  722. package/sdks/rust/api-full/rust/src/models/actors_list_names_response.rs +1 -1
  723. package/sdks/rust/api-full/rust/src/models/actors_list_response.rs +1 -1
  724. package/sdks/rust/api-full/rust/src/models/crash_policy.rs +1 -1
  725. package/sdks/rust/api-full/rust/src/models/datacenter.rs +1 -1
  726. package/sdks/rust/api-full/rust/src/models/datacenter_health.rs +1 -1
  727. package/sdks/rust/api-full/rust/src/models/datacenters_list_response.rs +1 -1
  728. package/sdks/rust/api-full/rust/src/models/health_fanout_response.rs +1 -1
  729. package/sdks/rust/api-full/rust/src/models/health_response.rs +1 -1
  730. package/sdks/rust/api-full/rust/src/models/health_status.rs +1 -1
  731. package/sdks/rust/api-full/rust/src/models/metadata_get_response.rs +48 -0
  732. package/sdks/rust/api-full/rust/src/models/mod.rs +4 -0
  733. package/sdks/rust/api-full/rust/src/models/namespace.rs +1 -1
  734. package/sdks/rust/api-full/rust/src/models/namespace_list_response.rs +1 -1
  735. package/sdks/rust/api-full/rust/src/models/namespaces_create_request.rs +1 -1
  736. package/sdks/rust/api-full/rust/src/models/namespaces_create_response.rs +1 -1
  737. package/sdks/rust/api-full/rust/src/models/pagination.rs +1 -1
  738. package/sdks/rust/api-full/rust/src/models/runner.rs +1 -1
  739. package/sdks/rust/api-full/rust/src/models/runner_config.rs +4 -1
  740. package/sdks/rust/api-full/rust/src/models/runner_config_kind.rs +1 -1
  741. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of.rs +1 -1
  742. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1.rs +1 -1
  743. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1_serverless.rs +5 -1
  744. package/sdks/rust/api-full/rust/src/models/runner_config_response.rs +39 -0
  745. package/sdks/rust/api-full/rust/src/models/runner_config_variant.rs +1 -1
  746. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response.rs +1 -1
  747. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response_runner_configs_value.rs +3 -3
  748. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_request.rs +1 -1
  749. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response.rs +1 -1
  750. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of.rs +1 -1
  751. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1.rs +1 -1
  752. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1_failure.rs +1 -1
  753. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_success.rs +1 -1
  754. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error.rs +1 -1
  755. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of.rs +1 -1
  756. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_1.rs +1 -1
  757. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_2.rs +1 -1
  758. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3.rs +1 -1
  759. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3_non_success_status.rs +1 -1
  760. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4.rs +1 -1
  761. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4_invalid_response_json.rs +1 -1
  762. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5.rs +1 -1
  763. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5_invalid_response_schema.rs +1 -1
  764. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_request_body.rs +1 -1
  765. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_response.rs +1 -1
  766. package/sdks/rust/api-full/rust/src/models/runners_list_names_response.rs +1 -1
  767. package/sdks/rust/api-full/rust/src/models/runners_list_response.rs +1 -1
  768. package/sdks/rust/api-full/src/apis/actors_api.rs +8 -4
  769. package/sdks/rust/api-full/src/apis/ns_api.rs +8 -4
  770. package/sdks/rust/data/src/converted.rs +7 -4
  771. package/sdks/rust/data/src/lib.rs +2 -2
  772. package/sdks/rust/data/src/versioned/mod.rs +47 -4
  773. package/sdks/rust/data/src/versioned/namespace_runner_config.rs +256 -6
  774. package/sdks/rust/envoy-client/Cargo.toml +25 -0
  775. package/sdks/rust/envoy-client/src/actor.rs +992 -0
  776. package/sdks/rust/envoy-client/src/commands.rs +88 -0
  777. package/sdks/rust/envoy-client/src/config.rs +159 -0
  778. package/sdks/rust/envoy-client/src/connection.rs +288 -0
  779. package/sdks/rust/envoy-client/src/context.rs +24 -0
  780. package/sdks/rust/envoy-client/src/envoy.rs +432 -0
  781. package/sdks/rust/envoy-client/src/events.rs +62 -0
  782. package/sdks/rust/envoy-client/src/handle.rs +355 -0
  783. package/sdks/rust/envoy-client/src/kv.rs +132 -0
  784. package/sdks/rust/envoy-client/src/latency_channel.rs +27 -0
  785. package/sdks/rust/envoy-client/src/lib.rs +15 -0
  786. package/sdks/rust/envoy-client/src/stringify.rs +322 -0
  787. package/sdks/rust/envoy-client/src/tunnel.rs +265 -0
  788. package/sdks/rust/envoy-client/src/utils.rs +172 -0
  789. package/sdks/rust/envoy-protocol/Cargo.toml +22 -0
  790. package/sdks/rust/envoy-protocol/build.rs +200 -0
  791. package/sdks/rust/envoy-protocol/src/generated.rs +1 -0
  792. package/sdks/rust/envoy-protocol/src/lib.rs +8 -0
  793. package/sdks/rust/envoy-protocol/src/versioned.rs +208 -0
  794. package/sdks/rust/epoxy-protocol/Cargo.toml +0 -2
  795. package/sdks/rust/epoxy-protocol/build.rs +7 -0
  796. package/sdks/rust/epoxy-protocol/src/lib.rs +2 -5
  797. package/sdks/rust/epoxy-protocol/src/protocol.rs +128 -0
  798. package/sdks/rust/test-envoy/Cargo.toml +23 -0
  799. package/sdks/rust/test-envoy/Dockerfile +22 -0
  800. package/sdks/rust/test-envoy/src/behaviors.rs +141 -0
  801. package/sdks/rust/test-envoy/src/lib.rs +11 -0
  802. package/sdks/rust/test-envoy/src/main.rs +4 -0
  803. package/sdks/rust/test-envoy/src/server.rs +269 -0
  804. package/sdks/schemas/README.md +1 -2
  805. package/sdks/schemas/data/namespace.runner_config.v3.bare +24 -0
  806. package/sdks/schemas/data/namespace.runner_config.v4.bare +25 -0
  807. package/sdks/schemas/data/namespace.runner_config.v5.bare +26 -0
  808. package/sdks/schemas/data/pegboard.namespace.runner_alloc_idx.v2.bare +8 -0
  809. package/sdks/schemas/envoy-protocol/v1.bare +459 -0
  810. package/sdks/schemas/epoxy-protocol/v2.bare +220 -0
  811. package/sdks/schemas/runner-protocol/v4.bare +438 -0
  812. package/sdks/schemas/runner-protocol/v5.bare +430 -0
  813. package/sdks/schemas/runner-protocol/v6.bare +432 -0
  814. package/sdks/schemas/runner-protocol/v7.bare +438 -0
  815. package/sdks/typescript/api-full/.turbo/turbo-build.log +28 -27
  816. package/sdks/typescript/api-full/build.js +7 -1
  817. package/sdks/typescript/api-full/package.json +66 -57
  818. package/sdks/typescript/api-full/rivetkit-engine-api-full-25.5.3.tgz +0 -0
  819. package/sdks/typescript/api-full/src/Client.ts +41 -10
  820. package/sdks/typescript/api-full/src/api/client/requests/ActorsDeleteRequest.ts +4 -2
  821. package/sdks/typescript/api-full/src/api/client/requests/ActorsKvGetRequest.ts +13 -0
  822. package/sdks/typescript/api-full/src/api/client/requests/ActorsListRequest.ts +6 -0
  823. package/sdks/typescript/api-full/src/api/client/requests/RunnerConfigsListRequest.ts +4 -0
  824. package/sdks/typescript/api-full/src/api/client/requests/index.ts +1 -0
  825. package/sdks/typescript/api-full/src/api/resources/index.ts +1 -0
  826. package/sdks/typescript/api-full/src/api/resources/metadata/client/Client.ts +97 -0
  827. package/sdks/typescript/api-full/src/api/resources/metadata/client/index.ts +1 -0
  828. package/sdks/typescript/api-full/src/api/resources/metadata/index.ts +1 -0
  829. package/sdks/typescript/api-full/src/api/resources/namespaces/client/Client.ts +12 -2
  830. package/sdks/typescript/api-full/src/api/resources/namespaces/client/requests/NamespacesListRequest.ts +6 -0
  831. package/sdks/typescript/api-full/src/api/resources/runners/client/Client.ts +12 -2
  832. package/sdks/typescript/api-full/src/api/resources/runners/client/requests/RunnersListRequest.ts +6 -0
  833. package/sdks/typescript/api-full/src/api/types/Actor.ts +2 -0
  834. package/sdks/typescript/api-full/src/api/types/MetadataGetResponse.ts +14 -0
  835. package/sdks/typescript/api-full/src/api/types/RunnerConfig.ts +1 -0
  836. package/sdks/typescript/api-full/src/api/types/RunnerConfigKindServerlessServerless.ts +2 -0
  837. package/sdks/typescript/api-full/src/api/types/RunnerConfigResponse.ts +9 -0
  838. package/sdks/typescript/api-full/src/api/types/RunnerConfigServerless.ts +2 -0
  839. package/sdks/typescript/api-full/src/api/types/RunnerConfigsListResponseRunnerConfigsValue.ts +1 -1
  840. package/sdks/typescript/api-full/src/api/types/index.ts +2 -0
  841. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +6 -4
  842. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +4 -3
  843. package/sdks/typescript/api-full/src/serialization/types/Actor.ts +2 -0
  844. package/sdks/typescript/api-full/src/serialization/types/MetadataGetResponse.ts +34 -0
  845. package/sdks/typescript/api-full/src/serialization/types/RunnerConfig.ts +5 -0
  846. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigKindServerlessServerless.ts +2 -0
  847. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigResponse.ts +26 -0
  848. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigServerless.ts +2 -0
  849. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigsListResponseRunnerConfigsValue.ts +3 -3
  850. package/sdks/typescript/api-full/src/serialization/types/index.ts +2 -0
  851. package/sdks/typescript/api-full/turbo.json +9 -0
  852. package/sdks/typescript/envoy-protocol/.turbo/turbo-build.log +23 -0
  853. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.cjs +466 -281
  854. package/sdks/typescript/envoy-protocol/dist/index.cjs.map +1 -0
  855. package/sdks/typescript/envoy-protocol/dist/index.d.cts +699 -0
  856. package/sdks/typescript/envoy-protocol/dist/index.d.ts +699 -0
  857. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.js +530 -345
  858. package/sdks/typescript/envoy-protocol/dist/index.js.map +1 -0
  859. package/sdks/typescript/{runner-protocol → envoy-protocol}/node_modules/.bin/tsc +4 -4
  860. package/{tests/load → sdks/typescript/envoy-protocol}/node_modules/.bin/tsserver +4 -4
  861. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup +21 -0
  862. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup-node +21 -0
  863. package/sdks/typescript/envoy-protocol/package.json +36 -0
  864. package/sdks/typescript/envoy-protocol/src/index.ts +2331 -0
  865. package/sdks/typescript/envoy-protocol/tsconfig.json +9 -0
  866. package/sdks/typescript/envoy-protocol/tsup.config.ts +4 -0
  867. package/sdks/typescript/runner/package.json +8 -2
  868. package/sdks/typescript/runner/src/actor.ts +38 -0
  869. package/sdks/typescript/runner/src/mod.ts +435 -229
  870. package/sdks/typescript/runner/src/stringify.ts +36 -33
  871. package/sdks/typescript/runner/src/tunnel.ts +52 -56
  872. package/sdks/typescript/runner/src/utils.ts +19 -0
  873. package/sdks/typescript/runner/src/websocket-tunnel-adapter.ts +98 -435
  874. package/sdks/typescript/runner-protocol/package.json +11 -9
  875. package/sdks/typescript/runner-protocol/src/index.ts +224 -156
  876. package/sdks/typescript/runner-protocol/tsconfig.json +1 -9
  877. package/sdks/typescript/test-runner/.turbo/turbo-build.log +5 -5
  878. package/sdks/typescript/test-runner/dist/index.js +53 -44
  879. package/sdks/typescript/test-runner/dist/index.js.map +1 -1
  880. package/sdks/typescript/test-runner/node_modules/.bin/pino +2 -2
  881. package/sdks/typescript/test-runner/node_modules/.bin/tsc +4 -4
  882. package/sdks/typescript/test-runner/node_modules/.bin/tsserver +4 -4
  883. package/sdks/typescript/test-runner/node_modules/.bin/tsup +4 -4
  884. package/sdks/typescript/test-runner/node_modules/.bin/tsup-node +4 -4
  885. package/sdks/typescript/test-runner/node_modules/.bin/tsx +4 -4
  886. package/sdks/typescript/test-runner/node_modules/.bin/vitest +4 -4
  887. package/sdks/typescript/test-runner/package.json +3 -3
  888. package/sdks/typescript/test-runner/src/index.ts +65 -42
  889. package/sdks/typescript/test-runner/src/log.ts +4 -18
  890. package/artifacts/errors/actor.no_runners_available.json +0 -5
  891. package/artifacts/errors/guard.actor_destroyed.json +0 -5
  892. package/artifacts/errors/guard.actor_not_found.json +0 -5
  893. package/contrib-docs/ACTOR_KEY_RESERVATION.md +0 -101
  894. package/contrib-docs/API.md +0 -11
  895. package/contrib-docs/DOCKER.md +0 -5
  896. package/contrib-docs/ERRORS.md +0 -13
  897. package/contrib-docs/GUARD.md +0 -76
  898. package/contrib-docs/PEGBOARD_TUNNEL_RETRIES.md +0 -83
  899. package/contrib-docs/RUNNER_LIFECYCLE.md +0 -172
  900. package/contrib-docs/SDKS.md +0 -9
  901. package/contrib-docs/TEST_DEPENDENCIES.md +0 -43
  902. package/contrib-docs/design-choicse/EMBEDDED_KV.md +0 -80
  903. package/contrib-docs/operate/TRACING_RECONFIGURE.md +0 -78
  904. package/docker/dev/otel-collector-client/config.yaml +0 -39
  905. package/docker/dev-host/otel-collector-client/config.yaml +0 -39
  906. package/docker/dev-multidc/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  907. package/docker/dev-multidc/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  908. package/docker/dev-multidc/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  909. package/docker/dev-multidc-multinode/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  910. package/docker/dev-multidc-multinode/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  911. package/docker/dev-multidc-multinode/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  912. package/docker/dev-multinode/otel-collector-client/config.yaml +0 -39
  913. package/docker/template/src/services/edge/otel-collector-client.ts +0 -64
  914. package/packages/actor-kv/Cargo.toml +0 -31
  915. package/packages/actor-kv/src/key.rs +0 -81
  916. package/packages/actor-kv/src/lib.rs +0 -357
  917. package/packages/cache/src/rate_limit.rs +0 -109
  918. package/packages/cache/tests/integration.rs +0 -582
  919. package/packages/clickhouse-inserter/Cargo.toml +0 -17
  920. package/packages/clickhouse-inserter/src/error.rs +0 -16
  921. package/packages/clickhouse-inserter/src/lib.rs +0 -179
  922. package/packages/clickhouse-user-query/Cargo.toml +0 -16
  923. package/packages/clickhouse-user-query/examples/case_sensitivity_demo.rs +0 -100
  924. package/packages/clickhouse-user-query/examples/group_by_example.rs +0 -53
  925. package/packages/clickhouse-user-query/examples/string_contains_demo.rs +0 -96
  926. package/packages/clickhouse-user-query/src/builder.rs +0 -445
  927. package/packages/clickhouse-user-query/src/error.rs +0 -37
  928. package/packages/clickhouse-user-query/src/lib.rs +0 -61
  929. package/packages/clickhouse-user-query/src/query.rs +0 -143
  930. package/packages/clickhouse-user-query/src/schema.rs +0 -78
  931. package/packages/clickhouse-user-query/tests/builder_tests.rs +0 -619
  932. package/packages/clickhouse-user-query/tests/case_sensitivity_tests.rs +0 -307
  933. package/packages/clickhouse-user-query/tests/integration_tests.rs +0 -540
  934. package/packages/clickhouse-user-query/tests/query_tests.rs +0 -263
  935. package/packages/clickhouse-user-query/tests/schema_tests.rs +0 -44
  936. package/packages/config/src/config/vector.rs +0 -18
  937. package/packages/engine/src/commands/udb_keys.rs +0 -200
  938. package/packages/engine/tests/actors_create.rs +0 -524
  939. package/packages/engine/tests/actors_delete.rs +0 -243
  940. package/packages/engine/tests/actors_general.rs +0 -191
  941. package/packages/engine/tests/actors_get.rs +0 -230
  942. package/packages/engine/tests/actors_get_by_id.rs +0 -170
  943. package/packages/engine/tests/actors_get_or_create.rs +0 -294
  944. package/packages/engine/tests/actors_get_or_create_by_id.rs +0 -147
  945. package/packages/engine/tests/actors_lifecycle.rs +0 -165
  946. package/packages/engine/tests/actors_list.rs +0 -798
  947. package/packages/engine/tests/actors_list_names.rs +0 -353
  948. package/packages/engine/tests/common/ns.rs +0 -36
  949. package/packages/engine/tests/common/runner.rs +0 -134
  950. package/packages/engine/tests/runners_dupe_key.rs +0 -27
  951. package/packages/engine/tests/runners_version.rs +0 -50
  952. package/packages/env/build.rs +0 -8
  953. package/packages/epoxy/spec/KEYS.md +0 -33
  954. package/packages/epoxy/spec/PROPOSAL.md +0 -125
  955. package/packages/epoxy/spec/RECONFIGURE.md +0 -40
  956. package/packages/epoxy/src/ops/explicit_prepare.rs +0 -342
  957. package/packages/epoxy/src/replica/decide_path.rs +0 -51
  958. package/packages/epoxy/src/replica/lead_consensus.rs +0 -65
  959. package/packages/epoxy/src/replica/log.rs +0 -84
  960. package/packages/epoxy/src/replica/messages/accepted.rs +0 -35
  961. package/packages/epoxy/src/replica/messages/committed.rs +0 -41
  962. package/packages/epoxy/src/replica/messages/download_instances.rs +0 -69
  963. package/packages/epoxy/src/replica/messages/pre_accept.rs +0 -69
  964. package/packages/epoxy/src/replica/utils.rs +0 -111
  965. package/packages/epoxy/src/workflows/purger.rs +0 -81
  966. package/packages/guard/src/cache/actor.rs +0 -43
  967. package/packages/guard/src/middleware.rs +0 -42
  968. package/packages/guard/src/routing/pegboard_gateway.rs +0 -260
  969. package/packages/guard-core/src/analytics.rs +0 -46
  970. package/packages/internal/README.md +0 -1
  971. package/packages/internal/src/lib.rs +0 -1
  972. package/packages/internal/src/ops/bump_serverless_autoscaler_global.rs +0 -64
  973. package/packages/internal/src/ops/cache/mod.rs +0 -1
  974. package/packages/internal/src/ops/cache/purge_global.rs +0 -81
  975. package/packages/internal/src/ops/mod.rs +0 -2
  976. package/packages/namespace/src/ops/runner_config/mod.rs +0 -4
  977. package/packages/namespace/src/ops/runner_config/upsert.rs +0 -148
  978. package/packages/pegboard/src/ops/actor/get_runner.rs +0 -64
  979. package/packages/pegboard/src/ops/runner/find_dc_with_runner.rs +0 -222
  980. package/packages/pegboard-serverless/src/lib.rs +0 -523
  981. package/packages/types/src/msgs/mod.rs +0 -1
  982. package/packages/types/src/msgs/pegboard.rs +0 -5
  983. package/sdks/rust/epoxy-protocol/src/versioned.rs +0 -206
  984. package/sdks/rust/runner-protocol/build.rs +0 -115
  985. package/sdks/rust/runner-protocol/src/lib.rs +0 -10
  986. package/sdks/rust/runner-protocol/src/versioned.rs +0 -1734
  987. package/sdks/schemas/epoxy-protocol/v1.bare +0 -260
  988. package/sdks/typescript/runner/.turbo/turbo-build.log +0 -22
  989. package/sdks/typescript/runner/dist/mod.cjs +0 -2951
  990. package/sdks/typescript/runner/dist/mod.cjs.map +0 -1
  991. package/sdks/typescript/runner/dist/mod.d.cts +0 -326
  992. package/sdks/typescript/runner/dist/mod.d.ts +0 -326
  993. package/sdks/typescript/runner/dist/mod.js +0 -2951
  994. package/sdks/typescript/runner/dist/mod.js.map +0 -1
  995. package/sdks/typescript/runner/node_modules/.bin/pino +0 -21
  996. package/sdks/typescript/runner/node_modules/.bin/tsc +0 -21
  997. package/sdks/typescript/runner/node_modules/.bin/tsserver +0 -21
  998. package/sdks/typescript/runner/node_modules/.bin/tsup +0 -21
  999. package/sdks/typescript/runner/node_modules/.bin/tsup-node +0 -21
  1000. package/sdks/typescript/runner/node_modules/.bin/tsx +0 -21
  1001. package/sdks/typescript/runner/node_modules/.bin/uuid +0 -21
  1002. package/sdks/typescript/runner/node_modules/.bin/vitest +0 -21
  1003. package/sdks/typescript/runner-protocol/.turbo/turbo-build.log +0 -22
  1004. package/sdks/typescript/runner-protocol/dist/index.cjs.map +0 -1
  1005. package/sdks/typescript/runner-protocol/dist/index.d.cts +0 -666
  1006. package/sdks/typescript/runner-protocol/dist/index.d.ts +0 -666
  1007. package/sdks/typescript/runner-protocol/dist/index.js.map +0 -1
  1008. package/sdks/typescript/runner-protocol/node_modules/.bin/tsserver +0 -21
  1009. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup +0 -21
  1010. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup-node +0 -21
  1011. package/sdks/typescript/test-runner/Dockerfile +0 -26
  1012. package/tests/load/README.md +0 -28
  1013. package/tests/load/actor-lifecycle/README.md +0 -26
  1014. package/tests/load/actor-lifecycle/actor.ts +0 -41
  1015. package/tests/load/actor-lifecycle/config.ts +0 -14
  1016. package/tests/load/actor-lifecycle/index.ts +0 -62
  1017. package/tests/load/actor-lifecycle/rivet_api.ts +0 -140
  1018. package/tests/load/actor-lifecycle/types.ts +0 -17
  1019. package/tests/load/node_modules/.bin/biome +0 -21
  1020. package/tests/load/node_modules/.bin/tsc +0 -21
  1021. package/tests/load/package.json +0 -15
  1022. package/tests/load/tsconfig.json +0 -20
  1023. package/tests/smoke/README.md +0 -32
  1024. package/tests/smoke/package.json +0 -19
  1025. package/tests/smoke/scripts/connect.ts +0 -41
  1026. package/tests/smoke/src/server/registry.ts +0 -32
  1027. package/tests/smoke/src/server/server.ts +0 -7
  1028. package/tests/smoke/src/smoke-test/index.ts +0 -161
  1029. package/tests/smoke/src/smoke-test/spawn-actor.ts +0 -109
  1030. package/tests/smoke/tsconfig.json +0 -43
  1031. /package/packages/{dump-openapi → api-public-openapi-gen}/build.rs +0 -0
  1032. /package/packages/{dump-openapi → api-public-openapi-gen}/src/lib.rs +0 -0
  1033. /package/{sdks/rust → packages}/runner-protocol/Cargo.toml +0 -0
  1034. /package/{sdks/rust → packages}/runner-protocol/src/compat.rs +0 -0
  1035. /package/{sdks/rust → packages}/runner-protocol/src/generated.rs +0 -0
  1036. /package/{sdks/rust → packages}/runner-protocol/src/uuid_compat.rs +0 -0
  1037. /package/sdks/rust/{runner-protocol → envoy-protocol}/src/util.rs +0 -0
  1038. /package/{tests/smoke → sdks/typescript/envoy-protocol}/turbo.json +0 -0
@@ -0,0 +1,1453 @@
1
+ use anyhow::*;
2
+ use async_trait::async_trait;
3
+ use common::test_runner::*;
4
+ use std::sync::{Arc, Mutex};
5
+ use tokio::sync::broadcast;
6
+
7
+ use super::super::common;
8
+
9
+ /// Helper to wait for actor to wake from sleep using lifecycle events (DEPRECATED for other tests)
10
+ /// Polls until sleep_ts is cleared, connectable_ts is set, and start_ts is updated
11
+ async fn wait_for_actor_wake_polling(
12
+ port: u16,
13
+ actor_id: &str,
14
+ namespace: &str,
15
+ timeout_secs: u64,
16
+ ) -> Result<rivet_types::actors::Actor> {
17
+ let start = std::time::Instant::now();
18
+ loop {
19
+ let actor = common::try_get_actor(port, actor_id, namespace)
20
+ .await
21
+ .expect("failed to get actor")
22
+ .expect("actor should exist");
23
+
24
+ // Actor is awake if it's not sleeping and is connectable
25
+ let is_awake = actor.sleep_ts.is_none() && actor.connectable_ts.is_some();
26
+
27
+ if is_awake {
28
+ return Ok(actor);
29
+ }
30
+
31
+ if start.elapsed() > std::time::Duration::from_secs(timeout_secs) {
32
+ bail!(
33
+ "timeout waiting for actor to wake: sleep_ts={:?}, connectable_ts={:?}",
34
+ actor.sleep_ts,
35
+ actor.connectable_ts
36
+ );
37
+ }
38
+
39
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
40
+ }
41
+ }
42
+
43
+ /// Helper to wait for actor to wake from alarm using lifecycle events
44
+ /// Waits for the actor to start again - for alarm wakes, generation increments by 1
45
+ /// For crash/restart, generation also increments by 1
46
+ async fn wait_for_actor_wake_from_alarm(
47
+ mut lifecycle_rx: broadcast::Receiver<ActorLifecycleEvent>,
48
+ actor_id: &str,
49
+ expected_generation: u32,
50
+ timeout_secs: u64,
51
+ ) -> Result<u32> {
52
+ let start = std::time::Instant::now();
53
+ let actor_id = actor_id.to_string();
54
+
55
+ loop {
56
+ tokio::select! {
57
+ result = lifecycle_rx.recv() => {
58
+ match result {
59
+ Result::Ok(ActorLifecycleEvent::Started { actor_id: id, generation }) => {
60
+ if id == actor_id && generation == expected_generation {
61
+ tracing::info!(actor_id = ?id, generation, "actor woke from alarm with expected generation");
62
+ return Result::Ok(generation);
63
+ }
64
+ }
65
+ Result::Ok(_) => continue,
66
+ Result::Err(broadcast::error::RecvError::Lagged(n)) => {
67
+ tracing::warn!(lagged = n, "lifecycle event receiver lagged, continuing");
68
+ continue;
69
+ }
70
+ Result::Err(broadcast::error::RecvError::Closed) => {
71
+ bail!("lifecycle event channel closed");
72
+ }
73
+ }
74
+ }
75
+ _ = tokio::time::sleep(std::time::Duration::from_secs(timeout_secs).saturating_sub(start.elapsed())) => {
76
+ bail!(
77
+ "timeout waiting for actor to wake from alarm: actor_id={}, expected_generation={}, waited={:?}",
78
+ actor_id, expected_generation, start.elapsed()
79
+ );
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ /// Helper to wait for actor to enter sleep state
86
+ /// Polls until sleep_ts is set
87
+ async fn wait_for_actor_sleep(
88
+ port: u16,
89
+ actor_id: &str,
90
+ namespace: &str,
91
+ timeout_secs: u64,
92
+ ) -> Result<rivet_types::actors::Actor> {
93
+ let start = std::time::Instant::now();
94
+ loop {
95
+ let actor = common::try_get_actor(port, actor_id, namespace)
96
+ .await
97
+ .expect("failed to get actor")
98
+ .expect("actor should exist");
99
+
100
+ if actor.sleep_ts.is_some() {
101
+ return Ok(actor);
102
+ }
103
+
104
+ if start.elapsed() > std::time::Duration::from_secs(timeout_secs) {
105
+ bail!(
106
+ "timeout waiting for actor to sleep: sleep_ts={:?}",
107
+ actor.sleep_ts
108
+ );
109
+ }
110
+
111
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
112
+ }
113
+ }
114
+
115
+ /// Get current timestamp in milliseconds (matching alarm format)
116
+ fn get_current_timestamp_ms() -> i64 {
117
+ rivet_util::timestamp::now()
118
+ }
119
+
120
+ // MARK: Behavior Implementations
121
+
122
+ /// Actor that sets an alarm and immediately sends sleep intent on first start (generation 0).
123
+ /// On subsequent starts (after wake from alarm), it stays awake.
124
+ /// Notifies via ready_tx when setup is complete.
125
+ struct AlarmAndSleepActor {
126
+ alarm_offset_ms: i64,
127
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
128
+ }
129
+
130
+ impl AlarmAndSleepActor {
131
+ fn new(
132
+ alarm_offset_ms: i64,
133
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
134
+ ) -> Self {
135
+ Self {
136
+ alarm_offset_ms,
137
+ ready_tx,
138
+ }
139
+ }
140
+ }
141
+
142
+ #[async_trait]
143
+ impl Actor for AlarmAndSleepActor {
144
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
145
+ let generation = config.generation;
146
+ tracing::info!(?config.actor_id, generation, "alarm actor starting");
147
+
148
+ if generation == 0 {
149
+ // First start: set alarm and sleep
150
+ let alarm_time = get_current_timestamp_ms() + self.alarm_offset_ms;
151
+ config.send_set_alarm(alarm_time);
152
+ config.send_sleep_intent();
153
+
154
+ // Notify test that we're ready
155
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
156
+ let _ = tx.send(());
157
+ }
158
+
159
+ tracing::info!(generation, "set alarm and sleeping");
160
+ } else {
161
+ // Subsequent wakes (generation >= 1): stay awake
162
+ tracing::info!(generation, "woke from alarm, staying awake");
163
+ }
164
+
165
+ Ok(ActorStartResult::Running)
166
+ }
167
+
168
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
169
+ Ok(ActorStopResult::Success)
170
+ }
171
+
172
+ fn name(&self) -> &str {
173
+ "AlarmAndSleepActor"
174
+ }
175
+ }
176
+
177
+ /// Actor that sets an alarm and sleeps only on first run (generation 0).
178
+ /// On subsequent wakes (from alarm), stays awake without sleeping again.
179
+ /// Notifies via ready_tx when setup is complete.
180
+ struct AlarmAndSleepOnceActor {
181
+ alarm_offset_ms: i64,
182
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
183
+ }
184
+
185
+ impl AlarmAndSleepOnceActor {
186
+ fn new(
187
+ alarm_offset_ms: i64,
188
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
189
+ ) -> Self {
190
+ Self {
191
+ alarm_offset_ms,
192
+ ready_tx,
193
+ }
194
+ }
195
+ }
196
+
197
+ #[async_trait]
198
+ impl Actor for AlarmAndSleepOnceActor {
199
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
200
+ let generation = config.generation;
201
+ tracing::info!(?config.actor_id, generation, "alarm once actor starting");
202
+
203
+ if generation == 0 {
204
+ // First start (gen 0): set alarm and sleep
205
+ let alarm_time = get_current_timestamp_ms() + self.alarm_offset_ms;
206
+ config.send_set_alarm(alarm_time);
207
+ config.send_sleep_intent();
208
+
209
+ // Notify test that we're ready
210
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
211
+ let _ = tx.send(());
212
+ }
213
+
214
+ tracing::info!(generation, "set alarm and sleeping");
215
+ } else {
216
+ // Subsequent wakes (gen >= 1): stay awake
217
+ tracing::info!(generation, "woke from alarm, staying awake");
218
+ }
219
+
220
+ Ok(ActorStartResult::Running)
221
+ }
222
+
223
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
224
+ Ok(ActorStopResult::Success)
225
+ }
226
+
227
+ fn name(&self) -> &str {
228
+ "AlarmAndSleepOnceActor"
229
+ }
230
+ }
231
+
232
+ /// Actor that sets an alarm, sends sleep intent, then clears the alarm after a delay (generation 0 only).
233
+ /// Notifies via ready_tx when initial setup is complete.
234
+ /// Notifies via clear_tx when alarm is cleared.
235
+ struct AlarmSleepThenClearActor {
236
+ alarm_offset_ms: i64,
237
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
238
+ }
239
+
240
+ impl AlarmSleepThenClearActor {
241
+ fn new(
242
+ alarm_offset_ms: i64,
243
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
244
+ ) -> Self {
245
+ Self {
246
+ alarm_offset_ms,
247
+ ready_tx,
248
+ }
249
+ }
250
+ }
251
+
252
+ #[async_trait]
253
+ impl Actor for AlarmSleepThenClearActor {
254
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
255
+ let generation = config.generation;
256
+ tracing::info!(?config.actor_id, generation, "alarm actor starting");
257
+
258
+ if generation == 0 {
259
+ // Set alarm for current_time + offset
260
+ let alarm_time = get_current_timestamp_ms() + self.alarm_offset_ms;
261
+ config.send_set_alarm(alarm_time);
262
+ config.send_clear_alarm();
263
+ // Send sleep intent
264
+ config.send_sleep_intent();
265
+
266
+ // Notify test
267
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
268
+ let _ = tx.send(());
269
+ }
270
+ }
271
+
272
+ Ok(ActorStartResult::Running)
273
+ }
274
+
275
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
276
+ Ok(ActorStopResult::Success)
277
+ }
278
+
279
+ fn name(&self) -> &str {
280
+ "AlarmSleepThenClearActor"
281
+ }
282
+ }
283
+
284
+ /// Actor that sets an alarm, sends sleep intent, then replaces the alarm after a delay (generation 0 only).
285
+ /// Notifies via ready_tx when initial setup is complete.
286
+ /// Notifies via replace_tx when alarm is replaced.
287
+ struct AlarmSleepThenReplaceActor {
288
+ initial_alarm_offset_ms: i64,
289
+ replace_delay_ms: u64,
290
+ replacement_alarm_offset_ms: i64,
291
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
292
+ replace_tx: tokio::sync::mpsc::UnboundedSender<()>,
293
+ }
294
+
295
+ impl AlarmSleepThenReplaceActor {
296
+ fn new(
297
+ initial_alarm_offset_ms: i64,
298
+ replace_delay_ms: u64,
299
+ replacement_alarm_offset_ms: i64,
300
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
301
+ replace_tx: tokio::sync::mpsc::UnboundedSender<()>,
302
+ ) -> Self {
303
+ Self {
304
+ initial_alarm_offset_ms,
305
+ replace_delay_ms,
306
+ replacement_alarm_offset_ms,
307
+ ready_tx,
308
+ replace_tx,
309
+ }
310
+ }
311
+ }
312
+
313
+ #[async_trait]
314
+ impl Actor for AlarmSleepThenReplaceActor {
315
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
316
+ let generation = config.generation;
317
+ tracing::info!(?config.actor_id, generation, "alarm actor starting");
318
+
319
+ if generation == 0 {
320
+ // Set alarm A for current_time + offset
321
+ let alarm_a_time = get_current_timestamp_ms() + self.initial_alarm_offset_ms;
322
+ config.send_set_alarm(alarm_a_time);
323
+
324
+ // Notify test
325
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
326
+ let _ = tx.send(());
327
+ }
328
+
329
+ // Wait before replacing alarm (but BEFORE sleeping)
330
+ tokio::time::sleep(tokio::time::Duration::from_millis(self.replace_delay_ms)).await;
331
+
332
+ // Replace with alarm B - this must happen BEFORE we sleep
333
+ // because sleeping actors ignore events
334
+ let alarm_b_time = get_current_timestamp_ms() + self.replacement_alarm_offset_ms;
335
+ config.send_set_alarm(alarm_b_time);
336
+
337
+ // Notify that alarm was replaced
338
+ let _ = self.replace_tx.send(());
339
+ tracing::info!("alarm replaced, now sleeping");
340
+
341
+ // Now send sleep intent AFTER replacing the alarm
342
+ config.send_sleep_intent();
343
+ }
344
+
345
+ Ok(ActorStartResult::Running)
346
+ }
347
+
348
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
349
+ Ok(ActorStopResult::Success)
350
+ }
351
+
352
+ fn name(&self) -> &str {
353
+ "AlarmSleepThenReplaceActor"
354
+ }
355
+ }
356
+
357
+ /// Actor that sets multiple alarms before sleeping (generation 0 only).
358
+ /// Used to test that only the last alarm fires.
359
+ struct MultipleAlarmSetActor {
360
+ alarm_offsets_ms: Vec<i64>,
361
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
362
+ }
363
+
364
+ impl MultipleAlarmSetActor {
365
+ fn new(
366
+ alarm_offsets_ms: Vec<i64>,
367
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
368
+ ) -> Self {
369
+ Self {
370
+ alarm_offsets_ms,
371
+ ready_tx,
372
+ }
373
+ }
374
+ }
375
+
376
+ #[async_trait]
377
+ impl Actor for MultipleAlarmSetActor {
378
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
379
+ let generation = config.generation;
380
+ tracing::info!(?config.actor_id, generation, "multi alarm actor starting");
381
+
382
+ if generation == 0 {
383
+ // Set multiple alarms
384
+ for offset in &self.alarm_offsets_ms {
385
+ let alarm_time = get_current_timestamp_ms() + offset;
386
+ config.send_set_alarm(alarm_time);
387
+ }
388
+
389
+ // Send sleep intent
390
+ config.send_sleep_intent();
391
+
392
+ // Notify test
393
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
394
+ let _ = tx.send(());
395
+ }
396
+ }
397
+
398
+ Ok(ActorStartResult::Running)
399
+ }
400
+
401
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
402
+ Ok(ActorStopResult::Success)
403
+ }
404
+
405
+ fn name(&self) -> &str {
406
+ "MultipleAlarmSetActor"
407
+ }
408
+ }
409
+
410
+ /// Actor that sets a new alarm each time it wakes, creating multiple sleep/wake cycles.
411
+ struct MultiCycleAlarmActor {
412
+ alarm_offset_ms: i64,
413
+ max_cycles: Arc<Mutex<usize>>,
414
+ wake_tx: tokio::sync::mpsc::UnboundedSender<u32>,
415
+ }
416
+
417
+ impl MultiCycleAlarmActor {
418
+ fn new(
419
+ alarm_offset_ms: i64,
420
+ max_cycles: usize,
421
+ wake_tx: tokio::sync::mpsc::UnboundedSender<u32>,
422
+ ) -> Self {
423
+ Self {
424
+ alarm_offset_ms,
425
+ max_cycles: Arc::new(Mutex::new(max_cycles)),
426
+ wake_tx,
427
+ }
428
+ }
429
+ }
430
+
431
+ #[async_trait]
432
+ impl Actor for MultiCycleAlarmActor {
433
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
434
+ let generation = config.generation;
435
+ tracing::info!(?config.actor_id, generation, "multi cycle alarm actor starting");
436
+
437
+ // Notify test of wake
438
+ let _ = self.wake_tx.send(generation);
439
+
440
+ // Check if we should continue cycling
441
+ let mut remaining = self.max_cycles.lock().unwrap();
442
+ if *remaining > 0 {
443
+ *remaining -= 1;
444
+
445
+ // Set alarm and sleep
446
+ let alarm_time = get_current_timestamp_ms() + self.alarm_offset_ms;
447
+ config.send_set_alarm(alarm_time);
448
+ config.send_sleep_intent();
449
+
450
+ tracing::info!(generation, remaining = *remaining, "set alarm and sleeping");
451
+ } else {
452
+ tracing::info!(generation, "max cycles reached, staying awake");
453
+ }
454
+
455
+ Ok(ActorStartResult::Running)
456
+ }
457
+
458
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
459
+ Ok(ActorStopResult::Success)
460
+ }
461
+
462
+ fn name(&self) -> &str {
463
+ "MultiCycleAlarmActor"
464
+ }
465
+ }
466
+
467
+ /// Actor that sets an alarm on first wake (generation 0), then sleeps again without setting a new alarm.
468
+ /// Used to test that actor stays asleep when no new alarm is set.
469
+ struct AlarmOnceActor {
470
+ alarm_offset_ms: i64,
471
+ wake_tx: tokio::sync::mpsc::UnboundedSender<u32>,
472
+ }
473
+
474
+ impl AlarmOnceActor {
475
+ fn new(alarm_offset_ms: i64, wake_tx: tokio::sync::mpsc::UnboundedSender<u32>) -> Self {
476
+ Self {
477
+ alarm_offset_ms,
478
+ wake_tx,
479
+ }
480
+ }
481
+ }
482
+
483
+ #[async_trait]
484
+ impl Actor for AlarmOnceActor {
485
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
486
+ let generation = config.generation;
487
+ tracing::info!(?config.actor_id, generation, "alarm once actor starting");
488
+
489
+ // Notify test of wake
490
+ let _ = self.wake_tx.send(generation);
491
+
492
+ if generation == 0 {
493
+ // First start (gen 0): set alarm and sleep
494
+ let alarm_time = get_current_timestamp_ms() + self.alarm_offset_ms;
495
+ config.send_set_alarm(alarm_time);
496
+ config.send_sleep_intent();
497
+ tracing::info!(generation, "first start, set alarm and sleeping");
498
+ } else {
499
+ // Subsequent wakes (gen >= 1): just sleep without setting a new alarm
500
+ config.send_sleep_intent();
501
+ tracing::info!(generation, "subsequent wake, sleeping without alarm");
502
+ }
503
+
504
+ Ok(ActorStartResult::Running)
505
+ }
506
+
507
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
508
+ Ok(ActorStopResult::Success)
509
+ }
510
+
511
+ fn name(&self) -> &str {
512
+ "AlarmOnceActor"
513
+ }
514
+ }
515
+
516
+ /// Actor that sets an alarm, sleeps on gen 0, then crashes immediately on wake.
517
+ /// Gen 1+ stays running. Used to test that alarms don't persist across generations.
518
+ struct AlarmSleepThenCrashActor {
519
+ alarm_offset_ms: i64,
520
+ sleeping_tx: tokio::sync::mpsc::UnboundedSender<u32>,
521
+ crash_tx: tokio::sync::mpsc::UnboundedSender<u32>,
522
+ }
523
+
524
+ impl AlarmSleepThenCrashActor {
525
+ fn new(
526
+ alarm_offset_ms: i64,
527
+ sleeping_tx: tokio::sync::mpsc::UnboundedSender<u32>,
528
+ crash_tx: tokio::sync::mpsc::UnboundedSender<u32>,
529
+ ) -> Self {
530
+ Self {
531
+ alarm_offset_ms,
532
+ sleeping_tx,
533
+ crash_tx,
534
+ }
535
+ }
536
+ }
537
+
538
+ #[async_trait]
539
+ impl Actor for AlarmSleepThenCrashActor {
540
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
541
+ let generation = config.generation;
542
+ tracing::info!(?config.actor_id, generation, "alarm crash actor starting");
543
+
544
+ if generation == 0 {
545
+ // First start (gen 0): set alarm, and crash
546
+ let alarm_time = get_current_timestamp_ms() + self.alarm_offset_ms;
547
+ config.send_set_alarm(alarm_time);
548
+
549
+ // Notify test
550
+ let _ = self.crash_tx.send(generation);
551
+
552
+ tracing::info!(generation, "set alarm and sleeping");
553
+ Ok(ActorStartResult::Crash {
554
+ code: 1,
555
+ message: "crashing with gen 0".to_string(),
556
+ })
557
+ } else if generation == 1 {
558
+ tracing::info!(generation, "restarted after crash, sending sleep intent");
559
+ config.send_sleep_intent();
560
+ let _ = self.sleeping_tx.send(generation);
561
+ Ok(ActorStartResult::Running)
562
+ } else {
563
+ // If it restarted again, this was not expected
564
+ //
565
+ // Keep the actor running so the test finds out we're not asleep.
566
+ Ok(ActorStartResult::Running)
567
+ }
568
+ }
569
+
570
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
571
+ Ok(ActorStopResult::Success)
572
+ }
573
+
574
+ fn name(&self) -> &str {
575
+ "AlarmSleepThenCrashActor"
576
+ }
577
+ }
578
+
579
+ /// Actor that rapidly sets and clears alarms multiple times before sleeping (generation 0 only).
580
+ /// Used to test that rapid operations don't cause errors.
581
+ struct RapidAlarmCycleActor {
582
+ cycles: usize,
583
+ final_alarm_offset_ms: i64,
584
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
585
+ }
586
+
587
+ impl RapidAlarmCycleActor {
588
+ fn new(
589
+ cycles: usize,
590
+ final_alarm_offset_ms: i64,
591
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
592
+ ) -> Self {
593
+ Self {
594
+ cycles,
595
+ final_alarm_offset_ms,
596
+ ready_tx,
597
+ }
598
+ }
599
+ }
600
+
601
+ #[async_trait]
602
+ impl Actor for RapidAlarmCycleActor {
603
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
604
+ let generation = config.generation;
605
+ tracing::info!(?config.actor_id, generation, "rapid alarm cycle actor starting");
606
+
607
+ if generation == 0 {
608
+ // Rapidly set and clear alarms
609
+ for _i in 0..self.cycles {
610
+ config.send_set_alarm(get_current_timestamp_ms() + 5000);
611
+ config.send_clear_alarm();
612
+ }
613
+
614
+ // Set final alarm and sleep
615
+ let alarm_time = get_current_timestamp_ms() + self.final_alarm_offset_ms;
616
+ config.send_set_alarm(alarm_time);
617
+ config.send_sleep_intent();
618
+
619
+ // Notify test
620
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
621
+ let _ = tx.send(());
622
+ }
623
+ }
624
+
625
+ Ok(ActorStartResult::Running)
626
+ }
627
+
628
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
629
+ Ok(ActorStopResult::Success)
630
+ }
631
+
632
+ fn name(&self) -> &str {
633
+ "RapidAlarmCycleActor"
634
+ }
635
+ }
636
+
637
+ /// Actor that sets an alarm, immediately clears it, then sends sleep intent (generation 0 only).
638
+ /// Used to test that null alarm_ts properly clears alarms.
639
+ struct SetClearAlarmAndSleepActor {
640
+ ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>,
641
+ }
642
+
643
+ impl SetClearAlarmAndSleepActor {
644
+ fn new(ready_tx: Arc<Mutex<Option<tokio::sync::oneshot::Sender<()>>>>) -> Self {
645
+ Self { ready_tx }
646
+ }
647
+ }
648
+
649
+ #[async_trait]
650
+ impl Actor for SetClearAlarmAndSleepActor {
651
+ async fn on_start(&mut self, config: ActorConfig) -> anyhow::Result<ActorStartResult> {
652
+ let generation = config.generation;
653
+ tracing::info!(?config.actor_id, generation, "alarm actor starting");
654
+
655
+ if generation == 0 {
656
+ // Set alarm
657
+ let alarm_time = get_current_timestamp_ms() + 2000;
658
+ config.send_set_alarm(alarm_time);
659
+
660
+ // Clear it (set to null)
661
+ config.send_clear_alarm();
662
+
663
+ // Send sleep intent
664
+ config.send_sleep_intent();
665
+
666
+ // Notify test
667
+ if let Some(tx) = self.ready_tx.lock().unwrap().take() {
668
+ let _ = tx.send(());
669
+ }
670
+ }
671
+
672
+ Ok(ActorStartResult::Running)
673
+ }
674
+
675
+ async fn on_stop(&mut self) -> anyhow::Result<ActorStopResult> {
676
+ Ok(ActorStopResult::Success)
677
+ }
678
+
679
+ fn name(&self) -> &str {
680
+ "SetClearAlarmAndSleepActor"
681
+ }
682
+ }
683
+
684
+ // MARK: Core Functionality
685
+
686
+ #[test]
687
+ fn basic_alarm() {
688
+ common::run(common::TestOpts::new(1), |ctx| async move {
689
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
690
+
691
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
692
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
693
+
694
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
695
+ builder.with_actor_behavior("alarm-actor", move |_| {
696
+ let ready_tx = ready_tx.clone();
697
+ Box::new(AlarmAndSleepActor::new(3000, ready_tx))
698
+ })
699
+ })
700
+ .await;
701
+
702
+ let res = common::create_actor(
703
+ ctx.leader_dc().guard_port(),
704
+ &namespace,
705
+ "alarm-actor",
706
+ runner.name(),
707
+ rivet_types::actors::CrashPolicy::Destroy,
708
+ )
709
+ .await;
710
+
711
+ let actor_id = res.actor.actor_id.to_string();
712
+
713
+ // Wait for actor to be ready
714
+ ready_rx.await.expect("actor should send ready signal");
715
+
716
+ // Actor should be sleeping
717
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
718
+ .await
719
+ .unwrap();
720
+
721
+ tracing::info!(
722
+ ?actor_id,
723
+ "actor sleeping, alarm was set with gen 0, alarm should fire"
724
+ );
725
+
726
+ // Verify actor wakes from valid alarm
727
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), &actor_id, &namespace, 4)
728
+ .await
729
+ .expect("actor should wake from alarm");
730
+
731
+ tracing::info!(?actor_id, "gen 0 alarm fired successfully");
732
+ });
733
+ }
734
+
735
+ #[test]
736
+ fn clear_alarm_prevents_wake() {
737
+ common::run(common::TestOpts::new(1), |ctx| async move {
738
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
739
+
740
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
741
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
742
+
743
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
744
+ builder.with_actor_behavior("alarm-actor", move |_| {
745
+ let ready_tx = ready_tx.clone();
746
+ Box::new(AlarmSleepThenClearActor::new(2000, ready_tx))
747
+ })
748
+ })
749
+ .await;
750
+
751
+ let res = common::create_actor(
752
+ ctx.leader_dc().guard_port(),
753
+ &namespace,
754
+ "alarm-actor",
755
+ runner.name(),
756
+ rivet_types::actors::CrashPolicy::Destroy,
757
+ )
758
+ .await;
759
+
760
+ let actor_id = res.actor.actor_id.to_string();
761
+
762
+ // Wait for actor to be ready
763
+ ready_rx.await.expect("actor should send ready signal");
764
+
765
+ // Verify actor is sleeping
766
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
767
+ .await
768
+ .unwrap();
769
+
770
+ // Wait past the original alarm time
771
+ tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
772
+
773
+ // Verify actor is still sleeping
774
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
775
+ .await
776
+ .expect("failed to get actor")
777
+ .expect("actor should exist");
778
+
779
+ assert!(
780
+ actor.sleep_ts.is_some(),
781
+ "actor should still be sleeping after alarm was cleared"
782
+ );
783
+
784
+ tracing::info!(?actor_id, "alarm cleared successfully prevented wake");
785
+ });
786
+ }
787
+
788
+ #[test]
789
+ fn replace_alarm_overwrites_previous() {
790
+ common::run(common::TestOpts::new(1), |ctx| async move {
791
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
792
+
793
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
794
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
795
+ let (replace_tx, mut replace_rx) = tokio::sync::mpsc::unbounded_channel();
796
+
797
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
798
+ builder.with_actor_behavior("alarm-actor", move |_| {
799
+ let ready_tx = ready_tx.clone();
800
+ let replace_tx = replace_tx.clone();
801
+ Box::new(AlarmSleepThenReplaceActor::new(
802
+ 3000, 500, 1000, ready_tx, replace_tx,
803
+ ))
804
+ })
805
+ })
806
+ .await;
807
+
808
+ let res = common::create_actor(
809
+ ctx.leader_dc().guard_port(),
810
+ &namespace,
811
+ "alarm-actor",
812
+ runner.name(),
813
+ rivet_types::actors::CrashPolicy::Destroy,
814
+ )
815
+ .await;
816
+
817
+ let actor_id = res.actor.actor_id.to_string();
818
+
819
+ // Wait for actor to be ready
820
+ ready_rx.await.expect("actor should send ready signal");
821
+
822
+ // Wait for alarm to be replaced
823
+ replace_rx.recv().await.expect("alarm should be replaced");
824
+
825
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
826
+ .await
827
+ .expect("actor should be asleep");
828
+
829
+ tracing::info!("waiting for actor to wake from alarm B (~1s)");
830
+
831
+ // Actor should wake ~1s after alarm B was set, not 3s
832
+ // We'll wait up to 3 seconds total - it should wake much sooner
833
+ let wake_start = std::time::Instant::now();
834
+ let actor =
835
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), &actor_id, &namespace, 10)
836
+ .await
837
+ .expect("expected actor to be awake from alarm A or B");
838
+ let wake_duration = wake_start.elapsed();
839
+
840
+ assert!(actor.sleep_ts.is_none(), "actor should be awake");
841
+ assert!(
842
+ wake_duration < std::time::Duration::from_millis(2500),
843
+ "actor should wake from alarm B (~1.5s), not alarm A (3s), actual: {:?}",
844
+ wake_duration
845
+ );
846
+
847
+ tracing::info!(?actor_id, ?wake_duration, "alarm replaced successfully");
848
+ });
849
+ }
850
+
851
+ #[test]
852
+ fn alarm_in_the_past() {
853
+ common::run(common::TestOpts::new(1), |ctx| async move {
854
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
855
+
856
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
857
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
858
+
859
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
860
+ builder.with_actor_behavior("alarm-actor", move |_| {
861
+ let ready_tx = ready_tx.clone();
862
+ Box::new(AlarmAndSleepActor::new(-1000, ready_tx))
863
+ })
864
+ })
865
+ .await;
866
+
867
+ let res = common::create_actor(
868
+ ctx.leader_dc().guard_port(),
869
+ &namespace,
870
+ "alarm-actor",
871
+ runner.name(),
872
+ rivet_types::actors::CrashPolicy::Destroy,
873
+ )
874
+ .await;
875
+
876
+ let actor_id = res.actor.actor_id.to_string();
877
+
878
+ // Wait for actor to be ready (gen 0)
879
+ ready_rx.await.expect("actor should send ready signal");
880
+
881
+ // Actor sets alarm in the past and sleeps
882
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
883
+ .await
884
+ .expect("actor should be asleep");
885
+
886
+ // The past alarm should fire immediately, waking the actor
887
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), &actor_id, &namespace, 2)
888
+ .await
889
+ .expect("actor should wake immediately from past alarm");
890
+
891
+ // Verify actor is awake at gen 1
892
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
893
+ .await
894
+ .expect("failed to get actor")
895
+ .expect("actor should exist");
896
+
897
+ assert!(actor.sleep_ts.is_none(), "actor should be awake");
898
+ assert!(
899
+ actor.connectable_ts.is_some(),
900
+ "actor should be connectable"
901
+ );
902
+
903
+ tracing::info!(?actor_id, "actor woke immediately from past alarm");
904
+ });
905
+ }
906
+
907
+ #[test]
908
+ fn alarm_with_null_timestamp() {
909
+ common::run(common::TestOpts::new(1), |ctx| async move {
910
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
911
+
912
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
913
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
914
+
915
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
916
+ builder.with_actor_behavior("alarm-actor", move |_| {
917
+ let ready_tx = ready_tx.clone();
918
+ Box::new(SetClearAlarmAndSleepActor::new(ready_tx))
919
+ })
920
+ })
921
+ .await;
922
+
923
+ let res = common::create_actor(
924
+ ctx.leader_dc().guard_port(),
925
+ &namespace,
926
+ "alarm-actor",
927
+ runner.name(),
928
+ rivet_types::actors::CrashPolicy::Destroy,
929
+ )
930
+ .await;
931
+
932
+ let actor_id = res.actor.actor_id.to_string();
933
+
934
+ // Wait for actor to be ready
935
+ ready_rx.await.expect("actor should send ready signal");
936
+
937
+ // Verify actor is sleeping
938
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
939
+ .await
940
+ .expect("actor is not sleeping");
941
+
942
+ // Wait past alarm time
943
+ tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
944
+
945
+ // Verify actor is still sleeping
946
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
947
+ .await
948
+ .expect("failed to get actor")
949
+ .expect("actor should exist");
950
+
951
+ assert!(
952
+ actor.sleep_ts.is_some(),
953
+ "actor should still be sleeping after alarm was cleared with null"
954
+ );
955
+
956
+ tracing::info!(?actor_id, "null alarm_ts successfully cleared alarm");
957
+ });
958
+ }
959
+
960
+ // MARK: Edge Cases
961
+
962
+ #[test]
963
+ fn alarm_fires_at_correct_time() {
964
+ common::run(
965
+ common::TestOpts::new(1).with_timeout(10),
966
+ |ctx| async move {
967
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
968
+
969
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
970
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
971
+
972
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
973
+ builder.with_actor_behavior("alarm-actor", move |_| {
974
+ let ready_tx = ready_tx.clone();
975
+ Box::new(AlarmAndSleepOnceActor::new(5000, ready_tx))
976
+ })
977
+ })
978
+ .await;
979
+
980
+ let res = common::create_actor(
981
+ ctx.leader_dc().guard_port(),
982
+ &namespace,
983
+ "alarm-actor",
984
+ runner.name(),
985
+ rivet_types::actors::CrashPolicy::Destroy,
986
+ )
987
+ .await;
988
+
989
+ let actor_id = res.actor.actor_id.to_string();
990
+
991
+ // Wait for actor to be ready
992
+ ready_rx.await.expect("actor should send ready signal");
993
+
994
+ // Record when actor started sleeping
995
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 4)
996
+ .await
997
+ .unwrap();
998
+ let sleep_time = std::time::Instant::now();
999
+
1000
+ tracing::info!(?actor_id, "actor is sleeping, alarm set for +5s");
1001
+
1002
+ // Subscribe to lifecycle events AFTER actor is sleeping, so we only get the wake event
1003
+ let lifecycle_rx = runner.subscribe_lifecycle_events();
1004
+
1005
+ // Wait for actor to wake using lifecycle events (expect generation 1, incremented from sleep)
1006
+ wait_for_actor_wake_from_alarm(lifecycle_rx, &actor_id, 1, 7)
1007
+ .await
1008
+ .expect("expected actor to be awake");
1009
+
1010
+ let wake_duration = sleep_time.elapsed();
1011
+
1012
+ // Verify wake time is within ±500ms of alarm time (5s)
1013
+ assert!(
1014
+ wake_duration >= std::time::Duration::from_millis(4500)
1015
+ && wake_duration <= std::time::Duration::from_millis(5500),
1016
+ "alarm should fire within ±500ms of 5s, actual: {:?}",
1017
+ wake_duration
1018
+ );
1019
+
1020
+ tracing::info!(?actor_id, ?wake_duration, "alarm fired at correct time");
1021
+ },
1022
+ );
1023
+ }
1024
+
1025
+ #[test]
1026
+ fn multiple_alarm_sets_before_sleep() {
1027
+ common::run(common::TestOpts::new(1), |ctx| async move {
1028
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1029
+
1030
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
1031
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
1032
+
1033
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1034
+ builder.with_actor_behavior("alarm-actor", move |_| {
1035
+ let ready_tx = ready_tx.clone();
1036
+ // Set alarms for +5s, +10s, +2s (last one should win)
1037
+ Box::new(MultipleAlarmSetActor::new(
1038
+ vec![5000, 10000, 2000],
1039
+ ready_tx,
1040
+ ))
1041
+ })
1042
+ })
1043
+ .await;
1044
+
1045
+ let res = common::create_actor(
1046
+ ctx.leader_dc().guard_port(),
1047
+ &namespace,
1048
+ "alarm-actor",
1049
+ runner.name(),
1050
+ rivet_types::actors::CrashPolicy::Destroy,
1051
+ )
1052
+ .await;
1053
+
1054
+ let actor_id = res.actor.actor_id.to_string();
1055
+
1056
+ // Wait for actor to be ready
1057
+ ready_rx.await.expect("actor should send ready signal");
1058
+
1059
+ // Verify actor is sleeping
1060
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
1061
+ .await
1062
+ .unwrap();
1063
+ let sleep_time = std::time::Instant::now();
1064
+
1065
+ tracing::info!(?actor_id, "actor is sleeping, last alarm set for +2s");
1066
+
1067
+ // Wait for actor to wake
1068
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), &actor_id, &namespace, 4)
1069
+ .await
1070
+ .expect("expected actor to be awake");
1071
+
1072
+ let wake_duration = sleep_time.elapsed();
1073
+
1074
+ // Verify wakes at ~2s mark (last alarm), not 5s or 10s
1075
+ assert!(
1076
+ wake_duration >= std::time::Duration::from_millis(1500)
1077
+ && wake_duration <= std::time::Duration::from_millis(2500),
1078
+ "actor should wake from last alarm (~2s), actual: {:?}",
1079
+ wake_duration
1080
+ );
1081
+
1082
+ tracing::info!(?actor_id, ?wake_duration, "only last alarm fired");
1083
+ });
1084
+ }
1085
+
1086
+ #[test]
1087
+ fn multiple_sleep_wake_alarm_cycles() {
1088
+ common::run(common::TestOpts::new(1), |ctx| async move {
1089
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1090
+
1091
+ let (wake_tx, mut wake_rx) = tokio::sync::mpsc::unbounded_channel();
1092
+
1093
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1094
+ builder.with_actor_behavior("alarm-actor", move |_| {
1095
+ let wake_tx = wake_tx.clone();
1096
+ // 3 cycles with 1s alarms
1097
+ Box::new(MultiCycleAlarmActor::new(1000, 3, wake_tx))
1098
+ })
1099
+ })
1100
+ .await;
1101
+
1102
+ let res = common::create_actor(
1103
+ ctx.leader_dc().guard_port(),
1104
+ &namespace,
1105
+ "alarm-actor",
1106
+ runner.name(),
1107
+ rivet_types::actors::CrashPolicy::Destroy,
1108
+ )
1109
+ .await;
1110
+
1111
+ let actor_id = res.actor.actor_id.to_string();
1112
+
1113
+ tracing::info!(?actor_id, "waiting for 3 wake cycles");
1114
+
1115
+ // Collect 3 wake notifications (initial + 2 alarm wakes)
1116
+ let mut wake_count = 0;
1117
+ for _ in 0..3 {
1118
+ tokio::time::timeout(tokio::time::Duration::from_secs(3), wake_rx.recv())
1119
+ .await
1120
+ .expect("timeout waiting for wake notification")
1121
+ .expect("wake channel closed");
1122
+ wake_count += 1;
1123
+ tracing::info!(wake_count, "actor woke");
1124
+ }
1125
+
1126
+ assert_eq!(wake_count, 3, "actor should have woken 3 times");
1127
+
1128
+ tracing::info!(?actor_id, "all 3 cycles completed successfully");
1129
+ });
1130
+ }
1131
+
1132
+ #[test]
1133
+ fn alarm_wake_then_sleep_without_new_alarm() {
1134
+ common::run(common::TestOpts::new(1), |ctx| async move {
1135
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1136
+
1137
+ let (wake_tx, mut wake_rx) = tokio::sync::mpsc::unbounded_channel();
1138
+
1139
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1140
+ builder.with_actor_behavior("alarm-actor", move |_| {
1141
+ let wake_tx = wake_tx.clone();
1142
+ // Set alarm for 1s on first start
1143
+ Box::new(AlarmOnceActor::new(1000, wake_tx))
1144
+ })
1145
+ })
1146
+ .await;
1147
+
1148
+ let res = common::create_actor(
1149
+ ctx.leader_dc().guard_port(),
1150
+ &namespace,
1151
+ "alarm-actor",
1152
+ runner.name(),
1153
+ rivet_types::actors::CrashPolicy::Destroy,
1154
+ )
1155
+ .await;
1156
+
1157
+ let actor_id = res.actor.actor_id.to_string();
1158
+
1159
+ // Wait for first wake (initial start)
1160
+ wake_rx.recv().await.expect("first wake notification");
1161
+ tracing::info!(?actor_id, "actor initial start");
1162
+
1163
+ // Wait for second wake (from alarm)
1164
+ tokio::time::timeout(tokio::time::Duration::from_secs(3), wake_rx.recv())
1165
+ .await
1166
+ .expect("timeout waiting for alarm wake")
1167
+ .expect("wake channel closed");
1168
+ tracing::info!(?actor_id, "actor woke from alarm");
1169
+
1170
+ // Verify actor went back to sleep
1171
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
1172
+ .await
1173
+ .expect("actor should be asleep");
1174
+
1175
+ // Wait additional time to ensure no spurious wake
1176
+ tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
1177
+
1178
+ // Verify actor is still sleeping (no zombie alarm)
1179
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
1180
+ .await
1181
+ .expect("failed to get actor")
1182
+ .expect("actor should exist");
1183
+
1184
+ assert!(
1185
+ actor.sleep_ts.is_some(),
1186
+ "actor should still be sleeping without new alarm"
1187
+ );
1188
+
1189
+ tracing::info!(?actor_id, "actor stayed asleep without zombie alarm");
1190
+ });
1191
+ }
1192
+
1193
+ // MARK: Advanced Usage
1194
+
1195
+ #[test]
1196
+ fn alarm_behavior_with_crash_policy_restart() {
1197
+ common::run(
1198
+ common::TestOpts::new(1).with_timeout(45),
1199
+ |ctx| async move {
1200
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1201
+
1202
+ let (sleeping_tx, mut sleeping_rx) = tokio::sync::mpsc::unbounded_channel();
1203
+ let (crash_tx, mut crash_rx) = tokio::sync::mpsc::unbounded_channel();
1204
+
1205
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1206
+ builder.with_actor_behavior("alarm-actor", move |_| {
1207
+ let sleeping_tx = sleeping_tx.clone();
1208
+ let crash_tx = crash_tx.clone();
1209
+ // Set alarm for 15s, crash after 500ms
1210
+ Box::new(AlarmSleepThenCrashActor::new(15000, sleeping_tx, crash_tx))
1211
+ })
1212
+ })
1213
+ .await;
1214
+
1215
+ let res = common::create_actor(
1216
+ ctx.leader_dc().guard_port(),
1217
+ &namespace,
1218
+ "alarm-actor",
1219
+ runner.name(),
1220
+ rivet_types::actors::CrashPolicy::Restart,
1221
+ )
1222
+ .await;
1223
+
1224
+ let actor_id = res.actor.actor_id.to_string();
1225
+
1226
+ // Wait for crash notification gen 0 sets alarm and crashes
1227
+ crash_rx
1228
+ .recv()
1229
+ .await
1230
+ .expect("should receive crash notification");
1231
+
1232
+ tracing::info!(
1233
+ ?actor_id,
1234
+ "gen 0 crashed after alarm wake, waiting for gen 1 restart"
1235
+ );
1236
+
1237
+ // Wait for actor to start sleeping again (gen 1 started and sleep)
1238
+ sleeping_rx
1239
+ .recv()
1240
+ .await
1241
+ .expect("actor should send sleep signal");
1242
+
1243
+ let actor =
1244
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
1245
+ .await
1246
+ .expect("actor should be sleeping");
1247
+
1248
+ assert!(actor.sleep_ts.is_some(), "actor should be asleep");
1249
+
1250
+ tracing::info!(
1251
+ ?actor_id,
1252
+ "gen 1 is now asleep, waiting past original alarm time"
1253
+ );
1254
+
1255
+ // Verify the next gen is awake (woke from gen 0's alarm)
1256
+ let actor = wait_for_actor_wake_polling(
1257
+ ctx.leader_dc().guard_port(),
1258
+ &actor_id,
1259
+ &namespace,
1260
+ 15,
1261
+ )
1262
+ .await
1263
+ .expect("actor should be sleeping");
1264
+
1265
+ assert!(
1266
+ actor.sleep_ts.is_none() && actor.connectable_ts.is_some(),
1267
+ "next generation should be awake from gen 0 alarm"
1268
+ );
1269
+ },
1270
+ );
1271
+ }
1272
+
1273
+ #[test]
1274
+ fn rapid_alarm_set_clear_cycles() {
1275
+ common::run(common::TestOpts::new(1), |ctx| async move {
1276
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1277
+
1278
+ let (ready_tx, ready_rx) = tokio::sync::oneshot::channel();
1279
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
1280
+
1281
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1282
+ builder.with_actor_behavior("alarm-actor", move |_| {
1283
+ let ready_tx = ready_tx.clone();
1284
+ // 10 rapid cycles, then final alarm for 1s
1285
+ Box::new(RapidAlarmCycleActor::new(10, 1000, ready_tx))
1286
+ })
1287
+ })
1288
+ .await;
1289
+
1290
+ let res = common::create_actor(
1291
+ ctx.leader_dc().guard_port(),
1292
+ &namespace,
1293
+ "alarm-actor",
1294
+ runner.name(),
1295
+ rivet_types::actors::CrashPolicy::Destroy,
1296
+ )
1297
+ .await;
1298
+
1299
+ let actor_id = res.actor.actor_id.to_string();
1300
+
1301
+ // Wait for actor to be ready
1302
+ ready_rx.await.expect("actor should send ready signal");
1303
+
1304
+ // Verify actor is sleeping
1305
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), &actor_id, &namespace, 5)
1306
+ .await
1307
+ .unwrap();
1308
+
1309
+ tracing::info!(
1310
+ ?actor_id,
1311
+ "actor sleeping after rapid cycles, waiting for final alarm"
1312
+ );
1313
+
1314
+ // Verify actor wakes at final alarm time
1315
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), &actor_id, &namespace, 3)
1316
+ .await
1317
+ .expect("actor should wake from final alarm");
1318
+
1319
+ tracing::info!(?actor_id, "rapid alarm cycles succeeded, final alarm fired");
1320
+ });
1321
+ }
1322
+
1323
+ #[test]
1324
+ fn multiple_actors_with_different_alarm_times() {
1325
+ common::run(common::TestOpts::new(1), |ctx| async move {
1326
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1327
+
1328
+ // Create 3 actors with different alarm times
1329
+ let alarm_offsets = vec![1000, 2000, 3000];
1330
+ let mut actor_ids = Vec::new();
1331
+
1332
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1333
+ let mut b = builder;
1334
+ for (idx, offset) in alarm_offsets.iter().enumerate() {
1335
+ let offset = *offset;
1336
+ b = b.with_actor_behavior(&format!("alarm-actor-{}", idx), move |_| {
1337
+ let (ready_tx, _) = tokio::sync::oneshot::channel();
1338
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
1339
+ Box::new(AlarmAndSleepActor::new(offset, ready_tx))
1340
+ });
1341
+ }
1342
+ b
1343
+ })
1344
+ .await;
1345
+
1346
+ // Create actors
1347
+ for idx in 0..3 {
1348
+ // Create actor with specific behavior
1349
+ let res = common::create_actor(
1350
+ ctx.leader_dc().guard_port(),
1351
+ &namespace,
1352
+ &format!("alarm-actor-{}", idx),
1353
+ runner.name(),
1354
+ rivet_types::actors::CrashPolicy::Destroy,
1355
+ )
1356
+ .await;
1357
+ actor_ids.push(res.actor.actor_id.to_string());
1358
+ }
1359
+
1360
+ tracing::info!("created 3 actors with alarms at +1s, +2s, +3s");
1361
+
1362
+ // Wait for all actors to enter sleep state
1363
+ for (idx, actor_id) in actor_ids.iter().enumerate() {
1364
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), actor_id, &namespace, 5)
1365
+ .await
1366
+ .unwrap();
1367
+ tracing::info!(idx, actor_id, "actor sleeping");
1368
+ }
1369
+
1370
+ // Verify actors wake in order
1371
+ for (idx, actor_id) in actor_ids.iter().enumerate() {
1372
+ tracing::info!(idx, actor_id, "waiting for actor to wake");
1373
+
1374
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), actor_id, &namespace, 5)
1375
+ .await
1376
+ .expect("actor should wake");
1377
+
1378
+ tracing::info!(idx, actor_id, "actor woke at expected time");
1379
+ }
1380
+
1381
+ tracing::info!("all actors woke at their independent alarm times");
1382
+ });
1383
+ }
1384
+
1385
+ #[test]
1386
+ fn many_actors_same_alarm_time() {
1387
+ common::run(common::TestOpts::new(1), |ctx| async move {
1388
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1389
+
1390
+ let num_actors = 10;
1391
+ let alarm_offset = 2000; // All wake at same time
1392
+ let mut actor_ids = Vec::new();
1393
+
1394
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1395
+ builder.with_actor_behavior("alarm-actor", move |_| {
1396
+ let (ready_tx, _) = tokio::sync::oneshot::channel();
1397
+ let ready_tx = Arc::new(Mutex::new(Some(ready_tx)));
1398
+ Box::new(AlarmAndSleepActor::new(alarm_offset, ready_tx))
1399
+ })
1400
+ })
1401
+ .await;
1402
+
1403
+ // Create actors
1404
+ for _idx in 0..num_actors {
1405
+ let res = common::create_actor(
1406
+ ctx.leader_dc().guard_port(),
1407
+ &namespace,
1408
+ "alarm-actor",
1409
+ runner.name(),
1410
+ rivet_types::actors::CrashPolicy::Destroy,
1411
+ )
1412
+ .await;
1413
+ actor_ids.push(res.actor.actor_id.to_string());
1414
+ }
1415
+
1416
+ tracing::info!(num_actors, "created actors with same alarm time (+2s)");
1417
+
1418
+ // Wait for all actors to enter sleep state
1419
+ for actor_id in &actor_ids {
1420
+ wait_for_actor_sleep(ctx.leader_dc().guard_port(), actor_id, &namespace, 5)
1421
+ .await
1422
+ .unwrap();
1423
+ }
1424
+
1425
+ tracing::info!("all actors sleeping");
1426
+
1427
+ let alarm_start = std::time::Instant::now();
1428
+
1429
+ // Verify all actors wake within reasonable time window
1430
+ for (idx, actor_id) in actor_ids.iter().enumerate() {
1431
+ wait_for_actor_wake_polling(ctx.leader_dc().guard_port(), actor_id, &namespace, 4)
1432
+ .await
1433
+ .expect("actor should wake");
1434
+
1435
+ tracing::info!(idx, actor_id, "actor woke");
1436
+ }
1437
+
1438
+ let total_duration = alarm_start.elapsed();
1439
+
1440
+ // All 10 actors should wake within a 500ms window around the alarm time
1441
+ assert!(
1442
+ total_duration <= std::time::Duration::from_millis(3000),
1443
+ "all actors should wake within 3s, actual: {:?}",
1444
+ total_duration
1445
+ );
1446
+
1447
+ tracing::info!(
1448
+ num_actors,
1449
+ ?total_duration,
1450
+ "all actors woke concurrently at same alarm time"
1451
+ );
1452
+ });
1453
+ }