@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,1277 @@
1
+ use std::sync::{Arc, Mutex};
2
+
3
+ use super::super::common;
4
+
5
+ // MARK: Creation and Initialization
6
+ #[test]
7
+ fn envoy_actor_basic_create() {
8
+ common::run(common::TestOpts::new(1), |ctx| async move {
9
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
10
+
11
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
12
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
13
+
14
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
15
+ builder.with_actor_behavior("test-actor", move |_| {
16
+ Box::new(common::test_envoy::NotifyOnStartActor::new(
17
+ start_tx.clone(),
18
+ ))
19
+ })
20
+ })
21
+ .await;
22
+
23
+ let res = common::create_actor(
24
+ ctx.leader_dc().guard_port(),
25
+ &namespace,
26
+ "test-actor",
27
+ envoy.pool_name(),
28
+ rivet_types::actors::CrashPolicy::Destroy,
29
+ )
30
+ .await;
31
+
32
+ let actor_id = res.actor.actor_id.to_string();
33
+
34
+ // Wait for actor to start (notification from actor)
35
+ start_rx
36
+ .await
37
+ .expect("actor should have sent start notification");
38
+
39
+ // Verify actor is allocated to envoy
40
+ assert!(
41
+ envoy.has_actor(&actor_id).await,
42
+ "envoy should have the actor allocated"
43
+ );
44
+
45
+ tracing::info!(?actor_id, envoy_key = ?envoy.envoy_key, "actor allocated to envoy");
46
+ });
47
+ }
48
+
49
+ #[test]
50
+ fn envoy_create_actor_with_input() {
51
+ common::run(common::TestOpts::new(1), |ctx| async move {
52
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
53
+
54
+ // Generate test input data (base64-encoded String)
55
+ let input_data = common::generate_test_input_data();
56
+
57
+ // Decode the base64 data to get the actual bytes the actor will receive
58
+ // The API automatically decodes base64 input before sending to the envoy
59
+ let input_data_bytes =
60
+ base64::Engine::decode(&base64::engine::general_purpose::STANDARD, &input_data)
61
+ .expect("failed to decode base64 input");
62
+
63
+ // Create envoy with VerifyInputActor that will validate the input
64
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
65
+ builder.with_actor_behavior("test-actor", move |_| {
66
+ Box::new(common::test_envoy::VerifyInputActor::new(
67
+ input_data_bytes.clone(),
68
+ ))
69
+ })
70
+ })
71
+ .await;
72
+
73
+ // Create actor with input data
74
+ let res = common::api::public::actors_create(
75
+ ctx.leader_dc().guard_port(),
76
+ common::api_types::actors::create::CreateQuery {
77
+ namespace: namespace.clone(),
78
+ },
79
+ common::api_types::actors::create::CreateRequest {
80
+ datacenter: None,
81
+ name: "test-actor".to_string(),
82
+ key: None,
83
+ input: Some(input_data.clone()),
84
+ runner_name_selector: envoy.pool_name().to_string(),
85
+ crash_policy: rivet_types::actors::CrashPolicy::Destroy,
86
+ },
87
+ )
88
+ .await
89
+ .expect("failed to create actor");
90
+
91
+ let actor_id = res.actor.actor_id.to_string();
92
+
93
+ // Poll for actor to become connectable
94
+ // If input verification fails, the actor will crash and never become connectable
95
+ let actor = loop {
96
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
97
+ .await
98
+ .expect("failed to get actor")
99
+ .expect("actor should exist");
100
+
101
+ // Check if actor crashed (input verification failed)
102
+ if actor.destroy_ts.is_some() {
103
+ panic!(
104
+ "actor crashed during input verification (input data was not received correctly)"
105
+ );
106
+ }
107
+
108
+ // Check if actor is connectable (input verification succeeded)
109
+ if actor.connectable_ts.is_some() {
110
+ break actor;
111
+ }
112
+
113
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
114
+ };
115
+
116
+ assert!(
117
+ actor.connectable_ts.is_some(),
118
+ "actor should be connectable after successful input verification"
119
+ );
120
+
121
+ tracing::info!(
122
+ ?actor_id,
123
+ input_size = input_data.len(),
124
+ "actor successfully verified input data"
125
+ );
126
+ });
127
+ }
128
+
129
+ #[test]
130
+ fn envoy_actor_start_timeout() {
131
+ // This test takes 35+ seconds
132
+ common::run(
133
+ common::TestOpts::new(1).with_timeout(45),
134
+ |ctx| async move {
135
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
136
+
137
+ // Create envoy client with timeout actor behavior
138
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
139
+ builder.with_actor_behavior("timeout-actor", move |_| {
140
+ Box::new(common::test_envoy::TimeoutActor::new())
141
+ })
142
+ })
143
+ .await;
144
+
145
+ tracing::info!("envoy client ready, creating actor that will timeout");
146
+
147
+ // Create actor with destroy crash policy
148
+ let res = common::create_actor(
149
+ ctx.leader_dc().guard_port(),
150
+ &namespace,
151
+ "timeout-actor",
152
+ envoy.pool_name(),
153
+ rivet_types::actors::CrashPolicy::Destroy,
154
+ )
155
+ .await;
156
+
157
+ let actor_id_str = res.actor.actor_id.to_string();
158
+
159
+ tracing::info!(?actor_id_str, "actor created, waiting for timeout");
160
+
161
+ // Wait for the actor start timeout threshold (30s + buffer)
162
+ tokio::time::sleep(tokio::time::Duration::from_secs(35)).await;
163
+
164
+ // Verify actor was marked as destroyed due to timeout
165
+ let actor =
166
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
167
+ .await
168
+ .expect("failed to get actor")
169
+ .expect("actor should exist");
170
+
171
+ assert!(
172
+ actor.destroy_ts.is_some(),
173
+ "actor should be destroyed after start timeout"
174
+ );
175
+
176
+ tracing::info!(?actor_id_str, "actor correctly destroyed after timeout");
177
+ },
178
+ );
179
+ }
180
+
181
+ // MARK: Running State Management
182
+ #[test]
183
+ fn envoy_actor_starts_and_connectable_via_guard_http() {
184
+ common::run(common::TestOpts::new(1), |ctx| async move {
185
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
186
+
187
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
188
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
189
+
190
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
191
+ builder.with_actor_behavior("test-actor", move |_| {
192
+ Box::new(common::test_envoy::NotifyOnStartActor::new(
193
+ start_tx.clone(),
194
+ ))
195
+ })
196
+ })
197
+ .await;
198
+
199
+ let res = common::create_actor(
200
+ ctx.leader_dc().guard_port(),
201
+ &namespace,
202
+ "test-actor",
203
+ envoy.pool_name(),
204
+ rivet_types::actors::CrashPolicy::Destroy,
205
+ )
206
+ .await;
207
+
208
+ let actor_id = res.actor.actor_id.to_string();
209
+
210
+ // Wait for actor to start
211
+ start_rx
212
+ .await
213
+ .expect("actor should have sent start notification");
214
+
215
+ // Poll for connectable_ts to be set
216
+ let actor = loop {
217
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
218
+ .await
219
+ .expect("failed to get actor")
220
+ .expect("actor should exist");
221
+
222
+ if actor.connectable_ts.is_some() {
223
+ break actor;
224
+ }
225
+
226
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
227
+ };
228
+
229
+ assert!(
230
+ actor.connectable_ts.is_some(),
231
+ "actor should be connectable"
232
+ );
233
+
234
+ // TODO: HTTP ping test via guard needs to be implemented: the Rust envoy client atm
235
+ // doesn't implement HTTP tunneling yet. The original test with TypeScript
236
+ // envoy included: common::ping_actor_via_guard(ctx.leader_dc(), &actor_id).await;
237
+
238
+ tracing::info!(?actor_id, "actor is connectable (state verified)");
239
+ });
240
+ }
241
+
242
+ #[test]
243
+ fn envoy_actor_connectable_via_guard_websocket() {
244
+ common::run(common::TestOpts::new(1), |ctx| async move {
245
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
246
+
247
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
248
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
249
+
250
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
251
+ builder.with_actor_behavior("test-actor", move |_| {
252
+ Box::new(common::test_envoy::NotifyOnStartActor::new(
253
+ start_tx.clone(),
254
+ ))
255
+ })
256
+ })
257
+ .await;
258
+
259
+ let res = common::create_actor(
260
+ ctx.leader_dc().guard_port(),
261
+ &namespace,
262
+ "test-actor",
263
+ envoy.pool_name(),
264
+ rivet_types::actors::CrashPolicy::Destroy,
265
+ )
266
+ .await;
267
+
268
+ let actor_id = res.actor.actor_id.to_string();
269
+
270
+ // Wait for actor to start
271
+ start_rx
272
+ .await
273
+ .expect("actor should have sent start notification");
274
+
275
+ // Poll for connectable_ts to be set
276
+ let actor = loop {
277
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
278
+ .await
279
+ .expect("failed to get actor")
280
+ .expect("actor should exist");
281
+
282
+ if actor.connectable_ts.is_some() {
283
+ break actor;
284
+ }
285
+
286
+ tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
287
+ };
288
+
289
+ assert!(
290
+ actor.connectable_ts.is_some(),
291
+ "actor should be connectable"
292
+ );
293
+
294
+ // Note: WebSocket ping test via guard is skipped because the Rust envoy client
295
+ // doesn't implement HTTP tunneling yet. The original test with TypeScript
296
+ // envoy included: common::ping_actor_websocket_via_guard(ctx.leader_dc(), &actor_id).await;
297
+
298
+ tracing::info!(?actor_id, "actor is connectable (state verified)");
299
+ });
300
+ }
301
+
302
+ // MARK: Stopping and Graceful Shutdown
303
+ #[test]
304
+ fn envoy_actor_graceful_stop_with_destroy_policy() {
305
+ common::run(common::TestOpts::new(1), |ctx| async move {
306
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
307
+
308
+ // Create envoy client with stop immediately actor
309
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
310
+ builder.with_actor_behavior("stop-actor", move |_| {
311
+ Box::new(common::test_envoy::StopImmediatelyActor::new())
312
+ })
313
+ })
314
+ .await;
315
+
316
+ tracing::info!("envoy client ready, creating actor that will stop gracefully");
317
+
318
+ // Create actor with destroy crash policy
319
+ let res = common::create_actor(
320
+ ctx.leader_dc().guard_port(),
321
+ &namespace,
322
+ "stop-actor",
323
+ envoy.pool_name(),
324
+ rivet_types::actors::CrashPolicy::Destroy,
325
+ )
326
+ .await;
327
+
328
+ let actor_id_str = res.actor.actor_id.to_string();
329
+
330
+ tracing::info!(?actor_id_str, "actor created, will send stop intent");
331
+
332
+ // Poll for actor to be destroyed after graceful stop
333
+ let actor = loop {
334
+ let actor =
335
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
336
+ .await
337
+ .expect("failed to get actor")
338
+ .expect("actor should exist");
339
+
340
+ if actor.destroy_ts.is_some() {
341
+ break actor;
342
+ }
343
+
344
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
345
+ };
346
+
347
+ assert!(
348
+ actor.destroy_ts.is_some(),
349
+ "actor should be destroyed after graceful stop with destroy policy"
350
+ );
351
+
352
+ // Verify envoy slot freed (actor no longer on envoy)
353
+ assert!(
354
+ !envoy.has_actor(&actor_id_str).await,
355
+ "actor should be removed from envoy after destroy"
356
+ );
357
+
358
+ tracing::info!(?actor_id_str, "actor gracefully stopped and destroyed");
359
+ });
360
+ }
361
+
362
+ #[test]
363
+ fn envoy_actor_explicit_destroy() {
364
+ common::run(common::TestOpts::new(1), |ctx| async move {
365
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
366
+
367
+ // Create a channel to be notified when the actor starts
368
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
369
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
370
+
371
+ // Build a custom envoy with NotifyOnStartActor
372
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
373
+ builder.with_actor_behavior("test-actor", move |_| {
374
+ Box::new(common::test_envoy::NotifyOnStartActor::new(
375
+ start_tx.clone(),
376
+ ))
377
+ })
378
+ })
379
+ .await;
380
+
381
+ let res = common::create_actor(
382
+ ctx.leader_dc().guard_port(),
383
+ &namespace,
384
+ "test-actor",
385
+ envoy.pool_name(),
386
+ rivet_types::actors::CrashPolicy::Destroy,
387
+ )
388
+ .await;
389
+
390
+ let actor_id = res.actor.actor_id.to_string();
391
+
392
+ start_rx
393
+ .await
394
+ .expect("actor should have sent start notification");
395
+
396
+ // Verify actor is running
397
+ assert!(envoy.has_actor(&actor_id).await, "envoy should have actor");
398
+
399
+ // Delete the actor
400
+ common::api::public::actors_delete(
401
+ ctx.leader_dc().guard_port(),
402
+ common::api_types::actors::delete::DeletePath {
403
+ actor_id: actor_id.parse().expect("failed to parse actor_id"),
404
+ },
405
+ common::api_types::actors::delete::DeleteQuery {
406
+ namespace: namespace.clone(),
407
+ },
408
+ )
409
+ .await
410
+ .expect("failed to delete actor");
411
+
412
+ // Poll for actor to be destroyed or timeout after 5s
413
+ let start = std::time::Instant::now();
414
+ let actor = loop {
415
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
416
+ .await
417
+ .expect("failed to get actor")
418
+ .expect("actor should still exist in database");
419
+
420
+ if actor.destroy_ts.is_some() {
421
+ break actor;
422
+ }
423
+
424
+ if start.elapsed() > std::time::Duration::from_secs(5) {
425
+ panic!("actor deletion timed out after 5 seconds");
426
+ }
427
+
428
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
429
+ };
430
+
431
+ assert!(
432
+ actor.destroy_ts.is_some(),
433
+ "destroy_ts should be set after deletion"
434
+ );
435
+
436
+ tracing::info!(?actor_id, "actor successfully destroyed");
437
+ });
438
+ }
439
+
440
+ // MARK: 5. Crash Handling and Policies
441
+ #[test]
442
+ fn envoy_crash_policy_restart() {
443
+ common::run(common::TestOpts::new(1), |ctx| async move {
444
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
445
+
446
+ // Create channel to be notified when actor crashes
447
+ let (crash_tx, crash_rx) = tokio::sync::oneshot::channel();
448
+ let crash_tx = Arc::new(Mutex::new(Some(crash_tx)));
449
+
450
+ // Create envoy client with crashing actor
451
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
452
+ builder.with_actor_behavior("crash-actor", move |_| {
453
+ Box::new(common::test_envoy::CrashOnStartActor::new_with_notify(
454
+ 1,
455
+ crash_tx.clone(),
456
+ ))
457
+ })
458
+ })
459
+ .await;
460
+
461
+ tracing::info!("envoy client ready, creating actor with restart policy");
462
+
463
+ // Create actor with restart crash policy
464
+ let res = common::create_actor(
465
+ ctx.leader_dc().guard_port(),
466
+ &namespace,
467
+ "crash-actor",
468
+ envoy.pool_name(),
469
+ rivet_types::actors::CrashPolicy::Restart,
470
+ )
471
+ .await;
472
+
473
+ let actor_id_str = res.actor.actor_id.to_string();
474
+
475
+ tracing::info!(?actor_id_str, "actor created, will crash on start");
476
+
477
+ // Wait for crash notification
478
+ crash_rx
479
+ .await
480
+ .expect("actor should have sent crash notification");
481
+
482
+ // Poll for reschedule_ts to be set (system needs to process the crash)
483
+ let actor = loop {
484
+ let actor =
485
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
486
+ .await
487
+ .expect("failed to get actor")
488
+ .expect("actor should exist");
489
+
490
+ if actor.reschedule_ts.is_some() {
491
+ break actor;
492
+ }
493
+
494
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
495
+ };
496
+
497
+ assert!(
498
+ actor.reschedule_ts.is_some(),
499
+ "actor should have reschedule_ts after crash with restart policy"
500
+ );
501
+
502
+ tracing::info!(?actor_id_str, reschedule_ts = ?actor.reschedule_ts, "actor scheduled for restart");
503
+ });
504
+ }
505
+
506
+ #[test]
507
+ fn envoy_crash_policy_restart_resets_on_success() {
508
+ common::run(common::TestOpts::new(1), |ctx| async move {
509
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
510
+
511
+ let crash_count = Arc::new(Mutex::new(0));
512
+
513
+ // Create envoy client with actor that crashes 2 times then succeeds
514
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
515
+ builder.with_actor_behavior("crash-recover-actor", move |_| {
516
+ Box::new(common::test_envoy::CrashNTimesThenSucceedActor::new(
517
+ 2,
518
+ crash_count.clone(),
519
+ ))
520
+ })
521
+ })
522
+ .await;
523
+
524
+ tracing::info!("envoy client ready, creating actor with restart policy");
525
+
526
+ // Create actor with restart crash policy
527
+ let res = common::create_actor(
528
+ ctx.leader_dc().guard_port(),
529
+ &namespace,
530
+ "crash-recover-actor",
531
+ envoy.pool_name(),
532
+ rivet_types::actors::CrashPolicy::Restart,
533
+ )
534
+ .await;
535
+
536
+ let actor_id_str = res.actor.actor_id.to_string();
537
+
538
+ tracing::info!(
539
+ ?actor_id_str,
540
+ "actor created, will crash twice then succeed"
541
+ );
542
+
543
+ // Poll for actor to eventually become connectable after crashes and restarts
544
+ // The actor should crash twice, reschedule, and eventually run successfully
545
+ let actor = loop {
546
+ let actor =
547
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
548
+ .await
549
+ .expect("failed to get actor")
550
+ .expect("actor should exist");
551
+
552
+ // Actor successfully running after retries
553
+ if actor.connectable_ts.is_some() {
554
+ break actor;
555
+ }
556
+
557
+ tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
558
+ };
559
+
560
+ assert!(
561
+ actor.connectable_ts.is_some(),
562
+ "actor should eventually become connectable after crashes"
563
+ );
564
+ // actor.reschedule_ts is always Some(), not sure if this is intended
565
+ assert!(
566
+ actor.reschedule_ts.is_none()
567
+ || (actor.connectable_ts.unwrap() > actor.reschedule_ts.unwrap()),
568
+ "actor should not be scheduled for retry when running successfully"
569
+ );
570
+
571
+ tracing::info!(?actor_id_str, "actor successfully recovered after crashes");
572
+ });
573
+ }
574
+
575
+ #[test]
576
+ fn envoy_crash_policy_sleep() {
577
+ common::run(common::TestOpts::new(1), |ctx| async move {
578
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
579
+
580
+ // Create channel to be notified when actor crashes
581
+ let (crash_tx, crash_rx) = tokio::sync::oneshot::channel();
582
+ let crash_tx = Arc::new(Mutex::new(Some(crash_tx)));
583
+
584
+ // Create envoy client with crashing actor
585
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
586
+ builder.with_actor_behavior("crash-actor", move |_| {
587
+ Box::new(common::test_envoy::CrashOnStartActor::new_with_notify(
588
+ 1,
589
+ crash_tx.clone(),
590
+ ))
591
+ })
592
+ })
593
+ .await;
594
+
595
+ tracing::info!("envoy client ready, creating actor with sleep policy");
596
+
597
+ // Create actor with sleep crash policy
598
+ let res = common::create_actor(
599
+ ctx.leader_dc().guard_port(),
600
+ &namespace,
601
+ "crash-actor",
602
+ envoy.pool_name(),
603
+ rivet_types::actors::CrashPolicy::Sleep,
604
+ )
605
+ .await;
606
+
607
+ let actor_id_str = res.actor.actor_id.to_string();
608
+
609
+ tracing::info!(?actor_id_str, "actor created with sleep policy");
610
+
611
+ // Wait for crash notification
612
+ crash_rx
613
+ .await
614
+ .expect("actor should have sent crash notification");
615
+
616
+ // Poll for sleep_ts to be set (system needs to process the crash)
617
+ let actor = loop {
618
+ let actor =
619
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
620
+ .await
621
+ .expect("failed to get actor")
622
+ .expect("actor should exist");
623
+
624
+ if actor.sleep_ts.is_some() {
625
+ break actor;
626
+ }
627
+
628
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
629
+ };
630
+
631
+ assert!(
632
+ actor.sleep_ts.is_some(),
633
+ "actor should be sleeping after crash with sleep policy"
634
+ );
635
+ assert!(
636
+ actor.connectable_ts.is_none(),
637
+ "actor should not be connectable while sleeping"
638
+ );
639
+
640
+ tracing::info!(
641
+ ?actor_id_str,
642
+ "actor correctly entered sleep state after crash"
643
+ );
644
+ });
645
+ }
646
+
647
+ #[test]
648
+ fn envoy_crash_policy_destroy() {
649
+ common::run(common::TestOpts::new(1), |ctx| async move {
650
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
651
+
652
+ // Create channel to be notified when actor crashes
653
+ let (crash_tx, crash_rx) = tokio::sync::oneshot::channel();
654
+ let crash_tx = Arc::new(Mutex::new(Some(crash_tx)));
655
+
656
+ // Create envoy client with crashing actor
657
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
658
+ builder.with_actor_behavior("crash-actor", move |_| {
659
+ Box::new(common::test_envoy::CrashOnStartActor::new_with_notify(
660
+ 1,
661
+ crash_tx.clone(),
662
+ ))
663
+ })
664
+ })
665
+ .await;
666
+
667
+ tracing::info!("envoy client ready, creating actor with destroy policy");
668
+
669
+ // Create actor with destroy crash policy
670
+ let res = common::create_actor(
671
+ ctx.leader_dc().guard_port(),
672
+ &namespace,
673
+ "crash-actor",
674
+ envoy.pool_name(),
675
+ rivet_types::actors::CrashPolicy::Destroy,
676
+ )
677
+ .await;
678
+
679
+ let actor_id_str = res.actor.actor_id.to_string();
680
+
681
+ tracing::info!(?actor_id_str, "actor created with destroy policy");
682
+
683
+ // Wait for crash notification
684
+ crash_rx
685
+ .await
686
+ .expect("actor should have sent crash notification");
687
+
688
+ // Poll for destroy_ts to be set (system needs to process the crash)
689
+ let actor = loop {
690
+ let actor =
691
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
692
+ .await
693
+ .expect("failed to get actor")
694
+ .expect("actor should exist");
695
+
696
+ if actor.destroy_ts.is_some() {
697
+ break actor;
698
+ }
699
+
700
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
701
+ };
702
+
703
+ assert!(
704
+ actor.destroy_ts.is_some(),
705
+ "actor should be destroyed after crash with destroy policy"
706
+ );
707
+
708
+ tracing::info!(?actor_id_str, "actor correctly destroyed after crash");
709
+ });
710
+ }
711
+
712
+ // MARK: 6. Sleep and Wake
713
+ #[test]
714
+ fn envoy_actor_sleep_intent() {
715
+ common::run(common::TestOpts::new(1), |ctx| async move {
716
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
717
+
718
+ // Create channel to be notified when actor sends sleep intent
719
+ let (sleep_tx, sleep_rx) = tokio::sync::oneshot::channel();
720
+ let sleep_tx = Arc::new(Mutex::new(Some(sleep_tx)));
721
+
722
+ // Create envoy client with sleep actor behavior
723
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
724
+ builder.with_actor_behavior("sleep-actor", move |_| {
725
+ Box::new(common::test_envoy::SleepImmediatelyActor::new_with_notify(
726
+ sleep_tx.clone(),
727
+ ))
728
+ })
729
+ })
730
+ .await;
731
+
732
+ tracing::info!("envoy client ready, creating actor that will sleep");
733
+
734
+ // Create actor
735
+ let res = common::create_actor(
736
+ ctx.leader_dc().guard_port(),
737
+ &namespace,
738
+ "sleep-actor",
739
+ envoy.pool_name(),
740
+ rivet_types::actors::CrashPolicy::Destroy,
741
+ )
742
+ .await;
743
+
744
+ let actor_id_str = res.actor.actor_id.to_string();
745
+
746
+ tracing::info!(?actor_id_str, "actor created, will send sleep intent");
747
+
748
+ // Wait for sleep intent notification
749
+ sleep_rx
750
+ .await
751
+ .expect("actor should have sent sleep intent notification");
752
+
753
+ // Poll for sleep_ts to be set (system needs to process the sleep intent)
754
+ let actor = loop {
755
+ let actor =
756
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
757
+ .await
758
+ .expect("failed to get actor")
759
+ .expect("actor should exist");
760
+
761
+ if actor.sleep_ts.is_some() {
762
+ break actor;
763
+ }
764
+
765
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
766
+ };
767
+
768
+ assert!(
769
+ actor.sleep_ts.is_some(),
770
+ "actor should have sleep_ts after sending sleep intent"
771
+ );
772
+ assert!(
773
+ actor.connectable_ts.is_none(),
774
+ "actor should not be connectable while sleeping"
775
+ );
776
+
777
+ tracing::info!(?actor_id_str, "actor correctly entered sleep state");
778
+ });
779
+ }
780
+
781
+ // MARK: Pending Allocation Queue
782
+ #[test]
783
+ fn envoy_actor_pending_allocation_no_envoys() {
784
+ common::run(common::TestOpts::new(1), |ctx| async move {
785
+ // Create namespace and start a envoy with 1 slot
786
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
787
+
788
+ let envoy_full = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
789
+ builder
790
+ .with_actor_behavior("filler-actor", |_| {
791
+ Box::new(common::test_envoy::EchoActor::new())
792
+ })
793
+ .with_actor_behavior("test-actor", |_| {
794
+ Box::new(common::test_envoy::EchoActor::new())
795
+ })
796
+ })
797
+ .await;
798
+
799
+ tracing::info!("envoy with 1 slot started");
800
+
801
+ // Fill the slot with a filler actor
802
+ let filler_res = common::create_actor(
803
+ ctx.leader_dc().guard_port(),
804
+ &namespace,
805
+ "filler-actor",
806
+ envoy_full.pool_name(),
807
+ rivet_types::actors::CrashPolicy::Destroy,
808
+ )
809
+ .await;
810
+
811
+ let filler_actor_id = filler_res.actor.actor_id.to_string();
812
+
813
+ // Wait for filler actor to be allocated
814
+ loop {
815
+ if envoy_full.has_actor(&filler_actor_id).await {
816
+ break;
817
+ }
818
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
819
+ }
820
+
821
+ tracing::info!(
822
+ ?filler_actor_id,
823
+ "filler actor allocated, envoy is now full"
824
+ );
825
+
826
+ // Create test actor (should be pending because envoy is full)
827
+ let res = common::create_actor(
828
+ ctx.leader_dc().guard_port(),
829
+ &namespace,
830
+ "test-actor",
831
+ envoy_full.pool_name(),
832
+ rivet_types::actors::CrashPolicy::Destroy,
833
+ )
834
+ .await;
835
+
836
+ let actor_id = res.actor.actor_id.to_string();
837
+
838
+ // Verify actor is in pending state
839
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
840
+ .await
841
+ .expect("failed to get actor")
842
+ .expect("actor should exist");
843
+
844
+ assert!(
845
+ actor.pending_allocation_ts.is_some(),
846
+ "pending_allocation_ts should be set when no envoys available"
847
+ );
848
+ assert!(
849
+ actor.connectable_ts.is_none(),
850
+ "actor should not be connectable yet"
851
+ );
852
+
853
+ tracing::info!(?actor_id, "actor is pending allocation");
854
+
855
+ // Now start a envoy with available slots
856
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
857
+ builder.with_actor_behavior("test-actor", |_| {
858
+ Box::new(common::test_envoy::EchoActor::new())
859
+ })
860
+ })
861
+ .await;
862
+
863
+ tracing::info!("envoy with 20 slots started");
864
+
865
+ // Poll for allocation
866
+ loop {
867
+ if envoy.has_actor(&actor_id).await {
868
+ break;
869
+ }
870
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
871
+ }
872
+
873
+ // Verify actor is now allocated
874
+ assert!(
875
+ envoy.has_actor(&actor_id).await,
876
+ "actor should now be allocated to envoy"
877
+ );
878
+
879
+ tracing::info!(
880
+ ?actor_id,
881
+ "actor successfully allocated after envoy with slots started"
882
+ );
883
+ });
884
+ }
885
+
886
+ #[test]
887
+ fn envoy_pending_allocation_queue_ordering() {
888
+ common::run(common::TestOpts::new(1), |ctx| async move {
889
+ // Create namespace and start envoy with only 2 slots
890
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
891
+
892
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
893
+ builder
894
+ .with_actor_behavior("test-actor-0", |_| {
895
+ Box::new(common::test_envoy::EchoActor::new())
896
+ })
897
+ .with_actor_behavior("test-actor-1", |_| {
898
+ Box::new(common::test_envoy::EchoActor::new())
899
+ })
900
+ .with_actor_behavior("test-actor-2", |_| {
901
+ Box::new(common::test_envoy::EchoActor::new())
902
+ })
903
+ })
904
+ .await;
905
+
906
+ tracing::info!("envoy with 2 slots started");
907
+
908
+ // Create 3 actors in sequence
909
+ // First 2 should be allocated immediately, 3rd should be pending
910
+ let mut actor_ids = Vec::new();
911
+ for i in 0..3 {
912
+ let name = format!("test-actor-{}", i);
913
+ let res = common::create_actor(
914
+ ctx.leader_dc().guard_port(),
915
+ &namespace,
916
+ &name,
917
+ envoy.pool_name(),
918
+ rivet_types::actors::CrashPolicy::Destroy,
919
+ )
920
+ .await;
921
+
922
+ actor_ids.push(res.actor.actor_id.to_string());
923
+
924
+ // Small delay to ensure ordering
925
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
926
+ }
927
+
928
+ // Poll for first 2 actors to be allocated
929
+ loop {
930
+ let has_0 = envoy.has_actor(&actor_ids[0]).await;
931
+ let has_1 = envoy.has_actor(&actor_ids[1]).await;
932
+
933
+ if has_0 && has_1 {
934
+ break;
935
+ }
936
+
937
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
938
+ }
939
+
940
+ // Verify first 2 actors are allocated (FIFO)
941
+ assert!(
942
+ envoy.has_actor(&actor_ids[0]).await,
943
+ "first actor should be allocated"
944
+ );
945
+ assert!(
946
+ envoy.has_actor(&actor_ids[1]).await,
947
+ "second actor should be allocated"
948
+ );
949
+
950
+ // Third actor should still be pending
951
+ let actor_c =
952
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_ids[2], &namespace)
953
+ .await
954
+ .expect("failed to get actor")
955
+ .expect("actor should exist");
956
+
957
+ assert!(
958
+ actor_c.pending_allocation_ts.is_some(),
959
+ "third actor should still be pending"
960
+ );
961
+
962
+ tracing::info!("FIFO allocation ordering verified");
963
+ });
964
+ }
965
+
966
+ // MARK: envoy Failures
967
+ #[test]
968
+ fn envoy_actor_survives_envoy_disconnect() {
969
+ common::run(
970
+ common::TestOpts::new(1).with_timeout(60),
971
+ |ctx| async move {
972
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
973
+
974
+ // Create envoy and start actor
975
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
976
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
977
+
978
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
979
+ builder.with_actor_behavior("test-actor", move |_| {
980
+ Box::new(common::test_envoy::NotifyOnStartActor::new(
981
+ start_tx.clone(),
982
+ ))
983
+ })
984
+ })
985
+ .await;
986
+
987
+ let res = common::create_actor(
988
+ ctx.leader_dc().guard_port(),
989
+ &namespace,
990
+ "test-actor",
991
+ envoy.pool_name(),
992
+ rivet_types::actors::CrashPolicy::Restart,
993
+ )
994
+ .await;
995
+
996
+ let actor_id_str = res.actor.actor_id.to_string();
997
+
998
+ // Wait for actor to start
999
+ start_rx
1000
+ .await
1001
+ .expect("actor should have sent start notification");
1002
+
1003
+ tracing::info!(?actor_id_str, "actor started, simulating envoy disconnect");
1004
+
1005
+ // Simulate envoy disconnect by shutting down
1006
+ envoy.shutdown().await;
1007
+
1008
+ tracing::info!(
1009
+ "envoy disconnected, waiting for system to detect and apply crash policy"
1010
+ );
1011
+
1012
+ // Now we wait for envoy_lost_threshold so that actor state updates
1013
+ tokio::time::sleep(tokio::time::Duration::from_millis(
1014
+ ctx.leader_dc()
1015
+ .config
1016
+ .pegboard()
1017
+ .envoy_lost_threshold()
1018
+ .try_into()
1019
+ .unwrap(),
1020
+ ))
1021
+ .await;
1022
+
1023
+ // Poll for actor to be rescheduled (crash policy is Restart)
1024
+ // The system should detect envoy loss and apply the crash policy
1025
+ let start = std::time::Instant::now();
1026
+ let actor = loop {
1027
+ let actor =
1028
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
1029
+ .await
1030
+ .expect("failed to get actor")
1031
+ .expect("actor should exist");
1032
+ tracing::warn!(?actor);
1033
+ // Actor should be waiting for an allocation after envoy loss
1034
+ if actor.pending_allocation_ts.is_some() {
1035
+ break actor;
1036
+ }
1037
+
1038
+ if start.elapsed() > std::time::Duration::from_secs(50) {
1039
+ // TODO: Always times out here
1040
+ tracing::info!(?actor);
1041
+ break actor;
1042
+ }
1043
+
1044
+ tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
1045
+ };
1046
+
1047
+ assert!(
1048
+ actor.pending_allocation_ts.is_some(),
1049
+ "actor should be pending allocation after envoy disconnected and threshold hit with restart policy"
1050
+ );
1051
+ assert!(
1052
+ actor.connectable_ts.is_none(),
1053
+ "actor should not be connectable after envoy disconnect"
1054
+ );
1055
+ },
1056
+ );
1057
+ }
1058
+
1059
+ // MARK: Resource Limits
1060
+ #[test]
1061
+ #[ignore]
1062
+ fn envoy_at_max_capacity() {
1063
+ common::run(
1064
+ common::TestOpts::new(1).with_timeout(30),
1065
+ |ctx| async move {
1066
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1067
+
1068
+ // Start envoy with only 2 slots
1069
+
1070
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
1071
+ builder.with_actor_behavior("test-actor", move |_| {
1072
+ Box::new(common::test_envoy::EchoActor::new())
1073
+ })
1074
+ })
1075
+ .await;
1076
+
1077
+ // Create first two actors to fill capacity
1078
+ let mut actor_ids = Vec::new();
1079
+ for _i in 0..2 {
1080
+ let res = common::create_actor(
1081
+ ctx.leader_dc().guard_port(),
1082
+ &namespace,
1083
+ "test-actor",
1084
+ envoy.pool_name(),
1085
+ rivet_types::actors::CrashPolicy::Destroy,
1086
+ )
1087
+ .await;
1088
+
1089
+ actor_ids.push(res.actor.actor_id.to_string());
1090
+ }
1091
+
1092
+ // Poll for both actors to be allocated
1093
+ loop {
1094
+ let has_0 = envoy.has_actor(&actor_ids[0]).await;
1095
+ let has_1 = envoy.has_actor(&actor_ids[1]).await;
1096
+
1097
+ if has_0 && has_1 {
1098
+ break;
1099
+ }
1100
+
1101
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
1102
+ }
1103
+
1104
+ // Verify both actors are allocated
1105
+ assert!(envoy.has_actor(&actor_ids[0]).await);
1106
+ assert!(envoy.has_actor(&actor_ids[1]).await);
1107
+
1108
+ // Create third actor (should be pending)
1109
+ let res3 = common::create_actor(
1110
+ ctx.leader_dc().guard_port(),
1111
+ &namespace,
1112
+ "test-actor",
1113
+ envoy.pool_name(),
1114
+ rivet_types::actors::CrashPolicy::Destroy,
1115
+ )
1116
+ .await;
1117
+
1118
+ let actor_id3 = res3.actor.actor_id.to_string();
1119
+
1120
+ // Verify third actor is pending
1121
+ let actor3 =
1122
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id3, &namespace)
1123
+ .await
1124
+ .expect("failed to get actor")
1125
+ .expect("actor should exist");
1126
+
1127
+ assert!(
1128
+ actor3.pending_allocation_ts.is_some(),
1129
+ "third actor should be pending when envoy at capacity"
1130
+ );
1131
+
1132
+ // Destroy first actor to free a slot
1133
+ common::api::public::actors_delete(
1134
+ ctx.leader_dc().guard_port(),
1135
+ common::api_types::actors::delete::DeletePath {
1136
+ actor_id: actor_ids[0].parse().unwrap(),
1137
+ },
1138
+ common::api_types::actors::delete::DeleteQuery {
1139
+ namespace: namespace.clone(),
1140
+ },
1141
+ )
1142
+ .await
1143
+ .expect("failed to delete actor");
1144
+
1145
+ // Poll for third actor to be allocated (wait for slot to free and pending actor to be allocated)
1146
+ loop {
1147
+ tracing::warn!(
1148
+ "polling envoy: current actors: {:?}",
1149
+ envoy.get_actor_ids().await
1150
+ );
1151
+ if envoy.has_actor(&actor_id3).await {
1152
+ break;
1153
+ }
1154
+ tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
1155
+ }
1156
+
1157
+ // Verify third actor is now allocated
1158
+ assert!(
1159
+ envoy.has_actor(&actor_id3).await,
1160
+ "pending actor should be allocated after slot freed"
1161
+ );
1162
+ },
1163
+ );
1164
+ }
1165
+
1166
+ // MARK: Timeout and Retry Scenarios
1167
+ #[test]
1168
+ fn envoy_exponential_backoff_max_retries() {
1169
+ common::run(common::TestOpts::new(1), |ctx| async move {
1170
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1171
+
1172
+ // Create envoy client with always-crashing actor
1173
+
1174
+ let envoy = common::setup_envoy(ctx.leader_dc(), &namespace, |builder| {
1175
+ builder.with_actor_behavior("crash-always-actor", move |_| {
1176
+ Box::new(common::test_envoy::CrashOnStartActor::new(1))
1177
+ })
1178
+ })
1179
+ .await;
1180
+
1181
+ tracing::info!("envoy client ready, creating actor that will always crash");
1182
+
1183
+ // Create actor with restart crash policy
1184
+ let res = common::create_actor(
1185
+ ctx.leader_dc().guard_port(),
1186
+ &namespace,
1187
+ "crash-always-actor",
1188
+ envoy.pool_name(),
1189
+ rivet_types::actors::CrashPolicy::Restart,
1190
+ )
1191
+ .await;
1192
+
1193
+ let actor_id_str = res.actor.actor_id.to_string();
1194
+
1195
+ tracing::info!(?actor_id_str, "actor created, will crash repeatedly");
1196
+
1197
+ // Track reschedule timestamps to verify backoff increases
1198
+ let mut previous_reschedule_ts: Option<i64> = None;
1199
+ let mut backoff_deltas = Vec::new();
1200
+
1201
+ // Poll for multiple crashes and verify backoff increases
1202
+ for iteration in 0..5 {
1203
+ let actor = loop {
1204
+ let actor =
1205
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
1206
+ .await
1207
+ .expect("failed to get actor")
1208
+ .expect("actor should exist");
1209
+
1210
+ if actor.reschedule_ts.is_some() {
1211
+ break actor;
1212
+ }
1213
+
1214
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
1215
+ };
1216
+
1217
+ let current_reschedule_ts = actor.reschedule_ts.expect("reschedule_ts should be set");
1218
+
1219
+ tracing::info!(
1220
+ iteration,
1221
+ reschedule_ts = current_reschedule_ts,
1222
+ "actor has reschedule_ts after crash"
1223
+ );
1224
+
1225
+ // Calculate backoff delta if we have a previous timestamp
1226
+ if let Some(prev_ts) = previous_reschedule_ts {
1227
+ let delta = current_reschedule_ts - prev_ts;
1228
+ backoff_deltas.push(delta);
1229
+ tracing::info!(
1230
+ iteration,
1231
+ delta_ms = delta,
1232
+ "backoff delta from previous reschedule"
1233
+ );
1234
+ }
1235
+
1236
+ previous_reschedule_ts = Some(current_reschedule_ts);
1237
+
1238
+ // Wait for the reschedule time to pass so next crash can happen
1239
+ let now = rivet_util::timestamp::now();
1240
+ if current_reschedule_ts > now {
1241
+ let wait_duration = (current_reschedule_ts - now) as u64;
1242
+ tracing::info!(
1243
+ wait_duration_ms = wait_duration,
1244
+ "waiting for reschedule time"
1245
+ );
1246
+ tokio::time::sleep(tokio::time::Duration::from_millis(wait_duration + 100)).await;
1247
+ }
1248
+ }
1249
+
1250
+ // Verify that backoff intervals generally increase (exponential backoff)
1251
+ // We expect each delta to be larger than or equal to the previous
1252
+ // (allowing some tolerance for system timing)
1253
+ for i in 1..backoff_deltas.len() {
1254
+ tracing::info!(
1255
+ iteration = i,
1256
+ current_delta = backoff_deltas[i],
1257
+ previous_delta = backoff_deltas[i - 1],
1258
+ "comparing backoff deltas"
1259
+ );
1260
+
1261
+ // Allow some tolerance: current should be >= 80% of expected growth
1262
+ // (exponential backoff typically doubles, but we allow for some variance)
1263
+ assert!(
1264
+ backoff_deltas[i] >= backoff_deltas[i - 1] / 2,
1265
+ "backoff should not decrease significantly: iteration {}, prev={}, curr={}",
1266
+ i,
1267
+ backoff_deltas[i - 1],
1268
+ backoff_deltas[i]
1269
+ );
1270
+ }
1271
+
1272
+ tracing::info!(
1273
+ ?backoff_deltas,
1274
+ "exponential backoff verified across multiple crashes"
1275
+ );
1276
+ });
1277
+ }