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.
- package/dist/schemas/actor-persist/v1.ts +0 -6
- package/dist/tsup/actor-router-consts-B3Lu87yJ.d.cts +28 -0
- package/dist/tsup/actor-router-consts-B3Lu87yJ.d.ts +28 -0
- package/dist/tsup/{chunk-7OUKNSTU.js → chunk-2NL3KGJ7.js} +17 -14
- package/dist/tsup/chunk-2NL3KGJ7.js.map +1 -0
- package/dist/tsup/{chunk-6P6RA47N.cjs → chunk-3ALZ7EGX.cjs} +14 -10
- package/dist/tsup/chunk-3ALZ7EGX.cjs.map +1 -0
- package/dist/tsup/chunk-4EXJ4ITR.cjs +102 -0
- package/dist/tsup/chunk-4EXJ4ITR.cjs.map +1 -0
- package/dist/tsup/{chunk-ZYLTS2EM.js → chunk-54MAHBLL.js} +2 -2
- package/dist/tsup/{chunk-NTCUGYSD.cjs → chunk-7OOBMCQI.cjs} +34 -31
- package/dist/tsup/chunk-7OOBMCQI.cjs.map +1 -0
- package/dist/tsup/{chunk-VCEHU56K.js → chunk-B6N6VM37.js} +2 -2
- package/dist/tsup/{chunk-VPV4MWXR.js → chunk-DIHKN7NM.js} +3 -3
- package/dist/tsup/{chunk-MRRT2CZD.cjs → chunk-ETDWYT2P.cjs} +7 -7
- package/dist/tsup/{chunk-MRRT2CZD.cjs.map → chunk-ETDWYT2P.cjs.map} +1 -1
- package/dist/tsup/{chunk-TWGATZ3X.cjs → chunk-F7YL5G7Q.cjs} +922 -872
- package/dist/tsup/chunk-F7YL5G7Q.cjs.map +1 -0
- package/dist/tsup/{chunk-UTI5NCES.cjs → chunk-GWJTWY3G.cjs} +6 -6
- package/dist/tsup/{chunk-UTI5NCES.cjs.map → chunk-GWJTWY3G.cjs.map} +1 -1
- package/dist/tsup/{chunk-W6LN7AF5.js → chunk-KHRZPP5T.js} +866 -816
- package/dist/tsup/chunk-KHRZPP5T.js.map +1 -0
- package/dist/tsup/{chunk-5JBFVV4C.cjs → chunk-LXAVET4A.cjs} +21 -7
- package/dist/tsup/chunk-LXAVET4A.cjs.map +1 -0
- package/dist/tsup/{chunk-TCUI5JFE.cjs → chunk-NDCVQZBS.cjs} +45 -18
- package/dist/tsup/chunk-NDCVQZBS.cjs.map +1 -0
- package/dist/tsup/{chunk-4CKHQRXG.js → chunk-NII4KKHD.js} +515 -240
- package/dist/tsup/chunk-NII4KKHD.js.map +1 -0
- package/dist/tsup/{chunk-2K3JMDAN.js → chunk-NRELKXIX.js} +40 -13
- package/dist/tsup/chunk-NRELKXIX.js.map +1 -0
- package/dist/tsup/{chunk-UFWAK3X2.cjs → chunk-NUA6LOOJ.cjs} +660 -385
- package/dist/tsup/chunk-NUA6LOOJ.cjs.map +1 -0
- package/dist/tsup/{chunk-DIAYNQTE.cjs → chunk-OSK2VSJF.cjs} +12 -12
- package/dist/tsup/{chunk-DIAYNQTE.cjs.map → chunk-OSK2VSJF.cjs.map} +1 -1
- package/dist/tsup/chunk-PD6HCAJE.js +102 -0
- package/dist/tsup/chunk-PD6HCAJE.js.map +1 -0
- package/dist/tsup/{chunk-RGQR2J7S.js → chunk-RLBM6D4L.js} +20 -6
- package/dist/tsup/chunk-RLBM6D4L.js.map +1 -0
- package/dist/tsup/{chunk-KG3C7MKR.cjs → chunk-VAF63BEI.cjs} +3 -3
- package/dist/tsup/{chunk-KG3C7MKR.cjs.map → chunk-VAF63BEI.cjs.map} +1 -1
- package/dist/tsup/{chunk-G75SVQON.js → chunk-WAT5AE7S.js} +9 -5
- package/dist/tsup/chunk-WAT5AE7S.js.map +1 -0
- package/dist/tsup/{chunk-WC2PSJWN.js → chunk-YL4VZMMT.js} +2 -2
- package/dist/tsup/client/mod.cjs +9 -9
- package/dist/tsup/client/mod.d.cts +7 -8
- package/dist/tsup/client/mod.d.ts +7 -8
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{connection-BLemxi4f.d.ts → conn-DCSQgIlw.d.ts} +1605 -1353
- package/dist/tsup/{connection-CpDIydXf.d.cts → conn-DdzHTm2E.d.cts} +1605 -1353
- package/dist/tsup/driver-helpers/mod.cjs +31 -5
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +7 -8
- package/dist/tsup/driver-helpers/mod.d.ts +7 -8
- package/dist/tsup/driver-helpers/mod.js +33 -7
- package/dist/tsup/driver-test-suite/mod.cjs +317 -222
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +7 -7
- package/dist/tsup/driver-test-suite/mod.d.ts +7 -7
- package/dist/tsup/driver-test-suite/mod.js +582 -487
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +16 -6
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +34 -7
- package/dist/tsup/inspector/mod.d.ts +34 -7
- package/dist/tsup/inspector/mod.js +17 -7
- package/dist/tsup/mod.cjs +10 -20
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +9 -7
- package/dist/tsup/mod.d.ts +9 -7
- package/dist/tsup/mod.js +9 -19
- package/dist/tsup/test/mod.cjs +11 -11
- package/dist/tsup/test/mod.d.cts +6 -7
- package/dist/tsup/test/mod.d.ts +6 -7
- package/dist/tsup/test/mod.js +10 -10
- package/dist/tsup/utils.cjs +4 -2
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +11 -1
- package/dist/tsup/utils.d.ts +11 -1
- package/dist/tsup/utils.js +3 -1
- package/package.json +8 -4
- package/src/actor/action.ts +1 -1
- package/src/actor/config.ts +1 -1
- package/src/actor/conn-drivers.ts +205 -0
- package/src/actor/conn-socket.ts +6 -0
- package/src/actor/{connection.ts → conn.ts} +78 -84
- package/src/actor/context.ts +1 -1
- package/src/actor/driver.ts +4 -43
- package/src/actor/instance.ts +162 -86
- package/src/actor/mod.ts +1 -11
- package/src/actor/persisted.ts +2 -5
- package/src/actor/protocol/old.ts +1 -1
- package/src/actor/router-endpoints.ts +142 -106
- package/src/actor/router.ts +81 -45
- package/src/actor/utils.ts +5 -1
- package/src/client/actor-conn.ts +154 -23
- package/src/client/client.ts +1 -1
- package/src/client/config.ts +7 -0
- package/src/common/actor-router-consts.ts +29 -8
- package/src/common/router.ts +2 -1
- package/src/common/versioned-data.ts +5 -5
- package/src/driver-helpers/mod.ts +14 -1
- package/src/driver-test-suite/mod.ts +11 -2
- package/src/driver-test-suite/test-inline-client-driver.ts +36 -18
- package/src/driver-test-suite/tests/actor-conn-state.ts +66 -22
- package/src/driver-test-suite/tests/actor-conn.ts +65 -126
- package/src/driver-test-suite/tests/actor-reconnect.ts +160 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +0 -1
- package/src/driver-test-suite/tests/raw-websocket.ts +0 -35
- package/src/driver-test-suite/utils.ts +3 -3
- package/src/drivers/default.ts +8 -7
- package/src/drivers/engine/actor-driver.ts +53 -31
- package/src/drivers/engine/config.ts +4 -0
- package/src/drivers/file-system/actor.ts +0 -6
- package/src/drivers/file-system/global-state.ts +3 -14
- package/src/drivers/file-system/manager.ts +12 -8
- package/src/inspector/actor.ts +4 -3
- package/src/inspector/config.ts +10 -1
- package/src/inspector/mod.ts +1 -0
- package/src/inspector/utils.ts +23 -4
- package/src/manager/driver.ts +11 -1
- package/src/manager/gateway.ts +407 -0
- package/src/manager/router.ts +269 -468
- package/src/manager-api/actors.ts +61 -0
- package/src/manager-api/common.ts +4 -0
- package/src/mod.ts +1 -1
- package/src/registry/mod.ts +119 -10
- package/src/remote-manager-driver/actor-http-client.ts +30 -19
- package/src/remote-manager-driver/actor-websocket-client.ts +43 -16
- package/src/remote-manager-driver/api-endpoints.ts +19 -21
- package/src/remote-manager-driver/api-utils.ts +10 -1
- package/src/remote-manager-driver/mod.ts +51 -48
- package/src/remote-manager-driver/ws-proxy.ts +2 -9
- package/src/test/mod.ts +6 -2
- package/src/utils.ts +21 -2
- package/dist/tsup/actor-router-consts-BK6arfy8.d.cts +0 -17
- package/dist/tsup/actor-router-consts-BK6arfy8.d.ts +0 -17
- package/dist/tsup/chunk-2K3JMDAN.js.map +0 -1
- package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
- package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
- package/dist/tsup/chunk-4CKHQRXG.js.map +0 -1
- package/dist/tsup/chunk-5JBFVV4C.cjs.map +0 -1
- package/dist/tsup/chunk-6P6RA47N.cjs.map +0 -1
- package/dist/tsup/chunk-7OUKNSTU.js.map +0 -1
- package/dist/tsup/chunk-G75SVQON.js.map +0 -1
- package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
- package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
- package/dist/tsup/chunk-NTCUGYSD.cjs.map +0 -1
- package/dist/tsup/chunk-RGQR2J7S.js.map +0 -1
- package/dist/tsup/chunk-TCUI5JFE.cjs.map +0 -1
- package/dist/tsup/chunk-TWGATZ3X.cjs.map +0 -1
- package/dist/tsup/chunk-UFWAK3X2.cjs.map +0 -1
- package/dist/tsup/chunk-W6LN7AF5.js.map +0 -1
- package/dist/tsup/common-CXCe7s6i.d.cts +0 -218
- package/dist/tsup/common-CXCe7s6i.d.ts +0 -218
- package/src/actor/generic-conn-driver.ts +0 -246
- package/src/common/fake-event-source.ts +0 -267
- package/src/manager-api/routes/actors-create.ts +0 -16
- package/src/manager-api/routes/actors-delete.ts +0 -4
- package/src/manager-api/routes/actors-get-by-id.ts +0 -7
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +0 -29
- package/src/manager-api/routes/actors-get.ts +0 -7
- package/src/manager-api/routes/common.ts +0 -18
- /package/dist/tsup/{chunk-ZYLTS2EM.js.map → chunk-54MAHBLL.js.map} +0 -0
- /package/dist/tsup/{chunk-VCEHU56K.js.map → chunk-B6N6VM37.js.map} +0 -0
- /package/dist/tsup/{chunk-VPV4MWXR.js.map → chunk-DIHKN7NM.js.map} +0 -0
- /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?:
|
|
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
|
-
|
|
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
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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?:
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/inspector/actor.ts
CHANGED
|
@@ -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 } =
|
|
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 } =
|
|
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 } =
|
|
163
|
+
const { promise } = promiseWithResolvers<void>();
|
|
163
164
|
|
|
164
165
|
return promise;
|
|
165
166
|
},
|
package/src/inspector/config.ts
CHANGED
|
@@ -56,7 +56,16 @@ const defaultCors: CorsOptions = {
|
|
|
56
56
|
|
|
57
57
|
export const InspectorConfigSchema = z
|
|
58
58
|
.object({
|
|
59
|
-
enabled: z
|
|
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>()
|
package/src/inspector/mod.ts
CHANGED
package/src/inspector/utils.ts
CHANGED
|
@@ -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
|
+
};
|
package/src/manager/driver.ts
CHANGED
|
@@ -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
|
-
|
|
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 {
|