diff options
author | Jo-Philipp Wich <jo@mein.io> | 2019-10-07 10:07:49 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2019-10-07 11:53:39 +0200 |
commit | f3ef2ca2eb887079328d53225fe4336c05d87697 (patch) | |
tree | da0a79e706789ae8b9e6b7821a3475d1f813083a | |
parent | 55fb53e995eb869ed4e8559ccff3daf8110d75aa (diff) |
luci-base: ui.js: add pingDevice() and awaitReconnect() functions
Import these functions from the flash.js for use with other views that
might trigger a device reboot.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | modules/luci-base/htdocs/luci-static/resources/ui.js | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js index a4050cd3f3..caae812812 100644 --- a/modules/luci-base/htdocs/luci-static/resources/ui.js +++ b/modules/luci-base/htdocs/luci-static/resources/ui.js @@ -2214,6 +2214,44 @@ return L.Class.extend({ } }), + /* Reconnect handling */ + pingDevice: function(proto, ipaddr) { + var target = '%s://%s%s?%s'.format(proto || 'http', ipaddr || window.location.host, L.resource('icons/loading.gif'), Math.random()); + + return new Promise(function(resolveFn, rejectFn) { + var img = new Image(); + + img.onload = resolveFn; + img.onerror = rejectFn; + + window.setTimeout(rejectFn, 1000); + + img.src = target; + }); + }, + + awaitReconnect: function(/* ... */) { + var ipaddrs = arguments.length ? arguments : [ window.location.host ]; + + window.setTimeout(L.bind(function() { + L.Poll.add(L.bind(function() { + var tasks = [], reachable = false; + + for (var i = 0; i < 2; i++) + for (var j = 0; j < ipaddrs.length; j++) + tasks.push(this.pingDevice(i ? 'https' : 'http', ipaddrs[j]) + .then(function(ev) { reachable = ev.target.src.replace(/^(https?:\/\/[^\/]+).*$/, '$1/') }, function() {})); + + return Promise.all(tasks).then(function() { + if (reachable) { + L.Poll.stop(); + window.location = reachable; + } + }); + }, this)); + }, this), 5000); + }, + /* UCI Changes */ changes: L.Class.singleton({ init: function() { |