rivetkit 2.0.4 → 2.0.5

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 (109) hide show
  1. package/dist/tsup/actor/errors.cjs +2 -2
  2. package/dist/tsup/actor/errors.js +1 -1
  3. package/dist/tsup/{chunk-HLLF4B4Q.js → chunk-2MD57QF4.js} +7 -5
  4. package/dist/tsup/chunk-2MD57QF4.js.map +1 -0
  5. package/dist/tsup/{chunk-SBHHJ6QS.cjs → chunk-5QGQK44L.cjs} +2 -2
  6. package/dist/tsup/{chunk-SBHHJ6QS.cjs.map → chunk-5QGQK44L.cjs.map} +1 -1
  7. package/dist/tsup/{chunk-4CXBCT26.cjs → chunk-5YTI25C3.cjs} +7 -7
  8. package/dist/tsup/{chunk-4CXBCT26.cjs.map → chunk-5YTI25C3.cjs.map} +1 -1
  9. package/dist/tsup/{chunk-TQ62L3X7.js → chunk-B2QGJGZQ.js} +18 -5
  10. package/dist/tsup/chunk-B2QGJGZQ.js.map +1 -0
  11. package/dist/tsup/{chunk-PQY7KKTL.js → chunk-CFFKMUYH.js} +32 -7
  12. package/dist/tsup/{chunk-PQY7KKTL.js.map → chunk-CFFKMUYH.js.map} +1 -1
  13. package/dist/tsup/{chunk-H26RP6GD.js → chunk-CKA54YQN.js} +2 -2
  14. package/dist/tsup/chunk-D7NWUCRK.cjs +20 -0
  15. package/dist/tsup/{chunk-4R73YDN3.cjs.map → chunk-D7NWUCRK.cjs.map} +1 -1
  16. package/dist/tsup/{chunk-IH6CKNDW.cjs → chunk-FGFT4FVX.cjs} +9 -9
  17. package/dist/tsup/{chunk-IH6CKNDW.cjs.map → chunk-FGFT4FVX.cjs.map} +1 -1
  18. package/dist/tsup/{chunk-HI3HWJRC.js → chunk-I5VTWPHW.js} +4 -4
  19. package/dist/tsup/{chunk-HI3HWJRC.js.map → chunk-I5VTWPHW.js.map} +1 -1
  20. package/dist/tsup/{chunk-GICQ3YCU.cjs → chunk-IRMBWX36.cjs} +39 -37
  21. package/dist/tsup/chunk-IRMBWX36.cjs.map +1 -0
  22. package/dist/tsup/{chunk-XJQHKJ4P.js → chunk-L7QRXNWP.js} +331 -62
  23. package/dist/tsup/chunk-L7QRXNWP.js.map +1 -0
  24. package/dist/tsup/{chunk-LWNKVZG5.cjs → chunk-LZIBTLEY.cjs} +12 -12
  25. package/dist/tsup/{chunk-LWNKVZG5.cjs.map → chunk-LZIBTLEY.cjs.map} +1 -1
  26. package/dist/tsup/{chunk-VO7ZRVVD.cjs → chunk-MRZS2J4X.cjs} +581 -312
  27. package/dist/tsup/chunk-MRZS2J4X.cjs.map +1 -0
  28. package/dist/tsup/{chunk-QK72M5JB.js → chunk-PG3K2LI7.js} +2 -2
  29. package/dist/tsup/{chunk-QNNXFOQV.cjs → chunk-PHSQJ6QI.cjs} +3 -3
  30. package/dist/tsup/{chunk-QNNXFOQV.cjs.map → chunk-PHSQJ6QI.cjs.map} +1 -1
  31. package/dist/tsup/{chunk-WHBPJNGW.cjs → chunk-RM2SVURR.cjs} +29 -16
  32. package/dist/tsup/chunk-RM2SVURR.cjs.map +1 -0
  33. package/dist/tsup/{chunk-6LJT3QRL.cjs → chunk-WADSS5X4.cjs} +37 -12
  34. package/dist/tsup/chunk-WADSS5X4.cjs.map +1 -0
  35. package/dist/tsup/{chunk-LV2S3OU3.js → chunk-WNGOBAA7.js} +2 -2
  36. package/dist/tsup/{chunk-NFU2BBT5.js → chunk-YPZFLUO6.js} +2 -2
  37. package/dist/tsup/chunk-YPZFLUO6.js.map +1 -0
  38. package/dist/tsup/{chunk-3F2YSRJL.js → chunk-YW6Y6VNE.js} +4 -4
  39. package/dist/tsup/client/mod.cjs +10 -10
  40. package/dist/tsup/client/mod.d.cts +2 -2
  41. package/dist/tsup/client/mod.d.ts +2 -2
  42. package/dist/tsup/client/mod.js +9 -9
  43. package/dist/tsup/common/log.cjs +4 -4
  44. package/dist/tsup/common/log.js +3 -3
  45. package/dist/tsup/common/websocket.cjs +5 -5
  46. package/dist/tsup/common/websocket.js +4 -4
  47. package/dist/tsup/{connection-BI-6UIBJ.d.ts → connection-BvE-Oq7t.d.ts} +22 -11
  48. package/dist/tsup/{connection-Dyd4NLGW.d.cts → connection-DTzmWwU5.d.cts} +22 -11
  49. package/dist/tsup/driver-helpers/mod.cjs +6 -6
  50. package/dist/tsup/driver-helpers/mod.d.cts +2 -2
  51. package/dist/tsup/driver-helpers/mod.d.ts +2 -2
  52. package/dist/tsup/driver-helpers/mod.js +5 -5
  53. package/dist/tsup/driver-test-suite/mod.cjs +606 -140
  54. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  55. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  56. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  57. package/dist/tsup/driver-test-suite/mod.js +563 -97
  58. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  59. package/dist/tsup/inspector/mod.cjs +6 -6
  60. package/dist/tsup/inspector/mod.js +5 -5
  61. package/dist/tsup/mod.cjs +9 -9
  62. package/dist/tsup/mod.d.cts +3 -3
  63. package/dist/tsup/mod.d.ts +3 -3
  64. package/dist/tsup/mod.js +8 -8
  65. package/dist/tsup/{router-endpoints-BTe_Rsdn.d.cts → router-endpoints-CctffZNL.d.cts} +1 -1
  66. package/dist/tsup/{router-endpoints-CBSrKHmo.d.ts → router-endpoints-DFm1BglJ.d.ts} +1 -1
  67. package/dist/tsup/test/mod.cjs +10 -10
  68. package/dist/tsup/test/mod.d.cts +1 -1
  69. package/dist/tsup/test/mod.d.ts +1 -1
  70. package/dist/tsup/test/mod.js +9 -9
  71. package/dist/tsup/utils.cjs +5 -3
  72. package/dist/tsup/utils.cjs.map +1 -1
  73. package/dist/tsup/utils.d.cts +18 -1
  74. package/dist/tsup/utils.d.ts +18 -1
  75. package/dist/tsup/utils.js +4 -2
  76. package/package.json +4 -4
  77. package/src/actor/errors.ts +1 -1
  78. package/src/actor/router-endpoints.ts +6 -1
  79. package/src/actor/router.ts +2 -1
  80. package/src/client/mod.ts +1 -1
  81. package/src/client/raw-utils.ts +1 -1
  82. package/src/driver-test-suite/mod.ts +1 -1
  83. package/src/driver-test-suite/test-inline-client-driver.ts +588 -0
  84. package/src/driver-test-suite/tests/actor-error-handling.ts +4 -12
  85. package/src/driver-test-suite/tests/actor-inspector.ts +2 -1
  86. package/src/driver-test-suite/utils.ts +10 -9
  87. package/src/drivers/file-system/global-state.ts +3 -1
  88. package/src/drivers/file-system/manager.ts +16 -21
  89. package/src/manager/router.ts +373 -5
  90. package/src/registry/mod.ts +29 -33
  91. package/src/registry/run-config.ts +16 -1
  92. package/src/remote-manager-driver/actor-http-client.ts +3 -1
  93. package/src/remote-manager-driver/actor-websocket-client.ts +2 -1
  94. package/src/remote-manager-driver/api-utils.ts +4 -1
  95. package/src/remote-manager-driver/mod.ts +2 -1
  96. package/src/utils.ts +53 -0
  97. package/dist/tsup/chunk-4R73YDN3.cjs +0 -20
  98. package/dist/tsup/chunk-6LJT3QRL.cjs.map +0 -1
  99. package/dist/tsup/chunk-GICQ3YCU.cjs.map +0 -1
  100. package/dist/tsup/chunk-HLLF4B4Q.js.map +0 -1
  101. package/dist/tsup/chunk-NFU2BBT5.js.map +0 -1
  102. package/dist/tsup/chunk-TQ62L3X7.js.map +0 -1
  103. package/dist/tsup/chunk-VO7ZRVVD.cjs.map +0 -1
  104. package/dist/tsup/chunk-WHBPJNGW.cjs.map +0 -1
  105. package/dist/tsup/chunk-XJQHKJ4P.js.map +0 -1
  106. /package/dist/tsup/{chunk-H26RP6GD.js.map → chunk-CKA54YQN.js.map} +0 -0
  107. /package/dist/tsup/{chunk-QK72M5JB.js.map → chunk-PG3K2LI7.js.map} +0 -0
  108. /package/dist/tsup/{chunk-LV2S3OU3.js.map → chunk-WNGOBAA7.js.map} +0 -0
  109. /package/dist/tsup/{chunk-3F2YSRJL.js.map → chunk-YW6Y6VNE.js.map} +0 -0
@@ -1,12 +1,12 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class; var _class2;
2
2
 
3
- var _chunk4CXBCT26cjs = require('./chunk-4CXBCT26.cjs');
3
+ var _chunk5YTI25C3cjs = require('./chunk-5YTI25C3.cjs');
4
4
 
5
5
 
6
6
 
7
7
 
8
8
 
9
- var _chunk6LJT3QRLcjs = require('./chunk-6LJT3QRL.cjs');
9
+ var _chunkWADSS5X4cjs = require('./chunk-WADSS5X4.cjs');
10
10
 
11
11
 
12
12
 
@@ -17,7 +17,7 @@ var _chunk6LJT3QRLcjs = require('./chunk-6LJT3QRL.cjs');
17
17
 
18
18
 
19
19
 
20
- var _chunkSBHHJ6QScjs = require('./chunk-SBHHJ6QS.cjs');
20
+ var _chunk5QGQK44Lcjs = require('./chunk-5QGQK44L.cjs');
21
21
 
22
22
  // src/actor/connection.ts
23
23
  var _cborx = require('cbor-x'); var cbor2 = _interopRequireWildcard(_cborx); var cbor = _interopRequireWildcard(_cborx); var cbor4 = _interopRequireWildcard(_cborx); var cbor3 = _interopRequireWildcard(_cborx);
@@ -458,7 +458,7 @@ function encodingIsBinary(encoding) {
458
458
  } else if (encoding === "cbor" || encoding === "bare") {
459
459
  return true;
460
460
  } else {
461
- _chunk6LJT3QRLcjs.assertUnreachable.call(void 0, encoding);
461
+ _chunkWADSS5X4cjs.assertUnreachable.call(void 0, encoding);
462
462
  }
463
463
  }
464
464
  function contentTypeForEncoding(encoding) {
@@ -467,7 +467,7 @@ function contentTypeForEncoding(encoding) {
467
467
  } else if (encoding === "cbor" || encoding === "bare") {
468
468
  return "application/octet-stream";
469
469
  } else {
470
- _chunk6LJT3QRLcjs.assertUnreachable.call(void 0, encoding);
470
+ _chunkWADSS5X4cjs.assertUnreachable.call(void 0, encoding);
471
471
  }
472
472
  }
473
473
  function serializeWithEncoding(encoding, value, versionedDataHandler) {
@@ -481,7 +481,7 @@ function serializeWithEncoding(encoding, value, versionedDataHandler) {
481
481
  }
482
482
  return versionedDataHandler.serializeWithEmbeddedVersion(value);
483
483
  } else {
484
- _chunk6LJT3QRLcjs.assertUnreachable.call(void 0, encoding);
484
+ _chunkWADSS5X4cjs.assertUnreachable.call(void 0, encoding);
485
485
  }
486
486
  }
487
487
  function deserializeWithEncoding(encoding, buffer, versionedDataHandler) {
@@ -509,13 +509,13 @@ function deserializeWithEncoding(encoding, buffer, versionedDataHandler) {
509
509
  }
510
510
  return versionedDataHandler.deserializeWithEmbeddedVersion(buffer);
511
511
  } else {
512
- _chunk6LJT3QRLcjs.assertUnreachable.call(void 0, encoding);
512
+ _chunkWADSS5X4cjs.assertUnreachable.call(void 0, encoding);
513
513
  }
514
514
  }
515
515
 
516
516
  // src/actor/log.ts
517
517
  function loggerWithoutContext() {
518
- return _chunk4CXBCT26cjs.getLogger.call(void 0, "actor-runtime");
518
+ return _chunk5YTI25C3cjs.getLogger.call(void 0, "actor-runtime");
519
519
  }
520
520
 
521
521
  // src/actor/utils.ts
@@ -525,7 +525,7 @@ function assertUnreachable2(x) {
525
525
  value: `${x}`,
526
526
  stack: new Error().stack
527
527
  });
528
- throw new (0, _chunkSBHHJ6QScjs.Unreachable)(x);
528
+ throw new (0, _chunk5QGQK44Lcjs.Unreachable)(x);
529
529
  }
530
530
  var DeadlineError = class extends Error {
531
531
  constructor() {
@@ -714,7 +714,7 @@ var Conn = (_class = class {
714
714
  }
715
715
  #validateStateEnabled() {
716
716
  if (!this.#stateEnabled) {
717
- throw new (0, _chunkSBHHJ6QScjs.ConnStateNotEnabled)();
717
+ throw new (0, _chunk5QGQK44Lcjs.ConnStateNotEnabled)();
718
718
  }
719
719
  }
720
720
  /**
@@ -755,7 +755,7 @@ var Conn = (_class = class {
755
755
  tag: "Event",
756
756
  val: {
757
757
  name: eventName,
758
- args: _chunk6LJT3QRLcjs.bufferToArrayBuffer.call(void 0, cbor2.encode(args))
758
+ args: _chunkWADSS5X4cjs.bufferToArrayBuffer.call(void 0, cbor2.encode(args))
759
759
  }
760
760
  }
761
761
  },
@@ -930,7 +930,7 @@ var ActionContext = class {
930
930
 
931
931
  // src/manager/log.ts
932
932
  function logger() {
933
- return _chunk4CXBCT26cjs.getLogger.call(void 0, "actor-manager");
933
+ return _chunk5YTI25C3cjs.getLogger.call(void 0, "actor-manager");
934
934
  }
935
935
 
936
936
  // src/manager/hono-websocket-adapter.ts
@@ -1222,7 +1222,7 @@ function getValueLength(value) {
1222
1222
  } else if (value instanceof ArrayBuffer || value instanceof SharedArrayBuffer || value instanceof Uint8Array) {
1223
1223
  return value.byteLength;
1224
1224
  } else {
1225
- _chunk6LJT3QRLcjs.assertUnreachable.call(void 0, value);
1225
+ _chunkWADSS5X4cjs.assertUnreachable.call(void 0, value);
1226
1226
  }
1227
1227
  }
1228
1228
  async function inputDataToBuffer(data) {
@@ -1236,13 +1236,13 @@ async function inputDataToBuffer(data) {
1236
1236
  } else if (data instanceof ArrayBuffer || data instanceof SharedArrayBuffer) {
1237
1237
  return new Uint8Array(data);
1238
1238
  } else {
1239
- throw new (0, _chunkSBHHJ6QScjs.MalformedMessage)();
1239
+ throw new (0, _chunk5QGQK44Lcjs.MalformedMessage)();
1240
1240
  }
1241
1241
  }
1242
1242
  async function parseMessage(value, opts) {
1243
1243
  const length = getValueLength(value);
1244
1244
  if (length > opts.maxIncomingMessageSize) {
1245
- throw new (0, _chunkSBHHJ6QScjs.MessageTooLong)();
1245
+ throw new (0, _chunk5QGQK44Lcjs.MessageTooLong)();
1246
1246
  }
1247
1247
  let buffer = await inputDataToBuffer(value);
1248
1248
  if (buffer instanceof Buffer) {
@@ -1256,7 +1256,7 @@ async function processMessage(message, actor, conn, handler) {
1256
1256
  try {
1257
1257
  if (message.body.tag === "ActionRequest") {
1258
1258
  if (handler.onExecuteAction === void 0) {
1259
- throw new (0, _chunkSBHHJ6QScjs.Unsupported)("Action");
1259
+ throw new (0, _chunk5QGQK44Lcjs.Unsupported)("Action");
1260
1260
  }
1261
1261
  const { id, name, args: argsRaw } = message.body.val;
1262
1262
  actionId = id;
@@ -1286,7 +1286,7 @@ async function processMessage(message, actor, conn, handler) {
1286
1286
  tag: "ActionResponse",
1287
1287
  val: {
1288
1288
  id,
1289
- output: _chunk6LJT3QRLcjs.bufferToArrayBuffer.call(void 0, cbor3.encode(output))
1289
+ output: _chunkWADSS5X4cjs.bufferToArrayBuffer.call(void 0, cbor3.encode(output))
1290
1290
  }
1291
1291
  }
1292
1292
  },
@@ -1296,7 +1296,7 @@ async function processMessage(message, actor, conn, handler) {
1296
1296
  actor.rLog.debug({ msg: "action response sent", id, name });
1297
1297
  } else if (message.body.tag === "SubscriptionRequest") {
1298
1298
  if (handler.onSubscribe === void 0 || handler.onUnsubscribe === void 0) {
1299
- throw new (0, _chunkSBHHJ6QScjs.Unsupported)("Subscriptions");
1299
+ throw new (0, _chunk5QGQK44Lcjs.Unsupported)("Subscriptions");
1300
1300
  }
1301
1301
  const { eventName, subscribe } = message.body.val;
1302
1302
  actor.rLog.debug({
@@ -1315,10 +1315,10 @@ async function processMessage(message, actor, conn, handler) {
1315
1315
  subscribe
1316
1316
  });
1317
1317
  } else {
1318
- _chunk6LJT3QRLcjs.assertUnreachable.call(void 0, message.body);
1318
+ _chunkWADSS5X4cjs.assertUnreachable.call(void 0, message.body);
1319
1319
  }
1320
1320
  } catch (error) {
1321
- const { group, code, message: message2, metadata } = _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1321
+ const { group, code, message: message2, metadata } = _chunkWADSS5X4cjs.deconstructError.call(void 0,
1322
1322
  error,
1323
1323
  actor.rLog,
1324
1324
  {
@@ -1343,7 +1343,7 @@ async function processMessage(message, actor, conn, handler) {
1343
1343
  group,
1344
1344
  code,
1345
1345
  message: message2,
1346
- metadata: _chunk6LJT3QRLcjs.bufferToArrayBuffer.call(void 0, cbor3.encode(metadata)),
1346
+ metadata: _chunkWADSS5X4cjs.bufferToArrayBuffer.call(void 0, cbor3.encode(metadata)),
1347
1347
  actionId: _nullishCoalesce(actionId, () => ( null))
1348
1348
  }
1349
1349
  }
@@ -1369,7 +1369,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1369
1369
  } catch (error) {
1370
1370
  return {
1371
1371
  onOpen: (_evt, ws) => {
1372
- const { code } = _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1372
+ const { code } = _chunkWADSS5X4cjs.deconstructError.call(void 0,
1373
1373
  error,
1374
1374
  actor.rLog,
1375
1375
  {
@@ -1415,7 +1415,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1415
1415
  handlersResolve({ conn, actor, connId });
1416
1416
  } catch (error) {
1417
1417
  handlersReject(error);
1418
- const { code } = _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1418
+ const { code } = _chunkWADSS5X4cjs.deconstructError.call(void 0,
1419
1419
  error,
1420
1420
  actor.rLog,
1421
1421
  {
@@ -1436,7 +1436,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1436
1436
  maxIncomingMessageSize: runConfig.maxIncomingMessageSize
1437
1437
  }).then((message) => {
1438
1438
  actor2.processMessage(message, conn).catch((error) => {
1439
- const { code } = _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1439
+ const { code } = _chunkWADSS5X4cjs.deconstructError.call(void 0,
1440
1440
  error,
1441
1441
  actor2.rLog,
1442
1442
  {
@@ -1447,7 +1447,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1447
1447
  ws.close(1011, code);
1448
1448
  });
1449
1449
  }).catch((error) => {
1450
- const { code } = _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1450
+ const { code } = _chunkWADSS5X4cjs.deconstructError.call(void 0,
1451
1451
  error,
1452
1452
  actor2.rLog,
1453
1453
  {
@@ -1458,7 +1458,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1458
1458
  ws.close(1011, code);
1459
1459
  });
1460
1460
  }).catch((error) => {
1461
- const { code } = _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1461
+ const { code } = _chunkWADSS5X4cjs.deconstructError.call(void 0,
1462
1462
  error,
1463
1463
  actor.rLog,
1464
1464
  {
@@ -1503,7 +1503,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1503
1503
  }
1504
1504
  actor2.__removeConn(conn);
1505
1505
  }).catch((error) => {
1506
- _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1506
+ _chunkWADSS5X4cjs.deconstructError.call(void 0,
1507
1507
  error,
1508
1508
  actor.rLog,
1509
1509
  { wsEvent: "close" },
@@ -1515,7 +1515,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
1515
1515
  try {
1516
1516
  actor.rLog.warn({ msg: "websocket error" });
1517
1517
  } catch (error) {
1518
- _chunk6LJT3QRLcjs.deconstructError.call(void 0,
1518
+ _chunkWADSS5X4cjs.deconstructError.call(void 0,
1519
1519
  error,
1520
1520
  actor.rLog,
1521
1521
  { wsEvent: "error" },
@@ -1551,7 +1551,9 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId, authData) {
1551
1551
  authData
1552
1552
  );
1553
1553
  const abortResolver = Promise.withResolvers();
1554
- stream.onAbort(async () => {
1554
+ stream.onAbort(() => {
1555
+ });
1556
+ c.req.raw.signal.addEventListener("abort", async () => {
1555
1557
  const rLog = _nullishCoalesce((actor == null ? void 0 : actor.rLog), () => ( loggerWithoutContext()));
1556
1558
  try {
1557
1559
  rLog.debug("sse stream aborted");
@@ -1618,7 +1620,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId, aut
1618
1620
  }
1619
1621
  }
1620
1622
  const responseData = {
1621
- output: _chunk6LJT3QRLcjs.bufferToArrayBuffer.call(void 0, cbor4.encode(output))
1623
+ output: _chunkWADSS5X4cjs.bufferToArrayBuffer.call(void 0, cbor4.encode(output))
1622
1624
  };
1623
1625
  const serialized = serializeWithEncoding(
1624
1626
  encoding,
@@ -1640,10 +1642,10 @@ async function handleConnectionMessage(c, _runConfig, actorDriver, connId, connT
1640
1642
  const actor = await actorDriver.loadActor(actorId);
1641
1643
  const conn = actor.conns.get(connId);
1642
1644
  if (!conn) {
1643
- throw new (0, _chunkSBHHJ6QScjs.ConnNotFound)(connId);
1645
+ throw new (0, _chunk5QGQK44Lcjs.ConnNotFound)(connId);
1644
1646
  }
1645
1647
  if (conn._token !== connToken) {
1646
- throw new (0, _chunkSBHHJ6QScjs.IncorrectConnToken)();
1648
+ throw new (0, _chunk5QGQK44Lcjs.IncorrectConnToken)();
1647
1649
  }
1648
1650
  await actor.processMessage(message, conn);
1649
1651
  return c.json({});
@@ -1700,11 +1702,11 @@ async function handleRawWebSocketHandler(req, path, actorDriver, actorId, authDa
1700
1702
  function getRequestEncoding(req) {
1701
1703
  const encodingParam = req.header(HEADER_ENCODING);
1702
1704
  if (!encodingParam) {
1703
- throw new (0, _chunkSBHHJ6QScjs.InvalidEncoding)("undefined");
1705
+ throw new (0, _chunk5QGQK44Lcjs.InvalidEncoding)("undefined");
1704
1706
  }
1705
1707
  const result = EncodingSchema.safeParse(encodingParam);
1706
1708
  if (!result.success) {
1707
- throw new (0, _chunkSBHHJ6QScjs.InvalidEncoding)(encodingParam);
1709
+ throw new (0, _chunk5QGQK44Lcjs.InvalidEncoding)(encodingParam);
1708
1710
  }
1709
1711
  return result.data;
1710
1712
  }
@@ -1736,8 +1738,8 @@ function getRequestConnParams(req) {
1736
1738
  try {
1737
1739
  return JSON.parse(paramsParam);
1738
1740
  } catch (err) {
1739
- throw new (0, _chunkSBHHJ6QScjs.InvalidParams)(
1740
- `Invalid params JSON: ${_chunk6LJT3QRLcjs.stringifyError.call(void 0, err)}`
1741
+ throw new (0, _chunk5QGQK44Lcjs.InvalidParams)(
1742
+ `Invalid params JSON: ${_chunkWADSS5X4cjs.stringifyError.call(void 0, err)}`
1741
1743
  );
1742
1744
  }
1743
1745
  }
@@ -1789,4 +1791,4 @@ function getRequestConnParams(req) {
1789
1791
 
1790
1792
 
1791
1793
  exports.createVersionedDataHandler = createVersionedDataHandler; exports.TO_SERVER_VERSIONED = TO_SERVER_VERSIONED; exports.TO_CLIENT_VERSIONED = TO_CLIENT_VERSIONED; exports.HTTP_ACTION_REQUEST_VERSIONED = HTTP_ACTION_REQUEST_VERSIONED; exports.HTTP_ACTION_RESPONSE_VERSIONED = HTTP_ACTION_RESPONSE_VERSIONED; exports.HTTP_RESPONSE_ERROR_VERSIONED = HTTP_RESPONSE_ERROR_VERSIONED; exports.encodingIsBinary = encodingIsBinary; exports.contentTypeForEncoding = contentTypeForEncoding; exports.serializeWithEncoding = serializeWithEncoding; exports.deserializeWithEncoding = deserializeWithEncoding; exports.loggerWithoutContext = loggerWithoutContext; exports.assertUnreachable = assertUnreachable2; exports.DeadlineError = DeadlineError; exports.deadline = deadline; exports.generateRandomString = generateRandomString; exports.EncodingSchema = EncodingSchema; exports.CachedSerializer = CachedSerializer; exports.encodeDataToString = encodeDataToString; exports.jsonStringifyCompat = jsonStringifyCompat; exports.generateConnId = generateConnId; exports.generateConnToken = generateConnToken; exports.CONNECTION_DRIVER_WEBSOCKET = CONNECTION_DRIVER_WEBSOCKET; exports.CONNECTION_DRIVER_SSE = CONNECTION_DRIVER_SSE; exports.CONNECTION_DRIVER_HTTP = CONNECTION_DRIVER_HTTP; exports.CONNECTION_CHECK_LIVENESS_SYMBOL = CONNECTION_CHECK_LIVENESS_SYMBOL; exports.Conn = Conn; exports.logger = logger; exports.TransportSchema = TransportSchema; exports.inputDataToBuffer = inputDataToBuffer; exports.processMessage = processMessage; exports.handleWebSocketConnect = handleWebSocketConnect; exports.handleSseConnect = handleSseConnect; exports.handleAction = handleAction; exports.handleConnectionMessage = handleConnectionMessage; exports.handleRawWebSocketHandler = handleRawWebSocketHandler; exports.getRequestEncoding = getRequestEncoding; exports.getRequestExposeInternalError = getRequestExposeInternalError; exports.HEADER_ACTOR_QUERY = HEADER_ACTOR_QUERY; exports.HEADER_ENCODING = HEADER_ENCODING; exports.HEADER_CONN_PARAMS = HEADER_CONN_PARAMS; exports.HEADER_AUTH_DATA = HEADER_AUTH_DATA; exports.HEADER_ACTOR_ID = HEADER_ACTOR_ID; exports.HEADER_CONN_ID = HEADER_CONN_ID; exports.HEADER_CONN_TOKEN = HEADER_CONN_TOKEN; exports.ALLOWED_PUBLIC_HEADERS = ALLOWED_PUBLIC_HEADERS;
1792
- //# sourceMappingURL=chunk-GICQ3YCU.cjs.map
1794
+ //# sourceMappingURL=chunk-IRMBWX36.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-IRMBWX36.cjs","../../src/actor/connection.ts","../../src/common/versioned-data.ts","../schemas/client-protocol/v1.ts","../../src/schemas/client-protocol/versioned.ts","../../src/actor/protocol/serde.ts","../../src/serde.ts","../../src/actor/log.ts","../../src/actor/utils.ts","../../src/actor/router-endpoints.ts","../../src/actor/action.ts","../../src/manager/log.ts","../../src/manager/hono-websocket-adapter.ts","../../src/actor/protocol/old.ts"],"names":["config"],"mappings":"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","file":"/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-IRMBWX36.cjs","sourcesContent":[null,"import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { type ConnDriver, ConnectionReadyState } from \"./driver\";\nimport * as errors from \"./errors\";\nimport type { ActorInstance } from \"./instance\";\nimport { loggerWithoutContext } from \"./log\";\nimport type { PersistedConn } from \"./persisted\";\nimport { CachedSerializer } from \"./protocol/serde\";\nimport { generateSecureToken } from \"./utils\";\n\nexport function generateConnId(): string {\n\treturn crypto.randomUUID();\n}\n\nexport function generateConnToken(): string {\n\treturn generateSecureToken(32);\n}\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any>;\n\nexport const CONNECTION_DRIVER_WEBSOCKET = \"webSocket\";\nexport const CONNECTION_DRIVER_SSE = \"sse\";\nexport const CONNECTION_DRIVER_HTTP = \"http\";\n\nexport type ConnectionDriver =\n\t| typeof CONNECTION_DRIVER_WEBSOCKET\n\t| typeof CONNECTION_DRIVER_SSE\n\t| typeof CONNECTION_DRIVER_HTTP;\n\nexport type ConnectionStatus = \"connected\" | \"reconnecting\";\n\nexport const CONNECTION_CHECK_LIVENESS_SYMBOL = Symbol(\"checkLiveness\");\n\n/**\n * Represents a client connection to a actor.\n *\n * Manages connection-specific data and controls the connection lifecycle.\n *\n * @see {@link https://rivet.dev/docs/connections|Connection Documentation}\n */\nexport class Conn<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#stateEnabled: boolean;\n\n\t// TODO: Remove this cyclical reference\n\t#actor: ActorInstance<S, CP, CS, V, I, DB>;\n\n\t#status: ConnectionStatus = \"connected\";\n\n\t/**\n\t * The proxied state that notifies of changes automatically.\n\t *\n\t * Any data that should be stored indefinitely should be held within this object.\n\t */\n\t__persist: PersistedConn<CP, CS>;\n\n\t/**\n\t * Driver used to manage realtime connection communication.\n\t *\n\t * @protected\n\t */\n\t#driver: ConnDriver;\n\n\tpublic get params(): CP {\n\t\treturn this.__persist.params;\n\t}\n\n\tpublic get driver(): ConnectionDriver {\n\t\treturn this.__persist.connDriver as ConnectionDriver;\n\t}\n\n\tpublic get _stateEnabled() {\n\t\treturn this.#stateEnabled;\n\t}\n\n\t/**\n\t * Gets the current state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic get state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tif (!this.__persist.state) throw new Error(\"state should exists\");\n\t\treturn this.__persist.state;\n\t}\n\n\t/**\n\t * Sets the state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic set state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.__persist.state = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tpublic get id(): ConnId {\n\t\treturn this.__persist.connId;\n\t}\n\n\t/**\n\t * Token used to authenticate this request.\n\t */\n\tpublic get _token(): string {\n\t\treturn this.__persist.token;\n\t}\n\n\t/**\n\t * Status of the connection.\n\t */\n\tpublic get status(): ConnectionStatus {\n\t\treturn this.#status;\n\t}\n\n\t/**\n\t * Timestamp of the last time the connection was seen, i.e. the last time the connection was active and checked for liveness.\n\t */\n\tpublic get lastSeen(): number {\n\t\treturn this.__persist.lastSeen;\n\t}\n\n\t/**\n\t * Initializes a new instance of the Connection class.\n\t *\n\t * This should only be constructed by {@link Actor}.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB>,\n\t\tpersist: PersistedConn<CP, CS>,\n\t\tdriver: ConnDriver,\n\t\tstateEnabled: boolean,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.__persist = persist;\n\t\tthis.#driver = driver;\n\t\tthis.#stateEnabled = stateEnabled;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t/**\n\t * Sends a WebSocket message to the client.\n\t *\n\t * @param message - The message to send.\n\t *\n\t * @protected\n\t */\n\tpublic _sendMessage(message: CachedSerializer<protocol.ToClient>) {\n\t\tthis.#driver.sendMessage?.(\n\t\t\tthis.#actor,\n\t\t\tthis,\n\t\t\tthis.__persist.connDriverState,\n\t\t\tmessage,\n\t\t);\n\t}\n\n\t/**\n\t * Sends an event with arguments to the client.\n\t *\n\t * @param eventName - The name of the event.\n\t * @param args - The arguments for the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\tpublic send(eventName: string, ...args: unknown[]) {\n\t\tthis.#actor.inspector.emitter.emit(\"eventFired\", {\n\t\t\ttype: \"event\",\n\t\t\teventName,\n\t\t\targs,\n\t\t\tconnId: this.id,\n\t\t});\n\t\tthis._sendMessage(\n\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t{\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: eventName,\n\t\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Disconnects the client with an optional reason.\n\t *\n\t * @param reason - The reason for disconnection.\n\t */\n\tpublic async disconnect(reason?: string) {\n\t\tthis.#status = \"reconnecting\";\n\t\tawait this.#driver.disconnect(\n\t\t\tthis.#actor,\n\t\t\tthis,\n\t\t\tthis.__persist.connDriverState,\n\t\t\treason,\n\t\t);\n\t}\n\n\t/**\n\t * This method checks the connection's liveness by querying the driver for its ready state.\n\t * If the connection is not closed, it updates the last liveness timestamp and returns `true`.\n\t * Otherwise, it returns `false`.\n\t * @internal\n\t */\n\t[CONNECTION_CHECK_LIVENESS_SYMBOL]() {\n\t\tconst readyState = this.#driver.getConnectionReadyState(this.#actor, this);\n\n\t\tconst isConnectionClosed =\n\t\t\treadyState === ConnectionReadyState.CLOSED ||\n\t\t\treadyState === ConnectionReadyState.CLOSING ||\n\t\t\treadyState === undefined;\n\n\t\tconst newLastSeen = Date.now();\n\t\tconst newStatus = isConnectionClosed ? \"reconnecting\" : \"connected\";\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"liveness probe for connection\",\n\t\t\tconnId: this.id,\n\t\t\tactorId: this.#actor.id,\n\t\t\treadyState,\n\n\t\t\tstatus: this.#status,\n\t\t\tnewStatus,\n\n\t\t\tlastSeen: this.__persist.lastSeen,\n\t\t\tcurrentTs: newLastSeen,\n\t\t});\n\n\t\tif (!isConnectionClosed) {\n\t\t\tthis.__persist.lastSeen = newLastSeen;\n\t\t}\n\n\t\tthis.#status = newStatus;\n\t\treturn {\n\t\t\tstatus: this.#status,\n\t\t\tlastSeen: this.__persist.lastSeen,\n\t\t};\n\t}\n}\n","export interface VersionedData<T> {\n\tversion: number;\n\tdata: T;\n}\n\nexport type MigrationFn<TFrom, TTo> = (data: TFrom) => TTo;\n\nexport interface VersionedDataConfig<T> {\n\tcurrentVersion: number;\n\tmigrations: Map<number, MigrationFn<any, any>>;\n\tserializeVersion: (data: T) => Uint8Array;\n\tdeserializeVersion: (bytes: Uint8Array) => T;\n}\n\nexport class VersionedDataHandler<T> {\n\tconstructor(private config: VersionedDataConfig<T>) {}\n\n\tserializeWithEmbeddedVersion(data: T): Uint8Array {\n\t\tconst versioned: VersionedData<Uint8Array> = {\n\t\t\tversion: this.config.currentVersion,\n\t\t\tdata: this.config.serializeVersion(data),\n\t\t};\n\n\t\treturn this.embedVersion(versioned);\n\t}\n\n\tdeserializeWithEmbeddedVersion(bytes: Uint8Array): T {\n\t\tconst versioned = this.extractVersion(bytes);\n\t\treturn this.deserialize(versioned.data, versioned.version);\n\t}\n\n\tserialize(data: T, version: number): Uint8Array {\n\t\treturn this.config.serializeVersion(data);\n\t}\n\n\tdeserialize(bytes: Uint8Array, version: number): T {\n\t\tif (version === this.config.currentVersion) {\n\t\t\treturn this.config.deserializeVersion(bytes);\n\t\t}\n\n\t\tif (version > this.config.currentVersion) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot decode data from version ${version}, current version is ${this.config.currentVersion}`,\n\t\t\t);\n\t\t}\n\n\t\tlet currentData: any = this.config.deserializeVersion(bytes);\n\t\tlet currentVersion = version;\n\n\t\twhile (currentVersion < this.config.currentVersion) {\n\t\t\tconst migration = this.config.migrations.get(currentVersion);\n\t\t\tif (!migration) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No migration found from version ${currentVersion} to ${currentVersion + 1}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcurrentData = migration(currentData);\n\t\t\tcurrentVersion++;\n\t\t}\n\n\t\treturn currentData;\n\t}\n\n\tprivate embedVersion(data: VersionedData<Uint8Array>): Uint8Array {\n\t\tconst versionBytes = new Uint8Array(4);\n\t\tnew DataView(versionBytes.buffer).setUint32(0, data.version, true);\n\n\t\tconst result = new Uint8Array(versionBytes.length + data.data.length);\n\t\tresult.set(versionBytes);\n\t\tresult.set(data.data, versionBytes.length);\n\n\t\treturn result;\n\t}\n\n\tprivate extractVersion(bytes: Uint8Array): VersionedData<Uint8Array> {\n\t\tif (bytes.length < 4) {\n\t\t\tthrow new Error(\"Invalid versioned data: too short\");\n\t\t}\n\n\t\tconst version = new DataView(bytes.buffer, bytes.byteOffset).getUint32(\n\t\t\t0,\n\t\t\ttrue,\n\t\t);\n\t\tconst data = bytes.slice(4);\n\n\t\treturn { version, data };\n\t}\n}\n\nexport function createVersionedDataHandler<T>(\n\tconfig: VersionedDataConfig<T>,\n): VersionedDataHandler<T> {\n\treturn new VersionedDataHandler(config);\n}\n","import * as bare from \"@bare-ts/lib\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n readonly connectionToken: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n connectionToken: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n bare.writeString(bc, x.connectionToken)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n","import {\n\tcreateVersionedDataHandler,\n\ttype MigrationFn,\n} from \"@/common/versioned-data\";\nimport * as v1 from \"../../../dist/schemas/client-protocol/v1\";\n\nexport const CURRENT_VERSION = 1;\n\nconst migrations = new Map<number, MigrationFn<any, any>>();\n\nexport const TO_SERVER_VERSIONED = createVersionedDataHandler<v1.ToServer>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v1.encodeToServer(data),\n\tdeserializeVersion: (bytes) => v1.decodeToServer(bytes),\n});\n\nexport const TO_CLIENT_VERSIONED = createVersionedDataHandler<v1.ToClient>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v1.encodeToClient(data),\n\tdeserializeVersion: (bytes) => v1.decodeToClient(bytes),\n});\n\nexport const HTTP_ACTION_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpActionRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpActionRequest(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpActionRequest(bytes),\n\t});\n\nexport const HTTP_ACTION_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpActionResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpActionResponse(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpActionResponse(bytes),\n\t});\n\nexport const HTTP_RESPONSE_ERROR_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResponseError>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpResponseError(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpResponseError(bytes),\n\t});\n\nexport const HTTP_RESOLVE_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResolveRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (_) => new Uint8Array(),\n\t\tdeserializeVersion: (bytes) => null,\n\t});\n\nexport const HTTP_RESOLVE_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResolveResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpResolveResponse(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpResolveResponse(bytes),\n\t});\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport * as errors from \"@/actor/errors\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { loggerWithoutContext } from \"../log\";\nimport { assertUnreachable } from \"../utils\";\n\n/** Data that can be deserialized. */\nexport type InputData = string | Buffer | Blob | ArrayBufferLike | Uint8Array;\n\n/** Data that's been serialized. */\nexport type OutputData = string | Uint8Array;\n\nexport const EncodingSchema = z.enum([\"json\", \"cbor\", \"bare\"]);\n\n/**\n * Encoding used to communicate between the client & actor.\n */\nexport type Encoding = z.infer<typeof EncodingSchema>;\n\n/**\n * Helper class that helps serialize data without re-serializing for the same encoding.\n */\nexport class CachedSerializer<T> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<T>;\n\n\tconstructor(data: T, versionedDataHandler: VersionedDataHandler<T>) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t}\n\n\tpublic get rawData(): T {\n\t\treturn this.#data;\n\t}\n\n\tpublic serialize(encoding: Encoding): OutputData {\n\t\tconst cached = this.#cache.get(encoding);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t} else {\n\t\t\tconst serialized = serializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tthis.#data,\n\t\t\t\tthis.#versionedDataHandler,\n\t\t\t);\n\t\t\tthis.#cache.set(encoding, serialized);\n\t\t\treturn serialized;\n\t\t}\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tlogger().warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tlogger().warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n\n// TODO: Encode base 128\nfunction base64EncodeUint8Array(uint8Array: Uint8Array): string {\n\tlet binary = \"\";\n\tconst len = uint8Array.byteLength;\n\tfor (let i = 0; i < len; i++) {\n\t\tbinary += String.fromCharCode(uint8Array[i]);\n\t}\n\treturn btoa(binary);\n}\n\nfunction base64EncodeArrayBuffer(arrayBuffer: ArrayBuffer): string {\n\tconst uint8Array = new Uint8Array(arrayBuffer);\n\treturn base64EncodeUint8Array(uint8Array);\n}\n\n/** Converts data that was encoded to a string. Some formats (like SSE) don't support raw binary data. */\nexport function encodeDataToString(message: OutputData): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t} else if (message instanceof ArrayBuffer) {\n\t\treturn base64EncodeArrayBuffer(message);\n\t} else if (message instanceof Uint8Array) {\n\t\treturn base64EncodeUint8Array(message);\n\t} else {\n\t\tassertUnreachable(message);\n\t}\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) =>\n\t\ttypeof value === \"bigint\" ? value.toString() : value,\n\t);\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonStringifyCompat } from \"./actor/protocol/serde\";\n\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<T>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<T> | undefined,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\treturn jsonStringifyCompat(value);\n\t} else if (encoding === \"cbor\") {\n\t\treturn cbor.encode(value);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\"VersionedDataHandler is required for 'bare' encoding\");\n\t\t}\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(value);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<T>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<T> | undefined,\n): T {\n\tif (encoding === \"json\") {\n\t\tif (typeof buffer === \"string\") {\n\t\t\treturn JSON.parse(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\treturn JSON.parse(jsonString);\n\t\t}\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\treturn cbor.decode(buffer);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\"VersionedDataHandler is required for 'bare' encoding\");\n\t\t}\n\t\treturn versionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import * as errors from \"./errors\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tloggerWithoutContext().error({\n\t\tmsg: \"unreachable\",\n\t\tvalue: `${x}`,\n\t\tstack: new Error().stack,\n\t});\n\tthrow new errors.Unreachable(x);\n}\n\nexport const throttle = <\n\t// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function\n\tFn extends (...args: any) => any,\n>(\n\tfn: Fn,\n\tdelay: number,\n) => {\n\tlet lastRan = false;\n\tlet lastArgs: Parameters<Fn> | null = null;\n\n\treturn (...args: Parameters<Fn>) => {\n\t\tif (!lastRan) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastRan = true;\n\t\t\tconst timer = () =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tlastRan = false;\n\t\t\t\t\tif (lastArgs) {\n\t\t\t\t\t\tfn.apply(this, lastArgs);\n\t\t\t\t\t\tlastRan = true;\n\t\t\t\t\t\tlastArgs = null;\n\t\t\t\t\t\ttimer();\n\t\t\t\t\t}\n\t\t\t\t}, delay);\n\t\t\ttimer();\n\t\t} else lastArgs = args;\n\t};\n};\n\nexport class DeadlineError extends Error {\n\tconstructor() {\n\t\tsuper(\"Promise did not complete before deadline.\");\n\t}\n}\n\nexport function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\t// Set a timeout to abort the operation\n\tconst timeoutId = setTimeout(() => controller.abort(), timeout);\n\n\treturn Promise.race<T>([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) => {\n\t\t\tsignal.addEventListener(\"abort\", () => reject(new DeadlineError()));\n\t\t}),\n\t]).finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n}\n\nexport class Lock<T> {\n\tprivate _locked = false;\n\tprivate _waiting: Array<() => void> = [];\n\n\tconstructor(private _value: T) {}\n\n\tasync lock(fn: (value: T) => Promise<void>): Promise<void> {\n\t\tif (this._locked) {\n\t\t\tawait new Promise<void>((resolve) => this._waiting.push(resolve));\n\t\t}\n\t\tthis._locked = true;\n\n\t\ttry {\n\t\t\tawait fn(this._value);\n\t\t} finally {\n\t\t\tthis._locked = false;\n\t\t\tconst next = this._waiting.shift();\n\t\t\tif (next) next();\n\t\t}\n\t}\n}\n\nexport function generateSecureToken(length = 32) {\n\tconst array = new Uint8Array(length);\n\tcrypto.getRandomValues(array);\n\treturn btoa(String.fromCharCode(...array));\n}\n\nexport function generateRandomString(length = 32) {\n\tconst characters =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tconst randomIndex = Math.floor(Math.random() * characters.length);\n\t\tresult += characters[randomIndex];\n\t}\n\treturn result;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, HonoRequest } from \"hono\";\nimport { type SSEStreamingApi, streamSSE } from \"hono/streaming\";\nimport type { WSContext } from \"hono/ws\";\nimport { ActionContext } from \"@/actor/action\";\nimport type { AnyConn } from \"@/actor/connection\";\nimport {\n\tCONNECTION_DRIVER_HTTP,\n\tCONNECTION_DRIVER_SSE,\n\tCONNECTION_DRIVER_WEBSOCKET,\n\tgenerateConnId,\n\tgenerateConnToken,\n} from \"@/actor/connection\";\nimport * as errors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance\";\nimport type { InputData } from \"@/actor/protocol/serde\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport type { UpgradeWebSocketArgs } from \"@/common/inline-websocket-adapter2\";\nimport { deconstructError, stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { HonoWebSocketAdapter } from \"@/manager/hono-websocket-adapter\";\nimport type { RunConfig } from \"@/registry/run-config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tHTTP_ACTION_REQUEST_VERSIONED,\n\tHTTP_ACTION_RESPONSE_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDriver } from \"./driver\";\nimport type {\n\tGenericHttpDriverState,\n\tGenericSseDriverState,\n\tGenericWebSocketDriverState,\n} from \"./generic-conn-driver\";\nimport { loggerWithoutContext } from \"./log\";\nimport { parseMessage } from \"./protocol/old\";\n\nexport interface ConnectWebSocketOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tactorId: string;\n\tparams: unknown;\n\tauthData: unknown;\n}\n\nexport interface ConnectWebSocketOutput {\n\tonOpen: (ws: WSContext) => void;\n\tonMessage: (message: protocol.ToServer) => void;\n\tonClose: () => void;\n}\n\nexport interface ConnectSseOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tparams: unknown;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ConnectSseOutput {\n\tonOpen: (stream: SSEStreamingApi) => void;\n\tonClose: () => Promise<void>;\n}\n\nexport interface ActionOpts {\n\treq?: HonoRequest;\n\tparams: unknown;\n\tactionName: string;\n\tactionArgs: unknown[];\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ActionOutput {\n\toutput: unknown;\n}\n\nexport interface ConnsMessageOpts {\n\treq?: HonoRequest;\n\tconnId: string;\n\tconnToken: string;\n\tmessage: protocol.ToServer;\n\tactorId: string;\n}\n\nexport interface FetchOpts {\n\trequest: Request;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface WebSocketOpts {\n\trequest: Request;\n\twebsocket: UniversalWebSocket;\n\tactorId: string;\n\tauthData: unknown;\n}\n\n/**\n * Creates a WebSocket connection handler\n */\nexport async function handleWebSocketConnect(\n\treq: Request | undefined,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tencoding: Encoding,\n\tparameters: unknown,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst exposeInternalError = req ? getRequestExposeInternalError(req) : false;\n\n\t// Setup promise for the init handlers since all other behavior depends on this\n\tconst {\n\t\tpromise: handlersPromise,\n\t\tresolve: handlersResolve,\n\t\treject: handlersReject,\n\t} = Promise.withResolvers<{\n\t\tconn: AnyConn;\n\t\tactor: AnyActorInstance;\n\t\tconnId: string;\n\t}>();\n\n\t// Pre-load the actor to catch errors early\n\tlet actor: AnyActorInstance;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\t} catch (error) {\n\t\t// Return handler that immediately closes with error\n\t\treturn {\n\t\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tactor.rLog,\n\t\t\t\t\t{\n\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t},\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t\tws.close(1011, code);\n\t\t\t},\n\t\t\tonMessage: (_evt: { data: any }, ws: WSContext) => {\n\t\t\t\tws.close(1011, \"Actor not loaded\");\n\t\t\t},\n\t\t\tonClose: (_event: any, _ws: WSContext) => {},\n\t\t\tonError: (_error: unknown) => {},\n\t\t};\n\t}\n\n\treturn {\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tactor.rLog.debug(\"websocket open\");\n\n\t\t\t// Run async operations in background\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst connId = generateConnId();\n\t\t\t\t\tconst connToken = generateConnToken();\n\t\t\t\t\tconst connState = await actor.prepareConn(parameters, req);\n\n\t\t\t\t\t// Save socket\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconnGlobalState.websockets.set(connId, ws);\n\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\tmsg: \"registered websocket for conn\",\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Create connection\n\t\t\t\t\tconst conn = await actor.createConn(\n\t\t\t\t\t\tconnId,\n\t\t\t\t\t\tconnToken,\n\t\t\t\t\t\tparameters,\n\t\t\t\t\t\tconnState,\n\t\t\t\t\t\tCONNECTION_DRIVER_WEBSOCKET,\n\t\t\t\t\t\t{ encoding } satisfies GenericWebSocketDriverState,\n\t\t\t\t\t\tauthData,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Unblock other handlers\n\t\t\t\t\thandlersResolve({ conn, actor, connId });\n\t\t\t\t} catch (error) {\n\t\t\t\t\thandlersReject(error);\n\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\tonMessage: (evt: { data: any }, ws: WSContext) => {\n\t\t\t// Handle message asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor }) => {\n\t\t\t\t\tactor.rLog.debug({ msg: \"received message\" });\n\n\t\t\t\t\tconst value = evt.data.valueOf() as InputData;\n\t\t\t\t\tparseMessage(value, {\n\t\t\t\t\t\tencoding: encoding,\n\t\t\t\t\t\tmaxIncomingMessageSize: runConfig.maxIncomingMessageSize,\n\t\t\t\t\t})\n\t\t\t\t\t\t.then((message) => {\n\t\t\t\t\t\t\tactor.processMessage(message, conn).catch((error) => {\n\t\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t});\n\t\t},\n\t\tonClose: (\n\t\t\tevent: {\n\t\t\t\twasClean: boolean;\n\t\t\t\tcode: number;\n\t\t\t\treason: string;\n\t\t\t},\n\t\t\tws: WSContext,\n\t\t) => {\n\t\t\tif (event.wasClean) {\n\t\t\t\tactor.rLog.info({\n\t\t\t\t\tmsg: \"websocket closed\",\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tactor.rLog.warn({\n\t\t\t\t\tmsg: \"websocket closed\",\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t\tws.close(1000, \"hack_force_close\");\n\n\t\t\t// Handle cleanup asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor, connId }) => {\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconst didDelete = connGlobalState.websockets.delete(connId);\n\t\t\t\t\tif (didDelete) {\n\t\t\t\t\t\tactor.rLog.info({\n\t\t\t\t\t\t\tmsg: \"removing websocket for conn\",\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tactor.rLog.warn({\n\t\t\t\t\t\t\tmsg: \"websocket does not exist for conn\",\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tdeconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t{ wsEvent: \"close\" },\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t},\n\t\tonError: (_error: unknown) => {\n\t\t\ttry {\n\t\t\t\t// Actors don't need to know about this, since it's abstracted away\n\t\t\t\tactor.rLog.warn({ msg: \"websocket error\" });\n\t\t\t} catch (error) {\n\t\t\t\tdeconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tactor.rLog,\n\t\t\t\t\t{ wsEvent: \"error\" },\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Creates an SSE connection handler\n */\nexport async function handleSseConnect(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Return the main handler with all async work inside\n\treturn streamSSE(c, async (stream) => {\n\t\tlet actor: AnyActorInstance | undefined;\n\t\tlet connId: string | undefined;\n\t\tlet connToken: string | undefined;\n\t\tlet connState: unknown;\n\t\tlet conn: AnyConn | undefined;\n\n\t\ttry {\n\t\t\t// Do all async work inside the handler\n\t\t\tactor = await actorDriver.loadActor(actorId);\n\t\t\tconnId = generateConnId();\n\t\t\tconnToken = generateConnToken();\n\t\t\tconnState = await actor.prepareConn(parameters, c.req.raw);\n\n\t\t\tactor.rLog.debug(\"sse open\");\n\n\t\t\t// Save stream\n\t\t\tactorDriver\n\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t.sseStreams.set(connId, stream);\n\n\t\t\t// Create connection\n\t\t\tconn = await actor.createConn(\n\t\t\t\tconnId,\n\t\t\t\tconnToken,\n\t\t\t\tparameters,\n\t\t\t\tconnState,\n\t\t\t\tCONNECTION_DRIVER_SSE,\n\t\t\t\t{ encoding } satisfies GenericSseDriverState,\n\t\t\t\tauthData,\n\t\t\t);\n\n\t\t\t// Wait for close\n\t\t\tconst abortResolver = Promise.withResolvers();\n\n\t\t\t// HACK: This is required so the abort handler below works\n\t\t\t//\n\t\t\t// See https://github.com/honojs/hono/issues/1770#issuecomment-2461966225\n\t\t\tstream.onAbort(() => {});\n\n\t\t\t// Handle stream abort (when client closes the connection)\n\t\t\tc.req.raw.signal.addEventListener(\"abort\", async () => {\n\t\t\t\tconst rLog = actor?.rLog ?? loggerWithoutContext();\n\t\t\t\ttry {\n\t\t\t\t\trLog.debug(\"sse stream aborted\");\n\n\t\t\t\t\t// Cleanup\n\t\t\t\t\tif (connId) {\n\t\t\t\t\t\tactorDriver\n\t\t\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t\t\t}\n\t\t\t\t\tif (conn && actor) {\n\t\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t} catch (error) {\n\t\t\t\t\trLog.error({ msg: \"error closing sse connection\", error });\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// HACK: Will throw if not configured\n\t\t\ttry {\n\t\t\t\tc.executionCtx.waitUntil(abortResolver.promise);\n\t\t\t} catch {}\n\n\t\t\t// Wait until connection aborted\n\t\t\tawait abortResolver.promise;\n\t\t} catch (error) {\n\t\t\tloggerWithoutContext().error({ msg: \"error in sse connection\", error });\n\n\t\t\t// Cleanup on error\n\t\t\tif (connId !== undefined) {\n\t\t\t\tactorDriver\n\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t}\n\t\t\tif (conn && actor !== undefined) {\n\t\t\t\tactor.__removeConn(conn);\n\t\t\t}\n\n\t\t\t// Close the stream on error\n\t\t\tstream.close();\n\t\t}\n\t});\n}\n\n/**\n * Creates an action handler\n */\nexport async function handleAction(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactionName: string,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_ACTION_REQUEST_VERSIONED,\n\t);\n\tconst actionArgs = cbor.decode(new Uint8Array(request.args));\n\n\t// Invoke the action\n\tlet actor: AnyActorInstance | undefined;\n\tlet conn: AnyConn | undefined;\n\tlet output: unknown | undefined;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\n\t\tactor.rLog.debug({ msg: \"handling action\", actionName, encoding });\n\n\t\t// Create conn\n\t\tconst connState = await actor.prepareConn(parameters, c.req.raw);\n\t\tconn = await actor.createConn(\n\t\t\tgenerateConnId(),\n\t\t\tgenerateConnToken(),\n\t\t\tparameters,\n\t\t\tconnState,\n\t\t\tCONNECTION_DRIVER_HTTP,\n\t\t\t{} satisfies GenericHttpDriverState,\n\t\t\tauthData,\n\t\t);\n\n\t\t// Call action\n\t\tconst ctx = new ActionContext(actor.actorContext!, conn!);\n\t\toutput = await actor.executeAction(ctx, actionName, actionArgs);\n\t} finally {\n\t\tif (conn) {\n\t\t\tactor?.__removeConn(conn);\n\t\t}\n\t}\n\n\t// Send response\n\tconst responseData: protocol.HttpActionResponse = {\n\t\toutput: bufferToArrayBuffer(cbor.encode(output)),\n\t};\n\tconst serialized = serializeWithEncoding(\n\t\tencoding,\n\t\tresponseData,\n\t\tHTTP_ACTION_RESPONSE_VERSIONED,\n\t);\n\treturn c.body(serialized as Uint8Array, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\n/**\n * Create a connection message handler\n */\nexport async function handleConnectionMessage(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tconnId: string,\n\tconnToken: string,\n\tactorId: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\tconst message = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tTO_SERVER_VERSIONED,\n\t);\n\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Find connection\n\tconst conn = actor.conns.get(connId);\n\tif (!conn) {\n\t\tthrow new errors.ConnNotFound(connId);\n\t}\n\n\t// Authenticate connection\n\tif (conn._token !== connToken) {\n\t\tthrow new errors.IncorrectConnToken();\n\t}\n\n\t// Process message\n\tawait actor.processMessage(message, conn);\n\n\treturn c.json({});\n}\n\nexport async function handleRawWebSocketHandler(\n\treq: Request | undefined,\n\tpath: string,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Return WebSocket event handlers\n\treturn {\n\t\tonOpen: (_evt: any, ws: any) => {\n\t\t\t// Wrap the Hono WebSocket in our adapter\n\t\t\tconst adapter = new HonoWebSocketAdapter(ws);\n\n\t\t\t// Store adapter reference on the WebSocket for event handlers\n\t\t\t(ws as any).__adapter = adapter;\n\n\t\t\t// Extract the path after prefix and preserve query parameters\n\t\t\t// Use URL API for cleaner parsing\n\t\t\tconst url = new URL(path, \"http://actor\");\n\t\t\tconst pathname = url.pathname.replace(/^\\/raw\\/websocket\\/?/, \"\") || \"/\";\n\t\t\tconst normalizedPath =\n\t\t\t\t(pathname.startsWith(\"/\") ? pathname : \"/\" + pathname) + url.search;\n\n\t\t\tlet newRequest: Request;\n\t\t\tif (req) {\n\t\t\t\tnewRequest = new Request(`http://actor${normalizedPath}`, req);\n\t\t\t} else {\n\t\t\t\tnewRequest = new Request(`http://actor${normalizedPath}`, {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"rewriting websocket url\",\n\t\t\t\tfrom: path,\n\t\t\t\tto: newRequest.url,\n\t\t\t\tpathname: url.pathname,\n\t\t\t\tsearch: url.search,\n\t\t\t\tnormalizedPath,\n\t\t\t});\n\n\t\t\t// Call the actor's onWebSocket handler with the adapted WebSocket\n\t\t\tactor.handleWebSocket(adapter, {\n\t\t\t\trequest: newRequest,\n\t\t\t});\n\t\t},\n\t\tonMessage: (event: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleMessage(event);\n\t\t\t}\n\t\t},\n\t\tonClose: (evt: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleClose(evt?.code || 1006, evt?.reason || \"\");\n\t\t\t}\n\t\t},\n\t\tonError: (error: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleError(error);\n\t\t\t}\n\t\t},\n\t};\n}\n\n// Helper to get the connection encoding from a request\nexport function getRequestEncoding(req: HonoRequest): Encoding {\n\tconst encodingParam = req.header(HEADER_ENCODING);\n\tif (!encodingParam) {\n\t\tthrow new errors.InvalidEncoding(\"undefined\");\n\t}\n\n\tconst result = EncodingSchema.safeParse(encodingParam);\n\tif (!result.success) {\n\t\tthrow new errors.InvalidEncoding(encodingParam as string);\n\t}\n\n\treturn result.data;\n}\n\nexport function getRequestExposeInternalError(_req: Request): boolean {\n\t// Unipmlemented\n\treturn false;\n}\n\nexport function getRequestQuery(c: HonoContext): unknown {\n\t// Get query parameters for actor lookup\n\tconst queryParam = c.req.header(HEADER_ACTOR_QUERY);\n\tif (!queryParam) {\n\t\tloggerWithoutContext().error({ msg: \"missing query parameter\" });\n\t\tthrow new errors.InvalidRequest(\"missing query\");\n\t}\n\n\t// Parse the query JSON and validate with schema\n\ttry {\n\t\tconst parsed = JSON.parse(queryParam);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tloggerWithoutContext().error({ msg: \"invalid query json\", error });\n\t\tthrow new errors.InvalidQueryJSON(error);\n\t}\n}\n\nexport const HEADER_ACTOR_QUERY = \"X-RivetKit-Query\";\n\nexport const HEADER_ENCODING = \"X-RivetKit-Encoding\";\n\n// IMPORTANT: Params must be in headers or in an E2EE part of the request (i.e. NOT the URL or query string) in order to ensure that tokens can be securely passed in params.\nexport const HEADER_CONN_PARAMS = \"X-RivetKit-Conn-Params\";\n\n// Internal header\nexport const HEADER_AUTH_DATA = \"X-RivetKit-Auth-Data\";\n\nexport const HEADER_ACTOR_ID = \"X-RivetKit-Actor\";\n\nexport const HEADER_CONN_ID = \"X-RivetKit-Conn\";\n\nexport const HEADER_CONN_TOKEN = \"X-RivetKit-Conn-Token\";\n\n/**\n * Headers that publics can send from public clients.\n *\n * Used for CORS.\n **/\nexport const ALLOWED_PUBLIC_HEADERS = [\n\t\"Content-Type\",\n\t\"User-Agent\",\n\tHEADER_ACTOR_QUERY,\n\tHEADER_ENCODING,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ACTOR_ID,\n\tHEADER_CONN_ID,\n\tHEADER_CONN_TOKEN,\n];\n\n// Helper to get connection parameters for the request\nexport function getRequestConnParams(req: HonoRequest): unknown {\n\tconst paramsParam = req.header(HEADER_CONN_PARAMS);\n\tif (!paramsParam) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(paramsParam);\n\t} catch (err) {\n\t\tthrow new errors.InvalidParams(\n\t\t\t`Invalid params JSON: ${stringifyError(err)}`,\n\t\t);\n\t}\n}\n","import type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport type { Logger } from \"@/common/log\";\nimport type { Registry } from \"@/registry/mod\";\nimport type { Conn, ConnId } from \"./connection\";\nimport type { ActorContext } from \"./context\";\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"./database\";\nimport type { SaveStateOptions } from \"./instance\";\nimport type { Schedule } from \"./schedule\";\n\n/**\n * Context for a remote procedure call.\n *\n * @typeParam A Actor this action belongs to\n */\nexport class ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\t#actorContext: ActorContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\n\t/**\n\t * Should not be called directly.\n\t *\n\t * @param actorContext - The actor context\n\t * @param conn - The connection associated with the action\n\t */\n\tconstructor(\n\t\tactorContext: ActorContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tpublic readonly conn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) {\n\t\tthis.#actorContext = actorContext;\n\t}\n\n\t/**\n\t * Get the actor state\n\t */\n\tget state(): TState {\n\t\treturn this.#actorContext.state;\n\t}\n\n\t/**\n\t * Get the actor variables\n\t */\n\tget vars(): TVars {\n\t\treturn this.#actorContext.vars;\n\t}\n\n\t/**\n\t * Broadcasts an event to all connected clients.\n\t */\n\tbroadcast(name: string, ...args: any[]): void {\n\t\tthis.#actorContext.broadcast(name, ...args);\n\t}\n\n\t/**\n\t * Gets the logger instance.\n\t */\n\tget log(): Logger {\n\t\treturn this.#actorContext.log;\n\t}\n\n\t/**\n\t * Gets actor ID.\n\t */\n\tget actorId(): string {\n\t\treturn this.#actorContext.actorId;\n\t}\n\n\t/**\n\t * Gets the actor name.\n\t */\n\tget name(): string {\n\t\treturn this.#actorContext.name;\n\t}\n\n\t/**\n\t * Gets the actor key.\n\t */\n\tget key(): ActorKey {\n\t\treturn this.#actorContext.key;\n\t}\n\n\t/**\n\t * Gets the region.\n\t */\n\tget region(): string {\n\t\treturn this.#actorContext.region;\n\t}\n\n\t/**\n\t * Gets the scheduler.\n\t */\n\tget schedule(): Schedule {\n\t\treturn this.#actorContext.schedule;\n\t}\n\n\t/**\n\t * Gets the map of connections.\n\t */\n\tget conns(): Map<\n\t\tConnId,\n\t\tConn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>\n\t> {\n\t\treturn this.#actorContext.conns;\n\t}\n\n\t/**\n\t * Returns the client for the given registry.\n\t */\n\tclient<R extends Registry<any>>(): Client<R> {\n\t\treturn this.#actorContext.client<R>();\n\t}\n\n\t/**\n\t * @experimental\n\t */\n\tget db(): InferDatabaseClient<TDatabase> {\n\t\treturn this.#actorContext.db;\n\t}\n\n\t/**\n\t * Forces the state to get saved.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\treturn this.#actorContext.saveState(opts);\n\t}\n\n\t/**\n\t * Prevents the actor from sleeping until promise is complete.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#actorContext.waitUntil(promise);\n\t}\n\n\t/**\n\t * AbortSignal that fires when the actor is stopping.\n\t */\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#actorContext.abortSignal;\n\t}\n\n\t/**\n\t * Forces the actor to sleep.\n\t *\n\t * Not supported on all drivers.\n\t *\n\t * @experimental\n\t */\n\tsleep() {\n\t\tthis.#actorContext.sleep();\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-manager\");\n}\n","import type { WSContext } from \"hono/ws\";\nimport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { logger } from \"./log\";\n\n/**\n * HonoWebSocketAdapter provides a WebSocket-like interface over WSContext\n * for raw WebSocket handling in actors\n */\nexport class HonoWebSocketAdapter implements UniversalWebSocket {\n\t// WebSocket readyState values\n\treadonly CONNECTING = 0 as const;\n\treadonly OPEN = 1 as const;\n\treadonly CLOSING = 2 as const;\n\treadonly CLOSED = 3 as const;\n\n\t#ws: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 1; // Start as OPEN since WSContext is already connected\n\t#eventListeners: Map<string, Set<(event: any) => void>> = new Map();\n\t#closeCode?: number;\n\t#closeReason?: string;\n\n\tconstructor(ws: WSContext) {\n\t\tthis.#ws = ws;\n\n\t\t// The WSContext is already open when we receive it\n\t\tthis.#readyState = this.OPEN;\n\n\t\t// Immediately fire the open event\n\t\tsetTimeout(() => {\n\t\t\tthis.#fireEvent(\"open\", { type: \"open\", target: this });\n\t\t}, 0);\n\t}\n\n\tget readyState(): 0 | 1 | 2 | 3 {\n\t\treturn this.#readyState;\n\t}\n\n\tget binaryType(): \"arraybuffer\" | \"blob\" {\n\t\treturn \"arraybuffer\";\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\t// Ignored for now - always use arraybuffer\n\t}\n\n\tget bufferedAmount(): number {\n\t\treturn 0; // Not tracked in WSContext\n\t}\n\n\tget extensions(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tget protocol(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tget url(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n\t\tif (this.readyState !== this.OPEN) {\n\t\t\tthrow new Error(\"WebSocket is not open\");\n\t\t}\n\n\t\ttry {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"bridge sending data\",\n\t\t\t\tdataType: typeof data,\n\t\t\t\tisString: typeof data === \"string\",\n\t\t\t\tisArrayBuffer: data instanceof ArrayBuffer,\n\t\t\t\tdataStr:\n\t\t\t\t\ttypeof data === \"string\" ? data.substring(0, 100) : \"<non-string>\",\n\t\t\t});\n\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\t(this.#ws as any).send(data);\n\t\t\t} else if (data instanceof ArrayBuffer) {\n\t\t\t\t(this.#ws as any).send(data);\n\t\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\t\t// Convert ArrayBufferView to ArrayBuffer\n\t\t\t\tconst buffer = data.buffer.slice(\n\t\t\t\t\tdata.byteOffset,\n\t\t\t\t\tdata.byteOffset + data.byteLength,\n\t\t\t\t);\n\t\t\t\t// Check if it's a SharedArrayBuffer and convert to ArrayBuffer\n\t\t\t\tif (buffer instanceof SharedArrayBuffer) {\n\t\t\t\t\tconst arrayBuffer = new ArrayBuffer(buffer.byteLength);\n\t\t\t\t\tnew Uint8Array(arrayBuffer).set(new Uint8Array(buffer));\n\t\t\t\t\t(this.#ws as any).send(arrayBuffer);\n\t\t\t\t} else {\n\t\t\t\t\t(this.#ws as any).send(buffer);\n\t\t\t\t}\n\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t// Convert Blob to ArrayBuffer\n\t\t\t\tdata\n\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t(this.#ws as any).send(buffer);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.#fireEvent(\"error\", { type: \"error\", target: this, error });\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Try to convert to string as a fallback\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"unsupported data type, converting to string\",\n\t\t\t\t\tdataType: typeof data,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t\t(this.#ws as any).send(String(data));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger().error({ msg: \"error sending websocket data\", error });\n\t\t\tthis.#fireEvent(\"error\", { type: \"error\", target: this, error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tclose(code = 1000, reason = \"\"): void {\n\t\tif (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#readyState = this.CLOSING;\n\t\tthis.#closeCode = code;\n\t\tthis.#closeReason = reason;\n\n\t\ttry {\n\t\t\t(this.#ws as any).close(code, reason);\n\n\t\t\t// Update state and fire close event\n\t\t\tthis.#readyState = this.CLOSED;\n\t\t\tthis.#fireEvent(\"close\", {\n\t\t\t\ttype: \"close\",\n\t\t\t\ttarget: this,\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t\twasClean: code === 1000,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger().error({ msg: \"error closing websocket\", error });\n\t\t\tthis.#readyState = this.CLOSED;\n\t\t\tthis.#fireEvent(\"close\", {\n\t\t\t\ttype: \"close\",\n\t\t\t\ttarget: this,\n\t\t\t\tcode: 1006,\n\t\t\t\treason: \"Abnormal closure\",\n\t\t\t\twasClean: false,\n\t\t\t});\n\t\t}\n\t}\n\n\taddEventListener(type: string, listener: (event: any) => void): void {\n\t\tif (!this.#eventListeners.has(type)) {\n\t\t\tthis.#eventListeners.set(type, new Set());\n\t\t}\n\t\tthis.#eventListeners.get(type)!.add(listener);\n\t}\n\n\tremoveEventListener(type: string, listener: (event: any) => void): void {\n\t\tconst listeners = this.#eventListeners.get(type);\n\t\tif (listeners) {\n\t\t\tlisteners.delete(listener);\n\t\t}\n\t}\n\n\tdispatchEvent(event: RivetEvent): boolean {\n\t\tconst listeners = this.#eventListeners.get(event.type);\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: `error in ${event.type} event listener`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Internal method to handle incoming messages from WSContext\n\t_handleMessage(data: any): void {\n\t\t// Hono may pass either raw data or a MessageEvent-like object\n\t\tlet messageData: string | ArrayBuffer | ArrayBufferView;\n\n\t\tif (typeof data === \"string\") {\n\t\t\tmessageData = data;\n\t\t} else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n\t\t\tmessageData = data;\n\t\t} else if (data && typeof data === \"object\" && \"data\" in data) {\n\t\t\t// Handle MessageEvent-like objects\n\t\t\tmessageData = data.data;\n\t\t} else {\n\t\t\t// Fallback - shouldn't happen in normal operation\n\t\t\tmessageData = String(data);\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"bridge handling message\",\n\t\t\tdataType: typeof messageData,\n\t\t\tisArrayBuffer: messageData instanceof ArrayBuffer,\n\t\t\tdataStr: typeof messageData === \"string\" ? messageData : \"<binary>\",\n\t\t});\n\n\t\tthis.#fireEvent(\"message\", {\n\t\t\ttype: \"message\",\n\t\t\ttarget: this,\n\t\t\tdata: messageData,\n\t\t});\n\t}\n\n\t// Internal method to handle close from WSContext\n\t_handleClose(code: number, reason: string): void {\n\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t(this.#ws as any).close(1000, \"hack_force_close\");\n\n\t\tif (this.readyState === this.CLOSED) return;\n\n\t\tthis.#readyState = this.CLOSED;\n\t\tthis.#closeCode = code;\n\t\tthis.#closeReason = reason;\n\n\t\tthis.#fireEvent(\"close\", {\n\t\t\ttype: \"close\",\n\t\t\ttarget: this,\n\t\t\tcode,\n\t\t\treason,\n\t\t\twasClean: code === 1000,\n\t\t});\n\t}\n\n\t// Internal method to handle errors from WSContext\n\t_handleError(error: any): void {\n\t\tthis.#fireEvent(\"error\", {\n\t\t\ttype: \"error\",\n\t\t\ttarget: this,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#fireEvent(type: string, event: any): void {\n\t\tconst listeners = this.#eventListeners.get(type);\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({ msg: `error in ${type} event listener`, error });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Also check for on* properties\n\t\tswitch (type) {\n\t\t\tcase \"open\":\n\t\t\t\tif (this.#onopen) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onopen(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onopen handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"close\":\n\t\t\t\tif (this.#onclose) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onclose(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onclose handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tif (this.#onerror) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onerror(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onerror handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message\":\n\t\t\t\tif (this.#onmessage) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onmessage(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onmessage handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Event handler properties with getters/setters\n\t#onopen: ((event: RivetEvent) => void) | null = null;\n\t#onclose: ((event: RivetCloseEvent) => void) | null = null;\n\t#onerror: ((event: RivetEvent) => void) | null = null;\n\t#onmessage: ((event: RivetMessageEvent) => void) | null = null;\n\n\tget onopen(): ((event: RivetEvent) => void) | null {\n\t\treturn this.#onopen;\n\t}\n\tset onopen(handler: ((event: RivetEvent) => void) | null) {\n\t\tthis.#onopen = handler;\n\t}\n\n\tget onclose(): ((event: RivetCloseEvent) => void) | null {\n\t\treturn this.#onclose;\n\t}\n\tset onclose(handler: ((event: RivetCloseEvent) => void) | null) {\n\t\tthis.#onclose = handler;\n\t}\n\n\tget onerror(): ((event: RivetEvent) => void) | null {\n\t\treturn this.#onerror;\n\t}\n\tset onerror(handler: ((event: RivetEvent) => void) | null) {\n\t\tthis.#onerror = handler;\n\t}\n\n\tget onmessage(): ((event: RivetMessageEvent) => void) | null {\n\t\treturn this.#onmessage;\n\t}\n\tset onmessage(handler: ((event: RivetMessageEvent) => void) | null) {\n\t\tthis.#onmessage = handler;\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport type { AnyDatabaseProvider } from \"@/actor/database\";\nimport * as errors from \"@/actor/errors\";\nimport {\n\tCachedSerializer,\n\ttype Encoding,\n\ttype InputData,\n} from \"@/actor/protocol/serde\";\nimport { deconstructError } from \"@/common/utils\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tTO_CLIENT_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport { deserializeWithEncoding } from \"@/serde\";\nimport { assertUnreachable, bufferToArrayBuffer } from \"../../utils\";\nimport { ActionContext } from \"../action\";\nimport type { Conn } from \"../connection\";\nimport type { ActorInstance } from \"../instance\";\n\nexport const TransportSchema = z.enum([\"websocket\", \"sse\"]);\n\n/**\n * Transport mechanism used to communicate between client & actor.\n */\nexport type Transport = z.infer<typeof TransportSchema>;\n\ninterface MessageEventOpts {\n\tencoding: Encoding;\n\tmaxIncomingMessageSize: number;\n}\n\nfunction getValueLength(value: InputData): number {\n\tif (typeof value === \"string\") {\n\t\treturn value.length;\n\t} else if (value instanceof Blob) {\n\t\treturn value.size;\n\t} else if (\n\t\tvalue instanceof ArrayBuffer ||\n\t\tvalue instanceof SharedArrayBuffer ||\n\t\tvalue instanceof Uint8Array\n\t) {\n\t\treturn value.byteLength;\n\t} else {\n\t\tassertUnreachable(value);\n\t}\n}\n\nexport async function inputDataToBuffer(\n\tdata: InputData,\n): Promise<Uint8Array | string> {\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t} else if (data instanceof Blob) {\n\t\tconst arrayBuffer = await data.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} else if (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (data instanceof ArrayBuffer || data instanceof SharedArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t} else {\n\t\tthrow new errors.MalformedMessage();\n\t}\n}\n\nexport async function parseMessage(\n\tvalue: InputData,\n\topts: MessageEventOpts,\n): Promise<protocol.ToServer> {\n\t// Validate value length\n\tconst length = getValueLength(value);\n\tif (length > opts.maxIncomingMessageSize) {\n\t\tthrow new errors.MessageTooLong();\n\t}\n\n\t// Convert value\n\tlet buffer = await inputDataToBuffer(value);\n\n\t// HACK: For some reason, the output buffer needs to be cloned when using BARE encoding\n\t//\n\t// THis is likely because the input data is of type `Buffer` and there is an inconsistency in implementation that I am not aware of\n\tif (buffer instanceof Buffer) {\n\t\tbuffer = new Uint8Array(buffer);\n\t}\n\n\t// Deserialize message\n\treturn deserializeWithEncoding(opts.encoding, buffer, TO_SERVER_VERSIONED);\n}\n\nexport interface ProcessMessageHandler<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n> {\n\tonExecuteAction?: (\n\t\tctx: ActionContext<S, CP, CS, V, I, DB>,\n\t\tname: string,\n\t\targs: unknown[],\n\t) => Promise<unknown>;\n\tonSubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\n\t) => Promise<void>;\n\tonUnsubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\n\t) => Promise<void>;\n}\n\nexport async function processMessage<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n>(\n\tmessage: protocol.ToServer,\n\tactor: ActorInstance<S, CP, CS, V, I, DB>,\n\tconn: Conn<S, CP, CS, V, I, DB>,\n\thandler: ProcessMessageHandler<S, CP, CS, V, I, DB>,\n) {\n\tlet actionId: bigint | undefined;\n\tlet actionName: string | undefined;\n\n\ttry {\n\t\tif (message.body.tag === \"ActionRequest\") {\n\t\t\t// Action request\n\n\t\t\tif (handler.onExecuteAction === undefined) {\n\t\t\t\tthrow new errors.Unsupported(\"Action\");\n\t\t\t}\n\n\t\t\tconst { id, name, args: argsRaw } = message.body.val;\n\t\t\tactionId = id;\n\t\t\tactionName = name;\n\t\t\tconst args = cbor.decode(new Uint8Array(argsRaw));\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing action request\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t});\n\n\t\t\tconst ctx = new ActionContext<S, CP, CS, V, I, DB>(\n\t\t\t\tactor.actorContext,\n\t\t\t\tconn,\n\t\t\t);\n\n\t\t\t// Process the action request and wait for the result\n\t\t\t// This will wait for async actions to complete\n\t\t\tconst output = await handler.onExecuteAction(ctx, name, args);\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"sending action response\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t\toutputType: typeof output,\n\t\t\t\tisPromise: output instanceof Promise,\n\t\t\t});\n\n\t\t\t// Send the response back to the client\n\t\t\tconn._sendMessage(\n\t\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t\t{\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: bufferToArrayBuffer(cbor.encode(output)),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tactor.rLog.debug({ msg: \"action response sent\", id, name: name });\n\t\t} else if (message.body.tag === \"SubscriptionRequest\") {\n\t\t\t// Subscription request\n\n\t\t\tif (\n\t\t\t\thandler.onSubscribe === undefined ||\n\t\t\t\thandler.onUnsubscribe === undefined\n\t\t\t) {\n\t\t\t\tthrow new errors.Unsupported(\"Subscriptions\");\n\t\t\t}\n\n\t\t\tconst { eventName, subscribe } = message.body.val;\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing subscription request\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\n\t\t\tif (subscribe) {\n\t\t\t\tawait handler.onSubscribe(eventName, conn);\n\t\t\t} else {\n\t\t\t\tawait handler.onUnsubscribe(eventName, conn);\n\t\t\t}\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"subscription request completed\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\t\t} else {\n\t\t\tassertUnreachable(message.body);\n\t\t}\n\t} catch (error) {\n\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\terror,\n\t\t\tactor.rLog,\n\t\t\t{\n\t\t\t\tconnectionId: conn.id,\n\t\t\t\tactionId,\n\t\t\t\tactionName,\n\t\t\t},\n\t\t);\n\n\t\tactor.rLog.debug({\n\t\t\tmsg: \"sending error response\",\n\t\t\tactionId,\n\t\t\tactionName,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t});\n\n\t\t// Build response\n\t\tconn._sendMessage(\n\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t{\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\tmetadata: bufferToArrayBuffer(cbor.encode(metadata)),\n\t\t\t\t\t\t\tactionId: actionId ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t),\n\t\t);\n\n\t\tactor.rLog.debug({ msg: \"error response sent\", actionId, actionName });\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tactor.rLog.warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tactor.rLog.warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n"]}