Home Reference Source

src/utils/chunker.ts

import { appendUint8Array } from './mp4-tools';
import { sliceUint8 } from './typed-array';

export default class Chunker {
  private chunkSize: number;
  public cache: Uint8Array | null = null;
  constructor(chunkSize = Math.pow(2, 19)) {
    this.chunkSize = chunkSize;
  }

  public push(data: Uint8Array): Array<Uint8Array> {
    const { cache, chunkSize } = this;
    const result: Array<Uint8Array> = [];

    let temp: Uint8Array | null = null;
    if (cache?.length) {
      temp = appendUint8Array(cache, data);
      this.cache = null;
    } else {
      temp = data;
    }

    if (temp.length < chunkSize) {
      this.cache = temp;
      return result;
    }

    if (temp.length > chunkSize) {
      let offset = 0;
      const len = temp.length;
      while (offset < len - chunkSize) {
        result.push(sliceUint8(temp, offset, offset + chunkSize));
        offset += chunkSize;
      }
      this.cache = sliceUint8(temp, offset);
    } else {
      result.push(temp);
    }

    return result;
  }
}