# Source: decrypter/async-stream.js

    /**
     * @file decrypter/async-stream.js
     */
    import Stream from '../stream';

    /**
     * A wrapper around the Stream class to use setTiemout
     * and run stream "jobs" Asynchronously
     *
     * @class AsyncStream
     * @extends Stream
     */
    export default class AsyncStream extends Stream {
      constructor() {
        super(Stream);
        this.jobs = [];
        this.delay = 1;
        this.timeout_ = null;
      }

      /**
       * process an async job
       *
       * @private
       */
      processJob_() {
        this.jobs.shift()();
        if (this.jobs.length) {
          this.timeout_ = setTimeout(this.processJob_.bind(this),
                                     this.delay);
        } else {
          this.timeout_ = null;
        }
      }

      /**
       * push a job into the stream
       *
       * @param {Function} job the job to push into the stream
       */
      push(job) {
        this.jobs.push(job);
        if (!this.timeout_) {
          this.timeout_ = setTimeout(this.processJob_.bind(this),
                                     this.delay);
        }
      }
    }