@rivetkit/cloudflare-workers 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mod.d.cts CHANGED
@@ -2,29 +2,23 @@ import * as hono_types from 'hono/types';
2
2
  import * as hono from 'hono';
3
3
  import { Hono } from 'hono';
4
4
  import * as _rivetkit_core_utils from '@rivetkit/core/utils';
5
+ import * as _rivetkit_core_driver_helpers from '@rivetkit/core/driver-helpers';
5
6
  import * as _rivetkit_core from '@rivetkit/core';
6
7
  import { ActorKey, Registry } from '@rivetkit/core';
7
- import * as _rivetkit_core_driver_helpers from '@rivetkit/core/driver-helpers';
8
8
  import { z } from 'zod';
9
9
  import { Client } from '@rivetkit/core/client';
10
10
  import { DurableObject } from 'cloudflare:workers';
11
11
 
12
12
  declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
13
13
  driver: z.ZodDefault<z.ZodOptional<z.ZodObject<{
14
- topology: z.ZodEnum<["standalone", "partition", "coordinate"]>;
15
- manager: z.ZodType<_rivetkit_core_driver_helpers.ManagerDriver, z.ZodTypeDef, _rivetkit_core_driver_helpers.ManagerDriver>;
16
- actor: z.ZodType<_rivetkit_core_driver_helpers.ActorDriver, z.ZodTypeDef, _rivetkit_core_driver_helpers.ActorDriver>;
17
- coordinate: z.ZodOptional<z.ZodType<_rivetkit_core.CoordinateDriver, z.ZodTypeDef, _rivetkit_core.CoordinateDriver>>;
14
+ manager: z.ZodType<(registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver, z.ZodTypeDef, (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver>;
15
+ actor: z.ZodType<(registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver, z.ZodTypeDef, (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver>;
18
16
  }, "strip", z.ZodTypeAny, {
19
- actor: _rivetkit_core_driver_helpers.ActorDriver;
20
- topology: "standalone" | "partition" | "coordinate";
21
- manager: _rivetkit_core_driver_helpers.ManagerDriver;
22
- coordinate?: _rivetkit_core.CoordinateDriver | undefined;
17
+ actor: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver;
18
+ manager: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver;
23
19
  }, {
24
- actor: _rivetkit_core_driver_helpers.ActorDriver;
25
- topology: "standalone" | "partition" | "coordinate";
26
- manager: _rivetkit_core_driver_helpers.ManagerDriver;
27
- coordinate?: _rivetkit_core.CoordinateDriver | undefined;
20
+ actor: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver;
21
+ manager: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver;
28
22
  }>>>;
29
23
  getUpgradeWebSocket: z.ZodOptional<z.ZodType<() => _rivetkit_core_utils.UpgradeWebSocket, z.ZodTypeDef, () => _rivetkit_core_utils.UpgradeWebSocket>>;
30
24
  cors: z.ZodOptional<z.ZodType<{
@@ -43,36 +37,10 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
43
37
  exposeHeaders?: string[];
44
38
  }>>;
45
39
  maxIncomingMessageSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
46
- actorPeer: z.ZodDefault<z.ZodOptional<z.ZodObject<{
47
- leaseDuration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
48
- renewLeaseGrace: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
49
- checkLeaseInterval: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
50
- checkLeaseJitter: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
51
- messageAckTimeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
52
- }, "strip", z.ZodTypeAny, {
53
- leaseDuration: number;
54
- renewLeaseGrace: number;
55
- checkLeaseInterval: number;
56
- checkLeaseJitter: number;
57
- messageAckTimeout: number;
58
- }, {
59
- leaseDuration?: number | undefined;
60
- renewLeaseGrace?: number | undefined;
61
- checkLeaseInterval?: number | undefined;
62
- checkLeaseJitter?: number | undefined;
63
- messageAckTimeout?: number | undefined;
64
- }>>>;
65
40
  }, "driver" | "getUpgradeWebSocket"> & {
66
41
  app: z.ZodOptional<z.ZodType<Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">, z.ZodTypeDef, Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">>>;
67
42
  }, "strip", z.ZodTypeAny, {
68
43
  maxIncomingMessageSize: number;
69
- actorPeer: {
70
- leaseDuration: number;
71
- renewLeaseGrace: number;
72
- checkLeaseInterval: number;
73
- checkLeaseJitter: number;
74
- messageAckTimeout: number;
75
- };
76
44
  cors?: {
77
45
  origin: string | string[] | ((origin: string, c: hono.Context) => string | undefined | null);
78
46
  allowMethods?: string[] | ((origin: string, c: hono.Context) => string[]);
@@ -92,13 +60,6 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
92
60
  exposeHeaders?: string[];
93
61
  } | undefined;
94
62
  maxIncomingMessageSize?: number | undefined;
95
- actorPeer?: {
96
- leaseDuration?: number | undefined;
97
- renewLeaseGrace?: number | undefined;
98
- checkLeaseInterval?: number | undefined;
99
- checkLeaseJitter?: number | undefined;
100
- messageAckTimeout?: number | undefined;
101
- } | undefined;
102
63
  app?: Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/"> | undefined;
103
64
  }>>;
104
65
  type InputConfig = z.input<typeof ConfigSchema>;
package/dist/mod.d.ts CHANGED
@@ -2,29 +2,23 @@ import * as hono_types from 'hono/types';
2
2
  import * as hono from 'hono';
3
3
  import { Hono } from 'hono';
4
4
  import * as _rivetkit_core_utils from '@rivetkit/core/utils';
5
+ import * as _rivetkit_core_driver_helpers from '@rivetkit/core/driver-helpers';
5
6
  import * as _rivetkit_core from '@rivetkit/core';
6
7
  import { ActorKey, Registry } from '@rivetkit/core';
7
- import * as _rivetkit_core_driver_helpers from '@rivetkit/core/driver-helpers';
8
8
  import { z } from 'zod';
9
9
  import { Client } from '@rivetkit/core/client';
10
10
  import { DurableObject } from 'cloudflare:workers';
11
11
 
12
12
  declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
13
13
  driver: z.ZodDefault<z.ZodOptional<z.ZodObject<{
14
- topology: z.ZodEnum<["standalone", "partition", "coordinate"]>;
15
- manager: z.ZodType<_rivetkit_core_driver_helpers.ManagerDriver, z.ZodTypeDef, _rivetkit_core_driver_helpers.ManagerDriver>;
16
- actor: z.ZodType<_rivetkit_core_driver_helpers.ActorDriver, z.ZodTypeDef, _rivetkit_core_driver_helpers.ActorDriver>;
17
- coordinate: z.ZodOptional<z.ZodType<_rivetkit_core.CoordinateDriver, z.ZodTypeDef, _rivetkit_core.CoordinateDriver>>;
14
+ manager: z.ZodType<(registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver, z.ZodTypeDef, (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver>;
15
+ actor: z.ZodType<(registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver, z.ZodTypeDef, (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver>;
18
16
  }, "strip", z.ZodTypeAny, {
19
- actor: _rivetkit_core_driver_helpers.ActorDriver;
20
- topology: "standalone" | "partition" | "coordinate";
21
- manager: _rivetkit_core_driver_helpers.ManagerDriver;
22
- coordinate?: _rivetkit_core.CoordinateDriver | undefined;
17
+ actor: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver;
18
+ manager: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver;
23
19
  }, {
24
- actor: _rivetkit_core_driver_helpers.ActorDriver;
25
- topology: "standalone" | "partition" | "coordinate";
26
- manager: _rivetkit_core_driver_helpers.ManagerDriver;
27
- coordinate?: _rivetkit_core.CoordinateDriver | undefined;
20
+ actor: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig, managerDriver: _rivetkit_core_driver_helpers.ManagerDriver, inlineClient: _rivetkit_core.AnyClient) => _rivetkit_core_driver_helpers.ActorDriver;
21
+ manager: (registryConfig: _rivetkit_core.RegistryConfig, runConfig: _rivetkit_core.RunConfig) => _rivetkit_core_driver_helpers.ManagerDriver;
28
22
  }>>>;
29
23
  getUpgradeWebSocket: z.ZodOptional<z.ZodType<() => _rivetkit_core_utils.UpgradeWebSocket, z.ZodTypeDef, () => _rivetkit_core_utils.UpgradeWebSocket>>;
30
24
  cors: z.ZodOptional<z.ZodType<{
@@ -43,36 +37,10 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
43
37
  exposeHeaders?: string[];
44
38
  }>>;
45
39
  maxIncomingMessageSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
46
- actorPeer: z.ZodDefault<z.ZodOptional<z.ZodObject<{
47
- leaseDuration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
48
- renewLeaseGrace: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
49
- checkLeaseInterval: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
50
- checkLeaseJitter: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
51
- messageAckTimeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
52
- }, "strip", z.ZodTypeAny, {
53
- leaseDuration: number;
54
- renewLeaseGrace: number;
55
- checkLeaseInterval: number;
56
- checkLeaseJitter: number;
57
- messageAckTimeout: number;
58
- }, {
59
- leaseDuration?: number | undefined;
60
- renewLeaseGrace?: number | undefined;
61
- checkLeaseInterval?: number | undefined;
62
- checkLeaseJitter?: number | undefined;
63
- messageAckTimeout?: number | undefined;
64
- }>>>;
65
40
  }, "driver" | "getUpgradeWebSocket"> & {
66
41
  app: z.ZodOptional<z.ZodType<Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">, z.ZodTypeDef, Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">>>;
67
42
  }, "strip", z.ZodTypeAny, {
68
43
  maxIncomingMessageSize: number;
69
- actorPeer: {
70
- leaseDuration: number;
71
- renewLeaseGrace: number;
72
- checkLeaseInterval: number;
73
- checkLeaseJitter: number;
74
- messageAckTimeout: number;
75
- };
76
44
  cors?: {
77
45
  origin: string | string[] | ((origin: string, c: hono.Context) => string | undefined | null);
78
46
  allowMethods?: string[] | ((origin: string, c: hono.Context) => string[]);
@@ -92,13 +60,6 @@ declare const ConfigSchema: z.ZodDefault<z.ZodObject<Omit<{
92
60
  exposeHeaders?: string[];
93
61
  } | undefined;
94
62
  maxIncomingMessageSize?: number | undefined;
95
- actorPeer?: {
96
- leaseDuration?: number | undefined;
97
- renewLeaseGrace?: number | undefined;
98
- checkLeaseInterval?: number | undefined;
99
- checkLeaseJitter?: number | undefined;
100
- messageAckTimeout?: number | undefined;
101
- } | undefined;
102
63
  app?: Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/"> | undefined;
103
64
  }>>;
104
65
  type InputConfig = z.input<typeof ConfigSchema>;
package/dist/mod.js CHANGED
@@ -1,15 +1,23 @@
1
1
  // src/handler.ts
2
2
  import { AsyncLocalStorage } from "async_hooks";
3
- import { PartitionTopologyManager } from "@rivetkit/core/topologies/partition";
4
3
  import { Hono } from "hono";
5
4
  import invariant2 from "invariant";
6
5
 
7
6
  // src/actor-handler-do.ts
8
7
  import { DurableObject } from "cloudflare:workers";
8
+ import {
9
+ createActorRouter,
10
+ createClientWithDriver,
11
+ createInlineClientDriver
12
+ } from "@rivetkit/core";
9
13
  import { serializeEmptyPersistData } from "@rivetkit/core/driver-helpers";
10
- import { PartitionTopologyActor } from "@rivetkit/core/topologies/partition";
11
14
 
12
15
  // src/actor-driver.ts
16
+ import {
17
+ createGenericConnDrivers,
18
+ GenericConnGlobalState,
19
+ lookupInRegistry
20
+ } from "@rivetkit/core";
13
21
  import invariant from "invariant";
14
22
  var CloudflareDurableObjectGlobalState = class {
15
23
  // Single map for all actor state
@@ -23,14 +31,76 @@ var CloudflareDurableObjectGlobalState = class {
23
31
  this.#dos.set(actorId, state);
24
32
  }
25
33
  };
34
+ var ActorHandler = class {
35
+ actor;
36
+ actorPromise = Promise.withResolvers();
37
+ genericConnGlobalState = new GenericConnGlobalState();
38
+ };
26
39
  var CloudflareActorsActorDriver = class {
40
+ #registryConfig;
41
+ #runConfig;
42
+ #managerDriver;
43
+ #inlineClient;
27
44
  #globalState;
28
- constructor(globalState) {
45
+ #actors = /* @__PURE__ */ new Map();
46
+ constructor(registryConfig, runConfig, managerDriver, inlineClient, globalState) {
47
+ this.#registryConfig = registryConfig;
48
+ this.#runConfig = runConfig;
49
+ this.#managerDriver = managerDriver;
50
+ this.#inlineClient = inlineClient;
29
51
  this.#globalState = globalState;
30
52
  }
31
53
  #getDOCtx(actorId) {
32
54
  return this.#globalState.getDOState(actorId).ctx;
33
55
  }
56
+ async loadActor(actorId) {
57
+ var _a;
58
+ let handler = this.#actors.get(actorId);
59
+ if (handler) {
60
+ if (handler.actorPromise) await handler.actorPromise.promise;
61
+ if (!handler.actor) throw new Error("Actor should be loaded");
62
+ return handler.actor;
63
+ }
64
+ handler = new ActorHandler();
65
+ this.#actors.set(actorId, handler);
66
+ const doState = this.#globalState.getDOState(actorId);
67
+ const storage = doState.ctx.storage;
68
+ const [name, key] = await Promise.all([
69
+ storage.get(KEYS.NAME),
70
+ storage.get(KEYS.KEY)
71
+ ]);
72
+ if (!name) {
73
+ throw new Error(`Actor ${actorId} is not initialized - missing name`);
74
+ }
75
+ if (!key) {
76
+ throw new Error(`Actor ${actorId} is not initialized - missing key`);
77
+ }
78
+ const definition = lookupInRegistry(this.#registryConfig, name);
79
+ handler.actor = definition.instantiate();
80
+ const connDrivers = createGenericConnDrivers(
81
+ handler.genericConnGlobalState
82
+ );
83
+ await handler.actor.start(
84
+ connDrivers,
85
+ this,
86
+ this.#inlineClient,
87
+ actorId,
88
+ name,
89
+ key,
90
+ "unknown"
91
+ // TODO: Support regions in Cloudflare
92
+ );
93
+ (_a = handler.actorPromise) == null ? void 0 : _a.resolve();
94
+ handler.actorPromise = void 0;
95
+ return handler.actor;
96
+ }
97
+ getGenericConnGlobalState(actorId) {
98
+ const handler = this.#actors.get(actorId);
99
+ if (!handler) {
100
+ throw new Error(`Actor ${actorId} not loaded`);
101
+ }
102
+ return handler.genericConnGlobalState;
103
+ }
34
104
  getContext(actorId) {
35
105
  const state = this.#globalState.getDOState(actorId);
36
106
  return { ctx: state.ctx, env: state.env };
@@ -48,6 +118,17 @@ var CloudflareActorsActorDriver = class {
48
118
  return this.#getDOCtx(actorId).storage.sql;
49
119
  }
50
120
  };
121
+ function createCloudflareActorsActorDriverBuilder(globalState) {
122
+ return (registryConfig, runConfig, managerDriver, inlineClient) => {
123
+ return new CloudflareActorsActorDriver(
124
+ registryConfig,
125
+ runConfig,
126
+ managerDriver,
127
+ inlineClient,
128
+ globalState
129
+ );
130
+ };
131
+ }
51
132
 
52
133
  // src/log.ts
53
134
  import { getLogger } from "@rivetkit/core/log";
@@ -96,23 +177,27 @@ function createActorDurableObject(registry, runConfig) {
96
177
  return this.#actor;
97
178
  }
98
179
  if (!this.#initialized) throw new Error("Not initialized");
99
- runConfig.driver.actor = new CloudflareActorsActorDriver(globalState);
100
- const actorTopology = new PartitionTopologyActor(
180
+ const actorId = this.ctx.id.toString();
181
+ globalState.setDOState(actorId, { ctx: this.ctx, env: this.env });
182
+ runConfig.driver.actor = createCloudflareActorsActorDriverBuilder(globalState);
183
+ const managerDriver = runConfig.driver.manager(
101
184
  registry.config,
102
185
  runConfig
103
186
  );
104
- const actorId = this.ctx.id.toString();
105
- globalState.setDOState(actorId, { ctx: this.ctx, env: this.env });
187
+ const inlineClient = createClientWithDriver(
188
+ createInlineClientDriver(managerDriver)
189
+ );
190
+ const actorDriver = runConfig.driver.actor(
191
+ registry.config,
192
+ runConfig,
193
+ managerDriver,
194
+ inlineClient
195
+ );
196
+ const actorRouter = createActorRouter(runConfig, actorDriver);
106
197
  this.#actor = {
107
- actorTopology
198
+ actorRouter
108
199
  };
109
- await actorTopology.start(
110
- actorId,
111
- this.#initialized.name,
112
- this.#initialized.key,
113
- // TODO:
114
- "unknown"
115
- );
200
+ await actorDriver.loadActor(actorId);
116
201
  return this.#actor;
117
202
  }
118
203
  /** RPC called by the service that creates the DO to initialize it. */
@@ -133,27 +218,32 @@ function createActorDurableObject(registry, runConfig) {
133
218
  }
134
219
  async fetch(request) {
135
220
  return await CF_AMBIENT_ENV.run(this.env, async () => {
136
- const { actorTopology } = await this.#loadActor();
137
- const ctx = this.ctx;
138
- return await actorTopology.router.fetch(
139
- request,
140
- this.env,
141
- // Implement execution context so we can wait on requests
142
- {
143
- waitUntil(promise) {
144
- ctx.waitUntil(promise);
145
- },
146
- passThroughOnException() {
147
- },
148
- props: {}
149
- }
150
- );
221
+ const { actorRouter } = await this.#loadActor();
222
+ const actorId = this.ctx.id.toString();
223
+ return await actorRouter.fetch(request, {
224
+ actorId
225
+ });
151
226
  });
152
227
  }
153
228
  async alarm() {
154
229
  return await CF_AMBIENT_ENV.run(this.env, async () => {
155
- const { actorTopology } = await this.#loadActor();
156
- await actorTopology.actor.onAlarm();
230
+ await this.#loadActor();
231
+ const actorId = this.ctx.id.toString();
232
+ const managerDriver = runConfig.driver.manager(
233
+ registry.config,
234
+ runConfig
235
+ );
236
+ const inlineClient = createClientWithDriver(
237
+ createInlineClientDriver(managerDriver)
238
+ );
239
+ const actorDriver = runConfig.driver.actor(
240
+ registry.config,
241
+ runConfig,
242
+ managerDriver,
243
+ inlineClient
244
+ );
245
+ const actor = await actorDriver.loadActor(actorId);
246
+ await actor.onAlarm();
157
247
  });
158
248
  }
159
249
  };
@@ -221,105 +311,103 @@ var STANDARD_WEBSOCKET_HEADERS = [
221
311
  "sec-websocket-extensions"
222
312
  ];
223
313
  var CloudflareActorsManagerDriver = class {
224
- connRoutingHandler;
225
- constructor() {
226
- this.connRoutingHandler = {
227
- custom: {
228
- sendRequest: async (actorId, actorRequest) => {
229
- const env = getCloudflareAmbientEnv();
230
- logger().debug("sending request to durable object", {
231
- actorId,
232
- method: actorRequest.method,
233
- url: actorRequest.url
234
- });
235
- const id = env.ACTOR_DO.idFromString(actorId);
236
- const stub = env.ACTOR_DO.get(id);
237
- return await stub.fetch(actorRequest);
238
- },
239
- openWebSocket: async (actorId, encodingKind, params) => {
240
- const env = getCloudflareAmbientEnv();
241
- logger().debug("opening websocket to durable object", { actorId });
242
- const id = env.ACTOR_DO.idFromString(actorId);
243
- const stub = env.ACTOR_DO.get(id);
244
- const headers = {
245
- Upgrade: "websocket",
246
- Connection: "Upgrade",
247
- [HEADER_EXPOSE_INTERNAL_ERROR]: "true",
248
- [HEADER_ENCODING]: encodingKind
249
- };
250
- if (params) {
251
- headers[HEADER_CONN_PARAMS] = JSON.stringify(params);
252
- }
253
- headers["sec-websocket-protocol"] = "rivetkit";
254
- const response = await stub.fetch("http://actor/connect/websocket", {
255
- headers
256
- });
257
- const webSocket = response.webSocket;
258
- if (!webSocket) {
259
- throw new InternalError(
260
- "missing websocket connection in response from DO"
261
- );
262
- }
263
- logger().debug("durable object websocket connection open", {
264
- actorId
265
- });
266
- webSocket.accept();
267
- setTimeout(() => {
268
- var _a;
269
- (_a = webSocket.onopen) == null ? void 0 : _a.call(webSocket, new Event("open"));
270
- }, 0);
271
- return webSocket;
272
- },
273
- proxyRequest: async (c, actorRequest, actorId) => {
274
- logger().debug("forwarding request to durable object", {
275
- actorId,
276
- method: actorRequest.method,
277
- url: actorRequest.url
278
- });
279
- const id = c.env.ACTOR_DO.idFromString(actorId);
280
- const stub = c.env.ACTOR_DO.get(id);
281
- return await stub.fetch(actorRequest);
282
- },
283
- proxyWebSocket: async (c, path, actorId, encoding, params, authData) => {
284
- logger().debug("forwarding websocket to durable object", {
285
- actorId,
286
- path
287
- });
288
- const upgradeHeader = c.req.header("Upgrade");
289
- if (!upgradeHeader || upgradeHeader !== "websocket") {
290
- return new Response("Expected Upgrade: websocket", {
291
- status: 426
292
- });
293
- }
294
- const newUrl = new URL(`http://actor${path}`);
295
- const actorRequest = new Request(newUrl, c.req.raw);
296
- const headerKeys = [];
297
- actorRequest.headers.forEach((v, k) => headerKeys.push(k));
298
- for (const k of headerKeys) {
299
- if (!STANDARD_WEBSOCKET_HEADERS.includes(k)) {
300
- actorRequest.headers.delete(k);
301
- }
302
- }
303
- actorRequest.headers.set(HEADER_EXPOSE_INTERNAL_ERROR, "true");
304
- actorRequest.headers.set(HEADER_ENCODING, encoding);
305
- if (params) {
306
- actorRequest.headers.set(
307
- HEADER_CONN_PARAMS,
308
- JSON.stringify(params)
309
- );
310
- }
311
- if (authData) {
312
- actorRequest.headers.set(
313
- HEADER_AUTH_DATA,
314
- JSON.stringify(authData)
315
- );
316
- }
317
- const id = c.env.ACTOR_DO.idFromString(actorId);
318
- const stub = c.env.ACTOR_DO.get(id);
319
- return await stub.fetch(actorRequest);
320
- }
321
- }
314
+ async sendRequest(actorId, actorRequest) {
315
+ const env = getCloudflareAmbientEnv();
316
+ logger().debug("sending request to durable object", {
317
+ actorId,
318
+ method: actorRequest.method,
319
+ url: actorRequest.url
320
+ });
321
+ const id = env.ACTOR_DO.idFromString(actorId);
322
+ const stub = env.ACTOR_DO.get(id);
323
+ return await stub.fetch(actorRequest);
324
+ }
325
+ async openWebSocket(path, actorId, encoding, params) {
326
+ const env = getCloudflareAmbientEnv();
327
+ logger().debug("opening websocket to durable object", { actorId, path });
328
+ const id = env.ACTOR_DO.idFromString(actorId);
329
+ const stub = env.ACTOR_DO.get(id);
330
+ const headers = {
331
+ Upgrade: "websocket",
332
+ Connection: "Upgrade",
333
+ [HEADER_EXPOSE_INTERNAL_ERROR]: "true",
334
+ [HEADER_ENCODING]: encoding
322
335
  };
336
+ if (params) {
337
+ headers[HEADER_CONN_PARAMS] = JSON.stringify(params);
338
+ }
339
+ headers["sec-websocket-protocol"] = "rivetkit";
340
+ const url = `http://actor${path}`;
341
+ logger().debug("rewriting websocket url", {
342
+ from: path,
343
+ to: url
344
+ });
345
+ const response = await stub.fetch(url, {
346
+ headers
347
+ });
348
+ const webSocket = response.webSocket;
349
+ if (!webSocket) {
350
+ throw new InternalError(
351
+ "missing websocket connection in response from DO"
352
+ );
353
+ }
354
+ logger().debug("durable object websocket connection open", {
355
+ actorId
356
+ });
357
+ webSocket.accept();
358
+ setTimeout(() => {
359
+ var _a;
360
+ const event = new Event("open");
361
+ (_a = webSocket.onopen) == null ? void 0 : _a.call(webSocket, event);
362
+ webSocket.dispatchEvent(event);
363
+ }, 0);
364
+ return webSocket;
365
+ }
366
+ async proxyRequest(c, actorRequest, actorId) {
367
+ logger().debug("forwarding request to durable object", {
368
+ actorId,
369
+ method: actorRequest.method,
370
+ url: actorRequest.url
371
+ });
372
+ const id = c.env.ACTOR_DO.idFromString(actorId);
373
+ const stub = c.env.ACTOR_DO.get(id);
374
+ return await stub.fetch(actorRequest);
375
+ }
376
+ async proxyWebSocket(c, path, actorId, encoding, params, authData) {
377
+ logger().debug("forwarding websocket to durable object", {
378
+ actorId,
379
+ path
380
+ });
381
+ const upgradeHeader = c.req.header("Upgrade");
382
+ if (!upgradeHeader || upgradeHeader !== "websocket") {
383
+ return new Response("Expected Upgrade: websocket", {
384
+ status: 426
385
+ });
386
+ }
387
+ const newUrl = new URL(`http://actor${path}`);
388
+ const actorRequest = new Request(newUrl, c.req.raw);
389
+ logger().debug("rewriting websocket url", {
390
+ from: c.req.url,
391
+ to: actorRequest.url
392
+ });
393
+ const headerKeys = [];
394
+ actorRequest.headers.forEach((v, k) => headerKeys.push(k));
395
+ for (const k of headerKeys) {
396
+ if (!STANDARD_WEBSOCKET_HEADERS.includes(k)) {
397
+ actorRequest.headers.delete(k);
398
+ }
399
+ }
400
+ actorRequest.headers.set(HEADER_EXPOSE_INTERNAL_ERROR, "true");
401
+ actorRequest.headers.set(HEADER_ENCODING, encoding);
402
+ if (params) {
403
+ actorRequest.headers.set(HEADER_CONN_PARAMS, JSON.stringify(params));
404
+ }
405
+ if (authData) {
406
+ actorRequest.headers.set(HEADER_AUTH_DATA, JSON.stringify(authData));
407
+ }
408
+ const id = c.env.ACTOR_DO.idFromString(actorId);
409
+ const stub = c.env.ACTOR_DO.get(id);
410
+ return await stub.fetch(actorRequest);
323
411
  }
324
412
  async getForId({
325
413
  c,
@@ -501,30 +589,28 @@ function createServer(registry, inputConfig) {
501
589
  const config = ConfigSchema.parse(inputConfig);
502
590
  const runConfig = {
503
591
  driver: {
504
- topology: "partition",
505
- manager: new CloudflareActorsManagerDriver(),
506
- // HACK: We can't build the actor driver until we're inside the Druable Object
592
+ manager: () => new CloudflareActorsManagerDriver(),
593
+ // HACK: We can't build the actor driver until we're inside the Durable Object
507
594
  actor: void 0
508
595
  },
509
596
  getUpgradeWebSocket: () => upgradeWebSocket,
510
597
  ...config
511
598
  };
512
- const ActorHandler = createActorDurableObject(registry, runConfig);
513
- const managerTopology = new PartitionTopologyManager(
514
- registry.config,
515
- runConfig
516
- );
599
+ const ActorHandler2 = createActorDurableObject(registry, runConfig);
600
+ const serverOutput = registry.createServer(runConfig);
517
601
  return {
518
- client: managerTopology.inlineClient,
602
+ client: serverOutput.client,
519
603
  createHandler: (hono) => {
520
604
  const app = hono ?? new Hono();
521
- app.route("/registry", managerTopology.router);
605
+ if (!hono) {
606
+ app.route("/registry", serverOutput.hono);
607
+ }
522
608
  const handler = {
523
609
  fetch: (request, env, ctx) => {
524
610
  return CF_AMBIENT_ENV.run(env, () => app.fetch(request, env, ctx));
525
611
  }
526
612
  };
527
- return { handler, ActorHandler };
613
+ return { handler, ActorHandler: ActorHandler2 };
528
614
  }
529
615
  };
530
616
  }