UNPKG

@onesy/zip

Version:
117 lines (116 loc) 5.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const is_1 = __importDefault(require("@onesy/utils/is")); const to_1 = __importDefault(require("@onesy/utils/to")); const parse_1 = __importDefault(require("@onesy/utils/parse")); const serialize_1 = __importDefault(require("@onesy/utils/serialize")); const OnesyDate_1 = __importDefault(require("@onesy/date/OnesyDate")); const duration_1 = __importDefault(require("@onesy/date/duration")); const huffman_code_1 = __importDefault(require("@onesy/huffman-code")); const lz77_1 = __importDefault(require("@onesy/lz77")); const merge_1 = __importDefault(require("@onesy/utils/merge")); class OnesyZipResponse { constructor(value, original_byte_size, value_byte_size, compression_ratio, compression_percentage, positive, performance_milliseconds, performance) { this.value = value; this.original_byte_size = original_byte_size; this.value_byte_size = value_byte_size; this.compression_ratio = compression_ratio; this.compression_percentage = compression_percentage; this.positive = positive; this.performance_milliseconds = performance_milliseconds; this.performance = performance; } } const optionsDefault = { encode_values: true, huffman_code: 'auto' }; class OnesyZip { constructor(value, options = optionsDefault) { this.value = value; this.options = {}; this.serialized = false; this.options = (0, merge_1.default)(options, optionsDefault); if (value !== undefined) this.init(); } static get OnesyZipResponse() { return OnesyZipResponse; } static decode(value) { return new OnesyZip().decode(value); } get encoded() { return this.response; } init() { if (!['uint8array', 'buffer', 'string'].some((item) => (0, is_1.default)(item, this.value))) { this.value = (0, serialize_1.default)(this.value); this.serialized = true; } // Encode this.encode(); } encode() { var _a; const startTime = OnesyDate_1.default.milliseconds; const lz77 = new lz77_1.default(this.value); let value = lz77.response.value; const options = [this.serialized ? 1 : 0]; if (['auto', true].includes(this.options.huffman_code)) { const huffmanCode = new huffman_code_1.default(lz77.response.value, { encode_values: (_a = this.options) === null || _a === void 0 ? void 0 : _a.encode_values }); if (huffmanCode.response.positive || this.options.huffman_code === true) { value = `${huffmanCode.response.values_encoded}, ${huffmanCode.response.value}`; options.unshift(1); } else options.unshift(0); } else options.unshift(0); value = `${options.join('')}${value}`; const response = new OnesyZipResponse(value); response.performance_milliseconds = OnesyDate_1.default.milliseconds - startTime; response.performance = (0, duration_1.default)(response.performance_milliseconds) || '0 milliseconds'; response.original_byte_size = (0, to_1.default)(this.value, 'byte-size'); response.value_byte_size = (0, to_1.default)(response.value, 'byte-size'); response.compression_ratio = Number((((response.value_byte_size + response.original_byte_size) / response.value_byte_size) - 1).toFixed(2)); response.compression_percentage = response.original_byte_size === 0 ? response.value_byte_size === 0 ? 0 : response.value_byte_size * -100 : Number((((response.original_byte_size - response.value_byte_size) / response.original_byte_size) * 100).toFixed(2)); response.positive = response.compression_ratio > 1; this.response = response; return response; } decode(value_) { const response = new OnesyZipResponse(); const startTime = OnesyDate_1.default.milliseconds; if ((0, is_1.default)('string', value_)) { const huffmanCode = value_[0] === '1'; const serialized = value_[1] === '1'; let value = value_.slice(2); const separator = value.indexOf(', '); // Huffman code if (huffmanCode) { let huffmanValues = value.substring(0, separator); const huffmanValue = value.substring(separator + 4); if (huffmanValue && huffmanValues) { huffmanValues = huffman_code_1.default.decodeValues(huffmanValues); const huffman = huffman_code_1.default.decode(huffmanValue, huffmanValues); value = huffman.value; } } // lz77 const lz77 = lz77_1.default.decode(value); response.value = lz77.value; if (serialized) response.value = (0, parse_1.default)(response.value); response.performance_milliseconds = OnesyDate_1.default.milliseconds - startTime; response.performance = (0, duration_1.default)(response.performance_milliseconds) || '0 milliseconds'; response.original_byte_size = (0, to_1.default)(response.value, 'byte-size'); response.value_byte_size = (0, to_1.default)(value_, 'byte-size'); } return response; } } exports.default = OnesyZip;