luci-base: rpc.js: add ability to reject nonzero ubus statuses
authorJo-Philipp Wich <jo@mein.io>
Fri, 10 Apr 2020 20:50:41 +0000 (22:50 +0200)
committerJo-Philipp Wich <jo@mein.io>
Fri, 10 Apr 2020 20:50:41 +0000 (22:50 +0200)
Add a new declare option `reject` which makes the generated RPC call
function reject with an error in case the remote ubus call returned
a non-zero status.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/htdocs/luci-static/resources/rpc.js

index 20b77c18fc813ec520ca4af2eef6cf3d88e78857..7bfc913367a529b3ccb29dfc47be78c961ab0b1a 100644 (file)
@@ -93,6 +93,10 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
                        ret = msg.result;
                }
                else if (Array.isArray(msg.result)) {
+                       if (req.raise && msg.result[0] !== 0)
+                               L.raise('RPCError', 'RPC call to %s/%s failed with ubus code %d: %s',
+                                       req.object, req.method, msg.result[0], this.getStatusText(msg.result[0]));
+
                        ret = (msg.result.length > 1) ? msg.result[1] : msg.result[0];
                }
 
@@ -228,6 +232,10 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
         * Specfies an optional filter function which is invoked to transform the
         * received reply data before it is returned to the caller.
         *
+        * @property {boolean} [reject=false]
+        * If set to `true`, non-zero ubus call status codes are treated as fatal
+        * error and lead to the rejection of the call promise. The default
+        * behaviour is to resolve with the call return code value instead.
         */
 
        /**
@@ -316,7 +324,8 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
                                        params:  params,
                                        priv:    priv,
                                        object:  options.object,
-                                       method:  options.method
+                                       method:  options.method,
+                                       raise:   options.reject
                                };
 
                                /* build message object */