87 lines
1.9 KiB
JavaScript
87 lines
1.9 KiB
JavaScript
|
'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
|
||
|
}
|