diff --git a/packages/core/package.json b/packages/core/package.json index 843b49bda..e78244c55 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -166,13 +166,13 @@ "nanoevents": "^9.1.0", "on-change": "^5.0.1", "p-retry": "^6.2.1", - "zod": "^3.25.76" + "zod": "^3.25.76", + "@rivetkit/engine-runner": "https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@f8860f3" }, "devDependencies": { "@hono/node-server": "^1.18.2", "@hono/node-ws": "^1.1.1", "@rivet-gg/actor-core": "^25.1.0", - "@rivetkit/engine-runner": "https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@7f23f3a", "@types/invariant": "^2", "@types/node": "^22.13.1", "@types/ws": "^8", diff --git a/packages/core/src/drivers/engine/actor-driver.ts b/packages/core/src/drivers/engine/actor-driver.ts index 1504ce5c9..1a63ae3b1 100644 --- a/packages/core/src/drivers/engine/actor-driver.ts +++ b/packages/core/src/drivers/engine/actor-driver.ts @@ -178,7 +178,10 @@ export class EngineActorDriver implements ActorDriver { // TODO: Use alarm on sleep // TODO: Send alarm to runner - throw new Error("Alarms not implemented for engine driver"); + const delay = Math.max(timestamp - Date.now(), 0); + setTimeout(() => { + actor.onAlarm(); + }, delay); } async getDatabase(_actorId: string): Promise { diff --git a/packages/core/src/drivers/engine/api-endpoints.ts b/packages/core/src/drivers/engine/api-endpoints.ts index e554a8424..9a3e8c551 100644 --- a/packages/core/src/drivers/engine/api-endpoints.ts +++ b/packages/core/src/drivers/engine/api-endpoints.ts @@ -1,4 +1,3 @@ -import { CreateRequest } from "@/client/mod"; import { apiCall } from "./api-utils"; import type { Config } from "./config"; import { serializeActorKey } from "./keys"; @@ -6,18 +5,12 @@ import { serializeActorKey } from "./keys"; // MARK: Common types export type RivetId = string; -export interface ActorLifecycle { - kill_timeout_ms: number; - durable: boolean; -} - export interface Actor { actor_id: RivetId; name: string; - keys: string[]; + key: string; namespace_id: RivetId; runner_name_selector: string; - lifecycle: ActorLifecycle; create_ts: number; connectable_ts?: number | null; destroy_ts?: number | null; @@ -46,9 +39,9 @@ export interface ActorsGetOrCreateByIdResponse { export interface ActorsCreateRequest { name: string; runner_name_selector: string; - keys?: string[] | null; + crash_policy: string; + key?: string | null; input?: string | null; - durable?: boolean | null; } export interface ActorsCreateResponse { @@ -86,10 +79,10 @@ export async function getActorById( // MARK: Get or create actor by id export interface ActorsGetOrCreateByIdRequest { name: string; - keys: string[]; + key: string; runner_name_selector: string; + crash_policy: "restart"; input?: string | null; - durable?: boolean | null; } export async function getOrCreateActorById( diff --git a/packages/core/src/drivers/engine/config.ts b/packages/core/src/drivers/engine/config.ts index 43aa694e5..bba07e28c 100644 --- a/packages/core/src/drivers/engine/config.ts +++ b/packages/core/src/drivers/engine/config.ts @@ -7,18 +7,22 @@ export const ConfigSchema = z app: z.custom().optional(), endpoint: z .string() - .default(getEnvUniversal("RIVET_ENGINE") ?? "http://localhost:7080"), + .default( + () => getEnvUniversal("RIVET_ENGINE") ?? "http://localhost:7080", + ), pegboardEndpoint: z.string().optional(), namespace: z .string() - .default(getEnvUniversal("RIVET_NAMESPACE") ?? "default"), + .default(() => getEnvUniversal("RIVET_NAMESPACE") ?? "default"), runnerName: z .string() - .default(getEnvUniversal("RIVET_RUNNER") ?? "rivetkit"), + .default(() => getEnvUniversal("RIVET_RUNNER") ?? "rivetkit"), // TODO: Automatically attempt ot determine key by common env vars (e.g. k8s pod name) runnerKey: z .string() - .default(getEnvUniversal("RIVET_RUNNER_KEY") ?? crypto.randomUUID()), + .default( + () => getEnvUniversal("RIVET_RUNNER_KEY") ?? crypto.randomUUID(), + ), totalSlots: z.number().default(100_000), addresses: z .record( diff --git a/packages/core/src/drivers/engine/manager-driver.ts b/packages/core/src/drivers/engine/manager-driver.ts index 971b28340..0eb7def2d 100644 --- a/packages/core/src/drivers/engine/manager-driver.ts +++ b/packages/core/src/drivers/engine/manager-driver.ts @@ -157,7 +157,7 @@ export class EngineManagerDriver implements ManagerDriver { return undefined; } - const keyRaw = response.actor.keys[0]; + const keyRaw = response.actor.key; invariant(keyRaw, `actor ${actorId} should have key`); const key = deserializeActorKey(keyRaw); @@ -233,10 +233,10 @@ export class EngineManagerDriver implements ManagerDriver { const response = await getOrCreateActorById(this.#config, { name, - keys: [serializeActorKey(key)], + key: serializeActorKey(key), runner_name_selector: this.#config.runnerName, input: input ? cbor.encode(actorInput).toString("base64") : undefined, - durable: true, + crash_policy: "restart", }); const actorId = response.actor_id; @@ -273,9 +273,9 @@ export class EngineManagerDriver implements ManagerDriver { const result = await createActor(this.#config, { name, runner_name_selector: this.#config.runnerName, - keys: [serializeActorKey(key)], + key: serializeActorKey(key), input: input ? cbor.encode(input).toString("base64") : null, - durable: true, + crash_policy: "restart", }); const actorId = result.actor.actor_id; diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts index 47fcd0762..b935a0a8e 100644 --- a/packages/core/tsup.config.ts +++ b/packages/core/tsup.config.ts @@ -1,6 +1,4 @@ import { defineConfig } from "tsup"; import defaultConfig from "../../tsup.base.ts"; -export default defineConfig({ - ...defaultConfig, -}); +export default defineConfig(defaultConfig); diff --git a/packages/drivers/cloudflare-workers/src/actor-handler-do.ts b/packages/drivers/cloudflare-workers/src/actor-handler-do.ts index 1d736e0a3..ee1beff37 100644 --- a/packages/drivers/cloudflare-workers/src/actor-handler-do.ts +++ b/packages/drivers/cloudflare-workers/src/actor-handler-do.ts @@ -12,6 +12,7 @@ import { } from "@rivetkit/core"; import { serializeEmptyPersistData } from "@rivetkit/core/driver-helpers"; import type { ExecutionContext } from "hono"; +import invariant from "invariant"; import { CloudflareDurableObjectGlobalState, createCloudflareActorsActorDriverBuilder, @@ -113,6 +114,7 @@ export function createActorDurableObject( globalState.setDOState(actorId, { ctx: this.ctx, env: env }); // Configure actor driver + invariant(runConfig.driver, "runConfig.driver"); runConfig.driver.actor = createCloudflareActorsActorDriverBuilder(globalState); @@ -184,6 +186,7 @@ export function createActorDurableObject( const actorId = this.ctx.id.toString(); // Get the actor driver + invariant(runConfig.driver, "runConfig.driver"); const managerDriver = runConfig.driver.manager( registry.config, runConfig, diff --git a/packages/drivers/redis/src/manager.ts b/packages/drivers/redis/src/manager.ts index 29ee9f8da..61fc51b4b 100644 --- a/packages/drivers/redis/src/manager.ts +++ b/packages/drivers/redis/src/manager.ts @@ -92,7 +92,7 @@ export class RedisManagerDriver implements ManagerDriver { return undefined; } - return this.getForId({ actorId }); + return this.getForId({ name, actorId }); } async getOrCreateWithKey( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1322130bb..6be1a7318 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1011,6 +1011,9 @@ importers: '@hono/zod-openapi': specifier: ^0.19.10 version: 0.19.10(hono@4.8.3)(zod@3.25.76) + '@rivetkit/engine-runner': + specifier: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@f8860f3 + version: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@f8860f3(hono@4.8.3) '@rivetkit/fast-json-patch': specifier: ^3.1.2 version: 3.1.2 @@ -1045,9 +1048,6 @@ importers: '@rivet-gg/actor-core': specifier: ^25.1.0 version: 25.2.0 - '@rivetkit/engine-runner': - specifier: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@7f23f3a - version: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@7f23f3a(hono@4.8.3) '@types/invariant': specifier: ^2 version: 2.2.37 @@ -2578,12 +2578,12 @@ packages: '@rivet-gg/actor-core@25.2.0': resolution: {integrity: sha512-4K72XcDLVAz44Ae6G6GuyzWyxQZOLN8jM/W+sVKm6fHr70X8FNCSC5+/9hFIxz/OH9E6q6Wi3V/UN/k6immUBQ==} - '@rivetkit/engine-runner-protocol@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@7f23f3afce4ae0548e50f331afafdfbdda51ae52': - resolution: {tarball: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@7f23f3afce4ae0548e50f331afafdfbdda51ae52} + '@rivetkit/engine-runner-protocol@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@f8860f3d1923948346447af2164a1953319c5987': + resolution: {tarball: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@f8860f3d1923948346447af2164a1953319c5987} version: 1.0.0 - '@rivetkit/engine-runner@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@7f23f3a': - resolution: {tarball: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@7f23f3a} + '@rivetkit/engine-runner@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@f8860f3': + resolution: {tarball: https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@f8860f3} version: 0.0.0 '@rivetkit/fast-json-patch@3.1.2': @@ -6001,14 +6001,14 @@ snapshots: dependencies: zod: 3.25.76 - '@rivetkit/engine-runner-protocol@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@7f23f3afce4ae0548e50f331afafdfbdda51ae52': + '@rivetkit/engine-runner-protocol@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@f8860f3d1923948346447af2164a1953319c5987': dependencies: '@bare-ts/lib': 0.4.0 - '@rivetkit/engine-runner@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@7f23f3a(hono@4.8.3)': + '@rivetkit/engine-runner@https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@f8860f3(hono@4.8.3)': dependencies: '@hono/node-server': 1.18.2(hono@4.8.3) - '@rivetkit/engine-runner-protocol': https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@7f23f3afce4ae0548e50f331afafdfbdda51ae52 + '@rivetkit/engine-runner-protocol': https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner-protocol@f8860f3d1923948346447af2164a1953319c5987 ws: 8.18.3 transitivePeerDependencies: - bufferutil