123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.StreamingOctetReader = void 0;
- const fromCharCode = String.fromCharCode;
- class StreamingOctetReader {
- constructor() {
- this.chunks = [];
- this.chunkSize = 0;
- this.x = 0;
- }
- size() {
- return this.chunkSize - this.x;
- }
- push(chunk) {
- this.chunks.push(chunk);
- this.chunkSize += chunk.length;
- }
- assertSize(size) {
- if (size > this.size())
- throw new RangeError('OUT_OF_BOUNDS');
- }
- u8() {
- this.assertSize(1);
- const chunk = this.chunks[0];
- let x = this.x;
- const octet = chunk[x++];
- if (x === chunk.length) {
- this.chunks.shift();
- this.chunkSize -= chunk.length;
- x = 0;
- }
- this.x = x;
- return octet;
- }
- u32() {
- const octet0 = this.u8();
- const octet1 = this.u8();
- const octet2 = this.u8();
- const octet3 = this.u8();
- return (octet0 * 0x1000000 + (octet1 << 16) + (octet2 << 8)) | octet3;
- }
- copy(size, dst, pos) {
- if (!size)
- return;
- this.assertSize(size);
- const chunk0 = this.chunks[0];
- const size0 = Math.min(chunk0.length - this.x, size);
- dst.set(chunk0.subarray(this.x, this.x + size0), pos);
- size -= size0;
- if (size <= 0) {
- this.skipUnsafe(size0);
- return;
- }
- let chunkIndex = 1;
- while (size > 0) {
- const chunk1 = this.chunks[chunkIndex];
- const size1 = Math.min(chunk1.length, size);
- dst.set(chunk1.subarray(0, size1), pos + size0);
- size -= size1;
- chunkIndex++;
- }
- this.skipUnsafe(size);
- }
- copyXor(size, dst, pos, mask, maskIndex) {
- if (!size)
- return;
- this.assertSize(size);
- const chunk0 = this.chunks[0];
- let x = this.x;
- const size0 = Math.min(chunk0.length - x, size);
- const end = x + size0;
- for (; x < end;)
- dst[pos++] = chunk0[x++] ^ mask[maskIndex++ % 4];
- size -= size0;
- if (size <= 0) {
- this.skipUnsafe(size0);
- return;
- }
- let chunkIndex = 1;
- while (size > 0) {
- const chunk1 = this.chunks[chunkIndex++];
- const size1 = Math.min(chunk1.length, size);
- for (let x = 0; x < size1;)
- dst[pos++] = chunk1[x++] ^ mask[maskIndex++ % 4];
- size -= size1;
- }
- this.skipUnsafe(size);
- }
- buf(size) {
- this.assertSize(size);
- const buf = new Uint8Array(size);
- this.copy(size, buf, 0);
- return buf;
- }
- bufXor(size, mask, maskIndex) {
- this.assertSize(size);
- const buf = new Uint8Array(size);
- this.copyXor(size, buf, 0, mask, maskIndex);
- return buf;
- }
- skipUnsafe(n) {
- if (!n)
- return;
- const chunk = this.chunks[0];
- const chunkLength = chunk.length;
- const remaining = chunkLength - this.x;
- if (remaining > n) {
- this.x = this.x + n;
- return;
- }
- this.x = 0;
- this.chunks.shift();
- this.chunkSize -= chunkLength;
- n -= remaining;
- this.skipUnsafe(n);
- }
- skip(n) {
- this.assertSize(n);
- this.skipUnsafe(n);
- }
- peak() {
- this.assertSize(1);
- return this.chunks[0][this.x];
- }
- utf8(length, mask, maskIndex) {
- this.assertSize(length);
- let i = 0;
- const points = [];
- while (i < length) {
- let code = this.u8() ^ mask[maskIndex++ % 4];
- i++;
- if ((code & 0x80) !== 0) {
- const octet2 = (this.u8() ^ mask[maskIndex++ % 4]) & 0x3f;
- i++;
- if ((code & 0xe0) === 0xc0) {
- code = ((code & 0x1f) << 6) | octet2;
- }
- else {
- const octet3 = (this.u8() ^ mask[maskIndex++ % 4]) & 0x3f;
- i++;
- if ((code & 0xf0) === 0xe0) {
- code = ((code & 0x1f) << 12) | (octet2 << 6) | octet3;
- }
- else {
- if ((code & 0xf8) === 0xf0) {
- const octet4 = (this.u8() ^ mask[maskIndex++ % 4]) & 0x3f;
- i++;
- let unit = ((code & 0x07) << 0x12) | (octet2 << 0x0c) | (octet3 << 0x06) | octet4;
- if (unit > 0xffff) {
- unit -= 0x10000;
- const unit0 = ((unit >>> 10) & 0x3ff) | 0xd800;
- code = 0xdc00 | (unit & 0x3ff);
- points.push(unit0);
- }
- else {
- code = unit;
- }
- }
- }
- }
- }
- points.push(code);
- }
- return fromCharCode.apply(String, points);
- }
- }
- exports.StreamingOctetReader = StreamingOctetReader;
- //# sourceMappingURL=StreamingOctetReader.js.map
|