diff options
Diffstat (limited to 'deps/node/deps/npm/node_modules/pacote/lib/fetchers/file.js')
-rw-r--r-- | deps/node/deps/npm/node_modules/pacote/lib/fetchers/file.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/deps/node/deps/npm/node_modules/pacote/lib/fetchers/file.js b/deps/node/deps/npm/node_modules/pacote/lib/fetchers/file.js new file mode 100644 index 00000000..a58e3291 --- /dev/null +++ b/deps/node/deps/npm/node_modules/pacote/lib/fetchers/file.js @@ -0,0 +1,78 @@ +'use strict' + +const BB = require('bluebird') + +const cacache = require('cacache') +const Fetcher = require('../fetch') +const fs = require('fs') +const pipe = BB.promisify(require('mississippi').pipe) +const through = require('mississippi').through + +const readFileAsync = BB.promisify(fs.readFile) +const statAsync = BB.promisify(fs.stat) + +const MAX_BULK_SIZE = 2 * 1024 * 1024 // 2MB + +// `file` packages refer to local tarball files. +const fetchFile = module.exports = Object.create(null) + +Fetcher.impl(fetchFile, { + packument (spec, opts) { + return BB.reject(new Error('Not implemented yet')) + }, + + manifest (spec, opts) { + // We can't do much here. `finalizeManifest` will take care of + // calling `tarball` to fill out all the necessary details. + return BB.resolve(null) + }, + + // All the heavy lifting for `file` packages is done here. + // They're never cached. We just read straight out of the file. + // TODO - maybe they *should* be cached? + tarball (spec, opts) { + const src = spec._resolved || spec.fetchSpec + const stream = through() + statAsync(src).then(stat => { + if (spec._resolved) { stream.emit('manifest', spec) } + if (stat.size <= MAX_BULK_SIZE) { + // YAY LET'S DO THING IN BULK + return readFileAsync(src).then(data => { + if (opts.cache) { + return cacache.put( + opts.cache, `pacote:tarball:file:${src}`, data, { + integrity: opts.integrity + } + ).then(integrity => ({ data, integrity })) + } else { + return { data } + } + }).then(info => { + if (info.integrity) { stream.emit('integrity', info.integrity) } + stream.write(info.data, () => { + stream.end() + }) + }) + } else { + let integrity + const cacheWriter = !opts.cache + ? BB.resolve(null) + : (pipe( + fs.createReadStream(src), + cacache.put.stream(opts.cache, `pacote:tarball:${src}`, { + integrity: opts.integrity + }).on('integrity', d => { integrity = d }) + )) + return cacheWriter.then(() => { + if (integrity) { stream.emit('integrity', integrity) } + return pipe(fs.createReadStream(src), stream) + }) + } + }).catch(err => stream.emit('error', err)) + return stream + }, + + fromManifest (manifest, spec, opts) { + return this.tarball(manifest || spec, opts) + } +}) |