code: protected Promise call(String name, Tree params, CallOptions.Options opts, PacketStream stream) {
  
  		// Recalculate distributed timeout
  		if (startTime > 0) {
  
  			// Distributed timeout handling. Decrementing the timeout value with
  			// the elapsed time. If the timeout below 0, skip the call.
  			final long duration = System.currentTimeMillis() - startTime;
  			final long distTimeout = this.opts.timeout - duration;
  
  			if (distTimeout <= 0) {
  				return Promise.reject(new RequestRejectedError(serviceInvoker.getBroker().getNodeID(), name));
  			}
  
  			if (opts == null) {
  				opts = CallOptions.timeout(distTimeout);
  			} else if (opts.timeout < 1 || distTimeout < opts.timeout) {
  				opts = opts.timeout(distTimeout);
  			}
  		}
  		return serviceInvoker.call(name, params, opts, stream, this);
  	}
docs: Calls an action (local or remote).
  
  @param name
  action name (eg. "math.add" in "service.action" syntax)
  @param params
  {@link Tree} structure (input parameters of the method call)
  @param opts
  calling options (target nodeID, call timeout, number of
  retries)
  @param stream
  streamed data (optional)
  
  @return response Promise