Skip to content

Commit 5f16430

Browse files
Close websocket connection
1 parent 82b1c5a commit 5f16430

File tree

1 file changed

+43
-38
lines changed

1 file changed

+43
-38
lines changed

src/WebSocket/XrplWebSocket.cs

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public XrplWebSocket(ILogger logger)
5353
{
5454
var source = new CancellationTokenSource(TimeSpan.FromSeconds(30));
5555
source.Token.ThrowIfCancellationRequested();
56-
56+
5757
using var webSocket = new ClientWebSocket();
5858
await webSocket.ConnectAsync(XummDefaults.WebSocket.Cluster, source.Token);
5959

@@ -136,6 +136,11 @@ public XrplWebSocket(ILogger logger)
136136
}
137137
}
138138

139+
if (webSocket.State == WebSocketState.Open)
140+
{
141+
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Finished fetching paths", source.Token);
142+
}
143+
139144
return (destinationAmount, paths);
140145
}
141146
catch (Exception ex)
@@ -150,13 +155,28 @@ public async Task<List<AccountTrustLine>> GetAccountTrustLines(string account, b
150155
var result = new List<AccountTrustLine>();
151156
try
152157
{
158+
var source = new CancellationTokenSource(TimeSpan.FromSeconds(30));
159+
source.Token.ThrowIfCancellationRequested();
160+
161+
using var webSocket = new ClientWebSocket();
162+
await webSocket.ConnectAsync(XummDefaults.WebSocket.Cluster, source.Token);
163+
if (webSocket.State != WebSocketState.Open)
164+
{
165+
return result;
166+
}
167+
153168
object marker = null;
154169
do
155170
{
156-
var accountLines = await GetAccountLinesAsync(account, marker);
171+
var accountLines = await GetAccountLinesAsync(webSocket, source.Token, account, marker);
157172
result.AddRange(accountLines.TrustLines);
158173
marker = accountLines.Marker;
159174
} while (marker != null);
175+
176+
if (webSocket.State == WebSocketState.Open)
177+
{
178+
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Finished fetching account lines", source.Token);
179+
}
160180
}
161181
catch (Exception ex)
162182
{
@@ -171,7 +191,7 @@ public async Task<List<AccountTrustLine>> GetAccountTrustLines(string account, b
171191
return result;
172192
}
173193

174-
private async Task<AccountLines> GetAccountLinesAsync(string account, object marker = null)
194+
private async Task<AccountLines> GetAccountLinesAsync(ClientWebSocket webSocket, CancellationToken cancellationToken, string account, object marker = null)
175195
{
176196
try
177197
{
@@ -181,49 +201,34 @@ private async Task<AccountLines> GetAccountLinesAsync(string account, object mar
181201
Marker = marker
182202
};
183203

184-
return await SendMessageAsync<AccountLines>(XummDefaults.WebSocket.Cluster, request, CancellationToken.None);
185-
}
186-
catch (Exception ex)
187-
{
188-
await _logger.ErrorAsync($"{XummDefaults.SystemName}: Failed to retrieve account lines of {account}.", ex);
189-
throw;
190-
}
191-
}
192-
193-
private async Task<T> SendMessageAsync<T>(Uri uri, object request, CancellationToken cancellationToken) where T : class
194-
{
195-
cancellationToken.ThrowIfCancellationRequested();
196-
197-
using var webSocket = new ClientWebSocket();
198-
await webSocket.ConnectAsync(uri, cancellationToken);
204+
await SendMessageAsync(webSocket, request);
199205

200-
if (webSocket.State != WebSocketState.Open)
201-
{
202-
return null;
203-
}
206+
var buffer = new ArraySegment<byte>(new byte[CHUNK_SIZE]);
204207

205-
await SendMessageAsync(webSocket, request);
208+
await using var ms = new MemoryStream();
206209

207-
var buffer = new ArraySegment<byte>(new byte[CHUNK_SIZE]);
208-
209-
await using var ms = new MemoryStream();
210+
WebSocketReceiveResult result;
211+
do
212+
{
213+
result = await webSocket.ReceiveAsync(buffer, cancellationToken);
214+
ms.Write(buffer.Array!, buffer.Offset, result.Count);
215+
} while (!result.EndOfMessage && !cancellationToken.IsCancellationRequested);
210216

211-
WebSocketReceiveResult result;
212-
do
213-
{
214-
result = await webSocket.ReceiveAsync(buffer, cancellationToken);
215-
ms.Write(buffer.Array!, buffer.Offset, result.Count);
216-
} while (!result.EndOfMessage && !cancellationToken.IsCancellationRequested);
217+
ms.Seek(0, SeekOrigin.Begin);
217218

218-
ms.Seek(0, SeekOrigin.Begin);
219+
var response = JsonSerializer.Deserialize<XrplResponse>(ms)!;
220+
if (response.Status == "error")
221+
{
222+
throw new Exception(response.Error);
223+
}
219224

220-
var response = JsonSerializer.Deserialize<XrplResponse>(ms)!;
221-
if (response.Status == "error")
225+
return JsonSerializer.Deserialize<AccountLines>(response.Result.ToString()!);
226+
}
227+
catch (Exception ex)
222228
{
223-
throw new Exception(response.Error);
229+
await _logger.ErrorAsync($"{XummDefaults.SystemName}: Failed to retrieve account lines of {account}.", ex);
230+
throw;
224231
}
225-
226-
return JsonSerializer.Deserialize<T>(response.Result.ToString()!);
227232
}
228233

229234
private async Task SendMessageAsync(ClientWebSocket clientWebSocket, object request)

0 commit comments

Comments
 (0)