| 91 | } |
| 92 | |
| 93 | private _compress(output: IWriteable, data: Uint8Array, compressionMode: number): number { |
| 94 | if (compressionMode !== ZipEntry.CompressionMethodDeflate) { |
| 95 | const crc = new Crc32(); |
| 96 | crc.update(data, 0, data.length); |
| 97 | output.write(data, 0, data.length); |
| 98 | return crc.value; |
| 99 | } |
| 100 | const buffer: Uint8Array = new Uint8Array(512); |
| 101 | |
| 102 | // init deflater |
| 103 | this._deflater.reset(); |
| 104 | |
| 105 | // write data |
| 106 | this._deflater.setInput(data, 0, data.length); |
| 107 | while (!this._deflater.isNeedingInput) { |
| 108 | const len = this._deflater.deflate(buffer, 0, buffer.length); |
| 109 | if (len <= 0) { |
| 110 | break; |
| 111 | } |
| 112 | |
| 113 | output.write(buffer, 0, len); |
| 114 | } |
| 115 | |
| 116 | // let deflater finish up |
| 117 | this._deflater.finish(); |
| 118 | while (!this._deflater.isFinished) { |
| 119 | const len = this._deflater.deflate(buffer, 0, buffer.length); |
| 120 | if (len <= 0) { |
| 121 | break; |
| 122 | } |
| 123 | |
| 124 | output.write(buffer, 0, len); |
| 125 | } |
| 126 | |
| 127 | return this._deflater.inputCrc; |
| 128 | } |
| 129 | |
| 130 | public end() { |
| 131 | const startOfCentralDirectory = this._data.bytesWritten; |