Skip to content

Commit dfca894

Browse files
committed
feat: expose socket connected state
1 parent 81f3596 commit dfca894

4 files changed

Lines changed: 80 additions & 2 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
object Consts {
22
const val releaseGroup = "com.piasy"
33
const val releaseName = "kmp-socketio"
4-
const val releaseVersion = "1.4.3"
4+
const val releaseVersion = "1.4.4"
55

66
val androidNS = "$releaseGroup.${releaseName.replace('-', '.')}"
77
}

kmp-socketio/src/commonMain/kotlin/com/piasy/kmp/socketio/socketio/Socket.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ class Socket(
1717
private val auth: Map<String, String>,
1818
private val scope: CoroutineScope,
1919
) : Emitter() {
20-
private var connected = false
20+
/**
21+
* Whether this socket namespace is currently connected.
22+
*/
23+
var connected = false
24+
private set
2125
private val subs = ArrayList<On.Handle>()
2226
private val ack = HashMap<Int, Ack>()
2327
private var ackId = 0

kmp-socketio/src/commonTest/kotlin/com/piasy/kmp/socketio/socketio/ConnectionTest.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,31 @@ abstract class ConnectionTest {
7676
assertEquals(now.toString(), args[3])
7777
}
7878

79+
@Test
80+
fun shouldExposeConnectionState() = doTest {
81+
val isConnectedBeforeOpen = CompletableDeferred<Boolean>()
82+
val isConnectedWhenConnectedEvent = CompletableDeferred<Boolean>()
83+
val isConnectedWhenDisconnectedEvent = CompletableDeferred<Boolean>()
84+
85+
val opt = IO.Options()
86+
opt.transports = listOf(WebSocket.NAME)
87+
client(opt = opt) { socket ->
88+
isConnectedBeforeOpen.complete(socket.connected)
89+
socket.on(Socket.EVENT_CONNECT) {
90+
isConnectedWhenConnectedEvent.complete(socket.connected)
91+
socket.close()
92+
}.on(Socket.EVENT_DISCONNECT) {
93+
isConnectedWhenDisconnectedEvent.complete(socket.connected)
94+
}
95+
96+
socket.open()
97+
}
98+
99+
assertFalse(isConnectedBeforeOpen.await())
100+
assertTrue(isConnectedWhenConnectedEvent.await())
101+
assertFalse(isConnectedWhenDisconnectedEvent.await())
102+
}
103+
79104
@Test
80105
open fun shouldConnectUntrusted() = doTest {
81106
val trustAllCertsHttpClientFactory = DefaultHttpClientFactory(
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.piasy.kmp.socketio.socketio
2+
3+
import com.piasy.kmp.xlog.Logging
4+
import java.io.BufferedReader
5+
import java.io.InputStreamReader
6+
import java.util.concurrent.TimeUnit
7+
import kotlin.concurrent.thread
8+
import kotlin.test.AfterTest
9+
import kotlin.test.BeforeTest
10+
11+
class ConnectionTestJvm : ConnectionTest() {
12+
private var server: Process? = null
13+
private var serverOutputThread: Thread? = null
14+
15+
@BeforeTest
16+
override fun startServer() {
17+
Logging.info(TAG, "startServer")
18+
val process = ProcessBuilder("node", "src/jvmTest/resources/socket-server.js", "/")
19+
.redirectErrorStream(true)
20+
.start()
21+
server = process
22+
serverOutputThread = thread(start = true, isDaemon = true, name = "socket-server-jvm-test-stdout") {
23+
BufferedReader(InputStreamReader(process.inputStream)).use { reader ->
24+
while (true) {
25+
val line = reader.readLine() ?: break
26+
Logging.info(TAG, "SERVER OUT: $line")
27+
}
28+
}
29+
}
30+
Logging.info(TAG, "startServer finish")
31+
}
32+
33+
@AfterTest
34+
override fun stopServer() {
35+
Logging.info(TAG, "stopServer")
36+
server?.let { process ->
37+
process.destroy()
38+
if (!process.waitFor(3, TimeUnit.SECONDS)) {
39+
process.destroyForcibly()
40+
process.waitFor(3, TimeUnit.SECONDS)
41+
}
42+
}
43+
server = null
44+
45+
serverOutputThread?.join(1000)
46+
serverOutputThread = null
47+
Logging.info(TAG, "stopServer finish")
48+
}
49+
}

0 commit comments

Comments
 (0)