UNPKG

@igo2/utils

Version:
124 lines 16.3 kB
import { Observable } from 'rxjs'; function getNumber(v, endposition, length) { const mask = (1 << length) - 1; return (v >> endposition) & mask; } export class Compression { base64Index = new Map(); indexBase64 = new Map(); constructor() { this.generateBase64Index(); } generateBase64Index() { // https://fr.wikipedia.org/wiki/Base64 // A-Z => [0, 25] for (let i = 0; i < 26; i++) { this.base64Index.set(String.fromCharCode('A'.charCodeAt(0) + i), i); this.indexBase64.set(i, String.fromCharCode('A'.charCodeAt(0) + i)); } // a-z => [26, 51] for (let i = 0; i < 26; i++) { this.base64Index.set(String.fromCharCode('a'.charCodeAt(0) + i), i + 26); this.indexBase64.set(i + 26, String.fromCharCode('a'.charCodeAt(0) + i)); } // 0-9 => [52, 61] for (let i = 0; i < 10; i++) { this.base64Index.set(String.fromCharCode('0'.charCodeAt(0) + i), i + 52); this.indexBase64.set(i + 52, String.fromCharCode('0'.charCodeAt(0) + i)); } // + / => [62, 63] this.base64Index.set('+', 62); this.base64Index.set('/', 63); this.indexBase64.set(62, '+'); this.indexBase64.set(63, '/'); } compressBlob(blob) { if (!blob) { return; } const observable = new Observable((observer) => { const reader = new FileReader(); reader.readAsDataURL(blob); reader.onload = () => { const base64 = reader.result.valueOf(); const text64 = base64.substr(base64.indexOf(',') + 1); const compressed = this.compressStringBase64(text64); const compressedData = { length: text64.length, type: blob.type, object: compressed }; observer.next(compressedData); }; }); return observable; } decompressBlob(compressedData) { const object = compressedData.object; const length = compressedData.length; const decompressed = this.decompressStringBase64(object, length); const byteCharacters = atob(decompressed); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], { type: compressedData.type }); return blob; } compressStringBase64(s) { let out = ''; let bits = 16; let chr = 0; let rem = 0; for (const c of s) { const value = this.base64Index.get(c); if (bits > 6) { bits -= 6; chr += value << bits; } else { rem = 6 - bits; chr += value >> rem; out += String.fromCharCode(chr); chr = value << (16 - rem); bits = 16 - rem; } } if (s.length % 8 !== 0) { out += String.fromCharCode(chr); } return String.fromCharCode(9731) + out; } decompressStringBase64(c, length) { if (!c) { return; } if (c.charCodeAt(0) !== 9731) { return c; } let chr = 0; let rem = 0; let bits = 16; let out = ''; let j = 1; let value = c.charCodeAt(j); for (let i = 0; i < length; i++) { if (bits > 6) { bits -= 6; chr = getNumber(value, bits, 6); out += this.indexBase64.get(chr); } else { rem = 6 - bits; chr = getNumber(value, 0, bits) << rem; value = c.charCodeAt(++j); chr += getNumber(value, 16 - rem, rem); out += this.indexBase64.get(chr); bits = 16 - rem; } } return out; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHJlc3Npb24udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy91dGlscy9zcmMvbGliL2NvbXByZXNzaW9uL2NvbXByZXNzaW9uLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxNQUFNLENBQUM7QUFJNUMsU0FBUyxTQUFTLENBQUMsQ0FBUyxFQUFFLFdBQW1CLEVBQUUsTUFBYztJQUMvRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ2QsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3hDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVoRDtRQUNFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsdUNBQXVDO1FBQ3ZDLGlCQUFpQjtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0Qsa0JBQWtCO1FB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QUcsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2YsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFDdkMsS0FBSyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUIsR0FBRyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ29tcHJlc3NlZERhdGEgfSBmcm9tICcuL2NvbXByZXNzZWREYXRhLmludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGdldE51bWJlcih2OiBudW1iZXIsIGVuZHBvc2l0aW9uOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gIGNvbnN0IG1hc2sgPSAoMSA8PCBsZW5ndGgpIC0gMTtcbiAgcmV0dXJuICh2ID4+IGVuZHBvc2l0aW9uKSAmIG1hc2s7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wcmVzc2lvbiB7XG4gIHByaXZhdGUgYmFzZTY0SW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIGluZGV4QmFzZTY0ID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmdlbmVyYXRlQmFzZTY0SW5kZXgoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVCYXNlNjRJbmRleCgpIHtcbiAgICAvLyBodHRwczovL2ZyLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjRcbiAgICAvLyBBLVogPT4gWzAsIDI1XVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjY7IGkrKykge1xuICAgICAgdGhpcy5iYXNlNjRJbmRleC5zZXQoU3RyaW5nLmZyb21DaGFyQ29kZSgnQScuY2hhckNvZGVBdCgwKSArIGkpLCBpKTtcbiAgICAgIHRoaXMuaW5kZXhCYXNlNjQuc2V0KGksIFN0cmluZy5mcm9tQ2hhckNvZGUoJ0EnLmNoYXJDb2RlQXQoMCkgKyBpKSk7XG4gICAgfVxuICAgIC8vIGEteiA9PiBbMjYsIDUxXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjY7IGkrKykge1xuICAgICAgdGhpcy5iYXNlNjRJbmRleC5zZXQoU3RyaW5nLmZyb21DaGFyQ29kZSgnYScuY2hhckNvZGVBdCgwKSArIGkpLCBpICsgMjYpO1xuICAgICAgdGhpcy5pbmRleEJhc2U2NC5zZXQoaSArIDI2LCBTdHJpbmcuZnJvbUNoYXJDb2RlKCdhJy5jaGFyQ29kZUF0KDApICsgaSkpO1xuICAgIH1cbiAgICAvLyAwLTkgPT4gWzUyLCA2MV1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgIHRoaXMuYmFzZTY0SW5kZXguc2V0KFN0cmluZy5mcm9tQ2hhckNvZGUoJzAnLmNoYXJDb2RlQXQoMCkgKyBpKSwgaSArIDUyKTtcbiAgICAgIHRoaXMuaW5kZXhCYXNlNjQuc2V0KGkgKyA1MiwgU3RyaW5nLmZyb21DaGFyQ29kZSgnMCcuY2hhckNvZGVBdCgwKSArIGkpKTtcbiAgICB9XG4gICAgLy8gKyAvID0+IFs2MiwgNjNdXG4gICAgdGhpcy5iYXNlNjRJbmRleC5zZXQoJysnLCA2Mik7XG4gICAgdGhpcy5iYXNlNjRJbmRleC5zZXQoJy8nLCA2Myk7XG4gICAgdGhpcy5pbmRleEJhc2U2NC5zZXQoNjIsICcrJyk7XG4gICAgdGhpcy5pbmRleEJhc2U2NC5zZXQoNjMsICcvJyk7XG4gIH1cblxuICBjb21wcmVzc0Jsb2IoYmxvYjogQmxvYik6IE9ic2VydmFibGU8Q29tcHJlc3NlZERhdGE+IHtcbiAgICBpZiAoIWJsb2IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBPYnNlcnZlcjxDb21wcmVzc2VkRGF0YT4pID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IHJlYWRlci5yZXN1bHQudmFsdWVPZigpIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgdGV4dDY0ID0gYmFzZTY0LnN1YnN0cihiYXNlNjQuaW5kZXhPZignLCcpICsgMSk7XG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWQgPSB0aGlzLmNvbXByZXNzU3RyaW5nQmFzZTY0KHRleHQ2NCk7XG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhOiBDb21wcmVzc2VkRGF0YSA9IHtcbiAgICAgICAgICBsZW5ndGg6IHRleHQ2NC5sZW5ndGgsXG4gICAgICAgICAgdHlwZTogYmxvYi50eXBlLFxuICAgICAgICAgIG9iamVjdDogY29tcHJlc3NlZFxuICAgICAgICB9O1xuICAgICAgICBvYnNlcnZlci5uZXh0KGNvbXByZXNzZWREYXRhKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH1cblxuICBkZWNvbXByZXNzQmxvYihjb21wcmVzc2VkRGF0YTogQ29tcHJlc3NlZERhdGEpOiBCbG9iIHtcbiAgICBjb25zdCBvYmplY3QgPSBjb21wcmVzc2VkRGF0YS5vYmplY3Q7XG4gICAgY29uc3QgbGVuZ3RoID0gY29tcHJlc3NlZERhdGEubGVuZ3RoO1xuICAgIGNvbnN0IGRlY29tcHJlc3NlZDogc3RyaW5nID0gdGhpcy5kZWNvbXByZXNzU3RyaW5nQmFzZTY0KG9iamVjdCwgbGVuZ3RoKTtcbiAgICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IoZGVjb21wcmVzc2VkKTtcbiAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShieXRlQ2hhcmFjdGVycy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ5dGVOdW1iZXJzW2ldID0gYnl0ZUNoYXJhY3RlcnMuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBjb21wcmVzc2VkRGF0YS50eXBlIH0pO1xuICAgIHJldHVybiBibG9iO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wcmVzc1N0cmluZ0Jhc2U2NChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBvdXQgPSAnJztcbiAgICBsZXQgYml0cyA9IDE2O1xuICAgIGxldCBjaHIgPSAwO1xuICAgIGxldCByZW0gPSAwO1xuICAgIGZvciAoY29uc3QgYyBvZiBzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuYmFzZTY0SW5kZXguZ2V0KGMpO1xuICAgICAgaWYgKGJpdHMgPiA2KSB7XG4gICAgICAgIGJpdHMgLT0gNjtcbiAgICAgICAgY2hyICs9IHZhbHVlIDw8IGJpdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW0gPSA2IC0gYml0cztcbiAgICAgICAgY2hyICs9IHZhbHVlID4+IHJlbTtcbiAgICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKTtcbiAgICAgICAgY2hyID0gdmFsdWUgPDwgKDE2IC0gcmVtKTtcbiAgICAgICAgYml0cyA9IDE2IC0gcmVtO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocy5sZW5ndGggJSA4ICE9PSAwKSB7XG4gICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5NzMxKSArIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb21wcmVzc1N0cmluZ0Jhc2U2NChjOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYy5jaGFyQ29kZUF0KDApICE9PSA5NzMxKSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG5cbiAgICBsZXQgY2hyID0gMDtcbiAgICBsZXQgcmVtID0gMDtcbiAgICBsZXQgYml0cyA9IDE2O1xuICAgIGxldCBvdXQgPSAnJztcbiAgICBsZXQgaiA9IDE7XG4gICAgbGV0IHZhbHVlID0gYy5jaGFyQ29kZUF0KGopO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChiaXRzID4gNikge1xuICAgICAgICBiaXRzIC09IDY7XG4gICAgICAgIGNociA9IGdldE51bWJlcih2YWx1ZSwgYml0cywgNik7XG4gICAgICAgIG91dCArPSB0aGlzLmluZGV4QmFzZTY0LmdldChjaHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtID0gNiAtIGJpdHM7XG4gICAgICAgIGNociA9IGdldE51bWJlcih2YWx1ZSwgMCwgYml0cykgPDwgcmVtO1xuICAgICAgICB2YWx1ZSA9IGMuY2hhckNvZGVBdCgrK2opO1xuICAgICAgICBjaHIgKz0gZ2V0TnVtYmVyKHZhbHVlLCAxNiAtIHJlbSwgcmVtKTtcbiAgICAgICAgb3V0ICs9IHRoaXMuaW5kZXhCYXNlNjQuZ2V0KGNocik7XG4gICAgICAgIGJpdHMgPSAxNiAtIHJlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuIl19