All files / base64/src createToBase64BinUint8.ts

97.91% Statements 47/48
60% Branches 6/10
100% Functions 3/3
100% Lines 44/44

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 571x   1x 1x   64x 1x   1x 64x 4096x 4096x       1x   1x 100x 100x 100x 1643x 1643x 1643x 1643x 1643x 1643x 1643x 1643x 1643x 1643x 1643x   100x 35x 35x 35x 35x 35x 35x 35x   65x 32x 32x 32x 32x 32x 32x 32x 32x 32x   100x      
import {alphabet} from './constants';
 
export const createToBase64BinUint8 = (chars: string = alphabet, pad: string = '=') => {
  Iif (chars.length !== 64) throw new Error('chars must be 64 characters long');
 
  const table = chars.split('').map((c) => c.charCodeAt(0));
  const table2: number[] = [];
 
  for (const c1 of table) {
    for (const c2 of table) {
      const two = (c1 << 8) + c2;
      table2.push(two);
    }
  }
 
  const PAD: number = pad.length === 1 ? pad.charCodeAt(0) : 0;
 
  return (uint8: Uint8Array, start: number, length: number, dest: Uint8Array, offset: number): number => {
    const extraLength = length % 3;
    const baseLength = length - extraLength;
    for (; start < baseLength; start += 3) {
      const o1 = uint8[start];
      const o2 = uint8[start + 1];
      const o3 = uint8[start + 2];
      const v1 = (o1 << 4) | (o2 >> 4);
      const v2 = ((o2 & 0b1111) << 8) | o3;
      let u16 = table2[v1];
      dest[offset++] = u16 >> 8;
      dest[offset++] = u16;
      u16 = table2[v2];
      dest[offset++] = u16 >> 8;
      dest[offset++] = u16;
    }
    if (extraLength === 1) {
      const o1 = uint8[baseLength];
      const u16 = table2[o1 << 4];
      dest[offset++] = u16 >> 8;
      dest[offset++] = u16;
      if (PAD) {
        dest[offset++] = PAD;
        dest[offset++] = PAD;
      }
    } else if (extraLength) {
      const o1 = uint8[baseLength];
      const o2 = uint8[baseLength + 1];
      const v1 = (o1 << 4) | (o2 >> 4);
      const v2 = (o2 & 0b1111) << 2;
      const u16 = table2[v1];
      dest[offset++] = u16 >> 8;
      dest[offset++] = u16;
      dest[offset++] = table[v2];
      if (PAD) dest[offset++] = PAD;
    }
    return offset;
  };
};