createFromBase64Bin.js 3.3 KB

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