Skip to content
This repository has been archived by the owner on Dec 28, 2022. It is now read-only.

Add preupgrade hook #129

Closed
wants to merge 15 commits into from
39 changes: 21 additions & 18 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,8 @@ module.exports = class Hypercore extends EventEmitter {

// If snapshotted, make sure to update our compat so we can fail gets
if (s._snapshot && bitfield.start < s._snapshot.compatLength) s._snapshot.compatLength = bitfield.start

if (s._preupgrade) s._preupgrading = null
}

if (s.sparse ? truncated : truncatedNonSparse) {
Expand Down Expand Up @@ -613,6 +615,8 @@ module.exports = class Hypercore extends EventEmitter {
return this._updateSnapshot()
}

const fork = this.core.tree.fork
const preupgradeLength = this.core.tree.length
kasperisager marked this conversation as resolved.
Show resolved Hide resolved
const activeRequests = (opts && opts.activeRequests) || this.activeRequests
const req = this.replicator.addUpgrade(activeRequests)

Expand All @@ -621,31 +625,30 @@ module.exports = class Hypercore extends EventEmitter {
let upgraded = await req.promise

if (this._preupgrade) {
if (this._preupgrading === null) {
let preupgrading = this._preupgrading
if (preupgrading === null) {
const latest = this.session()

const preupgrading = this._preupgrading = Promise.resolve(this._preupgrade(latest))

this._preupgrading
preupgrading = this._preupgrading = Promise.resolve(this._preupgrade(latest))
preupgrading
.catch(noop)
kasperisager marked this conversation as resolved.
Show resolved Hide resolved
.then(() => {
latest.close()

if (this._preupgrading === preupgrading) {
this._preupgrading = null
}
})
.then(() => latest.close())
}

const length = await this._preupgrading
const preupgradeLength = this._snapshot.length
const length = await preupgrading

if (this._preupgrading === preupgrading) {
this._preupgrading = null
}

if (typeof length === 'number' && length >= preupgradeLength && length < this.core.tree.length) {
this._snapshot = {
length,
byteLength: 0,
fork: this.core.tree.fork,
compatLength: length
if (fork === this.core.tree.fork) {
this._snapshot = {
length,
byteLength: 0,
fork,
compatLength: length
}
}

return length !== preupgradeLength
Expand Down