rivetkit 2.0.36 → 2.0.38

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 (85) hide show
  1. package/dist/tsup/{chunk-UDKWYSU3.js → chunk-4U45T5KW.js} +6 -4
  2. package/dist/tsup/chunk-4U45T5KW.js.map +1 -0
  3. package/dist/tsup/{chunk-OYJU4B2I.cjs → chunk-6WLJW57U.cjs} +170 -95
  4. package/dist/tsup/chunk-6WLJW57U.cjs.map +1 -0
  5. package/dist/tsup/{chunk-DSPZ7BZN.js → chunk-EEL32AJM.js} +145 -94
  6. package/dist/tsup/chunk-EEL32AJM.js.map +1 -0
  7. package/dist/tsup/{chunk-EO5JABFU.js → chunk-FA6FGAEC.js} +83 -8
  8. package/dist/tsup/chunk-FA6FGAEC.js.map +1 -0
  9. package/dist/tsup/{chunk-65O3MUPO.cjs → chunk-FZQHTGQX.cjs} +9 -9
  10. package/dist/tsup/{chunk-65O3MUPO.cjs.map → chunk-FZQHTGQX.cjs.map} +1 -1
  11. package/dist/tsup/{chunk-VIUUUBXQ.cjs → chunk-GFKZZG2A.cjs} +3 -3
  12. package/dist/tsup/{chunk-VIUUUBXQ.cjs.map → chunk-GFKZZG2A.cjs.map} +1 -1
  13. package/dist/tsup/{chunk-7EGXCVJL.cjs → chunk-IRTVRBJA.cjs} +46 -46
  14. package/dist/tsup/{chunk-7EGXCVJL.cjs.map → chunk-IRTVRBJA.cjs.map} +1 -1
  15. package/dist/tsup/{chunk-6TLJAB64.cjs → chunk-IWXMFQDT.cjs} +115 -76
  16. package/dist/tsup/chunk-IWXMFQDT.cjs.map +1 -0
  17. package/dist/tsup/{chunk-Z5CSXFVY.js → chunk-K2RNF2ZR.js} +5 -5
  18. package/dist/tsup/{chunk-RTSLQIZ5.cjs → chunk-LULP6HM2.cjs} +386 -335
  19. package/dist/tsup/chunk-LULP6HM2.cjs.map +1 -0
  20. package/dist/tsup/{chunk-KJLJLNHR.js → chunk-MIOU6BF3.js} +59 -20
  21. package/dist/tsup/chunk-MIOU6BF3.js.map +1 -0
  22. package/dist/tsup/{chunk-WRYYREBN.cjs → chunk-O433HWWG.cjs} +6 -4
  23. package/dist/tsup/chunk-O433HWWG.cjs.map +1 -0
  24. package/dist/tsup/{chunk-X5GKJWTG.js → chunk-UUEZVDRL.js} +4 -4
  25. package/dist/tsup/{chunk-D35UUQOR.js → chunk-WIZ4JGP6.js} +2 -2
  26. package/dist/tsup/client/mod.cjs +5 -5
  27. package/dist/tsup/client/mod.d.cts +2 -2
  28. package/dist/tsup/client/mod.d.ts +2 -2
  29. package/dist/tsup/client/mod.js +4 -4
  30. package/dist/tsup/common/log.cjs +2 -2
  31. package/dist/tsup/common/log.js +1 -1
  32. package/dist/tsup/common/websocket.cjs +3 -3
  33. package/dist/tsup/common/websocket.js +2 -2
  34. package/dist/tsup/{config-CRuzI6n4.d.ts → config-CbIHPGKl.d.ts} +167 -56
  35. package/dist/tsup/{config--NjwiYlS.d.cts → config-CwJCQyP1.d.cts} +167 -56
  36. package/dist/tsup/{driver-BcmckRaF.d.ts → driver-CMN823Lc.d.ts} +1 -1
  37. package/dist/tsup/{driver-yKjYx9Yy.d.cts → driver-Lw_oORox.d.cts} +1 -1
  38. package/dist/tsup/driver-helpers/mod.cjs +3 -3
  39. package/dist/tsup/driver-helpers/mod.d.cts +2 -2
  40. package/dist/tsup/driver-helpers/mod.d.ts +2 -2
  41. package/dist/tsup/driver-helpers/mod.js +2 -2
  42. package/dist/tsup/driver-test-suite/mod.cjs +34 -34
  43. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  44. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  45. package/dist/tsup/driver-test-suite/mod.js +7 -7
  46. package/dist/tsup/mod.cjs +17 -7
  47. package/dist/tsup/mod.cjs.map +1 -1
  48. package/dist/tsup/mod.d.cts +4 -4
  49. package/dist/tsup/mod.d.ts +4 -4
  50. package/dist/tsup/mod.js +16 -6
  51. package/dist/tsup/test/mod.cjs +7 -7
  52. package/dist/tsup/test/mod.d.cts +1 -1
  53. package/dist/tsup/test/mod.d.ts +1 -1
  54. package/dist/tsup/test/mod.js +6 -6
  55. package/dist/tsup/utils.cjs +2 -2
  56. package/dist/tsup/utils.js +1 -1
  57. package/package.json +7 -5
  58. package/src/actor/config.ts +47 -0
  59. package/src/client/actor-conn.ts +70 -81
  60. package/src/client/actor-handle.ts +22 -12
  61. package/src/client/actor-query.ts +47 -0
  62. package/src/client/config.ts +6 -4
  63. package/src/client/errors.ts +22 -58
  64. package/src/client/utils.ts +33 -0
  65. package/src/engine-process/constants.ts +1 -1
  66. package/src/engine-process/mod.ts +1 -1
  67. package/src/inspector/utils.ts +1 -1
  68. package/src/manager/driver.ts +1 -3
  69. package/src/manager-api/actors.ts +1 -20
  70. package/src/registry/config/index.ts +71 -3
  71. package/src/remote-manager-driver/mod.ts +11 -1
  72. package/src/serverless/router.test.ts +299 -0
  73. package/src/serverless/router.ts +93 -1
  74. package/src/utils/env-vars.ts +4 -1
  75. package/dist/tsup/chunk-6TLJAB64.cjs.map +0 -1
  76. package/dist/tsup/chunk-DSPZ7BZN.js.map +0 -1
  77. package/dist/tsup/chunk-EO5JABFU.js.map +0 -1
  78. package/dist/tsup/chunk-KJLJLNHR.js.map +0 -1
  79. package/dist/tsup/chunk-OYJU4B2I.cjs.map +0 -1
  80. package/dist/tsup/chunk-RTSLQIZ5.cjs.map +0 -1
  81. package/dist/tsup/chunk-UDKWYSU3.js.map +0 -1
  82. package/dist/tsup/chunk-WRYYREBN.cjs.map +0 -1
  83. /package/dist/tsup/{chunk-Z5CSXFVY.js.map → chunk-K2RNF2ZR.js.map} +0 -0
  84. /package/dist/tsup/{chunk-X5GKJWTG.js.map → chunk-UUEZVDRL.js.map} +0 -0
  85. /package/dist/tsup/{chunk-D35UUQOR.js.map → chunk-WIZ4JGP6.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  importWebSocket,
3
3
  logger
4
- } from "./chunk-D35UUQOR.js";
4
+ } from "./chunk-WIZ4JGP6.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-KJLJLNHR.js";
62
+ } from "./chunk-MIOU6BF3.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-UDKWYSU3.js";
87
+ } from "./chunk-4U45T5KW.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;
@@ -738,9 +731,17 @@ var RemoteManagerDriver = class {
738
731
  (metadataData) => {
739
732
  if (metadataData.clientEndpoint) {
740
733
  this.#config.endpoint = metadataData.clientEndpoint;
734
+ if (metadataData.clientNamespace) {
735
+ this.#config.namespace = metadataData.clientNamespace;
736
+ }
737
+ if (metadataData.clientToken) {
738
+ this.#config.token = metadataData.clientToken;
739
+ }
741
740
  logger3().info({
742
- msg: "overriding cached client endpoint",
743
- endpoint: metadataData.clientEndpoint
741
+ msg: "overriding client endpoint",
742
+ endpoint: metadataData.clientEndpoint,
743
+ namespace: metadataData.clientNamespace,
744
+ token: metadataData.clientToken
744
745
  });
745
746
  }
746
747
  logger3().info({
@@ -1018,6 +1019,34 @@ async function queryActor(c, query, managerDriver) {
1018
1019
  logger().debug({ msg: "actor query result", actorId: actorOutput.actorId });
1019
1020
  return { actorId: actorOutput.actorId };
1020
1021
  }
1022
+ function getActorNameFromQuery(query) {
1023
+ if ("getForId" in query) return query.getForId.name;
1024
+ if ("getForKey" in query) return query.getForKey.name;
1025
+ if ("getOrCreateForKey" in query) return query.getOrCreateForKey.name;
1026
+ if ("create" in query) return query.create.name;
1027
+ throw new InvalidRequest("Invalid query format");
1028
+ }
1029
+ async function checkForSchedulingError(group, code, actorId, query, driver) {
1030
+ const name = getActorNameFromQuery(query);
1031
+ try {
1032
+ const actor = await driver.getForId({ name, actorId });
1033
+ if (actor == null ? void 0 : actor.error) {
1034
+ logger().info({
1035
+ msg: "found actor scheduling error",
1036
+ actorId,
1037
+ error: actor.error
1038
+ });
1039
+ return new ActorSchedulingError(group, code, actorId, actor.error);
1040
+ }
1041
+ } catch (err) {
1042
+ logger().warn({
1043
+ msg: "failed to fetch actor details for scheduling error check",
1044
+ actorId,
1045
+ error: stringifyError(err)
1046
+ });
1047
+ }
1048
+ return null;
1049
+ }
1021
1050
 
1022
1051
  // src/client/actor-conn.ts
1023
1052
  var CONNECT_SYMBOL = Symbol("connect");
@@ -1232,9 +1261,9 @@ var ActorConnRaw = class {
1232
1261
  });
1233
1262
  }
1234
1263
  });
1235
- ws.addEventListener("close", (ev) => {
1264
+ ws.addEventListener("close", async (ev) => {
1236
1265
  try {
1237
- this.#handleOnClose(ev);
1266
+ await this.#handleOnClose(ev);
1238
1267
  } catch (err) {
1239
1268
  logger().error({
1240
1269
  msg: "error in websocket close handler",
@@ -1337,17 +1366,23 @@ var ActorConnRaw = class {
1337
1366
  message,
1338
1367
  metadata
1339
1368
  });
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(
1369
+ let errorToThrow = new ActorError(
1370
+ group,
1371
+ code,
1372
+ message,
1373
+ metadata
1374
+ );
1375
+ if (isSchedulingError(group, code) && this.#actorId) {
1376
+ const schedulingError = await checkForSchedulingError(
1346
1377
  group,
1347
1378
  code,
1348
- message,
1349
- metadata
1379
+ this.#actorId,
1380
+ this.#actorQuery,
1381
+ this.#driver
1350
1382
  );
1383
+ if (schedulingError) {
1384
+ errorToThrow = schedulingError;
1385
+ }
1351
1386
  }
1352
1387
  if (this.#onOpenPromise) {
1353
1388
  this.#onOpenPromise.reject(errorToThrow);
@@ -1356,9 +1391,7 @@ var ActorConnRaw = class {
1356
1391
  inFlight.reject(errorToThrow);
1357
1392
  this.#actionsInFlight.delete(id);
1358
1393
  }
1359
- if (errorToThrow instanceof ActorError) {
1360
- this.#dispatchActorError(errorToThrow);
1361
- }
1394
+ this.#dispatchActorError(errorToThrow);
1362
1395
  }
1363
1396
  } else if (response.body.tag === "ActionResponse") {
1364
1397
  const { id: actionId } = response.body.val;
@@ -1386,7 +1419,7 @@ var ActorConnRaw = class {
1386
1419
  }
1387
1420
  }
1388
1421
  /** Called by the onclose event from drivers. */
1389
- #handleOnClose(event) {
1422
+ async #handleOnClose(event) {
1390
1423
  const closeEvent = event;
1391
1424
  const wasClean = closeEvent.wasClean;
1392
1425
  const wasConnected = this.#connStatus === "connected";
@@ -1403,12 +1436,46 @@ var ActorConnRaw = class {
1403
1436
  this.#rejectPendingPromises(new ActorConnDisposed(), true);
1404
1437
  } else {
1405
1438
  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
- );
1439
+ let error;
1440
+ const reason = closeEvent.reason || "";
1441
+ const parsed = parseWebSocketCloseReason(reason);
1442
+ if (parsed) {
1443
+ const { group, code } = parsed;
1444
+ if (isSchedulingError(group, code) && this.#actorId) {
1445
+ const schedulingError = await checkForSchedulingError(
1446
+ group,
1447
+ code,
1448
+ this.#actorId,
1449
+ this.#actorQuery,
1450
+ this.#driver
1451
+ );
1452
+ if (schedulingError) {
1453
+ error = schedulingError;
1454
+ } else {
1455
+ error = new ActorError(
1456
+ group,
1457
+ code,
1458
+ `Connection closed: ${reason}`,
1459
+ void 0
1460
+ );
1461
+ }
1462
+ } else {
1463
+ error = new ActorError(
1464
+ group,
1465
+ code,
1466
+ `Connection closed: ${reason}`,
1467
+ void 0
1468
+ );
1469
+ }
1470
+ } else {
1471
+ error = new Error(
1472
+ `${wasClean ? "Connection closed" : "Connection lost"} (code: ${closeEvent.code}, reason: ${reason})`
1473
+ );
1474
+ }
1475
+ this.#rejectPendingPromises(error, false);
1476
+ if (error instanceof ActorError) {
1477
+ this.#dispatchActorError(error);
1478
+ }
1412
1479
  if (wasConnected) {
1413
1480
  logger().debug({
1414
1481
  msg: "triggering reconnect",
@@ -1488,36 +1555,6 @@ var ActorConnRaw = class {
1488
1555
  }
1489
1556
  }
1490
1557
  }
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
1558
  #addEventSubscription(eventName, callback, once) {
1522
1559
  const listener = {
1523
1560
  callback,
@@ -1976,12 +2013,14 @@ var ActorHandleRaw = class {
1976
2013
  * @template Response - The type of the response returned by the action function.
1977
2014
  */
1978
2015
  async action(opts) {
2016
+ let actorId;
1979
2017
  try {
1980
- const { actorId } = await queryActor(
2018
+ const result = await queryActor(
1981
2019
  void 0,
1982
2020
  this.#actorQuery,
1983
2021
  this.#driver
1984
2022
  );
2023
+ actorId = result.actorId;
1985
2024
  logger().debug({ msg: "found actor for action", actorId });
1986
2025
  invariant5(actorId, "Missing actor ID");
1987
2026
  logger().debug({
@@ -2030,6 +2069,18 @@ var ActorHandleRaw = class {
2030
2069
  {},
2031
2070
  true
2032
2071
  );
2072
+ if (actorId && isSchedulingError(group, code)) {
2073
+ const schedulingError = await checkForSchedulingError(
2074
+ group,
2075
+ code,
2076
+ actorId,
2077
+ this.#actorQuery,
2078
+ this.#driver
2079
+ );
2080
+ if (schedulingError) {
2081
+ throw schedulingError;
2082
+ }
2083
+ }
2033
2084
  throw new ActorError(group, code, message, metadata);
2034
2085
  }
2035
2086
  }
@@ -2407,7 +2458,7 @@ var ClientConfigSchemaBase = z2.object({
2407
2458
  *
2408
2459
  * Can also be set via RIVET_ENDPOINT environment variables.
2409
2460
  *
2410
- * Defaults to current origin + /api/rivet in browser, or localhost:6420 server-side.
2461
+ * Defaults to current origin + /api/rivet in browser, or 127.0.0.1:6420 server-side.
2411
2462
  */
2412
2463
  endpoint: z2.string().optional().transform(
2413
2464
  (val) => val ?? getRivetEngine() ?? getRivetEndpoint() ?? getDefaultEndpoint()
@@ -2430,8 +2481,8 @@ var ClientConfigSchemaBase = z2.object({
2430
2481
  /** Whether to enable RivetKit Devtools integration. */
2431
2482
  devtools: z2.boolean().default(
2432
2483
  () => {
2433
- var _a;
2434
- return typeof window !== "undefined" && ((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "localhost";
2484
+ var _a, _b;
2485
+ return typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window.location) == null ? void 0 : _b.hostname) === "localhost");
2435
2486
  }
2436
2487
  )
2437
2488
  });
@@ -2453,7 +2504,7 @@ function transformClientConfig(config, ctx) {
2453
2504
  };
2454
2505
  }
2455
2506
  function convertRegistryConfigToClientConfig(config) {
2456
- var _a;
2507
+ var _a, _b;
2457
2508
  return {
2458
2509
  endpoint: config.endpoint,
2459
2510
  token: config.token,
@@ -2464,7 +2515,7 @@ function convertRegistryConfigToClientConfig(config) {
2464
2515
  getUpgradeWebSocket: void 0,
2465
2516
  // We don't need health checks for internal clients
2466
2517
  disableMetadataLookup: true,
2467
- devtools: typeof window !== "undefined" && ((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "localhost"
2518
+ devtools: typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window == null ? void 0 : window.location) == null ? void 0 : _b.hostname) === "localhost")
2468
2519
  };
2469
2520
  }
2470
2521
 
@@ -4684,4 +4735,4 @@ export {
4684
4735
  RemoteManagerDriver,
4685
4736
  createClient
4686
4737
  };
4687
- //# sourceMappingURL=chunk-DSPZ7BZN.js.map
4738
+ //# sourceMappingURL=chunk-EEL32AJM.js.map