# All files packer-async.js

100% Statements 24/24
75% Branches 3/4
100% Functions 4/4
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51

    1x
    1x
    1x
    1x

    1x
    353x

    353x

    353x
    353x

    353x

    1x

    1x

    325x
    325x

    325x
    290x

    325x

    325x

    325x

    652x

    325x

    325x
    325x

    325x

     "use strict";

    let util = require("util");
    let Stream = require("stream");
    let constants = require("./constants");
    let Packer = require("./packer");

    let PackerAsync = (module.exports = function (opt) {
      Stream.call(this);

      let options = opt || {};

      this._packer = new Packer(options);
      this._deflate = this._packer.createDeflate();

      this.readable = true;
    });
    util.inherits(PackerAsync, Stream);

    PackerAsync.prototype.pack = function (data, width, height, gamma) {
      // Signature
      this.emit("data", Buffer.from(constants.PNG_SIGNATURE));
      this.emit("data", this._packer.packIHDR(width, height));

      if (gamma) {
        this.emit("data", this._packer.packGAMA(gamma));
      }

      let filteredData = this._packer.filterData(data, width, height);

      // compress it
      this._deflate.on("error", this.emit.bind(this, "error"));

      this._deflate.on(
        "data",
        function (compressedData) {
          this.emit("data", this._packer.packIDAT(compressedData));
        }.bind(this)
      );

      this._deflate.on(
        "end",
        function () {
          this.emit("data", this._packer.packIEND());
          this.emit("end");
        }.bind(this)
      );

      this._deflate.end(filteredData);
    };