rivetkit 2.0.39 → 2.0.41

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 (103) hide show
  1. package/dist/schemas/actor-persist/v1.js +167 -0
  2. package/dist/schemas/actor-persist/v2.js +200 -0
  3. package/dist/schemas/actor-persist/v3.js +200 -0
  4. package/dist/schemas/client-protocol/v1.js +301 -0
  5. package/dist/schemas/client-protocol/v2.js +299 -0
  6. package/dist/schemas/file-system-driver/v1.js +76 -0
  7. package/dist/schemas/file-system-driver/v2.js +103 -0
  8. package/dist/schemas/file-system-driver/v3.js +122 -0
  9. package/dist/tsup/actor/errors.cjs.map +1 -1
  10. package/dist/tsup/{chunk-OJZRCEIA.js → chunk-4J5EFV3E.js} +5 -5
  11. package/dist/tsup/{chunk-7E3RWMR6.cjs → chunk-4UHJ3ADW.cjs} +173 -107
  12. package/dist/tsup/chunk-4UHJ3ADW.cjs.map +1 -0
  13. package/dist/tsup/{chunk-BQ36VTSB.js → chunk-7KIR3QLO.js} +86 -20
  14. package/dist/tsup/{chunk-BQ36VTSB.js.map → chunk-7KIR3QLO.js.map} +1 -1
  15. package/dist/tsup/{chunk-KMYFL3OL.cjs → chunk-B5UXC4QV.cjs} +75 -64
  16. package/dist/tsup/chunk-B5UXC4QV.cjs.map +1 -0
  17. package/dist/tsup/{chunk-C64FV764.cjs → chunk-DSNSFYDL.cjs} +3 -3
  18. package/dist/tsup/chunk-DSNSFYDL.cjs.map +1 -0
  19. package/dist/tsup/chunk-GBENOENJ.cjs.map +1 -1
  20. package/dist/tsup/{chunk-DY4H3ASE.cjs → chunk-GTQKDCM4.cjs} +46 -46
  21. package/dist/tsup/chunk-GTQKDCM4.cjs.map +1 -0
  22. package/dist/tsup/chunk-KDFWJKMJ.cjs.map +1 -1
  23. package/dist/tsup/{chunk-CDK6DRO2.js → chunk-LMG4QMDO.js} +2 -2
  24. package/dist/tsup/{chunk-CDK6DRO2.js.map → chunk-LMG4QMDO.js.map} +1 -1
  25. package/dist/tsup/{chunk-T7IPDBWH.js → chunk-NRP2OHSW.js} +4 -4
  26. package/dist/tsup/{chunk-PVKUXMOA.js → chunk-OXN6EZUB.js} +19 -8
  27. package/dist/tsup/chunk-OXN6EZUB.js.map +1 -0
  28. package/dist/tsup/{chunk-MZPYVTVG.cjs → chunk-QDVKDX7G.cjs} +9 -9
  29. package/dist/tsup/chunk-QDVKDX7G.cjs.map +1 -0
  30. package/dist/tsup/{chunk-X72X7I7T.cjs → chunk-S6F7EKC7.cjs} +2 -2
  31. package/dist/tsup/chunk-S6F7EKC7.cjs.map +1 -0
  32. package/dist/tsup/chunk-SNAUKDDK.cjs.map +1 -1
  33. package/dist/tsup/{chunk-XU74APB4.js → chunk-UGOCTUBG.js} +6 -5
  34. package/dist/tsup/chunk-UGOCTUBG.js.map +1 -0
  35. package/dist/tsup/{chunk-UAX5E3EU.cjs → chunk-WYZLRPQM.cjs} +250 -249
  36. package/dist/tsup/chunk-WYZLRPQM.cjs.map +1 -0
  37. package/dist/tsup/{chunk-PHCD25XO.js → chunk-Y7ZDTLD2.js} +2 -2
  38. package/dist/tsup/client/mod.cjs +5 -5
  39. package/dist/tsup/client/mod.cjs.map +1 -1
  40. package/dist/tsup/client/mod.d.cts +2 -2
  41. package/dist/tsup/client/mod.d.ts +2 -2
  42. package/dist/tsup/client/mod.js +4 -4
  43. package/dist/tsup/common/log.cjs +2 -2
  44. package/dist/tsup/common/log.cjs.map +1 -1
  45. package/dist/tsup/common/log.d.cts +2 -2
  46. package/dist/tsup/common/log.d.ts +2 -2
  47. package/dist/tsup/common/log.js +1 -1
  48. package/dist/tsup/common/websocket.cjs +3 -3
  49. package/dist/tsup/common/websocket.cjs.map +1 -1
  50. package/dist/tsup/common/websocket.js +2 -2
  51. package/dist/tsup/{config-BuBlMs6C.d.cts → config-COyis_uH.d.cts} +22 -10
  52. package/dist/tsup/{config-CBwo4ooA.d.ts → config-D43N-CFi.d.ts} +22 -10
  53. package/dist/tsup/{driver-CPXmh8f8.d.cts → driver-Bt7B-qMd.d.cts} +1 -1
  54. package/dist/tsup/{driver-DxWa6HUO.d.ts → driver-KyM2v645.d.ts} +1 -1
  55. package/dist/tsup/driver-helpers/mod.cjs +3 -3
  56. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  57. package/dist/tsup/driver-helpers/mod.d.cts +2 -2
  58. package/dist/tsup/driver-helpers/mod.d.ts +2 -2
  59. package/dist/tsup/driver-helpers/mod.js +2 -2
  60. package/dist/tsup/driver-test-suite/mod.cjs +62 -34
  61. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  62. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  63. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  64. package/dist/tsup/driver-test-suite/mod.js +35 -7
  65. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  66. package/dist/tsup/inspector/mod.cjs.map +1 -1
  67. package/dist/tsup/mod.cjs +7 -7
  68. package/dist/tsup/mod.cjs.map +1 -1
  69. package/dist/tsup/mod.d.cts +4 -4
  70. package/dist/tsup/mod.d.ts +4 -4
  71. package/dist/tsup/mod.js +6 -6
  72. package/dist/tsup/test/mod.cjs +7 -7
  73. package/dist/tsup/test/mod.cjs.map +1 -1
  74. package/dist/tsup/test/mod.d.cts +1 -1
  75. package/dist/tsup/test/mod.d.ts +1 -1
  76. package/dist/tsup/test/mod.js +6 -6
  77. package/dist/tsup/utils.cjs +2 -2
  78. package/dist/tsup/utils.cjs.map +1 -1
  79. package/dist/tsup/utils.js +1 -1
  80. package/package.json +2 -2
  81. package/src/actor/instance/schedule-manager.ts +2 -1
  82. package/src/actor/router-websocket-endpoints.test.ts +54 -0
  83. package/src/actor/router-websocket-endpoints.ts +9 -4
  84. package/src/common/router.ts +2 -0
  85. package/src/driver-test-suite/tests/raw-websocket.ts +40 -0
  86. package/src/engine-process/mod.ts +69 -7
  87. package/src/registry/config/index.ts +7 -0
  88. package/src/registry/config/serverless.ts +2 -0
  89. package/src/registry/serve.ts +9 -5
  90. package/src/remote-manager-driver/api-endpoints.ts +2 -0
  91. package/src/serverless/configure.ts +3 -0
  92. package/dist/tsup/chunk-7E3RWMR6.cjs.map +0 -1
  93. package/dist/tsup/chunk-C64FV764.cjs.map +0 -1
  94. package/dist/tsup/chunk-DY4H3ASE.cjs.map +0 -1
  95. package/dist/tsup/chunk-KMYFL3OL.cjs.map +0 -1
  96. package/dist/tsup/chunk-MZPYVTVG.cjs.map +0 -1
  97. package/dist/tsup/chunk-PVKUXMOA.js.map +0 -1
  98. package/dist/tsup/chunk-UAX5E3EU.cjs.map +0 -1
  99. package/dist/tsup/chunk-X72X7I7T.cjs.map +0 -1
  100. package/dist/tsup/chunk-XU74APB4.js.map +0 -1
  101. /package/dist/tsup/{chunk-OJZRCEIA.js.map → chunk-4J5EFV3E.js.map} +0 -0
  102. /package/dist/tsup/{chunk-T7IPDBWH.js.map → chunk-NRP2OHSW.js.map} +0 -0
  103. /package/dist/tsup/{chunk-PHCD25XO.js.map → chunk-Y7ZDTLD2.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/inspector/mod.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qpIAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/inspector/mod.cjs"}
1
+ {"version":3,"sources":["/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/inspector/mod.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qpIAAC","file":"/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/inspector/mod.cjs"}
package/dist/tsup/mod.cjs CHANGED
@@ -3,18 +3,18 @@
3
3
 
4
4
 
5
5
 
6
- var _chunk7E3RWMR6cjs = require('./chunk-7E3RWMR6.cjs');
6
+ var _chunk4UHJ3ADWcjs = require('./chunk-4UHJ3ADW.cjs');
7
7
 
8
8
 
9
9
 
10
10
 
11
11
 
12
- var _chunkDY4H3ASEcjs = require('./chunk-DY4H3ASE.cjs');
12
+ var _chunkGTQKDCM4cjs = require('./chunk-GTQKDCM4.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunkUAX5E3EUcjs = require('./chunk-UAX5E3EU.cjs');
17
- require('./chunk-C64FV764.cjs');
16
+ var _chunkWYZLRPQMcjs = require('./chunk-WYZLRPQM.cjs');
17
+ require('./chunk-DSNSFYDL.cjs');
18
18
 
19
19
 
20
20
 
@@ -32,12 +32,12 @@ require('./chunk-C64FV764.cjs');
32
32
 
33
33
 
34
34
 
35
- var _chunkKMYFL3OLcjs = require('./chunk-KMYFL3OL.cjs');
35
+ var _chunkB5UXC4QVcjs = require('./chunk-B5UXC4QV.cjs');
36
36
  require('./chunk-KDFWJKMJ.cjs');
37
37
 
38
38
 
39
39
 
40
- var _chunkX72X7I7Tcjs = require('./chunk-X72X7I7T.cjs');
40
+ var _chunkS6F7EKC7cjs = require('./chunk-S6F7EKC7.cjs');
41
41
 
42
42
 
43
43
  var _chunkSNAUKDDKcjs = require('./chunk-SNAUKDDK.cjs');
@@ -72,5 +72,5 @@ require('./chunk-GBENOENJ.cjs');
72
72
 
73
73
 
74
74
 
75
- exports.ALLOWED_PUBLIC_HEADERS = _chunkKMYFL3OLcjs.ALLOWED_PUBLIC_HEADERS; exports.ActorKv = _chunkKMYFL3OLcjs.ActorKv; exports.ActorsSchema = _chunkKMYFL3OLcjs.ActorsSchema; exports.DocConfigureRunnerPoolSchema = _chunkKMYFL3OLcjs.DocConfigureRunnerPoolSchema; exports.DocInspectorConfigSchema = _chunkKMYFL3OLcjs.DocInspectorConfigSchema; exports.DocRegistryConfigSchema = _chunkKMYFL3OLcjs.DocRegistryConfigSchema; exports.DocRunnerConfigSchema = _chunkKMYFL3OLcjs.DocRunnerConfigSchema; exports.DocServerlessConfigSchema = _chunkKMYFL3OLcjs.DocServerlessConfigSchema; exports.DriverConfigSchema = _chunkKMYFL3OLcjs.DriverConfigSchema; exports.InlineWebSocketAdapter = _chunkDY4H3ASEcjs.InlineWebSocketAdapter; exports.KV_KEYS = _chunkKMYFL3OLcjs.KEYS; exports.PATH_CONNECT = _chunkKMYFL3OLcjs.PATH_CONNECT; exports.PATH_WEBSOCKET_PREFIX = _chunkKMYFL3OLcjs.PATH_WEBSOCKET_PREFIX; exports.Registry = _chunk7E3RWMR6cjs.Registry; exports.RegistryConfigSchema = _chunkKMYFL3OLcjs.RegistryConfigSchema; exports.TestConfigSchema = _chunkKMYFL3OLcjs.TestConfigSchema; exports.UserError = _chunkSNAUKDDKcjs.UserError; exports.actor = _chunk7E3RWMR6cjs.actor; exports.buildActorNames = _chunkKMYFL3OLcjs.buildActorNames; exports.createActorRouter = _chunkDY4H3ASEcjs.createActorRouter; exports.createClientWithDriver = _chunkUAX5E3EUcjs.createClientWithDriver; exports.createEngineDriver = _chunk7E3RWMR6cjs.createEngineDriver; exports.createFileSystemDriver = _chunkDY4H3ASEcjs.createFileSystemDriver; exports.createMemoryDriver = _chunkDY4H3ASEcjs.createMemoryDriver; exports.lookupInRegistry = _chunkUAX5E3EUcjs.lookupInRegistry; exports.noopNext = _chunkX72X7I7Tcjs.noopNext; exports.routeWebSocket = _chunkKMYFL3OLcjs.routeWebSocket; exports.setup = _chunk7E3RWMR6cjs.setup; exports.toUint8Array = _chunkX72X7I7Tcjs.toUint8Array;
75
+ exports.ALLOWED_PUBLIC_HEADERS = _chunkB5UXC4QVcjs.ALLOWED_PUBLIC_HEADERS; exports.ActorKv = _chunkB5UXC4QVcjs.ActorKv; exports.ActorsSchema = _chunkB5UXC4QVcjs.ActorsSchema; exports.DocConfigureRunnerPoolSchema = _chunkB5UXC4QVcjs.DocConfigureRunnerPoolSchema; exports.DocInspectorConfigSchema = _chunkB5UXC4QVcjs.DocInspectorConfigSchema; exports.DocRegistryConfigSchema = _chunkB5UXC4QVcjs.DocRegistryConfigSchema; exports.DocRunnerConfigSchema = _chunkB5UXC4QVcjs.DocRunnerConfigSchema; exports.DocServerlessConfigSchema = _chunkB5UXC4QVcjs.DocServerlessConfigSchema; exports.DriverConfigSchema = _chunkB5UXC4QVcjs.DriverConfigSchema; exports.InlineWebSocketAdapter = _chunkGTQKDCM4cjs.InlineWebSocketAdapter; exports.KV_KEYS = _chunkB5UXC4QVcjs.KEYS; exports.PATH_CONNECT = _chunkB5UXC4QVcjs.PATH_CONNECT; exports.PATH_WEBSOCKET_PREFIX = _chunkB5UXC4QVcjs.PATH_WEBSOCKET_PREFIX; exports.Registry = _chunk4UHJ3ADWcjs.Registry; exports.RegistryConfigSchema = _chunkB5UXC4QVcjs.RegistryConfigSchema; exports.TestConfigSchema = _chunkB5UXC4QVcjs.TestConfigSchema; exports.UserError = _chunkSNAUKDDKcjs.UserError; exports.actor = _chunk4UHJ3ADWcjs.actor; exports.buildActorNames = _chunkB5UXC4QVcjs.buildActorNames; exports.createActorRouter = _chunkGTQKDCM4cjs.createActorRouter; exports.createClientWithDriver = _chunkWYZLRPQMcjs.createClientWithDriver; exports.createEngineDriver = _chunk4UHJ3ADWcjs.createEngineDriver; exports.createFileSystemDriver = _chunkGTQKDCM4cjs.createFileSystemDriver; exports.createMemoryDriver = _chunkGTQKDCM4cjs.createMemoryDriver; exports.lookupInRegistry = _chunkWYZLRPQMcjs.lookupInRegistry; exports.noopNext = _chunkS6F7EKC7cjs.noopNext; exports.routeWebSocket = _chunkB5UXC4QVcjs.routeWebSocket; exports.setup = _chunk4UHJ3ADWcjs.setup; exports.toUint8Array = _chunkS6F7EKC7cjs.toUint8Array;
76
76
  //# sourceMappingURL=mod.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qyDAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs"}
1
+ {"version":3,"sources":["/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qyDAAC","file":"/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/mod.cjs"}
@@ -1,11 +1,11 @@
1
- import { R as RegistryConfig, A as ActorDriver, a as AnyConn, b as AnyActorInstance, E as Encoding, c as AnyDatabaseProvider, d as Actions, e as ActorConfigInput, f as ActorDefinition } from './config-BuBlMs6C.cjs';
2
- export { B as ActionContext, F as ActionContextOf, r as ActorConfig, p as ActorConfigSchema, u as ActorContext, v as ActorContextOf, j as ActorKey, n as ActorKv, i as ActorQuery, o as ActorTypes, ac as ActorsSchema, l as AnyActorDefinition, g as AnyClient, q as AuthIntent, G as BeforeActionResponseContext, H as BeforeActionResponseContextOf, I as BeforeConnectContext, J as BeforeConnectContextOf, C as Client, k as Conn, w as ConnContext, x as ConnContextOf, y as ConnInitContext, z as ConnInitContextOf, K as ConnectContext, L as ConnectContextOf, O as CreateConnStateContext, P as CreateConnStateContextOf, M as CreateContext, N as CreateContextOf, Q as CreateVarsContext, S as CreateVarsContextOf, T as DestroyContext, U as DestroyContextOf, V as DisconnectContext, W as DisconnectContextOf, s as DocActorConfigSchema, D as DocActorOptionsSchema, ai as DocConfigureRunnerPoolSchema, ah as DocInspectorConfigSchema, al as DocRegistryConfigSchema, ak as DocRunnerConfigSchema, aj as DocServerlessConfigSchema, a7 as FetchHandler, a9 as LegacyStartServerOutput, aa as Registry, a5 as RegistryActors, af as RegistryConfigInput, a6 as RegistryConfigSchema, X as RequestContext, Y as RequestContextOf, a8 as ServerlessHandler, Z as SleepContext, _ as SleepContextOf, $ as StateChangeContext, a0 as StateChangeContextOf, ae as TestConfig, ad as TestConfigSchema, a1 as WakeContext, a2 as WakeContextOf, a3 as WebSocketContext, a4 as WebSocketContextOf, ag as buildActorNames, h as createClientWithDriver, m as lookupInRegistry, ab as setup, t as test } from './config-BuBlMs6C.cjs';
1
+ import { R as RegistryConfig, A as ActorDriver, a as AnyConn, b as AnyActorInstance, E as Encoding, c as AnyDatabaseProvider, d as Actions, e as ActorConfigInput, f as ActorDefinition } from './config-COyis_uH.cjs';
2
+ export { B as ActionContext, F as ActionContextOf, r as ActorConfig, p as ActorConfigSchema, u as ActorContext, v as ActorContextOf, j as ActorKey, n as ActorKv, i as ActorQuery, o as ActorTypes, ac as ActorsSchema, l as AnyActorDefinition, g as AnyClient, q as AuthIntent, G as BeforeActionResponseContext, H as BeforeActionResponseContextOf, I as BeforeConnectContext, J as BeforeConnectContextOf, C as Client, k as Conn, w as ConnContext, x as ConnContextOf, y as ConnInitContext, z as ConnInitContextOf, K as ConnectContext, L as ConnectContextOf, O as CreateConnStateContext, P as CreateConnStateContextOf, M as CreateContext, N as CreateContextOf, Q as CreateVarsContext, S as CreateVarsContextOf, T as DestroyContext, U as DestroyContextOf, V as DisconnectContext, W as DisconnectContextOf, s as DocActorConfigSchema, D as DocActorOptionsSchema, ai as DocConfigureRunnerPoolSchema, ah as DocInspectorConfigSchema, al as DocRegistryConfigSchema, ak as DocRunnerConfigSchema, aj as DocServerlessConfigSchema, a7 as FetchHandler, a9 as LegacyStartServerOutput, aa as Registry, a5 as RegistryActors, af as RegistryConfigInput, a6 as RegistryConfigSchema, X as RequestContext, Y as RequestContextOf, a8 as ServerlessHandler, Z as SleepContext, _ as SleepContextOf, $ as StateChangeContext, a0 as StateChangeContextOf, ae as TestConfig, ad as TestConfigSchema, a1 as WakeContext, a2 as WakeContextOf, a3 as WebSocketContext, a4 as WebSocketContextOf, ag as buildActorNames, h as createClientWithDriver, m as lookupInRegistry, ab as setup, t as test } from './config-COyis_uH.cjs';
3
3
  import { WSContext } from 'hono/ws';
4
4
  import { UniversalWebSocket } from '@rivetkit/virtual-websocket';
5
5
  export { RivetCloseEvent, RivetEvent, RivetMessageEvent, UniversalWebSocket } from '@rivetkit/virtual-websocket';
6
6
  export { n as noopNext } from './utils-fwx3o3K9.cjs';
7
- import { D as DriverConfig } from './driver-CPXmh8f8.cjs';
8
- export { a as DriverConfigSchema } from './driver-CPXmh8f8.cjs';
7
+ import { D as DriverConfig } from './driver-Bt7B-qMd.cjs';
8
+ export { a as DriverConfigSchema } from './driver-Bt7B-qMd.cjs';
9
9
  import { GetUpgradeWebSocket } from './utils.cjs';
10
10
  export { toUint8Array } from './utils.cjs';
11
11
  export { A as ALLOWED_PUBLIC_HEADERS, P as PATH_CONNECT, a as PATH_WEBSOCKET_PREFIX } from './actor-router-consts-DzI2szci.cjs';
@@ -1,11 +1,11 @@
1
- import { R as RegistryConfig, A as ActorDriver, a as AnyConn, b as AnyActorInstance, E as Encoding, c as AnyDatabaseProvider, d as Actions, e as ActorConfigInput, f as ActorDefinition } from './config-CBwo4ooA.js';
2
- export { B as ActionContext, F as ActionContextOf, r as ActorConfig, p as ActorConfigSchema, u as ActorContext, v as ActorContextOf, j as ActorKey, n as ActorKv, i as ActorQuery, o as ActorTypes, ac as ActorsSchema, l as AnyActorDefinition, g as AnyClient, q as AuthIntent, G as BeforeActionResponseContext, H as BeforeActionResponseContextOf, I as BeforeConnectContext, J as BeforeConnectContextOf, C as Client, k as Conn, w as ConnContext, x as ConnContextOf, y as ConnInitContext, z as ConnInitContextOf, K as ConnectContext, L as ConnectContextOf, O as CreateConnStateContext, P as CreateConnStateContextOf, M as CreateContext, N as CreateContextOf, Q as CreateVarsContext, S as CreateVarsContextOf, T as DestroyContext, U as DestroyContextOf, V as DisconnectContext, W as DisconnectContextOf, s as DocActorConfigSchema, D as DocActorOptionsSchema, ai as DocConfigureRunnerPoolSchema, ah as DocInspectorConfigSchema, al as DocRegistryConfigSchema, ak as DocRunnerConfigSchema, aj as DocServerlessConfigSchema, a7 as FetchHandler, a9 as LegacyStartServerOutput, aa as Registry, a5 as RegistryActors, af as RegistryConfigInput, a6 as RegistryConfigSchema, X as RequestContext, Y as RequestContextOf, a8 as ServerlessHandler, Z as SleepContext, _ as SleepContextOf, $ as StateChangeContext, a0 as StateChangeContextOf, ae as TestConfig, ad as TestConfigSchema, a1 as WakeContext, a2 as WakeContextOf, a3 as WebSocketContext, a4 as WebSocketContextOf, ag as buildActorNames, h as createClientWithDriver, m as lookupInRegistry, ab as setup, t as test } from './config-CBwo4ooA.js';
1
+ import { R as RegistryConfig, A as ActorDriver, a as AnyConn, b as AnyActorInstance, E as Encoding, c as AnyDatabaseProvider, d as Actions, e as ActorConfigInput, f as ActorDefinition } from './config-D43N-CFi.js';
2
+ export { B as ActionContext, F as ActionContextOf, r as ActorConfig, p as ActorConfigSchema, u as ActorContext, v as ActorContextOf, j as ActorKey, n as ActorKv, i as ActorQuery, o as ActorTypes, ac as ActorsSchema, l as AnyActorDefinition, g as AnyClient, q as AuthIntent, G as BeforeActionResponseContext, H as BeforeActionResponseContextOf, I as BeforeConnectContext, J as BeforeConnectContextOf, C as Client, k as Conn, w as ConnContext, x as ConnContextOf, y as ConnInitContext, z as ConnInitContextOf, K as ConnectContext, L as ConnectContextOf, O as CreateConnStateContext, P as CreateConnStateContextOf, M as CreateContext, N as CreateContextOf, Q as CreateVarsContext, S as CreateVarsContextOf, T as DestroyContext, U as DestroyContextOf, V as DisconnectContext, W as DisconnectContextOf, s as DocActorConfigSchema, D as DocActorOptionsSchema, ai as DocConfigureRunnerPoolSchema, ah as DocInspectorConfigSchema, al as DocRegistryConfigSchema, ak as DocRunnerConfigSchema, aj as DocServerlessConfigSchema, a7 as FetchHandler, a9 as LegacyStartServerOutput, aa as Registry, a5 as RegistryActors, af as RegistryConfigInput, a6 as RegistryConfigSchema, X as RequestContext, Y as RequestContextOf, a8 as ServerlessHandler, Z as SleepContext, _ as SleepContextOf, $ as StateChangeContext, a0 as StateChangeContextOf, ae as TestConfig, ad as TestConfigSchema, a1 as WakeContext, a2 as WakeContextOf, a3 as WebSocketContext, a4 as WebSocketContextOf, ag as buildActorNames, h as createClientWithDriver, m as lookupInRegistry, ab as setup, t as test } from './config-D43N-CFi.js';
3
3
  import { WSContext } from 'hono/ws';
4
4
  import { UniversalWebSocket } from '@rivetkit/virtual-websocket';
5
5
  export { RivetCloseEvent, RivetEvent, RivetMessageEvent, UniversalWebSocket } from '@rivetkit/virtual-websocket';
6
6
  export { n as noopNext } from './utils-fwx3o3K9.js';
7
- import { D as DriverConfig } from './driver-DxWa6HUO.js';
8
- export { a as DriverConfigSchema } from './driver-DxWa6HUO.js';
7
+ import { D as DriverConfig } from './driver-KyM2v645.js';
8
+ export { a as DriverConfigSchema } from './driver-KyM2v645.js';
9
9
  import { GetUpgradeWebSocket } from './utils.js';
10
10
  export { toUint8Array } from './utils.js';
11
11
  export { A as ALLOWED_PUBLIC_HEADERS, P as PATH_CONNECT, a as PATH_WEBSOCKET_PREFIX } from './actor-router-consts-DzI2szci.js';
package/dist/tsup/mod.js CHANGED
@@ -3,18 +3,18 @@ import {
3
3
  actor,
4
4
  createEngineDriver,
5
5
  setup
6
- } from "./chunk-BQ36VTSB.js";
6
+ } from "./chunk-7KIR3QLO.js";
7
7
  import {
8
8
  InlineWebSocketAdapter,
9
9
  createActorRouter,
10
10
  createFileSystemDriver,
11
11
  createMemoryDriver
12
- } from "./chunk-T7IPDBWH.js";
12
+ } from "./chunk-NRP2OHSW.js";
13
13
  import {
14
14
  createClientWithDriver,
15
15
  lookupInRegistry
16
- } from "./chunk-XU74APB4.js";
17
- import "./chunk-PHCD25XO.js";
16
+ } from "./chunk-UGOCTUBG.js";
17
+ import "./chunk-Y7ZDTLD2.js";
18
18
  import {
19
19
  ALLOWED_PUBLIC_HEADERS,
20
20
  ActorKv,
@@ -32,12 +32,12 @@ import {
32
32
  TestConfigSchema,
33
33
  buildActorNames,
34
34
  routeWebSocket
35
- } from "./chunk-PVKUXMOA.js";
35
+ } from "./chunk-OXN6EZUB.js";
36
36
  import "./chunk-E6ZE2YEA.js";
37
37
  import {
38
38
  noopNext,
39
39
  toUint8Array
40
- } from "./chunk-CDK6DRO2.js";
40
+ } from "./chunk-LMG4QMDO.js";
41
41
  import {
42
42
  UserError
43
43
  } from "./chunk-2YHR67M4.js";
@@ -1,17 +1,17 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkMZPYVTVGcjs = require('../chunk-MZPYVTVG.cjs');
5
- require('../chunk-DY4H3ASE.cjs');
6
- require('../chunk-UAX5E3EU.cjs');
7
- require('../chunk-C64FV764.cjs');
8
- require('../chunk-KMYFL3OL.cjs');
4
+ var _chunkQDVKDX7Gcjs = require('../chunk-QDVKDX7G.cjs');
5
+ require('../chunk-GTQKDCM4.cjs');
6
+ require('../chunk-WYZLRPQM.cjs');
7
+ require('../chunk-DSNSFYDL.cjs');
8
+ require('../chunk-B5UXC4QV.cjs');
9
9
  require('../chunk-KDFWJKMJ.cjs');
10
- require('../chunk-X72X7I7T.cjs');
10
+ require('../chunk-S6F7EKC7.cjs');
11
11
  require('../chunk-SNAUKDDK.cjs');
12
12
  require('../chunk-GBENOENJ.cjs');
13
13
 
14
14
 
15
15
 
16
- exports.getPort = _chunkMZPYVTVGcjs.getPort; exports.setupTest = _chunkMZPYVTVGcjs.setupTest;
16
+ exports.getPort = _chunkQDVKDX7Gcjs.getPort; exports.setupTest = _chunkQDVKDX7Gcjs.setupTest;
17
17
  //# sourceMappingURL=mod.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,6FAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs"}
1
+ {"version":3,"sources":["/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,6FAAC","file":"/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/test/mod.cjs"}
@@ -1,5 +1,5 @@
1
1
  import { TestContext } from 'vitest';
2
- import { aa as Registry, C as Client } from '../config-BuBlMs6C.cjs';
2
+ import { aa as Registry, C as Client } from '../config-COyis_uH.cjs';
3
3
  import 'zod';
4
4
  import '@rivetkit/virtual-websocket';
5
5
  import 'hono';
@@ -1,5 +1,5 @@
1
1
  import { TestContext } from 'vitest';
2
- import { aa as Registry, C as Client } from '../config-CBwo4ooA.js';
2
+ import { aa as Registry, C as Client } from '../config-D43N-CFi.js';
3
3
  import 'zod';
4
4
  import '@rivetkit/virtual-websocket';
5
5
  import 'hono';
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  getPort,
3
3
  setupTest
4
- } from "../chunk-OJZRCEIA.js";
5
- import "../chunk-T7IPDBWH.js";
6
- import "../chunk-XU74APB4.js";
7
- import "../chunk-PHCD25XO.js";
8
- import "../chunk-PVKUXMOA.js";
4
+ } from "../chunk-4J5EFV3E.js";
5
+ import "../chunk-NRP2OHSW.js";
6
+ import "../chunk-UGOCTUBG.js";
7
+ import "../chunk-Y7ZDTLD2.js";
8
+ import "../chunk-OXN6EZUB.js";
9
9
  import "../chunk-E6ZE2YEA.js";
10
- import "../chunk-CDK6DRO2.js";
10
+ import "../chunk-LMG4QMDO.js";
11
11
  import "../chunk-2YHR67M4.js";
12
12
  export {
13
13
  getPort,
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- var _chunkX72X7I7Tcjs = require('./chunk-X72X7I7T.cjs');
17
+ var _chunkS6F7EKC7cjs = require('./chunk-S6F7EKC7.cjs');
18
18
  require('./chunk-SNAUKDDK.cjs');
19
19
  require('./chunk-GBENOENJ.cjs');
20
20
 
@@ -33,5 +33,5 @@ require('./chunk-GBENOENJ.cjs');
33
33
 
34
34
 
35
35
 
36
- exports.EXTRA_ERROR_LOG = _chunkX72X7I7Tcjs.EXTRA_ERROR_LOG; exports.SinglePromiseQueue = _chunkX72X7I7Tcjs.SinglePromiseQueue; exports.VERSION = _chunkX72X7I7Tcjs.VERSION; exports.arrayBuffersEqual = _chunkX72X7I7Tcjs.arrayBuffersEqual; exports.assertUnreachable = _chunkX72X7I7Tcjs.assertUnreachable; exports.bufferToArrayBuffer = _chunkX72X7I7Tcjs.bufferToArrayBuffer; exports.combineUrlPath = _chunkX72X7I7Tcjs.combineUrlPath; exports.dbg = _chunkX72X7I7Tcjs.dbg; exports.detectRuntime = _chunkX72X7I7Tcjs.detectRuntime; exports.getEnvUniversal = _chunkX72X7I7Tcjs.getEnvUniversal; exports.httpUserAgent = _chunkX72X7I7Tcjs.httpUserAgent; exports.promiseWithResolvers = _chunkX72X7I7Tcjs.promiseWithResolvers; exports.setLongTimeout = _chunkX72X7I7Tcjs.setLongTimeout; exports.stringifyError = _chunkX72X7I7Tcjs.stringifyError; exports.toUint8Array = _chunkX72X7I7Tcjs.toUint8Array;
36
+ exports.EXTRA_ERROR_LOG = _chunkS6F7EKC7cjs.EXTRA_ERROR_LOG; exports.SinglePromiseQueue = _chunkS6F7EKC7cjs.SinglePromiseQueue; exports.VERSION = _chunkS6F7EKC7cjs.VERSION; exports.arrayBuffersEqual = _chunkS6F7EKC7cjs.arrayBuffersEqual; exports.assertUnreachable = _chunkS6F7EKC7cjs.assertUnreachable; exports.bufferToArrayBuffer = _chunkS6F7EKC7cjs.bufferToArrayBuffer; exports.combineUrlPath = _chunkS6F7EKC7cjs.combineUrlPath; exports.dbg = _chunkS6F7EKC7cjs.dbg; exports.detectRuntime = _chunkS6F7EKC7cjs.detectRuntime; exports.getEnvUniversal = _chunkS6F7EKC7cjs.getEnvUniversal; exports.httpUserAgent = _chunkS6F7EKC7cjs.httpUserAgent; exports.promiseWithResolvers = _chunkS6F7EKC7cjs.promiseWithResolvers; exports.setLongTimeout = _chunkS6F7EKC7cjs.setLongTimeout; exports.stringifyError = _chunkS6F7EKC7cjs.stringifyError; exports.toUint8Array = _chunkS6F7EKC7cjs.toUint8Array;
37
37
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,s3BAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"}
1
+ {"version":3,"sources":["/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,s3BAAC","file":"/Users/nathan/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/utils.cjs"}
@@ -14,7 +14,7 @@ import {
14
14
  setLongTimeout,
15
15
  stringifyError,
16
16
  toUint8Array
17
- } from "./chunk-CDK6DRO2.js";
17
+ } from "./chunk-LMG4QMDO.js";
18
18
  import "./chunk-2YHR67M4.js";
19
19
  export {
20
20
  EXTRA_ERROR_LOG,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rivetkit",
3
- "version": "2.0.39",
3
+ "version": "2.0.41",
4
4
  "description": "Lightweight libraries for building stateful actors on edge platforms",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
@@ -167,7 +167,7 @@
167
167
  "uuid": "^12.0.0",
168
168
  "vbare": "^0.0.4",
169
169
  "zod": "^4.1.0",
170
- "@rivetkit/engine-runner": "2.0.39",
170
+ "@rivetkit/engine-runner": "2.0.41",
171
171
  "@rivetkit/virtual-websocket": "2.0.33"
172
172
  },
173
173
  "devDependencies": {
@@ -261,7 +261,8 @@ export class ScheduleManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
261
261
  });
262
262
 
263
263
  // Look up the action function
264
- const fn = this.#config.actions[event.action];
264
+ const actions = this.#config.actions ?? {};
265
+ const fn = actions[event.action];
265
266
 
266
267
  if (!fn) {
267
268
  throw new Error(
@@ -0,0 +1,54 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import {
3
+ PATH_WEBSOCKET_BASE,
4
+ PATH_WEBSOCKET_PREFIX,
5
+ } from "@/common/actor-router-consts";
6
+
7
+ /**
8
+ * Unit tests for WebSocket path routing logic.
9
+ *
10
+ * These tests verify the path matching behavior in routeWebSocket
11
+ * without needing a full actor setup.
12
+ *
13
+ * NOTE: The driver-file-system end-to-end tests pass because the driver
14
+ * correctly strips query parameters before calling routeWebSocket
15
+ * (see FileSystemManagerDriver.openWebSocket). However, the bug still
16
+ * exists in routeWebSocket itself and could be triggered by other callers
17
+ * (e.g., engine driver's runnerWebSocket which passes requestPath directly).
18
+ */
19
+ describe("websocket path routing", () => {
20
+ // Helper that replicates the routing logic from routeWebSocket
21
+ // After fix: strips query params before comparing
22
+ function matchesWebSocketPath(requestPath: string): boolean {
23
+ const requestPathWithoutQuery = requestPath.split("?")[0];
24
+ return (
25
+ requestPathWithoutQuery === PATH_WEBSOCKET_BASE ||
26
+ requestPathWithoutQuery.startsWith(PATH_WEBSOCKET_PREFIX)
27
+ );
28
+ }
29
+
30
+ test("should match base websocket path without query", () => {
31
+ expect(matchesWebSocketPath("/websocket")).toBe(true);
32
+ });
33
+
34
+ test("should match websocket path with trailing slash", () => {
35
+ expect(matchesWebSocketPath("/websocket/")).toBe(true);
36
+ });
37
+
38
+ test("should match websocket path with subpath", () => {
39
+ expect(matchesWebSocketPath("/websocket/foo")).toBe(true);
40
+ expect(matchesWebSocketPath("/websocket/foo/bar")).toBe(true);
41
+ });
42
+
43
+ test("should match websocket path with subpath and query", () => {
44
+ // This works because "/websocket/foo?query" starts with "/websocket/"
45
+ expect(matchesWebSocketPath("/websocket/foo?query=value")).toBe(true);
46
+ });
47
+
48
+ // FIX: Query parameters are now stripped before routing comparison.
49
+ // This ensures /websocket?query correctly routes to the websocket handler.
50
+ test("should match base websocket path with query parameters", () => {
51
+ expect(matchesWebSocketPath("/websocket?token=abc")).toBe(true);
52
+ expect(matchesWebSocketPath("/websocket?foo=bar&baz=123")).toBe(true);
53
+ });
54
+ });
@@ -88,10 +88,15 @@ export async function routeWebSocket(
88
88
  // Promise used to wait for the websocket close in `disconnect`
89
89
  const closePromiseResolvers = promiseWithResolvers<void>();
90
90
 
91
+ // Strip query parameters from requestPath for routing purposes.
92
+ // This handles paths like "/websocket?query=value" which should route
93
+ // to the raw websocket handler.
94
+ const requestPathWithoutQuery = requestPath.split("?")[0];
95
+
91
96
  // Route WebSocket & create driver
92
97
  let handler: WebSocketHandler;
93
98
  let connDriver: ConnDriver;
94
- if (requestPath === PATH_CONNECT) {
99
+ if (requestPathWithoutQuery === PATH_CONNECT) {
95
100
  const { driver, setWebSocket } = createWebSocketDriver(
96
101
  isHibernatable
97
102
  ? { gatewayId: gatewayId!, requestId: requestId! }
@@ -103,8 +108,8 @@ export async function routeWebSocket(
103
108
  handler = handleWebSocketConnect.bind(undefined, setWebSocket);
104
109
  connDriver = driver;
105
110
  } else if (
106
- requestPath === PATH_WEBSOCKET_BASE ||
107
- requestPath.startsWith(PATH_WEBSOCKET_PREFIX)
111
+ requestPathWithoutQuery === PATH_WEBSOCKET_BASE ||
112
+ requestPathWithoutQuery.startsWith(PATH_WEBSOCKET_PREFIX)
108
113
  ) {
109
114
  const { driver, setWebSocket } = createRawWebSocketDriver(
110
115
  isHibernatable
@@ -114,7 +119,7 @@ export async function routeWebSocket(
114
119
  );
115
120
  handler = handleRawWebSocket.bind(undefined, setWebSocket);
116
121
  connDriver = driver;
117
- } else if (requestPath === PATH_INSPECTOR_CONNECT) {
122
+ } else if (requestPathWithoutQuery === PATH_INSPECTOR_CONNECT) {
118
123
  if (!actor.inspectorToken) {
119
124
  throw "WebSocket Inspector Unauthorized: actor does not provide inspector access";
120
125
  }
@@ -118,6 +118,7 @@ export interface MetadataResponse {
118
118
  version: string;
119
119
  runner?: {
120
120
  kind: MetadataRunnerKind;
121
+ version?: number;
121
122
  };
122
123
  actorNames: ReturnType<typeof buildActorNames>;
123
124
  /**
@@ -153,6 +154,7 @@ export function handleMetadataRequest(
153
154
  version: VERSION,
154
155
  runner: {
155
156
  kind: runnerKind,
157
+ version: config.runner.version,
156
158
  },
157
159
  actorNames: buildActorNames(config),
158
160
  clientEndpoint,
@@ -469,5 +469,45 @@ export function runRawWebSocketTests(driverTestConfig: DriverTestConfig) {
469
469
 
470
470
  ws.close();
471
471
  });
472
+
473
+ test("should handle query parameters on base websocket path (no subpath)", async (c) => {
474
+ const { client } = await setupDriverTest(c, driverTestConfig);
475
+ const actor = client.rawWebSocketActor.getOrCreate([
476
+ "base-path-query-params",
477
+ ]);
478
+
479
+ // Test WebSocket with ONLY query parameters on the base path
480
+ // This tests the case where path is "/websocket?foo=bar" without trailing slash
481
+ const ws = await actor.websocket("?token=secret&session=123");
482
+
483
+ await new Promise<void>((resolve, reject) => {
484
+ ws.addEventListener("open", () => resolve(), { once: true });
485
+ ws.addEventListener("error", reject);
486
+ ws.addEventListener("close", (evt: any) => {
487
+ reject(new Error(`WebSocket closed: code=${evt.code} reason=${evt.reason}`));
488
+ });
489
+ });
490
+
491
+ const requestInfoPromise = new Promise<any>((resolve, reject) => {
492
+ ws.addEventListener("message", (event: any) => {
493
+ const data = JSON.parse(event.data as string);
494
+ if (data.type === "requestInfo") {
495
+ resolve(data);
496
+ }
497
+ });
498
+ ws.addEventListener("close", reject);
499
+ });
500
+
501
+ // Send request to get the request info
502
+ ws.send(JSON.stringify({ type: "getRequestInfo" }));
503
+
504
+ const requestInfo = await requestInfoPromise;
505
+
506
+ // Verify query parameters were preserved even on base websocket path
507
+ expect(requestInfo.url).toContain("token=secret");
508
+ expect(requestInfo.url).toContain("session=123");
509
+
510
+ ws.close();
511
+ });
472
512
  });
473
513
  }
@@ -96,6 +96,37 @@ export async function ensureEngineProcess(
96
96
  stdio: ["inherit", "pipe", "pipe"],
97
97
  env: {
98
98
  ...process.env,
99
+ // Development environment overrides for Rivet Engine.
100
+ //
101
+ // NOTE: When modifying these env vars, also update scripts/run/dev-env.sh
102
+ // to keep them in sync for manual engine runs.
103
+ //
104
+ // In development, runners can be terminated without a graceful
105
+ // shutdown (i.e. SIGKILL instead of SIGTERM). This is treated as a
106
+ // crash by Rivet Engine in production and implements a backoff for
107
+ // rescheduling actors in case of a crash loop.
108
+ //
109
+ // This is problematic in development since this will cause actors
110
+ // to become unresponsive if frequently killing your dev server.
111
+ //
112
+ // We reduce the timeouts for resetting a runner as healthy in
113
+ // order to account for this.
114
+ RIVET__PEGBOARD__RETRY_RESET_DURATION: "100",
115
+ RIVET__PEGBOARD__BASE_RETRY_TIMEOUT: "100",
116
+ // Set max exponent to 1 to have a maximum of base_retry_timeout
117
+ RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT: "1",
118
+ // Reduce thresholds for faster development iteration
119
+ //
120
+ // Default ping interval is 3s, this gives a 2s & 4s grace
121
+ RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD: "5000",
122
+ RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD: "7000",
123
+ // Allow faster metadata polling for hot-reload in development (in milliseconds)
124
+ RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL: "1000",
125
+ // Reduce shutdown durations for faster development iteration (in seconds)
126
+ RIVET__RUNTIME__WORKER_SHUTDOWN_DURATION: "1",
127
+ RIVET__RUNTIME__GUARD_SHUTDOWN_DURATION: "1",
128
+ // Force exit after this duration (must be > worker and guard shutdown durations)
129
+ RIVET__RUNTIME__FORCE_SHUTDOWN_DURATION: "2",
99
130
  },
100
131
  });
101
132
 
@@ -107,7 +138,12 @@ export async function ensureEngineProcess(
107
138
  if (child.stdout) {
108
139
  child.stdout.pipe(stdoutStream);
109
140
  }
141
+ // Collect stderr for error detection
142
+ const stderrChunks: Buffer[] = [];
110
143
  if (child.stderr) {
144
+ child.stderr.on("data", (chunk: Buffer) => {
145
+ stderrChunks.push(chunk);
146
+ });
111
147
  child.stderr.pipe(stderrStream);
112
148
  }
113
149
  logger().debug({
@@ -117,13 +153,39 @@ export async function ensureEngineProcess(
117
153
  });
118
154
 
119
155
  child.once("exit", (code, signal) => {
120
- logger().warn({
121
- msg: "engine process exited, please report this error",
122
- code,
123
- signal,
124
- issues: "https://github.com/rivet-dev/rivetkit/issues",
125
- support: "https://rivet.dev/discord",
126
- });
156
+ const stderrOutput = Buffer.concat(stderrChunks).toString("utf-8");
157
+
158
+ // Check for specific error conditions
159
+ if (stderrOutput.includes("LOCK: Resource temporarily unavailable")) {
160
+ logger().error({
161
+ msg: "another instance of rivet engine is unexpectedly running, this is an internal error",
162
+ code,
163
+ signal,
164
+ stdoutLog: stdoutLogPath,
165
+ stderrLog: stderrLogPath,
166
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
167
+ support: "https://rivet.dev/discord",
168
+ });
169
+ } else if (stderrOutput.includes("Rivet Engine has been rolled back to a previous version")) {
170
+ logger().error({
171
+ msg: "rivet engine version downgrade detected",
172
+ hint: `You attempted to downgrade the RivetKit version in development. To fix this, nuke the database by running: '${binaryPath}' database nuke --yes`,
173
+ code,
174
+ signal,
175
+ stdoutLog: stdoutLogPath,
176
+ stderrLog: stderrLogPath,
177
+ });
178
+ } else {
179
+ logger().warn({
180
+ msg: "engine process exited, please report this error",
181
+ code,
182
+ signal,
183
+ stdoutLog: stdoutLogPath,
184
+ stderrLog: stderrLogPath,
185
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
186
+ support: "https://rivet.dev/discord",
187
+ });
188
+ }
127
189
  // Clean up log streams
128
190
  stdoutStream.end();
129
191
  stderrStream.end();
@@ -126,6 +126,12 @@ export const RegistryConfigSchema = z
126
126
  * What port to run the manager on.
127
127
  */
128
128
  managerPort: z.number().optional().default(6420),
129
+ /**
130
+ * @experimental
131
+ *
132
+ * What host to bind the manager server to.
133
+ */
134
+ managerHost: z.string().optional(),
129
135
 
130
136
  /** @experimental */
131
137
  inspector: InspectorConfigSchema,
@@ -289,6 +295,7 @@ export const DocConfigureRunnerPoolSchema = z
289
295
  runnersMargin: z.number().optional().describe("Buffer margin for scaling runners."),
290
296
  slotsPerRunner: z.number().optional().describe("Number of actor slots per runner."),
291
297
  metadata: z.record(z.string(), z.unknown()).optional().describe("Additional metadata to pass to the serverless platform."),
298
+ metadataPollInterval: z.number().optional().describe("Interval in milliseconds between metadata polls from the engine. Defaults to 10000 milliseconds (10 seconds)."),
292
299
  })
293
300
  .optional();
294
301
 
@@ -18,6 +18,8 @@ export const ConfigureRunnerPoolSchema = z
18
18
  runnersMargin: z.number().optional(),
19
19
  slotsPerRunner: z.number().optional(),
20
20
  metadata: z.record(z.string(), z.unknown()).optional(),
21
+ metadataPollInterval: z.number().optional(),
22
+ drainOnVersionUpgrade: z.boolean().optional(),
21
23
  })
22
24
  .optional();
23
25
 
@@ -96,8 +96,9 @@ async function serveNode(
96
96
 
97
97
  // Start server
98
98
  const port = managerPort;
99
- const server = serve({ fetch: app.fetch, port }, () =>
100
- logger().info({ msg: "server listening", port }),
99
+ const hostname = config.managerHost;
100
+ const server = serve({ fetch: app.fetch, port, hostname }, () =>
101
+ logger().info({ msg: "server listening", port, hostname }),
101
102
  );
102
103
  injectWebSocket(server);
103
104
 
@@ -127,10 +128,11 @@ async function serveDeno(
127
128
  }
128
129
 
129
130
  const port = config.managerPort;
131
+ const hostname = config.managerHost;
130
132
 
131
133
  // Use Deno.serve
132
- Deno.serve({ port }, app.fetch);
133
- logger().info({ msg: "server listening", port });
134
+ Deno.serve({ port, hostname }, app.fetch);
135
+ logger().info({ msg: "server listening", port, hostname });
134
136
 
135
137
  return { upgradeWebSocket };
136
138
  }
@@ -160,15 +162,17 @@ async function serveBun(
160
162
  const { websocket, upgradeWebSocket } = createBunWebSocket();
161
163
 
162
164
  const port = config.managerPort;
165
+ const hostname = config.managerHost;
163
166
 
164
167
  // Use Bun.serve
165
168
  // @ts-expect-error - Bun global
166
169
  Bun.serve({
167
170
  fetch: app.fetch,
168
171
  port,
172
+ hostname,
169
173
  websocket,
170
174
  });
171
- logger().info({ msg: "server listening", port });
175
+ logger().info({ msg: "server listening", port, hostname });
172
176
 
173
177
  return { upgradeWebSocket };
174
178
  }
@@ -120,7 +120,9 @@ export interface RegistryConfigRequest {
120
120
  request_lifespan: number;
121
121
  runners_margin: number;
122
122
  slots_per_runner: number;
123
+ metadata_poll_interval?: number;
123
124
  };
125
+ metadata?: Record<string, unknown>;
124
126
  }
125
127
  >;
126
128
  }
@@ -54,8 +54,11 @@ export async function configureServerlessRunner(
54
54
  request_lifespan: customConfig.requestLifespan ?? 15 * 60,
55
55
  runners_margin: customConfig.runnersMargin ?? 0,
56
56
  slots_per_runner: customConfig.slotsPerRunner ?? 1,
57
+ metadata_poll_interval: customConfig.metadataPollInterval ?? 1000,
57
58
  },
58
59
  metadata: customConfig.metadata ?? {},
60
+ drain_on_version_upgrade: customConfig.drainOnVersionUpgrade ?? true,
61
+ metadataPollInterval: customConfig.metadataPollInterval ?? 1000,
59
62
  };
60
63
  await updateRunnerConfig(clientConfig, runnerName, {
61
64
  datacenters: Object.fromEntries(