• Stars
    star
    431
  • Rank 100,866 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 8 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Everything you need for compressing and uncompressing

compressing

NPM version Test coverage npm download

The missing compressing and uncompressing lib for node.

Currently supported:

  • tar
  • gzip
  • tgz
  • zip

Install

npm install compressing

Usage

Compress a single file

Use gzip as an example, tar, tgz and zip is same as gzip.

promise style

const compressing = require('compressing');

// compress a file
compressing.gzip.compressFile('file/path/to/compress', 'path/to/destination.gz')
.then(compressDone)
.catch(handleError);

// compress a file buffer
compressing.gzip.compressFile(buffer, 'path/to/destination.gz')
.then(compressDone)
.catch(handleError);

// compress a stream
compressing.gzip.compressFile(stream, 'path/to/destination.gz')
.then(compressDone)
.catch(handleError);

stream style

const compressing = require('compressing');

new compressing.gzip.FileStream({ source: 'file/path/to/compress' })
  .on('error', handleError)
  .pipe(fs.createWriteStream('path/to/destination.gz'))
  .on('error', handleError);

// It's a transform stream, so you can pipe to it
fs.createReadStream('file/path/to/compress')
  .on('error', handleError)
  .pipe(new compressing.gzip.FileStream())
  .on('error', handleError)
  .pipe(fs.createWriteStream('path/to/destination.gz'))
  .on('error', handleError);

// You should take care of stream errors in caution, use pump to handle error in one place
const pump = require('pump');
const sourceStream = fs.createReadStream('file/path/to/compress');
const gzipStream = new compressing.gzip.FileStream();
const destStream = fs.createWriteStream('path/to/destination.gz');
pump(sourceStream, gzipStream, destStream, handleError);

Compress a dir

Use tar as an example, tgz and zip is same as gzip.

Gzip only support compressing a single file. if you want to compress a dir with gzip, then you may need tgz instead.

promise style

const compressing = require('compressing');
compressing.tar.compressDir('dir/path/to/compress', 'path/to/destination.tar')
.then(compressDone)
.catch(handleError);

stream style

const compressing = require('compressing');

const tarStream = new compressing.tar.Stream();
tarStream.addEntry('dir/path/to/compress');

tarStream
  .on('error', handleError)
  .pipe(fs.createWriteStream('path/to/destination.tar'))
  .on('error', handleError);

// You should take care of stream errors in caution, use pump to handle error in one place
const tarStream = new compressing.tar.Stream();
tarStream.addEntry('dir/path/to/compress');
const destStream = fs.createWriteStream('path/to/destination.tar');
pump(tarStream, destStream, handleError);

Stream is very powerful, you can compress multiple entries in it;

const tarStream = new compressing.tar.Stream();
// dir
tarStream.addEntry('dir/path/to/compress');

// file
tarStream.addEntry('file/path/to/compress');

// buffer
tarStream.addEntry(buffer);

// stream
tarStream.addEntry(stream);

const destStream = fs.createWriteStream('path/to/destination.tar');
pipe(tarStream, destStream, handleError);

Uncompress a file

promise style

const compressing = require('compressing');

// uncompress a file
compressing.tgz.uncompress('file/path/to/uncompress.tgz', 'path/to/destination/dir')
.then(uncompressDone)
.catch(handleError);

// uncompress a file buffer
compressing.tgz.uncompress(buffer, 'path/to/destination/dir')
.then(uncompressDone)
.catch(handleError);

// uncompress a stream
compressing.tgz.uncompress(stream, 'path/to/destination/dir')
.then(uncompressDone)
.catch(handleError);

Note: tar, tgz and zip have the same uncompressing API as above: destination should be a path of a directory, while that of gzip is slightly different: destination must be a file or filestream.

And working with urllib is super easy. Let's download a tgz file and uncompress to a directory:

const urllib = require('urllib');
const targetDir = require('os').tmpdir();
const compressing = require('compressing');

urllib.request('http://registry.npmjs.org/pedding/-/pedding-1.1.0.tgz', {
  streaming: true,
  followRedirect: true,
})
.then(result => compressing.tgz.uncompress(result.res, targetDir))
.then(() => console.log('uncompress done'))
.catch(console.error);

stream style

const compressing = require('compressing');
const mkdirp = require('mkdirp');

function onEntry(header, stream, next) => {
  stream.on('end', next);

  // header.type => file | directory
  // header.name => path name

  if (header.type === 'file') {
    stream.pipe(fs.createWriteStream(path.join(destDir, header.name)));
  } else { // directory
    mkdirp(path.join(destDir, header.name), err => {
      if (err) return handleError(err);
      stream.resume();
    });
  }
}

new compressing.tgz.UncompressStream({ source: 'file/path/to/uncompress.tgz' })
  .on('error', handleError)
  .on('finish', handleFinish) // uncompressing is done
  .on('entry', onEntry);

// It's a writable stream, so you can pipe to it
fs.createReadStream('file/path/to/uncompress')
  .on('error', handleError)
  .pipe(new compressing.tgz.UncompressStream())
  .on('error', handleError)
  .on('finish', handleFinish) // uncompressing is done
  .on('entry', onEntry);

Note: tar, tgz and zip have the same uncompressing streaming API as above: it's a writable stream, and entries will be emitted while uncompressing one after one another, while that of gzip is slightly different: gzip.UncompressStream is a transform stream, so no entry event will be emitted and you can just pipe to another stream

This constrants is brought by Gzip algorithm itself, it only support compressing one file and uncompress one file.

new compressing.gzip.UncompressStream({ source: 'file/path/to/uncompress.gz' })
  .on('error', handleError)
  .pipe(fs.createWriteStream('path/to/dest/file'))
  .on('error', handleError);

API

compressFile

Use this API to compress a single file. This is a convenient method, which wraps FileStream API below, but you can handle error in one place.

  • gzip.compressFile(source, dest, opts)
  • tar.compressFile(source, dest, opts)
  • tgz.compressFile(source, dest, opts)
  • zip.compressFile(source, dest, opts)

Params

  • source {String|Buffer|Stream} - source to be compressed, could be a file path, buffer, or a readable stream
  • dest {String|Stream} - compressing destination, could be a file path(eg. /path/to/xx.tgz), or a writable stream.
  • opts {Object} - usually you don't need it

Returns a promise object.

compressDir

Use this API to compress a dir. This is a convenient method, which wraps Stream API below, but you can handle error in one place.

Note: gzip do not have a compressDir method, you may need tgz instead.

  • tar.compressDir(source, dest, opts)
  • tgz.compressDir(source, dest, opts)
  • zip.compressDir(source, dest, opts)

Params

  • source {String|Buffer|Stream} - source to be compressed
  • dest {String|Stream} - compressing destination, could be a file path(eg. /path/to/xx.tgz), or a writable stream.
  • opts {Object} - usually you don't need it

uncompress

Use this API to uncompress a file. This is a convenient method, which wraps UncompressStream API below, but you can handle error in one place. RECOMMANDED.

  • tar.uncompress(source, dest, opts)
  • tgz.uncompress(source, dest, opts)
  • zip.uncompress(source, dest, opts)
  • gzip.uncompress(source, dest, opts)

Params

  • source {String|Buffer|Stream} - source to be uncompressed
  • dest {String|Stream} - uncompressing destination. When uncompressing tar, tgz and zip, it should be a directory path (eg. /path/to/xx). When uncompressing gzip, it should be a file path or a writable stream.
  • opts {Object} - usually you don't need it
    • opts.zipFileNameEncoding {String} - Only work on zip format, default is 'utf8'. Major non-UTF8 encodings by languages:

      • Korean: cp949, euc-kr
      • Japanese: sjis (shift_jis), cp932, euc-jp
      • Chinese: gbk, gb18030, gb2312, cp936, hkscs, big5, cp950

FileStream

The transform stream to compress a single file.

Note: If you are not very familiar with streams, just use compressFile() API, error can be handled in one place.

  • new gzip.FileStream(opts)
  • new tar.FileStream(opts)
  • new tgz.FileStream(opts)
  • new zip.FileStream(opts)

Common params:

  • opts.source {String|Buffer|Stream} - source to be compressed, could be a file path, buffer, or a readable stream.

Gzip params:

  • opts.zlib - {Object} gzip.FileStream uses zlib to compress, pass this param to control the behavior of zlib.

Tar params:

  • opts.relativePath {String} - Adds a file from source into the compressed result file as opts.relativePath. Uncompression programs would extract the file from the compressed file as relativePath. If opts.source is a file path, opts.relativePath is optional, otherwise it's required.
  • opts.size {Number} - Tar compression requires the size of file in advance. When opts.source is a stream, the size of it cannot be calculated unless load all content of the stream into memory(the default behavior, but loading all data into memory could be a very bad idea). Pass opts.size to avoid loading all data into memory, or a warning will be shown.
  • opts.suppressSizeWarning {Boolean} - Pass true to suppress the size warning mentioned.

Tgz params:

tgz.FileStream is a combination of tar.FileStream and gzip.FileStream, so the params are the combination of params of tar and gzip.

Zip params:

  • opts.relativePath {String} - Adds a file from source into the compressed result file as opts.relativePath. Uncompression programs would extract the file from the compressed file as relativePath. If opts.source is a file path, opts.relativePath is optional, otherwise it's required.
  • opts.yazl {Object} - zip.FileStream compression uses yazl, pass this param to control the behavior of yazl.

Stream

The readable stream to compress anything as you need.

Note: If you are not very familiar with streams, just use compressFile() and compressDir() API, error can be handled in one place.

Gzip only support compressing a single file. So gzip.Stream is not available.

Constructor

  • new tar.Stream()
  • new tgz.Stream()
  • new zip.Stream()

No options in all constructors.

Instance methods

  • addEntry(entry, opts)

Params

  • entry {String|Buffer|Stream} - entry to compress, cound be a file path, a dir path, a buffer, or a stream.
  • opts.relativePath {String} - uncompression programs would extract the file from the compressed file as opts.relativePath. If entry is a file path or a dir path, opts.relativePath is optional, otherwise it's required.
  • opts.ignoreBase {Boolean} - when entry is a dir path, and opts.ignoreBase is set to true, the compression will contain files relative to the path passed, and not with the path included.

UncompressStream

The writable stream to uncompress anything as you need.

Note: If you are not very familiar with streams, just use uncompress() API, error can be handled in one place.

Gzip only support compressing and uncompressing one single file. So gzip.UncompressStream is a transform stream which is different from others.

Constructor

  • new gzip.UncompressStream(opts)
  • new tar.UncompressStream(opts)
  • new tgz.UncompressStream(opts)
  • new zip.UncompressStream(opts)

Common params:

  • opts.source {String|Buffer|Stream} - source to be uncompressed, could be a file path, buffer, or a readable stream.

CAUTION for zip.UncompressStream

Due to the design of the .zip file format, it's impossible to interpret a .zip file without loading all data into memory.

Although the API is streaming style(try to keep it handy), it still loads all data into memory.

https://github.com/thejoshwolfe/yauzl#no-streaming-unzip-api

Contributors


shaoshuai0102


fengmk2


popomore


DiamondYuan


bytemain


Ryqsky


songhn233


ShadyZOZ

This project follows the git-contributor spec, auto updated at Mon Jul 11 2022 08:28:25 GMT+0800.

More Repositories

1

utility

A collection of useful utilities.
TypeScript
1,243
star
2

parameter

A parameter verify tools.
JavaScript
729
star
3

urllib

Request HTTP(s) URLs in a complex world.
TypeScript
725
star
4

agentkeepalive

Support keepalive http agent.
JavaScript
578
star
5

emoji

emoji: This library allows the handling and conversion of Emoji in Javascript.
HTML
501
star
6

weibo

weibo nodejs sdk
JavaScript
489
star
7

detect-port

Node.js module to detect available ports of the system.
JavaScript
379
star
8

qn

Another qiniu http://docs.qiniu.com/api/ API client for Node.js.
JavaScript
275
star
9

graceful

Graceful exit when `uncaughtException` emit, base on `process.on('uncaughtException')`.
JavaScript
249
star
10

address

Get current machine IP and MAC address.
TypeScript
233
star
11

autod

Auto generate dependencies and devDependencies by parse the project file.
JavaScript
206
star
12

js-to-java

easy way to wrap js object to java object
JavaScript
203
star
13

common-bin

Abstraction bin tool
JavaScript
190
star
14

hessian.js

js hessian binary web service protocol, support communicate with java
JavaScript
184
star
15

mm

An simple but flexible mock(or say stub) package, mock mate
JavaScript
159
star
16

cfork

cluster fork and restart easy way
JavaScript
156
star
17

formstream

multipart/form-data encoded stream, helper for file upload.
JavaScript
145
star
18

urlencode

encodeURIComponent with charset
TypeScript
142
star
19

cluster-client

Sharing Connection among Multi-Process Nodejs
JavaScript
132
star
20

webcamera

网页截图工具 (by phantomjs)
JavaScript
125
star
21

is-type-of

complete type checking for node
TypeScript
122
star
22

coffee

Test command line on Node.js
JavaScript
99
star
23

clet

Command Line E2E Testing
JavaScript
77
star
24

byte

Input Buffer and Output Buffer, just like Java ByteBuffer
JavaScript
76
star
25

sdk-base

a base class for sdk with default error handler
JavaScript
62
star
26

china-mobile-phone-regexp

The regular expressions for China mobile phone number.
JavaScript
60
star
27

mz-modules

Same as `mz`, but wrap modules in the world rather than core API.
JavaScript
56
star
28

thunkify-wrap

a more powerful thunkify
JavaScript
55
star
29

ots

This project no longer maintained, please use https://github.com/ali-sdk/ots2 instead.
JavaScript
48
star
30

urllib-sync

sync http request
JavaScript
44
star
31

stream-wormhole

Pipe ReadStream to a wormhole
TypeScript
42
star
32

copy-to

copy an object's properties to another one
JavaScript
41
star
33

optimized

Detect a function can be optimized or not.
JavaScript
41
star
34

runscript

Run script easy!
JavaScript
41
star
35

await-stream-ready

a promise waiting stream ready
JavaScript
34
star
36

charset

Get the content charset from header and html content-type.
JavaScript
34
star
37

ab

A benchmark tool.
JavaScript
33
star
38

npm-updater

Prompt update of npm package
JavaScript
32
star
39

java.io

A Node.js implement of "java.io.InputObjectStream.readObject()" and "java.io.OutputObjectStream.writeObject()"
JavaScript
31
star
40

humanize-ms

transform humanize time to ms
JavaScript
30
star
41

graceful-process

graceful exit process even parent exit on SIGKILL.
JavaScript
29
star
42

node-murmurhash

murmurhash, support utf8 Buffer
JavaScript
27
star
43

sendmessage

Send a cross process message if message channel is connected.
JavaScript
27
star
44

tcp-base

TCP client base
JavaScript
26
star
45

shameimaru

Shameimaru Aya likes to traverse node_modules and capture the tree.
JavaScript
26
star
46

ready-callback

Launch server after all async task ready
TypeScript
26
star
47

serialize-json

A serialize algorithm for JSON
JavaScript
23
star
48

js-remoting-for-apache-dubbo

dubbo protocol implement
JavaScript
22
star
49

loading

loading dir files as module to an object
JavaScript
20
star
50

zookeeper-cluster-client

Sharing one zookeeper connection among Multi-Process on Node.js
JavaScript
20
star
51

tnpm

JavaScript
19
star
52

enable

Detect es6 features enable or not.
JavaScript
19
star
53

last-commit-log

Node.js module to get the last git commit information - mostly to be used by CI/CD and building phase.
JavaScript
19
star
54

jdwp

Java Debug Wire Protocol
JavaScript
18
star
55

time-profile

Measuring execution time of functions
JavaScript
16
star
56

qps

High performance qps counter
JavaScript
15
star
57

cluster-reload

Easy and safe reload your workers.
JavaScript
14
star
58

await-first

Wait the first event in a set of event pairs, then clean up after itself.
JavaScript
14
star
59

buffer-type

Detect content-type from Buffer data.
JavaScript
14
star
60

pedding

Just pedding for callback.
JavaScript
13
star
61

should2assert

A tool to help you migrating from should to assert
JavaScript
13
star
62

save-file-atomic

Save anything to file atomic
JavaScript
13
star
63

wt

wt: Simple dir watcher, support events
JavaScript
13
star
64

zlogger

The last console logger
JavaScript
12
star
65

logfilestream

Log stream, including auto rolling feature, support multiprocess `append` write at the same time.
JavaScript
12
star
66

default-user-agent

Default user agent string for Node.js http request
JavaScript
11
star
67

connection

JavaScript
11
star
68

jsonp-body

Helper to create more safe jsonp response body for koa and other web framework.
JavaScript
10
star
69

zookeeper-watcher

Extend node-zookeeper-client, let zookeeper client support `watch(path)` method.
JavaScript
10
star
70

weibo-mid

Convert Weibo Open API mid to base62 hash string.
JavaScript
10
star
71

rid

Request Unique ID, base on current server `ip`, `process.pid` and auto increase id, like `$ip,$pid,$id`
JavaScript
10
star
72

dns-hijacking

JavaScript
9
star
73

enums

JavaScript
9
star
74

error-formatter

format an error into string or json for log
JavaScript
9
star
75

node-homedir

Get the effective user's homedir
TypeScript
9
star
76

auto-correct

auto correct for command line tools
JavaScript
8
star
77

install-node

Install node into node_modules
JavaScript
8
star
78

digest-header

Digest access authentication header helper
JavaScript
8
star
79

http-doctor

HTTP doctor
JavaScript
7
star
80

vmto

velocity(vm) to any other templates.
JavaScript
7
star
81

restful-client

RESTFul api client base object. Usually use by some api client implementation.
JavaScript
6
star
82

diskstore

a local cache implement
JavaScript
6
star
83

koa-override

method override middleware for koa
JavaScript
6
star
84

memory-tripwire

suicide when memory over the limit
JavaScript
5
star
85

urlmock

Easy load mock data from a specify url.
JavaScript
5
star
86

fast-ua-parser

A Fast JavaScript library to detect user's Browser, Engine, OS, CPU, and Device type/model
4
star
87

performance-ms

performance timer in ms
TypeScript
4
star
88

common-bin-plus

advanced common-bin for cli usage
JavaScript
4
star
89

aggregate-base

Base class for aggregate operation
JavaScript
4
star
90

watch-files

watch files by polling
JavaScript
3
star
91

common-boilerplate

base class for boilerplate
JavaScript
3
star
92

oss-syncer

synchronization all files from this bucket to another bucket
JavaScript
3
star
93

fileloader

more stable file loader for nunjucks, and support charsets like `gbk`.
JavaScript
3
star
94

assert-file

assert file utilities
JavaScript
3
star
95

cov

Mocha Coverage report store on CDN.
JavaScript
3
star
96

onelogger

The only ONE logger
TypeScript
3
star
97

speeds

Speeds controllable stream. You can control the downstream speed on your own.
JavaScript
3
star
98

sse-decoder

SSE decoder for nodejs
TypeScript
3
star
99

changing

Watching `file`, `dir` or `link` changing, using interval timer.
JavaScript
3
star
100

get-ready

NodeJS mixin to add one-time ready event
TypeScript
2
star