rivetkit 2.0.3 → 2.0.5
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/README.md +11 -0
- package/dist/schemas/actor-persist/v1.ts +21 -24
- package/dist/schemas/client-protocol/v1.ts +6 -0
- package/dist/tsup/actor/errors.cjs +10 -2
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +17 -4
- package/dist/tsup/actor/errors.d.ts +17 -4
- package/dist/tsup/actor/errors.js +11 -3
- package/dist/tsup/{chunk-4NSUQZ2H.js → chunk-2MD57QF4.js} +119 -115
- package/dist/tsup/chunk-2MD57QF4.js.map +1 -0
- package/dist/tsup/{chunk-GIR3AFFI.cjs → chunk-5QGQK44L.cjs} +103 -44
- package/dist/tsup/chunk-5QGQK44L.cjs.map +1 -0
- package/dist/tsup/chunk-5YTI25C3.cjs +250 -0
- package/dist/tsup/chunk-5YTI25C3.cjs.map +1 -0
- package/dist/tsup/chunk-B2QGJGZQ.js +338 -0
- package/dist/tsup/chunk-B2QGJGZQ.js.map +1 -0
- package/dist/tsup/{chunk-3H7O2A7I.js → chunk-CFFKMUYH.js} +61 -22
- package/dist/tsup/chunk-CFFKMUYH.js.map +1 -0
- package/dist/tsup/{chunk-FLMTTN27.js → chunk-CKA54YQN.js} +15 -8
- package/dist/tsup/chunk-CKA54YQN.js.map +1 -0
- package/dist/tsup/chunk-D7NWUCRK.cjs +20 -0
- package/dist/tsup/chunk-D7NWUCRK.cjs.map +1 -0
- package/dist/tsup/{chunk-FCCPJNMA.cjs → chunk-FGFT4FVX.cjs} +12 -27
- package/dist/tsup/chunk-FGFT4FVX.cjs.map +1 -0
- package/dist/tsup/chunk-I5VTWPHW.js +20 -0
- package/dist/tsup/chunk-I5VTWPHW.js.map +1 -0
- package/dist/tsup/{chunk-6WKQDDUD.cjs → chunk-IRMBWX36.cjs} +146 -142
- package/dist/tsup/chunk-IRMBWX36.cjs.map +1 -0
- package/dist/tsup/chunk-L7QRXNWP.js +6562 -0
- package/dist/tsup/chunk-L7QRXNWP.js.map +1 -0
- package/dist/tsup/{chunk-R2OPSKIV.cjs → chunk-LZIBTLEY.cjs} +20 -13
- package/dist/tsup/chunk-LZIBTLEY.cjs.map +1 -0
- package/dist/tsup/chunk-MRZS2J4X.cjs +6562 -0
- package/dist/tsup/chunk-MRZS2J4X.cjs.map +1 -0
- package/dist/tsup/{chunk-PO4VLDWA.js → chunk-PG3K2LI7.js} +3 -5
- package/dist/tsup/chunk-PG3K2LI7.js.map +1 -0
- package/dist/tsup/{chunk-TZJKSBUQ.cjs → chunk-PHSQJ6QI.cjs} +3 -5
- package/dist/tsup/chunk-PHSQJ6QI.cjs.map +1 -0
- package/dist/tsup/chunk-RM2SVURR.cjs +338 -0
- package/dist/tsup/chunk-RM2SVURR.cjs.map +1 -0
- package/dist/tsup/{chunk-OGAPU3UG.cjs → chunk-WADSS5X4.cjs} +66 -27
- package/dist/tsup/chunk-WADSS5X4.cjs.map +1 -0
- package/dist/tsup/chunk-WNGOBAA7.js +250 -0
- package/dist/tsup/chunk-WNGOBAA7.js.map +1 -0
- package/dist/tsup/{chunk-INGJP237.js → chunk-YPZFLUO6.js} +103 -44
- package/dist/tsup/chunk-YPZFLUO6.js.map +1 -0
- package/dist/tsup/{chunk-6PDXBYI5.js → chunk-YW6Y6VNE.js} +8 -23
- package/dist/tsup/chunk-YW6Y6VNE.js.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -10
- package/dist/tsup/client/mod.d.cts +7 -13
- package/dist/tsup/client/mod.d.ts +7 -13
- package/dist/tsup/client/mod.js +9 -9
- package/dist/tsup/common/log.cjs +12 -4
- package/dist/tsup/common/log.cjs.map +1 -1
- package/dist/tsup/common/log.d.cts +23 -17
- package/dist/tsup/common/log.d.ts +23 -17
- package/dist/tsup/common/log.js +15 -7
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -4
- package/dist/tsup/{common-CpqORuCq.d.cts → common-CXCe7s6i.d.cts} +2 -2
- package/dist/tsup/{common-CpqORuCq.d.ts → common-CXCe7s6i.d.ts} +2 -2
- package/dist/tsup/{connection-BwUMoe6n.d.ts → connection-BvE-Oq7t.d.ts} +215 -234
- package/dist/tsup/{connection-BR_Ve4ku.d.cts → connection-DTzmWwU5.d.cts} +215 -234
- package/dist/tsup/driver-helpers/mod.cjs +6 -9
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +5 -6
- package/dist/tsup/driver-helpers/mod.d.ts +5 -6
- package/dist/tsup/driver-helpers/mod.js +6 -9
- package/dist/tsup/driver-test-suite/mod.cjs +615 -1357
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +12 -6
- package/dist/tsup/driver-test-suite/mod.d.ts +12 -6
- package/dist/tsup/driver-test-suite/mod.js +1334 -2076
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -8
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +3 -3
- package/dist/tsup/inspector/mod.d.ts +3 -3
- package/dist/tsup/inspector/mod.js +8 -10
- package/dist/tsup/mod.cjs +9 -15
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +47 -42
- package/dist/tsup/mod.d.ts +47 -42
- package/dist/tsup/mod.js +10 -16
- package/dist/tsup/{router-endpoints-DAbqVFx2.d.ts → router-endpoints-CctffZNL.d.cts} +2 -3
- package/dist/tsup/{router-endpoints-AYkXG8Tl.d.cts → router-endpoints-DFm1BglJ.d.ts} +2 -3
- package/dist/tsup/test/mod.cjs +10 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -5
- package/dist/tsup/test/mod.d.ts +4 -5
- package/dist/tsup/test/mod.js +9 -13
- package/dist/tsup/{utils-CT0cv4jd.d.ts → utils-fwx3o3K9.d.cts} +1 -0
- package/dist/tsup/{utils-CT0cv4jd.d.cts → utils-fwx3o3K9.d.ts} +1 -0
- package/dist/tsup/utils.cjs +5 -3
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +19 -2
- package/dist/tsup/utils.d.ts +19 -2
- package/dist/tsup/utils.js +4 -2
- package/package.json +6 -6
- package/src/actor/action.ts +1 -5
- package/src/actor/config.ts +27 -295
- package/src/actor/connection.ts +9 -12
- package/src/actor/context.ts +1 -4
- package/src/actor/definition.ts +7 -11
- package/src/actor/errors.ts +98 -36
- package/src/actor/generic-conn-driver.ts +28 -16
- package/src/actor/instance.ts +177 -133
- package/src/actor/log.ts +4 -13
- package/src/actor/mod.ts +0 -5
- package/src/actor/protocol/old.ts +42 -26
- package/src/actor/protocol/serde.ts +1 -1
- package/src/actor/router-endpoints.ts +47 -39
- package/src/actor/router.ts +22 -19
- package/src/actor/unstable-react.ts +1 -1
- package/src/actor/utils.ts +6 -2
- package/src/client/actor-common.ts +1 -1
- package/src/client/actor-conn.ts +152 -91
- package/src/client/actor-handle.ts +85 -25
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +29 -98
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +1 -0
- package/src/client/log.ts +2 -4
- package/src/client/mod.ts +16 -12
- package/src/client/raw-utils.ts +82 -25
- package/src/client/utils.ts +5 -3
- package/src/common/fake-event-source.ts +10 -9
- package/src/common/inline-websocket-adapter2.ts +39 -30
- package/src/common/log.ts +176 -101
- package/src/common/logfmt.ts +21 -30
- package/src/common/router.ts +12 -19
- package/src/common/utils.ts +27 -13
- package/src/common/websocket.ts +0 -1
- package/src/driver-helpers/mod.ts +1 -1
- package/src/driver-test-suite/log.ts +1 -3
- package/src/driver-test-suite/mod.ts +87 -61
- package/src/driver-test-suite/test-inline-client-driver.ts +441 -255
- package/src/driver-test-suite/tests/actor-error-handling.ts +4 -12
- package/src/driver-test-suite/tests/actor-handle.ts +33 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +2 -1
- package/src/driver-test-suite/tests/manager-driver.ts +5 -3
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -226
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -392
- package/src/driver-test-suite/tests/request-access.ts +112 -126
- package/src/driver-test-suite/utils.ts +10 -6
- package/src/drivers/default.ts +7 -4
- package/src/drivers/engine/actor-driver.ts +22 -13
- package/src/drivers/engine/config.ts +2 -10
- package/src/drivers/engine/kv.ts +1 -1
- package/src/drivers/engine/log.ts +1 -3
- package/src/drivers/engine/mod.ts +2 -3
- package/src/drivers/file-system/actor.ts +1 -1
- package/src/drivers/file-system/global-state.ts +36 -21
- package/src/drivers/file-system/log.ts +1 -3
- package/src/drivers/file-system/manager.ts +33 -15
- package/src/inspector/config.ts +9 -4
- package/src/inspector/log.ts +1 -1
- package/src/inspector/manager.ts +2 -2
- package/src/inspector/utils.ts +1 -1
- package/src/manager/driver.ts +10 -2
- package/src/manager/hono-websocket-adapter.ts +21 -12
- package/src/manager/log.ts +2 -4
- package/src/manager/mod.ts +1 -1
- package/src/manager/router.ts +378 -1390
- package/src/manager-api/routes/actors-create.ts +16 -0
- package/src/manager-api/routes/actors-delete.ts +4 -0
- package/src/manager-api/routes/actors-get-by-id.ts +7 -0
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
- package/src/manager-api/routes/actors-get.ts +7 -0
- package/src/manager-api/routes/common.ts +18 -0
- package/src/mod.ts +0 -2
- package/src/registry/config.ts +1 -1
- package/src/registry/log.ts +2 -4
- package/src/registry/mod.ts +63 -34
- package/src/registry/run-config.ts +39 -26
- package/src/registry/serve.ts +4 -5
- package/src/remote-manager-driver/actor-http-client.ts +74 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +64 -0
- package/src/remote-manager-driver/api-endpoints.ts +79 -0
- package/src/remote-manager-driver/api-utils.ts +46 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/mod.ts +275 -0
- package/src/{drivers/engine → remote-manager-driver}/ws-proxy.ts +24 -14
- package/src/serde.ts +8 -2
- package/src/test/log.ts +1 -3
- package/src/test/mod.ts +17 -16
- package/src/utils.ts +53 -0
- package/dist/tsup/chunk-2CRLFV6Z.cjs +0 -202
- package/dist/tsup/chunk-2CRLFV6Z.cjs.map +0 -1
- package/dist/tsup/chunk-3H7O2A7I.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-4NSUQZ2H.js.map +0 -1
- package/dist/tsup/chunk-6PDXBYI5.js.map +0 -1
- package/dist/tsup/chunk-6WKQDDUD.cjs.map +0 -1
- package/dist/tsup/chunk-CTBOSFUH.cjs +0 -116
- package/dist/tsup/chunk-CTBOSFUH.cjs.map +0 -1
- package/dist/tsup/chunk-EGVZZFE2.js +0 -2857
- package/dist/tsup/chunk-EGVZZFE2.js.map +0 -1
- package/dist/tsup/chunk-FCCPJNMA.cjs.map +0 -1
- package/dist/tsup/chunk-FLMTTN27.js.map +0 -1
- package/dist/tsup/chunk-GIR3AFFI.cjs.map +0 -1
- package/dist/tsup/chunk-INGJP237.js.map +0 -1
- package/dist/tsup/chunk-KJCJLKRM.js +0 -116
- package/dist/tsup/chunk-KJCJLKRM.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-O2MBYIXO.cjs +0 -2857
- package/dist/tsup/chunk-O2MBYIXO.cjs.map +0 -1
- package/dist/tsup/chunk-OGAPU3UG.cjs.map +0 -1
- package/dist/tsup/chunk-OV6AYD4S.js +0 -4406
- package/dist/tsup/chunk-OV6AYD4S.js.map +0 -1
- package/dist/tsup/chunk-PO4VLDWA.js.map +0 -1
- package/dist/tsup/chunk-R2OPSKIV.cjs.map +0 -1
- package/dist/tsup/chunk-TZJKSBUQ.cjs.map +0 -1
- package/dist/tsup/chunk-UBUC5C3G.cjs +0 -189
- package/dist/tsup/chunk-UBUC5C3G.cjs.map +0 -1
- package/dist/tsup/chunk-UIM22YJL.cjs +0 -4406
- package/dist/tsup/chunk-UIM22YJL.cjs.map +0 -1
- package/dist/tsup/chunk-URVFQMYI.cjs +0 -230
- package/dist/tsup/chunk-URVFQMYI.cjs.map +0 -1
- package/dist/tsup/chunk-UVUPOS46.js +0 -230
- package/dist/tsup/chunk-UVUPOS46.js.map +0 -1
- package/dist/tsup/chunk-VRRHBNJC.js +0 -189
- package/dist/tsup/chunk-VRRHBNJC.js.map +0 -1
- package/dist/tsup/chunk-XFSS33EQ.js +0 -202
- package/dist/tsup/chunk-XFSS33EQ.js.map +0 -1
- package/src/client/http-client-driver.ts +0 -326
- package/src/driver-test-suite/tests/actor-auth.ts +0 -591
- package/src/drivers/engine/api-endpoints.ts +0 -128
- package/src/drivers/engine/api-utils.ts +0 -70
- package/src/drivers/engine/manager-driver.ts +0 -391
- package/src/inline-client-driver/log.ts +0 -7
- package/src/inline-client-driver/mod.ts +0 -385
- package/src/manager/auth.ts +0 -121
- /package/src/{drivers/engine → actor}/keys.test.ts +0 -0
- /package/src/{drivers/engine → actor}/keys.ts +0 -0
|
@@ -84,6 +84,10 @@ export class FileSystemGlobalState {
|
|
|
84
84
|
actorDriver: ActorDriver;
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
+
get persist(): boolean {
|
|
88
|
+
return this.#persist;
|
|
89
|
+
}
|
|
90
|
+
|
|
87
91
|
get storagePath() {
|
|
88
92
|
return this.#storagePath;
|
|
89
93
|
}
|
|
@@ -109,10 +113,11 @@ export class FileSystemGlobalState {
|
|
|
109
113
|
const actorIds = fsSync.readdirSync(this.#stateDir);
|
|
110
114
|
this.#actorCountOnStartup = actorIds.length;
|
|
111
115
|
} catch (error) {
|
|
112
|
-
logger().error("failed to count actors",
|
|
116
|
+
logger().error({ msg: "failed to count actors", error });
|
|
113
117
|
}
|
|
114
118
|
|
|
115
|
-
logger().debug(
|
|
119
|
+
logger().debug({
|
|
120
|
+
msg: "file system driver ready",
|
|
116
121
|
dir: this.#storagePath,
|
|
117
122
|
actorCount: this.#actorCountOnStartup,
|
|
118
123
|
});
|
|
@@ -121,10 +126,10 @@ export class FileSystemGlobalState {
|
|
|
121
126
|
try {
|
|
122
127
|
this.#cleanupTempFilesSync();
|
|
123
128
|
} catch (err) {
|
|
124
|
-
logger().error("failed to cleanup temp files",
|
|
129
|
+
logger().error({ msg: "failed to cleanup temp files", error: err });
|
|
125
130
|
}
|
|
126
131
|
} else {
|
|
127
|
-
logger().debug("memory driver ready");
|
|
132
|
+
logger().debug({ msg: "memory driver ready" });
|
|
128
133
|
}
|
|
129
134
|
}
|
|
130
135
|
|
|
@@ -165,7 +170,7 @@ export class FileSystemGlobalState {
|
|
|
165
170
|
const state = await this.loadActorStateOrError(actorId);
|
|
166
171
|
yield state;
|
|
167
172
|
} catch (error) {
|
|
168
|
-
logger().error("failed to load actor state",
|
|
173
|
+
logger().error({ msg: "failed to load actor state", actorId, error });
|
|
169
174
|
}
|
|
170
175
|
}
|
|
171
176
|
}
|
|
@@ -353,7 +358,7 @@ export class FileSystemGlobalState {
|
|
|
353
358
|
try {
|
|
354
359
|
await fs.unlink(tempPath);
|
|
355
360
|
} catch {}
|
|
356
|
-
logger().error("failed to write alarm",
|
|
361
|
+
logger().error({ msg: "failed to write alarm", actorId, error });
|
|
357
362
|
throw new Error(`Failed to write alarm: ${error}`);
|
|
358
363
|
}
|
|
359
364
|
}
|
|
@@ -398,7 +403,7 @@ export class FileSystemGlobalState {
|
|
|
398
403
|
} catch {
|
|
399
404
|
// Ignore cleanup errors
|
|
400
405
|
}
|
|
401
|
-
logger().error("failed to save actor state",
|
|
406
|
+
logger().error({ msg: "failed to save actor state", actorId, error });
|
|
402
407
|
throw new Error(`Failed to save actor state: ${error}`);
|
|
403
408
|
}
|
|
404
409
|
}
|
|
@@ -417,7 +422,6 @@ export class FileSystemGlobalState {
|
|
|
417
422
|
actorDriver: ActorDriver,
|
|
418
423
|
) {
|
|
419
424
|
if (this.#runnerParams) {
|
|
420
|
-
logger().warn("already called onRunnerStart");
|
|
421
425
|
return;
|
|
422
426
|
}
|
|
423
427
|
|
|
@@ -433,7 +437,7 @@ export class FileSystemGlobalState {
|
|
|
433
437
|
try {
|
|
434
438
|
this.#loadAlarmsSync();
|
|
435
439
|
} catch (err) {
|
|
436
|
-
logger().error("failed to load alarms on startup",
|
|
440
|
+
logger().error({ msg: "failed to load alarms on startup", error: err });
|
|
437
441
|
}
|
|
438
442
|
}
|
|
439
443
|
|
|
@@ -447,7 +451,9 @@ export class FileSystemGlobalState {
|
|
|
447
451
|
// Get the actor metadata
|
|
448
452
|
const entry = await this.loadActor(actorId);
|
|
449
453
|
if (!entry.state) {
|
|
450
|
-
throw new Error(
|
|
454
|
+
throw new Error(
|
|
455
|
+
`Actor does not exist and cannot be started: "${actorId}"`,
|
|
456
|
+
);
|
|
451
457
|
}
|
|
452
458
|
|
|
453
459
|
// Actor already starting
|
|
@@ -538,17 +544,18 @@ export class FileSystemGlobalState {
|
|
|
538
544
|
if (Number.isFinite(timestamp)) {
|
|
539
545
|
this.#scheduleAlarmTimeout(alarmData.actorId, timestamp);
|
|
540
546
|
} else {
|
|
541
|
-
logger().debug("invalid alarm file contents",
|
|
547
|
+
logger().debug({ msg: "invalid alarm file contents", file });
|
|
542
548
|
}
|
|
543
549
|
} catch (err) {
|
|
544
|
-
logger().error(
|
|
550
|
+
logger().error({
|
|
551
|
+
msg: "failed to read alarm file",
|
|
545
552
|
file,
|
|
546
553
|
error: stringifyError(err),
|
|
547
554
|
});
|
|
548
555
|
}
|
|
549
556
|
}
|
|
550
557
|
} catch (err) {
|
|
551
|
-
logger().error("failed to list alarms directory",
|
|
558
|
+
logger().error({ msg: "failed to list alarms directory", error: err });
|
|
552
559
|
}
|
|
553
560
|
}
|
|
554
561
|
|
|
@@ -563,7 +570,8 @@ export class FileSystemGlobalState {
|
|
|
563
570
|
entry.alarmTimestamp !== undefined &&
|
|
564
571
|
timestamp >= entry.alarmTimestamp
|
|
565
572
|
) {
|
|
566
|
-
logger().debug(
|
|
573
|
+
logger().debug({
|
|
574
|
+
msg: "skipping alarm schedule (later than existing)",
|
|
567
575
|
actorId,
|
|
568
576
|
timestamp,
|
|
569
577
|
current: entry.alarmTimestamp,
|
|
@@ -571,7 +579,7 @@ export class FileSystemGlobalState {
|
|
|
571
579
|
return;
|
|
572
580
|
}
|
|
573
581
|
|
|
574
|
-
logger().debug("scheduling alarm",
|
|
582
|
+
logger().debug({ msg: "scheduling alarm", actorId, timestamp });
|
|
575
583
|
|
|
576
584
|
// Cancel existing timeout and update the current scheduled timestamp
|
|
577
585
|
entry.alarmTimeout?.abort();
|
|
@@ -587,7 +595,8 @@ export class FileSystemGlobalState {
|
|
|
587
595
|
await fs.unlink(this.getActorAlarmPath(actorId));
|
|
588
596
|
} catch (err: any) {
|
|
589
597
|
if (err?.code !== "ENOENT") {
|
|
590
|
-
logger().debug(
|
|
598
|
+
logger().debug({
|
|
599
|
+
msg: "failed to remove alarm file",
|
|
591
600
|
actorId,
|
|
592
601
|
error: stringifyError(err),
|
|
593
602
|
});
|
|
@@ -596,7 +605,7 @@ export class FileSystemGlobalState {
|
|
|
596
605
|
}
|
|
597
606
|
|
|
598
607
|
try {
|
|
599
|
-
logger().debug("triggering alarm",
|
|
608
|
+
logger().debug({ msg: "triggering alarm", actorId, timestamp });
|
|
600
609
|
|
|
601
610
|
// Ensure actor state exists and start actor if needed
|
|
602
611
|
const loaded = await this.loadActor(actorId);
|
|
@@ -618,7 +627,8 @@ export class FileSystemGlobalState {
|
|
|
618
627
|
invariant(loaded.actor, "actor should be loaded after wake");
|
|
619
628
|
await loaded.actor._onAlarm();
|
|
620
629
|
} catch (err) {
|
|
621
|
-
logger().error(
|
|
630
|
+
logger().error({
|
|
631
|
+
msg: "failed to handle alarm",
|
|
622
632
|
actorId,
|
|
623
633
|
error: stringifyError(err),
|
|
624
634
|
});
|
|
@@ -655,17 +665,22 @@ export class FileSystemGlobalState {
|
|
|
655
665
|
// Remove if older than 1 hour
|
|
656
666
|
if (stat.mtimeMs < oneHourAgo) {
|
|
657
667
|
fsSync.unlinkSync(fullPath);
|
|
658
|
-
logger().info(
|
|
668
|
+
logger().info({
|
|
669
|
+
msg: "cleaned up stale temp file",
|
|
670
|
+
file: tempFile,
|
|
671
|
+
});
|
|
659
672
|
}
|
|
660
673
|
} catch (err) {
|
|
661
|
-
logger().debug(
|
|
674
|
+
logger().debug({
|
|
675
|
+
msg: "failed to cleanup temp file",
|
|
662
676
|
file: tempFile,
|
|
663
677
|
error: err,
|
|
664
678
|
});
|
|
665
679
|
}
|
|
666
680
|
}
|
|
667
681
|
} catch (err) {
|
|
668
|
-
logger().error(
|
|
682
|
+
logger().error({
|
|
683
|
+
msg: "failed to read actors directory for cleanup",
|
|
669
684
|
error: err,
|
|
670
685
|
});
|
|
671
686
|
}
|
|
@@ -17,9 +17,9 @@ import type {
|
|
|
17
17
|
GetWithKeyInput,
|
|
18
18
|
ManagerDriver,
|
|
19
19
|
} from "@/driver-helpers/mod";
|
|
20
|
-
import { createInlineClientDriver } from "@/inline-client-driver/mod";
|
|
21
20
|
import { ManagerInspector } from "@/inspector/manager";
|
|
22
21
|
import { type Actor, ActorFeature, type ActorId } from "@/inspector/mod";
|
|
22
|
+
import type { ManagerDisplayInformation } from "@/manager/driver";
|
|
23
23
|
import {
|
|
24
24
|
type DriverConfig,
|
|
25
25
|
type Encoding,
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
PATH_RAW_WEBSOCKET_PREFIX,
|
|
28
28
|
type RegistryConfig,
|
|
29
29
|
type RunConfig,
|
|
30
|
+
type UniversalWebSocket,
|
|
30
31
|
} from "@/mod";
|
|
31
32
|
import type * as schema from "@/schemas/file-system-driver/mod";
|
|
32
33
|
import type { FileSystemGlobalState } from "./global-state";
|
|
@@ -119,7 +120,7 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
// Actors run on the same node as the manager, so we create a dummy actor router that we route requests to
|
|
122
|
-
const inlineClient = createClientWithDriver(
|
|
123
|
+
const inlineClient = createClientWithDriver(this);
|
|
123
124
|
this.#actorDriver = this.#driverConfig.actor(
|
|
124
125
|
registryConfig,
|
|
125
126
|
runConfig,
|
|
@@ -140,11 +141,11 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
140
141
|
actorId: string,
|
|
141
142
|
encoding: Encoding,
|
|
142
143
|
params: unknown,
|
|
143
|
-
): Promise<
|
|
144
|
-
// TODO:
|
|
145
|
-
|
|
144
|
+
): Promise<UniversalWebSocket> {
|
|
146
145
|
// Handle raw WebSocket paths
|
|
147
|
-
|
|
146
|
+
const pathOnly = path.split("?")[0];
|
|
147
|
+
const normalizedPath = pathOnly.startsWith("/") ? pathOnly : `/${pathOnly}`;
|
|
148
|
+
if (normalizedPath === PATH_CONNECT_WEBSOCKET) {
|
|
148
149
|
// Handle standard connect
|
|
149
150
|
const wsHandler = await handleWebSocketConnect(
|
|
150
151
|
undefined,
|
|
@@ -156,8 +157,12 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
156
157
|
undefined,
|
|
157
158
|
);
|
|
158
159
|
return new InlineWebSocketAdapter2(wsHandler);
|
|
159
|
-
} else if (
|
|
160
|
+
} else if (
|
|
161
|
+
normalizedPath.startsWith(PATH_RAW_WEBSOCKET_PREFIX) ||
|
|
162
|
+
normalizedPath === "/raw/websocket"
|
|
163
|
+
) {
|
|
160
164
|
// Handle websocket proxy
|
|
165
|
+
// Use the full path with query parameters
|
|
161
166
|
const wsHandler = await handleRawWebSocketHandler(
|
|
162
167
|
undefined,
|
|
163
168
|
path,
|
|
@@ -187,13 +192,14 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
187
192
|
actorId: string,
|
|
188
193
|
encoding: Encoding,
|
|
189
194
|
connParams: unknown,
|
|
190
|
-
authData: unknown,
|
|
191
195
|
): Promise<Response> {
|
|
192
196
|
const upgradeWebSocket = this.#runConfig.getUpgradeWebSocket?.();
|
|
193
197
|
invariant(upgradeWebSocket, "missing getUpgradeWebSocket");
|
|
194
198
|
|
|
195
199
|
// Handle raw WebSocket paths
|
|
196
|
-
|
|
200
|
+
const pathOnly = path.split("?")[0];
|
|
201
|
+
const normalizedPath = pathOnly.startsWith("/") ? pathOnly : `/${pathOnly}`;
|
|
202
|
+
if (normalizedPath === PATH_CONNECT_WEBSOCKET) {
|
|
197
203
|
// Handle standard connect
|
|
198
204
|
const wsHandler = await handleWebSocketConnect(
|
|
199
205
|
c.req.raw,
|
|
@@ -202,20 +208,22 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
202
208
|
actorId,
|
|
203
209
|
encoding,
|
|
204
210
|
connParams,
|
|
205
|
-
|
|
211
|
+
undefined,
|
|
206
212
|
);
|
|
207
|
-
|
|
208
213
|
return upgradeWebSocket(() => wsHandler)(c, noopNext());
|
|
209
|
-
} else if (
|
|
214
|
+
} else if (
|
|
215
|
+
normalizedPath.startsWith(PATH_RAW_WEBSOCKET_PREFIX) ||
|
|
216
|
+
normalizedPath === "/raw/websocket"
|
|
217
|
+
) {
|
|
210
218
|
// Handle websocket proxy
|
|
219
|
+
// Use the full path with query parameters
|
|
211
220
|
const wsHandler = await handleRawWebSocketHandler(
|
|
212
221
|
c.req.raw,
|
|
213
222
|
path,
|
|
214
223
|
this.#actorDriver,
|
|
215
224
|
actorId,
|
|
216
|
-
|
|
225
|
+
undefined,
|
|
217
226
|
);
|
|
218
|
-
|
|
219
227
|
return upgradeWebSocket(() => wsHandler)(c, noopNext());
|
|
220
228
|
} else {
|
|
221
229
|
throw new Error(`Unreachable path: ${path}`);
|
|
@@ -237,7 +245,7 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
237
245
|
key: actor.state.key as string[],
|
|
238
246
|
};
|
|
239
247
|
} catch (error) {
|
|
240
|
-
logger().error("failed to read actor state",
|
|
248
|
+
logger().error({ msg: "failed to read actor state", actorId, error });
|
|
241
249
|
return undefined;
|
|
242
250
|
}
|
|
243
251
|
}
|
|
@@ -297,6 +305,16 @@ export class FileSystemManagerDriver implements ManagerDriver {
|
|
|
297
305
|
};
|
|
298
306
|
}
|
|
299
307
|
|
|
308
|
+
displayInformation(): ManagerDisplayInformation {
|
|
309
|
+
return {
|
|
310
|
+
name: this.#state.persist ? "File System" : "Memory",
|
|
311
|
+
properties: {
|
|
312
|
+
...(this.#state.persist ? { Data: this.#state.storagePath } : {}),
|
|
313
|
+
Instances: this.#state.actorCountOnStartup.toString(),
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
|
|
300
318
|
extraStartupLog() {
|
|
301
319
|
return {
|
|
302
320
|
instances: this.#state.actorCountOnStartup,
|
package/src/inspector/config.ts
CHANGED
|
@@ -24,14 +24,16 @@ const defaultEnabled = () => {
|
|
|
24
24
|
|
|
25
25
|
const defaultInspectorOrigins = [
|
|
26
26
|
"http://localhost:43708",
|
|
27
|
+
"http://localhost:43709",
|
|
27
28
|
"https://studio.rivet.gg",
|
|
29
|
+
"https://inspect.rivet.dev",
|
|
28
30
|
];
|
|
29
31
|
|
|
30
32
|
const defaultCors: CorsOptions = {
|
|
31
33
|
origin: (origin) => {
|
|
32
34
|
if (
|
|
33
35
|
defaultInspectorOrigins.includes(origin) ||
|
|
34
|
-
(origin.startsWith("https://") && origin.endsWith("rivet-
|
|
36
|
+
(origin.startsWith("https://") && origin.endsWith("rivet-dev.vercel.app"))
|
|
35
37
|
) {
|
|
36
38
|
return origin;
|
|
37
39
|
} else {
|
|
@@ -40,10 +42,13 @@ const defaultCors: CorsOptions = {
|
|
|
40
42
|
},
|
|
41
43
|
allowMethods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
|
|
42
44
|
allowHeaders: [
|
|
43
|
-
"Content-Type",
|
|
44
45
|
"Authorization",
|
|
45
|
-
|
|
46
|
-
"
|
|
46
|
+
"Content-Type",
|
|
47
|
+
"User-Agent",
|
|
48
|
+
"baggage",
|
|
49
|
+
"sentry-trace",
|
|
50
|
+
"x-rivet-actor",
|
|
51
|
+
"x-rivet-target",
|
|
47
52
|
],
|
|
48
53
|
maxAge: 3600,
|
|
49
54
|
credentials: true,
|
package/src/inspector/log.ts
CHANGED
package/src/inspector/manager.ts
CHANGED
|
@@ -35,7 +35,7 @@ export function createManagerInspectorRouter() {
|
|
|
35
35
|
});
|
|
36
36
|
return c.json(actors, 200);
|
|
37
37
|
} catch (error) {
|
|
38
|
-
inspectorLogger().error("Failed to fetch actors", error);
|
|
38
|
+
inspectorLogger().error({ msg: "Failed to fetch actors", error });
|
|
39
39
|
return c.json("Failed to fetch actors", 500);
|
|
40
40
|
}
|
|
41
41
|
})
|
|
@@ -81,6 +81,6 @@ export class ManagerInspector {
|
|
|
81
81
|
|
|
82
82
|
constructor(accessors: () => ManagerInspectorAccessors) {
|
|
83
83
|
this.accessors = accessors();
|
|
84
|
-
inspectorLogger().debug("Manager Inspector enabled and ready");
|
|
84
|
+
inspectorLogger().debug({ msg: "Manager Inspector enabled and ready" });
|
|
85
85
|
}
|
|
86
86
|
}
|
package/src/inspector/utils.ts
CHANGED
package/src/manager/driver.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Env, Hono, Context as HonoContext } from "hono";
|
|
2
|
-
import type { ActorKey, Encoding } from "@/actor/mod";
|
|
2
|
+
import type { ActorKey, Encoding, UniversalWebSocket } from "@/actor/mod";
|
|
3
3
|
import type { ManagerInspector } from "@/inspector/manager";
|
|
4
4
|
import type { RunConfig } from "@/mod";
|
|
5
5
|
import type { RegistryConfig } from "@/registry/config";
|
|
@@ -21,7 +21,7 @@ export interface ManagerDriver {
|
|
|
21
21
|
actorId: string,
|
|
22
22
|
encoding: Encoding,
|
|
23
23
|
params: unknown,
|
|
24
|
-
): Promise<
|
|
24
|
+
): Promise<UniversalWebSocket>;
|
|
25
25
|
proxyRequest(
|
|
26
26
|
c: HonoContext,
|
|
27
27
|
actorRequest: Request,
|
|
@@ -36,6 +36,8 @@ export interface ManagerDriver {
|
|
|
36
36
|
authData: unknown,
|
|
37
37
|
): Promise<Response>;
|
|
38
38
|
|
|
39
|
+
displayInformation(): ManagerDisplayInformation;
|
|
40
|
+
|
|
39
41
|
extraStartupLog?: () => Record<string, unknown>;
|
|
40
42
|
|
|
41
43
|
modifyManagerRouter?: (registryConfig: RegistryConfig, router: Hono) => void;
|
|
@@ -45,6 +47,12 @@ export interface ManagerDriver {
|
|
|
45
47
|
*/
|
|
46
48
|
readonly inspector?: ManagerInspector;
|
|
47
49
|
}
|
|
50
|
+
|
|
51
|
+
export interface ManagerDisplayInformation {
|
|
52
|
+
name: string;
|
|
53
|
+
properties: Record<string, string>;
|
|
54
|
+
}
|
|
55
|
+
|
|
48
56
|
export interface GetForIdInput<E extends Env = any> {
|
|
49
57
|
c?: HonoContext | undefined;
|
|
50
58
|
name: string;
|
|
@@ -70,7 +70,8 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
try {
|
|
73
|
-
logger().debug(
|
|
73
|
+
logger().debug({
|
|
74
|
+
msg: "bridge sending data",
|
|
74
75
|
dataType: typeof data,
|
|
75
76
|
isString: typeof data === "string",
|
|
76
77
|
isArrayBuffer: data instanceof ArrayBuffer,
|
|
@@ -104,19 +105,23 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
104
105
|
(this.#ws as any).send(buffer);
|
|
105
106
|
})
|
|
106
107
|
.catch((error) => {
|
|
107
|
-
logger().error(
|
|
108
|
+
logger().error({
|
|
109
|
+
msg: "failed to convert blob to arraybuffer",
|
|
110
|
+
error,
|
|
111
|
+
});
|
|
108
112
|
this.#fireEvent("error", { type: "error", target: this, error });
|
|
109
113
|
});
|
|
110
114
|
} else {
|
|
111
115
|
// Try to convert to string as a fallback
|
|
112
|
-
logger().warn(
|
|
116
|
+
logger().warn({
|
|
117
|
+
msg: "unsupported data type, converting to string",
|
|
113
118
|
dataType: typeof data,
|
|
114
119
|
data,
|
|
115
120
|
});
|
|
116
121
|
(this.#ws as any).send(String(data));
|
|
117
122
|
}
|
|
118
123
|
} catch (error) {
|
|
119
|
-
logger().error("error sending websocket data",
|
|
124
|
+
logger().error({ msg: "error sending websocket data", error });
|
|
120
125
|
this.#fireEvent("error", { type: "error", target: this, error });
|
|
121
126
|
throw error;
|
|
122
127
|
}
|
|
@@ -144,7 +149,7 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
144
149
|
wasClean: code === 1000,
|
|
145
150
|
});
|
|
146
151
|
} catch (error) {
|
|
147
|
-
logger().error("error closing websocket",
|
|
152
|
+
logger().error({ msg: "error closing websocket", error });
|
|
148
153
|
this.#readyState = this.CLOSED;
|
|
149
154
|
this.#fireEvent("close", {
|
|
150
155
|
type: "close",
|
|
@@ -177,7 +182,10 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
177
182
|
try {
|
|
178
183
|
listener(event);
|
|
179
184
|
} catch (error) {
|
|
180
|
-
logger().error(
|
|
185
|
+
logger().error({
|
|
186
|
+
msg: `error in ${event.type} event listener`,
|
|
187
|
+
error,
|
|
188
|
+
});
|
|
181
189
|
}
|
|
182
190
|
}
|
|
183
191
|
}
|
|
@@ -201,7 +209,8 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
201
209
|
messageData = String(data);
|
|
202
210
|
}
|
|
203
211
|
|
|
204
|
-
logger().debug(
|
|
212
|
+
logger().debug({
|
|
213
|
+
msg: "bridge handling message",
|
|
205
214
|
dataType: typeof messageData,
|
|
206
215
|
isArrayBuffer: messageData instanceof ArrayBuffer,
|
|
207
216
|
dataStr: typeof messageData === "string" ? messageData : "<binary>",
|
|
@@ -251,7 +260,7 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
251
260
|
try {
|
|
252
261
|
listener(event);
|
|
253
262
|
} catch (error) {
|
|
254
|
-
logger().error(`error in ${type} event listener`,
|
|
263
|
+
logger().error({ msg: `error in ${type} event listener`, error });
|
|
255
264
|
}
|
|
256
265
|
}
|
|
257
266
|
}
|
|
@@ -263,7 +272,7 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
263
272
|
try {
|
|
264
273
|
this.#onopen(event);
|
|
265
274
|
} catch (error) {
|
|
266
|
-
logger().error("error in onopen handler",
|
|
275
|
+
logger().error({ msg: "error in onopen handler", error });
|
|
267
276
|
}
|
|
268
277
|
}
|
|
269
278
|
break;
|
|
@@ -272,7 +281,7 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
272
281
|
try {
|
|
273
282
|
this.#onclose(event);
|
|
274
283
|
} catch (error) {
|
|
275
|
-
logger().error("error in onclose handler",
|
|
284
|
+
logger().error({ msg: "error in onclose handler", error });
|
|
276
285
|
}
|
|
277
286
|
}
|
|
278
287
|
break;
|
|
@@ -281,7 +290,7 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
281
290
|
try {
|
|
282
291
|
this.#onerror(event);
|
|
283
292
|
} catch (error) {
|
|
284
|
-
logger().error("error in onerror handler",
|
|
293
|
+
logger().error({ msg: "error in onerror handler", error });
|
|
285
294
|
}
|
|
286
295
|
}
|
|
287
296
|
break;
|
|
@@ -290,7 +299,7 @@ export class HonoWebSocketAdapter implements UniversalWebSocket {
|
|
|
290
299
|
try {
|
|
291
300
|
this.#onmessage(event);
|
|
292
301
|
} catch (error) {
|
|
293
|
-
logger().error("error in onmessage handler",
|
|
302
|
+
logger().error({ msg: "error in onmessage handler", error });
|
|
294
303
|
}
|
|
295
304
|
}
|
|
296
305
|
break;
|
package/src/manager/log.ts
CHANGED
package/src/manager/mod.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { ManagerDriver } from "./driver";
|
|
1
|
+
export { ManagerDisplayInformation, ManagerDriver } from "./driver";
|
|
2
2
|
export { createManagerRouter } from "./router";
|