diff options
author | Jo-Philipp Wich <jo@mein.io> | 2019-04-05 08:14:28 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2019-07-07 15:36:25 +0200 |
commit | a31dc6f3c1524f05a6aac2970b61b0e84628475c (patch) | |
tree | fcfdb9bbc8ef83a054eece0643eaf78b4b108e73 /modules/luci-base/htdocs/luci-static | |
parent | 5264a943b9df5ba9a6535ce2fcac73ccccc3caa5 (diff) |
luci-base: rpc.js: drop batch api
Now that LuCI.Request is transparently coalescing requests, there
is no need for the rather cumbersome batch()/flush() api in rpc.js.
Also refactor the code to get rid of the rpcRequestRegistry indirection
and remove superfluous promises which simplifies the code a lot.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'modules/luci-base/htdocs/luci-static')
-rw-r--r-- | modules/luci-base/htdocs/luci-static/resources/rpc.js | 115 |
1 files changed, 33 insertions, 82 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/rpc.js b/modules/luci-base/htdocs/luci-static/resources/rpc.js index 36f5434d9c..e12c2f77ee 100644 --- a/modules/luci-base/htdocs/luci-static/resources/rpc.js +++ b/modules/luci-base/htdocs/luci-static/resources/rpc.js @@ -1,15 +1,12 @@ 'use strict'; -var rpcRequestRegistry = {}, - rpcRequestBatch = null, - rpcRequestID = 1, +var rpcRequestID = 1, rpcSessionID = L.env.sessionid || '00000000000000000000000000000000', rpcBaseURL = L.url('admin/ubus'); return L.Class.extend({ - call: function(req, cbFn) { - var cb = cbFn.bind(this, req), - q = ''; + call: function(req, cb) { + var q = ''; if (Array.isArray(req)) { if (req.length == 0) @@ -42,9 +39,8 @@ return L.Class.extend({ req.resolve(list); }, - handleCallReply: function(reqs, res) { + handleCallReply: function(req, res) { var type = Object.prototype.toString, - data = [], msg = null; if (!res.ok) @@ -53,64 +49,41 @@ return L.Class.extend({ msg = res.json(); - if (!Array.isArray(reqs)) { - msg = [ msg ]; - reqs = [ reqs ]; - } + /* fetch response attribute and verify returned type */ + var ret = undefined; - for (var i = 0; i < msg.length; i++) { - /* fetch related request info */ - var req = rpcRequestRegistry[reqs[i].id]; - if (typeof(req) != 'object') - throw 'No related request for JSON response'; - - /* fetch response attribute and verify returned type */ - var ret = undefined; - - /* verify message frame */ - if (typeof(msg[i]) == 'object' && msg[i].jsonrpc == '2.0') { - if (typeof(msg[i].error) == 'object' && msg[i].error.code && msg[i].error.message) - req.reject(new Error('RPC call failed with error %d: %s' - .format(msg[i].error.code, msg[i].error.message || '?'))); - else if (Array.isArray(msg[i].result) && msg[i].result[0] == 0) - ret = (msg[i].result.length > 1) ? msg[i].result[1] : msg[i].result[0]; - } - else { - req.reject(new Error('Invalid message frame received')); - } - - if (req.expect) { - for (var key in req.expect) { - if (ret != null && key != '') - ret = ret[key]; + /* verify message frame */ + if (typeof(msg) == 'object' && msg.jsonrpc == '2.0') { + if (typeof(msg.error) == 'object' && msg.error.code && msg.error.message) + req.reject(new Error('RPC call failed with error %d: %s' + .format(msg.error.code, msg.error.message || '?'))); + else if (Array.isArray(msg.result) && msg.result[0] == 0) + ret = (msg.result.length > 1) ? msg.result[1] : msg.result[0]; + } + else { + req.reject(new Error('Invalid message frame received')); + } - if (ret == null || type.call(ret) != type.call(req.expect[key])) - ret = req.expect[key]; + if (req.expect) { + for (var key in req.expect) { + if (ret != null && key != '') + ret = ret[key]; - break; - } - } + if (ret == null || type.call(ret) != type.call(req.expect[key])) + ret = req.expect[key]; - /* apply filter */ - if (typeof(req.filter) == 'function') { - req.priv[0] = ret; - req.priv[1] = req.params; - ret = req.filter.apply(this, req.priv); + break; } + } - req.resolve(ret); - - /* store response data */ - if (typeof(req.index) == 'number') - data[req.index] = ret; - else - data = ret; - - /* delete request object */ - delete rpcRequestRegistry[reqs[i].id]; + /* apply filter */ + if (typeof(req.filter) == 'function') { + req.priv[0] = ret; + req.priv[1] = req.params; + ret = req.filter.apply(this, req.priv); } - return Promise.resolve(data); + req.resolve(ret); }, list: function() { @@ -124,22 +97,6 @@ return L.Class.extend({ return this.call(msg, this.handleListReply); }, - batch: function() { - if (!Array.isArray(rpcRequestBatch)) - rpcRequestBatch = [ ]; - }, - - flush: function() { - if (!Array.isArray(rpcRequestBatch)) - return Promise.resolve([]); - - var req = rpcRequestBatch; - rpcRequestBatch = null; - - /* call rpc */ - return this.call(req, this.handleCallReply); - }, - declare: function(options) { return Function.prototype.bind.call(function(rpc, options) { var args = this.varargs(arguments, 2); @@ -157,7 +114,7 @@ return L.Class.extend({ priv.push(args[p_off]); /* store request info */ - var req = rpcRequestRegistry[rpcRequestID] = { + var req = { expect: options.expect, filter: options.filter, resolve: resolveFn, @@ -179,14 +136,8 @@ return L.Class.extend({ ] }; - /* when a batch is in progress then store index in request data - * and push message object onto the stack */ - if (Array.isArray(rpcRequestBatch)) - req.index = rpcRequestBatch.push(msg) - 1; - /* call rpc */ - else - rpc.call(msg, rpc.handleCallReply); + rpc.call(msg, rpc.handleCallReply.bind(rpc, req)); }); }, this, this, options); }, |