You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							86 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							86 lines
						
					
					
						
							1.9 KiB
						
					
					
				'use strict' | 
						|
 | 
						|
const figgyPudding = require('figgy-pudding') | 
						|
const index = require('./lib/entry-index') | 
						|
const memo = require('./lib/memoization') | 
						|
const write = require('./lib/content/write') | 
						|
const to = require('mississippi').to | 
						|
 | 
						|
const PutOpts = figgyPudding({ | 
						|
  algorithms: { | 
						|
    default: ['sha512'] | 
						|
  }, | 
						|
  integrity: {}, | 
						|
  memoize: {}, | 
						|
  metadata: {}, | 
						|
  pickAlgorithm: {}, | 
						|
  size: {}, | 
						|
  tmpPrefix: {}, | 
						|
  single: {}, | 
						|
  sep: {}, | 
						|
  error: {}, | 
						|
  strict: {} | 
						|
}) | 
						|
 | 
						|
module.exports = putData | 
						|
function putData (cache, key, data, opts) { | 
						|
  opts = PutOpts(opts) | 
						|
  return write(cache, data, opts).then(res => { | 
						|
    return index.insert( | 
						|
      cache, key, res.integrity, opts.concat({ size: res.size }) | 
						|
    ).then(entry => { | 
						|
      if (opts.memoize) { | 
						|
        memo.put(cache, entry, data, opts) | 
						|
      } | 
						|
      return res.integrity | 
						|
    }) | 
						|
  }) | 
						|
} | 
						|
 | 
						|
module.exports.stream = putStream | 
						|
function putStream (cache, key, opts) { | 
						|
  opts = PutOpts(opts) | 
						|
  let integrity | 
						|
  let size | 
						|
  const contentStream = write.stream( | 
						|
    cache, opts | 
						|
  ).on('integrity', int => { | 
						|
    integrity = int | 
						|
  }).on('size', s => { | 
						|
    size = s | 
						|
  }) | 
						|
  let memoData | 
						|
  let memoTotal = 0 | 
						|
  const stream = to((chunk, enc, cb) => { | 
						|
    contentStream.write(chunk, enc, () => { | 
						|
      if (opts.memoize) { | 
						|
        if (!memoData) { memoData = [] } | 
						|
        memoData.push(chunk) | 
						|
        memoTotal += chunk.length | 
						|
      } | 
						|
      cb() | 
						|
    }) | 
						|
  }, cb => { | 
						|
    contentStream.end(() => { | 
						|
      index.insert(cache, key, integrity, opts.concat({ size })).then(entry => { | 
						|
        if (opts.memoize) { | 
						|
          memo.put(cache, entry, Buffer.concat(memoData, memoTotal), opts) | 
						|
        } | 
						|
        stream.emit('integrity', integrity) | 
						|
        cb() | 
						|
      }) | 
						|
    }) | 
						|
  }) | 
						|
  let erred = false | 
						|
  stream.once('error', err => { | 
						|
    if (erred) { return } | 
						|
    erred = true | 
						|
    contentStream.emit('error', err) | 
						|
  }) | 
						|
  contentStream.once('error', err => { | 
						|
    if (erred) { return } | 
						|
    erred = true | 
						|
    stream.emit('error', err) | 
						|
  }) | 
						|
  return stream | 
						|
}
 | 
						|
 |