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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1038) hide show
  1. package/CLAUDE.md +38 -0
  2. package/artifacts/config-schema.json +1140 -0
  3. package/artifacts/errors/actor.kv_storage_quota_exceeded.json +5 -0
  4. package/artifacts/errors/actor.no_runner_config_configured.json +5 -0
  5. package/artifacts/errors/guard.actor_runner_failed.json +5 -0
  6. package/artifacts/errors/guard.invalid_request.json +5 -0
  7. package/artifacts/errors/guard.invalid_request_body.json +5 -0
  8. package/artifacts/errors/guard.invalid_response_body.json +5 -0
  9. package/artifacts/errors/guard.missing_query_parameter.json +5 -0
  10. package/artifacts/errors/guard.query_ambiguous_runner_configs.json +5 -0
  11. package/artifacts/errors/guard.query_duplicate_param.json +5 -0
  12. package/artifacts/errors/guard.query_empty_actor_name.json +5 -0
  13. package/artifacts/errors/guard.query_get_disallowed_params.json +5 -0
  14. package/artifacts/errors/guard.query_invalid_base64_input.json +5 -0
  15. package/artifacts/errors/guard.query_invalid_cbor_input.json +5 -0
  16. package/artifacts/errors/guard.query_invalid_params.json +5 -0
  17. package/artifacts/errors/guard.query_invalid_percent_encoding.json +5 -0
  18. package/artifacts/errors/guard.query_missing_runner_name.json +5 -0
  19. package/artifacts/errors/guard.query_no_runner_configs.json +5 -0
  20. package/artifacts/errors/guard.query_param_missing_equals.json +5 -0
  21. package/artifacts/errors/guard.query_path_token_syntax.json +5 -0
  22. package/artifacts/errors/guard.query_unknown_param.json +5 -0
  23. package/artifacts/errors/guard.request_body_too_large.json +5 -0
  24. package/artifacts/errors/guard.response_body_too_large.json +5 -0
  25. package/artifacts/errors/serverless_runner_pool.failed_to_fetch_metadata.json +5 -0
  26. package/artifacts/errors/serverless_runner_pool.not_found.json +5 -0
  27. package/artifacts/errors/{api.rate_limited.json → test.api_rate_limited.json} +2 -2
  28. package/artifacts/errors/{namespace.invalid_name.json → test.namespace_invalid_name.json} +2 -2
  29. package/artifacts/errors/ws.going_away.json +5 -0
  30. package/artifacts/openapi.json +458 -6
  31. package/docker/builder-base/linux-gnu.Dockerfile +21 -0
  32. package/docker/builder-base/linux-musl.Dockerfile +53 -0
  33. package/docker/builder-base/osxcross.Dockerfile +42 -0
  34. package/docker/builder-base/windows-mingw.Dockerfile +41 -0
  35. package/docker/builder-base/windows-msvc.Dockerfile +25 -0
  36. package/docker/dev/docker-compose.yml +43 -18
  37. package/docker/dev/grafana/dashboards/api.json +1077 -1239
  38. package/docker/dev/grafana/dashboards/cache.json +911 -1074
  39. package/docker/dev/grafana/dashboards/epoxy.json +1606 -0
  40. package/docker/dev/grafana/dashboards/futures.json +242 -229
  41. package/docker/dev/grafana/dashboards/gasoline.json +2663 -2476
  42. package/docker/dev/grafana/dashboards/guard.json +1433 -1273
  43. package/docker/dev/grafana/dashboards/operation.json +871 -0
  44. package/docker/dev/grafana/dashboards/pegboard.json +1274 -0
  45. package/docker/dev/grafana/dashboards/tokio.json +930 -1004
  46. package/docker/dev/grafana/dashboards/traces.json +35 -13
  47. package/docker/dev/grafana/provisioning/datasources/datasources.yaml +8 -0
  48. package/docker/{dev-multinode/otel-collector-server → dev/otel-collector}/config.yaml +18 -13
  49. package/docker/dev/prometheus/prometheus.yml +4 -0
  50. package/docker/dev/rivet-engine/config.jsonc +9 -16
  51. package/docker/dev-host/docker-compose.yml +38 -16
  52. package/docker/dev-host/grafana/dashboards/api.json +1077 -1239
  53. package/docker/dev-host/grafana/dashboards/cache.json +911 -1074
  54. package/docker/dev-host/grafana/dashboards/epoxy.json +1606 -0
  55. package/docker/dev-host/grafana/dashboards/futures.json +242 -229
  56. package/docker/dev-host/grafana/dashboards/gasoline.json +2663 -2476
  57. package/docker/dev-host/grafana/dashboards/guard.json +1433 -1273
  58. package/docker/dev-host/grafana/dashboards/operation.json +871 -0
  59. package/docker/dev-host/grafana/dashboards/pegboard.json +1274 -0
  60. package/docker/dev-host/grafana/dashboards/tokio.json +930 -1004
  61. package/docker/dev-host/grafana/dashboards/traces.json +35 -13
  62. package/docker/dev-host/grafana/provisioning/datasources/datasources.yaml +8 -0
  63. package/docker/dev-host/{otel-collector-server → otel-collector}/config.yaml +18 -13
  64. package/docker/dev-host/prometheus/prometheus.yml +4 -0
  65. package/docker/dev-host/rivet-engine/config.jsonc +9 -16
  66. package/docker/dev-multidc/core/grafana/dashboards/api.json +1077 -1239
  67. package/docker/dev-multidc/core/grafana/dashboards/cache.json +911 -1074
  68. package/docker/dev-multidc/core/grafana/dashboards/epoxy.json +1606 -0
  69. package/docker/dev-multidc/core/grafana/dashboards/futures.json +242 -229
  70. package/docker/dev-multidc/core/grafana/dashboards/gasoline.json +2663 -2476
  71. package/docker/dev-multidc/core/grafana/dashboards/guard.json +1433 -1273
  72. package/docker/dev-multidc/core/grafana/dashboards/operation.json +871 -0
  73. package/docker/dev-multidc/core/grafana/dashboards/pegboard.json +1274 -0
  74. package/docker/dev-multidc/core/grafana/dashboards/tokio.json +930 -1004
  75. package/docker/dev-multidc/core/grafana/dashboards/traces.json +35 -13
  76. package/docker/dev-multidc/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  77. package/docker/dev-multidc/core/prometheus/prometheus.yml +4 -0
  78. package/docker/dev-multidc/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +18 -13
  79. package/docker/dev-multidc/datacenters/dc-a/rivet-engine/config.jsonc +23 -22
  80. package/docker/{dev-multidc-multinode/datacenters/dc-b/otel-collector-server → dev-multidc/datacenters/dc-b/otel-collector}/config.yaml +18 -13
  81. package/docker/dev-multidc/datacenters/dc-b/rivet-engine/config.jsonc +23 -22
  82. package/docker/dev-multidc/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +18 -13
  83. package/docker/dev-multidc/datacenters/dc-c/rivet-engine/config.jsonc +23 -22
  84. package/docker/dev-multidc/docker-compose.yml +71 -64
  85. package/docker/dev-multidc-multinode/core/grafana/dashboards/api.json +1077 -1239
  86. package/docker/dev-multidc-multinode/core/grafana/dashboards/cache.json +911 -1074
  87. package/docker/dev-multidc-multinode/core/grafana/dashboards/epoxy.json +1606 -0
  88. package/docker/dev-multidc-multinode/core/grafana/dashboards/futures.json +242 -229
  89. package/docker/dev-multidc-multinode/core/grafana/dashboards/gasoline.json +2663 -2476
  90. package/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json +1433 -1273
  91. package/docker/dev-multidc-multinode/core/grafana/dashboards/operation.json +871 -0
  92. package/docker/dev-multidc-multinode/core/grafana/dashboards/pegboard.json +1274 -0
  93. package/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json +930 -1004
  94. package/docker/dev-multidc-multinode/core/grafana/dashboards/traces.json +35 -13
  95. package/docker/dev-multidc-multinode/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  96. package/docker/dev-multidc-multinode/core/prometheus/prometheus.yml +4 -0
  97. package/docker/dev-multidc-multinode/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +28 -13
  98. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/0/config.jsonc +23 -22
  99. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/1/config.jsonc +23 -22
  100. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/2/config.jsonc +23 -22
  101. package/docker/{dev-multidc/datacenters/dc-b/otel-collector-server → dev-multidc-multinode/datacenters/dc-b/otel-collector}/config.yaml +28 -13
  102. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/0/config.jsonc +23 -22
  103. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/1/config.jsonc +23 -22
  104. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/2/config.jsonc +23 -22
  105. package/docker/dev-multidc-multinode/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +28 -13
  106. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/0/config.jsonc +23 -22
  107. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/1/config.jsonc +23 -22
  108. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/2/config.jsonc +23 -22
  109. package/docker/dev-multidc-multinode/docker-compose.yml +113 -88
  110. package/docker/dev-multinode/docker-compose.yml +57 -26
  111. package/docker/dev-multinode/grafana/dashboards/api.json +1077 -1239
  112. package/docker/dev-multinode/grafana/dashboards/cache.json +911 -1074
  113. package/docker/dev-multinode/grafana/dashboards/epoxy.json +1606 -0
  114. package/docker/dev-multinode/grafana/dashboards/futures.json +242 -229
  115. package/docker/dev-multinode/grafana/dashboards/gasoline.json +2663 -2476
  116. package/docker/dev-multinode/grafana/dashboards/guard.json +1433 -1273
  117. package/docker/dev-multinode/grafana/dashboards/operation.json +871 -0
  118. package/docker/dev-multinode/grafana/dashboards/pegboard.json +1274 -0
  119. package/docker/dev-multinode/grafana/dashboards/tokio.json +930 -1004
  120. package/docker/dev-multinode/grafana/dashboards/traces.json +35 -13
  121. package/docker/dev-multinode/grafana/provisioning/datasources/datasources.yaml +8 -0
  122. package/docker/{dev/otel-collector-server → dev-multinode/otel-collector}/config.yaml +28 -13
  123. package/docker/dev-multinode/prometheus/prometheus.yml +4 -0
  124. package/docker/dev-multinode/rivet-engine/0/config.jsonc +9 -16
  125. package/docker/dev-multinode/rivet-engine/1/config.jsonc +9 -16
  126. package/docker/dev-multinode/rivet-engine/2/config.jsonc +9 -16
  127. package/docker/engine/linux-aarch64.Dockerfile +9 -49
  128. package/docker/engine/linux-x86_64.Dockerfile +7 -57
  129. package/docker/engine/macos-aarch64.Dockerfile +8 -54
  130. package/docker/engine/macos-x86_64.Dockerfile +9 -55
  131. package/docker/engine/windows.Dockerfile +5 -53
  132. package/docker/template/grafana-dashboards/api.json +1077 -1239
  133. package/docker/template/grafana-dashboards/cache.json +911 -1074
  134. package/docker/template/grafana-dashboards/epoxy.json +1606 -0
  135. package/docker/template/grafana-dashboards/futures.json +242 -229
  136. package/docker/template/grafana-dashboards/gasoline.json +2663 -2476
  137. package/docker/template/grafana-dashboards/guard.json +1433 -1273
  138. package/docker/template/grafana-dashboards/operation.json +871 -0
  139. package/docker/template/grafana-dashboards/pegboard.json +1274 -0
  140. package/docker/template/grafana-dashboards/tokio.json +930 -1004
  141. package/docker/template/grafana-dashboards/traces.json +35 -13
  142. package/docker/template/node_modules/.bin/js-yaml +4 -4
  143. package/docker/template/node_modules/.bin/tsc +4 -4
  144. package/docker/template/node_modules/.bin/tsserver +4 -4
  145. package/docker/template/node_modules/.bin/tsx +4 -4
  146. package/docker/template/src/docker-compose.ts +42 -29
  147. package/docker/template/src/main.ts +4 -4
  148. package/docker/template/src/services/core/grafana.ts +14 -1
  149. package/docker/template/src/services/core/prometheus.ts +20 -0
  150. package/docker/template/src/services/edge/{otel-collector-server.ts → otel-collector.ts} +55 -24
  151. package/docker/template/src/services/edge/rivet-engine.ts +4 -16
  152. package/docker/template/src/services/edge/runner.ts +2 -3
  153. package/docker/universal/Dockerfile +5 -3
  154. package/package.json +2 -5
  155. package/packages/api-builder/src/global_context.rs +1 -1
  156. package/packages/api-builder/src/metrics.rs +28 -24
  157. package/packages/api-builder/src/middleware.rs +30 -48
  158. package/packages/api-builder/src/router.rs +13 -1
  159. package/packages/api-peer/Cargo.toml +7 -9
  160. package/packages/api-peer/src/actors/delete.rs +56 -57
  161. package/packages/api-peer/src/actors/get_or_create.rs +139 -0
  162. package/packages/api-peer/src/actors/kv_get.rs +40 -28
  163. package/packages/api-peer/src/actors/list.rs +31 -14
  164. package/packages/api-peer/src/actors/list_names.rs +6 -6
  165. package/packages/api-peer/src/actors/mod.rs +3 -0
  166. package/packages/api-peer/src/actors/reschedule.rs +55 -0
  167. package/packages/api-peer/src/actors/sleep.rs +55 -0
  168. package/packages/api-peer/src/envoys.rs +57 -0
  169. package/packages/api-peer/src/internal.rs +441 -24
  170. package/packages/api-peer/src/lib.rs +2 -1
  171. package/packages/api-peer/src/namespaces.rs +24 -9
  172. package/packages/api-peer/src/router.rs +31 -7
  173. package/packages/api-peer/src/runner_configs.rs +66 -19
  174. package/packages/api-peer/src/runners.rs +30 -32
  175. package/packages/api-public/Cargo.toml +2 -0
  176. package/packages/api-public/src/actors/create.rs +8 -17
  177. package/packages/api-public/src/actors/delete.rs +11 -35
  178. package/packages/api-public/src/actors/get_or_create.rs +23 -95
  179. package/packages/api-public/src/actors/kv_get.rs +12 -29
  180. package/packages/api-public/src/actors/list.rs +56 -78
  181. package/packages/api-public/src/actors/list_names.rs +15 -14
  182. package/packages/api-public/src/actors/mod.rs +2 -0
  183. package/packages/api-public/src/actors/reschedule.rs +65 -0
  184. package/packages/api-public/src/actors/sleep.rs +64 -0
  185. package/packages/api-public/src/actors/utils.rs +12 -60
  186. package/packages/api-public/src/ctx.rs +14 -6
  187. package/packages/api-public/src/datacenters.rs +5 -5
  188. package/packages/api-public/src/envoys.rs +57 -0
  189. package/packages/api-public/src/errors.rs +0 -7
  190. package/packages/api-public/src/health.rs +51 -44
  191. package/packages/api-public/src/lib.rs +2 -1
  192. package/packages/api-public/src/metadata.rs +44 -14
  193. package/packages/api-public/src/namespaces.rs +11 -11
  194. package/packages/api-public/src/router.rs +22 -5
  195. package/packages/api-public/src/runner_configs/delete.rs +13 -10
  196. package/packages/api-public/src/runner_configs/list.rs +5 -2
  197. package/packages/api-public/src/runner_configs/refresh_metadata.rs +1 -1
  198. package/packages/api-public/src/runner_configs/serverless_health_check.rs +2 -2
  199. package/packages/api-public/src/runner_configs/upsert.rs +12 -9
  200. package/packages/api-public/src/runner_configs/utils.rs +35 -175
  201. package/packages/api-public/src/runners.rs +17 -45
  202. package/packages/{dump-openapi → api-public-openapi-gen}/Cargo.toml +1 -1
  203. package/packages/api-types/src/actors/create.rs +1 -0
  204. package/packages/api-types/src/actors/delete.rs +20 -0
  205. package/packages/api-types/src/actors/get_or_create.rs +30 -0
  206. package/packages/api-types/src/actors/kv_get.rs +25 -0
  207. package/packages/api-types/src/actors/list.rs +8 -1
  208. package/packages/api-types/src/actors/mod.rs +5 -0
  209. package/packages/api-types/src/actors/reschedule.rs +26 -0
  210. package/packages/api-types/src/actors/sleep.rs +26 -0
  211. package/packages/api-types/src/datacenters/list.rs +2 -2
  212. package/packages/api-types/src/envoys/list.rs +24 -0
  213. package/packages/api-types/src/envoys/mod.rs +1 -0
  214. package/packages/api-types/src/lib.rs +1 -0
  215. package/packages/api-types/src/namespaces/list.rs +4 -0
  216. package/packages/api-types/src/namespaces/runner_configs.rs +23 -2
  217. package/packages/api-types/src/runner_configs/list.rs +6 -1
  218. package/packages/api-types/src/runner_configs/mod.rs +12 -0
  219. package/packages/api-types/src/runners/list.rs +4 -0
  220. package/packages/api-types/src/runners/list_names.rs +21 -0
  221. package/packages/api-types/src/runners/mod.rs +1 -0
  222. package/packages/api-util/src/lib.rs +44 -21
  223. package/packages/bootstrap/Cargo.toml +7 -4
  224. package/packages/bootstrap/src/backfill.rs +53 -0
  225. package/packages/bootstrap/src/lib.rs +43 -7
  226. package/packages/cache/Cargo.toml +3 -1
  227. package/packages/cache/src/driver.rs +43 -151
  228. package/packages/cache/src/getter_ctx.rs +48 -70
  229. package/packages/cache/src/inner.rs +28 -18
  230. package/packages/cache/src/key.rs +17 -3
  231. package/packages/cache/src/lib.rs +0 -2
  232. package/packages/cache/src/metrics.rs +43 -31
  233. package/packages/cache/src/req_config.rs +219 -156
  234. package/packages/cache/tests/fetch.rs +91 -0
  235. package/packages/cache/tests/in_flight.rs +361 -0
  236. package/packages/cache/tests/ttl.rs +314 -0
  237. package/packages/cache-purge/src/lib.rs +1 -1
  238. package/packages/config/Cargo.toml +1 -0
  239. package/packages/config/src/config/cache.rs +10 -3
  240. package/packages/config/src/config/clickhouse.rs +0 -30
  241. package/packages/config/src/config/{db.rs → db/mod.rs} +3 -18
  242. package/packages/config/src/config/db/postgres.rs +59 -0
  243. package/packages/config/src/config/guard.rs +19 -0
  244. package/packages/config/src/config/metrics.rs +22 -0
  245. package/packages/config/src/config/mod.rs +44 -10
  246. package/packages/config/src/config/pegboard.rs +242 -16
  247. package/packages/config/src/config/pubsub.rs +11 -0
  248. package/packages/config/src/config/runtime.rs +58 -0
  249. package/packages/config/src/config/telemetry.rs +1 -0
  250. package/packages/config/src/config/topology.rs +78 -19
  251. package/packages/config/src/defaults.rs +3 -0
  252. package/packages/config/src/lib.rs +10 -1
  253. package/packages/config-schema-gen/Cargo.toml +11 -0
  254. package/packages/config-schema-gen/build.rs +26 -0
  255. package/packages/config-schema-gen/src/lib.rs +2 -0
  256. package/packages/engine/Cargo.toml +11 -2
  257. package/packages/engine/src/commands/db/mod.rs +0 -10
  258. package/packages/engine/src/commands/epoxy.rs +395 -0
  259. package/packages/engine/src/commands/mod.rs +1 -1
  260. package/packages/engine/src/commands/start.rs +43 -63
  261. package/packages/engine/src/commands/udb/cli.rs +148 -4
  262. package/packages/engine/src/commands/wf/mod.rs +83 -12
  263. package/packages/engine/src/commands/wf/signal.rs +38 -0
  264. package/packages/engine/src/lib.rs +6 -3
  265. package/packages/engine/src/main.rs +1 -1
  266. package/packages/engine/src/run_config.rs +6 -7
  267. package/packages/engine/src/util/db.rs +1 -25
  268. package/packages/engine/src/util/wf/mod.rs +39 -5
  269. package/packages/engine/tests/common/actors.rs +50 -332
  270. package/packages/engine/tests/common/api/mod.rs +7 -0
  271. package/packages/engine/tests/common/api/peer.rs +364 -0
  272. package/packages/engine/tests/common/api/public.rs +473 -0
  273. package/packages/engine/tests/common/ctx.rs +15 -3
  274. package/packages/engine/tests/common/mod.rs +8 -5
  275. package/packages/engine/tests/common/test_envoy.rs +87 -0
  276. package/packages/engine/tests/common/test_helpers.rs +218 -130
  277. package/packages/engine/tests/common/test_runner.rs +273 -0
  278. package/packages/engine/tests/envoy/actors_lifecycle.rs +1277 -0
  279. package/packages/engine/tests/envoy/mod.rs +1 -0
  280. package/packages/engine/tests/mod.rs +3 -0
  281. package/packages/engine/tests/runner/actors_alarm.rs +1453 -0
  282. package/packages/engine/tests/runner/actors_kv_crud.rs +996 -0
  283. package/packages/engine/tests/runner/actors_kv_delete_range.rs +126 -0
  284. package/packages/engine/tests/runner/actors_kv_drop.rs +255 -0
  285. package/packages/engine/tests/runner/actors_kv_list.rs +1061 -0
  286. package/packages/engine/tests/runner/actors_kv_misc.rs +882 -0
  287. package/packages/engine/tests/runner/actors_lifecycle.rs +1284 -0
  288. package/packages/engine/tests/runner/actors_scheduling_errors.rs +1005 -0
  289. package/packages/engine/tests/runner/api_actors_create.rs +422 -0
  290. package/packages/engine/tests/runner/api_actors_delete.rs +487 -0
  291. package/packages/engine/tests/runner/api_actors_get_or_create.rs +634 -0
  292. package/packages/engine/tests/runner/api_actors_list.rs +1771 -0
  293. package/packages/engine/tests/runner/api_actors_list_names.rs +691 -0
  294. package/packages/engine/tests/runner/api_namespaces_create.rs +428 -0
  295. package/packages/engine/tests/runner/api_namespaces_list.rs +760 -0
  296. package/packages/engine/tests/runner/api_runner_configs_list.rs +646 -0
  297. package/packages/engine/tests/runner/api_runner_configs_upsert.rs +651 -0
  298. package/packages/engine/tests/runner/api_runners_list.rs +166 -0
  299. package/packages/engine/tests/runner/api_runners_list_names.rs +386 -0
  300. package/packages/engine/tests/runner/mod.rs +20 -0
  301. package/packages/engine/tests/runner/runner_drain_on_version.rs +620 -0
  302. package/packages/env/Cargo.toml +0 -4
  303. package/packages/env/src/lib.rs +0 -18
  304. package/packages/epoxy/Cargo.toml +3 -2
  305. package/packages/epoxy/README.md +554 -93
  306. package/packages/epoxy/src/consts.rs +4 -36
  307. package/packages/epoxy/src/http_client.rs +59 -26
  308. package/packages/epoxy/src/http_routes.rs +73 -10
  309. package/packages/epoxy/src/keys/keys.rs +260 -11
  310. package/packages/epoxy/src/keys/mod.rs +11 -1
  311. package/packages/epoxy/src/keys/replica.rs +5 -260
  312. package/packages/epoxy/src/lib.rs +2 -1
  313. package/packages/epoxy/src/metrics.rs +118 -0
  314. package/packages/epoxy/src/ops/kv/get_local.rs +15 -24
  315. package/packages/epoxy/src/ops/kv/get_optimistic.rs +102 -64
  316. package/packages/epoxy/src/ops/kv/mod.rs +1 -0
  317. package/packages/epoxy/src/ops/kv/purge_local.rs +18 -9
  318. package/packages/epoxy/src/ops/kv/read_value.rs +92 -0
  319. package/packages/epoxy/src/ops/mod.rs +0 -1
  320. package/packages/epoxy/src/ops/propose.rs +1079 -194
  321. package/packages/epoxy/src/replica/ballot.rs +162 -102
  322. package/packages/epoxy/src/replica/changelog.rs +147 -0
  323. package/packages/epoxy/src/replica/commit_kv.rs +69 -66
  324. package/packages/epoxy/src/replica/message_request.rs +33 -48
  325. package/packages/epoxy/src/replica/messages/accept.rs +82 -41
  326. package/packages/epoxy/src/replica/messages/commit.rs +21 -33
  327. package/packages/epoxy/src/replica/messages/mod.rs +0 -8
  328. package/packages/epoxy/src/replica/messages/prepare.rs +68 -69
  329. package/packages/epoxy/src/replica/mod.rs +1 -6
  330. package/packages/epoxy/src/replica/update_config.rs +3 -1
  331. package/packages/epoxy/src/types.rs +30 -54
  332. package/packages/epoxy/src/utils.rs +149 -16
  333. package/packages/epoxy/src/workflows/backfill.rs +233 -0
  334. package/packages/epoxy/src/workflows/coordinator/mod.rs +33 -7
  335. package/packages/epoxy/src/workflows/coordinator/reconfigure.rs +44 -0
  336. package/packages/epoxy/src/workflows/coordinator/replica_status_change.rs +4 -3
  337. package/packages/epoxy/src/workflows/mod.rs +1 -1
  338. package/packages/epoxy/src/workflows/replica/mod.rs +4 -6
  339. package/packages/epoxy/src/workflows/replica/setup.rs +130 -771
  340. package/packages/epoxy/tests/backfill.rs +65 -0
  341. package/packages/epoxy/tests/backfill_snapshot.rs +233 -0
  342. package/packages/epoxy/tests/common/mod.rs +77 -21
  343. package/packages/epoxy/tests/common/utils.rs +366 -10
  344. package/packages/epoxy/tests/consensus_regressions.rs +285 -0
  345. package/packages/epoxy/tests/kv.rs +128 -167
  346. package/packages/epoxy/tests/kv_get_optimistic.rs +257 -157
  347. package/packages/epoxy/tests/migration.rs +75 -0
  348. package/packages/epoxy/tests/proposal.rs +133 -28
  349. package/packages/epoxy/tests/reconfigure.rs +92 -474
  350. package/packages/error/tests/basic.rs +8 -8
  351. package/packages/gasoline/Cargo.toml +1 -0
  352. package/packages/gasoline/src/builder/common/message.rs +19 -47
  353. package/packages/gasoline/src/builder/common/signal.rs +37 -21
  354. package/packages/gasoline/src/builder/common/workflow.rs +19 -15
  355. package/packages/gasoline/src/builder/workflow/lupe.rs +295 -0
  356. package/packages/gasoline/src/builder/workflow/message.rs +24 -47
  357. package/packages/gasoline/src/builder/workflow/mod.rs +1 -0
  358. package/packages/gasoline/src/builder/workflow/signal.rs +68 -22
  359. package/packages/gasoline/src/builder/workflow/sub_workflow.rs +6 -15
  360. package/packages/gasoline/src/ctx/activity.rs +46 -6
  361. package/packages/gasoline/src/ctx/common.rs +26 -23
  362. package/packages/gasoline/src/ctx/listen.rs +33 -50
  363. package/packages/gasoline/src/ctx/message.rs +76 -64
  364. package/packages/gasoline/src/ctx/operation.rs +15 -5
  365. package/packages/gasoline/src/ctx/standalone.rs +32 -4
  366. package/packages/gasoline/src/ctx/test.rs +31 -6
  367. package/packages/gasoline/src/ctx/versioned_workflow.rs +33 -7
  368. package/packages/gasoline/src/ctx/workflow.rs +194 -384
  369. package/packages/gasoline/src/db/debug.rs +49 -9
  370. package/packages/gasoline/src/db/kv/debug.rs +905 -15
  371. package/packages/gasoline/src/db/kv/keys/history.rs +434 -9
  372. package/packages/gasoline/src/db/kv/keys/metric.rs +70 -47
  373. package/packages/gasoline/src/db/kv/keys/signal.rs +19 -3
  374. package/packages/gasoline/src/db/kv/keys/workflow.rs +349 -3
  375. package/packages/gasoline/src/db/kv/mod.rs +975 -514
  376. package/packages/gasoline/src/db/kv/system.rs +155 -18
  377. package/packages/gasoline/src/db/mod.rs +29 -7
  378. package/packages/gasoline/src/error.rs +26 -21
  379. package/packages/gasoline/src/executable.rs +3 -1
  380. package/packages/gasoline/src/history/cursor.rs +436 -336
  381. package/packages/gasoline/src/history/event.rs +24 -15
  382. package/packages/gasoline/src/listen.rs +2 -14
  383. package/packages/gasoline/src/message.rs +1 -1
  384. package/packages/gasoline/src/metrics.rs +260 -143
  385. package/packages/gasoline/src/prelude.rs +1 -1
  386. package/packages/gasoline/src/registry.rs +6 -2
  387. package/packages/gasoline/src/signal.rs +34 -31
  388. package/packages/gasoline/src/utils/mod.rs +1 -18
  389. package/packages/gasoline/src/utils/topic.rs +35 -0
  390. package/packages/gasoline/src/worker.rs +71 -14
  391. package/packages/gasoline/src/workflow.rs +13 -0
  392. package/packages/gasoline/tests/workflows/eviction_test.rs +2 -2
  393. package/packages/gasoline-macros/src/lib.rs +74 -12
  394. package/packages/gasoline-runtime/Cargo.toml +18 -0
  395. package/packages/gasoline-runtime/src/lib.rs +12 -0
  396. package/packages/gasoline-runtime/src/workflows/mod.rs +1 -0
  397. package/packages/gasoline-runtime/src/workflows/pruner.rs +55 -0
  398. package/packages/guard/Cargo.toml +16 -8
  399. package/packages/guard/src/cache/mod.rs +63 -43
  400. package/packages/guard/src/cache/pegboard_gateway.rs +144 -0
  401. package/packages/guard/src/errors.rs +105 -0
  402. package/packages/guard/src/lib.rs +5 -15
  403. package/packages/guard/src/metrics.rs +12 -0
  404. package/packages/guard/src/routing/actor_path.rs +409 -0
  405. package/packages/guard/src/routing/api_public.rs +6 -14
  406. package/packages/guard/src/routing/envoy.rs +98 -0
  407. package/packages/guard/src/routing/mod.rs +152 -206
  408. package/packages/guard/src/routing/pegboard_gateway/mod.rs +572 -0
  409. package/packages/guard/src/routing/pegboard_gateway/resolve_actor_query.rs +236 -0
  410. package/packages/guard/src/routing/runner.rs +24 -54
  411. package/packages/guard/src/routing/ws_health.rs +61 -0
  412. package/packages/guard/src/shared_state.rs +11 -2
  413. package/packages/guard/tests/parse_actor_path.rs +418 -165
  414. package/packages/guard-core/Cargo.toml +3 -10
  415. package/packages/guard-core/src/custom_serve.rs +4 -10
  416. package/packages/guard-core/src/errors.rs +20 -4
  417. package/packages/guard-core/src/lib.rs +6 -4
  418. package/packages/guard-core/src/metrics.rs +66 -53
  419. package/packages/guard-core/src/proxy_service.rs +618 -1520
  420. package/packages/guard-core/src/request_context.rs +149 -169
  421. package/packages/guard-core/src/response_body.rs +65 -0
  422. package/packages/guard-core/src/route.rs +76 -0
  423. package/packages/guard-core/src/server.rs +60 -26
  424. package/packages/guard-core/src/task_group.rs +4 -0
  425. package/packages/guard-core/src/utils.rs +296 -0
  426. package/packages/guard-core/src/websocket_handle.rs +3 -3
  427. package/packages/guard-core/tests/common/mod.rs +0 -1
  428. package/packages/guard-core/tests/custom_serve.rs +4 -6
  429. package/packages/guard-core/tests/simple_websocket.rs +19 -19
  430. package/packages/guard-core/tests/streaming_response.rs +4 -9
  431. package/packages/metrics/Cargo.toml +3 -2
  432. package/packages/metrics/src/buckets.rs +5 -11
  433. package/packages/metrics/src/lib.rs +6 -3
  434. package/packages/metrics/src/providers.rs +2 -42
  435. package/packages/metrics/src/registry.rs +7 -0
  436. package/packages/metrics/src/server.rs +57 -0
  437. package/packages/namespace/Cargo.toml +0 -3
  438. package/packages/namespace/src/keys/metric.rs +301 -0
  439. package/packages/namespace/src/keys/mod.rs +1 -1
  440. package/packages/namespace/src/ops/get_global.rs +7 -4
  441. package/packages/namespace/src/ops/get_local.rs +32 -16
  442. package/packages/namespace/src/ops/mod.rs +0 -1
  443. package/packages/namespace/src/ops/resolve_for_name_global.rs +7 -4
  444. package/packages/namespace/src/ops/resolve_for_name_local.rs +39 -19
  445. package/packages/namespace/src/workflows/namespace.rs +3 -3
  446. package/packages/pegboard/Cargo.toml +22 -0
  447. package/packages/pegboard/src/actor_kv/entry.rs +47 -0
  448. package/packages/pegboard/src/actor_kv/metrics.rs +19 -0
  449. package/packages/pegboard/src/actor_kv/mod.rs +530 -0
  450. package/packages/pegboard/src/actor_kv/preload.rs +363 -0
  451. package/packages/{actor-kv/src → pegboard/src/actor_kv}/utils.rs +36 -35
  452. package/packages/pegboard/src/errors.rs +39 -5
  453. package/packages/pegboard/src/keys/actor.rs +285 -2
  454. package/packages/{actor-kv/src/entry.rs → pegboard/src/keys/actor_kv.rs} +73 -39
  455. package/packages/pegboard/src/keys/backfill.rs +49 -0
  456. package/packages/pegboard/src/keys/envoy.rs +1070 -0
  457. package/packages/pegboard/src/keys/epoxy/ns.rs +1 -1
  458. package/packages/pegboard/src/keys/mod.rs +4 -6
  459. package/packages/pegboard/src/keys/ns.rs +493 -14
  460. package/packages/pegboard/src/keys/runner.rs +281 -0
  461. package/packages/{namespace → pegboard}/src/keys/runner_config.rs +53 -0
  462. package/packages/pegboard/src/lib.rs +15 -2
  463. package/packages/pegboard/src/metrics.rs +57 -16
  464. package/packages/pegboard/src/ops/actor/create.rs +123 -53
  465. package/packages/pegboard/src/ops/actor/get.rs +14 -45
  466. package/packages/pegboard/src/ops/actor/get_for_gateway.rs +16 -0
  467. package/packages/pegboard/src/ops/actor/get_for_key.rs +3 -0
  468. package/packages/pegboard/src/ops/actor/get_for_kv.rs +43 -0
  469. package/packages/pegboard/src/ops/actor/get_for_runner.rs +99 -0
  470. package/packages/pegboard/src/ops/actor/get_reservation_for_key.rs +1 -0
  471. package/packages/pegboard/src/ops/actor/list_for_ns.rs +10 -38
  472. package/packages/pegboard/src/ops/actor/list_names.rs +3 -3
  473. package/packages/pegboard/src/ops/actor/mod.rs +3 -1
  474. package/packages/pegboard/src/ops/actor/util.rs +263 -0
  475. package/packages/pegboard/src/ops/envoy/drain.rs +101 -0
  476. package/packages/pegboard/src/ops/envoy/evict_actors.rs +54 -0
  477. package/packages/pegboard/src/ops/envoy/expire.rs +92 -0
  478. package/packages/pegboard/src/ops/envoy/get.rs +135 -0
  479. package/packages/pegboard/src/ops/envoy/list.rs +131 -0
  480. package/packages/pegboard/src/ops/envoy/mod.rs +6 -0
  481. package/packages/pegboard/src/ops/envoy/update_ping.rs +92 -0
  482. package/packages/pegboard/src/ops/mod.rs +3 -0
  483. package/packages/pegboard/src/ops/runner/drain.rs +110 -0
  484. package/packages/pegboard/src/ops/runner/list_names.rs +3 -3
  485. package/packages/pegboard/src/ops/runner/list_runner_config_enabled_dcs.rs +199 -0
  486. package/packages/pegboard/src/ops/runner/list_runner_config_epoxy_replica_ids.rs +51 -0
  487. package/packages/pegboard/src/ops/runner/mod.rs +3 -1
  488. package/packages/pegboard/src/ops/runner/update_alloc_idx.rs +17 -5
  489. package/packages/{namespace → pegboard}/src/ops/runner_config/delete.rs +18 -9
  490. package/packages/pegboard/src/ops/runner_config/ensure_normal_if_missing.rs +62 -0
  491. package/packages/{namespace → pegboard}/src/ops/runner_config/get.rs +15 -5
  492. package/packages/pegboard/src/ops/runner_config/get_error.rs +146 -0
  493. package/packages/{namespace → pegboard}/src/ops/runner_config/list.rs +13 -12
  494. package/packages/pegboard/src/ops/runner_config/mod.rs +7 -0
  495. package/packages/pegboard/src/ops/runner_config/refresh_metadata.rs +124 -0
  496. package/packages/pegboard/src/ops/runner_config/upsert.rs +206 -0
  497. package/packages/pegboard/src/ops/serverless_metadata/fetch.rs +223 -0
  498. package/packages/pegboard/src/ops/serverless_metadata/mod.rs +1 -0
  499. package/packages/pegboard/src/pubsub_subjects.rs +52 -0
  500. package/packages/pegboard/src/utils.rs +36 -2
  501. package/packages/pegboard/src/workflows/actor/destroy.rs +135 -99
  502. package/packages/pegboard/src/workflows/actor/keys.rs +59 -5
  503. package/packages/pegboard/src/workflows/actor/metrics.rs +345 -0
  504. package/packages/pegboard/src/workflows/actor/mod.rs +848 -204
  505. package/packages/pegboard/src/workflows/actor/runtime.rs +785 -212
  506. package/packages/pegboard/src/workflows/actor/setup.rs +61 -0
  507. package/packages/pegboard/src/workflows/actor2/keys.rs +337 -0
  508. package/packages/pegboard/src/workflows/actor2/metrics.rs +334 -0
  509. package/packages/pegboard/src/workflows/actor2/mod.rs +1251 -0
  510. package/packages/pegboard/src/workflows/actor2/runtime.rs +1005 -0
  511. package/packages/pegboard/src/workflows/actor_runner_name_selector_backfill.rs +266 -0
  512. package/packages/pegboard/src/workflows/metrics_aggregator.rs +282 -0
  513. package/packages/pegboard/src/workflows/mod.rs +8 -0
  514. package/packages/pegboard/src/workflows/runner.rs +62 -56
  515. package/packages/pegboard/src/workflows/runner2.rs +978 -0
  516. package/packages/pegboard/src/workflows/runner_pool.rs +298 -0
  517. package/packages/pegboard/src/workflows/runner_pool_error_tracker.rs +173 -0
  518. package/packages/pegboard/src/workflows/runner_pool_metadata_poller.rs +237 -0
  519. package/packages/pegboard/src/workflows/serverless/backfill.rs +120 -0
  520. package/packages/pegboard/src/workflows/serverless/conn.rs +702 -0
  521. package/packages/pegboard/src/workflows/serverless/mod.rs +3 -0
  522. package/packages/pegboard/src/workflows/serverless/receiver.rs +87 -0
  523. package/packages/pegboard/tests/actor_v1_pre_migration.rs +77 -0
  524. package/packages/{actor-kv/tests/list_edge_cases.rs → pegboard/tests/kv_list_edge_cases.rs} +74 -59
  525. package/packages/{actor-kv → pegboard}/tests/kv_operations.rs +77 -48
  526. package/packages/pegboard-envoy/Cargo.toml +43 -0
  527. package/packages/pegboard-envoy/src/actor_event_demuxer.rs +165 -0
  528. package/packages/pegboard-envoy/src/conn.rs +417 -0
  529. package/packages/pegboard-envoy/src/errors.rs +38 -0
  530. package/packages/pegboard-envoy/src/lib.rs +250 -0
  531. package/packages/pegboard-envoy/src/metrics.rs +44 -0
  532. package/packages/pegboard-envoy/src/ping_task.rs +61 -0
  533. package/packages/pegboard-envoy/src/tunnel_to_ws_task.rs +183 -0
  534. package/packages/pegboard-envoy/src/utils.rs +68 -0
  535. package/packages/pegboard-envoy/src/ws_to_tunnel_task.rs +536 -0
  536. package/packages/pegboard-envoy/tests/support/ws_to_tunnel_task.rs +82 -0
  537. package/packages/pegboard-gateway/Cargo.toml +2 -0
  538. package/packages/pegboard-gateway/src/keepalive_task.rs +1 -1
  539. package/packages/pegboard-gateway/src/lib.rs +506 -128
  540. package/packages/pegboard-gateway/src/metrics.rs +7 -11
  541. package/packages/pegboard-gateway/src/metrics_task.rs +80 -0
  542. package/packages/pegboard-gateway/src/ping_task.rs +9 -2
  543. package/packages/pegboard-gateway/src/shared_state.rs +110 -74
  544. package/packages/pegboard-gateway/src/tunnel_to_ws_task.rs +21 -7
  545. package/packages/pegboard-gateway/src/ws_to_tunnel_task.rs +12 -6
  546. package/packages/pegboard-gateway2/Cargo.toml +37 -0
  547. package/packages/pegboard-gateway2/src/keepalive_task.rs +61 -0
  548. package/packages/pegboard-gateway2/src/lib.rs +1044 -0
  549. package/packages/pegboard-gateway2/src/metrics.rs +10 -0
  550. package/packages/pegboard-gateway2/src/metrics_task.rs +80 -0
  551. package/packages/pegboard-gateway2/src/ping_task.rs +30 -0
  552. package/packages/pegboard-gateway2/src/shared_state.rs +601 -0
  553. package/packages/pegboard-gateway2/src/tunnel_to_ws_task.rs +99 -0
  554. package/packages/pegboard-gateway2/src/ws_to_tunnel_task.rs +71 -0
  555. package/packages/{pegboard-serverless → pegboard-outbound}/Cargo.toml +9 -9
  556. package/packages/pegboard-outbound/src/lib.rs +487 -0
  557. package/packages/pegboard-outbound/src/metrics.rs +17 -0
  558. package/packages/pegboard-runner/Cargo.toml +11 -5
  559. package/packages/pegboard-runner/src/actor_event_demuxer.rs +163 -0
  560. package/packages/pegboard-runner/src/conn.rs +358 -122
  561. package/packages/pegboard-runner/src/errors.rs +5 -0
  562. package/packages/pegboard-runner/src/lib.rs +62 -36
  563. package/packages/pegboard-runner/src/metrics.rs +44 -0
  564. package/packages/pegboard-runner/src/ping_task.rs +60 -13
  565. package/packages/pegboard-runner/src/tunnel_to_ws_task.rs +249 -110
  566. package/packages/pegboard-runner/src/ws_to_tunnel_task.rs +738 -113
  567. package/packages/pegboard-runner/tests/support/ws_to_tunnel_task.rs +150 -0
  568. package/packages/pools/Cargo.toml +1 -2
  569. package/packages/pools/src/db/clickhouse.rs +7 -6
  570. package/packages/pools/src/db/udb.rs +16 -3
  571. package/packages/pools/src/db/ups.rs +27 -5
  572. package/packages/pools/src/error.rs +0 -3
  573. package/packages/pools/src/lib.rs +0 -2
  574. package/packages/pools/src/metrics.rs +33 -28
  575. package/packages/pools/src/pools.rs +15 -39
  576. package/packages/pools/src/prelude.rs +1 -1
  577. package/packages/postgres-util/Cargo.toml +13 -0
  578. package/packages/postgres-util/src/lib.rs +84 -0
  579. package/packages/runner-protocol/build.rs +157 -0
  580. package/packages/runner-protocol/src/lib.rs +16 -0
  581. package/packages/runner-protocol/src/util.rs +14 -0
  582. package/packages/runner-protocol/src/versioned.rs +4345 -0
  583. package/packages/runtime/src/lib.rs +46 -46
  584. package/packages/runtime/src/metrics.rs +39 -30
  585. package/packages/runtime/src/term_signal.rs +25 -12
  586. package/packages/runtime/src/traces.rs +5 -8
  587. package/packages/service-manager/src/lib.rs +66 -15
  588. package/packages/test-deps/src/datacenter.rs +22 -8
  589. package/packages/test-deps/src/lib.rs +47 -25
  590. package/packages/test-deps-docker/src/database.rs +45 -36
  591. package/packages/test-snapshot-gen/Cargo.toml +39 -0
  592. package/packages/test-snapshot-gen/snapshots/.gitkeep +0 -0
  593. package/packages/test-snapshot-gen/snapshots/epoxy-v1/metadata.json +3 -0
  594. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000008.log +0 -0
  595. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000009.sst +3 -0
  596. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/CURRENT +3 -0
  597. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/MANIFEST-000005 +3 -0
  598. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/OPTIONS-000007 +3 -0
  599. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000008.log +0 -0
  600. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000009.sst +3 -0
  601. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/CURRENT +3 -0
  602. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/MANIFEST-000005 +3 -0
  603. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/OPTIONS-000007 +3 -0
  604. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/metadata.json +3 -0
  605. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000008.log +0 -0
  606. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000009.sst +3 -0
  607. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/CURRENT +3 -0
  608. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/MANIFEST-000005 +3 -0
  609. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/OPTIONS-000007 +3 -0
  610. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000008.log +0 -0
  611. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000009.sst +3 -0
  612. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/CURRENT +3 -0
  613. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/MANIFEST-000005 +3 -0
  614. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/OPTIONS-000007 +3 -0
  615. package/packages/test-snapshot-gen/src/lib.rs +328 -0
  616. package/packages/test-snapshot-gen/src/main.rs +145 -0
  617. package/packages/test-snapshot-gen/src/scenarios/epoxy_keys.rs +60 -0
  618. package/packages/test-snapshot-gen/src/scenarios/mod.rs +27 -0
  619. package/packages/test-snapshot-gen/src/scenarios/pb_actor_v1_pre_migration.rs +56 -0
  620. package/packages/test-snapshot-gen/src/test_cluster.rs +234 -0
  621. package/packages/tracing-reconfigure/src/lib.rs +1 -1
  622. package/packages/tracing-utils/src/lib.rs +12 -20
  623. package/packages/types/src/actor/error.rs +59 -0
  624. package/packages/types/src/actor/mod.rs +2 -0
  625. package/packages/types/src/actors.rs +5 -0
  626. package/packages/types/src/envoys.rs +21 -0
  627. package/packages/types/src/keys/backfill.rs +5 -0
  628. package/packages/types/src/keys/mod.rs +1 -0
  629. package/packages/types/src/lib.rs +2 -1
  630. package/packages/types/src/runner_configs.rs +43 -14
  631. package/packages/universaldb/Cargo.toml +4 -0
  632. package/packages/universaldb/src/database.rs +50 -5
  633. package/packages/universaldb/src/driver/mod.rs +12 -2
  634. package/packages/universaldb/src/driver/postgres/database.rs +88 -27
  635. package/packages/universaldb/src/driver/postgres/mod.rs +1 -1
  636. package/packages/universaldb/src/driver/postgres/transaction.rs +4 -7
  637. package/packages/universaldb/src/driver/postgres/transaction_task.rs +30 -52
  638. package/packages/universaldb/src/driver/rocksdb/database.rs +13 -7
  639. package/packages/universaldb/src/driver/rocksdb/transaction_conflict_tracker.rs +5 -5
  640. package/packages/universaldb/src/driver/rocksdb/transaction_task.rs +2 -1
  641. package/packages/universaldb/src/metrics.rs +39 -23
  642. package/packages/universaldb/src/prelude.rs +1 -1
  643. package/packages/universaldb/src/transaction.rs +9 -2
  644. package/packages/universaldb/src/utils/cherry_pick.rs +46 -46
  645. package/packages/universaldb/src/utils/keys.rs +21 -2
  646. package/packages/universaldb/src/utils/mod.rs +8 -0
  647. package/packages/universaldb/src/utils/subspace.rs +9 -4
  648. package/packages/universaldb/tests/integration.rs +5 -3
  649. package/packages/universaldb/tests/integration_gas.rs +5 -3
  650. package/packages/universaldb/tests/rocksdb.rs +152 -19
  651. package/packages/universalpubsub/Cargo.toml +8 -2
  652. package/packages/universalpubsub/benches/simple.rs +28 -8
  653. package/packages/universalpubsub/src/chunking.rs +27 -5
  654. package/packages/universalpubsub/src/driver/memory/mod.rs +131 -20
  655. package/packages/universalpubsub/src/driver/mod.rs +5 -0
  656. package/packages/universalpubsub/src/driver/nats/mod.rs +8 -0
  657. package/packages/universalpubsub/src/driver/postgres/mod.rs +505 -96
  658. package/packages/universalpubsub/src/lib.rs +3 -0
  659. package/packages/universalpubsub/src/metrics.rs +60 -0
  660. package/packages/universalpubsub/src/pubsub.rs +227 -87
  661. package/packages/universalpubsub/src/subject.rs +32 -0
  662. package/packages/universalpubsub/tests/chunking.rs +298 -0
  663. package/packages/universalpubsub/tests/integration.rs +148 -7
  664. package/packages/universalpubsub/tests/reconnect.rs +8 -6
  665. package/packages/util/Cargo.toml +1 -3
  666. package/packages/util/build.rs +6 -0
  667. package/packages/util/src/lib.rs +7 -2
  668. package/packages/util/src/metric.rs +1 -0
  669. package/packages/util/src/serde.rs +1 -516
  670. package/packages/{internal → util-serde}/Cargo.toml +4 -5
  671. package/packages/util-serde/src/lib.rs +517 -0
  672. package/packages/workflow-worker/Cargo.toml +4 -4
  673. package/packages/workflow-worker/src/lib.rs +3 -2
  674. package/sdks/go/api-full/client/client.go +17 -4
  675. package/sdks/go/api-full/metadata/client.go +50 -0
  676. package/sdks/go/api-full/namespaces/client.go +3 -0
  677. package/sdks/go/api-full/namespaces.go +6 -4
  678. package/sdks/go/api-full/runners/client.go +3 -0
  679. package/sdks/go/api-full/runners.go +8 -6
  680. package/sdks/go/api-full/types.go +107 -23
  681. package/sdks/rust/api-full/rust/.openapi-generator/FILES +6 -0
  682. package/sdks/rust/api-full/rust/Cargo.toml +1 -1
  683. package/sdks/rust/api-full/rust/README.md +5 -2
  684. package/sdks/rust/api-full/rust/docs/Actor.md +1 -0
  685. package/sdks/rust/api-full/rust/docs/ActorsDeleteApi.md +1 -1
  686. package/sdks/rust/api-full/rust/docs/ActorsKvGetApi.md +2 -1
  687. package/sdks/rust/api-full/rust/docs/ActorsListApi.md +3 -2
  688. package/sdks/rust/api-full/rust/docs/MetadataApi.md +34 -0
  689. package/sdks/rust/api-full/rust/docs/MetadataGetResponse.md +18 -0
  690. package/sdks/rust/api-full/rust/docs/NamespacesApi.md +3 -2
  691. package/sdks/rust/api-full/rust/docs/RunnerConfig.md +1 -0
  692. package/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf1Serverless.md +1 -0
  693. package/sdks/rust/api-full/rust/docs/RunnerConfigResponse.md +15 -0
  694. package/sdks/rust/api-full/rust/docs/RunnerConfigsListApi.md +3 -2
  695. package/sdks/rust/api-full/rust/docs/RunnerConfigsListResponseRunnerConfigsValue.md +1 -1
  696. package/sdks/rust/api-full/rust/docs/RunnersApi.md +3 -2
  697. package/sdks/rust/api-full/rust/src/apis/actors_create_api.rs +1 -1
  698. package/sdks/rust/api-full/rust/src/apis/actors_delete_api.rs +3 -5
  699. package/sdks/rust/api-full/rust/src/apis/actors_get_or_create_api.rs +1 -1
  700. package/sdks/rust/api-full/rust/src/apis/actors_kv_get_api.rs +4 -2
  701. package/sdks/rust/api-full/rust/src/apis/actors_list_api.rs +9 -2
  702. package/sdks/rust/api-full/rust/src/apis/actors_list_names_api.rs +1 -1
  703. package/sdks/rust/api-full/rust/src/apis/configuration.rs +2 -2
  704. package/sdks/rust/api-full/rust/src/apis/datacenters_api.rs +1 -1
  705. package/sdks/rust/api-full/rust/src/apis/health_api.rs +1 -1
  706. package/sdks/rust/api-full/rust/src/apis/metadata_api.rs +62 -0
  707. package/sdks/rust/api-full/rust/src/apis/mod.rs +1 -0
  708. package/sdks/rust/api-full/rust/src/apis/namespaces_api.rs +9 -2
  709. package/sdks/rust/api-full/rust/src/apis/runner_configs_delete_api.rs +1 -1
  710. package/sdks/rust/api-full/rust/src/apis/runner_configs_list_api.rs +9 -2
  711. package/sdks/rust/api-full/rust/src/apis/runner_configs_refresh_metadata_api.rs +1 -1
  712. package/sdks/rust/api-full/rust/src/apis/runner_configs_serverless_health_check_api.rs +1 -1
  713. package/sdks/rust/api-full/rust/src/apis/runner_configs_upsert_api.rs +1 -1
  714. package/sdks/rust/api-full/rust/src/apis/runners_api.rs +9 -2
  715. package/sdks/rust/api-full/rust/src/models/actor.rs +5 -1
  716. package/sdks/rust/api-full/rust/src/models/actor_name.rs +1 -1
  717. package/sdks/rust/api-full/rust/src/models/actors_create_request.rs +1 -1
  718. package/sdks/rust/api-full/rust/src/models/actors_create_response.rs +1 -1
  719. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_request.rs +1 -1
  720. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_response.rs +1 -1
  721. package/sdks/rust/api-full/rust/src/models/actors_kv_get_response.rs +1 -1
  722. package/sdks/rust/api-full/rust/src/models/actors_list_names_response.rs +1 -1
  723. package/sdks/rust/api-full/rust/src/models/actors_list_response.rs +1 -1
  724. package/sdks/rust/api-full/rust/src/models/crash_policy.rs +1 -1
  725. package/sdks/rust/api-full/rust/src/models/datacenter.rs +1 -1
  726. package/sdks/rust/api-full/rust/src/models/datacenter_health.rs +1 -1
  727. package/sdks/rust/api-full/rust/src/models/datacenters_list_response.rs +1 -1
  728. package/sdks/rust/api-full/rust/src/models/health_fanout_response.rs +1 -1
  729. package/sdks/rust/api-full/rust/src/models/health_response.rs +1 -1
  730. package/sdks/rust/api-full/rust/src/models/health_status.rs +1 -1
  731. package/sdks/rust/api-full/rust/src/models/metadata_get_response.rs +48 -0
  732. package/sdks/rust/api-full/rust/src/models/mod.rs +4 -0
  733. package/sdks/rust/api-full/rust/src/models/namespace.rs +1 -1
  734. package/sdks/rust/api-full/rust/src/models/namespace_list_response.rs +1 -1
  735. package/sdks/rust/api-full/rust/src/models/namespaces_create_request.rs +1 -1
  736. package/sdks/rust/api-full/rust/src/models/namespaces_create_response.rs +1 -1
  737. package/sdks/rust/api-full/rust/src/models/pagination.rs +1 -1
  738. package/sdks/rust/api-full/rust/src/models/runner.rs +1 -1
  739. package/sdks/rust/api-full/rust/src/models/runner_config.rs +4 -1
  740. package/sdks/rust/api-full/rust/src/models/runner_config_kind.rs +1 -1
  741. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of.rs +1 -1
  742. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1.rs +1 -1
  743. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1_serverless.rs +5 -1
  744. package/sdks/rust/api-full/rust/src/models/runner_config_response.rs +39 -0
  745. package/sdks/rust/api-full/rust/src/models/runner_config_variant.rs +1 -1
  746. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response.rs +1 -1
  747. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response_runner_configs_value.rs +3 -3
  748. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_request.rs +1 -1
  749. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response.rs +1 -1
  750. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of.rs +1 -1
  751. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1.rs +1 -1
  752. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1_failure.rs +1 -1
  753. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_success.rs +1 -1
  754. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error.rs +1 -1
  755. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of.rs +1 -1
  756. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_1.rs +1 -1
  757. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_2.rs +1 -1
  758. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3.rs +1 -1
  759. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3_non_success_status.rs +1 -1
  760. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4.rs +1 -1
  761. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4_invalid_response_json.rs +1 -1
  762. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5.rs +1 -1
  763. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5_invalid_response_schema.rs +1 -1
  764. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_request_body.rs +1 -1
  765. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_response.rs +1 -1
  766. package/sdks/rust/api-full/rust/src/models/runners_list_names_response.rs +1 -1
  767. package/sdks/rust/api-full/rust/src/models/runners_list_response.rs +1 -1
  768. package/sdks/rust/api-full/src/apis/actors_api.rs +8 -4
  769. package/sdks/rust/api-full/src/apis/ns_api.rs +8 -4
  770. package/sdks/rust/data/src/converted.rs +7 -4
  771. package/sdks/rust/data/src/lib.rs +2 -2
  772. package/sdks/rust/data/src/versioned/mod.rs +47 -4
  773. package/sdks/rust/data/src/versioned/namespace_runner_config.rs +256 -6
  774. package/sdks/rust/envoy-client/Cargo.toml +25 -0
  775. package/sdks/rust/envoy-client/src/actor.rs +992 -0
  776. package/sdks/rust/envoy-client/src/commands.rs +88 -0
  777. package/sdks/rust/envoy-client/src/config.rs +159 -0
  778. package/sdks/rust/envoy-client/src/connection.rs +288 -0
  779. package/sdks/rust/envoy-client/src/context.rs +24 -0
  780. package/sdks/rust/envoy-client/src/envoy.rs +432 -0
  781. package/sdks/rust/envoy-client/src/events.rs +62 -0
  782. package/sdks/rust/envoy-client/src/handle.rs +355 -0
  783. package/sdks/rust/envoy-client/src/kv.rs +132 -0
  784. package/sdks/rust/envoy-client/src/latency_channel.rs +27 -0
  785. package/sdks/rust/envoy-client/src/lib.rs +15 -0
  786. package/sdks/rust/envoy-client/src/stringify.rs +322 -0
  787. package/sdks/rust/envoy-client/src/tunnel.rs +265 -0
  788. package/sdks/rust/envoy-client/src/utils.rs +172 -0
  789. package/sdks/rust/envoy-protocol/Cargo.toml +22 -0
  790. package/sdks/rust/envoy-protocol/build.rs +200 -0
  791. package/sdks/rust/envoy-protocol/src/generated.rs +1 -0
  792. package/sdks/rust/envoy-protocol/src/lib.rs +8 -0
  793. package/sdks/rust/envoy-protocol/src/versioned.rs +208 -0
  794. package/sdks/rust/epoxy-protocol/Cargo.toml +0 -2
  795. package/sdks/rust/epoxy-protocol/build.rs +7 -0
  796. package/sdks/rust/epoxy-protocol/src/lib.rs +2 -5
  797. package/sdks/rust/epoxy-protocol/src/protocol.rs +128 -0
  798. package/sdks/rust/test-envoy/Cargo.toml +23 -0
  799. package/sdks/rust/test-envoy/Dockerfile +22 -0
  800. package/sdks/rust/test-envoy/src/behaviors.rs +141 -0
  801. package/sdks/rust/test-envoy/src/lib.rs +11 -0
  802. package/sdks/rust/test-envoy/src/main.rs +4 -0
  803. package/sdks/rust/test-envoy/src/server.rs +269 -0
  804. package/sdks/schemas/README.md +1 -2
  805. package/sdks/schemas/data/namespace.runner_config.v3.bare +24 -0
  806. package/sdks/schemas/data/namespace.runner_config.v4.bare +25 -0
  807. package/sdks/schemas/data/namespace.runner_config.v5.bare +26 -0
  808. package/sdks/schemas/data/pegboard.namespace.runner_alloc_idx.v2.bare +8 -0
  809. package/sdks/schemas/envoy-protocol/v1.bare +459 -0
  810. package/sdks/schemas/epoxy-protocol/v2.bare +220 -0
  811. package/sdks/schemas/runner-protocol/v4.bare +438 -0
  812. package/sdks/schemas/runner-protocol/v5.bare +430 -0
  813. package/sdks/schemas/runner-protocol/v6.bare +432 -0
  814. package/sdks/schemas/runner-protocol/v7.bare +438 -0
  815. package/sdks/typescript/api-full/.turbo/turbo-build.log +28 -27
  816. package/sdks/typescript/api-full/build.js +7 -1
  817. package/sdks/typescript/api-full/package.json +66 -57
  818. package/sdks/typescript/api-full/rivetkit-engine-api-full-25.5.3.tgz +0 -0
  819. package/sdks/typescript/api-full/src/Client.ts +41 -10
  820. package/sdks/typescript/api-full/src/api/client/requests/ActorsDeleteRequest.ts +4 -2
  821. package/sdks/typescript/api-full/src/api/client/requests/ActorsKvGetRequest.ts +13 -0
  822. package/sdks/typescript/api-full/src/api/client/requests/ActorsListRequest.ts +6 -0
  823. package/sdks/typescript/api-full/src/api/client/requests/RunnerConfigsListRequest.ts +4 -0
  824. package/sdks/typescript/api-full/src/api/client/requests/index.ts +1 -0
  825. package/sdks/typescript/api-full/src/api/resources/index.ts +1 -0
  826. package/sdks/typescript/api-full/src/api/resources/metadata/client/Client.ts +97 -0
  827. package/sdks/typescript/api-full/src/api/resources/metadata/client/index.ts +1 -0
  828. package/sdks/typescript/api-full/src/api/resources/metadata/index.ts +1 -0
  829. package/sdks/typescript/api-full/src/api/resources/namespaces/client/Client.ts +12 -2
  830. package/sdks/typescript/api-full/src/api/resources/namespaces/client/requests/NamespacesListRequest.ts +6 -0
  831. package/sdks/typescript/api-full/src/api/resources/runners/client/Client.ts +12 -2
  832. package/sdks/typescript/api-full/src/api/resources/runners/client/requests/RunnersListRequest.ts +6 -0
  833. package/sdks/typescript/api-full/src/api/types/Actor.ts +2 -0
  834. package/sdks/typescript/api-full/src/api/types/MetadataGetResponse.ts +14 -0
  835. package/sdks/typescript/api-full/src/api/types/RunnerConfig.ts +1 -0
  836. package/sdks/typescript/api-full/src/api/types/RunnerConfigKindServerlessServerless.ts +2 -0
  837. package/sdks/typescript/api-full/src/api/types/RunnerConfigResponse.ts +9 -0
  838. package/sdks/typescript/api-full/src/api/types/RunnerConfigServerless.ts +2 -0
  839. package/sdks/typescript/api-full/src/api/types/RunnerConfigsListResponseRunnerConfigsValue.ts +1 -1
  840. package/sdks/typescript/api-full/src/api/types/index.ts +2 -0
  841. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +6 -4
  842. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +4 -3
  843. package/sdks/typescript/api-full/src/serialization/types/Actor.ts +2 -0
  844. package/sdks/typescript/api-full/src/serialization/types/MetadataGetResponse.ts +34 -0
  845. package/sdks/typescript/api-full/src/serialization/types/RunnerConfig.ts +5 -0
  846. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigKindServerlessServerless.ts +2 -0
  847. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigResponse.ts +26 -0
  848. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigServerless.ts +2 -0
  849. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigsListResponseRunnerConfigsValue.ts +3 -3
  850. package/sdks/typescript/api-full/src/serialization/types/index.ts +2 -0
  851. package/sdks/typescript/api-full/turbo.json +9 -0
  852. package/sdks/typescript/envoy-protocol/.turbo/turbo-build.log +23 -0
  853. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.cjs +466 -281
  854. package/sdks/typescript/envoy-protocol/dist/index.cjs.map +1 -0
  855. package/sdks/typescript/envoy-protocol/dist/index.d.cts +699 -0
  856. package/sdks/typescript/envoy-protocol/dist/index.d.ts +699 -0
  857. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.js +530 -345
  858. package/sdks/typescript/envoy-protocol/dist/index.js.map +1 -0
  859. package/sdks/typescript/{runner-protocol → envoy-protocol}/node_modules/.bin/tsc +4 -4
  860. package/{tests/load → sdks/typescript/envoy-protocol}/node_modules/.bin/tsserver +4 -4
  861. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup +21 -0
  862. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup-node +21 -0
  863. package/sdks/typescript/envoy-protocol/package.json +36 -0
  864. package/sdks/typescript/envoy-protocol/src/index.ts +2331 -0
  865. package/sdks/typescript/envoy-protocol/tsconfig.json +9 -0
  866. package/sdks/typescript/envoy-protocol/tsup.config.ts +4 -0
  867. package/sdks/typescript/runner/package.json +8 -2
  868. package/sdks/typescript/runner/src/actor.ts +38 -0
  869. package/sdks/typescript/runner/src/mod.ts +435 -229
  870. package/sdks/typescript/runner/src/stringify.ts +36 -33
  871. package/sdks/typescript/runner/src/tunnel.ts +52 -56
  872. package/sdks/typescript/runner/src/utils.ts +19 -0
  873. package/sdks/typescript/runner/src/websocket-tunnel-adapter.ts +98 -435
  874. package/sdks/typescript/runner-protocol/package.json +11 -9
  875. package/sdks/typescript/runner-protocol/src/index.ts +224 -156
  876. package/sdks/typescript/runner-protocol/tsconfig.json +1 -9
  877. package/sdks/typescript/test-runner/.turbo/turbo-build.log +5 -5
  878. package/sdks/typescript/test-runner/dist/index.js +53 -44
  879. package/sdks/typescript/test-runner/dist/index.js.map +1 -1
  880. package/sdks/typescript/test-runner/node_modules/.bin/pino +2 -2
  881. package/sdks/typescript/test-runner/node_modules/.bin/tsc +4 -4
  882. package/sdks/typescript/test-runner/node_modules/.bin/tsserver +4 -4
  883. package/sdks/typescript/test-runner/node_modules/.bin/tsup +4 -4
  884. package/sdks/typescript/test-runner/node_modules/.bin/tsup-node +4 -4
  885. package/sdks/typescript/test-runner/node_modules/.bin/tsx +4 -4
  886. package/sdks/typescript/test-runner/node_modules/.bin/vitest +4 -4
  887. package/sdks/typescript/test-runner/package.json +3 -3
  888. package/sdks/typescript/test-runner/src/index.ts +65 -42
  889. package/sdks/typescript/test-runner/src/log.ts +4 -18
  890. package/artifacts/errors/actor.no_runners_available.json +0 -5
  891. package/artifacts/errors/guard.actor_destroyed.json +0 -5
  892. package/artifacts/errors/guard.actor_not_found.json +0 -5
  893. package/contrib-docs/ACTOR_KEY_RESERVATION.md +0 -101
  894. package/contrib-docs/API.md +0 -11
  895. package/contrib-docs/DOCKER.md +0 -5
  896. package/contrib-docs/ERRORS.md +0 -13
  897. package/contrib-docs/GUARD.md +0 -76
  898. package/contrib-docs/PEGBOARD_TUNNEL_RETRIES.md +0 -83
  899. package/contrib-docs/RUNNER_LIFECYCLE.md +0 -172
  900. package/contrib-docs/SDKS.md +0 -9
  901. package/contrib-docs/TEST_DEPENDENCIES.md +0 -43
  902. package/contrib-docs/design-choicse/EMBEDDED_KV.md +0 -80
  903. package/contrib-docs/operate/TRACING_RECONFIGURE.md +0 -78
  904. package/docker/dev/otel-collector-client/config.yaml +0 -39
  905. package/docker/dev-host/otel-collector-client/config.yaml +0 -39
  906. package/docker/dev-multidc/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  907. package/docker/dev-multidc/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  908. package/docker/dev-multidc/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  909. package/docker/dev-multidc-multinode/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  910. package/docker/dev-multidc-multinode/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  911. package/docker/dev-multidc-multinode/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  912. package/docker/dev-multinode/otel-collector-client/config.yaml +0 -39
  913. package/docker/template/src/services/edge/otel-collector-client.ts +0 -64
  914. package/packages/actor-kv/Cargo.toml +0 -31
  915. package/packages/actor-kv/src/key.rs +0 -81
  916. package/packages/actor-kv/src/lib.rs +0 -357
  917. package/packages/cache/src/rate_limit.rs +0 -109
  918. package/packages/cache/tests/integration.rs +0 -582
  919. package/packages/clickhouse-inserter/Cargo.toml +0 -17
  920. package/packages/clickhouse-inserter/src/error.rs +0 -16
  921. package/packages/clickhouse-inserter/src/lib.rs +0 -179
  922. package/packages/clickhouse-user-query/Cargo.toml +0 -16
  923. package/packages/clickhouse-user-query/examples/case_sensitivity_demo.rs +0 -100
  924. package/packages/clickhouse-user-query/examples/group_by_example.rs +0 -53
  925. package/packages/clickhouse-user-query/examples/string_contains_demo.rs +0 -96
  926. package/packages/clickhouse-user-query/src/builder.rs +0 -445
  927. package/packages/clickhouse-user-query/src/error.rs +0 -37
  928. package/packages/clickhouse-user-query/src/lib.rs +0 -61
  929. package/packages/clickhouse-user-query/src/query.rs +0 -143
  930. package/packages/clickhouse-user-query/src/schema.rs +0 -78
  931. package/packages/clickhouse-user-query/tests/builder_tests.rs +0 -619
  932. package/packages/clickhouse-user-query/tests/case_sensitivity_tests.rs +0 -307
  933. package/packages/clickhouse-user-query/tests/integration_tests.rs +0 -540
  934. package/packages/clickhouse-user-query/tests/query_tests.rs +0 -263
  935. package/packages/clickhouse-user-query/tests/schema_tests.rs +0 -44
  936. package/packages/config/src/config/vector.rs +0 -18
  937. package/packages/engine/src/commands/udb_keys.rs +0 -200
  938. package/packages/engine/tests/actors_create.rs +0 -524
  939. package/packages/engine/tests/actors_delete.rs +0 -243
  940. package/packages/engine/tests/actors_general.rs +0 -191
  941. package/packages/engine/tests/actors_get.rs +0 -230
  942. package/packages/engine/tests/actors_get_by_id.rs +0 -170
  943. package/packages/engine/tests/actors_get_or_create.rs +0 -294
  944. package/packages/engine/tests/actors_get_or_create_by_id.rs +0 -147
  945. package/packages/engine/tests/actors_lifecycle.rs +0 -165
  946. package/packages/engine/tests/actors_list.rs +0 -798
  947. package/packages/engine/tests/actors_list_names.rs +0 -353
  948. package/packages/engine/tests/common/ns.rs +0 -36
  949. package/packages/engine/tests/common/runner.rs +0 -134
  950. package/packages/engine/tests/runners_dupe_key.rs +0 -27
  951. package/packages/engine/tests/runners_version.rs +0 -50
  952. package/packages/env/build.rs +0 -8
  953. package/packages/epoxy/spec/KEYS.md +0 -33
  954. package/packages/epoxy/spec/PROPOSAL.md +0 -125
  955. package/packages/epoxy/spec/RECONFIGURE.md +0 -40
  956. package/packages/epoxy/src/ops/explicit_prepare.rs +0 -342
  957. package/packages/epoxy/src/replica/decide_path.rs +0 -51
  958. package/packages/epoxy/src/replica/lead_consensus.rs +0 -65
  959. package/packages/epoxy/src/replica/log.rs +0 -84
  960. package/packages/epoxy/src/replica/messages/accepted.rs +0 -35
  961. package/packages/epoxy/src/replica/messages/committed.rs +0 -41
  962. package/packages/epoxy/src/replica/messages/download_instances.rs +0 -69
  963. package/packages/epoxy/src/replica/messages/pre_accept.rs +0 -69
  964. package/packages/epoxy/src/replica/utils.rs +0 -111
  965. package/packages/epoxy/src/workflows/purger.rs +0 -81
  966. package/packages/guard/src/cache/actor.rs +0 -43
  967. package/packages/guard/src/middleware.rs +0 -42
  968. package/packages/guard/src/routing/pegboard_gateway.rs +0 -260
  969. package/packages/guard-core/src/analytics.rs +0 -46
  970. package/packages/internal/README.md +0 -1
  971. package/packages/internal/src/lib.rs +0 -1
  972. package/packages/internal/src/ops/bump_serverless_autoscaler_global.rs +0 -64
  973. package/packages/internal/src/ops/cache/mod.rs +0 -1
  974. package/packages/internal/src/ops/cache/purge_global.rs +0 -81
  975. package/packages/internal/src/ops/mod.rs +0 -2
  976. package/packages/namespace/src/ops/runner_config/mod.rs +0 -4
  977. package/packages/namespace/src/ops/runner_config/upsert.rs +0 -148
  978. package/packages/pegboard/src/ops/actor/get_runner.rs +0 -64
  979. package/packages/pegboard/src/ops/runner/find_dc_with_runner.rs +0 -222
  980. package/packages/pegboard-serverless/src/lib.rs +0 -523
  981. package/packages/types/src/msgs/mod.rs +0 -1
  982. package/packages/types/src/msgs/pegboard.rs +0 -5
  983. package/sdks/rust/epoxy-protocol/src/versioned.rs +0 -206
  984. package/sdks/rust/runner-protocol/build.rs +0 -115
  985. package/sdks/rust/runner-protocol/src/lib.rs +0 -10
  986. package/sdks/rust/runner-protocol/src/versioned.rs +0 -1734
  987. package/sdks/schemas/epoxy-protocol/v1.bare +0 -260
  988. package/sdks/typescript/runner/.turbo/turbo-build.log +0 -22
  989. package/sdks/typescript/runner/dist/mod.cjs +0 -2951
  990. package/sdks/typescript/runner/dist/mod.cjs.map +0 -1
  991. package/sdks/typescript/runner/dist/mod.d.cts +0 -326
  992. package/sdks/typescript/runner/dist/mod.d.ts +0 -326
  993. package/sdks/typescript/runner/dist/mod.js +0 -2951
  994. package/sdks/typescript/runner/dist/mod.js.map +0 -1
  995. package/sdks/typescript/runner/node_modules/.bin/pino +0 -21
  996. package/sdks/typescript/runner/node_modules/.bin/tsc +0 -21
  997. package/sdks/typescript/runner/node_modules/.bin/tsserver +0 -21
  998. package/sdks/typescript/runner/node_modules/.bin/tsup +0 -21
  999. package/sdks/typescript/runner/node_modules/.bin/tsup-node +0 -21
  1000. package/sdks/typescript/runner/node_modules/.bin/tsx +0 -21
  1001. package/sdks/typescript/runner/node_modules/.bin/uuid +0 -21
  1002. package/sdks/typescript/runner/node_modules/.bin/vitest +0 -21
  1003. package/sdks/typescript/runner-protocol/.turbo/turbo-build.log +0 -22
  1004. package/sdks/typescript/runner-protocol/dist/index.cjs.map +0 -1
  1005. package/sdks/typescript/runner-protocol/dist/index.d.cts +0 -666
  1006. package/sdks/typescript/runner-protocol/dist/index.d.ts +0 -666
  1007. package/sdks/typescript/runner-protocol/dist/index.js.map +0 -1
  1008. package/sdks/typescript/runner-protocol/node_modules/.bin/tsserver +0 -21
  1009. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup +0 -21
  1010. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup-node +0 -21
  1011. package/sdks/typescript/test-runner/Dockerfile +0 -26
  1012. package/tests/load/README.md +0 -28
  1013. package/tests/load/actor-lifecycle/README.md +0 -26
  1014. package/tests/load/actor-lifecycle/actor.ts +0 -41
  1015. package/tests/load/actor-lifecycle/config.ts +0 -14
  1016. package/tests/load/actor-lifecycle/index.ts +0 -62
  1017. package/tests/load/actor-lifecycle/rivet_api.ts +0 -140
  1018. package/tests/load/actor-lifecycle/types.ts +0 -17
  1019. package/tests/load/node_modules/.bin/biome +0 -21
  1020. package/tests/load/node_modules/.bin/tsc +0 -21
  1021. package/tests/load/package.json +0 -15
  1022. package/tests/load/tsconfig.json +0 -20
  1023. package/tests/smoke/README.md +0 -32
  1024. package/tests/smoke/package.json +0 -19
  1025. package/tests/smoke/scripts/connect.ts +0 -41
  1026. package/tests/smoke/src/server/registry.ts +0 -32
  1027. package/tests/smoke/src/server/server.ts +0 -7
  1028. package/tests/smoke/src/smoke-test/index.ts +0 -161
  1029. package/tests/smoke/src/smoke-test/spawn-actor.ts +0 -109
  1030. package/tests/smoke/tsconfig.json +0 -43
  1031. /package/packages/{dump-openapi → api-public-openapi-gen}/build.rs +0 -0
  1032. /package/packages/{dump-openapi → api-public-openapi-gen}/src/lib.rs +0 -0
  1033. /package/{sdks/rust → packages}/runner-protocol/Cargo.toml +0 -0
  1034. /package/{sdks/rust → packages}/runner-protocol/src/compat.rs +0 -0
  1035. /package/{sdks/rust → packages}/runner-protocol/src/generated.rs +0 -0
  1036. /package/{sdks/rust → packages}/runner-protocol/src/uuid_compat.rs +0 -0
  1037. /package/sdks/rust/{runner-protocol → envoy-protocol}/src/util.rs +0 -0
  1038. /package/{tests/smoke → sdks/typescript/envoy-protocol}/turbo.json +0 -0
@@ -0,0 +1,4345 @@
1
+ use anyhow::{Ok, Result, bail};
2
+ use vbare::OwnedVersionedData;
3
+
4
+ use crate::PROTOCOL_MK1_VERSION;
5
+ use crate::generated::{v1, v2, v3, v4, v5, v6, v7};
6
+ use crate::uuid_compat::{decode_bytes_from_uuid, encode_bytes_to_uuid};
7
+
8
+ pub enum ToClientMk2 {
9
+ V4(v4::ToClient),
10
+ V5(v5::ToClient),
11
+ V7(v7::ToClient),
12
+ }
13
+
14
+ impl OwnedVersionedData for ToClientMk2 {
15
+ type Latest = v7::ToClient;
16
+
17
+ fn wrap_latest(latest: v7::ToClient) -> Self {
18
+ ToClientMk2::V7(latest)
19
+ }
20
+
21
+ fn unwrap_latest(self) -> Result<Self::Latest> {
22
+ if let ToClientMk2::V7(data) = self {
23
+ Ok(data)
24
+ } else {
25
+ bail!("version not latest");
26
+ }
27
+ }
28
+
29
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
30
+ match version {
31
+ 4 => Ok(ToClientMk2::V4(serde_bare::from_slice(payload)?)),
32
+ 5 => Ok(ToClientMk2::V5(serde_bare::from_slice(payload)?)),
33
+ 6 | 7 => Ok(ToClientMk2::V7(serde_bare::from_slice(payload)?)),
34
+ _ => bail!("invalid version: {version}"),
35
+ }
36
+ }
37
+
38
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
39
+ match self {
40
+ ToClientMk2::V4(data) => serde_bare::to_vec(&data).map_err(Into::into),
41
+ ToClientMk2::V5(data) => serde_bare::to_vec(&data).map_err(Into::into),
42
+ ToClientMk2::V7(data) => serde_bare::to_vec(&data).map_err(Into::into),
43
+ }
44
+ }
45
+
46
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
47
+ vec![Ok, Ok, Ok, Self::v4_to_v5, Self::v5_to_v7, Ok]
48
+ }
49
+
50
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
51
+ vec![Ok, Self::v7_to_v5, Self::v5_to_v4, Ok, Ok, Ok]
52
+ }
53
+ }
54
+
55
+ impl ToClientMk2 {
56
+ fn v4_to_v5(self) -> Result<Self> {
57
+ if let ToClientMk2::V4(x) = self {
58
+ let inner = match x {
59
+ v4::ToClient::ToClientInit(init) => v5::ToClient::ToClientInit(v5::ToClientInit {
60
+ runner_id: init.runner_id,
61
+ metadata: v5::ProtocolMetadata {
62
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
63
+ },
64
+ }),
65
+ v4::ToClient::ToClientCommands(commands) => v5::ToClient::ToClientCommands(
66
+ commands
67
+ .into_iter()
68
+ .map(|cmd| v5::CommandWrapper {
69
+ checkpoint: v5::ActorCheckpoint {
70
+ actor_id: cmd.checkpoint.actor_id,
71
+ generation: match &cmd.inner {
72
+ v4::Command::CommandStartActor(start) => start.generation,
73
+ v4::Command::CommandStopActor(stop) => stop.generation,
74
+ },
75
+ index: cmd.checkpoint.index,
76
+ },
77
+ inner: match cmd.inner {
78
+ v4::Command::CommandStartActor(start) => {
79
+ v5::Command::CommandStartActor(v5::CommandStartActor {
80
+ config: v5::ActorConfig {
81
+ name: start.config.name,
82
+ key: start.config.key,
83
+ create_ts: start.config.create_ts,
84
+ input: start.config.input,
85
+ },
86
+ hibernating_requests: start
87
+ .hibernating_requests
88
+ .into_iter()
89
+ .map(|req| v5::HibernatingRequest {
90
+ gateway_id: req.gateway_id,
91
+ request_id: req.request_id,
92
+ })
93
+ .collect(),
94
+ })
95
+ }
96
+ v4::Command::CommandStopActor(_) => v5::Command::CommandStopActor,
97
+ },
98
+ })
99
+ .collect(),
100
+ ),
101
+ v4::ToClient::ToClientAckEvents(ack) => {
102
+ v5::ToClient::ToClientAckEvents(v5::ToClientAckEvents {
103
+ last_event_checkpoints: ack
104
+ .last_event_checkpoints
105
+ .into_iter()
106
+ .map(|cp| v5::ActorCheckpoint {
107
+ actor_id: cp.actor_id,
108
+ generation: 0, // Unknown in v4, use default
109
+ index: cp.index,
110
+ })
111
+ .collect(),
112
+ })
113
+ }
114
+ v4::ToClient::ToClientKvResponse(resp) => {
115
+ v5::ToClient::ToClientKvResponse(v5::ToClientKvResponse {
116
+ request_id: resp.request_id,
117
+ data: convert_kv_response_data_v4_to_v5(resp.data),
118
+ })
119
+ }
120
+ v4::ToClient::ToClientTunnelMessage(msg) => {
121
+ v5::ToClient::ToClientTunnelMessage(v5::ToClientTunnelMessage {
122
+ message_id: v5::MessageId {
123
+ gateway_id: msg.message_id.gateway_id,
124
+ request_id: msg.message_id.request_id,
125
+ message_index: msg.message_id.message_index,
126
+ },
127
+ message_kind: convert_to_client_tunnel_message_kind_v4_to_v5(
128
+ msg.message_kind,
129
+ ),
130
+ })
131
+ }
132
+ v4::ToClient::ToClientPing(ping) => {
133
+ v5::ToClient::ToClientPing(v5::ToClientPing { ts: ping.ts })
134
+ }
135
+ };
136
+
137
+ Ok(ToClientMk2::V5(inner))
138
+ } else {
139
+ bail!("unexpected version");
140
+ }
141
+ }
142
+
143
+ fn v5_to_v4(self) -> Result<Self> {
144
+ if let ToClientMk2::V5(x) = self {
145
+ let inner = match x {
146
+ v5::ToClient::ToClientInit(init) => v4::ToClient::ToClientInit(v4::ToClientInit {
147
+ runner_id: init.runner_id,
148
+ metadata: v4::ProtocolMetadata {
149
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
150
+ },
151
+ }),
152
+ v5::ToClient::ToClientCommands(commands) => v4::ToClient::ToClientCommands(
153
+ commands
154
+ .into_iter()
155
+ .map(|cmd| v4::CommandWrapper {
156
+ checkpoint: v4::ActorCheckpoint {
157
+ actor_id: cmd.checkpoint.actor_id,
158
+ index: cmd.checkpoint.index,
159
+ },
160
+ inner: match cmd.inner {
161
+ v5::Command::CommandStartActor(start) => {
162
+ v4::Command::CommandStartActor(v4::CommandStartActor {
163
+ generation: cmd.checkpoint.generation,
164
+ config: v4::ActorConfig {
165
+ name: start.config.name,
166
+ key: start.config.key,
167
+ create_ts: start.config.create_ts,
168
+ input: start.config.input,
169
+ },
170
+ hibernating_requests: start
171
+ .hibernating_requests
172
+ .into_iter()
173
+ .map(|req| v4::HibernatingRequest {
174
+ gateway_id: req.gateway_id,
175
+ request_id: req.request_id,
176
+ })
177
+ .collect(),
178
+ })
179
+ }
180
+ v5::Command::CommandStopActor => {
181
+ v4::Command::CommandStopActor(v4::CommandStopActor {
182
+ generation: cmd.checkpoint.generation,
183
+ })
184
+ }
185
+ },
186
+ })
187
+ .collect(),
188
+ ),
189
+ v5::ToClient::ToClientAckEvents(ack) => {
190
+ v4::ToClient::ToClientAckEvents(v4::ToClientAckEvents {
191
+ last_event_checkpoints: ack
192
+ .last_event_checkpoints
193
+ .into_iter()
194
+ .map(|cp| v4::ActorCheckpoint {
195
+ actor_id: cp.actor_id,
196
+ index: cp.index,
197
+ })
198
+ .collect(),
199
+ })
200
+ }
201
+ v5::ToClient::ToClientKvResponse(resp) => {
202
+ v4::ToClient::ToClientKvResponse(v4::ToClientKvResponse {
203
+ request_id: resp.request_id,
204
+ data: convert_kv_response_data_v5_to_v4(resp.data),
205
+ })
206
+ }
207
+ v5::ToClient::ToClientTunnelMessage(msg) => {
208
+ v4::ToClient::ToClientTunnelMessage(v4::ToClientTunnelMessage {
209
+ message_id: v4::MessageId {
210
+ gateway_id: msg.message_id.gateway_id,
211
+ request_id: msg.message_id.request_id,
212
+ message_index: msg.message_id.message_index,
213
+ },
214
+ message_kind: convert_to_client_tunnel_message_kind_v5_to_v4(
215
+ msg.message_kind,
216
+ ),
217
+ })
218
+ }
219
+ v5::ToClient::ToClientPing(ping) => {
220
+ v4::ToClient::ToClientPing(v4::ToClientPing { ts: ping.ts })
221
+ }
222
+ };
223
+
224
+ Ok(ToClientMk2::V4(inner))
225
+ } else {
226
+ bail!("unexpected version");
227
+ }
228
+ }
229
+
230
+ fn v5_to_v7(self) -> Result<Self> {
231
+ if let ToClientMk2::V5(x) = self {
232
+ let inner = match x {
233
+ v5::ToClient::ToClientInit(init) => v7::ToClient::ToClientInit(v7::ToClientInit {
234
+ runner_id: init.runner_id,
235
+ metadata: v7::ProtocolMetadata {
236
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
237
+ actor_stop_threshold: 0,
238
+ serverless_drain_grace_period: None,
239
+ },
240
+ }),
241
+ v5::ToClient::ToClientCommands(commands) => v7::ToClient::ToClientCommands(
242
+ commands
243
+ .into_iter()
244
+ .map(|cmd| v7::CommandWrapper {
245
+ checkpoint: v7::ActorCheckpoint {
246
+ actor_id: cmd.checkpoint.actor_id,
247
+ generation: cmd.checkpoint.generation,
248
+ index: cmd.checkpoint.index,
249
+ },
250
+ inner: match cmd.inner {
251
+ v5::Command::CommandStartActor(start) => {
252
+ v7::Command::CommandStartActor(v7::CommandStartActor {
253
+ config: v7::ActorConfig {
254
+ name: start.config.name,
255
+ key: start.config.key,
256
+ create_ts: start.config.create_ts,
257
+ input: start.config.input,
258
+ },
259
+ hibernating_requests: start
260
+ .hibernating_requests
261
+ .into_iter()
262
+ .map(|req| v7::HibernatingRequest {
263
+ gateway_id: req.gateway_id,
264
+ request_id: req.request_id,
265
+ })
266
+ .collect(),
267
+ })
268
+ }
269
+ v5::Command::CommandStopActor => v7::Command::CommandStopActor,
270
+ },
271
+ })
272
+ .collect(),
273
+ ),
274
+ v5::ToClient::ToClientAckEvents(ack) => {
275
+ v7::ToClient::ToClientAckEvents(v7::ToClientAckEvents {
276
+ last_event_checkpoints: ack
277
+ .last_event_checkpoints
278
+ .into_iter()
279
+ .map(|cp| v7::ActorCheckpoint {
280
+ actor_id: cp.actor_id,
281
+ generation: cp.generation,
282
+ index: cp.index,
283
+ })
284
+ .collect(),
285
+ })
286
+ }
287
+ v5::ToClient::ToClientKvResponse(resp) => {
288
+ v7::ToClient::ToClientKvResponse(v7::ToClientKvResponse {
289
+ request_id: resp.request_id,
290
+ data: convert_kv_response_data_v5_to_v7(resp.data),
291
+ })
292
+ }
293
+ v5::ToClient::ToClientTunnelMessage(msg) => {
294
+ v7::ToClient::ToClientTunnelMessage(v7::ToClientTunnelMessage {
295
+ message_id: v7::MessageId {
296
+ gateway_id: msg.message_id.gateway_id,
297
+ request_id: msg.message_id.request_id,
298
+ message_index: msg.message_id.message_index,
299
+ },
300
+ message_kind: convert_to_client_tunnel_message_kind_v5_to_v7(
301
+ msg.message_kind,
302
+ ),
303
+ })
304
+ }
305
+ v5::ToClient::ToClientPing(ping) => {
306
+ v7::ToClient::ToClientPing(v7::ToClientPing { ts: ping.ts })
307
+ }
308
+ };
309
+
310
+ Ok(ToClientMk2::V7(inner))
311
+ } else {
312
+ bail!("unexpected version");
313
+ }
314
+ }
315
+
316
+ fn v7_to_v5(self) -> Result<Self> {
317
+ if let ToClientMk2::V7(x) = self {
318
+ let inner = match x {
319
+ v7::ToClient::ToClientInit(init) => v5::ToClient::ToClientInit(v5::ToClientInit {
320
+ runner_id: init.runner_id,
321
+ metadata: v5::ProtocolMetadata {
322
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
323
+ },
324
+ }),
325
+ v7::ToClient::ToClientCommands(commands) => v5::ToClient::ToClientCommands(
326
+ commands
327
+ .into_iter()
328
+ .map(|cmd| v5::CommandWrapper {
329
+ checkpoint: v5::ActorCheckpoint {
330
+ actor_id: cmd.checkpoint.actor_id,
331
+ generation: cmd.checkpoint.generation,
332
+ index: cmd.checkpoint.index,
333
+ },
334
+ inner: match cmd.inner {
335
+ v7::Command::CommandStartActor(start) => {
336
+ v5::Command::CommandStartActor(v5::CommandStartActor {
337
+ config: v5::ActorConfig {
338
+ name: start.config.name,
339
+ key: start.config.key,
340
+ create_ts: start.config.create_ts,
341
+ input: start.config.input,
342
+ },
343
+ hibernating_requests: start
344
+ .hibernating_requests
345
+ .into_iter()
346
+ .map(|req| v5::HibernatingRequest {
347
+ gateway_id: req.gateway_id,
348
+ request_id: req.request_id,
349
+ })
350
+ .collect(),
351
+ })
352
+ }
353
+ v7::Command::CommandStopActor => v5::Command::CommandStopActor,
354
+ },
355
+ })
356
+ .collect(),
357
+ ),
358
+ v7::ToClient::ToClientAckEvents(ack) => {
359
+ v5::ToClient::ToClientAckEvents(v5::ToClientAckEvents {
360
+ last_event_checkpoints: ack
361
+ .last_event_checkpoints
362
+ .into_iter()
363
+ .map(|cp| v5::ActorCheckpoint {
364
+ actor_id: cp.actor_id,
365
+ generation: cp.generation,
366
+ index: cp.index,
367
+ })
368
+ .collect(),
369
+ })
370
+ }
371
+ v7::ToClient::ToClientKvResponse(resp) => {
372
+ v5::ToClient::ToClientKvResponse(v5::ToClientKvResponse {
373
+ request_id: resp.request_id,
374
+ data: convert_kv_response_data_v7_to_v5(resp.data),
375
+ })
376
+ }
377
+ v7::ToClient::ToClientTunnelMessage(msg) => {
378
+ v5::ToClient::ToClientTunnelMessage(v5::ToClientTunnelMessage {
379
+ message_id: v5::MessageId {
380
+ gateway_id: msg.message_id.gateway_id,
381
+ request_id: msg.message_id.request_id,
382
+ message_index: msg.message_id.message_index,
383
+ },
384
+ message_kind: convert_to_client_tunnel_message_kind_v7_to_v5(
385
+ msg.message_kind,
386
+ ),
387
+ })
388
+ }
389
+ v7::ToClient::ToClientPing(ping) => {
390
+ v5::ToClient::ToClientPing(v5::ToClientPing { ts: ping.ts })
391
+ }
392
+ };
393
+
394
+ Ok(ToClientMk2::V5(inner))
395
+ } else {
396
+ bail!("unexpected version");
397
+ }
398
+ }
399
+ }
400
+
401
+ pub enum ToServerMk2 {
402
+ V4(v4::ToServer),
403
+ V6(v6::ToServer),
404
+ V7(v7::ToServer),
405
+ }
406
+
407
+ impl OwnedVersionedData for ToServerMk2 {
408
+ type Latest = v7::ToServer;
409
+
410
+ fn wrap_latest(latest: v7::ToServer) -> Self {
411
+ ToServerMk2::V7(latest)
412
+ }
413
+
414
+ fn unwrap_latest(self) -> Result<Self::Latest> {
415
+ if let ToServerMk2::V7(data) = self {
416
+ Ok(data)
417
+ } else {
418
+ bail!("version not latest");
419
+ }
420
+ }
421
+
422
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
423
+ match version {
424
+ 4 => Ok(ToServerMk2::V4(serde_bare::from_slice(payload)?)),
425
+ // v5 and v6 have the same ToServer binary format
426
+ 5 | 6 => Ok(ToServerMk2::V6(serde_bare::from_slice(payload)?)),
427
+ 7 => Ok(ToServerMk2::V7(serde_bare::from_slice(payload)?)),
428
+ _ => bail!("invalid version: {version}"),
429
+ }
430
+ }
431
+
432
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
433
+ match self {
434
+ ToServerMk2::V4(data) => serde_bare::to_vec(&data).map_err(Into::into),
435
+ ToServerMk2::V6(data) => serde_bare::to_vec(&data).map_err(Into::into),
436
+ ToServerMk2::V7(data) => serde_bare::to_vec(&data).map_err(Into::into),
437
+ }
438
+ }
439
+
440
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
441
+ // No changes between v1 and v4, no changes between v5 and v6
442
+ vec![Ok, Ok, Ok, Self::v4_to_v6, Ok, Self::v6_to_v7]
443
+ }
444
+
445
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
446
+ // No changes between v1 and v4, no changes between v5 and v6
447
+ vec![Self::v7_to_v6, Ok, Self::v6_to_v4, Ok, Ok, Ok]
448
+ }
449
+ }
450
+
451
+ impl ToServerMk2 {
452
+ fn v4_to_v6(self) -> Result<Self> {
453
+ if let ToServerMk2::V4(x) = self {
454
+ let inner = match x {
455
+ v4::ToServer::ToServerInit(init) => v6::ToServer::ToServerInit(v6::ToServerInit {
456
+ name: init.name,
457
+ version: init.version,
458
+ total_slots: init.total_slots,
459
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
460
+ map.into_iter()
461
+ .map(|(k, v)| {
462
+ (
463
+ k,
464
+ v6::ActorName {
465
+ metadata: v.metadata,
466
+ },
467
+ )
468
+ })
469
+ .collect()
470
+ }),
471
+ metadata: init.metadata,
472
+ }),
473
+ v4::ToServer::ToServerEvents(events) => v6::ToServer::ToServerEvents(
474
+ events
475
+ .into_iter()
476
+ .map(|event| {
477
+ let generation = match &event.inner {
478
+ v4::Event::EventActorIntent(intent) => intent.generation,
479
+ v4::Event::EventActorStateUpdate(state) => state.generation,
480
+ v4::Event::EventActorSetAlarm(alarm) => alarm.generation,
481
+ };
482
+
483
+ v6::EventWrapper {
484
+ checkpoint: v6::ActorCheckpoint {
485
+ actor_id: event.checkpoint.actor_id,
486
+ generation,
487
+ index: event.checkpoint.index,
488
+ },
489
+ inner: match event.inner {
490
+ v4::Event::EventActorIntent(intent) => {
491
+ v6::Event::EventActorIntent(v6::EventActorIntent {
492
+ intent: convert_actor_intent_v4_to_v6(intent.intent),
493
+ })
494
+ }
495
+ v4::Event::EventActorStateUpdate(state) => {
496
+ v6::Event::EventActorStateUpdate(
497
+ v6::EventActorStateUpdate {
498
+ state: convert_actor_state_v4_to_v6(state.state),
499
+ },
500
+ )
501
+ }
502
+ v4::Event::EventActorSetAlarm(alarm) => {
503
+ v6::Event::EventActorSetAlarm(v6::EventActorSetAlarm {
504
+ alarm_ts: alarm.alarm_ts,
505
+ })
506
+ }
507
+ },
508
+ }
509
+ })
510
+ .collect(),
511
+ ),
512
+ v4::ToServer::ToServerAckCommands(ack) => {
513
+ v6::ToServer::ToServerAckCommands(v6::ToServerAckCommands {
514
+ last_command_checkpoints: ack
515
+ .last_command_checkpoints
516
+ .into_iter()
517
+ .map(|cp| v6::ActorCheckpoint {
518
+ actor_id: cp.actor_id,
519
+ generation: 0, // Unknown in v4, use default
520
+ index: cp.index,
521
+ })
522
+ .collect(),
523
+ })
524
+ }
525
+ v4::ToServer::ToServerStopping => v6::ToServer::ToServerStopping,
526
+ v4::ToServer::ToServerPong(pong) => {
527
+ v6::ToServer::ToServerPong(v6::ToServerPong { ts: pong.ts })
528
+ }
529
+ v4::ToServer::ToServerKvRequest(req) => {
530
+ v6::ToServer::ToServerKvRequest(v6::ToServerKvRequest {
531
+ actor_id: req.actor_id,
532
+ request_id: req.request_id,
533
+ data: convert_kv_request_data_v4_to_v6(req.data),
534
+ })
535
+ }
536
+ v4::ToServer::ToServerTunnelMessage(msg) => {
537
+ v6::ToServer::ToServerTunnelMessage(v6::ToServerTunnelMessage {
538
+ message_id: v6::MessageId {
539
+ gateway_id: msg.message_id.gateway_id,
540
+ request_id: msg.message_id.request_id,
541
+ message_index: msg.message_id.message_index,
542
+ },
543
+ message_kind: convert_to_server_tunnel_message_kind_v4_to_v6(
544
+ msg.message_kind,
545
+ ),
546
+ })
547
+ }
548
+ };
549
+
550
+ Ok(ToServerMk2::V6(inner))
551
+ } else {
552
+ bail!("unexpected version");
553
+ }
554
+ }
555
+
556
+ fn v6_to_v4(self) -> Result<Self> {
557
+ if let ToServerMk2::V6(x) = self {
558
+ let inner = match x {
559
+ v6::ToServer::ToServerInit(init) => v4::ToServer::ToServerInit(v4::ToServerInit {
560
+ name: init.name,
561
+ version: init.version,
562
+ total_slots: init.total_slots,
563
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
564
+ map.into_iter()
565
+ .map(|(k, v)| {
566
+ (
567
+ k,
568
+ v4::ActorName {
569
+ metadata: v.metadata,
570
+ },
571
+ )
572
+ })
573
+ .collect()
574
+ }),
575
+ metadata: init.metadata,
576
+ }),
577
+ v6::ToServer::ToServerEvents(events) => v4::ToServer::ToServerEvents(
578
+ events
579
+ .into_iter()
580
+ .map(|event| v4::EventWrapper {
581
+ checkpoint: v4::ActorCheckpoint {
582
+ actor_id: event.checkpoint.actor_id.clone(),
583
+ index: event.checkpoint.index,
584
+ },
585
+ inner: match event.inner {
586
+ v6::Event::EventActorIntent(intent) => {
587
+ v4::Event::EventActorIntent(v4::EventActorIntent {
588
+ actor_id: event.checkpoint.actor_id,
589
+ generation: event.checkpoint.generation,
590
+ intent: convert_actor_intent_v6_to_v4(intent.intent),
591
+ })
592
+ }
593
+ v6::Event::EventActorStateUpdate(state) => {
594
+ v4::Event::EventActorStateUpdate(v4::EventActorStateUpdate {
595
+ actor_id: event.checkpoint.actor_id,
596
+ generation: event.checkpoint.generation,
597
+ state: convert_actor_state_v6_to_v4(state.state),
598
+ })
599
+ }
600
+ v6::Event::EventActorSetAlarm(alarm) => {
601
+ v4::Event::EventActorSetAlarm(v4::EventActorSetAlarm {
602
+ actor_id: event.checkpoint.actor_id,
603
+ generation: event.checkpoint.generation,
604
+ alarm_ts: alarm.alarm_ts,
605
+ })
606
+ }
607
+ },
608
+ })
609
+ .collect(),
610
+ ),
611
+ v6::ToServer::ToServerAckCommands(ack) => {
612
+ v4::ToServer::ToServerAckCommands(v4::ToServerAckCommands {
613
+ last_command_checkpoints: ack
614
+ .last_command_checkpoints
615
+ .into_iter()
616
+ .map(|cp| v4::ActorCheckpoint {
617
+ actor_id: cp.actor_id,
618
+ index: cp.index,
619
+ })
620
+ .collect(),
621
+ })
622
+ }
623
+ v6::ToServer::ToServerStopping => v4::ToServer::ToServerStopping,
624
+ v6::ToServer::ToServerPong(pong) => {
625
+ v4::ToServer::ToServerPong(v4::ToServerPong { ts: pong.ts })
626
+ }
627
+ v6::ToServer::ToServerKvRequest(req) => {
628
+ v4::ToServer::ToServerKvRequest(v4::ToServerKvRequest {
629
+ actor_id: req.actor_id,
630
+ request_id: req.request_id,
631
+ data: convert_kv_request_data_v6_to_v4(req.data),
632
+ })
633
+ }
634
+ v6::ToServer::ToServerTunnelMessage(msg) => {
635
+ v4::ToServer::ToServerTunnelMessage(v4::ToServerTunnelMessage {
636
+ message_id: v4::MessageId {
637
+ gateway_id: msg.message_id.gateway_id,
638
+ request_id: msg.message_id.request_id,
639
+ message_index: msg.message_id.message_index,
640
+ },
641
+ message_kind: convert_to_server_tunnel_message_kind_v6_to_v4(
642
+ msg.message_kind,
643
+ )?,
644
+ })
645
+ }
646
+ };
647
+
648
+ Ok(ToServerMk2::V4(inner))
649
+ } else {
650
+ bail!("unexpected version");
651
+ }
652
+ }
653
+
654
+ fn v6_to_v7(self) -> Result<Self> {
655
+ if let ToServerMk2::V6(x) = self {
656
+ let inner = match x {
657
+ v6::ToServer::ToServerInit(init) => v7::ToServer::ToServerInit(v7::ToServerInit {
658
+ name: init.name,
659
+ version: init.version,
660
+ total_slots: init.total_slots,
661
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
662
+ map.into_iter()
663
+ .map(|(k, v)| {
664
+ (
665
+ k,
666
+ v7::ActorName {
667
+ metadata: v.metadata,
668
+ },
669
+ )
670
+ })
671
+ .collect()
672
+ }),
673
+ metadata: init.metadata,
674
+ }),
675
+ v6::ToServer::ToServerEvents(events) => v7::ToServer::ToServerEvents(
676
+ events
677
+ .into_iter()
678
+ .map(|event| v7::EventWrapper {
679
+ checkpoint: v7::ActorCheckpoint {
680
+ actor_id: event.checkpoint.actor_id,
681
+ generation: event.checkpoint.generation,
682
+ index: event.checkpoint.index,
683
+ },
684
+ inner: match event.inner {
685
+ v6::Event::EventActorIntent(intent) => {
686
+ v7::Event::EventActorIntent(v7::EventActorIntent {
687
+ intent: match intent.intent {
688
+ v6::ActorIntent::ActorIntentSleep => {
689
+ v7::ActorIntent::ActorIntentSleep
690
+ }
691
+ v6::ActorIntent::ActorIntentStop => {
692
+ v7::ActorIntent::ActorIntentStop
693
+ }
694
+ },
695
+ })
696
+ }
697
+ v6::Event::EventActorStateUpdate(state) => {
698
+ v7::Event::EventActorStateUpdate(v7::EventActorStateUpdate {
699
+ state: match state.state {
700
+ v6::ActorState::ActorStateRunning => {
701
+ v7::ActorState::ActorStateRunning
702
+ }
703
+ v6::ActorState::ActorStateStopped(stopped) => {
704
+ v7::ActorState::ActorStateStopped(
705
+ v7::ActorStateStopped {
706
+ code: match stopped.code {
707
+ v6::StopCode::Ok => v7::StopCode::Ok,
708
+ v6::StopCode::Error => {
709
+ v7::StopCode::Error
710
+ }
711
+ },
712
+ message: stopped.message,
713
+ },
714
+ )
715
+ }
716
+ },
717
+ })
718
+ }
719
+ v6::Event::EventActorSetAlarm(alarm) => {
720
+ v7::Event::EventActorSetAlarm(v7::EventActorSetAlarm {
721
+ alarm_ts: alarm.alarm_ts,
722
+ })
723
+ }
724
+ },
725
+ })
726
+ .collect(),
727
+ ),
728
+ v6::ToServer::ToServerAckCommands(ack) => {
729
+ v7::ToServer::ToServerAckCommands(v7::ToServerAckCommands {
730
+ last_command_checkpoints: ack
731
+ .last_command_checkpoints
732
+ .into_iter()
733
+ .map(|cp| v7::ActorCheckpoint {
734
+ actor_id: cp.actor_id,
735
+ generation: cp.generation,
736
+ index: cp.index,
737
+ })
738
+ .collect(),
739
+ })
740
+ }
741
+ v6::ToServer::ToServerStopping => v7::ToServer::ToServerStopping,
742
+ v6::ToServer::ToServerPong(pong) => {
743
+ v7::ToServer::ToServerPong(v7::ToServerPong { ts: pong.ts })
744
+ }
745
+ v6::ToServer::ToServerKvRequest(req) => {
746
+ v7::ToServer::ToServerKvRequest(v7::ToServerKvRequest {
747
+ actor_id: req.actor_id,
748
+ request_id: req.request_id,
749
+ data: convert_kv_request_data_v6_to_v7(req.data),
750
+ })
751
+ }
752
+ v6::ToServer::ToServerTunnelMessage(msg) => {
753
+ v7::ToServer::ToServerTunnelMessage(v7::ToServerTunnelMessage {
754
+ message_id: v7::MessageId {
755
+ gateway_id: msg.message_id.gateway_id,
756
+ request_id: msg.message_id.request_id,
757
+ message_index: msg.message_id.message_index,
758
+ },
759
+ message_kind: match msg.message_kind {
760
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
761
+ v7::ToServerTunnelMessageKind::ToServerResponseStart(
762
+ v7::ToServerResponseStart {
763
+ status: resp.status,
764
+ headers: resp.headers,
765
+ body: resp.body,
766
+ stream: resp.stream,
767
+ },
768
+ )
769
+ }
770
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
771
+ v7::ToServerTunnelMessageKind::ToServerResponseChunk(
772
+ v7::ToServerResponseChunk {
773
+ body: chunk.body,
774
+ finish: chunk.finish,
775
+ },
776
+ )
777
+ }
778
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort => {
779
+ v7::ToServerTunnelMessageKind::ToServerResponseAbort
780
+ }
781
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
782
+ v7::ToServerTunnelMessageKind::ToServerWebSocketOpen(
783
+ v7::ToServerWebSocketOpen {
784
+ can_hibernate: open.can_hibernate,
785
+ },
786
+ )
787
+ }
788
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(message) => {
789
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessage(
790
+ v7::ToServerWebSocketMessage {
791
+ data: message.data,
792
+ binary: message.binary,
793
+ },
794
+ )
795
+ }
796
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
797
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
798
+ v7::ToServerWebSocketMessageAck { index: ack.index },
799
+ )
800
+ }
801
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
802
+ v7::ToServerTunnelMessageKind::ToServerWebSocketClose(
803
+ v7::ToServerWebSocketClose {
804
+ code: close.code,
805
+ reason: close.reason,
806
+ hibernate: close.hibernate,
807
+ },
808
+ )
809
+ }
810
+ },
811
+ })
812
+ }
813
+ };
814
+
815
+ Ok(ToServerMk2::V7(inner))
816
+ } else {
817
+ bail!("unexpected version");
818
+ }
819
+ }
820
+
821
+ fn v7_to_v6(self) -> Result<Self> {
822
+ if let ToServerMk2::V7(x) = self {
823
+ let inner = match x {
824
+ v7::ToServer::ToServerInit(init) => v6::ToServer::ToServerInit(v6::ToServerInit {
825
+ name: init.name,
826
+ version: init.version,
827
+ total_slots: init.total_slots,
828
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
829
+ map.into_iter()
830
+ .map(|(k, v)| {
831
+ (
832
+ k,
833
+ v6::ActorName {
834
+ metadata: v.metadata,
835
+ },
836
+ )
837
+ })
838
+ .collect()
839
+ }),
840
+ metadata: init.metadata,
841
+ }),
842
+ v7::ToServer::ToServerEvents(events) => v6::ToServer::ToServerEvents(
843
+ events
844
+ .into_iter()
845
+ .map(|event| v6::EventWrapper {
846
+ checkpoint: v6::ActorCheckpoint {
847
+ actor_id: event.checkpoint.actor_id,
848
+ generation: event.checkpoint.generation,
849
+ index: event.checkpoint.index,
850
+ },
851
+ inner: match event.inner {
852
+ v7::Event::EventActorIntent(intent) => {
853
+ v6::Event::EventActorIntent(v6::EventActorIntent {
854
+ intent: match intent.intent {
855
+ v7::ActorIntent::ActorIntentSleep => {
856
+ v6::ActorIntent::ActorIntentSleep
857
+ }
858
+ v7::ActorIntent::ActorIntentStop => {
859
+ v6::ActorIntent::ActorIntentStop
860
+ }
861
+ },
862
+ })
863
+ }
864
+ v7::Event::EventActorStateUpdate(state) => {
865
+ v6::Event::EventActorStateUpdate(v6::EventActorStateUpdate {
866
+ state: match state.state {
867
+ v7::ActorState::ActorStateRunning => {
868
+ v6::ActorState::ActorStateRunning
869
+ }
870
+ v7::ActorState::ActorStateStopped(stopped) => {
871
+ v6::ActorState::ActorStateStopped(
872
+ v6::ActorStateStopped {
873
+ code: match stopped.code {
874
+ v7::StopCode::Ok => v6::StopCode::Ok,
875
+ v7::StopCode::Error => {
876
+ v6::StopCode::Error
877
+ }
878
+ },
879
+ message: stopped.message,
880
+ },
881
+ )
882
+ }
883
+ },
884
+ })
885
+ }
886
+ v7::Event::EventActorSetAlarm(alarm) => {
887
+ v6::Event::EventActorSetAlarm(v6::EventActorSetAlarm {
888
+ alarm_ts: alarm.alarm_ts,
889
+ })
890
+ }
891
+ },
892
+ })
893
+ .collect(),
894
+ ),
895
+ v7::ToServer::ToServerAckCommands(ack) => {
896
+ v6::ToServer::ToServerAckCommands(v6::ToServerAckCommands {
897
+ last_command_checkpoints: ack
898
+ .last_command_checkpoints
899
+ .into_iter()
900
+ .map(|cp| v6::ActorCheckpoint {
901
+ actor_id: cp.actor_id,
902
+ generation: cp.generation,
903
+ index: cp.index,
904
+ })
905
+ .collect(),
906
+ })
907
+ }
908
+ v7::ToServer::ToServerStopping => v6::ToServer::ToServerStopping,
909
+ v7::ToServer::ToServerPong(pong) => {
910
+ v6::ToServer::ToServerPong(v6::ToServerPong { ts: pong.ts })
911
+ }
912
+ v7::ToServer::ToServerKvRequest(req) => {
913
+ v6::ToServer::ToServerKvRequest(v6::ToServerKvRequest {
914
+ actor_id: req.actor_id,
915
+ request_id: req.request_id,
916
+ data: convert_kv_request_data_v7_to_v6(req.data)?,
917
+ })
918
+ }
919
+ v7::ToServer::ToServerTunnelMessage(msg) => {
920
+ v6::ToServer::ToServerTunnelMessage(v6::ToServerTunnelMessage {
921
+ message_id: v6::MessageId {
922
+ gateway_id: msg.message_id.gateway_id,
923
+ request_id: msg.message_id.request_id,
924
+ message_index: msg.message_id.message_index,
925
+ },
926
+ message_kind: match msg.message_kind {
927
+ v7::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
928
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(
929
+ v6::ToServerResponseStart {
930
+ status: resp.status,
931
+ headers: resp.headers,
932
+ body: resp.body,
933
+ stream: resp.stream,
934
+ },
935
+ )
936
+ }
937
+ v7::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
938
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(
939
+ v6::ToServerResponseChunk {
940
+ body: chunk.body,
941
+ finish: chunk.finish,
942
+ },
943
+ )
944
+ }
945
+ v7::ToServerTunnelMessageKind::ToServerResponseAbort => {
946
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort
947
+ }
948
+ v7::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
949
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(
950
+ v6::ToServerWebSocketOpen {
951
+ can_hibernate: open.can_hibernate,
952
+ },
953
+ )
954
+ }
955
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessage(message) => {
956
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(
957
+ v6::ToServerWebSocketMessage {
958
+ data: message.data,
959
+ binary: message.binary,
960
+ },
961
+ )
962
+ }
963
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
964
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
965
+ v6::ToServerWebSocketMessageAck { index: ack.index },
966
+ )
967
+ }
968
+ v7::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
969
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(
970
+ v6::ToServerWebSocketClose {
971
+ code: close.code,
972
+ reason: close.reason,
973
+ hibernate: close.hibernate,
974
+ },
975
+ )
976
+ }
977
+ },
978
+ })
979
+ }
980
+ };
981
+
982
+ Ok(ToServerMk2::V6(inner))
983
+ } else {
984
+ bail!("unexpected version");
985
+ }
986
+ }
987
+ }
988
+
989
+ pub enum ToRunnerMk2 {
990
+ V4(v4::ToRunner),
991
+ V7(v7::ToRunner),
992
+ }
993
+
994
+ impl OwnedVersionedData for ToRunnerMk2 {
995
+ type Latest = v7::ToRunner;
996
+
997
+ fn wrap_latest(latest: v7::ToRunner) -> Self {
998
+ ToRunnerMk2::V7(latest)
999
+ }
1000
+
1001
+ fn unwrap_latest(self) -> Result<Self::Latest> {
1002
+ if let ToRunnerMk2::V7(data) = self {
1003
+ Ok(data)
1004
+ } else {
1005
+ bail!("version not latest");
1006
+ }
1007
+ }
1008
+
1009
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
1010
+ match version {
1011
+ 4 => Ok(ToRunnerMk2::V4(serde_bare::from_slice(payload)?)),
1012
+ 5 | 6 | 7 => Ok(ToRunnerMk2::V7(serde_bare::from_slice(payload)?)),
1013
+ _ => bail!("invalid version: {version}"),
1014
+ }
1015
+ }
1016
+
1017
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
1018
+ match self {
1019
+ ToRunnerMk2::V4(data) => serde_bare::to_vec(&data).map_err(Into::into),
1020
+ ToRunnerMk2::V7(data) => serde_bare::to_vec(&data).map_err(Into::into),
1021
+ }
1022
+ }
1023
+
1024
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1025
+ vec![Ok, Ok, Ok, Self::v4_to_v7, Ok, Ok]
1026
+ }
1027
+
1028
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1029
+ vec![Ok, Ok, Self::v7_to_v4, Ok, Ok, Ok]
1030
+ }
1031
+ }
1032
+
1033
+ impl ToRunnerMk2 {
1034
+ fn v4_to_v7(self) -> Result<Self> {
1035
+ if let ToRunnerMk2::V4(x) = self {
1036
+ let inner = match x {
1037
+ v4::ToRunner::ToRunnerPing(ping) => v7::ToRunner::ToRunnerPing(v7::ToRunnerPing {
1038
+ gateway_id: ping.gateway_id,
1039
+ request_id: ping.request_id,
1040
+ ts: ping.ts,
1041
+ }),
1042
+ v4::ToRunner::ToRunnerClose => v7::ToRunner::ToRunnerClose,
1043
+ v4::ToRunner::ToClientCommands(commands) => v7::ToRunner::ToClientCommands(
1044
+ commands
1045
+ .into_iter()
1046
+ .map(|cmd| v7::CommandWrapper {
1047
+ checkpoint: v7::ActorCheckpoint {
1048
+ actor_id: cmd.checkpoint.actor_id,
1049
+ generation: match &cmd.inner {
1050
+ v4::Command::CommandStartActor(start) => start.generation,
1051
+ v4::Command::CommandStopActor(stop) => stop.generation,
1052
+ },
1053
+ index: cmd.checkpoint.index,
1054
+ },
1055
+ inner: match cmd.inner {
1056
+ v4::Command::CommandStartActor(start) => {
1057
+ v7::Command::CommandStartActor(v7::CommandStartActor {
1058
+ config: v7::ActorConfig {
1059
+ name: start.config.name,
1060
+ key: start.config.key,
1061
+ create_ts: start.config.create_ts,
1062
+ input: start.config.input,
1063
+ },
1064
+ hibernating_requests: start
1065
+ .hibernating_requests
1066
+ .into_iter()
1067
+ .map(|req| v7::HibernatingRequest {
1068
+ gateway_id: req.gateway_id,
1069
+ request_id: req.request_id,
1070
+ })
1071
+ .collect(),
1072
+ })
1073
+ }
1074
+ v4::Command::CommandStopActor(_) => v7::Command::CommandStopActor,
1075
+ },
1076
+ })
1077
+ .collect(),
1078
+ ),
1079
+ v4::ToRunner::ToClientAckEvents(ack) => {
1080
+ v7::ToRunner::ToClientAckEvents(v7::ToClientAckEvents {
1081
+ last_event_checkpoints: ack
1082
+ .last_event_checkpoints
1083
+ .into_iter()
1084
+ .map(|cp| v7::ActorCheckpoint {
1085
+ actor_id: cp.actor_id,
1086
+ generation: 0, // Unknown in v4, use default
1087
+ index: cp.index,
1088
+ })
1089
+ .collect(),
1090
+ })
1091
+ }
1092
+ v4::ToRunner::ToClientTunnelMessage(msg) => {
1093
+ v7::ToRunner::ToClientTunnelMessage(v7::ToClientTunnelMessage {
1094
+ message_id: v7::MessageId {
1095
+ gateway_id: msg.message_id.gateway_id,
1096
+ request_id: msg.message_id.request_id,
1097
+ message_index: msg.message_id.message_index,
1098
+ },
1099
+ message_kind: convert_to_client_tunnel_message_kind_v4_to_v7(
1100
+ msg.message_kind,
1101
+ ),
1102
+ })
1103
+ }
1104
+ };
1105
+
1106
+ Ok(ToRunnerMk2::V7(inner))
1107
+ } else {
1108
+ bail!("unexpected version");
1109
+ }
1110
+ }
1111
+
1112
+ fn v7_to_v4(self) -> Result<Self> {
1113
+ if let ToRunnerMk2::V7(x) = self {
1114
+ let inner = match x {
1115
+ v7::ToRunner::ToRunnerPing(ping) => v4::ToRunner::ToRunnerPing(v4::ToRunnerPing {
1116
+ gateway_id: ping.gateway_id,
1117
+ request_id: ping.request_id,
1118
+ ts: ping.ts,
1119
+ }),
1120
+ v7::ToRunner::ToRunnerClose => v4::ToRunner::ToRunnerClose,
1121
+ v7::ToRunner::ToClientCommands(commands) => v4::ToRunner::ToClientCommands(
1122
+ commands
1123
+ .into_iter()
1124
+ .map(|cmd| v4::CommandWrapper {
1125
+ checkpoint: v4::ActorCheckpoint {
1126
+ actor_id: cmd.checkpoint.actor_id,
1127
+ index: cmd.checkpoint.index,
1128
+ },
1129
+ inner: match cmd.inner {
1130
+ v7::Command::CommandStartActor(start) => {
1131
+ v4::Command::CommandStartActor(v4::CommandStartActor {
1132
+ generation: cmd.checkpoint.generation,
1133
+ config: v4::ActorConfig {
1134
+ name: start.config.name,
1135
+ key: start.config.key,
1136
+ create_ts: start.config.create_ts,
1137
+ input: start.config.input,
1138
+ },
1139
+ hibernating_requests: start
1140
+ .hibernating_requests
1141
+ .into_iter()
1142
+ .map(|req| v4::HibernatingRequest {
1143
+ gateway_id: req.gateway_id,
1144
+ request_id: req.request_id,
1145
+ })
1146
+ .collect(),
1147
+ })
1148
+ }
1149
+ v7::Command::CommandStopActor => {
1150
+ v4::Command::CommandStopActor(v4::CommandStopActor {
1151
+ generation: cmd.checkpoint.generation,
1152
+ })
1153
+ }
1154
+ },
1155
+ })
1156
+ .collect(),
1157
+ ),
1158
+ v7::ToRunner::ToClientAckEvents(ack) => {
1159
+ v4::ToRunner::ToClientAckEvents(v4::ToClientAckEvents {
1160
+ last_event_checkpoints: ack
1161
+ .last_event_checkpoints
1162
+ .into_iter()
1163
+ .map(|cp| v4::ActorCheckpoint {
1164
+ actor_id: cp.actor_id,
1165
+ index: cp.index,
1166
+ })
1167
+ .collect(),
1168
+ })
1169
+ }
1170
+ v7::ToRunner::ToClientTunnelMessage(msg) => {
1171
+ v4::ToRunner::ToClientTunnelMessage(v4::ToClientTunnelMessage {
1172
+ message_id: v4::MessageId {
1173
+ gateway_id: msg.message_id.gateway_id,
1174
+ request_id: msg.message_id.request_id,
1175
+ message_index: msg.message_id.message_index,
1176
+ },
1177
+ message_kind: convert_to_client_tunnel_message_kind_v7_to_v4(
1178
+ msg.message_kind,
1179
+ ),
1180
+ })
1181
+ }
1182
+ };
1183
+
1184
+ Ok(ToRunnerMk2::V4(inner))
1185
+ } else {
1186
+ bail!("unexpected version");
1187
+ }
1188
+ }
1189
+ }
1190
+
1191
+ pub enum ToClient {
1192
+ V1(v1::ToClient),
1193
+ V2(v2::ToClient),
1194
+ V3(v3::ToClient),
1195
+ }
1196
+
1197
+ impl OwnedVersionedData for ToClient {
1198
+ type Latest = v3::ToClient;
1199
+
1200
+ fn wrap_latest(latest: v3::ToClient) -> Self {
1201
+ ToClient::V3(latest)
1202
+ }
1203
+
1204
+ fn unwrap_latest(self) -> Result<Self::Latest> {
1205
+ if let ToClient::V3(data) = self {
1206
+ Ok(data)
1207
+ } else {
1208
+ bail!("version not latest");
1209
+ }
1210
+ }
1211
+
1212
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
1213
+ match version {
1214
+ 1 => Ok(ToClient::V1(serde_bare::from_slice(payload)?)),
1215
+ 2 => Ok(ToClient::V2(serde_bare::from_slice(payload)?)),
1216
+ 3 => Ok(ToClient::V3(serde_bare::from_slice(payload)?)),
1217
+ _ => bail!("invalid version: {version}"),
1218
+ }
1219
+ }
1220
+
1221
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
1222
+ match self {
1223
+ ToClient::V1(data) => serde_bare::to_vec(&data).map_err(Into::into),
1224
+ ToClient::V2(data) => serde_bare::to_vec(&data).map_err(Into::into),
1225
+ ToClient::V3(data) => serde_bare::to_vec(&data).map_err(Into::into),
1226
+ }
1227
+ }
1228
+
1229
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1230
+ vec![Self::v1_to_v2, Self::v2_to_v3]
1231
+ }
1232
+
1233
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1234
+ vec![Self::v3_to_v2, Self::v2_to_v1]
1235
+ }
1236
+ }
1237
+
1238
+ impl ToClient {
1239
+ fn v1_to_v2(self) -> Result<Self> {
1240
+ if let ToClient::V1(x) = self {
1241
+ let inner = match x {
1242
+ v1::ToClient::ToClientInit(init) => v2::ToClient::ToClientInit(v2::ToClientInit {
1243
+ runner_id: init.runner_id,
1244
+ last_event_idx: init.last_event_idx,
1245
+ metadata: v2::ProtocolMetadata {
1246
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
1247
+ },
1248
+ }),
1249
+ v1::ToClient::ToClientClose => v2::ToClient::ToClientClose,
1250
+ v1::ToClient::ToClientCommands(commands) => v2::ToClient::ToClientCommands(
1251
+ commands
1252
+ .into_iter()
1253
+ .map(|cmd| v2::CommandWrapper {
1254
+ index: cmd.index,
1255
+ inner: match cmd.inner {
1256
+ v1::Command::CommandStartActor(start) => {
1257
+ v2::Command::CommandStartActor(v2::CommandStartActor {
1258
+ actor_id: start.actor_id,
1259
+ generation: start.generation,
1260
+ config: v2::ActorConfig {
1261
+ name: start.config.name,
1262
+ key: start.config.key,
1263
+ create_ts: start.config.create_ts,
1264
+ input: start.config.input,
1265
+ },
1266
+ })
1267
+ }
1268
+ v1::Command::CommandStopActor(stop) => {
1269
+ v2::Command::CommandStopActor(v2::CommandStopActor {
1270
+ actor_id: stop.actor_id,
1271
+ generation: stop.generation,
1272
+ })
1273
+ }
1274
+ },
1275
+ })
1276
+ .collect(),
1277
+ ),
1278
+ v1::ToClient::ToClientAckEvents(ack) => {
1279
+ v2::ToClient::ToClientAckEvents(v2::ToClientAckEvents {
1280
+ last_event_idx: ack.last_event_idx,
1281
+ })
1282
+ }
1283
+ v1::ToClient::ToClientKvResponse(resp) => {
1284
+ v2::ToClient::ToClientKvResponse(v2::ToClientKvResponse {
1285
+ request_id: resp.request_id,
1286
+ data: convert_kv_response_data_v1_to_v2(resp.data),
1287
+ })
1288
+ }
1289
+ v1::ToClient::ToClientTunnelMessage(msg) => {
1290
+ v2::ToClient::ToClientTunnelMessage(v2::ToClientTunnelMessage {
1291
+ request_id: msg.request_id,
1292
+ message_id: msg.message_id,
1293
+ message_kind: convert_to_client_tunnel_message_kind_v1_to_v2(
1294
+ msg.message_kind,
1295
+ ),
1296
+ gateway_reply_to: msg.gateway_reply_to,
1297
+ })
1298
+ }
1299
+ };
1300
+
1301
+ Ok(ToClient::V2(inner))
1302
+ } else {
1303
+ bail!("unexpected version");
1304
+ }
1305
+ }
1306
+
1307
+ fn v2_to_v3(self) -> Result<Self> {
1308
+ if let ToClient::V2(x) = self {
1309
+ let inner = match x {
1310
+ v2::ToClient::ToClientInit(init) => v3::ToClient::ToClientInit(v3::ToClientInit {
1311
+ runner_id: init.runner_id,
1312
+ last_event_idx: init.last_event_idx,
1313
+ metadata: v3::ProtocolMetadata {
1314
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
1315
+ },
1316
+ }),
1317
+ v2::ToClient::ToClientClose => v3::ToClient::ToClientClose,
1318
+ v2::ToClient::ToClientCommands(commands) => v3::ToClient::ToClientCommands(
1319
+ commands
1320
+ .into_iter()
1321
+ .map(|cmd| v3::CommandWrapper {
1322
+ index: cmd.index,
1323
+ inner: match cmd.inner {
1324
+ v2::Command::CommandStartActor(start) => {
1325
+ v3::Command::CommandStartActor(v3::CommandStartActor {
1326
+ actor_id: start.actor_id,
1327
+ generation: start.generation,
1328
+ config: v3::ActorConfig {
1329
+ name: start.config.name,
1330
+ key: start.config.key,
1331
+ create_ts: start.config.create_ts,
1332
+ input: start.config.input,
1333
+ },
1334
+ hibernating_requests: Vec::new(),
1335
+ })
1336
+ }
1337
+ v2::Command::CommandStopActor(stop) => {
1338
+ v3::Command::CommandStopActor(v3::CommandStopActor {
1339
+ actor_id: stop.actor_id,
1340
+ generation: stop.generation,
1341
+ })
1342
+ }
1343
+ },
1344
+ })
1345
+ .collect(),
1346
+ ),
1347
+ v2::ToClient::ToClientAckEvents(ack) => {
1348
+ v3::ToClient::ToClientAckEvents(v3::ToClientAckEvents {
1349
+ last_event_idx: ack.last_event_idx,
1350
+ })
1351
+ }
1352
+ v2::ToClient::ToClientKvResponse(resp) => {
1353
+ v3::ToClient::ToClientKvResponse(v3::ToClientKvResponse {
1354
+ request_id: resp.request_id,
1355
+ data: convert_kv_response_data_v2_to_v3(resp.data),
1356
+ })
1357
+ }
1358
+ v2::ToClient::ToClientTunnelMessage(msg) => {
1359
+ // Extract v3 message_id from v2's UUIDs
1360
+ // v2.message_id (UUID) contains: gateway_id (4) + request_id (4) + message_index (2) = 10 bytes
1361
+ let decoded = decode_bytes_from_uuid(&msg.request_id);
1362
+
1363
+ let mut gateway_id = [0u8; 4];
1364
+ gateway_id.copy_from_slice(&decoded[..4]);
1365
+ let mut request_id = [0u8; 4];
1366
+ request_id.copy_from_slice(&decoded[4..8]);
1367
+ let message_index = u16::from_le_bytes([decoded[8], decoded[9]]);
1368
+
1369
+ v3::ToClient::ToClientTunnelMessage(v3::ToClientTunnelMessage {
1370
+ message_id: v3::MessageId {
1371
+ gateway_id,
1372
+ request_id,
1373
+ message_index,
1374
+ },
1375
+ message_kind: convert_to_client_tunnel_message_kind_v2_to_v3(
1376
+ msg.message_kind,
1377
+ ),
1378
+ })
1379
+ }
1380
+ };
1381
+
1382
+ Ok(ToClient::V3(inner))
1383
+ } else {
1384
+ bail!("unexpected version");
1385
+ }
1386
+ }
1387
+
1388
+ fn v3_to_v2(self) -> Result<Self> {
1389
+ if let ToClient::V3(x) = self {
1390
+ let inner = match x {
1391
+ v3::ToClient::ToClientInit(init) => v2::ToClient::ToClientInit(v2::ToClientInit {
1392
+ runner_id: init.runner_id,
1393
+ last_event_idx: init.last_event_idx,
1394
+ metadata: v2::ProtocolMetadata {
1395
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
1396
+ },
1397
+ }),
1398
+ v3::ToClient::ToClientClose => v2::ToClient::ToClientClose,
1399
+ v3::ToClient::ToClientCommands(commands) => v2::ToClient::ToClientCommands(
1400
+ commands
1401
+ .into_iter()
1402
+ .map(|cmd| v2::CommandWrapper {
1403
+ index: cmd.index,
1404
+ inner: match cmd.inner {
1405
+ v3::Command::CommandStartActor(start) => {
1406
+ v2::Command::CommandStartActor(v2::CommandStartActor {
1407
+ actor_id: start.actor_id,
1408
+ generation: start.generation,
1409
+ config: v2::ActorConfig {
1410
+ name: start.config.name,
1411
+ key: start.config.key,
1412
+ create_ts: start.config.create_ts,
1413
+ input: start.config.input,
1414
+ },
1415
+ })
1416
+ }
1417
+ v3::Command::CommandStopActor(stop) => {
1418
+ v2::Command::CommandStopActor(v2::CommandStopActor {
1419
+ actor_id: stop.actor_id,
1420
+ generation: stop.generation,
1421
+ })
1422
+ }
1423
+ },
1424
+ })
1425
+ .collect(),
1426
+ ),
1427
+ v3::ToClient::ToClientAckEvents(ack) => {
1428
+ v2::ToClient::ToClientAckEvents(v2::ToClientAckEvents {
1429
+ last_event_idx: ack.last_event_idx,
1430
+ })
1431
+ }
1432
+ v3::ToClient::ToClientKvResponse(resp) => {
1433
+ v2::ToClient::ToClientKvResponse(v2::ToClientKvResponse {
1434
+ request_id: resp.request_id,
1435
+ data: convert_kv_response_data_v3_to_v2(resp.data),
1436
+ })
1437
+ }
1438
+ v3::ToClient::ToClientTunnelMessage(msg) => {
1439
+ // Encode v3 message_id into v2's UUIDs
1440
+ // v3: gateway_id (4) + request_id (4) + message_index (2) = 10 bytes
1441
+ let mut data = [0u8; 10];
1442
+ data[..4].copy_from_slice(&msg.message_id.gateway_id);
1443
+ data[4..8].copy_from_slice(&msg.message_id.request_id);
1444
+ data[8..10].copy_from_slice(&msg.message_id.message_index.to_le_bytes());
1445
+
1446
+ let message_id = encode_bytes_to_uuid(&data);
1447
+
1448
+ // request_id contains gateway_id + request_id for backwards compatibility
1449
+ let mut request_id_data = [0u8; 8];
1450
+ request_id_data[..4].copy_from_slice(&msg.message_id.gateway_id);
1451
+ request_id_data[4..8].copy_from_slice(&msg.message_id.request_id);
1452
+ let request_id = encode_bytes_to_uuid(&request_id_data);
1453
+
1454
+ v2::ToClient::ToClientTunnelMessage(v2::ToClientTunnelMessage {
1455
+ request_id,
1456
+ message_id,
1457
+ message_kind: convert_to_client_tunnel_message_kind_v3_to_v2(
1458
+ msg.message_kind,
1459
+ &msg.message_id,
1460
+ )?,
1461
+ gateway_reply_to: None,
1462
+ })
1463
+ }
1464
+ };
1465
+
1466
+ Ok(ToClient::V2(inner))
1467
+ } else {
1468
+ bail!("unexpected version");
1469
+ }
1470
+ }
1471
+
1472
+ fn v2_to_v1(self) -> Result<Self> {
1473
+ if let ToClient::V2(x) = self {
1474
+ let inner = match x {
1475
+ v2::ToClient::ToClientInit(init) => v1::ToClient::ToClientInit(v1::ToClientInit {
1476
+ runner_id: init.runner_id,
1477
+ last_event_idx: init.last_event_idx,
1478
+ metadata: v1::ProtocolMetadata {
1479
+ runner_lost_threshold: init.metadata.runner_lost_threshold,
1480
+ },
1481
+ }),
1482
+ v2::ToClient::ToClientClose => v1::ToClient::ToClientClose,
1483
+ v2::ToClient::ToClientCommands(commands) => v1::ToClient::ToClientCommands(
1484
+ commands
1485
+ .into_iter()
1486
+ .map(|cmd| v1::CommandWrapper {
1487
+ index: cmd.index,
1488
+ inner: match cmd.inner {
1489
+ v2::Command::CommandStartActor(start) => {
1490
+ v1::Command::CommandStartActor(v1::CommandStartActor {
1491
+ actor_id: start.actor_id,
1492
+ generation: start.generation,
1493
+ config: v1::ActorConfig {
1494
+ name: start.config.name,
1495
+ key: start.config.key,
1496
+ create_ts: start.config.create_ts,
1497
+ input: start.config.input,
1498
+ },
1499
+ })
1500
+ }
1501
+ v2::Command::CommandStopActor(stop) => {
1502
+ v1::Command::CommandStopActor(v1::CommandStopActor {
1503
+ actor_id: stop.actor_id,
1504
+ generation: stop.generation,
1505
+ })
1506
+ }
1507
+ },
1508
+ })
1509
+ .collect(),
1510
+ ),
1511
+ v2::ToClient::ToClientAckEvents(ack) => {
1512
+ v1::ToClient::ToClientAckEvents(v1::ToClientAckEvents {
1513
+ last_event_idx: ack.last_event_idx,
1514
+ })
1515
+ }
1516
+ v2::ToClient::ToClientKvResponse(resp) => {
1517
+ v1::ToClient::ToClientKvResponse(v1::ToClientKvResponse {
1518
+ request_id: resp.request_id,
1519
+ data: convert_kv_response_data_v2_to_v1(resp.data),
1520
+ })
1521
+ }
1522
+ v2::ToClient::ToClientTunnelMessage(msg) => {
1523
+ v1::ToClient::ToClientTunnelMessage(v1::ToClientTunnelMessage {
1524
+ request_id: msg.request_id,
1525
+ message_id: msg.message_id,
1526
+ message_kind: convert_to_client_tunnel_message_kind_v2_to_v1(
1527
+ msg.message_kind,
1528
+ )?,
1529
+ gateway_reply_to: msg.gateway_reply_to,
1530
+ })
1531
+ }
1532
+ };
1533
+
1534
+ Ok(ToClient::V1(inner))
1535
+ } else {
1536
+ bail!("unexpected version");
1537
+ }
1538
+ }
1539
+ }
1540
+
1541
+ pub enum ToServer {
1542
+ V1(v1::ToServer),
1543
+ V2(v2::ToServer),
1544
+ V3(v3::ToServer),
1545
+ }
1546
+
1547
+ impl OwnedVersionedData for ToServer {
1548
+ type Latest = v3::ToServer;
1549
+
1550
+ fn wrap_latest(latest: v3::ToServer) -> Self {
1551
+ ToServer::V3(latest)
1552
+ }
1553
+
1554
+ fn unwrap_latest(self) -> Result<Self::Latest> {
1555
+ if let ToServer::V3(data) = self {
1556
+ Ok(data)
1557
+ } else {
1558
+ bail!("version not latest");
1559
+ }
1560
+ }
1561
+
1562
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
1563
+ match version {
1564
+ 1 => Ok(ToServer::V1(serde_bare::from_slice(payload)?)),
1565
+ 2 => Ok(ToServer::V2(serde_bare::from_slice(payload)?)),
1566
+ 3 => Ok(ToServer::V3(serde_bare::from_slice(payload)?)),
1567
+ _ => bail!("invalid version: {version}"),
1568
+ }
1569
+ }
1570
+
1571
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
1572
+ match self {
1573
+ ToServer::V1(data) => serde_bare::to_vec(&data).map_err(Into::into),
1574
+ ToServer::V2(data) => serde_bare::to_vec(&data).map_err(Into::into),
1575
+ ToServer::V3(data) => serde_bare::to_vec(&data).map_err(Into::into),
1576
+ }
1577
+ }
1578
+
1579
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1580
+ vec![Self::v1_to_v2, Self::v2_to_v3]
1581
+ }
1582
+
1583
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1584
+ vec![Self::v3_to_v2, Self::v2_to_v1]
1585
+ }
1586
+ }
1587
+
1588
+ impl ToServer {
1589
+ fn v1_to_v2(self) -> Result<Self> {
1590
+ if let ToServer::V1(x) = self {
1591
+ let inner = match x {
1592
+ v1::ToServer::ToServerInit(init) => v2::ToServer::ToServerInit(v2::ToServerInit {
1593
+ name: init.name,
1594
+ version: init.version,
1595
+ total_slots: init.total_slots,
1596
+ last_command_idx: init.last_command_idx,
1597
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
1598
+ map.into_iter()
1599
+ .map(|(k, v)| {
1600
+ (
1601
+ k,
1602
+ v2::ActorName {
1603
+ metadata: v.metadata,
1604
+ },
1605
+ )
1606
+ })
1607
+ .collect()
1608
+ }),
1609
+ metadata: init.metadata,
1610
+ }),
1611
+ v1::ToServer::ToServerEvents(events) => v2::ToServer::ToServerEvents(
1612
+ events
1613
+ .into_iter()
1614
+ .map(|event| v2::EventWrapper {
1615
+ index: event.index,
1616
+ inner: convert_event_v1_to_v2(event.inner),
1617
+ })
1618
+ .collect(),
1619
+ ),
1620
+ v1::ToServer::ToServerAckCommands(ack) => {
1621
+ v2::ToServer::ToServerAckCommands(v2::ToServerAckCommands {
1622
+ last_command_idx: ack.last_command_idx,
1623
+ })
1624
+ }
1625
+ v1::ToServer::ToServerStopping => v2::ToServer::ToServerStopping,
1626
+ v1::ToServer::ToServerPing(ping) => {
1627
+ v2::ToServer::ToServerPing(v2::ToServerPing { ts: ping.ts })
1628
+ }
1629
+ v1::ToServer::ToServerKvRequest(req) => {
1630
+ v2::ToServer::ToServerKvRequest(v2::ToServerKvRequest {
1631
+ actor_id: req.actor_id,
1632
+ request_id: req.request_id,
1633
+ data: convert_kv_request_data_v1_to_v2(req.data),
1634
+ })
1635
+ }
1636
+ v1::ToServer::ToServerTunnelMessage(msg) => {
1637
+ v2::ToServer::ToServerTunnelMessage(v2::ToServerTunnelMessage {
1638
+ request_id: msg.request_id,
1639
+ message_id: msg.message_id,
1640
+ message_kind: convert_to_server_tunnel_message_kind_v1_to_v2(
1641
+ msg.message_kind,
1642
+ ),
1643
+ })
1644
+ }
1645
+ };
1646
+
1647
+ Ok(ToServer::V2(inner))
1648
+ } else {
1649
+ bail!("unexpected version");
1650
+ }
1651
+ }
1652
+
1653
+ fn v2_to_v3(self) -> Result<Self> {
1654
+ if let ToServer::V2(x) = self {
1655
+ let inner = match x {
1656
+ v2::ToServer::ToServerInit(init) => v3::ToServer::ToServerInit(v3::ToServerInit {
1657
+ name: init.name,
1658
+ version: init.version,
1659
+ total_slots: init.total_slots,
1660
+ last_command_idx: init.last_command_idx,
1661
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
1662
+ map.into_iter()
1663
+ .map(|(k, v)| {
1664
+ (
1665
+ k,
1666
+ v3::ActorName {
1667
+ metadata: v.metadata,
1668
+ },
1669
+ )
1670
+ })
1671
+ .collect()
1672
+ }),
1673
+ metadata: init.metadata,
1674
+ }),
1675
+ v2::ToServer::ToServerEvents(events) => v3::ToServer::ToServerEvents(
1676
+ events
1677
+ .into_iter()
1678
+ .map(|event| v3::EventWrapper {
1679
+ index: event.index,
1680
+ inner: convert_event_v2_to_v3(event.inner),
1681
+ })
1682
+ .collect(),
1683
+ ),
1684
+ v2::ToServer::ToServerAckCommands(ack) => {
1685
+ v3::ToServer::ToServerAckCommands(v3::ToServerAckCommands {
1686
+ last_command_idx: ack.last_command_idx,
1687
+ })
1688
+ }
1689
+ v2::ToServer::ToServerStopping => v3::ToServer::ToServerStopping,
1690
+ v2::ToServer::ToServerPing(ping) => {
1691
+ v3::ToServer::ToServerPing(v3::ToServerPing { ts: ping.ts })
1692
+ }
1693
+ v2::ToServer::ToServerKvRequest(req) => {
1694
+ v3::ToServer::ToServerKvRequest(v3::ToServerKvRequest {
1695
+ actor_id: req.actor_id,
1696
+ request_id: req.request_id,
1697
+ data: convert_kv_request_data_v2_to_v3(req.data),
1698
+ })
1699
+ }
1700
+ v2::ToServer::ToServerTunnelMessage(msg) => {
1701
+ // Extract v3 message_id from v2's UUIDs
1702
+ // v2.message_id (UUID) contains: gateway_id (4) + request_id (4) + message_index (2) = 10 bytes
1703
+ let decoded = decode_bytes_from_uuid(&msg.request_id);
1704
+
1705
+ let mut gateway_id = [0u8; 4];
1706
+ gateway_id.copy_from_slice(&decoded[..4]);
1707
+ let mut request_id = [0u8; 4];
1708
+ request_id.copy_from_slice(&decoded[4..8]);
1709
+ let message_index = u16::from_le_bytes([decoded[8], decoded[9]]);
1710
+
1711
+ v3::ToServer::ToServerTunnelMessage(v3::ToServerTunnelMessage {
1712
+ message_id: v3::MessageId {
1713
+ gateway_id,
1714
+ request_id,
1715
+ message_index,
1716
+ },
1717
+ message_kind: convert_to_server_tunnel_message_kind_v2_to_v3(
1718
+ msg.message_kind,
1719
+ ),
1720
+ })
1721
+ }
1722
+ };
1723
+
1724
+ Ok(ToServer::V3(inner))
1725
+ } else {
1726
+ bail!("unexpected version");
1727
+ }
1728
+ }
1729
+
1730
+ fn v3_to_v2(self) -> Result<Self> {
1731
+ if let ToServer::V3(x) = self {
1732
+ let inner = match x {
1733
+ v3::ToServer::ToServerInit(init) => v2::ToServer::ToServerInit(v2::ToServerInit {
1734
+ name: init.name,
1735
+ version: init.version,
1736
+ total_slots: init.total_slots,
1737
+ last_command_idx: init.last_command_idx,
1738
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
1739
+ map.into_iter()
1740
+ .map(|(k, v)| {
1741
+ (
1742
+ k,
1743
+ v2::ActorName {
1744
+ metadata: v.metadata,
1745
+ },
1746
+ )
1747
+ })
1748
+ .collect()
1749
+ }),
1750
+ metadata: init.metadata,
1751
+ }),
1752
+ v3::ToServer::ToServerEvents(events) => v2::ToServer::ToServerEvents(
1753
+ events
1754
+ .into_iter()
1755
+ .map(|event| v2::EventWrapper {
1756
+ index: event.index,
1757
+ inner: convert_event_v3_to_v2(event.inner),
1758
+ })
1759
+ .collect(),
1760
+ ),
1761
+ v3::ToServer::ToServerAckCommands(ack) => {
1762
+ v2::ToServer::ToServerAckCommands(v2::ToServerAckCommands {
1763
+ last_command_idx: ack.last_command_idx,
1764
+ })
1765
+ }
1766
+ v3::ToServer::ToServerStopping => v2::ToServer::ToServerStopping,
1767
+ v3::ToServer::ToServerPing(ping) => {
1768
+ v2::ToServer::ToServerPing(v2::ToServerPing { ts: ping.ts })
1769
+ }
1770
+ v3::ToServer::ToServerKvRequest(req) => {
1771
+ v2::ToServer::ToServerKvRequest(v2::ToServerKvRequest {
1772
+ actor_id: req.actor_id,
1773
+ request_id: req.request_id,
1774
+ data: convert_kv_request_data_v3_to_v2(req.data),
1775
+ })
1776
+ }
1777
+ v3::ToServer::ToServerTunnelMessage(msg) => {
1778
+ // Encode v3 message_id into v2's UUIDs
1779
+ // v3: gateway_id (4) + request_id (4) + message_index (2) = 10 bytes
1780
+ let mut data = [0u8; 10];
1781
+ data[..4].copy_from_slice(&msg.message_id.gateway_id);
1782
+ data[4..8].copy_from_slice(&msg.message_id.request_id);
1783
+ data[8..10].copy_from_slice(&msg.message_id.message_index.to_le_bytes());
1784
+
1785
+ let message_id = encode_bytes_to_uuid(&data);
1786
+
1787
+ // request_id contains gateway_id + request_id for backwards compatibility
1788
+ let mut request_id_data = [0u8; 8];
1789
+ request_id_data[..4].copy_from_slice(&msg.message_id.gateway_id);
1790
+ request_id_data[4..8].copy_from_slice(&msg.message_id.request_id);
1791
+ let request_id = encode_bytes_to_uuid(&request_id_data);
1792
+
1793
+ v2::ToServer::ToServerTunnelMessage(v2::ToServerTunnelMessage {
1794
+ request_id,
1795
+ message_id,
1796
+ message_kind: convert_to_server_tunnel_message_kind_v3_to_v2(
1797
+ msg.message_kind,
1798
+ )?,
1799
+ })
1800
+ }
1801
+ };
1802
+
1803
+ Ok(ToServer::V2(inner))
1804
+ } else {
1805
+ bail!("unexpected version");
1806
+ }
1807
+ }
1808
+
1809
+ fn v2_to_v1(self) -> Result<Self> {
1810
+ if let ToServer::V2(x) = self {
1811
+ let inner = match x {
1812
+ v2::ToServer::ToServerInit(init) => v1::ToServer::ToServerInit(v1::ToServerInit {
1813
+ name: init.name,
1814
+ version: init.version,
1815
+ total_slots: init.total_slots,
1816
+ last_command_idx: init.last_command_idx,
1817
+ prepopulate_actor_names: init.prepopulate_actor_names.map(|map| {
1818
+ map.into_iter()
1819
+ .map(|(k, v)| {
1820
+ (
1821
+ k,
1822
+ v1::ActorName {
1823
+ metadata: v.metadata,
1824
+ },
1825
+ )
1826
+ })
1827
+ .collect()
1828
+ }),
1829
+ metadata: init.metadata,
1830
+ }),
1831
+ v2::ToServer::ToServerEvents(events) => v1::ToServer::ToServerEvents(
1832
+ events
1833
+ .into_iter()
1834
+ .map(|event| v1::EventWrapper {
1835
+ index: event.index,
1836
+ inner: convert_event_v2_to_v1(event.inner),
1837
+ })
1838
+ .collect(),
1839
+ ),
1840
+ v2::ToServer::ToServerAckCommands(ack) => {
1841
+ v1::ToServer::ToServerAckCommands(v1::ToServerAckCommands {
1842
+ last_command_idx: ack.last_command_idx,
1843
+ })
1844
+ }
1845
+ v2::ToServer::ToServerStopping => v1::ToServer::ToServerStopping,
1846
+ v2::ToServer::ToServerPing(ping) => {
1847
+ v1::ToServer::ToServerPing(v1::ToServerPing { ts: ping.ts })
1848
+ }
1849
+ v2::ToServer::ToServerKvRequest(req) => {
1850
+ v1::ToServer::ToServerKvRequest(v1::ToServerKvRequest {
1851
+ actor_id: req.actor_id,
1852
+ request_id: req.request_id,
1853
+ data: convert_kv_request_data_v2_to_v1(req.data),
1854
+ })
1855
+ }
1856
+ v2::ToServer::ToServerTunnelMessage(msg) => {
1857
+ v1::ToServer::ToServerTunnelMessage(v1::ToServerTunnelMessage {
1858
+ request_id: msg.request_id,
1859
+ message_id: msg.message_id,
1860
+ message_kind: convert_to_server_tunnel_message_kind_v2_to_v1(
1861
+ msg.message_kind,
1862
+ )?,
1863
+ })
1864
+ }
1865
+ };
1866
+
1867
+ Ok(ToServer::V1(inner))
1868
+ } else {
1869
+ bail!("unexpected version");
1870
+ }
1871
+ }
1872
+ }
1873
+
1874
+ pub enum ToRunner {
1875
+ // Only in v3
1876
+ V3(v3::ToRunner),
1877
+ }
1878
+
1879
+ impl OwnedVersionedData for ToRunner {
1880
+ type Latest = v3::ToRunner;
1881
+
1882
+ fn wrap_latest(latest: v3::ToRunner) -> Self {
1883
+ ToRunner::V3(latest)
1884
+ }
1885
+
1886
+ fn unwrap_latest(self) -> Result<Self::Latest> {
1887
+ #[allow(irrefutable_let_patterns)]
1888
+ if let ToRunner::V3(data) = self {
1889
+ Ok(data)
1890
+ } else {
1891
+ bail!("version not latest");
1892
+ }
1893
+ }
1894
+
1895
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
1896
+ match version {
1897
+ 1 | 2 | 3 => Ok(ToRunner::V3(serde_bare::from_slice(payload)?)),
1898
+ _ => bail!("invalid version: {version}"),
1899
+ }
1900
+ }
1901
+
1902
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
1903
+ match self {
1904
+ ToRunner::V3(data) => serde_bare::to_vec(&data).map_err(Into::into),
1905
+ }
1906
+ }
1907
+
1908
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1909
+ // No changes between v1 and v3
1910
+ vec![Ok, Ok]
1911
+ }
1912
+
1913
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1914
+ // No changes between v1 and v3
1915
+ vec![Ok, Ok]
1916
+ }
1917
+ }
1918
+
1919
+ pub enum ToGateway {
1920
+ V3(v3::ToGateway),
1921
+ V7(v7::ToGateway),
1922
+ }
1923
+
1924
+ impl OwnedVersionedData for ToGateway {
1925
+ type Latest = v7::ToGateway;
1926
+
1927
+ fn wrap_latest(latest: v7::ToGateway) -> Self {
1928
+ ToGateway::V7(latest)
1929
+ }
1930
+
1931
+ fn unwrap_latest(self) -> Result<Self::Latest> {
1932
+ #[allow(irrefutable_let_patterns)]
1933
+ if let ToGateway::V7(data) = self {
1934
+ Ok(data)
1935
+ } else {
1936
+ bail!("version not latest");
1937
+ }
1938
+ }
1939
+
1940
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
1941
+ match version {
1942
+ 1 | 2 | 3 => Ok(ToGateway::V3(serde_bare::from_slice(payload)?)),
1943
+ 4 | 5 | 6 | 7 => Ok(ToGateway::V7(serde_bare::from_slice(payload)?)),
1944
+ _ => bail!("invalid version: {version}"),
1945
+ }
1946
+ }
1947
+
1948
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
1949
+ match self {
1950
+ ToGateway::V3(data) => serde_bare::to_vec(&data).map_err(Into::into),
1951
+ ToGateway::V7(data) => serde_bare::to_vec(&data).map_err(Into::into),
1952
+ }
1953
+ }
1954
+
1955
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1956
+ vec![Ok, Ok, Self::v3_to_v7, Ok, Ok, Ok]
1957
+ }
1958
+
1959
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
1960
+ vec![Ok, Ok, Ok, Self::v7_to_v3, Ok, Ok]
1961
+ }
1962
+ }
1963
+
1964
+ impl ToGateway {
1965
+ pub fn v3_to_v7(self) -> Result<Self> {
1966
+ if let ToGateway::V3(x) = self {
1967
+ let inner = match x {
1968
+ v3::ToGateway::ToGatewayPong(pong) => {
1969
+ v7::ToGateway::ToGatewayPong(v7::ToGatewayPong {
1970
+ request_id: pong.request_id,
1971
+ ts: pong.ts,
1972
+ })
1973
+ }
1974
+ v3::ToGateway::ToServerTunnelMessage(msg) => {
1975
+ v7::ToGateway::ToServerTunnelMessage(v7::ToServerTunnelMessage {
1976
+ message_id: v7::MessageId {
1977
+ gateway_id: msg.message_id.gateway_id,
1978
+ request_id: msg.message_id.request_id,
1979
+ message_index: msg.message_id.message_index,
1980
+ },
1981
+ message_kind: convert_to_server_tunnel_message_kind_v6_to_v7(
1982
+ convert_to_server_tunnel_message_kind_v3_to_v4(msg.message_kind),
1983
+ ),
1984
+ })
1985
+ }
1986
+ };
1987
+
1988
+ Ok(ToGateway::V7(inner))
1989
+ } else {
1990
+ bail!("unexpected version");
1991
+ }
1992
+ }
1993
+
1994
+ fn v7_to_v3(self) -> Result<Self> {
1995
+ if let ToGateway::V7(x) = self {
1996
+ let inner = match x {
1997
+ v7::ToGateway::ToGatewayPong(pong) => {
1998
+ v3::ToGateway::ToGatewayPong(v3::ToGatewayPong {
1999
+ request_id: pong.request_id,
2000
+ ts: pong.ts,
2001
+ })
2002
+ }
2003
+ v7::ToGateway::ToServerTunnelMessage(msg) => {
2004
+ v3::ToGateway::ToServerTunnelMessage(v3::ToServerTunnelMessage {
2005
+ message_id: v3::MessageId {
2006
+ gateway_id: msg.message_id.gateway_id,
2007
+ request_id: msg.message_id.request_id,
2008
+ message_index: msg.message_id.message_index,
2009
+ },
2010
+ message_kind: convert_to_server_tunnel_message_kind_v4_to_v3(
2011
+ convert_to_server_tunnel_message_kind_v7_to_v6(msg.message_kind),
2012
+ )?,
2013
+ })
2014
+ }
2015
+ };
2016
+
2017
+ Ok(ToGateway::V3(inner))
2018
+ } else {
2019
+ bail!("unexpected version");
2020
+ }
2021
+ }
2022
+ }
2023
+
2024
+ pub enum ToServerlessServer {
2025
+ V3(v3::ToServerlessServer),
2026
+ V7(v7::ToServerlessServer),
2027
+ }
2028
+
2029
+ impl OwnedVersionedData for ToServerlessServer {
2030
+ type Latest = v7::ToServerlessServer;
2031
+
2032
+ fn wrap_latest(latest: v7::ToServerlessServer) -> Self {
2033
+ ToServerlessServer::V7(latest)
2034
+ }
2035
+
2036
+ fn unwrap_latest(self) -> Result<Self::Latest> {
2037
+ #[allow(irrefutable_let_patterns)]
2038
+ if let ToServerlessServer::V7(data) = self {
2039
+ Ok(data)
2040
+ } else {
2041
+ bail!("version not latest");
2042
+ }
2043
+ }
2044
+
2045
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
2046
+ match version {
2047
+ 1 | 2 | 3 => Ok(ToServerlessServer::V3(serde_bare::from_slice(payload)?)),
2048
+ 4 | 5 | 6 | 7 => Ok(ToServerlessServer::V7(serde_bare::from_slice(payload)?)),
2049
+ _ => bail!("invalid version: {version}"),
2050
+ }
2051
+ }
2052
+
2053
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
2054
+ match self {
2055
+ ToServerlessServer::V3(data) => serde_bare::to_vec(&data).map_err(Into::into),
2056
+ ToServerlessServer::V7(data) => serde_bare::to_vec(&data).map_err(Into::into),
2057
+ }
2058
+ }
2059
+
2060
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
2061
+ vec![Ok, Ok, Self::v3_to_v7, Ok, Ok, Ok]
2062
+ }
2063
+
2064
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
2065
+ vec![Ok, Ok, Ok, Self::v7_to_v3, Ok, Ok]
2066
+ }
2067
+ }
2068
+
2069
+ impl ToServerlessServer {
2070
+ fn v3_to_v7(self) -> Result<Self> {
2071
+ if let ToServerlessServer::V3(x) = self {
2072
+ let inner = match x {
2073
+ v3::ToServerlessServer::ToServerlessServerInit(init) => {
2074
+ v7::ToServerlessServer::ToServerlessServerInit(v7::ToServerlessServerInit {
2075
+ runner_id: init.runner_id,
2076
+ runner_protocol_version: PROTOCOL_MK1_VERSION,
2077
+ })
2078
+ }
2079
+ };
2080
+
2081
+ Ok(ToServerlessServer::V7(inner))
2082
+ } else {
2083
+ bail!("unexpected version");
2084
+ }
2085
+ }
2086
+
2087
+ fn v7_to_v3(self) -> Result<Self> {
2088
+ if let ToServerlessServer::V7(x) = self {
2089
+ let inner = match x {
2090
+ v7::ToServerlessServer::ToServerlessServerInit(init) => {
2091
+ v3::ToServerlessServer::ToServerlessServerInit(v3::ToServerlessServerInit {
2092
+ runner_id: init.runner_id,
2093
+ })
2094
+ }
2095
+ };
2096
+
2097
+ Ok(ToServerlessServer::V3(inner))
2098
+ } else {
2099
+ bail!("unexpected version");
2100
+ }
2101
+ }
2102
+ }
2103
+
2104
+ pub enum ActorCommandKeyData {
2105
+ V4(v4::ActorCommandKeyData),
2106
+ V7(v7::ActorCommandKeyData),
2107
+ }
2108
+
2109
+ impl OwnedVersionedData for ActorCommandKeyData {
2110
+ type Latest = v7::ActorCommandKeyData;
2111
+
2112
+ fn wrap_latest(latest: v7::ActorCommandKeyData) -> Self {
2113
+ ActorCommandKeyData::V7(latest)
2114
+ }
2115
+
2116
+ fn unwrap_latest(self) -> Result<Self::Latest> {
2117
+ if let ActorCommandKeyData::V7(data) = self {
2118
+ Ok(data)
2119
+ } else {
2120
+ bail!("version not latest");
2121
+ }
2122
+ }
2123
+
2124
+ fn deserialize_version(payload: &[u8], version: u16) -> Result<Self> {
2125
+ match version {
2126
+ 4 => Ok(ActorCommandKeyData::V4(serde_bare::from_slice(payload)?)),
2127
+ 5 | 6 | 7 => Ok(ActorCommandKeyData::V7(serde_bare::from_slice(payload)?)),
2128
+ _ => bail!("invalid version: {version}"),
2129
+ }
2130
+ }
2131
+
2132
+ fn serialize_version(self, _version: u16) -> Result<Vec<u8>> {
2133
+ match self {
2134
+ ActorCommandKeyData::V4(data) => serde_bare::to_vec(&data).map_err(Into::into),
2135
+ ActorCommandKeyData::V7(data) => serde_bare::to_vec(&data).map_err(Into::into),
2136
+ }
2137
+ }
2138
+
2139
+ fn deserialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
2140
+ vec![Ok, Ok, Ok, Self::v4_to_v7, Ok, Ok]
2141
+ }
2142
+
2143
+ fn serialize_converters() -> Vec<impl Fn(Self) -> Result<Self>> {
2144
+ vec![Ok, Ok, Self::v7_to_v4, Ok, Ok, Ok]
2145
+ }
2146
+ }
2147
+
2148
+ impl ActorCommandKeyData {
2149
+ fn v4_to_v7(self) -> Result<Self> {
2150
+ if let ActorCommandKeyData::V4(x) = self {
2151
+ let inner = match x {
2152
+ v4::ActorCommandKeyData::CommandStartActor(start) => {
2153
+ v7::ActorCommandKeyData::CommandStartActor(v7::CommandStartActor {
2154
+ config: v7::ActorConfig {
2155
+ name: start.config.name,
2156
+ key: start.config.key,
2157
+ create_ts: start.config.create_ts,
2158
+ input: start.config.input,
2159
+ },
2160
+ hibernating_requests: start
2161
+ .hibernating_requests
2162
+ .into_iter()
2163
+ .map(|req| v7::HibernatingRequest {
2164
+ gateway_id: req.gateway_id,
2165
+ request_id: req.request_id,
2166
+ })
2167
+ .collect(),
2168
+ })
2169
+ }
2170
+ v4::ActorCommandKeyData::CommandStopActor(_) => {
2171
+ v7::ActorCommandKeyData::CommandStopActor
2172
+ }
2173
+ };
2174
+
2175
+ Ok(ActorCommandKeyData::V7(inner))
2176
+ } else {
2177
+ bail!("unexpected version");
2178
+ }
2179
+ }
2180
+
2181
+ fn v7_to_v4(self) -> Result<Self> {
2182
+ if let ActorCommandKeyData::V7(x) = self {
2183
+ // Since v4 commands have generation but v7 doesn't, use generation 0 as a placeholder
2184
+ let inner = match x {
2185
+ v7::ActorCommandKeyData::CommandStartActor(start) => {
2186
+ v4::ActorCommandKeyData::CommandStartActor(v4::CommandStartActor {
2187
+ generation: 0, // Lost during conversion
2188
+ config: v4::ActorConfig {
2189
+ name: start.config.name,
2190
+ key: start.config.key,
2191
+ create_ts: start.config.create_ts,
2192
+ input: start.config.input,
2193
+ },
2194
+ hibernating_requests: start
2195
+ .hibernating_requests
2196
+ .into_iter()
2197
+ .map(|req| v4::HibernatingRequest {
2198
+ gateway_id: req.gateway_id,
2199
+ request_id: req.request_id,
2200
+ })
2201
+ .collect(),
2202
+ })
2203
+ }
2204
+ v7::ActorCommandKeyData::CommandStopActor => {
2205
+ v4::ActorCommandKeyData::CommandStopActor(v4::CommandStopActor {
2206
+ generation: 0, // Lost during conversion
2207
+ })
2208
+ }
2209
+ };
2210
+
2211
+ Ok(ActorCommandKeyData::V4(inner))
2212
+ } else {
2213
+ bail!("unexpected version");
2214
+ }
2215
+ }
2216
+ }
2217
+
2218
+ // Helper conversion functions
2219
+ fn convert_to_client_tunnel_message_kind_v1_to_v2(
2220
+ kind: v1::ToClientTunnelMessageKind,
2221
+ ) -> v2::ToClientTunnelMessageKind {
2222
+ match kind {
2223
+ v1::ToClientTunnelMessageKind::TunnelAck => v2::ToClientTunnelMessageKind::TunnelAck,
2224
+ v1::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
2225
+ v2::ToClientTunnelMessageKind::ToClientRequestStart(v2::ToClientRequestStart {
2226
+ actor_id: req.actor_id,
2227
+ method: req.method,
2228
+ path: req.path,
2229
+ headers: req.headers,
2230
+ body: req.body,
2231
+ stream: req.stream,
2232
+ })
2233
+ }
2234
+ v1::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
2235
+ v2::ToClientTunnelMessageKind::ToClientRequestChunk(v2::ToClientRequestChunk {
2236
+ body: chunk.body,
2237
+ finish: chunk.finish,
2238
+ })
2239
+ }
2240
+ v1::ToClientTunnelMessageKind::ToClientRequestAbort => {
2241
+ v2::ToClientTunnelMessageKind::ToClientRequestAbort
2242
+ }
2243
+ v1::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
2244
+ v2::ToClientTunnelMessageKind::ToClientWebSocketOpen(v2::ToClientWebSocketOpen {
2245
+ actor_id: ws.actor_id,
2246
+ path: ws.path,
2247
+ headers: ws.headers,
2248
+ })
2249
+ }
2250
+ v1::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
2251
+ v2::ToClientTunnelMessageKind::ToClientWebSocketMessage(v2::ToClientWebSocketMessage {
2252
+ // Default to 0 for v1 messages (hibernation disabled by default)
2253
+ index: 0,
2254
+ data: msg.data,
2255
+ binary: msg.binary,
2256
+ })
2257
+ }
2258
+ v1::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
2259
+ v2::ToClientTunnelMessageKind::ToClientWebSocketClose(v2::ToClientWebSocketClose {
2260
+ code: close.code,
2261
+ reason: close.reason,
2262
+ })
2263
+ }
2264
+ }
2265
+ }
2266
+
2267
+ fn convert_to_client_tunnel_message_kind_v2_to_v1(
2268
+ kind: v2::ToClientTunnelMessageKind,
2269
+ ) -> Result<v1::ToClientTunnelMessageKind> {
2270
+ Ok(match kind {
2271
+ v2::ToClientTunnelMessageKind::TunnelAck => v1::ToClientTunnelMessageKind::TunnelAck,
2272
+ v2::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
2273
+ v1::ToClientTunnelMessageKind::ToClientRequestStart(v1::ToClientRequestStart {
2274
+ actor_id: req.actor_id,
2275
+ method: req.method,
2276
+ path: req.path,
2277
+ headers: req.headers,
2278
+ body: req.body,
2279
+ stream: req.stream,
2280
+ })
2281
+ }
2282
+ v2::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
2283
+ v1::ToClientTunnelMessageKind::ToClientRequestChunk(v1::ToClientRequestChunk {
2284
+ body: chunk.body,
2285
+ finish: chunk.finish,
2286
+ })
2287
+ }
2288
+ v2::ToClientTunnelMessageKind::ToClientRequestAbort => {
2289
+ v1::ToClientTunnelMessageKind::ToClientRequestAbort
2290
+ }
2291
+ v2::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
2292
+ v1::ToClientTunnelMessageKind::ToClientWebSocketOpen(v1::ToClientWebSocketOpen {
2293
+ actor_id: ws.actor_id,
2294
+ path: ws.path,
2295
+ headers: ws.headers,
2296
+ })
2297
+ }
2298
+ v2::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
2299
+ v1::ToClientTunnelMessageKind::ToClientWebSocketMessage(v1::ToClientWebSocketMessage {
2300
+ data: msg.data,
2301
+ binary: msg.binary,
2302
+ })
2303
+ }
2304
+ v2::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
2305
+ v1::ToClientTunnelMessageKind::ToClientWebSocketClose(v1::ToClientWebSocketClose {
2306
+ code: close.code,
2307
+ reason: close.reason,
2308
+ })
2309
+ }
2310
+ })
2311
+ }
2312
+
2313
+ fn convert_to_server_tunnel_message_kind_v1_to_v2(
2314
+ kind: v1::ToServerTunnelMessageKind,
2315
+ ) -> v2::ToServerTunnelMessageKind {
2316
+ match kind {
2317
+ v1::ToServerTunnelMessageKind::TunnelAck => v2::ToServerTunnelMessageKind::TunnelAck,
2318
+ v1::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
2319
+ v2::ToServerTunnelMessageKind::ToServerResponseStart(v2::ToServerResponseStart {
2320
+ status: resp.status,
2321
+ headers: resp.headers,
2322
+ body: resp.body,
2323
+ stream: resp.stream,
2324
+ })
2325
+ }
2326
+ v1::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
2327
+ v2::ToServerTunnelMessageKind::ToServerResponseChunk(v2::ToServerResponseChunk {
2328
+ body: chunk.body,
2329
+ finish: chunk.finish,
2330
+ })
2331
+ }
2332
+ v1::ToServerTunnelMessageKind::ToServerResponseAbort => {
2333
+ v2::ToServerTunnelMessageKind::ToServerResponseAbort
2334
+ }
2335
+ v1::ToServerTunnelMessageKind::ToServerWebSocketOpen => {
2336
+ v2::ToServerTunnelMessageKind::ToServerWebSocketOpen(v2::ToServerWebSocketOpen {
2337
+ can_hibernate: false,
2338
+ last_msg_index: -1,
2339
+ })
2340
+ }
2341
+ v1::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
2342
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessage(v2::ToServerWebSocketMessage {
2343
+ data: msg.data,
2344
+ binary: msg.binary,
2345
+ })
2346
+ }
2347
+ v1::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
2348
+ v2::ToServerTunnelMessageKind::ToServerWebSocketClose(v2::ToServerWebSocketClose {
2349
+ code: close.code,
2350
+ reason: close.reason,
2351
+ retry: false,
2352
+ })
2353
+ }
2354
+ }
2355
+ }
2356
+
2357
+ fn convert_to_server_tunnel_message_kind_v2_to_v1(
2358
+ kind: v2::ToServerTunnelMessageKind,
2359
+ ) -> Result<v1::ToServerTunnelMessageKind> {
2360
+ Ok(match kind {
2361
+ v2::ToServerTunnelMessageKind::TunnelAck => v1::ToServerTunnelMessageKind::TunnelAck,
2362
+ v2::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
2363
+ v1::ToServerTunnelMessageKind::ToServerResponseStart(v1::ToServerResponseStart {
2364
+ status: resp.status,
2365
+ headers: resp.headers,
2366
+ body: resp.body,
2367
+ stream: resp.stream,
2368
+ })
2369
+ }
2370
+ v2::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
2371
+ v1::ToServerTunnelMessageKind::ToServerResponseChunk(v1::ToServerResponseChunk {
2372
+ body: chunk.body,
2373
+ finish: chunk.finish,
2374
+ })
2375
+ }
2376
+ v2::ToServerTunnelMessageKind::ToServerResponseAbort => {
2377
+ v1::ToServerTunnelMessageKind::ToServerResponseAbort
2378
+ }
2379
+ v2::ToServerTunnelMessageKind::ToServerWebSocketOpen(_) => {
2380
+ v1::ToServerTunnelMessageKind::ToServerWebSocketOpen
2381
+ }
2382
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
2383
+ v1::ToServerTunnelMessageKind::ToServerWebSocketMessage(v1::ToServerWebSocketMessage {
2384
+ data: msg.data,
2385
+ binary: msg.binary,
2386
+ })
2387
+ }
2388
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(_) => {
2389
+ // v1 doesn't have MessageAck, this is a v2-only feature
2390
+ bail!("ToServerWebSocketMessageAck is not supported in v1");
2391
+ }
2392
+ v2::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
2393
+ v1::ToServerTunnelMessageKind::ToServerWebSocketClose(v1::ToServerWebSocketClose {
2394
+ code: close.code,
2395
+ reason: close.reason,
2396
+ })
2397
+ }
2398
+ })
2399
+ }
2400
+
2401
+ fn convert_event_v1_to_v2(event: v1::Event) -> v2::Event {
2402
+ match event {
2403
+ v1::Event::EventActorIntent(intent) => v2::Event::EventActorIntent(v2::EventActorIntent {
2404
+ actor_id: intent.actor_id,
2405
+ generation: intent.generation,
2406
+ intent: convert_actor_intent_v1_to_v2(intent.intent),
2407
+ }),
2408
+ v1::Event::EventActorStateUpdate(state) => {
2409
+ v2::Event::EventActorStateUpdate(v2::EventActorStateUpdate {
2410
+ actor_id: state.actor_id,
2411
+ generation: state.generation,
2412
+ state: convert_actor_state_v1_to_v2(state.state),
2413
+ })
2414
+ }
2415
+ v1::Event::EventActorSetAlarm(alarm) => {
2416
+ v2::Event::EventActorSetAlarm(v2::EventActorSetAlarm {
2417
+ actor_id: alarm.actor_id,
2418
+ generation: alarm.generation,
2419
+ alarm_ts: alarm.alarm_ts,
2420
+ })
2421
+ }
2422
+ }
2423
+ }
2424
+
2425
+ fn convert_event_v2_to_v1(event: v2::Event) -> v1::Event {
2426
+ match event {
2427
+ v2::Event::EventActorIntent(intent) => v1::Event::EventActorIntent(v1::EventActorIntent {
2428
+ actor_id: intent.actor_id,
2429
+ generation: intent.generation,
2430
+ intent: convert_actor_intent_v2_to_v1(intent.intent),
2431
+ }),
2432
+ v2::Event::EventActorStateUpdate(state) => {
2433
+ v1::Event::EventActorStateUpdate(v1::EventActorStateUpdate {
2434
+ actor_id: state.actor_id,
2435
+ generation: state.generation,
2436
+ state: convert_actor_state_v2_to_v1(state.state),
2437
+ })
2438
+ }
2439
+ v2::Event::EventActorSetAlarm(alarm) => {
2440
+ v1::Event::EventActorSetAlarm(v1::EventActorSetAlarm {
2441
+ actor_id: alarm.actor_id,
2442
+ generation: alarm.generation,
2443
+ alarm_ts: alarm.alarm_ts,
2444
+ })
2445
+ }
2446
+ }
2447
+ }
2448
+
2449
+ fn convert_actor_intent_v1_to_v2(intent: v1::ActorIntent) -> v2::ActorIntent {
2450
+ match intent {
2451
+ v1::ActorIntent::ActorIntentSleep => v2::ActorIntent::ActorIntentSleep,
2452
+ v1::ActorIntent::ActorIntentStop => v2::ActorIntent::ActorIntentStop,
2453
+ }
2454
+ }
2455
+
2456
+ fn convert_actor_intent_v2_to_v1(intent: v2::ActorIntent) -> v1::ActorIntent {
2457
+ match intent {
2458
+ v2::ActorIntent::ActorIntentSleep => v1::ActorIntent::ActorIntentSleep,
2459
+ v2::ActorIntent::ActorIntentStop => v1::ActorIntent::ActorIntentStop,
2460
+ }
2461
+ }
2462
+
2463
+ fn convert_actor_state_v1_to_v2(state: v1::ActorState) -> v2::ActorState {
2464
+ match state {
2465
+ v1::ActorState::ActorStateRunning => v2::ActorState::ActorStateRunning,
2466
+ v1::ActorState::ActorStateStopped(stopped) => {
2467
+ v2::ActorState::ActorStateStopped(v2::ActorStateStopped {
2468
+ code: convert_stop_code_v1_to_v2(stopped.code),
2469
+ message: stopped.message,
2470
+ })
2471
+ }
2472
+ }
2473
+ }
2474
+
2475
+ fn convert_actor_state_v2_to_v1(state: v2::ActorState) -> v1::ActorState {
2476
+ match state {
2477
+ v2::ActorState::ActorStateRunning => v1::ActorState::ActorStateRunning,
2478
+ v2::ActorState::ActorStateStopped(stopped) => {
2479
+ v1::ActorState::ActorStateStopped(v1::ActorStateStopped {
2480
+ code: convert_stop_code_v2_to_v1(stopped.code),
2481
+ message: stopped.message,
2482
+ })
2483
+ }
2484
+ }
2485
+ }
2486
+
2487
+ fn convert_stop_code_v1_to_v2(code: v1::StopCode) -> v2::StopCode {
2488
+ match code {
2489
+ v1::StopCode::Ok => v2::StopCode::Ok,
2490
+ v1::StopCode::Error => v2::StopCode::Error,
2491
+ }
2492
+ }
2493
+
2494
+ fn convert_stop_code_v2_to_v1(code: v2::StopCode) -> v1::StopCode {
2495
+ match code {
2496
+ v2::StopCode::Ok => v1::StopCode::Ok,
2497
+ v2::StopCode::Error => v1::StopCode::Error,
2498
+ }
2499
+ }
2500
+
2501
+ fn convert_kv_request_data_v1_to_v2(data: v1::KvRequestData) -> v2::KvRequestData {
2502
+ match data {
2503
+ v1::KvRequestData::KvGetRequest(req) => {
2504
+ v2::KvRequestData::KvGetRequest(v2::KvGetRequest { keys: req.keys })
2505
+ }
2506
+ v1::KvRequestData::KvListRequest(req) => {
2507
+ v2::KvRequestData::KvListRequest(v2::KvListRequest {
2508
+ query: convert_kv_list_query_v1_to_v2(req.query),
2509
+ reverse: req.reverse,
2510
+ limit: req.limit,
2511
+ })
2512
+ }
2513
+ v1::KvRequestData::KvPutRequest(req) => v2::KvRequestData::KvPutRequest(v2::KvPutRequest {
2514
+ keys: req.keys,
2515
+ values: req.values,
2516
+ }),
2517
+ v1::KvRequestData::KvDeleteRequest(req) => {
2518
+ v2::KvRequestData::KvDeleteRequest(v2::KvDeleteRequest { keys: req.keys })
2519
+ }
2520
+ v1::KvRequestData::KvDropRequest => v2::KvRequestData::KvDropRequest,
2521
+ }
2522
+ }
2523
+
2524
+ fn convert_kv_request_data_v2_to_v1(data: v2::KvRequestData) -> v1::KvRequestData {
2525
+ match data {
2526
+ v2::KvRequestData::KvGetRequest(req) => {
2527
+ v1::KvRequestData::KvGetRequest(v1::KvGetRequest { keys: req.keys })
2528
+ }
2529
+ v2::KvRequestData::KvListRequest(req) => {
2530
+ v1::KvRequestData::KvListRequest(v1::KvListRequest {
2531
+ query: convert_kv_list_query_v2_to_v1(req.query),
2532
+ reverse: req.reverse,
2533
+ limit: req.limit,
2534
+ })
2535
+ }
2536
+ v2::KvRequestData::KvPutRequest(req) => v1::KvRequestData::KvPutRequest(v1::KvPutRequest {
2537
+ keys: req.keys,
2538
+ values: req.values,
2539
+ }),
2540
+ v2::KvRequestData::KvDeleteRequest(req) => {
2541
+ v1::KvRequestData::KvDeleteRequest(v1::KvDeleteRequest { keys: req.keys })
2542
+ }
2543
+ v2::KvRequestData::KvDropRequest => v1::KvRequestData::KvDropRequest,
2544
+ }
2545
+ }
2546
+
2547
+ fn convert_kv_response_data_v1_to_v2(data: v1::KvResponseData) -> v2::KvResponseData {
2548
+ match data {
2549
+ v1::KvResponseData::KvErrorResponse(err) => {
2550
+ v2::KvResponseData::KvErrorResponse(v2::KvErrorResponse {
2551
+ message: err.message,
2552
+ })
2553
+ }
2554
+ v1::KvResponseData::KvGetResponse(resp) => {
2555
+ v2::KvResponseData::KvGetResponse(v2::KvGetResponse {
2556
+ keys: resp.keys,
2557
+ values: resp.values,
2558
+ metadata: resp
2559
+ .metadata
2560
+ .into_iter()
2561
+ .map(convert_kv_metadata_v1_to_v2)
2562
+ .collect(),
2563
+ })
2564
+ }
2565
+ v1::KvResponseData::KvListResponse(resp) => {
2566
+ v2::KvResponseData::KvListResponse(v2::KvListResponse {
2567
+ keys: resp.keys,
2568
+ values: resp.values,
2569
+ metadata: resp
2570
+ .metadata
2571
+ .into_iter()
2572
+ .map(convert_kv_metadata_v1_to_v2)
2573
+ .collect(),
2574
+ })
2575
+ }
2576
+ v1::KvResponseData::KvPutResponse => v2::KvResponseData::KvPutResponse,
2577
+ v1::KvResponseData::KvDeleteResponse => v2::KvResponseData::KvDeleteResponse,
2578
+ v1::KvResponseData::KvDropResponse => v2::KvResponseData::KvDropResponse,
2579
+ }
2580
+ }
2581
+
2582
+ fn convert_kv_response_data_v2_to_v1(data: v2::KvResponseData) -> v1::KvResponseData {
2583
+ match data {
2584
+ v2::KvResponseData::KvErrorResponse(err) => {
2585
+ v1::KvResponseData::KvErrorResponse(v1::KvErrorResponse {
2586
+ message: err.message,
2587
+ })
2588
+ }
2589
+ v2::KvResponseData::KvGetResponse(resp) => {
2590
+ v1::KvResponseData::KvGetResponse(v1::KvGetResponse {
2591
+ keys: resp.keys,
2592
+ values: resp.values,
2593
+ metadata: resp
2594
+ .metadata
2595
+ .into_iter()
2596
+ .map(convert_kv_metadata_v2_to_v1)
2597
+ .collect(),
2598
+ })
2599
+ }
2600
+ v2::KvResponseData::KvListResponse(resp) => {
2601
+ v1::KvResponseData::KvListResponse(v1::KvListResponse {
2602
+ keys: resp.keys,
2603
+ values: resp.values,
2604
+ metadata: resp
2605
+ .metadata
2606
+ .into_iter()
2607
+ .map(convert_kv_metadata_v2_to_v1)
2608
+ .collect(),
2609
+ })
2610
+ }
2611
+ v2::KvResponseData::KvPutResponse => v1::KvResponseData::KvPutResponse,
2612
+ v2::KvResponseData::KvDeleteResponse => v1::KvResponseData::KvDeleteResponse,
2613
+ v2::KvResponseData::KvDropResponse => v1::KvResponseData::KvDropResponse,
2614
+ }
2615
+ }
2616
+
2617
+ fn convert_kv_list_query_v1_to_v2(query: v1::KvListQuery) -> v2::KvListQuery {
2618
+ match query {
2619
+ v1::KvListQuery::KvListAllQuery => v2::KvListQuery::KvListAllQuery,
2620
+ v1::KvListQuery::KvListRangeQuery(range) => {
2621
+ v2::KvListQuery::KvListRangeQuery(v2::KvListRangeQuery {
2622
+ start: range.start,
2623
+ end: range.end,
2624
+ exclusive: range.exclusive,
2625
+ })
2626
+ }
2627
+ v1::KvListQuery::KvListPrefixQuery(prefix) => {
2628
+ v2::KvListQuery::KvListPrefixQuery(v2::KvListPrefixQuery { key: prefix.key })
2629
+ }
2630
+ }
2631
+ }
2632
+
2633
+ fn convert_kv_list_query_v2_to_v1(query: v2::KvListQuery) -> v1::KvListQuery {
2634
+ match query {
2635
+ v2::KvListQuery::KvListAllQuery => v1::KvListQuery::KvListAllQuery,
2636
+ v2::KvListQuery::KvListRangeQuery(range) => {
2637
+ v1::KvListQuery::KvListRangeQuery(v1::KvListRangeQuery {
2638
+ start: range.start,
2639
+ end: range.end,
2640
+ exclusive: range.exclusive,
2641
+ })
2642
+ }
2643
+ v2::KvListQuery::KvListPrefixQuery(prefix) => {
2644
+ v1::KvListQuery::KvListPrefixQuery(v1::KvListPrefixQuery { key: prefix.key })
2645
+ }
2646
+ }
2647
+ }
2648
+
2649
+ fn convert_kv_metadata_v1_to_v2(metadata: v1::KvMetadata) -> v2::KvMetadata {
2650
+ v2::KvMetadata {
2651
+ version: metadata.version,
2652
+ create_ts: metadata.create_ts,
2653
+ }
2654
+ }
2655
+
2656
+ fn convert_kv_metadata_v2_to_v1(metadata: v2::KvMetadata) -> v1::KvMetadata {
2657
+ v1::KvMetadata {
2658
+ version: metadata.version,
2659
+ create_ts: metadata.create_ts,
2660
+ }
2661
+ }
2662
+
2663
+ fn convert_to_client_tunnel_message_kind_v2_to_v3(
2664
+ kind: v2::ToClientTunnelMessageKind,
2665
+ ) -> v3::ToClientTunnelMessageKind {
2666
+ match kind {
2667
+ v2::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
2668
+ v3::ToClientTunnelMessageKind::ToClientRequestStart(v3::ToClientRequestStart {
2669
+ actor_id: req.actor_id,
2670
+ method: req.method,
2671
+ path: req.path,
2672
+ headers: req.headers,
2673
+ body: req.body,
2674
+ stream: req.stream,
2675
+ })
2676
+ }
2677
+ v2::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
2678
+ v3::ToClientTunnelMessageKind::ToClientRequestChunk(v3::ToClientRequestChunk {
2679
+ body: chunk.body,
2680
+ finish: chunk.finish,
2681
+ })
2682
+ }
2683
+ v2::ToClientTunnelMessageKind::ToClientRequestAbort => {
2684
+ v3::ToClientTunnelMessageKind::ToClientRequestAbort
2685
+ }
2686
+ v2::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
2687
+ v3::ToClientTunnelMessageKind::ToClientWebSocketOpen(v3::ToClientWebSocketOpen {
2688
+ actor_id: ws.actor_id,
2689
+ path: ws.path,
2690
+ headers: ws.headers,
2691
+ })
2692
+ }
2693
+ v2::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
2694
+ v3::ToClientTunnelMessageKind::ToClientWebSocketMessage(v3::ToClientWebSocketMessage {
2695
+ data: msg.data,
2696
+ binary: msg.binary,
2697
+ })
2698
+ }
2699
+ v2::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
2700
+ v3::ToClientTunnelMessageKind::ToClientWebSocketClose(v3::ToClientWebSocketClose {
2701
+ code: close.code,
2702
+ reason: close.reason,
2703
+ })
2704
+ }
2705
+ // DeprecatedTunnelAck is kept for backwards compatibility
2706
+ v2::ToClientTunnelMessageKind::TunnelAck => {
2707
+ v3::ToClientTunnelMessageKind::DeprecatedTunnelAck
2708
+ }
2709
+ }
2710
+ }
2711
+
2712
+ fn convert_to_client_tunnel_message_kind_v3_to_v2(
2713
+ kind: v3::ToClientTunnelMessageKind,
2714
+ message_id: &v3::MessageId,
2715
+ ) -> Result<v2::ToClientTunnelMessageKind> {
2716
+ Ok(match kind {
2717
+ v3::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
2718
+ v2::ToClientTunnelMessageKind::ToClientRequestStart(v2::ToClientRequestStart {
2719
+ actor_id: req.actor_id,
2720
+ method: req.method,
2721
+ path: req.path,
2722
+ headers: req.headers,
2723
+ body: req.body,
2724
+ stream: req.stream,
2725
+ })
2726
+ }
2727
+ v3::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
2728
+ v2::ToClientTunnelMessageKind::ToClientRequestChunk(v2::ToClientRequestChunk {
2729
+ body: chunk.body,
2730
+ finish: chunk.finish,
2731
+ })
2732
+ }
2733
+ v3::ToClientTunnelMessageKind::ToClientRequestAbort => {
2734
+ v2::ToClientTunnelMessageKind::ToClientRequestAbort
2735
+ }
2736
+ v3::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
2737
+ v2::ToClientTunnelMessageKind::ToClientWebSocketOpen(v2::ToClientWebSocketOpen {
2738
+ actor_id: ws.actor_id,
2739
+ path: ws.path,
2740
+ headers: ws.headers,
2741
+ })
2742
+ }
2743
+ v3::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
2744
+ v2::ToClientTunnelMessageKind::ToClientWebSocketMessage(v2::ToClientWebSocketMessage {
2745
+ data: msg.data,
2746
+ binary: msg.binary,
2747
+ index: message_id.message_index,
2748
+ })
2749
+ }
2750
+ v3::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
2751
+ v2::ToClientTunnelMessageKind::ToClientWebSocketClose(v2::ToClientWebSocketClose {
2752
+ code: close.code,
2753
+ reason: close.reason,
2754
+ })
2755
+ }
2756
+ v3::ToClientTunnelMessageKind::DeprecatedTunnelAck => {
2757
+ v2::ToClientTunnelMessageKind::TunnelAck
2758
+ }
2759
+ })
2760
+ }
2761
+
2762
+ fn convert_to_server_tunnel_message_kind_v2_to_v3(
2763
+ kind: v2::ToServerTunnelMessageKind,
2764
+ ) -> v3::ToServerTunnelMessageKind {
2765
+ match kind {
2766
+ v2::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
2767
+ v3::ToServerTunnelMessageKind::ToServerResponseStart(v3::ToServerResponseStart {
2768
+ status: resp.status,
2769
+ headers: resp.headers,
2770
+ body: resp.body,
2771
+ stream: resp.stream,
2772
+ })
2773
+ }
2774
+ v2::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
2775
+ v3::ToServerTunnelMessageKind::ToServerResponseChunk(v3::ToServerResponseChunk {
2776
+ body: chunk.body,
2777
+ finish: chunk.finish,
2778
+ })
2779
+ }
2780
+ v2::ToServerTunnelMessageKind::ToServerResponseAbort => {
2781
+ v3::ToServerTunnelMessageKind::ToServerResponseAbort
2782
+ }
2783
+ v2::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
2784
+ v3::ToServerTunnelMessageKind::ToServerWebSocketOpen(v3::ToServerWebSocketOpen {
2785
+ can_hibernate: open.can_hibernate,
2786
+ })
2787
+ }
2788
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
2789
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessage(v3::ToServerWebSocketMessage {
2790
+ data: msg.data,
2791
+ binary: msg.binary,
2792
+ })
2793
+ }
2794
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
2795
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
2796
+ v3::ToServerWebSocketMessageAck { index: ack.index },
2797
+ )
2798
+ }
2799
+ v2::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
2800
+ v3::ToServerTunnelMessageKind::ToServerWebSocketClose(v3::ToServerWebSocketClose {
2801
+ code: close.code,
2802
+ reason: close.reason,
2803
+ hibernate: close.retry,
2804
+ })
2805
+ }
2806
+ // DeprecatedTunnelAck is kept for backwards compatibility
2807
+ v2::ToServerTunnelMessageKind::TunnelAck => {
2808
+ v3::ToServerTunnelMessageKind::DeprecatedTunnelAck
2809
+ }
2810
+ }
2811
+ }
2812
+
2813
+ fn convert_to_server_tunnel_message_kind_v3_to_v2(
2814
+ kind: v3::ToServerTunnelMessageKind,
2815
+ ) -> Result<v2::ToServerTunnelMessageKind> {
2816
+ Ok(match kind {
2817
+ v3::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
2818
+ v2::ToServerTunnelMessageKind::ToServerResponseStart(v2::ToServerResponseStart {
2819
+ status: resp.status,
2820
+ headers: resp.headers,
2821
+ body: resp.body,
2822
+ stream: resp.stream,
2823
+ })
2824
+ }
2825
+ v3::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
2826
+ v2::ToServerTunnelMessageKind::ToServerResponseChunk(v2::ToServerResponseChunk {
2827
+ body: chunk.body,
2828
+ finish: chunk.finish,
2829
+ })
2830
+ }
2831
+ v3::ToServerTunnelMessageKind::ToServerResponseAbort => {
2832
+ v2::ToServerTunnelMessageKind::ToServerResponseAbort
2833
+ }
2834
+ v3::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
2835
+ v2::ToServerTunnelMessageKind::ToServerWebSocketOpen(v2::ToServerWebSocketOpen {
2836
+ can_hibernate: open.can_hibernate,
2837
+ last_msg_index: -1,
2838
+ })
2839
+ }
2840
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
2841
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessage(v2::ToServerWebSocketMessage {
2842
+ data: msg.data,
2843
+ binary: msg.binary,
2844
+ })
2845
+ }
2846
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
2847
+ v2::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
2848
+ v2::ToServerWebSocketMessageAck { index: ack.index },
2849
+ )
2850
+ }
2851
+ v3::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
2852
+ v2::ToServerTunnelMessageKind::ToServerWebSocketClose(v2::ToServerWebSocketClose {
2853
+ code: close.code,
2854
+ reason: close.reason,
2855
+ retry: close.hibernate,
2856
+ })
2857
+ }
2858
+ v3::ToServerTunnelMessageKind::DeprecatedTunnelAck => {
2859
+ v2::ToServerTunnelMessageKind::TunnelAck
2860
+ }
2861
+ })
2862
+ }
2863
+
2864
+ fn convert_event_v2_to_v3(event: v2::Event) -> v3::Event {
2865
+ match event {
2866
+ v2::Event::EventActorIntent(intent) => v3::Event::EventActorIntent(v3::EventActorIntent {
2867
+ actor_id: intent.actor_id,
2868
+ generation: intent.generation,
2869
+ intent: convert_actor_intent_v2_to_v3(intent.intent),
2870
+ }),
2871
+ v2::Event::EventActorStateUpdate(state) => {
2872
+ v3::Event::EventActorStateUpdate(v3::EventActorStateUpdate {
2873
+ actor_id: state.actor_id,
2874
+ generation: state.generation,
2875
+ state: convert_actor_state_v2_to_v3(state.state),
2876
+ })
2877
+ }
2878
+ v2::Event::EventActorSetAlarm(alarm) => {
2879
+ v3::Event::EventActorSetAlarm(v3::EventActorSetAlarm {
2880
+ actor_id: alarm.actor_id,
2881
+ generation: alarm.generation,
2882
+ alarm_ts: alarm.alarm_ts,
2883
+ })
2884
+ }
2885
+ }
2886
+ }
2887
+
2888
+ fn convert_event_v3_to_v2(event: v3::Event) -> v2::Event {
2889
+ match event {
2890
+ v3::Event::EventActorIntent(intent) => v2::Event::EventActorIntent(v2::EventActorIntent {
2891
+ actor_id: intent.actor_id,
2892
+ generation: intent.generation,
2893
+ intent: convert_actor_intent_v3_to_v2(intent.intent),
2894
+ }),
2895
+ v3::Event::EventActorStateUpdate(state) => {
2896
+ v2::Event::EventActorStateUpdate(v2::EventActorStateUpdate {
2897
+ actor_id: state.actor_id,
2898
+ generation: state.generation,
2899
+ state: convert_actor_state_v3_to_v2(state.state),
2900
+ })
2901
+ }
2902
+ v3::Event::EventActorSetAlarm(alarm) => {
2903
+ v2::Event::EventActorSetAlarm(v2::EventActorSetAlarm {
2904
+ actor_id: alarm.actor_id,
2905
+ generation: alarm.generation,
2906
+ alarm_ts: alarm.alarm_ts,
2907
+ })
2908
+ }
2909
+ }
2910
+ }
2911
+
2912
+ fn convert_actor_intent_v2_to_v3(intent: v2::ActorIntent) -> v3::ActorIntent {
2913
+ match intent {
2914
+ v2::ActorIntent::ActorIntentSleep => v3::ActorIntent::ActorIntentSleep,
2915
+ v2::ActorIntent::ActorIntentStop => v3::ActorIntent::ActorIntentStop,
2916
+ }
2917
+ }
2918
+
2919
+ fn convert_actor_intent_v3_to_v2(intent: v3::ActorIntent) -> v2::ActorIntent {
2920
+ match intent {
2921
+ v3::ActorIntent::ActorIntentSleep => v2::ActorIntent::ActorIntentSleep,
2922
+ v3::ActorIntent::ActorIntentStop => v2::ActorIntent::ActorIntentStop,
2923
+ }
2924
+ }
2925
+
2926
+ fn convert_actor_state_v2_to_v3(state: v2::ActorState) -> v3::ActorState {
2927
+ match state {
2928
+ v2::ActorState::ActorStateRunning => v3::ActorState::ActorStateRunning,
2929
+ v2::ActorState::ActorStateStopped(stopped) => {
2930
+ v3::ActorState::ActorStateStopped(v3::ActorStateStopped {
2931
+ code: convert_stop_code_v2_to_v3(stopped.code),
2932
+ message: stopped.message,
2933
+ })
2934
+ }
2935
+ }
2936
+ }
2937
+
2938
+ fn convert_actor_state_v3_to_v2(state: v3::ActorState) -> v2::ActorState {
2939
+ match state {
2940
+ v3::ActorState::ActorStateRunning => v2::ActorState::ActorStateRunning,
2941
+ v3::ActorState::ActorStateStopped(stopped) => {
2942
+ v2::ActorState::ActorStateStopped(v2::ActorStateStopped {
2943
+ code: convert_stop_code_v3_to_v2(stopped.code),
2944
+ message: stopped.message,
2945
+ })
2946
+ }
2947
+ }
2948
+ }
2949
+
2950
+ fn convert_stop_code_v2_to_v3(code: v2::StopCode) -> v3::StopCode {
2951
+ match code {
2952
+ v2::StopCode::Ok => v3::StopCode::Ok,
2953
+ v2::StopCode::Error => v3::StopCode::Error,
2954
+ }
2955
+ }
2956
+
2957
+ fn convert_stop_code_v3_to_v2(code: v3::StopCode) -> v2::StopCode {
2958
+ match code {
2959
+ v3::StopCode::Ok => v2::StopCode::Ok,
2960
+ v3::StopCode::Error => v2::StopCode::Error,
2961
+ }
2962
+ }
2963
+
2964
+ fn convert_kv_request_data_v2_to_v3(data: v2::KvRequestData) -> v3::KvRequestData {
2965
+ match data {
2966
+ v2::KvRequestData::KvGetRequest(req) => {
2967
+ v3::KvRequestData::KvGetRequest(v3::KvGetRequest { keys: req.keys })
2968
+ }
2969
+ v2::KvRequestData::KvListRequest(req) => {
2970
+ v3::KvRequestData::KvListRequest(v3::KvListRequest {
2971
+ query: convert_kv_list_query_v2_to_v3(req.query),
2972
+ reverse: req.reverse,
2973
+ limit: req.limit,
2974
+ })
2975
+ }
2976
+ v2::KvRequestData::KvPutRequest(req) => v3::KvRequestData::KvPutRequest(v3::KvPutRequest {
2977
+ keys: req.keys,
2978
+ values: req.values,
2979
+ }),
2980
+ v2::KvRequestData::KvDeleteRequest(req) => {
2981
+ v3::KvRequestData::KvDeleteRequest(v3::KvDeleteRequest { keys: req.keys })
2982
+ }
2983
+ v2::KvRequestData::KvDropRequest => v3::KvRequestData::KvDropRequest,
2984
+ }
2985
+ }
2986
+
2987
+ fn convert_kv_request_data_v3_to_v2(data: v3::KvRequestData) -> v2::KvRequestData {
2988
+ match data {
2989
+ v3::KvRequestData::KvGetRequest(req) => {
2990
+ v2::KvRequestData::KvGetRequest(v2::KvGetRequest { keys: req.keys })
2991
+ }
2992
+ v3::KvRequestData::KvListRequest(req) => {
2993
+ v2::KvRequestData::KvListRequest(v2::KvListRequest {
2994
+ query: convert_kv_list_query_v3_to_v2(req.query),
2995
+ reverse: req.reverse,
2996
+ limit: req.limit,
2997
+ })
2998
+ }
2999
+ v3::KvRequestData::KvPutRequest(req) => v2::KvRequestData::KvPutRequest(v2::KvPutRequest {
3000
+ keys: req.keys,
3001
+ values: req.values,
3002
+ }),
3003
+ v3::KvRequestData::KvDeleteRequest(req) => {
3004
+ v2::KvRequestData::KvDeleteRequest(v2::KvDeleteRequest { keys: req.keys })
3005
+ }
3006
+ v3::KvRequestData::KvDropRequest => v2::KvRequestData::KvDropRequest,
3007
+ }
3008
+ }
3009
+
3010
+ fn convert_kv_response_data_v2_to_v3(data: v2::KvResponseData) -> v3::KvResponseData {
3011
+ match data {
3012
+ v2::KvResponseData::KvErrorResponse(err) => {
3013
+ v3::KvResponseData::KvErrorResponse(v3::KvErrorResponse {
3014
+ message: err.message,
3015
+ })
3016
+ }
3017
+ v2::KvResponseData::KvGetResponse(resp) => {
3018
+ v3::KvResponseData::KvGetResponse(v3::KvGetResponse {
3019
+ keys: resp.keys,
3020
+ values: resp.values,
3021
+ metadata: resp
3022
+ .metadata
3023
+ .into_iter()
3024
+ .map(convert_kv_metadata_v2_to_v3)
3025
+ .collect(),
3026
+ })
3027
+ }
3028
+ v2::KvResponseData::KvListResponse(resp) => {
3029
+ v3::KvResponseData::KvListResponse(v3::KvListResponse {
3030
+ keys: resp.keys,
3031
+ values: resp.values,
3032
+ metadata: resp
3033
+ .metadata
3034
+ .into_iter()
3035
+ .map(convert_kv_metadata_v2_to_v3)
3036
+ .collect(),
3037
+ })
3038
+ }
3039
+ v2::KvResponseData::KvPutResponse => v3::KvResponseData::KvPutResponse,
3040
+ v2::KvResponseData::KvDeleteResponse => v3::KvResponseData::KvDeleteResponse,
3041
+ v2::KvResponseData::KvDropResponse => v3::KvResponseData::KvDropResponse,
3042
+ }
3043
+ }
3044
+
3045
+ fn convert_kv_response_data_v3_to_v2(data: v3::KvResponseData) -> v2::KvResponseData {
3046
+ match data {
3047
+ v3::KvResponseData::KvErrorResponse(err) => {
3048
+ v2::KvResponseData::KvErrorResponse(v2::KvErrorResponse {
3049
+ message: err.message,
3050
+ })
3051
+ }
3052
+ v3::KvResponseData::KvGetResponse(resp) => {
3053
+ v2::KvResponseData::KvGetResponse(v2::KvGetResponse {
3054
+ keys: resp.keys,
3055
+ values: resp.values,
3056
+ metadata: resp
3057
+ .metadata
3058
+ .into_iter()
3059
+ .map(convert_kv_metadata_v3_to_v2)
3060
+ .collect(),
3061
+ })
3062
+ }
3063
+ v3::KvResponseData::KvListResponse(resp) => {
3064
+ v2::KvResponseData::KvListResponse(v2::KvListResponse {
3065
+ keys: resp.keys,
3066
+ values: resp.values,
3067
+ metadata: resp
3068
+ .metadata
3069
+ .into_iter()
3070
+ .map(convert_kv_metadata_v3_to_v2)
3071
+ .collect(),
3072
+ })
3073
+ }
3074
+ v3::KvResponseData::KvPutResponse => v2::KvResponseData::KvPutResponse,
3075
+ v3::KvResponseData::KvDeleteResponse => v2::KvResponseData::KvDeleteResponse,
3076
+ v3::KvResponseData::KvDropResponse => v2::KvResponseData::KvDropResponse,
3077
+ }
3078
+ }
3079
+
3080
+ fn convert_kv_list_query_v2_to_v3(query: v2::KvListQuery) -> v3::KvListQuery {
3081
+ match query {
3082
+ v2::KvListQuery::KvListAllQuery => v3::KvListQuery::KvListAllQuery,
3083
+ v2::KvListQuery::KvListRangeQuery(range) => {
3084
+ v3::KvListQuery::KvListRangeQuery(v3::KvListRangeQuery {
3085
+ start: range.start,
3086
+ end: range.end,
3087
+ exclusive: range.exclusive,
3088
+ })
3089
+ }
3090
+ v2::KvListQuery::KvListPrefixQuery(prefix) => {
3091
+ v3::KvListQuery::KvListPrefixQuery(v3::KvListPrefixQuery { key: prefix.key })
3092
+ }
3093
+ }
3094
+ }
3095
+
3096
+ fn convert_kv_list_query_v3_to_v2(query: v3::KvListQuery) -> v2::KvListQuery {
3097
+ match query {
3098
+ v3::KvListQuery::KvListAllQuery => v2::KvListQuery::KvListAllQuery,
3099
+ v3::KvListQuery::KvListRangeQuery(range) => {
3100
+ v2::KvListQuery::KvListRangeQuery(v2::KvListRangeQuery {
3101
+ start: range.start,
3102
+ end: range.end,
3103
+ exclusive: range.exclusive,
3104
+ })
3105
+ }
3106
+ v3::KvListQuery::KvListPrefixQuery(prefix) => {
3107
+ v2::KvListQuery::KvListPrefixQuery(v2::KvListPrefixQuery { key: prefix.key })
3108
+ }
3109
+ }
3110
+ }
3111
+
3112
+ fn convert_kv_metadata_v2_to_v3(metadata: v2::KvMetadata) -> v3::KvMetadata {
3113
+ v3::KvMetadata {
3114
+ version: metadata.version,
3115
+ create_ts: metadata.create_ts,
3116
+ }
3117
+ }
3118
+
3119
+ fn convert_kv_metadata_v3_to_v2(metadata: v3::KvMetadata) -> v2::KvMetadata {
3120
+ v2::KvMetadata {
3121
+ version: metadata.version,
3122
+ create_ts: metadata.create_ts,
3123
+ }
3124
+ }
3125
+
3126
+ fn convert_to_server_tunnel_message_kind_v3_to_v4(
3127
+ kind: v3::ToServerTunnelMessageKind,
3128
+ ) -> v6::ToServerTunnelMessageKind {
3129
+ match kind {
3130
+ v3::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
3131
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(v6::ToServerResponseStart {
3132
+ status: resp.status,
3133
+ headers: resp.headers,
3134
+ body: resp.body,
3135
+ stream: resp.stream,
3136
+ })
3137
+ }
3138
+ v3::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
3139
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(v6::ToServerResponseChunk {
3140
+ body: chunk.body,
3141
+ finish: chunk.finish,
3142
+ })
3143
+ }
3144
+ v3::ToServerTunnelMessageKind::ToServerResponseAbort => {
3145
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort
3146
+ }
3147
+ v3::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
3148
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(v6::ToServerWebSocketOpen {
3149
+ can_hibernate: open.can_hibernate,
3150
+ })
3151
+ }
3152
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
3153
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(v6::ToServerWebSocketMessage {
3154
+ data: msg.data,
3155
+ binary: msg.binary,
3156
+ })
3157
+ }
3158
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
3159
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
3160
+ v6::ToServerWebSocketMessageAck { index: ack.index },
3161
+ )
3162
+ }
3163
+ v3::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
3164
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(v6::ToServerWebSocketClose {
3165
+ code: close.code,
3166
+ reason: close.reason,
3167
+ hibernate: close.hibernate,
3168
+ })
3169
+ }
3170
+ v3::ToServerTunnelMessageKind::DeprecatedTunnelAck => {
3171
+ // v4 removed DeprecatedTunnelAck, this should not occur in practice
3172
+ // but if it does, we'll convert it to a response abort as a safe fallback
3173
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort
3174
+ }
3175
+ }
3176
+ }
3177
+
3178
+ fn convert_to_server_tunnel_message_kind_v4_to_v3(
3179
+ kind: v6::ToServerTunnelMessageKind,
3180
+ ) -> Result<v3::ToServerTunnelMessageKind> {
3181
+ Ok(match kind {
3182
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
3183
+ v3::ToServerTunnelMessageKind::ToServerResponseStart(v3::ToServerResponseStart {
3184
+ status: resp.status,
3185
+ headers: resp.headers,
3186
+ body: resp.body,
3187
+ stream: resp.stream,
3188
+ })
3189
+ }
3190
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
3191
+ v3::ToServerTunnelMessageKind::ToServerResponseChunk(v3::ToServerResponseChunk {
3192
+ body: chunk.body,
3193
+ finish: chunk.finish,
3194
+ })
3195
+ }
3196
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort => {
3197
+ v3::ToServerTunnelMessageKind::ToServerResponseAbort
3198
+ }
3199
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
3200
+ v3::ToServerTunnelMessageKind::ToServerWebSocketOpen(v3::ToServerWebSocketOpen {
3201
+ can_hibernate: open.can_hibernate,
3202
+ })
3203
+ }
3204
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
3205
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessage(v3::ToServerWebSocketMessage {
3206
+ data: msg.data,
3207
+ binary: msg.binary,
3208
+ })
3209
+ }
3210
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
3211
+ v3::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
3212
+ v3::ToServerWebSocketMessageAck { index: ack.index },
3213
+ )
3214
+ }
3215
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
3216
+ v3::ToServerTunnelMessageKind::ToServerWebSocketClose(v3::ToServerWebSocketClose {
3217
+ code: close.code,
3218
+ reason: close.reason,
3219
+ hibernate: close.hibernate,
3220
+ })
3221
+ }
3222
+ })
3223
+ }
3224
+
3225
+ // Used specifically for the gateway because there were no changes between mk2 and mk1 for the tunnel messages
3226
+ pub fn to_client_tunnel_message_mk2_to_mk1(
3227
+ msg: v7::ToClientTunnelMessage,
3228
+ ) -> v3::ToClientTunnelMessage {
3229
+ v3::ToClientTunnelMessage {
3230
+ message_id: v3::MessageId {
3231
+ gateway_id: msg.message_id.gateway_id,
3232
+ request_id: msg.message_id.request_id,
3233
+ message_index: msg.message_id.message_index,
3234
+ },
3235
+ message_kind: convert_to_client_tunnel_message_kind_mk2_to_mk1(msg.message_kind),
3236
+ }
3237
+ }
3238
+
3239
+ fn convert_to_client_tunnel_message_kind_mk2_to_mk1(
3240
+ kind: v7::ToClientTunnelMessageKind,
3241
+ ) -> v3::ToClientTunnelMessageKind {
3242
+ match kind {
3243
+ v7::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
3244
+ v3::ToClientTunnelMessageKind::ToClientRequestStart(v3::ToClientRequestStart {
3245
+ actor_id: req.actor_id,
3246
+ method: req.method,
3247
+ path: req.path,
3248
+ headers: req.headers,
3249
+ body: req.body,
3250
+ stream: req.stream,
3251
+ })
3252
+ }
3253
+ v7::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
3254
+ v3::ToClientTunnelMessageKind::ToClientRequestChunk(v3::ToClientRequestChunk {
3255
+ body: chunk.body,
3256
+ finish: chunk.finish,
3257
+ })
3258
+ }
3259
+ v7::ToClientTunnelMessageKind::ToClientRequestAbort => {
3260
+ v3::ToClientTunnelMessageKind::ToClientRequestAbort
3261
+ }
3262
+ v7::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
3263
+ v3::ToClientTunnelMessageKind::ToClientWebSocketOpen(v3::ToClientWebSocketOpen {
3264
+ actor_id: ws.actor_id,
3265
+ path: ws.path,
3266
+ headers: ws.headers,
3267
+ })
3268
+ }
3269
+ v7::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
3270
+ v3::ToClientTunnelMessageKind::ToClientWebSocketMessage(v3::ToClientWebSocketMessage {
3271
+ data: msg.data,
3272
+ binary: msg.binary,
3273
+ })
3274
+ }
3275
+ v7::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
3276
+ v3::ToClientTunnelMessageKind::ToClientWebSocketClose(v3::ToClientWebSocketClose {
3277
+ code: close.code,
3278
+ reason: close.reason,
3279
+ })
3280
+ }
3281
+ }
3282
+ }
3283
+
3284
+ fn convert_kv_response_data_v4_to_v5(data: v4::KvResponseData) -> v5::KvResponseData {
3285
+ match data {
3286
+ v4::KvResponseData::KvErrorResponse(err) => {
3287
+ v5::KvResponseData::KvErrorResponse(v5::KvErrorResponse {
3288
+ message: err.message,
3289
+ })
3290
+ }
3291
+ v4::KvResponseData::KvGetResponse(resp) => {
3292
+ v5::KvResponseData::KvGetResponse(v5::KvGetResponse {
3293
+ keys: resp.keys,
3294
+ values: resp.values,
3295
+ metadata: resp
3296
+ .metadata
3297
+ .into_iter()
3298
+ .map(convert_kv_metadata_v4_to_v5)
3299
+ .collect(),
3300
+ })
3301
+ }
3302
+ v4::KvResponseData::KvListResponse(resp) => {
3303
+ v5::KvResponseData::KvListResponse(v5::KvListResponse {
3304
+ keys: resp.keys,
3305
+ values: resp.values,
3306
+ metadata: resp
3307
+ .metadata
3308
+ .into_iter()
3309
+ .map(convert_kv_metadata_v4_to_v5)
3310
+ .collect(),
3311
+ })
3312
+ }
3313
+ v4::KvResponseData::KvPutResponse => v5::KvResponseData::KvPutResponse,
3314
+ v4::KvResponseData::KvDeleteResponse => v5::KvResponseData::KvDeleteResponse,
3315
+ v4::KvResponseData::KvDropResponse => v5::KvResponseData::KvDropResponse,
3316
+ }
3317
+ }
3318
+
3319
+ fn convert_kv_response_data_v5_to_v4(data: v5::KvResponseData) -> v4::KvResponseData {
3320
+ match data {
3321
+ v5::KvResponseData::KvErrorResponse(err) => {
3322
+ v4::KvResponseData::KvErrorResponse(v4::KvErrorResponse {
3323
+ message: err.message,
3324
+ })
3325
+ }
3326
+ v5::KvResponseData::KvGetResponse(resp) => {
3327
+ v4::KvResponseData::KvGetResponse(v4::KvGetResponse {
3328
+ keys: resp.keys,
3329
+ values: resp.values,
3330
+ metadata: resp
3331
+ .metadata
3332
+ .into_iter()
3333
+ .map(convert_kv_metadata_v5_to_v4)
3334
+ .collect(),
3335
+ })
3336
+ }
3337
+ v5::KvResponseData::KvListResponse(resp) => {
3338
+ v4::KvResponseData::KvListResponse(v4::KvListResponse {
3339
+ keys: resp.keys,
3340
+ values: resp.values,
3341
+ metadata: resp
3342
+ .metadata
3343
+ .into_iter()
3344
+ .map(convert_kv_metadata_v5_to_v4)
3345
+ .collect(),
3346
+ })
3347
+ }
3348
+ v5::KvResponseData::KvPutResponse => v4::KvResponseData::KvPutResponse,
3349
+ v5::KvResponseData::KvDeleteResponse => v4::KvResponseData::KvDeleteResponse,
3350
+ v5::KvResponseData::KvDropResponse => v4::KvResponseData::KvDropResponse,
3351
+ }
3352
+ }
3353
+
3354
+ fn convert_kv_metadata_v4_to_v5(metadata: v4::KvMetadata) -> v5::KvMetadata {
3355
+ v5::KvMetadata {
3356
+ version: metadata.version,
3357
+ update_ts: metadata.update_ts,
3358
+ }
3359
+ }
3360
+
3361
+ fn convert_kv_metadata_v5_to_v4(metadata: v5::KvMetadata) -> v4::KvMetadata {
3362
+ v4::KvMetadata {
3363
+ version: metadata.version,
3364
+ update_ts: metadata.update_ts,
3365
+ }
3366
+ }
3367
+
3368
+ fn convert_to_client_tunnel_message_kind_v4_to_v5(
3369
+ kind: v4::ToClientTunnelMessageKind,
3370
+ ) -> v5::ToClientTunnelMessageKind {
3371
+ match kind {
3372
+ v4::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
3373
+ v5::ToClientTunnelMessageKind::ToClientRequestStart(v5::ToClientRequestStart {
3374
+ actor_id: req.actor_id,
3375
+ method: req.method,
3376
+ path: req.path,
3377
+ headers: req.headers,
3378
+ body: req.body,
3379
+ stream: req.stream,
3380
+ })
3381
+ }
3382
+ v4::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
3383
+ v5::ToClientTunnelMessageKind::ToClientRequestChunk(v5::ToClientRequestChunk {
3384
+ body: chunk.body,
3385
+ finish: chunk.finish,
3386
+ })
3387
+ }
3388
+ v4::ToClientTunnelMessageKind::ToClientRequestAbort => {
3389
+ v5::ToClientTunnelMessageKind::ToClientRequestAbort
3390
+ }
3391
+ v4::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
3392
+ v5::ToClientTunnelMessageKind::ToClientWebSocketOpen(v5::ToClientWebSocketOpen {
3393
+ actor_id: ws.actor_id,
3394
+ path: ws.path,
3395
+ headers: ws.headers,
3396
+ })
3397
+ }
3398
+ v4::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
3399
+ v5::ToClientTunnelMessageKind::ToClientWebSocketMessage(v5::ToClientWebSocketMessage {
3400
+ data: msg.data,
3401
+ binary: msg.binary,
3402
+ })
3403
+ }
3404
+ v4::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
3405
+ v5::ToClientTunnelMessageKind::ToClientWebSocketClose(v5::ToClientWebSocketClose {
3406
+ code: close.code,
3407
+ reason: close.reason,
3408
+ })
3409
+ }
3410
+ }
3411
+ }
3412
+
3413
+ fn convert_to_client_tunnel_message_kind_v5_to_v4(
3414
+ kind: v5::ToClientTunnelMessageKind,
3415
+ ) -> v4::ToClientTunnelMessageKind {
3416
+ match kind {
3417
+ v5::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
3418
+ v4::ToClientTunnelMessageKind::ToClientRequestStart(v4::ToClientRequestStart {
3419
+ actor_id: req.actor_id,
3420
+ method: req.method,
3421
+ path: req.path,
3422
+ headers: req.headers,
3423
+ body: req.body,
3424
+ stream: req.stream,
3425
+ })
3426
+ }
3427
+ v5::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
3428
+ v4::ToClientTunnelMessageKind::ToClientRequestChunk(v4::ToClientRequestChunk {
3429
+ body: chunk.body,
3430
+ finish: chunk.finish,
3431
+ })
3432
+ }
3433
+ v5::ToClientTunnelMessageKind::ToClientRequestAbort => {
3434
+ v4::ToClientTunnelMessageKind::ToClientRequestAbort
3435
+ }
3436
+ v5::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
3437
+ v4::ToClientTunnelMessageKind::ToClientWebSocketOpen(v4::ToClientWebSocketOpen {
3438
+ actor_id: ws.actor_id,
3439
+ path: ws.path,
3440
+ headers: ws.headers,
3441
+ })
3442
+ }
3443
+ v5::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
3444
+ v4::ToClientTunnelMessageKind::ToClientWebSocketMessage(v4::ToClientWebSocketMessage {
3445
+ data: msg.data,
3446
+ binary: msg.binary,
3447
+ })
3448
+ }
3449
+ v5::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
3450
+ v4::ToClientTunnelMessageKind::ToClientWebSocketClose(v4::ToClientWebSocketClose {
3451
+ code: close.code,
3452
+ reason: close.reason,
3453
+ })
3454
+ }
3455
+ }
3456
+ }
3457
+
3458
+ // MARK: v4 <-> v6 helpers (ToServer and ToRunner; v5 and v6 are structurally identical)
3459
+
3460
+ fn convert_actor_intent_v4_to_v6(intent: v4::ActorIntent) -> v6::ActorIntent {
3461
+ match intent {
3462
+ v4::ActorIntent::ActorIntentSleep => v6::ActorIntent::ActorIntentSleep,
3463
+ v4::ActorIntent::ActorIntentStop => v6::ActorIntent::ActorIntentStop,
3464
+ }
3465
+ }
3466
+
3467
+ fn convert_actor_intent_v6_to_v4(intent: v6::ActorIntent) -> v4::ActorIntent {
3468
+ match intent {
3469
+ v6::ActorIntent::ActorIntentSleep => v4::ActorIntent::ActorIntentSleep,
3470
+ v6::ActorIntent::ActorIntentStop => v4::ActorIntent::ActorIntentStop,
3471
+ }
3472
+ }
3473
+
3474
+ fn convert_actor_state_v4_to_v6(state: v4::ActorState) -> v6::ActorState {
3475
+ match state {
3476
+ v4::ActorState::ActorStateRunning => v6::ActorState::ActorStateRunning,
3477
+ v4::ActorState::ActorStateStopped(stopped) => {
3478
+ v6::ActorState::ActorStateStopped(v6::ActorStateStopped {
3479
+ code: convert_stop_code_v4_to_v6(stopped.code),
3480
+ message: stopped.message,
3481
+ })
3482
+ }
3483
+ }
3484
+ }
3485
+
3486
+ fn convert_actor_state_v6_to_v4(state: v6::ActorState) -> v4::ActorState {
3487
+ match state {
3488
+ v6::ActorState::ActorStateRunning => v4::ActorState::ActorStateRunning,
3489
+ v6::ActorState::ActorStateStopped(stopped) => {
3490
+ v4::ActorState::ActorStateStopped(v4::ActorStateStopped {
3491
+ code: convert_stop_code_v6_to_v4(stopped.code),
3492
+ message: stopped.message,
3493
+ })
3494
+ }
3495
+ }
3496
+ }
3497
+
3498
+ fn convert_stop_code_v4_to_v6(code: v4::StopCode) -> v6::StopCode {
3499
+ match code {
3500
+ v4::StopCode::Ok => v6::StopCode::Ok,
3501
+ v4::StopCode::Error => v6::StopCode::Error,
3502
+ }
3503
+ }
3504
+
3505
+ fn convert_stop_code_v6_to_v4(code: v6::StopCode) -> v4::StopCode {
3506
+ match code {
3507
+ v6::StopCode::Ok => v4::StopCode::Ok,
3508
+ v6::StopCode::Error => v4::StopCode::Error,
3509
+ }
3510
+ }
3511
+
3512
+ fn convert_kv_request_data_v4_to_v6(data: v4::KvRequestData) -> v6::KvRequestData {
3513
+ match data {
3514
+ v4::KvRequestData::KvGetRequest(req) => {
3515
+ v6::KvRequestData::KvGetRequest(v6::KvGetRequest { keys: req.keys })
3516
+ }
3517
+ v4::KvRequestData::KvListRequest(req) => {
3518
+ v6::KvRequestData::KvListRequest(v6::KvListRequest {
3519
+ query: convert_kv_list_query_v4_to_v6(req.query),
3520
+ reverse: req.reverse,
3521
+ limit: req.limit,
3522
+ })
3523
+ }
3524
+ v4::KvRequestData::KvPutRequest(req) => v6::KvRequestData::KvPutRequest(v6::KvPutRequest {
3525
+ keys: req.keys,
3526
+ values: req.values,
3527
+ }),
3528
+ v4::KvRequestData::KvDeleteRequest(req) => {
3529
+ v6::KvRequestData::KvDeleteRequest(v6::KvDeleteRequest { keys: req.keys })
3530
+ }
3531
+ v4::KvRequestData::KvDropRequest => v6::KvRequestData::KvDropRequest,
3532
+ }
3533
+ }
3534
+
3535
+ fn convert_kv_request_data_v6_to_v4(data: v6::KvRequestData) -> v4::KvRequestData {
3536
+ match data {
3537
+ v6::KvRequestData::KvGetRequest(req) => {
3538
+ v4::KvRequestData::KvGetRequest(v4::KvGetRequest { keys: req.keys })
3539
+ }
3540
+ v6::KvRequestData::KvListRequest(req) => {
3541
+ v4::KvRequestData::KvListRequest(v4::KvListRequest {
3542
+ query: convert_kv_list_query_v6_to_v4(req.query),
3543
+ reverse: req.reverse,
3544
+ limit: req.limit,
3545
+ })
3546
+ }
3547
+ v6::KvRequestData::KvPutRequest(req) => v4::KvRequestData::KvPutRequest(v4::KvPutRequest {
3548
+ keys: req.keys,
3549
+ values: req.values,
3550
+ }),
3551
+ v6::KvRequestData::KvDeleteRequest(req) => {
3552
+ v4::KvRequestData::KvDeleteRequest(v4::KvDeleteRequest { keys: req.keys })
3553
+ }
3554
+ v6::KvRequestData::KvDropRequest => v4::KvRequestData::KvDropRequest,
3555
+ }
3556
+ }
3557
+
3558
+ // MARK: v6 <-> v7 helpers (KvDeleteRangeRequest was introduced in v7)
3559
+
3560
+ fn convert_kv_request_data_v6_to_v7(data: v6::KvRequestData) -> v7::KvRequestData {
3561
+ match data {
3562
+ v6::KvRequestData::KvGetRequest(req) => {
3563
+ v7::KvRequestData::KvGetRequest(v7::KvGetRequest { keys: req.keys })
3564
+ }
3565
+ v6::KvRequestData::KvListRequest(req) => {
3566
+ v7::KvRequestData::KvListRequest(v7::KvListRequest {
3567
+ query: convert_kv_list_query_v6_to_v7(req.query),
3568
+ reverse: req.reverse,
3569
+ limit: req.limit,
3570
+ })
3571
+ }
3572
+ v6::KvRequestData::KvPutRequest(req) => v7::KvRequestData::KvPutRequest(v7::KvPutRequest {
3573
+ keys: req.keys,
3574
+ values: req.values,
3575
+ }),
3576
+ v6::KvRequestData::KvDeleteRequest(req) => {
3577
+ v7::KvRequestData::KvDeleteRequest(v7::KvDeleteRequest { keys: req.keys })
3578
+ }
3579
+ v6::KvRequestData::KvDropRequest => v7::KvRequestData::KvDropRequest,
3580
+ }
3581
+ }
3582
+
3583
+ fn convert_kv_request_data_v7_to_v6(data: v7::KvRequestData) -> Result<v6::KvRequestData> {
3584
+ match data {
3585
+ v7::KvRequestData::KvGetRequest(req) => {
3586
+ Ok(v6::KvRequestData::KvGetRequest(v6::KvGetRequest {
3587
+ keys: req.keys,
3588
+ }))
3589
+ }
3590
+ v7::KvRequestData::KvListRequest(req) => {
3591
+ Ok(v6::KvRequestData::KvListRequest(v6::KvListRequest {
3592
+ query: convert_kv_list_query_v7_to_v6(req.query),
3593
+ reverse: req.reverse,
3594
+ limit: req.limit,
3595
+ }))
3596
+ }
3597
+ v7::KvRequestData::KvPutRequest(req) => {
3598
+ Ok(v6::KvRequestData::KvPutRequest(v6::KvPutRequest {
3599
+ keys: req.keys,
3600
+ values: req.values,
3601
+ }))
3602
+ }
3603
+ v7::KvRequestData::KvDeleteRequest(req) => {
3604
+ Ok(v6::KvRequestData::KvDeleteRequest(v6::KvDeleteRequest {
3605
+ keys: req.keys,
3606
+ }))
3607
+ }
3608
+ v7::KvRequestData::KvDeleteRangeRequest(_) => {
3609
+ bail!("KvDeleteRangeRequest requires runner protocol v7")
3610
+ }
3611
+ v7::KvRequestData::KvDropRequest => Ok(v6::KvRequestData::KvDropRequest),
3612
+ }
3613
+ }
3614
+
3615
+ fn convert_kv_list_query_v4_to_v6(query: v4::KvListQuery) -> v6::KvListQuery {
3616
+ match query {
3617
+ v4::KvListQuery::KvListAllQuery => v6::KvListQuery::KvListAllQuery,
3618
+ v4::KvListQuery::KvListRangeQuery(range) => {
3619
+ v6::KvListQuery::KvListRangeQuery(v6::KvListRangeQuery {
3620
+ start: range.start,
3621
+ end: range.end,
3622
+ exclusive: range.exclusive,
3623
+ })
3624
+ }
3625
+ v4::KvListQuery::KvListPrefixQuery(prefix) => {
3626
+ v6::KvListQuery::KvListPrefixQuery(v6::KvListPrefixQuery { key: prefix.key })
3627
+ }
3628
+ }
3629
+ }
3630
+
3631
+ fn convert_kv_list_query_v6_to_v4(query: v6::KvListQuery) -> v4::KvListQuery {
3632
+ match query {
3633
+ v6::KvListQuery::KvListAllQuery => v4::KvListQuery::KvListAllQuery,
3634
+ v6::KvListQuery::KvListRangeQuery(range) => {
3635
+ v4::KvListQuery::KvListRangeQuery(v4::KvListRangeQuery {
3636
+ start: range.start,
3637
+ end: range.end,
3638
+ exclusive: range.exclusive,
3639
+ })
3640
+ }
3641
+ v6::KvListQuery::KvListPrefixQuery(prefix) => {
3642
+ v4::KvListQuery::KvListPrefixQuery(v4::KvListPrefixQuery { key: prefix.key })
3643
+ }
3644
+ }
3645
+ }
3646
+
3647
+ fn convert_kv_list_query_v6_to_v7(query: v6::KvListQuery) -> v7::KvListQuery {
3648
+ match query {
3649
+ v6::KvListQuery::KvListAllQuery => v7::KvListQuery::KvListAllQuery,
3650
+ v6::KvListQuery::KvListRangeQuery(range) => {
3651
+ v7::KvListQuery::KvListRangeQuery(v7::KvListRangeQuery {
3652
+ start: range.start,
3653
+ end: range.end,
3654
+ exclusive: range.exclusive,
3655
+ })
3656
+ }
3657
+ v6::KvListQuery::KvListPrefixQuery(prefix) => {
3658
+ v7::KvListQuery::KvListPrefixQuery(v7::KvListPrefixQuery { key: prefix.key })
3659
+ }
3660
+ }
3661
+ }
3662
+
3663
+ fn convert_kv_list_query_v7_to_v6(query: v7::KvListQuery) -> v6::KvListQuery {
3664
+ match query {
3665
+ v7::KvListQuery::KvListAllQuery => v6::KvListQuery::KvListAllQuery,
3666
+ v7::KvListQuery::KvListRangeQuery(range) => {
3667
+ v6::KvListQuery::KvListRangeQuery(v6::KvListRangeQuery {
3668
+ start: range.start,
3669
+ end: range.end,
3670
+ exclusive: range.exclusive,
3671
+ })
3672
+ }
3673
+ v7::KvListQuery::KvListPrefixQuery(prefix) => {
3674
+ v6::KvListQuery::KvListPrefixQuery(v6::KvListPrefixQuery { key: prefix.key })
3675
+ }
3676
+ }
3677
+ }
3678
+
3679
+ fn convert_to_client_tunnel_message_kind_v4_to_v6(
3680
+ kind: v4::ToClientTunnelMessageKind,
3681
+ ) -> v6::ToClientTunnelMessageKind {
3682
+ match kind {
3683
+ v4::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
3684
+ v6::ToClientTunnelMessageKind::ToClientRequestStart(v6::ToClientRequestStart {
3685
+ actor_id: req.actor_id,
3686
+ method: req.method,
3687
+ path: req.path,
3688
+ headers: req.headers,
3689
+ body: req.body,
3690
+ stream: req.stream,
3691
+ })
3692
+ }
3693
+ v4::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
3694
+ v6::ToClientTunnelMessageKind::ToClientRequestChunk(v6::ToClientRequestChunk {
3695
+ body: chunk.body,
3696
+ finish: chunk.finish,
3697
+ })
3698
+ }
3699
+ v4::ToClientTunnelMessageKind::ToClientRequestAbort => {
3700
+ v6::ToClientTunnelMessageKind::ToClientRequestAbort
3701
+ }
3702
+ v4::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
3703
+ v6::ToClientTunnelMessageKind::ToClientWebSocketOpen(v6::ToClientWebSocketOpen {
3704
+ actor_id: ws.actor_id,
3705
+ path: ws.path,
3706
+ headers: ws.headers,
3707
+ })
3708
+ }
3709
+ v4::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
3710
+ v6::ToClientTunnelMessageKind::ToClientWebSocketMessage(v6::ToClientWebSocketMessage {
3711
+ data: msg.data,
3712
+ binary: msg.binary,
3713
+ })
3714
+ }
3715
+ v4::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
3716
+ v6::ToClientTunnelMessageKind::ToClientWebSocketClose(v6::ToClientWebSocketClose {
3717
+ code: close.code,
3718
+ reason: close.reason,
3719
+ })
3720
+ }
3721
+ }
3722
+ }
3723
+
3724
+ fn convert_to_client_tunnel_message_kind_v6_to_v4(
3725
+ kind: v6::ToClientTunnelMessageKind,
3726
+ ) -> v4::ToClientTunnelMessageKind {
3727
+ match kind {
3728
+ v6::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
3729
+ v4::ToClientTunnelMessageKind::ToClientRequestStart(v4::ToClientRequestStart {
3730
+ actor_id: req.actor_id,
3731
+ method: req.method,
3732
+ path: req.path,
3733
+ headers: req.headers,
3734
+ body: req.body,
3735
+ stream: req.stream,
3736
+ })
3737
+ }
3738
+ v6::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
3739
+ v4::ToClientTunnelMessageKind::ToClientRequestChunk(v4::ToClientRequestChunk {
3740
+ body: chunk.body,
3741
+ finish: chunk.finish,
3742
+ })
3743
+ }
3744
+ v6::ToClientTunnelMessageKind::ToClientRequestAbort => {
3745
+ v4::ToClientTunnelMessageKind::ToClientRequestAbort
3746
+ }
3747
+ v6::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
3748
+ v4::ToClientTunnelMessageKind::ToClientWebSocketOpen(v4::ToClientWebSocketOpen {
3749
+ actor_id: ws.actor_id,
3750
+ path: ws.path,
3751
+ headers: ws.headers,
3752
+ })
3753
+ }
3754
+ v6::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
3755
+ v4::ToClientTunnelMessageKind::ToClientWebSocketMessage(v4::ToClientWebSocketMessage {
3756
+ data: msg.data,
3757
+ binary: msg.binary,
3758
+ })
3759
+ }
3760
+ v6::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
3761
+ v4::ToClientTunnelMessageKind::ToClientWebSocketClose(v4::ToClientWebSocketClose {
3762
+ code: close.code,
3763
+ reason: close.reason,
3764
+ })
3765
+ }
3766
+ }
3767
+ }
3768
+
3769
+ fn convert_to_server_tunnel_message_kind_v4_to_v6(
3770
+ kind: v4::ToServerTunnelMessageKind,
3771
+ ) -> v6::ToServerTunnelMessageKind {
3772
+ match kind {
3773
+ v4::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
3774
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(v6::ToServerResponseStart {
3775
+ status: resp.status,
3776
+ headers: resp.headers,
3777
+ body: resp.body,
3778
+ stream: resp.stream,
3779
+ })
3780
+ }
3781
+ v4::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
3782
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(v6::ToServerResponseChunk {
3783
+ body: chunk.body,
3784
+ finish: chunk.finish,
3785
+ })
3786
+ }
3787
+ v4::ToServerTunnelMessageKind::ToServerResponseAbort => {
3788
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort
3789
+ }
3790
+ v4::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
3791
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(v6::ToServerWebSocketOpen {
3792
+ can_hibernate: open.can_hibernate,
3793
+ })
3794
+ }
3795
+ v4::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
3796
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(v6::ToServerWebSocketMessage {
3797
+ data: msg.data,
3798
+ binary: msg.binary,
3799
+ })
3800
+ }
3801
+ v4::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
3802
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
3803
+ v6::ToServerWebSocketMessageAck { index: ack.index },
3804
+ )
3805
+ }
3806
+ v4::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
3807
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(v6::ToServerWebSocketClose {
3808
+ code: close.code,
3809
+ reason: close.reason,
3810
+ hibernate: close.hibernate,
3811
+ })
3812
+ }
3813
+ }
3814
+ }
3815
+
3816
+ fn convert_to_server_tunnel_message_kind_v6_to_v4(
3817
+ kind: v6::ToServerTunnelMessageKind,
3818
+ ) -> Result<v4::ToServerTunnelMessageKind> {
3819
+ Ok(match kind {
3820
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
3821
+ v4::ToServerTunnelMessageKind::ToServerResponseStart(v4::ToServerResponseStart {
3822
+ status: resp.status,
3823
+ headers: resp.headers,
3824
+ body: resp.body,
3825
+ stream: resp.stream,
3826
+ })
3827
+ }
3828
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
3829
+ v4::ToServerTunnelMessageKind::ToServerResponseChunk(v4::ToServerResponseChunk {
3830
+ body: chunk.body,
3831
+ finish: chunk.finish,
3832
+ })
3833
+ }
3834
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort => {
3835
+ v4::ToServerTunnelMessageKind::ToServerResponseAbort
3836
+ }
3837
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
3838
+ v4::ToServerTunnelMessageKind::ToServerWebSocketOpen(v4::ToServerWebSocketOpen {
3839
+ can_hibernate: open.can_hibernate,
3840
+ })
3841
+ }
3842
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
3843
+ v4::ToServerTunnelMessageKind::ToServerWebSocketMessage(v4::ToServerWebSocketMessage {
3844
+ data: msg.data,
3845
+ binary: msg.binary,
3846
+ })
3847
+ }
3848
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
3849
+ v4::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
3850
+ v4::ToServerWebSocketMessageAck { index: ack.index },
3851
+ )
3852
+ }
3853
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
3854
+ v4::ToServerTunnelMessageKind::ToServerWebSocketClose(v4::ToServerWebSocketClose {
3855
+ code: close.code,
3856
+ reason: close.reason,
3857
+ hibernate: close.hibernate,
3858
+ })
3859
+ }
3860
+ })
3861
+ }
3862
+
3863
+ // MARK: v5 <-> v6 helpers (ToClient; only ProtocolMetadata changed, other types are identical)
3864
+
3865
+ fn convert_kv_response_data_v5_to_v6(data: v5::KvResponseData) -> v6::KvResponseData {
3866
+ match data {
3867
+ v5::KvResponseData::KvErrorResponse(err) => {
3868
+ v6::KvResponseData::KvErrorResponse(v6::KvErrorResponse {
3869
+ message: err.message,
3870
+ })
3871
+ }
3872
+ v5::KvResponseData::KvGetResponse(resp) => {
3873
+ v6::KvResponseData::KvGetResponse(v6::KvGetResponse {
3874
+ keys: resp.keys,
3875
+ values: resp.values,
3876
+ metadata: resp
3877
+ .metadata
3878
+ .into_iter()
3879
+ .map(convert_kv_metadata_v5_to_v6)
3880
+ .collect(),
3881
+ })
3882
+ }
3883
+ v5::KvResponseData::KvListResponse(resp) => {
3884
+ v6::KvResponseData::KvListResponse(v6::KvListResponse {
3885
+ keys: resp.keys,
3886
+ values: resp.values,
3887
+ metadata: resp
3888
+ .metadata
3889
+ .into_iter()
3890
+ .map(convert_kv_metadata_v5_to_v6)
3891
+ .collect(),
3892
+ })
3893
+ }
3894
+ v5::KvResponseData::KvPutResponse => v6::KvResponseData::KvPutResponse,
3895
+ v5::KvResponseData::KvDeleteResponse => v6::KvResponseData::KvDeleteResponse,
3896
+ v5::KvResponseData::KvDropResponse => v6::KvResponseData::KvDropResponse,
3897
+ }
3898
+ }
3899
+
3900
+ fn convert_kv_response_data_v6_to_v5(data: v6::KvResponseData) -> v5::KvResponseData {
3901
+ match data {
3902
+ v6::KvResponseData::KvErrorResponse(err) => {
3903
+ v5::KvResponseData::KvErrorResponse(v5::KvErrorResponse {
3904
+ message: err.message,
3905
+ })
3906
+ }
3907
+ v6::KvResponseData::KvGetResponse(resp) => {
3908
+ v5::KvResponseData::KvGetResponse(v5::KvGetResponse {
3909
+ keys: resp.keys,
3910
+ values: resp.values,
3911
+ metadata: resp
3912
+ .metadata
3913
+ .into_iter()
3914
+ .map(convert_kv_metadata_v6_to_v5)
3915
+ .collect(),
3916
+ })
3917
+ }
3918
+ v6::KvResponseData::KvListResponse(resp) => {
3919
+ v5::KvResponseData::KvListResponse(v5::KvListResponse {
3920
+ keys: resp.keys,
3921
+ values: resp.values,
3922
+ metadata: resp
3923
+ .metadata
3924
+ .into_iter()
3925
+ .map(convert_kv_metadata_v6_to_v5)
3926
+ .collect(),
3927
+ })
3928
+ }
3929
+ v6::KvResponseData::KvPutResponse => v5::KvResponseData::KvPutResponse,
3930
+ v6::KvResponseData::KvDeleteResponse => v5::KvResponseData::KvDeleteResponse,
3931
+ v6::KvResponseData::KvDropResponse => v5::KvResponseData::KvDropResponse,
3932
+ }
3933
+ }
3934
+
3935
+ fn convert_kv_metadata_v5_to_v6(metadata: v5::KvMetadata) -> v6::KvMetadata {
3936
+ v6::KvMetadata {
3937
+ version: metadata.version,
3938
+ update_ts: metadata.update_ts,
3939
+ }
3940
+ }
3941
+
3942
+ fn convert_kv_metadata_v6_to_v5(metadata: v6::KvMetadata) -> v5::KvMetadata {
3943
+ v5::KvMetadata {
3944
+ version: metadata.version,
3945
+ update_ts: metadata.update_ts,
3946
+ }
3947
+ }
3948
+
3949
+ fn convert_kv_response_data_v5_to_v7(data: v5::KvResponseData) -> v7::KvResponseData {
3950
+ convert_kv_response_data_v6_to_v7(convert_kv_response_data_v5_to_v6(data))
3951
+ }
3952
+
3953
+ fn convert_kv_response_data_v7_to_v5(data: v7::KvResponseData) -> v5::KvResponseData {
3954
+ convert_kv_response_data_v6_to_v5(convert_kv_response_data_v7_to_v6(data))
3955
+ }
3956
+
3957
+ fn convert_kv_response_data_v6_to_v7(data: v6::KvResponseData) -> v7::KvResponseData {
3958
+ match data {
3959
+ v6::KvResponseData::KvErrorResponse(err) => {
3960
+ v7::KvResponseData::KvErrorResponse(v7::KvErrorResponse {
3961
+ message: err.message,
3962
+ })
3963
+ }
3964
+ v6::KvResponseData::KvGetResponse(resp) => {
3965
+ v7::KvResponseData::KvGetResponse(v7::KvGetResponse {
3966
+ keys: resp.keys,
3967
+ values: resp.values,
3968
+ metadata: resp
3969
+ .metadata
3970
+ .into_iter()
3971
+ .map(convert_kv_metadata_v6_to_v7)
3972
+ .collect(),
3973
+ })
3974
+ }
3975
+ v6::KvResponseData::KvListResponse(resp) => {
3976
+ v7::KvResponseData::KvListResponse(v7::KvListResponse {
3977
+ keys: resp.keys,
3978
+ values: resp.values,
3979
+ metadata: resp
3980
+ .metadata
3981
+ .into_iter()
3982
+ .map(convert_kv_metadata_v6_to_v7)
3983
+ .collect(),
3984
+ })
3985
+ }
3986
+ v6::KvResponseData::KvPutResponse => v7::KvResponseData::KvPutResponse,
3987
+ v6::KvResponseData::KvDeleteResponse => v7::KvResponseData::KvDeleteResponse,
3988
+ v6::KvResponseData::KvDropResponse => v7::KvResponseData::KvDropResponse,
3989
+ }
3990
+ }
3991
+
3992
+ fn convert_kv_response_data_v7_to_v6(data: v7::KvResponseData) -> v6::KvResponseData {
3993
+ match data {
3994
+ v7::KvResponseData::KvErrorResponse(err) => {
3995
+ v6::KvResponseData::KvErrorResponse(v6::KvErrorResponse {
3996
+ message: err.message,
3997
+ })
3998
+ }
3999
+ v7::KvResponseData::KvGetResponse(resp) => {
4000
+ v6::KvResponseData::KvGetResponse(v6::KvGetResponse {
4001
+ keys: resp.keys,
4002
+ values: resp.values,
4003
+ metadata: resp
4004
+ .metadata
4005
+ .into_iter()
4006
+ .map(convert_kv_metadata_v7_to_v6)
4007
+ .collect(),
4008
+ })
4009
+ }
4010
+ v7::KvResponseData::KvListResponse(resp) => {
4011
+ v6::KvResponseData::KvListResponse(v6::KvListResponse {
4012
+ keys: resp.keys,
4013
+ values: resp.values,
4014
+ metadata: resp
4015
+ .metadata
4016
+ .into_iter()
4017
+ .map(convert_kv_metadata_v7_to_v6)
4018
+ .collect(),
4019
+ })
4020
+ }
4021
+ v7::KvResponseData::KvPutResponse => v6::KvResponseData::KvPutResponse,
4022
+ v7::KvResponseData::KvDeleteResponse => v6::KvResponseData::KvDeleteResponse,
4023
+ v7::KvResponseData::KvDropResponse => v6::KvResponseData::KvDropResponse,
4024
+ }
4025
+ }
4026
+
4027
+ fn convert_kv_metadata_v6_to_v7(metadata: v6::KvMetadata) -> v7::KvMetadata {
4028
+ v7::KvMetadata {
4029
+ version: metadata.version,
4030
+ update_ts: metadata.update_ts,
4031
+ }
4032
+ }
4033
+
4034
+ fn convert_kv_metadata_v7_to_v6(metadata: v7::KvMetadata) -> v6::KvMetadata {
4035
+ v6::KvMetadata {
4036
+ version: metadata.version,
4037
+ update_ts: metadata.update_ts,
4038
+ }
4039
+ }
4040
+
4041
+ fn convert_to_client_tunnel_message_kind_v5_to_v6(
4042
+ kind: v5::ToClientTunnelMessageKind,
4043
+ ) -> v6::ToClientTunnelMessageKind {
4044
+ match kind {
4045
+ v5::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
4046
+ v6::ToClientTunnelMessageKind::ToClientRequestStart(v6::ToClientRequestStart {
4047
+ actor_id: req.actor_id,
4048
+ method: req.method,
4049
+ path: req.path,
4050
+ headers: req.headers,
4051
+ body: req.body,
4052
+ stream: req.stream,
4053
+ })
4054
+ }
4055
+ v5::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
4056
+ v6::ToClientTunnelMessageKind::ToClientRequestChunk(v6::ToClientRequestChunk {
4057
+ body: chunk.body,
4058
+ finish: chunk.finish,
4059
+ })
4060
+ }
4061
+ v5::ToClientTunnelMessageKind::ToClientRequestAbort => {
4062
+ v6::ToClientTunnelMessageKind::ToClientRequestAbort
4063
+ }
4064
+ v5::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
4065
+ v6::ToClientTunnelMessageKind::ToClientWebSocketOpen(v6::ToClientWebSocketOpen {
4066
+ actor_id: ws.actor_id,
4067
+ path: ws.path,
4068
+ headers: ws.headers,
4069
+ })
4070
+ }
4071
+ v5::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
4072
+ v6::ToClientTunnelMessageKind::ToClientWebSocketMessage(v6::ToClientWebSocketMessage {
4073
+ data: msg.data,
4074
+ binary: msg.binary,
4075
+ })
4076
+ }
4077
+ v5::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
4078
+ v6::ToClientTunnelMessageKind::ToClientWebSocketClose(v6::ToClientWebSocketClose {
4079
+ code: close.code,
4080
+ reason: close.reason,
4081
+ })
4082
+ }
4083
+ }
4084
+ }
4085
+
4086
+ fn convert_to_client_tunnel_message_kind_v6_to_v5(
4087
+ kind: v6::ToClientTunnelMessageKind,
4088
+ ) -> v5::ToClientTunnelMessageKind {
4089
+ match kind {
4090
+ v6::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
4091
+ v5::ToClientTunnelMessageKind::ToClientRequestStart(v5::ToClientRequestStart {
4092
+ actor_id: req.actor_id,
4093
+ method: req.method,
4094
+ path: req.path,
4095
+ headers: req.headers,
4096
+ body: req.body,
4097
+ stream: req.stream,
4098
+ })
4099
+ }
4100
+ v6::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
4101
+ v5::ToClientTunnelMessageKind::ToClientRequestChunk(v5::ToClientRequestChunk {
4102
+ body: chunk.body,
4103
+ finish: chunk.finish,
4104
+ })
4105
+ }
4106
+ v6::ToClientTunnelMessageKind::ToClientRequestAbort => {
4107
+ v5::ToClientTunnelMessageKind::ToClientRequestAbort
4108
+ }
4109
+ v6::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
4110
+ v5::ToClientTunnelMessageKind::ToClientWebSocketOpen(v5::ToClientWebSocketOpen {
4111
+ actor_id: ws.actor_id,
4112
+ path: ws.path,
4113
+ headers: ws.headers,
4114
+ })
4115
+ }
4116
+ v6::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
4117
+ v5::ToClientTunnelMessageKind::ToClientWebSocketMessage(v5::ToClientWebSocketMessage {
4118
+ data: msg.data,
4119
+ binary: msg.binary,
4120
+ })
4121
+ }
4122
+ v6::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
4123
+ v5::ToClientTunnelMessageKind::ToClientWebSocketClose(v5::ToClientWebSocketClose {
4124
+ code: close.code,
4125
+ reason: close.reason,
4126
+ })
4127
+ }
4128
+ }
4129
+ }
4130
+
4131
+ fn convert_to_client_tunnel_message_kind_v5_to_v7(
4132
+ kind: v5::ToClientTunnelMessageKind,
4133
+ ) -> v7::ToClientTunnelMessageKind {
4134
+ convert_to_client_tunnel_message_kind_v6_to_v7(convert_to_client_tunnel_message_kind_v5_to_v6(
4135
+ kind,
4136
+ ))
4137
+ }
4138
+
4139
+ fn convert_to_client_tunnel_message_kind_v7_to_v5(
4140
+ kind: v7::ToClientTunnelMessageKind,
4141
+ ) -> v5::ToClientTunnelMessageKind {
4142
+ convert_to_client_tunnel_message_kind_v6_to_v5(convert_to_client_tunnel_message_kind_v7_to_v6(
4143
+ kind,
4144
+ ))
4145
+ }
4146
+
4147
+ fn convert_to_client_tunnel_message_kind_v4_to_v7(
4148
+ kind: v4::ToClientTunnelMessageKind,
4149
+ ) -> v7::ToClientTunnelMessageKind {
4150
+ convert_to_client_tunnel_message_kind_v6_to_v7(convert_to_client_tunnel_message_kind_v4_to_v6(
4151
+ kind,
4152
+ ))
4153
+ }
4154
+
4155
+ fn convert_to_client_tunnel_message_kind_v7_to_v4(
4156
+ kind: v7::ToClientTunnelMessageKind,
4157
+ ) -> v4::ToClientTunnelMessageKind {
4158
+ convert_to_client_tunnel_message_kind_v6_to_v4(convert_to_client_tunnel_message_kind_v7_to_v6(
4159
+ kind,
4160
+ ))
4161
+ }
4162
+
4163
+ fn convert_to_client_tunnel_message_kind_v6_to_v7(
4164
+ kind: v6::ToClientTunnelMessageKind,
4165
+ ) -> v7::ToClientTunnelMessageKind {
4166
+ match kind {
4167
+ v6::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
4168
+ v7::ToClientTunnelMessageKind::ToClientRequestStart(v7::ToClientRequestStart {
4169
+ actor_id: req.actor_id,
4170
+ method: req.method,
4171
+ path: req.path,
4172
+ headers: req.headers,
4173
+ body: req.body,
4174
+ stream: req.stream,
4175
+ })
4176
+ }
4177
+ v6::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
4178
+ v7::ToClientTunnelMessageKind::ToClientRequestChunk(v7::ToClientRequestChunk {
4179
+ body: chunk.body,
4180
+ finish: chunk.finish,
4181
+ })
4182
+ }
4183
+ v6::ToClientTunnelMessageKind::ToClientRequestAbort => {
4184
+ v7::ToClientTunnelMessageKind::ToClientRequestAbort
4185
+ }
4186
+ v6::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
4187
+ v7::ToClientTunnelMessageKind::ToClientWebSocketOpen(v7::ToClientWebSocketOpen {
4188
+ actor_id: ws.actor_id,
4189
+ path: ws.path,
4190
+ headers: ws.headers,
4191
+ })
4192
+ }
4193
+ v6::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
4194
+ v7::ToClientTunnelMessageKind::ToClientWebSocketMessage(v7::ToClientWebSocketMessage {
4195
+ data: msg.data,
4196
+ binary: msg.binary,
4197
+ })
4198
+ }
4199
+ v6::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
4200
+ v7::ToClientTunnelMessageKind::ToClientWebSocketClose(v7::ToClientWebSocketClose {
4201
+ code: close.code,
4202
+ reason: close.reason,
4203
+ })
4204
+ }
4205
+ }
4206
+ }
4207
+
4208
+ fn convert_to_client_tunnel_message_kind_v7_to_v6(
4209
+ kind: v7::ToClientTunnelMessageKind,
4210
+ ) -> v6::ToClientTunnelMessageKind {
4211
+ match kind {
4212
+ v7::ToClientTunnelMessageKind::ToClientRequestStart(req) => {
4213
+ v6::ToClientTunnelMessageKind::ToClientRequestStart(v6::ToClientRequestStart {
4214
+ actor_id: req.actor_id,
4215
+ method: req.method,
4216
+ path: req.path,
4217
+ headers: req.headers,
4218
+ body: req.body,
4219
+ stream: req.stream,
4220
+ })
4221
+ }
4222
+ v7::ToClientTunnelMessageKind::ToClientRequestChunk(chunk) => {
4223
+ v6::ToClientTunnelMessageKind::ToClientRequestChunk(v6::ToClientRequestChunk {
4224
+ body: chunk.body,
4225
+ finish: chunk.finish,
4226
+ })
4227
+ }
4228
+ v7::ToClientTunnelMessageKind::ToClientRequestAbort => {
4229
+ v6::ToClientTunnelMessageKind::ToClientRequestAbort
4230
+ }
4231
+ v7::ToClientTunnelMessageKind::ToClientWebSocketOpen(ws) => {
4232
+ v6::ToClientTunnelMessageKind::ToClientWebSocketOpen(v6::ToClientWebSocketOpen {
4233
+ actor_id: ws.actor_id,
4234
+ path: ws.path,
4235
+ headers: ws.headers,
4236
+ })
4237
+ }
4238
+ v7::ToClientTunnelMessageKind::ToClientWebSocketMessage(msg) => {
4239
+ v6::ToClientTunnelMessageKind::ToClientWebSocketMessage(v6::ToClientWebSocketMessage {
4240
+ data: msg.data,
4241
+ binary: msg.binary,
4242
+ })
4243
+ }
4244
+ v7::ToClientTunnelMessageKind::ToClientWebSocketClose(close) => {
4245
+ v6::ToClientTunnelMessageKind::ToClientWebSocketClose(v6::ToClientWebSocketClose {
4246
+ code: close.code,
4247
+ reason: close.reason,
4248
+ })
4249
+ }
4250
+ }
4251
+ }
4252
+
4253
+ fn convert_to_server_tunnel_message_kind_v6_to_v7(
4254
+ kind: v6::ToServerTunnelMessageKind,
4255
+ ) -> v7::ToServerTunnelMessageKind {
4256
+ match kind {
4257
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
4258
+ v7::ToServerTunnelMessageKind::ToServerResponseStart(v7::ToServerResponseStart {
4259
+ status: resp.status,
4260
+ headers: resp.headers,
4261
+ body: resp.body,
4262
+ stream: resp.stream,
4263
+ })
4264
+ }
4265
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
4266
+ v7::ToServerTunnelMessageKind::ToServerResponseChunk(v7::ToServerResponseChunk {
4267
+ body: chunk.body,
4268
+ finish: chunk.finish,
4269
+ })
4270
+ }
4271
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort => {
4272
+ v7::ToServerTunnelMessageKind::ToServerResponseAbort
4273
+ }
4274
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
4275
+ v7::ToServerTunnelMessageKind::ToServerWebSocketOpen(v7::ToServerWebSocketOpen {
4276
+ can_hibernate: open.can_hibernate,
4277
+ })
4278
+ }
4279
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
4280
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessage(v7::ToServerWebSocketMessage {
4281
+ data: msg.data,
4282
+ binary: msg.binary,
4283
+ })
4284
+ }
4285
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
4286
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
4287
+ v7::ToServerWebSocketMessageAck { index: ack.index },
4288
+ )
4289
+ }
4290
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
4291
+ v7::ToServerTunnelMessageKind::ToServerWebSocketClose(v7::ToServerWebSocketClose {
4292
+ code: close.code,
4293
+ reason: close.reason,
4294
+ hibernate: close.hibernate,
4295
+ })
4296
+ }
4297
+ }
4298
+ }
4299
+
4300
+ fn convert_to_server_tunnel_message_kind_v7_to_v6(
4301
+ kind: v7::ToServerTunnelMessageKind,
4302
+ ) -> v6::ToServerTunnelMessageKind {
4303
+ match kind {
4304
+ v7::ToServerTunnelMessageKind::ToServerResponseStart(resp) => {
4305
+ v6::ToServerTunnelMessageKind::ToServerResponseStart(v6::ToServerResponseStart {
4306
+ status: resp.status,
4307
+ headers: resp.headers,
4308
+ body: resp.body,
4309
+ stream: resp.stream,
4310
+ })
4311
+ }
4312
+ v7::ToServerTunnelMessageKind::ToServerResponseChunk(chunk) => {
4313
+ v6::ToServerTunnelMessageKind::ToServerResponseChunk(v6::ToServerResponseChunk {
4314
+ body: chunk.body,
4315
+ finish: chunk.finish,
4316
+ })
4317
+ }
4318
+ v7::ToServerTunnelMessageKind::ToServerResponseAbort => {
4319
+ v6::ToServerTunnelMessageKind::ToServerResponseAbort
4320
+ }
4321
+ v7::ToServerTunnelMessageKind::ToServerWebSocketOpen(open) => {
4322
+ v6::ToServerTunnelMessageKind::ToServerWebSocketOpen(v6::ToServerWebSocketOpen {
4323
+ can_hibernate: open.can_hibernate,
4324
+ })
4325
+ }
4326
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessage(msg) => {
4327
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessage(v6::ToServerWebSocketMessage {
4328
+ data: msg.data,
4329
+ binary: msg.binary,
4330
+ })
4331
+ }
4332
+ v7::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(ack) => {
4333
+ v6::ToServerTunnelMessageKind::ToServerWebSocketMessageAck(
4334
+ v6::ToServerWebSocketMessageAck { index: ack.index },
4335
+ )
4336
+ }
4337
+ v7::ToServerTunnelMessageKind::ToServerWebSocketClose(close) => {
4338
+ v6::ToServerTunnelMessageKind::ToServerWebSocketClose(v6::ToServerWebSocketClose {
4339
+ code: close.code,
4340
+ reason: close.reason,
4341
+ hibernate: close.hibernate,
4342
+ })
4343
+ }
4344
+ }
4345
+ }