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.
Files changed (246) hide show
  1. package/README.md +3 -5
  2. package/dist/schemas/actor-persist/v1.ts +225 -0
  3. package/dist/schemas/client-protocol/v1.ts +435 -0
  4. package/dist/schemas/file-system-driver/v1.ts +102 -0
  5. package/dist/tsup/actor/errors.cjs +77 -0
  6. package/dist/tsup/actor/errors.cjs.map +1 -0
  7. package/dist/tsup/actor/errors.d.cts +156 -0
  8. package/dist/tsup/actor/errors.d.ts +156 -0
  9. package/dist/tsup/actor/errors.js +77 -0
  10. package/dist/tsup/actor/errors.js.map +1 -0
  11. package/dist/tsup/chunk-3F2YSRJL.js +117 -0
  12. package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
  13. package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
  14. package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
  15. package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
  16. package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
  17. package/dist/tsup/chunk-6LJT3QRL.cjs +539 -0
  18. package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
  19. package/dist/tsup/chunk-GICQ3YCU.cjs +1792 -0
  20. package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
  21. package/dist/tsup/chunk-H26RP6GD.js +251 -0
  22. package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
  23. package/dist/tsup/chunk-HI3HWJRC.js +20 -0
  24. package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
  25. package/dist/tsup/chunk-HLLF4B4Q.js +1792 -0
  26. package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
  27. package/dist/tsup/chunk-IH6CKNDW.cjs +117 -0
  28. package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
  29. package/dist/tsup/chunk-LV2S3OU3.js +250 -0
  30. package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
  31. package/dist/tsup/chunk-LWNKVZG5.cjs +251 -0
  32. package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
  33. package/dist/tsup/chunk-NFU2BBT5.js +374 -0
  34. package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
  35. package/dist/tsup/chunk-PQY7KKTL.js +539 -0
  36. package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
  37. package/dist/tsup/chunk-QK72M5JB.js +45 -0
  38. package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
  39. package/dist/tsup/chunk-QNNXFOQV.cjs +45 -0
  40. package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
  41. package/dist/tsup/chunk-SBHHJ6QS.cjs +374 -0
  42. package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
  43. package/dist/tsup/chunk-TQ62L3X7.js +325 -0
  44. package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
  45. package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
  46. package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
  47. package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
  48. package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
  49. package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
  50. package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
  51. package/dist/tsup/client/mod.cjs +32 -0
  52. package/dist/tsup/client/mod.cjs.map +1 -0
  53. package/dist/tsup/client/mod.d.cts +20 -0
  54. package/dist/tsup/client/mod.d.ts +20 -0
  55. package/dist/tsup/client/mod.js +32 -0
  56. package/dist/tsup/client/mod.js.map +1 -0
  57. package/dist/tsup/common/log.cjs +21 -0
  58. package/dist/tsup/common/log.cjs.map +1 -0
  59. package/dist/tsup/common/log.d.cts +26 -0
  60. package/dist/tsup/common/log.d.ts +26 -0
  61. package/dist/tsup/common/log.js +21 -0
  62. package/dist/tsup/common/log.js.map +1 -0
  63. package/dist/tsup/common/websocket.cjs +10 -0
  64. package/dist/tsup/common/websocket.cjs.map +1 -0
  65. package/dist/tsup/common/websocket.d.cts +3 -0
  66. package/dist/tsup/common/websocket.d.ts +3 -0
  67. package/dist/tsup/common/websocket.js +10 -0
  68. package/dist/tsup/common/websocket.js.map +1 -0
  69. package/dist/tsup/common-CXCe7s6i.d.cts +218 -0
  70. package/dist/tsup/common-CXCe7s6i.d.ts +218 -0
  71. package/dist/tsup/connection-BI-6UIBJ.d.ts +2087 -0
  72. package/dist/tsup/connection-Dyd4NLGW.d.cts +2087 -0
  73. package/dist/tsup/driver-helpers/mod.cjs +30 -0
  74. package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
  75. package/dist/tsup/driver-helpers/mod.d.cts +17 -0
  76. package/dist/tsup/driver-helpers/mod.d.ts +17 -0
  77. package/dist/tsup/driver-helpers/mod.js +30 -0
  78. package/dist/tsup/driver-helpers/mod.js.map +1 -0
  79. package/dist/tsup/driver-test-suite/mod.cjs +3411 -0
  80. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
  81. package/dist/tsup/driver-test-suite/mod.d.cts +63 -0
  82. package/dist/tsup/driver-test-suite/mod.d.ts +63 -0
  83. package/dist/tsup/driver-test-suite/mod.js +3411 -0
  84. package/dist/tsup/driver-test-suite/mod.js.map +1 -0
  85. package/dist/tsup/inspector/mod.cjs +51 -0
  86. package/dist/tsup/inspector/mod.cjs.map +1 -0
  87. package/dist/tsup/inspector/mod.d.cts +408 -0
  88. package/dist/tsup/inspector/mod.d.ts +408 -0
  89. package/dist/tsup/inspector/mod.js +51 -0
  90. package/dist/tsup/inspector/mod.js.map +1 -0
  91. package/dist/tsup/mod.cjs +67 -0
  92. package/dist/tsup/mod.cjs.map +1 -0
  93. package/dist/tsup/mod.d.cts +105 -0
  94. package/dist/tsup/mod.d.ts +105 -0
  95. package/dist/tsup/mod.js +67 -0
  96. package/dist/tsup/mod.js.map +1 -0
  97. package/dist/tsup/router-endpoints-BTe_Rsdn.d.cts +65 -0
  98. package/dist/tsup/router-endpoints-CBSrKHmo.d.ts +65 -0
  99. package/dist/tsup/test/mod.cjs +17 -0
  100. package/dist/tsup/test/mod.cjs.map +1 -0
  101. package/dist/tsup/test/mod.d.cts +26 -0
  102. package/dist/tsup/test/mod.d.ts +26 -0
  103. package/dist/tsup/test/mod.js +17 -0
  104. package/dist/tsup/test/mod.js.map +1 -0
  105. package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
  106. package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
  107. package/dist/tsup/utils.cjs +26 -0
  108. package/dist/tsup/utils.cjs.map +1 -0
  109. package/dist/tsup/utils.d.cts +36 -0
  110. package/dist/tsup/utils.d.ts +36 -0
  111. package/dist/tsup/utils.js +26 -0
  112. package/dist/tsup/utils.js.map +1 -0
  113. package/package.json +208 -5
  114. package/src/actor/action.ts +178 -0
  115. package/src/actor/config.ts +497 -0
  116. package/src/actor/connection.ts +257 -0
  117. package/src/actor/context.ts +168 -0
  118. package/src/actor/database.ts +23 -0
  119. package/src/actor/definition.ts +82 -0
  120. package/src/actor/driver.ts +84 -0
  121. package/src/actor/errors.ts +422 -0
  122. package/src/actor/generic-conn-driver.ts +246 -0
  123. package/src/actor/instance.ts +1844 -0
  124. package/src/actor/keys.test.ts +266 -0
  125. package/src/actor/keys.ts +89 -0
  126. package/src/actor/log.ts +6 -0
  127. package/src/actor/mod.ts +108 -0
  128. package/src/actor/persisted.ts +42 -0
  129. package/src/actor/protocol/old.ts +297 -0
  130. package/src/actor/protocol/serde.ts +131 -0
  131. package/src/actor/router-endpoints.ts +688 -0
  132. package/src/actor/router.ts +265 -0
  133. package/src/actor/schedule.ts +17 -0
  134. package/src/actor/unstable-react.ts +110 -0
  135. package/src/actor/utils.ts +102 -0
  136. package/src/client/actor-common.ts +30 -0
  137. package/src/client/actor-conn.ts +865 -0
  138. package/src/client/actor-handle.ts +268 -0
  139. package/src/client/actor-query.ts +65 -0
  140. package/src/client/client.ts +554 -0
  141. package/src/client/config.ts +44 -0
  142. package/src/client/errors.ts +42 -0
  143. package/src/client/log.ts +5 -0
  144. package/src/client/mod.ts +60 -0
  145. package/src/client/raw-utils.ts +149 -0
  146. package/src/client/test.ts +44 -0
  147. package/src/client/utils.ts +152 -0
  148. package/src/common/eventsource-interface.ts +47 -0
  149. package/src/common/eventsource.ts +80 -0
  150. package/src/common/fake-event-source.ts +267 -0
  151. package/src/common/inline-websocket-adapter2.ts +454 -0
  152. package/src/common/log-levels.ts +27 -0
  153. package/src/common/log.ts +214 -0
  154. package/src/common/logfmt.ts +219 -0
  155. package/src/common/network.ts +2 -0
  156. package/src/common/router.ts +80 -0
  157. package/src/common/utils.ts +336 -0
  158. package/src/common/versioned-data.ts +95 -0
  159. package/src/common/websocket-interface.ts +49 -0
  160. package/src/common/websocket.ts +42 -0
  161. package/src/driver-helpers/mod.ts +22 -0
  162. package/src/driver-helpers/utils.ts +17 -0
  163. package/src/driver-test-suite/log.ts +5 -0
  164. package/src/driver-test-suite/mod.ts +239 -0
  165. package/src/driver-test-suite/tests/action-features.ts +136 -0
  166. package/src/driver-test-suite/tests/actor-conn-state.ts +249 -0
  167. package/src/driver-test-suite/tests/actor-conn.ts +349 -0
  168. package/src/driver-test-suite/tests/actor-driver.ts +25 -0
  169. package/src/driver-test-suite/tests/actor-error-handling.ts +158 -0
  170. package/src/driver-test-suite/tests/actor-handle.ts +292 -0
  171. package/src/driver-test-suite/tests/actor-inline-client.ts +152 -0
  172. package/src/driver-test-suite/tests/actor-inspector.ts +570 -0
  173. package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
  174. package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
  175. package/src/driver-test-suite/tests/actor-schedule.ts +108 -0
  176. package/src/driver-test-suite/tests/actor-sleep.ts +413 -0
  177. package/src/driver-test-suite/tests/actor-state.ts +54 -0
  178. package/src/driver-test-suite/tests/actor-vars.ts +93 -0
  179. package/src/driver-test-suite/tests/manager-driver.ts +367 -0
  180. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
  181. package/src/driver-test-suite/tests/raw-http-request-properties.ts +414 -0
  182. package/src/driver-test-suite/tests/raw-http.ts +347 -0
  183. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
  184. package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
  185. package/src/driver-test-suite/tests/request-access.ts +230 -0
  186. package/src/driver-test-suite/utils.ts +71 -0
  187. package/src/drivers/default.ts +34 -0
  188. package/src/drivers/engine/actor-driver.ts +369 -0
  189. package/src/drivers/engine/config.ts +31 -0
  190. package/src/drivers/engine/kv.ts +3 -0
  191. package/src/drivers/engine/log.ts +5 -0
  192. package/src/drivers/engine/mod.ts +35 -0
  193. package/src/drivers/file-system/actor.ts +91 -0
  194. package/src/drivers/file-system/global-state.ts +686 -0
  195. package/src/drivers/file-system/log.ts +5 -0
  196. package/src/drivers/file-system/manager.ts +329 -0
  197. package/src/drivers/file-system/mod.ts +48 -0
  198. package/src/drivers/file-system/utils.ts +109 -0
  199. package/src/globals.d.ts +6 -0
  200. package/src/inspector/actor.ts +298 -0
  201. package/src/inspector/config.ts +88 -0
  202. package/src/inspector/log.ts +5 -0
  203. package/src/inspector/manager.ts +86 -0
  204. package/src/inspector/mod.ts +2 -0
  205. package/src/inspector/protocol/actor.ts +10 -0
  206. package/src/inspector/protocol/common.ts +196 -0
  207. package/src/inspector/protocol/manager.ts +10 -0
  208. package/src/inspector/protocol/mod.ts +2 -0
  209. package/src/inspector/utils.ts +76 -0
  210. package/src/manager/driver.ts +88 -0
  211. package/src/manager/hono-websocket-adapter.ts +342 -0
  212. package/src/manager/log.ts +5 -0
  213. package/src/manager/mod.ts +2 -0
  214. package/src/manager/protocol/mod.ts +24 -0
  215. package/src/manager/protocol/query.ts +89 -0
  216. package/src/manager/router.ts +412 -0
  217. package/src/manager-api/routes/actors-create.ts +16 -0
  218. package/src/manager-api/routes/actors-delete.ts +4 -0
  219. package/src/manager-api/routes/actors-get-by-id.ts +7 -0
  220. package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
  221. package/src/manager-api/routes/actors-get.ts +7 -0
  222. package/src/manager-api/routes/common.ts +18 -0
  223. package/src/mod.ts +18 -0
  224. package/src/registry/config.ts +32 -0
  225. package/src/registry/log.ts +5 -0
  226. package/src/registry/mod.ts +157 -0
  227. package/src/registry/run-config.ts +52 -0
  228. package/src/registry/serve.ts +52 -0
  229. package/src/remote-manager-driver/actor-http-client.ts +72 -0
  230. package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
  231. package/src/remote-manager-driver/api-endpoints.ts +79 -0
  232. package/src/remote-manager-driver/api-utils.ts +43 -0
  233. package/src/remote-manager-driver/log.ts +5 -0
  234. package/src/remote-manager-driver/mod.ts +274 -0
  235. package/src/remote-manager-driver/ws-proxy.ts +180 -0
  236. package/src/schemas/actor-persist/mod.ts +1 -0
  237. package/src/schemas/actor-persist/versioned.ts +25 -0
  238. package/src/schemas/client-protocol/mod.ts +1 -0
  239. package/src/schemas/client-protocol/versioned.ts +63 -0
  240. package/src/schemas/file-system-driver/mod.ts +1 -0
  241. package/src/schemas/file-system-driver/versioned.ts +28 -0
  242. package/src/serde.ts +90 -0
  243. package/src/test/config.ts +16 -0
  244. package/src/test/log.ts +5 -0
  245. package/src/test/mod.ts +154 -0
  246. 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,4 @@
1
+ import { z } from "zod";
2
+
3
+ export const ActorsDeleteResponseSchema = z.object({});
4
+ export type ActorsDeleteResponse = z.infer<typeof ActorsDeleteResponseSchema>;
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ import { RivetIdSchema } from "./common";
3
+
4
+ export const ActorsGetByIdResponseSchema = z.object({
5
+ actor_id: RivetIdSchema.nullable().optional(),
6
+ });
7
+ export type ActorsGetByIdResponse = z.infer<typeof ActorsGetByIdResponseSchema>;
@@ -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,7 @@
1
+ import { z } from "zod";
2
+ import { ActorSchema } from "./common";
3
+
4
+ export const ActorsGetResponseSchema = z.object({
5
+ actor: ActorSchema,
6
+ });
7
+ export type ActorsGetResponse = z.infer<typeof ActorsGetResponseSchema>;
@@ -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 };
@@ -0,0 +1,5 @@
1
+ import { getLogger } from "@/common/log";
2
+
3
+ export function logger() {
4
+ return getLogger("registry");
5
+ }