code: public String callRPC(String name, boolean async, int timeout, RPCParameters params) {
          ensureConnection();
          String version = "";
          String context = connectionParams.getAppid();
          
          if (name.contains(":")) {
              String pcs[] = StrUtil.split(name, ":", 3, true);
              name = pcs[0];
              version = pcs[1];
              context = pcs[2].isEmpty() ? context : pcs[2];
          }
          
          Request request = new Request(Action.RPC);
          request.addParameter("UID", id);
          request.addParameter("CTX", context);
          request.addParameter("VER", version);
          request.addParameter("RPC", name);
          request.addParameter("ASY", async);
          
          if (params != null) {
              request.addParameters(params);
          }
          
          Response response = netCall(request, timeout);
          return response.getData();
      }
docs: Performs a remote procedure call.
  
  @param name Name of the remote procedure. This has the format:
  <p>
  
  <pre>
  &lt;remote procedure name&gt;[:&lt;remote procedure version&gt;][:&lt;calling context&gt;]
  </pre>
  <p>
  where only the remote procedure name is required. If the server supports multiple
  versions of a remote procedure, an explicit version specifier may be added. If a
  different calling context is desired, this may be specified to override the
  default. For example:
  <p>
  
  <pre>
  GET LAB RESULTS:2.4:LR CONTEXT
  </pre>
  
  @param async If true, the remote procedure call will be executed asynchronously. In this
  case, the value returned by the method will be the unique handle for the
  asynchronous request.
  @param timeout The timeout, in milliseconds, to wait for remote procedure completion.
  @param params Parameters to be passed to the remote procedure. This may be null.
  @return The data returned by the remote procedure called if called synchronously, or the
  unique handle of the request, if call asynchronously.