binaryPackChunker.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. export class BinaryPackChunker {
  2. readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is "cut off" after 16384 bytes and delivered individually.
  3. // Binary stuff
  4. private _dataCount: number = 1;
  5. chunk = (
  6. blob: ArrayBuffer,
  7. ): { __peerData: number; n: number; total: number; data: Uint8Array }[] => {
  8. const chunks = [];
  9. const size = blob.byteLength;
  10. const total = Math.ceil(size / this.chunkedMTU);
  11. let index = 0;
  12. let start = 0;
  13. while (start < size) {
  14. const end = Math.min(size, start + this.chunkedMTU);
  15. const b = blob.slice(start, end);
  16. const chunk = {
  17. __peerData: this._dataCount,
  18. n: index,
  19. data: b,
  20. total,
  21. };
  22. chunks.push(chunk);
  23. start = end;
  24. index++;
  25. }
  26. this._dataCount++;
  27. return chunks;
  28. };
  29. }
  30. export function concatArrayBuffers(bufs: Uint8Array[]) {
  31. let size = 0;
  32. for (const buf of bufs) {
  33. size += buf.byteLength;
  34. }
  35. const result = new Uint8Array(size);
  36. let offset = 0;
  37. for (const buf of bufs) {
  38. result.set(buf, offset);
  39. offset += buf.byteLength;
  40. }
  41. return result;
  42. }