37
37
import io .rsocket .frame .RequestResponseFrameFlyweight ;
38
38
import io .rsocket .frame .RequestStreamFrameFlyweight ;
39
39
import io .rsocket .frame .decoder .PayloadDecoder ;
40
- import io .rsocket .internal .FluxSwitchOnFirst ;
41
- import io .rsocket .internal .RateLimitableRequestSubscriber ;
42
40
import io .rsocket .internal .SynchronizedIntObjectHashMap ;
43
41
import io .rsocket .internal .UnboundedProcessor ;
44
42
import io .rsocket .internal .UnicastMonoEmpty ;
60
58
import org .reactivestreams .Publisher ;
61
59
import org .reactivestreams .Subscriber ;
62
60
import org .reactivestreams .Subscription ;
61
+ import reactor .core .publisher .BaseSubscriber ;
63
62
import reactor .core .publisher .Flux ;
64
63
import reactor .core .publisher .Mono ;
65
64
import reactor .core .publisher .SignalType ;
@@ -83,7 +82,7 @@ class RSocketRequester implements RSocket {
83
82
private final PayloadDecoder payloadDecoder ;
84
83
private final Consumer <Throwable > errorConsumer ;
85
84
private final StreamIdSupplier streamIdSupplier ;
86
- private final IntObjectMap <RateLimitableRequestSubscriber > senders ;
85
+ private final IntObjectMap <Subscription > senders ;
87
86
private final IntObjectMap <Processor <Payload , Payload >> receivers ;
88
87
private final UnboundedProcessor <ByteBuf > sendProcessor ;
89
88
private final RequesterLeaseHandler leaseHandler ;
@@ -262,7 +261,6 @@ private Flux<Payload> handleRequestStream(final Payload payload) {
262
261
receivers .put (streamId , receiver );
263
262
264
263
return receiver
265
- .log ()
266
264
.doOnRequest (
267
265
new LongConsumer () {
268
266
@@ -312,29 +310,31 @@ private Flux<Payload> handleChannel(Flux<Payload> request) {
312
310
return Flux .error (err );
313
311
}
314
312
315
- return request .transform (
316
- f ->
317
- new FluxSwitchOnFirst <>(
318
- f ,
319
- (s , flux ) -> {
320
- Payload payload = s .get ();
321
- if (payload != null ) {
322
- return handleChannel (flux , payload );
323
- } else {
324
- return flux ;
325
- }
326
- },
327
- false ));
313
+ return request .switchOnFirst (
314
+ (s , flux ) -> {
315
+ Payload payload = s .get ();
316
+ if (payload != null ) {
317
+ return handleChannel (payload , flux .skip (1 ));
318
+ } else {
319
+ return flux ;
320
+ }
321
+ },
322
+ false );
328
323
}
329
324
330
- private Flux <? extends Payload > handleChannel (Flux < Payload > inboundFlux , Payload initialPayload ) {
325
+ private Flux <? extends Payload > handleChannel (Payload initialPayload , Flux < Payload > inboundFlux ) {
331
326
final UnboundedProcessor <ByteBuf > sendProcessor = this .sendProcessor ;
332
327
final AtomicBoolean payloadReleasedFlag = new AtomicBoolean (false );
333
328
final int streamId = streamIdSupplier .nextStreamId (receivers );
334
329
335
330
final UnicastProcessor <Payload > receiver = UnicastProcessor .create ();
336
- final RateLimitableRequestSubscriber <Payload > upstreamSubscriber =
337
- new RateLimitableRequestSubscriber <Payload >(Queues .SMALL_BUFFER_SIZE ) {
331
+ final BaseSubscriber <Payload > upstreamSubscriber =
332
+ new BaseSubscriber <Payload >() {
333
+
334
+ @ Override
335
+ protected void hookOnSubscribe (Subscription subscription ) {
336
+ // noops
337
+ }
338
338
339
339
@ Override
340
340
protected void hookOnNext (Payload payload ) {
@@ -355,7 +355,7 @@ protected void hookOnComplete() {
355
355
protected void hookOnError (Throwable t ) {
356
356
ByteBuf frame = ErrorFrameFlyweight .encode (allocator , streamId , t );
357
357
sendProcessor .onNext (frame );
358
- receiver .dispose ( );
358
+ receiver .onError ( t );
359
359
}
360
360
361
361
@ Override
@@ -377,21 +377,20 @@ public void accept(long n) {
377
377
senders .put (streamId , upstreamSubscriber );
378
378
receivers .put (streamId , receiver );
379
379
380
- inboundFlux .subscribe (upstreamSubscriber );
381
-
382
- ByteBuf frame =
383
- RequestChannelFrameFlyweight .encode (
384
- allocator ,
385
- streamId ,
386
- false ,
387
- false ,
388
- n ,
389
- initialPayload .sliceMetadata ().retain (),
390
- initialPayload .sliceData ().retain ());
391
-
392
- sendProcessor .onNext (frame );
393
-
380
+ inboundFlux .limitRate (Queues .SMALL_BUFFER_SIZE ).subscribe (upstreamSubscriber );
394
381
if (!payloadReleasedFlag .getAndSet (true )) {
382
+ ByteBuf frame =
383
+ RequestChannelFrameFlyweight .encode (
384
+ allocator ,
385
+ streamId ,
386
+ false ,
387
+ false ,
388
+ n ,
389
+ initialPayload .sliceMetadata ().retain (),
390
+ initialPayload .sliceData ().retain ());
391
+
392
+ sendProcessor .onNext (frame );
393
+
395
394
initialPayload .release ();
396
395
}
397
396
} else {
@@ -405,16 +404,15 @@ public void accept(long n) {
405
404
upstreamSubscriber .cancel ();
406
405
}
407
406
})
407
+ .doOnComplete (() -> receivers .remove (streamId , receiver ))
408
408
.doOnCancel (
409
409
() -> {
410
410
if (!payloadReleasedFlag .getAndSet (true )) {
411
411
initialPayload .release ();
412
412
}
413
- if (contains (streamId )) {
413
+ if (receivers . remove (streamId , receiver )) {
414
414
sendProcessor .onNext (CancelFrameFlyweight .encode (allocator , streamId ));
415
- if (receivers .remove (streamId , receiver )) {
416
- upstreamSubscriber .cancel ();
417
- }
415
+ upstreamSubscriber .cancel ();
418
416
}
419
417
});
420
418
}
0 commit comments