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.
		
		
		
		
			
				
					87 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					87 lines
				
				1.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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
							 | 
						||
| 
								 | 
							
								}
							 |