@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.
Files changed (189) hide show
  1. package/dist/index.min.js +52 -0
  2. package/dist/index.min.js.map +7 -0
  3. package/dist/src/cluster/client.d.ts +12 -0
  4. package/dist/src/cluster/client.d.ts.map +1 -0
  5. package/dist/src/cluster/client.js +65 -0
  6. package/dist/src/cluster/client.js.map +1 -0
  7. package/dist/src/cluster/cluster-repo.d.ts +79 -0
  8. package/dist/src/cluster/cluster-repo.d.ts.map +1 -0
  9. package/dist/src/cluster/cluster-repo.js +613 -0
  10. package/dist/src/cluster/cluster-repo.js.map +1 -0
  11. package/dist/src/cluster/partition-detector.d.ts +59 -0
  12. package/dist/src/cluster/partition-detector.d.ts.map +1 -0
  13. package/dist/src/cluster/partition-detector.js +129 -0
  14. package/dist/src/cluster/partition-detector.js.map +1 -0
  15. package/dist/src/cluster/service.d.ts +49 -0
  16. package/dist/src/cluster/service.d.ts.map +1 -0
  17. package/dist/src/cluster/service.js +107 -0
  18. package/dist/src/cluster/service.js.map +1 -0
  19. package/dist/src/index.d.ts +29 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +29 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/it-utility.d.ts +4 -0
  24. package/dist/src/it-utility.d.ts.map +1 -0
  25. package/dist/src/it-utility.js +32 -0
  26. package/dist/src/it-utility.js.map +1 -0
  27. package/dist/src/libp2p-key-network.d.ts +59 -0
  28. package/dist/src/libp2p-key-network.d.ts.map +1 -0
  29. package/dist/src/libp2p-key-network.js +278 -0
  30. package/dist/src/libp2p-key-network.js.map +1 -0
  31. package/dist/src/libp2p-node.d.ts +28 -0
  32. package/dist/src/libp2p-node.d.ts.map +1 -0
  33. package/dist/src/libp2p-node.js +270 -0
  34. package/dist/src/libp2p-node.js.map +1 -0
  35. package/dist/src/logger.d.ts +3 -0
  36. package/dist/src/logger.d.ts.map +1 -0
  37. package/dist/src/logger.js +6 -0
  38. package/dist/src/logger.js.map +1 -0
  39. package/dist/src/network/get-network-manager.d.ts +4 -0
  40. package/dist/src/network/get-network-manager.d.ts.map +1 -0
  41. package/dist/src/network/get-network-manager.js +17 -0
  42. package/dist/src/network/get-network-manager.js.map +1 -0
  43. package/dist/src/network/network-manager-service.d.ts +82 -0
  44. package/dist/src/network/network-manager-service.d.ts.map +1 -0
  45. package/dist/src/network/network-manager-service.js +283 -0
  46. package/dist/src/network/network-manager-service.js.map +1 -0
  47. package/dist/src/peer-utils.d.ts +2 -0
  48. package/dist/src/peer-utils.d.ts.map +1 -0
  49. package/dist/src/peer-utils.js +28 -0
  50. package/dist/src/peer-utils.js.map +1 -0
  51. package/dist/src/protocol-client.d.ts +12 -0
  52. package/dist/src/protocol-client.d.ts.map +1 -0
  53. package/dist/src/protocol-client.js +34 -0
  54. package/dist/src/protocol-client.js.map +1 -0
  55. package/dist/src/repo/client.d.ts +17 -0
  56. package/dist/src/repo/client.d.ts.map +1 -0
  57. package/dist/src/repo/client.js +82 -0
  58. package/dist/src/repo/client.js.map +1 -0
  59. package/dist/src/repo/cluster-coordinator.d.ts +59 -0
  60. package/dist/src/repo/cluster-coordinator.d.ts.map +1 -0
  61. package/dist/src/repo/cluster-coordinator.js +539 -0
  62. package/dist/src/repo/cluster-coordinator.js.map +1 -0
  63. package/dist/src/repo/coordinator-repo.d.ts +29 -0
  64. package/dist/src/repo/coordinator-repo.d.ts.map +1 -0
  65. package/dist/src/repo/coordinator-repo.js +102 -0
  66. package/dist/src/repo/coordinator-repo.js.map +1 -0
  67. package/dist/src/repo/redirect.d.ts +14 -0
  68. package/dist/src/repo/redirect.d.ts.map +1 -0
  69. package/dist/src/repo/redirect.js +9 -0
  70. package/dist/src/repo/redirect.js.map +1 -0
  71. package/dist/src/repo/service.d.ts +52 -0
  72. package/dist/src/repo/service.d.ts.map +1 -0
  73. package/dist/src/repo/service.js +181 -0
  74. package/dist/src/repo/service.js.map +1 -0
  75. package/dist/src/repo/types.d.ts +7 -0
  76. package/dist/src/repo/types.d.ts.map +1 -0
  77. package/dist/src/repo/types.js +2 -0
  78. package/dist/src/repo/types.js.map +1 -0
  79. package/dist/src/routing/libp2p-known-peers.d.ts +4 -0
  80. package/dist/src/routing/libp2p-known-peers.d.ts.map +1 -0
  81. package/dist/src/routing/libp2p-known-peers.js +19 -0
  82. package/dist/src/routing/libp2p-known-peers.js.map +1 -0
  83. package/dist/src/routing/responsibility.d.ts +14 -0
  84. package/dist/src/routing/responsibility.d.ts.map +1 -0
  85. package/dist/src/routing/responsibility.js +45 -0
  86. package/dist/src/routing/responsibility.js.map +1 -0
  87. package/dist/src/routing/simple-cluster-coordinator.d.ts +23 -0
  88. package/dist/src/routing/simple-cluster-coordinator.d.ts.map +1 -0
  89. package/dist/src/routing/simple-cluster-coordinator.js +59 -0
  90. package/dist/src/routing/simple-cluster-coordinator.js.map +1 -0
  91. package/dist/src/storage/arachnode-fret-adapter.d.ts +65 -0
  92. package/dist/src/storage/arachnode-fret-adapter.d.ts.map +1 -0
  93. package/dist/src/storage/arachnode-fret-adapter.js +93 -0
  94. package/dist/src/storage/arachnode-fret-adapter.js.map +1 -0
  95. package/dist/src/storage/block-storage.d.ts +31 -0
  96. package/dist/src/storage/block-storage.d.ts.map +1 -0
  97. package/dist/src/storage/block-storage.js +154 -0
  98. package/dist/src/storage/block-storage.js.map +1 -0
  99. package/dist/src/storage/file-storage.d.ts +30 -0
  100. package/dist/src/storage/file-storage.d.ts.map +1 -0
  101. package/dist/src/storage/file-storage.js +127 -0
  102. package/dist/src/storage/file-storage.js.map +1 -0
  103. package/dist/src/storage/helpers.d.ts +3 -0
  104. package/dist/src/storage/helpers.d.ts.map +1 -0
  105. package/dist/src/storage/helpers.js +28 -0
  106. package/dist/src/storage/helpers.js.map +1 -0
  107. package/dist/src/storage/i-block-storage.d.ts +32 -0
  108. package/dist/src/storage/i-block-storage.d.ts.map +1 -0
  109. package/dist/src/storage/i-block-storage.js +2 -0
  110. package/dist/src/storage/i-block-storage.js.map +1 -0
  111. package/dist/src/storage/i-raw-storage.d.ts +20 -0
  112. package/dist/src/storage/i-raw-storage.d.ts.map +1 -0
  113. package/dist/src/storage/i-raw-storage.js +2 -0
  114. package/dist/src/storage/i-raw-storage.js.map +1 -0
  115. package/dist/src/storage/memory-storage.d.ts +27 -0
  116. package/dist/src/storage/memory-storage.d.ts.map +1 -0
  117. package/dist/src/storage/memory-storage.js +87 -0
  118. package/dist/src/storage/memory-storage.js.map +1 -0
  119. package/dist/src/storage/restoration-coordinator-v2.d.ts +63 -0
  120. package/dist/src/storage/restoration-coordinator-v2.d.ts.map +1 -0
  121. package/dist/src/storage/restoration-coordinator-v2.js +157 -0
  122. package/dist/src/storage/restoration-coordinator-v2.js.map +1 -0
  123. package/dist/src/storage/ring-selector.d.ts +56 -0
  124. package/dist/src/storage/ring-selector.d.ts.map +1 -0
  125. package/dist/src/storage/ring-selector.js +118 -0
  126. package/dist/src/storage/ring-selector.js.map +1 -0
  127. package/dist/src/storage/storage-monitor.d.ts +23 -0
  128. package/dist/src/storage/storage-monitor.d.ts.map +1 -0
  129. package/dist/src/storage/storage-monitor.js +40 -0
  130. package/dist/src/storage/storage-monitor.js.map +1 -0
  131. package/dist/src/storage/storage-repo.d.ts +17 -0
  132. package/dist/src/storage/storage-repo.d.ts.map +1 -0
  133. package/dist/src/storage/storage-repo.js +267 -0
  134. package/dist/src/storage/storage-repo.js.map +1 -0
  135. package/dist/src/storage/struct.d.ts +29 -0
  136. package/dist/src/storage/struct.d.ts.map +1 -0
  137. package/dist/src/storage/struct.js +2 -0
  138. package/dist/src/storage/struct.js.map +1 -0
  139. package/dist/src/sync/client.d.ts +27 -0
  140. package/dist/src/sync/client.d.ts.map +1 -0
  141. package/dist/src/sync/client.js +32 -0
  142. package/dist/src/sync/client.js.map +1 -0
  143. package/dist/src/sync/protocol.d.ts +58 -0
  144. package/dist/src/sync/protocol.d.ts.map +1 -0
  145. package/dist/src/sync/protocol.js +12 -0
  146. package/dist/src/sync/protocol.js.map +1 -0
  147. package/dist/src/sync/service.d.ts +62 -0
  148. package/dist/src/sync/service.d.ts.map +1 -0
  149. package/dist/src/sync/service.js +168 -0
  150. package/dist/src/sync/service.js.map +1 -0
  151. package/package.json +73 -0
  152. package/readme.md +497 -0
  153. package/src/cluster/client.ts +63 -0
  154. package/src/cluster/cluster-repo.ts +711 -0
  155. package/src/cluster/partition-detector.ts +158 -0
  156. package/src/cluster/service.ts +156 -0
  157. package/src/index.ts +30 -0
  158. package/src/it-utility.ts +36 -0
  159. package/src/libp2p-key-network.ts +334 -0
  160. package/src/libp2p-node.ts +335 -0
  161. package/src/logger.ts +9 -0
  162. package/src/network/get-network-manager.ts +17 -0
  163. package/src/network/network-manager-service.ts +334 -0
  164. package/src/peer-utils.ts +24 -0
  165. package/src/protocol-client.ts +54 -0
  166. package/src/repo/client.ts +112 -0
  167. package/src/repo/cluster-coordinator.ts +592 -0
  168. package/src/repo/coordinator-repo.ts +137 -0
  169. package/src/repo/redirect.ts +17 -0
  170. package/src/repo/service.ts +219 -0
  171. package/src/repo/types.ts +7 -0
  172. package/src/routing/libp2p-known-peers.ts +26 -0
  173. package/src/routing/responsibility.ts +63 -0
  174. package/src/routing/simple-cluster-coordinator.ts +70 -0
  175. package/src/storage/arachnode-fret-adapter.ts +128 -0
  176. package/src/storage/block-storage.ts +182 -0
  177. package/src/storage/file-storage.ts +163 -0
  178. package/src/storage/helpers.ts +29 -0
  179. package/src/storage/i-block-storage.ts +40 -0
  180. package/src/storage/i-raw-storage.ts +30 -0
  181. package/src/storage/memory-storage.ts +108 -0
  182. package/src/storage/restoration-coordinator-v2.ts +191 -0
  183. package/src/storage/ring-selector.ts +155 -0
  184. package/src/storage/storage-monitor.ts +59 -0
  185. package/src/storage/storage-repo.ts +320 -0
  186. package/src/storage/struct.ts +34 -0
  187. package/src/sync/client.ts +42 -0
  188. package/src/sync/protocol.ts +71 -0
  189. 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":"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"}
@@ -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,3 @@
1
+ import debug from 'debug';
2
+ export declare function createLogger(subNamespace: string): debug.Debugger;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -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,6 @@
1
+ import debug from 'debug';
2
+ const BASE_NAMESPACE = 'optimystic:db-p2p';
3
+ export function createLogger(subNamespace) {
4
+ return debug(`${BASE_NAMESPACE}:${subNamespace}`);
5
+ }
6
+ //# sourceMappingURL=logger.js.map
@@ -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,4 @@
1
+ import type { Libp2p } from 'libp2p';
2
+ import type { NetworkManagerService } from './network-manager-service.js';
3
+ export declare function getNetworkManager(node: Libp2p): NetworkManagerService;
4
+ //# sourceMappingURL=get-network-manager.d.ts.map
@@ -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"}