Skip to content

Commit 39e2c48

Browse files
Merge remote-tracking branch 'origin/feature/add-serializer-option' into pc/epic-valorant-pivot-unity-upgrade
# Conflicts: # Runtime/SimpleGraphQL/GraphQLClient.cs # Runtime/SimpleGraphQL/HttpUtils.cs
2 parents 40542aa + b4a473b commit 39e2c48

File tree

3 files changed

+85
-22
lines changed

3 files changed

+85
-22
lines changed

Runtime/SimpleGraphQL/GraphQLClient.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public GraphQLClient(GraphQLConfig config)
5151
/// <returns></returns>
5252
public async Task<string> Send(
5353
Request request,
54+
JsonSerializerSettings serializerSettings = null,
5455
Dictionary<string, string> headers = null,
5556
string authToken = null,
5657
string authScheme = null,
@@ -75,6 +76,7 @@ public async Task<string> Send(
7576
string postQueryAsync = await HttpUtils.PostRequest(
7677
Endpoint,
7778
request,
79+
serializerSettings,
7880
headers,
7981
authToken,
8082
authScheme,
@@ -86,25 +88,27 @@ public async Task<string> Send(
8688

8789
public async Task<Response<TResponse>> Send<TResponse>(
8890
Request request,
91+
JsonSerializerSettings serializerSettings = null,
8992
Dictionary<string, string> headers = null,
9093
string authToken = null,
9194
string authScheme = null,
9295
bool debug = false
9396
)
9497
{
95-
string json = await Send(request, headers, authToken, authScheme, debug);
98+
string json = await Send(request, serializerSettings, headers, authToken, authScheme, debug);
9699
return JsonConvert.DeserializeObject<Response<TResponse>>(json);
97100
}
98101

99102
public async Task<Response<TResponse>> Send<TResponse>(
100103
Func<TResponse> responseTypeResolver,
101104
Request request,
105+
JsonSerializerSettings serializerSettings = null,
102106
Dictionary<string, string> headers = null,
103107
string authToken = null,
104108
string authScheme = null,
105109
bool debug = false)
106110
{
107-
return await Send<TResponse>(request, headers, authToken, authScheme, debug);
111+
return await Send<TResponse>(request, serializerSettings, headers, authToken, authScheme, debug);
108112
}
109113

110114
/// <summary>
@@ -116,6 +120,19 @@ public void RegisterListener(Action<string> listener)
116120
HttpUtils.SubscriptionDataReceived += listener;
117121
}
118122

123+
public void RegisterListener(string id, Action<string> listener)
124+
{
125+
if(!HttpUtils.SubscriptionDataReceivedPerChannel.ContainsKey(id)) {
126+
HttpUtils.SubscriptionDataReceivedPerChannel[id] = null;
127+
}
128+
HttpUtils.SubscriptionDataReceivedPerChannel[id] += listener;
129+
}
130+
131+
public void RegisterListener(Request request, Action<string> listener)
132+
{
133+
RegisterListener(request.Query.ToMurmur2Hash().ToString(), listener);
134+
}
135+
119136
/// <summary>
120137
/// Unregisters a listener for subscriptions.
121138
/// </summary>
@@ -125,6 +142,18 @@ public void UnregisterListener(Action<string> listener)
125142
HttpUtils.SubscriptionDataReceived -= listener;
126143
}
127144

145+
public void UnregisterListener(string id, Action<string> listener)
146+
{
147+
if(HttpUtils.SubscriptionDataReceivedPerChannel.ContainsKey(id)) {
148+
HttpUtils.SubscriptionDataReceivedPerChannel[id] -= listener;
149+
}
150+
}
151+
152+
public void UnregisterListener(Request request, Action<string> listener)
153+
{
154+
UnregisterListener(request.Query.ToMurmur2Hash().ToString(), listener);
155+
}
156+
128157
/// <summary>
129158
/// Subscribe to a query in GraphQL.
130159
/// </summary>

Runtime/SimpleGraphQL/HttpUtils.cs

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ public static class HttpUtils
2424
/// Called when the websocket receives subscription data.
2525
/// </summary>
2626
public static event Action<string> SubscriptionDataReceived;
27-
27+
public static Dictionary<string, Action<string>> SubscriptionDataReceivedPerChannel;
2828
public static HttpClient httpClient;
29+
2930
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
3031
public static void PreInit()
3132
{
3233
_webSocket?.Dispose();
3334
SubscriptionDataReceived = null;
35+
SubscriptionDataReceivedPerChannel = new Dictionary<string, Action<string>>();
3436

3537
// Create a New HttpClient object.
3638
InitializeHttpClient();
@@ -67,6 +69,7 @@ public static void Dispose()
6769
public static async Task<string> PostRequest(
6870
string url,
6971
Request request,
72+
JsonSerializerSettings serializerSettings = null,
7073
Dictionary<string, string> headers = null,
7174
string authToken = null,
7275
string authScheme = null,
@@ -83,6 +86,7 @@ public static async Task<string> PostRequest(
8386
string payload = request.ToJson();
8487

8588
var requestMessage = new HttpRequestMessage();
89+
//byte[] payload = request.ToBytes(serializerSettings);
8690

8791
if (authToken != null)
8892
{
@@ -168,12 +172,23 @@ public static async Task WebSocketConnect(
168172
_webSocket = new ClientWebSocket();
169173
_webSocket.Options.AddSubProtocol(protocol);
170174

171-
if (authToken != null)
172-
{
173-
_webSocket.Options.SetRequestHeader("Authorization", $"{authScheme} {authToken}");
175+
var payload = new Dictionary<string, string>();
176+
177+
if(protocol == "graphql-transport-ws") {
178+
payload["content-type"] = "application/json";
179+
} else {
180+
_webSocket.Options.SetRequestHeader("Content-Type", "application/json");
181+
}
182+
183+
if (authToken != null) {
184+
if(protocol == "graphql-transport-ws") {
185+
// set Authorization as payload
186+
payload["Authorization"] = $"{authScheme} {authToken}";
187+
} else {
188+
_webSocket.Options.SetRequestHeader("Authorization", $"{authScheme} {authToken}");
189+
}
174190
}
175191

176-
_webSocket.Options.SetRequestHeader("Content-Type", "application/json");
177192

178193
if (headers != null)
179194
{
@@ -188,12 +203,23 @@ public static async Task WebSocketConnect(
188203
Debug.Log("Websocket is connecting");
189204
await _webSocket.ConnectAsync(uri, CancellationToken.None);
190205

206+
var json = JsonConvert.SerializeObject(
207+
new
208+
{
209+
type = "connection_init",
210+
payload = payload
211+
},
212+
Formatting.None,
213+
new JsonSerializerSettings
214+
{
215+
NullValueHandling = NullValueHandling.Ignore
216+
}
217+
);
218+
191219
Debug.Log("Websocket is starting");
192220
// Initialize the socket at the server side
193221
await _webSocket.SendAsync(
194-
new ArraySegment<byte>(
195-
Encoding.UTF8.GetBytes(@"{""type"":""connection_init"",""payload"": {}}")
196-
),
222+
new ArraySegment<byte>(Encoding.UTF8.GetBytes(json)),
197223
WebSocketMessageType.Text,
198224
true,
199225
CancellationToken.None
@@ -242,7 +268,7 @@ public static async Task<bool> WebSocketSubscribe(string id, Request request)
242268
new
243269
{
244270
id,
245-
type = "start",
271+
type = _webSocket.SubProtocol == "graphql-transport-ws" ? "subscribe" : "start",
246272
payload = new
247273
{
248274
query = request.Query,
@@ -280,8 +306,10 @@ public static async Task WebSocketUnsubscribe(string id)
280306
return;
281307
}
282308

309+
var type = _webSocket.SubProtocol == "graphql-transport-ws" ? "complete" : "stop";
310+
283311
await _webSocket.SendAsync(
284-
new ArraySegment<byte>(Encoding.UTF8.GetBytes($@"{{""type"":""stop"",""id"":""{id}""}}")),
312+
new ArraySegment<byte>(Encoding.UTF8.GetBytes($@"{{""type"":""{type}"",""id"":""{id}""}}")),
285313
WebSocketMessageType.Text,
286314
true,
287315
CancellationToken.None
@@ -324,17 +352,18 @@ private static async void WebSocketUpdate()
324352
}
325353

326354
var msgType = (string)jsonObj["type"];
355+
var id = (string)jsonObj["id"];
327356
switch (msgType)
328357
{
329358
case "connection_error":
330359
{
331360
throw new WebSocketException("Connection error. Error: " + jsonResult);
332361
}
333362
case "connection_ack":
334-
{
335-
Debug.Log("Websocket connection acknowledged.");
336-
continue;
337-
}
363+
{
364+
Debug.Log($"Websocket connection acknowledged ({id}).");
365+
continue;
366+
}
338367
case "data":
339368
case "next":
340369
{
@@ -380,4 +409,4 @@ await _webSocket.SendAsync(
380409
}
381410
}
382411
}
383-
}
412+
}

Runtime/SimpleGraphQL/Request.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,23 @@ public override string ToString()
2626
[PublicAPI]
2727
public static class RequestExtensions
2828
{
29-
public static byte[] ToBytes(this Request request)
29+
private static JsonSerializerSettings defaultSerializerSettings = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore};
30+
public static byte[] ToBytes(this Request request, JsonSerializerSettings serializerSettings = null)
3031
{
31-
return Encoding.UTF8.GetBytes(request.ToJson());
32+
return Encoding.UTF8.GetBytes(request.ToJson(false, serializerSettings));
3233
}
3334

34-
public static string ToJson(this Request request,
35-
bool prettyPrint = false)
35+
public static string ToJson(this Request request, bool prettyPrint = false, JsonSerializerSettings serializerSettings = null)
3636
{
37+
if (serializerSettings == null)
38+
{
39+
serializerSettings = defaultSerializerSettings;
40+
}
41+
3742
return JsonConvert.SerializeObject
3843
( request,
3944
prettyPrint ? Formatting.Indented : Formatting.None,
40-
new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}
45+
serializerSettings
4146
);
4247
}
4348
}

0 commit comments

Comments
 (0)