Code coverage report for web3/lib/web3/syncing.js

Statements: 94.12% (32 / 34)      Branches: 64.29% (9 / 14)      Functions: 87.5% (7 / 8)      Lines: 94.12% (32 / 34)      Ignored: none     

All files » web3/lib/web3/ » syncing.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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94                                            1 1   1               1   1 1           1 1   1 1     1 1     1 1     1         1             1 1 1 1 1 1 1   1     1 1 1 1     1 1 1     1    
/*
    This file is part of web3.js.
 
    web3.js is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    web3.js is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public License
    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
*/
/** @file syncing.js
 * @authors:
 *   Fabian Vogelsteller <fabian@ethdev.com>
 * @date 2015
 */
 
var formatters = require('./formatters');
var utils = require('../utils/utils');
 
var count = 1;
 
/**
Adds the callback and sets up the methods, to iterate over the results.
 
@method pollSyncing
@param {Object} self
*/
var pollSyncing = function(self) {
 
    var onMessage = function (error, sync) {
        Iif (error) {
            return self.callbacks.forEach(function (callback) {
                callback(error);
            });
        }
 
        Eif(utils.isObject(sync) && sync.startingBlock)
            sync = formatters.outputSyncingFormatter(sync);
 
        self.callbacks.forEach(function (callback) {
            Eif (self.lastSyncState !== sync) {
                
                // call the callback with true first so the app can stop anything, before receiving the sync data
                Eif(!self.lastSyncState && utils.isObject(sync))
                    callback(null, true);
                
                // call on the next CPU cycle, so the actions of the sync stop can be processes first
                setTimeout(function() {
                    callback(null, sync);
                }, 0);
                
                self.lastSyncState = sync;
            }
        });
    };
 
    self.requestManager.startPolling({
        method: 'eth_syncing',
        params: [],
    }, self.pollId, onMessage, self.stopWatching.bind(self));
 
};
 
var IsSyncing = function (requestManager, callback) {
    this.requestManager = requestManager;
    this.pollId = 'syncPoll_'+ count++;
    this.callbacks = [];
    this.addCallback(callback);
    this.lastSyncState = false;
    pollSyncing(this);
 
    return this;
};
 
IsSyncing.prototype.addCallback = function (callback) {
    Eif(callback)
        this.callbacks.push(callback);
    return this;
};
 
IsSyncing.prototype.stopWatching = function () {
    this.requestManager.stopPolling(this.pollId);
    this.callbacks = [];
};
 
module.exports = IsSyncing;