Skip to content

Commit b57d38d

Browse files
authored
Merge pull request #48 from ecrocombe/main
Add support for "connection_init" 's payload
2 parents 860f39d + 8ece615 commit b57d38d

File tree

9 files changed

+62
-22
lines changed

9 files changed

+62
-22
lines changed

src/Linq2GraphQL.Client.Subscriptions/GraphSubscriptionExecute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public async Task<IObservable<TResult>> StartAsync()
2626
return sseClient.Subscription.Select(e => ConvertResult(queryExecutor.ProcessResponse(e, QueryNode.Name, payload.Query)));
2727
}
2828

29-
var wsClient = new WSClient(client.SubscriptionUrl, client.SubscriptionProtocol, payload);
29+
var wsClient = new WSClient(client, payload);
3030
await wsClient.Start();
3131
return wsClient.Subscription.Select(e => ConvertResult(queryExecutor.ProcessResponse(e, QueryNode.Name, payload.Query)));
3232
}

src/Linq2GraphQL.Client.Subscriptions/SSEClient.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Net.Http.Headers;
2+
using System.Net.Mime;
23
using System.Reactive.Linq;
34
using System.Reactive.Subjects;
45
using System.Text;
@@ -34,7 +35,7 @@ public async Task Start()
3435

3536
var request = new HttpRequestMessage(HttpMethod.Post, "")
3637
{
37-
Content = new StringContent(json, Encoding.UTF8, "application/json")
38+
Content = new StringContent(json, Encoding.UTF8, MediaTypeNames.Application.Json)
3839
};
3940

4041
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream"));
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Linq2GraphQL.Client.Subscriptions
2+
{
3+
internal class SubscribeCommands
4+
{
5+
internal const string SUBSCRIBE = "subscribe";
6+
internal const string START = "start";
7+
}
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Linq2GraphQL.Client.Subscriptions
2+
{
3+
internal static class SubscriptionProtocols
4+
{
5+
internal const string GRAPGQL_TRANSPORT_WS = "graphql-transport-ws";
6+
internal const string GRAPHQL_WS = "graphql-ws";
7+
}
8+
}

src/Linq2GraphQL.Client.Subscriptions/WSClient.cs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net.WebSockets;
1+
using System.Diagnostics;
2+
using System.Net.WebSockets;
23
using System.Reactive.Linq;
34
using System.Reactive.Subjects;
45
using System.Text.Json;
@@ -9,19 +10,17 @@ namespace Linq2GraphQL.Client.Subscriptions;
910

1011
public class WSClient : IAsyncDisposable
1112
{
13+
private readonly GraphClient _graphClient;
1214
private readonly GraphQLRequest payload;
13-
private readonly SubscriptionProtocol subscriptionProtocol;
1415

1516
private readonly Subject<string> subscriptionSubject = new();
16-
private readonly string url;
1717
private readonly WebsocketClient client;
1818

1919
private readonly JsonSerializerOptions jsonOptions;
2020

21-
public WSClient(string url, SubscriptionProtocol subprotocol, GraphQLRequest payload)
21+
public WSClient(GraphClient graphClient, GraphQLRequest payload)
2222
{
23-
this.url = url;
24-
subscriptionProtocol = subprotocol;
23+
_graphClient = graphClient;
2524
this.payload = payload;
2625
jsonOptions = new JsonSerializerOptions
2726
{
@@ -35,7 +34,7 @@ public WSClient(string url, SubscriptionProtocol subprotocol, GraphQLRequest pay
3534
return ws;
3635
});
3736

38-
client = new WebsocketClient(new Uri(url), factory)
37+
client = new WebsocketClient(new Uri(_graphClient.SubscriptionUrl), factory)
3938
{
4039
ReconnectTimeout = TimeSpan.FromSeconds(30)
4140
};
@@ -66,15 +65,25 @@ public async Task Start()
6665
//Filter General response
6766
var tt = client.MessageReceived.Select(m => JsonSerializer.Deserialize<WebsocketResponse>(m.ToString()));
6867

69-
tt.Where(e => e.Type == "ping").Subscribe(msg => SendRequest(new WebsocketRequest("pong")));
68+
tt.Where(e => e.Type == WebsocketRequestTypes.PING).Subscribe(msg => SendRequest(new WebsocketRequest(WebsocketRequestTypes.PONG)));
7069

7170
tt.Where(e => !string.IsNullOrEmpty(e?.Id)).Subscribe(r =>
7271
{
7372
subscriptionSubject.OnNext(r.Payload?.ToString());
7473
});
7574

7675
await client.Start();
77-
SendRequest(new WebsocketRequest("connection_init"));
76+
77+
var initRequest = new WebsocketRequest(WebsocketRequestTypes.CONNECTION_INIT);
78+
if (_graphClient.WSConnectionInitPayload is not null)
79+
{
80+
var initPayload = await _graphClient.WSConnectionInitPayload(_graphClient);
81+
if (initPayload is not null)
82+
{
83+
initRequest.Payload = initPayload;
84+
}
85+
}
86+
SendRequest(initRequest);
7887

7988
var subscriptionRequest = new WebsocketRequest(GetSubscribeCommand())
8089
{
@@ -87,37 +96,38 @@ public async Task Start()
8796

8897
private string GetSubprotocolString()
8998
{
90-
switch (subscriptionProtocol)
99+
switch (_graphClient.SubscriptionProtocol)
91100
{
92101
case SubscriptionProtocol.GraphQLWebSocket:
93-
return "graphql-transport-ws";
102+
return SubscriptionProtocols.GRAPGQL_TRANSPORT_WS;
94103

95104
case SubscriptionProtocol.ApolloWebSocket:
96-
return "graphql-ws";
105+
return SubscriptionProtocols.GRAPHQL_WS;
97106

98107
default:
99-
throw new Exception($"{subscriptionProtocol} is unknown");
108+
throw new Exception($"{_graphClient.SubscriptionProtocol} is unknown");
100109
}
101110
}
102111

103112
private string GetSubscribeCommand()
104113
{
105-
switch (subscriptionProtocol)
114+
switch (_graphClient.SubscriptionProtocol)
106115
{
107116
case SubscriptionProtocol.GraphQLWebSocket:
108-
return "subscribe";
117+
return SubscribeCommands.SUBSCRIBE;
109118

110119
case SubscriptionProtocol.ApolloWebSocket:
111-
return "start";
120+
return SubscribeCommands.START;
112121

113122
default:
114-
throw new Exception($"{subscriptionProtocol} is unknown");
123+
throw new Exception($"{_graphClient.SubscriptionProtocol} is unknown");
115124
}
116125
}
117126

118-
private void LogMessage(string message)
127+
private static void LogMessage(string message)
119128
{
120-
Console.WriteLine($"{message} - {DateTime.Now.ToString("T")}");
129+
// Write logs to debug console
130+
Debug.WriteLine($"{message} - {DateTime.Now.ToString("T")}");
121131
}
122132

123133
private void SendRequest(WebsocketRequest request)

src/Linq2GraphQL.Client.Subscriptions/WebsocketRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public WebsocketRequest(string type)
1313

1414
[JsonPropertyName("type")] public string Type { get; set; }
1515

16-
[JsonPropertyName("payload")] public GraphQLRequest Payload { get; set; }
16+
[JsonPropertyName("payload")] public object Payload { get; set; }
1717
}
1818

1919
//public class WebsocketRequestPayload
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Linq2GraphQL.Client.Subscriptions
2+
{
3+
internal class WebsocketRequestTypes
4+
{
5+
internal const string PING = "ping";
6+
internal const string PONG = "pong";
7+
internal const string CONNECTION_INIT = "connection_init";
8+
9+
}
10+
}

src/Linq2GraphQL.Client/GraphClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public GraphClient(HttpClient httpClient, IOptions<GraphClientOptions> options,
3636
public HttpClient HttpClient { get; }
3737
public JsonSerializerOptions SerializerOptions { get; }
3838

39+
public Func<GraphClient, Task<GraphQLRequest>> WSConnectionInitPayload => options.Value.WSConnectionInitPayload;
3940
private string GetSubscriptionUrl()
4041
{
4142
var baseUrl = HttpClient?.BaseAddress.ToString();
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
12
namespace Linq2GraphQL.Client;
23

34
public class GraphClientOptions
45
{
56
public bool UseSafeMode { get; set; } = false;
67
public SubscriptionProtocol SubscriptionProtocol { get; set; } = default;
8+
public Func<GraphClient, Task<GraphQLRequest>> WSConnectionInitPayload { get; set; } = opts => null;
79
}

0 commit comments

Comments
 (0)