( buf: Uint8Array, pos: number, limits: Pick<ParsePackLimits, "maxObjectBytes"> = DEFAULT_LIMITS, )
| 184 | } |
| 185 | |
| 186 | function inflateRaw( |
| 187 | buf: Uint8Array, |
| 188 | pos: number, |
| 189 | limits: Pick<ParsePackLimits, "maxObjectBytes"> = DEFAULT_LIMITS, |
| 190 | ): { out: Uint8Array; endPos: number } { |
| 191 | const br = new BitReader(buf, pos); |
| 192 | const out: number[] = []; |
| 193 | let final = 0; |
| 194 | do { |
| 195 | final = br.bit(); |
| 196 | const type = br.bits(2); |
| 197 | if (type === 0) { |
| 198 | br.align(); |
| 199 | requireAvailable(buf, br.pos, 4, "stored deflate block header"); |
| 200 | const len = buf[br.pos] | (buf[br.pos + 1] << 8); |
| 201 | const nlen = buf[br.pos + 2] | (buf[br.pos + 3] << 8); |
| 202 | if (((len ^ 0xffff) & 0xffff) !== nlen) { |
| 203 | throw new PackParseError("bad stored deflate length"); |
| 204 | } |
| 205 | br.pos += 4; // len + nlen |
| 206 | requireAvailable(buf, br.pos, len, "stored deflate block"); |
| 207 | for (let i = 0; i < len; i++) pushInflated(out, buf[br.pos++]!, limits.maxObjectBytes); |
| 208 | } else { |
| 209 | let litH: Huff, distH: Huff; |
| 210 | if (type === 1) { |
| 211 | const ll = new Array(288); |
| 212 | for (let i = 0; i < 144; i++) ll[i] = 8; |
| 213 | for (let i = 144; i < 256; i++) ll[i] = 9; |
| 214 | for (let i = 256; i < 280; i++) ll[i] = 7; |
| 215 | for (let i = 280; i < 288; i++) ll[i] = 8; |
| 216 | litH = buildHuff(ll, 288); |
| 217 | distH = buildHuff(new Array(30).fill(5), 30); |
| 218 | } else { |
| 219 | const hlit = br.bits(5) + 257; |
| 220 | const hdist = br.bits(5) + 1; |
| 221 | const hclen = br.bits(4) + 4; |
| 222 | const clen = new Array(19).fill(0); |
| 223 | for (let i = 0; i < hclen; i++) clen[CLEN_ORDER[i]] = br.bits(3); |
| 224 | const clH = buildHuff(clen, 19); |
| 225 | const lengths: number[] = []; |
| 226 | while (lengths.length < hlit + hdist) { |
| 227 | const sym = decodeSym(br, clH); |
| 228 | if (sym < 16) lengths.push(sym); |
| 229 | else if (sym === 16) { |
| 230 | const r = br.bits(2) + 3; |
| 231 | const prev = lengths[lengths.length - 1]; |
| 232 | for (let i = 0; i < r; i++) lengths.push(prev); |
| 233 | } else if (sym === 17) { |
| 234 | const r = br.bits(3) + 3; |
| 235 | for (let i = 0; i < r; i++) lengths.push(0); |
| 236 | } else { |
| 237 | const r = br.bits(7) + 11; |
| 238 | for (let i = 0; i < r; i++) lengths.push(0); |
| 239 | } |
| 240 | } |
| 241 | litH = buildHuff(lengths.slice(0, hlit), hlit); |
| 242 | distH = buildHuff(lengths.slice(hlit), hdist); |
| 243 | } |
no test coverage detected