'use strict'; 'require view'; 'require poll'; 'require dom'; 'require fs'; 'require rpc'; 'require uci'; 'require ui'; 'require form'; var TestTimeout = 240 * 1000; // 4 Minutes return view.extend({ // handleSaveApply: null, // handleSave: null, // handleReset: null, load: function() { return Promise.all([ L.resolveDefault(fs.stat('/usr/bin/speedtest'), {}), L.resolveDefault(fs.read('/etc/speedtest/speedtest_result'), null), L.resolveDefault(fs.stat('/etc/speedtest/speedtest_result'), {}), uci.load('netspeedtest') ]); }, poll_status: function(nodes, res) { var has_ookla = res[0].path, result_content = res[1] ? res[1].trim().split("\n") : []; var ookla_stat = nodes.querySelector('#ookla_status'), result_stat = nodes.querySelector('#speedtest_result'); if (has_ookla) { ookla_stat.style.color = 'green'; dom.content(ookla_stat, [ _('Installed') ]); } else { ookla_stat.style.color = 'red'; dom.content(ookla_stat, [ _('Not Installed') ]); }; if (result_content.length) { if (result_content[0] == 'Testing') { result_stat.innerHTML = "" + '  ' + "" + ' ' + _('Testing in progress...') + ""; }; if (result_content[0].match(/https?:\S+/)) { result_stat.innerHTML = "
"; }; if (result_content[0] == 'Test failed') { result_stat.innerHTML = "" + _('Test failed.') + ""; } } else { result_stat.innerHTML = "" + _('No result.') + ""; }; return; }, render: function(res) { var has_ookla = res[0].path, result_content = res[1] ? res[1].trim().split("\n") : [], result_mtime = res[2] ? res[2].mtime * 1000 : 0, date = new Date(); var m, s, o; m = new form.Map('netspeedtest', _('Speedtest by Ookla')); s = m.section(form.TypedSection, '_result'); s.anonymous = true; s.render = function (section_id) { if (result_content.length) { if (result_content[0] == 'Testing') { return E('div', { 'id': 'speedtest_result' }, [ E('span', { 'style': 'color:yellow;font-weight:bold' }, [ E('img', { 'src': L.resource(['icons/loading.gif']), 'height': '20', 'style': 'vertical-align:middle' }, []), _('Testing in progress...') ]) ]) }; if (result_content[0].match(/https?:\S+/)) { return E('div', { 'id': 'speedtest_result' }, [ E('div', { 'style': 'max-width:500px' }, [ E('a', { 'href': result_content[0], 'target': '_blank' }, [ E('img', { 'src': result_content[0] + '.png', 'style': 'max-width:100%;max-height:100%;vertical-align:middle' }, []) ]) ]) ]) }; if (result_content[0] == 'Test failed') { return E('div', { 'id': 'speedtest_result' }, [ E('span', { 'style': 'color:red;font-weight:bold' }, [ _('Test failed.') ]) ]) } } else { return E('div', { 'id': 'speedtest_result' }, [ E('span', { 'style': 'color:red;font-weight:bold;display:none' }, [ _('No result.') ]) ]) } }; s = m.section(form.NamedSection, 'config', 'speedtest', _('Internet Speedtest')); o = s.option(form.Button, '_start', _('Start Test')); o.inputtitle = _('Start Test'); o.inputstyle = 'apply'; if (result_content.length && result_content[0] == 'Testing' && (date.getTime() - result_mtime) < TestTimeout) o.readonly = true; o.onclick = function() { return fs.exec_direct('/usr/lib/netspeedtest/speedtest') .then(function(res) { return window.location = window.location.href.split('#')[0] }) .catch(function(e) { ui.addNotification(null, E('p', e.message), 'error') }); }; o = s.option(form.DummyValue, '_ookla_status', _('Speedtest® CLI')); o.rawhtml = true; o.cfgvalue = function(s) { if (has_ookla) { return E('span', { 'id': 'ookla_status', 'style': 'color:green;font-weight:bold' }, [ _('Installed') ]); } else { return E('span', { 'id': 'ookla_status', 'style': 'color:red;font-weight:bold' }, [ _('Not Installed') ]); } }; return m.render() .then(L.bind(function(m, nodes) { poll.add(L.bind(function() { return Promise.all([ L.resolveDefault(fs.stat('/usr/bin/speedtest'), {}), L.resolveDefault(fs.read('/etc/speedtest/speedtest_result'), null) ]).then(L.bind(this.poll_status, this, nodes)); }, this), 5); return nodes; }, this, m)); } });