@@ -149,7 +149,6 @@ void IRSocketProtocol.Payload(in RSocketProtocol.Payload message, ReadOnlySequen
149
149
//Console.WriteLine($"{value.Header.Stream:0000}===>{Encoding.UTF8.GetString(value.Data.ToArray())}");
150
150
if ( Dispatcher . TryGetValue ( message . Stream , out var transform ) )
151
151
{
152
- //TODO FIXIE!
153
152
if ( message . IsNext ) { transform . OnNext ( ( metadata , data ) ) ; }
154
153
if ( message . IsComplete ) { transform . OnCompleted ( ) ; }
155
154
}
@@ -159,23 +158,51 @@ void IRSocketProtocol.Payload(in RSocketProtocol.Payload message, ReadOnlySequen
159
158
}
160
159
}
161
160
161
+ //void Schedule(Task task)
162
+ //{
163
+ // //if (!task.IsCompleted) { task.Start(); } //FUTURE Someday might want to schedule these in a different pool or perhaps track all in-flight tasks.
164
+ //}
165
+
166
+ void Schedule ( int stream , Func < int , CancellationToken , Task > operation , CancellationToken cancel = default )
167
+ {
168
+ var task = operation ( stream , cancel ) ;
169
+ if ( ! task . IsCompleted ) { task . ConfigureAwait ( false ) ; } //FUTURE Someday might want to schedule these in a different pool or perhaps track all in-flight tasks.
170
+ }
171
+
162
172
163
173
//void IRSocketProtocol.Setup(in RSocketProtocol.Setup message) => Setup(message);
164
174
public virtual void Setup ( in RSocketProtocol . Setup value ) => throw new InvalidOperationException ( $ "Client cannot process Setup frames") ; //TODO This exception just stalls processing. Need to make sure it's handled.
165
175
void IRSocketProtocol . Error ( in RSocketProtocol . Error message ) { throw new NotImplementedException ( ) ; } //TODO Handle Errors!
166
176
void IRSocketProtocol . RequestFireAndForget ( in RSocketProtocol . RequestFireAndForget message , ReadOnlySequence < byte > metadata , ReadOnlySequence < byte > data ) => throw new NotImplementedException ( ) ;
167
177
168
- public Func < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) , Task < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) > > Responder { get ; set ; } = request => throw new NotImplementedException ( ) ;
178
+
179
+ public void Respond < TRequest , TResult > (
180
+ Func < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) , TRequest > requestTransform ,
181
+ Func < TRequest , IAsyncEnumerable < TResult > > producer ,
182
+ Func < TResult , ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) > resultTransform ) =>
183
+ Responder = ( request ) => ( from result in producer ( requestTransform ( request ) ) select resultTransform ( result ) ) . FirstAsync ( ) ;
184
+
185
+ public Func < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) , ValueTask < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) > > Responder { get ; set ; } = request => throw new NotImplementedException ( ) ;
169
186
170
187
void IRSocketProtocol . RequestResponse ( in RSocketProtocol . RequestResponse message , ReadOnlySequence < byte > metadata , ReadOnlySequence < byte > data )
171
188
{
172
- Respond ( message . Stream ) . Start ( ) ;
173
- async Task Respond ( int stream )
189
+ Schedule ( message . Stream , async ( stream , cancel ) =>
174
190
{
175
- var ( Data , Metadata ) = await Responder ( ( data , metadata ) ) ; //TODO Handle Errors.
176
- new RSocketProtocol . Payload ( stream , Data , Metadata , next : true , complete : true ) . Write ( Transport . Output , Data , Metadata ) ;
177
- await Transport . Output . FlushAsync ( ) ;
178
- }
191
+ var value = await Responder ( ( data , metadata ) ) ; //TODO Handle Errors.
192
+ await new RSocketProtocol . Payload ( stream , value . Data , value . Metadata , next : true , complete : true ) . WriteFlush ( Transport . Output , value . Data , value . Metadata ) ;
193
+ } ) ;
194
+ //async Task Respond(int stream)
195
+ //{
196
+ // var value = await Responder((data, metadata)); //TODO Handle Errors.
197
+ // await new RSocketProtocol.Payload(stream, value.Data, value.Metadata, next: true).WriteFlush(Transport.Output, value.Data, value.Metadata);
198
+ //}
199
+
200
+ //ScheduleTask(Respond(message.Stream));
201
+ //async Task Respond(int stream)
202
+ //{
203
+ // var value = await Responder((data, metadata)); //TODO Handle Errors.
204
+ // await new RSocketProtocol.Payload(stream, value.Data, value.Metadata, next: true).WriteFlush(Transport.Output, value.Data, value.Metadata);
205
+ //}
179
206
}
180
207
181
208
@@ -185,60 +212,30 @@ public void Stream<TRequest, TResult>(
185
212
Func < TResult , ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) > resultTransform ) =>
186
213
Streamer = ( request ) => from result in producer ( requestTransform ( request ) ) select resultTransform ( result ) ;
187
214
188
- public Func < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) , IAsyncEnumerable < ( ReadOnlySequence < byte > data , ReadOnlySequence < byte > metadata ) > > Streamer { get ; set ; } = request => throw new NotImplementedException ( ) ;
215
+ public Func < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) , IAsyncEnumerable < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) > > Streamer { get ; set ; } = request => throw new NotImplementedException ( ) ;
189
216
190
217
void IRSocketProtocol . RequestStream ( in RSocketProtocol . RequestStream message , ReadOnlySequence < byte > metadata , ReadOnlySequence < byte > data )
191
218
{
192
- Stream ( message . Stream ) . Start ( ) ;
193
- async Task Stream ( int stream )
219
+ Schedule ( message . Stream , async ( stream , cancel ) =>
194
220
{
195
221
var source = Streamer ( ( data , metadata ) ) ; //TODO Handle Errors.
196
222
await ForEach ( source ,
197
- action : value => new RSocketProtocol . Payload ( stream , value . data , value . metadata , next : true ) . WriteFlush ( Transport . Output , value . data , value . metadata ) ,
223
+ action : value => new RSocketProtocol . Payload ( stream , value . Data , value . Metadata , next : true ) . WriteFlush ( Transport . Output , value . Data , value . Metadata ) ,
198
224
final : ( ) => new RSocketProtocol . Payload ( stream , complete : true ) . WriteFlush ( Transport . Output ) ) ;
199
-
200
- //var source = Streamer((data, metadata)); //TODO Handle Errors.
201
- //var enumerator = source.GetAsyncEnumerator();
202
- //try
203
- //{
204
- // while (await enumerator.MoveNextAsync())
205
- // {
206
- // var (Data, Metadata) = enumerator.Current;
207
- // new RSocketProtocol.Payload(stream, Data, Metadata, next: true).Write(Transport.Output, Data, Metadata);
208
- // await Transport.Output.FlushAsync();
209
- // }
210
- // new RSocketProtocol.Payload(stream, complete: true).Write(Transport.Output);
211
- // await Transport.Output.FlushAsync();
212
- //}
213
- //finally { await enumerator.DisposeAsync(); }
214
- }
225
+ } ) ;
226
+
227
+ //Schedule(Stream(message.Stream));
228
+ //async Task Stream(int stream)
229
+ //{
230
+ // var source = Streamer((data, metadata)); //TODO Handle Errors.
231
+ // await ForEach(source,
232
+ // action: value => new RSocketProtocol.Payload(stream, value.Data, value.Metadata, next: true).WriteFlush(Transport.Output, value.Data, value.Metadata),
233
+ // final: () => new RSocketProtocol.Payload(stream, complete: true).WriteFlush(Transport.Output));
234
+ //}
215
235
}
216
236
217
237
218
- //public void Channel<TSource, TResult>(Func<(ReadOnlySequence<byte> Data, ReadOnlySequence<byte> Metadata),
219
- // (IAsyncEnumerable<(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata)> Incoming,
220
- // IAsyncEnumerable<(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata)> Outgoing)>
221
-
222
-
223
- // Func<TSource, (ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata)> outgoingMapper,
224
- // Func<(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata), TResult> incomingMapper)
225
- //{
226
- // var observable = Observable.Create<(ReadOnlySequence<byte> metadata, ReadOnlySequence<byte> data)>(observer => {
227
- // Subscriber(observer).ConfigureAwait(false);
228
- // });
229
- // return observable
230
- // .Select(value => Mapper((value.data, value.metadata)))
231
- // .ToAsyncEnumerable()
232
-
233
- // .GetAsyncEnumerator(cancellation);
234
-
235
- // var receiver = new Receiver<TResult>(stream => Task.CompletedTask, incomingMapper);
236
-
237
- // Channeler = request =>
238
- // (
239
- // receiver,
240
- // );
241
- //}
238
+ //TODO, probably need to have an IAE<T> pipeline overload too.
242
239
243
240
public void Channel < TRequest , TIncoming , TOutgoing > ( Func < TRequest , IObservable < TIncoming > , IAsyncEnumerable < TOutgoing > > pipeline ,
244
241
Func < ( ReadOnlySequence < byte > Data , ReadOnlySequence < byte > Metadata ) , TRequest > requestTransform ,
@@ -252,66 +249,26 @@ public void Channel<TRequest, TIncoming, TOutgoing>(Func<TRequest, IObservable<T
252
249
253
250
void IRSocketProtocol . RequestChannel ( in RSocketProtocol . RequestChannel message , ReadOnlySequence < byte > metadata , ReadOnlySequence < byte > data )
254
251
{
255
- Channel ( message . Stream ) . Start ( ) ;
256
- async Task Channel ( int stream , CancellationToken cancel = default )
252
+ Schedule ( message . Stream , async ( stream , cancel ) =>
257
253
{
258
- //TODO Elsewhere in previous changes, bad Disposable.Empty
259
254
var inc = Observable . Create < ( ReadOnlySequence < byte > metadata , ReadOnlySequence < byte > data ) > ( observer => ( ) => StreamDispatch ( stream , observer ) ) ;
260
255
var outgoing = Channeler ( ( data , metadata ) , inc ) ; //TODO Handle Errors.
261
256
262
257
await ForEach ( outgoing ,
263
258
action : value => new RSocketProtocol . Payload ( stream , value . data , value . metadata , next : true ) . WriteFlush ( Transport . Output , value . data , value . metadata ) ,
264
259
final : ( ) => new RSocketProtocol . Payload ( stream , complete : true ) . WriteFlush ( Transport . Output ) ) ;
265
-
266
- //var outgoingstream = ForEach(outgoing,
267
- // action: value => new RSocketProtocol.Payload(stream, value.data, value.metadata, next: true).WriteFlush(Transport.Output, value.data, value.metadata),
268
- // final: () => new RSocketProtocol.Payload(stream, complete: true).WriteFlush(Transport.Output));
269
-
270
- //var enumerator = outgoing.GetAsyncEnumerator();
271
- //try
272
- //{
273
- // while (await enumerator.MoveNextAsync())
274
- // {
275
- // var (Data, Metadata) = enumerator.Current;
276
- // new RSocketProtocol.Payload(stream, Data, Metadata, next: true).Write(Transport.Output, Data, Metadata);
277
- // await Transport.Output.FlushAsync();
278
- // }
279
- // new RSocketProtocol.Payload(stream, complete: true).Write(Transport.Output);
280
- // await Transport.Output.FlushAsync();
281
- //}
282
- //finally { await enumerator.DisposeAsync(); }
283
- }
284
-
285
-
286
- // Channel(message.Stream).Start();
287
-
288
- // //new Receiver<bool>()
289
-
290
- // //new Receiver<bool>(stream => RequestFireAndForget(stream, data, metadata), _ => true).ExecuteAsync(result: true);
291
- // //var id = StreamDispatch(stream);
292
-
293
- // async Task Channel(int stream)
294
- // {
295
- // var (Incoming, Outoing) = Channeler((data, metadata)); //TODO Handle Errors.
296
-
297
-
298
- // using (observable.Subscribe())
299
- // {
300
- // var enumerator = source.GetAsyncEnumerator();
301
- // try
302
- // {
303
- // while (await enumerator.MoveNextAsync())
304
- // {
305
- // var (Data, Metadata) = enumerator.Current;
306
- // new RSocketProtocol.Payload(stream, Data, Metadata, next: true).Write(Transport.Output, Data, Metadata);
307
- // await Transport.Output.FlushAsync();
308
- // }
309
- // new RSocketProtocol.Payload(stream, complete: true).Write(Transport.Output);
310
- // await Transport.Output.FlushAsync();
311
- // }
312
- // finally { await enumerator.DisposeAsync(); }
313
- // }
314
- // }
260
+ } ) ;
261
+ //Schedule(Channel(message.Stream));
262
+ //async Task Channel(int stream, CancellationToken cancel = default)
263
+ //{
264
+ // //TODO Elsewhere in previous changes, bad Disposable.Empty
265
+ // var inc = Observable.Create<(ReadOnlySequence<byte> metadata, ReadOnlySequence<byte> data)>(observer => () => StreamDispatch(stream, observer));
266
+ // var outgoing = Channeler((data, metadata), inc); //TODO Handle Errors.
267
+
268
+ // await ForEach(outgoing,
269
+ // action: value => new RSocketProtocol.Payload(stream, value.data, value.metadata, next: true).WriteFlush(Transport.Output, value.data, value.metadata),
270
+ // final: () => new RSocketProtocol.Payload(stream, complete: true).WriteFlush(Transport.Output));
271
+ //}
315
272
}
316
273
317
274
internal static async Task ForEach < TSource > ( IAsyncEnumerable < TSource > source , Func < TSource , Task > action , CancellationToken cancel = default , Func < Task > final = default )
0 commit comments