gunzipScripts-0.0.1.js

It looks for scripts with type text/javascript+gzip and decompresses them. Since decompres operation is sync, you don't need to listen to an event.

If you will use GZIP scripts, it's important to request this script after all the scripts compressed with GZIP.

"use strict";
(() => {
    var v = Uint8Array,
        A = Uint16Array,
        _ = Uint32Array,
        rr = new v([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0]),
        nr = new v([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0]),
        lr = new v([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]),
        tr = function (r, n) {
            for (var t = new A(31), e = 0; e < 31; ++e) t[e] = n += 1 << r[e - 1];
            for (var a = new _(t[30]), e = 1; e < 30; ++e)
                for (var u = t[e]; u < t[e + 1]; ++u) a[u] = u - t[e] << 5 | e;
            return [t, a]
        },
        er = tr(rr, 2),
        ir = er[0],
        cr = er[1];
    ir[28] = 258, cr[258] = 28;
    var ar = tr(nr, 0),
        pr = ar[0],
        Ur = ar[1],
        q = new A(32768);
    for (o = 0; o < 32768; ++o) m = (o & 43690) >>> 1 | (o & 21845) << 1, m = (m & 52428) >>> 2 | (m & 13107) << 2, m = (m & 61680) >>> 4 | (m & 3855) << 4, q[o] = ((m & 65280) >>> 8 | (m & 255) << 8) >>> 1;
    var m, o, D = function (r, n, t) {
        for (var e = r.length, a = 0, u = new A(n); a < e; ++a) r[a] && ++u[r[a] - 1];
        var g = new A(n);
        for (a = 0; a < n; ++a) g[a] = g[a - 1] + u[a - 1] << 1;
        var s;
        if (t) {
            s = new A(1 << n);
            var i = 15 - n;
            for (a = 0; a < e; ++a)
                if (r[a])
                    for (var f = a << 4 | r[a], h = n - r[a], l = g[r[a] - 1]++ << h, w = l | (1 << h) - 1; l <= w; ++l) s[q[l] >>> i] = f
        } else
            for (s = new A(e), a = 0; a < e; ++a) r[a] && (s[a] = q[g[r[a] - 1]++] >>> 15 - r[a]);
        return s
    },
        E = new v(288);
    for (o = 0; o < 144; ++o) E[o] = 8;
    var o;
    for (o = 144; o < 256; ++o) E[o] = 9;
    var o;
    for (o = 256; o < 280; ++o) E[o] = 7;
    var o;
    for (o = 280; o < 288; ++o) E[o] = 8;
    var o, or = new v(32);
    for (o = 0; o < 32; ++o) or[o] = 5;
    var o;
    var gr = D(E, 9, 1);
    var yr = D(or, 5, 1),
        R = function (r) {
            for (var n = r[0], t = 1; t < r.length; ++t) r[t] > n && (n = r[t]);
            return n
        },
        p = function (r, n, t) {
            var e = n / 8 | 0;
            return (r[e] | r[e + 1] << 8) >> (n & 7) & t
        },
        $ = function (r, n) {
            var t = n / 8 | 0;
            return (r[t] | r[t + 1] << 8 | r[t + 2] << 16) >> (n & 7)
        },
        wr = function (r) {
            return (r + 7) / 8 | 0
        },
        mr = function (r, n, t) {
            (n == null || n < 0) && (n = 0), (t == null || t > r.length) && (t = r.length);
            var e = new (r.BYTES_PER_ELEMENT == 2 ? A : r.BYTES_PER_ELEMENT == 4 ? _ : v)(t - n);
            return e.set(r.subarray(n, t)), e
        };
    var xr = ["unexpected EOF", "invalid block type", "invalid length/literal", "invalid distance", "stream finished", "no stream handler", , "no callback", "invalid UTF-8 data", "extra field too long", "date not in range 1980-2099", "filename too long", "stream finishing", "invalid zip data"],
        x = function (r, n, t) {
            var e = new Error(n || xr[r]);
            if (e.code = r, Error.captureStackTrace && Error.captureStackTrace(e, x), !t) throw e;
            return e
        },
        zr = function (r, n, t) {
            var e = r.length;
            if (!e || t && t.f && !t.l) return n || new v(0);
            var a = !n || t,
                u = !t || t.i;
            t || (t = {}), n || (n = new v(e * 3));
            var g = function (V) {
                var X = n.length;
                if (V > X) {
                    var b = new v(Math.max(X * 2, V));
                    b.set(n), n = b
                }
            },
                s = t.f || 0,
                i = t.p || 0,
                f = t.b || 0,
                h = t.l,
                l = t.d,
                w = t.m,
                T = t.n,
                I = e * 8;
            do {
                if (!h) {
                    s = p(r, i, 1);
                    var B = p(r, i + 1, 3);
                    if (i += 3, B)
                        if (B == 1) h = gr, l = yr, w = 9, T = 5;
                        else if (B == 2) {
                            var G = p(r, i, 31) + 257,
                                Y = p(r, i + 10, 15) + 4,
                                W = G + p(r, i + 5, 31) + 1;
                            i += 14;
                            for (var C = new v(W), O = new v(19), c = 0; c < Y; ++c) O[lr[c]] = p(r, i + c * 3, 7);
                            i += Y * 3;
                            for (var j = R(O), sr = (1 << j) - 1, ur = D(O, j, 1), c = 0; c < W;) {
                                var d = ur[p(r, i, sr)];
                                i += d & 15;
                                var y = d >>> 4;
                                if (y < 16) C[c++] = y;
                                else {
                                    var S = 0,
                                        F = 0;
                                    for (y == 16 ? (F = 3 + p(r, i, 3), i += 2, S = C[c - 1]) : y == 17 ? (F = 3 + p(r, i, 7), i += 3) : y == 18 && (F = 11 + p(r, i, 127), i += 7); F--;) C[c++] = S
                                }
                            }
                            var J = C.subarray(0, G),
                                z = C.subarray(G);
                            w = R(J), T = R(z), h = D(J, w, 1), l = D(z, T, 1)
                        } else x(1);
                    else {
                        var y = wr(i) + 4,
                            Z = r[y - 4] | r[y - 3] << 8,
                            k = y + Z;
                        if (k > e) {
                            u && x(0);
                            break
                        }
                        a && g(f + Z), n.set(r.subarray(y, k), f), t.b = f += Z, t.p = i = k * 8, t.f = s;
                        continue
                    }
                    if (i > I) {
                        u && x(0);
                        break
                    }
                }
                a && g(f + 131072);
                for (var vr = (1 << w) - 1, hr = (1 << T) - 1, L = i; ; L = i) {
                    var S = h[$(r, i) & vr],
                        M = S >>> 4;
                    if (i += S & 15, i > I) {
                        u && x(0);
                        break
                    }
                    if (S || x(2), M < 256) n[f++] = M;
                    else if (M == 256) {
                        L = i, h = null;
                        break
                    } else {
                        var K = M - 254;
                        if (M > 264) {
                            var c = M - 257,
                                U = rr[c];
                            K = p(r, i, (1 << U) - 1) + ir[c], i += U
                        }
                        var P = l[$(r, i) & hr],
                            N = P >>> 4;
                        P || x(3), i += P & 15;
                        var z = pr[N];
                        if (N > 3) {
                            var U = nr[N];
                            z += $(r, i) & (1 << U) - 1, i += U
                        }
                        if (i > I) {
                            u && x(0);
                            break
                        }
                        a && g(f + 131072);
                        for (var Q = f + K; f < Q; f += 4) n[f] = n[f - z], n[f + 1] = n[f + 1 - z], n[f + 2] = n[f + 2 - z], n[f + 3] = n[f + 3 - z];
                        f = Q
                    }
                }
                t.l = h, t.p = L, t.b = f, t.f = s, h && (s = 1, t.m = w, t.d = l, t.n = T)
            } while (!s);
            return f == n.length ? n : mr(n, 0, f)
        };
    var Ar = new v(0);
    var Sr = function (r) {
        (r[0] != 31 || r[1] != 139 || r[2] != 8) && x(6, "invalid gzip data");
        var n = r[3],
            t = 10;
        n & 4 && (t += r[10] | (r[11] << 8) + 2);
        for (var e = (n >> 3 & 1) + (n >> 4 & 1); e > 0; e -= !r[t++]);
        return t + (n & 2)
    },
        Mr = function (r) {
            var n = r.length;
            return (r[n - 4] | r[n - 3] << 8 | r[n - 2] << 16 | r[n - 1] << 24) >>> 0
        };

    function H(r, n) {
        return zr(r.subarray(Sr(r), -8), n || new v(Mr(r)))
    }
    var Tr = typeof TextDecoder < "u" && new TextDecoder,
        Cr = 0;
    try {
        Tr.decode(Ar, {
            stream: !0
        }), Cr = 1
    } catch { }
    var fr = () => {
        var n;
        let r = document.querySelectorAll('script[type="text/javascript+gzip"][src]');
        for (let t of r) try {
            let e = t.src.match(/^data:(.*?)(?:;(base64))?,(.*)$/);
            if (!e) continue;
            let [a, u, g, s] = e, i = Uint8Array.from(g ? atob(s) : decodeURIComponent(s), w => w.charCodeAt(0)), h = new TextDecoder().decode(H(i)), l = document.createElement("script");
            l.textContent = h, (n = t.parentNode) == null || n.replaceChild(l, t)
        } catch (e) {
            console.error("Could not gunzip script", t, e)
        }
    };
    fr();
    window.gunzipSync = H;
    window.gunzipScripts = fr;
})();

You can check this example to see how it's used.

Last updated