protected async Task InvokeCoreAsync()

in src/StreamJsonRpc/JsonRpc.cs [1456:1522]


        protected async Task<TResult> InvokeCoreAsync<TResult>(RequestId id, string targetName, IReadOnlyList<object?>? arguments, IReadOnlyList<Type>? positionalArgumentDeclaredTypes, IReadOnlyDictionary<string, Type>? namedArgumentDeclaredTypes, CancellationToken cancellationToken, bool isParameterObject)
#pragma warning restore CA1068 // CancellationToken parameters must come last
#pragma warning restore CA1200 // Avoid using cref tags with a prefix
        {
            Requires.NotNullOrEmpty(targetName, nameof(targetName));

            cancellationToken.ThrowIfCancellationRequested();
            Verify.NotDisposed(this);

            JsonRpcRequest request = (this.MessageHandler.Formatter as IJsonRpcMessageFactory)?.CreateRequestMessage() ?? new JsonRpcRequest();
            request.RequestId = id;
            request.Method = targetName;
            this.ActivityTracingStrategy?.ApplyOutboundActivity(request);

            if (isParameterObject)
            {
                object? argument = arguments;
                if (arguments is not null)
                {
                    if (arguments.Count != 1 || arguments[0] is null || !arguments[0]!.GetType().GetTypeInfo().IsClass)
                    {
                        throw new ArgumentException(Resources.ParameterNotObject);
                    }

                    argument = arguments[0];
                }

                request.Arguments = argument;
                if (namedArgumentDeclaredTypes is object)
                {
                    Requires.Argument(namedArgumentDeclaredTypes.Count == request.ArgumentCount, nameof(namedArgumentDeclaredTypes), Resources.TypedArgumentsLengthMismatch);
                    request.NamedArgumentDeclaredTypes = namedArgumentDeclaredTypes;
                }
            }
            else
            {
                request.Arguments = arguments ?? Array.Empty<object>();

                if (positionalArgumentDeclaredTypes is object)
                {
                    Requires.Argument(positionalArgumentDeclaredTypes.Count == request.ArgumentCount, nameof(positionalArgumentDeclaredTypes), Resources.TypedArgumentsLengthMismatch);
                    request.ArgumentListDeclaredTypes = positionalArgumentDeclaredTypes;
                }
            }

            JsonRpcMessage? response = await this.InvokeCoreAsync(request, typeof(TResult), cancellationToken).ConfigureAwait(false);

            if (request.IsResponseExpected)
            {
                if (response is JsonRpcError error)
                {
                    throw this.CreateExceptionFromRpcError(request, error);
                }
                else if (response is JsonRpcResult result)
                {
                    return result.GetResult<TResult>();
                }
                else
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, Resources.ResponseUnexpectedFormat, JsonConvert.SerializeObject(response)));
                }
            }
            else
            {
                return default!;
            }
        }