@leichtgewicht/base64-codec
Version:
base64 to/from bytes codec (esm/cjs)
153 lines (121 loc) • 4.95 kB
JavaScript
// GENERATED FILE. DO NOT EDIT.
var base64Codec = (function(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.base64URL = exports.base64 = exports.PREFERS_PADDING = exports.PREFERS_NO_PADDING = void 0;
exports.make = make;
const PREFERS_PADDING = 1;
exports.PREFERS_PADDING = PREFERS_PADDING;
const PREFERS_NO_PADDING = 2;
exports.PREFERS_NO_PADDING = PREFERS_NO_PADDING;
function make(name, charset, padding, paddingMode) {
if (charset.length !== 64) {
throw new Error(`Charset needs to be 64 characters long! (${charset.length})`);
}
const byCharCode = new Uint8Array(256);
const byNum = new Uint8Array(64);
for (let i = 0; i < 64; i += 1) {
const code = charset.charCodeAt(i);
if (code > 255) {
throw new Error(`Character #${i} in charset [code=${code}, char=${charset.charAt(i)}] is too high! (max=255)`);
}
if (byCharCode[code] !== 0) {
throw new Error(`Character [code=${code}, char=${charset.charAt(i)}] is more than once in the charset!`);
}
byCharCode[code] = i;
byNum[i] = code;
}
const padCode = padding.charCodeAt(0);
const codec = {
name,
encodingLength(str) {
const strLen = str.length;
const len = strLen * 0.75 | 0;
if (str.charCodeAt(strLen - 1) === padCode) {
if (str.charCodeAt(strLen - 2) === padCode) {
return len - 2;
}
return len - 1;
}
return len;
},
encode(str, buffer, offset) {
if (buffer === null || buffer === undefined) {
buffer = new Uint8Array(codec.encodingLength(str));
}
if (offset === null || offset === undefined) {
offset = 0;
}
let strLen = str.length;
if (str.charCodeAt(strLen - 1) === padCode) {
if (str.charCodeAt(strLen - 2) === padCode) {
strLen -= 2;
} else {
strLen -= 1;
}
}
const padding = strLen % 4;
const safeLen = strLen - padding;
let off = offset;
let i = 0;
while (i < safeLen) {
const code = byCharCode[str.charCodeAt(i)] << 18 | byCharCode[str.charCodeAt(i + 1)] << 12 | byCharCode[str.charCodeAt(i + 2)] << 6 | byCharCode[str.charCodeAt(i + 3)];
buffer[off++] = code >> 16;
buffer[off++] = code >> 8;
buffer[off++] = code;
i += 4;
}
if (padding === 3) {
const code = byCharCode[str.charCodeAt(i)] << 10 | byCharCode[str.charCodeAt(i + 1)] << 4 | byCharCode[str.charCodeAt(i + 2)] >> 2;
buffer[off++] = code >> 8;
buffer[off++] = code;
} else if (padding === 2) {
buffer[off++] = byCharCode[str.charCodeAt(i)] << 2 | byCharCode[str.charCodeAt(i + 1)] >> 4;
}
codec.encode.bytes = off - offset;
return buffer;
},
decode(buffer, start, end) {
if (start === null || start === undefined) {
start = 0;
}
if (end === null || end === undefined) {
end = buffer.length;
}
const length = end - start;
const pad = length % 3;
const safeEnd = start + length - pad;
const codes = [];
for (let off = start; off < safeEnd; off += 3) {
const num = buffer[off] << 16 | buffer[off + 1] << 8 | buffer[off + 2];
codes.push(byNum[num >> 18 & 0x3F], byNum[num >> 12 & 0x3F], byNum[num >> 6 & 0x3F], byNum[num & 0x3F]);
}
if (pad === 2) {
const num = (buffer[end - 2] << 8) + buffer[end - 1];
codes.push(byNum[num >> 10], byNum[num >> 4 & 0x3F], byNum[num << 2 & 0x3F]);
if (paddingMode === PREFERS_PADDING) {
codes.push(padCode);
}
} else if (pad === 1) {
const num = buffer[end - 1];
codes.push(byNum[num >> 2], byNum[num << 4 & 0x3F]);
if (paddingMode === PREFERS_PADDING) {
codes.push(padCode, padCode);
}
}
codec.decode.bytes = length;
return String.fromCharCode.apply(String, codes);
}
};
return codec;
}
const base64 = make('base64', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', '=', PREFERS_PADDING); // https://datatracker.ietf.org/doc/html/rfc4648#section-5
exports.base64 = base64;
const base64URL = make('base64-url', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', '=', PREFERS_NO_PADDING);
exports.base64URL = base64URL;
return "default" in exports ? exports.default : exports;
})({});
if (typeof define === 'function' && define.amd) define([], function() { return base64Codec; });
else if (typeof module === 'object' && typeof exports==='object') module.exports = base64Codec;