ucsc-xena-client
Version:
UCSC Xena Client. Functional genomics visualizations.
354 lines (296 loc) • 12.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _dialog = require('react-toolbox/lib/dialog');
var _dialog2 = _interopRequireDefault(_dialog);
var _PureComponent2 = require('./PureComponent');
var _PureComponent3 = _interopRequireDefault(_PureComponent2);
var _link = require('react-toolbox/lib/link');
var _link2 = _interopRequireDefault(_link);
var _LaunchHelperModule = require('./LaunchHelper.module.css');
var _LaunchHelperModule2 = _interopRequireDefault(_LaunchHelperModule);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _require = require('../underscore_ext'),
map = _require.map,
pick = _require.pick,
mapObject = _require.mapObject,
getIn = _require.getIn,
get = _require.get;
var _require2 = require('./defaultServers'),
localHub = _require2.servers.localHub;
var platform = require('platform');
var _require3 = require('./xenaQuery'),
testStatus = _require3.testStatus;
var Rx = require('./rx');
var osFiles = {
osxJre: {
pattern: "ucsc_xena_macos_[_0-9]*_with_jre.dmg",
description: "OSX installer, bundled JRE",
help: "Recommended for OSX 10.7 and above"
},
osxNoJre: {
pattern: "ucsc_xena_macos_[_0-9]*.dmg",
description: "OSX installer, no JRE",
help: "Recommended for OSX 10.6"
},
win32: {
pattern: "ucsc_xena_windows_[_0-9]*.exe",
description: "Windows 32 bit installer, bundled JRE",
help: "Recommended for all 32 bit versions of Windows"
},
win64: {
pattern: "ucsc_xena_windows-x64_[_0-9]*.exe",
description: "Windows 64 bit installer, bundled JRE",
help: "Recommended for all 64 bit versions of Windows"
},
tar: {
pattern: "ucsc_xena_[_0-9]*.tar.gz",
description: "Tar archive, no updater or JRE",
help: "Recommended for linux server deployments"
}
},
defaults = {
'OS X': { 32: 'osxNoJre', 64: 'osxJre' },
'Windows': { 32: 'win32', 64: 'win64' },
'Linux': { 32: 'tar', 64: 'tar' }
};
function findMatch(pattern, list) {
var matches = list.filter(function (s) {
return s.match(pattern);
});
return matches.length > 0 ? matches[0] : undefined;
}
var matchPaths = function matchPaths(serverFiles) {
return mapObject(osFiles, function (_ref, key) {
var pattern = _ref.pattern;
return findMatch(osFiles[key].pattern, serverFiles);
});
};
var parseInt10 = function parseInt10(s) {
return parseInt(s, 10);
};
function osxArch() {
var version = getIn(platform, ['os', 'version']),
parts = version && version.match(/(\d*)\.(\d*)/).slice(1).map(parseInt10); // [maj, min, patch]
return parts && parts[0] === 10 && parts[1] <= 6 ? 32 : 64;
}
function getOs() {
var family = getIn(platform, ['os', 'family']);
if (family) {
if (family.indexOf('Windows') !== -1) {
return 'Windows';
}
if (family.indexOf('OS X') !== -1) {
return 'OS X';
}
if (family.indexOf('Linux') !== -1) {
return 'Linux';
}
}
}
var downloadDir = 'https://genome-cancer.ucsc.edu/download/public/get-xena';
var i4jLogo = downloadDir + '/install4j_small.png';
var updatesPath = downloadDir + '/updates.xml';
var downloadPath = function downloadPath(name) {
return downloadDir + '/' + name;
};
var getFileName = function getFileName(e) {
return downloadPath(e.getAttribute('fileName'));
};
var XenaDownload = function (_React$Component) {
_inherits(XenaDownload, _React$Component);
function XenaDownload() {
var _ref2;
var _temp, _this, _ret;
_classCallCheck(this, XenaDownload);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = XenaDownload.__proto__ || Object.getPrototypeOf(XenaDownload)).call.apply(_ref2, [this].concat(args))), _this), _this.state = {}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(XenaDownload, [{
key: 'componentDidMount',
value: function componentDidMount() {
var _this2 = this;
this.sub = Rx.Observable.ajax({ method: 'GET', responseType: 'xml', url: updatesPath, crossDomain: true }).subscribe(function (xml) {
var files = matchPaths([].concat(_toConsumableArray(xml.response.getElementsByTagName('entry'))).map(getFileName));
_this2.setState({ files: files }); //eslint-disable-line react/no-did-mount-set-state
});
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.sub.unsubscribe();
}
}, {
key: 'onShowAdvanced',
value: function onShowAdvanced() {
this.props.onShowAdvanced(!this.props.advanced);
}
}, {
key: 'render',
value: function render() {
var files = this.state.files,
advanced = this.props.advanced,
os = getOs(),
arch = os === 'OS X' ? osxArch() : getIn(platform, ['os', 'architecture']),
defaultTarget = getIn(defaults, [os, arch]),
defaultInstall = get(files, defaultTarget);
return _react2.default.createElement(
'div',
{ className: _LaunchHelperModule2.default.download },
defaultInstall ? _react2.default.createElement(_link2.default, { className: _LaunchHelperModule2.default.downloadLink, href: defaultInstall, label: 'Install UCSC Xena hub' }) : null,
defaultInstall ? _react2.default.createElement(_link2.default, { className: _LaunchHelperModule2.default.advancedLink, onClick: this.onShowAdvanced, label: 'Show ' + (advanced ? 'Basic' : 'Advanced') }) : null,
defaultInstall ? _react2.default.createElement('br', null) : null,
defaultInstall || advanced ? 'Other installers' : 'Please download an installer',
files && (advanced || !defaultInstall) ? map(pick(osFiles, function (_, k) {
return files[k];
}), function (info, key) {
return _react2.default.createElement(_link2.default, { className: _LaunchHelperModule2.default.downloadLink, href: files[key], title: info.help, label: info.description });
}) : null,
_react2.default.createElement('br', null),
_react2.default.createElement('img', { src: i4jLogo })
);
}
}]);
return XenaDownload;
}(_react2.default.Component);
var statusHelp = {
down: _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'p',
null,
'Attempting to start the Xena Hub on your computer...'
),
_react2.default.createElement(
'p',
null,
'The Xena Hub needs to be running for you to import or visualize data from your own computer.'
)
),
failed: _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'p',
null,
'We were not able to start up the Xena Hub for you. Please open the application from your Applications Folder, or download a local hub if you have not previously installed one.'
),
_react2.default.createElement(
'p',
null,
'The Xena Hub needs to be running for you to import or visualize data from your own computer.'
)
),
up: _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'p',
null,
'Your local Xena Hub is running.'
),
_react2.default.createElement(
'p',
null,
'To view your data, use the "Visualize" button'
)
)
};
var refresh = 2000;
var localTimeout = 500; // use a short timeout for localhost
var LaunchHelper = function (_PureComponent) {
_inherits(LaunchHelper, _PureComponent);
function LaunchHelper() {
var _ref3;
var _temp2, _this3, _ret2;
_classCallCheck(this, LaunchHelper);
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return _ret2 = (_temp2 = (_this3 = _possibleConstructorReturn(this, (_ref3 = LaunchHelper.__proto__ || Object.getPrototypeOf(LaunchHelper)).call.apply(_ref3, [this].concat(args))), _this3), _this3.state = { status: undefined, launched: undefined, advanced: false }, _this3.launch = function () {
var i = document.getElementById('xenaLauncher');
if (i) {
document.body.removeChild(i);
}
i = document.createElement('iframe');
i.id = 'xenaLauncher';
document.body.appendChild(i);
i.src = 'ucscxena://';
_this3.setState({ launched: true });
}, _this3.onRaise = function () {
Rx.Observable.ajax({ method: 'GET', url: localHub + '/raise/',
crossDomain: true }).subscribe(function () {});
}, _this3.updatePing = function (resp) {
if (resp.status === 'up' && _this3.state.status !== 'up') {
_this3.props.callback(['cohort-summary-clear', { server: localHub }]);
}
_this3.setState(resp);
}, _this3.onShowAdvanced = function (advanced) {
_this3.setState({ advanced: advanced });
}, _this3.actions = [{ label: 'Help', onClick: _this3.onHelp }, { label: 'Contact Us', onClick: _this3.onContact }, { label: 'Close', onClick: _this3.onClose }], _temp2), _possibleConstructorReturn(_this3, _ret2);
}
// status:
// undefined: waiting on first ping
// down: pings have failed
// starting: server is up but not yet able to service requests
// up: server is up
_createClass(LaunchHelper, [{
key: 'componentDidMount',
value: function componentDidMount() {
var _this4 = this;
this.sub = Rx.Observable.of(true).merge(Rx.Observable.interval(refresh)).flatMap(function () {
return testStatus(localHub, localTimeout);
}).takeWhile(function (_ref4) {
var status = _ref4.status;
return status !== 'up';
}).concat(Rx.Observable.of({ status: 'up' })).subscribe(this.updatePing);
// Try to launch if we don't get a response.
this.timeoutID = setTimeout(function () {
if (_this4.state.status !== 'up' && !_this4.state.launched) {
_this4.launch();
}
}, 2000);
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
if (this.timeoutID) {
clearTimeout(this.timeoutID);
}
if (this.sub) {
this.sub.unsubscribe();
}
}
}, {
key: 'render',
value: function render() {
var _state = this.state,
status = _state.status,
advanced = _state.advanced;
return _react2.default.createElement(
_dialog2.default,
{ active: status !== undefined && status !== 'up', actions: this.actions },
_react2.default.createElement(
'h2',
null,
'Welcome'
),
statusHelp[status],
status === 'failed' ? _react2.default.createElement(XenaDownload, { advanced: advanced, onShowAdvanced: this.onShowAdvanced }) : null
);
}
}]);
return LaunchHelper;
}(_PureComponent3.default);
exports.default = LaunchHelper;
;