beignet 0.9.1 → 0.9.2

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 (38) hide show
  1. package/dist/cli/beignet-node.js +68 -12
  2. package/dist/cli/beignet-node.js.map +1 -1
  3. package/dist/cli/cli.js +6 -0
  4. package/dist/cli/cli.js.map +1 -1
  5. package/dist/cli/config.js +7 -0
  6. package/dist/cli/config.js.map +1 -1
  7. package/dist/cli/instance-lock.js +57 -12
  8. package/dist/cli/instance-lock.js.map +1 -1
  9. package/dist/cli/restore.js.map +1 -1
  10. package/dist/lightning/crypto/ecdh.js +97 -1
  11. package/dist/lightning/crypto/ecdh.js.map +1 -1
  12. package/dist/lightning/gossip/gossip-sync.js +1 -1
  13. package/dist/lightning/gossip/gossip-sync.js.map +1 -1
  14. package/dist/lightning/gossip/network-graph.js +288 -23
  15. package/dist/lightning/gossip/network-graph.js.map +1 -1
  16. package/dist/lightning/gossip/types.js +6 -1
  17. package/dist/lightning/gossip/types.js.map +1 -1
  18. package/dist/lightning/gossip/validation.js +13 -10
  19. package/dist/lightning/gossip/validation.js.map +1 -1
  20. package/dist/lightning/node/lightning-node.js +83 -28
  21. package/dist/lightning/node/lightning-node.js.map +1 -1
  22. package/dist/lightning/node/types.js.map +1 -1
  23. package/dist/lightning/storage/serialization.js +3 -0
  24. package/dist/lightning/storage/serialization.js.map +1 -1
  25. package/dist/lightning/storage/sqlite-storage.js +5 -0
  26. package/dist/lightning/storage/sqlite-storage.js.map +1 -1
  27. package/dist/lightning/storage/types.js.map +1 -1
  28. package/dist/types/cli/beignet-node.d.ts +7 -0
  29. package/dist/types/cli/instance-lock.d.ts +7 -1
  30. package/dist/types/cli/types.d.ts +1 -0
  31. package/dist/types/lightning/crypto/ecdh.d.ts +3 -0
  32. package/dist/types/lightning/gossip/network-graph.d.ts +24 -5
  33. package/dist/types/lightning/gossip/types.d.ts +7 -0
  34. package/dist/types/lightning/node/lightning-node.d.ts +2 -0
  35. package/dist/types/lightning/node/types.d.ts +1 -0
  36. package/dist/types/lightning/storage/sqlite-storage.d.ts +1 -0
  37. package/dist/types/lightning/storage/types.d.ts +1 -0
  38. package/package.json +1 -1
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.BeignetNode = exports.jsonToRouteHops = exports.routeHopsToJson = exports.decodeOfferInput = exports.decodeInvoiceInput = exports.parseScid = exports.formatScid = exports.defaultDataDirForMnemonic = exports.parseRecoveryMode = void 0;
26
+ exports.BeignetNode = exports.jsonToRouteHops = exports.routeHopsToJson = exports.decodeOfferInput = exports.decodeInvoiceInput = exports.parseScid = exports.formatScid = exports.gossipPrimeLatch = exports.defaultDataDirForMnemonic = exports.parseRecoveryMode = void 0;
27
27
  const path = __importStar(require("path"));
28
28
  const fs = __importStar(require("fs"));
29
29
  const net = __importStar(require("net"));
@@ -85,6 +85,18 @@ function defaultDataDirForMnemonic(mnemonic, baseDir = DEFAULT_DATA_DIR) {
85
85
  return path.join(baseDir, walletTag);
86
86
  }
87
87
  exports.defaultDataDirForMnemonic = defaultDataDirForMnemonic;
88
+ function gossipPrimeLatch(rgs, timeoutMs) {
89
+ return new Promise((resolve) => {
90
+ const timer = setTimeout(resolve, timeoutMs);
91
+ timer.unref?.();
92
+ const settle = () => {
93
+ clearTimeout(timer);
94
+ resolve();
95
+ };
96
+ rgs.then(settle, settle);
97
+ });
98
+ }
99
+ exports.gossipPrimeLatch = gossipPrimeLatch;
88
100
  function formatScid(scid) {
89
101
  const { block, txIndex, outputIndex } = (0, types_1.decodeShortChannelId)(scid);
90
102
  return `${block}x${txIndex}x${outputIndex}`;
@@ -219,6 +231,9 @@ class BeignetNode extends events_1.EventEmitter {
219
231
  this.logLevel = 'info';
220
232
  this.autoGossipSync = true;
221
233
  this.rapidGossipSync = true;
234
+ this._initialGossipPrime = null;
235
+ this._releaseBootRgs = null;
236
+ this._deferredGossipSyncs = new Set();
222
237
  this.electrumServerCount = 1;
223
238
  this._failoverInProgress = false;
224
239
  this._connectTimeoutMs = 15000;
@@ -266,7 +281,13 @@ class BeignetNode extends events_1.EventEmitter {
266
281
  if (!opts.allowMultipleInstances) {
267
282
  const lockPath = path.join(this.dataDir, `${networkName}.lock`);
268
283
  try {
269
- (0, instance_lock_1.acquireInstanceLock)(lockPath);
284
+ (0, instance_lock_1.acquireInstanceLock)(lockPath, {
285
+ reclaimForeignHost: true,
286
+ onReclaim: (holder, reason) => {
287
+ this.log('warn', `[beignet] Reclaimed stale instance lock (pid ${holder.pid} on ` +
288
+ `${holder.hostname}, ${reason}) at ${lockPath}`);
289
+ }
290
+ });
270
291
  }
271
292
  catch (e) {
272
293
  if (e instanceof instance_lock_1.InstanceLockError) {
@@ -439,6 +460,14 @@ class BeignetNode extends events_1.EventEmitter {
439
460
  }
440
461
  });
441
462
  }
463
+ if (this.rapidGossipSync && this.networkName === 'mainnet') {
464
+ const settled = new Promise((resolve) => {
465
+ this._releaseBootRgs = resolve;
466
+ });
467
+ this._initialGossipPrime = gossipPrimeLatch(settled, BeignetNode.INITIAL_GOSSIP_PRIME_TIMEOUT_MS).then(() => {
468
+ this._initialGossipPrime = null;
469
+ });
470
+ }
442
471
  this.node = lightning_node_1.LightningNode.fromMnemonic(this.mnemonic, {
443
472
  coinType,
444
473
  network: lnNetwork,
@@ -447,6 +476,7 @@ class BeignetNode extends events_1.EventEmitter {
447
476
  autoReconnect: opts.autoReconnect ?? true,
448
477
  autoUpdateChannelFees: opts.autoUpdateChannelFees ?? false,
449
478
  forwardingEnabled: opts.forwardingEnabled ?? true,
479
+ eagerGossipVerify: opts.eagerGossipVerify ?? false,
450
480
  localFeatures: lightning_node_1.LightningNode.defaultFeatures(),
451
481
  chainHashes: [chainHash],
452
482
  alias: opts.alias,
@@ -630,14 +660,25 @@ class BeignetNode extends events_1.EventEmitter {
630
660
  this.node.on('peer:connect', (pubkey) => {
631
661
  this.log('debug', 'Peer connected', { pubkey });
632
662
  if (this.autoGossipSync) {
633
- try {
634
- this.node.initiateGossipSync(pubkey);
663
+ const prime = this._initialGossipPrime;
664
+ if (prime) {
665
+ if (!this._deferredGossipSyncs.has(pubkey)) {
666
+ this._deferredGossipSyncs.add(pubkey);
667
+ void prime.then(() => {
668
+ this._deferredGossipSyncs.delete(pubkey);
669
+ if (this.destroyed)
670
+ return;
671
+ const stillConnected = this.node
672
+ .listPeers()
673
+ .some((p) => p.pubkey === pubkey);
674
+ if (!stillConnected)
675
+ return;
676
+ this.startGossipSync(pubkey);
677
+ });
678
+ }
635
679
  }
636
- catch (err) {
637
- this.log('warn', 'Gossip sync failed to start', {
638
- pubkey,
639
- error: err instanceof Error ? err.message : String(err)
640
- });
680
+ else {
681
+ this.startGossipSync(pubkey);
641
682
  }
642
683
  }
643
684
  this.emit('peer:connect', { pubkey });
@@ -729,11 +770,15 @@ class BeignetNode extends events_1.EventEmitter {
729
770
  });
730
771
  }
731
772
  if (this.rapidGossipSync && this.networkName === 'mainnet') {
732
- this.syncRapidGossip().catch((err) => {
773
+ const rgs = this.syncRapidGossip().catch((err) => {
733
774
  this.log('warn', 'Rapid gossip sync failed', {
734
775
  error: err instanceof Error ? err.message : String(err)
735
776
  });
736
777
  });
778
+ const release = this._releaseBootRgs;
779
+ if (release) {
780
+ void rgs.then(release);
781
+ }
737
782
  }
738
783
  if (this.sweepDestinationScript) {
739
784
  this.runFallbackRecoveryWhenConnected();
@@ -1704,6 +1749,17 @@ class BeignetNode extends events_1.EventEmitter {
1704
1749
  state: p.state
1705
1750
  }));
1706
1751
  }
1752
+ startGossipSync(pubkey) {
1753
+ try {
1754
+ this.node.initiateGossipSync(pubkey);
1755
+ }
1756
+ catch (err) {
1757
+ this.log('warn', 'Gossip sync failed to start', {
1758
+ pubkey,
1759
+ error: err instanceof Error ? err.message : String(err)
1760
+ });
1761
+ }
1762
+ }
1707
1763
  syncGossip(pubkey) {
1708
1764
  const peers = pubkey
1709
1765
  ? [pubkey]
@@ -1810,8 +1866,7 @@ class BeignetNode extends events_1.EventEmitter {
1810
1866
  openedCount++;
1811
1867
  const promise = (async () => {
1812
1868
  try {
1813
- const graphNode = graph.getNode(Buffer.from(suggestion.nodeId, 'hex'));
1814
- const addrs = graphNode?.announcement?.addresses;
1869
+ const addrs = graph.getVerifiedNodeAnnouncement(Buffer.from(suggestion.nodeId, 'hex'))?.addresses;
1815
1870
  if (addrs && addrs.length > 0) {
1816
1871
  const addr = addrs.find((a) => a.type === 1 || a.type === 2) || addrs[0];
1817
1872
  try {
@@ -4083,4 +4138,5 @@ class BeignetNode extends events_1.EventEmitter {
4083
4138
  }
4084
4139
  }
4085
4140
  exports.BeignetNode = BeignetNode;
4141
+ BeignetNode.INITIAL_GOSSIP_PRIME_TIMEOUT_MS = 90000;
4086
4142
  //# sourceMappingURL=beignet-node.js.map