72 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict'
 | |
| 
 | |
| const index = require('./lib/entry-index')
 | |
| const memo = require('./lib/memoization')
 | |
| const write = require('./lib/content/write')
 | |
| const to = require('mississippi').to
 | |
| 
 | |
| module.exports = putData
 | |
| function putData (cache, key, data, opts) {
 | |
|   opts = opts || {}
 | |
|   return write(cache, data, opts).then(res => {
 | |
|     // TODO - stop modifying opts
 | |
|     opts.size = res.size
 | |
|     return index.insert(cache, key, res.integrity, opts).then(entry => {
 | |
|       if (opts.memoize) {
 | |
|         memo.put(cache, entry, data, opts)
 | |
|       }
 | |
|       return res.integrity
 | |
|     })
 | |
|   })
 | |
| }
 | |
| 
 | |
| module.exports.stream = putStream
 | |
| function putStream (cache, key, opts) {
 | |
|   opts = 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(() => {
 | |
|       // TODO - stop modifying `opts`
 | |
|       opts.size = size
 | |
|       index.insert(cache, key, integrity, opts).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
 | |
| }
 |