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.
- package/dist/cli/beignet-node.js +68 -12
- package/dist/cli/beignet-node.js.map +1 -1
- package/dist/cli/cli.js +6 -0
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/config.js +7 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/instance-lock.js +57 -12
- package/dist/cli/instance-lock.js.map +1 -1
- package/dist/cli/restore.js.map +1 -1
- package/dist/lightning/crypto/ecdh.js +97 -1
- package/dist/lightning/crypto/ecdh.js.map +1 -1
- package/dist/lightning/gossip/gossip-sync.js +1 -1
- package/dist/lightning/gossip/gossip-sync.js.map +1 -1
- package/dist/lightning/gossip/network-graph.js +288 -23
- package/dist/lightning/gossip/network-graph.js.map +1 -1
- package/dist/lightning/gossip/types.js +6 -1
- package/dist/lightning/gossip/types.js.map +1 -1
- package/dist/lightning/gossip/validation.js +13 -10
- package/dist/lightning/gossip/validation.js.map +1 -1
- package/dist/lightning/node/lightning-node.js +83 -28
- package/dist/lightning/node/lightning-node.js.map +1 -1
- package/dist/lightning/node/types.js.map +1 -1
- package/dist/lightning/storage/serialization.js +3 -0
- package/dist/lightning/storage/serialization.js.map +1 -1
- package/dist/lightning/storage/sqlite-storage.js +5 -0
- package/dist/lightning/storage/sqlite-storage.js.map +1 -1
- package/dist/lightning/storage/types.js.map +1 -1
- package/dist/types/cli/beignet-node.d.ts +7 -0
- package/dist/types/cli/instance-lock.d.ts +7 -1
- package/dist/types/cli/types.d.ts +1 -0
- package/dist/types/lightning/crypto/ecdh.d.ts +3 -0
- package/dist/types/lightning/gossip/network-graph.d.ts +24 -5
- package/dist/types/lightning/gossip/types.d.ts +7 -0
- package/dist/types/lightning/node/lightning-node.d.ts +2 -0
- package/dist/types/lightning/node/types.d.ts +1 -0
- package/dist/types/lightning/storage/sqlite-storage.d.ts +1 -0
- package/dist/types/lightning/storage/types.d.ts +1 -0
- package/package.json +1 -1
package/dist/cli/beignet-node.js
CHANGED
|
@@ -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
|
-
|
|
634
|
-
|
|
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
|
-
|
|
637
|
-
this.
|
|
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
|
|
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
|