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!;
}
}