| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 | 'use strict'const BB = require('bluebird')const figgyPudding = require('figgy-pudding')const fs = require('fs')const index = require('./lib/entry-index')const memo = require('./lib/memoization')const pipe = require('mississippi').pipeconst pipeline = require('mississippi').pipelineconst read = require('./lib/content/read')const through = require('mississippi').throughconst GetOpts = figgyPudding({  integrity: {},  memoize: {},  size: {}})module.exports = function get (cache, key, opts) {  return getData(false, cache, key, opts)}module.exports.byDigest = function getByDigest (cache, digest, opts) {  return getData(true, cache, digest, opts)}function getData (byDigest, cache, key, opts) {  opts = GetOpts(opts)  const memoized = (    byDigest      ? memo.get.byDigest(cache, key, opts)      : memo.get(cache, key, opts)  )  if (memoized && opts.memoize !== false) {    return BB.resolve(byDigest ? memoized : {      metadata: memoized.entry.metadata,      data: memoized.data,      integrity: memoized.entry.integrity,      size: memoized.entry.size    })  }  return (    byDigest ? BB.resolve(null) : index.find(cache, key, opts)  ).then(entry => {    if (!entry && !byDigest) {      throw new index.NotFoundError(cache, key)    }    return read(cache, byDigest ? key : entry.integrity, {      integrity: opts.integrity,      size: opts.size    }).then(data => byDigest ? data : {      metadata: entry.metadata,      data: data,      size: entry.size,      integrity: entry.integrity    }).then(res => {      if (opts.memoize && byDigest) {        memo.put.byDigest(cache, key, res, opts)      } else if (opts.memoize) {        memo.put(cache, entry, res.data, opts)      }      return res    })  })}module.exports.sync = function get (cache, key, opts) {  return getDataSync(false, cache, key, opts)}module.exports.sync.byDigest = function getByDigest (cache, digest, opts) {  return getDataSync(true, cache, digest, opts)}function getDataSync (byDigest, cache, key, opts) {  opts = GetOpts(opts)  const memoized = (    byDigest      ? memo.get.byDigest(cache, key, opts)      : memo.get(cache, key, opts)  )  if (memoized && opts.memoize !== false) {    return byDigest ? memoized : {      metadata: memoized.entry.metadata,      data: memoized.data,      integrity: memoized.entry.integrity,      size: memoized.entry.size    }  }  const entry = !byDigest && index.find.sync(cache, key, opts)  if (!entry && !byDigest) {    throw new index.NotFoundError(cache, key)  }  const data = read.sync(    cache,    byDigest ? key : entry.integrity,    {      integrity: opts.integrity,      size: opts.size    }  )  const res = byDigest    ? data    : {      metadata: entry.metadata,      data: data,      size: entry.size,      integrity: entry.integrity    }  if (opts.memoize && byDigest) {    memo.put.byDigest(cache, key, res, opts)  } else if (opts.memoize) {    memo.put(cache, entry, res.data, opts)  }  return res}module.exports.stream = getStreamfunction getStream (cache, key, opts) {  opts = GetOpts(opts)  let stream = through()  const memoized = memo.get(cache, key, opts)  if (memoized && opts.memoize !== false) {    stream.on('newListener', function (ev, cb) {      ev === 'metadata' && cb(memoized.entry.metadata)      ev === 'integrity' && cb(memoized.entry.integrity)      ev === 'size' && cb(memoized.entry.size)    })    stream.write(memoized.data, () => stream.end())    return stream  }  index.find(cache, key).then(entry => {    if (!entry) {      return stream.emit(        'error', new index.NotFoundError(cache, key)      )    }    let memoStream    if (opts.memoize) {      let memoData = []      let memoLength = 0      memoStream = through((c, en, cb) => {        memoData && memoData.push(c)        memoLength += c.length        cb(null, c, en)      }, cb => {        memoData && memo.put(cache, entry, Buffer.concat(memoData, memoLength), opts)        cb()      })    } else {      memoStream = through()    }    stream.emit('metadata', entry.metadata)    stream.emit('integrity', entry.integrity)    stream.emit('size', entry.size)    stream.on('newListener', function (ev, cb) {      ev === 'metadata' && cb(entry.metadata)      ev === 'integrity' && cb(entry.integrity)      ev === 'size' && cb(entry.size)    })    pipe(      read.readStream(cache, entry.integrity, opts.concat({        size: opts.size == null ? entry.size : opts.size      })),      memoStream,      stream    )  }).catch(err => stream.emit('error', err))  return stream}module.exports.stream.byDigest = getStreamDigestfunction getStreamDigest (cache, integrity, opts) {  opts = GetOpts(opts)  const memoized = memo.get.byDigest(cache, integrity, opts)  if (memoized && opts.memoize !== false) {    const stream = through()    stream.write(memoized, () => stream.end())    return stream  } else {    let stream = read.readStream(cache, integrity, opts)    if (opts.memoize) {      let memoData = []      let memoLength = 0      const memoStream = through((c, en, cb) => {        memoData && memoData.push(c)        memoLength += c.length        cb(null, c, en)      }, cb => {        memoData && memo.put.byDigest(          cache,          integrity,          Buffer.concat(memoData, memoLength),          opts        )        cb()      })      stream = pipeline(stream, memoStream)    }    return stream  }}module.exports.info = infofunction info (cache, key, opts) {  opts = GetOpts(opts)  const memoized = memo.get(cache, key, opts)  if (memoized && opts.memoize !== false) {    return BB.resolve(memoized.entry)  } else {    return index.find(cache, key)  }}module.exports.hasContent = read.hasContentmodule.exports.copy = function cp (cache, key, dest, opts) {  return copy(false, cache, key, dest, opts)}module.exports.copy.byDigest = function cpDigest (cache, digest, dest, opts) {  return copy(true, cache, digest, dest, opts)}function copy (byDigest, cache, key, dest, opts) {  opts = GetOpts(opts)  if (read.copy) {    return (      byDigest ? BB.resolve(null) : index.find(cache, key, opts)    ).then(entry => {      if (!entry && !byDigest) {        throw new index.NotFoundError(cache, key)      }      return read.copy(        cache, byDigest ? key : entry.integrity, dest, opts      ).then(() => byDigest ? key : {        metadata: entry.metadata,        size: entry.size,        integrity: entry.integrity      })    })  } else {    return getData(byDigest, cache, key, opts).then(res => {      return fs.writeFileAsync(dest, byDigest ? res : res.data)        .then(() => byDigest ? key : {          metadata: res.metadata,          size: res.size,          integrity: res.integrity        })    })  }}
 |