@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
@@ -8,22 +8,31 @@ import { type HibernatingWebSocketMetadata, Tunnel } from "./tunnel";
8
8
  import {
9
9
  calculateBackoff,
10
10
  parseWebSocketCloseReason,
11
+ stringifyError,
11
12
  unreachable,
12
13
  } from "./utils";
13
14
  import { importWebSocket } from "./websocket.js";
15
+ import {
16
+ v4 as uuidv4,
17
+ } from "uuid";
14
18
 
15
19
  export type { HibernatingWebSocketMetadata };
16
20
  export { RunnerActor, type ActorConfig };
17
21
  export { idToStr } from "./utils";
18
22
 
19
23
  const KV_EXPIRE: number = 30_000;
20
- const PROTOCOL_VERSION: number = 3;
21
- const RUNNER_PING_INTERVAL = 3_000;
24
+ const PROTOCOL_VERSION: number = 7;
22
25
 
23
26
  /** Warn once the backlog significantly exceeds the server's ack batch size. */
24
27
  const EVENT_BACKLOG_WARN_THRESHOLD = 10_000;
25
28
  const SIGNAL_HANDLERS: (() => void | Promise<void>)[] = [];
26
29
 
30
+ export class RunnerShutdownError extends Error {
31
+ constructor() {
32
+ super("Runner shut down");
33
+ }
34
+ }
35
+
27
36
  export interface RunnerConfig {
28
37
  logger?: Logger;
29
38
  version: number;
@@ -34,7 +43,6 @@ export interface RunnerConfig {
34
43
  namespace: string;
35
44
  totalSlots: number;
36
45
  runnerName: string;
37
- runnerKey: string;
38
46
  prepopulateActorNames: Record<string, { metadata: Record<string, any> }>;
39
47
  metadata?: Record<string, any>;
40
48
  onConnected: () => void;
@@ -169,6 +177,15 @@ export interface RunnerConfig {
169
177
 
170
178
  onActorStop: (actorId: string, generation: number) => Promise<void>;
171
179
  noAutoShutdown?: boolean;
180
+
181
+ /**
182
+ * Debug option to inject artificial latency (in ms) into WebSocket
183
+ * communication. Messages are queued and delivered in order after the
184
+ * configured delay.
185
+ *
186
+ * @experimental For testing only.
187
+ */
188
+ debugLatencyMs?: number;
172
189
  }
173
190
 
174
191
  export interface KvListOptions {
@@ -187,6 +204,7 @@ interface KvRequestEntry {
187
204
 
188
205
  export class Runner {
189
206
  #config: RunnerConfig;
207
+ #runnerKey: string = uuidv4();
190
208
 
191
209
  get config(): RunnerConfig {
192
210
  return this.#config;
@@ -195,23 +213,21 @@ export class Runner {
195
213
  #actors: Map<string, RunnerActor> = new Map();
196
214
 
197
215
  // WebSocket
198
- __pegboardWebSocket?: WebSocket;
216
+ #pegboardWebSocket?: WebSocket;
199
217
  runnerId?: string;
200
- #lastCommandIdx: number = -1;
201
- #pingLoop?: NodeJS.Timeout;
202
- #nextEventIdx: bigint = 0n;
203
218
  #started: boolean = false;
204
219
  #shutdown: boolean = false;
205
- #shuttingDown: boolean = false;
220
+ #draining: boolean = false;
206
221
  #reconnectAttempt: number = 0;
207
222
  #reconnectTimeout?: NodeJS.Timeout;
208
223
 
224
+ // Protocol metadata
225
+ #protocolMetadata?: protocol.ProtocolMetadata;
226
+
209
227
  // Runner lost threshold management
210
- #runnerLostThreshold?: number;
211
228
  #runnerLostTimeout?: NodeJS.Timeout;
212
229
 
213
230
  // Event storage for resending
214
- #eventHistory: protocol.EventWrapper[] = [];
215
231
  #eventBacklogWarned: boolean = false;
216
232
 
217
233
  // Command acknowledgment
@@ -255,7 +271,14 @@ export class Runner {
255
271
 
256
272
  // Start cleaning up old unsent KV requests every 15 seconds
257
273
  this.#kvCleanupInterval = setInterval(() => {
258
- this.#cleanupOldKvRequests();
274
+ try {
275
+ this.#cleanupOldKvRequests();
276
+ } catch (err) {
277
+ this.log?.error({
278
+ msg: "error cleaning up kv requests",
279
+ error: stringifyError(err),
280
+ });
281
+ }
259
282
  }, 15000); // Run every 15 seconds
260
283
  }
261
284
 
@@ -281,7 +304,30 @@ export class Runner {
281
304
  // The server will send a StopActor command if it wants to fully stop
282
305
  }
283
306
 
307
+ /**
308
+ * Like stopActor but marks the actor for graceful destruction.
309
+ * This ensures the engine destroys the actor instead of sleeping it.
310
+ *
311
+ * NOTE: If a drain (GoingAway) occurs after this is called but before the
312
+ * stop completes, the engine's going_away flag overrides graceful_exit and
313
+ * the actor will sleep instead of being destroyed. The destroy intent is
314
+ * lost in this race. This is acceptable since the actor will be rescheduled
315
+ * elsewhere and can be destroyed on the next wake.
316
+ */
317
+ destroyActor(actorId: string, generation?: number) {
318
+ const actor = this.getActor(actorId, generation);
319
+ if (!actor) return;
320
+
321
+ actor.stopIntentSent = true;
322
+ this.#sendActorIntent(actorId, actor.generation, "stop");
323
+ }
324
+
284
325
  async forceStopActor(actorId: string, generation?: number) {
326
+ this.log?.debug({
327
+ msg: "force stopping actor",
328
+ actorId,
329
+ });
330
+
285
331
  const actor = this.getActor(actorId, generation);
286
332
  if (!actor) return;
287
333
 
@@ -299,22 +345,38 @@ export class Runner {
299
345
  // Close requests after onActorStop so you can send messages over the tunnel
300
346
  this.#tunnel?.closeActiveRequests(actor);
301
347
 
348
+ this.#sendActorStateUpdate(actorId, actor.generation, "stopped");
349
+
302
350
  // Remove actor after stopping in order to ensure that we can still
303
- // call actions on the runner. Do this before sending stopped update in
304
- // order to ensure we don't have duplicate actors.
351
+ // call actions on the runner
305
352
  this.#removeActor(actorId, generation);
306
-
307
- this.#sendActorStateUpdate(actorId, actor.generation, "stopped");
308
353
  }
309
354
 
310
- #stopAllActors() {
355
+ #handleLost() {
311
356
  this.log?.info({
312
- msg: "stopping all actors due to runner lost threshold exceeded",
357
+ msg: "stopping all actors due to runner lost threshold",
313
358
  });
314
359
 
360
+ // Remove all remaining kv requests
361
+ for (const [_, request] of this.#kvRequests.entries()) {
362
+ request.reject(new RunnerShutdownError());
363
+ }
364
+
365
+ this.#kvRequests.clear();
366
+
367
+ this.#stopAllActors();
368
+ }
369
+
370
+ #stopAllActors() {
315
371
  const actorIds = Array.from(this.#actors.keys());
316
372
  for (const actorId of actorIds) {
317
- this.forceStopActor(actorId);
373
+ this.forceStopActor(actorId).catch((err) => {
374
+ this.log?.error({
375
+ msg: "error stopping actor",
376
+ actorId,
377
+ error: stringifyError(err),
378
+ });
379
+ });
318
380
  }
319
381
  }
320
382
 
@@ -412,6 +474,8 @@ export class Runner {
412
474
  throw error;
413
475
  }
414
476
 
477
+ // When changing SIGTERM/shutdown behavior, update
478
+ // website/src/content/docs/actors/versions.mdx (SIGTERM Handling section).
415
479
  if (!this.#config.noAutoShutdown) {
416
480
  if (!SIGNAL_HANDLERS.length) {
417
481
  process.on("SIGTERM", async () => {
@@ -450,20 +514,20 @@ export class Runner {
450
514
  // MARK: Shutdown
451
515
  async shutdown(immediate: boolean, exit: boolean = false) {
452
516
  // Prevent concurrent shutdowns
453
- if (this.#shuttingDown) {
517
+ if (this.#shutdown) {
454
518
  this.log?.debug({
455
519
  msg: "shutdown already in progress, ignoring",
456
520
  });
457
521
  return;
458
522
  }
459
- this.#shuttingDown = true;
523
+ this.#shutdown = true;
524
+ this.#draining = !immediate;
460
525
 
461
526
  this.log?.info({
462
527
  msg: "starting shutdown",
463
528
  immediate,
464
529
  exit,
465
530
  });
466
- this.#shutdown = true;
467
531
 
468
532
  // Clear reconnect timeout
469
533
  if (this.#reconnectTimeout) {
@@ -477,12 +541,6 @@ export class Runner {
477
541
  this.#runnerLostTimeout = undefined;
478
542
  }
479
543
 
480
- // Clear ping loop
481
- if (this.#pingLoop) {
482
- clearInterval(this.#pingLoop);
483
- this.#pingLoop = undefined;
484
- }
485
-
486
544
  // Clear ack interval
487
545
  if (this.#ackInterval) {
488
546
  clearInterval(this.#ackInterval);
@@ -504,8 +562,8 @@ export class Runner {
504
562
  this.#kvRequests.clear();
505
563
 
506
564
  // Close WebSocket
507
- if (this.__webSocketReady()) {
508
- const pegboardWebSocket = this.__pegboardWebSocket;
565
+ const pegboardWebSocket = this.getPegboardWebSocketIfReady();
566
+ if (pegboardWebSocket) {
509
567
  if (immediate) {
510
568
  // Stop immediately
511
569
  pegboardWebSocket.close(1000, "pegboard.runner_shutdown");
@@ -566,7 +624,7 @@ export class Runner {
566
624
  // the runner has already shut down
567
625
  this.log?.debug({
568
626
  msg: "no runner WebSocket to shutdown or already closed",
569
- readyState: this.__pegboardWebSocket?.readyState,
627
+ readyState: this.#pegboardWebSocket?.readyState,
570
628
  });
571
629
  }
572
630
 
@@ -590,6 +648,9 @@ export class Runner {
590
648
  * - All actors are stopped
591
649
  * - The WebSocket connection is closed
592
650
  * - The shutdown timeout is reached (120 seconds)
651
+ *
652
+ * When changing this timeout, update
653
+ * website/src/content/docs/actors/versions.mdx (SIGTERM Handling section).
593
654
  */
594
655
  async #waitForActorsToStop(ws: WebSocket): Promise<void> {
595
656
  const shutdownTimeout = 120_000; // 120 seconds
@@ -681,7 +742,7 @@ export class Runner {
681
742
  const baseUrl = wsEndpoint.endsWith("/")
682
743
  ? wsEndpoint.slice(0, -1)
683
744
  : wsEndpoint;
684
- return `${baseUrl}/runners/connect?protocol_version=${PROTOCOL_VERSION}&namespace=${encodeURIComponent(this.#config.namespace)}&runner_key=${encodeURIComponent(this.#config.runnerKey)}`;
745
+ return `${baseUrl}/runners/connect?protocol_version=${PROTOCOL_VERSION}&namespace=${encodeURIComponent(this.#config.namespace)}&runner_key=${encodeURIComponent(this.#runnerKey)}`;
685
746
  }
686
747
 
687
748
  // MARK: Runner protocol
@@ -691,14 +752,27 @@ export class Runner {
691
752
  protocols.push(`rivet_token.${this.config.token}`);
692
753
 
693
754
  const WS = await importWebSocket();
755
+
756
+ // Assertion to clear previous WebSocket
757
+ if (
758
+ this.#pegboardWebSocket &&
759
+ (this.#pegboardWebSocket.readyState === WS.CONNECTING ||
760
+ this.#pegboardWebSocket.readyState === WS.OPEN)
761
+ ) {
762
+ this.log?.error(
763
+ "found duplicate pegboardWebSocket, closing previous",
764
+ );
765
+ this.#pegboardWebSocket.close(1000, "duplicate_websocket");
766
+ }
767
+
694
768
  const ws = new WS(this.pegboardUrl, protocols) as any as WebSocket;
695
- this.__pegboardWebSocket = ws;
769
+ this.#pegboardWebSocket = ws;
696
770
 
697
771
  this.log?.info({
698
772
  msg: "connecting",
699
773
  endpoint: this.pegboardEndpoint,
700
774
  namespace: this.#config.namespace,
701
- runnerKey: this.#config.runnerKey,
775
+ runnerKey: this.#runnerKey,
702
776
  hasToken: !!this.config.token,
703
777
  });
704
778
 
@@ -738,10 +812,6 @@ export class Runner {
738
812
  name: this.#config.runnerName,
739
813
  version: this.#config.version,
740
814
  totalSlots: this.#config.totalSlots,
741
- lastCommandIdx:
742
- this.#lastCommandIdx >= 0
743
- ? BigInt(this.#lastCommandIdx)
744
- : null,
745
815
  prepopulateActorNames: new Map(
746
816
  Object.entries(this.#config.prepopulateActorNames).map(
747
817
  ([name, data]) => [
@@ -758,33 +828,22 @@ export class Runner {
758
828
  val: init,
759
829
  });
760
830
 
761
- // Start ping interval
762
- const pingLoop = setInterval(() => {
763
- if (ws.readyState === 1) {
764
- this.__sendToServer({
765
- tag: "ToServerPing",
766
- val: {
767
- ts: BigInt(Date.now()),
768
- },
769
- });
770
- } else {
771
- clearInterval(pingLoop);
772
- this.log?.info({
773
- msg: "WebSocket not open, stopping ping loop",
774
- });
775
- }
776
- }, RUNNER_PING_INTERVAL);
777
- this.#pingLoop = pingLoop;
778
-
779
831
  // Start command acknowledgment interval (5 minutes)
780
832
  const ackInterval = 5 * 60 * 1000; // 5 minutes in milliseconds
781
833
  const ackLoop = setInterval(() => {
782
- if (ws.readyState === 1) {
783
- this.#sendCommandAcknowledgment();
784
- } else {
785
- clearInterval(ackLoop);
786
- this.log?.info({
787
- msg: "WebSocket not open, stopping ack loop",
834
+ try {
835
+ if (ws.readyState === 1) {
836
+ this.#sendCommandAcknowledgment();
837
+ } else {
838
+ clearInterval(ackLoop);
839
+ this.log?.info({
840
+ msg: "WebSocket not open, stopping ack loop",
841
+ });
842
+ }
843
+ } catch (err) {
844
+ this.log?.error({
845
+ msg: "error in command acknowledgment loop",
846
+ error: stringifyError(err),
788
847
  });
789
848
  }
790
849
  }, ackInterval);
@@ -792,88 +851,113 @@ export class Runner {
792
851
  });
793
852
 
794
853
  ws.addEventListener("message", async (ev) => {
795
- let buf: Uint8Array;
796
- if (ev.data instanceof Blob) {
797
- buf = new Uint8Array(await ev.data.arrayBuffer());
798
- } else if (Buffer.isBuffer(ev.data)) {
799
- buf = new Uint8Array(ev.data);
800
- } else {
801
- throw new Error(`expected binary data, got ${typeof ev.data}`);
802
- }
854
+ try {
855
+ if (ws !== this.#pegboardWebSocket) {
856
+ this.log?.debug({
857
+ msg: "ignoring runner message from stale websocket",
858
+ });
859
+ return;
860
+ }
803
861
 
804
- // Parse message
805
- const message = protocol.decodeToClient(buf);
806
- this.log?.debug({
807
- msg: "received runner message",
808
- data: stringifyToClient(message),
809
- });
862
+ let buf: Uint8Array;
863
+ if (ev.data instanceof Blob) {
864
+ buf = new Uint8Array(await ev.data.arrayBuffer());
865
+ } else if (Buffer.isBuffer(ev.data)) {
866
+ buf = new Uint8Array(ev.data);
867
+ } else {
868
+ throw new Error(`expected binary data, got ${typeof ev.data}`);
869
+ }
870
+
871
+ await this.#injectLatency();
810
872
 
811
- // Handle message
812
- if (message.tag === "ToClientInit") {
813
- const init = message.val;
873
+ // Parse message
874
+ const message = protocol.decodeToClient(buf);
875
+ this.log?.debug({
876
+ msg: "received runner message",
877
+ data: stringifyToClient(message),
878
+ });
814
879
 
815
- if (this.runnerId !== init.runnerId) {
816
- this.runnerId = init.runnerId;
880
+ // Handle message
881
+ if (message.tag === "ToClientInit") {
882
+ const init = message.val;
817
883
 
818
- // Clear history if runner id changed
819
- this.#eventHistory.length = 0;
820
- }
884
+ if (this.runnerId !== init.runnerId) {
885
+ this.runnerId = init.runnerId;
821
886
 
822
- // Store the runner lost threshold from metadata
823
- this.#runnerLostThreshold = init.metadata?.runnerLostThreshold
824
- ? Number(init.metadata.runnerLostThreshold)
825
- : undefined;
887
+ // Clear actors if runner id changed
888
+ this.#stopAllActors();
889
+ }
826
890
 
827
- this.log?.info({
828
- msg: "received init",
829
- lastEventIdx: init.lastEventIdx,
830
- runnerLostThreshold: this.#runnerLostThreshold,
831
- });
891
+ this.#protocolMetadata = init.metadata;
832
892
 
833
- // Resend pending events
834
- this.#processUnsentKvRequests();
835
- this.#resendUnacknowledgedEvents(init.lastEventIdx);
836
- this.#tunnel?.resendBufferedEvents();
837
-
838
- this.#config.onConnected();
839
- } else if (message.tag === "ToClientCommands") {
840
- const commands = message.val;
841
- this.#handleCommands(commands);
842
- } else if (message.tag === "ToClientAckEvents") {
843
- this.#handleAckEvents(message.val);
844
- } else if (message.tag === "ToClientKvResponse") {
845
- const kvResponse = message.val;
846
- this.#handleKvResponse(kvResponse);
847
- } else if (message.tag === "ToClientTunnelMessage") {
848
- this.#tunnel?.handleTunnelMessage(message.val);
849
- } else if (message.tag === "ToClientClose") {
850
- this.#tunnel?.shutdown();
851
- ws.close(1000, "manual closure");
852
- } else {
853
- unreachable(message);
893
+ this.log?.info({
894
+ msg: "received init",
895
+ protocolMetadata: this.#protocolMetadata,
896
+ });
897
+
898
+ // Resend pending events
899
+ this.#processUnsentKvRequests();
900
+ this.#resendUnacknowledgedEvents();
901
+ this.#tunnel?.resendBufferedEvents();
902
+
903
+ this.#config.onConnected();
904
+ } else if (message.tag === "ToClientCommands") {
905
+ const commands = message.val;
906
+ this.#handleCommands(commands);
907
+ } else if (message.tag === "ToClientAckEvents") {
908
+ this.#handleAckEvents(message.val);
909
+ } else if (message.tag === "ToClientKvResponse") {
910
+ const kvResponse = message.val;
911
+ this.#handleKvResponse(kvResponse);
912
+ } else if (message.tag === "ToClientTunnelMessage") {
913
+ this.#tunnel?.handleTunnelMessage(message.val).catch((err) => {
914
+ this.log?.error({
915
+ msg: "error handling tunnel message",
916
+ error: stringifyError(err),
917
+ });
918
+ });
919
+ } else if (message.tag === "ToClientPing") {
920
+ this.__sendToServer({
921
+ tag: "ToServerPong",
922
+ val: {
923
+ ts: message.val.ts,
924
+ },
925
+ });
926
+ } else {
927
+ unreachable(message);
928
+ }
929
+ } catch (error) {
930
+ if (this.#shutdown || ws.readyState !== ws.OPEN) {
931
+ this.log?.debug({
932
+ msg: "ignoring runner websocket message during shutdown",
933
+ error: stringifyError(error),
934
+ readyState: ws.readyState,
935
+ });
936
+ return;
937
+ }
938
+
939
+ this.log?.error({
940
+ msg: "failed to decode runner websocket message",
941
+ error: stringifyError(error),
942
+ });
943
+ try {
944
+ ws.close(1011, "runner.invalid_frame");
945
+ } catch (closeError) {
946
+ this.log?.debug({
947
+ msg: "failed closing runner websocket after decode error",
948
+ error: stringifyError(closeError),
949
+ });
950
+ }
854
951
  }
855
952
  });
856
953
 
857
954
  ws.addEventListener("error", (ev) => {
858
955
  this.log?.error({
859
- msg: `WebSocket error: ${ev.error}`,
956
+ msg: `WebSocket error: ${stringifyError(ev.error)}`,
860
957
  });
861
958
 
862
959
  if (!this.#shutdown) {
863
- // Start runner lost timeout if we have a threshold and are not shutting down
864
- if (
865
- !this.#runnerLostTimeout &&
866
- this.#runnerLostThreshold &&
867
- this.#runnerLostThreshold > 0
868
- ) {
869
- this.log?.info({
870
- msg: "starting runner lost timeout",
871
- seconds: this.#runnerLostThreshold / 1000,
872
- });
873
- this.#runnerLostTimeout = setTimeout(() => {
874
- this.#stopAllActors();
875
- }, this.#runnerLostThreshold);
876
- }
960
+ this.#startRunnerLostTimeout();
877
961
 
878
962
  // Attempt to reconnect if not stopped
879
963
  this.#scheduleReconnect();
@@ -881,22 +965,20 @@ export class Runner {
881
965
  });
882
966
 
883
967
  ws.addEventListener("close", async (ev) => {
884
- const closeError = parseWebSocketCloseReason(ev.reason);
885
- if (
886
- closeError?.group === "ws" &&
887
- closeError?.error === "eviction"
888
- ) {
889
- this.log?.info("runner websocket evicted");
890
-
891
- this.#config.onDisconnected(ev.code, ev.reason);
892
-
893
- await this.shutdown(true);
894
- } else {
968
+ if (this.#pegboardWebSocket === ws) {
969
+ this.#pegboardWebSocket = undefined;
970
+ }
971
+ if (!this.#shutdown) {
972
+ const closeError = parseWebSocketCloseReason(ev.reason);
895
973
  if (
896
- closeError?.group === "pegboard" &&
897
- closeError?.error === "runner_shutdown"
974
+ closeError?.group === "ws" &&
975
+ closeError?.error === "eviction"
898
976
  ) {
899
- this.log?.info("runner shutdown");
977
+ this.log?.info("runner websocket evicted");
978
+
979
+ this.#config.onDisconnected(ev.code, ev.reason);
980
+
981
+ await this.shutdown(true);
900
982
  } else {
901
983
  this.log?.warn({
902
984
  msg: "runner disconnected",
@@ -904,45 +986,52 @@ export class Runner {
904
986
  reason: ev.reason.toString(),
905
987
  closeError,
906
988
  });
907
- }
908
989
 
909
- this.#config.onDisconnected(ev.code, ev.reason);
910
- }
911
-
912
- // Clear ping loop on close
913
- if (this.#pingLoop) {
914
- clearInterval(this.#pingLoop);
915
- this.#pingLoop = undefined;
916
- }
917
-
918
- // Clear ack interval on close
919
- if (this.#ackInterval) {
920
- clearInterval(this.#ackInterval);
921
- this.#ackInterval = undefined;
922
- }
990
+ this.#config.onDisconnected(ev.code, ev.reason);
991
+ }
923
992
 
924
- if (!this.#shutdown) {
925
- // Start runner lost timeout if we have a threshold and are not shutting down
926
- if (
927
- !this.#runnerLostTimeout &&
928
- this.#runnerLostThreshold &&
929
- this.#runnerLostThreshold > 0
930
- ) {
931
- this.log?.info({
932
- msg: "starting runner lost timeout",
933
- seconds: this.#runnerLostThreshold / 1000,
934
- });
935
- this.#runnerLostTimeout = setTimeout(() => {
936
- this.#stopAllActors();
937
- }, this.#runnerLostThreshold);
993
+ // Clear ack interval on close
994
+ if (this.#ackInterval) {
995
+ clearInterval(this.#ackInterval);
996
+ this.#ackInterval = undefined;
938
997
  }
939
998
 
999
+ this.#startRunnerLostTimeout();
1000
+
940
1001
  // Attempt to reconnect if not stopped
941
1002
  this.#scheduleReconnect();
1003
+ } else {
1004
+ this.log?.info("websocket closed");
1005
+
1006
+ this.#config.onDisconnected(ev.code, ev.reason);
942
1007
  }
943
1008
  });
944
1009
  }
945
1010
 
1011
+ #startRunnerLostTimeout() {
1012
+ // Start runner lost timeout if we have a threshold and are not shutting down
1013
+ if (
1014
+ !this.#runnerLostTimeout &&
1015
+ this.#protocolMetadata &&
1016
+ this.#protocolMetadata.runnerLostThreshold > 0
1017
+ ) {
1018
+ this.log?.info({
1019
+ msg: "starting runner lost timeout",
1020
+ seconds: this.#protocolMetadata.runnerLostThreshold / 1000n,
1021
+ });
1022
+ this.#runnerLostTimeout = setTimeout(() => {
1023
+ try {
1024
+ this.#handleLost();
1025
+ } catch (err) {
1026
+ this.log?.error({
1027
+ msg: "error handling runner lost",
1028
+ error: stringifyError(err),
1029
+ });
1030
+ }
1031
+ }, Number(this.#protocolMetadata.runnerLostThreshold));
1032
+ }
1033
+ }
1034
+
946
1035
  #handleCommands(commands: protocol.ToClientCommands) {
947
1036
  this.log?.info({
948
1037
  msg: "received commands",
@@ -952,52 +1041,89 @@ export class Runner {
952
1041
  for (const commandWrapper of commands) {
953
1042
  if (commandWrapper.inner.tag === "CommandStartActor") {
954
1043
  // Spawn background promise
955
- this.#handleCommandStartActor(commandWrapper);
1044
+ this.#handleCommandStartActor(commandWrapper).catch((err) => {
1045
+ this.log?.error({
1046
+ msg: "error handling start actor command",
1047
+ actorId: commandWrapper.checkpoint.actorId,
1048
+ error: stringifyError(err),
1049
+ });
1050
+ });
1051
+
1052
+ // NOTE: We don't do this for CommandStopActor because the actor will be removed by that call
1053
+ // so we cant update the checkpoint
1054
+ const actor = this.getActor(
1055
+ commandWrapper.checkpoint.actorId,
1056
+ commandWrapper.checkpoint.generation,
1057
+ );
1058
+ if (actor)
1059
+ actor.lastCommandIdx = commandWrapper.checkpoint.index;
956
1060
  } else if (commandWrapper.inner.tag === "CommandStopActor") {
957
1061
  // Spawn background promise
958
- this.#handleCommandStopActor(commandWrapper);
1062
+ this.#handleCommandStopActor(commandWrapper).catch((err) => {
1063
+ this.log?.error({
1064
+ msg: "error handling stop actor command",
1065
+ actorId: commandWrapper.checkpoint.actorId,
1066
+ error: stringifyError(err),
1067
+ });
1068
+ });
959
1069
  } else {
960
1070
  unreachable(commandWrapper.inner);
961
1071
  }
962
-
963
- this.#lastCommandIdx = Number(commandWrapper.index);
964
1072
  }
965
1073
  }
966
1074
 
967
1075
  #handleAckEvents(ack: protocol.ToClientAckEvents) {
968
- const lastAckedIdx = ack.lastEventIdx;
1076
+ const originalTotalEvents = Array.from(this.#actors).reduce(
1077
+ (s, [_, actor]) => s + actor.eventHistory.length,
1078
+ 0,
1079
+ );
1080
+
1081
+ for (const [_, actor] of this.#actors) {
1082
+ const checkpoint = ack.lastEventCheckpoints.find(
1083
+ (x) => x.actorId == actor.actorId,
1084
+ );
969
1085
 
970
- const originalLength = this.#eventHistory.length;
971
- this.#eventHistory = this.#eventHistory.filter(
972
- (event) => event.index > lastAckedIdx,
1086
+ if (checkpoint) actor.handleAckEvents(checkpoint.index);
1087
+ }
1088
+
1089
+ const totalEvents = Array.from(this.#actors).reduce(
1090
+ (s, [_, actor]) => s + actor.eventHistory.length,
1091
+ 0,
973
1092
  );
1093
+ const prunedCount = originalTotalEvents - totalEvents;
974
1094
 
975
- const prunedCount = originalLength - this.#eventHistory.length;
976
1095
  if (prunedCount > 0) {
977
1096
  this.log?.info({
978
1097
  msg: "pruned acknowledged events",
979
- lastAckedIdx: lastAckedIdx.toString(),
980
1098
  prunedCount,
981
1099
  });
982
1100
  }
983
1101
 
984
- if (this.#eventHistory.length <= EVENT_BACKLOG_WARN_THRESHOLD) {
1102
+ if (totalEvents <= EVENT_BACKLOG_WARN_THRESHOLD) {
985
1103
  this.#eventBacklogWarned = false;
986
1104
  }
987
1105
  }
988
1106
 
989
1107
  /** Track events to send to the server in case we need to resend it on disconnect. */
990
1108
  #recordEvent(eventWrapper: protocol.EventWrapper) {
991
- this.#eventHistory.push(eventWrapper);
1109
+ const actor = this.getActor(eventWrapper.checkpoint.actorId);
1110
+ if (!actor) return;
1111
+
1112
+ actor.recordEvent(eventWrapper);
1113
+
1114
+ const totalEvents = Array.from(this.#actors).reduce(
1115
+ (s, [_, actor]) => s + actor.eventHistory.length,
1116
+ 0,
1117
+ );
992
1118
 
993
1119
  if (
994
- this.#eventHistory.length > EVENT_BACKLOG_WARN_THRESHOLD &&
1120
+ totalEvents > EVENT_BACKLOG_WARN_THRESHOLD &&
995
1121
  !this.#eventBacklogWarned
996
1122
  ) {
997
1123
  this.#eventBacklogWarned = true;
998
1124
  this.log?.warn({
999
1125
  msg: "unacknowledged event backlog exceeds threshold",
1000
- backlogSize: this.#eventHistory.length,
1126
+ backlogSize: totalEvents,
1001
1127
  threshold: EVENT_BACKLOG_WARN_THRESHOLD,
1002
1128
  });
1003
1129
  }
@@ -1013,8 +1139,8 @@ export class Runner {
1013
1139
  const startCommand = commandWrapper.inner
1014
1140
  .val as protocol.CommandStartActor;
1015
1141
 
1016
- const actorId = startCommand.actorId;
1017
- const generation = startCommand.generation;
1142
+ const actorId = commandWrapper.checkpoint.actorId;
1143
+ const generation = commandWrapper.checkpoint.generation;
1018
1144
  const config = startCommand.config;
1019
1145
 
1020
1146
  const actorConfig: ActorConfig = {
@@ -1094,8 +1220,8 @@ export class Runner {
1094
1220
  const stopCommand = commandWrapper.inner
1095
1221
  .val as protocol.CommandStopActor;
1096
1222
 
1097
- const actorId = stopCommand.actorId;
1098
- const generation = stopCommand.generation;
1223
+ const actorId = commandWrapper.checkpoint.actorId;
1224
+ const generation = commandWrapper.checkpoint.generation;
1099
1225
 
1100
1226
  await this.forceStopActor(actorId, generation);
1101
1227
  }
@@ -1105,6 +1231,9 @@ export class Runner {
1105
1231
  generation: number,
1106
1232
  intentType: "sleep" | "stop",
1107
1233
  ) {
1234
+ const actor = this.getActor(actorId, generation);
1235
+ if (!actor) return;
1236
+
1108
1237
  let actorIntent: protocol.ActorIntent;
1109
1238
 
1110
1239
  if (intentType === "sleep") {
@@ -1119,14 +1248,15 @@ export class Runner {
1119
1248
  }
1120
1249
 
1121
1250
  const intentEvent: protocol.EventActorIntent = {
1122
- actorId,
1123
- generation,
1124
1251
  intent: actorIntent,
1125
1252
  };
1126
1253
 
1127
- const eventIndex = this.#nextEventIdx++;
1128
1254
  const eventWrapper: protocol.EventWrapper = {
1129
- index: eventIndex,
1255
+ checkpoint: {
1256
+ actorId,
1257
+ generation,
1258
+ index: actor.nextEventIdx++,
1259
+ },
1130
1260
  inner: {
1131
1261
  tag: "EventActorIntent",
1132
1262
  val: intentEvent,
@@ -1146,6 +1276,9 @@ export class Runner {
1146
1276
  generation: number,
1147
1277
  stateType: "running" | "stopped",
1148
1278
  ) {
1279
+ const actor = this.getActor(actorId, generation);
1280
+ if (!actor) return;
1281
+
1149
1282
  let actorState: protocol.ActorState;
1150
1283
 
1151
1284
  if (stateType === "running") {
@@ -1154,7 +1287,9 @@ export class Runner {
1154
1287
  actorState = {
1155
1288
  tag: "ActorStateStopped",
1156
1289
  val: {
1157
- code: protocol.StopCode.Ok,
1290
+ code: actor.stopIntentSent || this.#draining
1291
+ ? protocol.StopCode.Ok
1292
+ : protocol.StopCode.Error,
1158
1293
  message: null,
1159
1294
  },
1160
1295
  };
@@ -1163,14 +1298,15 @@ export class Runner {
1163
1298
  }
1164
1299
 
1165
1300
  const stateUpdateEvent: protocol.EventActorStateUpdate = {
1166
- actorId,
1167
- generation,
1168
1301
  state: actorState,
1169
1302
  };
1170
1303
 
1171
- const eventIndex = this.#nextEventIdx++;
1172
1304
  const eventWrapper: protocol.EventWrapper = {
1173
- index: eventIndex,
1305
+ checkpoint: {
1306
+ actorId,
1307
+ generation,
1308
+ index: actor.nextEventIdx++,
1309
+ },
1174
1310
  inner: {
1175
1311
  tag: "EventActorStateUpdate",
1176
1312
  val: stateUpdateEvent,
@@ -1186,9 +1322,19 @@ export class Runner {
1186
1322
  }
1187
1323
 
1188
1324
  #sendCommandAcknowledgment() {
1189
- if (this.#lastCommandIdx < 0) {
1190
- // No commands received yet, nothing to acknowledge
1191
- return;
1325
+ const lastCommandCheckpoints = [];
1326
+
1327
+ for (const [_, actor] of this.#actors) {
1328
+ if (actor.lastCommandIdx < 0) {
1329
+ // No commands received yet, nothing to acknowledge
1330
+ continue;
1331
+ }
1332
+
1333
+ lastCommandCheckpoints.push({
1334
+ actorId: actor.actorId,
1335
+ generation: actor.generation,
1336
+ index: actor.lastCommandIdx,
1337
+ });
1192
1338
  }
1193
1339
 
1194
1340
  //this.#log?.log("Sending command acknowledgment", this.#lastCommandIdx);
@@ -1196,7 +1342,7 @@ export class Runner {
1196
1342
  this.__sendToServer({
1197
1343
  tag: "ToServerAckCommands",
1198
1344
  val: {
1199
- lastCommandIdx: BigInt(this.#lastCommandIdx),
1345
+ lastCommandCheckpoints,
1200
1346
  },
1201
1347
  });
1202
1348
  }
@@ -1480,6 +1626,31 @@ export class Runner {
1480
1626
  await this.#sendKvRequest(actorId, requestData);
1481
1627
  }
1482
1628
 
1629
+ async kvDeleteRange(
1630
+ actorId: string,
1631
+ start: Uint8Array,
1632
+ end: Uint8Array,
1633
+ ): Promise<void> {
1634
+ const startKey: protocol.KvKey = start.buffer.slice(
1635
+ start.byteOffset,
1636
+ start.byteOffset + start.byteLength,
1637
+ ) as ArrayBuffer;
1638
+ const endKey: protocol.KvKey = end.buffer.slice(
1639
+ end.byteOffset,
1640
+ end.byteOffset + end.byteLength,
1641
+ ) as ArrayBuffer;
1642
+
1643
+ const requestData: protocol.KvRequestData = {
1644
+ tag: "KvDeleteRangeRequest",
1645
+ val: {
1646
+ start: startKey,
1647
+ end: endKey,
1648
+ },
1649
+ };
1650
+
1651
+ await this.#sendKvRequest(actorId, requestData);
1652
+ }
1653
+
1483
1654
  async kvDrop(actorId: string): Promise<void> {
1484
1655
  const requestData: protocol.KvRequestData = {
1485
1656
  tag: "KvDropRequest",
@@ -1495,14 +1666,15 @@ export class Runner {
1495
1666
  if (!actor) return;
1496
1667
 
1497
1668
  const alarmEvent: protocol.EventActorSetAlarm = {
1498
- actorId,
1499
- generation: actor.generation,
1500
1669
  alarmTs: alarmTs !== null ? BigInt(alarmTs) : null,
1501
1670
  };
1502
1671
 
1503
- const eventIndex = this.#nextEventIdx++;
1504
1672
  const eventWrapper: protocol.EventWrapper = {
1505
- index: eventIndex,
1673
+ checkpoint: {
1674
+ actorId,
1675
+ generation: actor.generation,
1676
+ index: actor.nextEventIdx++,
1677
+ },
1506
1678
  inner: {
1507
1679
  tag: "EventActorSetAlarm",
1508
1680
  val: alarmEvent,
@@ -1540,7 +1712,7 @@ export class Runner {
1540
1712
 
1541
1713
  this.#kvRequests.set(requestId, requestEntry);
1542
1714
 
1543
- if (this.__webSocketReady()) {
1715
+ if (this.getPegboardWebSocketIfReady()) {
1544
1716
  // Send immediately
1545
1717
  this.#sendSingleKvRequest(requestId);
1546
1718
  }
@@ -1573,7 +1745,7 @@ export class Runner {
1573
1745
  }
1574
1746
 
1575
1747
  #processUnsentKvRequests() {
1576
- if (!this.__webSocketReady()) {
1748
+ if (!this.getPegboardWebSocketIfReady()) {
1577
1749
  return;
1578
1750
  }
1579
1751
 
@@ -1590,14 +1762,23 @@ export class Runner {
1590
1762
  }
1591
1763
  }
1592
1764
 
1765
+ /** Resolves after the configured debug latency, or immediately if none. */
1766
+ #injectLatency(): Promise<void> {
1767
+ const ms = this.#config.debugLatencyMs;
1768
+ if (!ms) return Promise.resolve();
1769
+ return new Promise((resolve) => setTimeout(resolve, ms));
1770
+ }
1771
+
1593
1772
  /** Asserts WebSocket exists and is ready. */
1594
- __webSocketReady(): this is this & {
1595
- __pegboardWebSocket: NonNullable<Runner["__pegboardWebSocket"]>;
1596
- } {
1597
- return (
1598
- !!this.__pegboardWebSocket &&
1599
- this.__pegboardWebSocket.readyState === 1
1600
- );
1773
+ getPegboardWebSocketIfReady(): WebSocket | undefined {
1774
+ if (
1775
+ !!this.#pegboardWebSocket &&
1776
+ this.#pegboardWebSocket.readyState === 1
1777
+ ) {
1778
+ return this.#pegboardWebSocket;
1779
+ } else {
1780
+ return undefined;
1781
+ }
1601
1782
  }
1602
1783
 
1603
1784
  __sendToServer(message: protocol.ToServer) {
@@ -1607,13 +1788,19 @@ export class Runner {
1607
1788
  });
1608
1789
 
1609
1790
  const encoded = protocol.encodeToServer(message);
1610
- if (this.__webSocketReady()) {
1611
- this.__pegboardWebSocket.send(encoded);
1612
- } else {
1613
- this.log?.error({
1614
- msg: "WebSocket not available or not open for sending data",
1615
- });
1616
- }
1791
+
1792
+ // Normally synchronous. When debugLatencyMs is set, the send is
1793
+ // deferred but message order is preserved.
1794
+ this.#injectLatency().then(() => {
1795
+ const pegboardWebSocket = this.getPegboardWebSocketIfReady();
1796
+ if (pegboardWebSocket) {
1797
+ pegboardWebSocket.send(encoded);
1798
+ } else {
1799
+ this.log?.error({
1800
+ msg: "WebSocket not available or not open for sending data",
1801
+ });
1802
+ }
1803
+ });
1617
1804
  }
1618
1805
 
1619
1806
  sendHibernatableWebSocketMessageAck(
@@ -1669,6 +1856,7 @@ export class Runner {
1669
1856
  tag: "ToServerlessServerInit",
1670
1857
  val: {
1671
1858
  runnerId: this.runnerId,
1859
+ runnerProtocolVersion: PROTOCOL_VERSION,
1672
1860
  },
1673
1861
  });
1674
1862
 
@@ -1699,27 +1887,41 @@ export class Runner {
1699
1887
  msg: `Scheduling reconnect attempt ${this.#reconnectAttempt + 1} in ${delay}ms`,
1700
1888
  });
1701
1889
 
1702
- this.#reconnectTimeout = setTimeout(async () => {
1890
+ if (this.#reconnectTimeout) {
1891
+ this.log?.info(
1892
+ "clearing previous reconnect timeout in schedule reconnect",
1893
+ );
1894
+ clearTimeout(this.#reconnectTimeout);
1895
+ }
1896
+
1897
+ this.#reconnectTimeout = setTimeout(() => {
1703
1898
  if (!this.#shutdown) {
1704
1899
  this.#reconnectAttempt++;
1705
1900
  this.log?.debug({
1706
1901
  msg: `Attempting to reconnect (attempt ${this.#reconnectAttempt})...`,
1707
1902
  });
1708
- await this.#openPegboardWebSocket();
1903
+ this.#openPegboardWebSocket().catch((err) => {
1904
+ this.log?.error({
1905
+ msg: "error during websocket reconnection",
1906
+ error: stringifyError(err),
1907
+ });
1908
+ });
1709
1909
  }
1710
1910
  }, delay);
1711
1911
  }
1712
1912
 
1713
- #resendUnacknowledgedEvents(lastEventIdx: bigint) {
1714
- const eventsToResend = this.#eventHistory.filter(
1715
- (event) => event.index > lastEventIdx,
1716
- );
1913
+ #resendUnacknowledgedEvents() {
1914
+ const eventsToResend = [];
1915
+
1916
+ for (const [_, actor] of this.#actors) {
1917
+ eventsToResend.push(...actor.eventHistory);
1918
+ }
1717
1919
 
1718
1920
  if (eventsToResend.length === 0) return;
1719
1921
 
1720
1922
  this.log?.info({
1721
1923
  msg: "resending unacknowledged events",
1722
- fromIndex: lastEventIdx + 1n,
1924
+ count: eventsToResend.length,
1723
1925
  });
1724
1926
 
1725
1927
  // Resend events in batches
@@ -1752,4 +1954,8 @@ export class Runner {
1752
1954
  //this.#log?.log(`Cleaned up ${toDelete.length} expired KV requests`);
1753
1955
  }
1754
1956
  }
1957
+
1958
+ getProtocolMetadata(): protocol.ProtocolMetadata | undefined {
1959
+ return this.#protocolMetadata;
1960
+ }
1755
1961
  }