@optimystic/db-p2p 0.0.1
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/index.min.js +52 -0
- package/dist/index.min.js.map +7 -0
- package/dist/src/cluster/client.d.ts +12 -0
- package/dist/src/cluster/client.d.ts.map +1 -0
- package/dist/src/cluster/client.js +65 -0
- package/dist/src/cluster/client.js.map +1 -0
- package/dist/src/cluster/cluster-repo.d.ts +79 -0
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -0
- package/dist/src/cluster/cluster-repo.js +613 -0
- package/dist/src/cluster/cluster-repo.js.map +1 -0
- package/dist/src/cluster/partition-detector.d.ts +59 -0
- package/dist/src/cluster/partition-detector.d.ts.map +1 -0
- package/dist/src/cluster/partition-detector.js +129 -0
- package/dist/src/cluster/partition-detector.js.map +1 -0
- package/dist/src/cluster/service.d.ts +49 -0
- package/dist/src/cluster/service.d.ts.map +1 -0
- package/dist/src/cluster/service.js +107 -0
- package/dist/src/cluster/service.js.map +1 -0
- package/dist/src/index.d.ts +29 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +29 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/it-utility.d.ts +4 -0
- package/dist/src/it-utility.d.ts.map +1 -0
- package/dist/src/it-utility.js +32 -0
- package/dist/src/it-utility.js.map +1 -0
- package/dist/src/libp2p-key-network.d.ts +59 -0
- package/dist/src/libp2p-key-network.d.ts.map +1 -0
- package/dist/src/libp2p-key-network.js +278 -0
- package/dist/src/libp2p-key-network.js.map +1 -0
- package/dist/src/libp2p-node.d.ts +28 -0
- package/dist/src/libp2p-node.d.ts.map +1 -0
- package/dist/src/libp2p-node.js +270 -0
- package/dist/src/libp2p-node.js.map +1 -0
- package/dist/src/logger.d.ts +3 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +6 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/network/get-network-manager.d.ts +4 -0
- package/dist/src/network/get-network-manager.d.ts.map +1 -0
- package/dist/src/network/get-network-manager.js +17 -0
- package/dist/src/network/get-network-manager.js.map +1 -0
- package/dist/src/network/network-manager-service.d.ts +82 -0
- package/dist/src/network/network-manager-service.d.ts.map +1 -0
- package/dist/src/network/network-manager-service.js +283 -0
- package/dist/src/network/network-manager-service.js.map +1 -0
- package/dist/src/peer-utils.d.ts +2 -0
- package/dist/src/peer-utils.d.ts.map +1 -0
- package/dist/src/peer-utils.js +28 -0
- package/dist/src/peer-utils.js.map +1 -0
- package/dist/src/protocol-client.d.ts +12 -0
- package/dist/src/protocol-client.d.ts.map +1 -0
- package/dist/src/protocol-client.js +34 -0
- package/dist/src/protocol-client.js.map +1 -0
- package/dist/src/repo/client.d.ts +17 -0
- package/dist/src/repo/client.d.ts.map +1 -0
- package/dist/src/repo/client.js +82 -0
- package/dist/src/repo/client.js.map +1 -0
- package/dist/src/repo/cluster-coordinator.d.ts +59 -0
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -0
- package/dist/src/repo/cluster-coordinator.js +539 -0
- package/dist/src/repo/cluster-coordinator.js.map +1 -0
- package/dist/src/repo/coordinator-repo.d.ts +29 -0
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -0
- package/dist/src/repo/coordinator-repo.js +102 -0
- package/dist/src/repo/coordinator-repo.js.map +1 -0
- package/dist/src/repo/redirect.d.ts +14 -0
- package/dist/src/repo/redirect.d.ts.map +1 -0
- package/dist/src/repo/redirect.js +9 -0
- package/dist/src/repo/redirect.js.map +1 -0
- package/dist/src/repo/service.d.ts +52 -0
- package/dist/src/repo/service.d.ts.map +1 -0
- package/dist/src/repo/service.js +181 -0
- package/dist/src/repo/service.js.map +1 -0
- package/dist/src/repo/types.d.ts +7 -0
- package/dist/src/repo/types.d.ts.map +1 -0
- package/dist/src/repo/types.js +2 -0
- package/dist/src/repo/types.js.map +1 -0
- package/dist/src/routing/libp2p-known-peers.d.ts +4 -0
- package/dist/src/routing/libp2p-known-peers.d.ts.map +1 -0
- package/dist/src/routing/libp2p-known-peers.js +19 -0
- package/dist/src/routing/libp2p-known-peers.js.map +1 -0
- package/dist/src/routing/responsibility.d.ts +14 -0
- package/dist/src/routing/responsibility.d.ts.map +1 -0
- package/dist/src/routing/responsibility.js +45 -0
- package/dist/src/routing/responsibility.js.map +1 -0
- package/dist/src/routing/simple-cluster-coordinator.d.ts +23 -0
- package/dist/src/routing/simple-cluster-coordinator.d.ts.map +1 -0
- package/dist/src/routing/simple-cluster-coordinator.js +59 -0
- package/dist/src/routing/simple-cluster-coordinator.js.map +1 -0
- package/dist/src/storage/arachnode-fret-adapter.d.ts +65 -0
- package/dist/src/storage/arachnode-fret-adapter.d.ts.map +1 -0
- package/dist/src/storage/arachnode-fret-adapter.js +93 -0
- package/dist/src/storage/arachnode-fret-adapter.js.map +1 -0
- package/dist/src/storage/block-storage.d.ts +31 -0
- package/dist/src/storage/block-storage.d.ts.map +1 -0
- package/dist/src/storage/block-storage.js +154 -0
- package/dist/src/storage/block-storage.js.map +1 -0
- package/dist/src/storage/file-storage.d.ts +30 -0
- package/dist/src/storage/file-storage.d.ts.map +1 -0
- package/dist/src/storage/file-storage.js +127 -0
- package/dist/src/storage/file-storage.js.map +1 -0
- package/dist/src/storage/helpers.d.ts +3 -0
- package/dist/src/storage/helpers.d.ts.map +1 -0
- package/dist/src/storage/helpers.js +28 -0
- package/dist/src/storage/helpers.js.map +1 -0
- package/dist/src/storage/i-block-storage.d.ts +32 -0
- package/dist/src/storage/i-block-storage.d.ts.map +1 -0
- package/dist/src/storage/i-block-storage.js +2 -0
- package/dist/src/storage/i-block-storage.js.map +1 -0
- package/dist/src/storage/i-raw-storage.d.ts +20 -0
- package/dist/src/storage/i-raw-storage.d.ts.map +1 -0
- package/dist/src/storage/i-raw-storage.js +2 -0
- package/dist/src/storage/i-raw-storage.js.map +1 -0
- package/dist/src/storage/memory-storage.d.ts +27 -0
- package/dist/src/storage/memory-storage.d.ts.map +1 -0
- package/dist/src/storage/memory-storage.js +87 -0
- package/dist/src/storage/memory-storage.js.map +1 -0
- package/dist/src/storage/restoration-coordinator-v2.d.ts +63 -0
- package/dist/src/storage/restoration-coordinator-v2.d.ts.map +1 -0
- package/dist/src/storage/restoration-coordinator-v2.js +157 -0
- package/dist/src/storage/restoration-coordinator-v2.js.map +1 -0
- package/dist/src/storage/ring-selector.d.ts +56 -0
- package/dist/src/storage/ring-selector.d.ts.map +1 -0
- package/dist/src/storage/ring-selector.js +118 -0
- package/dist/src/storage/ring-selector.js.map +1 -0
- package/dist/src/storage/storage-monitor.d.ts +23 -0
- package/dist/src/storage/storage-monitor.d.ts.map +1 -0
- package/dist/src/storage/storage-monitor.js +40 -0
- package/dist/src/storage/storage-monitor.js.map +1 -0
- package/dist/src/storage/storage-repo.d.ts +17 -0
- package/dist/src/storage/storage-repo.d.ts.map +1 -0
- package/dist/src/storage/storage-repo.js +267 -0
- package/dist/src/storage/storage-repo.js.map +1 -0
- package/dist/src/storage/struct.d.ts +29 -0
- package/dist/src/storage/struct.d.ts.map +1 -0
- package/dist/src/storage/struct.js +2 -0
- package/dist/src/storage/struct.js.map +1 -0
- package/dist/src/sync/client.d.ts +27 -0
- package/dist/src/sync/client.d.ts.map +1 -0
- package/dist/src/sync/client.js +32 -0
- package/dist/src/sync/client.js.map +1 -0
- package/dist/src/sync/protocol.d.ts +58 -0
- package/dist/src/sync/protocol.d.ts.map +1 -0
- package/dist/src/sync/protocol.js +12 -0
- package/dist/src/sync/protocol.js.map +1 -0
- package/dist/src/sync/service.d.ts +62 -0
- package/dist/src/sync/service.d.ts.map +1 -0
- package/dist/src/sync/service.js +168 -0
- package/dist/src/sync/service.js.map +1 -0
- package/package.json +73 -0
- package/readme.md +497 -0
- package/src/cluster/client.ts +63 -0
- package/src/cluster/cluster-repo.ts +711 -0
- package/src/cluster/partition-detector.ts +158 -0
- package/src/cluster/service.ts +156 -0
- package/src/index.ts +30 -0
- package/src/it-utility.ts +36 -0
- package/src/libp2p-key-network.ts +334 -0
- package/src/libp2p-node.ts +335 -0
- package/src/logger.ts +9 -0
- package/src/network/get-network-manager.ts +17 -0
- package/src/network/network-manager-service.ts +334 -0
- package/src/peer-utils.ts +24 -0
- package/src/protocol-client.ts +54 -0
- package/src/repo/client.ts +112 -0
- package/src/repo/cluster-coordinator.ts +592 -0
- package/src/repo/coordinator-repo.ts +137 -0
- package/src/repo/redirect.ts +17 -0
- package/src/repo/service.ts +219 -0
- package/src/repo/types.ts +7 -0
- package/src/routing/libp2p-known-peers.ts +26 -0
- package/src/routing/responsibility.ts +63 -0
- package/src/routing/simple-cluster-coordinator.ts +70 -0
- package/src/storage/arachnode-fret-adapter.ts +128 -0
- package/src/storage/block-storage.ts +182 -0
- package/src/storage/file-storage.ts +163 -0
- package/src/storage/helpers.ts +29 -0
- package/src/storage/i-block-storage.ts +40 -0
- package/src/storage/i-raw-storage.ts +30 -0
- package/src/storage/memory-storage.ts +108 -0
- package/src/storage/restoration-coordinator-v2.ts +191 -0
- package/src/storage/ring-selector.ts +155 -0
- package/src/storage/storage-monitor.ts +59 -0
- package/src/storage/storage-repo.ts +320 -0
- package/src/storage/struct.ts +34 -0
- package/src/sync/client.ts +42 -0
- package/src/sync/protocol.ts +71 -0
- package/src/sync/service.ts +229 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { toString as u8ToString } from 'uint8arrays/to-string';
|
|
2
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
3
|
+
import { multiaddr } from '@multiformats/multiaddr';
|
|
4
|
+
import { hashKey } from 'p2p-fret';
|
|
5
|
+
import { createLogger } from './logger.js';
|
|
6
|
+
export class Libp2pKeyPeerNetwork {
|
|
7
|
+
libp2p;
|
|
8
|
+
clusterSize;
|
|
9
|
+
selfCoordinationConfig;
|
|
10
|
+
networkHighWaterMark = 1;
|
|
11
|
+
lastConnectedTime = Date.now();
|
|
12
|
+
constructor(libp2p, clusterSize = 16, selfCoordinationConfig) {
|
|
13
|
+
this.libp2p = libp2p;
|
|
14
|
+
this.clusterSize = clusterSize;
|
|
15
|
+
this.selfCoordinationConfig = {
|
|
16
|
+
gracePeriodMs: selfCoordinationConfig?.gracePeriodMs ?? 30_000,
|
|
17
|
+
shrinkageThreshold: selfCoordinationConfig?.shrinkageThreshold ?? 0.5,
|
|
18
|
+
allowSelfCoordination: selfCoordinationConfig?.allowSelfCoordination ?? true
|
|
19
|
+
};
|
|
20
|
+
this.setupConnectionTracking();
|
|
21
|
+
}
|
|
22
|
+
// coordinator cache: key (base64url) -> peerId until expiry (bounded LRU-ish via Map insertion order)
|
|
23
|
+
coordinatorCache = new Map();
|
|
24
|
+
static MAX_CACHE_ENTRIES = 1000;
|
|
25
|
+
log = createLogger('libp2p-key-network');
|
|
26
|
+
toCacheKey(key) { return u8ToString(key, 'base64url'); }
|
|
27
|
+
/**
|
|
28
|
+
* Set up connection event tracking to update high water mark and last connected time.
|
|
29
|
+
*/
|
|
30
|
+
setupConnectionTracking() {
|
|
31
|
+
this.libp2p.addEventListener('connection:open', () => {
|
|
32
|
+
this.updateNetworkObservations();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Update network high water mark and last connected time.
|
|
37
|
+
* Called on new connections.
|
|
38
|
+
*/
|
|
39
|
+
updateNetworkObservations() {
|
|
40
|
+
const connections = this.libp2p.getConnections?.() ?? [];
|
|
41
|
+
if (connections.length > 0) {
|
|
42
|
+
this.lastConnectedTime = Date.now();
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const fret = this.getFret();
|
|
46
|
+
const estimate = fret.getNetworkSizeEstimate();
|
|
47
|
+
if (estimate.size_estimate > this.networkHighWaterMark) {
|
|
48
|
+
this.networkHighWaterMark = estimate.size_estimate;
|
|
49
|
+
this.log('network-hwm-updated mark=%d confidence=%f', this.networkHighWaterMark, estimate.confidence);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// FRET not available - use connection count as fallback
|
|
54
|
+
const connectionCount = this.libp2p.getConnections?.().length ?? 0;
|
|
55
|
+
const observedSize = connectionCount + 1; // +1 for self
|
|
56
|
+
if (observedSize > this.networkHighWaterMark) {
|
|
57
|
+
this.networkHighWaterMark = observedSize;
|
|
58
|
+
this.log('network-hwm-updated mark=%d (from connections)', this.networkHighWaterMark);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Determine if self-coordination should be allowed based on network observations.
|
|
64
|
+
*
|
|
65
|
+
* Principle: If we've ever seen a larger network, assume our connectivity is the problem,
|
|
66
|
+
* not the network shrinking.
|
|
67
|
+
*/
|
|
68
|
+
shouldAllowSelfCoordination() {
|
|
69
|
+
// Check global disable
|
|
70
|
+
if (!this.selfCoordinationConfig.allowSelfCoordination) {
|
|
71
|
+
return { allow: false, reason: 'disabled' };
|
|
72
|
+
}
|
|
73
|
+
// Case 1: New/bootstrap node (never seen larger network)
|
|
74
|
+
if (this.networkHighWaterMark <= 1) {
|
|
75
|
+
return { allow: true, reason: 'bootstrap-node' };
|
|
76
|
+
}
|
|
77
|
+
// Case 2: Check for partition via FRET
|
|
78
|
+
try {
|
|
79
|
+
const fret = this.getFret();
|
|
80
|
+
if (fret.detectPartition()) {
|
|
81
|
+
this.log('self-coord-blocked: partition-detected');
|
|
82
|
+
return { allow: false, reason: 'partition-detected' };
|
|
83
|
+
}
|
|
84
|
+
// Case 3: Suspicious network shrinkage (>threshold drop)
|
|
85
|
+
const estimate = fret.getNetworkSizeEstimate();
|
|
86
|
+
const shrinkage = 1 - (estimate.size_estimate / this.networkHighWaterMark);
|
|
87
|
+
if (shrinkage > this.selfCoordinationConfig.shrinkageThreshold) {
|
|
88
|
+
this.log('self-coord-blocked: suspicious-shrinkage current=%d hwm=%d shrinkage=%f', estimate.size_estimate, this.networkHighWaterMark, shrinkage);
|
|
89
|
+
return { allow: false, reason: 'suspicious-shrinkage' };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// FRET not available - be conservative
|
|
94
|
+
const connections = this.libp2p.getConnections?.() ?? [];
|
|
95
|
+
if (this.networkHighWaterMark > 1 && connections.length === 0) {
|
|
96
|
+
// We've seen peers before but have none now - suspicious
|
|
97
|
+
const timeSinceConnection = Date.now() - this.lastConnectedTime;
|
|
98
|
+
if (timeSinceConnection < this.selfCoordinationConfig.gracePeriodMs) {
|
|
99
|
+
this.log('self-coord-blocked: grace-period-not-elapsed since=%dms', timeSinceConnection);
|
|
100
|
+
return { allow: false, reason: 'grace-period-not-elapsed' };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Case 4: Recently connected (grace period not elapsed)
|
|
105
|
+
const timeSinceConnection = Date.now() - this.lastConnectedTime;
|
|
106
|
+
if (timeSinceConnection < this.selfCoordinationConfig.gracePeriodMs) {
|
|
107
|
+
const connections = this.libp2p.getConnections?.() ?? [];
|
|
108
|
+
// Only block if we have no connections but did recently
|
|
109
|
+
if (connections.length === 0) {
|
|
110
|
+
this.log('self-coord-blocked: grace-period-not-elapsed since=%dms', timeSinceConnection);
|
|
111
|
+
return { allow: false, reason: 'grace-period-not-elapsed' };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Case 5: Extended isolation with gradual shrinkage - allow with warning
|
|
115
|
+
this.log('self-coord-allowed: extended-isolation (warn)');
|
|
116
|
+
return { allow: true, reason: 'extended-isolation', warn: true };
|
|
117
|
+
}
|
|
118
|
+
recordCoordinator(key, peerId, ttlMs = 30 * 60 * 1000) {
|
|
119
|
+
const k = this.toCacheKey(key);
|
|
120
|
+
const now = Date.now();
|
|
121
|
+
for (const [ck, entry] of this.coordinatorCache) {
|
|
122
|
+
if (entry.expires <= now)
|
|
123
|
+
this.coordinatorCache.delete(ck);
|
|
124
|
+
}
|
|
125
|
+
this.coordinatorCache.set(k, { id: peerId, expires: now + ttlMs });
|
|
126
|
+
while (this.coordinatorCache.size > Libp2pKeyPeerNetwork.MAX_CACHE_ENTRIES) {
|
|
127
|
+
const firstKey = this.coordinatorCache.keys().next().value;
|
|
128
|
+
if (firstKey == null)
|
|
129
|
+
break;
|
|
130
|
+
this.coordinatorCache.delete(firstKey);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getCachedCoordinator(key) {
|
|
134
|
+
const k = this.toCacheKey(key);
|
|
135
|
+
const hit = this.coordinatorCache.get(k);
|
|
136
|
+
if (hit && hit.expires > Date.now())
|
|
137
|
+
return hit.id;
|
|
138
|
+
if (hit)
|
|
139
|
+
this.coordinatorCache.delete(k);
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
connect(peerId, protocol, _options) {
|
|
143
|
+
const conns = this.libp2p.getConnections?.(peerId) ?? [];
|
|
144
|
+
if (Array.isArray(conns) && conns.length > 0 && typeof conns[0]?.newStream === 'function') {
|
|
145
|
+
return conns[0].newStream([protocol]);
|
|
146
|
+
}
|
|
147
|
+
const dialOptions = { runOnLimitedConnection: true, negotiateFully: false };
|
|
148
|
+
return this.libp2p.dialProtocol(peerId, [protocol], dialOptions);
|
|
149
|
+
}
|
|
150
|
+
getFret() {
|
|
151
|
+
const svc = this.libp2p.services?.fret;
|
|
152
|
+
if (svc == null)
|
|
153
|
+
throw new Error('FRET service is not registered on this libp2p node');
|
|
154
|
+
return svc;
|
|
155
|
+
}
|
|
156
|
+
async getNeighborIdsForKey(key, wants) {
|
|
157
|
+
const fret = this.getFret();
|
|
158
|
+
const coord = await hashKey(key);
|
|
159
|
+
const both = fret.getNeighbors(coord, 'both', wants);
|
|
160
|
+
return Array.from(new Set(both)).slice(0, wants);
|
|
161
|
+
}
|
|
162
|
+
async findCoordinator(key, _options) {
|
|
163
|
+
const excludedSet = new Set((_options?.excludedPeers ?? []).map(p => p.toString()));
|
|
164
|
+
const keyStr = this.toCacheKey(key).substring(0, 12);
|
|
165
|
+
this.log('findCoordinator:start key=%s excluded=%o', keyStr, Array.from(excludedSet).map(s => s.substring(0, 12)));
|
|
166
|
+
// honor cache if not excluded
|
|
167
|
+
const cached = this.getCachedCoordinator(key);
|
|
168
|
+
if (cached != null && !excludedSet.has(cached.toString())) {
|
|
169
|
+
this.log('findCoordinator:cached-hit key=%s coordinator=%s', keyStr, cached.toString().substring(0, 12));
|
|
170
|
+
return cached;
|
|
171
|
+
}
|
|
172
|
+
// Retry logic: connections can be temporarily down, so retry a few times with delay
|
|
173
|
+
const maxRetries = 3;
|
|
174
|
+
const retryDelayMs = 500;
|
|
175
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
176
|
+
// Get currently connected peers for filtering
|
|
177
|
+
const connected = (this.libp2p.getConnections?.() ?? []).map((c) => c.remotePeer);
|
|
178
|
+
const connectedSet = new Set(connected.map(p => p.toString()));
|
|
179
|
+
this.log('findCoordinator:connected-peers key=%s count=%d peers=%o attempt=%d', keyStr, connected.length, connected.map(p => p.toString().substring(0, 12)), attempt);
|
|
180
|
+
// prefer FRET neighbors that are also connected, pick first non-excluded
|
|
181
|
+
try {
|
|
182
|
+
const ids = await this.getNeighborIdsForKey(key, this.clusterSize);
|
|
183
|
+
this.log('findCoordinator:fret-neighbors key=%s candidates=%o', keyStr, ids.map(s => s.substring(0, 12)));
|
|
184
|
+
// Filter to only connected FRET neighbors
|
|
185
|
+
const connectedFretIds = ids.filter(id => connectedSet.has(id) || id === this.libp2p.peerId.toString());
|
|
186
|
+
this.log('findCoordinator:fret-connected key=%s count=%d peers=%o', keyStr, connectedFretIds.length, connectedFretIds.map(s => s.substring(0, 12)));
|
|
187
|
+
const pick = connectedFretIds.find(id => !excludedSet.has(id));
|
|
188
|
+
if (pick) {
|
|
189
|
+
const pid = peerIdFromString(pick);
|
|
190
|
+
this.recordCoordinator(key, pid);
|
|
191
|
+
this.log('findCoordinator:fret-selected key=%s coordinator=%s', keyStr, pick.substring(0, 12));
|
|
192
|
+
return pid;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
this.log('findCoordinator getNeighborIdsForKey failed - %o', err);
|
|
197
|
+
}
|
|
198
|
+
// fallback: prefer any existing connected peer that's not excluded
|
|
199
|
+
const connectedPick = connected.find(p => !excludedSet.has(p.toString()));
|
|
200
|
+
if (connectedPick) {
|
|
201
|
+
this.recordCoordinator(key, connectedPick);
|
|
202
|
+
this.log('findCoordinator:connected-fallback key=%s coordinator=%s', keyStr, connectedPick.toString().substring(0, 12));
|
|
203
|
+
return connectedPick;
|
|
204
|
+
}
|
|
205
|
+
// If no connections and not the last attempt, wait and retry
|
|
206
|
+
if (connected.length === 0 && attempt < maxRetries - 1) {
|
|
207
|
+
this.log('findCoordinator:no-connections-retry key=%s attempt=%d delay=%dms', keyStr, attempt, retryDelayMs);
|
|
208
|
+
await new Promise(resolve => setTimeout(resolve, retryDelayMs));
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// last resort: prefer self only if not excluded and guard allows
|
|
213
|
+
const self = this.libp2p.peerId;
|
|
214
|
+
if (!excludedSet.has(self.toString())) {
|
|
215
|
+
const decision = this.shouldAllowSelfCoordination();
|
|
216
|
+
if (!decision.allow) {
|
|
217
|
+
this.log('findCoordinator:self-coord-blocked key=%s reason=%s', keyStr, decision.reason);
|
|
218
|
+
throw new Error(`Self-coordination blocked: ${decision.reason}. No coordinator available for key.`);
|
|
219
|
+
}
|
|
220
|
+
if (decision.warn) {
|
|
221
|
+
this.log('findCoordinator:self-selected-warn key=%s coordinator=%s reason=%s', keyStr, self.toString().substring(0, 12), decision.reason);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
this.log('findCoordinator:self-selected key=%s coordinator=%s reason=%s', keyStr, self.toString().substring(0, 12), decision.reason);
|
|
225
|
+
}
|
|
226
|
+
return self;
|
|
227
|
+
}
|
|
228
|
+
this.log('findCoordinator:all-excluded key=%s self=%s', keyStr, self.toString().substring(0, 12));
|
|
229
|
+
throw new Error('No coordinator available for key (all candidates excluded)');
|
|
230
|
+
}
|
|
231
|
+
getConnectedAddrsByPeer() {
|
|
232
|
+
const conns = this.libp2p.getConnections();
|
|
233
|
+
const byPeer = {};
|
|
234
|
+
for (const c of conns) {
|
|
235
|
+
const id = c.remotePeer.toString();
|
|
236
|
+
const addr = c.remoteAddr?.toString?.();
|
|
237
|
+
if (addr)
|
|
238
|
+
(byPeer[id] ??= []).push(addr);
|
|
239
|
+
}
|
|
240
|
+
return byPeer;
|
|
241
|
+
}
|
|
242
|
+
parseMultiaddrs(addrs) {
|
|
243
|
+
const out = [];
|
|
244
|
+
for (const a of addrs) {
|
|
245
|
+
try {
|
|
246
|
+
out.push(multiaddr(a));
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
console.warn('invalid multiaddr from connection', a, err);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return out;
|
|
253
|
+
}
|
|
254
|
+
async findCluster(key) {
|
|
255
|
+
const fret = this.getFret();
|
|
256
|
+
const coord = await hashKey(key);
|
|
257
|
+
const cohort = fret.assembleCohort(coord, this.clusterSize);
|
|
258
|
+
const keyStr = this.toCacheKey(key).substring(0, 12);
|
|
259
|
+
// Include self in the cohort
|
|
260
|
+
const ids = Array.from(new Set([...cohort, this.libp2p.peerId.toString()]));
|
|
261
|
+
const connectedByPeer = this.getConnectedAddrsByPeer();
|
|
262
|
+
const connectedPeerIds = Object.keys(connectedByPeer);
|
|
263
|
+
this.log('findCluster key=%s fretCohort=%d connected=%d cohortPeers=%o', keyStr, cohort.length, connectedPeerIds.length, ids.map(s => s.substring(0, 12)));
|
|
264
|
+
const peers = {};
|
|
265
|
+
for (const idStr of ids) {
|
|
266
|
+
if (idStr === this.libp2p.peerId.toString()) {
|
|
267
|
+
peers[idStr] = { multiaddrs: this.libp2p.getMultiaddrs(), publicKey: this.libp2p.peerId.publicKey?.raw ?? new Uint8Array() };
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const strings = connectedByPeer[idStr] ?? [];
|
|
271
|
+
const addrs = this.parseMultiaddrs(strings);
|
|
272
|
+
peers[idStr] = { multiaddrs: addrs, publicKey: new Uint8Array() };
|
|
273
|
+
}
|
|
274
|
+
this.log('findCluster:result key=%s clusterSize=%d withAddrs=%d connectedInCohort=%d', keyStr, Object.keys(peers).length, Object.values(peers).filter(p => p.multiaddrs.length > 0).length, ids.filter(id => connectedPeerIds.includes(id) || id === this.libp2p.peerId.toString()).length);
|
|
275
|
+
return peers;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=libp2p-key-network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libp2p-key-network.js","sourceRoot":"","sources":["../../src/libp2p-key-network.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAyB1C,MAAM,OAAO,oBAAoB;IAMd;IACA;IAND,sBAAsB,CAAmC;IAClE,oBAAoB,GAAG,CAAC,CAAC;IACzB,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvC,YACkB,MAAc,EACd,cAAsB,EAAE,EACzC,sBAA+C;QAF9B,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAa;QAGzC,IAAI,CAAC,sBAAsB,GAAG;YAC7B,aAAa,EAAE,sBAAsB,EAAE,aAAa,IAAI,MAAM;YAC9D,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,IAAI,GAAG;YACrE,qBAAqB,EAAE,sBAAsB,EAAE,qBAAqB,IAAI,IAAI;SAC5E,CAAC;QACF,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAChC,CAAC;IAED,sGAAsG;IACrF,gBAAgB,GAAG,IAAI,GAAG,EAA2C,CAAA;IAC9E,MAAM,CAAU,iBAAiB,GAAG,IAAI,CAAA;IAC/B,GAAG,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAA;IAEjD,UAAU,CAAC,GAAe,IAAY,OAAO,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA,CAAC,CAAC;IAEnF;;OAEG;IACK,uBAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACpD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,yBAAyB;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;QACzD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC/C,IAAI,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACxD,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,aAAa,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,2CAA2C,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YACvG,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,wDAAwD;YACxD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,cAAc;YACxD,IAAI,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9C,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,gDAAgD,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACvF,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,2BAA2B;QAC1B,uBAAuB;QACvB,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,EAAE,CAAC;YACxD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC7C,CAAC;QAED,yDAAyD;QACzD,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAClD,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;gBACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YACvD,CAAC;YAED,yDAAyD;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC3E,IAAI,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;gBAChE,IAAI,CAAC,GAAG,CAAC,yEAAyE,EACjF,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;gBAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;YACzD,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,uCAAuC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/D,yDAAyD;gBACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;gBAChE,IAAI,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC;oBACrE,IAAI,CAAC,GAAG,CAAC,yDAAyD,EAAE,mBAAmB,CAAC,CAAC;oBACzF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;gBAC7D,CAAC;YACF,CAAC;QACF,CAAC;QAED,wDAAwD;QACxD,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChE,IAAI,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC;YACrE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;YACzD,wDAAwD;YACxD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,yDAAyD,EAAE,mBAAmB,CAAC,CAAC;gBACzF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;YAC7D,CAAC;QACF,CAAC;QAED,yEAAyE;QACzE,IAAI,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAEM,iBAAiB,CAAC,GAAe,EAAE,MAAc,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG;gBAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,KAAK,EAAE,CAAC,CAAA;QAClE,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAA2B,CAAA;YAChF,IAAI,QAAQ,IAAI,IAAI;gBAAE,MAAK;YAC3B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACvC,CAAC;IACF,CAAC;IAEO,oBAAoB,CAAC,GAAe;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,GAAG,CAAC,EAAE,CAAA;QAClD,IAAI,GAAG;YAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACxC,OAAO,SAAS,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,QAAgB,EAAE,QAAuB;QAChE,MAAM,KAAK,GAAI,IAAI,CAAC,MAAc,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;YAC3F,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAoB,CAAA;QACzD,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAW,CAAA;QACpF,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAA;IACjE,CAAC;IAEO,OAAO;QACd,MAAM,GAAG,GAAI,IAAI,CAAC,MAAqC,CAAC,QAAQ,EAAE,IAAI,CAAA;QACtE,IAAI,GAAG,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACtF,OAAO,GAAG,CAAA;IACX,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,GAAe,EAAE,KAAa;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAe,EAAE,QAA0C;QAChF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,GAAG,CAAC,0CAA0C,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAElH,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,kDAAkD,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACxG,OAAO,MAAM,CAAA;QACd,CAAC;QAED,oFAAoF;QACpF,MAAM,UAAU,GAAG,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,GAAG,CAAC;QAEzB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,8CAA8C;YAC9C,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAa,CAAA;YAClG,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YAC9D,IAAI,CAAC,GAAG,CAAC,qEAAqE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAErK,yEAAyE;YACzE,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;gBAClE,IAAI,CAAC,GAAG,CAAC,qDAAqD,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;gBAEzG,0CAA0C;gBAC1C,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACvG,IAAI,CAAC,GAAG,CAAC,yDAAyD,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;gBAEnJ,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC9D,IAAI,IAAI,EAAE,CAAC;oBACV,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBAClC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;oBAChC,IAAI,CAAC,GAAG,CAAC,qDAAqD,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;oBAC9F,OAAO,GAAG,CAAA;gBACX,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,GAAG,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAA;YAClE,CAAC;YAED,mEAAmE;YACnE,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,IAAI,aAAa,EAAE,CAAC;gBACnB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;gBAC1C,IAAI,CAAC,GAAG,CAAC,0DAA0D,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBACvH,OAAO,aAAa,CAAA;YACrB,CAAC;YAED,6DAA6D;YAC7D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,GAAG,CAAC,mEAAmE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;gBAC5G,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;gBAC/D,SAAQ;YACT,CAAC;QACF,CAAC;QAED,iEAAiE;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,qDAAqD,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACzF,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,qCAAqC,CAAC,CAAC;YACrG,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,oEAAoE,EAC5E,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,+DAA+D,EACvE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,IAAI,CAAA;QACZ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,6CAA6C,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACjG,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC9E,CAAC;IAEO,uBAAuB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;QAC1C,MAAM,MAAM,GAA6B,EAAE,CAAA;QAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAA;YAClC,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAA;YACvC,IAAI,IAAI;gBAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,MAAM,CAAA;IACd,CAAC;IAEO,eAAe,CAAC,KAAe;QACtC,MAAM,GAAG,GAAmC,EAAE,CAAA;QAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC;gBAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;YAAC,CAAC;QACzG,CAAC;QACD,OAAO,GAAG,CAAA;IACX,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAe;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAErD,6BAA6B;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;QAE3E,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAA;QACtD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAErD,IAAI,CAAC,GAAG,CAAC,8DAA8D,EACtE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAElF,MAAM,KAAK,GAAiB,EAAE,CAAA;QAE9B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC7C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,EAAE,CAAA;gBAC5H,SAAQ;YACT,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;YAC3C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,UAAU,EAAE,EAAE,CAAA;QAClE,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,4EAA4E,EACpF,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAChE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAChG,OAAO,KAAK,CAAA;IACb,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Libp2p } from 'libp2p';
|
|
2
|
+
import type { ITransactionValidator } from '@optimystic/db-core';
|
|
3
|
+
import type { StorageMonitorConfig } from './storage/storage-monitor.js';
|
|
4
|
+
export type NodeOptions = {
|
|
5
|
+
port: number;
|
|
6
|
+
bootstrapNodes: string[];
|
|
7
|
+
networkName: string;
|
|
8
|
+
fretProfile?: 'edge' | 'core';
|
|
9
|
+
id?: string;
|
|
10
|
+
relay?: boolean;
|
|
11
|
+
storageType?: 'memory' | 'file';
|
|
12
|
+
storagePath?: string;
|
|
13
|
+
clusterSize?: number;
|
|
14
|
+
clusterPolicy?: {
|
|
15
|
+
allowDownsize?: boolean;
|
|
16
|
+
sizeTolerance?: number;
|
|
17
|
+
superMajorityThreshold?: number;
|
|
18
|
+
};
|
|
19
|
+
/** Arachnode storage configuration */
|
|
20
|
+
arachnode?: {
|
|
21
|
+
enableRingZulu?: boolean;
|
|
22
|
+
storage?: StorageMonitorConfig;
|
|
23
|
+
};
|
|
24
|
+
/** Transaction validator for cluster consensus */
|
|
25
|
+
validator?: ITransactionValidator;
|
|
26
|
+
};
|
|
27
|
+
export declare function createLibp2pNode(options: NodeOptions): Promise<Libp2p>;
|
|
28
|
+
//# sourceMappingURL=libp2p-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libp2p-node.d.ts","sourceRoot":"","sources":["../../src/libp2p-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAoBnD,OAAO,KAAK,EAAmB,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAQlF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAMzE,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE;QACf,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;IAEF,sCAAsC;IACtC,SAAS,CAAC,EAAE;QACX,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,OAAO,CAAC,EAAE,oBAAoB,CAAC;KAC/B,CAAC;IAEF,kDAAkD;IAClD,SAAS,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAkR5E"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { createLibp2p } from 'libp2p';
|
|
2
|
+
import { tcp } from '@libp2p/tcp';
|
|
3
|
+
import { noise } from '@chainsafe/libp2p-noise';
|
|
4
|
+
import { yamux } from '@chainsafe/libp2p-yamux';
|
|
5
|
+
import { identify } from '@libp2p/identify';
|
|
6
|
+
import { ping } from '@libp2p/ping';
|
|
7
|
+
import { gossipsub } from '@chainsafe/libp2p-gossipsub';
|
|
8
|
+
import { bootstrap } from '@libp2p/bootstrap';
|
|
9
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
10
|
+
import { clusterService } from './cluster/service.js';
|
|
11
|
+
import { repoService } from './repo/service.js';
|
|
12
|
+
import { StorageRepo } from './storage/storage-repo.js';
|
|
13
|
+
import { BlockStorage } from './storage/block-storage.js';
|
|
14
|
+
import { MemoryRawStorage } from './storage/memory-storage.js';
|
|
15
|
+
import { FileRawStorage } from './storage/file-storage.js';
|
|
16
|
+
import { clusterMember } from './cluster/cluster-repo.js';
|
|
17
|
+
import { coordinatorRepo } from './repo/coordinator-repo.js';
|
|
18
|
+
import { Libp2pKeyPeerNetwork } from './libp2p-key-network.js';
|
|
19
|
+
import { ClusterClient } from './cluster/client.js';
|
|
20
|
+
import { networkManagerService } from './network/network-manager-service.js';
|
|
21
|
+
import { fretService } from 'p2p-fret';
|
|
22
|
+
import { syncService } from './sync/service.js';
|
|
23
|
+
import { RestorationCoordinator } from './storage/restoration-coordinator-v2.js';
|
|
24
|
+
import { RingSelector } from './storage/ring-selector.js';
|
|
25
|
+
import { StorageMonitor } from './storage/storage-monitor.js';
|
|
26
|
+
import { ArachnodeFretAdapter } from './storage/arachnode-fret-adapter.js';
|
|
27
|
+
import { PartitionDetector } from './cluster/partition-detector.js';
|
|
28
|
+
export async function createLibp2pNode(options) {
|
|
29
|
+
// Create storage based on type
|
|
30
|
+
const storageType = options.storageType ?? 'memory';
|
|
31
|
+
let rawStorage;
|
|
32
|
+
if (storageType === 'file') {
|
|
33
|
+
if (!options.storagePath) {
|
|
34
|
+
throw new Error('storagePath is required when storageType is "file"');
|
|
35
|
+
}
|
|
36
|
+
rawStorage = new FileRawStorage(options.storagePath);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
rawStorage = new MemoryRawStorage();
|
|
40
|
+
}
|
|
41
|
+
// Create placeholder restore callback (will be replaced after node starts)
|
|
42
|
+
let restoreCallback = async (_blockId, _rev) => {
|
|
43
|
+
return undefined;
|
|
44
|
+
};
|
|
45
|
+
// Create shared storage layers with restoration callback
|
|
46
|
+
const storageRepo = new StorageRepo((blockId) => new BlockStorage(blockId, rawStorage, restoreCallback));
|
|
47
|
+
let clusterImpl;
|
|
48
|
+
let coordinatedRepo;
|
|
49
|
+
const clusterProxy = {
|
|
50
|
+
async update(record) {
|
|
51
|
+
if (!clusterImpl) {
|
|
52
|
+
throw new Error('ClusterMember not initialized');
|
|
53
|
+
}
|
|
54
|
+
return await clusterImpl.update(record);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const repoProxy = {
|
|
58
|
+
async get(blockGets, options) {
|
|
59
|
+
const target = coordinatedRepo ?? storageRepo;
|
|
60
|
+
return await target.get(blockGets, options);
|
|
61
|
+
},
|
|
62
|
+
async pend(request, options) {
|
|
63
|
+
const target = coordinatedRepo ?? storageRepo;
|
|
64
|
+
return await target.pend(request, options);
|
|
65
|
+
},
|
|
66
|
+
async cancel(trxRef, options) {
|
|
67
|
+
const target = coordinatedRepo ?? storageRepo;
|
|
68
|
+
return await target.cancel(trxRef, options);
|
|
69
|
+
},
|
|
70
|
+
async commit(request, options) {
|
|
71
|
+
const target = coordinatedRepo ?? storageRepo;
|
|
72
|
+
return await target.commit(request, options);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
// Parse peer ID if provided
|
|
76
|
+
const peerId = options.id ? await peerIdFromString(options.id) : undefined;
|
|
77
|
+
const libp2pOptions = {
|
|
78
|
+
start: false,
|
|
79
|
+
...(peerId ? { peerId } : {}),
|
|
80
|
+
addresses: {
|
|
81
|
+
listen: [`/ip4/0.0.0.0/tcp/${options.port}`]
|
|
82
|
+
},
|
|
83
|
+
connectionManager: {
|
|
84
|
+
autoDial: true,
|
|
85
|
+
minConnections: 1,
|
|
86
|
+
maxConnections: 16,
|
|
87
|
+
inboundConnectionUpgradeTimeout: 10_000,
|
|
88
|
+
dialQueue: { concurrency: 2, attempts: 2 }
|
|
89
|
+
},
|
|
90
|
+
transports: [tcp()],
|
|
91
|
+
connectionEncrypters: [noise()],
|
|
92
|
+
streamMuxers: [yamux()],
|
|
93
|
+
services: {
|
|
94
|
+
identify: identify({
|
|
95
|
+
protocolPrefix: `/optimystic/${options.networkName}`
|
|
96
|
+
}),
|
|
97
|
+
ping: ping(),
|
|
98
|
+
pubsub: gossipsub({
|
|
99
|
+
allowPublishToZeroTopicPeers: true,
|
|
100
|
+
heartbeatInterval: 7000
|
|
101
|
+
}),
|
|
102
|
+
// Custom services - create wrapper factories that inject dependencies
|
|
103
|
+
cluster: (components) => {
|
|
104
|
+
const serviceFactory = clusterService({
|
|
105
|
+
protocolPrefix: `/optimystic/${options.networkName}`,
|
|
106
|
+
configuredClusterSize: options.clusterSize ?? 10,
|
|
107
|
+
allowClusterDownsize: options.clusterPolicy?.allowDownsize ?? true,
|
|
108
|
+
clusterSizeTolerance: options.clusterPolicy?.sizeTolerance ?? 0.5
|
|
109
|
+
});
|
|
110
|
+
return serviceFactory({
|
|
111
|
+
logger: components.logger,
|
|
112
|
+
registrar: components.registrar,
|
|
113
|
+
cluster: clusterProxy
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
repo: (components) => {
|
|
117
|
+
const serviceFactory = repoService({
|
|
118
|
+
protocolPrefix: `/optimystic/${options.networkName}`
|
|
119
|
+
});
|
|
120
|
+
return serviceFactory({
|
|
121
|
+
logger: components.logger,
|
|
122
|
+
registrar: components.registrar,
|
|
123
|
+
repo: repoProxy
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
sync: (components) => {
|
|
127
|
+
const serviceFactory = syncService({
|
|
128
|
+
protocolPrefix: `/optimystic/${options.networkName}`
|
|
129
|
+
});
|
|
130
|
+
return serviceFactory({
|
|
131
|
+
logger: components.logger,
|
|
132
|
+
registrar: components.registrar,
|
|
133
|
+
repo: repoProxy
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
networkManager: (components) => {
|
|
137
|
+
const svcFactory = networkManagerService({
|
|
138
|
+
clusterSize: options.clusterSize ?? 10,
|
|
139
|
+
expectedRemotes: (options.bootstrapNodes?.length ?? 0) > 0,
|
|
140
|
+
allowClusterDownsize: options.clusterPolicy?.allowDownsize ?? true,
|
|
141
|
+
clusterSizeTolerance: options.clusterPolicy?.sizeTolerance ?? 0.5
|
|
142
|
+
});
|
|
143
|
+
const svc = svcFactory(components);
|
|
144
|
+
try {
|
|
145
|
+
svc.setLibp2p?.(components.libp2p);
|
|
146
|
+
}
|
|
147
|
+
catch { }
|
|
148
|
+
return svc;
|
|
149
|
+
},
|
|
150
|
+
fret: (components) => {
|
|
151
|
+
const svcFactory = fretService({
|
|
152
|
+
k: 15,
|
|
153
|
+
m: 8,
|
|
154
|
+
capacity: 2048,
|
|
155
|
+
profile: options.fretProfile ?? ((options.bootstrapNodes?.length ?? 0) > 0 ? 'core' : 'edge'),
|
|
156
|
+
networkName: options.networkName,
|
|
157
|
+
bootstraps: options.bootstrapNodes ?? []
|
|
158
|
+
});
|
|
159
|
+
const svc = svcFactory(components);
|
|
160
|
+
try {
|
|
161
|
+
svc.setLibp2p(components.libp2p);
|
|
162
|
+
}
|
|
163
|
+
catch { }
|
|
164
|
+
return svc;
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
// Add bootstrap nodes as needed
|
|
168
|
+
peerDiscovery: [
|
|
169
|
+
...(options.bootstrapNodes?.length ? [bootstrap({ list: options.bootstrapNodes })] : [])
|
|
170
|
+
],
|
|
171
|
+
};
|
|
172
|
+
const node = await createLibp2p(libp2pOptions);
|
|
173
|
+
// Inject libp2p reference into services that need it before start
|
|
174
|
+
try {
|
|
175
|
+
node.services?.fret?.setLibp2p?.(node);
|
|
176
|
+
}
|
|
177
|
+
catch { }
|
|
178
|
+
try {
|
|
179
|
+
node.services?.networkManager?.setLibp2p?.(node);
|
|
180
|
+
}
|
|
181
|
+
catch { }
|
|
182
|
+
await node.start();
|
|
183
|
+
// Initialize cluster coordination components
|
|
184
|
+
const keyNetwork = new Libp2pKeyPeerNetwork(node);
|
|
185
|
+
const protocolPrefix = `/optimystic/${options.networkName}`;
|
|
186
|
+
const createClusterClient = (peerId) => ClusterClient.create(peerId, keyNetwork, protocolPrefix);
|
|
187
|
+
// Create partition detector and get FRET service
|
|
188
|
+
const partitionDetector = new PartitionDetector();
|
|
189
|
+
const fretSvc = node.services?.fret;
|
|
190
|
+
clusterImpl = clusterMember({
|
|
191
|
+
storageRepo,
|
|
192
|
+
peerNetwork: keyNetwork,
|
|
193
|
+
peerId: node.peerId,
|
|
194
|
+
protocolPrefix,
|
|
195
|
+
partitionDetector,
|
|
196
|
+
fretService: fretSvc,
|
|
197
|
+
validator: options.validator
|
|
198
|
+
});
|
|
199
|
+
const coordinatorRepoFactory = coordinatorRepo(keyNetwork, createClusterClient, {
|
|
200
|
+
clusterSize: options.clusterSize ?? 10,
|
|
201
|
+
superMajorityThreshold: options.clusterPolicy?.superMajorityThreshold ?? 0.67,
|
|
202
|
+
simpleMajorityThreshold: 0.51,
|
|
203
|
+
minAbsoluteClusterSize: 2, // Allow 2-node clusters for development/small networks
|
|
204
|
+
allowClusterDownsize: options.clusterPolicy?.allowDownsize ?? true,
|
|
205
|
+
clusterSizeTolerance: options.clusterPolicy?.sizeTolerance ?? 0.5,
|
|
206
|
+
partitionDetectionWindow: 60000
|
|
207
|
+
}, fretSvc);
|
|
208
|
+
coordinatedRepo = coordinatorRepoFactory({
|
|
209
|
+
storageRepo,
|
|
210
|
+
localCluster: clusterImpl,
|
|
211
|
+
localPeerId: node.peerId
|
|
212
|
+
});
|
|
213
|
+
// Initialize Arachnode ring membership and restoration
|
|
214
|
+
const enableArachnode = options.arachnode?.enableRingZulu ?? true;
|
|
215
|
+
if (enableArachnode) {
|
|
216
|
+
const log = node.logger?.forComponent?.('db-p2p:arachnode');
|
|
217
|
+
const fret = node.services?.fret;
|
|
218
|
+
if (fret) {
|
|
219
|
+
const fretAdapter = new ArachnodeFretAdapter(fret);
|
|
220
|
+
const storageMonitor = new StorageMonitor(rawStorage, options.arachnode?.storage ?? {});
|
|
221
|
+
const ringSelector = new RingSelector(fretAdapter, storageMonitor, {
|
|
222
|
+
minCapacity: 100 * 1024 * 1024, // 100MB minimum
|
|
223
|
+
thresholds: {
|
|
224
|
+
moveOut: 0.85,
|
|
225
|
+
moveIn: 0.40
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// Determine and announce ring membership
|
|
229
|
+
const peerId = node.peerId.toString();
|
|
230
|
+
const arachnodeInfo = await ringSelector.createArachnodeInfo(peerId);
|
|
231
|
+
fretAdapter.setArachnodeInfo(arachnodeInfo);
|
|
232
|
+
log?.('Announced Arachnode membership: Ring %d', arachnodeInfo.ringDepth);
|
|
233
|
+
// Setup restoration coordinator with FRET adapter
|
|
234
|
+
const restorationCoordinatorV2 = new RestorationCoordinator(fretAdapter, { connect: (pid, protocol) => node.dialProtocol(pid, [protocol]) }, `/optimystic/${options.networkName}`);
|
|
235
|
+
// Update restore callback to use new coordinator
|
|
236
|
+
const newRestoreCallback = async (blockId, rev) => {
|
|
237
|
+
return await restorationCoordinatorV2.restore(blockId, rev);
|
|
238
|
+
};
|
|
239
|
+
// Replace the restore callback (this is a bit hacky, but works for now)
|
|
240
|
+
// In production, we'd want to properly manage this
|
|
241
|
+
storageRepo.createBlockStorage = (blockId) => new BlockStorage(blockId, rawStorage, newRestoreCallback);
|
|
242
|
+
// Monitor capacity and adjust ring periodically
|
|
243
|
+
const monitorInterval = setInterval(async () => {
|
|
244
|
+
const transition = await ringSelector.shouldTransition();
|
|
245
|
+
if (transition.shouldMove) {
|
|
246
|
+
log?.('Ring transition needed: moving %s to Ring %d', transition.direction, transition.newRingDepth);
|
|
247
|
+
// Update Arachnode info with new ring
|
|
248
|
+
const updatedInfo = await ringSelector.createArachnodeInfo(peerId);
|
|
249
|
+
fretAdapter.setArachnodeInfo(updatedInfo);
|
|
250
|
+
}
|
|
251
|
+
}, 60_000); // Check every minute
|
|
252
|
+
// Cleanup on node stop
|
|
253
|
+
const originalStop = node.stop.bind(node);
|
|
254
|
+
node.stop = async () => {
|
|
255
|
+
clearInterval(monitorInterval);
|
|
256
|
+
await originalStop();
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
log?.('FRET service not available, Arachnode disabled');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Skip proactive bootstrap dials; rely on discovery and minimal churn
|
|
264
|
+
// Expose coordinated repo and storage for external use
|
|
265
|
+
node.coordinatedRepo = coordinatedRepo;
|
|
266
|
+
node.storageRepo = storageRepo;
|
|
267
|
+
node.keyNetwork = keyNetwork;
|
|
268
|
+
return node;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=libp2p-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libp2p-node.js","sourceRoot":"","sources":["../../src/libp2p-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,KAAK,CAAC,QAAQ,CAEjE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,cAAc,GAAG,mBAAmB,CAAA;AAE1C,MAAM,UAAU,YAAY,CAAC,YAAoB;IAChD,OAAO,KAAK,CAAC,GAAG,cAAc,IAAI,YAAY,EAAE,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-network-manager.d.ts","sourceRoot":"","sources":["../../../src/network/get-network-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAKzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAQrE"}
|