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