Code coverage report for lib/store.js

Statements: 98.25% (56 / 57)      Branches: 91.67% (11 / 12)      Functions: 100% (9 / 9)      Lines: 100% (54 / 54)      Ignored: none     

All files » lib/ » store.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100  1 1 1 1 1 1 1   1   1 70   35   35 35   35 35     1 124 124 124   124   124 124 118       1 6 6 6 6   6   6             66 66   66 5 5 5       6 1 1 1         1 110 110 110 110   110   110   1 110 110         1 110 110                 110    
 
const levelup = require('levelup')
const hooks = require('level-hooks')
const memdown = require('memdown')
const xtend = require('xtend')
const debug = require('debug')
const encode = require('bytewise/hex').encode
const decode = require('bytewise/hex').decode
 
module.exports = Store
 
function Store() {
  if (!(this instanceof Store)) return new Store()
 
  var store = this
 
  store.debug = debug('haiku:store')
  store.db = levelup(memdown, { encoding: 'json' })
 
  hooks(store.db)
  store.db.hooks.pre(/^\//, before)
}
 
Store.prototype.get = function(key, callback) {
  var store = this
  var debug = store.debug
  var db = store.db
 
  debug('get %s', key)
 
  db.get(key, function(err, value) {
    if (err && err.notFound) store.search(key, callback)
    else callback(err, value)
  })
}
 
Store.prototype.search = function(key, callback) {
  var store = this
  var debug = store.debug
  var db = store.db
  var done = false
 
  debug('searching for: %s', key)
 
  db
  .createReadStream({
    keys: true,
    values: true,
    gt: encode([ undefined ])
  })
  .on('data', function(data) {
    var array = decode(data.key)
    var match = array.indexOf(key) >= 0
 
    if (match) {
      debug('match found for: %s', key)
      done = true
      store.get(data.value, callback)
    }
  })
  .on('end', function() {
    if (! done) {
      var err = new Error('Not Found')
      err.notFound = true
      callback(err)
    }
  })
}
 
Store.prototype.put = function(page, callback) {
  var store = this
  var debug = store.debug
  var db = store.db
  var key = page.url
 
  debug('put: %s', key)
 
  db.put(key, page, onput)
 
  function onput(err) {
    Iif (err) callback(err)
    else store.get(key, callback)
  }
}
 
// See level-hooks
function before(change, add) {
  var page = change.value
  var key = encode([
        undefined,
        page.url,
        page.name,
        page.slug,
        page.index,
        page.index + '/'
      ])
 
  add({ key: key, value: change.key, type: 'put' })
}