inflater.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. var Buffer = require("buffer").Buffer;
  2. function JSInflater(/*Buffer*/input) {
  3. var WSIZE = 0x8000,
  4. slide = Buffer.alloc(0x10000),
  5. windowPos = 0,
  6. fixedTableList = null,
  7. fixedTableDist,
  8. fixedLookup,
  9. bitBuf = 0,
  10. bitLen = 0,
  11. method = -1,
  12. eof = false,
  13. copyLen = 0,
  14. copyDist = 0,
  15. tblList, tblDist, bitList, bitdist,
  16. inputPosition = 0,
  17. MASK_BITS = [0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff],
  18. LENS = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0],
  19. LEXT = [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, 99, 99],
  20. DISTS = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577],
  21. DEXT = [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],
  22. BITORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  23. function HuffTable(clen, cnum, cval, blist, elist, lookupm) {
  24. this.status = 0;
  25. this.r = null;
  26. this.maxbit = 0;
  27. var el, f, tail,
  28. offsets = [],
  29. countTbl = [],
  30. sTbl = [],
  31. values = [],
  32. tentry = {extra: 0, bitcnt: 0, lbase: 0, next: null};
  33. tail = this.r = null;
  34. for (var i = 0; i < 0x11; i++) {
  35. countTbl[i] = 0;
  36. sTbl[i] = 0;
  37. offsets[i] = 0;
  38. }
  39. for (i = 0; i < 0x120; i++) values[i] = 0;
  40. el = cnum > 256 ? clen[256] : 16;
  41. var pidx = -1;
  42. while (++pidx < cnum) countTbl[clen[pidx]]++;
  43. if (countTbl[0] === cnum) return;
  44. for (var j = 1; j <= 16; j++) if (countTbl[j] !== 0) break;
  45. var bitLen = j;
  46. for (i = 16; i !== 0; i--) if (countTbl[i] !== 0) break;
  47. var maxLen = i;
  48. lookupm < j && (lookupm = j);
  49. var dCodes = 1 << j;
  50. for (; j < i; j++, dCodes <<= 1)
  51. if ((dCodes -= countTbl[j]) < 0) {
  52. this.status = 2;
  53. this.maxbit = lookupm;
  54. return;
  55. }
  56. if ((dCodes -= countTbl[i]) < 0) {
  57. this.status = 2;
  58. this.maxbit = lookupm;
  59. return;
  60. }
  61. countTbl[i] += dCodes;
  62. offsets[1] = j = 0;
  63. pidx = 1;
  64. var xp = 2;
  65. while (--i > 0) offsets[xp++] = (j += countTbl[pidx++]);
  66. pidx = 0;
  67. i = 0;
  68. do {
  69. (j = clen[pidx++]) && (values[offsets[j]++] = i);
  70. } while (++i < cnum);
  71. cnum = offsets[maxLen];
  72. offsets[0] = i = 0;
  73. pidx = 0;
  74. var level = -1,
  75. w = sTbl[0] = 0,
  76. cnode = null,
  77. tblCnt = 0,
  78. tblStack = [];
  79. for (; bitLen <= maxLen; bitLen++) {
  80. var kccnt = countTbl[bitLen];
  81. while (kccnt-- > 0) {
  82. while (bitLen > w + sTbl[1 + level]) {
  83. w += sTbl[1 + level];
  84. level++;
  85. tblCnt = (tblCnt = maxLen - w) > lookupm ? lookupm : tblCnt;
  86. if ((f = 1 << (j = bitLen - w)) > kccnt + 1) {
  87. f -= kccnt + 1;
  88. xp = bitLen;
  89. while (++j < tblCnt) {
  90. if ((f <<= 1) <= countTbl[++xp]) break;
  91. f -= countTbl[xp];
  92. }
  93. }
  94. if (w + j > el && w < el) j = el - w;
  95. tblCnt = 1 << j;
  96. sTbl[1 + level] = j;
  97. cnode = [];
  98. while (cnode.length < tblCnt) cnode.push({extra: 0, bitcnt: 0, lbase: 0, next: null});
  99. if (tail == null) {
  100. tail = this.r = {next: null, list: null};
  101. } else {
  102. tail = tail.next = {next: null, list: null}
  103. }
  104. tail.next = null;
  105. tail.list = cnode;
  106. tblStack[level] = cnode;
  107. if (level > 0) {
  108. offsets[level] = i;
  109. tentry.bitcnt = sTbl[level];
  110. tentry.extra = 16 + j;
  111. tentry.next = cnode;
  112. j = (i & ((1 << w) - 1)) >> (w - sTbl[level]);
  113. tblStack[level - 1][j].extra = tentry.extra;
  114. tblStack[level - 1][j].bitcnt = tentry.bitcnt;
  115. tblStack[level - 1][j].lbase = tentry.lbase;
  116. tblStack[level - 1][j].next = tentry.next;
  117. }
  118. }
  119. tentry.bitcnt = bitLen - w;
  120. if (pidx >= cnum)
  121. tentry.extra = 99;
  122. else if (values[pidx] < cval) {
  123. tentry.extra = (values[pidx] < 256 ? 16 : 15);
  124. tentry.lbase = values[pidx++];
  125. } else {
  126. tentry.extra = elist[values[pidx] - cval];
  127. tentry.lbase = blist[values[pidx++] - cval];
  128. }
  129. f = 1 << (bitLen - w);
  130. for (j = i >> w; j < tblCnt; j += f) {
  131. cnode[j].extra = tentry.extra;
  132. cnode[j].bitcnt = tentry.bitcnt;
  133. cnode[j].lbase = tentry.lbase;
  134. cnode[j].next = tentry.next;
  135. }
  136. for (j = 1 << (bitLen - 1); (i & j) !== 0; j >>= 1)
  137. i ^= j;
  138. i ^= j;
  139. while ((i & ((1 << w) - 1)) !== offsets[level]) {
  140. w -= sTbl[level];
  141. level--;
  142. }
  143. }
  144. }
  145. this.maxbit = sTbl[1];
  146. this.status = ((dCodes !== 0 && maxLen !== 1) ? 1 : 0);
  147. }
  148. function addBits(n) {
  149. while (bitLen < n) {
  150. bitBuf |= input[inputPosition++] << bitLen;
  151. bitLen += 8;
  152. }
  153. return bitBuf;
  154. }
  155. function cutBits(n) {
  156. bitLen -= n;
  157. return bitBuf >>= n;
  158. }
  159. function maskBits(n) {
  160. while (bitLen < n) {
  161. bitBuf |= input[inputPosition++] << bitLen;
  162. bitLen += 8;
  163. }
  164. var res = bitBuf & MASK_BITS[n];
  165. bitBuf >>= n;
  166. bitLen -= n;
  167. return res;
  168. }
  169. function codes(buff, off, size) {
  170. var e, t;
  171. if (size === 0) return 0;
  172. var n = 0;
  173. for (; ;) {
  174. t = tblList.list[addBits(bitList) & MASK_BITS[bitList]];
  175. e = t.extra;
  176. while (e > 16) {
  177. if (e === 99) return -1;
  178. cutBits(t.bitcnt);
  179. e -= 16;
  180. t = t.next[addBits(e) & MASK_BITS[e]];
  181. e = t.extra;
  182. }
  183. cutBits(t.bitcnt);
  184. if (e === 16) {
  185. windowPos &= WSIZE - 1;
  186. buff[off + n++] = slide[windowPos++] = t.lbase;
  187. if (n === size) return size;
  188. continue;
  189. }
  190. if (e === 15) break;
  191. copyLen = t.lbase + maskBits(e);
  192. t = tblDist.list[addBits(bitdist) & MASK_BITS[bitdist]];
  193. e = t.extra;
  194. while (e > 16) {
  195. if (e === 99) return -1;
  196. cutBits(t.bitcnt);
  197. e -= 16;
  198. t = t.next[addBits(e) & MASK_BITS[e]];
  199. e = t.extra
  200. }
  201. cutBits(t.bitcnt);
  202. copyDist = windowPos - t.lbase - maskBits(e);
  203. while (copyLen > 0 && n < size) {
  204. copyLen--;
  205. copyDist &= WSIZE - 1;
  206. windowPos &= WSIZE - 1;
  207. buff[off + n++] = slide[windowPos++] = slide[copyDist++];
  208. }
  209. if (n === size) return size;
  210. }
  211. method = -1; // done
  212. return n;
  213. }
  214. function stored(buff, off, size) {
  215. cutBits(bitLen & 7);
  216. var n = maskBits(0x10);
  217. if (n !== ((~maskBits(0x10)) & 0xffff)) return -1;
  218. copyLen = n;
  219. n = 0;
  220. while (copyLen > 0 && n < size) {
  221. copyLen--;
  222. windowPos &= WSIZE - 1;
  223. buff[off + n++] = slide[windowPos++] = maskBits(8);
  224. }
  225. if (copyLen === 0) method = -1;
  226. return n;
  227. }
  228. function fixed(buff, off, size) {
  229. var fixed_bd = 0;
  230. if (fixedTableList == null) {
  231. var lengths = [];
  232. for (var symbol = 0; symbol < 144; symbol++) lengths[symbol] = 8;
  233. for (; symbol < 256; symbol++) lengths[symbol] = 9;
  234. for (; symbol < 280; symbol++) lengths[symbol] = 7;
  235. for (; symbol < 288; symbol++) lengths[symbol] = 8;
  236. fixedLookup = 7;
  237. var htbl = new HuffTable(lengths, 288, 257, LENS, LEXT, fixedLookup);
  238. if (htbl.status !== 0) return -1;
  239. fixedTableList = htbl.r;
  240. fixedLookup = htbl.maxbit;
  241. for (symbol = 0; symbol < 30; symbol++) lengths[symbol] = 5;
  242. fixed_bd = 5;
  243. htbl = new HuffTable(lengths, 30, 0, DISTS, DEXT, fixed_bd);
  244. if (htbl.status > 1) {
  245. fixedTableList = null;
  246. return -1;
  247. }
  248. fixedTableDist = htbl.r;
  249. fixed_bd = htbl.maxbit;
  250. }
  251. tblList = fixedTableList;
  252. tblDist = fixedTableDist;
  253. bitList = fixedLookup;
  254. bitdist = fixed_bd;
  255. return codes(buff, off, size);
  256. }
  257. function dynamic(buff, off, size) {
  258. var ll = new Array(0x023C);
  259. for (var m = 0; m < 0x023C; m++) ll[m] = 0;
  260. var llencnt = 257 + maskBits(5),
  261. dcodescnt = 1 + maskBits(5),
  262. bitlencnt = 4 + maskBits(4);
  263. if (llencnt > 286 || dcodescnt > 30) return -1;
  264. for (var j = 0; j < bitlencnt; j++) ll[BITORDER[j]] = maskBits(3);
  265. for (; j < 19; j++) ll[BITORDER[j]] = 0;
  266. // build decoding table for trees--single level, 7 bit lookup
  267. bitList = 7;
  268. var hufTable = new HuffTable(ll, 19, 19, null, null, bitList);
  269. if (hufTable.status !== 0)
  270. return -1; // incomplete code set
  271. tblList = hufTable.r;
  272. bitList = hufTable.maxbit;
  273. var lencnt = llencnt + dcodescnt,
  274. i = 0,
  275. lastLen = 0;
  276. while (i < lencnt) {
  277. var hufLcode = tblList.list[addBits(bitList) & MASK_BITS[bitList]];
  278. j = hufLcode.bitcnt;
  279. cutBits(j);
  280. j = hufLcode.lbase;
  281. if (j < 16)
  282. ll[i++] = lastLen = j;
  283. else if (j === 16) {
  284. j = 3 + maskBits(2);
  285. if (i + j > lencnt) return -1;
  286. while (j-- > 0) ll[i++] = lastLen;
  287. } else if (j === 17) {
  288. j = 3 + maskBits(3);
  289. if (i + j > lencnt) return -1;
  290. while (j-- > 0) ll[i++] = 0;
  291. lastLen = 0;
  292. } else {
  293. j = 11 + maskBits(7);
  294. if (i + j > lencnt) return -1;
  295. while (j-- > 0) ll[i++] = 0;
  296. lastLen = 0;
  297. }
  298. }
  299. bitList = 9;
  300. hufTable = new HuffTable(ll, llencnt, 257, LENS, LEXT, bitList);
  301. bitList === 0 && (hufTable.status = 1);
  302. if (hufTable.status !== 0) return -1;
  303. tblList = hufTable.r;
  304. bitList = hufTable.maxbit;
  305. for (i = 0; i < dcodescnt; i++) ll[i] = ll[i + llencnt];
  306. bitdist = 6;
  307. hufTable = new HuffTable(ll, dcodescnt, 0, DISTS, DEXT, bitdist);
  308. tblDist = hufTable.r;
  309. bitdist = hufTable.maxbit;
  310. if ((bitdist === 0 && llencnt > 257) || hufTable.status !== 0) return -1;
  311. return codes(buff, off, size);
  312. }
  313. return {
  314. inflate: function (/*Buffer*/outputBuffer) {
  315. tblList = null;
  316. var size = outputBuffer.length,
  317. offset = 0, i;
  318. while (offset < size) {
  319. if (eof && method === -1) return;
  320. if (copyLen > 0) {
  321. if (method !== 0) {
  322. while (copyLen > 0 && offset < size) {
  323. copyLen--;
  324. copyDist &= WSIZE - 1;
  325. windowPos &= WSIZE - 1;
  326. outputBuffer[offset++] = (slide[windowPos++] = slide[copyDist++]);
  327. }
  328. } else {
  329. while (copyLen > 0 && offset < size) {
  330. copyLen--;
  331. windowPos &= WSIZE - 1;
  332. outputBuffer[offset++] = (slide[windowPos++] = maskBits(8));
  333. }
  334. copyLen === 0 && (method = -1); // done
  335. }
  336. if (offset === size) return;
  337. }
  338. if (method === -1) {
  339. if (eof) break;
  340. eof = maskBits(1) !== 0;
  341. method = maskBits(2);
  342. tblList = null;
  343. copyLen = 0;
  344. }
  345. switch (method) {
  346. case 0:
  347. i = stored(outputBuffer, offset, size - offset);
  348. break;
  349. case 1:
  350. i = tblList != null ? codes(outputBuffer, offset, size - offset) : fixed(outputBuffer, offset, size - offset);
  351. break;
  352. case 2:
  353. i = tblList != null ? codes(outputBuffer, offset, size - offset) : dynamic(outputBuffer, offset, size - offset);
  354. break;
  355. default:
  356. i = -1;
  357. break;
  358. }
  359. if (i === -1) return;
  360. offset += i;
  361. }
  362. }
  363. };
  364. }
  365. module.exports = function (/*Buffer*/inbuf) {
  366. var zlib = require("zlib");
  367. return {
  368. inflateAsync: function (/*Function*/callback) {
  369. var tmp = zlib.createInflateRaw(),
  370. parts = [], total = 0;
  371. tmp.on('data', function (data) {
  372. parts.push(data);
  373. total += data.length;
  374. });
  375. tmp.on('end', function () {
  376. var buf = Buffer.alloc(total), written = 0;
  377. buf.fill(0);
  378. for (var i = 0; i < parts.length; i++) {
  379. var part = parts[i];
  380. part.copy(buf, written);
  381. written += part.length;
  382. }
  383. callback && callback(buf);
  384. });
  385. tmp.end(inbuf)
  386. },
  387. inflate: function (/*Buffer*/outputBuffer) {
  388. var x = {
  389. x: new JSInflater(inbuf)
  390. };
  391. x.x.inflate(outputBuffer);
  392. delete(x.x);
  393. }
  394. }
  395. };