rivetkit 2.0.22-rc.1 → 2.0.22-rc.2
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/v2.ts +259 -0
- package/dist/tsup/{chunk-VJLGVVGP.cjs → chunk-5N6F5PXD.cjs} +31 -12
- package/dist/tsup/chunk-5N6F5PXD.cjs.map +1 -0
- package/dist/tsup/{chunk-BIOPK7IB.cjs → chunk-5TRXLS6X.cjs} +71 -67
- package/dist/tsup/chunk-5TRXLS6X.cjs.map +1 -0
- package/dist/tsup/{chunk-JKNDUKFI.js → chunk-7RUROQAZ.js} +36 -16
- package/dist/tsup/chunk-7RUROQAZ.js.map +1 -0
- package/dist/tsup/{chunk-FETQGZN4.js → chunk-AMK3AACS.js} +272 -89
- package/dist/tsup/chunk-AMK3AACS.js.map +1 -0
- package/dist/tsup/{chunk-I7EJWHYV.js → chunk-BHLQTKOD.js} +51 -47
- package/dist/tsup/chunk-BHLQTKOD.js.map +1 -0
- package/dist/tsup/{chunk-RPI45FGS.js → chunk-C4FPCW7T.js} +2 -2
- package/dist/tsup/{chunk-ZVEDMBFT.js → chunk-CVLO2OOK.js} +3 -3
- package/dist/tsup/{chunk-NDLOG2JH.js → chunk-EJXZYQ3N.js} +2 -2
- package/dist/tsup/{chunk-UBCUW7HD.js → chunk-F7WVJXPB.js} +2 -2
- package/dist/tsup/{chunk-JN6GPVFY.js → chunk-FLVL7RGH.js} +3 -3
- package/dist/tsup/{chunk-PELXJCJS.cjs → chunk-GXIO5YOT.cjs} +8 -8
- package/dist/tsup/{chunk-PELXJCJS.cjs.map → chunk-GXIO5YOT.cjs.map} +1 -1
- package/dist/tsup/{chunk-4B25D5OW.js → chunk-HLZT5C6A.js} +385 -104
- package/dist/tsup/chunk-HLZT5C6A.js.map +1 -0
- package/dist/tsup/{chunk-ZZYMCYAY.cjs → chunk-LFP446KS.cjs} +14 -14
- package/dist/tsup/{chunk-ZZYMCYAY.cjs.map → chunk-LFP446KS.cjs.map} +1 -1
- package/dist/tsup/{chunk-EEXX243L.js → chunk-MQDXPGNE.js} +6 -6
- package/dist/tsup/{chunk-5EB77IQ2.cjs → chunk-NDOG6IQ5.cjs} +6 -6
- package/dist/tsup/{chunk-5EB77IQ2.cjs.map → chunk-NDOG6IQ5.cjs.map} +1 -1
- package/dist/tsup/{chunk-R6XOZKMU.cjs → chunk-Q5CAVEKC.cjs} +467 -284
- package/dist/tsup/chunk-Q5CAVEKC.cjs.map +1 -0
- package/dist/tsup/{chunk-7FEMVD3D.cjs → chunk-UBMUBNS2.cjs} +12 -12
- package/dist/tsup/{chunk-7FEMVD3D.cjs.map → chunk-UBMUBNS2.cjs.map} +1 -1
- package/dist/tsup/{chunk-GJPOIJHZ.js → chunk-VMFBKBJL.js} +26 -7
- package/dist/tsup/chunk-VMFBKBJL.js.map +1 -0
- package/dist/tsup/{chunk-OAB7ECAB.cjs → chunk-YLWF6RFL.cjs} +558 -277
- package/dist/tsup/chunk-YLWF6RFL.cjs.map +1 -0
- package/dist/tsup/{chunk-6Z3YA6QR.cjs → chunk-YUBR6XCJ.cjs} +35 -15
- package/dist/tsup/chunk-YUBR6XCJ.cjs.map +1 -0
- package/dist/tsup/{chunk-LCQDY73V.cjs → chunk-ZL6NSKF2.cjs} +3 -3
- package/dist/tsup/{chunk-LCQDY73V.cjs.map → chunk-ZL6NSKF2.cjs.map} +1 -1
- package/dist/tsup/{chunk-C2U6KGOG.cjs → chunk-ZY4DKLMT.cjs} +3 -3
- package/dist/tsup/{chunk-C2U6KGOG.cjs.map → chunk-ZY4DKLMT.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +9 -9
- package/dist/tsup/client/mod.d.cts +2 -2
- package/dist/tsup/client/mod.d.ts +2 -2
- 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/{conn-Clu655RU.d.ts → conn-BYXlxnh0.d.ts} +111 -102
- package/dist/tsup/{conn-lUvFLo_q.d.cts → conn-BiazosE_.d.cts} +111 -102
- package/dist/tsup/driver-helpers/mod.cjs +5 -5
- package/dist/tsup/driver-helpers/mod.d.cts +1 -1
- package/dist/tsup/driver-helpers/mod.d.ts +1 -1
- package/dist/tsup/driver-helpers/mod.js +4 -4
- package/dist/tsup/driver-test-suite/mod.cjs +71 -71
- package/dist/tsup/driver-test-suite/mod.d.cts +1 -1
- package/dist/tsup/driver-test-suite/mod.d.ts +1 -1
- package/dist/tsup/driver-test-suite/mod.js +11 -11
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.d.cts +2 -2
- package/dist/tsup/inspector/mod.d.ts +2 -2
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/mod.cjs +10 -10
- package/dist/tsup/mod.d.cts +3 -3
- package/dist/tsup/mod.d.ts +3 -3
- package/dist/tsup/mod.js +9 -9
- package/dist/tsup/test/mod.cjs +11 -11
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +10 -10
- package/dist/tsup/utils.cjs +8 -2
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +8 -1
- package/dist/tsup/utils.d.ts +8 -1
- package/dist/tsup/utils.js +7 -1
- package/package.json +5 -4
- package/src/actor/config.ts +10 -0
- package/src/actor/conn-drivers.ts +43 -1
- package/src/actor/conn-socket.ts +1 -1
- package/src/actor/conn.ts +22 -2
- package/src/actor/context.ts +1 -1
- package/src/actor/driver.ts +13 -2
- package/src/actor/instance.ts +248 -57
- package/src/actor/persisted.ts +7 -0
- package/src/actor/router-endpoints.ts +67 -45
- package/src/actor/router.ts +25 -17
- package/src/client/actor-conn.ts +9 -5
- package/src/common/cors.ts +57 -0
- package/src/common/log.ts +26 -5
- package/src/common/utils.ts +5 -9
- package/src/common/websocket-interface.ts +10 -0
- package/src/driver-helpers/utils.ts +1 -0
- package/src/drivers/engine/actor-driver.ts +261 -14
- package/src/drivers/engine/config.ts +2 -4
- package/src/drivers/file-system/actor.ts +3 -2
- package/src/drivers/file-system/global-state.ts +1 -1
- package/src/drivers/file-system/manager.ts +3 -0
- package/src/engine-process/mod.ts +22 -4
- package/src/inspector/config.ts +0 -45
- package/src/manager/gateway.ts +45 -32
- package/src/manager/hono-websocket-adapter.ts +31 -3
- package/src/manager/router.ts +11 -17
- package/src/registry/run-config.ts +2 -8
- package/src/remote-manager-driver/actor-http-client.ts +5 -8
- package/src/remote-manager-driver/actor-websocket-client.ts +2 -14
- package/src/remote-manager-driver/mod.ts +0 -1
- package/src/schemas/actor-persist/mod.ts +1 -1
- package/src/schemas/actor-persist/versioned.ts +22 -10
- package/src/utils.ts +26 -0
- package/dist/tsup/chunk-4B25D5OW.js.map +0 -1
- package/dist/tsup/chunk-6Z3YA6QR.cjs.map +0 -1
- package/dist/tsup/chunk-BIOPK7IB.cjs.map +0 -1
- package/dist/tsup/chunk-FETQGZN4.js.map +0 -1
- package/dist/tsup/chunk-GJPOIJHZ.js.map +0 -1
- package/dist/tsup/chunk-I7EJWHYV.js.map +0 -1
- package/dist/tsup/chunk-JKNDUKFI.js.map +0 -1
- package/dist/tsup/chunk-OAB7ECAB.cjs.map +0 -1
- package/dist/tsup/chunk-R6XOZKMU.cjs.map +0 -1
- package/dist/tsup/chunk-VJLGVVGP.cjs.map +0 -1
- /package/dist/tsup/{chunk-RPI45FGS.js.map → chunk-C4FPCW7T.js.map} +0 -0
- /package/dist/tsup/{chunk-ZVEDMBFT.js.map → chunk-CVLO2OOK.js.map} +0 -0
- /package/dist/tsup/{chunk-NDLOG2JH.js.map → chunk-EJXZYQ3N.js.map} +0 -0
- /package/dist/tsup/{chunk-UBCUW7HD.js.map → chunk-F7WVJXPB.js.map} +0 -0
- /package/dist/tsup/{chunk-JN6GPVFY.js.map → chunk-FLVL7RGH.js.map} +0 -0
- /package/dist/tsup/{chunk-EEXX243L.js.map → chunk-MQDXPGNE.js.map} +0 -0
|
@@ -4,23 +4,24 @@ import {
|
|
|
4
4
|
inspectorLogger,
|
|
5
5
|
isInspectorEnabled,
|
|
6
6
|
secureInspector
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EJXZYQ3N.js";
|
|
8
8
|
import {
|
|
9
9
|
ActorDefinition,
|
|
10
|
+
PERSIST_SYMBOL,
|
|
10
11
|
RemoteManagerDriver,
|
|
11
12
|
createActorInspectorRouter,
|
|
12
13
|
createClientWithDriver,
|
|
13
14
|
deserializeActorKey,
|
|
14
|
-
|
|
15
|
+
generateConnRequestId,
|
|
15
16
|
getDatacenters,
|
|
16
17
|
getEndpoint,
|
|
17
18
|
lookupInRegistry,
|
|
18
19
|
serializeActorKey,
|
|
19
20
|
updateRunnerConfig
|
|
20
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-AMK3AACS.js";
|
|
21
22
|
import {
|
|
22
23
|
CreateActorSchema
|
|
23
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-C4FPCW7T.js";
|
|
24
25
|
import {
|
|
25
26
|
ActionContext,
|
|
26
27
|
ClientConfigSchema,
|
|
@@ -32,7 +33,7 @@ import {
|
|
|
32
33
|
createVersionedDataHandler,
|
|
33
34
|
parseMessage,
|
|
34
35
|
serializeEmptyPersistData
|
|
35
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-BHLQTKOD.js";
|
|
36
37
|
import {
|
|
37
38
|
EncodingSchema,
|
|
38
39
|
HEADER_ACTOR_ID,
|
|
@@ -58,24 +59,27 @@ import {
|
|
|
58
59
|
generateRandomString,
|
|
59
60
|
loggerWithoutContext,
|
|
60
61
|
serializeWithEncoding
|
|
61
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-CVLO2OOK.js";
|
|
62
63
|
import {
|
|
63
64
|
configureBaseLogger,
|
|
64
65
|
configureDefaultLogger,
|
|
65
66
|
getLogger
|
|
66
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-VMFBKBJL.js";
|
|
67
68
|
import {
|
|
69
|
+
EXTRA_ERROR_LOG,
|
|
68
70
|
VERSION,
|
|
71
|
+
arrayBuffersEqual,
|
|
69
72
|
assertUnreachable,
|
|
70
73
|
bufferToArrayBuffer,
|
|
71
74
|
deconstructError,
|
|
72
75
|
getEnvUniversal,
|
|
76
|
+
idToStr,
|
|
73
77
|
noopNext,
|
|
74
78
|
package_default,
|
|
75
79
|
promiseWithResolvers,
|
|
76
80
|
setLongTimeout,
|
|
77
81
|
stringifyError
|
|
78
|
-
} from "./chunk-
|
|
82
|
+
} from "./chunk-7RUROQAZ.js";
|
|
79
83
|
import {
|
|
80
84
|
ActorAlreadyExists,
|
|
81
85
|
ConnNotFound,
|
|
@@ -124,7 +128,12 @@ var ActorConfigSchema = z.object({
|
|
|
124
128
|
connectionLivenessTimeout: z.number().positive().default(2500),
|
|
125
129
|
connectionLivenessInterval: z.number().positive().default(5e3),
|
|
126
130
|
noSleep: z.boolean().default(false),
|
|
127
|
-
sleepTimeout: z.number().positive().default(3e4)
|
|
131
|
+
sleepTimeout: z.number().positive().default(3e4),
|
|
132
|
+
/** @experimental */
|
|
133
|
+
canHibernatWebSocket: z.union([
|
|
134
|
+
z.boolean(),
|
|
135
|
+
z.function().args(z.custom()).returns(z.boolean())
|
|
136
|
+
]).default(false)
|
|
128
137
|
}).strict().default({})
|
|
129
138
|
}).strict().refine(
|
|
130
139
|
(data) => !(data.state !== void 0 && data.createState !== void 0),
|
|
@@ -148,7 +157,6 @@ var ActorConfigSchema = z.object({
|
|
|
148
157
|
|
|
149
158
|
// src/actor/router.ts
|
|
150
159
|
import { Hono } from "hono";
|
|
151
|
-
import { cors } from "hono/cors";
|
|
152
160
|
import invariant2 from "invariant";
|
|
153
161
|
|
|
154
162
|
// src/actor/router-endpoints.ts
|
|
@@ -174,11 +182,19 @@ var HonoWebSocketAdapter = class {
|
|
|
174
182
|
#eventListeners = /* @__PURE__ */ new Map();
|
|
175
183
|
#closeCode;
|
|
176
184
|
#closeReason;
|
|
177
|
-
|
|
185
|
+
rivetRequestId;
|
|
186
|
+
isHibernatable;
|
|
187
|
+
constructor(ws, rivetRequestId, isHibernatable) {
|
|
178
188
|
this.#ws = ws;
|
|
189
|
+
this.rivetRequestId = rivetRequestId;
|
|
190
|
+
this.isHibernatable = isHibernatable;
|
|
179
191
|
this.#readyState = this.OPEN;
|
|
180
192
|
setTimeout(() => {
|
|
181
|
-
this.#fireEvent("open", {
|
|
193
|
+
this.#fireEvent("open", {
|
|
194
|
+
type: "open",
|
|
195
|
+
target: this,
|
|
196
|
+
rivetRequestId: this.rivetRequestId
|
|
197
|
+
});
|
|
182
198
|
}, 0);
|
|
183
199
|
}
|
|
184
200
|
get readyState() {
|
|
@@ -272,7 +288,8 @@ var HonoWebSocketAdapter = class {
|
|
|
272
288
|
target: this,
|
|
273
289
|
code,
|
|
274
290
|
reason,
|
|
275
|
-
wasClean: code === 1e3
|
|
291
|
+
wasClean: code === 1e3,
|
|
292
|
+
rivetRequestId: this.rivetRequestId
|
|
276
293
|
});
|
|
277
294
|
} catch (error) {
|
|
278
295
|
logger().error({ msg: "error closing websocket", error });
|
|
@@ -282,7 +299,8 @@ var HonoWebSocketAdapter = class {
|
|
|
282
299
|
target: this,
|
|
283
300
|
code: 1006,
|
|
284
301
|
reason: "Abnormal closure",
|
|
285
|
-
wasClean: false
|
|
302
|
+
wasClean: false,
|
|
303
|
+
rivetRequestId: this.rivetRequestId
|
|
286
304
|
});
|
|
287
305
|
}
|
|
288
306
|
}
|
|
@@ -317,12 +335,20 @@ var HonoWebSocketAdapter = class {
|
|
|
317
335
|
// Internal method to handle incoming messages from WSContext
|
|
318
336
|
_handleMessage(data) {
|
|
319
337
|
let messageData;
|
|
338
|
+
let rivetRequestId;
|
|
339
|
+
let rivetMessageIndex;
|
|
320
340
|
if (typeof data === "string") {
|
|
321
341
|
messageData = data;
|
|
322
342
|
} else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
|
|
323
343
|
messageData = data;
|
|
324
344
|
} else if (data && typeof data === "object" && "data" in data) {
|
|
325
345
|
messageData = data.data;
|
|
346
|
+
if ("rivetRequestId" in data) {
|
|
347
|
+
rivetRequestId = data.rivetRequestId;
|
|
348
|
+
}
|
|
349
|
+
if ("rivetMessageIndex" in data) {
|
|
350
|
+
rivetMessageIndex = data.rivetMessageIndex;
|
|
351
|
+
}
|
|
326
352
|
} else {
|
|
327
353
|
messageData = String(data);
|
|
328
354
|
}
|
|
@@ -330,12 +356,15 @@ var HonoWebSocketAdapter = class {
|
|
|
330
356
|
msg: "bridge handling message",
|
|
331
357
|
dataType: typeof messageData,
|
|
332
358
|
isArrayBuffer: messageData instanceof ArrayBuffer,
|
|
333
|
-
dataStr: typeof messageData === "string" ? messageData : "<binary>"
|
|
359
|
+
dataStr: typeof messageData === "string" ? messageData : "<binary>",
|
|
360
|
+
rivetMessageIndex
|
|
334
361
|
});
|
|
335
362
|
this.#fireEvent("message", {
|
|
336
363
|
type: "message",
|
|
337
364
|
target: this,
|
|
338
|
-
data: messageData
|
|
365
|
+
data: messageData,
|
|
366
|
+
rivetRequestId,
|
|
367
|
+
rivetMessageIndex
|
|
339
368
|
});
|
|
340
369
|
}
|
|
341
370
|
// Internal method to handle close from WSContext
|
|
@@ -350,7 +379,8 @@ var HonoWebSocketAdapter = class {
|
|
|
350
379
|
target: this,
|
|
351
380
|
code,
|
|
352
381
|
reason,
|
|
353
|
-
wasClean: code === 1e3
|
|
382
|
+
wasClean: code === 1e3,
|
|
383
|
+
rivetRequestId: this.rivetRequestId
|
|
354
384
|
});
|
|
355
385
|
}
|
|
356
386
|
// Internal method to handle errors from WSContext
|
|
@@ -459,7 +489,7 @@ var HonoWebSocketAdapter = class {
|
|
|
459
489
|
|
|
460
490
|
// src/actor/router-endpoints.ts
|
|
461
491
|
var SSE_PING_INTERVAL = 1e3;
|
|
462
|
-
async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, encoding, parameters, connId, connToken) {
|
|
492
|
+
async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, encoding, parameters, requestId, connId, connToken) {
|
|
463
493
|
const exposeInternalError = req ? getRequestExposeInternalError(req) : false;
|
|
464
494
|
const {
|
|
465
495
|
promise: handlersPromise,
|
|
@@ -492,7 +522,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
|
|
|
492
522
|
};
|
|
493
523
|
}
|
|
494
524
|
const closePromise = promiseWithResolvers();
|
|
495
|
-
|
|
525
|
+
let createdConn;
|
|
496
526
|
return {
|
|
497
527
|
onOpen: (_evt, ws) => {
|
|
498
528
|
actor2.rLog.debug("actor websocket open");
|
|
@@ -506,7 +536,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
|
|
|
506
536
|
});
|
|
507
537
|
conn = await actor2.createConn(
|
|
508
538
|
{
|
|
509
|
-
|
|
539
|
+
requestId,
|
|
510
540
|
driverState: {
|
|
511
541
|
[0 /* WEBSOCKET */]: {
|
|
512
542
|
encoding,
|
|
@@ -520,6 +550,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
|
|
|
520
550
|
connId,
|
|
521
551
|
connToken
|
|
522
552
|
);
|
|
553
|
+
createdConn = conn;
|
|
523
554
|
handlersResolve({ conn, actor: actor2, connId: conn.id });
|
|
524
555
|
} catch (error) {
|
|
525
556
|
handlersReject(error);
|
|
@@ -596,16 +627,11 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
|
|
|
596
627
|
});
|
|
597
628
|
}
|
|
598
629
|
ws.close(1e3, "hack_force_close");
|
|
599
|
-
handlersPromise.
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
error,
|
|
605
|
-
actor2.rLog,
|
|
606
|
-
{ wsEvent: "close" },
|
|
607
|
-
exposeInternalError
|
|
608
|
-
);
|
|
630
|
+
handlersPromise.finally(() => {
|
|
631
|
+
if (createdConn) {
|
|
632
|
+
const wasClean = event.wasClean || event.code === 1e3;
|
|
633
|
+
actor2.__connDisconnected(createdConn, wasClean, requestId);
|
|
634
|
+
}
|
|
609
635
|
});
|
|
610
636
|
},
|
|
611
637
|
onError: (_error) => {
|
|
@@ -626,7 +652,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
|
|
|
626
652
|
c.header("Content-Encoding", "Identity");
|
|
627
653
|
const encoding = getRequestEncoding(c.req);
|
|
628
654
|
const parameters = getRequestConnParams(c.req);
|
|
629
|
-
const
|
|
655
|
+
const requestId = generateConnRequestId();
|
|
630
656
|
const connId = c.req.header(HEADER_CONN_ID);
|
|
631
657
|
const connToken = c.req.header(HEADER_CONN_TOKEN);
|
|
632
658
|
return streamSSE(c, async (stream) => {
|
|
@@ -640,7 +666,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
|
|
|
640
666
|
});
|
|
641
667
|
conn = await actor2.createConn(
|
|
642
668
|
{
|
|
643
|
-
|
|
669
|
+
requestId,
|
|
644
670
|
driverState: {
|
|
645
671
|
[1 /* SSE */]: {
|
|
646
672
|
encoding,
|
|
@@ -662,7 +688,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
|
|
|
662
688
|
try {
|
|
663
689
|
rLog.debug("sse stream aborted");
|
|
664
690
|
if (conn) {
|
|
665
|
-
actor2.__connDisconnected(conn, false,
|
|
691
|
+
actor2.__connDisconnected(conn, false, requestId);
|
|
666
692
|
}
|
|
667
693
|
abortResolver.resolve(void 0);
|
|
668
694
|
} catch (error) {
|
|
@@ -688,7 +714,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
|
|
|
688
714
|
error
|
|
689
715
|
});
|
|
690
716
|
if (conn && actor2 !== void 0) {
|
|
691
|
-
actor2.__connDisconnected(conn, false,
|
|
717
|
+
actor2.__connDisconnected(conn, false, requestId);
|
|
692
718
|
}
|
|
693
719
|
stream.close();
|
|
694
720
|
}
|
|
@@ -704,7 +730,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
|
|
|
704
730
|
HTTP_ACTION_REQUEST_VERSIONED
|
|
705
731
|
);
|
|
706
732
|
const actionArgs = cbor.decode(new Uint8Array(request.args));
|
|
707
|
-
const
|
|
733
|
+
const requestId = generateConnRequestId();
|
|
708
734
|
let actor2;
|
|
709
735
|
let conn;
|
|
710
736
|
let output;
|
|
@@ -713,7 +739,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
|
|
|
713
739
|
actor2.rLog.debug({ msg: "handling action", actionName, encoding });
|
|
714
740
|
conn = await actor2.createConn(
|
|
715
741
|
{
|
|
716
|
-
|
|
742
|
+
requestId,
|
|
717
743
|
driverState: { [2 /* HTTP */]: {} }
|
|
718
744
|
},
|
|
719
745
|
parameters,
|
|
@@ -723,7 +749,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
|
|
|
723
749
|
output = await actor2.executeAction(ctx, actionName, actionArgs);
|
|
724
750
|
} finally {
|
|
725
751
|
if (conn) {
|
|
726
|
-
actor2 == null ? void 0 : actor2.__connDisconnected(conn, true,
|
|
752
|
+
actor2 == null ? void 0 : actor2.__connDisconnected(conn, true, requestId);
|
|
727
753
|
}
|
|
728
754
|
}
|
|
729
755
|
const responseData = {
|
|
@@ -778,27 +804,30 @@ async function handleConnectionClose(c, _runConfig, actorDriver, connId, connTok
|
|
|
778
804
|
async function handleRawWebSocketHandler(req, path4, actorDriver, actorId) {
|
|
779
805
|
const actor2 = await actorDriver.loadActor(actorId);
|
|
780
806
|
return {
|
|
781
|
-
onOpen: (
|
|
782
|
-
const
|
|
807
|
+
onOpen: (evt, ws) => {
|
|
808
|
+
const rivetRequestId = evt == null ? void 0 : evt.rivetRequestId;
|
|
809
|
+
const isHibernatable = actor2[PERSIST_SYMBOL].hibernatableWebSocket.findIndex(
|
|
810
|
+
(ws2) => arrayBuffersEqual(ws2.requestId, rivetRequestId)
|
|
811
|
+
) !== -1;
|
|
812
|
+
const adapter = new HonoWebSocketAdapter(
|
|
813
|
+
ws,
|
|
814
|
+
rivetRequestId,
|
|
815
|
+
isHibernatable
|
|
816
|
+
);
|
|
783
817
|
ws.__adapter = adapter;
|
|
784
|
-
const
|
|
785
|
-
const pathname = url.pathname.replace(/^\/raw\/websocket\/?/, "") || "/";
|
|
786
|
-
const normalizedPath = (pathname.startsWith("/") ? pathname : "/" + pathname) + url.search;
|
|
818
|
+
const newPath = truncateRawWebSocketPathPrefix(path4);
|
|
787
819
|
let newRequest;
|
|
788
820
|
if (req) {
|
|
789
|
-
newRequest = new Request(`http://actor${
|
|
821
|
+
newRequest = new Request(`http://actor${newPath}`, req);
|
|
790
822
|
} else {
|
|
791
|
-
newRequest = new Request(`http://actor${
|
|
823
|
+
newRequest = new Request(`http://actor${newPath}`, {
|
|
792
824
|
method: "GET"
|
|
793
825
|
});
|
|
794
826
|
}
|
|
795
827
|
actor2.rLog.debug({
|
|
796
828
|
msg: "rewriting websocket url",
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
pathname: url.pathname,
|
|
800
|
-
search: url.search,
|
|
801
|
-
normalizedPath
|
|
829
|
+
fromPath: path4,
|
|
830
|
+
toUrl: newRequest.url
|
|
802
831
|
});
|
|
803
832
|
actor2.handleWebSocket(adapter, {
|
|
804
833
|
request: newRequest
|
|
@@ -851,6 +880,12 @@ function getRequestConnParams(req) {
|
|
|
851
880
|
);
|
|
852
881
|
}
|
|
853
882
|
}
|
|
883
|
+
function truncateRawWebSocketPathPrefix(path4) {
|
|
884
|
+
const url = new URL(path4, "http://actor");
|
|
885
|
+
const pathname = url.pathname.replace(/^\/raw\/websocket\/?/, "") || "/";
|
|
886
|
+
const normalizedPath = (pathname.startsWith("/") ? pathname : "/" + pathname) + url.search;
|
|
887
|
+
return normalizedPath;
|
|
888
|
+
}
|
|
854
889
|
|
|
855
890
|
// src/common/router.ts
|
|
856
891
|
import * as cbor2 from "cbor-x";
|
|
@@ -963,6 +998,15 @@ function createActorRouter(runConfig, actorDriver, isTest) {
|
|
|
963
998
|
strict: false
|
|
964
999
|
});
|
|
965
1000
|
router.use("*", loggerMiddleware(loggerWithoutContext()));
|
|
1001
|
+
router.use("*", async (c, next) => {
|
|
1002
|
+
const actor2 = await actorDriver.loadActor(c.env.actorId);
|
|
1003
|
+
actor2.__beginHonoHttpRequest();
|
|
1004
|
+
try {
|
|
1005
|
+
await next();
|
|
1006
|
+
} finally {
|
|
1007
|
+
actor2.__endHonoHttpRequest();
|
|
1008
|
+
}
|
|
1009
|
+
});
|
|
966
1010
|
router.get("/", (c) => {
|
|
967
1011
|
return c.text(
|
|
968
1012
|
"This is an RivetKit actor.\n\nLearn more at https://rivetkit.org"
|
|
@@ -1036,6 +1080,7 @@ function createActorRouter(runConfig, actorDriver, isTest) {
|
|
|
1036
1080
|
c2.env.actorId,
|
|
1037
1081
|
encoding,
|
|
1038
1082
|
connParams,
|
|
1083
|
+
generateConnRequestId(),
|
|
1039
1084
|
connIdRaw,
|
|
1040
1085
|
connTokenRaw
|
|
1041
1086
|
);
|
|
@@ -1143,19 +1188,15 @@ function createActorRouter(runConfig, actorDriver, isTest) {
|
|
|
1143
1188
|
if (isInspectorEnabled(runConfig, "actor")) {
|
|
1144
1189
|
router.route(
|
|
1145
1190
|
"/inspect",
|
|
1146
|
-
new Hono().use(
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
c.set("inspector", inspector);
|
|
1156
|
-
return next();
|
|
1157
|
-
}
|
|
1158
|
-
).route("/", createActorInspectorRouter())
|
|
1191
|
+
new Hono().use(secureInspector(runConfig), async (c, next) => {
|
|
1192
|
+
const inspector = (await actorDriver.loadActor(c.env.actorId)).inspector;
|
|
1193
|
+
invariant2(
|
|
1194
|
+
inspector,
|
|
1195
|
+
"inspector not supported on this platform"
|
|
1196
|
+
);
|
|
1197
|
+
c.set("inspector", inspector);
|
|
1198
|
+
return next();
|
|
1199
|
+
}).route("/", createActorInspectorRouter())
|
|
1159
1200
|
);
|
|
1160
1201
|
}
|
|
1161
1202
|
router.notFound(handleRouteNotFound);
|
|
@@ -1539,6 +1580,7 @@ function logger4() {
|
|
|
1539
1580
|
}
|
|
1540
1581
|
|
|
1541
1582
|
// src/drivers/engine/actor-driver.ts
|
|
1583
|
+
var RUNNER_SSE_PING_INTERVAL = 1e3;
|
|
1542
1584
|
var EngineActorDriver = class {
|
|
1543
1585
|
#registryConfig;
|
|
1544
1586
|
#runConfig;
|
|
@@ -1552,12 +1594,16 @@ var EngineActorDriver = class {
|
|
|
1552
1594
|
#alarmTimeout;
|
|
1553
1595
|
#runnerStarted = promiseWithResolvers();
|
|
1554
1596
|
#runnerStopped = promiseWithResolvers();
|
|
1597
|
+
#isRunnerStopped = false;
|
|
1598
|
+
// WebSocket message acknowledgment debouncing
|
|
1599
|
+
#wsAckQueue = /* @__PURE__ */ new Map();
|
|
1600
|
+
#wsAckFlushInterval;
|
|
1555
1601
|
constructor(registryConfig, runConfig, managerDriver, inlineClient) {
|
|
1556
1602
|
this.#registryConfig = registryConfig;
|
|
1557
1603
|
this.#runConfig = runConfig;
|
|
1558
1604
|
this.#managerDriver = managerDriver;
|
|
1559
1605
|
this.#inlineClient = inlineClient;
|
|
1560
|
-
const token = runConfig.token
|
|
1606
|
+
const token = runConfig.token;
|
|
1561
1607
|
if (token && runConfig.inspector && runConfig.inspector.enabled) {
|
|
1562
1608
|
runConfig.inspector.token = () => token;
|
|
1563
1609
|
}
|
|
@@ -1571,10 +1617,10 @@ var EngineActorDriver = class {
|
|
|
1571
1617
|
version: this.#version,
|
|
1572
1618
|
endpoint: getEndpoint(runConfig),
|
|
1573
1619
|
token,
|
|
1574
|
-
namespace: runConfig.namespace
|
|
1575
|
-
totalSlots: runConfig.totalSlots
|
|
1576
|
-
runnerName: runConfig.runnerName
|
|
1577
|
-
runnerKey: runConfig.runnerKey,
|
|
1620
|
+
namespace: runConfig.namespace,
|
|
1621
|
+
totalSlots: runConfig.totalSlots,
|
|
1622
|
+
runnerName: runConfig.runnerName,
|
|
1623
|
+
runnerKey: runConfig.runnerKey ?? crypto.randomUUID(),
|
|
1578
1624
|
metadata: {
|
|
1579
1625
|
inspectorToken: this.#runConfig.inspector.token()
|
|
1580
1626
|
},
|
|
@@ -1595,22 +1641,126 @@ var EngineActorDriver = class {
|
|
|
1595
1641
|
}
|
|
1596
1642
|
this.#runnerStarted.resolve(void 0);
|
|
1597
1643
|
},
|
|
1598
|
-
onDisconnected: () => {
|
|
1644
|
+
onDisconnected: (code, reason) => {
|
|
1599
1645
|
logger4().warn({
|
|
1600
1646
|
msg: "runner disconnected",
|
|
1601
1647
|
namespace: this.#runConfig.namespace,
|
|
1602
|
-
runnerName: this.#runConfig.runnerName
|
|
1648
|
+
runnerName: this.#runConfig.runnerName,
|
|
1649
|
+
code,
|
|
1650
|
+
reason
|
|
1603
1651
|
});
|
|
1604
1652
|
hasDisconnected = true;
|
|
1605
1653
|
},
|
|
1606
1654
|
onShutdown: () => {
|
|
1607
1655
|
this.#runnerStopped.resolve(void 0);
|
|
1656
|
+
this.#isRunnerStopped = true;
|
|
1608
1657
|
},
|
|
1609
1658
|
fetch: this.#runnerFetch.bind(this),
|
|
1610
1659
|
websocket: this.#runnerWebSocket.bind(this),
|
|
1611
1660
|
onActorStart: this.#runnerOnActorStart.bind(this),
|
|
1612
1661
|
onActorStop: this.#runnerOnActorStop.bind(this),
|
|
1613
|
-
logger: getLogger("engine-runner")
|
|
1662
|
+
logger: getLogger("engine-runner"),
|
|
1663
|
+
getActorHibernationConfig: (actorId, requestId, request) => {
|
|
1664
|
+
var _a;
|
|
1665
|
+
const url = new URL(request.url);
|
|
1666
|
+
const path4 = url.pathname;
|
|
1667
|
+
const actorInstance = this.#runner.getActor(actorId);
|
|
1668
|
+
if (!actorInstance) {
|
|
1669
|
+
logger4().warn({
|
|
1670
|
+
msg: "actor not found in getActorHibernationConfig",
|
|
1671
|
+
actorId
|
|
1672
|
+
});
|
|
1673
|
+
return { enabled: false, lastMsgIndex: void 0 };
|
|
1674
|
+
}
|
|
1675
|
+
const handler = this.#actors.get(actorId);
|
|
1676
|
+
if (!handler) {
|
|
1677
|
+
logger4().warn({
|
|
1678
|
+
msg: "actor handler not found in getActorHibernationConfig",
|
|
1679
|
+
actorId
|
|
1680
|
+
});
|
|
1681
|
+
return { enabled: false, lastMsgIndex: void 0 };
|
|
1682
|
+
}
|
|
1683
|
+
if (!handler.actor) {
|
|
1684
|
+
logger4().warn({
|
|
1685
|
+
msg: "actor not found in getActorHibernationConfig",
|
|
1686
|
+
actorId
|
|
1687
|
+
});
|
|
1688
|
+
return { enabled: false, lastMsgIndex: void 0 };
|
|
1689
|
+
}
|
|
1690
|
+
const existingWs = handler.actor[PERSIST_SYMBOL].hibernatableWebSocket.find(
|
|
1691
|
+
(ws) => arrayBuffersEqual(ws.requestId, requestId)
|
|
1692
|
+
);
|
|
1693
|
+
let hibernationConfig;
|
|
1694
|
+
if (existingWs) {
|
|
1695
|
+
hibernationConfig = {
|
|
1696
|
+
enabled: true,
|
|
1697
|
+
lastMsgIndex: Number(existingWs.msgIndex)
|
|
1698
|
+
};
|
|
1699
|
+
} else {
|
|
1700
|
+
if (path4 === PATH_CONNECT_WEBSOCKET) {
|
|
1701
|
+
hibernationConfig = {
|
|
1702
|
+
enabled: true,
|
|
1703
|
+
lastMsgIndex: void 0
|
|
1704
|
+
};
|
|
1705
|
+
} else if (path4.startsWith(PATH_RAW_WEBSOCKET_PREFIX)) {
|
|
1706
|
+
const definition = lookupInRegistry(
|
|
1707
|
+
this.#registryConfig,
|
|
1708
|
+
actorInstance.config.name
|
|
1709
|
+
);
|
|
1710
|
+
const canHibernatWebSocket = (_a = definition.config.options) == null ? void 0 : _a.canHibernatWebSocket;
|
|
1711
|
+
if (canHibernatWebSocket === true) {
|
|
1712
|
+
hibernationConfig = {
|
|
1713
|
+
enabled: true,
|
|
1714
|
+
lastMsgIndex: void 0
|
|
1715
|
+
};
|
|
1716
|
+
} else if (typeof canHibernatWebSocket === "function") {
|
|
1717
|
+
try {
|
|
1718
|
+
const newPath = truncateRawWebSocketPathPrefix(
|
|
1719
|
+
url.pathname
|
|
1720
|
+
);
|
|
1721
|
+
const truncatedRequest = new Request(
|
|
1722
|
+
`http://actor${newPath}`,
|
|
1723
|
+
request
|
|
1724
|
+
);
|
|
1725
|
+
const canHibernate = canHibernatWebSocket(truncatedRequest);
|
|
1726
|
+
hibernationConfig = {
|
|
1727
|
+
enabled: canHibernate,
|
|
1728
|
+
lastMsgIndex: void 0
|
|
1729
|
+
};
|
|
1730
|
+
} catch (error) {
|
|
1731
|
+
logger4().error({
|
|
1732
|
+
msg: "error calling canHibernatWebSocket",
|
|
1733
|
+
error
|
|
1734
|
+
});
|
|
1735
|
+
hibernationConfig = {
|
|
1736
|
+
enabled: false,
|
|
1737
|
+
lastMsgIndex: void 0
|
|
1738
|
+
};
|
|
1739
|
+
}
|
|
1740
|
+
} else {
|
|
1741
|
+
hibernationConfig = {
|
|
1742
|
+
enabled: false,
|
|
1743
|
+
lastMsgIndex: void 0
|
|
1744
|
+
};
|
|
1745
|
+
}
|
|
1746
|
+
} else {
|
|
1747
|
+
logger4().warn({
|
|
1748
|
+
msg: "unexpected path for getActorHibernationConfig",
|
|
1749
|
+
path: path4
|
|
1750
|
+
});
|
|
1751
|
+
hibernationConfig = {
|
|
1752
|
+
enabled: false,
|
|
1753
|
+
lastMsgIndex: void 0
|
|
1754
|
+
};
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
handler.actor[PERSIST_SYMBOL].hibernatableWebSocket.push({
|
|
1758
|
+
requestId,
|
|
1759
|
+
lastSeenTimestamp: BigInt(Date.now()),
|
|
1760
|
+
msgIndex: -1n
|
|
1761
|
+
});
|
|
1762
|
+
return hibernationConfig;
|
|
1763
|
+
}
|
|
1614
1764
|
};
|
|
1615
1765
|
this.#runner = new Runner(engineRunnerConfig);
|
|
1616
1766
|
this.#runner.start();
|
|
@@ -1620,6 +1770,7 @@ var EngineActorDriver = class {
|
|
|
1620
1770
|
namespace: runConfig.namespace,
|
|
1621
1771
|
runnerName: runConfig.runnerName
|
|
1622
1772
|
});
|
|
1773
|
+
this.#wsAckFlushInterval = setInterval(() => this.#flushWsAcks(), 1e3);
|
|
1623
1774
|
}
|
|
1624
1775
|
async #loadActorHandler(actorId) {
|
|
1625
1776
|
const handler = this.#actors.get(actorId);
|
|
@@ -1634,6 +1785,16 @@ var EngineActorDriver = class {
|
|
|
1634
1785
|
if (!handler.actor) throw new Error(`Actor ${actorId} failed to load`);
|
|
1635
1786
|
return handler.actor;
|
|
1636
1787
|
}
|
|
1788
|
+
#flushWsAcks() {
|
|
1789
|
+
if (this.#wsAckQueue.size === 0) return;
|
|
1790
|
+
for (const {
|
|
1791
|
+
requestIdBuf: requestId,
|
|
1792
|
+
messageIndex: index
|
|
1793
|
+
} of this.#wsAckQueue.values()) {
|
|
1794
|
+
this.#runner.sendWebsocketMessageAck(requestId, index);
|
|
1795
|
+
}
|
|
1796
|
+
this.#wsAckQueue.clear();
|
|
1797
|
+
}
|
|
1637
1798
|
getContext(actorId) {
|
|
1638
1799
|
return {};
|
|
1639
1800
|
}
|
|
@@ -1714,12 +1875,19 @@ var EngineActorDriver = class {
|
|
|
1714
1875
|
logger4().debug({ msg: "runner actor stopping", actorId, generation });
|
|
1715
1876
|
const handler = this.#actors.get(actorId);
|
|
1716
1877
|
if (handler == null ? void 0 : handler.actor) {
|
|
1717
|
-
|
|
1878
|
+
try {
|
|
1879
|
+
await handler.actor._onStop();
|
|
1880
|
+
} catch (err) {
|
|
1881
|
+
logger4().error({
|
|
1882
|
+
msg: "error in _onStop, proceeding with removing actor",
|
|
1883
|
+
err: stringifyError(err)
|
|
1884
|
+
});
|
|
1885
|
+
}
|
|
1718
1886
|
this.#actors.delete(actorId);
|
|
1719
1887
|
}
|
|
1720
1888
|
logger4().debug({ msg: "runner actor stopped", actorId });
|
|
1721
1889
|
}
|
|
1722
|
-
async #runnerFetch(
|
|
1890
|
+
async #runnerFetch(_runner, actorId, _requestIdBuf, request) {
|
|
1723
1891
|
logger4().debug({
|
|
1724
1892
|
msg: "runner fetch",
|
|
1725
1893
|
actorId,
|
|
@@ -1728,8 +1896,9 @@ var EngineActorDriver = class {
|
|
|
1728
1896
|
});
|
|
1729
1897
|
return await this.#actorRouter.fetch(request, { actorId });
|
|
1730
1898
|
}
|
|
1731
|
-
async #runnerWebSocket(
|
|
1899
|
+
async #runnerWebSocket(_runner, actorId, websocketRaw, requestIdBuf, request) {
|
|
1732
1900
|
const websocket = websocketRaw;
|
|
1901
|
+
const requestId = idToStr(requestIdBuf);
|
|
1733
1902
|
logger4().debug({ msg: "runner websocket", actorId, url: request.url });
|
|
1734
1903
|
const url = new URL(request.url);
|
|
1735
1904
|
const protocols = request.headers.get("sec-websocket-protocol");
|
|
@@ -1760,6 +1929,7 @@ var EngineActorDriver = class {
|
|
|
1760
1929
|
actorId,
|
|
1761
1930
|
encoding,
|
|
1762
1931
|
connParams,
|
|
1932
|
+
requestId,
|
|
1763
1933
|
// Extract connId and connToken from protocols if needed
|
|
1764
1934
|
void 0,
|
|
1765
1935
|
void 0
|
|
@@ -1799,8 +1969,29 @@ var EngineActorDriver = class {
|
|
|
1799
1969
|
var _a;
|
|
1800
1970
|
return (_a = x.onMessage) == null ? void 0 : _a.call(x, event, wsContext);
|
|
1801
1971
|
});
|
|
1972
|
+
invariant3(event.rivetRequestId, "missing rivetRequestId");
|
|
1973
|
+
invariant3(event.rivetMessageIndex, "missing rivetMessageIndex");
|
|
1974
|
+
const currentEntry = this.#wsAckQueue.get(requestId);
|
|
1975
|
+
if (currentEntry) {
|
|
1976
|
+
if (event.rivetMessageIndex > currentEntry.messageIndex) {
|
|
1977
|
+
currentEntry.messageIndex = event.rivetMessageIndex;
|
|
1978
|
+
} else {
|
|
1979
|
+
logger4().warn({
|
|
1980
|
+
msg: "received lower index than ack queue for message",
|
|
1981
|
+
requestId,
|
|
1982
|
+
queuedMessageIndex: currentEntry,
|
|
1983
|
+
eventMessageIndex: event.rivetMessageIndex
|
|
1984
|
+
});
|
|
1985
|
+
}
|
|
1986
|
+
} else {
|
|
1987
|
+
this.#wsAckQueue.set(requestId, {
|
|
1988
|
+
requestIdBuf,
|
|
1989
|
+
messageIndex: event.rivetMessageIndex
|
|
1990
|
+
});
|
|
1991
|
+
}
|
|
1802
1992
|
});
|
|
1803
1993
|
websocket.addEventListener("close", (event) => {
|
|
1994
|
+
this.#flushWsAcks();
|
|
1804
1995
|
wsHandlerPromise.then((x) => {
|
|
1805
1996
|
var _a;
|
|
1806
1997
|
return (_a = x.onClose) == null ? void 0 : _a.call(x, event, wsContext);
|
|
@@ -1813,11 +2004,16 @@ var EngineActorDriver = class {
|
|
|
1813
2004
|
});
|
|
1814
2005
|
});
|
|
1815
2006
|
}
|
|
1816
|
-
|
|
2007
|
+
startSleep(actorId) {
|
|
1817
2008
|
this.#runner.sleepActor(actorId);
|
|
1818
2009
|
}
|
|
1819
|
-
async
|
|
2010
|
+
async shutdownRunner(immediate) {
|
|
1820
2011
|
logger4().info({ msg: "stopping engine actor driver" });
|
|
2012
|
+
if (this.#wsAckFlushInterval) {
|
|
2013
|
+
clearInterval(this.#wsAckFlushInterval);
|
|
2014
|
+
this.#wsAckFlushInterval = void 0;
|
|
2015
|
+
}
|
|
2016
|
+
this.#flushWsAcks();
|
|
1821
2017
|
await this.#runner.shutdown(immediate);
|
|
1822
2018
|
}
|
|
1823
2019
|
async serverlessHandleStart(c) {
|
|
@@ -1826,15 +2022,36 @@ var EngineActorDriver = class {
|
|
|
1826
2022
|
});
|
|
1827
2023
|
c.req.raw.signal.addEventListener("abort", () => {
|
|
1828
2024
|
logger4().debug("SSE aborted, shutting down runner");
|
|
1829
|
-
this.
|
|
2025
|
+
this.shutdownRunner(false);
|
|
1830
2026
|
});
|
|
1831
2027
|
await this.#runnerStarted.promise;
|
|
1832
2028
|
const payload = this.#runner.getServerlessInitPacket();
|
|
1833
2029
|
invariant3(payload, "runnerId not set");
|
|
1834
2030
|
await stream.writeSSE({ data: payload });
|
|
2031
|
+
while (true) {
|
|
2032
|
+
if (this.#isRunnerStopped) {
|
|
2033
|
+
logger4().debug({
|
|
2034
|
+
msg: "runner is stopped"
|
|
2035
|
+
});
|
|
2036
|
+
break;
|
|
2037
|
+
}
|
|
2038
|
+
if (stream.closed || stream.aborted) {
|
|
2039
|
+
logger4().debug({
|
|
2040
|
+
msg: "runner sse stream closed",
|
|
2041
|
+
closed: stream.closed,
|
|
2042
|
+
aborted: stream.aborted
|
|
2043
|
+
});
|
|
2044
|
+
break;
|
|
2045
|
+
}
|
|
2046
|
+
await stream.writeSSE({ event: "ping", data: "" });
|
|
2047
|
+
await stream.sleep(RUNNER_SSE_PING_INTERVAL);
|
|
2048
|
+
}
|
|
1835
2049
|
await this.#runnerStopped.promise;
|
|
1836
2050
|
});
|
|
1837
2051
|
}
|
|
2052
|
+
getExtraActorLogParams() {
|
|
2053
|
+
return { runnerId: this.#runner.runnerId ?? "-" };
|
|
2054
|
+
}
|
|
1838
2055
|
};
|
|
1839
2056
|
|
|
1840
2057
|
// src/drivers/engine/mod.ts
|
|
@@ -1905,8 +2122,8 @@ var FileSystemActorDriver = class {
|
|
|
1905
2122
|
getDatabase(actorId) {
|
|
1906
2123
|
return this.#state.createDatabase(actorId);
|
|
1907
2124
|
}
|
|
1908
|
-
|
|
1909
|
-
|
|
2125
|
+
startSleep(actorId) {
|
|
2126
|
+
this.#state.sleepActor(actorId);
|
|
1910
2127
|
}
|
|
1911
2128
|
};
|
|
1912
2129
|
|
|
@@ -2269,7 +2486,7 @@ var FileSystemGlobalState = class {
|
|
|
2269
2486
|
await actor2.startPromise.promise.catch();
|
|
2270
2487
|
actor2.removed = true;
|
|
2271
2488
|
invariant4(actor2.actor, "actor should be loaded");
|
|
2272
|
-
await actor2.actor.
|
|
2489
|
+
await actor2.actor._onStop();
|
|
2273
2490
|
this.#actors.delete(actorId);
|
|
2274
2491
|
}
|
|
2275
2492
|
/**
|
|
@@ -2743,6 +2960,7 @@ var FileSystemManagerDriver = class {
|
|
|
2743
2960
|
actorId,
|
|
2744
2961
|
encoding,
|
|
2745
2962
|
params,
|
|
2963
|
+
generateConnRequestId(),
|
|
2746
2964
|
connId,
|
|
2747
2965
|
connToken
|
|
2748
2966
|
);
|
|
@@ -2778,6 +2996,7 @@ var FileSystemManagerDriver = class {
|
|
|
2778
2996
|
actorId,
|
|
2779
2997
|
encoding,
|
|
2780
2998
|
connParams,
|
|
2999
|
+
generateConnRequestId(),
|
|
2781
3000
|
connId,
|
|
2782
3001
|
connToken
|
|
2783
3002
|
);
|
|
@@ -3001,7 +3220,26 @@ async function ensureEngineProcess(options) {
|
|
|
3001
3220
|
cwd: path3.dirname(binaryPath),
|
|
3002
3221
|
stdio: ["inherit", "pipe", "pipe"],
|
|
3003
3222
|
env: {
|
|
3004
|
-
...process.env
|
|
3223
|
+
...process.env,
|
|
3224
|
+
// In development, runners can be terminated without a graceful
|
|
3225
|
+
// shutdown (i.e. SIGKILL instead of SIGTERM). This is treated as a
|
|
3226
|
+
// crash by Rivet Engine in production and implements a backoff for
|
|
3227
|
+
// rescheduling actors in case of a crash loop.
|
|
3228
|
+
//
|
|
3229
|
+
// This is problematic in development since this will cause actors
|
|
3230
|
+
// to become unresponsive if frequently killing your dev server.
|
|
3231
|
+
//
|
|
3232
|
+
// We reduce the timeouts for resetting a runner as healthy in
|
|
3233
|
+
// order to account for this.
|
|
3234
|
+
RIVET__PEGBOARD__RETRY_RESET_DURATION: "100",
|
|
3235
|
+
RIVET__PEGBOARD__BASE_RETRY_TIMEOUT: "100",
|
|
3236
|
+
// Set max exponent to 1 to have a maximum of base_retry_timeout
|
|
3237
|
+
RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT: "1",
|
|
3238
|
+
// Reduce thresholds for faster development iteration
|
|
3239
|
+
//
|
|
3240
|
+
// Default ping interval is 3s, this gives a 2s & 4s grace
|
|
3241
|
+
RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD: "5000",
|
|
3242
|
+
RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD: "7000"
|
|
3005
3243
|
}
|
|
3006
3244
|
});
|
|
3007
3245
|
if (!child.pid) {
|
|
@@ -3023,8 +3261,7 @@ async function ensureEngineProcess(options) {
|
|
|
3023
3261
|
msg: "engine process exited, please report this error",
|
|
3024
3262
|
code,
|
|
3025
3263
|
signal,
|
|
3026
|
-
|
|
3027
|
-
support: "https://rivet.dev/discord"
|
|
3264
|
+
...EXTRA_ERROR_LOG
|
|
3028
3265
|
});
|
|
3029
3266
|
stdoutStream.end();
|
|
3030
3267
|
stderrStream.end();
|
|
@@ -3113,8 +3350,7 @@ async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
|
|
|
3113
3350
|
msg: "engine download failed, please report this error",
|
|
3114
3351
|
tempPath,
|
|
3115
3352
|
error,
|
|
3116
|
-
|
|
3117
|
-
support: "https://rivet.dev/discord"
|
|
3353
|
+
...EXTRA_ERROR_LOG
|
|
3118
3354
|
});
|
|
3119
3355
|
try {
|
|
3120
3356
|
await fs3.unlink(tempPath);
|
|
@@ -3238,11 +3474,42 @@ import * as cbor4 from "cbor-x";
|
|
|
3238
3474
|
import {
|
|
3239
3475
|
Hono as Hono3
|
|
3240
3476
|
} from "hono";
|
|
3241
|
-
import { cors as corsMiddleware } from "hono/cors";
|
|
3242
3477
|
import { createMiddleware } from "hono/factory";
|
|
3243
3478
|
import invariant6 from "invariant";
|
|
3244
3479
|
import { z as z6 } from "zod";
|
|
3245
3480
|
|
|
3481
|
+
// src/common/cors.ts
|
|
3482
|
+
var cors = () => {
|
|
3483
|
+
return async (c, next) => {
|
|
3484
|
+
const origin = c.req.header("origin") || "*";
|
|
3485
|
+
if (c.req.method === "OPTIONS") {
|
|
3486
|
+
const requestHeaders = c.req.header("access-control-request-headers") || "*";
|
|
3487
|
+
c.header("access-control-allow-origin", origin);
|
|
3488
|
+
c.header("access-control-allow-credentials", "true");
|
|
3489
|
+
c.header(
|
|
3490
|
+
"access-control-allow-methods",
|
|
3491
|
+
"GET, POST, PUT, DELETE, OPTIONS, PATCH"
|
|
3492
|
+
);
|
|
3493
|
+
c.header("access-control-allow-headers", requestHeaders);
|
|
3494
|
+
c.header("access-control-expose-headers", "*");
|
|
3495
|
+
c.header("access-control-max-age", "86400");
|
|
3496
|
+
if (origin !== "*") {
|
|
3497
|
+
c.header("vary", "Origin");
|
|
3498
|
+
}
|
|
3499
|
+
c.res.headers.delete("content-length");
|
|
3500
|
+
c.res.headers.delete("content-type");
|
|
3501
|
+
return c.body(null, 204);
|
|
3502
|
+
}
|
|
3503
|
+
await next();
|
|
3504
|
+
c.header("access-control-allow-origin", origin);
|
|
3505
|
+
c.header("access-control-allow-credentials", "true");
|
|
3506
|
+
c.header("access-control-expose-headers", "*");
|
|
3507
|
+
if (origin !== "*") {
|
|
3508
|
+
c.header("vary", "Origin");
|
|
3509
|
+
}
|
|
3510
|
+
};
|
|
3511
|
+
};
|
|
3512
|
+
|
|
3246
3513
|
// src/manager-api/actors.ts
|
|
3247
3514
|
import { z as z4 } from "zod";
|
|
3248
3515
|
|
|
@@ -3516,32 +3783,41 @@ function parseActorPath(path4) {
|
|
|
3516
3783
|
return null;
|
|
3517
3784
|
}
|
|
3518
3785
|
const segments = basePath.split("/").filter((s) => s.length > 0);
|
|
3519
|
-
if (segments.length <
|
|
3786
|
+
if (segments.length < 2) {
|
|
3520
3787
|
return null;
|
|
3521
3788
|
}
|
|
3522
|
-
if (segments[0] !== "gateway"
|
|
3789
|
+
if (segments[0] !== "gateway") {
|
|
3523
3790
|
return null;
|
|
3524
3791
|
}
|
|
3525
|
-
|
|
3792
|
+
const actorSegment = segments[1];
|
|
3793
|
+
if (actorSegment.length === 0) {
|
|
3526
3794
|
return null;
|
|
3527
3795
|
}
|
|
3528
|
-
|
|
3796
|
+
let actorId;
|
|
3529
3797
|
let token;
|
|
3530
|
-
|
|
3531
|
-
if (
|
|
3532
|
-
|
|
3798
|
+
const atPos = actorSegment.indexOf("@");
|
|
3799
|
+
if (atPos !== -1) {
|
|
3800
|
+
const rawActorId = actorSegment.slice(0, atPos);
|
|
3801
|
+
const rawToken = actorSegment.slice(atPos + 1);
|
|
3802
|
+
if (rawActorId.length === 0 || rawToken.length === 0) {
|
|
3803
|
+
return null;
|
|
3804
|
+
}
|
|
3805
|
+
try {
|
|
3806
|
+
actorId = decodeURIComponent(rawActorId);
|
|
3807
|
+
token = decodeURIComponent(rawToken);
|
|
3808
|
+
} catch (e) {
|
|
3533
3809
|
return null;
|
|
3534
3810
|
}
|
|
3535
|
-
token = segments[4];
|
|
3536
|
-
remainingPathStartIdx = 6;
|
|
3537
|
-
} else if (segments.length >= 4 && segments[3] === "route") {
|
|
3538
|
-
token = void 0;
|
|
3539
|
-
remainingPathStartIdx = 4;
|
|
3540
3811
|
} else {
|
|
3541
|
-
|
|
3812
|
+
try {
|
|
3813
|
+
actorId = decodeURIComponent(actorSegment);
|
|
3814
|
+
} catch (e) {
|
|
3815
|
+
return null;
|
|
3816
|
+
}
|
|
3817
|
+
token = void 0;
|
|
3542
3818
|
}
|
|
3543
3819
|
let prefixLen = 0;
|
|
3544
|
-
for (let i = 0; i <
|
|
3820
|
+
for (let i = 0; i < 2; i++) {
|
|
3545
3821
|
prefixLen += 1 + segments[i].length;
|
|
3546
3822
|
}
|
|
3547
3823
|
let remainingBase;
|
|
@@ -3782,7 +4058,7 @@ function createManagerRouter(registryConfig, runConfig, managerDriver, driverCon
|
|
|
3782
4058
|
const router = new OpenAPIHono({ strict: false }).basePath(
|
|
3783
4059
|
runConfig.basePath
|
|
3784
4060
|
);
|
|
3785
|
-
router.use("*", loggerMiddleware(logger()));
|
|
4061
|
+
router.use("*", loggerMiddleware(logger()), cors());
|
|
3786
4062
|
router.use(
|
|
3787
4063
|
"*",
|
|
3788
4064
|
createMiddleware(async (c, next) => {
|
|
@@ -3814,7 +4090,6 @@ function createManagerRouter(registryConfig, runConfig, managerDriver, driverCon
|
|
|
3814
4090
|
return { router, openapi: router };
|
|
3815
4091
|
}
|
|
3816
4092
|
function addServerlessRoutes(driverConfig, registryConfig, runConfig, managerDriver, client, router) {
|
|
3817
|
-
if (runConfig.cors) router.use("*", corsMiddleware(runConfig.cors));
|
|
3818
4093
|
router.get("/", (c) => {
|
|
3819
4094
|
return c.text(
|
|
3820
4095
|
"This is a RivetKit server.\n\nLearn more at https://rivetkit.org"
|
|
@@ -3848,6 +4123,13 @@ function addServerlessRoutes(driverConfig, registryConfig, runConfig, managerDri
|
|
|
3848
4123
|
newRunConfig.totalSlots = totalSlots;
|
|
3849
4124
|
newRunConfig.runnerName = runnerName;
|
|
3850
4125
|
newRunConfig.namespace = namespace;
|
|
4126
|
+
if (newRunConfig.runnerKey) {
|
|
4127
|
+
logger().warn({
|
|
4128
|
+
msg: "runner keys are not supported by serverless runners, this will be overwritten with a random runner key",
|
|
4129
|
+
oldRunnerKey: newRunConfig.runnerKey
|
|
4130
|
+
});
|
|
4131
|
+
newRunConfig.runnerKey = void 0;
|
|
4132
|
+
}
|
|
3851
4133
|
const actorDriver = driverConfig.actor(
|
|
3852
4134
|
registryConfig,
|
|
3853
4135
|
newRunConfig,
|
|
@@ -3874,13 +4156,12 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
|
|
|
3874
4156
|
}
|
|
3875
4157
|
router.route(
|
|
3876
4158
|
"/inspect",
|
|
3877
|
-
new Hono3().use(
|
|
4159
|
+
new Hono3().use(secureInspector(runConfig)).use((c, next) => {
|
|
3878
4160
|
c.set("inspector", managerDriver.inspector);
|
|
3879
4161
|
return next();
|
|
3880
4162
|
}).route("/", createManagerInspectorRouter())
|
|
3881
4163
|
);
|
|
3882
4164
|
}
|
|
3883
|
-
if (runConfig.cors) router.use("*", corsMiddleware(runConfig.cors));
|
|
3884
4165
|
router.use("*", actorGateway.bind(void 0, runConfig, managerDriver));
|
|
3885
4166
|
router.get("/", (c) => {
|
|
3886
4167
|
return c.text(
|
|
@@ -4544,4 +4825,4 @@ export {
|
|
|
4544
4825
|
setup
|
|
4545
4826
|
};
|
|
4546
4827
|
//! These configs configs hold anything that's not platform-specific about running actors.
|
|
4547
|
-
//# sourceMappingURL=chunk-
|
|
4828
|
+
//# sourceMappingURL=chunk-HLZT5C6A.js.map
|