246 lines
7.5 KiB
JavaScript
246 lines
7.5 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||
|
|
|
||
|
|
const useBuffer = globalThis.process && !globalThis.process.browser && globalThis.Buffer && typeof globalThis.Buffer.isBuffer === 'function';
|
||
|
|
const textDecoder = new TextDecoder();
|
||
|
|
const textEncoder = new TextEncoder();
|
||
|
|
function isBuffer(buf) {
|
||
|
|
return useBuffer && globalThis.Buffer.isBuffer(buf);
|
||
|
|
}
|
||
|
|
function asU8A(buf) {
|
||
|
|
if (!(buf instanceof Uint8Array)) {
|
||
|
|
return Uint8Array.from(buf);
|
||
|
|
}
|
||
|
|
return isBuffer(buf) ? new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength) : buf;
|
||
|
|
}
|
||
|
|
const toString = useBuffer ? (bytes, start, end) => {
|
||
|
|
return end - start > 64 ? globalThis.Buffer.from(bytes.subarray(start, end)).toString('utf8') : utf8Slice(bytes, start, end);
|
||
|
|
} : (bytes, start, end) => {
|
||
|
|
return end - start > 64 ? textDecoder.decode(bytes.subarray(start, end)) : utf8Slice(bytes, start, end);
|
||
|
|
};
|
||
|
|
const fromString = useBuffer ? string => {
|
||
|
|
return string.length > 64 ? globalThis.Buffer.from(string) : utf8ToBytes(string);
|
||
|
|
} : string => {
|
||
|
|
return string.length > 64 ? textEncoder.encode(string) : utf8ToBytes(string);
|
||
|
|
};
|
||
|
|
const fromArray = arr => {
|
||
|
|
return Uint8Array.from(arr);
|
||
|
|
};
|
||
|
|
const slice = useBuffer ? (bytes, start, end) => {
|
||
|
|
if (isBuffer(bytes)) {
|
||
|
|
return new Uint8Array(bytes.subarray(start, end));
|
||
|
|
}
|
||
|
|
return bytes.slice(start, end);
|
||
|
|
} : (bytes, start, end) => {
|
||
|
|
return bytes.slice(start, end);
|
||
|
|
};
|
||
|
|
const concat = useBuffer ? (chunks, length) => {
|
||
|
|
chunks = chunks.map(c => c instanceof Uint8Array ? c : globalThis.Buffer.from(c));
|
||
|
|
return asU8A(globalThis.Buffer.concat(chunks, length));
|
||
|
|
} : (chunks, length) => {
|
||
|
|
const out = new Uint8Array(length);
|
||
|
|
let off = 0;
|
||
|
|
for (let b of chunks) {
|
||
|
|
if (off + b.length > out.length) {
|
||
|
|
b = b.subarray(0, out.length - off);
|
||
|
|
}
|
||
|
|
out.set(b, off);
|
||
|
|
off += b.length;
|
||
|
|
}
|
||
|
|
return out;
|
||
|
|
};
|
||
|
|
const alloc = useBuffer ? size => {
|
||
|
|
return globalThis.Buffer.allocUnsafe(size);
|
||
|
|
} : size => {
|
||
|
|
return new Uint8Array(size);
|
||
|
|
};
|
||
|
|
const toHex = useBuffer ? d => {
|
||
|
|
if (typeof d === 'string') {
|
||
|
|
return d;
|
||
|
|
}
|
||
|
|
return globalThis.Buffer.from(toBytes(d)).toString('hex');
|
||
|
|
} : d => {
|
||
|
|
if (typeof d === 'string') {
|
||
|
|
return d;
|
||
|
|
}
|
||
|
|
return Array.prototype.reduce.call(toBytes(d), (p, c) => `${ p }${ c.toString(16).padStart(2, '0') }`, '');
|
||
|
|
};
|
||
|
|
const fromHex = useBuffer ? hex => {
|
||
|
|
if (hex instanceof Uint8Array) {
|
||
|
|
return hex;
|
||
|
|
}
|
||
|
|
return globalThis.Buffer.from(hex, 'hex');
|
||
|
|
} : hex => {
|
||
|
|
if (hex instanceof Uint8Array) {
|
||
|
|
return hex;
|
||
|
|
}
|
||
|
|
if (!hex.length) {
|
||
|
|
return new Uint8Array(0);
|
||
|
|
}
|
||
|
|
return new Uint8Array(hex.split('').map((c, i, d) => i % 2 === 0 ? `0x${ c }${ d[i + 1] }` : '').filter(Boolean).map(e => parseInt(e, 16)));
|
||
|
|
};
|
||
|
|
function toBytes(obj) {
|
||
|
|
if (obj instanceof Uint8Array && obj.constructor.name === 'Uint8Array') {
|
||
|
|
return obj;
|
||
|
|
}
|
||
|
|
if (obj instanceof ArrayBuffer) {
|
||
|
|
return new Uint8Array(obj);
|
||
|
|
}
|
||
|
|
if (ArrayBuffer.isView(obj)) {
|
||
|
|
return new Uint8Array(obj.buffer, obj.byteOffset, obj.byteLength);
|
||
|
|
}
|
||
|
|
throw new Error('Unknown type, must be binary type');
|
||
|
|
}
|
||
|
|
function compare(b1, b2) {
|
||
|
|
if (isBuffer(b1) && isBuffer(b2)) {
|
||
|
|
return b1.compare(b2);
|
||
|
|
}
|
||
|
|
for (let i = 0; i < b1.length; i++) {
|
||
|
|
if (b1[i] === b2[i]) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
return b1[i] < b2[i] ? -1 : 1;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
function utf8ToBytes(string, units = Infinity) {
|
||
|
|
let codePoint;
|
||
|
|
const length = string.length;
|
||
|
|
let leadSurrogate = null;
|
||
|
|
const bytes = [];
|
||
|
|
for (let i = 0; i < length; ++i) {
|
||
|
|
codePoint = string.charCodeAt(i);
|
||
|
|
if (codePoint > 55295 && codePoint < 57344) {
|
||
|
|
if (!leadSurrogate) {
|
||
|
|
if (codePoint > 56319) {
|
||
|
|
if ((units -= 3) > -1)
|
||
|
|
bytes.push(239, 191, 189);
|
||
|
|
continue;
|
||
|
|
} else if (i + 1 === length) {
|
||
|
|
if ((units -= 3) > -1)
|
||
|
|
bytes.push(239, 191, 189);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
leadSurrogate = codePoint;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
if (codePoint < 56320) {
|
||
|
|
if ((units -= 3) > -1)
|
||
|
|
bytes.push(239, 191, 189);
|
||
|
|
leadSurrogate = codePoint;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
codePoint = (leadSurrogate - 55296 << 10 | codePoint - 56320) + 65536;
|
||
|
|
} else if (leadSurrogate) {
|
||
|
|
if ((units -= 3) > -1)
|
||
|
|
bytes.push(239, 191, 189);
|
||
|
|
}
|
||
|
|
leadSurrogate = null;
|
||
|
|
if (codePoint < 128) {
|
||
|
|
if ((units -= 1) < 0)
|
||
|
|
break;
|
||
|
|
bytes.push(codePoint);
|
||
|
|
} else if (codePoint < 2048) {
|
||
|
|
if ((units -= 2) < 0)
|
||
|
|
break;
|
||
|
|
bytes.push(codePoint >> 6 | 192, codePoint & 63 | 128);
|
||
|
|
} else if (codePoint < 65536) {
|
||
|
|
if ((units -= 3) < 0)
|
||
|
|
break;
|
||
|
|
bytes.push(codePoint >> 12 | 224, codePoint >> 6 & 63 | 128, codePoint & 63 | 128);
|
||
|
|
} else if (codePoint < 1114112) {
|
||
|
|
if ((units -= 4) < 0)
|
||
|
|
break;
|
||
|
|
bytes.push(codePoint >> 18 | 240, codePoint >> 12 & 63 | 128, codePoint >> 6 & 63 | 128, codePoint & 63 | 128);
|
||
|
|
} else {
|
||
|
|
throw new Error('Invalid code point');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return bytes;
|
||
|
|
}
|
||
|
|
function utf8Slice(buf, offset, end) {
|
||
|
|
const res = [];
|
||
|
|
while (offset < end) {
|
||
|
|
const firstByte = buf[offset];
|
||
|
|
let codePoint = null;
|
||
|
|
let bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1;
|
||
|
|
if (offset + bytesPerSequence <= end) {
|
||
|
|
let secondByte, thirdByte, fourthByte, tempCodePoint;
|
||
|
|
switch (bytesPerSequence) {
|
||
|
|
case 1:
|
||
|
|
if (firstByte < 128) {
|
||
|
|
codePoint = firstByte;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
secondByte = buf[offset + 1];
|
||
|
|
if ((secondByte & 192) === 128) {
|
||
|
|
tempCodePoint = (firstByte & 31) << 6 | secondByte & 63;
|
||
|
|
if (tempCodePoint > 127) {
|
||
|
|
codePoint = tempCodePoint;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
secondByte = buf[offset + 1];
|
||
|
|
thirdByte = buf[offset + 2];
|
||
|
|
if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) {
|
||
|
|
tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63;
|
||
|
|
if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) {
|
||
|
|
codePoint = tempCodePoint;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
secondByte = buf[offset + 1];
|
||
|
|
thirdByte = buf[offset + 2];
|
||
|
|
fourthByte = buf[offset + 3];
|
||
|
|
if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) {
|
||
|
|
tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63;
|
||
|
|
if (tempCodePoint > 65535 && tempCodePoint < 1114112) {
|
||
|
|
codePoint = tempCodePoint;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (codePoint === null) {
|
||
|
|
codePoint = 65533;
|
||
|
|
bytesPerSequence = 1;
|
||
|
|
} else if (codePoint > 65535) {
|
||
|
|
codePoint -= 65536;
|
||
|
|
res.push(codePoint >>> 10 & 1023 | 55296);
|
||
|
|
codePoint = 56320 | codePoint & 1023;
|
||
|
|
}
|
||
|
|
res.push(codePoint);
|
||
|
|
offset += bytesPerSequence;
|
||
|
|
}
|
||
|
|
return decodeCodePointsArray(res);
|
||
|
|
}
|
||
|
|
const MAX_ARGUMENTS_LENGTH = 4096;
|
||
|
|
function decodeCodePointsArray(codePoints) {
|
||
|
|
const len = codePoints.length;
|
||
|
|
if (len <= MAX_ARGUMENTS_LENGTH) {
|
||
|
|
return String.fromCharCode.apply(String, codePoints);
|
||
|
|
}
|
||
|
|
let res = '';
|
||
|
|
let i = 0;
|
||
|
|
while (i < len) {
|
||
|
|
res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));
|
||
|
|
}
|
||
|
|
return res;
|
||
|
|
}
|
||
|
|
|
||
|
|
exports.alloc = alloc;
|
||
|
|
exports.asU8A = asU8A;
|
||
|
|
exports.compare = compare;
|
||
|
|
exports.concat = concat;
|
||
|
|
exports.decodeCodePointsArray = decodeCodePointsArray;
|
||
|
|
exports.fromArray = fromArray;
|
||
|
|
exports.fromHex = fromHex;
|
||
|
|
exports.fromString = fromString;
|
||
|
|
exports.slice = slice;
|
||
|
|
exports.toHex = toHex;
|
||
|
|
exports.toString = toString;
|
||
|
|
exports.useBuffer = useBuffer;
|