rivetkit 2.0.6 → 2.0.7

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 (170) hide show
  1. package/dist/schemas/actor-persist/v1.ts +0 -6
  2. package/dist/tsup/actor-router-consts-B3Lu87yJ.d.cts +28 -0
  3. package/dist/tsup/actor-router-consts-B3Lu87yJ.d.ts +28 -0
  4. package/dist/tsup/{chunk-7OUKNSTU.js → chunk-2NL3KGJ7.js} +17 -14
  5. package/dist/tsup/chunk-2NL3KGJ7.js.map +1 -0
  6. package/dist/tsup/{chunk-6P6RA47N.cjs → chunk-3ALZ7EGX.cjs} +14 -10
  7. package/dist/tsup/chunk-3ALZ7EGX.cjs.map +1 -0
  8. package/dist/tsup/chunk-4EXJ4ITR.cjs +102 -0
  9. package/dist/tsup/chunk-4EXJ4ITR.cjs.map +1 -0
  10. package/dist/tsup/{chunk-ZYLTS2EM.js → chunk-54MAHBLL.js} +2 -2
  11. package/dist/tsup/{chunk-NTCUGYSD.cjs → chunk-7OOBMCQI.cjs} +34 -31
  12. package/dist/tsup/chunk-7OOBMCQI.cjs.map +1 -0
  13. package/dist/tsup/{chunk-VCEHU56K.js → chunk-B6N6VM37.js} +2 -2
  14. package/dist/tsup/{chunk-VPV4MWXR.js → chunk-DIHKN7NM.js} +3 -3
  15. package/dist/tsup/{chunk-MRRT2CZD.cjs → chunk-ETDWYT2P.cjs} +7 -7
  16. package/dist/tsup/{chunk-MRRT2CZD.cjs.map → chunk-ETDWYT2P.cjs.map} +1 -1
  17. package/dist/tsup/{chunk-TWGATZ3X.cjs → chunk-F7YL5G7Q.cjs} +922 -872
  18. package/dist/tsup/chunk-F7YL5G7Q.cjs.map +1 -0
  19. package/dist/tsup/{chunk-UTI5NCES.cjs → chunk-GWJTWY3G.cjs} +6 -6
  20. package/dist/tsup/{chunk-UTI5NCES.cjs.map → chunk-GWJTWY3G.cjs.map} +1 -1
  21. package/dist/tsup/{chunk-W6LN7AF5.js → chunk-KHRZPP5T.js} +866 -816
  22. package/dist/tsup/chunk-KHRZPP5T.js.map +1 -0
  23. package/dist/tsup/{chunk-5JBFVV4C.cjs → chunk-LXAVET4A.cjs} +21 -7
  24. package/dist/tsup/chunk-LXAVET4A.cjs.map +1 -0
  25. package/dist/tsup/{chunk-TCUI5JFE.cjs → chunk-NDCVQZBS.cjs} +45 -18
  26. package/dist/tsup/chunk-NDCVQZBS.cjs.map +1 -0
  27. package/dist/tsup/{chunk-4CKHQRXG.js → chunk-NII4KKHD.js} +515 -240
  28. package/dist/tsup/chunk-NII4KKHD.js.map +1 -0
  29. package/dist/tsup/{chunk-2K3JMDAN.js → chunk-NRELKXIX.js} +40 -13
  30. package/dist/tsup/chunk-NRELKXIX.js.map +1 -0
  31. package/dist/tsup/{chunk-UFWAK3X2.cjs → chunk-NUA6LOOJ.cjs} +660 -385
  32. package/dist/tsup/chunk-NUA6LOOJ.cjs.map +1 -0
  33. package/dist/tsup/{chunk-DIAYNQTE.cjs → chunk-OSK2VSJF.cjs} +12 -12
  34. package/dist/tsup/{chunk-DIAYNQTE.cjs.map → chunk-OSK2VSJF.cjs.map} +1 -1
  35. package/dist/tsup/chunk-PD6HCAJE.js +102 -0
  36. package/dist/tsup/chunk-PD6HCAJE.js.map +1 -0
  37. package/dist/tsup/{chunk-RGQR2J7S.js → chunk-RLBM6D4L.js} +20 -6
  38. package/dist/tsup/chunk-RLBM6D4L.js.map +1 -0
  39. package/dist/tsup/{chunk-KG3C7MKR.cjs → chunk-VAF63BEI.cjs} +3 -3
  40. package/dist/tsup/{chunk-KG3C7MKR.cjs.map → chunk-VAF63BEI.cjs.map} +1 -1
  41. package/dist/tsup/{chunk-G75SVQON.js → chunk-WAT5AE7S.js} +9 -5
  42. package/dist/tsup/chunk-WAT5AE7S.js.map +1 -0
  43. package/dist/tsup/{chunk-WC2PSJWN.js → chunk-YL4VZMMT.js} +2 -2
  44. package/dist/tsup/client/mod.cjs +9 -9
  45. package/dist/tsup/client/mod.d.cts +7 -8
  46. package/dist/tsup/client/mod.d.ts +7 -8
  47. package/dist/tsup/client/mod.js +8 -8
  48. package/dist/tsup/common/log.cjs +3 -3
  49. package/dist/tsup/common/log.js +2 -2
  50. package/dist/tsup/common/websocket.cjs +4 -4
  51. package/dist/tsup/common/websocket.js +3 -3
  52. package/dist/tsup/{connection-BLemxi4f.d.ts → conn-DCSQgIlw.d.ts} +1605 -1353
  53. package/dist/tsup/{connection-CpDIydXf.d.cts → conn-DdzHTm2E.d.cts} +1605 -1353
  54. package/dist/tsup/driver-helpers/mod.cjs +31 -5
  55. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  56. package/dist/tsup/driver-helpers/mod.d.cts +7 -8
  57. package/dist/tsup/driver-helpers/mod.d.ts +7 -8
  58. package/dist/tsup/driver-helpers/mod.js +33 -7
  59. package/dist/tsup/driver-test-suite/mod.cjs +317 -222
  60. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  61. package/dist/tsup/driver-test-suite/mod.d.cts +7 -7
  62. package/dist/tsup/driver-test-suite/mod.d.ts +7 -7
  63. package/dist/tsup/driver-test-suite/mod.js +582 -487
  64. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  65. package/dist/tsup/inspector/mod.cjs +16 -6
  66. package/dist/tsup/inspector/mod.cjs.map +1 -1
  67. package/dist/tsup/inspector/mod.d.cts +34 -7
  68. package/dist/tsup/inspector/mod.d.ts +34 -7
  69. package/dist/tsup/inspector/mod.js +17 -7
  70. package/dist/tsup/mod.cjs +10 -20
  71. package/dist/tsup/mod.cjs.map +1 -1
  72. package/dist/tsup/mod.d.cts +9 -7
  73. package/dist/tsup/mod.d.ts +9 -7
  74. package/dist/tsup/mod.js +9 -19
  75. package/dist/tsup/test/mod.cjs +11 -11
  76. package/dist/tsup/test/mod.d.cts +6 -7
  77. package/dist/tsup/test/mod.d.ts +6 -7
  78. package/dist/tsup/test/mod.js +10 -10
  79. package/dist/tsup/utils.cjs +4 -2
  80. package/dist/tsup/utils.cjs.map +1 -1
  81. package/dist/tsup/utils.d.cts +11 -1
  82. package/dist/tsup/utils.d.ts +11 -1
  83. package/dist/tsup/utils.js +3 -1
  84. package/package.json +8 -4
  85. package/src/actor/action.ts +1 -1
  86. package/src/actor/config.ts +1 -1
  87. package/src/actor/conn-drivers.ts +205 -0
  88. package/src/actor/conn-socket.ts +6 -0
  89. package/src/actor/{connection.ts → conn.ts} +78 -84
  90. package/src/actor/context.ts +1 -1
  91. package/src/actor/driver.ts +4 -43
  92. package/src/actor/instance.ts +162 -86
  93. package/src/actor/mod.ts +1 -11
  94. package/src/actor/persisted.ts +2 -5
  95. package/src/actor/protocol/old.ts +1 -1
  96. package/src/actor/router-endpoints.ts +142 -106
  97. package/src/actor/router.ts +81 -45
  98. package/src/actor/utils.ts +5 -1
  99. package/src/client/actor-conn.ts +154 -23
  100. package/src/client/client.ts +1 -1
  101. package/src/client/config.ts +7 -0
  102. package/src/common/actor-router-consts.ts +29 -8
  103. package/src/common/router.ts +2 -1
  104. package/src/common/versioned-data.ts +5 -5
  105. package/src/driver-helpers/mod.ts +14 -1
  106. package/src/driver-test-suite/mod.ts +11 -2
  107. package/src/driver-test-suite/test-inline-client-driver.ts +36 -18
  108. package/src/driver-test-suite/tests/actor-conn-state.ts +66 -22
  109. package/src/driver-test-suite/tests/actor-conn.ts +65 -126
  110. package/src/driver-test-suite/tests/actor-reconnect.ts +160 -0
  111. package/src/driver-test-suite/tests/actor-sleep.ts +0 -1
  112. package/src/driver-test-suite/tests/raw-websocket.ts +0 -35
  113. package/src/driver-test-suite/utils.ts +3 -3
  114. package/src/drivers/default.ts +8 -7
  115. package/src/drivers/engine/actor-driver.ts +53 -31
  116. package/src/drivers/engine/config.ts +4 -0
  117. package/src/drivers/file-system/actor.ts +0 -6
  118. package/src/drivers/file-system/global-state.ts +3 -14
  119. package/src/drivers/file-system/manager.ts +12 -8
  120. package/src/inspector/actor.ts +4 -3
  121. package/src/inspector/config.ts +10 -1
  122. package/src/inspector/mod.ts +1 -0
  123. package/src/inspector/utils.ts +23 -4
  124. package/src/manager/driver.ts +11 -1
  125. package/src/manager/gateway.ts +407 -0
  126. package/src/manager/router.ts +269 -468
  127. package/src/manager-api/actors.ts +61 -0
  128. package/src/manager-api/common.ts +4 -0
  129. package/src/mod.ts +1 -1
  130. package/src/registry/mod.ts +119 -10
  131. package/src/remote-manager-driver/actor-http-client.ts +30 -19
  132. package/src/remote-manager-driver/actor-websocket-client.ts +43 -16
  133. package/src/remote-manager-driver/api-endpoints.ts +19 -21
  134. package/src/remote-manager-driver/api-utils.ts +10 -1
  135. package/src/remote-manager-driver/mod.ts +51 -48
  136. package/src/remote-manager-driver/ws-proxy.ts +2 -9
  137. package/src/test/mod.ts +6 -2
  138. package/src/utils.ts +21 -2
  139. package/dist/tsup/actor-router-consts-BK6arfy8.d.cts +0 -17
  140. package/dist/tsup/actor-router-consts-BK6arfy8.d.ts +0 -17
  141. package/dist/tsup/chunk-2K3JMDAN.js.map +0 -1
  142. package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
  143. package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
  144. package/dist/tsup/chunk-4CKHQRXG.js.map +0 -1
  145. package/dist/tsup/chunk-5JBFVV4C.cjs.map +0 -1
  146. package/dist/tsup/chunk-6P6RA47N.cjs.map +0 -1
  147. package/dist/tsup/chunk-7OUKNSTU.js.map +0 -1
  148. package/dist/tsup/chunk-G75SVQON.js.map +0 -1
  149. package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
  150. package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
  151. package/dist/tsup/chunk-NTCUGYSD.cjs.map +0 -1
  152. package/dist/tsup/chunk-RGQR2J7S.js.map +0 -1
  153. package/dist/tsup/chunk-TCUI5JFE.cjs.map +0 -1
  154. package/dist/tsup/chunk-TWGATZ3X.cjs.map +0 -1
  155. package/dist/tsup/chunk-UFWAK3X2.cjs.map +0 -1
  156. package/dist/tsup/chunk-W6LN7AF5.js.map +0 -1
  157. package/dist/tsup/common-CXCe7s6i.d.cts +0 -218
  158. package/dist/tsup/common-CXCe7s6i.d.ts +0 -218
  159. package/src/actor/generic-conn-driver.ts +0 -246
  160. package/src/common/fake-event-source.ts +0 -267
  161. package/src/manager-api/routes/actors-create.ts +0 -16
  162. package/src/manager-api/routes/actors-delete.ts +0 -4
  163. package/src/manager-api/routes/actors-get-by-id.ts +0 -7
  164. package/src/manager-api/routes/actors-get-or-create-by-id.ts +0 -29
  165. package/src/manager-api/routes/actors-get.ts +0 -7
  166. package/src/manager-api/routes/common.ts +0 -18
  167. /package/dist/tsup/{chunk-ZYLTS2EM.js.map → chunk-54MAHBLL.js.map} +0 -0
  168. /package/dist/tsup/{chunk-VCEHU56K.js.map → chunk-B6N6VM37.js.map} +0 -0
  169. /package/dist/tsup/{chunk-VPV4MWXR.js.map → chunk-DIHKN7NM.js.map} +0 -0
  170. /package/dist/tsup/{chunk-WC2PSJWN.js.map → chunk-YL4VZMMT.js.map} +0 -0
@@ -4,13 +4,11 @@ import type {
4
4
  } from "@rivetkit/engine-runner";
5
5
  import { Runner } from "@rivetkit/engine-runner";
6
6
  import * as cbor from "cbor-x";
7
+ import type { Context as HonoContext } from "hono";
8
+ import { streamSSE } from "hono/streaming";
7
9
  import { WSContext } from "hono/ws";
8
10
  import invariant from "invariant";
9
11
  import { lookupInRegistry } from "@/actor/definition";
10
- import {
11
- createGenericConnDrivers,
12
- GenericConnGlobalState,
13
- } from "@/actor/generic-conn-driver";
14
12
  import { deserializeActorKey } from "@/actor/keys";
15
13
  import { EncodingSchema } from "@/actor/protocol/serde";
16
14
  import { type ActorRouter, createActorRouter } from "@/actor/router";
@@ -22,6 +20,9 @@ import type { Client } from "@/client/client";
22
20
  import {
23
21
  PATH_CONNECT_WEBSOCKET,
24
22
  PATH_RAW_WEBSOCKET_PREFIX,
23
+ WS_PROTOCOL_CONN_PARAMS,
24
+ WS_PROTOCOL_ENCODING,
25
+ WS_PROTOCOL_TOKEN,
25
26
  } from "@/common/actor-router-consts";
26
27
  import type { UpgradeWebSocketArgs } from "@/common/inline-websocket-adapter2";
27
28
  import { getLogger } from "@/common/log";
@@ -29,22 +30,19 @@ import type { UniversalWebSocket } from "@/common/websocket-interface";
29
30
  import {
30
31
  type ActorDriver,
31
32
  type AnyActorInstance,
32
- HEADER_AUTH_DATA,
33
- HEADER_CONN_PARAMS,
34
- HEADER_ENCODING,
35
33
  type ManagerDriver,
36
34
  serializeEmptyPersistData,
37
35
  } from "@/driver-helpers/mod";
38
36
  import type { RegistryConfig } from "@/registry/config";
39
37
  import type { RunConfig } from "@/registry/run-config";
38
+ import { promiseWithResolvers } from "@/utils";
40
39
  import type { Config } from "./config";
41
40
  import { KEYS } from "./kv";
42
41
  import { logger } from "./log";
43
42
 
44
43
  interface ActorHandler {
45
44
  actor?: AnyActorInstance;
46
- actorStartPromise?: PromiseWithResolvers<void>;
47
- genericConnGlobalState: GenericConnGlobalState;
45
+ actorStartPromise?: ReturnType<typeof promiseWithResolvers<void>>;
48
46
  persistedData?: Uint8Array;
49
47
  }
50
48
 
@@ -61,6 +59,9 @@ export class EngineActorDriver implements ActorDriver {
61
59
  #actorRouter: ActorRouter;
62
60
  #version: number = 1; // Version for the runner protocol
63
61
 
62
+ #runnerStarted: PromiseWithResolvers<undefined> = Promise.withResolvers();
63
+ #runnerStopped: PromiseWithResolvers<undefined> = Promise.withResolvers();
64
+
64
65
  constructor(
65
66
  registryConfig: RegistryConfig,
66
67
  runConfig: RunConfig,
@@ -80,6 +81,7 @@ export class EngineActorDriver implements ActorDriver {
80
81
  const runnerConfig: RunnerConfig = {
81
82
  version: this.#version,
82
83
  endpoint: config.endpoint,
84
+ token: config.token,
83
85
  pegboardEndpoint: config.pegboardEndpoint,
84
86
  namespace: config.namespace,
85
87
  totalSlots: config.totalSlots,
@@ -108,6 +110,8 @@ export class EngineActorDriver implements ActorDriver {
108
110
  runnerName: this.#config.runnerName,
109
111
  });
110
112
  }
113
+
114
+ this.#runnerStarted.resolve(undefined);
111
115
  },
112
116
  onDisconnected: () => {
113
117
  logger().warn({
@@ -117,7 +121,9 @@ export class EngineActorDriver implements ActorDriver {
117
121
  });
118
122
  hasDisconnected = true;
119
123
  },
120
- onShutdown: () => {},
124
+ onShutdown: () => {
125
+ this.#runnerStopped.resolve(undefined);
126
+ },
121
127
  fetch: this.#runnerFetch.bind(this),
122
128
  websocket: this.#runnerWebSocket.bind(this),
123
129
  onActorStart: this.#runnerOnActorStart.bind(this),
@@ -151,14 +157,6 @@ export class EngineActorDriver implements ActorDriver {
151
157
  return handler.actor;
152
158
  }
153
159
 
154
- getGenericConnGlobalState(actorId: string): GenericConnGlobalState {
155
- const handler = this.#actors.get(actorId);
156
- if (!handler) {
157
- throw new Error(`Actor ${actorId} not loaded`);
158
- }
159
- return handler.genericConnGlobalState;
160
- }
161
-
162
160
  getContext(actorId: string): DriverContext {
163
161
  return {};
164
162
  }
@@ -221,8 +219,7 @@ export class EngineActorDriver implements ActorDriver {
221
219
  let handler = this.#actors.get(actorId);
222
220
  if (!handler) {
223
221
  handler = {
224
- genericConnGlobalState: new GenericConnGlobalState(),
225
- actorStartPromise: Promise.withResolvers(),
222
+ actorStartPromise: promiseWithResolvers(),
226
223
  persistedData: serializeEmptyPersistData(input),
227
224
  };
228
225
  this.#actors.set(actorId, handler);
@@ -240,11 +237,7 @@ export class EngineActorDriver implements ActorDriver {
240
237
  handler.actor = definition.instantiate();
241
238
 
242
239
  // Start actor
243
- const connDrivers = createGenericConnDrivers(
244
- handler.genericConnGlobalState,
245
- );
246
240
  await handler.actor.start(
247
- connDrivers,
248
241
  this,
249
242
  this.#inlineClient,
250
243
  actorId,
@@ -293,14 +286,29 @@ export class EngineActorDriver implements ActorDriver {
293
286
 
294
287
  const url = new URL(request.url);
295
288
 
296
- // Parse headers
297
- const encodingRaw = request.headers.get(HEADER_ENCODING);
298
- const connParamsRaw = request.headers.get(HEADER_CONN_PARAMS);
299
- const authDataRaw = request.headers.get(HEADER_AUTH_DATA);
289
+ // Parse configuration from Sec-WebSocket-Protocol header
290
+ const protocols = request.headers.get("sec-websocket-protocol");
291
+ if (protocols === null)
292
+ throw new Error(`Missing sec-websocket-protocol header`);
293
+
294
+ let encodingRaw: string | undefined;
295
+ let connParamsRaw: string | undefined;
296
+
297
+ if (protocols) {
298
+ const protocolList = protocols.split(",").map((p) => p.trim());
299
+ for (const protocol of protocolList) {
300
+ if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {
301
+ encodingRaw = protocol.substring(WS_PROTOCOL_ENCODING.length);
302
+ } else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {
303
+ connParamsRaw = decodeURIComponent(
304
+ protocol.substring(WS_PROTOCOL_CONN_PARAMS.length),
305
+ );
306
+ }
307
+ }
308
+ }
300
309
 
301
310
  const encoding = EncodingSchema.parse(encodingRaw);
302
311
  const connParams = connParamsRaw ? JSON.parse(connParamsRaw) : undefined;
303
- const authData = authDataRaw ? JSON.parse(authDataRaw) : undefined;
304
312
 
305
313
  // Fetch WS handler
306
314
  //
@@ -314,7 +322,9 @@ export class EngineActorDriver implements ActorDriver {
314
322
  actorId,
315
323
  encoding,
316
324
  connParams,
317
- authData,
325
+ // Extract connId and connToken from protocols if needed
326
+ undefined,
327
+ undefined,
318
328
  );
319
329
  } else if (url.pathname.startsWith(PATH_RAW_WEBSOCKET_PREFIX)) {
320
330
  wsHandlerPromise = handleRawWebSocketHandler(
@@ -322,7 +332,6 @@ export class EngineActorDriver implements ActorDriver {
322
332
  url.pathname + url.search,
323
333
  this,
324
334
  actorId,
325
- authData,
326
335
  );
327
336
  } else {
328
337
  throw new Error(`Unreachable path: ${url.pathname}`);
@@ -367,4 +376,17 @@ export class EngineActorDriver implements ActorDriver {
367
376
  logger().info({ msg: "stopping engine actor driver" });
368
377
  await this.#runner.shutdown(immediate);
369
378
  }
379
+
380
+ async serverlessHandleStart(c: HonoContext): Promise<Response> {
381
+ await this.#runnerStarted.promise;
382
+
383
+ return streamSSE(c, async (stream) => {
384
+ // Runner id should be set if the runner started
385
+ const runnerId = this.#runner.runnerId;
386
+ invariant(runnerId, "runnerId not set");
387
+ stream.writeSSE({ data: runnerId });
388
+
389
+ return this.#runnerStopped.promise;
390
+ });
391
+ }
370
392
  }
@@ -10,6 +10,10 @@ export const ConfigSchema = z
10
10
  .default(
11
11
  () => getEnvUniversal("RIVET_ENGINE") ?? "http://localhost:6420",
12
12
  ),
13
+ token: z
14
+ .string()
15
+ .optional()
16
+ .transform((val) => val ?? getEnvUniversal("RIVET_TOKEN")),
13
17
  pegboardEndpoint: z.string().optional(),
14
18
  namespace: z
15
19
  .string()
@@ -1,5 +1,3 @@
1
- import type { GenericConnGlobalState } from "@/actor/generic-conn-driver";
2
- import { loggerWithoutContext } from "@/actor/log";
3
1
  import type { AnyClient } from "@/client/client";
4
2
  import type {
5
3
  ActorDriver,
@@ -46,10 +44,6 @@ export class FileSystemActorDriver implements ActorDriver {
46
44
  );
47
45
  }
48
46
 
49
- getGenericConnGlobalState(actorId: string): GenericConnGlobalState {
50
- return this.#state.getActorOrError(actorId).genericConnGlobalState;
51
- }
52
-
53
47
  /**
54
48
  * Get the current storage directory path
55
49
  */
@@ -5,10 +5,6 @@ import * as path from "node:path";
5
5
  import invariant from "invariant";
6
6
  import { lookupInRegistry } from "@/actor/definition";
7
7
  import { ActorAlreadyExists } from "@/actor/errors";
8
- import {
9
- createGenericConnDrivers,
10
- GenericConnGlobalState,
11
- } from "@/actor/generic-conn-driver";
12
8
  import type { AnyActorInstance } from "@/actor/instance";
13
9
  import type { ActorKey } from "@/actor/mod";
14
10
  import { generateRandomString } from "@/actor/utils";
@@ -27,7 +23,7 @@ import {
27
23
  import {
28
24
  bufferToArrayBuffer,
29
25
  type LongTimeoutHandle,
30
- SinglePromiseQueue,
26
+ promiseWithResolvers,
31
27
  setLongTimeout,
32
28
  stringifyError,
33
29
  } from "@/utils";
@@ -49,9 +45,7 @@ interface ActorEntry {
49
45
 
50
46
  actor?: AnyActorInstance;
51
47
  /** Promise for starting the actor. */
52
- startPromise?: PromiseWithResolvers<void>;
53
-
54
- genericConnGlobalState: GenericConnGlobalState;
48
+ startPromise?: ReturnType<typeof promiseWithResolvers<void>>;
55
49
 
56
50
  alarmTimeout?: LongTimeoutHandle;
57
51
  /** The timestamp currently scheduled for this actor's alarm (ms since epoch). */
@@ -188,7 +182,6 @@ export class FileSystemGlobalState {
188
182
 
189
183
  entry = {
190
184
  id: actorId,
191
- genericConnGlobalState: new GenericConnGlobalState(),
192
185
  removed: false,
193
186
  };
194
187
  this.#actors.set(actorId, entry);
@@ -469,7 +462,7 @@ export class FileSystemGlobalState {
469
462
  }
470
463
 
471
464
  // Create start promise
472
- entry.startPromise = Promise.withResolvers();
465
+ entry.startPromise = promiseWithResolvers();
473
466
 
474
467
  try {
475
468
  // Create actor
@@ -477,11 +470,7 @@ export class FileSystemGlobalState {
477
470
  entry.actor = definition.instantiate();
478
471
 
479
472
  // Start actor
480
- const connDrivers = createGenericConnDrivers(
481
- entry.genericConnGlobalState,
482
- );
483
473
  await entry.actor.start(
484
- connDrivers,
485
474
  actorDriver,
486
475
  inlineClient,
487
476
  actorId,
@@ -57,10 +57,6 @@ export class FileSystemManagerDriver implements ManagerDriver {
57
57
  this.#driverConfig = driverConfig;
58
58
 
59
59
  if (runConfig.inspector.enabled) {
60
- if (!this.#runConfig.inspector.token()) {
61
- this.#runConfig.inspector.token = () =>
62
- this.#state.getOrCreateInspectorAccessToken();
63
- }
64
60
  const startedAt = new Date().toISOString();
65
61
  function transformActor(actorState: schema.ActorState): Actor {
66
62
  return {
@@ -141,6 +137,8 @@ export class FileSystemManagerDriver implements ManagerDriver {
141
137
  actorId: string,
142
138
  encoding: Encoding,
143
139
  params: unknown,
140
+ connId?: string,
141
+ connToken?: string,
144
142
  ): Promise<UniversalWebSocket> {
145
143
  // Handle raw WebSocket paths
146
144
  const pathOnly = path.split("?")[0];
@@ -154,7 +152,8 @@ export class FileSystemManagerDriver implements ManagerDriver {
154
152
  actorId,
155
153
  encoding,
156
154
  params,
157
- undefined,
155
+ connId,
156
+ connToken,
158
157
  );
159
158
  return new InlineWebSocketAdapter2(wsHandler);
160
159
  } else if (
@@ -168,7 +167,6 @@ export class FileSystemManagerDriver implements ManagerDriver {
168
167
  path,
169
168
  this.#actorDriver,
170
169
  actorId,
171
- undefined,
172
170
  );
173
171
  return new InlineWebSocketAdapter2(wsHandler);
174
172
  } else {
@@ -192,6 +190,8 @@ export class FileSystemManagerDriver implements ManagerDriver {
192
190
  actorId: string,
193
191
  encoding: Encoding,
194
192
  connParams: unknown,
193
+ connId?: string,
194
+ connToken?: string,
195
195
  ): Promise<Response> {
196
196
  const upgradeWebSocket = this.#runConfig.getUpgradeWebSocket?.();
197
197
  invariant(upgradeWebSocket, "missing getUpgradeWebSocket");
@@ -208,7 +208,8 @@ export class FileSystemManagerDriver implements ManagerDriver {
208
208
  actorId,
209
209
  encoding,
210
210
  connParams,
211
- undefined,
211
+ connId,
212
+ connToken,
212
213
  );
213
214
  return upgradeWebSocket(() => wsHandler)(c, noopNext());
214
215
  } else if (
@@ -222,7 +223,6 @@ export class FileSystemManagerDriver implements ManagerDriver {
222
223
  path,
223
224
  this.#actorDriver,
224
225
  actorId,
225
- undefined,
226
226
  );
227
227
  return upgradeWebSocket(() => wsHandler)(c, noopNext());
228
228
  } else {
@@ -321,4 +321,8 @@ export class FileSystemManagerDriver implements ManagerDriver {
321
321
  data: this.#state.storagePath,
322
322
  };
323
323
  }
324
+
325
+ getOrCreateInspectorAccessToken() {
326
+ return this.#state.getOrCreateInspectorAccessToken();
327
+ }
324
328
  }
@@ -8,6 +8,7 @@ import type {
8
8
  AnyDatabaseProvider,
9
9
  InferDatabaseClient,
10
10
  } from "@/actor/database";
11
+ import { promiseWithResolvers } from "@/utils";
11
12
  import {
12
13
  ColumnsSchema,
13
14
  type Connection,
@@ -99,7 +100,7 @@ export function createActorInspectorRouter() {
99
100
  });
100
101
  });
101
102
 
102
- const { promise } = Promise.withResolvers<void>();
103
+ const { promise } = promiseWithResolvers<void>();
103
104
 
104
105
  return promise;
105
106
  },
@@ -128,7 +129,7 @@ export function createActorInspectorRouter() {
128
129
  });
129
130
  });
130
131
 
131
- const { promise } = Promise.withResolvers<void>();
132
+ const { promise } = promiseWithResolvers<void>();
132
133
 
133
134
  return promise;
134
135
  },
@@ -159,7 +160,7 @@ export function createActorInspectorRouter() {
159
160
  });
160
161
  });
161
162
 
162
- const { promise } = Promise.withResolvers<void>();
163
+ const { promise } = promiseWithResolvers<void>();
163
164
 
164
165
  return promise;
165
166
  },
@@ -56,7 +56,16 @@ const defaultCors: CorsOptions = {
56
56
 
57
57
  export const InspectorConfigSchema = z
58
58
  .object({
59
- enabled: z.boolean().optional().default(defaultEnabled),
59
+ enabled: z
60
+ .boolean()
61
+ .or(
62
+ z.object({
63
+ actor: z.boolean().optional().default(true),
64
+ manager: z.boolean().optional().default(true),
65
+ }),
66
+ )
67
+ .optional()
68
+ .default(defaultEnabled),
60
69
  /** CORS configuration for the router. Uses Hono's CORS middleware options. */
61
70
  cors: z
62
71
  .custom<CorsOptions>()
@@ -1,2 +1,3 @@
1
1
  export * from "./protocol/common";
2
2
  export * from "./protocol/mod";
3
+ export * from "./utils";
@@ -1,5 +1,6 @@
1
1
  import crypto from "node:crypto";
2
2
  import { createMiddleware } from "hono/factory";
3
+ import type { ManagerDriver } from "@/driver-helpers/mod";
3
4
  import type { RunConfig } from "@/mod";
4
5
  import type { RunConfigInput } from "@/registry/run-config";
5
6
  import { inspectorLogger } from "./log";
@@ -28,10 +29,6 @@ export function compareSecrets(providedSecret: string, validSecret: string) {
28
29
 
29
30
  export const secureInspector = (runConfig: RunConfig) =>
30
31
  createMiddleware(async (c, next) => {
31
- if (!runConfig.inspector.enabled) {
32
- return c.text("Inspector is not enabled", 503);
33
- }
34
-
35
32
  const userToken = c.req.header("Authorization")?.replace("Bearer ", "");
36
33
  if (!userToken) {
37
34
  return c.text("Unauthorized", 401);
@@ -74,3 +71,25 @@ export function getInspectorUrl(runConfig: RunConfigInput | undefined) {
74
71
 
75
72
  return url.href;
76
73
  }
74
+
75
+ export const isInspectorEnabled = (
76
+ runConfig: RunConfig,
77
+ context: "actor" | "manager",
78
+ ) => {
79
+ if (typeof runConfig.inspector?.enabled === "boolean") {
80
+ return runConfig.inspector.enabled;
81
+ } else if (typeof runConfig.inspector?.enabled === "object") {
82
+ return runConfig.inspector.enabled[context];
83
+ }
84
+ return false;
85
+ };
86
+
87
+ export const configureInspectorAccessToken = (
88
+ runConfig: RunConfig,
89
+ managerDriver: ManagerDriver,
90
+ ) => {
91
+ if (!runConfig.inspector?.token()) {
92
+ const token = managerDriver.getOrCreateInspectorAccessToken();
93
+ runConfig.inspector.token = () => token;
94
+ }
95
+ };
@@ -21,6 +21,8 @@ export interface ManagerDriver {
21
21
  actorId: string,
22
22
  encoding: Encoding,
23
23
  params: unknown,
24
+ connId?: string,
25
+ connToken?: string,
24
26
  ): Promise<UniversalWebSocket>;
25
27
  proxyRequest(
26
28
  c: HonoContext,
@@ -33,7 +35,8 @@ export interface ManagerDriver {
33
35
  actorId: string,
34
36
  encoding: Encoding,
35
37
  params: unknown,
36
- authData: unknown,
38
+ connId?: string,
39
+ connToken?: string,
37
40
  ): Promise<Response>;
38
41
 
39
42
  displayInformation(): ManagerDisplayInformation;
@@ -46,6 +49,13 @@ export interface ManagerDriver {
46
49
  * @internal
47
50
  */
48
51
  readonly inspector?: ManagerInspector;
52
+
53
+ /**
54
+ * Get or create the inspector access token.
55
+ * @internal
56
+ * @returns creates or returns existing inspector access token
57
+ */
58
+ getOrCreateInspectorAccessToken: () => string;
49
59
  }
50
60
 
51
61
  export interface ManagerDisplayInformation {