Skip to content

Commit a7616f0

Browse files
committed
Merge branch 'release/0.9.8'
2 parents 34653b4 + 909e365 commit a7616f0

File tree

9 files changed

+163
-106
lines changed

9 files changed

+163
-106
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ It enables following symmetric interaction models:
1313
* channel (bi-directional streams)
1414
* per-stream and per-RSocket metadata
1515

16+
#### RPC style interactions support is provided by [RSOCKET RPC - KOTLIN](https://github.com/rsocket/rsocket-rpc-kotlin)
17+
1618
## Build and Binaries
1719

1820
```groovy

build.gradle

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@ subprojects {
4141
api 'io.netty:netty-buffer'
4242
api 'io.reactivex.rxjava2:rxjava'
4343
api 'org.jetbrains.kotlin:kotlin-stdlib-jdk7'
44+
api 'org.slf4j:slf4j-api'
45+
4446
compileOnly 'com.google.code.findbugs:jsr305'
4547

46-
testImplementation 'org.slf4j:slf4j-api'
4748
testImplementation 'junit:junit'
4849
testImplementation 'org.mockito:mockito-core'
4950
testImplementation 'org.hamcrest:hamcrest-library'

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#
1616

1717
group=io.rsocket.kotlin
18-
version=0.9.7
18+
version=0.9.8
1919

2020
buildScanPluginVersion=2.4.1
2121
dependencyManagementPluginVersion=1.0.8.RELEASE

rsocket-core/gradle/dependency-locks/compileClasspath.lockfile

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50
1010
org.jetbrains.kotlin:kotlin-stdlib:1.3.50
1111
org.jetbrains:annotations:13.0
1212
org.reactivestreams:reactive-streams:1.0.2
13+
org.slf4j:slf4j-api:1.7.28

rsocket-core/src/main/kotlin/io/rsocket/kotlin/internal/RSocketRequester.kt

+29-40
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import io.reactivex.processors.UnicastProcessor
2323
import io.rsocket.kotlin.*
2424
import io.rsocket.kotlin.exceptions.ApplicationException
2525
import io.rsocket.kotlin.exceptions.ChannelRequestException
26+
import io.rsocket.kotlin.internal.util.reactiveStreamsRequestN
2627
import org.reactivestreams.Publisher
2728
import org.reactivestreams.Subscriber
2829
import org.reactivestreams.Subscription
@@ -121,10 +122,11 @@ internal class RSocketRequester(
121122
val streamId = streamIds.nextStreamId(receivers)
122123
val receiver = StreamReceiver.create()
123124
receivers[streamId] = receiver
124-
val reqN = Cond()
125+
var isFirstRequestN = true
125126

126127
receiver.doOnRequestIfActive { requestN ->
127-
val frame = if (reqN.first()) {
128+
val frame = if (isFirstRequestN) {
129+
isFirstRequestN = false
128130
Frame.Request.from(
129131
streamId,
130132
FrameType.REQUEST_STREAM,
@@ -148,35 +150,37 @@ internal class RSocketRequester(
148150
return Flowable.defer {
149151
val receiver = StreamReceiver.create()
150152
val streamId = streamIds.nextStreamId(receivers)
151-
val reqN = Cond()
153+
var firstReqN = true
154+
var firstReqPayload = true
152155

153156
receiver.doOnRequestIfActive { requestN ->
154157

155-
if (reqN.first()) {
156-
val wrappedRequest = request.compose {
157-
val sender = RequestingPublisher.wrap(it)
158-
sender.request(1)
159-
senders[streamId] = sender
160-
receivers[streamId] = receiver
161-
sender
162-
}.publish().autoConnect(2)
158+
if (firstReqN) {
159+
firstReqN = false
163160

164-
val first = wrappedRequest.take(1)
165-
.map { payload ->
166-
Frame.Request.from(
167-
streamId,
168-
FrameType.REQUEST_CHANNEL,
169-
payload,
170-
requestN)
161+
val requestFrames = request
162+
.compose {
163+
val sender = RequestingPublisher.wrap(it)
164+
sender.request(1)
165+
senders[streamId] = sender
166+
receivers[streamId] = receiver
167+
sender
171168
}
172-
val rest = wrappedRequest.skip(1)
173169
.map { payload ->
174-
Frame.PayloadFrame.from(
175-
streamId,
176-
FrameType.NEXT,
177-
payload)
170+
if (firstReqPayload) {
171+
firstReqPayload = false
172+
Frame.Request.from(
173+
streamId,
174+
FrameType.REQUEST_CHANNEL,
175+
payload,
176+
requestN)
177+
} else {
178+
Frame.PayloadFrame.from(
179+
streamId,
180+
FrameType.NEXT,
181+
payload)
182+
}
178183
}
179-
val requestFrames = Flowable.concatArrayEager(first, rest)
180184
requestFrames.subscribe(
181185
ChannelRequestSubscriber(
182186
{ payload -> frameSender.send(payload) },
@@ -248,10 +252,7 @@ internal class RSocketRequester(
248252
FrameType.NEXT -> receiver.onNext(DefaultPayload(frame))
249253
FrameType.REQUEST_N -> {
250254
val sender = senders[streamId]
251-
sender?.let {
252-
val n = Frame.RequestN.requestN(frame).toLong()
253-
it.request(n)
254-
}
255+
sender?.request(reactiveStreamsRequestN(Frame.RequestN.requestN(frame)))
255256
}
256257
FrameType.COMPLETE -> {
257258
receiver.onComplete()
@@ -320,18 +321,6 @@ internal class RSocketRequester(
320321
}
321322
}
322323

323-
private class Cond {
324-
private var first = true
325-
326-
fun first(): Boolean =
327-
if (first) {
328-
first = false
329-
true
330-
} else {
331-
false
332-
}
333-
}
334-
335324
private class ChannelRequestSubscriber(private val next: (Frame) -> Unit,
336325
private val error: (Throwable) -> Unit,
337326
private val complete: (Boolean) -> Unit)

0 commit comments

Comments
 (0)