@@ -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