node-build.js 2.75 KB
'use strict';

var rxjs_Observable = require('rxjs/Observable');
var http = require('http');
var https = require('https');
var fs = require('fs');

var NodeFileHandler = (function () {
    function NodeFileHandler() {
    }
    NodeFileHandler.prototype.selectProtocol = function (url) {
        if (url.search(/^http:\/\//) === 0) {
            return http;
        }
        else if (url.search(/^https:\/\//) === 0) {
            return https;
        }
        else {
            return null;
        }
    };
    NodeFileHandler.prototype.download = function (source, target) {
        var handler = this.selectProtocol(source);
        return rxjs_Observable.Observable.create(function (subscriber) {
            if (!handler) {
                subscriber.error("No handler for source: " + source);
                return;
            }
            // file already exists and is not empty
            if (fs.existsSync(target) && (fs.statSync(target)['size'] > 0)) {
                subscriber.complete();
                return;
            }
            var file = fs.createWriteStream(target, { 'flags': 'a' });
            handler.get(source, function (response) {
                var size = response.headers['content-length']; // in bytes
                var prog = 0; // already downloaded
                var progCounts = 100; // how many progress events should be triggerd (1-100 %)
                var nextProg = (1 / progCounts);
                response.on('data', function (chunk) {
                    prog += chunk.length;
                    file.write(chunk, 'binary');
                    if ((prog / size) > nextProg) {
                        subscriber.next(prog / size);
                        nextProg += (1 / progCounts);
                    }
                });
                response.on('end', function () {
                    file.end();
                    subscriber.complete();
                });
            }).on('error', function (error) {
                fs.unlink(target);
                subscriber.error("Error while downloading: " + error);
            });
        });
    };
    return NodeFileHandler;
}());

var Bsync = (function () {
    function Bsync() {
    }
    Bsync.configIpcMain = function (ipcMain, downloadDir) {
        var nodeFileHander = new NodeFileHandler();
        ipcMain.on('bsync-download', function (event, args) {
            nodeFileHander.download(args.source, downloadDir + args.target)
                .subscribe(function (progress) { event.sender.send('bsync-download-progress', progress); }, function (error) { event.sender.send('bsync-download-error', error); }, function () { event.sender.send('bsync-download-complete'); });
        });
    };
    return Bsync;
}());

module.exports = Bsync;
//# sourceMappingURL=node-build.js.map