@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,1005 @@
1
+ use super::super::common;
2
+
3
+ use serde_json::json;
4
+ use std::net::SocketAddr;
5
+ use std::sync::Arc;
6
+ use std::sync::atomic::{AtomicU32, Ordering};
7
+ use std::time::Duration;
8
+
9
+ async fn start_mock_serverless(status_code: u16) -> (SocketAddr, tokio::task::JoinHandle<()>) {
10
+ use axum::{Router, routing::any};
11
+
12
+ let router = Router::new().fallback(any(move || async move {
13
+ (
14
+ axum::http::StatusCode::from_u16(status_code).unwrap(),
15
+ format!("mock error response with status {}", status_code),
16
+ )
17
+ }));
18
+
19
+ let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
20
+ let addr = listener.local_addr().unwrap();
21
+
22
+ let handle = tokio::spawn(async move {
23
+ axum::serve(listener, router).await.unwrap();
24
+ });
25
+
26
+ (addr, handle)
27
+ }
28
+
29
+ /// Starts a mock serverless that returns an empty SSE stream on first connection
30
+ /// (causing StreamEndedEarly error), then fails with an HTTP error on subsequent connections.
31
+ /// Returns the address, handle, and a counter of how many connections have been made.
32
+ async fn start_mock_serverless_stream_then_fail(
33
+ fail_status_code: u16,
34
+ ) -> (SocketAddr, tokio::task::JoinHandle<()>, Arc<AtomicU32>) {
35
+ use axum::{
36
+ Router,
37
+ body::Body,
38
+ http::{Response, StatusCode, header},
39
+ routing::get,
40
+ };
41
+
42
+ let connection_count = Arc::new(AtomicU32::new(0));
43
+ let connection_count_clone = connection_count.clone();
44
+
45
+ let router = Router::new().route(
46
+ "/start",
47
+ get(move || {
48
+ let connection_count = connection_count_clone.clone();
49
+ async move {
50
+ let count = connection_count.fetch_add(1, Ordering::SeqCst);
51
+
52
+ if count == 0 {
53
+ // First connection: return valid SSE stream that closes immediately
54
+ // This simulates a runner that connects but crashes before init
55
+ // This triggers "StreamEndedEarly" error
56
+ Response::builder()
57
+ .status(StatusCode::OK)
58
+ .header(header::CONTENT_TYPE, "text/event-stream")
59
+ .header(header::CACHE_CONTROL, "no-cache")
60
+ .body(Body::empty())
61
+ .unwrap()
62
+ } else {
63
+ // Subsequent connections: return HTTP error
64
+ Response::builder()
65
+ .status(StatusCode::from_u16(fail_status_code).unwrap())
66
+ .body(Body::from(format!(
67
+ "mock error response with status {}",
68
+ fail_status_code
69
+ )))
70
+ .unwrap()
71
+ }
72
+ }
73
+ }),
74
+ );
75
+
76
+ let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
77
+ let addr = listener.local_addr().unwrap();
78
+
79
+ let handle = tokio::spawn(async move {
80
+ axum::serve(listener, router).await.unwrap();
81
+ });
82
+
83
+ (addr, handle, connection_count)
84
+ }
85
+
86
+ async fn create_serverless_runner_config(
87
+ guard_port: u16,
88
+ namespace: &str,
89
+ runner_name: &str,
90
+ serverless_url: &str,
91
+ ) {
92
+ let client = reqwest::Client::new();
93
+ let response = client
94
+ .put(format!(
95
+ "http://127.0.0.1:{}/runner-configs/{}?namespace={}",
96
+ guard_port, runner_name, namespace
97
+ ))
98
+ .json(&json!({
99
+ "datacenters": {
100
+ "dc-1": {
101
+ "serverless": {
102
+ "url": serverless_url,
103
+ "max_runners": 1,
104
+ "slots_per_runner": 1,
105
+ "request_lifespan": 15,
106
+ }
107
+ }
108
+ }
109
+ }))
110
+ .send()
111
+ .await
112
+ .unwrap();
113
+
114
+ if !response.status().is_success() {
115
+ let text = response.text().await.unwrap();
116
+ panic!("failed to create runner config: {}", text);
117
+ }
118
+ }
119
+
120
+ /// Creates an actor and returns the actor_id if successful, or the error response body if failed.
121
+ async fn create_actor(
122
+ guard_port: u16,
123
+ namespace: &str,
124
+ runner_name: &str,
125
+ ) -> Result<String, serde_json::Value> {
126
+ create_actor_with_policy(guard_port, namespace, runner_name, "sleep").await
127
+ }
128
+
129
+ /// Creates an actor with a specific crash policy and returns the actor_id if successful.
130
+ async fn create_actor_with_policy(
131
+ guard_port: u16,
132
+ namespace: &str,
133
+ runner_name: &str,
134
+ crash_policy: &str,
135
+ ) -> Result<String, serde_json::Value> {
136
+ let client = reqwest::Client::new();
137
+ let response = client
138
+ .post(format!(
139
+ "http://127.0.0.1:{}/actors?namespace={}",
140
+ guard_port, namespace
141
+ ))
142
+ .json(&json!({
143
+ "name": "test",
144
+ "key": "key",
145
+ "crash_policy": crash_policy,
146
+ "runner_name_selector": runner_name,
147
+ }))
148
+ .send()
149
+ .await
150
+ .unwrap();
151
+
152
+ let success = response.status().is_success();
153
+ let body: serde_json::Value = response.json().await.unwrap();
154
+
155
+ if success {
156
+ Ok(body["actor"]["actor_id"].as_str().unwrap().to_string())
157
+ } else {
158
+ Err(body)
159
+ }
160
+ }
161
+
162
+ /// Spawns a task that makes a request to an actor via guard.
163
+ /// Returns a JoinHandle that resolves to the response.
164
+ fn request_guard(
165
+ guard_port: u16,
166
+ actor_id: String,
167
+ timeout_secs: u64,
168
+ ) -> tokio::task::JoinHandle<Result<reqwest::Response, reqwest::Error>> {
169
+ tokio::spawn(async move {
170
+ let client = reqwest::Client::builder()
171
+ .timeout(Duration::from_secs(timeout_secs))
172
+ .build()
173
+ .unwrap();
174
+
175
+ client
176
+ .get(format!("http://127.0.0.1:{}/ping", guard_port))
177
+ .header("X-Rivet-Target", "actor")
178
+ .header("X-Rivet-Actor", &actor_id)
179
+ .send()
180
+ .await
181
+ })
182
+ }
183
+
184
+ /// Fetches the actor error from the API.
185
+ /// Returns the error object if present, or None if not.
186
+ #[allow(dead_code)]
187
+ async fn get_actor_error(
188
+ guard_port: u16,
189
+ namespace: &str,
190
+ actor_id: &str,
191
+ ) -> Option<rivet_types::actor::ActorError> {
192
+ get_actor(guard_port, namespace, actor_id)
193
+ .await
194
+ .and_then(|a| a.error)
195
+ }
196
+
197
+ /// Returns the full actor details, or None if not found.
198
+ #[allow(dead_code)]
199
+ async fn get_actor(
200
+ guard_port: u16,
201
+ namespace: &str,
202
+ actor_id: &str,
203
+ ) -> Option<rivet_types::actors::Actor> {
204
+ let response = common::api::public::actors_list(
205
+ guard_port,
206
+ common::api_types::actors::list::ListQuery {
207
+ actor_ids: Some(actor_id.to_string()),
208
+ actor_id: vec![],
209
+ namespace: namespace.to_string(),
210
+ name: None,
211
+ key: None,
212
+ include_destroyed: Some(true),
213
+ limit: None,
214
+ cursor: None,
215
+ },
216
+ )
217
+ .await
218
+ .unwrap();
219
+
220
+ response.actors.into_iter().next()
221
+ }
222
+
223
+ /// Waits for the actor error to be set, polling every 500ms up to the timeout.
224
+ /// Returns the error if found, or None if timeout is reached.
225
+ #[allow(dead_code)]
226
+ async fn wait_for_actor_error(
227
+ guard_port: u16,
228
+ namespace: &str,
229
+ actor_id: &str,
230
+ timeout: Duration,
231
+ ) -> Option<rivet_types::actor::ActorError> {
232
+ let start = std::time::Instant::now();
233
+ while start.elapsed() < timeout {
234
+ if let Some(error) = get_actor_error(guard_port, namespace, actor_id).await {
235
+ return Some(error);
236
+ }
237
+ tokio::time::sleep(Duration::from_millis(500)).await;
238
+ }
239
+ None
240
+ }
241
+
242
+ #[test]
243
+ fn no_runners_available_error() {
244
+ common::run(common::TestOpts::new(1), |ctx| async move {
245
+ let guard_port = ctx.leader_dc().guard_port();
246
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
247
+
248
+ let error = create_actor(guard_port, &namespace, "nonexistent")
249
+ .await
250
+ .expect_err("actor creation should fail");
251
+
252
+ assert_eq!(error["code"], "no_runners_available");
253
+ assert_eq!(error["group"], "actor");
254
+ });
255
+ }
256
+
257
+ #[test]
258
+ fn serverless_http_404_error() {
259
+ common::run(
260
+ common::TestOpts::new(1).with_timeout(30),
261
+ |ctx| async move {
262
+ let guard_port = ctx.leader_dc().guard_port();
263
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
264
+
265
+ let (mock_addr, _mock_handle) = start_mock_serverless(404).await;
266
+ let serverless_url = format!("http://{}", mock_addr);
267
+
268
+ let runner_name = format!("serverless-404-{}", rand::random::<u16>());
269
+ create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
270
+ .await;
271
+
272
+ let actor_id = create_actor(guard_port, &namespace, &runner_name)
273
+ .await
274
+ .expect("actor creation should succeed initially");
275
+
276
+ // Make a request to the actor via guard - this should timeout with actor_ready_timeout
277
+ let guard_response = request_guard(guard_port, actor_id.clone(), 25)
278
+ .await
279
+ .expect("guard request task panicked")
280
+ .expect("guard request failed");
281
+
282
+ assert!(
283
+ !guard_response.status().is_success(),
284
+ "guard request should have failed"
285
+ );
286
+
287
+ let guard_body: serde_json::Value = guard_response.json().await.unwrap();
288
+ // Guard should fail fast with actor_runner_failed when pool has errors
289
+ assert_eq!(
290
+ guard_body["code"], "actor_runner_failed",
291
+ "expected actor_runner_failed error (fail-fast), got: {:?}",
292
+ guard_body
293
+ );
294
+
295
+ // Verify the pool error via runner configs API
296
+ let pool_error = get_runner_config_pool_error(guard_port, &namespace, &runner_name)
297
+ .await
298
+ .expect("pool should have error after failed connection");
299
+
300
+ match &pool_error {
301
+ rivet_types::actor::RunnerPoolError::ServerlessHttpError {
302
+ status_code,
303
+ body: _,
304
+ } => {
305
+ assert_eq!(*status_code, 404, "expected HTTP 404 error");
306
+ }
307
+ other => panic!("expected ServerlessHttpError, got: {:?}", other),
308
+ }
309
+ },
310
+ );
311
+ }
312
+
313
+ #[test]
314
+ fn runner_disconnect_error() {
315
+ common::run(
316
+ common::TestOpts::new(1).with_timeout(30),
317
+ |ctx| async move {
318
+ let guard_port = ctx.leader_dc().guard_port();
319
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
320
+
321
+ // 1. Connect a runner with key "test-runner"
322
+ let runner_key = "test-runner";
323
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
324
+ builder
325
+ .with_runner_key(runner_key)
326
+ .with_version(1)
327
+ .with_total_slots(10)
328
+ .with_actor_behavior("test", |_config| Box::new(common::EchoActor::new()))
329
+ })
330
+ .await;
331
+ let runner_id = runner.wait_ready().await;
332
+ tracing::info!(?runner_id, "runner connected");
333
+
334
+ // 2. Create an actor on the runner (runner_name_selector must match runner key)
335
+ // Use sleep policy - when runner shuts down gracefully, actor sleeps without error
336
+ let actor_id = create_actor(guard_port, &namespace, runner_key)
337
+ .await
338
+ .expect("actor creation should succeed");
339
+ tracing::info!(%actor_id, "actor created");
340
+
341
+ // Wait for actor to be allocated to runner
342
+ tokio::time::sleep(Duration::from_millis(500)).await;
343
+
344
+ // Verify actor is on the runner
345
+ assert!(
346
+ runner.has_actor(&actor_id).await,
347
+ "actor should be on the runner"
348
+ );
349
+
350
+ // 3. Stop the runner (graceful shutdown)
351
+ runner.shutdown().await;
352
+ tracing::info!("runner shutdown");
353
+
354
+ // Wait for runner to be detected as gone
355
+ tokio::time::sleep(Duration::from_millis(1000)).await;
356
+
357
+ // 4. Wait for actor state to update
358
+ // With sleep policy and graceful shutdown, the actor sleeps without an error.
359
+ tokio::time::sleep(Duration::from_secs(1)).await;
360
+
361
+ // 5. Verify actor state via /actors API
362
+ let actor = get_actor(guard_port, &namespace, &actor_id)
363
+ .await
364
+ .expect("actor should exist");
365
+ tracing::info!(?actor, "actor from API");
366
+
367
+ // Actor should NOT be destroyed (sleep policy keeps it alive)
368
+ assert!(
369
+ actor.destroy_ts.is_none(),
370
+ "actor should not be destroyed with sleep policy"
371
+ );
372
+
373
+ // With graceful shutdown, no error should be set
374
+ assert!(
375
+ actor.error.is_none(),
376
+ "graceful shutdown should not set an error, got: {:?}",
377
+ actor.error
378
+ );
379
+
380
+ tracing::info!(
381
+ sleep_ts = ?actor.sleep_ts,
382
+ connectable_ts = ?actor.connectable_ts,
383
+ "actor state after graceful runner shutdown"
384
+ );
385
+ },
386
+ );
387
+ }
388
+
389
+ #[test]
390
+ fn serverless_stream_ended_then_http_error() {
391
+ common::run(
392
+ common::TestOpts::new(1).with_timeout(30),
393
+ |ctx| async move {
394
+ let guard_port = ctx.leader_dc().guard_port();
395
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
396
+
397
+ // Start mock that returns empty SSE stream on first connection (StreamEndedEarly),
398
+ // then returns 503 on subsequent connections
399
+ let (mock_addr, _mock_handle, connection_count) =
400
+ start_mock_serverless_stream_then_fail(503).await;
401
+ let serverless_url = format!("http://{}", mock_addr);
402
+
403
+ let runner_name = format!("serverless-stream-{}", rand::random::<u16>());
404
+ create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
405
+ .await;
406
+
407
+ let actor_id = create_actor(guard_port, &namespace, &runner_name)
408
+ .await
409
+ .expect("actor creation should succeed");
410
+
411
+ // Make a request to the actor via guard - this should timeout with actor_ready_timeout
412
+ let guard_response = request_guard(guard_port, actor_id.clone(), 25)
413
+ .await
414
+ .expect("guard request task panicked")
415
+ .expect("guard request failed");
416
+
417
+ assert!(
418
+ !guard_response.status().is_success(),
419
+ "guard request should have failed"
420
+ );
421
+
422
+ let guard_body: serde_json::Value = guard_response.json().await.unwrap();
423
+ // Guard should fail fast with actor_runner_failed when pool has errors
424
+ assert_eq!(
425
+ guard_body["code"], "actor_runner_failed",
426
+ "expected actor_runner_failed error (fail-fast), got: {:?}",
427
+ guard_body
428
+ );
429
+
430
+ // Verify multiple connections were made (retry after StreamEndedEarly)
431
+ assert!(
432
+ connection_count.load(Ordering::SeqCst) >= 2,
433
+ "expected at least 2 connections, got {}",
434
+ connection_count.load(Ordering::SeqCst)
435
+ );
436
+
437
+ // Verify the pool error via runner configs API - should show the most recent error (503)
438
+ let pool_error = get_runner_config_pool_error(guard_port, &namespace, &runner_name)
439
+ .await
440
+ .expect("pool should have error after failed connection");
441
+
442
+ match &pool_error {
443
+ rivet_types::actor::RunnerPoolError::ServerlessHttpError {
444
+ status_code,
445
+ body: _,
446
+ } => {
447
+ assert_eq!(*status_code, 503, "expected HTTP 503 error");
448
+ }
449
+ other => panic!("expected ServerlessHttpError, got: {:?}", other),
450
+ }
451
+ },
452
+ );
453
+ }
454
+
455
+ /// Fetches runner config from the API and returns the pool_error if present.
456
+ async fn get_runner_config_pool_error(
457
+ guard_port: u16,
458
+ namespace: &str,
459
+ runner_name: &str,
460
+ ) -> Option<rivet_types::actor::RunnerPoolError> {
461
+ let client = reqwest::Client::new();
462
+ let response = client
463
+ .get(format!(
464
+ "http://127.0.0.1:{}/runner-configs?namespace={}&runner_name={}",
465
+ guard_port, namespace, runner_name
466
+ ))
467
+ .send()
468
+ .await
469
+ .unwrap();
470
+
471
+ if !response.status().is_success() {
472
+ panic!(
473
+ "failed to get runner config: {}",
474
+ response.text().await.unwrap()
475
+ );
476
+ }
477
+
478
+ let body: serde_json::Value = response.json().await.unwrap();
479
+ let runner_configs = body["runner_configs"].as_object().unwrap();
480
+ let config = runner_configs.get(runner_name)?;
481
+
482
+ // The public API returns datacenters nested under each runner config
483
+ let dc_config = config["datacenters"]["dc-1"].as_object()?;
484
+
485
+ // Parse pool_error if present
486
+ // Handle both string format (for errors without fields) and object format (for errors with fields)
487
+ dc_config.get("runner_pool_error").map(|_| {
488
+ serde_json::from_value(config["datacenters"]["dc-1"]["runner_pool_error"].clone()).unwrap()
489
+ })
490
+ }
491
+
492
+ /// Tests that both the runner configs API and actor API return pool errors for serverless configs.
493
+ #[test]
494
+ fn runner_config_returns_pool_error() {
495
+ common::run(
496
+ common::TestOpts::new(1).with_timeout(30),
497
+ |ctx| async move {
498
+ let guard_port = ctx.leader_dc().guard_port();
499
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
500
+
501
+ // Start mock that always returns 500 error
502
+ let (mock_addr, _mock_handle) = start_mock_serverless(500).await;
503
+ let serverless_url = format!("http://{}", mock_addr);
504
+
505
+ let runner_name = format!("serverless-poolerror-{}", rand::random::<u16>());
506
+ create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
507
+ .await;
508
+
509
+ // Initially, there should be no pool error
510
+ let error = get_runner_config_pool_error(guard_port, &namespace, &runner_name).await;
511
+ assert!(error.is_none(), "should have no pool error initially");
512
+
513
+ // Create actor to trigger a serverless connection attempt
514
+ let _actor_id = create_actor(guard_port, &namespace, &runner_name)
515
+ .await
516
+ .expect("actor creation should succeed");
517
+
518
+ // Wait for the error tracker to be populated
519
+ tokio::time::sleep(Duration::from_millis(1000)).await;
520
+
521
+ // Now there should be a pool error in runner configs API
522
+ let pool_error =
523
+ get_runner_config_pool_error(guard_port, &namespace, &runner_name).await;
524
+ assert!(
525
+ pool_error.is_some(),
526
+ "should have pool error after failed connection"
527
+ );
528
+
529
+ match pool_error.unwrap() {
530
+ rivet_types::actor::RunnerPoolError::ServerlessHttpError {
531
+ status_code,
532
+ body: _,
533
+ } => {
534
+ assert_eq!(status_code, 500, "expected HTTP 500 error");
535
+ }
536
+ other => panic!("expected ServerlessHttpError, got: {:?}", other),
537
+ }
538
+ },
539
+ );
540
+ }
541
+
542
+ /// Tests that the guard returns `actor_runner_failed` quickly when the serverless pool has errors.
543
+ /// This verifies the fail-fast behavior - guard should detect pool errors and fail within a few
544
+ /// seconds instead of waiting for the full timeout.
545
+ #[test]
546
+ fn guard_fails_fast_on_pool_error() {
547
+ common::run(
548
+ common::TestOpts::new(1).with_timeout(30),
549
+ |ctx| async move {
550
+ let guard_port = ctx.leader_dc().guard_port();
551
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
552
+
553
+ // Start mock that always returns 500 error
554
+ let (mock_addr, _mock_handle) = start_mock_serverless(500).await;
555
+ let serverless_url = format!("http://{}", mock_addr);
556
+
557
+ let runner_name = format!("serverless-failfast-{}", rand::random::<u16>());
558
+ create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
559
+ .await;
560
+
561
+ // Create actor - this triggers the first serverless connection attempt which will fail
562
+ // and populate the error tracker
563
+ let actor_id = create_actor(guard_port, &namespace, &runner_name)
564
+ .await
565
+ .expect("actor creation should succeed initially");
566
+
567
+ // Wait a bit for the error tracker to be populated
568
+ tokio::time::sleep(Duration::from_millis(500)).await;
569
+
570
+ // Make a request to the actor via guard
571
+ // This should fail fast with actor_runner_failed (within ~3 seconds)
572
+ // instead of waiting for the full 10 second timeout
573
+ let start = std::time::Instant::now();
574
+ let guard_response = request_guard(guard_port, actor_id.clone(), 15)
575
+ .await
576
+ .expect("guard request task panicked")
577
+ .expect("guard request failed");
578
+ let elapsed = start.elapsed();
579
+
580
+ assert!(
581
+ !guard_response.status().is_success(),
582
+ "guard request should have failed"
583
+ );
584
+
585
+ let guard_body: serde_json::Value = guard_response.json().await.unwrap();
586
+
587
+ // Should be actor_runner_failed (fail-fast) not actor_ready_timeout
588
+ assert_eq!(
589
+ guard_body["code"], "actor_runner_failed",
590
+ "expected actor_runner_failed error (fail-fast), got: {:?}",
591
+ guard_body
592
+ );
593
+
594
+ // Should fail fast - within ~3 seconds (1s delay + 1 check cycle + buffer)
595
+ // Definitely should not take the full 10 second timeout
596
+ assert!(
597
+ elapsed.as_secs() < 5,
598
+ "guard should fail fast, but took {:?}",
599
+ elapsed
600
+ );
601
+
602
+ tracing::info!(?elapsed, "guard failed fast as expected");
603
+ },
604
+ );
605
+ }
606
+
607
+ /// Tests that the RunnerNoResponse error is set when a runner crashes (ungraceful disconnect)
608
+ /// while an actor is allocated to it.
609
+ #[test]
610
+ fn runner_no_response_error() {
611
+ common::run(
612
+ common::TestOpts::new(1).with_timeout(30),
613
+ |ctx| async move {
614
+ let guard_port = ctx.leader_dc().guard_port();
615
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
616
+
617
+ // 1. Connect a runner
618
+ let runner_name = "crash-test-runner";
619
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
620
+ builder
621
+ .with_runner_name(runner_name)
622
+ .with_version(1)
623
+ .with_total_slots(10)
624
+ // Actor that never sends running state (simulates being stuck)
625
+ .with_actor_behavior("test", |_config| Box::new(common::TimeoutActor))
626
+ })
627
+ .await;
628
+ let runner_id = runner.wait_ready().await;
629
+ tracing::info!(?runner_id, "runner connected");
630
+
631
+ // 2. Create an actor that will be allocated to the runner
632
+ // Use sleep policy - when runner crashes, actor sleeps with RunnerNoResponse error
633
+ let actor_id = create_actor(guard_port, &namespace, runner_name)
634
+ .await
635
+ .expect("actor creation should succeed");
636
+ tracing::info!(%actor_id, "actor created");
637
+
638
+ // Wait for actor to be allocated
639
+ tokio::time::sleep(Duration::from_millis(500)).await;
640
+
641
+ // Verify actor is on the runner
642
+ assert!(
643
+ runner.has_actor(&actor_id).await,
644
+ "actor should be on the runner"
645
+ );
646
+
647
+ // 3. Crash the runner (ungraceful disconnect without cleanup)
648
+ runner.crash().await;
649
+ tracing::info!("runner crashed");
650
+
651
+ // 4. Wait for actor to get RunnerNoResponse error
652
+ // With sleep policy, the actor gets RunnerNoResponse from the runner crash and sleeps
653
+ let actor_error =
654
+ wait_for_actor_error(guard_port, &namespace, &actor_id, Duration::from_secs(15))
655
+ .await
656
+ .expect("actor should have error after runner crash");
657
+
658
+ tracing::info!(?actor_error, "actor error received");
659
+
660
+ // The error is RunnerNoResponse because the runner crashed while actor was allocated
661
+ match actor_error {
662
+ rivet_types::actor::ActorError::RunnerNoResponse { runner_id } => {
663
+ tracing::info!(?runner_id, "got RunnerNoResponse error as expected");
664
+ }
665
+ other => panic!("expected RunnerNoResponse error, got: {:?}", other),
666
+ }
667
+ },
668
+ );
669
+ }
670
+
671
+ /// Tests that an actor with "destroy" crash policy is destroyed when it crashes.
672
+ #[test]
673
+ fn actor_crash_destroy_policy() {
674
+ common::run(
675
+ common::TestOpts::new(1).with_timeout(30),
676
+ |ctx| async move {
677
+ let guard_port = ctx.leader_dc().guard_port();
678
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
679
+
680
+ // 1. Connect a runner with an actor that crashes on start
681
+ let runner_name = "crash-destroy-runner";
682
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
683
+ builder
684
+ .with_runner_name(runner_name)
685
+ .with_version(1)
686
+ .with_total_slots(10)
687
+ .with_actor_behavior("test", |_config| {
688
+ Box::new(common::CrashOnStartActor::new(1))
689
+ })
690
+ })
691
+ .await;
692
+ let runner_id = runner.wait_ready().await;
693
+ tracing::info!(?runner_id, "runner connected");
694
+
695
+ // 2. Create an actor with "destroy" crash policy
696
+ let actor_id = create_actor_with_policy(guard_port, &namespace, runner_name, "destroy")
697
+ .await
698
+ .expect("actor creation should succeed");
699
+ tracing::info!(%actor_id, "actor created");
700
+
701
+ // 3. Wait for actor to be destroyed
702
+ let start = std::time::Instant::now();
703
+ let timeout = Duration::from_secs(10);
704
+ loop {
705
+ if start.elapsed() > timeout {
706
+ panic!("timeout waiting for actor to be destroyed");
707
+ }
708
+
709
+ let actor = get_actor(guard_port, &namespace, &actor_id)
710
+ .await
711
+ .expect("actor should exist");
712
+
713
+ if actor.destroy_ts.is_some() {
714
+ tracing::info!(?actor.destroy_ts, "actor destroyed as expected");
715
+ // With destroy policy, no error should be set since actor is gone
716
+ assert!(
717
+ actor.error.is_none(),
718
+ "destroyed actor should not have error set: {:?}",
719
+ actor.error
720
+ );
721
+ break;
722
+ }
723
+
724
+ tokio::time::sleep(Duration::from_millis(200)).await;
725
+ }
726
+ },
727
+ );
728
+ }
729
+
730
+ /// Tests that an actor with "sleep" crash policy enters sleep state with Crashed error.
731
+ #[test]
732
+ fn actor_crash_sleep_policy() {
733
+ common::run(
734
+ common::TestOpts::new(1).with_timeout(30),
735
+ |ctx| async move {
736
+ let guard_port = ctx.leader_dc().guard_port();
737
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
738
+
739
+ // 1. Connect a runner with an actor that crashes on start
740
+ let runner_name = "crash-sleep-runner";
741
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
742
+ builder
743
+ .with_runner_name(runner_name)
744
+ .with_version(1)
745
+ .with_total_slots(10)
746
+ .with_actor_behavior("test", |_config| {
747
+ Box::new(common::CrashOnStartActor::new(1))
748
+ })
749
+ })
750
+ .await;
751
+ let runner_id = runner.wait_ready().await;
752
+ tracing::info!(?runner_id, "runner connected");
753
+
754
+ // 2. Create an actor with "sleep" crash policy
755
+ let actor_id = create_actor_with_policy(guard_port, &namespace, runner_name, "sleep")
756
+ .await
757
+ .expect("actor creation should succeed");
758
+ tracing::info!(%actor_id, "actor created");
759
+
760
+ // 3. Wait for actor to crash and enter sleep state with error
761
+ let start = std::time::Instant::now();
762
+ let timeout = Duration::from_secs(10);
763
+ loop {
764
+ if start.elapsed() > timeout {
765
+ panic!("timeout waiting for actor to enter sleep state");
766
+ }
767
+
768
+ let actor = get_actor(guard_port, &namespace, &actor_id)
769
+ .await
770
+ .expect("actor should exist");
771
+
772
+ if actor.sleep_ts.is_some() {
773
+ tracing::info!(?actor.sleep_ts, ?actor.error, "actor sleeping as expected");
774
+
775
+ // Verify it has a Crashed error
776
+ match actor.error {
777
+ Some(rivet_types::actor::ActorError::Crashed { message }) => {
778
+ tracing::info!(?message, "got Crashed error as expected");
779
+ assert!(
780
+ message.as_ref().map_or(false, |m| m.contains("crash")),
781
+ "crash message should mention crash: {:?}",
782
+ message
783
+ );
784
+ }
785
+ other => panic!("expected Crashed error, got: {:?}", other),
786
+ }
787
+
788
+ // Actor should not be destroyed
789
+ assert!(
790
+ actor.destroy_ts.is_none(),
791
+ "sleeping actor should not be destroyed"
792
+ );
793
+ break;
794
+ }
795
+
796
+ tokio::time::sleep(Duration::from_millis(200)).await;
797
+ }
798
+ },
799
+ );
800
+ }
801
+
802
+ /// Tests that an actor with "restart" crash policy keeps restarting after crash.
803
+ #[test]
804
+ fn actor_crash_restart_policy() {
805
+ common::run(
806
+ common::TestOpts::new(1).with_timeout(30),
807
+ |ctx| async move {
808
+ let guard_port = ctx.leader_dc().guard_port();
809
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
810
+
811
+ // 1. Connect a runner with an actor that crashes on start
812
+ // Track crash count to verify restarts
813
+ let crash_count = Arc::new(AtomicU32::new(0));
814
+ let crash_count_clone = crash_count.clone();
815
+
816
+ let runner_name = "crash-restart-runner";
817
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
818
+ builder
819
+ .with_runner_name(runner_name)
820
+ .with_version(1)
821
+ .with_total_slots(10)
822
+ .with_actor_behavior("test", move |_config| {
823
+ let crash_count = crash_count_clone.clone();
824
+ Box::new(common::CountingCrashActor::new(crash_count))
825
+ })
826
+ })
827
+ .await;
828
+ let runner_id = runner.wait_ready().await;
829
+ tracing::info!(?runner_id, "runner connected");
830
+
831
+ // 2. Create an actor with "restart" crash policy
832
+ let actor_id = create_actor_with_policy(guard_port, &namespace, runner_name, "restart")
833
+ .await
834
+ .expect("actor creation should succeed");
835
+ tracing::info!(%actor_id, "actor created");
836
+
837
+ // 3. Wait for multiple crashes to confirm restart behavior
838
+ let start = std::time::Instant::now();
839
+ let timeout = Duration::from_secs(10);
840
+ loop {
841
+ if start.elapsed() > timeout {
842
+ let count = crash_count.load(Ordering::SeqCst);
843
+ panic!(
844
+ "timeout waiting for restart behavior, crash count: {}",
845
+ count
846
+ );
847
+ }
848
+
849
+ let count = crash_count.load(Ordering::SeqCst);
850
+ if count >= 2 {
851
+ tracing::info!(count, "actor restarted multiple times as expected");
852
+
853
+ // Verify actor is not destroyed or sleeping
854
+ let actor = get_actor(guard_port, &namespace, &actor_id)
855
+ .await
856
+ .expect("actor should exist");
857
+
858
+ assert!(
859
+ actor.destroy_ts.is_none(),
860
+ "restarting actor should not be destroyed"
861
+ );
862
+ assert!(
863
+ actor.sleep_ts.is_none(),
864
+ "restarting actor should not be sleeping"
865
+ );
866
+
867
+ break;
868
+ }
869
+
870
+ tokio::time::sleep(Duration::from_millis(200)).await;
871
+ }
872
+ },
873
+ );
874
+ }
875
+
876
+ /// Tests that ServerlessConnectionError is returned when the serverless URL refuses connections.
877
+ #[test]
878
+ fn serverless_connection_refused_error() {
879
+ common::run(
880
+ common::TestOpts::new(1).with_timeout(30),
881
+ |ctx| async move {
882
+ let guard_port = ctx.leader_dc().guard_port();
883
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
884
+
885
+ // Use a URL that will refuse connections (bind to get a port, then drop the listener)
886
+ let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
887
+ let addr = listener.local_addr().unwrap();
888
+ drop(listener); // Drop immediately so nothing is listening
889
+
890
+ let serverless_url = format!("http://{}", addr);
891
+
892
+ let runner_name = format!("serverless-connrefused-{}", rand::random::<u16>());
893
+ create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
894
+ .await;
895
+
896
+ // Create actor to trigger serverless connection attempt
897
+ let _actor_id = create_actor(guard_port, &namespace, &runner_name)
898
+ .await
899
+ .expect("actor creation should succeed");
900
+
901
+ // Wait for error to be tracked
902
+ tokio::time::sleep(Duration::from_millis(1500)).await;
903
+
904
+ // Verify pool error is a connection error
905
+ let pool_error = get_runner_config_pool_error(guard_port, &namespace, &runner_name)
906
+ .await
907
+ .expect("pool should have error after connection refused");
908
+
909
+ tracing::info!(?pool_error, "pool error received");
910
+
911
+ match pool_error {
912
+ rivet_types::actor::RunnerPoolError::ServerlessConnectionError { message } => {
913
+ tracing::info!(?message, "got ServerlessConnectionError as expected");
914
+ // Connection refused messages vary by OS
915
+ assert!(
916
+ message.to_lowercase().contains("connect")
917
+ || message.to_lowercase().contains("refused")
918
+ || message.to_lowercase().contains("error"),
919
+ "error message should mention connection issue: {}",
920
+ message
921
+ );
922
+ }
923
+ other => panic!("expected ServerlessConnectionError, got: {:?}", other),
924
+ }
925
+ },
926
+ );
927
+ }
928
+
929
+ /// Tests that ServerlessInvalidSsePayload error is returned when the serverless endpoint
930
+ /// returns malformed SSE data.
931
+ #[test]
932
+ fn serverless_invalid_payload_error() {
933
+ common::run(
934
+ common::TestOpts::new(1).with_timeout(30),
935
+ |ctx| async move {
936
+ let guard_port = ctx.leader_dc().guard_port();
937
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
938
+
939
+ // Start mock that returns valid SSE stream but with invalid JSON payload
940
+ let (mock_addr, _mock_handle) = start_mock_serverless_invalid_payload().await;
941
+ let serverless_url = format!("http://{}", mock_addr);
942
+
943
+ let runner_name = format!("serverless-invalid-{}", rand::random::<u16>());
944
+ create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
945
+ .await;
946
+
947
+ // Create actor to trigger serverless connection attempt
948
+ let _actor_id = create_actor(guard_port, &namespace, &runner_name)
949
+ .await
950
+ .expect("actor creation should succeed");
951
+
952
+ // Wait for error to be tracked
953
+ tokio::time::sleep(Duration::from_millis(1500)).await;
954
+
955
+ // Verify pool error is a base64 or payload error
956
+ let pool_error =
957
+ get_runner_config_pool_error(guard_port, &namespace, &runner_name).await;
958
+
959
+ let pool_error = pool_error.expect("pool should have error after invalid payload");
960
+
961
+ tracing::info!(?pool_error, "pool error received");
962
+
963
+ match pool_error {
964
+ rivet_types::actor::RunnerPoolError::ServerlessInvalidSsePayload {
965
+ message,
966
+ ..
967
+ } => {
968
+ tracing::info!(?message, "got ServerlessInvalidSsePayload as expected");
969
+ }
970
+ other => panic!("expected ServerlessInvalidSsePayload, got: {:?}", other),
971
+ }
972
+ },
973
+ );
974
+ }
975
+
976
+ /// Starts a mock serverless that returns valid SSE stream but with invalid JSON payload.
977
+ async fn start_mock_serverless_invalid_payload() -> (SocketAddr, tokio::task::JoinHandle<()>) {
978
+ use axum::{
979
+ Router,
980
+ body::Body,
981
+ http::{Response, StatusCode, header},
982
+ routing::any,
983
+ };
984
+
985
+ // Handle all routes with invalid SSE payload
986
+ let router = Router::new().fallback(any(|| async {
987
+ // Return valid SSE format but with invalid JSON in the data field
988
+ let invalid_sse = "data: not-valid-json\n\n";
989
+ Response::builder()
990
+ .status(StatusCode::OK)
991
+ .header(header::CONTENT_TYPE, "text/event-stream")
992
+ .header(header::CACHE_CONTROL, "no-cache")
993
+ .body(Body::from(invalid_sse))
994
+ .unwrap()
995
+ }));
996
+
997
+ let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
998
+ let addr = listener.local_addr().unwrap();
999
+
1000
+ let handle = tokio::spawn(async move {
1001
+ axum::serve(listener, router).await.unwrap();
1002
+ });
1003
+
1004
+ (addr, handle)
1005
+ }