forked from coolaj86/telebit.js
		
	
		
			
				
	
	
		
			141 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
module.exports = function (pkg) {
 | 
						|
  function checkUpgrade() {
 | 
						|
    var https = require('https');
 | 
						|
 | 
						|
    function getFile(url, cb) {
 | 
						|
      https.get(url, function (resp) {
 | 
						|
        var str = '';
 | 
						|
        resp.on('data', function (chunk) {
 | 
						|
          str += chunk.toString('utf8');
 | 
						|
        });
 | 
						|
        resp.on('end', function () {
 | 
						|
          cb(null, str);
 | 
						|
        });
 | 
						|
        resp.on('error', function (err) {
 | 
						|
          // ignore
 | 
						|
          cb(err);
 | 
						|
        });
 | 
						|
      }).on('error', function (err) {
 | 
						|
        // ignore
 | 
						|
        cb(err);
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    function isNewer(latest, myPkg) {
 | 
						|
      //console.log('sort result:', sortLatest(latest, myPkg));
 | 
						|
      return sortLatest(latest, myPkg) < 0;
 | 
						|
    }
 | 
						|
    function sortLatest(latest, myPkg) {
 | 
						|
      var m = /^(v)?(\d+)\.(\d+)\.(\d+)(.*)/.exec(latest);
 | 
						|
      var n = /^(v)?(\d+)\.(\d+)\.(\d+)(.*)/.exec(myPkg);
 | 
						|
      //console.log('m', m);
 | 
						|
      //console.log('n', n);
 | 
						|
      if (!m) {
 | 
						|
        if (!n) {
 | 
						|
          return 0;
 | 
						|
        }
 | 
						|
        return 1;
 | 
						|
      } else if (!n) {
 | 
						|
        return -1;
 | 
						|
      }
 | 
						|
 | 
						|
      if (parseInt(m[2], 10) > parseInt(n[2], 10)) {
 | 
						|
        return -1;
 | 
						|
      } else if (parseInt(m[2], 10) === parseInt(n[2], 10)) {
 | 
						|
        if (parseInt(m[3], 10) > parseInt(n[3], 10)) {
 | 
						|
          return -1;
 | 
						|
        } else if (parseInt(m[3], 10) === parseInt(n[3], 10)) {
 | 
						|
          if (parseInt(m[4], 10) > parseInt(n[4], 10)) {
 | 
						|
            return -1;
 | 
						|
          } else if (parseInt(m[4], 10) === parseInt(n[4], 10)) {
 | 
						|
            // lex sorting
 | 
						|
            if (m[5] > n[5]) {
 | 
						|
              return -1;
 | 
						|
            } else if (m[5] === n[5]) {
 | 
						|
              return 0;
 | 
						|
            } else {
 | 
						|
              return 1;
 | 
						|
            }
 | 
						|
          } else {
 | 
						|
            return 1;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          return 1;
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        return 1;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    getFile("https://telebit.cloud/dist/index.tab", function (err, tab) {
 | 
						|
      if (err) { /*ignore*/ return; }
 | 
						|
      if (tab) { tab = tab && tab.toString() || ''; }
 | 
						|
      var versions = [];
 | 
						|
      var lines = tab.split(/[\r\n]/g);
 | 
						|
      var headers = lines.shift().split(/\t/g);
 | 
						|
      var chan = 'prod';
 | 
						|
      var next;
 | 
						|
      lines.forEach(function (line) {
 | 
						|
        var tsv = {};
 | 
						|
        var fields = line.split(/\t/g);
 | 
						|
        fields.forEach(function (value, i) {
 | 
						|
          tsv[headers[i]] = value;
 | 
						|
        });
 | 
						|
        versions.push(tsv);
 | 
						|
      });
 | 
						|
      // find matching version
 | 
						|
      versions.some(function (v) {
 | 
						|
        if (('v' + pkg.version) === v.version) {
 | 
						|
          chan = v.channel;
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
      });
 | 
						|
      // find first (most recent) version in channel
 | 
						|
      versions.some(function (v) {
 | 
						|
        if (chan === v.channel) {
 | 
						|
          next = v;
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
      });
 | 
						|
      if (!next || !isNewer(next.version, pkg.version)) {
 | 
						|
        //console.log('DEBUG can\'t upgrade from', pkg.version, 'in channel', chan);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      console.log('Upgrade Available: ' + next.version + ' in \'' + next.channel + '\'channel');
 | 
						|
      getFile("https://telebit.cloud/dist/upgrade.js", function (err, script) {
 | 
						|
        if (err) { /*ignore*/ return; }
 | 
						|
        var os = require('os');
 | 
						|
        var fs = require('fs');
 | 
						|
        var path = require('path');
 | 
						|
        var scriptname = 'telebit-upgrade-' + Math.round(Math.random() * 99999) + '.js';
 | 
						|
        var pathname = path.join(os.tmpdir(), scriptname);
 | 
						|
        fs.writeFile(pathname, script, function (err) {
 | 
						|
          if (err) { /*ignore*/ return; }
 | 
						|
          // console.log('DEBUG wrote', pathname);
 | 
						|
          //var str =
 | 
						|
          require(pathname)({
 | 
						|
            package: pkg
 | 
						|
          , root: path.resolve(__dirname, '..')
 | 
						|
          , latest: next
 | 
						|
          , channel: chan
 | 
						|
          }, function () {
 | 
						|
            // console.log('upgrade complete');
 | 
						|
          });
 | 
						|
          //console.log(str);
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  var _interval = setInterval(checkUpgrade, 2 * 60 * 60 * 1000);
 | 
						|
  process.nextTick(function () {
 | 
						|
    checkUpgrade();
 | 
						|
  });
 | 
						|
 | 
						|
  return function cancel() {
 | 
						|
    clearInterval(_interval);
 | 
						|
  };
 | 
						|
};
 |