rivetkit 2.0.2 → 2.0.4
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/README.md +3 -5
- package/dist/schemas/actor-persist/v1.ts +225 -0
- package/dist/schemas/client-protocol/v1.ts +435 -0
- package/dist/schemas/file-system-driver/v1.ts +102 -0
- package/dist/tsup/actor/errors.cjs +77 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +156 -0
- package/dist/tsup/actor/errors.d.ts +156 -0
- package/dist/tsup/actor/errors.js +77 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/chunk-3F2YSRJL.js +117 -0
- package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
- package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
- package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
- package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
- package/dist/tsup/chunk-6LJT3QRL.cjs +539 -0
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
- package/dist/tsup/chunk-GICQ3YCU.cjs +1792 -0
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
- package/dist/tsup/chunk-H26RP6GD.js +251 -0
- package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
- package/dist/tsup/chunk-HI3HWJRC.js +20 -0
- package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
- package/dist/tsup/chunk-HLLF4B4Q.js +1792 -0
- package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
- package/dist/tsup/chunk-IH6CKNDW.cjs +117 -0
- package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
- package/dist/tsup/chunk-LV2S3OU3.js +250 -0
- package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
- package/dist/tsup/chunk-LWNKVZG5.cjs +251 -0
- package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
- package/dist/tsup/chunk-NFU2BBT5.js +374 -0
- package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
- package/dist/tsup/chunk-PQY7KKTL.js +539 -0
- package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
- package/dist/tsup/chunk-QK72M5JB.js +45 -0
- package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
- package/dist/tsup/chunk-QNNXFOQV.cjs +45 -0
- package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
- package/dist/tsup/chunk-SBHHJ6QS.cjs +374 -0
- package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
- package/dist/tsup/chunk-TQ62L3X7.js +325 -0
- package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
- package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
- package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
- package/dist/tsup/client/mod.cjs +32 -0
- package/dist/tsup/client/mod.cjs.map +1 -0
- package/dist/tsup/client/mod.d.cts +20 -0
- package/dist/tsup/client/mod.d.ts +20 -0
- package/dist/tsup/client/mod.js +32 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +21 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +26 -0
- package/dist/tsup/common/log.d.ts +26 -0
- package/dist/tsup/common/log.js +21 -0
- package/dist/tsup/common/log.js.map +1 -0
- package/dist/tsup/common/websocket.cjs +10 -0
- package/dist/tsup/common/websocket.cjs.map +1 -0
- package/dist/tsup/common/websocket.d.cts +3 -0
- package/dist/tsup/common/websocket.d.ts +3 -0
- package/dist/tsup/common/websocket.js +10 -0
- package/dist/tsup/common/websocket.js.map +1 -0
- package/dist/tsup/common-CXCe7s6i.d.cts +218 -0
- package/dist/tsup/common-CXCe7s6i.d.ts +218 -0
- package/dist/tsup/connection-BI-6UIBJ.d.ts +2087 -0
- package/dist/tsup/connection-Dyd4NLGW.d.cts +2087 -0
- package/dist/tsup/driver-helpers/mod.cjs +30 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +17 -0
- package/dist/tsup/driver-helpers/mod.d.ts +17 -0
- package/dist/tsup/driver-helpers/mod.js +30 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +3411 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +63 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +63 -0
- package/dist/tsup/driver-test-suite/mod.js +3411 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +51 -0
- package/dist/tsup/inspector/mod.cjs.map +1 -0
- package/dist/tsup/inspector/mod.d.cts +408 -0
- package/dist/tsup/inspector/mod.d.ts +408 -0
- package/dist/tsup/inspector/mod.js +51 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/mod.cjs +67 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +105 -0
- package/dist/tsup/mod.d.ts +105 -0
- package/dist/tsup/mod.js +67 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/router-endpoints-BTe_Rsdn.d.cts +65 -0
- package/dist/tsup/router-endpoints-CBSrKHmo.d.ts +65 -0
- package/dist/tsup/test/mod.cjs +17 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +26 -0
- package/dist/tsup/test/mod.d.ts +26 -0
- package/dist/tsup/test/mod.js +17 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
- package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
- package/dist/tsup/utils.cjs +26 -0
- package/dist/tsup/utils.cjs.map +1 -0
- package/dist/tsup/utils.d.cts +36 -0
- package/dist/tsup/utils.d.ts +36 -0
- package/dist/tsup/utils.js +26 -0
- package/dist/tsup/utils.js.map +1 -0
- package/package.json +208 -5
- package/src/actor/action.ts +178 -0
- package/src/actor/config.ts +497 -0
- package/src/actor/connection.ts +257 -0
- package/src/actor/context.ts +168 -0
- package/src/actor/database.ts +23 -0
- package/src/actor/definition.ts +82 -0
- package/src/actor/driver.ts +84 -0
- package/src/actor/errors.ts +422 -0
- package/src/actor/generic-conn-driver.ts +246 -0
- package/src/actor/instance.ts +1844 -0
- package/src/actor/keys.test.ts +266 -0
- package/src/actor/keys.ts +89 -0
- package/src/actor/log.ts +6 -0
- package/src/actor/mod.ts +108 -0
- package/src/actor/persisted.ts +42 -0
- package/src/actor/protocol/old.ts +297 -0
- package/src/actor/protocol/serde.ts +131 -0
- package/src/actor/router-endpoints.ts +688 -0
- package/src/actor/router.ts +265 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/unstable-react.ts +110 -0
- package/src/actor/utils.ts +102 -0
- package/src/client/actor-common.ts +30 -0
- package/src/client/actor-conn.ts +865 -0
- package/src/client/actor-handle.ts +268 -0
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +554 -0
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +42 -0
- package/src/client/log.ts +5 -0
- package/src/client/mod.ts +60 -0
- package/src/client/raw-utils.ts +149 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +152 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +80 -0
- package/src/common/fake-event-source.ts +267 -0
- package/src/common/inline-websocket-adapter2.ts +454 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +214 -0
- package/src/common/logfmt.ts +219 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +80 -0
- package/src/common/utils.ts +336 -0
- package/src/common/versioned-data.ts +95 -0
- package/src/common/websocket-interface.ts +49 -0
- package/src/common/websocket.ts +42 -0
- package/src/driver-helpers/mod.ts +22 -0
- package/src/driver-helpers/utils.ts +17 -0
- package/src/driver-test-suite/log.ts +5 -0
- package/src/driver-test-suite/mod.ts +239 -0
- package/src/driver-test-suite/tests/action-features.ts +136 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +249 -0
- package/src/driver-test-suite/tests/actor-conn.ts +349 -0
- package/src/driver-test-suite/tests/actor-driver.ts +25 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +158 -0
- package/src/driver-test-suite/tests/actor-handle.ts +292 -0
- package/src/driver-test-suite/tests/actor-inline-client.ts +152 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +570 -0
- package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
- package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +108 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +413 -0
- package/src/driver-test-suite/tests/actor-state.ts +54 -0
- package/src/driver-test-suite/tests/actor-vars.ts +93 -0
- package/src/driver-test-suite/tests/manager-driver.ts +367 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +414 -0
- package/src/driver-test-suite/tests/raw-http.ts +347 -0
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
- package/src/driver-test-suite/tests/request-access.ts +230 -0
- package/src/driver-test-suite/utils.ts +71 -0
- package/src/drivers/default.ts +34 -0
- package/src/drivers/engine/actor-driver.ts +369 -0
- package/src/drivers/engine/config.ts +31 -0
- package/src/drivers/engine/kv.ts +3 -0
- package/src/drivers/engine/log.ts +5 -0
- package/src/drivers/engine/mod.ts +35 -0
- package/src/drivers/file-system/actor.ts +91 -0
- package/src/drivers/file-system/global-state.ts +686 -0
- package/src/drivers/file-system/log.ts +5 -0
- package/src/drivers/file-system/manager.ts +329 -0
- package/src/drivers/file-system/mod.ts +48 -0
- package/src/drivers/file-system/utils.ts +109 -0
- package/src/globals.d.ts +6 -0
- package/src/inspector/actor.ts +298 -0
- package/src/inspector/config.ts +88 -0
- package/src/inspector/log.ts +5 -0
- package/src/inspector/manager.ts +86 -0
- package/src/inspector/mod.ts +2 -0
- package/src/inspector/protocol/actor.ts +10 -0
- package/src/inspector/protocol/common.ts +196 -0
- package/src/inspector/protocol/manager.ts +10 -0
- package/src/inspector/protocol/mod.ts +2 -0
- package/src/inspector/utils.ts +76 -0
- package/src/manager/driver.ts +88 -0
- package/src/manager/hono-websocket-adapter.ts +342 -0
- package/src/manager/log.ts +5 -0
- package/src/manager/mod.ts +2 -0
- package/src/manager/protocol/mod.ts +24 -0
- package/src/manager/protocol/query.ts +89 -0
- package/src/manager/router.ts +412 -0
- package/src/manager-api/routes/actors-create.ts +16 -0
- package/src/manager-api/routes/actors-delete.ts +4 -0
- package/src/manager-api/routes/actors-get-by-id.ts +7 -0
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
- package/src/manager-api/routes/actors-get.ts +7 -0
- package/src/manager-api/routes/common.ts +18 -0
- package/src/mod.ts +18 -0
- package/src/registry/config.ts +32 -0
- package/src/registry/log.ts +5 -0
- package/src/registry/mod.ts +157 -0
- package/src/registry/run-config.ts +52 -0
- package/src/registry/serve.ts +52 -0
- package/src/remote-manager-driver/actor-http-client.ts +72 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
- package/src/remote-manager-driver/api-endpoints.ts +79 -0
- package/src/remote-manager-driver/api-utils.ts +43 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/mod.ts +274 -0
- package/src/remote-manager-driver/ws-proxy.ts +180 -0
- package/src/schemas/actor-persist/mod.ts +1 -0
- package/src/schemas/actor-persist/versioned.ts +25 -0
- package/src/schemas/client-protocol/mod.ts +1 -0
- package/src/schemas/client-protocol/versioned.ts +63 -0
- package/src/schemas/file-system-driver/mod.ts +1 -0
- package/src/schemas/file-system-driver/versioned.ts +28 -0
- package/src/serde.ts +90 -0
- package/src/test/config.ts +16 -0
- package/src/test/log.ts +5 -0
- package/src/test/mod.ts +154 -0
- package/src/utils.ts +172 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import type { Context as HonoContext } from "hono";
|
|
2
|
+
import invariant from "invariant";
|
|
3
|
+
import { type ActorRouter, createActorRouter } from "@/actor/router";
|
|
4
|
+
import {
|
|
5
|
+
handleRawWebSocketHandler,
|
|
6
|
+
handleWebSocketConnect,
|
|
7
|
+
} from "@/actor/router-endpoints";
|
|
8
|
+
import { createClientWithDriver } from "@/client/client";
|
|
9
|
+
import { InlineWebSocketAdapter2 } from "@/common/inline-websocket-adapter2";
|
|
10
|
+
import { noopNext } from "@/common/utils";
|
|
11
|
+
import type {
|
|
12
|
+
ActorDriver,
|
|
13
|
+
ActorOutput,
|
|
14
|
+
CreateInput,
|
|
15
|
+
GetForIdInput,
|
|
16
|
+
GetOrCreateWithKeyInput,
|
|
17
|
+
GetWithKeyInput,
|
|
18
|
+
ManagerDriver,
|
|
19
|
+
} from "@/driver-helpers/mod";
|
|
20
|
+
import { ManagerInspector } from "@/inspector/manager";
|
|
21
|
+
import { type Actor, ActorFeature, type ActorId } from "@/inspector/mod";
|
|
22
|
+
import type { ManagerDisplayInformation } from "@/manager/driver";
|
|
23
|
+
import {
|
|
24
|
+
type DriverConfig,
|
|
25
|
+
type Encoding,
|
|
26
|
+
PATH_CONNECT_WEBSOCKET,
|
|
27
|
+
PATH_RAW_WEBSOCKET_PREFIX,
|
|
28
|
+
type RegistryConfig,
|
|
29
|
+
type RunConfig,
|
|
30
|
+
type UniversalWebSocket,
|
|
31
|
+
} from "@/mod";
|
|
32
|
+
import type * as schema from "@/schemas/file-system-driver/mod";
|
|
33
|
+
import type { FileSystemGlobalState } from "./global-state";
|
|
34
|
+
import { logger } from "./log";
|
|
35
|
+
import { generateActorId } from "./utils";
|
|
36
|
+
|
|
37
|
+
export class FileSystemManagerDriver implements ManagerDriver {
|
|
38
|
+
#registryConfig: RegistryConfig;
|
|
39
|
+
#runConfig: RunConfig;
|
|
40
|
+
#state: FileSystemGlobalState;
|
|
41
|
+
#driverConfig: DriverConfig;
|
|
42
|
+
|
|
43
|
+
#actorDriver: ActorDriver;
|
|
44
|
+
#actorRouter: ActorRouter;
|
|
45
|
+
|
|
46
|
+
inspector?: ManagerInspector;
|
|
47
|
+
|
|
48
|
+
constructor(
|
|
49
|
+
registryConfig: RegistryConfig,
|
|
50
|
+
runConfig: RunConfig,
|
|
51
|
+
state: FileSystemGlobalState,
|
|
52
|
+
driverConfig: DriverConfig,
|
|
53
|
+
) {
|
|
54
|
+
this.#registryConfig = registryConfig;
|
|
55
|
+
this.#runConfig = runConfig;
|
|
56
|
+
this.#state = state;
|
|
57
|
+
this.#driverConfig = driverConfig;
|
|
58
|
+
|
|
59
|
+
if (runConfig.inspector.enabled) {
|
|
60
|
+
if (!this.#runConfig.inspector.token()) {
|
|
61
|
+
this.#runConfig.inspector.token = () =>
|
|
62
|
+
this.#state.getOrCreateInspectorAccessToken();
|
|
63
|
+
}
|
|
64
|
+
const startedAt = new Date().toISOString();
|
|
65
|
+
function transformActor(actorState: schema.ActorState): Actor {
|
|
66
|
+
return {
|
|
67
|
+
id: actorState.actorId as ActorId,
|
|
68
|
+
name: actorState.name,
|
|
69
|
+
key: actorState.key as string[],
|
|
70
|
+
startedAt: startedAt,
|
|
71
|
+
createdAt: new Date(Number(actorState.createdAt)).toISOString(),
|
|
72
|
+
features: [
|
|
73
|
+
ActorFeature.State,
|
|
74
|
+
ActorFeature.Connections,
|
|
75
|
+
ActorFeature.Console,
|
|
76
|
+
ActorFeature.EventsMonitoring,
|
|
77
|
+
ActorFeature.Database,
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this.inspector = new ManagerInspector(() => {
|
|
83
|
+
return {
|
|
84
|
+
getAllActors: async ({ cursor, limit }) => {
|
|
85
|
+
const itr = this.#state.getActorsIterator({ cursor });
|
|
86
|
+
const actors: Actor[] = [];
|
|
87
|
+
|
|
88
|
+
for await (const actor of itr) {
|
|
89
|
+
actors.push(transformActor(actor));
|
|
90
|
+
if (limit && actors.length >= limit) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return actors;
|
|
95
|
+
},
|
|
96
|
+
getActorById: async (id) => {
|
|
97
|
+
try {
|
|
98
|
+
const result = await this.#state.loadActorStateOrError(id);
|
|
99
|
+
return transformActor(result);
|
|
100
|
+
} catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
getBuilds: async () => {
|
|
105
|
+
return Object.keys(this.#registryConfig.use).map((name) => ({
|
|
106
|
+
name,
|
|
107
|
+
}));
|
|
108
|
+
},
|
|
109
|
+
createActor: async (input) => {
|
|
110
|
+
const { actorId } = await this.createActor(input);
|
|
111
|
+
try {
|
|
112
|
+
const result = await this.#state.loadActorStateOrError(actorId);
|
|
113
|
+
return transformActor(result);
|
|
114
|
+
} catch {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Actors run on the same node as the manager, so we create a dummy actor router that we route requests to
|
|
123
|
+
const inlineClient = createClientWithDriver(this);
|
|
124
|
+
this.#actorDriver = this.#driverConfig.actor(
|
|
125
|
+
registryConfig,
|
|
126
|
+
runConfig,
|
|
127
|
+
this,
|
|
128
|
+
inlineClient,
|
|
129
|
+
);
|
|
130
|
+
this.#actorRouter = createActorRouter(this.#runConfig, this.#actorDriver);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async sendRequest(actorId: string, actorRequest: Request): Promise<Response> {
|
|
134
|
+
return await this.#actorRouter.fetch(actorRequest, {
|
|
135
|
+
actorId,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async openWebSocket(
|
|
140
|
+
path: string,
|
|
141
|
+
actorId: string,
|
|
142
|
+
encoding: Encoding,
|
|
143
|
+
params: unknown,
|
|
144
|
+
): Promise<UniversalWebSocket> {
|
|
145
|
+
// TODO:
|
|
146
|
+
|
|
147
|
+
// Handle raw WebSocket paths
|
|
148
|
+
if (path === PATH_CONNECT_WEBSOCKET) {
|
|
149
|
+
// Handle standard connect
|
|
150
|
+
const wsHandler = await handleWebSocketConnect(
|
|
151
|
+
undefined,
|
|
152
|
+
this.#runConfig,
|
|
153
|
+
this.#actorDriver,
|
|
154
|
+
actorId,
|
|
155
|
+
encoding,
|
|
156
|
+
params,
|
|
157
|
+
undefined,
|
|
158
|
+
);
|
|
159
|
+
return new InlineWebSocketAdapter2(wsHandler);
|
|
160
|
+
} else if (
|
|
161
|
+
path.startsWith(PATH_RAW_WEBSOCKET_PREFIX) ||
|
|
162
|
+
path === "/raw/websocket"
|
|
163
|
+
) {
|
|
164
|
+
// Handle websocket proxy
|
|
165
|
+
// Normalize path to include trailing slash if missing
|
|
166
|
+
const normalizedPath =
|
|
167
|
+
path === "/raw/websocket" ? "/raw/websocket/" : path;
|
|
168
|
+
const wsHandler = await handleRawWebSocketHandler(
|
|
169
|
+
undefined,
|
|
170
|
+
normalizedPath,
|
|
171
|
+
this.#actorDriver,
|
|
172
|
+
actorId,
|
|
173
|
+
undefined,
|
|
174
|
+
);
|
|
175
|
+
return new InlineWebSocketAdapter2(wsHandler);
|
|
176
|
+
} else {
|
|
177
|
+
throw new Error(`Unreachable path: ${path}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async proxyRequest(
|
|
182
|
+
c: HonoContext,
|
|
183
|
+
actorRequest: Request,
|
|
184
|
+
actorId: string,
|
|
185
|
+
): Promise<Response> {
|
|
186
|
+
return await this.#actorRouter.fetch(actorRequest, {
|
|
187
|
+
actorId,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async proxyWebSocket(
|
|
192
|
+
c: HonoContext,
|
|
193
|
+
path: string,
|
|
194
|
+
actorId: string,
|
|
195
|
+
encoding: Encoding,
|
|
196
|
+
connParams: unknown,
|
|
197
|
+
authData: unknown,
|
|
198
|
+
): Promise<Response> {
|
|
199
|
+
const upgradeWebSocket = this.#runConfig.getUpgradeWebSocket?.();
|
|
200
|
+
invariant(upgradeWebSocket, "missing getUpgradeWebSocket");
|
|
201
|
+
|
|
202
|
+
// Handle raw WebSocket paths
|
|
203
|
+
if (path === PATH_CONNECT_WEBSOCKET) {
|
|
204
|
+
// Handle standard connect
|
|
205
|
+
const wsHandler = await handleWebSocketConnect(
|
|
206
|
+
c.req.raw,
|
|
207
|
+
this.#runConfig,
|
|
208
|
+
this.#actorDriver,
|
|
209
|
+
actorId,
|
|
210
|
+
encoding,
|
|
211
|
+
connParams,
|
|
212
|
+
authData,
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
return upgradeWebSocket(() => wsHandler)(c, noopNext());
|
|
216
|
+
} else if (
|
|
217
|
+
path.startsWith(PATH_RAW_WEBSOCKET_PREFIX) ||
|
|
218
|
+
path === "/raw/websocket"
|
|
219
|
+
) {
|
|
220
|
+
// Handle websocket proxy
|
|
221
|
+
// Normalize path to include trailing slash if missing
|
|
222
|
+
const normalizedPath =
|
|
223
|
+
path === "/raw/websocket" ? "/raw/websocket/" : path;
|
|
224
|
+
const wsHandler = await handleRawWebSocketHandler(
|
|
225
|
+
c.req.raw,
|
|
226
|
+
normalizedPath,
|
|
227
|
+
this.#actorDriver,
|
|
228
|
+
actorId,
|
|
229
|
+
authData,
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
return upgradeWebSocket(() => wsHandler)(c, noopNext());
|
|
233
|
+
} else {
|
|
234
|
+
throw new Error(`Unreachable path: ${path}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async getForId({ actorId }: GetForIdInput): Promise<ActorOutput | undefined> {
|
|
239
|
+
// Validate the actor exists
|
|
240
|
+
const actor = await this.#state.loadActor(actorId);
|
|
241
|
+
if (!actor.state) {
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
try {
|
|
246
|
+
// Load actor state
|
|
247
|
+
return {
|
|
248
|
+
actorId,
|
|
249
|
+
name: actor.state.name,
|
|
250
|
+
key: actor.state.key as string[],
|
|
251
|
+
};
|
|
252
|
+
} catch (error) {
|
|
253
|
+
logger().error({ msg: "failed to read actor state", actorId, error });
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
async getWithKey({
|
|
259
|
+
name,
|
|
260
|
+
key,
|
|
261
|
+
}: GetWithKeyInput): Promise<ActorOutput | undefined> {
|
|
262
|
+
// Generate the deterministic actor ID
|
|
263
|
+
const actorId = generateActorId(name, key);
|
|
264
|
+
|
|
265
|
+
// Check if actor exists
|
|
266
|
+
const actor = await this.#state.loadActor(actorId);
|
|
267
|
+
if (actor.state) {
|
|
268
|
+
return {
|
|
269
|
+
actorId,
|
|
270
|
+
name,
|
|
271
|
+
key,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
async getOrCreateWithKey(
|
|
279
|
+
input: GetOrCreateWithKeyInput,
|
|
280
|
+
): Promise<ActorOutput> {
|
|
281
|
+
// Generate the deterministic actor ID
|
|
282
|
+
const actorId = generateActorId(input.name, input.key);
|
|
283
|
+
|
|
284
|
+
// Use the atomic getOrCreateActor method
|
|
285
|
+
const actorEntry = await this.#state.loadOrCreateActor(
|
|
286
|
+
actorId,
|
|
287
|
+
input.name,
|
|
288
|
+
input.key,
|
|
289
|
+
input.input,
|
|
290
|
+
);
|
|
291
|
+
invariant(actorEntry.state, "must have state");
|
|
292
|
+
|
|
293
|
+
return {
|
|
294
|
+
actorId: actorEntry.state.actorId,
|
|
295
|
+
name: actorEntry.state.name,
|
|
296
|
+
key: actorEntry.state.key as string[],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async createActor({ name, key, input }: CreateInput): Promise<ActorOutput> {
|
|
301
|
+
// Generate the deterministic actor ID
|
|
302
|
+
const actorId = generateActorId(name, key);
|
|
303
|
+
|
|
304
|
+
await this.#state.createActor(actorId, name, key, input);
|
|
305
|
+
|
|
306
|
+
return {
|
|
307
|
+
actorId,
|
|
308
|
+
name,
|
|
309
|
+
key,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
displayInformation(): ManagerDisplayInformation {
|
|
314
|
+
return {
|
|
315
|
+
name: this.#state.persist ? "File System" : "Memory",
|
|
316
|
+
properties: {
|
|
317
|
+
...(this.#state.persist ? { Data: this.#state.storagePath } : {}),
|
|
318
|
+
Instances: this.#state.actorCountOnStartup.toString(),
|
|
319
|
+
},
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
extraStartupLog() {
|
|
324
|
+
return {
|
|
325
|
+
instances: this.#state.actorCountOnStartup,
|
|
326
|
+
data: this.#state.storagePath,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { DriverConfig } from "@/registry/run-config";
|
|
2
|
+
import { FileSystemActorDriver } from "./actor";
|
|
3
|
+
import { FileSystemGlobalState } from "./global-state";
|
|
4
|
+
import { FileSystemManagerDriver } from "./manager";
|
|
5
|
+
|
|
6
|
+
export { FileSystemActorDriver } from "./actor";
|
|
7
|
+
export { FileSystemGlobalState } from "./global-state";
|
|
8
|
+
export { FileSystemManagerDriver } from "./manager";
|
|
9
|
+
export { getStoragePath } from "./utils";
|
|
10
|
+
|
|
11
|
+
export function createFileSystemOrMemoryDriver(
|
|
12
|
+
persist: boolean = true,
|
|
13
|
+
customPath?: string,
|
|
14
|
+
): DriverConfig {
|
|
15
|
+
const state = new FileSystemGlobalState(persist, customPath);
|
|
16
|
+
const driverConfig: DriverConfig = {
|
|
17
|
+
name: persist ? "file-system" : "memory",
|
|
18
|
+
manager: (registryConfig, runConfig) =>
|
|
19
|
+
new FileSystemManagerDriver(
|
|
20
|
+
registryConfig,
|
|
21
|
+
runConfig,
|
|
22
|
+
state,
|
|
23
|
+
driverConfig,
|
|
24
|
+
),
|
|
25
|
+
actor: (registryConfig, runConfig, managerDriver, inlineClient) => {
|
|
26
|
+
const actorDriver = new FileSystemActorDriver(
|
|
27
|
+
registryConfig,
|
|
28
|
+
runConfig,
|
|
29
|
+
managerDriver,
|
|
30
|
+
inlineClient,
|
|
31
|
+
state,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
state.onRunnerStart(registryConfig, runConfig, inlineClient, actorDriver);
|
|
35
|
+
|
|
36
|
+
return actorDriver;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
return driverConfig;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function createFileSystemDriver(opts?: { path?: string }): DriverConfig {
|
|
43
|
+
return createFileSystemOrMemoryDriver(true, opts?.path);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function createMemoryDriver(): DriverConfig {
|
|
47
|
+
return createFileSystemOrMemoryDriver(false);
|
|
48
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
2
|
+
import * as fsSync from "node:fs";
|
|
3
|
+
import * as fs from "node:fs/promises";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import type { ActorKey } from "@/actor/mod";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Generate a deterministic actor ID from name and key
|
|
10
|
+
*/
|
|
11
|
+
export function generateActorId(name: string, key: ActorKey): string {
|
|
12
|
+
// Generate deterministic key string
|
|
13
|
+
const jsonString = JSON.stringify([name, key]);
|
|
14
|
+
|
|
15
|
+
// Hash to ensure safe file system names
|
|
16
|
+
const hash = crypto
|
|
17
|
+
.createHash("sha256")
|
|
18
|
+
.update(jsonString)
|
|
19
|
+
.digest("hex")
|
|
20
|
+
.substring(0, 16);
|
|
21
|
+
|
|
22
|
+
return hash;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Create a hash for a path, normalizing it first
|
|
27
|
+
*/
|
|
28
|
+
function createHashForPath(dirPath: string): string {
|
|
29
|
+
// Normalize the path first
|
|
30
|
+
const normalizedPath = path.normalize(dirPath);
|
|
31
|
+
|
|
32
|
+
// Extract the last path component for readability
|
|
33
|
+
const lastComponent = path.basename(normalizedPath);
|
|
34
|
+
|
|
35
|
+
// Create SHA-256 hash
|
|
36
|
+
const hash = crypto
|
|
37
|
+
.createHash("sha256")
|
|
38
|
+
.update(normalizedPath)
|
|
39
|
+
.digest("hex")
|
|
40
|
+
.substring(0, 8); // Take first 8 characters for brevity
|
|
41
|
+
|
|
42
|
+
return `${lastComponent}-${hash}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Get the storage path for the current working directory or a specified path
|
|
47
|
+
*/
|
|
48
|
+
export function getStoragePath(customPath?: string): string {
|
|
49
|
+
const dataPath = getDataPath("rivetkit");
|
|
50
|
+
const pathToHash = customPath || process.cwd();
|
|
51
|
+
const dirHash = createHashForPath(pathToHash);
|
|
52
|
+
return path.join(dataPath, dirHash);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Check if a path exists
|
|
57
|
+
*/
|
|
58
|
+
export async function pathExists(path: string): Promise<boolean> {
|
|
59
|
+
try {
|
|
60
|
+
await fs.access(path);
|
|
61
|
+
return true;
|
|
62
|
+
} catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Ensure a directory exists, creating it if necessary
|
|
69
|
+
*/
|
|
70
|
+
export async function ensureDirectoryExists(
|
|
71
|
+
directoryPath: string,
|
|
72
|
+
): Promise<void> {
|
|
73
|
+
if (!(await pathExists(directoryPath))) {
|
|
74
|
+
await fs.mkdir(directoryPath, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Ensure a directory exists synchronously - only used during initialization
|
|
80
|
+
* All other operations use the async version
|
|
81
|
+
*/
|
|
82
|
+
export function ensureDirectoryExistsSync(directoryPath: string): void {
|
|
83
|
+
if (!fsSync.existsSync(directoryPath)) {
|
|
84
|
+
fsSync.mkdirSync(directoryPath, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Returns platform-specific data directory
|
|
90
|
+
*/
|
|
91
|
+
function getDataPath(appName: string): string {
|
|
92
|
+
const platform = process.platform;
|
|
93
|
+
const homeDir = os.homedir();
|
|
94
|
+
|
|
95
|
+
switch (platform) {
|
|
96
|
+
case "win32":
|
|
97
|
+
return path.join(
|
|
98
|
+
process.env.APPDATA || path.join(homeDir, "AppData", "Roaming"),
|
|
99
|
+
appName,
|
|
100
|
+
);
|
|
101
|
+
case "darwin":
|
|
102
|
+
return path.join(homeDir, "Library", "Application Support", appName);
|
|
103
|
+
default: // linux and others
|
|
104
|
+
return path.join(
|
|
105
|
+
process.env.XDG_DATA_HOME || path.join(homeDir, ".local", "share"),
|
|
106
|
+
appName,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
}
|