@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.cjs +228 -142
- package/dist/mod.cjs.map +1 -1
- package/dist/mod.d.cts +7 -46
- package/dist/mod.d.ts +7 -46
- package/dist/mod.js +227 -141
- package/dist/mod.js.map +1 -1
- package/package.json +4 -3
- package/src/actor-driver.ts +117 -1
- package/src/actor-handler-do.ts +70 -40
- package/src/handler.ts +9 -11
- package/src/manager-driver.ts +150 -143
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
|
105
|
-
|
|
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
|
-
|
|
198
|
+
actorRouter
|
|
108
199
|
};
|
|
109
|
-
await
|
|
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 {
|
|
137
|
-
const
|
|
138
|
-
return await
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
505
|
-
|
|
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
|
|
513
|
-
const
|
|
514
|
-
registry.config,
|
|
515
|
-
runConfig
|
|
516
|
-
);
|
|
599
|
+
const ActorHandler2 = createActorDurableObject(registry, runConfig);
|
|
600
|
+
const serverOutput = registry.createServer(runConfig);
|
|
517
601
|
return {
|
|
518
|
-
client:
|
|
602
|
+
client: serverOutput.client,
|
|
519
603
|
createHandler: (hono) => {
|
|
520
604
|
const app = hono ?? new Hono();
|
|
521
|
-
|
|
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
|
}
|