rivetkit 2.1.2 → 2.1.4
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/browser/client.d.ts +11 -0
- package/dist/browser/client.js +1 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +1 -1
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/inspector.tar.gz +0 -0
- package/dist/tsup/{chunk-MNS5LY6M.cjs → chunk-3B6PCYJB.cjs} +280 -115
- package/dist/tsup/chunk-3B6PCYJB.cjs.map +1 -0
- package/dist/tsup/{chunk-YQ5P6KMN.js → chunk-3GTO6H3E.js} +12 -5
- package/dist/tsup/chunk-3GTO6H3E.js.map +1 -0
- package/dist/tsup/{chunk-RMJJE43B.cjs → chunk-4KSHPFXF.cjs} +2 -2
- package/dist/tsup/{chunk-RMJJE43B.cjs.map → chunk-4KSHPFXF.cjs.map} +1 -1
- package/dist/tsup/{chunk-PW3YONDJ.js → chunk-5UEFNG7P.js} +2 -2
- package/dist/tsup/{chunk-PSUVV4HM.js → chunk-ANKZ2FS6.js} +2 -4
- package/dist/tsup/chunk-ANKZ2FS6.js.map +1 -0
- package/dist/tsup/{chunk-GVQAVU7R.cjs → chunk-AQD4CBZ2.cjs} +4 -4
- package/dist/tsup/{chunk-GVQAVU7R.cjs.map → chunk-AQD4CBZ2.cjs.map} +1 -1
- package/dist/tsup/{chunk-WUXR722E.js → chunk-DZXDUGLL.js} +2 -2
- package/dist/tsup/{chunk-WUXR722E.js.map → chunk-DZXDUGLL.js.map} +1 -1
- package/dist/tsup/{chunk-NXEHFUDB.cjs → chunk-GXRVSSVD.cjs} +28 -21
- package/dist/tsup/chunk-GXRVSSVD.cjs.map +1 -0
- package/dist/tsup/{chunk-UZV7NXC6.cjs → chunk-H5TSEPN4.cjs} +30 -30
- package/dist/tsup/{chunk-UZV7NXC6.cjs.map → chunk-H5TSEPN4.cjs.map} +1 -1
- package/dist/tsup/{chunk-TDFDR7AO.js → chunk-HBYEYBIC.js} +2 -2
- package/dist/tsup/{chunk-772NPMTY.cjs → chunk-HKOSZKKZ.cjs} +263 -299
- package/dist/tsup/chunk-HKOSZKKZ.cjs.map +1 -0
- package/dist/tsup/{chunk-HB4RGGMC.js → chunk-I6PL6QIY.js} +5 -5
- package/dist/tsup/{chunk-RHUII57M.js → chunk-KTWY3K6Z.js} +23 -12
- package/dist/tsup/chunk-KTWY3K6Z.js.map +1 -0
- package/dist/tsup/{chunk-HFWRHT5T.cjs → chunk-LK36OGGO.cjs} +3 -5
- package/dist/tsup/chunk-LK36OGGO.cjs.map +1 -0
- package/dist/tsup/{chunk-BSIJG3LG.js → chunk-M6H4XIF4.js} +179 -215
- package/dist/tsup/chunk-M6H4XIF4.js.map +1 -0
- package/dist/tsup/{chunk-ZHQDRRMY.cjs → chunk-QPADHLDU.cjs} +3 -3
- package/dist/tsup/{chunk-ZHQDRRMY.cjs.map → chunk-QPADHLDU.cjs.map} +1 -1
- package/dist/tsup/{chunk-BFI4LYS2.js → chunk-TEFYRRAK.js} +4 -4
- package/dist/tsup/{chunk-PZAV6PP2.cjs → chunk-TEUL4UYN.cjs} +152 -152
- package/dist/tsup/{chunk-PZAV6PP2.cjs.map → chunk-TEUL4UYN.cjs.map} +1 -1
- package/dist/tsup/{chunk-VMX4I4MP.js → chunk-UDMRZR6A.js} +212 -47
- package/dist/tsup/chunk-UDMRZR6A.js.map +1 -0
- package/dist/tsup/{chunk-QABDKI3W.cjs → chunk-UWAGLDT6.cjs} +263 -252
- package/dist/tsup/chunk-UWAGLDT6.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.d.cts +2 -2
- package/dist/tsup/client/mod.d.ts +2 -2
- package/dist/tsup/client/mod.js +5 -5
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/{config-P3XujgRr.d.ts → config-Qj-zLJPc.d.ts} +11 -0
- package/dist/tsup/{config-_gfywqqI.d.cts → config-iPj5l1bL.d.cts} +11 -0
- package/dist/tsup/{context-uNA4TRn3.d.ts → context-CQCMuHND.d.ts} +1 -1
- package/dist/tsup/{context-Bxd8Cx4H.d.cts → context-DzvH1PBK.d.cts} +1 -1
- package/dist/tsup/{driver-CPGHKXyh.d.ts → driver-Jo8v-kbU.d.ts} +1 -1
- package/dist/tsup/driver-helpers/mod.cjs +4 -4
- package/dist/tsup/driver-helpers/mod.d.cts +4 -4
- package/dist/tsup/driver-helpers/mod.d.ts +4 -4
- package/dist/tsup/driver-helpers/mod.js +3 -3
- package/dist/tsup/{driver-BcLvZcKl.d.cts → driver-iV8J-WMv.d.cts} +1 -1
- package/dist/tsup/driver-test-suite/mod.cjs +556 -333
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
- package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
- package/dist/tsup/driver-test-suite/mod.js +1332 -1109
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +3 -3
- package/dist/tsup/inspector/mod.js +2 -2
- package/dist/tsup/mod.cjs +8 -8
- package/dist/tsup/mod.d.cts +5 -5
- package/dist/tsup/mod.d.ts +5 -5
- package/dist/tsup/mod.js +7 -7
- package/dist/tsup/serve-test-suite/mod.cjs +194 -100
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +105 -11
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +10 -10
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +6 -6
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/dist/tsup/workflow/mod.cjs +5 -5
- package/dist/tsup/workflow/mod.d.cts +3 -3
- package/dist/tsup/workflow/mod.d.ts +3 -3
- package/dist/tsup/workflow/mod.js +4 -4
- package/package.json +5 -5
- package/src/actor/config.ts +0 -2
- package/src/actor/instance/mod.ts +30 -6
- package/src/actor/router.ts +9 -6
- package/src/driver-test-suite/mod.ts +3 -0
- package/src/driver-test-suite/tests/actor-db.ts +299 -216
- package/src/driver-test-suite/tests/actor-driver.ts +4 -0
- package/src/driver-test-suite/tests/actor-lifecycle.ts +157 -0
- package/src/driver-test-suite/tests/actor-queue.ts +10 -9
- package/src/driver-test-suite/tests/actor-workflow.ts +12 -2
- package/src/driver-test-suite/tests/conn-error-serialization.ts +64 -0
- package/src/driver-test-suite/utils.ts +8 -8
- package/src/drivers/engine/actor-driver.ts +113 -11
- package/src/manager/router.ts +20 -6
- package/src/{registry → utils}/serve.ts +38 -4
- package/src/workflow/context.ts +4 -0
- package/src/workflow/driver.ts +4 -1
- package/dist/tsup/chunk-772NPMTY.cjs.map +0 -1
- package/dist/tsup/chunk-BSIJG3LG.js.map +0 -1
- package/dist/tsup/chunk-HFWRHT5T.cjs.map +0 -1
- package/dist/tsup/chunk-MNS5LY6M.cjs.map +0 -1
- package/dist/tsup/chunk-NXEHFUDB.cjs.map +0 -1
- package/dist/tsup/chunk-PSUVV4HM.js.map +0 -1
- package/dist/tsup/chunk-QABDKI3W.cjs.map +0 -1
- package/dist/tsup/chunk-RHUII57M.js.map +0 -1
- package/dist/tsup/chunk-VMX4I4MP.js.map +0 -1
- package/dist/tsup/chunk-YQ5P6KMN.js.map +0 -1
- /package/dist/tsup/{chunk-PW3YONDJ.js.map → chunk-5UEFNG7P.js.map} +0 -0
- /package/dist/tsup/{chunk-TDFDR7AO.js.map → chunk-HBYEYBIC.js.map} +0 -0
- /package/dist/tsup/{chunk-HB4RGGMC.js.map → chunk-I6PL6QIY.js.map} +0 -0
- /package/dist/tsup/{chunk-BFI4LYS2.js.map → chunk-TEFYRRAK.js.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
ensureDirectoryExists,
|
|
6
6
|
getStoragePath,
|
|
7
7
|
lookupInRegistry
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-KTWY3K6Z.js";
|
|
9
9
|
import {
|
|
10
10
|
ClientConfigSchemaBase,
|
|
11
11
|
RemoteManagerDriver,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
getEndpoint,
|
|
17
17
|
transformClientConfig,
|
|
18
18
|
updateRunnerConfig
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-I6PL6QIY.js";
|
|
20
20
|
import {
|
|
21
21
|
CONN_STATE_MANAGER_SYMBOL,
|
|
22
22
|
ENGINE_ENDPOINT,
|
|
@@ -30,7 +30,9 @@ import {
|
|
|
30
30
|
buildActorNames,
|
|
31
31
|
buildManagerRouter,
|
|
32
32
|
createRouter,
|
|
33
|
+
crossPlatformServe,
|
|
33
34
|
deserializeActorKey,
|
|
35
|
+
findFreePort,
|
|
34
36
|
getInitialActorKvState,
|
|
35
37
|
getNodeChildProcess,
|
|
36
38
|
getNodeCrypto,
|
|
@@ -42,17 +44,18 @@ import {
|
|
|
42
44
|
handleHealthRequest,
|
|
43
45
|
handleMetadataRequest,
|
|
44
46
|
importNodeDependencies,
|
|
47
|
+
logger,
|
|
45
48
|
parseWebSocketProtocols,
|
|
46
49
|
routeWebSocket,
|
|
47
50
|
truncateRawWebSocketPathPrefix
|
|
48
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-UDMRZR6A.js";
|
|
49
52
|
import {
|
|
50
53
|
ActorConfigSchema,
|
|
51
54
|
KEYS,
|
|
52
55
|
event,
|
|
53
56
|
loggerWithoutContext,
|
|
54
57
|
queue
|
|
55
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-ANKZ2FS6.js";
|
|
56
59
|
import {
|
|
57
60
|
LogLevelSchema,
|
|
58
61
|
VERSION,
|
|
@@ -71,7 +74,7 @@ import {
|
|
|
71
74
|
promiseWithResolvers,
|
|
72
75
|
setLongTimeout,
|
|
73
76
|
stringifyError
|
|
74
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-DZXDUGLL.js";
|
|
75
78
|
import {
|
|
76
79
|
EndpointMismatch,
|
|
77
80
|
InvalidRequest,
|
|
@@ -95,12 +98,13 @@ import { WSContext } from "hono/ws";
|
|
|
95
98
|
import invariant from "invariant";
|
|
96
99
|
|
|
97
100
|
// src/drivers/engine/log.ts
|
|
98
|
-
function
|
|
101
|
+
function logger2() {
|
|
99
102
|
return getLogger("driver-engine");
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
// src/drivers/engine/actor-driver.ts
|
|
103
106
|
var RUNNER_SSE_PING_INTERVAL = 1e3;
|
|
107
|
+
var RUNNER_STOP_WAIT_MS = 15e3;
|
|
104
108
|
var CONN_MESSAGE_ACK_DEADLINE = 5e3;
|
|
105
109
|
var CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD = 5e5;
|
|
106
110
|
var EngineActorDriver = class {
|
|
@@ -110,8 +114,8 @@ var EngineActorDriver = class {
|
|
|
110
114
|
#runner;
|
|
111
115
|
#actors = /* @__PURE__ */ new Map();
|
|
112
116
|
#actorRouter;
|
|
113
|
-
#runnerStarted = promiseWithResolvers((reason) =>
|
|
114
|
-
#runnerStopped = promiseWithResolvers((reason) =>
|
|
117
|
+
#runnerStarted = promiseWithResolvers((reason) => logger2().warn({ msg: "unhandled runner started promise rejection", reason }));
|
|
118
|
+
#runnerStopped = promiseWithResolvers((reason) => logger2().warn({ msg: "unhandled runner stopped promise rejection", reason }));
|
|
115
119
|
#isRunnerStopped = false;
|
|
116
120
|
// HACK: Track actor stop intent locally since the runner protocol doesn't
|
|
117
121
|
// pass the stop reason to onActorStop. This will be fixed when the runner
|
|
@@ -173,7 +177,7 @@ var EngineActorDriver = class {
|
|
|
173
177
|
};
|
|
174
178
|
this.#runner = new Runner(engineRunnerConfig);
|
|
175
179
|
this.#runner.start();
|
|
176
|
-
|
|
180
|
+
logger2().debug({
|
|
177
181
|
msg: "engine runner started",
|
|
178
182
|
endpoint: config.endpoint,
|
|
179
183
|
namespace: config.namespace,
|
|
@@ -188,6 +192,7 @@ var EngineActorDriver = class {
|
|
|
188
192
|
if (!handler)
|
|
189
193
|
throw new Error(`Actor handler does not exist ${actorId}`);
|
|
190
194
|
if (handler.actorStartPromise) await handler.actorStartPromise.promise;
|
|
195
|
+
if (handler.actorStartError) throw handler.actorStartError;
|
|
191
196
|
if (!handler.actor) throw new Error("Actor should be loaded");
|
|
192
197
|
return handler;
|
|
193
198
|
}
|
|
@@ -197,7 +202,7 @@ var EngineActorDriver = class {
|
|
|
197
202
|
async setAlarm(actor2, timestamp) {
|
|
198
203
|
const handler = this.#actors.get(actor2.id);
|
|
199
204
|
if (!handler) {
|
|
200
|
-
|
|
205
|
+
logger2().warn({
|
|
201
206
|
msg: "no handler for actor to set alarm"
|
|
202
207
|
});
|
|
203
208
|
return;
|
|
@@ -230,7 +235,7 @@ var EngineActorDriver = class {
|
|
|
230
235
|
new Uint8Array()
|
|
231
236
|
);
|
|
232
237
|
const keys = entries.map(([key]) => key);
|
|
233
|
-
|
|
238
|
+
logger2().info({
|
|
234
239
|
msg: "kvList called",
|
|
235
240
|
actorId,
|
|
236
241
|
keysCount: keys.length,
|
|
@@ -240,7 +245,7 @@ var EngineActorDriver = class {
|
|
|
240
245
|
}
|
|
241
246
|
async kvListPrefix(actorId, prefix) {
|
|
242
247
|
const result = await this.#runner.kvListPrefix(actorId, prefix);
|
|
243
|
-
|
|
248
|
+
logger2().info({
|
|
244
249
|
msg: "kvListPrefix called",
|
|
245
250
|
actorId,
|
|
246
251
|
prefixStr: new TextDecoder().decode(prefix),
|
|
@@ -249,6 +254,12 @@ var EngineActorDriver = class {
|
|
|
249
254
|
});
|
|
250
255
|
return result;
|
|
251
256
|
}
|
|
257
|
+
/** Creates a SQLite VFS instance for creating KV-backed databases */
|
|
258
|
+
async createSqliteVfs() {
|
|
259
|
+
const specifier = "@rivetkit/sqlite-vfs";
|
|
260
|
+
const { SqliteVfs } = await import(specifier);
|
|
261
|
+
return new SqliteVfs();
|
|
262
|
+
}
|
|
252
263
|
// MARK: - Actor Lifecycle
|
|
253
264
|
async loadActor(actorId) {
|
|
254
265
|
const handler = await this.#loadActorHandler(actorId);
|
|
@@ -264,8 +275,8 @@ var EngineActorDriver = class {
|
|
|
264
275
|
this.#runner.stopActor(actorId);
|
|
265
276
|
}
|
|
266
277
|
async shutdownRunner(immediate) {
|
|
267
|
-
|
|
268
|
-
|
|
278
|
+
logger2().info({ msg: "stopping engine actor driver", immediate });
|
|
279
|
+
logger2().debug({
|
|
269
280
|
msg: "stopping all actors before shutdown",
|
|
270
281
|
actorCount: this.#actors.size
|
|
271
282
|
});
|
|
@@ -284,15 +295,39 @@ var EngineActorDriver = class {
|
|
|
284
295
|
}
|
|
285
296
|
}
|
|
286
297
|
await Promise.all(stopPromises);
|
|
287
|
-
|
|
288
|
-
|
|
298
|
+
logger2().debug({ msg: "all actors stopped" });
|
|
299
|
+
try {
|
|
300
|
+
await this.#runner.shutdown(immediate);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
303
|
+
if (message.includes("WebSocket connection closed during shutdown")) {
|
|
304
|
+
logger2().debug({
|
|
305
|
+
msg: "ignoring shutdown websocket close race",
|
|
306
|
+
error: message
|
|
307
|
+
});
|
|
308
|
+
} else {
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
const stopped = await Promise.race([
|
|
313
|
+
this.#runnerStopped.promise.then(() => true),
|
|
314
|
+
new Promise(
|
|
315
|
+
(resolve) => setTimeout(() => resolve(false), RUNNER_STOP_WAIT_MS)
|
|
316
|
+
)
|
|
317
|
+
]);
|
|
318
|
+
if (!stopped) {
|
|
319
|
+
logger2().warn({
|
|
320
|
+
msg: "timed out waiting for runner shutdown",
|
|
321
|
+
waitMs: RUNNER_STOP_WAIT_MS
|
|
322
|
+
});
|
|
323
|
+
}
|
|
289
324
|
}
|
|
290
325
|
async serverlessHandleStart(c) {
|
|
291
326
|
return streamSSE(c, async (stream) => {
|
|
292
327
|
stream.onAbort(() => {
|
|
293
328
|
});
|
|
294
329
|
c.req.raw.signal.addEventListener("abort", () => {
|
|
295
|
-
|
|
330
|
+
logger2().debug("SSE aborted, shutting down runner");
|
|
296
331
|
this.shutdownRunner(false);
|
|
297
332
|
});
|
|
298
333
|
await this.#runnerStarted.promise;
|
|
@@ -301,13 +336,13 @@ var EngineActorDriver = class {
|
|
|
301
336
|
await stream.writeSSE({ data: payload });
|
|
302
337
|
while (true) {
|
|
303
338
|
if (this.#isRunnerStopped) {
|
|
304
|
-
|
|
339
|
+
logger2().debug({
|
|
305
340
|
msg: "runner is stopped"
|
|
306
341
|
});
|
|
307
342
|
break;
|
|
308
343
|
}
|
|
309
344
|
if (stream.closed || stream.aborted) {
|
|
310
|
-
|
|
345
|
+
logger2().debug({
|
|
311
346
|
msg: "runner sse stream closed",
|
|
312
347
|
closed: stream.closed,
|
|
313
348
|
aborted: stream.aborted
|
|
@@ -322,7 +357,7 @@ var EngineActorDriver = class {
|
|
|
322
357
|
}
|
|
323
358
|
async #runnerOnActorStart(actorId, generation, actorConfig) {
|
|
324
359
|
var _a;
|
|
325
|
-
|
|
360
|
+
logger2().debug({
|
|
326
361
|
msg: "runner actor starting",
|
|
327
362
|
actorId,
|
|
328
363
|
name: actorConfig.name,
|
|
@@ -336,10 +371,11 @@ var EngineActorDriver = class {
|
|
|
336
371
|
let handler = this.#actors.get(actorId);
|
|
337
372
|
if (!handler) {
|
|
338
373
|
handler = {
|
|
339
|
-
actorStartPromise: promiseWithResolvers((reason) =>
|
|
374
|
+
actorStartPromise: promiseWithResolvers((reason) => logger2().warn({ msg: "unhandled actor start promise rejection", reason }))
|
|
340
375
|
};
|
|
341
376
|
this.#actors.set(actorId, handler);
|
|
342
377
|
}
|
|
378
|
+
handler.actorStartError = void 0;
|
|
343
379
|
const name = actorConfig.name;
|
|
344
380
|
invariant(actorConfig.key, "actor should have a key");
|
|
345
381
|
const key = deserializeActorKey(actorConfig.key);
|
|
@@ -350,12 +386,12 @@ var EngineActorDriver = class {
|
|
|
350
386
|
if (persistDataBuffer === null) {
|
|
351
387
|
const initialKvState = getInitialActorKvState(input);
|
|
352
388
|
await this.#runner.kvPut(actorId, initialKvState);
|
|
353
|
-
|
|
389
|
+
logger2().debug({
|
|
354
390
|
msg: "initialized persist data for new actor",
|
|
355
391
|
actorId
|
|
356
392
|
});
|
|
357
393
|
} else {
|
|
358
|
-
|
|
394
|
+
logger2().debug({
|
|
359
395
|
msg: "found existing persist data for actor",
|
|
360
396
|
actorId,
|
|
361
397
|
dataSize: persistDataBuffer.byteLength
|
|
@@ -363,6 +399,21 @@ var EngineActorDriver = class {
|
|
|
363
399
|
}
|
|
364
400
|
const definition = lookupInRegistry(this.#config, actorConfig.name);
|
|
365
401
|
handler.actor = await definition.instantiate();
|
|
402
|
+
const protocolMetadata = this.#runner.getProtocolMetadata();
|
|
403
|
+
if (protocolMetadata) {
|
|
404
|
+
logger2().debug({
|
|
405
|
+
msg: "applying config limits from protocol",
|
|
406
|
+
protocolMetadata
|
|
407
|
+
});
|
|
408
|
+
const stopThresholdMax = Math.max(Number(protocolMetadata.actorStopThreshold) - 1e3, 0);
|
|
409
|
+
handler.actor.overrides.onSleepTimeout = stopThresholdMax;
|
|
410
|
+
handler.actor.overrides.onDestroyTimeout = stopThresholdMax;
|
|
411
|
+
if (protocolMetadata.serverlessDrainGracePeriod) {
|
|
412
|
+
const drainMax = Math.max(Number(protocolMetadata.serverlessDrainGracePeriod) - 1e3, 0);
|
|
413
|
+
handler.actor.overrides.runStopTimeout = drainMax;
|
|
414
|
+
handler.actor.overrides.waitUntilTimeout = drainMax;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
366
417
|
await handler.actor.start(
|
|
367
418
|
this,
|
|
368
419
|
this.#inlineClient,
|
|
@@ -372,38 +423,71 @@ var EngineActorDriver = class {
|
|
|
372
423
|
"unknown"
|
|
373
424
|
// TODO: Add regions
|
|
374
425
|
);
|
|
375
|
-
|
|
426
|
+
logger2().debug({ msg: "runner actor started", actorId, name, key });
|
|
376
427
|
} catch (innerError) {
|
|
377
|
-
const error = new Error(
|
|
378
|
-
`Failed to start actor ${actorId}: ${innerError}`,
|
|
428
|
+
const error = innerError instanceof Error ? new Error(
|
|
429
|
+
`Failed to start actor ${actorId}: ${innerError.message}`,
|
|
379
430
|
{ cause: innerError }
|
|
380
|
-
);
|
|
431
|
+
) : new Error(`Failed to start actor ${actorId}: ${String(innerError)}`);
|
|
432
|
+
handler.actor = void 0;
|
|
433
|
+
handler.actorStartError = error;
|
|
381
434
|
(_a = handler.actorStartPromise) == null ? void 0 : _a.reject(error);
|
|
382
435
|
handler.actorStartPromise = void 0;
|
|
383
|
-
|
|
436
|
+
logger2().error({
|
|
437
|
+
msg: "runner actor failed to start",
|
|
438
|
+
actorId,
|
|
439
|
+
name,
|
|
440
|
+
key,
|
|
441
|
+
err: stringifyError(error)
|
|
442
|
+
});
|
|
443
|
+
try {
|
|
444
|
+
this.#runner.stopActor(actorId);
|
|
445
|
+
} catch (stopError) {
|
|
446
|
+
logger2().debug({
|
|
447
|
+
msg: "failed to stop actor after start failure",
|
|
448
|
+
actorId,
|
|
449
|
+
err: stringifyError(stopError)
|
|
450
|
+
});
|
|
451
|
+
}
|
|
384
452
|
}
|
|
385
453
|
}
|
|
386
454
|
async #runnerOnActorStop(actorId, generation) {
|
|
387
|
-
|
|
455
|
+
logger2().debug({ msg: "runner actor stopping", actorId, generation });
|
|
388
456
|
const reason = this.#actorStopIntent.get(actorId) ?? "sleep";
|
|
389
457
|
this.#actorStopIntent.delete(actorId);
|
|
390
458
|
const handler = this.#actors.get(actorId);
|
|
391
|
-
if (handler
|
|
459
|
+
if (!handler) {
|
|
460
|
+
logger2().debug({ msg: "no runner actor handler to stop", actorId, reason });
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (handler.actorStartPromise) {
|
|
464
|
+
try {
|
|
465
|
+
logger2().debug({ msg: "runner actor stopping before it started, waiting", actorId, generation });
|
|
466
|
+
await handler.actorStartPromise.promise;
|
|
467
|
+
} catch (err) {
|
|
468
|
+
logger2().debug({
|
|
469
|
+
msg: "actor start failed during stop, cleaning up handler",
|
|
470
|
+
actorId,
|
|
471
|
+
err: stringifyError(err)
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (handler.actor) {
|
|
392
476
|
try {
|
|
393
477
|
await handler.actor.onStop(reason);
|
|
394
478
|
} catch (err) {
|
|
395
|
-
|
|
479
|
+
logger2().error({
|
|
396
480
|
msg: "error in onStop, proceeding with removing actor",
|
|
397
481
|
err: stringifyError(err)
|
|
398
482
|
});
|
|
399
483
|
}
|
|
400
|
-
this.#actors.delete(actorId);
|
|
401
484
|
}
|
|
402
|
-
|
|
485
|
+
this.#actors.delete(actorId);
|
|
486
|
+
logger2().debug({ msg: "runner actor stopped", actorId, reason });
|
|
403
487
|
}
|
|
404
488
|
// MARK: - Runner Networking
|
|
405
489
|
async #runnerFetch(_runner, actorId, _gatewayIdBuf, _requestIdBuf, request) {
|
|
406
|
-
|
|
490
|
+
logger2().debug({
|
|
407
491
|
msg: "runner fetch",
|
|
408
492
|
actorId,
|
|
409
493
|
url: request.url,
|
|
@@ -416,7 +500,7 @@ var EngineActorDriver = class {
|
|
|
416
500
|
const websocket = websocketRaw;
|
|
417
501
|
const wsUniqueId = `ws_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
418
502
|
websocket.__rivet_ws_id = wsUniqueId;
|
|
419
|
-
|
|
503
|
+
logger2().debug({
|
|
420
504
|
msg: "runner websocket",
|
|
421
505
|
actorId,
|
|
422
506
|
url: request.url,
|
|
@@ -445,7 +529,7 @@ var EngineActorDriver = class {
|
|
|
445
529
|
isRestoringHibernatable
|
|
446
530
|
);
|
|
447
531
|
} catch (err) {
|
|
448
|
-
|
|
532
|
+
logger2().error({ msg: "building websocket handlers errored", err });
|
|
449
533
|
websocketRaw.close(1011, "ws.route_error");
|
|
450
534
|
return;
|
|
451
535
|
}
|
|
@@ -454,7 +538,7 @@ var EngineActorDriver = class {
|
|
|
454
538
|
const conn = wsHandler.conn;
|
|
455
539
|
const actor2 = wsHandler.actor;
|
|
456
540
|
const connStateManager = conn == null ? void 0 : conn[CONN_STATE_MANAGER_SYMBOL];
|
|
457
|
-
|
|
541
|
+
logger2().debug({
|
|
458
542
|
msg: "attaching websocket event listeners",
|
|
459
543
|
actorId,
|
|
460
544
|
connId: conn == null ? void 0 : conn.id,
|
|
@@ -470,7 +554,7 @@ var EngineActorDriver = class {
|
|
|
470
554
|
});
|
|
471
555
|
websocket.addEventListener("message", (event3) => {
|
|
472
556
|
var _a2, _b2;
|
|
473
|
-
|
|
557
|
+
logger2().debug({
|
|
474
558
|
msg: "websocket message event listener triggered",
|
|
475
559
|
connId: conn == null ? void 0 : conn.id,
|
|
476
560
|
actorId: actor2 == null ? void 0 : actor2.id,
|
|
@@ -483,7 +567,7 @@ var EngineActorDriver = class {
|
|
|
483
567
|
eventTargetWsId: (_b2 = event3.target) == null ? void 0 : _b2.__rivet_ws_id
|
|
484
568
|
});
|
|
485
569
|
if (actor2 == null ? void 0 : actor2.isStopping) {
|
|
486
|
-
|
|
570
|
+
logger2().debug({
|
|
487
571
|
msg: "ignoring ws message, actor is stopping",
|
|
488
572
|
connId: conn == null ? void 0 : conn.id,
|
|
489
573
|
actorId: actor2 == null ? void 0 : actor2.id,
|
|
@@ -491,7 +575,7 @@ var EngineActorDriver = class {
|
|
|
491
575
|
});
|
|
492
576
|
return;
|
|
493
577
|
}
|
|
494
|
-
|
|
578
|
+
logger2().debug({
|
|
495
579
|
msg: "calling wsHandler.onMessage",
|
|
496
580
|
connId: conn == null ? void 0 : conn.id,
|
|
497
581
|
messageIndex: event3.rivetMessageIndex
|
|
@@ -505,7 +589,7 @@ var EngineActorDriver = class {
|
|
|
505
589
|
);
|
|
506
590
|
const previousMsgIndex = hibernate.serverMessageIndex;
|
|
507
591
|
hibernate.serverMessageIndex = event3.rivetMessageIndex;
|
|
508
|
-
|
|
592
|
+
logger2().info({
|
|
509
593
|
msg: "persisting message index",
|
|
510
594
|
connId: conn.id,
|
|
511
595
|
previousMsgIndex,
|
|
@@ -540,7 +624,7 @@ var EngineActorDriver = class {
|
|
|
540
624
|
wsHandler.onError(event3, wsContext);
|
|
541
625
|
});
|
|
542
626
|
if (isRestoringHibernatable) {
|
|
543
|
-
|
|
627
|
+
logger2().info({
|
|
544
628
|
msg: "event listeners attached to restored websocket",
|
|
545
629
|
actorId,
|
|
546
630
|
connId: conn == null ? void 0 : conn.id,
|
|
@@ -558,7 +642,7 @@ var EngineActorDriver = class {
|
|
|
558
642
|
const path = url.pathname;
|
|
559
643
|
const actorInstance = this.#runner.getActor(actorId);
|
|
560
644
|
if (!actorInstance) {
|
|
561
|
-
|
|
645
|
+
logger2().warn({
|
|
562
646
|
msg: "actor not found in #hwsCanHibernate",
|
|
563
647
|
actorId
|
|
564
648
|
});
|
|
@@ -566,20 +650,20 @@ var EngineActorDriver = class {
|
|
|
566
650
|
}
|
|
567
651
|
const handler = this.#actors.get(actorId);
|
|
568
652
|
if (!handler) {
|
|
569
|
-
|
|
653
|
+
logger2().warn({
|
|
570
654
|
msg: "actor handler not found in #hwsCanHibernate",
|
|
571
655
|
actorId
|
|
572
656
|
});
|
|
573
657
|
return false;
|
|
574
658
|
}
|
|
575
659
|
if (!handler.actor) {
|
|
576
|
-
|
|
660
|
+
logger2().warn({
|
|
577
661
|
msg: "actor not found in #hwsCanHibernate",
|
|
578
662
|
actorId
|
|
579
663
|
});
|
|
580
664
|
return false;
|
|
581
665
|
}
|
|
582
|
-
|
|
666
|
+
logger2().debug({
|
|
583
667
|
msg: "no existing hibernatable websocket found",
|
|
584
668
|
gatewayId: idToStr(gatewayId),
|
|
585
669
|
requestId: idToStr(requestId)
|
|
@@ -606,7 +690,7 @@ var EngineActorDriver = class {
|
|
|
606
690
|
const canHibernate = canHibernateWebSocket(truncatedRequest);
|
|
607
691
|
return canHibernate;
|
|
608
692
|
} catch (error) {
|
|
609
|
-
|
|
693
|
+
logger2().error({
|
|
610
694
|
msg: "error calling canHibernateWebSocket",
|
|
611
695
|
error
|
|
612
696
|
});
|
|
@@ -618,7 +702,7 @@ var EngineActorDriver = class {
|
|
|
618
702
|
} else if (path === PATH_INSPECTOR_CONNECT) {
|
|
619
703
|
return false;
|
|
620
704
|
} else {
|
|
621
|
-
|
|
705
|
+
logger2().warn({
|
|
622
706
|
msg: "unexpected path for getActorHibernationConfig",
|
|
623
707
|
path
|
|
624
708
|
});
|
|
@@ -645,6 +729,7 @@ var EngineActorDriver = class {
|
|
|
645
729
|
var _a;
|
|
646
730
|
const handler = this.#actors.get(actor2.id);
|
|
647
731
|
invariant(handler, "missing actor handler in onBeforeActorReady");
|
|
732
|
+
handler.actorStartError = void 0;
|
|
648
733
|
(_a = handler.actorStartPromise) == null ? void 0 : _a.resolve();
|
|
649
734
|
handler.actorStartPromise = void 0;
|
|
650
735
|
const metaEntries = await this.#hwsLoadAll(actor2.id);
|
|
@@ -659,7 +744,7 @@ var EngineActorDriver = class {
|
|
|
659
744
|
pendingAckFromMessageIndex: false,
|
|
660
745
|
pendingAckFromBufferSize: false
|
|
661
746
|
});
|
|
662
|
-
|
|
747
|
+
logger2().debug({
|
|
663
748
|
msg: "created #hwsMessageIndex entry",
|
|
664
749
|
connId: conn.id,
|
|
665
750
|
serverMessageIndex: hibernatable.serverMessageIndex
|
|
@@ -667,7 +752,7 @@ var EngineActorDriver = class {
|
|
|
667
752
|
}
|
|
668
753
|
onDestroyConn(conn) {
|
|
669
754
|
this.#hwsMessageIndex.delete(conn.id);
|
|
670
|
-
|
|
755
|
+
logger2().debug({
|
|
671
756
|
msg: "removed #hwsMessageIndex entry",
|
|
672
757
|
connId: conn.id
|
|
673
758
|
});
|
|
@@ -677,7 +762,7 @@ var EngineActorDriver = class {
|
|
|
677
762
|
const hibernatable = stateManager.hibernatableDataOrError();
|
|
678
763
|
const entry = this.#hwsMessageIndex.get(conn.id);
|
|
679
764
|
if (!entry) {
|
|
680
|
-
|
|
765
|
+
logger2().warn({
|
|
681
766
|
msg: "missing EngineActorDriver.#hwsMessageIndex entry for conn",
|
|
682
767
|
connId: conn.id
|
|
683
768
|
});
|
|
@@ -691,7 +776,7 @@ var EngineActorDriver = class {
|
|
|
691
776
|
const hibernatable = stateManager.hibernatableDataOrError();
|
|
692
777
|
const entry = this.#hwsMessageIndex.get(conn.id);
|
|
693
778
|
if (!entry) {
|
|
694
|
-
|
|
779
|
+
logger2().warn({
|
|
695
780
|
msg: "missing EngineActorDriver.#hwsMessageIndex entry for conn",
|
|
696
781
|
connId: conn.id
|
|
697
782
|
});
|
|
@@ -876,7 +961,7 @@ function chooseDefaultDriver(config) {
|
|
|
876
961
|
}
|
|
877
962
|
|
|
878
963
|
// src/engine-process/log.ts
|
|
879
|
-
function
|
|
964
|
+
function logger3() {
|
|
880
965
|
return getLogger("engine-process");
|
|
881
966
|
}
|
|
882
967
|
|
|
@@ -885,7 +970,7 @@ var ENGINE_BASE_URL = "https://releases.rivet.dev/rivet";
|
|
|
885
970
|
var ENGINE_BINARY_NAME = "rivet-engine";
|
|
886
971
|
async function ensureEngineProcess(options) {
|
|
887
972
|
importNodeDependencies();
|
|
888
|
-
|
|
973
|
+
logger3().debug({
|
|
889
974
|
msg: "ensuring engine process",
|
|
890
975
|
version: options.version
|
|
891
976
|
});
|
|
@@ -900,13 +985,13 @@ async function ensureEngineProcess(options) {
|
|
|
900
985
|
if (await isEngineRunning()) {
|
|
901
986
|
try {
|
|
902
987
|
const health = await waitForEngineHealth();
|
|
903
|
-
|
|
988
|
+
logger3().debug({
|
|
904
989
|
msg: "engine already running and healthy",
|
|
905
990
|
version: health.version
|
|
906
991
|
});
|
|
907
992
|
return;
|
|
908
993
|
} catch (error) {
|
|
909
|
-
|
|
994
|
+
logger3().warn({
|
|
910
995
|
msg: "existing engine process not healthy, cannot restart automatically",
|
|
911
996
|
error
|
|
912
997
|
});
|
|
@@ -928,7 +1013,7 @@ async function ensureEngineProcess(options) {
|
|
|
928
1013
|
const stderrStream = fsSync.createWriteStream(stderrLogPath, {
|
|
929
1014
|
flags: "a"
|
|
930
1015
|
});
|
|
931
|
-
|
|
1016
|
+
logger3().debug({
|
|
932
1017
|
msg: "creating engine log files",
|
|
933
1018
|
stdout: stdoutLogPath,
|
|
934
1019
|
stderr: stderrLogPath
|
|
@@ -985,7 +1070,7 @@ async function ensureEngineProcess(options) {
|
|
|
985
1070
|
});
|
|
986
1071
|
child.stderr.pipe(stderrStream);
|
|
987
1072
|
}
|
|
988
|
-
|
|
1073
|
+
logger3().debug({
|
|
989
1074
|
msg: "spawned engine process",
|
|
990
1075
|
pid: child.pid,
|
|
991
1076
|
cwd: path.dirname(binaryPath)
|
|
@@ -993,7 +1078,7 @@ async function ensureEngineProcess(options) {
|
|
|
993
1078
|
child.once("exit", (code, signal) => {
|
|
994
1079
|
const stderrOutput = Buffer.concat(stderrChunks).toString("utf-8");
|
|
995
1080
|
if (stderrOutput.includes("LOCK: Resource temporarily unavailable")) {
|
|
996
|
-
|
|
1081
|
+
logger3().error({
|
|
997
1082
|
msg: "another instance of rivet engine is unexpectedly running, this is an internal error",
|
|
998
1083
|
code,
|
|
999
1084
|
signal,
|
|
@@ -1003,7 +1088,7 @@ async function ensureEngineProcess(options) {
|
|
|
1003
1088
|
support: "https://rivet.dev/discord"
|
|
1004
1089
|
});
|
|
1005
1090
|
} else if (stderrOutput.includes("Rivet Engine has been rolled back to a previous version")) {
|
|
1006
|
-
|
|
1091
|
+
logger3().error({
|
|
1007
1092
|
msg: "rivet engine version downgrade detected",
|
|
1008
1093
|
hint: `You attempted to downgrade the RivetKit version in development. To fix this, nuke the database by running: '${binaryPath}' database nuke --yes`,
|
|
1009
1094
|
code,
|
|
@@ -1012,7 +1097,7 @@ async function ensureEngineProcess(options) {
|
|
|
1012
1097
|
stderrLog: stderrLogPath
|
|
1013
1098
|
});
|
|
1014
1099
|
} else {
|
|
1015
|
-
|
|
1100
|
+
logger3().warn({
|
|
1016
1101
|
msg: "engine process exited, please report this error",
|
|
1017
1102
|
code,
|
|
1018
1103
|
signal,
|
|
@@ -1026,7 +1111,7 @@ async function ensureEngineProcess(options) {
|
|
|
1026
1111
|
stderrStream.end();
|
|
1027
1112
|
});
|
|
1028
1113
|
child.once("error", (error) => {
|
|
1029
|
-
|
|
1114
|
+
logger3().error({
|
|
1030
1115
|
msg: "engine process failed",
|
|
1031
1116
|
error
|
|
1032
1117
|
});
|
|
@@ -1034,7 +1119,7 @@ async function ensureEngineProcess(options) {
|
|
|
1034
1119
|
stderrStream.end();
|
|
1035
1120
|
});
|
|
1036
1121
|
await waitForEngineHealth();
|
|
1037
|
-
|
|
1122
|
+
logger3().info({
|
|
1038
1123
|
msg: "engine process started",
|
|
1039
1124
|
pid: child.pid,
|
|
1040
1125
|
version: options.version,
|
|
@@ -1047,7 +1132,7 @@ async function ensureEngineProcess(options) {
|
|
|
1047
1132
|
async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
|
|
1048
1133
|
const binaryExists = await fileExists(binaryPath);
|
|
1049
1134
|
if (binaryExists) {
|
|
1050
|
-
|
|
1135
|
+
logger3().debug({
|
|
1051
1136
|
msg: "engine binary already cached",
|
|
1052
1137
|
version,
|
|
1053
1138
|
path: binaryPath
|
|
@@ -1057,7 +1142,7 @@ async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
|
|
|
1057
1142
|
const { targetTriplet, extension } = resolveTargetTriplet();
|
|
1058
1143
|
const remoteFile = `${ENGINE_BINARY_NAME}-${targetTriplet}${extension}`;
|
|
1059
1144
|
const downloadUrl = `${ENGINE_BASE_URL}/${version}/engine/${remoteFile}`;
|
|
1060
|
-
|
|
1145
|
+
logger3().info({
|
|
1061
1146
|
msg: "downloading engine binary",
|
|
1062
1147
|
url: downloadUrl,
|
|
1063
1148
|
path: binaryPath,
|
|
@@ -1072,13 +1157,13 @@ async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
|
|
|
1072
1157
|
const crypto2 = getNodeCrypto();
|
|
1073
1158
|
const tempPath = `${binaryPath}.${crypto2.randomUUID()}.tmp`;
|
|
1074
1159
|
const startTime = Date.now();
|
|
1075
|
-
|
|
1160
|
+
logger3().debug({
|
|
1076
1161
|
msg: "starting binary download",
|
|
1077
1162
|
tempPath,
|
|
1078
1163
|
contentLength: response.headers.get("content-length")
|
|
1079
1164
|
});
|
|
1080
1165
|
const slowDownloadWarning = setTimeout(() => {
|
|
1081
|
-
|
|
1166
|
+
logger3().warn({
|
|
1082
1167
|
msg: "engine binary download is taking longer than expected, please be patient",
|
|
1083
1168
|
version
|
|
1084
1169
|
});
|
|
@@ -1098,21 +1183,21 @@ async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
|
|
|
1098
1183
|
await fs.chmod(tempPath, 493);
|
|
1099
1184
|
}
|
|
1100
1185
|
await fs.rename(tempPath, binaryPath);
|
|
1101
|
-
|
|
1186
|
+
logger3().debug({
|
|
1102
1187
|
msg: "engine binary download complete",
|
|
1103
1188
|
version,
|
|
1104
1189
|
path: binaryPath,
|
|
1105
1190
|
size: stats.size,
|
|
1106
1191
|
durationMs: downloadDuration
|
|
1107
1192
|
});
|
|
1108
|
-
|
|
1193
|
+
logger3().info({
|
|
1109
1194
|
msg: "engine binary downloaded",
|
|
1110
1195
|
version,
|
|
1111
1196
|
path: binaryPath
|
|
1112
1197
|
});
|
|
1113
1198
|
} catch (error) {
|
|
1114
1199
|
clearTimeout(slowDownloadWarning);
|
|
1115
|
-
|
|
1200
|
+
logger3().warn({
|
|
1116
1201
|
msg: "engine download failed, please report this error",
|
|
1117
1202
|
tempPath,
|
|
1118
1203
|
error,
|
|
@@ -1174,13 +1259,13 @@ async function checkIfEngineAlreadyRunningOnPort(port) {
|
|
|
1174
1259
|
if (response.ok) {
|
|
1175
1260
|
const health = await response.json();
|
|
1176
1261
|
if (health.runtime === "engine") {
|
|
1177
|
-
|
|
1262
|
+
logger3().debug({
|
|
1178
1263
|
msg: "rivet engine already running on port",
|
|
1179
1264
|
port
|
|
1180
1265
|
});
|
|
1181
1266
|
return true;
|
|
1182
1267
|
} else if (health.runtime === "rivetkit") {
|
|
1183
|
-
|
|
1268
|
+
logger3().error({
|
|
1184
1269
|
msg: "another rivetkit process is already running on port",
|
|
1185
1270
|
port
|
|
1186
1271
|
});
|
|
@@ -1208,7 +1293,7 @@ var HEALTH_MAX_WAIT = 1e4;
|
|
|
1208
1293
|
var HEALTH_INTERVAL = 100;
|
|
1209
1294
|
async function waitForEngineHealth() {
|
|
1210
1295
|
const maxRetries = Math.ceil(HEALTH_MAX_WAIT / HEALTH_INTERVAL);
|
|
1211
|
-
|
|
1296
|
+
logger3().debug({ msg: "waiting for engine health check" });
|
|
1212
1297
|
for (let i = 0; i < maxRetries; i++) {
|
|
1213
1298
|
try {
|
|
1214
1299
|
const response = await fetch(`${ENGINE_ENDPOINT}/health`, {
|
|
@@ -1216,11 +1301,11 @@ async function waitForEngineHealth() {
|
|
|
1216
1301
|
});
|
|
1217
1302
|
if (response.ok) {
|
|
1218
1303
|
const health = await response.json();
|
|
1219
|
-
|
|
1304
|
+
logger3().debug({ msg: "engine health check passed" });
|
|
1220
1305
|
return health;
|
|
1221
1306
|
}
|
|
1222
1307
|
} catch (error) {
|
|
1223
|
-
|
|
1308
|
+
logger3().debug({ msg: "engine health check failed", error });
|
|
1224
1309
|
if (i === maxRetries - 1) {
|
|
1225
1310
|
throw new Error(
|
|
1226
1311
|
`engine health check failed after ${maxRetries} retries: ${error}`
|
|
@@ -1228,7 +1313,7 @@ async function waitForEngineHealth() {
|
|
|
1228
1313
|
}
|
|
1229
1314
|
}
|
|
1230
1315
|
if (i < maxRetries - 1) {
|
|
1231
|
-
|
|
1316
|
+
logger3().trace({
|
|
1232
1317
|
msg: "engine not ready, retrying",
|
|
1233
1318
|
attempt: i + 1,
|
|
1234
1319
|
maxRetries
|
|
@@ -1250,14 +1335,14 @@ function getInspectorUrl(config, managerPort) {
|
|
|
1250
1335
|
}
|
|
1251
1336
|
|
|
1252
1337
|
// src/serverless/log.ts
|
|
1253
|
-
function
|
|
1338
|
+
function logger4() {
|
|
1254
1339
|
return getLogger("serverless");
|
|
1255
1340
|
}
|
|
1256
1341
|
|
|
1257
1342
|
// src/serverless/configure.ts
|
|
1258
1343
|
import invariant2 from "invariant";
|
|
1259
1344
|
async function configureServerlessRunner(config) {
|
|
1260
|
-
|
|
1345
|
+
logger4().debug("configuring serverless runner");
|
|
1261
1346
|
try {
|
|
1262
1347
|
if (!config.namespace) {
|
|
1263
1348
|
throw new Error(
|
|
@@ -1272,13 +1357,13 @@ async function configureServerlessRunner(config) {
|
|
|
1272
1357
|
const customConfig = config.serverless.configureRunnerPool;
|
|
1273
1358
|
invariant2(customConfig, "configureRunnerPool should exist");
|
|
1274
1359
|
const clientConfig = convertRegistryConfigToClientConfig(config);
|
|
1275
|
-
|
|
1360
|
+
logger4().debug({
|
|
1276
1361
|
msg: "fetching datacenters",
|
|
1277
1362
|
endpoint: config.endpoint
|
|
1278
1363
|
});
|
|
1279
1364
|
const dcsRes = await getDatacenters(clientConfig);
|
|
1280
1365
|
const runnerName = customConfig.name ?? "default";
|
|
1281
|
-
|
|
1366
|
+
logger4().debug({
|
|
1282
1367
|
msg: "configuring serverless runner",
|
|
1283
1368
|
runnerName,
|
|
1284
1369
|
namespace: config.namespace
|
|
@@ -1303,143 +1388,19 @@ async function configureServerlessRunner(config) {
|
|
|
1303
1388
|
dcsRes.datacenters.map((dc) => [dc.name, serverlessConfig])
|
|
1304
1389
|
)
|
|
1305
1390
|
});
|
|
1306
|
-
|
|
1391
|
+
logger4().info({
|
|
1307
1392
|
msg: "serverless runner configured successfully",
|
|
1308
1393
|
runnerName,
|
|
1309
1394
|
namespace: config.namespace
|
|
1310
1395
|
});
|
|
1311
1396
|
} catch (error) {
|
|
1312
|
-
|
|
1397
|
+
logger4().error({
|
|
1313
1398
|
msg: "failed to configure serverless runner, validate endpoint is configured correctly then restart this process",
|
|
1314
1399
|
error
|
|
1315
1400
|
});
|
|
1316
1401
|
}
|
|
1317
1402
|
}
|
|
1318
1403
|
|
|
1319
|
-
// src/registry/log.ts
|
|
1320
|
-
function logger4() {
|
|
1321
|
-
return getLogger("registry");
|
|
1322
|
-
}
|
|
1323
|
-
|
|
1324
|
-
// src/registry/serve.ts
|
|
1325
|
-
import getPort from "get-port";
|
|
1326
|
-
var DEFAULT_PORT = 6420;
|
|
1327
|
-
async function findFreePort(startPort = DEFAULT_PORT) {
|
|
1328
|
-
function* portRange(start, count = 100) {
|
|
1329
|
-
for (let i = 0; i < count; i++) {
|
|
1330
|
-
yield start + i;
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
return getPort({ port: portRange(startPort) });
|
|
1334
|
-
}
|
|
1335
|
-
async function crossPlatformServe(config, managerPort, app) {
|
|
1336
|
-
const runtime = detectRuntime();
|
|
1337
|
-
logger4().debug({ msg: "detected runtime for serve", runtime });
|
|
1338
|
-
switch (runtime) {
|
|
1339
|
-
case "deno":
|
|
1340
|
-
return serveDeno(config, managerPort, app);
|
|
1341
|
-
case "bun":
|
|
1342
|
-
return serveBun(config, managerPort, app);
|
|
1343
|
-
case "node":
|
|
1344
|
-
return serveNode(config, managerPort, app);
|
|
1345
|
-
default:
|
|
1346
|
-
return serveNode(config, managerPort, app);
|
|
1347
|
-
}
|
|
1348
|
-
}
|
|
1349
|
-
async function serveNode(config, managerPort, app) {
|
|
1350
|
-
const nodeServerModule = "@hono/node-server";
|
|
1351
|
-
let serve;
|
|
1352
|
-
try {
|
|
1353
|
-
const dep = await import(
|
|
1354
|
-
/* webpackIgnore: true */
|
|
1355
|
-
nodeServerModule
|
|
1356
|
-
);
|
|
1357
|
-
serve = dep.serve;
|
|
1358
|
-
} catch (err) {
|
|
1359
|
-
logger4().error({
|
|
1360
|
-
msg: "failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'",
|
|
1361
|
-
error: stringifyError(err)
|
|
1362
|
-
});
|
|
1363
|
-
process.exit(1);
|
|
1364
|
-
}
|
|
1365
|
-
const nodeWsModule = "@hono/node-ws";
|
|
1366
|
-
let createNodeWebSocket;
|
|
1367
|
-
try {
|
|
1368
|
-
const dep = await import(
|
|
1369
|
-
/* webpackIgnore: true */
|
|
1370
|
-
nodeWsModule
|
|
1371
|
-
);
|
|
1372
|
-
createNodeWebSocket = dep.createNodeWebSocket;
|
|
1373
|
-
} catch (err) {
|
|
1374
|
-
logger4().error({
|
|
1375
|
-
msg: "failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'",
|
|
1376
|
-
error: stringifyError(err)
|
|
1377
|
-
});
|
|
1378
|
-
process.exit(1);
|
|
1379
|
-
}
|
|
1380
|
-
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({
|
|
1381
|
-
app
|
|
1382
|
-
});
|
|
1383
|
-
const port = managerPort;
|
|
1384
|
-
const hostname = config.managerHost;
|
|
1385
|
-
const server = serve(
|
|
1386
|
-
{ fetch: app.fetch, port, hostname },
|
|
1387
|
-
() => logger4().info({ msg: "server listening", port, hostname })
|
|
1388
|
-
);
|
|
1389
|
-
injectWebSocket(server);
|
|
1390
|
-
return { upgradeWebSocket };
|
|
1391
|
-
}
|
|
1392
|
-
async function serveDeno(config, managerPort, app) {
|
|
1393
|
-
const honoDenoModule = "hono/deno";
|
|
1394
|
-
let upgradeWebSocket;
|
|
1395
|
-
try {
|
|
1396
|
-
const dep = await import(
|
|
1397
|
-
/* webpackIgnore: true */
|
|
1398
|
-
honoDenoModule
|
|
1399
|
-
);
|
|
1400
|
-
upgradeWebSocket = dep.upgradeWebSocket;
|
|
1401
|
-
} catch (err) {
|
|
1402
|
-
logger4().error({
|
|
1403
|
-
msg: "failed to import hono/deno",
|
|
1404
|
-
error: stringifyError(err)
|
|
1405
|
-
});
|
|
1406
|
-
process.exit(1);
|
|
1407
|
-
}
|
|
1408
|
-
const port = config.managerPort;
|
|
1409
|
-
const hostname = config.managerHost;
|
|
1410
|
-
Deno.serve({ port, hostname }, app.fetch);
|
|
1411
|
-
logger4().info({ msg: "server listening", port, hostname });
|
|
1412
|
-
return { upgradeWebSocket };
|
|
1413
|
-
}
|
|
1414
|
-
async function serveBun(config, managerPort, app) {
|
|
1415
|
-
const honoBunModule = "hono/bun";
|
|
1416
|
-
let createBunWebSocket;
|
|
1417
|
-
try {
|
|
1418
|
-
const dep = await import(
|
|
1419
|
-
/* webpackIgnore: true */
|
|
1420
|
-
honoBunModule
|
|
1421
|
-
);
|
|
1422
|
-
createBunWebSocket = dep.createBunWebSocket;
|
|
1423
|
-
} catch (err) {
|
|
1424
|
-
logger4().error({
|
|
1425
|
-
msg: "failed to import hono/bun",
|
|
1426
|
-
error: stringifyError(err)
|
|
1427
|
-
});
|
|
1428
|
-
process.exit(1);
|
|
1429
|
-
}
|
|
1430
|
-
const { websocket, upgradeWebSocket } = createBunWebSocket();
|
|
1431
|
-
const port = config.managerPort;
|
|
1432
|
-
const hostname = config.managerHost;
|
|
1433
|
-
Bun.serve({
|
|
1434
|
-
fetch: app.fetch,
|
|
1435
|
-
port,
|
|
1436
|
-
hostname,
|
|
1437
|
-
websocket
|
|
1438
|
-
});
|
|
1439
|
-
logger4().info({ msg: "server listening", port, hostname });
|
|
1440
|
-
return { upgradeWebSocket };
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
1404
|
// src/serverless/router.ts
|
|
1444
1405
|
import invariant3 from "invariant";
|
|
1445
1406
|
|
|
@@ -1484,7 +1445,7 @@ function buildServerlessRouter(driverConfig, config) {
|
|
|
1484
1445
|
);
|
|
1485
1446
|
}
|
|
1486
1447
|
const { endpoint, token, totalSlots, runnerName, namespace } = parseResult.data;
|
|
1487
|
-
|
|
1448
|
+
logger4().debug({
|
|
1488
1449
|
msg: "received serverless runner start request",
|
|
1489
1450
|
endpoint,
|
|
1490
1451
|
totalSlots,
|
|
@@ -1612,7 +1573,7 @@ var Runtime = class _Runtime {
|
|
|
1612
1573
|
}
|
|
1613
1574
|
static async create(registry) {
|
|
1614
1575
|
var _a, _b, _c;
|
|
1615
|
-
|
|
1576
|
+
logger().info("rivetkit starting");
|
|
1616
1577
|
const config = registry.parseConfig();
|
|
1617
1578
|
if ((_a = config.logging) == null ? void 0 : _a.baseLogger) {
|
|
1618
1579
|
configureBaseLogger(config.logging.baseLogger);
|
|
@@ -1628,7 +1589,7 @@ var Runtime = class _Runtime {
|
|
|
1628
1589
|
let managerPort;
|
|
1629
1590
|
if (config.serverless.spawnEngine) {
|
|
1630
1591
|
managerPort = ENGINE_PORT;
|
|
1631
|
-
|
|
1592
|
+
logger().debug({
|
|
1632
1593
|
msg: "spawning engine",
|
|
1633
1594
|
version: config.serverless.engineVersion
|
|
1634
1595
|
});
|
|
@@ -1637,16 +1598,18 @@ var Runtime = class _Runtime {
|
|
|
1637
1598
|
});
|
|
1638
1599
|
} else if (config.serveManager) {
|
|
1639
1600
|
const configuredManagerPort = config.managerPort;
|
|
1601
|
+
const serveRuntime = detectRuntime();
|
|
1640
1602
|
let upgradeWebSocket;
|
|
1641
1603
|
const getUpgradeWebSocket = () => upgradeWebSocket;
|
|
1642
1604
|
managerDriver.setGetUpgradeWebSocket(getUpgradeWebSocket);
|
|
1643
1605
|
const { router: managerRouter } = buildManagerRouter(
|
|
1644
1606
|
config,
|
|
1645
1607
|
managerDriver,
|
|
1646
|
-
getUpgradeWebSocket
|
|
1608
|
+
getUpgradeWebSocket,
|
|
1609
|
+
serveRuntime
|
|
1647
1610
|
);
|
|
1648
1611
|
managerPort = await findFreePort(config.managerPort);
|
|
1649
|
-
|
|
1612
|
+
logger().debug({
|
|
1650
1613
|
msg: "serving manager",
|
|
1651
1614
|
port: managerPort
|
|
1652
1615
|
});
|
|
@@ -1658,7 +1621,8 @@ var Runtime = class _Runtime {
|
|
|
1658
1621
|
const out = await crossPlatformServe(
|
|
1659
1622
|
config,
|
|
1660
1623
|
managerPort,
|
|
1661
|
-
managerRouter
|
|
1624
|
+
managerRouter,
|
|
1625
|
+
serveRuntime
|
|
1662
1626
|
);
|
|
1663
1627
|
upgradeWebSocket = out.upgradeWebSocket;
|
|
1664
1628
|
}
|
|
@@ -1670,7 +1634,7 @@ var Runtime = class _Runtime {
|
|
|
1670
1634
|
managerPort
|
|
1671
1635
|
);
|
|
1672
1636
|
const driverLog = ((_c = managerDriver.extraStartupLog) == null ? void 0 : _c.call(managerDriver)) ?? {};
|
|
1673
|
-
|
|
1637
|
+
logger().info({
|
|
1674
1638
|
msg: "rivetkit ready",
|
|
1675
1639
|
driver: driver.name,
|
|
1676
1640
|
definitions: Object.keys(config.use).length,
|
|
@@ -1696,7 +1660,7 @@ var Runtime = class _Runtime {
|
|
|
1696
1660
|
invariant4(!this.#startKind, "Runtime already started as serverless");
|
|
1697
1661
|
this.#startKind = "runner";
|
|
1698
1662
|
if (this.#config.runner && this.#driver.autoStartActorDriver) {
|
|
1699
|
-
|
|
1663
|
+
logger().debug("starting actor driver");
|
|
1700
1664
|
const inlineClient = createClientWithDriver(
|
|
1701
1665
|
this.#managerDriver
|
|
1702
1666
|
);
|
|
@@ -1868,4 +1832,4 @@ export {
|
|
|
1868
1832
|
Registry,
|
|
1869
1833
|
setup
|
|
1870
1834
|
};
|
|
1871
|
-
//# sourceMappingURL=chunk-
|
|
1835
|
+
//# sourceMappingURL=chunk-M6H4XIF4.js.map
|