| 'use strict' | 
|   | 
| const index = require('./lib/entry-index') | 
| const memo = require('./lib/memoization') | 
| const write = require('./lib/content/write') | 
| const Flush = require('minipass-flush') | 
| const { PassThrough } = require('minipass-collect') | 
| const Pipeline = require('minipass-pipeline') | 
|   | 
| const putOpts = (opts) => ({ | 
|   algorithms: ['sha512'], | 
|   ...opts, | 
| }) | 
|   | 
| module.exports = putData | 
|   | 
| function putData (cache, key, data, opts = {}) { | 
|   const { memoize } = opts | 
|   opts = putOpts(opts) | 
|   return write(cache, data, opts).then((res) => { | 
|     return index | 
|       .insert(cache, key, res.integrity, { ...opts, size: res.size }) | 
|       .then((entry) => { | 
|         if (memoize) | 
|           memo.put(cache, entry, data, opts) | 
|   | 
|         return res.integrity | 
|       }) | 
|   }) | 
| } | 
|   | 
| module.exports.stream = putStream | 
|   | 
| function putStream (cache, key, opts = {}) { | 
|   const { memoize } = opts | 
|   opts = putOpts(opts) | 
|   let integrity | 
|   let size | 
|   | 
|   let memoData | 
|   const pipeline = new Pipeline() | 
|   // first item in the pipeline is the memoizer, because we need | 
|   // that to end first and get the collected data. | 
|   if (memoize) { | 
|     const memoizer = new PassThrough().on('collect', data => { | 
|       memoData = data | 
|     }) | 
|     pipeline.push(memoizer) | 
|   } | 
|   | 
|   // contentStream is a write-only, not a passthrough | 
|   // no data comes out of it. | 
|   const contentStream = write.stream(cache, opts) | 
|     .on('integrity', (int) => { | 
|       integrity = int | 
|     }) | 
|     .on('size', (s) => { | 
|       size = s | 
|     }) | 
|   | 
|   pipeline.push(contentStream) | 
|   | 
|   // last but not least, we write the index and emit hash and size, | 
|   // and memoize if we're doing that | 
|   pipeline.push(new Flush({ | 
|     flush () { | 
|       return index | 
|         .insert(cache, key, integrity, { ...opts, size }) | 
|         .then((entry) => { | 
|           if (memoize && memoData) | 
|             memo.put(cache, entry, memoData, opts) | 
|   | 
|           if (integrity) | 
|             pipeline.emit('integrity', integrity) | 
|   | 
|           if (size) | 
|             pipeline.emit('size', size) | 
|         }) | 
|     }, | 
|   })) | 
|   | 
|   return pipeline | 
| } |