A Node.js module to download and extract a gzipped tar archive with the Observable API
const {readdirSync} = require('fs');
const dlTgz = require('dl-tgz');
const url = 'https://****.org/my-archive.tar';
/* my-archive
├── LICENSE
├── README.md
├── INSTALL
└── bin
└── app.exe
*/
dlTgz(url, 'my/dir').subscribe({
next({entry}) {
if (entry.bytes !== entry.header.size) {
return;
}
console.log(`✓ ${entry.header.name}`);
},
complete() {
readdirSync('my/dir'); //=> ['INSTALL', LICENSE', 'README.md', 'bin']
console.log('\nCompleted.')
}
});
✓ bin/
✓ bin/app.exe
✓ README.md
✓ LICENSE
✓ install
Completed.
npm install dl-tgz
const dlTgz = require('dl-tgz');
tarArchiveUrl: string
extractDir: string
(a path where the archive will be extracted)
options: Object
Return: Observable
(zenparsing's implementation)
When the Observable
is subscribed, it starts to download a tgz archive, extract it and successively send extraction progress to its Observer
.
When the Subscription
is unsubscribed, it stops downloading and extracting.
Every progress object have two properties entry
and response
.
Type: Object {bytes: <number>, header: <Object>}
entry.header
is a header of the entry, and entry.bytes
is the total size of currently extracted entry. bytes
is always 0
if the entry is not a file but directory, link or symlink.
For example you can get the progress of each entry as a percentage by (progress.entry.bytes / progress.entry.header.size || 0) * 100
.
dlTgz('https://****.org/my-archive.tgz', 'my/dir')
.filter(progress => progress.entry.header.type === 'file')
.subscribe(progress => {
console.log(`${(progress.entry.bytes / progress.entry.header.size * 100).toFixed(1)} %`);
if (progress.entry.bytes === progress.entry.header.size) {
console.log(`>> OK ${progress.entry.header.name}`);
}
});
0.0 %
0.1 %
0.3 %
0.4 %
︙
99.6 %
99.8 %
99.9 %
100.0 %
>> OK bin/app.exe
0.0 %
0.1 %
0.2 %
0.3 %
︙
Type: Object {bytes: <number>, headers: <Object>, url: <string>}
response.url
is the final redirected URL of the request, response.headers
is a response header object derived from http.IncomingMessage
, and response.bytes
is a total content length of the downloaded archive. content-length
header will be converted to number
if it is string
.
You can pass options to Request and tar-fs's extract
method. Note that:
ignore
option is applied beforemap
option modifies filenames.strip
option defaults to1
, not0
. That means the top level directory is stripped off by default.fs
option defaults to graceful-fs for more stability.
ISC License © 2017 - 2018 Shinnosuke Watanabe