@@ -19,15 +19,14 @@ package io.rsocket.kotlin.internal.flow
19
19
import io.rsocket.kotlin.*
20
20
import io.rsocket.kotlin.frame.*
21
21
import io.rsocket.kotlin.internal.*
22
- import io.rsocket.kotlin.internal.cancelConsumed
23
22
import io.rsocket.kotlin.payload.*
24
23
import kotlinx.atomicfu.*
25
24
import kotlinx.coroutines.*
26
- import kotlinx.coroutines.channels.*
27
25
import kotlinx.coroutines.flow.*
28
26
29
- @OptIn(ExperimentalStreamsApi ::class )
27
+ @OptIn(ExperimentalStreamsApi ::class , ExperimentalCoroutinesApi :: class )
30
28
internal class RequestChannelRequesterFlow (
29
+ private val initPayload : Payload ,
31
30
private val payloads : Flow <Payload >,
32
31
private val requester : RSocketRequester ,
33
32
private val state : RSocketState ,
@@ -40,31 +39,25 @@ internal class RequestChannelRequesterFlow(
40
39
41
40
val strategy = currentCoroutineContext().requestStrategy()
42
41
val initialRequest = strategy.firstRequest()
43
- val streamId = requester.createStream()
44
- val receiverDeferred = CompletableDeferred <ReceiveChannel <RequestFrame >? > ()
45
- val request = launchCancelable(streamId) {
46
- payloads.collectLimiting(
47
- streamId,
48
- RequestChannelRequesterFlowCollector (state, streamId, receiverDeferred, initialRequest)
49
- )
50
- if (receiverDeferred.isCompleted && ! receiverDeferred.isCancelled) send(CompletePayloadFrame (streamId))
51
- }
52
- request.invokeOnCompletion {
53
- if (receiverDeferred.isCompleted) {
54
- @OptIn(ExperimentalCoroutinesApi ::class )
55
- if (it != null && it !is CancellationException ) receiverDeferred.getCompleted()?.cancelConsumed(it)
56
- } else {
57
- if (it == null ) receiverDeferred.complete(null )
58
- else receiverDeferred.completeExceptionally(it.cause ? : it)
42
+ initPayload.closeOnError {
43
+ val streamId = requester.createStream()
44
+ val receiver = createReceiverFor(streamId)
45
+ val request = launchCancelable(streamId) {
46
+ payloads.collectLimiting(streamId, 0 ) {
47
+ send(RequestChannelFrame (streamId, initialRequest, initPayload))
48
+ }
49
+ }
50
+
51
+ request.invokeOnCompletion {
52
+ if (it != null && it !is CancellationException ) receiver.cancelConsumed(it)
53
+ }
54
+ try {
55
+ collectStream(streamId, receiver, strategy, collector)
56
+ } catch (e: Throwable ) {
57
+ if (e is CancellationException ) request.cancel(e)
58
+ else request.cancel(" Receiver failed" , e)
59
+ throw e
59
60
}
60
- }
61
- try {
62
- val receiver = receiverDeferred.await() ? : return
63
- collectStream(streamId, receiver, strategy, collector)
64
- } catch (e: Throwable ) {
65
- if (e is CancellationException ) request.cancel(e)
66
- else request.cancel(" Receiver failed" , e)
67
- throw e
68
61
}
69
62
}
70
63
}
0 commit comments