Esempio n. 1
0
    function loop (err, node) {
      if (err) return done(err)
      if (node) roots.push(node)

      if (!indexes.length) {
        self._merkle = merkle(hash, roots)
        if (wroteFeed) self._core._feeds.put(self.publicId.toString('hex'), self, openStorage)
        else openStorage()
      } else {
        self._core._nodes.get(self._prefix + indexes.shift(), loop)
      }
    }
Esempio n. 2
0
    function loop (err, node) {
      if (err) return done(err)
      if (node) roots.push(node)

      if (!indexes.length) {
        self.bytes = Math.max(self.bytes, byteSize(roots))
        self._merkle = merkle(hash, roots)
        if (wroteFeed) self._core._feeds.put(self.discoveryKey.toString('hex'), self, openStorage)
        else setTimeout(openStorage, 1) // There is a race condition in the protocol parser that requres this to be async. Investigate!
      } else {
        self._core._nodes.get(self._prefix + indexes.shift(), loop)
      }
    }
Esempio n. 3
0
Feed.prototype._open = function (cb) {
  var self = this
  var wroteFeed = false

  if (!this.discoveryKey) {
    this.prefix = this.options.prefix || crypto.randomBytes(32)
    this._merkle = merkle(hash)
    this._prefix = '!' + this.prefix.toString('hex') + '!'
    return process.nextTick(openStorage)
  }

  this._core._feeds.get(this.discoveryKey.toString('hex'), function (err, feed) {
    if (err) self._core._feeds.get(self.key.toString('hex'), onfeed)
    else onfeed(null, feed)
  })

  function onfeed (_, feed) {
    if (feed) {
      self.discoveryKey = feed.discoveryKey
      self.key = feed.key
      self.secretKey = feed.secretKey
      self.prefix = feed.prefix || feed.key
      self.live = feed.live
    } else {
      var owner = self.secretKey || !self.key // TODO: expose this
      if (owner) wroteFeed = true
    }

    if (!self.prefix) self.prefix = self.options.prefix || crypto.randomBytes(32)
    self._prefix = '!' + self.prefix.toString('hex') + '!'

    var missing = 2

    self._core._bitfields.get(self._prefix + 'tree', function (_, buffer) {
      if (buffer) self.tree = tree(buffer)
      if (!--missing) index()
    })

    self._core._bitfields.get(self._prefix + 'blocks', function (_, buffer) {
      if (buffer) self.bitfield = bitfield(buffer)
      if (!--missing) index()
    })
  }

  function index () {
    // TODO: move this to first append instead of on open for a bit faster open
    var indexes = self.tree.roots()
    var roots = []

    if (indexes.length) self.blocks = flat.rightSpan(indexes[indexes.length - 1]) / 2 + 1

    loop(null, null)

    function loop (err, node) {
      if (err) return done(err)
      if (node) roots.push(node)

      if (!indexes.length) {
        self.bytes = Math.max(self.bytes, byteSize(roots))
        self._merkle = merkle(hash, roots)
        if (wroteFeed) self._core._feeds.put(self.discoveryKey.toString('hex'), self, openStorage)
        else setTimeout(openStorage, 1) // There is a race condition in the protocol parser that requres this to be async. Investigate!
      } else {
        self._core._nodes.get(self._prefix + indexes.shift(), loop)
      }
    }
  }

  function openStorage (err) {
    if (err) return done(err)
    if (!self.storage) return done(null)
    self.storage.open(done)
  }

  function done (err) {
    if (err) return cb(err)
    if (wroteFeed) self._first = false
    self.opened = true
    self.emit('open')
    cb()
  }
}
Esempio n. 4
0
Feed.prototype._open = function (cb) {
  var self = this
  var wroteFeed = false

  if (!this.publicId) {
    this.prefix = this.options.prefix || crypto.randomBytes(32)
    this._merkle = merkle(hash)
    this._prefix = '!' + this.prefix.toString('hex') + '!'
    return process.nextTick(openStorage)
  }

  this._core._feeds.get(this.publicId.toString('hex'), function (err, feed) {
    if (err) self._core._feeds.get(self.key.toString('hex'), onfeed)
    else onfeed(null, feed)
  })

  function onfeed (_, feed) {
    if (feed) {
      self.publicId = feed.publicId
      self.key = feed.key
      self.secretKey = feed.secretKey
      self.prefix = feed.prefix || feed.key
      self.live = feed.live
    } else {
      wroteFeed = true
    }

    if (!self.prefix) self.prefix = self.options.prefix || crypto.randomBytes(32)
    self._prefix = '!' + self.prefix.toString('hex') + '!'

    var missing = 2

    self._core._bitfields.get(self._prefix + 'tree', function (_, buffer) {
      if (buffer) self.tree = tree(buffer)
      if (!--missing) index()
    })

    self._core._bitfields.get(self._prefix + 'blocks', function (_, buffer) {
      if (buffer) self.bitfield = bitfield(buffer)
      if (!--missing) index()
    })
  }

  function index () {
    // TODO: move this to first append instead of on open for a bit faster open
    var indexes = self.tree.roots()
    var roots = []

    if (indexes.length) self.blocks = flat.rightSpan(indexes[indexes.length - 1]) / 2 + 1

    loop(null, null)

    function loop (err, node) {
      if (err) return done(err)
      if (node) roots.push(node)

      if (!indexes.length) {
        self._merkle = merkle(hash, roots)
        if (wroteFeed) self._core._feeds.put(self.publicId.toString('hex'), self, openStorage)
        else openStorage()
      } else {
        self._core._nodes.get(self._prefix + indexes.shift(), loop)
      }
    }
  }

  function openStorage (err) {
    if (err) return done(err)
    if (!self.storage) return done(null)
    self.storage.open(done)
  }

  function done (err) {
    if (err) return cb(err)
    if (wroteFeed) self._first = false
    self.opened = true
    self.emit('open')
    cb()
  }
}