https://github.com/webreflection/web-compressor
A gzip/deflate compressor based on De/CompressionStream buffers and base64
https://github.com/webreflection/web-compressor
Last synced: about 1 year ago
JSON representation
A gzip/deflate compressor based on De/CompressionStream buffers and base64
- Host: GitHub
- URL: https://github.com/webreflection/web-compressor
- Owner: WebReflection
- License: isc
- Created: 2020-02-18T05:23:09.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2020-06-13T13:53:56.000Z (about 6 years ago)
- Last Synced: 2025-06-04T22:13:52.631Z (about 1 year ago)
- Language: JavaScript
- Size: 47.9 KB
- Stars: 20
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# WebCompressor
**Social Media Photo by [Tarik Haiga](https://unsplash.com/@tar1k) on [Unsplash](https://unsplash.com/)**
A gzip/deflate compressor based on De/CompressionStream buffers and base64.
## API
The class in a nutshell:
```js
class WebCompressor {
constructor(
format: string, // deflate (default), gzip, or others
method: string // base64 (default) or utf-16
)
async compress(any:string | arrayBuffer): Promise
// the returned arrayBuffer has a special toString() method
// so that it's possible to use it either as buffer or as string
async decompress(any:string | arrayBuffer): Promise
// the returned string is the one that was originally compressed
}
```
#### About the compression method
The `utf-16` compression method makes it possible to shrink into a JavaScript string any compressed `utf-8` buffer, producing on average half up to 1/3rd of the equivalent _base64_ output.
You can test some `localStorage` [benchmark here](https://gist.github.com/WebReflection/7bab57a330e4a318049fe2680ba09ed3) to verify `utf-16` grants 2.5X extra entries, compared to _base64_.
For the time being though, the `utf-16` method is not used as default, for the simple reason that it's not standardized as much as base64 is.
## Example
**[Live Demo](https://codepen.io/WebReflection/pen/XWbKJQq?editors=0011)** that requires a browser compatible with [De/CompressionStream](https://wicg.github.io/compression/) such as Chrome 80+.
```js
import WebCompressor from 'web-compressor';
// const WebCompressor = require('web-compressor');
// by default, arguments are `deflate` and `base64`
const {compress, decompress} = new WebCompressor('gzip');
compress('This string is long enough to be worth using compression'.repeat(10))
.then(arrayBuffer => {
// the compressed arrayBuffer has a special toString implementation
const asString = '' + arrayBuffer;
// such string is either the base64 version of the compressed buffer
// or its utf-16 representation, accordingly with the method
console.log('compressed length', asString.length);
// when decompressing you can pass either the buffer or its string
decompress(asString || buffer).then(originalString => {
console.log('original length', originalString.length);
console.log(originalString.slice(0, 56));
});
});
```