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,265 @@
|
|
|
1
|
+
import { Hono, type Context as HonoContext } from "hono";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
3
|
+
import invariant from "invariant";
|
|
4
|
+
import { EncodingSchema } from "@/actor/protocol/serde";
|
|
5
|
+
import {
|
|
6
|
+
type ActionOpts,
|
|
7
|
+
type ActionOutput,
|
|
8
|
+
type ConnectSseOpts,
|
|
9
|
+
type ConnectSseOutput,
|
|
10
|
+
type ConnectWebSocketOpts,
|
|
11
|
+
type ConnectWebSocketOutput,
|
|
12
|
+
type ConnsMessageOpts,
|
|
13
|
+
HEADER_AUTH_DATA,
|
|
14
|
+
HEADER_CONN_ID,
|
|
15
|
+
HEADER_CONN_PARAMS,
|
|
16
|
+
HEADER_CONN_TOKEN,
|
|
17
|
+
HEADER_ENCODING,
|
|
18
|
+
handleAction,
|
|
19
|
+
handleConnectionMessage,
|
|
20
|
+
handleRawWebSocketHandler,
|
|
21
|
+
handleSseConnect,
|
|
22
|
+
handleWebSocketConnect,
|
|
23
|
+
} from "@/actor/router-endpoints";
|
|
24
|
+
import {
|
|
25
|
+
handleRouteError,
|
|
26
|
+
handleRouteNotFound,
|
|
27
|
+
loggerMiddleware,
|
|
28
|
+
} from "@/common/router";
|
|
29
|
+
import { noopNext } from "@/common/utils";
|
|
30
|
+
import {
|
|
31
|
+
type ActorInspectorRouterEnv,
|
|
32
|
+
createActorInspectorRouter,
|
|
33
|
+
} from "@/inspector/actor";
|
|
34
|
+
import { secureInspector } from "@/inspector/utils";
|
|
35
|
+
import type { RunConfig } from "@/registry/run-config";
|
|
36
|
+
import type { ActorDriver } from "./driver";
|
|
37
|
+
import { InternalError } from "./errors";
|
|
38
|
+
import { loggerWithoutContext } from "./log";
|
|
39
|
+
|
|
40
|
+
export const PATH_CONNECT_WEBSOCKET = "/connect/websocket";
|
|
41
|
+
export const PATH_RAW_WEBSOCKET_PREFIX = "/raw/websocket/";
|
|
42
|
+
|
|
43
|
+
export type {
|
|
44
|
+
ConnectWebSocketOpts,
|
|
45
|
+
ConnectWebSocketOutput,
|
|
46
|
+
ConnectSseOpts,
|
|
47
|
+
ConnectSseOutput,
|
|
48
|
+
ActionOpts,
|
|
49
|
+
ActionOutput,
|
|
50
|
+
ConnsMessageOpts,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
interface ActorRouterBindings {
|
|
54
|
+
actorId: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type ActorRouter = Hono<{ Bindings: ActorRouterBindings }>;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Creates a router that runs on the partitioned instance.
|
|
61
|
+
*/
|
|
62
|
+
export function createActorRouter(
|
|
63
|
+
runConfig: RunConfig,
|
|
64
|
+
actorDriver: ActorDriver,
|
|
65
|
+
): ActorRouter {
|
|
66
|
+
const router = new Hono<{ Bindings: ActorRouterBindings }>({ strict: false });
|
|
67
|
+
|
|
68
|
+
router.use("*", loggerMiddleware(loggerWithoutContext()));
|
|
69
|
+
|
|
70
|
+
router.get("/", (c) => {
|
|
71
|
+
return c.text(
|
|
72
|
+
"This is an RivetKit actor.\n\nLearn more at https://rivetkit.org",
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
router.get("/health", (c) => {
|
|
77
|
+
return c.text("ok");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
router.get(PATH_CONNECT_WEBSOCKET, async (c) => {
|
|
81
|
+
const upgradeWebSocket = runConfig.getUpgradeWebSocket?.();
|
|
82
|
+
if (upgradeWebSocket) {
|
|
83
|
+
return upgradeWebSocket(async (c) => {
|
|
84
|
+
const encodingRaw = c.req.header(HEADER_ENCODING);
|
|
85
|
+
const connParamsRaw = c.req.header(HEADER_CONN_PARAMS);
|
|
86
|
+
const authDataRaw = c.req.header(HEADER_AUTH_DATA);
|
|
87
|
+
|
|
88
|
+
const encoding = EncodingSchema.parse(encodingRaw);
|
|
89
|
+
const connParams = connParamsRaw
|
|
90
|
+
? JSON.parse(connParamsRaw)
|
|
91
|
+
: undefined;
|
|
92
|
+
const authData = authDataRaw ? JSON.parse(authDataRaw) : undefined;
|
|
93
|
+
|
|
94
|
+
return await handleWebSocketConnect(
|
|
95
|
+
c.req.raw,
|
|
96
|
+
runConfig,
|
|
97
|
+
actorDriver,
|
|
98
|
+
c.env.actorId,
|
|
99
|
+
encoding,
|
|
100
|
+
connParams,
|
|
101
|
+
authData,
|
|
102
|
+
);
|
|
103
|
+
})(c, noopNext());
|
|
104
|
+
} else {
|
|
105
|
+
return c.text(
|
|
106
|
+
"WebSockets are not enabled for this driver. Use SSE instead.",
|
|
107
|
+
400,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
router.get("/connect/sse", async (c) => {
|
|
113
|
+
const authDataRaw = c.req.header(HEADER_AUTH_DATA);
|
|
114
|
+
let authData: unknown;
|
|
115
|
+
if (authDataRaw) {
|
|
116
|
+
authData = JSON.parse(authDataRaw);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return handleSseConnect(c, runConfig, actorDriver, c.env.actorId, authData);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
router.post("/action/:action", async (c) => {
|
|
123
|
+
const actionName = c.req.param("action");
|
|
124
|
+
|
|
125
|
+
const authDataRaw = c.req.header(HEADER_AUTH_DATA);
|
|
126
|
+
let authData: unknown;
|
|
127
|
+
if (authDataRaw) {
|
|
128
|
+
authData = JSON.parse(authDataRaw);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return handleAction(
|
|
132
|
+
c,
|
|
133
|
+
runConfig,
|
|
134
|
+
actorDriver,
|
|
135
|
+
actionName,
|
|
136
|
+
c.env.actorId,
|
|
137
|
+
authData,
|
|
138
|
+
);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
router.post("/connections/message", async (c) => {
|
|
142
|
+
const connId = c.req.header(HEADER_CONN_ID);
|
|
143
|
+
const connToken = c.req.header(HEADER_CONN_TOKEN);
|
|
144
|
+
if (!connId || !connToken) {
|
|
145
|
+
throw new Error("Missing required parameters");
|
|
146
|
+
}
|
|
147
|
+
return handleConnectionMessage(
|
|
148
|
+
c,
|
|
149
|
+
runConfig,
|
|
150
|
+
actorDriver,
|
|
151
|
+
connId,
|
|
152
|
+
connToken,
|
|
153
|
+
c.env.actorId,
|
|
154
|
+
);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// Raw HTTP endpoints - /http/*
|
|
158
|
+
router.all("/raw/http/*", async (c) => {
|
|
159
|
+
const authDataRaw = c.req.header(HEADER_AUTH_DATA);
|
|
160
|
+
let authData: unknown;
|
|
161
|
+
if (authDataRaw) {
|
|
162
|
+
authData = JSON.parse(authDataRaw);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const actor = await actorDriver.loadActor(c.env.actorId);
|
|
166
|
+
|
|
167
|
+
// TODO: This is not a clean way of doing this since `/http/` might exist mid-path
|
|
168
|
+
// Strip the /http prefix from the URL to get the original path
|
|
169
|
+
const url = new URL(c.req.url);
|
|
170
|
+
const originalPath = url.pathname.replace(/^\/raw\/http/, "") || "/";
|
|
171
|
+
|
|
172
|
+
// Create a new request with the corrected URL
|
|
173
|
+
const correctedUrl = new URL(originalPath + url.search, url.origin);
|
|
174
|
+
const correctedRequest = new Request(correctedUrl, {
|
|
175
|
+
method: c.req.method,
|
|
176
|
+
headers: c.req.raw.headers,
|
|
177
|
+
body: c.req.raw.body,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
loggerWithoutContext().debug({
|
|
181
|
+
msg: "rewriting http url",
|
|
182
|
+
from: c.req.url,
|
|
183
|
+
to: correctedRequest.url,
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Call the actor's onFetch handler - it will throw appropriate errors
|
|
187
|
+
const response = await actor.handleFetch(correctedRequest, {
|
|
188
|
+
auth: authData,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// This should never happen now since handleFetch throws errors
|
|
192
|
+
if (!response) {
|
|
193
|
+
throw new InternalError("handleFetch returned void unexpectedly");
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return response;
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Raw WebSocket endpoint - /websocket/*
|
|
200
|
+
router.get(`${PATH_RAW_WEBSOCKET_PREFIX}*`, async (c) => {
|
|
201
|
+
const upgradeWebSocket = runConfig.getUpgradeWebSocket?.();
|
|
202
|
+
if (upgradeWebSocket) {
|
|
203
|
+
return upgradeWebSocket(async (c) => {
|
|
204
|
+
const encodingRaw = c.req.header(HEADER_ENCODING);
|
|
205
|
+
const connParamsRaw = c.req.header(HEADER_CONN_PARAMS);
|
|
206
|
+
const authDataRaw = c.req.header(HEADER_AUTH_DATA);
|
|
207
|
+
|
|
208
|
+
const encoding = EncodingSchema.parse(encodingRaw);
|
|
209
|
+
const connParams = connParamsRaw
|
|
210
|
+
? JSON.parse(connParamsRaw)
|
|
211
|
+
: undefined;
|
|
212
|
+
const authData = authDataRaw ? JSON.parse(authDataRaw) : undefined;
|
|
213
|
+
|
|
214
|
+
const url = new URL(c.req.url);
|
|
215
|
+
const pathWithQuery = c.req.path + url.search;
|
|
216
|
+
|
|
217
|
+
loggerWithoutContext().debug({
|
|
218
|
+
msg: "actor router raw websocket",
|
|
219
|
+
path: c.req.path,
|
|
220
|
+
url: c.req.url,
|
|
221
|
+
search: url.search,
|
|
222
|
+
pathWithQuery,
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
return await handleRawWebSocketHandler(
|
|
226
|
+
c.req.raw,
|
|
227
|
+
pathWithQuery,
|
|
228
|
+
actorDriver,
|
|
229
|
+
c.env.actorId,
|
|
230
|
+
authData,
|
|
231
|
+
);
|
|
232
|
+
})(c, noopNext());
|
|
233
|
+
} else {
|
|
234
|
+
return c.text(
|
|
235
|
+
"WebSockets are not enabled for this driver. Use SSE instead.",
|
|
236
|
+
400,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
if (runConfig.inspector.enabled) {
|
|
242
|
+
router.route(
|
|
243
|
+
"/inspect",
|
|
244
|
+
new Hono<ActorInspectorRouterEnv & { Bindings: ActorRouterBindings }>()
|
|
245
|
+
.use(
|
|
246
|
+
cors(runConfig.inspector.cors),
|
|
247
|
+
secureInspector(runConfig),
|
|
248
|
+
async (c, next) => {
|
|
249
|
+
const inspector = (await actorDriver.loadActor(c.env.actorId))
|
|
250
|
+
.inspector;
|
|
251
|
+
invariant(inspector, "inspector not supported on this platform");
|
|
252
|
+
|
|
253
|
+
c.set("inspector", inspector);
|
|
254
|
+
return next();
|
|
255
|
+
},
|
|
256
|
+
)
|
|
257
|
+
.route("/", createActorInspectorRouter()),
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
router.notFound(handleRouteNotFound);
|
|
262
|
+
router.onError(handleRouteError);
|
|
263
|
+
|
|
264
|
+
return router;
|
|
265
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AnyActorInstance } from "./instance";
|
|
2
|
+
|
|
3
|
+
export class Schedule {
|
|
4
|
+
#actor: AnyActorInstance;
|
|
5
|
+
|
|
6
|
+
constructor(actor: AnyActorInstance) {
|
|
7
|
+
this.#actor = actor;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async after(duration: number, fn: string, ...args: unknown[]) {
|
|
11
|
+
await this.#actor.scheduleEvent(Date.now() + duration, fn, args);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async at(timestamp: number, fn: string, ...args: unknown[]) {
|
|
15
|
+
await this.#actor.scheduleEvent(timestamp, fn, args);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
//// @ts-ignore we do not have types for this lib
|
|
2
|
+
//import { renderToPipeableStream } from "@jogit/tmp-react-server-dom-nodeless";
|
|
3
|
+
//import getStream from "get-stream";
|
|
4
|
+
//import { isValidElement } from "react";
|
|
5
|
+
//import { Actor } from "./actor";
|
|
6
|
+
//
|
|
7
|
+
///**
|
|
8
|
+
// * A React Server Components (RSC) actor.
|
|
9
|
+
// *
|
|
10
|
+
// * Supports rendering React elements as action responses.
|
|
11
|
+
// *
|
|
12
|
+
// * @see [Documentation](https://rivet.dev/docs/client/react)
|
|
13
|
+
// * @experimental
|
|
14
|
+
// */
|
|
15
|
+
//export class RscActor<
|
|
16
|
+
// State = undefined,
|
|
17
|
+
// ConnParams = undefined,
|
|
18
|
+
// ConnState = undefined,
|
|
19
|
+
//> extends Actor<State, ConnParams, ConnState> {
|
|
20
|
+
// /**
|
|
21
|
+
// * Updates the RSCs for all connected clients.
|
|
22
|
+
// */
|
|
23
|
+
// public _updateRsc() {
|
|
24
|
+
// // Broadcast a message to all connected clients, telling them to re-render
|
|
25
|
+
// this._broadcast("__rsc");
|
|
26
|
+
// }
|
|
27
|
+
//
|
|
28
|
+
// /**
|
|
29
|
+
// * Overrides default behavior to update the RSCs when the state changes.
|
|
30
|
+
// * @private
|
|
31
|
+
// * @internal
|
|
32
|
+
// */
|
|
33
|
+
// override _onStateChange() {
|
|
34
|
+
// this._updateRsc();
|
|
35
|
+
// }
|
|
36
|
+
//
|
|
37
|
+
// /**
|
|
38
|
+
// * Overrides default behavior to render React elements as RSC response.
|
|
39
|
+
// * @private
|
|
40
|
+
// * @internal
|
|
41
|
+
// */
|
|
42
|
+
// protected override _onBeforeActionResponse<Out>(
|
|
43
|
+
// _name: string,
|
|
44
|
+
// _args: unknown[],
|
|
45
|
+
// output: Out,
|
|
46
|
+
// ): Out {
|
|
47
|
+
// if (!isValidElement(output)) {
|
|
48
|
+
// return super._onBeforeActionResponse(_name, _args, output);
|
|
49
|
+
// }
|
|
50
|
+
//
|
|
51
|
+
// // The output is a React element, so we need to transform it into a valid rsc message
|
|
52
|
+
// const { readable, ...writable } = nodeStreamToWebStream();
|
|
53
|
+
//
|
|
54
|
+
// const stream = renderToPipeableStream(output);
|
|
55
|
+
//
|
|
56
|
+
// stream.pipe(writable);
|
|
57
|
+
//
|
|
58
|
+
// return getStream(readable) as Out;
|
|
59
|
+
// }
|
|
60
|
+
//}
|
|
61
|
+
//
|
|
62
|
+
//function nodeStreamToWebStream() {
|
|
63
|
+
// const buffer: Uint8Array[] = [];
|
|
64
|
+
// let writer: WritableStreamDefaultWriter<Uint8Array> | null = null;
|
|
65
|
+
//
|
|
66
|
+
// const writable = new WritableStream<Uint8Array>({
|
|
67
|
+
// write(chunk) {
|
|
68
|
+
// buffer.push(chunk);
|
|
69
|
+
// },
|
|
70
|
+
// close() {},
|
|
71
|
+
// });
|
|
72
|
+
//
|
|
73
|
+
// const readable = new ReadableStream<Uint8Array>({
|
|
74
|
+
// start() {},
|
|
75
|
+
// async pull(controller) {
|
|
76
|
+
// if (buffer.length > 0) {
|
|
77
|
+
// const chunk = buffer.shift(); // Get the next chunk from the buffer
|
|
78
|
+
// if (chunk) {
|
|
79
|
+
// controller.enqueue(chunk); // Push it to the readable stream
|
|
80
|
+
// }
|
|
81
|
+
// } else {
|
|
82
|
+
// if (writable.locked) {
|
|
83
|
+
// await new Promise((resolve) => setTimeout(resolve, 10));
|
|
84
|
+
// return this.pull?.(controller);
|
|
85
|
+
// }
|
|
86
|
+
// return controller.close();
|
|
87
|
+
// }
|
|
88
|
+
// },
|
|
89
|
+
// cancel() {},
|
|
90
|
+
// });
|
|
91
|
+
//
|
|
92
|
+
// return {
|
|
93
|
+
// readable,
|
|
94
|
+
// on: (str: string, fn: () => void) => {
|
|
95
|
+
// if (str === "drain") {
|
|
96
|
+
// writer = writable.getWriter();
|
|
97
|
+
// fn();
|
|
98
|
+
// }
|
|
99
|
+
// },
|
|
100
|
+
// write(chunk: Uint8Array) {
|
|
101
|
+
// writer?.write(chunk);
|
|
102
|
+
// },
|
|
103
|
+
// flush() {
|
|
104
|
+
// writer?.close();
|
|
105
|
+
// },
|
|
106
|
+
// end() {
|
|
107
|
+
// writer?.releaseLock();
|
|
108
|
+
// },
|
|
109
|
+
// };
|
|
110
|
+
//}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as errors from "./errors";
|
|
2
|
+
import { loggerWithoutContext } from "./log";
|
|
3
|
+
|
|
4
|
+
export function assertUnreachable(x: never): never {
|
|
5
|
+
loggerWithoutContext().error({
|
|
6
|
+
msg: "unreachable",
|
|
7
|
+
value: `${x}`,
|
|
8
|
+
stack: new Error().stack,
|
|
9
|
+
});
|
|
10
|
+
throw new errors.Unreachable(x);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const throttle = <
|
|
14
|
+
// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function
|
|
15
|
+
Fn extends (...args: any) => any,
|
|
16
|
+
>(
|
|
17
|
+
fn: Fn,
|
|
18
|
+
delay: number,
|
|
19
|
+
) => {
|
|
20
|
+
let lastRan = false;
|
|
21
|
+
let lastArgs: Parameters<Fn> | null = null;
|
|
22
|
+
|
|
23
|
+
return (...args: Parameters<Fn>) => {
|
|
24
|
+
if (!lastRan) {
|
|
25
|
+
fn.apply(this, args);
|
|
26
|
+
lastRan = true;
|
|
27
|
+
const timer = () =>
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
lastRan = false;
|
|
30
|
+
if (lastArgs) {
|
|
31
|
+
fn.apply(this, lastArgs);
|
|
32
|
+
lastRan = true;
|
|
33
|
+
lastArgs = null;
|
|
34
|
+
timer();
|
|
35
|
+
}
|
|
36
|
+
}, delay);
|
|
37
|
+
timer();
|
|
38
|
+
} else lastArgs = args;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export class DeadlineError extends Error {
|
|
43
|
+
constructor() {
|
|
44
|
+
super("Promise did not complete before deadline.");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
const signal = controller.signal;
|
|
51
|
+
|
|
52
|
+
// Set a timeout to abort the operation
|
|
53
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
54
|
+
|
|
55
|
+
return Promise.race<T>([
|
|
56
|
+
promise,
|
|
57
|
+
new Promise<T>((_, reject) => {
|
|
58
|
+
signal.addEventListener("abort", () => reject(new DeadlineError()));
|
|
59
|
+
}),
|
|
60
|
+
]).finally(() => {
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class Lock<T> {
|
|
66
|
+
private _locked = false;
|
|
67
|
+
private _waiting: Array<() => void> = [];
|
|
68
|
+
|
|
69
|
+
constructor(private _value: T) {}
|
|
70
|
+
|
|
71
|
+
async lock(fn: (value: T) => Promise<void>): Promise<void> {
|
|
72
|
+
if (this._locked) {
|
|
73
|
+
await new Promise<void>((resolve) => this._waiting.push(resolve));
|
|
74
|
+
}
|
|
75
|
+
this._locked = true;
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
await fn(this._value);
|
|
79
|
+
} finally {
|
|
80
|
+
this._locked = false;
|
|
81
|
+
const next = this._waiting.shift();
|
|
82
|
+
if (next) next();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function generateSecureToken(length = 32) {
|
|
88
|
+
const array = new Uint8Array(length);
|
|
89
|
+
crypto.getRandomValues(array);
|
|
90
|
+
return btoa(String.fromCharCode(...array));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function generateRandomString(length = 32) {
|
|
94
|
+
const characters =
|
|
95
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
96
|
+
let result = "";
|
|
97
|
+
for (let i = 0; i < length; i++) {
|
|
98
|
+
const randomIndex = Math.floor(Math.random() * characters.length);
|
|
99
|
+
result += characters[randomIndex];
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ActorDefinition, AnyActorDefinition } from "@/actor/definition";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Action function returned by Actor connections and handles.
|
|
5
|
+
*
|
|
6
|
+
* @typedef {Function} ActorActionFunction
|
|
7
|
+
* @template Args
|
|
8
|
+
* @template Response
|
|
9
|
+
* @param {...Args} args - Arguments for the action function.
|
|
10
|
+
* @returns {Promise<Response>}
|
|
11
|
+
*/
|
|
12
|
+
export type ActorActionFunction<
|
|
13
|
+
Args extends Array<unknown> = unknown[],
|
|
14
|
+
Response = unknown,
|
|
15
|
+
> = (
|
|
16
|
+
...args: Args extends [unknown, ...infer Rest] ? Rest : Args
|
|
17
|
+
) => Promise<Response>;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Maps action methods from actor definition to typed function signatures.
|
|
21
|
+
*/
|
|
22
|
+
export type ActorDefinitionActions<AD extends AnyActorDefinition> =
|
|
23
|
+
// biome-ignore lint/suspicious/noExplicitAny: safe to use any here
|
|
24
|
+
AD extends ActorDefinition<any, any, any, any, any, any, infer R>
|
|
25
|
+
? {
|
|
26
|
+
[K in keyof R]: R[K] extends (...args: infer Args) => infer Return
|
|
27
|
+
? ActorActionFunction<Args, Return>
|
|
28
|
+
: never;
|
|
29
|
+
}
|
|
30
|
+
: never;
|