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