rivetkit 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -5
- package/dist/schemas/actor-persist/v1.ts +225 -0
- package/dist/schemas/client-protocol/v1.ts +435 -0
- package/dist/schemas/file-system-driver/v1.ts +102 -0
- package/dist/tsup/actor/errors.cjs +77 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +156 -0
- package/dist/tsup/actor/errors.d.ts +156 -0
- package/dist/tsup/actor/errors.js +77 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/chunk-3F2YSRJL.js +117 -0
- package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
- package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
- package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
- package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
- package/dist/tsup/chunk-6LJT3QRL.cjs +539 -0
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
- package/dist/tsup/chunk-GICQ3YCU.cjs +1792 -0
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
- package/dist/tsup/chunk-H26RP6GD.js +251 -0
- package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
- package/dist/tsup/chunk-HI3HWJRC.js +20 -0
- package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
- package/dist/tsup/chunk-HLLF4B4Q.js +1792 -0
- package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
- package/dist/tsup/chunk-IH6CKNDW.cjs +117 -0
- package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
- package/dist/tsup/chunk-LV2S3OU3.js +250 -0
- package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
- package/dist/tsup/chunk-LWNKVZG5.cjs +251 -0
- package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
- package/dist/tsup/chunk-NFU2BBT5.js +374 -0
- package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
- package/dist/tsup/chunk-PQY7KKTL.js +539 -0
- package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
- package/dist/tsup/chunk-QK72M5JB.js +45 -0
- package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
- package/dist/tsup/chunk-QNNXFOQV.cjs +45 -0
- package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
- package/dist/tsup/chunk-SBHHJ6QS.cjs +374 -0
- package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
- package/dist/tsup/chunk-TQ62L3X7.js +325 -0
- package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
- package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
- package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
- package/dist/tsup/client/mod.cjs +32 -0
- package/dist/tsup/client/mod.cjs.map +1 -0
- package/dist/tsup/client/mod.d.cts +20 -0
- package/dist/tsup/client/mod.d.ts +20 -0
- package/dist/tsup/client/mod.js +32 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +21 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +26 -0
- package/dist/tsup/common/log.d.ts +26 -0
- package/dist/tsup/common/log.js +21 -0
- package/dist/tsup/common/log.js.map +1 -0
- package/dist/tsup/common/websocket.cjs +10 -0
- package/dist/tsup/common/websocket.cjs.map +1 -0
- package/dist/tsup/common/websocket.d.cts +3 -0
- package/dist/tsup/common/websocket.d.ts +3 -0
- package/dist/tsup/common/websocket.js +10 -0
- package/dist/tsup/common/websocket.js.map +1 -0
- package/dist/tsup/common-CXCe7s6i.d.cts +218 -0
- package/dist/tsup/common-CXCe7s6i.d.ts +218 -0
- package/dist/tsup/connection-BI-6UIBJ.d.ts +2087 -0
- package/dist/tsup/connection-Dyd4NLGW.d.cts +2087 -0
- package/dist/tsup/driver-helpers/mod.cjs +30 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +17 -0
- package/dist/tsup/driver-helpers/mod.d.ts +17 -0
- package/dist/tsup/driver-helpers/mod.js +30 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +3411 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +63 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +63 -0
- package/dist/tsup/driver-test-suite/mod.js +3411 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +51 -0
- package/dist/tsup/inspector/mod.cjs.map +1 -0
- package/dist/tsup/inspector/mod.d.cts +408 -0
- package/dist/tsup/inspector/mod.d.ts +408 -0
- package/dist/tsup/inspector/mod.js +51 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/mod.cjs +67 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +105 -0
- package/dist/tsup/mod.d.ts +105 -0
- package/dist/tsup/mod.js +67 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/router-endpoints-BTe_Rsdn.d.cts +65 -0
- package/dist/tsup/router-endpoints-CBSrKHmo.d.ts +65 -0
- package/dist/tsup/test/mod.cjs +17 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +26 -0
- package/dist/tsup/test/mod.d.ts +26 -0
- package/dist/tsup/test/mod.js +17 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
- package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
- package/dist/tsup/utils.cjs +26 -0
- package/dist/tsup/utils.cjs.map +1 -0
- package/dist/tsup/utils.d.cts +36 -0
- package/dist/tsup/utils.d.ts +36 -0
- package/dist/tsup/utils.js +26 -0
- package/dist/tsup/utils.js.map +1 -0
- package/package.json +208 -5
- package/src/actor/action.ts +178 -0
- package/src/actor/config.ts +497 -0
- package/src/actor/connection.ts +257 -0
- package/src/actor/context.ts +168 -0
- package/src/actor/database.ts +23 -0
- package/src/actor/definition.ts +82 -0
- package/src/actor/driver.ts +84 -0
- package/src/actor/errors.ts +422 -0
- package/src/actor/generic-conn-driver.ts +246 -0
- package/src/actor/instance.ts +1844 -0
- package/src/actor/keys.test.ts +266 -0
- package/src/actor/keys.ts +89 -0
- package/src/actor/log.ts +6 -0
- package/src/actor/mod.ts +108 -0
- package/src/actor/persisted.ts +42 -0
- package/src/actor/protocol/old.ts +297 -0
- package/src/actor/protocol/serde.ts +131 -0
- package/src/actor/router-endpoints.ts +688 -0
- package/src/actor/router.ts +265 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/unstable-react.ts +110 -0
- package/src/actor/utils.ts +102 -0
- package/src/client/actor-common.ts +30 -0
- package/src/client/actor-conn.ts +865 -0
- package/src/client/actor-handle.ts +268 -0
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +554 -0
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +42 -0
- package/src/client/log.ts +5 -0
- package/src/client/mod.ts +60 -0
- package/src/client/raw-utils.ts +149 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +152 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +80 -0
- package/src/common/fake-event-source.ts +267 -0
- package/src/common/inline-websocket-adapter2.ts +454 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +214 -0
- package/src/common/logfmt.ts +219 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +80 -0
- package/src/common/utils.ts +336 -0
- package/src/common/versioned-data.ts +95 -0
- package/src/common/websocket-interface.ts +49 -0
- package/src/common/websocket.ts +42 -0
- package/src/driver-helpers/mod.ts +22 -0
- package/src/driver-helpers/utils.ts +17 -0
- package/src/driver-test-suite/log.ts +5 -0
- package/src/driver-test-suite/mod.ts +239 -0
- package/src/driver-test-suite/tests/action-features.ts +136 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +249 -0
- package/src/driver-test-suite/tests/actor-conn.ts +349 -0
- package/src/driver-test-suite/tests/actor-driver.ts +25 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +158 -0
- package/src/driver-test-suite/tests/actor-handle.ts +292 -0
- package/src/driver-test-suite/tests/actor-inline-client.ts +152 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +570 -0
- package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
- package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +108 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +413 -0
- package/src/driver-test-suite/tests/actor-state.ts +54 -0
- package/src/driver-test-suite/tests/actor-vars.ts +93 -0
- package/src/driver-test-suite/tests/manager-driver.ts +367 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +414 -0
- package/src/driver-test-suite/tests/raw-http.ts +347 -0
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
- package/src/driver-test-suite/tests/request-access.ts +230 -0
- package/src/driver-test-suite/utils.ts +71 -0
- package/src/drivers/default.ts +34 -0
- package/src/drivers/engine/actor-driver.ts +369 -0
- package/src/drivers/engine/config.ts +31 -0
- package/src/drivers/engine/kv.ts +3 -0
- package/src/drivers/engine/log.ts +5 -0
- package/src/drivers/engine/mod.ts +35 -0
- package/src/drivers/file-system/actor.ts +91 -0
- package/src/drivers/file-system/global-state.ts +686 -0
- package/src/drivers/file-system/log.ts +5 -0
- package/src/drivers/file-system/manager.ts +329 -0
- package/src/drivers/file-system/mod.ts +48 -0
- package/src/drivers/file-system/utils.ts +109 -0
- package/src/globals.d.ts +6 -0
- package/src/inspector/actor.ts +298 -0
- package/src/inspector/config.ts +88 -0
- package/src/inspector/log.ts +5 -0
- package/src/inspector/manager.ts +86 -0
- package/src/inspector/mod.ts +2 -0
- package/src/inspector/protocol/actor.ts +10 -0
- package/src/inspector/protocol/common.ts +196 -0
- package/src/inspector/protocol/manager.ts +10 -0
- package/src/inspector/protocol/mod.ts +2 -0
- package/src/inspector/utils.ts +76 -0
- package/src/manager/driver.ts +88 -0
- package/src/manager/hono-websocket-adapter.ts +342 -0
- package/src/manager/log.ts +5 -0
- package/src/manager/mod.ts +2 -0
- package/src/manager/protocol/mod.ts +24 -0
- package/src/manager/protocol/query.ts +89 -0
- package/src/manager/router.ts +412 -0
- package/src/manager-api/routes/actors-create.ts +16 -0
- package/src/manager-api/routes/actors-delete.ts +4 -0
- package/src/manager-api/routes/actors-get-by-id.ts +7 -0
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
- package/src/manager-api/routes/actors-get.ts +7 -0
- package/src/manager-api/routes/common.ts +18 -0
- package/src/mod.ts +18 -0
- package/src/registry/config.ts +32 -0
- package/src/registry/log.ts +5 -0
- package/src/registry/mod.ts +157 -0
- package/src/registry/run-config.ts +52 -0
- package/src/registry/serve.ts +52 -0
- package/src/remote-manager-driver/actor-http-client.ts +72 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
- package/src/remote-manager-driver/api-endpoints.ts +79 -0
- package/src/remote-manager-driver/api-utils.ts +43 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/mod.ts +274 -0
- package/src/remote-manager-driver/ws-proxy.ts +180 -0
- package/src/schemas/actor-persist/mod.ts +1 -0
- package/src/schemas/actor-persist/versioned.ts +25 -0
- package/src/schemas/client-protocol/mod.ts +1 -0
- package/src/schemas/client-protocol/versioned.ts +63 -0
- package/src/schemas/file-system-driver/mod.ts +1 -0
- package/src/schemas/file-system-driver/versioned.ts +28 -0
- package/src/serde.ts +90 -0
- package/src/test/config.ts +16 -0
- package/src/test/log.ts +5 -0
- package/src/test/mod.ts +154 -0
- package/src/utils.ts +172 -0
|
@@ -0,0 +1,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
|
+
}
|