docs: private JsonError handleObject(final ObjectNode node, final OutputStream output) throws IOException {
  		logger.debug("Request: {}", node);
  		
  		if (!isValidRequest(node)) {
  			return writeAndFlushValueError(output, createResponseError(VERSION, NULL, JsonError.INVALID_REQUEST));
  		}
  		Object id = parseId(node.get(ID));
  		
  		String jsonRpc = hasNonNullData(node, JSONRPC) ? node.get(JSONRPC).asText() : VERSION;
  		if (!hasNonNullData(node, METHOD)) {
  			return writeAndFlushValueError(output, createResponseError(jsonRpc, id, JsonError.METHOD_NOT_FOUND));
  		}
  
  		final String fullMethodName = node.get(METHOD).asText();
  		final String partialMethodName = getMethodName(fullMethodName);
  		final String serviceName = getServiceName(fullMethodName);
  		
  		Set<Method> methods = findCandidateMethods(getHandlerInterfaces(serviceName), partialMethodName);
  		if (methods.isEmpty()) {
  			return writeAndFlushValueError(output, createResponseError(jsonRpc, id, JsonError.METHOD_NOT_FOUND));
  		}
  		AMethodWithItsArgs methodArgs = findBestMethodByParamsNode(methods, node.get(PARAMS));
  		if (methodArgs == null) {
  			return writeAndFlushValueError(output, createResponseError(jsonRpc, id, JsonError.METHOD_PARAMS_INVALID));
  		}
  		try (InvokeListenerHandler handler = new InvokeListenerHandler(methodArgs, invocationListener)) {
  			try {
  				if (this.requestInterceptor != null) {
  					this.requestInterceptor.interceptRequest(node);
  				}
  				Object target = getHandler(serviceName);
  				// interceptors preHandle
  				for (JsonRpcInterceptor interceptor : interceptorList) {
  					interceptor.preHandle(target, methodArgs.method, methodArgs.arguments);
  				}
  				// invocation
  				JsonNode result = invoke(target, methodArgs.method, methodArgs.arguments);
  				handler.result = result;
  				// interceptors postHandle
  				for (JsonRpcInterceptor interceptor : interceptorList) {
  					interceptor.postHandle(target, methodArgs.method, methodArgs.arguments, result);
  				}
  				if (!isNotificationRequest(id)) {
  					ObjectNode response = createResponseSuccess(jsonRpc, id, handler.result);
  					writeAndFlushValue(output, response);
  				}
  				return JsonError.OK;
  			} catch (Throwable e) {
  				handler.error = e;
  				return handleError(output, id, jsonRpc, methodArgs, e);
  			}
  		}
  	}