beignet 0.25.0 → 0.26.0

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 (49) hide show
  1. package/dist/cli/beignet-node.js +61 -8
  2. package/dist/cli/beignet-node.js.map +1 -1
  3. package/dist/cli/cli.js +17 -1
  4. package/dist/cli/cli.js.map +1 -1
  5. package/dist/cli/config.js +6 -0
  6. package/dist/cli/config.js.map +1 -1
  7. package/dist/cli/daemon-options.js +3 -0
  8. package/dist/cli/daemon-options.js.map +1 -1
  9. package/dist/cli/daemon.js +34 -3
  10. package/dist/cli/daemon.js.map +1 -1
  11. package/dist/cli/iroh-config.js +35 -0
  12. package/dist/cli/iroh-config.js.map +1 -0
  13. package/dist/cli/openapi.js +23 -2
  14. package/dist/cli/openapi.js.map +1 -1
  15. package/dist/lightning/backup/scb.js +19 -0
  16. package/dist/lightning/backup/scb.js.map +1 -1
  17. package/dist/lightning/node/lightning-node.js +63 -8
  18. package/dist/lightning/node/lightning-node.js.map +1 -1
  19. package/dist/lightning/node/types.js.map +1 -1
  20. package/dist/lightning/storage/sqlite-storage.js +33 -6
  21. package/dist/lightning/storage/sqlite-storage.js.map +1 -1
  22. package/dist/lightning/storage/types.js.map +1 -1
  23. package/dist/lightning/transport/index.js +1 -0
  24. package/dist/lightning/transport/index.js.map +1 -1
  25. package/dist/lightning/transport/iroh-node.js +212 -0
  26. package/dist/lightning/transport/iroh-node.js.map +1 -0
  27. package/dist/lightning/transport/iroh.js +269 -0
  28. package/dist/lightning/transport/iroh.js.map +1 -0
  29. package/dist/lightning/transport/peer-manager.js +114 -3
  30. package/dist/lightning/transport/peer-manager.js.map +1 -1
  31. package/dist/lightning/transport/peer-uri.js +10 -0
  32. package/dist/lightning/transport/peer-uri.js.map +1 -1
  33. package/dist/lightning/transport/peer.js +7 -0
  34. package/dist/lightning/transport/peer.js.map +1 -1
  35. package/dist/types/cli/beignet-node.d.ts +4 -1
  36. package/dist/types/cli/iroh-config.d.ts +8 -0
  37. package/dist/types/cli/types.d.ts +8 -1
  38. package/dist/types/lightning/backup/scb.d.ts +2 -0
  39. package/dist/types/lightning/node/lightning-node.d.ts +3 -0
  40. package/dist/types/lightning/node/types.d.ts +1 -0
  41. package/dist/types/lightning/storage/sqlite-storage.d.ts +4 -2
  42. package/dist/types/lightning/storage/types.d.ts +3 -1
  43. package/dist/types/lightning/transport/duplex-transport.d.ts +10 -1
  44. package/dist/types/lightning/transport/index.d.ts +1 -0
  45. package/dist/types/lightning/transport/iroh-node.d.ts +2 -0
  46. package/dist/types/lightning/transport/iroh.d.ts +69 -0
  47. package/dist/types/lightning/transport/peer-manager.d.ts +14 -1
  48. package/dist/types/lightning/transport/peer.d.ts +2 -0
  49. package/package.json +8 -1
@@ -24,6 +24,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.BeignetNode = exports.jitInvoiceError = exports.holdInvoiceEvent = exports.jsonSafeEvent = exports.jitReceiveRefusal = exports.leaseRatesRefusal = exports.defaultMaxFeeMsat = exports.DEFAULT_MAX_FEE_FLOOR_SATS = exports.DEFAULT_MAX_FEE_PPM = exports.clampDirectFundingMinimum = exports.DAILY_SPEND_STATE_KEY = exports.MAX_ASYNC_SPEND_CLAIMS = exports.ASYNC_SPEND_CLAIM_TTL_MS = exports.jsonToRouteHops = exports.routeHopsToJson = exports.spliceRefusalError = exports.decodeOfferInput = exports.paymentAdmissionSats = exports.paymentSpendSats = exports.hopFeeMsat = exports.spendLimitSats = exports.decodeInvoiceInput = exports.ENGINE_PAYMENT_ERROR_CODES = exports.parseScid = exports.formatScid = exports.gossipPrimeLatch = exports.defaultDataDirForMnemonic = exports.parseRecoveryMode = void 0;
27
+ const iroh_config_1 = require("./iroh-config");
28
+ const iroh_node_1 = require("../lightning/transport/iroh-node");
27
29
  const offline_receive_1 = require("./offline-receive");
28
30
  const ffor_receive_1 = require("./ffor-receive");
29
31
  const path = __importStar(require("path"));
@@ -637,7 +639,11 @@ const LISTENER_HELD_MESSAGE = 'held by the startup quarantine until writer owner
637
639
  const LISTENER_FENCED_MESSAGE = 'this node is fenced: another device owns its recovery namespace, so ' +
638
640
  'the listener stays down';
639
641
  function listenerLabel(kind) {
640
- return kind === 'tcp' ? 'Lightning listener' : 'WebSocket listener';
642
+ return kind === 'tcp'
643
+ ? 'Lightning listener'
644
+ : kind === 'iroh'
645
+ ? 'Iroh listener'
646
+ : 'WebSocket listener';
641
647
  }
642
648
  class BeignetNode extends events_1.EventEmitter {
643
649
  getOfflineReceive() {
@@ -715,6 +721,7 @@ class BeignetNode extends events_1.EventEmitter {
715
721
  this._deferredGossipSyncs = new Set();
716
722
  this.electrumServerCount = 1;
717
723
  this._failoverInProgress = false;
724
+ this._irohBound = false;
718
725
  this._listenBinds = {};
719
726
  this._listenEpoch = 0;
720
727
  this._connectTimeoutMs = 15000;
@@ -749,6 +756,12 @@ class BeignetNode extends events_1.EventEmitter {
749
756
  }
750
757
  }
751
758
  static async create(opts = {}) {
759
+ try {
760
+ (0, iroh_config_1.validateIrohConfig)(opts);
761
+ }
762
+ catch (err) {
763
+ throw new errors_1.BeignetError('INVALID_PARAMS', err.message);
764
+ }
752
765
  const mnemonic = opts.mnemonic || (0, helpers_1.generateMnemonic)();
753
766
  const networkName = opts.network || 'mainnet';
754
767
  const dataDir = opts.dataDir || defaultDataDirForMnemonic(mnemonic);
@@ -1077,6 +1090,13 @@ class BeignetNode extends events_1.EventEmitter {
1077
1090
  storage: this._nodeStorageView,
1078
1091
  newChannelsRefused: () => this.newChannelRefusal(),
1079
1092
  enableNetworking: true,
1093
+ iroh: opts.iroh
1094
+ ? {
1095
+ factory: iroh_node_1.createNodeIrohEndpoint,
1096
+ relays: opts.irohRelays,
1097
+ discovery: opts.irohDiscovery
1098
+ }
1099
+ : undefined,
1080
1100
  autoReconnect: opts.autoReconnect ?? true,
1081
1101
  autoUpdateChannelFees: opts.autoUpdateChannelFees ?? false,
1082
1102
  forwardingEnabled: opts.forwardingEnabled ?? true,
@@ -1720,6 +1740,9 @@ class BeignetNode extends events_1.EventEmitter {
1720
1740
  if (opts.websocketPort) {
1721
1741
  await this.bindListener('websocket', opts.websocketPort);
1722
1742
  }
1743
+ if (opts.iroh) {
1744
+ await this.bindListener('iroh', 0);
1745
+ }
1723
1746
  if (opts.connectTimeoutMs !== undefined && opts.connectTimeoutMs > 0) {
1724
1747
  this._connectTimeoutMs = opts.connectTimeoutMs;
1725
1748
  }
@@ -2710,7 +2733,7 @@ class BeignetNode extends events_1.EventEmitter {
2710
2733
  }
2711
2734
  try {
2712
2735
  for (const peer of from.loadAllPeerAddresses()) {
2713
- to.savePeerAddress(peer.pubkey, peer.host, peer.port);
2736
+ to.savePeerAddress(peer.pubkey, peer.host, peer.port, peer.transport);
2714
2737
  }
2715
2738
  }
2716
2739
  catch (err) {
@@ -3190,6 +3213,7 @@ class BeignetNode extends events_1.EventEmitter {
3190
3213
  const info = this.node.getNodeInfo();
3191
3214
  const lightningBalance = this.getLightningBalanceSats();
3192
3215
  const result = {
3216
+ irohAvailable: true,
3193
3217
  nodeId: info.nodeId,
3194
3218
  alias: info.alias,
3195
3219
  network: this.networkName,
@@ -3204,6 +3228,11 @@ class BeignetNode extends events_1.EventEmitter {
3204
3228
  peerCount: info.peerCount,
3205
3229
  listening: this.node.isListening()
3206
3230
  };
3231
+ const irohUri = this.node.getIrohConnectionString();
3232
+ if (irohUri)
3233
+ result.irohUri = irohUri;
3234
+ if (this._irohListenError)
3235
+ result.irohListenError = { ...this._irohListenError };
3207
3236
  if (this._requestedListenPort !== undefined) {
3208
3237
  result.listenPort = this._requestedListenPort;
3209
3238
  }
@@ -4006,7 +4035,9 @@ class BeignetNode extends events_1.EventEmitter {
4006
4035
  pubkey,
4007
4036
  host: host ?? connected?.host ?? '',
4008
4037
  port: port ?? connected?.port ?? 0,
4009
- state: 'connected'
4038
+ state: 'connected',
4039
+ ...(connected?.transport ? { transport: connected.transport } : {}),
4040
+ ...(connected?.iroh ? { iroh: connected.iroh } : {})
4010
4041
  };
4011
4042
  }
4012
4043
  disconnectPeer(pubkey) {
@@ -4017,7 +4048,9 @@ class BeignetNode extends events_1.EventEmitter {
4017
4048
  pubkey: p.pubkey,
4018
4049
  host: p.host,
4019
4050
  port: p.port,
4020
- state: p.state
4051
+ state: p.state,
4052
+ ...(p.transport ? { transport: p.transport } : {}),
4053
+ ...(p.iroh ? { iroh: p.iroh } : {})
4021
4054
  }));
4022
4055
  }
4023
4056
  startGossipSync(pubkey) {
@@ -8195,6 +8228,8 @@ class BeignetNode extends events_1.EventEmitter {
8195
8228
  this._listenEpoch++;
8196
8229
  this._listenPort = undefined;
8197
8230
  this._websocketPort = undefined;
8231
+ this._irohBound = false;
8232
+ this._irohListenError = undefined;
8198
8233
  this._requestedListenPort = undefined;
8199
8234
  this._listenError = undefined;
8200
8235
  this._websocketListenError = undefined;
@@ -8219,6 +8254,8 @@ class BeignetNode extends events_1.EventEmitter {
8219
8254
  try {
8220
8255
  if (kind === 'tcp')
8221
8256
  await node.listen(port);
8257
+ else if (kind === 'iroh')
8258
+ await node.listenIroh();
8222
8259
  else
8223
8260
  await node.listenWebSocket(port);
8224
8261
  }
@@ -8250,6 +8287,8 @@ class BeignetNode extends events_1.EventEmitter {
8250
8287
  const wasHeld = this.listenerProblem(kind)?.state === 'held';
8251
8288
  if (kind === 'tcp')
8252
8289
  this._listenPort = port;
8290
+ else if (kind === 'iroh')
8291
+ this._irohBound = true;
8253
8292
  else
8254
8293
  this._websocketPort = port;
8255
8294
  this.setListenerProblem(kind, undefined);
@@ -8297,11 +8336,17 @@ class BeignetNode extends events_1.EventEmitter {
8297
8336
  }
8298
8337
  }
8299
8338
  listenerProblem(kind) {
8300
- return kind === 'tcp' ? this._listenError : this._websocketListenError;
8339
+ return kind === 'tcp'
8340
+ ? this._listenError
8341
+ : kind === 'iroh'
8342
+ ? this._irohListenError
8343
+ : this._websocketListenError;
8301
8344
  }
8302
8345
  setListenerProblem(kind, problem) {
8303
8346
  if (kind === 'tcp')
8304
8347
  this._listenError = problem;
8348
+ else if (kind === 'iroh')
8349
+ this._irohListenError = problem;
8305
8350
  else
8306
8351
  this._websocketListenError = problem;
8307
8352
  }
@@ -8309,7 +8354,7 @@ class BeignetNode extends events_1.EventEmitter {
8309
8354
  if (this.destroyed || !this.node)
8310
8355
  return;
8311
8356
  const held = [];
8312
- for (const kind of ['tcp', 'websocket']) {
8357
+ for (const kind of ['tcp', 'websocket', 'iroh']) {
8313
8358
  const problem = this.listenerProblem(kind);
8314
8359
  if (problem?.state === 'held')
8315
8360
  held.push([kind, problem.port]);
@@ -8325,14 +8370,22 @@ class BeignetNode extends events_1.EventEmitter {
8325
8370
  }
8326
8371
  }
8327
8372
  fenceListeners() {
8328
- for (const kind of ['tcp', 'websocket']) {
8373
+ for (const kind of ['tcp', 'websocket', 'iroh']) {
8329
8374
  const problem = this.listenerProblem(kind);
8330
- const bound = kind === 'tcp' ? this._listenPort : this._websocketPort;
8375
+ const bound = kind === 'tcp'
8376
+ ? this._listenPort
8377
+ : kind === 'iroh'
8378
+ ? this._irohBound
8379
+ ? 0
8380
+ : undefined
8381
+ : this._websocketPort;
8331
8382
  const port = bound ?? (problem?.state === 'held' ? problem.port : undefined);
8332
8383
  if (port === undefined)
8333
8384
  continue;
8334
8385
  if (kind === 'tcp')
8335
8386
  this._listenPort = undefined;
8387
+ else if (kind === 'iroh')
8388
+ this._irohBound = false;
8336
8389
  else
8337
8390
  this._websocketPort = undefined;
8338
8391
  this.setListenerProblem(kind, {