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,268 @@
1
+ import * as cbor from "cbor-x";
2
+ import invariant from "invariant";
3
+ import type { AnyActorDefinition } from "@/actor/definition";
4
+ import type { Encoding } from "@/actor/protocol/serde";
5
+ import { assertUnreachable } from "@/actor/utils";
6
+ import { deconstructError } from "@/common/utils";
7
+ import { importWebSocket } from "@/common/websocket";
8
+ import {
9
+ HEADER_CONN_PARAMS,
10
+ HEADER_ENCODING,
11
+ type ManagerDriver,
12
+ } from "@/driver-helpers/mod";
13
+ import type { ActorQuery } from "@/manager/protocol/query";
14
+ import type * as protocol from "@/schemas/client-protocol/mod";
15
+ import {
16
+ HTTP_ACTION_REQUEST_VERSIONED,
17
+ HTTP_ACTION_RESPONSE_VERSIONED,
18
+ } from "@/schemas/client-protocol/versioned";
19
+ import { bufferToArrayBuffer } from "@/utils";
20
+ import type { ActorDefinitionActions } from "./actor-common";
21
+ import { type ActorConn, ActorConnRaw } from "./actor-conn";
22
+ import { queryActor } from "./actor-query";
23
+ import { type ClientRaw, CREATE_ACTOR_CONN_PROXY } from "./client";
24
+ import { ActorError } from "./errors";
25
+ import { logger } from "./log";
26
+ import { rawHttpFetch, rawWebSocket } from "./raw-utils";
27
+ import { sendHttpRequest } from "./utils";
28
+
29
+ /**
30
+ * Provides underlying functions for stateless {@link ActorHandle} for action calls.
31
+ * Similar to ActorConnRaw but doesn't maintain a connection.
32
+ *
33
+ * @see {@link ActorHandle}
34
+ */
35
+ export class ActorHandleRaw {
36
+ #client: ClientRaw;
37
+ #driver: ManagerDriver;
38
+ #encoding: Encoding;
39
+ #actorQuery: ActorQuery;
40
+ #params: unknown;
41
+
42
+ /**
43
+ * Do not call this directly.
44
+ *
45
+ * Creates an instance of ActorHandleRaw.
46
+ *
47
+ * @protected
48
+ */
49
+ public constructor(
50
+ client: any,
51
+ driver: ManagerDriver,
52
+ params: unknown,
53
+ encoding: Encoding,
54
+ actorQuery: ActorQuery,
55
+ ) {
56
+ this.#client = client;
57
+ this.#driver = driver;
58
+ this.#encoding = encoding;
59
+ this.#actorQuery = actorQuery;
60
+ this.#params = params;
61
+ }
62
+
63
+ /**
64
+ * Call a raw action. This method sends an HTTP request to invoke the named action.
65
+ *
66
+ * @see {@link ActorHandle}
67
+ * @template Args - The type of arguments to pass to the action function.
68
+ * @template Response - The type of the response returned by the action function.
69
+ */
70
+ async action<
71
+ Args extends Array<unknown> = unknown[],
72
+ Response = unknown,
73
+ >(opts: {
74
+ name: string;
75
+ args: Args;
76
+ signal?: AbortSignal;
77
+ }): Promise<Response> {
78
+ // return await this.#driver.action<Args, Response>(
79
+ // undefined,
80
+ // this.#actorQuery,
81
+ // this.#encodingKind,
82
+ // this.#params,
83
+ // opts.name,
84
+ // opts.args,
85
+ // { signal: opts.signal },
86
+ // );
87
+ try {
88
+ // Get the actor ID
89
+ const { actorId } = await queryActor(
90
+ undefined,
91
+ this.#actorQuery,
92
+ this.#driver,
93
+ );
94
+ logger().debug({ msg: "found actor for action", actorId });
95
+ invariant(actorId, "Missing actor ID");
96
+
97
+ // Invoke the action
98
+ logger().debug({
99
+ msg: "handling action",
100
+ name: opts.name,
101
+ encoding: this.#encoding,
102
+ });
103
+ const responseData = await sendHttpRequest<
104
+ protocol.HttpActionRequest,
105
+ protocol.HttpActionResponse
106
+ >({
107
+ url: `http://actor/action/${encodeURIComponent(opts.name)}`,
108
+ method: "POST",
109
+ headers: {
110
+ [HEADER_ENCODING]: this.#encoding,
111
+ ...(this.#params !== undefined
112
+ ? { [HEADER_CONN_PARAMS]: JSON.stringify(this.#params) }
113
+ : {}),
114
+ },
115
+ body: {
116
+ args: bufferToArrayBuffer(cbor.encode(opts.args)),
117
+ } satisfies protocol.HttpActionRequest,
118
+ encoding: this.#encoding,
119
+ customFetch: this.#driver.sendRequest.bind(this.#driver, actorId),
120
+ signal: opts?.signal,
121
+ requestVersionedDataHandler: HTTP_ACTION_REQUEST_VERSIONED,
122
+ responseVersionedDataHandler: HTTP_ACTION_RESPONSE_VERSIONED,
123
+ });
124
+
125
+ return cbor.decode(new Uint8Array(responseData.output));
126
+ } catch (err) {
127
+ // Standardize to ClientActorError instead of the native backend error
128
+ const { group, code, message, metadata } = deconstructError(
129
+ err,
130
+ logger(),
131
+ {},
132
+ true,
133
+ );
134
+ throw new ActorError(group, code, message, metadata);
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Establishes a persistent connection to the actor.
140
+ *
141
+ * @template AD The actor class that this connection is for.
142
+ * @returns {ActorConn<AD>} A connection to the actor.
143
+ */
144
+ connect(): ActorConn<AnyActorDefinition> {
145
+ logger().debug({
146
+ msg: "establishing connection from handle",
147
+ query: this.#actorQuery,
148
+ });
149
+
150
+ const conn = new ActorConnRaw(
151
+ this.#client,
152
+ this.#driver,
153
+ this.#params,
154
+ this.#encoding,
155
+ this.#actorQuery,
156
+ );
157
+
158
+ return this.#client[CREATE_ACTOR_CONN_PROXY](
159
+ conn,
160
+ ) as ActorConn<AnyActorDefinition>;
161
+ }
162
+
163
+ /**
164
+ * Makes a raw HTTP request to the actor.
165
+ *
166
+ * @param input - The URL, path, or Request object
167
+ * @param init - Standard fetch RequestInit options
168
+ * @returns Promise<Response> - The raw HTTP response
169
+ */
170
+ async fetch(
171
+ input: string | URL | Request,
172
+ init?: RequestInit,
173
+ ): Promise<Response> {
174
+ return rawHttpFetch(
175
+ this.#driver,
176
+ this.#actorQuery,
177
+ this.#params,
178
+ input,
179
+ init,
180
+ );
181
+ }
182
+
183
+ /**
184
+ * Creates a raw WebSocket connection to the actor.
185
+ *
186
+ * @param path - The path for the WebSocket connection (e.g., "stream")
187
+ * @param protocols - Optional WebSocket subprotocols
188
+ * @returns WebSocket - A raw WebSocket connection
189
+ */
190
+ async websocket(
191
+ path?: string,
192
+ protocols?: string | string[],
193
+ ): Promise<WebSocket> {
194
+ return rawWebSocket(
195
+ this.#driver,
196
+ this.#actorQuery,
197
+ this.#params,
198
+ path,
199
+ protocols,
200
+ );
201
+ }
202
+
203
+ /**
204
+ * Resolves the actor to get its unique actor ID
205
+ *
206
+ * @returns {Promise<string>} - A promise that resolves to the actor's ID
207
+ */
208
+ async resolve({ signal }: { signal?: AbortSignal } = {}): Promise<string> {
209
+ if (
210
+ "getForKey" in this.#actorQuery ||
211
+ "getOrCreateForKey" in this.#actorQuery
212
+ ) {
213
+ // TODO:
214
+ let name: string;
215
+ if ("getForKey" in this.#actorQuery) {
216
+ name = this.#actorQuery.getForKey.name;
217
+ } else if ("getOrCreateForKey" in this.#actorQuery) {
218
+ name = this.#actorQuery.getOrCreateForKey.name;
219
+ } else {
220
+ assertUnreachable(this.#actorQuery);
221
+ }
222
+
223
+ const { actorId } = await queryActor(
224
+ undefined,
225
+ this.#actorQuery,
226
+ this.#driver,
227
+ );
228
+
229
+ this.#actorQuery = { getForId: { actorId, name } };
230
+
231
+ return actorId;
232
+ } else if ("getForId" in this.#actorQuery) {
233
+ // SKip since it's already resolved
234
+ return this.#actorQuery.getForId.actorId;
235
+ } else if ("create" in this.#actorQuery) {
236
+ // Cannot create a handle with this query
237
+ invariant(false, "actorQuery cannot be create");
238
+ } else {
239
+ assertUnreachable(this.#actorQuery);
240
+ }
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Stateless handle to a actor. Allows calling actor's remote procedure calls with inferred types
246
+ * without establishing a persistent connection.
247
+ *
248
+ * @example
249
+ * ```
250
+ * const room = client.get<ChatRoom>(...etc...);
251
+ * // This calls the action named `sendMessage` on the `ChatRoom` actor without a connection.
252
+ * await room.sendMessage('Hello, world!');
253
+ * ```
254
+ *
255
+ * Private methods (e.g. those starting with `_`) are automatically excluded.
256
+ *
257
+ * @template AD The actor class that this handle is for.
258
+ * @see {@link ActorHandleRaw}
259
+ */
260
+ export type ActorHandle<AD extends AnyActorDefinition> = Omit<
261
+ ActorHandleRaw,
262
+ "connect"
263
+ > & {
264
+ // Add typed version of ActorConn (instead of using AnyActorDefinition)
265
+ connect(): ActorConn<AD>;
266
+ // Resolve method returns the actor ID
267
+ resolve(): Promise<string>;
268
+ } & ActorDefinitionActions<AD>;
@@ -0,0 +1,65 @@
1
+ import type { Context as HonoContext } from "hono";
2
+ import * as errors from "@/actor/errors";
3
+ import type { ManagerDriver } from "@/driver-helpers/mod";
4
+ import type { ActorQuery } from "@/manager/protocol/query";
5
+ import { logger } from "./log";
6
+
7
+ /**
8
+ * Query the manager driver to get or create a actor based on the provided query
9
+ */
10
+ export async function queryActor(
11
+ c: HonoContext | undefined,
12
+ query: ActorQuery,
13
+ managerDriver: ManagerDriver,
14
+ ): Promise<{ actorId: string }> {
15
+ logger().debug({ msg: "querying actor", query: JSON.stringify(query) });
16
+ let actorOutput: { actorId: string };
17
+ if ("getForId" in query) {
18
+ const output = await managerDriver.getForId({
19
+ c,
20
+ name: query.getForId.name,
21
+ actorId: query.getForId.actorId,
22
+ });
23
+ if (!output) throw new errors.ActorNotFound(query.getForId.actorId);
24
+ actorOutput = output;
25
+ } else if ("getForKey" in query) {
26
+ const existingActor = await managerDriver.getWithKey({
27
+ c,
28
+ name: query.getForKey.name,
29
+ key: query.getForKey.key,
30
+ });
31
+ if (!existingActor) {
32
+ throw new errors.ActorNotFound(
33
+ `${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`,
34
+ );
35
+ }
36
+ actorOutput = existingActor;
37
+ } else if ("getOrCreateForKey" in query) {
38
+ const getOrCreateOutput = await managerDriver.getOrCreateWithKey({
39
+ c,
40
+ name: query.getOrCreateForKey.name,
41
+ key: query.getOrCreateForKey.key,
42
+ input: query.getOrCreateForKey.input,
43
+ region: query.getOrCreateForKey.region,
44
+ });
45
+ actorOutput = {
46
+ actorId: getOrCreateOutput.actorId,
47
+ };
48
+ } else if ("create" in query) {
49
+ const createOutput = await managerDriver.createActor({
50
+ c,
51
+ name: query.create.name,
52
+ key: query.create.key,
53
+ input: query.create.input,
54
+ region: query.create.region,
55
+ });
56
+ actorOutput = {
57
+ actorId: createOutput.actorId,
58
+ };
59
+ } else {
60
+ throw new errors.InvalidRequest("Invalid query format");
61
+ }
62
+
63
+ logger().debug({ msg: "actor query result", actorId: actorOutput.actorId });
64
+ return { actorId: actorOutput.actorId };
65
+ }