rivetkit 2.0.37 → 2.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tsup/{chunk-G4N7FZMM.cjs → chunk-7E3RWMR6.cjs} +195 -93
- package/dist/tsup/chunk-7E3RWMR6.cjs.map +1 -0
- package/dist/tsup/{chunk-J6TX5EFW.js → chunk-BQ36VTSB.js} +108 -6
- package/dist/tsup/chunk-BQ36VTSB.js.map +1 -0
- package/dist/tsup/{chunk-4V7MS7SO.cjs → chunk-C64FV764.cjs} +3 -3
- package/dist/tsup/{chunk-4V7MS7SO.cjs.map → chunk-C64FV764.cjs.map} +1 -1
- package/dist/tsup/{chunk-XI335ZED.js → chunk-CDK6DRO2.js} +6 -4
- package/dist/tsup/chunk-CDK6DRO2.js.map +1 -0
- package/dist/tsup/{chunk-LYYTV7DN.cjs → chunk-DY4H3ASE.cjs} +50 -46
- package/dist/tsup/chunk-DY4H3ASE.cjs.map +1 -0
- package/dist/tsup/{chunk-B6BP74X3.cjs → chunk-KMYFL3OL.cjs} +318 -92
- package/dist/tsup/chunk-KMYFL3OL.cjs.map +1 -0
- package/dist/tsup/{chunk-22NKW7F5.cjs → chunk-MZPYVTVG.cjs} +9 -9
- package/dist/tsup/{chunk-22NKW7F5.cjs.map → chunk-MZPYVTVG.cjs.map} +1 -1
- package/dist/tsup/{chunk-RBA5AQTB.js → chunk-OJZRCEIA.js} +5 -5
- package/dist/tsup/{chunk-RXA3ZMCL.js → chunk-PHCD25XO.js} +2 -2
- package/dist/tsup/{chunk-5XGZXH74.js → chunk-PVKUXMOA.js} +264 -38
- package/dist/tsup/chunk-PVKUXMOA.js.map +1 -0
- package/dist/tsup/{chunk-FIUSIG6J.js → chunk-T7IPDBWH.js} +8 -4
- package/dist/tsup/{chunk-FIUSIG6J.js.map → chunk-T7IPDBWH.js.map} +1 -1
- package/dist/tsup/{chunk-5VVIFC6M.cjs → chunk-UAX5E3EU.cjs} +443 -369
- package/dist/tsup/chunk-UAX5E3EU.cjs.map +1 -0
- package/dist/tsup/{chunk-X5IX3YPO.cjs → chunk-X72X7I7T.cjs} +6 -4
- package/dist/tsup/chunk-X72X7I7T.cjs.map +1 -0
- package/dist/tsup/{chunk-ZQBSQ6H3.js → chunk-XU74APB4.js} +208 -134
- package/dist/tsup/chunk-XU74APB4.js.map +1 -0
- package/dist/tsup/client/mod.cjs +5 -5
- package/dist/tsup/client/mod.d.cts +3 -3
- package/dist/tsup/client/mod.d.ts +3 -3
- package/dist/tsup/client/mod.js +4 -4
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/{config--NjwiYlS.d.cts → config-BuBlMs6C.d.cts} +238 -60
- package/dist/tsup/{config-CRuzI6n4.d.ts → config-CBwo4ooA.d.ts} +238 -60
- package/dist/tsup/{driver-yKjYx9Yy.d.cts → driver-CPXmh8f8.d.cts} +1 -1
- package/dist/tsup/{driver-BcmckRaF.d.ts → driver-DxWa6HUO.d.ts} +1 -1
- package/dist/tsup/driver-helpers/mod.cjs +3 -3
- package/dist/tsup/driver-helpers/mod.d.cts +2 -2
- package/dist/tsup/driver-helpers/mod.d.ts +2 -2
- package/dist/tsup/driver-helpers/mod.js +2 -2
- package/dist/tsup/driver-test-suite/mod.cjs +81 -35
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
- package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
- package/dist/tsup/driver-test-suite/mod.js +407 -361
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/{kv-CTM8sCvx.d.cts → keys-Chhy4ylv.d.cts} +1 -0
- package/dist/tsup/{kv-CTM8sCvx.d.ts → keys-Chhy4ylv.d.ts} +1 -0
- package/dist/tsup/mod.cjs +19 -7
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +5 -5
- package/dist/tsup/mod.d.ts +5 -5
- package/dist/tsup/mod.js +18 -6
- package/dist/tsup/test/mod.cjs +7 -7
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +6 -6
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/package.json +6 -4
- package/src/actor/config.ts +198 -2
- package/src/actor/contexts/base/actor.ts +12 -0
- package/src/actor/instance/connection-manager.ts +1 -1
- package/src/actor/instance/keys.ts +29 -0
- package/src/actor/instance/kv.ts +240 -14
- package/src/actor/instance/mod.ts +5 -4
- package/src/actor/instance/state-manager.ts +1 -1
- package/src/actor/mod.ts +2 -1
- package/src/actor/router-websocket-endpoints.ts +2 -1
- package/src/client/actor-conn.ts +70 -81
- package/src/client/actor-handle.ts +35 -15
- package/src/client/actor-query.ts +47 -0
- package/src/client/errors.ts +22 -58
- package/src/client/mod.ts +1 -1
- package/src/client/utils.ts +33 -0
- package/src/driver-helpers/utils.ts +1 -1
- package/src/driver-test-suite/mod.ts +3 -0
- package/src/driver-test-suite/test-inline-client-driver.ts +3 -0
- package/src/driver-test-suite/tests/actor-kv.ts +44 -0
- package/src/driver-test-suite/utils.ts +4 -0
- package/src/drivers/engine/actor-driver.ts +3 -3
- package/src/drivers/file-system/manager.ts +5 -0
- package/src/manager/driver.ts +8 -3
- package/src/manager-api/actors.ts +1 -20
- package/src/registry/config/index.ts +68 -0
- package/src/remote-manager-driver/actor-http-client.ts +5 -3
- package/src/remote-manager-driver/actor-websocket-client.ts +18 -7
- package/src/remote-manager-driver/mod.ts +21 -1
- package/src/serverless/router.test.ts +166 -0
- package/src/serverless/router.ts +58 -5
- package/src/utils/env-vars.ts +4 -1
- package/dist/tsup/chunk-5VVIFC6M.cjs.map +0 -1
- package/dist/tsup/chunk-5XGZXH74.js.map +0 -1
- package/dist/tsup/chunk-B6BP74X3.cjs.map +0 -1
- package/dist/tsup/chunk-G4N7FZMM.cjs.map +0 -1
- package/dist/tsup/chunk-J6TX5EFW.js.map +0 -1
- package/dist/tsup/chunk-LYYTV7DN.cjs.map +0 -1
- package/dist/tsup/chunk-X5IX3YPO.cjs.map +0 -1
- package/dist/tsup/chunk-XI335ZED.js.map +0 -1
- package/dist/tsup/chunk-ZQBSQ6H3.js.map +0 -1
- /package/dist/tsup/{chunk-RBA5AQTB.js.map → chunk-OJZRCEIA.js.map} +0 -0
- /package/dist/tsup/{chunk-RXA3ZMCL.js.map → chunk-PHCD25XO.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
importWebSocket,
|
|
3
3
|
logger
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-PHCD25XO.js";
|
|
5
5
|
import {
|
|
6
6
|
ACTOR_VERSIONED,
|
|
7
7
|
ActionContext,
|
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
serializeWithEncoding,
|
|
60
60
|
tryParseEndpoint,
|
|
61
61
|
uint8ArrayToBase64
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-PVKUXMOA.js";
|
|
63
63
|
import {
|
|
64
64
|
EXTRA_ERROR_LOG,
|
|
65
65
|
SinglePromiseQueue,
|
|
@@ -84,7 +84,7 @@ import {
|
|
|
84
84
|
noopNext,
|
|
85
85
|
promiseWithResolvers,
|
|
86
86
|
stringifyError
|
|
87
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-CDK6DRO2.js";
|
|
88
88
|
import {
|
|
89
89
|
ActionNotFound,
|
|
90
90
|
ActionTimedOut,
|
|
@@ -169,46 +169,39 @@ var ActorConnDisposed = class extends ActorClientError {
|
|
|
169
169
|
super("Attempting to interact with a disposed actor connection.");
|
|
170
170
|
}
|
|
171
171
|
};
|
|
172
|
-
|
|
172
|
+
function isSchedulingError(group, code) {
|
|
173
|
+
return group === "guard" && (code === "actor_ready_timeout" || code === "actor_runner_failed");
|
|
174
|
+
}
|
|
175
|
+
var ActorSchedulingError = class extends ActorError {
|
|
173
176
|
actorId;
|
|
174
|
-
errorType;
|
|
175
177
|
details;
|
|
176
|
-
constructor(actorId,
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
constructor(group, code, actorId, details) {
|
|
179
|
+
super(
|
|
180
|
+
group,
|
|
181
|
+
code,
|
|
182
|
+
`Actor failed to start (${actorId}): ${JSON.stringify(details)}`,
|
|
183
|
+
{ actorId, details }
|
|
184
|
+
);
|
|
179
185
|
this.name = "ActorSchedulingError";
|
|
180
186
|
this.actorId = actorId;
|
|
181
|
-
this.
|
|
182
|
-
this.details = error;
|
|
183
|
-
}
|
|
184
|
-
static formatMessage(error) {
|
|
185
|
-
if ("serverless_error" in error) {
|
|
186
|
-
const se = error.serverless_error;
|
|
187
|
-
if (typeof se === "string") {
|
|
188
|
-
return `Serverless error: ${se.replace(/_/g, " ")}`;
|
|
189
|
-
}
|
|
190
|
-
if ("http_error" in se) {
|
|
191
|
-
return `Serverless HTTP ${se.http_error.status_code}: ${se.http_error.body}`;
|
|
192
|
-
}
|
|
193
|
-
if ("connection_error" in se) {
|
|
194
|
-
return `Serverless connection error: ${se.connection_error.message}`;
|
|
195
|
-
}
|
|
196
|
-
if ("invalid_payload" in se) {
|
|
197
|
-
return `Invalid serverless payload: ${se.invalid_payload.message}`;
|
|
198
|
-
}
|
|
199
|
-
return "Unknown serverless error";
|
|
200
|
-
}
|
|
201
|
-
if ("no_capacity" in error) {
|
|
202
|
-
return `No capacity available for runner: ${error.no_capacity.runner_name}`;
|
|
203
|
-
}
|
|
204
|
-
if ("runner_no_response" in error) {
|
|
205
|
-
return `Runner ${error.runner_no_response.runner_id} did not respond`;
|
|
206
|
-
}
|
|
207
|
-
return "Unknown scheduling error";
|
|
187
|
+
this.details = details;
|
|
208
188
|
}
|
|
209
189
|
};
|
|
210
190
|
|
|
211
191
|
// src/client/utils.ts
|
|
192
|
+
function parseWebSocketCloseReason(reason) {
|
|
193
|
+
const [mainPart, rayId] = reason.split("#");
|
|
194
|
+
const [group, code] = mainPart.split(".");
|
|
195
|
+
if (!group || !code) {
|
|
196
|
+
logger().warn({ msg: "failed to parse close reason", reason });
|
|
197
|
+
return void 0;
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
group,
|
|
201
|
+
code,
|
|
202
|
+
rayId
|
|
203
|
+
};
|
|
204
|
+
}
|
|
212
205
|
function messageLength(message) {
|
|
213
206
|
if (message instanceof Blob) {
|
|
214
207
|
return message.size;
|
|
@@ -384,13 +377,56 @@ async function apiCall(config, method, path, body) {
|
|
|
384
377
|
});
|
|
385
378
|
}
|
|
386
379
|
|
|
380
|
+
// src/remote-manager-driver/actor-websocket-client.ts
|
|
381
|
+
function buildActorGatewayUrl(endpoint, actorId, token, path = "") {
|
|
382
|
+
const tokenSegment = token !== void 0 ? `@${encodeURIComponent(token)}` : "";
|
|
383
|
+
const gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;
|
|
384
|
+
return combineUrlPath(endpoint, gatewayPath);
|
|
385
|
+
}
|
|
386
|
+
async function openWebSocketToActor(runConfig, path, actorId, encoding, params) {
|
|
387
|
+
const WebSocket2 = await importWebSocket();
|
|
388
|
+
const endpoint = getEndpoint(runConfig);
|
|
389
|
+
const guardUrl = buildActorGatewayUrl(
|
|
390
|
+
endpoint,
|
|
391
|
+
actorId,
|
|
392
|
+
runConfig.token,
|
|
393
|
+
path
|
|
394
|
+
);
|
|
395
|
+
logger3().debug({
|
|
396
|
+
msg: "opening websocket to actor via guard",
|
|
397
|
+
actorId,
|
|
398
|
+
path,
|
|
399
|
+
guardUrl
|
|
400
|
+
});
|
|
401
|
+
const ws = new WebSocket2(
|
|
402
|
+
guardUrl,
|
|
403
|
+
buildWebSocketProtocols(runConfig, encoding, params)
|
|
404
|
+
);
|
|
405
|
+
ws.binaryType = "arraybuffer";
|
|
406
|
+
logger3().debug({ msg: "websocket connection opened", actorId });
|
|
407
|
+
return ws;
|
|
408
|
+
}
|
|
409
|
+
function buildWebSocketProtocols(runConfig, encoding, params) {
|
|
410
|
+
const protocols = [];
|
|
411
|
+
protocols.push(WS_PROTOCOL_STANDARD);
|
|
412
|
+
protocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);
|
|
413
|
+
if (params) {
|
|
414
|
+
protocols.push(
|
|
415
|
+
`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
return protocols;
|
|
419
|
+
}
|
|
420
|
+
|
|
387
421
|
// src/remote-manager-driver/actor-http-client.ts
|
|
388
422
|
async function sendHttpRequestToActor(runConfig, actorId, actorRequest) {
|
|
389
423
|
const url = new URL(actorRequest.url);
|
|
390
424
|
const endpoint = getEndpoint(runConfig);
|
|
391
|
-
const guardUrl =
|
|
425
|
+
const guardUrl = buildActorGatewayUrl(
|
|
392
426
|
endpoint,
|
|
393
|
-
|
|
427
|
+
actorId,
|
|
428
|
+
runConfig.token,
|
|
429
|
+
`${url.pathname}${url.search}`
|
|
394
430
|
);
|
|
395
431
|
let bodyToSend = null;
|
|
396
432
|
const guardHeaders = buildGuardHeadersForHttp(
|
|
@@ -434,43 +470,6 @@ function buildGuardHeadersForHttp(runConfig, actorRequest, actorId) {
|
|
|
434
470
|
return headers;
|
|
435
471
|
}
|
|
436
472
|
|
|
437
|
-
// src/remote-manager-driver/actor-websocket-client.ts
|
|
438
|
-
async function openWebSocketToActor(runConfig, path, actorId, encoding, params) {
|
|
439
|
-
const WebSocket2 = await importWebSocket();
|
|
440
|
-
const endpoint = getEndpoint(runConfig);
|
|
441
|
-
let gatewayPath;
|
|
442
|
-
if (runConfig.token !== void 0) {
|
|
443
|
-
gatewayPath = `/gateway/${encodeURIComponent(actorId)}@${encodeURIComponent(runConfig.token)}${path}`;
|
|
444
|
-
} else {
|
|
445
|
-
gatewayPath = `/gateway/${encodeURIComponent(actorId)}${path}`;
|
|
446
|
-
}
|
|
447
|
-
const guardUrl = combineUrlPath(endpoint, gatewayPath);
|
|
448
|
-
logger3().debug({
|
|
449
|
-
msg: "opening websocket to actor via guard",
|
|
450
|
-
actorId,
|
|
451
|
-
path,
|
|
452
|
-
guardUrl
|
|
453
|
-
});
|
|
454
|
-
const ws = new WebSocket2(
|
|
455
|
-
guardUrl,
|
|
456
|
-
buildWebSocketProtocols(runConfig, encoding, params)
|
|
457
|
-
);
|
|
458
|
-
ws.binaryType = "arraybuffer";
|
|
459
|
-
logger3().debug({ msg: "websocket connection opened", actorId });
|
|
460
|
-
return ws;
|
|
461
|
-
}
|
|
462
|
-
function buildWebSocketProtocols(runConfig, encoding, params) {
|
|
463
|
-
const protocols = [];
|
|
464
|
-
protocols.push(WS_PROTOCOL_STANDARD);
|
|
465
|
-
protocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);
|
|
466
|
-
if (params) {
|
|
467
|
-
protocols.push(
|
|
468
|
-
`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`
|
|
469
|
-
);
|
|
470
|
-
}
|
|
471
|
-
return protocols;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
473
|
// src/remote-manager-driver/api-endpoints.ts
|
|
475
474
|
async function getActor(config, _, actorId) {
|
|
476
475
|
return apiCall(
|
|
@@ -738,9 +737,17 @@ var RemoteManagerDriver = class {
|
|
|
738
737
|
(metadataData) => {
|
|
739
738
|
if (metadataData.clientEndpoint) {
|
|
740
739
|
this.#config.endpoint = metadataData.clientEndpoint;
|
|
740
|
+
if (metadataData.clientNamespace) {
|
|
741
|
+
this.#config.namespace = metadataData.clientNamespace;
|
|
742
|
+
}
|
|
743
|
+
if (metadataData.clientToken) {
|
|
744
|
+
this.#config.token = metadataData.clientToken;
|
|
745
|
+
}
|
|
741
746
|
logger3().info({
|
|
742
|
-
msg: "overriding
|
|
743
|
-
endpoint: metadataData.clientEndpoint
|
|
747
|
+
msg: "overriding client endpoint",
|
|
748
|
+
endpoint: metadataData.clientEndpoint,
|
|
749
|
+
namespace: metadataData.clientNamespace,
|
|
750
|
+
token: metadataData.clientToken
|
|
744
751
|
});
|
|
745
752
|
}
|
|
746
753
|
logger3().info({
|
|
@@ -894,6 +901,13 @@ var RemoteManagerDriver = class {
|
|
|
894
901
|
params
|
|
895
902
|
);
|
|
896
903
|
}
|
|
904
|
+
async buildGatewayUrl(actorId) {
|
|
905
|
+
if (this.#metadataPromise) {
|
|
906
|
+
await this.#metadataPromise;
|
|
907
|
+
}
|
|
908
|
+
const endpoint = getEndpoint(this.#config);
|
|
909
|
+
return buildActorGatewayUrl(endpoint, actorId, this.#config.token);
|
|
910
|
+
}
|
|
897
911
|
async proxyRequest(_c, actorRequest, actorId) {
|
|
898
912
|
if (this.#metadataPromise) {
|
|
899
913
|
await this.#metadataPromise;
|
|
@@ -1018,6 +1032,34 @@ async function queryActor(c, query, managerDriver) {
|
|
|
1018
1032
|
logger().debug({ msg: "actor query result", actorId: actorOutput.actorId });
|
|
1019
1033
|
return { actorId: actorOutput.actorId };
|
|
1020
1034
|
}
|
|
1035
|
+
function getActorNameFromQuery(query) {
|
|
1036
|
+
if ("getForId" in query) return query.getForId.name;
|
|
1037
|
+
if ("getForKey" in query) return query.getForKey.name;
|
|
1038
|
+
if ("getOrCreateForKey" in query) return query.getOrCreateForKey.name;
|
|
1039
|
+
if ("create" in query) return query.create.name;
|
|
1040
|
+
throw new InvalidRequest("Invalid query format");
|
|
1041
|
+
}
|
|
1042
|
+
async function checkForSchedulingError(group, code, actorId, query, driver) {
|
|
1043
|
+
const name = getActorNameFromQuery(query);
|
|
1044
|
+
try {
|
|
1045
|
+
const actor = await driver.getForId({ name, actorId });
|
|
1046
|
+
if (actor == null ? void 0 : actor.error) {
|
|
1047
|
+
logger().info({
|
|
1048
|
+
msg: "found actor scheduling error",
|
|
1049
|
+
actorId,
|
|
1050
|
+
error: actor.error
|
|
1051
|
+
});
|
|
1052
|
+
return new ActorSchedulingError(group, code, actorId, actor.error);
|
|
1053
|
+
}
|
|
1054
|
+
} catch (err) {
|
|
1055
|
+
logger().warn({
|
|
1056
|
+
msg: "failed to fetch actor details for scheduling error check",
|
|
1057
|
+
actorId,
|
|
1058
|
+
error: stringifyError(err)
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
return null;
|
|
1062
|
+
}
|
|
1021
1063
|
|
|
1022
1064
|
// src/client/actor-conn.ts
|
|
1023
1065
|
var CONNECT_SYMBOL = Symbol("connect");
|
|
@@ -1232,9 +1274,9 @@ var ActorConnRaw = class {
|
|
|
1232
1274
|
});
|
|
1233
1275
|
}
|
|
1234
1276
|
});
|
|
1235
|
-
ws.addEventListener("close", (ev) => {
|
|
1277
|
+
ws.addEventListener("close", async (ev) => {
|
|
1236
1278
|
try {
|
|
1237
|
-
this.#handleOnClose(ev);
|
|
1279
|
+
await this.#handleOnClose(ev);
|
|
1238
1280
|
} catch (err) {
|
|
1239
1281
|
logger().error({
|
|
1240
1282
|
msg: "error in websocket close handler",
|
|
@@ -1337,17 +1379,23 @@ var ActorConnRaw = class {
|
|
|
1337
1379
|
message,
|
|
1338
1380
|
metadata
|
|
1339
1381
|
});
|
|
1340
|
-
let errorToThrow
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1382
|
+
let errorToThrow = new ActorError(
|
|
1383
|
+
group,
|
|
1384
|
+
code,
|
|
1385
|
+
message,
|
|
1386
|
+
metadata
|
|
1387
|
+
);
|
|
1388
|
+
if (isSchedulingError(group, code) && this.#actorId) {
|
|
1389
|
+
const schedulingError = await checkForSchedulingError(
|
|
1346
1390
|
group,
|
|
1347
1391
|
code,
|
|
1348
|
-
|
|
1349
|
-
|
|
1392
|
+
this.#actorId,
|
|
1393
|
+
this.#actorQuery,
|
|
1394
|
+
this.#driver
|
|
1350
1395
|
);
|
|
1396
|
+
if (schedulingError) {
|
|
1397
|
+
errorToThrow = schedulingError;
|
|
1398
|
+
}
|
|
1351
1399
|
}
|
|
1352
1400
|
if (this.#onOpenPromise) {
|
|
1353
1401
|
this.#onOpenPromise.reject(errorToThrow);
|
|
@@ -1356,9 +1404,7 @@ var ActorConnRaw = class {
|
|
|
1356
1404
|
inFlight.reject(errorToThrow);
|
|
1357
1405
|
this.#actionsInFlight.delete(id);
|
|
1358
1406
|
}
|
|
1359
|
-
|
|
1360
|
-
this.#dispatchActorError(errorToThrow);
|
|
1361
|
-
}
|
|
1407
|
+
this.#dispatchActorError(errorToThrow);
|
|
1362
1408
|
}
|
|
1363
1409
|
} else if (response.body.tag === "ActionResponse") {
|
|
1364
1410
|
const { id: actionId } = response.body.val;
|
|
@@ -1386,7 +1432,7 @@ var ActorConnRaw = class {
|
|
|
1386
1432
|
}
|
|
1387
1433
|
}
|
|
1388
1434
|
/** Called by the onclose event from drivers. */
|
|
1389
|
-
#handleOnClose(event) {
|
|
1435
|
+
async #handleOnClose(event) {
|
|
1390
1436
|
const closeEvent = event;
|
|
1391
1437
|
const wasClean = closeEvent.wasClean;
|
|
1392
1438
|
const wasConnected = this.#connStatus === "connected";
|
|
@@ -1403,12 +1449,46 @@ var ActorConnRaw = class {
|
|
|
1403
1449
|
this.#rejectPendingPromises(new ActorConnDisposed(), true);
|
|
1404
1450
|
} else {
|
|
1405
1451
|
this.#setConnStatus("disconnected");
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1452
|
+
let error;
|
|
1453
|
+
const reason = closeEvent.reason || "";
|
|
1454
|
+
const parsed = parseWebSocketCloseReason(reason);
|
|
1455
|
+
if (parsed) {
|
|
1456
|
+
const { group, code } = parsed;
|
|
1457
|
+
if (isSchedulingError(group, code) && this.#actorId) {
|
|
1458
|
+
const schedulingError = await checkForSchedulingError(
|
|
1459
|
+
group,
|
|
1460
|
+
code,
|
|
1461
|
+
this.#actorId,
|
|
1462
|
+
this.#actorQuery,
|
|
1463
|
+
this.#driver
|
|
1464
|
+
);
|
|
1465
|
+
if (schedulingError) {
|
|
1466
|
+
error = schedulingError;
|
|
1467
|
+
} else {
|
|
1468
|
+
error = new ActorError(
|
|
1469
|
+
group,
|
|
1470
|
+
code,
|
|
1471
|
+
`Connection closed: ${reason}`,
|
|
1472
|
+
void 0
|
|
1473
|
+
);
|
|
1474
|
+
}
|
|
1475
|
+
} else {
|
|
1476
|
+
error = new ActorError(
|
|
1477
|
+
group,
|
|
1478
|
+
code,
|
|
1479
|
+
`Connection closed: ${reason}`,
|
|
1480
|
+
void 0
|
|
1481
|
+
);
|
|
1482
|
+
}
|
|
1483
|
+
} else {
|
|
1484
|
+
error = new Error(
|
|
1485
|
+
`${wasClean ? "Connection closed" : "Connection lost"} (code: ${closeEvent.code}, reason: ${reason})`
|
|
1486
|
+
);
|
|
1487
|
+
}
|
|
1488
|
+
this.#rejectPendingPromises(error, false);
|
|
1489
|
+
if (error instanceof ActorError) {
|
|
1490
|
+
this.#dispatchActorError(error);
|
|
1491
|
+
}
|
|
1412
1492
|
if (wasConnected) {
|
|
1413
1493
|
logger().debug({
|
|
1414
1494
|
msg: "triggering reconnect",
|
|
@@ -1488,36 +1568,6 @@ var ActorConnRaw = class {
|
|
|
1488
1568
|
}
|
|
1489
1569
|
}
|
|
1490
1570
|
}
|
|
1491
|
-
async #checkForSchedulingError() {
|
|
1492
|
-
if (!this.#actorId) return null;
|
|
1493
|
-
const query = this.#actorQuery;
|
|
1494
|
-
const name = "getForId" in query ? query.getForId.name : "getForKey" in query ? query.getForKey.name : "getOrCreateForKey" in query ? query.getOrCreateForKey.name : "create" in query ? query.create.name : null;
|
|
1495
|
-
if (!name) return null;
|
|
1496
|
-
try {
|
|
1497
|
-
const actor = await this.#driver.getForId({
|
|
1498
|
-
name,
|
|
1499
|
-
actorId: this.#actorId
|
|
1500
|
-
});
|
|
1501
|
-
if (actor == null ? void 0 : actor.error) {
|
|
1502
|
-
logger().info({
|
|
1503
|
-
msg: "found actor scheduling error",
|
|
1504
|
-
actorId: this.#actorId,
|
|
1505
|
-
error: actor.error
|
|
1506
|
-
});
|
|
1507
|
-
return new ActorSchedulingError(
|
|
1508
|
-
this.#actorId,
|
|
1509
|
-
actor.error
|
|
1510
|
-
);
|
|
1511
|
-
}
|
|
1512
|
-
} catch (err) {
|
|
1513
|
-
logger().warn({
|
|
1514
|
-
msg: "failed to fetch actor details for scheduling error check",
|
|
1515
|
-
actorId: this.#actorId,
|
|
1516
|
-
error: stringifyError(err)
|
|
1517
|
-
});
|
|
1518
|
-
}
|
|
1519
|
-
return null;
|
|
1520
|
-
}
|
|
1521
1571
|
#addEventSubscription(eventName, callback, once) {
|
|
1522
1572
|
const listener = {
|
|
1523
1573
|
callback,
|
|
@@ -1976,12 +2026,14 @@ var ActorHandleRaw = class {
|
|
|
1976
2026
|
* @template Response - The type of the response returned by the action function.
|
|
1977
2027
|
*/
|
|
1978
2028
|
async action(opts) {
|
|
2029
|
+
let actorId;
|
|
1979
2030
|
try {
|
|
1980
|
-
const
|
|
2031
|
+
const result = await queryActor(
|
|
1981
2032
|
void 0,
|
|
1982
2033
|
this.#actorQuery,
|
|
1983
2034
|
this.#driver
|
|
1984
2035
|
);
|
|
2036
|
+
actorId = result.actorId;
|
|
1985
2037
|
logger().debug({ msg: "found actor for action", actorId });
|
|
1986
2038
|
invariant5(actorId, "Missing actor ID");
|
|
1987
2039
|
logger().debug({
|
|
@@ -2030,6 +2082,18 @@ var ActorHandleRaw = class {
|
|
|
2030
2082
|
{},
|
|
2031
2083
|
true
|
|
2032
2084
|
);
|
|
2085
|
+
if (actorId && isSchedulingError(group, code)) {
|
|
2086
|
+
const schedulingError = await checkForSchedulingError(
|
|
2087
|
+
group,
|
|
2088
|
+
code,
|
|
2089
|
+
actorId,
|
|
2090
|
+
this.#actorQuery,
|
|
2091
|
+
this.#driver
|
|
2092
|
+
);
|
|
2093
|
+
if (schedulingError) {
|
|
2094
|
+
throw schedulingError;
|
|
2095
|
+
}
|
|
2096
|
+
}
|
|
2033
2097
|
throw new ActorError(group, code, message, metadata);
|
|
2034
2098
|
}
|
|
2035
2099
|
}
|
|
@@ -2088,9 +2152,7 @@ var ActorHandleRaw = class {
|
|
|
2088
2152
|
);
|
|
2089
2153
|
}
|
|
2090
2154
|
/**
|
|
2091
|
-
* Resolves the actor to get its unique actor ID
|
|
2092
|
-
*
|
|
2093
|
-
* @returns {Promise<string>} - A promise that resolves to the actor's ID
|
|
2155
|
+
* Resolves the actor to get its unique actor ID.
|
|
2094
2156
|
*/
|
|
2095
2157
|
async resolve({ signal } = {}) {
|
|
2096
2158
|
if ("getForKey" in this.#actorQuery || "getOrCreateForKey" in this.#actorQuery) {
|
|
@@ -2117,6 +2179,17 @@ var ActorHandleRaw = class {
|
|
|
2117
2179
|
assertUnreachable2(this.#actorQuery);
|
|
2118
2180
|
}
|
|
2119
2181
|
}
|
|
2182
|
+
/**
|
|
2183
|
+
* Returns the raw URL for routing traffic to the actor.
|
|
2184
|
+
*/
|
|
2185
|
+
async getGatewayUrl() {
|
|
2186
|
+
const { actorId } = await queryActor(
|
|
2187
|
+
void 0,
|
|
2188
|
+
this.#actorQuery,
|
|
2189
|
+
this.#driver
|
|
2190
|
+
);
|
|
2191
|
+
return await this.#driver.buildGatewayUrl(actorId);
|
|
2192
|
+
}
|
|
2120
2193
|
};
|
|
2121
2194
|
|
|
2122
2195
|
// src/client/client.ts
|
|
@@ -3995,7 +4068,7 @@ var ActorInstance = class {
|
|
|
3995
4068
|
return this.#abortController.signal;
|
|
3996
4069
|
}
|
|
3997
4070
|
get actions() {
|
|
3998
|
-
return Object.keys(this.#config.actions);
|
|
4071
|
+
return Object.keys(this.#config.actions ?? {});
|
|
3999
4072
|
}
|
|
4000
4073
|
get config() {
|
|
4001
4074
|
return this.#config;
|
|
@@ -4208,11 +4281,12 @@ var ActorInstance = class {
|
|
|
4208
4281
|
// MARK: - Action Execution
|
|
4209
4282
|
async executeAction(ctx, actionName, args) {
|
|
4210
4283
|
this.assertReady();
|
|
4211
|
-
|
|
4284
|
+
const actions = this.#config.actions ?? {};
|
|
4285
|
+
if (!(actionName in actions)) {
|
|
4212
4286
|
this.#rLog.warn({ msg: "action does not exist", actionName });
|
|
4213
4287
|
throw new ActionNotFound(actionName);
|
|
4214
4288
|
}
|
|
4215
|
-
const actionFunction =
|
|
4289
|
+
const actionFunction = actions[actionName];
|
|
4216
4290
|
if (typeof actionFunction !== "function") {
|
|
4217
4291
|
this.#rLog.warn({
|
|
4218
4292
|
msg: "action is not a function",
|
|
@@ -4684,4 +4758,4 @@ export {
|
|
|
4684
4758
|
RemoteManagerDriver,
|
|
4685
4759
|
createClient
|
|
4686
4760
|
};
|
|
4687
|
-
//# sourceMappingURL=chunk-
|
|
4761
|
+
//# sourceMappingURL=chunk-XU74APB4.js.map
|