Seed Support #56
4 changed files with 63 additions and 47 deletions
47
app/main.js
47
app/main.js
|
@ -1,11 +1,18 @@
|
||||||
const {app, BrowserWindow, ipcMain} = require('electron');
|
const {app, BrowserWindow, ipcMain} = require('electron');
|
||||||
|
const url = require('url');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const jayson = require('jayson');
|
const jayson = require('jayson');
|
||||||
|
const semver = require('semver');
|
||||||
|
const https = require('https');
|
||||||
// tree-kill has better cross-platform handling of
|
// tree-kill has better cross-platform handling of
|
||||||
// killing a process. child-process.kill was unreliable
|
// killing a process. child-process.kill was unreliable
|
||||||
const kill = require('tree-kill');
|
const kill = require('tree-kill');
|
||||||
const child_process = require('child_process');
|
const child_process = require('child_process');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
const {version: localVersion} = require(app.getAppPath() + '/package.json');
|
||||||
|
|
||||||
|
const VERSION_CHECK_INTERVAL = 30 * 60 * 1000;
|
||||||
|
const LATEST_RELEASE_API_URL = 'https://api.github.com/repos/lbryio/lbry-app/releases/latest';
|
||||||
|
|
||||||
|
|
||||||
let client = jayson.client.http('http://localhost:5279/lbryapi');
|
let client = jayson.client.http('http://localhost:5279/lbryapi');
|
||||||
|
@ -23,6 +30,46 @@ let daemonStopRequested = false;
|
||||||
// this is set to true and app.quit() is called again to quit for real.
|
// this is set to true and app.quit() is called again to quit for real.
|
||||||
let readyToQuit = false;
|
let readyToQuit = false;
|
||||||
|
|
||||||
|
function checkForNewVersion(callback) {
|
||||||
|
function formatRc(ver) {
|
||||||
|
// Adds dash if needed to make RC suffix semver friendly
|
||||||
|
return ver.replace(/([^-])rc/, '$1-rc');
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = '';
|
||||||
|
const opts = {
|
||||||
|
headers: {
|
||||||
|
'User-Agent': `LBRY/${localVersion}`,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const req = https.get(Object.assign(opts, url.parse(LATEST_RELEASE_API_URL)), (res) => {
|
||||||
|
res.on('data', (data) => {
|
||||||
|
result += data;
|
||||||
|
});
|
||||||
|
res.on('end', () => {
|
||||||
|
console.log('Local version:', localVersion);
|
||||||
|
const tagName = JSON.parse(result).tag_name;
|
||||||
|
const [_, remoteVersion] = tagName.match(/^v([\d.]+(?:-?rc\d+)?)$/);
|
||||||
|
if (!remoteVersion) {
|
||||||
|
console.log('Malformed remote version string:', tagName);
|
||||||
|
win.webContents.send('version-info-received', null);
|
||||||
|
} else {
|
||||||
|
console.log('Remote version:', remoteVersion);
|
||||||
|
const upgradeAvailable = semver.gt(formatRc(remoteVersion), formatRc(localVersion));
|
||||||
|
console.log(upgradeAvailable ? 'Upgrade available' : 'No upgrade available');
|
||||||
|
win.webContents.send('version-info-received', {remoteVersion, localVersion, upgradeAvailable});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
req.on('error', (err) => {
|
||||||
|
console.log('Failed to get current version from GitHub. Error:', err);
|
||||||
|
win.webContents.send('version-info-received', null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMain.on('version-info-requested', checkForNewVersion);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Replacement for Electron's shell.openItem. The Electron version doesn't
|
* Replacement for Electron's shell.openItem. The Electron version doesn't
|
||||||
* reliably work from the main process, and we need to be able to run it
|
* reliably work from the main process, and we need to be able to run it
|
||||||
|
|
|
@ -42,5 +42,8 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"electron": "^1.4.15",
|
"electron": "^1.4.15",
|
||||||
"electron-builder": "^11.7.0"
|
"electron-builder": "^11.7.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"semver": "^5.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
ui/js/app.js
12
ui/js/app.js
|
@ -115,17 +115,13 @@ var App = React.createClass({
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!sessionStorage.getItem('upgradeSkipped')) {
|
if (!sessionStorage.getItem('upgradeSkipped')) {
|
||||||
lbry.checkNewVersionAvailable(({isAvailable}) => {
|
lbry.getVersionInfo().then(({remoteVersion, upgradeAvailable}) => {
|
||||||
if (!isAvailable) {
|
if (upgradeAvailable) {
|
||||||
return;
|
this._version = remoteVersion;
|
||||||
}
|
|
||||||
|
|
||||||
lbry.getVersionInfo((versionInfo) => {
|
|
||||||
this._version = versionInfo.lbrynet_version;
|
|
||||||
this.setState({
|
this.setState({
|
||||||
modal: 'upgrade',
|
modal: 'upgrade',
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -4,7 +4,7 @@ import jsonrpc from './jsonrpc.js';
|
||||||
import lbryuri from './lbryuri.js';
|
import lbryuri from './lbryuri.js';
|
||||||
import {getLocal, getSession, setSession, setLocal} from './utils.js';
|
import {getLocal, getSession, setSession, setLocal} from './utils.js';
|
||||||
|
|
||||||
const {remote} = require('electron');
|
const {remote, ipcRenderer} = require('electron');
|
||||||
const menu = remote.require('./menu/main-menu');
|
const menu = remote.require('./menu/main-menu');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -361,44 +361,6 @@ lbry.publish = function(params, fileListedCallback, publishedCallback, errorCall
|
||||||
//});
|
//});
|
||||||
}
|
}
|
||||||
|
|
||||||
lbry.getVersionInfo = function(callback) {
|
|
||||||
lbry.call('version', {}, callback);
|
|
||||||
};
|
|
||||||
|
|
||||||
lbry.checkNewVersionAvailable = function(callback) {
|
|
||||||
lbry.call('version', {}, function(versionInfo) {
|
|
||||||
var ver = versionInfo.lbrynet_version.split('.');
|
|
||||||
|
|
||||||
var maj = parseInt(ver[0]),
|
|
||||||
min = parseInt(ver[1]),
|
|
||||||
patch = parseInt(ver[2]);
|
|
||||||
|
|
||||||
var remoteVer = versionInfo.remote_lbrynet.split('.');
|
|
||||||
var remoteMaj = parseInt(remoteVer[0]),
|
|
||||||
remoteMin = parseInt(remoteVer[1]),
|
|
||||||
remotePatch = parseInt(remoteVer[2]);
|
|
||||||
|
|
||||||
if (maj < remoteMaj) {
|
|
||||||
var newVersionAvailable = true;
|
|
||||||
} else if (maj == remoteMaj) {
|
|
||||||
if (min < remoteMin) {
|
|
||||||
var newVersionAvailable = true;
|
|
||||||
} else if (min == remoteMin) {
|
|
||||||
var newVersionAvailable = (patch < remotePatch);
|
|
||||||
} else {
|
|
||||||
var newVersionAvailable = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var newVersionAvailable = false;
|
|
||||||
}
|
|
||||||
callback(newVersionAvailable);
|
|
||||||
}, function(err) {
|
|
||||||
if (err.fault == 'NoSuchFunction') {
|
|
||||||
// Really old daemon that can't report a version
|
|
||||||
callback(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
lbry.getClientSettings = function() {
|
lbry.getClientSettings = function() {
|
||||||
var outSettings = {};
|
var outSettings = {};
|
||||||
|
@ -608,6 +570,14 @@ lbry.showMenuIfNeeded = function() {
|
||||||
sessionStorage.setItem('menuShown', chosenMenu);
|
sessionStorage.setItem('menuShown', chosenMenu);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
lbry.getVersionInfo = function() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
ipcRenderer.once('version-info-received', (event, versionInfo) => { resolve(versionInfo) });
|
||||||
|
ipcRenderer.send('version-info-requested');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs,
|
* Wrappers for API methods to simulate missing or future behavior. Unlike the old-style stubs,
|
||||||
* these are designed to be transparent wrappers around the corresponding API methods.
|
* these are designed to be transparent wrappers around the corresponding API methods.
|
||||||
|
|
Loading…
Reference in a new issue