+ /**
+ * @typedef {Object} DeclareOptions
+ * @memberof LuCI.rpc
+ *
+ * @property {string} object
+ * The name of the remote `ubus` object to invoke.
+ *
+ * @property {string} method
+ * The name of the remote `ubus` method to invoke.
+ *
+ * @property {string[]} [params]
+ * Lists the named parameters expected by the remote `ubus` RPC method.
+ * The arguments passed to the resulting generated method call function
+ * will be mapped to named parameters in the order they appear in this
+ * array.
+ *
+ * Extraneous parameters passed to the generated function will not be
+ * sent to the remote procedure but are passed to the
+ * {@link LuCI.rpc~filterFn filter function} if one is specified.
+ *
+ * Examples:
+ * - `params: [ "foo", "bar" ]` -
+ * When the resulting call function is invoked with `fn(true, false)`,
+ * the corresponding args object sent to the remote procedure will be
+ * `{ foo: true, bar: false }`.
+ * - `params: [ "test" ], filter: function(reply, args, extra) { ... }` -
+ * When the resultung generated function is invoked with
+ * `fn("foo", "bar", "baz")` then `{ "test": "foo" }` will be sent as
+ * argument to the remote procedure and the filter function will be
+ * invoked with `filterFn(reply, [ "foo" ], "bar", "baz")`
+ *
+ * @property {Object<string,*>} [expect]
+ * Describes the expected return data structure. The given object is
+ * supposed to contain a single key selecting the value to use from
+ * the returned `ubus` reply object. The value of the sole key within
+ * the `expect` object is used to infer the expected type of the received
+ * `ubus` reply data.
+ *
+ * If the received data does not contain `expect`'s key, or if the
+ * type of the data differs from the type of the value in the expect
+ * object, the expect object's value is returned as default instead.
+ *
+ * The key in the `expect` object may be an empty string (`''`) in which
+ * case the entire reply object is selected instead of one of its subkeys.
+ *
+ * If the `expect` option is omitted, the received reply will be returned
+ * as-is, regardless of its format or type.
+ *
+ * Examples:
+ * - `expect: { '': { error: 'Invalid response' } }` -
+ * This requires the entire `ubus` reply to be a plain JavaScript
+ * object. If the reply isn't an object but e.g. an array or a numeric
+ * error code instead, it will get replaced with
+ * `{ error: 'Invalid response' }` instead.
+ * - `expect: { results: [] }` -
+ * This requires the received `ubus` reply to be an object containing
+ * a key `results` with an array as value. If the received reply does
+ * not contain such a key, or if `reply.results` points to a non-array
+ * value, the empty array (`[]`) will be used instead.
+ * - `expect: { success: false }` -
+ * This requires the received `ubus` reply to be an object containing
+ * a key `success` with a boolean value. If the reply does not contain
+ * `success` or if `reply.success` is not a boolean value, `false` will
+ * be returned as default instead.
+ *
+ * @property {LuCI.rpc~filterFn} [filter]
+ * 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.
+ */
+
+ /**
+ * The filter function is invoked to transform a received `ubus` RPC call
+ * reply before returning it to the caller.
+ *
+ * @callback LuCI.rpc~filterFn
+ *
+ * @param {*} data
+ * The received `ubus` reply data or a subset of it as described in the
+ * `expect` option of the RPC call declaration. In case of remote call
+ * errors, `data` is numeric `ubus` error code instead.
+ *
+ * @param {Array<*>} args
+ * The arguments the RPC method has been invoked with.
+ *
+ * @param {...*} extraArgs
+ * All extraneous arguments passed to the RPC method exceeding the number
+ * of arguments describes in the RPC call declaration.
+ *
+ * @return {*}
+ * The return value of the filter function will be returned to the caller
+ * of the RPC method as-is.
+ */
+
+ /**
+ * The generated invocation function is returned by
+ * {@link LuCI.rpc#declare rpc.declare()} and encapsulates a single
+ * RPC method call.
+ *
+ * Calling this function will execute a remote `ubus` HTTP call request
+ * using the arguments passed to it as arguments and return a promise
+ * resolving to the received reply values.
+ *
+ * @callback LuCI.rpc~invokeFn
+ *
+ * @param {...*} params
+ * The parameters to pass to the remote procedure call. The given
+ * positional arguments will be named to named RPC parameters according
+ * to the names specified in the `params` array of the method declaration.
+ *
+ * Any additional parameters exceeding the amount of arguments in the
+ * `params` declaration are passed as private extra arguments to the
+ * declared filter function.
+ *
+ * @return {Promise<*>}
+ * Returns a promise resolving to the result data of the remote `ubus`
+ * RPC method invocation, optionally substituted and filtered according
+ * to the `expect` and `filter` declarations.
+ */
+
+ /**
+ * Describes a remote RPC call procedure and returns a function
+ * implementing it.
+ *
+ * @param {LuCI.rpc.DeclareOptions} options
+ * If any object names are given, this function will return the method
+ * signatures of each given object.
+ *
+ * @returns {LuCI.rpc~invokeFn}
+ * Returns a new function implementing the method call described in
+ * `options`.
+ */