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,412 @@
|
|
|
1
|
+
import { createRoute, OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
+
import * as cbor from "cbor-x";
|
|
3
|
+
import { Hono } from "hono";
|
|
4
|
+
import { cors as corsMiddleware } from "hono/cors";
|
|
5
|
+
import { createMiddleware } from "hono/factory";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import {
|
|
8
|
+
ActorNotFound,
|
|
9
|
+
FeatureNotImplemented,
|
|
10
|
+
MissingActorHeader,
|
|
11
|
+
Unsupported,
|
|
12
|
+
WebSocketsNotEnabled,
|
|
13
|
+
} from "@/actor/errors";
|
|
14
|
+
import {
|
|
15
|
+
handleRouteError,
|
|
16
|
+
handleRouteNotFound,
|
|
17
|
+
loggerMiddleware,
|
|
18
|
+
} from "@/common/router";
|
|
19
|
+
import { createManagerInspectorRouter } from "@/inspector/manager";
|
|
20
|
+
import { secureInspector } from "@/inspector/utils";
|
|
21
|
+
import {
|
|
22
|
+
type ActorsCreateRequest,
|
|
23
|
+
ActorsCreateRequestSchema,
|
|
24
|
+
ActorsCreateResponseSchema,
|
|
25
|
+
} from "@/manager-api/routes/actors-create";
|
|
26
|
+
import { ActorsDeleteResponseSchema } from "@/manager-api/routes/actors-delete";
|
|
27
|
+
import { ActorsGetResponseSchema } from "@/manager-api/routes/actors-get";
|
|
28
|
+
import { ActorsGetByIdResponseSchema } from "@/manager-api/routes/actors-get-by-id";
|
|
29
|
+
import {
|
|
30
|
+
type ActorsGetOrCreateByIdRequest,
|
|
31
|
+
ActorsGetOrCreateByIdRequestSchema,
|
|
32
|
+
ActorsGetOrCreateByIdResponseSchema,
|
|
33
|
+
} from "@/manager-api/routes/actors-get-or-create-by-id";
|
|
34
|
+
import { RivetIdSchema } from "@/manager-api/routes/common";
|
|
35
|
+
import type { RegistryConfig } from "@/registry/config";
|
|
36
|
+
import type { RunConfig } from "@/registry/run-config";
|
|
37
|
+
import type { ManagerDriver } from "./driver";
|
|
38
|
+
import { logger } from "./log";
|
|
39
|
+
|
|
40
|
+
function buildOpenApiResponses<T>(schema: T, validateBody: boolean) {
|
|
41
|
+
return {
|
|
42
|
+
200: {
|
|
43
|
+
description: "Success",
|
|
44
|
+
content: validateBody
|
|
45
|
+
? {
|
|
46
|
+
"application/json": {
|
|
47
|
+
schema,
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
: {},
|
|
51
|
+
},
|
|
52
|
+
400: {
|
|
53
|
+
description: "User error",
|
|
54
|
+
},
|
|
55
|
+
500: {
|
|
56
|
+
description: "Internal error",
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function createManagerRouter(
|
|
62
|
+
registryConfig: RegistryConfig,
|
|
63
|
+
runConfig: RunConfig,
|
|
64
|
+
managerDriver: ManagerDriver,
|
|
65
|
+
validateBody: boolean,
|
|
66
|
+
): { router: Hono; openapi: OpenAPIHono } {
|
|
67
|
+
const router = new OpenAPIHono({ strict: false }).basePath(
|
|
68
|
+
runConfig.basePath,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
router.use("*", loggerMiddleware(logger()));
|
|
72
|
+
|
|
73
|
+
const cors = runConfig.cors
|
|
74
|
+
? corsMiddleware(runConfig.cors)
|
|
75
|
+
: createMiddleware((_c, next) => next());
|
|
76
|
+
|
|
77
|
+
// Actor proxy middleware - intercept requests with x-rivet-target=actor
|
|
78
|
+
router.use("*", cors, async (c, next) => {
|
|
79
|
+
const target = c.req.header("x-rivet-target");
|
|
80
|
+
const actorId = c.req.header("x-rivet-actor");
|
|
81
|
+
|
|
82
|
+
if (target === "actor") {
|
|
83
|
+
if (!actorId) {
|
|
84
|
+
throw new MissingActorHeader();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
logger().debug({
|
|
88
|
+
msg: "proxying request to actor",
|
|
89
|
+
actorId,
|
|
90
|
+
path: c.req.path,
|
|
91
|
+
method: c.req.method,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Handle WebSocket upgrade
|
|
95
|
+
if (c.req.header("upgrade") === "websocket") {
|
|
96
|
+
const upgradeWebSocket = runConfig.getUpgradeWebSocket?.();
|
|
97
|
+
if (!upgradeWebSocket) {
|
|
98
|
+
throw new WebSocketsNotEnabled();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// For WebSocket, use the driver's proxyWebSocket method
|
|
102
|
+
// Extract any additional headers that might be needed
|
|
103
|
+
const encoding =
|
|
104
|
+
c.req.header("X-RivetKit-Encoding") ||
|
|
105
|
+
c.req.header("x-rivet-encoding") ||
|
|
106
|
+
"json";
|
|
107
|
+
const connParams =
|
|
108
|
+
c.req.header("X-RivetKit-Conn-Params") ||
|
|
109
|
+
c.req.header("x-rivet-conn-params");
|
|
110
|
+
const authData =
|
|
111
|
+
c.req.header("X-RivetKit-Auth-Data") ||
|
|
112
|
+
c.req.header("x-rivet-auth-data");
|
|
113
|
+
|
|
114
|
+
// Include query string if present
|
|
115
|
+
const pathWithQuery = c.req.url.includes("?")
|
|
116
|
+
? c.req.path + c.req.url.substring(c.req.url.indexOf("?"))
|
|
117
|
+
: c.req.path;
|
|
118
|
+
|
|
119
|
+
return await managerDriver.proxyWebSocket(
|
|
120
|
+
c,
|
|
121
|
+
pathWithQuery,
|
|
122
|
+
actorId,
|
|
123
|
+
encoding as any, // Will be validated by driver
|
|
124
|
+
connParams ? JSON.parse(connParams) : undefined,
|
|
125
|
+
authData ? JSON.parse(authData) : undefined,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Handle regular HTTP requests
|
|
130
|
+
// Preserve all headers except the routing headers
|
|
131
|
+
const proxyHeaders = new Headers(c.req.raw.headers);
|
|
132
|
+
proxyHeaders.delete("x-rivet-target");
|
|
133
|
+
proxyHeaders.delete("x-rivet-actor");
|
|
134
|
+
|
|
135
|
+
// Build the proxy request with the actor URL format
|
|
136
|
+
const url = new URL(c.req.url);
|
|
137
|
+
const proxyUrl = new URL(`http://actor${url.pathname}${url.search}`);
|
|
138
|
+
|
|
139
|
+
const proxyRequest = new Request(proxyUrl, {
|
|
140
|
+
method: c.req.method,
|
|
141
|
+
headers: proxyHeaders,
|
|
142
|
+
body: c.req.raw.body,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
return await managerDriver.proxyRequest(c, proxyRequest, actorId);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return next();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// GET /
|
|
152
|
+
router.get("/", cors, (c) => {
|
|
153
|
+
return c.text(
|
|
154
|
+
"This is a RivetKit server.\n\nLearn more at https://rivetkit.org",
|
|
155
|
+
);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// GET /actors/by-id
|
|
159
|
+
{
|
|
160
|
+
const route = createRoute({
|
|
161
|
+
middleware: [cors],
|
|
162
|
+
method: "get",
|
|
163
|
+
path: "/actors/by-id",
|
|
164
|
+
request: {
|
|
165
|
+
query: z.object({
|
|
166
|
+
name: z.string(),
|
|
167
|
+
key: z.string(),
|
|
168
|
+
}),
|
|
169
|
+
},
|
|
170
|
+
responses: buildOpenApiResponses(
|
|
171
|
+
ActorsGetByIdResponseSchema,
|
|
172
|
+
validateBody,
|
|
173
|
+
),
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
router.openapi(route, async (c) => {
|
|
177
|
+
const { name, key } = c.req.valid("query");
|
|
178
|
+
|
|
179
|
+
// Get actor by key from the driver
|
|
180
|
+
const actorOutput = await managerDriver.getWithKey({
|
|
181
|
+
c,
|
|
182
|
+
name,
|
|
183
|
+
key: [key], // Convert string to ActorKey array
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
return c.json({
|
|
187
|
+
actor_id: actorOutput?.actorId || null,
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// PUT /actors/by-id
|
|
193
|
+
{
|
|
194
|
+
const route = createRoute({
|
|
195
|
+
cors: [cors],
|
|
196
|
+
method: "put",
|
|
197
|
+
path: "/actors/by-id",
|
|
198
|
+
request: {
|
|
199
|
+
body: {
|
|
200
|
+
content: validateBody
|
|
201
|
+
? {
|
|
202
|
+
"application/json": {
|
|
203
|
+
schema: ActorsGetOrCreateByIdRequestSchema,
|
|
204
|
+
},
|
|
205
|
+
}
|
|
206
|
+
: {},
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
responses: buildOpenApiResponses(
|
|
210
|
+
ActorsGetOrCreateByIdResponseSchema,
|
|
211
|
+
validateBody,
|
|
212
|
+
),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
router.openapi(route, async (c) => {
|
|
216
|
+
const body = validateBody
|
|
217
|
+
? await c.req.json<ActorsGetOrCreateByIdRequest>()
|
|
218
|
+
: await c.req.json();
|
|
219
|
+
|
|
220
|
+
// Parse and validate the request body if validation is enabled
|
|
221
|
+
if (validateBody) {
|
|
222
|
+
ActorsGetOrCreateByIdRequestSchema.parse(body);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Check if actor already exists
|
|
226
|
+
const existingActor = await managerDriver.getWithKey({
|
|
227
|
+
c,
|
|
228
|
+
name: body.name,
|
|
229
|
+
key: [body.key], // Convert string to ActorKey array
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
if (existingActor) {
|
|
233
|
+
return c.json({
|
|
234
|
+
actor_id: existingActor.actorId,
|
|
235
|
+
created: false,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Create new actor
|
|
240
|
+
const newActor = await managerDriver.getOrCreateWithKey({
|
|
241
|
+
c,
|
|
242
|
+
name: body.name,
|
|
243
|
+
key: [body.key], // Convert string to ActorKey array
|
|
244
|
+
input: body.input
|
|
245
|
+
? cbor.decode(Buffer.from(body.input, "base64"))
|
|
246
|
+
: undefined,
|
|
247
|
+
region: undefined, // Not provided in the request schema
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
return c.json({
|
|
251
|
+
actor_id: newActor.actorId,
|
|
252
|
+
created: true,
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// GET /actors/{actor_id}
|
|
258
|
+
{
|
|
259
|
+
const route = createRoute({
|
|
260
|
+
middleware: [cors],
|
|
261
|
+
method: "get",
|
|
262
|
+
path: "/actors/{actor_id}",
|
|
263
|
+
request: {
|
|
264
|
+
params: z.object({
|
|
265
|
+
actor_id: RivetIdSchema,
|
|
266
|
+
}),
|
|
267
|
+
},
|
|
268
|
+
responses: buildOpenApiResponses(ActorsGetResponseSchema, validateBody),
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
router.openapi(route, async (c) => {
|
|
272
|
+
const { actor_id } = c.req.valid("param");
|
|
273
|
+
|
|
274
|
+
// Get actor by ID from the driver
|
|
275
|
+
const actorOutput = await managerDriver.getForId({
|
|
276
|
+
c,
|
|
277
|
+
name: "", // TODO: The API doesn't provide the name, this may need to be resolved
|
|
278
|
+
actorId: actor_id,
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
if (!actorOutput) {
|
|
282
|
+
throw new ActorNotFound(actor_id);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Transform ActorOutput to match ActorSchema
|
|
286
|
+
// Note: Some fields are not available from the driver and need defaults
|
|
287
|
+
const actor = {
|
|
288
|
+
actor_id: actorOutput.actorId,
|
|
289
|
+
name: actorOutput.name,
|
|
290
|
+
key: actorOutput.key,
|
|
291
|
+
namespace_id: "", // Not available from driver
|
|
292
|
+
runner_name_selector: "", // Not available from driver
|
|
293
|
+
create_ts: Date.now(), // Not available from driver
|
|
294
|
+
connectable_ts: null,
|
|
295
|
+
destroy_ts: null,
|
|
296
|
+
sleep_ts: null,
|
|
297
|
+
start_ts: null,
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
return c.json({ actor });
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// POST /actors
|
|
305
|
+
{
|
|
306
|
+
const route = createRoute({
|
|
307
|
+
middleware: [cors],
|
|
308
|
+
method: "post",
|
|
309
|
+
path: "/actors",
|
|
310
|
+
request: {
|
|
311
|
+
body: {
|
|
312
|
+
content: validateBody
|
|
313
|
+
? {
|
|
314
|
+
"application/json": {
|
|
315
|
+
schema: ActorsCreateRequestSchema,
|
|
316
|
+
},
|
|
317
|
+
}
|
|
318
|
+
: {},
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
responses: buildOpenApiResponses(
|
|
322
|
+
ActorsCreateResponseSchema,
|
|
323
|
+
validateBody,
|
|
324
|
+
),
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
router.openapi(route, async (c) => {
|
|
328
|
+
const body = validateBody
|
|
329
|
+
? await c.req.json<ActorsCreateRequest>()
|
|
330
|
+
: await c.req.json();
|
|
331
|
+
|
|
332
|
+
// Parse and validate the request body if validation is enabled
|
|
333
|
+
if (validateBody) {
|
|
334
|
+
ActorsCreateRequestSchema.parse(body);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Create actor using the driver
|
|
338
|
+
const actorOutput = await managerDriver.createActor({
|
|
339
|
+
c,
|
|
340
|
+
name: body.name,
|
|
341
|
+
key: [body.key || crypto.randomUUID()], // Generate key if not provided, convert to ActorKey array
|
|
342
|
+
input: body.input
|
|
343
|
+
? cbor.decode(Buffer.from(body.input, "base64"))
|
|
344
|
+
: undefined,
|
|
345
|
+
region: undefined, // Not provided in the request schema
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
// Transform ActorOutput to match ActorSchema
|
|
349
|
+
const actor = {
|
|
350
|
+
actor_id: actorOutput.actorId,
|
|
351
|
+
name: actorOutput.name,
|
|
352
|
+
key: actorOutput.key,
|
|
353
|
+
namespace_id: "", // Not available from driver
|
|
354
|
+
runner_name_selector: body.runner_name_selector,
|
|
355
|
+
create_ts: Date.now(),
|
|
356
|
+
connectable_ts: null,
|
|
357
|
+
destroy_ts: null,
|
|
358
|
+
sleep_ts: null,
|
|
359
|
+
start_ts: null,
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
return c.json({ actor });
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// TODO:
|
|
367
|
+
// // DELETE /actors/{actor_id}
|
|
368
|
+
// {
|
|
369
|
+
// const route = createRoute({
|
|
370
|
+
// middleware: [cors],
|
|
371
|
+
// method: "delete",
|
|
372
|
+
// path: "/actors/{actor_id}",
|
|
373
|
+
// request: {
|
|
374
|
+
// params: z.object({
|
|
375
|
+
// actor_id: RivetIdSchema,
|
|
376
|
+
// }),
|
|
377
|
+
// },
|
|
378
|
+
// responses: buildOpenApiResponses(
|
|
379
|
+
// ActorsDeleteResponseSchema,
|
|
380
|
+
// validateBody,
|
|
381
|
+
// ),
|
|
382
|
+
// });
|
|
383
|
+
//
|
|
384
|
+
// router.openapi(route, async (c) => {
|
|
385
|
+
// const { actor_id } = c.req.valid("param");
|
|
386
|
+
//
|
|
387
|
+
// });
|
|
388
|
+
// }
|
|
389
|
+
|
|
390
|
+
if (runConfig.inspector?.enabled) {
|
|
391
|
+
if (!managerDriver.inspector) {
|
|
392
|
+
throw new Unsupported("inspector");
|
|
393
|
+
}
|
|
394
|
+
router.route(
|
|
395
|
+
"/inspect",
|
|
396
|
+
new Hono<{ Variables: { inspector: any } }>()
|
|
397
|
+
.use(corsMiddleware(runConfig.inspector.cors))
|
|
398
|
+
.use(secureInspector(runConfig))
|
|
399
|
+
.use((c, next) => {
|
|
400
|
+
c.set("inspector", managerDriver.inspector!);
|
|
401
|
+
return next();
|
|
402
|
+
})
|
|
403
|
+
.route("/", createManagerInspectorRouter()),
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Error handling
|
|
408
|
+
router.notFound(handleRouteNotFound);
|
|
409
|
+
router.onError(handleRouteError);
|
|
410
|
+
|
|
411
|
+
return { router: router as Hono, openapi: router };
|
|
412
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ActorSchema } from "./common";
|
|
3
|
+
|
|
4
|
+
export const ActorsCreateRequestSchema = z.object({
|
|
5
|
+
name: z.string(),
|
|
6
|
+
runner_name_selector: z.string(),
|
|
7
|
+
crash_policy: z.string(),
|
|
8
|
+
key: z.string().nullable().optional(),
|
|
9
|
+
input: z.string().nullable().optional(),
|
|
10
|
+
});
|
|
11
|
+
export type ActorsCreateRequest = z.infer<typeof ActorsCreateRequestSchema>;
|
|
12
|
+
|
|
13
|
+
export const ActorsCreateResponseSchema = z.object({
|
|
14
|
+
actor: ActorSchema,
|
|
15
|
+
});
|
|
16
|
+
export type ActorsCreateResponse = z.infer<typeof ActorsCreateResponseSchema>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ActorSchema, RivetIdSchema } from "./common";
|
|
3
|
+
|
|
4
|
+
export const ActorsGetOrCreateResponseSchema = z.object({
|
|
5
|
+
actor: ActorSchema,
|
|
6
|
+
created: z.boolean(),
|
|
7
|
+
});
|
|
8
|
+
export type ActorsGetOrCreateResponse = z.infer<
|
|
9
|
+
typeof ActorsGetOrCreateResponseSchema
|
|
10
|
+
>;
|
|
11
|
+
|
|
12
|
+
export const ActorsGetOrCreateByIdResponseSchema = z.object({
|
|
13
|
+
actor_id: RivetIdSchema,
|
|
14
|
+
created: z.boolean(),
|
|
15
|
+
});
|
|
16
|
+
export type ActorsGetOrCreateByIdResponse = z.infer<
|
|
17
|
+
typeof ActorsGetOrCreateByIdResponseSchema
|
|
18
|
+
>;
|
|
19
|
+
|
|
20
|
+
export const ActorsGetOrCreateByIdRequestSchema = z.object({
|
|
21
|
+
name: z.string(),
|
|
22
|
+
key: z.string(),
|
|
23
|
+
runner_name_selector: z.string(),
|
|
24
|
+
crash_policy: z.string(),
|
|
25
|
+
input: z.string().nullable().optional(),
|
|
26
|
+
});
|
|
27
|
+
export type ActorsGetOrCreateByIdRequest = z.infer<
|
|
28
|
+
typeof ActorsGetOrCreateByIdRequestSchema
|
|
29
|
+
>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const RivetIdSchema = z.string();
|
|
4
|
+
export type RivetId = z.infer<typeof RivetIdSchema>;
|
|
5
|
+
|
|
6
|
+
export const ActorSchema = z.object({
|
|
7
|
+
actor_id: RivetIdSchema,
|
|
8
|
+
name: z.string(),
|
|
9
|
+
key: z.string(),
|
|
10
|
+
namespace_id: RivetIdSchema,
|
|
11
|
+
runner_name_selector: z.string(),
|
|
12
|
+
create_ts: z.number(),
|
|
13
|
+
connectable_ts: z.number().nullable().optional(),
|
|
14
|
+
destroy_ts: z.number().nullable().optional(),
|
|
15
|
+
sleep_ts: z.number().nullable().optional(),
|
|
16
|
+
start_ts: z.number().nullable().optional(),
|
|
17
|
+
});
|
|
18
|
+
export type Actor = z.infer<typeof ActorSchema>;
|
package/src/mod.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { generateConnId, generateConnToken } from "@/actor/connection";
|
|
2
|
+
export * from "@/actor/mod";
|
|
3
|
+
export {
|
|
4
|
+
type AnyClient,
|
|
5
|
+
type Client,
|
|
6
|
+
createClientWithDriver,
|
|
7
|
+
} from "@/client/client";
|
|
8
|
+
export { InlineWebSocketAdapter2 } from "@/common/inline-websocket-adapter2";
|
|
9
|
+
export { noopNext } from "@/common/utils";
|
|
10
|
+
export { createEngineDriver } from "@/drivers/engine/mod";
|
|
11
|
+
export {
|
|
12
|
+
createFileSystemDriver,
|
|
13
|
+
createMemoryDriver,
|
|
14
|
+
} from "@/drivers/file-system/mod";
|
|
15
|
+
// Re-export important protocol types and utilities needed by drivers
|
|
16
|
+
export type { ActorQuery } from "@/manager/protocol/query";
|
|
17
|
+
export * from "@/registry/mod";
|
|
18
|
+
export { toUint8Array } from "@/utils";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//! These configs configs hold anything that's not platform-specific about running actors.
|
|
2
|
+
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import type { ActorDefinition, AnyActorDefinition } from "@/actor/definition";
|
|
5
|
+
|
|
6
|
+
export const ActorsSchema = z.record(
|
|
7
|
+
z.string(),
|
|
8
|
+
z.custom<ActorDefinition<any, any, any, any, any, any, any>>(),
|
|
9
|
+
);
|
|
10
|
+
export type RegistryActors = z.infer<typeof ActorsSchema>;
|
|
11
|
+
|
|
12
|
+
export const TestConfigSchema = z.object({ enabled: z.boolean() });
|
|
13
|
+
export type TestConfig = z.infer<typeof TestConfigSchema>;
|
|
14
|
+
|
|
15
|
+
/** Base config used for the actor config across all platforms. */
|
|
16
|
+
export const RegistryConfigSchema = z.object({
|
|
17
|
+
use: z.record(z.string(), z.custom<AnyActorDefinition>()),
|
|
18
|
+
|
|
19
|
+
// TODO: Find a better way of passing around the test config
|
|
20
|
+
/**
|
|
21
|
+
* Test configuration.
|
|
22
|
+
*
|
|
23
|
+
* DO NOT MANUALLY ENABLE. THIS IS USED INTERNALLY.
|
|
24
|
+
* @internal
|
|
25
|
+
**/
|
|
26
|
+
test: TestConfigSchema.optional().default({ enabled: false }),
|
|
27
|
+
});
|
|
28
|
+
export type RegistryConfig = z.infer<typeof RegistryConfigSchema>;
|
|
29
|
+
export type RegistryConfigInput<A extends RegistryActors> = Omit<
|
|
30
|
+
z.input<typeof RegistryConfigSchema>,
|
|
31
|
+
"use"
|
|
32
|
+
> & { use: A };
|