untar-memory
Version:
Untar a tarball to an in-memory filesystem
36 lines (29 loc) • 904 B
JavaScript
const { createReadStream } = require('fs')
const concat = require('concat-stream')
const gunzip = require('gunzip-maybe')
const MemoryFs = require('memory-fs')
const fileType = require('file-type')
const { dirname } = require('path')
const tar = require('tar')
module.exports = untarToMemory
function untarToMemory (file, mfs) {
const tarball = typeof file === 'string'
? createReadStream(file)
: file
mfs = mfs || new MemoryFs()
return new Promise((resolve, reject) => {
tarball
.pipe(gunzip())
.pipe(tar.Parse())
.on('entry', (entry) => {
const path = '/' + entry.props.path
mfs.mkdirpSync(dirname(path))
entry.pipe(concat((buf) => {
const encoding = fileType(buf) ? 'binary' : 'utf8'
mfs.writeFileSync(path, buf, encoding)
}))
})
.on('end', () => resolve(mfs))
.on('error', reject)
})
}