From 3b98676eaf07478f16a71222484b3ddf06f2bef9 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 26 Jun 2025 07:09:37 +0000 Subject: [PATCH] chore: migrate persisted data storage to cbor --- examples/rivet/package.json | 2 +- examples/rivet/src/registry.ts | 2 +- packages/core/src/actor/driver.ts | 6 +-- packages/core/src/actor/instance.ts | 50 ++++++++++++------- packages/core/src/actor/persisted.ts | 6 ++- packages/core/src/driver-helpers/mod.ts | 16 ++++++ packages/core/src/drivers/memory/actor.ts | 8 +-- .../core/src/drivers/memory/global-state.ts | 17 +++---- .../core/src/drivers/rivet/actor-driver.ts | 24 ++------- packages/core/src/drivers/rivet/actor.ts | 7 ++- .../core/src/drivers/rivet/manager-driver.ts | 5 +- packages/core/src/inline-client-driver/mod.ts | 1 + packages/core/src/test/driver/actor.ts | 8 +-- packages/core/src/test/driver/global-state.ts | 17 +++---- packages/drivers/file-system/src/actor.ts | 13 +++-- .../drivers/file-system/src/global-state.ts | 17 ++----- packages/drivers/redis/src/actor.ts | 20 +++----- packages/drivers/redis/src/keys.ts | 2 - packages/drivers/redis/src/manager.ts | 1 - pnpm-lock.yaml | 18 +++---- 20 files changed, 114 insertions(+), 126 deletions(-) diff --git a/examples/rivet/package.json b/examples/rivet/package.json index 69c960b16..32f254f19 100644 --- a/examples/rivet/package.json +++ b/examples/rivet/package.json @@ -14,7 +14,7 @@ "typescript": "^5.5.2" }, "dependencies": { - "@rivetkit/actor": "https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4" + "@rivetkit/actor": "https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@7e018f2" }, "stableVersion": "0.8.0" } diff --git a/examples/rivet/src/registry.ts b/examples/rivet/src/registry.ts index 4d0a85af7..6bf067574 100644 --- a/examples/rivet/src/registry.ts +++ b/examples/rivet/src/registry.ts @@ -14,6 +14,6 @@ export const counter = actor({ }); export const registry = setup({ - actors: { counter }, + use: { counter }, }); diff --git a/packages/core/src/actor/driver.ts b/packages/core/src/actor/driver.ts index 364cd1592..20e681045 100644 --- a/packages/core/src/actor/driver.ts +++ b/packages/core/src/actor/driver.ts @@ -9,10 +9,8 @@ export interface ActorDriver { //load(): Promise; getContext(actorId: string): unknown; - readInput(actorId: string): Promise; - - readPersistedData(actorId: string): Promise; - writePersistedData(actorId: string, unknown: unknown): Promise; + readPersistedData(actorId: string): Promise; + writePersistedData(actorId: string, data: Uint8Array): Promise; // Schedule setAlarm(actor: AnyActorInstance, timestamp: number): Promise; diff --git a/packages/core/src/actor/instance.ts b/packages/core/src/actor/instance.ts index a0f4190de..5cf1ec9ba 100644 --- a/packages/core/src/actor/instance.ts +++ b/packages/core/src/actor/instance.ts @@ -24,6 +24,7 @@ import { processMessage } from "./protocol/message/mod"; import { CachedSerializer } from "./protocol/serde"; import { Schedule } from "./schedule"; import { DeadlineError, Lock, deadline } from "./utils"; +import * as cbor from "cbor-x"; /** * Options for the `_saveState` method. @@ -122,10 +123,10 @@ export class ActorInstance { * * Any data that should be stored indefinitely should be held within this object. */ - #persist!: PersistedActor; + #persist!: PersistedActor; /** Raw state without the proxy wrapper */ - #persistRaw!: PersistedActor; + #persistRaw!: PersistedActor; #writePersistLock = new Lock(void 0); @@ -426,7 +427,7 @@ export class ActorInstance { // Write to KV await this.#actorDriver.writePersistedData( this.#actorId, - this.#persistRaw, + cbor.encode(this.#persistRaw), ); logger().debug("persist saved"); @@ -443,7 +444,7 @@ export class ActorInstance { /** * Creates proxy for `#persist` that handles automatically flagging when state needs to be updated. */ - #setPersist(target: PersistedActor) { + #setPersist(target: PersistedActor) { // Set raw persist object this.#persistRaw = target; @@ -514,11 +515,21 @@ export class ActorInstance { async #initialize() { // Read initial state - const persistData = (await this.#actorDriver.readPersistedData( + const persistDataBuffer = await this.#actorDriver.readPersistedData( this.#actorId, - )) as PersistedActor; - - if (persistData !== undefined) { + ); + invariant( + persistDataBuffer !== undefined, + "persist data has not been set, it should be set when initialized", + ); + const persistData = cbor.decode(persistDataBuffer) as PersistedActor< + S, + CP, + CS, + I + >; + + if (persistData.hi) { logger().info("actor restoring", { connections: persistData.c.length, }); @@ -546,8 +557,6 @@ export class ActorInstance { } else { logger().info("actor creating"); - const input = (await this.#actorDriver.readInput(this.#actorId)) as I; - // Initialize actor state let stateData: unknown = undefined; if (this.stateEnabled) { @@ -567,7 +576,7 @@ export class ActorInstance { undefined, undefined >, - { input }, + { input: persistData.i }, ); } else if ("state" in this.#config) { stateData = structuredClone(this.#config.state); @@ -578,21 +587,24 @@ export class ActorInstance { logger().debug("state not enabled"); } - const persist: PersistedActor = { - s: stateData as S, - c: [], - e: [], - }; + // Save state and mark as initialized + persistData.s = stateData as S; + persistData.hi = true; // Update state logger().debug("writing state"); - await this.#actorDriver.writePersistedData(this.#actorId, persist); + await this.#actorDriver.writePersistedData( + this.#actorId, + cbor.encode(persistData), + ); - this.#setPersist(persist); + this.#setPersist(persistData); // Notify creation if (this.#config.onCreate) { - await this.#config.onCreate(this.actorContext, { input }); + await this.#config.onCreate(this.actorContext, { + input: persistData.i, + }); } } } diff --git a/packages/core/src/actor/persisted.ts b/packages/core/src/actor/persisted.ts index 1c4c55762..76063616e 100644 --- a/packages/core/src/actor/persisted.ts +++ b/packages/core/src/actor/persisted.ts @@ -1,5 +1,9 @@ /** State object that gets automatically persisted to storage. */ -export interface PersistedActor { +export interface PersistedActor { + // Input + i?: I, + // Has initialized + hi: boolean, // State s: S; // Connections diff --git a/packages/core/src/driver-helpers/mod.ts b/packages/core/src/driver-helpers/mod.ts index dd8cfebab..80d32a8eb 100644 --- a/packages/core/src/driver-helpers/mod.ts +++ b/packages/core/src/driver-helpers/mod.ts @@ -1,3 +1,5 @@ +import { PersistedActor } from "@/actor/persisted"; + export type { ActorInstance, AnyActorInstance } from "@/actor/instance"; export type { AttemptAcquireLease, @@ -27,3 +29,17 @@ export { HEADER_CONN_TOKEN, } from "@/actor/router-endpoints"; export { RunConfigSchema, DriverConfigSchema } from "@/registry/run-config"; +import * as cbor from "cbor-x"; + +export function serializeEmptyPersistData( + input: unknown | undefined, +): Uint8Array { + const persistData: PersistedActor = { + i: input, + hi: false, + s: undefined, + c: [], + e: [], + }; + return cbor.encode(persistData); +} diff --git a/packages/core/src/drivers/memory/actor.ts b/packages/core/src/drivers/memory/actor.ts index 5f4032f00..e0ddd9541 100644 --- a/packages/core/src/drivers/memory/actor.ts +++ b/packages/core/src/drivers/memory/actor.ts @@ -14,15 +14,11 @@ export class MemoryActorDriver implements ActorDriver { return {}; } - async readInput(actorId: string): Promise { - return this.#state.readInput(actorId); - } - - async readPersistedData(actorId: string): Promise { + async readPersistedData(actorId: string): Promise { return this.#state.readPersistedData(actorId); } - async writePersistedData(actorId: string, data: unknown): Promise { + async writePersistedData(actorId: string, data: Uint8Array): Promise { this.#state.writePersistedData(actorId, data); } diff --git a/packages/core/src/drivers/memory/global-state.ts b/packages/core/src/drivers/memory/global-state.ts index 5aafc9770..9b6099821 100644 --- a/packages/core/src/drivers/memory/global-state.ts +++ b/packages/core/src/drivers/memory/global-state.ts @@ -1,11 +1,11 @@ import type { ActorKey } from "@/actor/mod"; +import { serializeEmptyPersistData } from "@/driver-helpers/mod"; export interface ActorState { id: string; name: string; key: ActorKey; - persistedData: unknown; - input?: unknown; + persistedData: Uint8Array; } export class MemoryGlobalState { @@ -19,15 +19,11 @@ export class MemoryGlobalState { return actor; } - readInput(actorId: string): unknown | undefined { - return this.#getActor(actorId).input; - } - - readPersistedData(actorId: string): unknown | undefined { + readPersistedData(actorId: string): Uint8Array | undefined { return this.#getActor(actorId).persistedData; } - writePersistedData(actorId: string, data: unknown) { + writePersistedData(actorId: string, data: Uint8Array) { this.#getActor(actorId).persistedData = data; } @@ -35,7 +31,7 @@ export class MemoryGlobalState { actorId: string, name: string, key: ActorKey, - input?: unknown, + input: unknown | undefined, ): void { // Create actor state if it doesn't exist if (!this.#actors.has(actorId)) { @@ -43,8 +39,7 @@ export class MemoryGlobalState { id: actorId, name, key, - persistedData: undefined, - input, + persistedData: serializeEmptyPersistData(input), }); } else { throw new Error(`Actor already exists for ID: ${actorId}`); diff --git a/packages/core/src/drivers/rivet/actor-driver.ts b/packages/core/src/drivers/rivet/actor-driver.ts index 2debd89c5..a354b950a 100644 --- a/packages/core/src/drivers/rivet/actor-driver.ts +++ b/packages/core/src/drivers/rivet/actor-driver.ts @@ -16,24 +16,10 @@ export class RivetActorDriver implements ActorDriver { return { ctx: this.#ctx }; } - async readInput(_actorId: string): Promise { - // Read input - // - // We need to have a separate exists flag in order to represent `undefined` - const entries = await this.#ctx.kv.getBatch([ - ["rivetkit", "input", "exists"], - ["rivetkit", "input", "data"], - ]); - - if (entries.get(["rivetkit", "input", "exists"]) === true) { - return await entries.get(["rivetkit", "input", "data"]); - } else { - return undefined; - } - } - - async readPersistedData(_actorId: string): Promise { - let data = await this.#ctx.kv.get(["rivetkit", "data"]); + async readPersistedData(_actorId: string): Promise { + let data = (await this.#ctx.kv.get(["rivetkit", "data"])) as + | Uint8Array + | undefined; // HACK: Modify to be undefined if null. This will be fixed in Actors v2. if (data === null) data = undefined; @@ -41,7 +27,7 @@ export class RivetActorDriver implements ActorDriver { return data; } - async writePersistedData(_actorId: string, data: unknown): Promise { + async writePersistedData(_actorId: string, data: Uint8Array): Promise { // Use "state" as the key for persisted data await this.#ctx.kv.put(["rivetkit", "data"], data); } diff --git a/packages/core/src/drivers/rivet/actor.ts b/packages/core/src/drivers/rivet/actor.ts index d4576ff3a..35bb3ef15 100644 --- a/packages/core/src/drivers/rivet/actor.ts +++ b/packages/core/src/drivers/rivet/actor.ts @@ -10,6 +10,7 @@ import { logger } from "./log"; import { RivetManagerDriver } from "./manager-driver"; import { type RivetClientConfig, getRivetClientConfig } from "./rivet-client"; import { type RivetHandler, deserializeKeyFromTag } from "./util"; +import * as cbor from "cbor-x"; export function createActorHandler( registry: Registry, @@ -131,7 +132,9 @@ async function startActor( // TODO: This needs to assert this has only been called once // Initialize with data router.post("/initialize", async (c) => { - const body = await c.req.json(); + const bodyBlob = await c.req.blob(); + const bodyBytes = await bodyBlob.bytes(); + const body = cbor.decode(bodyBytes); logger().debug("received initialize request", { hasInput: !!body.input, @@ -150,7 +153,7 @@ async function startActor( // Finish initialization initializedPromise.resolve(undefined); - return c.json({}, 200); + return c.body(cbor.encode({}), 200); }); // Start server diff --git a/packages/core/src/drivers/rivet/manager-driver.ts b/packages/core/src/drivers/rivet/manager-driver.ts index f322e58f1..b9b2b2a27 100644 --- a/packages/core/src/drivers/rivet/manager-driver.ts +++ b/packages/core/src/drivers/rivet/manager-driver.ts @@ -26,6 +26,7 @@ import { rivetRequest, } from "./rivet-client"; import { convertKeyToRivetTags } from "./util"; +import * as cbor from "cbor-x"; export interface ActorState { key: string[]; @@ -157,9 +158,9 @@ export class RivetManagerDriver implements ManagerDriver { const res = await fetch(url, { method: "POST", headers: { - "Content-Type": "application/json", + "Content-Type": "application/cbor", }, - body: JSON.stringify({ input }), + body: cbor.encode({ input }), }); if (!res.ok) { throw new InternalError( diff --git a/packages/core/src/inline-client-driver/mod.ts b/packages/core/src/inline-client-driver/mod.ts index 0a52e00d3..2fdf0cf4d 100644 --- a/packages/core/src/inline-client-driver/mod.ts +++ b/packages/core/src/inline-client-driver/mod.ts @@ -30,6 +30,7 @@ import type { WebSocket } from "ws"; import { FakeEventSource } from "./fake-event-source"; import { FakeWebSocket } from "./fake-websocket"; import { logger } from "./log"; +import * as cbor from "cbor-x"; /** * Client driver that calls the manager driver inline. diff --git a/packages/core/src/test/driver/actor.ts b/packages/core/src/test/driver/actor.ts index 0bcc9631f..6489069ea 100644 --- a/packages/core/src/test/driver/actor.ts +++ b/packages/core/src/test/driver/actor.ts @@ -19,15 +19,11 @@ export class TestActorDriver implements ActorDriver { }; } - async readInput(actorId: string): Promise { - return this.#state.readInput(actorId); - } - - async readPersistedData(actorId: string): Promise { + async readPersistedData(actorId: string): Promise { return this.#state.readPersistedData(actorId); } - async writePersistedData(actorId: string, data: unknown): Promise { + async writePersistedData(actorId: string, data: Uint8Array): Promise { this.#state.writePersistedData(actorId, data); } diff --git a/packages/core/src/test/driver/global-state.ts b/packages/core/src/test/driver/global-state.ts index 232855748..afd9cc034 100644 --- a/packages/core/src/test/driver/global-state.ts +++ b/packages/core/src/test/driver/global-state.ts @@ -1,11 +1,11 @@ import type { ActorKey } from "@/actor/mod"; +import { serializeEmptyPersistData } from "@/driver-helpers/mod"; export interface ActorState { id: string; name: string; key: ActorKey; - persistedData: unknown; - input?: unknown; + persistedData?: Uint8Array; } export class TestGlobalState { @@ -19,15 +19,11 @@ export class TestGlobalState { return actor; } - readInput(actorId: string): unknown | undefined { - return this.#getActor(actorId).input; - } - - readPersistedData(actorId: string): unknown | undefined { + readPersistedData(actorId: string): Uint8Array | undefined { return this.#getActor(actorId).persistedData; } - writePersistedData(actorId: string, data: unknown) { + writePersistedData(actorId: string, data: Uint8Array) { this.#getActor(actorId).persistedData = data; } @@ -35,7 +31,7 @@ export class TestGlobalState { actorId: string, name: string, key: ActorKey, - input?: unknown, + input: unknown | undefined, ): void { // Create actor state if it doesn't exist if (!this.#actors.has(actorId)) { @@ -43,8 +39,7 @@ export class TestGlobalState { id: actorId, name, key, - persistedData: undefined, - input, + persistedData: serializeEmptyPersistData(input), }); } else { throw new Error(`Actor already exists for ID: ${actorId}`); diff --git a/packages/drivers/file-system/src/actor.ts b/packages/drivers/file-system/src/actor.ts index a7bc60803..c762ad799 100644 --- a/packages/drivers/file-system/src/actor.ts +++ b/packages/drivers/file-system/src/actor.ts @@ -1,4 +1,7 @@ -import type { ActorDriver, AnyActorInstance } from "@rivetkit/core/driver-helpers"; +import type { + ActorDriver, + AnyActorInstance, +} from "@rivetkit/core/driver-helpers"; import type { FileSystemGlobalState } from "./global-state"; export type ActorDriverContext = Record; @@ -24,15 +27,11 @@ export class FileSystemActorDriver implements ActorDriver { return {}; } - async readInput(actorId: string): Promise { - return this.#state.readInput(actorId); - } - - async readPersistedData(actorId: string): Promise { + async readPersistedData(actorId: string): Promise { return this.#state.readPersistedData(actorId); } - async writePersistedData(actorId: string, data: unknown): Promise { + async writePersistedData(actorId: string, data: Uint8Array): Promise { this.#state.writePersistedData(actorId, data); // Save state to disk diff --git a/packages/drivers/file-system/src/global-state.ts b/packages/drivers/file-system/src/global-state.ts index e6e3b3aad..ccc5f5225 100644 --- a/packages/drivers/file-system/src/global-state.ts +++ b/packages/drivers/file-system/src/global-state.ts @@ -18,8 +18,7 @@ export interface ActorState { id: string; name: string; key: ActorKey; - persistedData: unknown; - input?: unknown; + persistedData?: Uint8Array; } /** @@ -107,15 +106,10 @@ export class FileSystemGlobalState { return cachedActor; } - readInput(actorId: string): unknown | undefined { - const state = this.loadActorState(actorId); - return state.input; - } - /** * Read persisted data for a actor */ - readPersistedData(actorId: string): unknown | undefined { + readPersistedData(actorId: string): Uint8Array | undefined { const state = this.loadActorState(actorId); return state.persistedData; } @@ -123,7 +117,7 @@ export class FileSystemGlobalState { /** * Write persisted data for a actor */ - writePersistedData(actorId: string, data: unknown): void { + writePersistedData(actorId: string, data: Uint8Array): void { const state = this.loadActorState(actorId); state.persistedData = data; } @@ -182,7 +176,7 @@ export class FileSystemGlobalState { actorId: string, name: string, key: ActorKey, - input?: unknown, + input: unknown | undefined, ): Promise { // Check if actor already exists if (this.hasActor(actorId)) { @@ -194,8 +188,7 @@ export class FileSystemGlobalState { id: actorId, name, key, - persistedData: undefined, - input, + persistedData: serializeEmptyPersistData(input), }; // Cache the state diff --git a/packages/drivers/redis/src/actor.ts b/packages/drivers/redis/src/actor.ts index e6ba9917d..198b7680c 100644 --- a/packages/drivers/redis/src/actor.ts +++ b/packages/drivers/redis/src/actor.ts @@ -1,4 +1,7 @@ -import type { ActorDriver, AnyActorInstance } from "@rivetkit/core/driver-helpers"; +import type { + ActorDriver, + AnyActorInstance, +} from "@rivetkit/core/driver-helpers"; import type Redis from "ioredis"; import { KEYS } from "./keys"; @@ -17,20 +20,13 @@ export class RedisActorDriver implements ActorDriver { return { redis: this.#redis }; } - async readInput(actorId: string): Promise { - // TODO: We should read this all in one batch, this will require multiple RTT to Redis - const data = await this.#redis.get(KEYS.ACTOR.input(actorId)); - if (data !== null) return JSON.parse(data); + async readPersistedData(actorId: string): Promise { + const data = await this.#redis.getBuffer(KEYS.ACTOR.persistedData(actorId)); + if (data !== null) return data; return undefined; } - async readPersistedData(actorId: string): Promise { - const data = await this.#redis.get(KEYS.ACTOR.persistedData(actorId)); - if (data !== null) return JSON.parse(data); - return undefined; - } - - async writePersistedData(actorId: string, data: unknown): Promise { + async writePersistedData(actorId: string, data: Uint8Array): Promise { await this.#redis.set( KEYS.ACTOR.persistedData(actorId), JSON.stringify(data), diff --git a/packages/drivers/redis/src/keys.ts b/packages/drivers/redis/src/keys.ts index db16aaa2e..78f0968a3 100644 --- a/packages/drivers/redis/src/keys.ts +++ b/packages/drivers/redis/src/keys.ts @@ -10,8 +10,6 @@ export const KEYS = { metadata: (actorId: string) => `actor:${actorId}:metadata`, // KEY persistedData: (actorId: string) => `actor:${actorId}:persisted_data`, - // KEY - input: (actorId: string) => `actor:${actorId}:input`, }, }; diff --git a/packages/drivers/redis/src/manager.ts b/packages/drivers/redis/src/manager.ts index fb631e1d0..a9e160770 100644 --- a/packages/drivers/redis/src/manager.ts +++ b/packages/drivers/redis/src/manager.ts @@ -108,7 +108,6 @@ export class RedisManagerDriver implements ManagerDriver { // Store basic actor information pipeline.set(KEYS.ACTOR.initialized(actorId), "1"); pipeline.set(KEYS.ACTOR.metadata(actorId), JSON.stringify({ name, key })); - pipeline.set(KEYS.ACTOR.input(actorId), JSON.stringify(input)); // Create direct lookup by name+key -> actorId pipeline.set(actorKeyRedisKey, actorId); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e760b11f..a2a8f2d7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -366,8 +366,8 @@ importers: examples/rivet: dependencies: '@rivetkit/actor': - specifier: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4 - version: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2) + specifier: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@7e018f2 + version: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@7e018f2(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2) devDependencies: '@types/node': specifier: ^22.13.9 @@ -1769,12 +1769,12 @@ packages: '@rivet-gg/actor-core@25.2.0': resolution: {integrity: sha512-4K72XcDLVAz44Ae6G6GuyzWyxQZOLN8jM/W+sVKm6fHr70X8FNCSC5+/9hFIxz/OH9E6q6Wi3V/UN/k6immUBQ==} - '@rivetkit/actor@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4': - resolution: {tarball: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4} + '@rivetkit/actor@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@7e018f2': + resolution: {tarball: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@7e018f2} version: 0.9.0-rc.1 - '@rivetkit/core@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2': - resolution: {tarball: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2} + '@rivetkit/core@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@7e018f2ae7792d0f3b6a867ab7ad4eaf7cac87a7': + resolution: {tarball: https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@7e018f2ae7792d0f3b6a867ab7ad4eaf7cac87a7} version: 0.9.0-rc.1 engines: {node: '>=22.0.0'} peerDependencies: @@ -5017,16 +5017,16 @@ snapshots: dependencies: zod: 3.25.67 - '@rivetkit/actor@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@cb1e6d4(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2)': + '@rivetkit/actor@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/actor@7e018f2(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2)': dependencies: - '@rivetkit/core': https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2) + '@rivetkit/core': https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@7e018f2ae7792d0f3b6a867ab7ad4eaf7cac87a7(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2) transitivePeerDependencies: - '@hono/node-server' - '@hono/node-ws' - eventsource - ws - '@rivetkit/core@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@cb1e6d4102ee4b3ab8861d46adbe33f50e7a4fd2(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2)': + '@rivetkit/core@https://pkg.pr.new/rivet-gg/rivetkit/@rivetkit/core@7e018f2ae7792d0f3b6a867ab7ad4eaf7cac87a7(@hono/node-server@1.14.4(hono@4.8.0))(@hono/node-ws@1.1.7(@hono/node-server@1.14.4(hono@4.8.0))(hono@4.8.0))(eventsource@3.0.7)(ws@8.18.2)': dependencies: '@hono/zod-openapi': 0.19.8(hono@4.8.0)(zod@3.25.67) cbor-x: 1.6.0