12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import { EventEmitter } from "eventemitter3";
- import logger from "./logger";
- export class EncodingQueue extends EventEmitter {
- readonly fileReader: FileReader = new FileReader();
- private _queue: Blob[] = [];
- private _processing: boolean = false;
- constructor() {
- super();
- this.fileReader.onload = (evt) => {
- this._processing = false;
- if (evt.target) {
- this.emit("done", evt.target.result as ArrayBuffer);
- }
- this.doNextTask();
- };
- this.fileReader.onerror = (evt) => {
- logger.error(`EncodingQueue error:`, evt);
- this._processing = false;
- this.destroy();
- this.emit("error", evt);
- };
- }
- get queue(): Blob[] {
- return this._queue;
- }
- get size(): number {
- return this.queue.length;
- }
- get processing(): boolean {
- return this._processing;
- }
- enque(blob: Blob): void {
- this.queue.push(blob);
- if (this.processing) return;
- this.doNextTask();
- }
- destroy(): void {
- this.fileReader.abort();
- this._queue = [];
- }
- private doNextTask(): void {
- if (this.size === 0) return;
- if (this.processing) return;
- this._processing = true;
- this.fileReader.readAsArrayBuffer(this.queue.shift());
- }
- }
|