hypercore 11.27.2 → 11.27.4

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/index.js CHANGED
@@ -117,6 +117,10 @@ class Hypercore extends EventEmitter {
117
117
  UPDATE_COMPAT(enableCompat)
118
118
  }
119
119
 
120
+ static setRecoveryPeers(peers) {
121
+ Core.setRecoveryPeers(peers)
122
+ }
123
+
120
124
  static key(manifest, { compat, version, namespace } = {}) {
121
125
  if (b4a.isBuffer(manifest)) {
122
126
  manifest = { version, signers: [{ publicKey: manifest, namespace }] }
package/lib/core.js CHANGED
@@ -67,6 +67,10 @@ module.exports = class Core {
67
67
  this.opening.catch(noop)
68
68
  }
69
69
 
70
+ static setRecoveryPeers(peers) {
71
+ SessionState.RECOVERY_PEERS = peers
72
+ }
73
+
70
74
  ready() {
71
75
  return this.opening
72
76
  }
@@ -16,7 +16,7 @@ const Mutex = require('./mutex')
16
16
  const Bitfield = require('./bitfield')
17
17
  const { MerkleTree, MerkleTreeBatch } = require('./merkle-tree')
18
18
 
19
- module.exports = class SessionState {
19
+ class SessionState {
20
20
  constructor(core, parent, storage, treeInfo, name) {
21
21
  this.core = core
22
22
  this.index = this.core.sessionStates.push(this) - 1
@@ -54,6 +54,8 @@ module.exports = class SessionState {
54
54
  this.ref()
55
55
  }
56
56
 
57
+ static RECOVERY_PEERS = null
58
+
57
59
  isSnapshot() {
58
60
  return this.storage.snapshotted
59
61
  }
@@ -574,17 +576,27 @@ module.exports = class SessionState {
574
576
  const replicator = this.core.replicator
575
577
 
576
578
  while (!this.closing) {
577
- if (replicator.peers.length < 1) {
579
+ let peers = getRecoveryPeers(replicator.peers)
580
+
581
+ if (peers.length < 1) {
578
582
  await new Promise((resolve) => setTimeout(resolve, 5000))
579
583
  continue
580
584
  }
581
585
 
582
- await new Promise((resolve) => setTimeout(resolve, 5000))
586
+ let restart = false
587
+
588
+ for (let i = 0; i < 32; i++) {
589
+ await new Promise((resolve) => setTimeout(resolve, 250))
583
590
 
584
- const peers = replicator.peers
591
+ peers = getRecoveryPeers(replicator.peers)
592
+
593
+ if (this.closing || !validateRecoveryPeers(peers, this.length)) {
594
+ restart = true
595
+ break
596
+ }
597
+ }
585
598
 
586
- if (peers.length < 1 || this.closing) continue
587
- if (peers[0].remoteLength > this.length) continue
599
+ if (restart) continue
588
600
 
589
601
  if (this.length !== length) {
590
602
  throw SESSION_NOT_WRITABLE('core recovered during append')
@@ -1189,6 +1201,8 @@ module.exports = class SessionState {
1189
1201
  }
1190
1202
  }
1191
1203
 
1204
+ module.exports = SessionState
1205
+
1192
1206
  function noop() {}
1193
1207
 
1194
1208
  function getBitfieldPage(index) {
@@ -1287,3 +1301,36 @@ function isRootIndex(index, roots) {
1287
1301
 
1288
1302
  return false
1289
1303
  }
1304
+
1305
+ function getRecoveryPeers(peers) {
1306
+ if (!SessionState.RECOVERY_PEERS) return peers
1307
+
1308
+ const actual = []
1309
+
1310
+ for (const p of peers) {
1311
+ for (const r of SessionState.RECOVERY_PEERS) {
1312
+ if (b4a.equals(p.remotePublicKey, r)) {
1313
+ actual.push(p)
1314
+ break
1315
+ }
1316
+ }
1317
+ }
1318
+
1319
+ return actual
1320
+ }
1321
+
1322
+ function validateRecoveryPeers(peers, length) {
1323
+ if (peers.length < 1) return false
1324
+
1325
+ for (const p of peers) {
1326
+ if (p.remoteLength > length) return false
1327
+ }
1328
+
1329
+ let all = true
1330
+
1331
+ for (const p of peers) {
1332
+ if (p.remoteLength === 0) all = false
1333
+ }
1334
+
1335
+ return all
1336
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hypercore",
3
- "version": "11.27.2",
3
+ "version": "11.27.4",
4
4
  "description": "Hypercore is a secure, distributed append-only log",
5
5
  "main": "index.js",
6
6
  "scripts": {