• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2
3const figgyPudding = require('figgy-pudding')
4const index = require('./lib/entry-index')
5const memo = require('./lib/memoization')
6const write = require('./lib/content/write')
7const to = require('mississippi').to
8
9const PutOpts = figgyPudding({
10  algorithms: {
11    default: ['sha512']
12  },
13  integrity: {},
14  memoize: {},
15  metadata: {},
16  pickAlgorithm: {},
17  size: {},
18  tmpPrefix: {},
19  single: {},
20  sep: {},
21  error: {},
22  strict: {}
23})
24
25module.exports = putData
26function putData (cache, key, data, opts) {
27  opts = PutOpts(opts)
28  return write(cache, data, opts).then(res => {
29    return index.insert(
30      cache, key, res.integrity, opts.concat({ size: res.size })
31    ).then(entry => {
32      if (opts.memoize) {
33        memo.put(cache, entry, data, opts)
34      }
35      return res.integrity
36    })
37  })
38}
39
40module.exports.stream = putStream
41function putStream (cache, key, opts) {
42  opts = PutOpts(opts)
43  let integrity
44  let size
45  const contentStream = write.stream(
46    cache, opts
47  ).on('integrity', int => {
48    integrity = int
49  }).on('size', s => {
50    size = s
51  })
52  let memoData
53  let memoTotal = 0
54  const stream = to((chunk, enc, cb) => {
55    contentStream.write(chunk, enc, () => {
56      if (opts.memoize) {
57        if (!memoData) { memoData = [] }
58        memoData.push(chunk)
59        memoTotal += chunk.length
60      }
61      cb()
62    })
63  }, cb => {
64    contentStream.end(() => {
65      index.insert(cache, key, integrity, opts.concat({ size })).then(entry => {
66        if (opts.memoize) {
67          memo.put(cache, entry, Buffer.concat(memoData, memoTotal), opts)
68        }
69        stream.emit('integrity', integrity)
70        cb()
71      })
72    })
73  })
74  let erred = false
75  stream.once('error', err => {
76    if (erred) { return }
77    erred = true
78    contentStream.emit('error', err)
79  })
80  contentStream.once('error', err => {
81    if (erred) { return }
82    erred = true
83    stream.emit('error', err)
84  })
85  return stream
86}
87