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.
Files changed (104) hide show
  1. package/dist/tsup/{chunk-G4N7FZMM.cjs → chunk-7E3RWMR6.cjs} +195 -93
  2. package/dist/tsup/chunk-7E3RWMR6.cjs.map +1 -0
  3. package/dist/tsup/{chunk-J6TX5EFW.js → chunk-BQ36VTSB.js} +108 -6
  4. package/dist/tsup/chunk-BQ36VTSB.js.map +1 -0
  5. package/dist/tsup/{chunk-4V7MS7SO.cjs → chunk-C64FV764.cjs} +3 -3
  6. package/dist/tsup/{chunk-4V7MS7SO.cjs.map → chunk-C64FV764.cjs.map} +1 -1
  7. package/dist/tsup/{chunk-XI335ZED.js → chunk-CDK6DRO2.js} +6 -4
  8. package/dist/tsup/chunk-CDK6DRO2.js.map +1 -0
  9. package/dist/tsup/{chunk-LYYTV7DN.cjs → chunk-DY4H3ASE.cjs} +50 -46
  10. package/dist/tsup/chunk-DY4H3ASE.cjs.map +1 -0
  11. package/dist/tsup/{chunk-B6BP74X3.cjs → chunk-KMYFL3OL.cjs} +318 -92
  12. package/dist/tsup/chunk-KMYFL3OL.cjs.map +1 -0
  13. package/dist/tsup/{chunk-22NKW7F5.cjs → chunk-MZPYVTVG.cjs} +9 -9
  14. package/dist/tsup/{chunk-22NKW7F5.cjs.map → chunk-MZPYVTVG.cjs.map} +1 -1
  15. package/dist/tsup/{chunk-RBA5AQTB.js → chunk-OJZRCEIA.js} +5 -5
  16. package/dist/tsup/{chunk-RXA3ZMCL.js → chunk-PHCD25XO.js} +2 -2
  17. package/dist/tsup/{chunk-5XGZXH74.js → chunk-PVKUXMOA.js} +264 -38
  18. package/dist/tsup/chunk-PVKUXMOA.js.map +1 -0
  19. package/dist/tsup/{chunk-FIUSIG6J.js → chunk-T7IPDBWH.js} +8 -4
  20. package/dist/tsup/{chunk-FIUSIG6J.js.map → chunk-T7IPDBWH.js.map} +1 -1
  21. package/dist/tsup/{chunk-5VVIFC6M.cjs → chunk-UAX5E3EU.cjs} +443 -369
  22. package/dist/tsup/chunk-UAX5E3EU.cjs.map +1 -0
  23. package/dist/tsup/{chunk-X5IX3YPO.cjs → chunk-X72X7I7T.cjs} +6 -4
  24. package/dist/tsup/chunk-X72X7I7T.cjs.map +1 -0
  25. package/dist/tsup/{chunk-ZQBSQ6H3.js → chunk-XU74APB4.js} +208 -134
  26. package/dist/tsup/chunk-XU74APB4.js.map +1 -0
  27. package/dist/tsup/client/mod.cjs +5 -5
  28. package/dist/tsup/client/mod.d.cts +3 -3
  29. package/dist/tsup/client/mod.d.ts +3 -3
  30. package/dist/tsup/client/mod.js +4 -4
  31. package/dist/tsup/common/log.cjs +2 -2
  32. package/dist/tsup/common/log.js +1 -1
  33. package/dist/tsup/common/websocket.cjs +3 -3
  34. package/dist/tsup/common/websocket.js +2 -2
  35. package/dist/tsup/{config--NjwiYlS.d.cts → config-BuBlMs6C.d.cts} +238 -60
  36. package/dist/tsup/{config-CRuzI6n4.d.ts → config-CBwo4ooA.d.ts} +238 -60
  37. package/dist/tsup/{driver-yKjYx9Yy.d.cts → driver-CPXmh8f8.d.cts} +1 -1
  38. package/dist/tsup/{driver-BcmckRaF.d.ts → driver-DxWa6HUO.d.ts} +1 -1
  39. package/dist/tsup/driver-helpers/mod.cjs +3 -3
  40. package/dist/tsup/driver-helpers/mod.d.cts +2 -2
  41. package/dist/tsup/driver-helpers/mod.d.ts +2 -2
  42. package/dist/tsup/driver-helpers/mod.js +2 -2
  43. package/dist/tsup/driver-test-suite/mod.cjs +81 -35
  44. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  45. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  46. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  47. package/dist/tsup/driver-test-suite/mod.js +407 -361
  48. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  49. package/dist/tsup/{kv-CTM8sCvx.d.cts → keys-Chhy4ylv.d.cts} +1 -0
  50. package/dist/tsup/{kv-CTM8sCvx.d.ts → keys-Chhy4ylv.d.ts} +1 -0
  51. package/dist/tsup/mod.cjs +19 -7
  52. package/dist/tsup/mod.cjs.map +1 -1
  53. package/dist/tsup/mod.d.cts +5 -5
  54. package/dist/tsup/mod.d.ts +5 -5
  55. package/dist/tsup/mod.js +18 -6
  56. package/dist/tsup/test/mod.cjs +7 -7
  57. package/dist/tsup/test/mod.d.cts +1 -1
  58. package/dist/tsup/test/mod.d.ts +1 -1
  59. package/dist/tsup/test/mod.js +6 -6
  60. package/dist/tsup/utils.cjs +2 -2
  61. package/dist/tsup/utils.js +1 -1
  62. package/package.json +6 -4
  63. package/src/actor/config.ts +198 -2
  64. package/src/actor/contexts/base/actor.ts +12 -0
  65. package/src/actor/instance/connection-manager.ts +1 -1
  66. package/src/actor/instance/keys.ts +29 -0
  67. package/src/actor/instance/kv.ts +240 -14
  68. package/src/actor/instance/mod.ts +5 -4
  69. package/src/actor/instance/state-manager.ts +1 -1
  70. package/src/actor/mod.ts +2 -1
  71. package/src/actor/router-websocket-endpoints.ts +2 -1
  72. package/src/client/actor-conn.ts +70 -81
  73. package/src/client/actor-handle.ts +35 -15
  74. package/src/client/actor-query.ts +47 -0
  75. package/src/client/errors.ts +22 -58
  76. package/src/client/mod.ts +1 -1
  77. package/src/client/utils.ts +33 -0
  78. package/src/driver-helpers/utils.ts +1 -1
  79. package/src/driver-test-suite/mod.ts +3 -0
  80. package/src/driver-test-suite/test-inline-client-driver.ts +3 -0
  81. package/src/driver-test-suite/tests/actor-kv.ts +44 -0
  82. package/src/driver-test-suite/utils.ts +4 -0
  83. package/src/drivers/engine/actor-driver.ts +3 -3
  84. package/src/drivers/file-system/manager.ts +5 -0
  85. package/src/manager/driver.ts +8 -3
  86. package/src/manager-api/actors.ts +1 -20
  87. package/src/registry/config/index.ts +68 -0
  88. package/src/remote-manager-driver/actor-http-client.ts +5 -3
  89. package/src/remote-manager-driver/actor-websocket-client.ts +18 -7
  90. package/src/remote-manager-driver/mod.ts +21 -1
  91. package/src/serverless/router.test.ts +166 -0
  92. package/src/serverless/router.ts +58 -5
  93. package/src/utils/env-vars.ts +4 -1
  94. package/dist/tsup/chunk-5VVIFC6M.cjs.map +0 -1
  95. package/dist/tsup/chunk-5XGZXH74.js.map +0 -1
  96. package/dist/tsup/chunk-B6BP74X3.cjs.map +0 -1
  97. package/dist/tsup/chunk-G4N7FZMM.cjs.map +0 -1
  98. package/dist/tsup/chunk-J6TX5EFW.js.map +0 -1
  99. package/dist/tsup/chunk-LYYTV7DN.cjs.map +0 -1
  100. package/dist/tsup/chunk-X5IX3YPO.cjs.map +0 -1
  101. package/dist/tsup/chunk-XI335ZED.js.map +0 -1
  102. package/dist/tsup/chunk-ZQBSQ6H3.js.map +0 -1
  103. /package/dist/tsup/{chunk-RBA5AQTB.js.map → chunk-OJZRCEIA.js.map} +0 -0
  104. /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-RXA3ZMCL.js";
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-5XGZXH74.js";
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-XI335ZED.js";
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
- var ActorSchedulingError = class _ActorSchedulingError extends ActorClientError {
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, error) {
177
- const message = _ActorSchedulingError.formatMessage(error);
178
- super(message);
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.errorType = Object.keys(error)[0];
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 = combineUrlPath(
425
+ const guardUrl = buildActorGatewayUrl(
392
426
  endpoint,
393
- `/gateway/${actorId}${url.pathname}${url.search}`
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 cached client endpoint",
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
- if (group === "guard" && (code === "actor_ready_timeout" || code === "actor_runner_failed") && this.#actorId) {
1342
- const schedulingError = await this.#checkForSchedulingError();
1343
- errorToThrow = schedulingError ?? new ActorError(group, code, message, metadata);
1344
- } else {
1345
- errorToThrow = new ActorError(
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
- message,
1349
- metadata
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
- if (errorToThrow instanceof ActorError) {
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
- this.#rejectPendingPromises(
1407
- new Error(
1408
- `${wasClean ? "Connection closed" : "Connection lost"} (code: ${closeEvent.code}, reason: ${closeEvent.reason})`
1409
- ),
1410
- false
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 { actorId } = await queryActor(
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
- if (!(actionName in this.#config.actions)) {
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 = this.#config.actions[actionName];
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-ZQBSQ6H3.js.map
4761
+ //# sourceMappingURL=chunk-XU74APB4.js.map