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 +4 -0
- package/lib/core.js +4 -0
- package/lib/session-state.js +53 -6
- package/package.json +1 -1
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
package/lib/session-state.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
586
|
+
let restart = false
|
|
587
|
+
|
|
588
|
+
for (let i = 0; i < 32; i++) {
|
|
589
|
+
await new Promise((resolve) => setTimeout(resolve, 250))
|
|
583
590
|
|
|
584
|
-
|
|
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 (
|
|
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
|
+
}
|