createFromBase64.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.createFromBase64 = void 0;
  4. const constants_1 = require("./constants");
  5. const E = '=';
  6. const createFromBase64 = (chars = constants_1.alphabet, noPadding = false) => {
  7. if (chars.length !== 64)
  8. throw new Error('chars must be 64 characters long');
  9. let max = 0;
  10. for (let i = 0; i < chars.length; i++)
  11. max = Math.max(max, chars.charCodeAt(i));
  12. const table = [];
  13. for (let i = 0; i <= max; i += 1)
  14. table[i] = -1;
  15. for (let i = 0; i < chars.length; i++)
  16. table[chars.charCodeAt(i)] = i;
  17. return (encoded) => {
  18. if (!encoded)
  19. return new Uint8Array(0);
  20. let length = encoded.length;
  21. if (noPadding) {
  22. const mod = length % 4;
  23. if (mod === 2) {
  24. encoded += '==';
  25. length += 2;
  26. }
  27. else if (mod === 3) {
  28. encoded += '=';
  29. length += 1;
  30. }
  31. }
  32. if (length % 4 !== 0)
  33. throw new Error('Base64 string length must be a multiple of 4');
  34. const mainLength = encoded[length - 1] !== E ? length : length - 4;
  35. let bufferLength = (length >> 2) * 3;
  36. let padding = 0;
  37. if (encoded[length - 2] === E) {
  38. padding = 2;
  39. bufferLength -= 2;
  40. }
  41. else if (encoded[length - 1] === E) {
  42. padding = 1;
  43. bufferLength -= 1;
  44. }
  45. const buf = new Uint8Array(bufferLength);
  46. let j = 0;
  47. let i = 0;
  48. for (; i < mainLength; i += 4) {
  49. const sextet0 = table[encoded.charCodeAt(i)];
  50. const sextet1 = table[encoded.charCodeAt(i + 1)];
  51. const sextet2 = table[encoded.charCodeAt(i + 2)];
  52. const sextet3 = table[encoded.charCodeAt(i + 3)];
  53. if (sextet0 < 0 || sextet1 < 0 || sextet2 < 0 || sextet3 < 0)
  54. throw new Error('INVALID_BASE64_STRING');
  55. buf[j] = (sextet0 << 2) | (sextet1 >> 4);
  56. buf[j + 1] = (sextet1 << 4) | (sextet2 >> 2);
  57. buf[j + 2] = (sextet2 << 6) | sextet3;
  58. j += 3;
  59. }
  60. if (padding === 2) {
  61. const sextet0 = table[encoded.charCodeAt(mainLength)];
  62. const sextet1 = table[encoded.charCodeAt(mainLength + 1)];
  63. if (sextet0 < 0 || sextet1 < 0)
  64. throw new Error('INVALID_BASE64_STRING');
  65. buf[j] = (sextet0 << 2) | (sextet1 >> 4);
  66. }
  67. else if (padding === 1) {
  68. const sextet0 = table[encoded.charCodeAt(mainLength)];
  69. const sextet1 = table[encoded.charCodeAt(mainLength + 1)];
  70. const sextet2 = table[encoded.charCodeAt(mainLength + 2)];
  71. if (sextet0 < 0 || sextet1 < 0 || sextet2 < 0)
  72. throw new Error('INVALID_BASE64_STRING');
  73. buf[j] = (sextet0 << 2) | (sextet1 >> 4);
  74. buf[j + 1] = (sextet1 << 4) | (sextet2 >> 2);
  75. }
  76. return buf;
  77. };
  78. };
  79. exports.createFromBase64 = createFromBase64;
  80. //# sourceMappingURL=createFromBase64.js.map