encodingQueue.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { EventEmitter } from "eventemitter3";
  2. import logger from "./logger";
  3. export class EncodingQueue extends EventEmitter {
  4. readonly fileReader: FileReader = new FileReader();
  5. private _queue: Blob[] = [];
  6. private _processing: boolean = false;
  7. constructor() {
  8. super();
  9. this.fileReader.onload = (evt) => {
  10. this._processing = false;
  11. if (evt.target) {
  12. this.emit("done", evt.target.result as ArrayBuffer);
  13. }
  14. this.doNextTask();
  15. };
  16. this.fileReader.onerror = (evt) => {
  17. logger.error(`EncodingQueue error:`, evt);
  18. this._processing = false;
  19. this.destroy();
  20. this.emit("error", evt);
  21. };
  22. }
  23. get queue(): Blob[] {
  24. return this._queue;
  25. }
  26. get size(): number {
  27. return this.queue.length;
  28. }
  29. get processing(): boolean {
  30. return this._processing;
  31. }
  32. enque(blob: Blob): void {
  33. this.queue.push(blob);
  34. if (this.processing) return;
  35. this.doNextTask();
  36. }
  37. destroy(): void {
  38. this.fileReader.abort();
  39. this._queue = [];
  40. }
  41. private doNextTask(): void {
  42. if (this.size === 0) return;
  43. if (this.processing) return;
  44. this._processing = true;
  45. this.fileReader.readAsArrayBuffer(this.queue.shift());
  46. }
  47. }