123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.createFromBase64Bin = void 0;
- const constants_1 = require("./constants");
- const createFromBase64Bin = (chars = constants_1.alphabet, pad = '=') => {
- if (chars.length !== 64)
- throw new Error('chars must be 64 characters long');
- let max = 0;
- for (let i = 0; i < chars.length; i++)
- max = Math.max(max, chars.charCodeAt(i));
- const table = [];
- for (let i = 0; i <= max; i += 1)
- table[i] = -1;
- for (let i = 0; i < chars.length; i++)
- table[chars.charCodeAt(i)] = i;
- const doExpectPadding = pad.length === 1;
- const PAD = doExpectPadding ? pad.charCodeAt(0) : 0;
- return (view, offset, length) => {
- if (!length)
- return new Uint8Array(0);
- let padding = 0;
- if (length % 4 !== 0) {
- padding = 4 - (length % 4);
- length += padding;
- }
- else {
- const end = offset + length;
- const last = end - 1;
- if (view.getUint8(last) === PAD) {
- padding = 1;
- if (length > 1 && view.getUint8(last - 1) === PAD)
- padding = 2;
- }
- }
- if (length % 4 !== 0)
- throw new Error('Base64 string length must be a multiple of 4');
- const mainEnd = offset + length - (padding ? 4 : 0);
- const bufferLength = (length >> 2) * 3 - padding;
- const buf = new Uint8Array(bufferLength);
- let j = 0;
- let i = offset;
- for (; i < mainEnd; i += 4) {
- const word = view.getUint32(i);
- const octet0 = word >>> 24;
- const octet1 = (word >>> 16) & 0xff;
- const octet2 = (word >>> 8) & 0xff;
- const octet3 = word & 0xff;
- const sextet0 = table[octet0];
- const sextet1 = table[octet1];
- const sextet2 = table[octet2];
- const sextet3 = table[octet3];
- if (sextet0 < 0 || sextet1 < 0 || sextet2 < 0 || sextet3 < 0)
- throw new Error('INVALID_BASE64_SEQ');
- buf[j] = (sextet0 << 2) | (sextet1 >> 4);
- buf[j + 1] = (sextet1 << 4) | (sextet2 >> 2);
- buf[j + 2] = (sextet2 << 6) | sextet3;
- j += 3;
- }
- if (!padding)
- return buf;
- if (padding === 1) {
- const word = view.getUint16(mainEnd);
- const octet0 = word >> 8;
- const octet1 = word & 0xff;
- const octet2 = view.getUint8(mainEnd + 2);
- const sextet0 = table[octet0];
- const sextet1 = table[octet1];
- const sextet2 = table[octet2];
- if (sextet0 < 0 || sextet1 < 0 || sextet2 < 0)
- throw new Error('INVALID_BASE64_SEQ');
- buf[j] = (sextet0 << 2) | (sextet1 >> 4);
- buf[j + 1] = (sextet1 << 4) | (sextet2 >> 2);
- return buf;
- }
- const word = view.getUint16(mainEnd);
- const octet0 = word >> 8;
- const octet1 = word & 0xff;
- const sextet0 = table[octet0];
- const sextet1 = table[octet1];
- if (sextet0 < 0 || sextet1 < 0)
- throw new Error('INVALID_BASE64_SEQ');
- buf[j] = (sextet0 << 2) | (sextet1 >> 4);
- return buf;
- };
- };
- exports.createFromBase64Bin = createFromBase64Bin;
- //# sourceMappingURL=createFromBase64Bin.js.map
|