101arrowz / fflate

High performance (de)compression in an 8kB package

Home Page:https://101arrowz.github.io/fflate

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

need to have advertised 3KB js gzip decompressor

lynch- opened this issue · comments

Hi guys!

Could you please kindly provide a reference to advertised 3KB js gzip decompressor?
thanking you in advance

You can create this yourself by using a modern bundler for your project. But I'll attach some sample files for you.

ESM:

var r=Uint8Array,e=Uint16Array,n=Uint32Array,a=new r([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]),t=new r([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]),i=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),f=function(r,a){for(var t=new e(31),i=0;i<31;++i)t[i]=a+=1<<r[i-1];var f=new n(t[30]);for(i=1;i<30;++i)for(var o=t[i];o<t[i+1];++o)f[o]=o-t[i]<<5|i;return[t,f]},o=f(a,2),v=o[0],u=o[1];v[28]=258,u[258]=28;for(var l=f(t,0),c=l[0],d=(l[1],new e(32768)),s=0;s<32768;++s){var w=(43690&s)>>>1|(21845&s)<<1;w=(61680&(w=(52428&w)>>>2|(13107&w)<<2))>>>4|(3855&w)<<4,d[s]=((65280&w)>>>8|(255&w)<<8)>>>1}var h=function(r,n,a){for(var t=r.length,i=0,f=new e(n);i<t;++i)r[i]&&++f[r[i]-1];var o,v=new e(n);for(i=0;i<n;++i)v[i]=v[i-1]+f[i-1]<<1;if(a){o=new e(1<<n);var u=15-n;for(i=0;i<t;++i)if(r[i])for(var l=i<<4|r[i],c=n-r[i],s=v[r[i]-1]++<<c,w=s|(1<<c)-1;s<=w;++s)o[d[s]>>>u]=l}else for(o=new e(t),i=0;i<t;++i)r[i]&&(o[i]=d[v[r[i]-1]++]>>>15-r[i]);return o},b=new r(288);for(s=0;s<144;++s)b[s]=8;for(s=144;s<256;++s)b[s]=9;for(s=256;s<280;++s)b[s]=7;for(s=280;s<288;++s)b[s]=8;var g=new r(32);for(s=0;s<32;++s)g[s]=5;var E=h(b,9,1),y=h(g,5,1),p=function(r){for(var e=r[0],n=1;n<r.length;++n)r[n]>e&&(e=r[n]);return e},k=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(7&e)&n},T=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(7&e)},m=function(r){return(r+7)/8|0},x=function(a,t,i){(null==t||t<0)&&(t=0),(null==i||i>a.length)&&(i=a.length);var f=new(2==a.BYTES_PER_ELEMENT?e:4==a.BYTES_PER_ELEMENT?n:r)(i-t);return f.set(a.subarray(t,i)),f},M=["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"],S=function(r,e,n){var a=new Error(e||M[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,S),!n)throw a;return a},U=function(e,n,f){var o=e.length;if(!o||f&&f.f&&!f.l)return n||new r(0);var u=!n||f,l=!f||f.i;f||(f={}),n||(n=new r(3*o));var d=function(e){var a=n.length;if(e>a){var t=new r(Math.max(2*a,e));t.set(n),n=t}},s=f.f||0,w=f.p||0,b=f.b||0,g=f.l,M=f.d,U=f.m,_=f.n,A=8*o;do{if(!g){s=k(e,w,1);var q=k(e,w+1,3);if(w+=3,!q){var z=e[(C=m(w)+4)-4]|e[C-3]<<8,B=C+z;if(B>o){l&&S(0);break}u&&d(b+z),n.set(e.subarray(C,B),b),f.b=b+=z,f.p=w=8*B,f.f=s;continue}if(1==q)g=E,M=y,U=9,_=5;else if(2==q){var D=k(e,w,31)+257,F=k(e,w+10,15)+4,L=D+k(e,w+5,31)+1;w+=14;for(var N=new r(L),P=new r(19),R=0;R<F;++R)P[i[R]]=k(e,w+3*R,7);w+=3*F;var Y=p(P),O=(1<<Y)-1,j=h(P,Y,1);for(R=0;R<L;){var C,G=j[k(e,w,O)];if(w+=15&G,(C=G>>>4)<16)N[R++]=C;else{var H=0,I=0;for(16==C?(I=3+k(e,w,3),w+=2,H=N[R-1]):17==C?(I=3+k(e,w,7),w+=3):18==C&&(I=11+k(e,w,127),w+=7);I--;)N[R++]=H}}var J=N.subarray(0,D),K=N.subarray(D);U=p(J),_=p(K),g=h(J,U,1),M=h(K,_,1)}else S(1);if(w>A){l&&S(0);break}}u&&d(b+131072);for(var Q=(1<<U)-1,V=(1<<_)-1,W=w;;W=w){var X=(H=g[T(e,w)&Q])>>>4;if((w+=15&H)>A){l&&S(0);break}if(H||S(2),X<256)n[b++]=X;else{if(256==X){W=w,g=null;break}var Z=X-254;if(X>264){var $=a[R=X-257];Z=k(e,w,(1<<$)-1)+v[R],w+=$}var rr=M[T(e,w)&V],er=rr>>>4;rr||S(3),w+=15&rr;K=c[er];if(er>3){$=t[er];K+=T(e,w)&(1<<$)-1,w+=$}if(w>A){l&&S(0);break}u&&d(b+131072);for(var nr=b+Z;b<nr;b+=4)n[b]=n[b-K],n[b+1]=n[b+1-K],n[b+2]=n[b+2-K],n[b+3]=n[b+3-K];b=nr}}f.l=g,f.p=W,f.b=b,f.f=s,g&&(s=1,f.m=U,f.d=M,f.n=_)}while(!s);return b==n.length?n:x(n,0,b)},_=new r(0),A=function(r){31==r[0]&&139==r[1]&&8==r[2]||S(6,"invalid gzip data");var e=r[3],n=10;4&e&&(n+=r[10]|2+(r[11]<<8));for(var a=(e>>3&1)+(e>>4&1);a>0;a-=!r[n++]);return n+(2&e)},q=function(r){var e=r.length;return(r[e-4]|r[e-3]<<8|r[e-2]<<16|r[e-1]<<24)>>>0};function z(e,n){return U(e.subarray(A(e),-8),n||new r(q(e)))}var B="undefined"!=typeof TextDecoder&&new TextDecoder;try{B.decode(_,{stream:!0}),1}catch(r){}"function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout&&setTimeout;export {z as gunzipSync}

Usage:

// Copy that ESM block into fflate.js
import { gunzipSync } from './fflate.js';

gunzipSync(new Uint8Array(yourArrayBuffer))

Or a global build:

var r=Uint8Array,e=Uint16Array,n=Uint32Array,a=new r([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]),t=new r([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]),i=new r([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),f=function(r,a){for(var t=new e(31),i=0;i<31;++i)t[i]=a+=1<<r[i-1];var f=new n(t[30]);for(i=1;i<30;++i)for(var o=t[i];o<t[i+1];++o)f[o]=o-t[i]<<5|i;return[t,f]},o=f(a,2),v=o[0],u=o[1];v[28]=258,u[258]=28;for(var l=f(t,0),c=l[0],d=(l[1],new e(32768)),s=0;s<32768;++s){var w=(43690&s)>>>1|(21845&s)<<1;w=(61680&(w=(52428&w)>>>2|(13107&w)<<2))>>>4|(3855&w)<<4,d[s]=((65280&w)>>>8|(255&w)<<8)>>>1}var h=function(r,n,a){for(var t=r.length,i=0,f=new e(n);i<t;++i)r[i]&&++f[r[i]-1];var o,v=new e(n);for(i=0;i<n;++i)v[i]=v[i-1]+f[i-1]<<1;if(a){o=new e(1<<n);var u=15-n;for(i=0;i<t;++i)if(r[i])for(var l=i<<4|r[i],c=n-r[i],s=v[r[i]-1]++<<c,w=s|(1<<c)-1;s<=w;++s)o[d[s]>>>u]=l}else for(o=new e(t),i=0;i<t;++i)r[i]&&(o[i]=d[v[r[i]-1]++]>>>15-r[i]);return o},b=new r(288);for(s=0;s<144;++s)b[s]=8;for(s=144;s<256;++s)b[s]=9;for(s=256;s<280;++s)b[s]=7;for(s=280;s<288;++s)b[s]=8;var g=new r(32);for(s=0;s<32;++s)g[s]=5;var E=h(b,9,1),y=h(g,5,1),p=function(r){for(var e=r[0],n=1;n<r.length;++n)r[n]>e&&(e=r[n]);return e},k=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(7&e)&n},T=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(7&e)},m=function(r){return(r+7)/8|0},x=function(a,t,i){(null==t||t<0)&&(t=0),(null==i||i>a.length)&&(i=a.length);var f=new(2==a.BYTES_PER_ELEMENT?e:4==a.BYTES_PER_ELEMENT?n:r)(i-t);return f.set(a.subarray(t,i)),f},M=["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"],S=function(r,e,n){var a=new Error(e||M[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,S),!n)throw a;return a},U=function(e,n,f){var o=e.length;if(!o||f&&f.f&&!f.l)return n||new r(0);var u=!n||f,l=!f||f.i;f||(f={}),n||(n=new r(3*o));var d=function(e){var a=n.length;if(e>a){var t=new r(Math.max(2*a,e));t.set(n),n=t}},s=f.f||0,w=f.p||0,b=f.b||0,g=f.l,M=f.d,U=f.m,_=f.n,A=8*o;do{if(!g){s=k(e,w,1);var q=k(e,w+1,3);if(w+=3,!q){var z=e[(C=m(w)+4)-4]|e[C-3]<<8,B=C+z;if(B>o){l&&S(0);break}u&&d(b+z),n.set(e.subarray(C,B),b),f.b=b+=z,f.p=w=8*B,f.f=s;continue}if(1==q)g=E,M=y,U=9,_=5;else if(2==q){var D=k(e,w,31)+257,F=k(e,w+10,15)+4,L=D+k(e,w+5,31)+1;w+=14;for(var N=new r(L),P=new r(19),R=0;R<F;++R)P[i[R]]=k(e,w+3*R,7);w+=3*F;var Y=p(P),O=(1<<Y)-1,j=h(P,Y,1);for(R=0;R<L;){var C,G=j[k(e,w,O)];if(w+=15&G,(C=G>>>4)<16)N[R++]=C;else{var H=0,I=0;for(16==C?(I=3+k(e,w,3),w+=2,H=N[R-1]):17==C?(I=3+k(e,w,7),w+=3):18==C&&(I=11+k(e,w,127),w+=7);I--;)N[R++]=H}}var J=N.subarray(0,D),K=N.subarray(D);U=p(J),_=p(K),g=h(J,U,1),M=h(K,_,1)}else S(1);if(w>A){l&&S(0);break}}u&&d(b+131072);for(var Q=(1<<U)-1,V=(1<<_)-1,W=w;;W=w){var X=(H=g[T(e,w)&Q])>>>4;if((w+=15&H)>A){l&&S(0);break}if(H||S(2),X<256)n[b++]=X;else{if(256==X){W=w,g=null;break}var Z=X-254;if(X>264){var $=a[R=X-257];Z=k(e,w,(1<<$)-1)+v[R],w+=$}var rr=M[T(e,w)&V],er=rr>>>4;rr||S(3),w+=15&rr;K=c[er];if(er>3){$=t[er];K+=T(e,w)&(1<<$)-1,w+=$}if(w>A){l&&S(0);break}u&&d(b+131072);for(var nr=b+Z;b<nr;b+=4)n[b]=n[b-K],n[b+1]=n[b+1-K],n[b+2]=n[b+2-K],n[b+3]=n[b+3-K];b=nr}}f.l=g,f.p=W,f.b=b,f.f=s,g&&(s=1,f.m=U,f.d=M,f.n=_)}while(!s);return b==n.length?n:x(n,0,b)},_=new r(0),A=function(r){31==r[0]&&139==r[1]&&8==r[2]||S(6,"invalid gzip data");var e=r[3],n=10;4&e&&(n+=r[10]|2+(r[11]<<8));for(var a=(e>>3&1)+(e>>4&1);a>0;a-=!r[n++]);return n+(2&e)},q=function(r){var e=r.length;return(r[e-4]|r[e-3]<<8|r[e-2]<<16|r[e-1]<<24)>>>0};function z(e,n){return U(e.subarray(A(e),-8),n||new r(q(e)))}var B="undefined"!=typeof TextDecoder&&new TextDecoder;try{B.decode(_,{stream:!0}),1}catch(r){}"function"==typeof queueMicrotask?queueMicrotask:"function"==typeof setTimeout&&setTimeout;(typeof self!='undefined'?self:window).fflate={gunzipSync:z}

Usage:

// Copy that global block into fflate.js and add this into your HTML:
// <script src="fflate.js"></script>
// Now fflate is a global variable

fflate.gunzipSync(new Uint8Array(yourArrayBuffer))

Both of these files are 4kB, not 3kB, as shown in the size estimations.

awesome! thank you