rivetkit 2.0.2 → 2.0.3
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/schemas/actor-persist/v1.ts +228 -0
- package/dist/schemas/client-protocol/v1.ts +429 -0
- package/dist/schemas/file-system-driver/v1.ts +102 -0
- package/dist/tsup/actor/errors.cjs +69 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +143 -0
- package/dist/tsup/actor/errors.d.ts +143 -0
- package/dist/tsup/actor/errors.js +69 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/chunk-2CRLFV6Z.cjs +202 -0
- package/dist/tsup/chunk-2CRLFV6Z.cjs.map +1 -0
- package/dist/tsup/chunk-3H7O2A7I.js +525 -0
- package/dist/tsup/chunk-3H7O2A7I.js.map +1 -0
- package/dist/tsup/chunk-42I3OZ3Q.js +15 -0
- package/dist/tsup/chunk-42I3OZ3Q.js.map +1 -0
- package/dist/tsup/chunk-4NSUQZ2H.js +1790 -0
- package/dist/tsup/chunk-4NSUQZ2H.js.map +1 -0
- package/dist/tsup/chunk-6PDXBYI5.js +132 -0
- package/dist/tsup/chunk-6PDXBYI5.js.map +1 -0
- package/dist/tsup/chunk-6WKQDDUD.cjs +1790 -0
- package/dist/tsup/chunk-6WKQDDUD.cjs.map +1 -0
- package/dist/tsup/chunk-CTBOSFUH.cjs +116 -0
- package/dist/tsup/chunk-CTBOSFUH.cjs.map +1 -0
- package/dist/tsup/chunk-EGVZZFE2.js +2857 -0
- package/dist/tsup/chunk-EGVZZFE2.js.map +1 -0
- package/dist/tsup/chunk-FCCPJNMA.cjs +132 -0
- package/dist/tsup/chunk-FCCPJNMA.cjs.map +1 -0
- package/dist/tsup/chunk-FLMTTN27.js +244 -0
- package/dist/tsup/chunk-FLMTTN27.js.map +1 -0
- package/dist/tsup/chunk-GIR3AFFI.cjs +315 -0
- package/dist/tsup/chunk-GIR3AFFI.cjs.map +1 -0
- package/dist/tsup/chunk-INGJP237.js +315 -0
- package/dist/tsup/chunk-INGJP237.js.map +1 -0
- package/dist/tsup/chunk-KJCJLKRM.js +116 -0
- package/dist/tsup/chunk-KJCJLKRM.js.map +1 -0
- package/dist/tsup/chunk-KUPQZYUQ.cjs +15 -0
- package/dist/tsup/chunk-KUPQZYUQ.cjs.map +1 -0
- package/dist/tsup/chunk-O2MBYIXO.cjs +2857 -0
- package/dist/tsup/chunk-O2MBYIXO.cjs.map +1 -0
- package/dist/tsup/chunk-OGAPU3UG.cjs +525 -0
- package/dist/tsup/chunk-OGAPU3UG.cjs.map +1 -0
- package/dist/tsup/chunk-OV6AYD4S.js +4406 -0
- package/dist/tsup/chunk-OV6AYD4S.js.map +1 -0
- package/dist/tsup/chunk-PO4VLDWA.js +47 -0
- package/dist/tsup/chunk-PO4VLDWA.js.map +1 -0
- package/dist/tsup/chunk-R2OPSKIV.cjs +244 -0
- package/dist/tsup/chunk-R2OPSKIV.cjs.map +1 -0
- package/dist/tsup/chunk-TZJKSBUQ.cjs +47 -0
- package/dist/tsup/chunk-TZJKSBUQ.cjs.map +1 -0
- package/dist/tsup/chunk-UBUC5C3G.cjs +189 -0
- package/dist/tsup/chunk-UBUC5C3G.cjs.map +1 -0
- package/dist/tsup/chunk-UIM22YJL.cjs +4406 -0
- package/dist/tsup/chunk-UIM22YJL.cjs.map +1 -0
- package/dist/tsup/chunk-URVFQMYI.cjs +230 -0
- package/dist/tsup/chunk-URVFQMYI.cjs.map +1 -0
- package/dist/tsup/chunk-UVUPOS46.js +230 -0
- package/dist/tsup/chunk-UVUPOS46.js.map +1 -0
- package/dist/tsup/chunk-VRRHBNJC.js +189 -0
- package/dist/tsup/chunk-VRRHBNJC.js.map +1 -0
- package/dist/tsup/chunk-XFSS33EQ.js +202 -0
- package/dist/tsup/chunk-XFSS33EQ.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 +26 -0
- package/dist/tsup/client/mod.d.ts +26 -0
- package/dist/tsup/client/mod.js +32 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +13 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +20 -0
- package/dist/tsup/common/log.d.ts +20 -0
- package/dist/tsup/common/log.js +13 -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-CpqORuCq.d.cts +218 -0
- package/dist/tsup/common-CpqORuCq.d.ts +218 -0
- package/dist/tsup/connection-BR_Ve4ku.d.cts +2117 -0
- package/dist/tsup/connection-BwUMoe6n.d.ts +2117 -0
- package/dist/tsup/driver-helpers/mod.cjs +33 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +18 -0
- package/dist/tsup/driver-helpers/mod.d.ts +18 -0
- package/dist/tsup/driver-helpers/mod.js +33 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +4619 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +57 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +57 -0
- package/dist/tsup/driver-test-suite/mod.js +4619 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +53 -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 +53 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/mod.cjs +73 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +100 -0
- package/dist/tsup/mod.d.ts +100 -0
- package/dist/tsup/mod.js +73 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/router-endpoints-AYkXG8Tl.d.cts +66 -0
- package/dist/tsup/router-endpoints-DAbqVFx2.d.ts +66 -0
- package/dist/tsup/test/mod.cjs +21 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +27 -0
- package/dist/tsup/test/mod.d.ts +27 -0
- package/dist/tsup/test/mod.js +21 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-CT0cv4jd.d.cts +17 -0
- package/dist/tsup/utils-CT0cv4jd.d.ts +17 -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 +182 -0
- package/src/actor/config.ts +765 -0
- package/src/actor/connection.ts +260 -0
- package/src/actor/context.ts +171 -0
- package/src/actor/database.ts +23 -0
- package/src/actor/definition.ts +86 -0
- package/src/actor/driver.ts +84 -0
- package/src/actor/errors.ts +360 -0
- package/src/actor/generic-conn-driver.ts +234 -0
- package/src/actor/instance.ts +1800 -0
- package/src/actor/log.ts +15 -0
- package/src/actor/mod.ts +113 -0
- package/src/actor/persisted.ts +42 -0
- package/src/actor/protocol/old.ts +281 -0
- package/src/actor/protocol/serde.ts +131 -0
- package/src/actor/router-endpoints.ts +685 -0
- package/src/actor/router.ts +263 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/unstable-react.ts +110 -0
- package/src/actor/utils.ts +98 -0
- package/src/client/actor-common.ts +30 -0
- package/src/client/actor-conn.ts +804 -0
- package/src/client/actor-handle.ts +208 -0
- package/src/client/client.ts +623 -0
- package/src/client/errors.ts +41 -0
- package/src/client/http-client-driver.ts +326 -0
- package/src/client/log.ts +7 -0
- package/src/client/mod.ts +56 -0
- package/src/client/raw-utils.ts +92 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +150 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +80 -0
- package/src/common/fake-event-source.ts +266 -0
- package/src/common/inline-websocket-adapter2.ts +445 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +139 -0
- package/src/common/logfmt.ts +228 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +87 -0
- package/src/common/utils.ts +322 -0
- package/src/common/versioned-data.ts +95 -0
- package/src/common/websocket-interface.ts +49 -0
- package/src/common/websocket.ts +43 -0
- package/src/driver-helpers/mod.ts +22 -0
- package/src/driver-helpers/utils.ts +17 -0
- package/src/driver-test-suite/log.ts +7 -0
- package/src/driver-test-suite/mod.ts +213 -0
- package/src/driver-test-suite/test-inline-client-driver.ts +402 -0
- package/src/driver-test-suite/tests/action-features.ts +136 -0
- package/src/driver-test-suite/tests/actor-auth.ts +591 -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 +259 -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 +365 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +226 -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 +392 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
- package/src/driver-test-suite/tests/request-access.ts +244 -0
- package/src/driver-test-suite/utils.ts +68 -0
- package/src/drivers/default.ts +31 -0
- package/src/drivers/engine/actor-driver.ts +360 -0
- package/src/drivers/engine/api-endpoints.ts +128 -0
- package/src/drivers/engine/api-utils.ts +70 -0
- package/src/drivers/engine/config.ts +39 -0
- package/src/drivers/engine/keys.test.ts +266 -0
- package/src/drivers/engine/keys.ts +89 -0
- package/src/drivers/engine/kv.ts +3 -0
- package/src/drivers/engine/log.ts +7 -0
- package/src/drivers/engine/manager-driver.ts +391 -0
- package/src/drivers/engine/mod.ts +36 -0
- package/src/drivers/engine/ws-proxy.ts +170 -0
- package/src/drivers/file-system/actor.ts +91 -0
- package/src/drivers/file-system/global-state.ts +673 -0
- package/src/drivers/file-system/log.ts +7 -0
- package/src/drivers/file-system/manager.ts +306 -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/inline-client-driver/log.ts +7 -0
- package/src/inline-client-driver/mod.ts +385 -0
- package/src/inspector/actor.ts +298 -0
- package/src/inspector/config.ts +83 -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/auth.ts +121 -0
- package/src/manager/driver.ts +80 -0
- package/src/manager/hono-websocket-adapter.ts +333 -0
- package/src/manager/log.ts +7 -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 +1792 -0
- package/src/mod.ts +20 -0
- package/src/registry/config.ts +32 -0
- package/src/registry/log.ts +7 -0
- package/src/registry/mod.ts +124 -0
- package/src/registry/run-config.ts +54 -0
- package/src/registry/serve.ts +53 -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 +84 -0
- package/src/test/config.ts +16 -0
- package/src/test/log.ts +7 -0
- package/src/test/mod.ts +153 -0
- package/src/utils.ts +172 -0
- package/README.md +0 -13
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { cors } from "hono/cors";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { HEADER_ACTOR_QUERY } from "@/driver-helpers/mod";
|
|
4
|
+
import { getEnvUniversal } from "@/utils";
|
|
5
|
+
|
|
6
|
+
type CorsOptions = NonNullable<Parameters<typeof cors>[0]>;
|
|
7
|
+
|
|
8
|
+
const defaultTokenFn = () => {
|
|
9
|
+
const envToken = getEnvUniversal("RIVETKIT_INSPECTOR_TOKEN");
|
|
10
|
+
|
|
11
|
+
if (envToken) {
|
|
12
|
+
return envToken;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return "";
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const defaultEnabled = () => {
|
|
19
|
+
return (
|
|
20
|
+
getEnvUniversal("NODE_ENV") !== "production" ||
|
|
21
|
+
!getEnvUniversal("RIVETKIT_INSPECTOR_DISABLE")
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const defaultInspectorOrigins = [
|
|
26
|
+
"http://localhost:43708",
|
|
27
|
+
"https://studio.rivet.gg",
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const defaultCors: CorsOptions = {
|
|
31
|
+
origin: (origin) => {
|
|
32
|
+
if (
|
|
33
|
+
defaultInspectorOrigins.includes(origin) ||
|
|
34
|
+
(origin.startsWith("https://") && origin.endsWith("rivet-gg.vercel.app"))
|
|
35
|
+
) {
|
|
36
|
+
return origin;
|
|
37
|
+
} else {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
allowMethods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
|
|
42
|
+
allowHeaders: [
|
|
43
|
+
"Content-Type",
|
|
44
|
+
"Authorization",
|
|
45
|
+
HEADER_ACTOR_QUERY,
|
|
46
|
+
"last-event-id",
|
|
47
|
+
],
|
|
48
|
+
maxAge: 3600,
|
|
49
|
+
credentials: true,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const InspectorConfigSchema = z
|
|
53
|
+
.object({
|
|
54
|
+
enabled: z.boolean().optional().default(defaultEnabled),
|
|
55
|
+
/** CORS configuration for the router. Uses Hono's CORS middleware options. */
|
|
56
|
+
cors: z
|
|
57
|
+
.custom<CorsOptions>()
|
|
58
|
+
.optional()
|
|
59
|
+
.default(() => defaultCors),
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Token used to access the Inspector.
|
|
63
|
+
*/
|
|
64
|
+
token: z
|
|
65
|
+
.function()
|
|
66
|
+
.returns(z.string())
|
|
67
|
+
.optional()
|
|
68
|
+
.default(() => defaultTokenFn),
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Default RivetKit server endpoint for Rivet Inspector to connect to. This should be the same endpoint as what you use for your Rivet client to connect to RivetKit.
|
|
72
|
+
*
|
|
73
|
+
* This is a convenience property just for printing out the inspector URL.
|
|
74
|
+
*/
|
|
75
|
+
defaultEndpoint: z.string().optional(),
|
|
76
|
+
})
|
|
77
|
+
.optional()
|
|
78
|
+
.default(() => ({
|
|
79
|
+
enabled: defaultEnabled(),
|
|
80
|
+
token: defaultTokenFn,
|
|
81
|
+
cors: defaultCors,
|
|
82
|
+
}));
|
|
83
|
+
export type InspectorConfig = z.infer<typeof InspectorConfigSchema>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { sValidator } from "@hono/standard-validator";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import invariant from "invariant";
|
|
4
|
+
import type { CreateInput } from "@/manager/driver";
|
|
5
|
+
import { inspectorLogger } from "./log";
|
|
6
|
+
import { type Actor, type Builds, CreateActorSchema } from "./protocol/common";
|
|
7
|
+
|
|
8
|
+
export type ManagerInspectorRouterEnv = {
|
|
9
|
+
Variables: {
|
|
10
|
+
inspector: ManagerInspector;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Create a router for the Manager Inspector.
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export function createManagerInspectorRouter() {
|
|
19
|
+
return new Hono<ManagerInspectorRouterEnv>()
|
|
20
|
+
.get("/ping", (c) => {
|
|
21
|
+
return c.json({ message: "pong" }, 200);
|
|
22
|
+
})
|
|
23
|
+
.get("/actors", async (c) => {
|
|
24
|
+
const limit = Number.parseInt(c.req.query("limit") ?? "") || undefined;
|
|
25
|
+
const cursor = c.req.query("cursor") || undefined;
|
|
26
|
+
|
|
27
|
+
if (!limit || (limit && limit <= 0)) {
|
|
28
|
+
return c.json("Invalid limit", 400);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const actors = await c.var.inspector.accessors.getAllActors({
|
|
33
|
+
limit,
|
|
34
|
+
cursor,
|
|
35
|
+
});
|
|
36
|
+
return c.json(actors, 200);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
inspectorLogger().error("Failed to fetch actors", error);
|
|
39
|
+
return c.json("Failed to fetch actors", 500);
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
.post("/actors", sValidator("json", CreateActorSchema), async (c) => {
|
|
44
|
+
const actor = await c.var.inspector.accessors.createActor(
|
|
45
|
+
c.req.valid("json"),
|
|
46
|
+
);
|
|
47
|
+
return c.json(actor, 201);
|
|
48
|
+
})
|
|
49
|
+
.get("/builds", async (c) => {
|
|
50
|
+
const builds = await c.var.inspector.accessors.getBuilds();
|
|
51
|
+
return c.json(builds, 200);
|
|
52
|
+
})
|
|
53
|
+
.get("/actor/:id", async (c) => {
|
|
54
|
+
const id = c.req.param("id");
|
|
55
|
+
const actor = await c.var.inspector.accessors.getActorById(id);
|
|
56
|
+
if (!actor) {
|
|
57
|
+
return c.json({ error: "Actor not found" }, 404);
|
|
58
|
+
}
|
|
59
|
+
return c.json(actor, 200);
|
|
60
|
+
})
|
|
61
|
+
.get("/bootstrap", async (c) => {
|
|
62
|
+
const actors = await c.var.inspector.accessors.getAllActors({
|
|
63
|
+
limit: 10,
|
|
64
|
+
});
|
|
65
|
+
return c.json({ actors }, 200);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface ManagerInspectorAccessors {
|
|
70
|
+
getAllActors: (param: { cursor?: string; limit: number }) => Promise<Actor[]>;
|
|
71
|
+
getActorById: (id: string) => Promise<Actor | null>;
|
|
72
|
+
getBuilds: () => Promise<Builds>;
|
|
73
|
+
createActor: (input: CreateInput) => Promise<Actor | null>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Provides a unified interface for inspecting actor external and internal state.
|
|
78
|
+
*/
|
|
79
|
+
export class ManagerInspector {
|
|
80
|
+
public readonly accessors: ManagerInspectorAccessors;
|
|
81
|
+
|
|
82
|
+
constructor(accessors: () => ManagerInspectorAccessors) {
|
|
83
|
+
this.accessors = accessors();
|
|
84
|
+
inspectorLogger().debug("Manager Inspector enabled and ready");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { hc } from "hono/client";
|
|
2
|
+
import type { createActorInspectorRouter } from "../actor";
|
|
3
|
+
|
|
4
|
+
type ActorInspectorRouter = ReturnType<typeof createActorInspectorRouter>;
|
|
5
|
+
const client = hc<ActorInspectorRouter>("");
|
|
6
|
+
export type ActorInspectorClient = typeof client;
|
|
7
|
+
|
|
8
|
+
export const createActorInspectorClient = (
|
|
9
|
+
...args: Parameters<typeof hc>
|
|
10
|
+
): ActorInspectorClient => hc<ActorInspectorRouter>(...args);
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import z from "zod/v4";
|
|
2
|
+
import { ActorKeySchema, MAX_ACTOR_KEY_SIZE } from "@/manager/protocol/query";
|
|
3
|
+
|
|
4
|
+
export const ActorId = z.string().brand("ActorId");
|
|
5
|
+
export type ActorId = z.infer<typeof ActorId>;
|
|
6
|
+
|
|
7
|
+
export enum ActorFeature {
|
|
8
|
+
Logs = "logs",
|
|
9
|
+
Config = "config",
|
|
10
|
+
Connections = "connections",
|
|
11
|
+
State = "state",
|
|
12
|
+
Console = "console",
|
|
13
|
+
Runtime = "runtime",
|
|
14
|
+
Metrics = "metrics",
|
|
15
|
+
EventsMonitoring = "events-monitoring",
|
|
16
|
+
Database = "database",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const ActorLogEntry = z.object({
|
|
20
|
+
level: z.string(),
|
|
21
|
+
message: z.string(),
|
|
22
|
+
timestamp: z.string(),
|
|
23
|
+
metadata: z.record(z.string(), z.any()).optional(),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export const ActorSchema = z.object({
|
|
27
|
+
id: ActorId,
|
|
28
|
+
name: z.string(),
|
|
29
|
+
key: z.array(z.string()),
|
|
30
|
+
tags: z.record(z.string(), z.string()).optional(),
|
|
31
|
+
region: z.string().optional(),
|
|
32
|
+
createdAt: z.string().optional(),
|
|
33
|
+
startedAt: z.string().optional(),
|
|
34
|
+
destroyedAt: z.string().optional(),
|
|
35
|
+
features: z.array(z.enum(ActorFeature)).optional(),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export type Actor = z.infer<typeof ActorSchema>;
|
|
39
|
+
export type ActorLogEntry = z.infer<typeof ActorLogEntry>;
|
|
40
|
+
|
|
41
|
+
// MARK: State
|
|
42
|
+
|
|
43
|
+
export const OperationSchema = z.discriminatedUnion("op", [
|
|
44
|
+
z.object({
|
|
45
|
+
op: z.literal("remove"),
|
|
46
|
+
path: z.string(),
|
|
47
|
+
}),
|
|
48
|
+
z.object({
|
|
49
|
+
op: z.literal("add"),
|
|
50
|
+
path: z.string(),
|
|
51
|
+
value: z.unknown(),
|
|
52
|
+
}),
|
|
53
|
+
z.object({
|
|
54
|
+
op: z.literal("replace"),
|
|
55
|
+
path: z.string(),
|
|
56
|
+
value: z.unknown(),
|
|
57
|
+
}),
|
|
58
|
+
z.object({
|
|
59
|
+
op: z.literal("move"),
|
|
60
|
+
path: z.string(),
|
|
61
|
+
from: z.string(),
|
|
62
|
+
}),
|
|
63
|
+
z.object({
|
|
64
|
+
op: z.literal("copy"),
|
|
65
|
+
path: z.string(),
|
|
66
|
+
from: z.string(),
|
|
67
|
+
}),
|
|
68
|
+
z.object({
|
|
69
|
+
op: z.literal("test"),
|
|
70
|
+
path: z.string(),
|
|
71
|
+
value: z.unknown(),
|
|
72
|
+
}),
|
|
73
|
+
]);
|
|
74
|
+
export type Operation = z.infer<typeof OperationSchema>;
|
|
75
|
+
|
|
76
|
+
export const PatchSchema = z.array(OperationSchema);
|
|
77
|
+
export type Patch = z.infer<typeof PatchSchema>;
|
|
78
|
+
|
|
79
|
+
// MARK: Connections
|
|
80
|
+
|
|
81
|
+
export const ConnectionSchema = z.object({
|
|
82
|
+
params: z.record(z.string(), z.any()).optional(),
|
|
83
|
+
id: z.string(),
|
|
84
|
+
stateEnabled: z.boolean().optional(),
|
|
85
|
+
state: z.any().optional(),
|
|
86
|
+
auth: z.record(z.string(), z.any()).optional(),
|
|
87
|
+
});
|
|
88
|
+
export type Connection = z.infer<typeof ConnectionSchema>;
|
|
89
|
+
|
|
90
|
+
// MARK: Realtime Events
|
|
91
|
+
|
|
92
|
+
export const RealtimeEventSchema = z.discriminatedUnion("type", [
|
|
93
|
+
z.object({
|
|
94
|
+
type: z.literal("action"),
|
|
95
|
+
name: z.string(),
|
|
96
|
+
args: z.array(z.any()),
|
|
97
|
+
connId: z.string(),
|
|
98
|
+
}),
|
|
99
|
+
z.object({
|
|
100
|
+
type: z.literal("broadcast"),
|
|
101
|
+
eventName: z.string(),
|
|
102
|
+
args: z.array(z.any()),
|
|
103
|
+
}),
|
|
104
|
+
z.object({
|
|
105
|
+
type: z.literal("subscribe"),
|
|
106
|
+
eventName: z.string(),
|
|
107
|
+
connId: z.string(),
|
|
108
|
+
}),
|
|
109
|
+
z.object({
|
|
110
|
+
type: z.literal("unsubscribe"),
|
|
111
|
+
eventName: z.string(),
|
|
112
|
+
connId: z.string(),
|
|
113
|
+
}),
|
|
114
|
+
z.object({
|
|
115
|
+
type: z.literal("event"),
|
|
116
|
+
eventName: z.string(),
|
|
117
|
+
args: z.array(z.any()),
|
|
118
|
+
connId: z.string(),
|
|
119
|
+
}),
|
|
120
|
+
]);
|
|
121
|
+
export type RealtimeEvent = z.infer<typeof RealtimeEventSchema>;
|
|
122
|
+
export const RecordedRealtimeEventSchema = RealtimeEventSchema.and(
|
|
123
|
+
z.object({
|
|
124
|
+
id: z.string(),
|
|
125
|
+
timestamp: z.number(),
|
|
126
|
+
}),
|
|
127
|
+
);
|
|
128
|
+
export type RecordedRealtimeEvent = z.infer<typeof RecordedRealtimeEventSchema>;
|
|
129
|
+
|
|
130
|
+
// MARK: Database
|
|
131
|
+
|
|
132
|
+
export const DatabaseQuerySchema = z.object({
|
|
133
|
+
sql: z.string(),
|
|
134
|
+
args: z.array(z.string().or(z.number())),
|
|
135
|
+
});
|
|
136
|
+
export type DatabaseQuery = z.infer<typeof DatabaseQuerySchema>;
|
|
137
|
+
|
|
138
|
+
export const TableSchema = z.object({
|
|
139
|
+
schema: z.string(),
|
|
140
|
+
name: z.string(),
|
|
141
|
+
type: z.enum(["table", "view"]),
|
|
142
|
+
});
|
|
143
|
+
export type Table = z.infer<typeof TableSchema>;
|
|
144
|
+
|
|
145
|
+
export const TablesSchema = z.array(TableSchema);
|
|
146
|
+
export type Tables = z.infer<typeof TablesSchema>;
|
|
147
|
+
|
|
148
|
+
export const ColumnSchema = z.object({
|
|
149
|
+
cid: z.number(),
|
|
150
|
+
name: z.string(),
|
|
151
|
+
type: z
|
|
152
|
+
.string()
|
|
153
|
+
.toLowerCase()
|
|
154
|
+
.transform((val) => {
|
|
155
|
+
return z
|
|
156
|
+
.enum(["integer", "text", "real", "blob", "numeric", "serial"])
|
|
157
|
+
.parse(val);
|
|
158
|
+
}),
|
|
159
|
+
notnull: z.coerce.boolean(),
|
|
160
|
+
dflt_value: z.string().nullable(),
|
|
161
|
+
pk: z.coerce.boolean().nullable(),
|
|
162
|
+
});
|
|
163
|
+
export type Column = z.infer<typeof ColumnSchema>;
|
|
164
|
+
|
|
165
|
+
export const ColumnsSchema = z.array(ColumnSchema);
|
|
166
|
+
export type Columns = z.infer<typeof ColumnsSchema>;
|
|
167
|
+
|
|
168
|
+
export const ForeignKeySchema = z.object({
|
|
169
|
+
id: z.number(),
|
|
170
|
+
table: z.string(),
|
|
171
|
+
from: z.string(),
|
|
172
|
+
to: z.string(),
|
|
173
|
+
});
|
|
174
|
+
export type ForeignKey = z.infer<typeof ForeignKeySchema>;
|
|
175
|
+
|
|
176
|
+
export const ForeignKeysSchema = z.array(ForeignKeySchema);
|
|
177
|
+
export type ForeignKeys = z.infer<typeof ForeignKeysSchema>;
|
|
178
|
+
|
|
179
|
+
// MARK: Builds
|
|
180
|
+
|
|
181
|
+
export const BuildSchema = z.object({
|
|
182
|
+
name: z.string(),
|
|
183
|
+
createdAt: z.string().optional(),
|
|
184
|
+
tags: z.record(z.string(), z.string()).optional(),
|
|
185
|
+
});
|
|
186
|
+
export type Build = z.infer<typeof BuildSchema>;
|
|
187
|
+
export const BuildsSchema = z.array(BuildSchema);
|
|
188
|
+
export type Builds = z.infer<typeof BuildsSchema>;
|
|
189
|
+
|
|
190
|
+
export const CreateActorSchema = z.object({
|
|
191
|
+
name: z.string(),
|
|
192
|
+
// FIXME: Replace with ActorKeySchema when ready
|
|
193
|
+
key: z.array(z.string().max(MAX_ACTOR_KEY_SIZE)),
|
|
194
|
+
input: z.any(),
|
|
195
|
+
});
|
|
196
|
+
export type CreateActor = z.infer<typeof CreateActorSchema>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { hc } from "hono/client";
|
|
2
|
+
import type { createManagerInspectorRouter } from "../manager";
|
|
3
|
+
|
|
4
|
+
type ManagerInspectorRouter = ReturnType<typeof createManagerInspectorRouter>;
|
|
5
|
+
const client = hc<ManagerInspectorRouter>("");
|
|
6
|
+
export type ManagerInspectorClient = typeof client;
|
|
7
|
+
|
|
8
|
+
export const createManagerInspectorClient = (
|
|
9
|
+
...args: Parameters<typeof hc>
|
|
10
|
+
): ManagerInspectorClient => hc<ManagerInspectorRouter>(...args);
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { createMiddleware } from "hono/factory";
|
|
3
|
+
import type { RunConfig } from "@/mod";
|
|
4
|
+
import type { RunConfigInput } from "@/registry/run-config";
|
|
5
|
+
import { inspectorLogger } from "./log";
|
|
6
|
+
|
|
7
|
+
export function compareSecrets(providedSecret: string, validSecret: string) {
|
|
8
|
+
// Early length check to avoid unnecessary processing
|
|
9
|
+
if (providedSecret.length !== validSecret.length) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const encoder = new TextEncoder();
|
|
14
|
+
|
|
15
|
+
const a = encoder.encode(providedSecret);
|
|
16
|
+
const b = encoder.encode(validSecret);
|
|
17
|
+
|
|
18
|
+
if (a.byteLength !== b.byteLength) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Perform timing-safe comparison
|
|
23
|
+
if (!crypto.timingSafeEqual(a, b)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const secureInspector = (runConfig: RunConfig) =>
|
|
30
|
+
createMiddleware(async (c, next) => {
|
|
31
|
+
if (!runConfig.inspector.enabled) {
|
|
32
|
+
return c.text("Inspector is not enabled", 503);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const userToken = c.req.header("Authorization")?.replace("Bearer ", "");
|
|
36
|
+
if (!userToken) {
|
|
37
|
+
return c.text("Unauthorized", 401);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const inspectorToken = runConfig.inspector.token?.();
|
|
41
|
+
if (!inspectorToken) {
|
|
42
|
+
return c.text("Unauthorized", 401);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const isValid = compareSecrets(userToken, inspectorToken);
|
|
46
|
+
|
|
47
|
+
if (!isValid) {
|
|
48
|
+
return c.text("Unauthorized", 401);
|
|
49
|
+
}
|
|
50
|
+
await next();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export function getInspectorUrl(runConfig: RunConfigInput | undefined) {
|
|
54
|
+
if (!runConfig?.inspector?.enabled) {
|
|
55
|
+
return "disabled";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const accessToken = runConfig?.inspector?.token?.();
|
|
59
|
+
|
|
60
|
+
if (!accessToken) {
|
|
61
|
+
inspectorLogger().warn(
|
|
62
|
+
"Inspector Token is not set, but Inspector is enabled. Please set it in the run configuration `inspector.token` or via `RIVETKIT_INSPECTOR_TOKEN` environment variable. Inspector will not be accessible.",
|
|
63
|
+
);
|
|
64
|
+
return "disabled";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const url = new URL("https://studio.rivet.gg");
|
|
68
|
+
|
|
69
|
+
url.searchParams.set("t", accessToken);
|
|
70
|
+
|
|
71
|
+
if (runConfig?.inspector?.defaultEndpoint) {
|
|
72
|
+
url.searchParams.set("u", runConfig.inspector.defaultEndpoint);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return url.href;
|
|
76
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { Context as HonoContext } from "hono";
|
|
2
|
+
import type { AuthIntent } from "@/actor/config";
|
|
3
|
+
import type { AnyActorDefinition } from "@/actor/definition";
|
|
4
|
+
import * as errors from "@/actor/errors";
|
|
5
|
+
import type { RegistryConfig } from "@/registry/config";
|
|
6
|
+
import { stringifyError } from "@/utils";
|
|
7
|
+
import type { ManagerDriver } from "./driver";
|
|
8
|
+
import { logger } from "./log";
|
|
9
|
+
import type { ActorQuery } from "./protocol/query";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get authentication intents from a actor query
|
|
13
|
+
*/
|
|
14
|
+
export function getIntentsFromQuery(query: ActorQuery): Set<AuthIntent> {
|
|
15
|
+
const intents = new Set<AuthIntent>();
|
|
16
|
+
|
|
17
|
+
if ("getForId" in query) {
|
|
18
|
+
intents.add("get");
|
|
19
|
+
} else if ("getForKey" in query) {
|
|
20
|
+
intents.add("get");
|
|
21
|
+
} else if ("getOrCreateForKey" in query) {
|
|
22
|
+
intents.add("get");
|
|
23
|
+
intents.add("create");
|
|
24
|
+
} else if ("create" in query) {
|
|
25
|
+
intents.add("create");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return intents;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get actor name from a actor query
|
|
33
|
+
*/
|
|
34
|
+
export async function getActorNameFromQuery(
|
|
35
|
+
c: HonoContext,
|
|
36
|
+
driver: ManagerDriver,
|
|
37
|
+
query: ActorQuery,
|
|
38
|
+
): Promise<string> {
|
|
39
|
+
if ("getForId" in query) {
|
|
40
|
+
// TODO: This will have a duplicate call to getForId between this and queryActor
|
|
41
|
+
const output = await driver.getForId({
|
|
42
|
+
c,
|
|
43
|
+
name: query.getForId.name,
|
|
44
|
+
actorId: query.getForId.actorId,
|
|
45
|
+
});
|
|
46
|
+
if (!output) throw new errors.ActorNotFound(query.getForId.actorId);
|
|
47
|
+
return output.name;
|
|
48
|
+
} else if ("getForKey" in query) {
|
|
49
|
+
return query.getForKey.name;
|
|
50
|
+
} else if ("getOrCreateForKey" in query) {
|
|
51
|
+
return query.getOrCreateForKey.name;
|
|
52
|
+
} else if ("create" in query) {
|
|
53
|
+
return query.create.name;
|
|
54
|
+
} else {
|
|
55
|
+
throw new errors.InvalidRequest("Invalid query format");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Authenticate a request using the actor's onAuth function
|
|
61
|
+
*/
|
|
62
|
+
export async function authenticateRequest(
|
|
63
|
+
c: HonoContext,
|
|
64
|
+
actorDefinition: AnyActorDefinition,
|
|
65
|
+
intents: Set<AuthIntent>,
|
|
66
|
+
params: unknown,
|
|
67
|
+
): Promise<unknown> {
|
|
68
|
+
if (!("onAuth" in actorDefinition.config)) {
|
|
69
|
+
throw new errors.Forbidden(
|
|
70
|
+
"Actor requires authentication but no onAuth handler is defined (https://rivet.gg/docs/actors/authentication/). Provide an empty handler to disable auth: `onAuth: () => {}`",
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const dataOrPromise = actorDefinition.config.onAuth(
|
|
76
|
+
{
|
|
77
|
+
request: c.req.raw,
|
|
78
|
+
intents,
|
|
79
|
+
},
|
|
80
|
+
params,
|
|
81
|
+
);
|
|
82
|
+
if (dataOrPromise instanceof Promise) {
|
|
83
|
+
return await dataOrPromise;
|
|
84
|
+
} else {
|
|
85
|
+
return dataOrPromise;
|
|
86
|
+
}
|
|
87
|
+
} catch (error) {
|
|
88
|
+
logger().info("authentication error", { error: stringifyError(error) });
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Simplified authentication for endpoints that combines all auth steps
|
|
95
|
+
*/
|
|
96
|
+
export async function authenticateEndpoint(
|
|
97
|
+
c: HonoContext,
|
|
98
|
+
driver: ManagerDriver,
|
|
99
|
+
registryConfig: RegistryConfig,
|
|
100
|
+
query: ActorQuery,
|
|
101
|
+
additionalIntents: AuthIntent[],
|
|
102
|
+
params: unknown,
|
|
103
|
+
): Promise<unknown> {
|
|
104
|
+
// Get base intents from query
|
|
105
|
+
const intents = getIntentsFromQuery(query);
|
|
106
|
+
|
|
107
|
+
// Add endpoint-specific intents
|
|
108
|
+
for (const intent of additionalIntents) {
|
|
109
|
+
intents.add(intent);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Get actor definition
|
|
113
|
+
const actorName = await getActorNameFromQuery(c, driver, query);
|
|
114
|
+
const actorDefinition = registryConfig.use[actorName];
|
|
115
|
+
if (!actorDefinition) {
|
|
116
|
+
throw new errors.ActorNotFound(actorName);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Authenticate
|
|
120
|
+
return await authenticateRequest(c, actorDefinition, intents, params);
|
|
121
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Env, Hono, Context as HonoContext } from "hono";
|
|
2
|
+
import type { ActorKey, Encoding } from "@/actor/mod";
|
|
3
|
+
import type { ManagerInspector } from "@/inspector/manager";
|
|
4
|
+
import type { RunConfig } from "@/mod";
|
|
5
|
+
import type { RegistryConfig } from "@/registry/config";
|
|
6
|
+
|
|
7
|
+
export type ManagerDriverBuilder = (
|
|
8
|
+
registryConfig: RegistryConfig,
|
|
9
|
+
runConfig: RunConfig,
|
|
10
|
+
) => ManagerDriver;
|
|
11
|
+
|
|
12
|
+
export interface ManagerDriver {
|
|
13
|
+
getForId(input: GetForIdInput): Promise<ActorOutput | undefined>;
|
|
14
|
+
getWithKey(input: GetWithKeyInput): Promise<ActorOutput | undefined>;
|
|
15
|
+
getOrCreateWithKey(input: GetOrCreateWithKeyInput): Promise<ActorOutput>;
|
|
16
|
+
createActor(input: CreateInput): Promise<ActorOutput>;
|
|
17
|
+
|
|
18
|
+
sendRequest(actorId: string, actorRequest: Request): Promise<Response>;
|
|
19
|
+
openWebSocket(
|
|
20
|
+
path: string,
|
|
21
|
+
actorId: string,
|
|
22
|
+
encoding: Encoding,
|
|
23
|
+
params: unknown,
|
|
24
|
+
): Promise<WebSocket>;
|
|
25
|
+
proxyRequest(
|
|
26
|
+
c: HonoContext,
|
|
27
|
+
actorRequest: Request,
|
|
28
|
+
actorId: string,
|
|
29
|
+
): Promise<Response>;
|
|
30
|
+
proxyWebSocket(
|
|
31
|
+
c: HonoContext,
|
|
32
|
+
path: string,
|
|
33
|
+
actorId: string,
|
|
34
|
+
encoding: Encoding,
|
|
35
|
+
params: unknown,
|
|
36
|
+
authData: unknown,
|
|
37
|
+
): Promise<Response>;
|
|
38
|
+
|
|
39
|
+
extraStartupLog?: () => Record<string, unknown>;
|
|
40
|
+
|
|
41
|
+
modifyManagerRouter?: (registryConfig: RegistryConfig, router: Hono) => void;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
readonly inspector?: ManagerInspector;
|
|
47
|
+
}
|
|
48
|
+
export interface GetForIdInput<E extends Env = any> {
|
|
49
|
+
c?: HonoContext | undefined;
|
|
50
|
+
name: string;
|
|
51
|
+
actorId: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface GetWithKeyInput<E extends Env = any> {
|
|
55
|
+
c?: HonoContext | undefined;
|
|
56
|
+
name: string;
|
|
57
|
+
key: ActorKey;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface GetOrCreateWithKeyInput<E extends Env = any> {
|
|
61
|
+
c?: HonoContext | undefined;
|
|
62
|
+
name: string;
|
|
63
|
+
key: ActorKey;
|
|
64
|
+
input?: unknown;
|
|
65
|
+
region?: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface CreateInput<E extends Env = any> {
|
|
69
|
+
c?: HonoContext | undefined;
|
|
70
|
+
name: string;
|
|
71
|
+
key: ActorKey;
|
|
72
|
+
input?: unknown;
|
|
73
|
+
region?: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface ActorOutput {
|
|
77
|
+
actorId: string;
|
|
78
|
+
name: string;
|
|
79
|
+
key: ActorKey;
|
|
80
|
+
}
|