@onesy/zip
Version:
117 lines (116 loc) • 5.6 kB
JavaScript
"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;