| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- 'use strict';
- (function() {
- let ret;
- async function initialize() {
- if (ret) return ret;
- const COMPRESSION_LEVEL = 7;
- const NO_ZLIB_HEADER = -1;
- const CHUNK_SIZE = 32 * 1024;
- const map = {};
- const memory = new WebAssembly.Memory({
- initial: 1,
- maximum: 1024, // 64MB
- });
- const env = {
- memory,
- writeToJs(ptr, size) {
- const o = map[ptr];
- o.onData(new Uint8Array(memory.buffer, dstPtr, size));
- },
- _abort: errno => { console.error(`Error: ${errno}`) },
- _grow: () => { },
- };
- let buff;
- if (typeof fetch === 'undefined') {
- buff = fs.readFileSync('zlib-1.2.11.wasm');
- } else {
- const resp = await fetch('js/zlib-1.2.11.wasm');
- buff = await resp.arrayBuffer();
- }
- const module = await WebAssembly.compile(buff);
- const ins = await WebAssembly.instantiate(module, { env });
- const srcPtr = ins.exports._malloc(CHUNK_SIZE);
- const dstPtr = ins.exports._malloc(CHUNK_SIZE);
- class RawDef {
- constructor() {
- this.zstreamPtr = ins.exports._createDeflateContext(COMPRESSION_LEVEL, NO_ZLIB_HEADER);
- map[this.zstreamPtr] = this;
- this.offset = 0;
- this.buff = new Uint8Array(CHUNK_SIZE);
- }
- deflate(chunk, flush) {
- const src = new Uint8Array(memory.buffer, srcPtr, chunk.length);
- src.set(chunk);
- ins.exports._deflate(this.zstreamPtr, srcPtr, dstPtr, chunk.length, CHUNK_SIZE, flush);
- }
- onData(chunk) {
- if (this.buff.length < this.offset + chunk.length) {
- const buff = this.buff;
- this.buff = new Uint8Array(this.buff.length * 2);
- this.buff.set(buff);
- }
- this.buff.set(chunk, this.offset);
- this.offset += chunk.length;
- }
- destroy() {
- ins.exports._freeDeflateContext(this.zstreamPtr);
- delete map[this.zstreamPtr];
- this.buff = null;
- }
- getBuffer() {
- const res = new Uint8Array(this.offset);
- for (let i = 0; i < this.offset; ++i) {
- res[i] = this.buff[i];
- }
- return res;
- }
- }
- class RawInf {
- constructor() {
- this.zstreamPtr = ins.exports._createInflateContext(NO_ZLIB_HEADER);
- map[this.zstreamPtr] = this;
- this.offset = 0;
- this.buff = new Uint8Array(CHUNK_SIZE);
- }
- inflate(chunk) {
- const src = new Uint8Array(memory.buffer, srcPtr, chunk.length);
- src.set(chunk);
- ins.exports._inflate(this.zstreamPtr, srcPtr, dstPtr, chunk.length, CHUNK_SIZE);
- }
- onData(chunk) {
- if (this.buff.length < this.offset + chunk.length) {
- const buff = this.buff;
- this.buff = new Uint8Array(this.buff.length * 2);
- this.buff.set(buff);
- }
- this.buff.set(chunk, this.offset);
- this.offset += chunk.length;
- }
- destroy() {
- ins.exports._freeInflateContext(this.zstreamPtr);
- delete map[this.zstreamPtr];
- this.buff = null;
- }
- getBuffer() {
- const res = new Uint8Array(this.offset);
- for (let i = 0; i < this.offset; ++i) {
- res[i] = this.buff[i];
- }
- return res;
- }
- }
- ret = {
- inflate(rawDeflateBuffer) {
- const rawInf = new RawInf();
- for (let offset = 0; offset < rawDeflateBuffer.length; offset += CHUNK_SIZE) {
- const end = Math.min(offset + CHUNK_SIZE, rawDeflateBuffer.length);
- const chunk = rawDeflateBuffer.subarray(offset, end);
- rawInf.inflate(chunk);
- }
- const ret = rawInf.getBuffer();
- rawInf.destroy();
- return ret;
- },
- deflate(rawInflateBuffer) {
- const rawDef = new RawDef();
- for (let offset = 0; offset < rawInflateBuffer.length; offset += CHUNK_SIZE) {
- const end = Math.min(offset + CHUNK_SIZE, rawInflateBuffer.length);
- const chunk = rawInflateBuffer.subarray(offset, end);
- rawDef.deflate(chunk, rawInflateBuffer.length <= offset + CHUNK_SIZE);
- }
- const ret = rawDef.getBuffer();
- rawDef.destroy();
- return ret;
- },
- }
- return ret;
- }
- this.zlib = initialize();
- }).call(this);
|