Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
546b304
add StringEnumConverter to JsonSerializerSettings
rose-a Nov 29, 2018
a8cff74
fix dependencies
rose-a Nov 29, 2018
3b51211
Merge branch 'serialize-enums-to-string-by-default' into subscription…
rose-a Nov 29, 2018
e3a2154
change version
rose-a Nov 29, 2018
eca5d24
fix version
rose-a Nov 29, 2018
2911345
fix CloseAsync
rose-a Dec 3, 2018
af78196
lock dispose
rose-a Dec 3, 2018
43cb3dd
implement external exception handling for subscription streams
rose-a Dec 4, 2018
f1deb7f
fix doc comment
rose-a Dec 4, 2018
1a28d69
add back-off delay for automatic reconnects
rose-a Dec 4, 2018
7b19ab5
create GraphQLHttpWebSocket class
rose-a Dec 4, 2018
ad2c31f
get single socket working
rose-a Dec 4, 2018
ae491f2
fix subscription test, cleanup code
rose-a Dec 5, 2018
98190e9
more code cleanup
rose-a Dec 5, 2018
9aec685
add test CanConnectMultipleSubscriptionsSimultaneously
rose-a Dec 5, 2018
24be6a5
dynamically find free ports for integration test
rose-a Dec 5, 2018
4189799
add WebSocketExceptionHandler to clientOptions
rose-a Dec 5, 2018
492c440
move reconnect-logic into subscriptions
rose-a Dec 7, 2018
293c351
move external exception handler declaration to CreateSubscriptionStre…
rose-a Dec 7, 2018
e6c469a
fix exception on disposing disconnected subscription
rose-a Dec 7, 2018
7bcf0e4
fix tests, add console app for testing reconnect after server restart
rose-a Dec 10, 2018
a4c7e60
Merge branch 'subscriptions-api' of github.com:graphql-dotnet/graphql…
rose-a Dec 18, 2018
5b65aa3
Merge branch 'subscriptions-api' of github.com:graphql-dotnet/graphql…
rose-a Mar 2, 2019
8680d25
clean up stuff
rose-a Mar 2, 2019
95138b1
clean up and reorganize GraphQLHttpWebSocket
rose-a Mar 2, 2019
f446491
refactor GraphQLWebsocketHelpers, add test for Queries via websocket
rose-a Mar 2, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="System.Reactive" Version="4.1.2" />
<PackageReference Include="System.Reactive" Version="4.1.3" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.11.3" />
<PackageReference Include="BenchmarkDotNet" Version="0.11.4" />
</ItemGroup>

<ItemGroup>
Expand Down
6 changes: 3 additions & 3 deletions samples/GraphQL.Client.Sample/Program.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
using System;
using GraphQL.Client.Http;
using GraphQL.Common.Request;

namespace GraphQL.Client.Sample {

public class Program {

public static void Main(string[] args) {
using (var graphQLHttpClient = new GraphQLHttpClient("http://localhost:60341/graphql")) {
var subscriptionResult = graphQLHttpClient.SendSubscribeAsync(@"subscription { messageAdded{content}}").Result;
subscriptionResult.OnReceive += (res) => { Console.WriteLine(res.Data.messageAdded.content); };
Console.ReadKey();
var subscription = graphQLHttpClient.CreateSubscriptionStream(new GraphQLRequest(@"subscription { messageAdded{content}}"));
subscription.Subscribe(res => Console.WriteLine(res.Data.messageAdded.content));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/GraphQL.Client/GraphQL.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<ItemGroup>
<PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" />
<PackageReference Include="System.Net.WebSockets.Client.Managed" Version="1.0.22" />
<PackageReference Include="System.Reactive" Version="4.1.2" />
<PackageReference Include="System.Reactive" Version="4.1.3" />
</ItemGroup>

<ItemGroup>
Expand Down
53 changes: 13 additions & 40 deletions src/GraphQL.Client/Http/GraphQLHttpClient.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.WebSockets;
Expand Down Expand Up @@ -41,14 +40,14 @@ public GraphQLHttpClientOptions Options {
}

/// <inheritdoc />
[Obsolete("EXPERIMENTAL")]
public IObservable<Exception> WebSocketReceiveErrors => graphQlHttpWebSocket.ReceiveErrors;

#endregion

internal readonly GraphQLHttpHandler graphQLHttpHandler;
internal readonly GraphQLHttpWebSocket graphQlHttpWebSocket;
private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
private readonly ConcurrentDictionary<GraphQLRequest, IObservable<GraphQLResponse>> _subscriptionStreams = new ConcurrentDictionary<GraphQLRequest, IObservable<GraphQLResponse>>();

/// <summary>
/// Initializes a new instance
Expand Down Expand Up @@ -119,7 +118,7 @@ public Task<GraphQLResponse> SendQueryAsync(string query, CancellationToken canc
public Task<GraphQLResponse> SendQueryAsync(GraphQLRequest request, CancellationToken cancellationToken = default)
{
return Options.UseWebSocketForQueriesAndMutations
? this.graphQlHttpWebSocket.Request(request, cancellationToken)
? this.graphQlHttpWebSocket.SendRequest(request, cancellationToken)
: this.graphQLHttpHandler.PostAsync(request, cancellationToken);
}

Expand All @@ -129,55 +128,32 @@ public Task<GraphQLResponse> SendMutationAsync(string query, CancellationToken c
public Task<GraphQLResponse> SendMutationAsync(GraphQLRequest request, CancellationToken cancellationToken = default)
{
return Options.UseWebSocketForQueriesAndMutations
? this.graphQlHttpWebSocket.Request(request, cancellationToken)
? this.graphQlHttpWebSocket.SendRequest(request, cancellationToken)
: this.graphQLHttpHandler.PostAsync(request, cancellationToken);
}

[Obsolete("EXPERIMENTAL API")]
public Task<IGraphQLSubscriptionResult> SendSubscribeAsync(string query, CancellationToken cancellationToken = default) =>
this.SendSubscribeAsync(new GraphQLRequest(query), cancellationToken);

[Obsolete("EXPERIMENTAL API")]
public Task<IGraphQLSubscriptionResult> SendSubscribeAsync(GraphQLRequest request, CancellationToken cancellationToken = default)
{
GraphQLHttpSubscriptionResult graphQLSubscriptionResult = _createSubscription(request, cancellationToken);
return Task.FromResult<IGraphQLSubscriptionResult>(graphQLSubscriptionResult);
}

private GraphQLHttpSubscriptionResult _createSubscription(GraphQLRequest request, CancellationToken cancellationToken)
{
if (request == null) { throw new ArgumentNullException(nameof(request)); }
if (request.Query == null) { throw new ArgumentNullException(nameof(request.Query)); }

var graphQLSubscriptionResult = new GraphQLHttpSubscriptionResult(_getWebSocketUri(), request);
graphQLSubscriptionResult.StartAsync(cancellationToken);
return graphQLSubscriptionResult;
}

private Uri _getWebSocketUri()
{
var webSocketSchema = this.EndPoint.Scheme == "https" ? "wss" : "ws";
return new Uri($"{webSocketSchema}://{this.EndPoint.Host}:{this.EndPoint.Port}{this.EndPoint.AbsolutePath}");
}

/// <inheritdoc />
[Obsolete("EXPERIMENTAL API")]
public IObservable<GraphQLResponse> CreateSubscriptionStream(GraphQLRequest request)
{
if (_disposed)
throw new ObjectDisposedException(nameof(GraphQLHttpClient));

if (subscriptionStreams.ContainsKey(request))
return subscriptionStreams[request];
if (_subscriptionStreams.ContainsKey(request))
return _subscriptionStreams[request];

var observable = graphQlHttpWebSocket.CreateSubscriptionStream(request, Options, cancellationToken: _cancellationTokenSource.Token);
var observable = graphQlHttpWebSocket.CreateSubscriptionStream(request, cancellationToken: _cancellationTokenSource.Token);

subscriptionStreams.TryAdd(request, observable);
_subscriptionStreams.TryAdd(request, observable);
return observable;
}

/// <inheritdoc />
[Obsolete("EXPERIMENTAL API")]
public IObservable<GraphQLResponse> CreateSubscriptionStream(GraphQLRequest request, Action<WebSocketException> webSocketExceptionHandler)
{
if (_disposed)
Expand All @@ -193,22 +169,19 @@ public IObservable<GraphQLResponse> CreateSubscriptionStream(GraphQLRequest requ
}

/// <inheritdoc />
[Obsolete("EXPERIMENTAL API")]
public IObservable<GraphQLResponse> CreateSubscriptionStream(GraphQLRequest request, Action<Exception> exceptionHandler)
{
if (_disposed)
throw new ObjectDisposedException(nameof(GraphQLHttpClient));

if(subscriptionStreams.ContainsKey(request))
return subscriptionStreams[request];
if(_subscriptionStreams.ContainsKey(request))
return _subscriptionStreams[request];

var observable = graphQlHttpWebSocket.CreateSubscriptionStream(request, Options, exceptionHandler, _cancellationTokenSource.Token);
subscriptionStreams.TryAdd(request, observable);
var observable = graphQlHttpWebSocket.CreateSubscriptionStream(request, exceptionHandler, _cancellationTokenSource.Token);
_subscriptionStreams.TryAdd(request, observable);
return observable;
}

private ConcurrentDictionary<GraphQLRequest, IObservable<GraphQLResponse>> subscriptionStreams = new ConcurrentDictionary<GraphQLRequest, IObservable<GraphQLResponse>>();


/// <summary>
/// Releases unmanaged resources
/// </summary>
Expand All @@ -224,7 +197,7 @@ public void Dispose()
}

private bool _disposed = false;
private object _disposeLocker = new object();
private readonly object _disposeLocker = new object();

private void _dispose()
{
Expand Down
90 changes: 0 additions & 90 deletions src/GraphQL.Client/Http/GraphQLHttpSubscriptionResult.cs

This file was deleted.

Loading