UNPKG

@rivetkit/redis

Version:

_Lightweight Libraries for Backends_

1 lines 85.1 kB
{"version":3,"sources":["/home/nathan/rivetkit/packages/drivers/redis/dist/mod.cjs","../src/mod.ts","../src/config.ts","../src/coordinate/config.ts","../src/coordinate.ts","../src/coordinate/node/mod.ts","../src/coordinate/relay-conn.ts","../src/coordinate/node/message.ts","../src/coordinate/node/message-handlers/fetch.ts","../src/coordinate/node/message-handlers/websocket-follower.ts","../src/coordinate/node/message-handlers/websocket-leader.ts","../src/coordinate/node/proxy-websocket.ts","../src/coordinate/node/relay-websocket-adapter.ts"],"names":["z","toUint8Array","_a"],"mappings":"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","file":"/home/nathan/rivetkit/packages/drivers/redis/dist/mod.cjs","sourcesContent":[null,"import {\n\ttype DriverConfig as CoreDriverConfig,\n\tcreateActorRouter,\n\tcreateClientWithDriver,\n\tcreateInlineClientDriver,\n} from \"@rivetkit/core\";\nimport type { Redis } from \"ioredis\";\nimport { RedisActorDriver } from \"./actor\";\nimport { RedisDriverConfig } from \"./config\";\n\nexport {\n\tRedisDriverConfig,\n\ttype RedisDriverConfig as RedisDriverConfigType,\n} from \"./config\";\n\nimport { RedisCoordinateDriver } from \"./coordinate\";\nimport { Node } from \"./coordinate/node/mod\";\nimport type { GlobalState } from \"./coordinate/types\";\nimport { RedisManagerDriver } from \"./manager\";\n\nexport { type DriverContext, RedisActorDriver } from \"./actor\";\nexport { RedisManagerDriver } from \"./manager\";\n\nexport function createRedisDriver(\n\toptions?: Partial<RedisDriverConfig>,\n): CoreDriverConfig {\n\t// Create driver config - the schema will handle defaults\n\tconst driverConfig = RedisDriverConfig.parse({\n\t\t...options,\n\t\tactorPeer: {\n\t\t\t...options?.actorPeer,\n\t\t\tleaseDuration: options?.actorPeer?.leaseDuration ?? 3000,\n\t\t\trenewLeaseGrace: options?.actorPeer?.renewLeaseGrace ?? 1500,\n\t\t\tcheckLeaseInterval: options?.actorPeer?.checkLeaseInterval ?? 1000,\n\t\t\tcheckLeaseJitter: options?.actorPeer?.checkLeaseJitter ?? 500,\n\t\t\tmessageAckTimeout: options?.actorPeer?.messageAckTimeout ?? 1000,\n\t\t},\n\t});\n\n\tconst globalState: GlobalState = {\n\t\tnodeId: crypto.randomUUID(),\n\t\tactorPeers: new Map(),\n\t\trelayConns: new Map(),\n\t\tmessageAckResolvers: new Map(),\n\t\tactionResponseResolvers: new Map(),\n\t\tfetchResponseResolvers: new Map(),\n\t\trawWebSockets: new Map(),\n\t\tfollowerWebSockets: new Map(),\n\t\trelayWebSockets: new Map(),\n\t};\n\n\t// TODO: Move this in to global state\n\tconst coordinate = new RedisCoordinateDriver(\n\t\tdriverConfig,\n\t\tdriverConfig.redis,\n\t);\n\n\t// TODO: Do not create duplicate nodes\n\treturn {\n\t\tname: \"redis\",\n\t\tmanager: (registryConfig, runConfig) => {\n\t\t\tconst manager = new RedisManagerDriver(\n\t\t\t\tregistryConfig,\n\t\t\t\tdriverConfig,\n\t\t\t\tdriverConfig.redis,\n\t\t\t);\n\n\t\t\t// Dummy actor router that we route requests to\n\t\t\tconst inlineClient = createClientWithDriver(\n\t\t\t\tcreateInlineClientDriver(manager),\n\t\t\t);\n\t\t\tconst actorDriver = new RedisActorDriver(\n\t\t\t\tglobalState,\n\t\t\t\tdriverConfig.redis,\n\t\t\t\tdriverConfig,\n\t\t\t);\n\t\t\tconst actorRouter = createActorRouter(runConfig, actorDriver);\n\n\t\t\tconst node = new Node(\n\t\t\t\tregistryConfig,\n\t\t\t\trunConfig,\n\t\t\t\tdriverConfig,\n\t\t\t\tmanager,\n\t\t\t\tcoordinate,\n\t\t\t\tglobalState,\n\t\t\t\tinlineClient,\n\t\t\t\tactorDriver,\n\t\t\t\tactorRouter,\n\t\t\t);\n\t\t\tmanager.node = node;\n\n\t\t\t// TODO: This will cause a race condition since this is async\n\t\t\tnode.start();\n\n\t\t\treturn manager;\n\t\t},\n\t\tactor: (registryConfig, runConfig, managerDriver, inlineClient) => {\n\t\t\treturn new RedisActorDriver(\n\t\t\t\tglobalState,\n\t\t\t\tdriverConfig.redis,\n\t\t\t\tdriverConfig,\n\t\t\t);\n\t\t},\n\t};\n}\n","import { Redis } from \"ioredis\";\nimport { z } from \"zod\";\nimport { CoordinateDriverConfig } from \"./coordinate/config\";\n\nexport const RedisDriverConfig = CoordinateDriverConfig.extend({\n\tredis: z\n\t\t.custom<Redis>((val) => val instanceof Redis, {\n\t\t\tmessage: \"Must be an instance of Redis\",\n\t\t})\n\t\t.optional()\n\t\t.default(\n\t\t\t() =>\n\t\t\t\tnew Redis({\n\t\t\t\t\thost: process.env.REDIS_HOST ?? \"localhost\",\n\t\t\t\t\tport: process.env.REDIS_PORT\n\t\t\t\t\t\t? parseInt(process.env.REDIS_PORT, 10)\n\t\t\t\t\t\t: 6379,\n\t\t\t\t\tpassword: process.env.REDIS_PASSWORD,\n\t\t\t\t}),\n\t\t),\n\tkeyPrefix: z\n\t\t.string()\n\t\t.default(() => process.env.REDIS_KEY_PREFIX ?? \"rivetkit\"),\n});\n\nexport type RedisDriverConfig = z.infer<typeof RedisDriverConfig>;\n\nexport { CoordinateDriverConfig as DriverConfig } from \"./coordinate/config\";\n","import { z } from \"zod\";\n\nexport const CoordinateDriverConfig = z.object({\n\tactorPeer: z.object({\n\t\tleaseDuration: z.number().default(3000),\n\t\trenewLeaseGrace: z.number().default(1500),\n\t\tcheckLeaseInterval: z.number().default(1000),\n\t\tcheckLeaseJitter: z.number().default(500),\n\t\tmessageAckTimeout: z.number().default(1000),\n\t}),\n});\n\nexport type CoordinateDriverConfig = z.infer<typeof CoordinateDriverConfig>;\n","import * as cbor from \"cbor-x\";\nimport dedent from \"dedent\";\nimport type Redis from \"ioredis\";\nimport type { RedisDriverConfig } from \"./config\";\nimport type {\n\tAttemptAcquireLease,\n\tCoordinateDriver,\n\tExtendLeaseOutput,\n\tGetActorLeaderOutput,\n\tNodeMessageCallback,\n\tStartActorAndAcquireLeaseOutput,\n} from \"./coordinate/driver\";\nimport type { NodeMessage } from \"./coordinate/node/protocol\";\nimport { KEYS, PUBSUB } from \"./keys\";\n\n// Define custom commands for ioredis\ndeclare module \"ioredis\" {\n\tinterface RedisCommander {\n\t\tactorPeerAcquireLease(\n\t\t\tnodeKey: string,\n\t\t\tnodeId: string,\n\t\t\tleaseDuration: number,\n\t\t): Promise<string>;\n\t\tactorPeerExtendLease(\n\t\t\tnodeKey: string,\n\t\t\tnodeId: string,\n\t\t\tleaseDuration: number,\n\t\t): Promise<number>;\n\t\tactorPeerReleaseLease(nodeKey: string, nodeId: string): Promise<number>;\n\t}\n\n\tinterface ChainableCommander {\n\t\tactorPeerAcquireLease(\n\t\t\tnodeKey: string,\n\t\t\tnodeId: string,\n\t\t\tleaseDuration: number,\n\t\t): this;\n\t}\n}\n\nexport class RedisCoordinateDriver implements CoordinateDriver {\n\t#driverConfig: RedisDriverConfig;\n\t#redis: Redis;\n\t#nodeSub?: Redis;\n\n\tconstructor(driverConfig: RedisDriverConfig, redis: Redis) {\n\t\tthis.#driverConfig = driverConfig;\n\t\tthis.#redis = redis;\n\n\t\t// Define Redis Lua scripts for atomic operations\n\t\tthis.#defineRedisScripts();\n\t}\n\n\tasync createNodeSubscriber(\n\t\tselfNodeId: string,\n\t\tcallback: NodeMessageCallback,\n\t): Promise<void> {\n\t\t// Create a dedicated Redis connection for subscriptions\n\t\tthis.#nodeSub = this.#redis.duplicate();\n\n\t\t// Configure message handler\n\t\tthis.#nodeSub.on(\n\t\t\t\"messageBuffer\",\n\t\t\t(_channel: string, messageRaw: Buffer) => {\n\t\t\t\tconst message = cbor.decode(messageRaw);\n\t\t\t\tcallback(message);\n\t\t\t},\n\t\t);\n\n\t\t// Subscribe to node-specific channel\n\t\tawait this.#nodeSub.subscribe(\n\t\t\tPUBSUB.node(this.#driverConfig.keyPrefix, selfNodeId),\n\t\t);\n\t}\n\n\tasync publishToNode(\n\t\ttargetNodeId: string,\n\t\tmessage: NodeMessage,\n\t): Promise<void> {\n\t\tawait this.#redis.publish(\n\t\t\tPUBSUB.node(this.#driverConfig.keyPrefix, targetNodeId),\n\t\t\tcbor.encode(message),\n\t\t);\n\t}\n\n\tasync getActorLeader(actorId: string): Promise<GetActorLeaderOutput> {\n\t\t// Get current leader from Redis\n\t\tconst [metadata, nodeId] = await this.#redis.mget([\n\t\t\t// TODO: Use exists in pipeline instead of getting all data\n\t\t\tKEYS.ACTOR.metadata(this.#driverConfig.keyPrefix, actorId),\n\t\t\tKEYS.ACTOR.LEASE.node(this.#driverConfig.keyPrefix, actorId),\n\t\t]);\n\n\t\tif (!metadata) {\n\t\t\treturn { actor: undefined };\n\t\t}\n\n\t\treturn {\n\t\t\tactor: {\n\t\t\t\tleaderNodeId: nodeId || undefined,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync startActorAndAcquireLease(\n\t\tactorId: string,\n\t\tselfNodeId: string,\n\t\tleaseDuration: number,\n\t): Promise<StartActorAndAcquireLeaseOutput> {\n\t\t// Execute multi to get actor info and attempt to acquire lease in a single operation\n\t\tconst execRes = await this.#redis\n\t\t\t.multi()\n\t\t\t.getBuffer(KEYS.ACTOR.metadata(this.#driverConfig.keyPrefix, actorId))\n\t\t\t.actorPeerAcquireLease(\n\t\t\t\tKEYS.ACTOR.LEASE.node(this.#driverConfig.keyPrefix, actorId),\n\t\t\t\tselfNodeId,\n\t\t\t\tleaseDuration,\n\t\t\t)\n\t\t\t.exec();\n\n\t\tif (!execRes) {\n\t\t\tthrow new Error(\"Redis transaction failed\");\n\t\t}\n\n\t\tconst [[getErr, getRes], [leaseErr, leaseRes]] = execRes;\n\n\t\tif (getErr) throw new Error(`Redis GET error: ${getErr}`);\n\t\tif (leaseErr) throw new Error(`Redis acquire lease error: ${leaseErr}`);\n\n\t\tconst metadataRaw = getRes as Buffer | null;\n\t\tconst leaderNodeId = leaseRes as unknown as string;\n\n\t\tif (!metadataRaw) {\n\t\t\treturn { actor: undefined };\n\t\t}\n\n\t\t// Parse metadata if present\n\t\tif (!metadataRaw)\n\t\t\tthrow new Error(\"Actor should have metadata if initialized.\");\n\t\tconst metadata = cbor.decode(metadataRaw);\n\n\t\treturn {\n\t\t\tactor: {\n\t\t\t\tname: metadata.name,\n\t\t\t\tkey: metadata.key,\n\t\t\t\tleaderNodeId,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync extendLease(\n\t\tactorId: string,\n\t\tselfNodeId: string,\n\t\tleaseDuration: number,\n\t): Promise<ExtendLeaseOutput> {\n\t\tconst res = await this.#redis.actorPeerExtendLease(\n\t\t\tKEYS.ACTOR.LEASE.node(this.#driverConfig.keyPrefix, actorId),\n\t\t\tselfNodeId,\n\t\t\tleaseDuration,\n\t\t);\n\n\t\treturn {\n\t\t\tleaseValid: res === 1,\n\t\t};\n\t}\n\n\tasync attemptAcquireLease(\n\t\tactorId: string,\n\t\tselfNodeId: string,\n\t\tleaseDuration: number,\n\t): Promise<AttemptAcquireLease> {\n\t\tconst newLeaderNodeId = await this.#redis.actorPeerAcquireLease(\n\t\t\tKEYS.ACTOR.LEASE.node(this.#driverConfig.keyPrefix, actorId),\n\t\t\tselfNodeId,\n\t\t\tleaseDuration,\n\t\t);\n\n\t\treturn {\n\t\t\tnewLeaderNodeId,\n\t\t};\n\t}\n\n\tasync releaseLease(actorId: string, nodeId: string): Promise<void> {\n\t\tawait this.#redis.actorPeerReleaseLease(\n\t\t\tKEYS.ACTOR.LEASE.node(this.#driverConfig.keyPrefix, actorId),\n\t\t\tnodeId,\n\t\t);\n\t}\n\n\t#defineRedisScripts() {\n\t\t// Add custom Lua script commands to Redis\n\t\tthis.#redis.defineCommand(\"actorPeerAcquireLease\", {\n\t\t\tnumberOfKeys: 1,\n\t\t\tlua: dedent`\n -- Get the current value of the key\n local currentValue = redis.call(\"get\", KEYS[1])\n\n -- Return the current value if an entry already exists\n if currentValue then\n return currentValue\n end\n\n -- Create an entry for the provided key\n redis.call(\"set\", KEYS[1], ARGV[1], \"PX\", ARGV[2])\n\n -- Return the value to indicate the entry was added\n return ARGV[1]\n `,\n\t\t});\n\n\t\tthis.#redis.defineCommand(\"actorPeerExtendLease\", {\n\t\t\tnumberOfKeys: 1,\n\t\t\tlua: dedent`\n -- Return 0 if an entry exists with a different lease holder\n if redis.call(\"get\", KEYS[1]) ~= ARGV[1] then\n return 0\n end\n\n -- Update the entry for the provided key\n redis.call(\"set\", KEYS[1], ARGV[1], \"PX\", ARGV[2])\n\n -- Return 1 to indicate the entry was updated\n return 1\n `,\n\t\t});\n\n\t\tthis.#redis.defineCommand(\"actorPeerReleaseLease\", {\n\t\t\tnumberOfKeys: 1,\n\t\t\tlua: dedent`\n -- Only remove the entry for this lock value\n if redis.call(\"get\", KEYS[1]) == ARGV[1] then\n redis.pcall(\"del\", KEYS[1])\n return 1\n end\n\n -- Return 0 if no entry was removed.\n return 0\n `,\n\t\t});\n\t}\n}\n","import {\n\tActionContext,\n\ttype ActorRouter,\n\ttype AnyClient,\n\tcreateActorRouter,\n\tcreateClientWithDriver,\n\tcreateInlineClientDriver,\n\ttype Encoding,\n\tgenerateConnId,\n\tgenerateConnToken,\n\thandleRawWebSocketHandler,\n\thandleWebSocketConnect,\n\tInlineWebSocketAdapter2,\n\tnoopNext,\n\tPATH_CONNECT_WEBSOCKET,\n\tPATH_RAW_WEBSOCKET_PREFIX,\n\ttype RegistryConfig,\n\tRivetCloseEvent,\n\ttype RunConfig,\n\tUniversalWebSocket,\n} from \"@rivetkit/core\";\nimport type { ActorDriver, ManagerDriver } from \"@rivetkit/core/driver-helpers\";\nimport { assertUnreachable } from \"@rivetkit/core/utils\";\nimport * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport { ActorPeer } from \"../actor-peer\";\nimport type { CoordinateDriverConfig } from \"../config\";\nimport type { CoordinateDriver } from \"../driver\";\nimport { logger } from \"../log\";\nimport { RelayConn } from \"../relay-conn\";\nimport type { GlobalState } from \"../types\";\nimport {\n\tLeaderChangedError,\n\tpublishMessageToLeader,\n\tpublishMessageToLeaderNoRetry,\n} from \"./message\";\nimport {\n\thandleFollowerFetchResponse,\n\thandleLeaderFetch,\n} from \"./message-handlers/fetch\";\nimport {\n\thandleFollowerWebSocketClose,\n\thandleFollowerWebSocketMessage,\n\thandleFollowerWebSocketOpen,\n} from \"./message-handlers/websocket-follower\";\nimport {\n\thandleLeaderWebSocketClose,\n\thandleLeaderWebSocketMessage,\n\thandleLeaderWebSocketOpen,\n} from \"./message-handlers/websocket-leader\";\nimport {\n\ttype Ack,\n\ttype NodeMessage,\n\tNodeMessageSchema,\n\ttype ToFollowerFetchResponse,\n} from \"./protocol\";\nimport { proxyWebSocket as proxyWebSocketImpl } from \"./proxy-websocket\";\nimport { RelayWebSocketAdapter } from \"./relay-websocket-adapter\";\n\nexport class Node {\n\t#registryConfig: RegistryConfig;\n\t#runConfig: RunConfig;\n\t#driverConfig: CoordinateDriverConfig;\n\t#coordinateDriver: CoordinateDriver;\n\t#globalState: GlobalState;\n\t#inlineClient: AnyClient;\n\t#actorDriver: ActorDriver;\n\t#actorRouter: ActorRouter;\n\n\tget inlineClient() {\n\t\treturn this.#inlineClient;\n\t}\n\tget actorDriver() {\n\t\treturn this.#actorDriver;\n\t}\n\n\tconstructor(\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tdriverConfig: CoordinateDriverConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tcoordinateDriver: CoordinateDriver,\n\t\tglobalState: GlobalState,\n\t\tinlineClient: AnyClient,\n\t\tactorDriver: ActorDriver,\n\t\tactorRouter: ActorRouter,\n\t) {\n\t\tthis.#registryConfig = registryConfig;\n\t\tthis.#runConfig = runConfig;\n\t\tthis.#driverConfig = driverConfig;\n\t\tthis.#coordinateDriver = coordinateDriver;\n\t\tthis.#globalState = globalState;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#actorRouter = actorRouter;\n\t}\n\n\tget globalState(): GlobalState {\n\t\treturn this.#globalState;\n\t}\n\n\tget coordinateDriver(): CoordinateDriver {\n\t\treturn this.#coordinateDriver;\n\t}\n\n\tget registryConfig(): RegistryConfig {\n\t\treturn this.#registryConfig;\n\t}\n\n\tget runConfig(): RunConfig {\n\t\treturn this.#runConfig;\n\t}\n\n\tget driverConfig(): CoordinateDriverConfig {\n\t\treturn this.#driverConfig;\n\t}\n\n\tasync start() {\n\t\tlogger().debug(\"starting\", { nodeId: this.#globalState.nodeId });\n\n\t\t// Subscribe to events\n\t\t//\n\t\t// We intentionally design this so there's only one topic for the subscriber to listen on in order to reduce chattiness to the pubsub server.\n\t\t//\n\t\t// If we had a dedicated topic for each actor, we'd have to create a SUB for each leader & follower for each actor which is much more expensive than one for each node.\n\t\t//\n\t\t// Additionally, in most serverless environments, 1 node usually owns 1 actor, so this would double the RTT to create the required subscribers.\n\t\tawait this.#coordinateDriver.createNodeSubscriber(\n\t\t\tthis.#globalState.nodeId,\n\t\t\tthis.#onMessage.bind(this),\n\t\t);\n\n\t\tlogger().debug(\"node started\", { nodeId: this.#globalState.nodeId });\n\t}\n\n\tasync #onMessage(data: NodeMessage) {\n\t\tconst shouldAck = !!(data.n && data.m);\n\t\tlogger().debug(\"node received message\", { data, shouldAck });\n\n\t\t// Ack message\n\t\tif (shouldAck) {\n\t\t\tinvariant(data.n && data.m, \"unreachable\");\n\n\t\t\tif (\"a\" in data.b) {\n\t\t\t\tthrow new Error(\"Ack messages cannot request ack in response\");\n\t\t\t}\n\n\t\t\tconst messageRaw: NodeMessage = {\n\t\t\t\tb: {\n\t\t\t\t\ta: {\n\t\t\t\t\t\tm: data.m,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis.#coordinateDriver.publishToNode(data.n, messageRaw);\n\t\t}\n\n\t\t// Handle message\n\t\tif (\"a\" in data.b) {\n\t\t\tawait this.#onAck(data.b.a);\n\t\t} else if (\"lf\" in data.b) {\n\t\t\tawait handleLeaderFetch(\n\t\t\t\tthis.#globalState,\n\t\t\t\tthis.#coordinateDriver,\n\t\t\t\tthis.#actorRouter,\n\t\t\t\tdata.n,\n\t\t\t\tdata.b.lf,\n\t\t\t);\n\t\t} else if (\"ffr\" in data.b) {\n\t\t\thandleFollowerFetchResponse(this.#globalState, data.b.ffr);\n\t\t} else if (\"lwo\" in data.b) {\n\t\t\tlogger().debug(\"received lwo (leader websocket open) message\", {\n\t\t\t\twebsocketId: data.b.lwo.wi,\n\t\t\t\tactorId: data.b.lwo.ai,\n\t\t\t\tfromNodeId: data.n,\n\t\t\t});\n\t\t\tawait handleLeaderWebSocketOpen(\n\t\t\t\tthis.#globalState,\n\t\t\t\tthis.#coordinateDriver,\n\t\t\t\tthis.#runConfig,\n\t\t\t\tthis.#actorDriver,\n\t\t\t\tdata.n,\n\t\t\t\tdata.b.lwo,\n\t\t\t);\n\t\t} else if (\"lwm\" in data.b) {\n\t\t\tawait handleLeaderWebSocketMessage(this.#globalState, data.b.lwm);\n\t\t} else if (\"lwc\" in data.b) {\n\t\t\tawait handleLeaderWebSocketClose(this.#globalState, data.b.lwc);\n\t\t} else if (\"fwo\" in data.b) {\n\t\t\tlogger().debug(\"received fwo (follower websocket open) message\", {\n\t\t\t\twebsocketId: data.b.fwo.wi,\n\t\t\t});\n\t\t\tawait handleFollowerWebSocketOpen(this.#globalState, data.b.fwo);\n\t\t} else if (\"fwm\" in data.b) {\n\t\t\tawait handleFollowerWebSocketMessage(this.#globalState, data.b.fwm);\n\t\t} else if (\"fwc\" in data.b) {\n\t\t\tawait handleFollowerWebSocketClose(this.#globalState, data.b.fwc);\n\t\t} else {\n\t\t\tassertUnreachable(data.b);\n\t\t}\n\t}\n\n\tasync #onAck({ m: messageId }: Ack) {\n\t\tconst resolveAck = this.#globalState.messageAckResolvers.get(messageId);\n\t\tif (resolveAck) {\n\t\t\tresolveAck();\n\t\t\tthis.#globalState.messageAckResolvers.delete(messageId);\n\t\t} else {\n\t\t\tlogger().warn(\"missing ack resolver\", { messageId });\n\t\t}\n\t}\n\n\tasync sendRequest(\n\t\tactorId: string,\n\t\tactorRequest: Request,\n\t\tabortController?: AbortController,\n\t): Promise<Response> {\n\t\t// Generate request ID\n\t\tconst requestId = crypto.randomUUID();\n\n\t\t// Extract request details\n\t\tconst url = new URL(actorRequest.url);\n\t\tconst headers: Record<string, string> = {};\n\t\tactorRequest.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\n\t\tlet body: Uint8Array | undefined;\n\t\tif (actorRequest.body) {\n\t\t\tconst buffer = await actorRequest.arrayBuffer();\n\t\t\tbody = new Uint8Array(buffer);\n\t\t}\n\n\t\t// Create promise to wait for response\n\t\tconst responsePromise = new Promise<ToFollowerFetchResponse>((resolve) => {\n\t\t\tthis.#globalState.fetchResponseResolvers.set(requestId, resolve);\n\t\t});\n\n\t\t// Open connection\n\t\tconst relayConn = new RelayConn(\n\t\t\tthis.#registryConfig,\n\t\t\tthis.#runConfig,\n\t\t\tthis.#driverConfig,\n\t\t\tthis.#actorDriver,\n\t\t\tthis.#inlineClient,\n\t\t\tthis.#coordinateDriver,\n\t\t\tthis.#globalState,\n\t\t\t{\n\t\t\t\tdisconnect: async (_reason: any) => {\n\t\t\t\t\t// TODO: Abort request client-side\n\t\t\t\t},\n\t\t\t},\n\t\t\tactorId,\n\t\t);\n\t\tawait relayConn.start();\n\n\t\t// Publish request\n\t\ttry {\n\t\t\tconst message: NodeMessage = {\n\t\t\t\tb: {\n\t\t\t\t\tlf: {\n\t\t\t\t\t\tri: requestId,\n\t\t\t\t\t\tai: actorId,\n\t\t\t\t\t\tmethod: actorRequest.method,\n\t\t\t\t\t\turl: url.pathname + url.search,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\tbody,\n\t\t\t\t\t\t// TODO: Auth data\n\t\t\t\t\t\tad: undefined,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tawait relayConn.publishMessageToleader(message, true);\n\t\t} catch (error) {\n\t\t\tthis.#globalState.fetchResponseResolvers.delete(requestId);\n\t\t\tif (error instanceof Error) {\n\t\t\t\treturn new Response(error.message, { status: 503 });\n\t\t\t}\n\t\t\treturn new Response(\n\t\t\t\t\"Service unavailable (cannot send message to actor leader)\",\n\t\t\t\t{ status: 503 },\n\t\t\t);\n\t\t}\n\n\t\t// Wait for response with timeout (publishMessageToLeader already handles leader retries)\n\t\tconst response = await responsePromise.finally(() => {\n\t\t\tthis.#globalState.fetchResponseResolvers.delete(requestId);\n\t\t});\n\n\t\t// Handle error response\n\t\tif (response.error) {\n\t\t\treturn new Response(response.error, {\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t}\n\n\t\t// Reconstruct response\n\t\tconst responseBody = response.body;\n\n\t\treturn new Response(responseBody, {\n\t\t\tstatus: response.status,\n\t\t\theaders: response.headers,\n\t\t});\n\t}\n\n\t// TODO: Clean up disconnecting logic for websocket. There might be missed edge conditions depending on if client or server terminates the websocket\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tconnParams: unknown,\n\t): Promise<WebSocket> {\n\t\t// Create WebSocket ID\n\t\tconst websocketId = crypto.randomUUID();\n\n\t\tlogger().debug(\"opening websocket for inline client\", {\n\t\t\twebsocketId,\n\t\t\tactorId,\n\t\t\tpath,\n\t\t\tencoding,\n\t\t\tnodeId: this.#globalState.nodeId,\n\t\t});\n\n\t\t// Open connection\n\t\tconst relayConn = new RelayConn(\n\t\t\tthis.#registryConfig,\n\t\t\tthis.#runConfig,\n\t\t\tthis.#driverConfig,\n\t\t\tthis.#actorDriver,\n\t\t\tthis.#inlineClient,\n\t\t\tthis.#coordinateDriver,\n\t\t\tthis.#globalState,\n\t\t\t{\n\t\t\t\tdisconnect: async (_reason: any) => {\n\t\t\t\t\t// TODO: Abort request client-side\n\t\t\t\t},\n\t\t\t},\n\t\t\tactorId,\n\t\t);\n\t\tawait relayConn.start();\n\n\t\t// Create a WebSocket adapter that relays messages BEFORE sending the open message\n\t\t// This ensures the adapter is registered when the open confirmation arrives\n\t\tconst adapter = new RelayWebSocketAdapter(this, websocketId, relayConn);\n\t\tthis.#globalState.relayWebSockets.set(websocketId, adapter);\n\n\t\t// Open WebSocket\n\t\tconst openMessage: NodeMessage = {\n\t\t\tb: {\n\t\t\t\tlwo: {\n\t\t\t\t\tai: actorId,\n\t\t\t\t\twi: websocketId,\n\t\t\t\t\turl: path,\n\t\t\t\t\te: encoding,\n\t\t\t\t\tcp: connParams,\n\t\t\t\t\tad: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tawait relayConn.publishMessageToleader(openMessage, true);\n\n\t\tlogger().debug(\"websocket adapter created, waiting for open\", {\n\t\t\twebsocketId,\n\t\t});\n\n\t\t// Wait for the WebSocket to be open before returning\n\t\tlogger().debug(\"waiting for websocket adapter open promise\", {\n\t\t\twebsocketId,\n\t\t\tactorId,\n\t\t\tpath,\n\t\t\tencoding,\n\t\t\tadapterReadyState: adapter.readyState,\n\t\t});\n\t\tawait adapter.openPromise;\n\t\tlogger().debug(\"websocket adapter open promise resolved\", {\n\t\t\twebsocketId,\n\t\t\tactorId,\n\t\t\tadapterReadyState: adapter.readyState,\n\t\t});\n\n\t\tlogger().debug(\"websocket adapter ready\", { websocketId });\n\n\t\treturn adapter;\n\t}\n\n\t// TODO: Implement abort controller\n\tasync proxyRequest(\n\t\tc: HonoContext,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\treturn await this.sendRequest(actorId, actorRequest);\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tconnParams: unknown,\n\t\tauthData: unknown,\n\t): Promise<Response> {\n\t\treturn proxyWebSocketImpl(\n\t\t\tthis,\n\n\t\t\tc,\n\t\t\tpath,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tconnParams,\n\t\t\tauthData,\n\t\t);\n\t}\n}\n","import {\n\tgenerateConnId,\n\tgenerateConnToken,\n\ttype Registry,\n\ttype RegistryConfig,\n\ttype RunConfig,\n} from \"@rivetkit/core\";\nimport type { Client } from \"@rivetkit/core/client\";\nimport type { ActorDriver } from \"@rivetkit/core/driver-helpers\";\nimport * as errors from \"@rivetkit/core/errors\";\nimport { ActorPeer } from \"./actor-peer\";\nimport type { CoordinateDriverConfig } from \"./config\";\nimport type { CoordinateDriver } from \"./driver\";\nimport { logger } from \"./log\";\nimport {\n\tpublishMessageToLeader,\n\tpublishMessageToLeaderNoRetry,\n} from \"./node/message\";\nimport type { NodeMessage } from \"./node/protocol\";\nimport type { GlobalState } from \"./types\";\n\nexport interface RelayConnDriver {\n\t/** Called on disconnect (regardless of source). */\n\tdisconnect(reason?: string): Promise<void>;\n}\n\n/**\n * This is different than `Connection`. `Connection` represents the data of the connection state on the actor itself, `RelayConnection` supports managing a connection for a actor running on another machine over pubsub.\n */\nexport class RelayConn {\n\t#registryConfig: RegistryConfig;\n\t#runConfig: RunConfig;\n\t#driverConfig: CoordinateDriverConfig;\n\t#coordinateDriver: CoordinateDriver;\n\t#actorDriver: ActorDriver;\n\t#inlineClient: Client<Registry<any>>;\n\t#globalState: GlobalState;\n\t#driver: RelayConnDriver;\n\t#actorId: string;\n\n\t#actorPeer?: ActorPeer;\n\n\t#connId?: string;\n\t#connToken?: string;\n\n\t#disposed = false;\n\n\t#abortController = new AbortController();\n\n\tpublic get actorId(): string {\n\t\treturn this.#actorId;\n\t}\n\n\tpublic get connId(): string {\n\t\tif (!this.#connId) throw new errors.InternalError(\"Missing connId\");\n\t\treturn this.#connId;\n\t}\n\n\tpublic get connToken(): string {\n\t\tif (!this.#connToken) throw new errors.InternalError(\"Missing connToken\");\n\t\treturn this.#connToken;\n\t}\n\n\tconstructor(\n\t\tregistryConfig: RegistryConfig,\n\t\trunConfig: RunConfig,\n\t\tdriverConfig: CoordinateDriverConfig,\n\t\tactorDriver: ActorDriver,\n\t\tinlineClient: Client<Registry<any>>,\n\t\tcoordinateDriver: CoordinateDriver,\n\t\tglobalState: GlobalState,\n\t\tdriver: RelayConnDriver,\n\t\tactorId: string,\n\t) {\n\t\tthis.#registryConfig = registryConfig;\n\t\tthis.#runConfig = runConfig;\n\t\tthis.#driverConfig = driverConfig;\n\t\tthis.#coordinateDriver = coordinateDriver;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#driver = driver;\n\t\tthis.#globalState = globalState;\n\t\tthis.#actorId = actorId;\n\t}\n\n\tasync start() {\n\t\t// TODO: Handle errors gracefully\n\n\t\t// Add connection\n\t\tconst connId = generateConnId();\n\t\tconst connToken = generateConnToken();\n\t\tthis.#connId = connId;\n\t\tthis.#connToken = connToken;\n\n\t\tlogger().debug(\"starting relay connection\", {\n\t\t\tactorId: this.#actorId,\n\t\t\tconnId: this.#connId,\n\t\t});\n\n\t\t// Create actor peer\n\t\tthis.#actorPeer = await ActorPeer.acquire(\n\t\t\tthis.#registryConfig,\n\t\t\tthis.#runConfig,\n\t\t\tthis.#driverConfig,\n\t\t\tthis.#actorDriver,\n\t\t\tthis.#inlineClient,\n\t\t\tthis.#coordinateDriver,\n\t\t\tthis.#globalState,\n\t\t\tthis.#actorId,\n\t\t\tconnId,\n\t\t);\n\n\t\tthis.#globalState.relayConns.set(connId, this);\n\t}\n\n\tasync publishMessageToleader(message: NodeMessage, retry: boolean) {\n\t\tif (this.#disposed) {\n\t\t\tlogger().warn(\n\t\t\t\t\"attempted to call sendMessageToLeader on disposed RelayConn\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (retry) {\n\t\t\tawait publishMessageToLeader(\n\t\t\t\tthis.#registryConfig,\n\t\t\t\tthis.#driverConfig,\n\t\t\t\tthis.#coordinateDriver,\n\t\t\t\tthis.#globalState,\n\t\t\t\tthis.#actorId,\n\t\t\t\tmessage,\n\t\t\t\tthis.#abortController.signal,\n\t\t\t);\n\t\t} else {\n\t\t\tawait publishMessageToLeaderNoRetry(\n\t\t\t\tthis.#registryConfig,\n\t\t\t\tthis.#driverConfig,\n\t\t\t\tthis.#coordinateDriver,\n\t\t\t\tthis.#globalState,\n\t\t\t\tthis.#actorId,\n\t\t\t\tmessage,\n\t\t\t\tthis.#abortController.signal,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Closes the connection and cleans it up.\n\t *\n\t * @param fromLeader - If this message is coming from the leader. This will prevent sending a close message back to the leader.\n\t */\n\tasync disconnect(\n\t\tfromLeader: boolean,\n\t\treason: string | undefined,\n\t\tdisconnectMessageToleader: NodeMessage | undefined,\n\t) {\n\t\tif (this.#disposed) {\n\t\t\tlogger().warn(\"attempted to call disconnect on disposed RelayConn\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#disposed = true;\n\n\t\tthis.#abortController.abort();\n\n\t\t// Disconnect driver\n\t\tawait this.#driver.disconnect(reason);\n\n\t\t// Clean up state\n\t\tif (this.#connId) {\n\t\t\t// Remove connection\n\t\t\tthis.#globalState.relayConns.delete(this.#connId);\n\n\t\t\t// Publish connection close\n\t\t\tif (!fromLeader && this.#actorPeer?.leaderNodeId) {\n\t\t\t\tif (disconnectMessageToleader) {\n\t\t\t\t\tawait publishMessageToLeader(\n\t\t\t\t\t\tthis.#registryConfig,\n\t\t\t\t\t\tthis.#driverConfig,\n\t\t\t\t\t\tthis.#coordinateDriver,\n\t\t\t\t\t\tthis.#globalState,\n\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\tdisconnectMessageToleader,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove reference to actor (will shut down if no more references)\n\t\t\t//\n\t\t\t// IMPORTANT: Do this last since we need to send the connection close event\n\t\t\tawait this.#actorPeer?.removeConnectionReference(this.#connId);\n\t\t} else {\n\t\t\tlogger().warn(\"disposing connection without connection id\");\n\t\t}\n\t}\n}\n","import type { RegistryConfig } from \"@rivetkit/core\";\nimport pRetry, { AbortError } from \"p-retry\";\nimport type { CoordinateDriverConfig } from \"../config\";\nimport type { CoordinateDriver } from \"../driver\";\nimport { logger } from \"../log\";\nimport type { GlobalState } from \"../types\";\nimport type { NodeMessage } from \"./protocol\";\n\n/**\n * Publishes a message and waits for an ack. If no ack is received, then retries accordingly.\n *\n * This should be used any time a message to the leader is being published since it correctly handles leadership transfer edge cases.\n */\nexport async function publishMessageToLeader(\n\tregistryConfig: RegistryConfig,\n\tdriverConfig: CoordinateDriverConfig,\n\tCoordinateDriver: CoordinateDriver,\n\tglobalState: GlobalState,\n\tactorId: string,\n\tmessage: NodeMessage,\n\tsignal?: AbortSignal,\n) {\n\t// Include node\n\tmessage.n = globalState.nodeId;\n\n\t// Add message ID for ack\n\tconst messageId = crypto.randomUUID();\n\tmessage.m = messageId;\n\n\t// Retry publishing message\n\tawait pRetry(\n\t\t() =>\n\t\t\tpublishMessageToLeaderInner(\n\t\t\t\tregistryConfig,\n\t\t\t\tdriverConfig,\n\t\t\t\tCoordinateDriver,\n\t\t\t\tglobalState,\n\t\t\t\tactorId,\n\t\t\t\tmessageId,\n\t\t\t\tmessage,\n\t\t\t\tsignal,\n\t\t\t),\n\t\t{\n\t\t\tsignal,\n\t\t\tminTimeout: 1000,\n\t\t\tretries: 5,\n\t\t\tonFailedAttempt: (error) => {\n\t\t\t\tlogger().warn(\"error publishing message\", {\n\t\t\t\t\tattempt: error.attemptNumber,\n\t\t\t\t\terror: error.message,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t);\n}\n\n/**\n * Publishes a message to the leader without retrying on failure.\n *\n * This is specifically designed for WebSocket messages where retry doesn't make sense.\n * On leader change, it throws a LeaderChangedError that can be caught to close the WebSocket.\n */\nexport async function publishMessageToLeaderNoR