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