12
12
using Flow . Launcher . Infrastructure . Logger ;
13
13
using Flow . Launcher . Plugin ;
14
14
using JetBrains . Annotations ;
15
+ using Microsoft . IO ;
15
16
16
17
namespace Flow . Launcher . Core . Plugin
17
18
{
@@ -33,9 +34,11 @@ internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu
33
34
protected abstract string ExecuteCallback ( JsonRPCRequestModel rpcRequest ) ;
34
35
protected abstract string ExecuteContextMenu ( Result selectedResult ) ;
35
36
37
+ private static readonly RecyclableMemoryStreamManager BufferManager = new ( ) ;
38
+
36
39
public List < Result > LoadContextMenus ( Result selectedResult )
37
40
{
38
- string output = ExecuteContextMenu ( selectedResult ) ;
41
+ var output = ExecuteContextMenu ( selectedResult ) ;
39
42
try
40
43
{
41
44
return DeserializedResult ( output ) ;
@@ -61,12 +64,23 @@ private async Task<List<Result>> DeserializedResultAsync(Stream output)
61
64
{
62
65
if ( output == Stream . Null ) return null ;
63
66
64
- var queryResponseModel = await
65
- JsonSerializer . DeserializeAsync < JsonRPCQueryResponseModel > ( output , options ) ;
67
+ try
68
+ {
69
+ var queryResponseModel =
70
+ await JsonSerializer . DeserializeAsync < JsonRPCQueryResponseModel > ( output , options ) ;
66
71
67
- await output . DisposeAsync ( ) ;
68
-
69
- return ParseResults ( queryResponseModel ) ;
72
+ return ParseResults ( queryResponseModel ) ;
73
+ }
74
+ catch ( JsonException e )
75
+ {
76
+ Log . Exception ( GetType ( ) . FullName , "Unexpected Json Input" , e ) ;
77
+ }
78
+ finally
79
+ {
80
+ await output . DisposeAsync ( ) ;
81
+ }
82
+
83
+ return null ;
70
84
}
71
85
72
86
private List < Result > DeserializedResult ( string output )
@@ -81,15 +95,14 @@ private List<Result> DeserializedResult(string output)
81
95
82
96
private List < Result > ParseResults ( JsonRPCQueryResponseModel queryResponseModel )
83
97
{
84
- var results = new List < Result > ( ) ;
85
98
if ( queryResponseModel . Result == null ) return null ;
86
99
87
100
if ( ! string . IsNullOrEmpty ( queryResponseModel . DebugMessage ) )
88
101
{
89
102
context . API . ShowMsg ( queryResponseModel . DebugMessage ) ;
90
103
}
91
104
92
- foreach ( JsonRPCResult result in queryResponseModel . Result )
105
+ foreach ( var result in queryResponseModel . Result )
93
106
{
94
107
result . Action = c =>
95
108
{
@@ -114,7 +127,8 @@ private List<Result> ParseResults(JsonRPCQueryResponseModel queryResponseModel)
114
127
return ! result . JsonRPCAction . DontHideAfterAction ;
115
128
}
116
129
117
- var jsonRpcRequestModel = JsonSerializer . Deserialize < JsonRPCRequestModel > ( actionResponse , options ) ;
130
+ var jsonRpcRequestModel =
131
+ JsonSerializer . Deserialize < JsonRPCRequestModel > ( actionResponse , options ) ;
118
132
119
133
if ( jsonRpcRequestModel ? . Method ? . StartsWith ( "Flow.Launcher." ) ?? false )
120
134
{
@@ -125,9 +139,12 @@ private List<Result> ParseResults(JsonRPCQueryResponseModel queryResponseModel)
125
139
126
140
return ! result . JsonRPCAction . DontHideAfterAction ;
127
141
} ;
128
- results . Add ( result ) ;
129
142
}
130
143
144
+ var results = new List < Result > ( ) ;
145
+
146
+ results . AddRange ( queryResponseModel . Result ) ;
147
+
131
148
return results ;
132
149
}
133
150
@@ -226,7 +243,21 @@ protected async Task<Stream> ExecuteAsync(ProcessStartInfo startInfo, Cancellati
226
243
return Stream . Null ;
227
244
}
228
245
229
- var result = process . StandardOutput . BaseStream ;
246
+ var source = process . StandardOutput . BaseStream ;
247
+
248
+ var buffer = BufferManager . GetStream ( ) ;
249
+
250
+ try
251
+ {
252
+ await source . CopyToAsync ( buffer , token ) ;
253
+ }
254
+ catch ( OperationCanceledException )
255
+ {
256
+ await buffer . DisposeAsync ( ) ;
257
+ throw ;
258
+ }
259
+
260
+ buffer . Seek ( 0 , SeekOrigin . Begin ) ;
230
261
231
262
token . ThrowIfCancellationRequested ( ) ;
232
263
@@ -245,7 +276,7 @@ protected async Task<Stream> ExecuteAsync(ProcessStartInfo startInfo, Cancellati
245
276
return Stream . Null ;
246
277
}
247
278
248
- return result ;
279
+ return buffer ;
249
280
}
250
281
catch ( Exception e )
251
282
{
0 commit comments