# Code coverage report for lib\sync-reader.js

## Statements: 94.44% (17 / 18) Branches: 81.82% (9 / 11) Functions: 100% (3 / 3) Lines: 94.44% (17 / 18) Ignored: none

All files » lib/ » sync-reader.js

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71

    1

    350
    350

    1

    9310

    1

    350

    9297

    9297

    9297

    9297

    9297

    9297

    350
    13

    337
    13

     // Copyright (c) 2012 Kuba Niegowski
    //
    // Permission is hereby granted, free of charge, to any person obtaining a copy
    // of this software and associated documentation files (the "Software"), to deal
    // in the Software without restriction, including without limitation the rights
    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    // copies of the Software, and to permit persons to whom the Software is
    // furnished to do so, subject to the following conditions:
    //
    // The above copyright notice and this permission notice shall be included in
    // all copies or substantial portions of the Software.
    //
    // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    // THE SOFTWARE.

    'use strict';

    var SyncReader = module.exports = function (buffer) {

      this._buffer = buffer;
      this._reads = [];
    };

    SyncReader.prototype.read = function (length, callback) {

      this._reads.push({
        length: Math.abs(length),  // if length < 0 then at most this length
        allowLess: length < 0,
        func: callback
      });
    };

    SyncReader.prototype.process = function () {

      // as long as there is any data and read requests
      while (this._reads.length > 0 && this._buffer.length) {

        var read = this._reads[0];

        Eif (this._buffer.length && (this._buffer.length >= read.length || read.allowLess)) {

          // ok there is any data so that we can satisfy this request
          this._reads.shift(); // == read

          var buf = this._buffer;

          this._buffer = buf.slice(read.length);

          read.func.call(this, buf.slice(0, read.length));

        } else {
            break;
        }

      }

      if (this._reads.length > 0) {
          return new Error('There are some read requests waitng on finished stream');
      }

      if (this._buffer.length > 0) {
        return new Error('unrecognised content at end of stream');
      }

    };