| '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 |
| } |