@@ -54,10 +54,9 @@ import io.github.crow_misia.webrtc.option.MediaConstraintsOption
54
54
import kotlinx.coroutines.CompletableDeferred
55
55
import kotlinx.coroutines.CoroutineScope
56
56
import kotlinx.coroutines.Dispatchers
57
- import kotlinx.coroutines.Job
58
- import kotlinx.coroutines.cancel
59
57
import kotlinx.coroutines.delay
60
58
import kotlinx.coroutines.launch
59
+ import kotlinx.coroutines.runBlocking
61
60
import org.json.JSONObject
62
61
import org.webrtc.AudioTrack
63
62
import org.webrtc.CameraVideoCapturer.CameraSwitchHandler
@@ -79,7 +78,6 @@ class LocalPeer(
79
78
context : Context ,
80
79
) : EventEmitter() {
81
80
82
- private val scope = CoroutineScope (Job () + Dispatchers .Main )
83
81
84
82
companion object {
85
83
/* * LocalPeer Instance, Singleton class, only one instance of this class can be created
@@ -342,9 +340,7 @@ class LocalPeer(
342
340
return try {
343
341
socket.publish(
344
342
Request .RequestCase .SEND_DATA , mapOf (
345
- " to" to parsedTo,
346
- " payload" to data.payload,
347
- " label" to data.label
343
+ " to" to parsedTo, " payload" to data.payload, " label" to data.label
348
344
)
349
345
)
350
346
Pair (true , null )
@@ -586,17 +582,16 @@ class LocalPeer(
586
582
}
587
583
588
584
fun changeCam () {
589
- localVideoManager?.switchCamera(
590
- object : CameraSwitchHandler {
591
- override fun onCameraSwitchDone (b : Boolean ) {
592
- store.setCamInProgress(false )
593
- }
585
+ localVideoManager?.switchCamera(object : CameraSwitchHandler {
586
+ override fun onCameraSwitchDone (b : Boolean ) {
587
+ store.setCamInProgress(false )
588
+ }
594
589
595
- override fun onCameraSwitchError (s : String ) {
596
- Timber .w(" ❌ Error Enabling Video $s " )
597
- store.setCamInProgress(false )
598
- }
599
- })
590
+ override fun onCameraSwitchError (s : String ) {
591
+ Timber .w(" ❌ Error Enabling Video $s " )
592
+ store.setCamInProgress(false )
593
+ }
594
+ })
600
595
}
601
596
602
597
@@ -612,7 +607,7 @@ class LocalPeer(
612
607
}
613
608
if (_recvTransport == null ) {
614
609
Timber .i(" 🔔 Recv Transport Not Initialized, Creating RecvTransport" )
615
- scope.launch {
610
+ runBlocking {
616
611
createTransportOnServer(transportType = TransportType .RECV )
617
612
}
618
613
}
@@ -808,8 +803,6 @@ class LocalPeer(
808
803
// dispose video manager
809
804
localVideoManager?.dispose()
810
805
811
- scope.cancel()
812
-
813
806
permissions.reset()
814
807
815
808
// store setRoomState
@@ -835,7 +828,7 @@ class LocalPeer(
835
828
try {
836
829
val helloResponse: Hello = responseData.hello
837
830
838
- scope .launch {
831
+ CoroutineScope ( Dispatchers . Main ) .launch {
839
832
// store me
840
833
store.setMe(helloResponse.peerId, helloResponse.role)
841
834
// store roomId
@@ -904,15 +897,15 @@ class LocalPeer(
904
897
throw Exception (" ❌ Cannot Load Device" )
905
898
}
906
899
// store setRoomState
907
- scope .launch {
900
+ CoroutineScope ( Dispatchers . Main ) .launch {
908
901
store.setRoomState(RoomStates .CONNECTED )
909
902
}
910
903
emit(
911
904
" device-created" , mapOf (
912
905
" device" to mediasoupDevice
913
906
)
914
907
)
915
- scope.launch {
908
+ runBlocking {
916
909
setRemotePeers(roomInfo)
917
910
}
918
911
setLobbyPeers(roomInfo)
@@ -933,10 +926,9 @@ class LocalPeer(
933
926
try {
934
927
Timber .i(" ✅ Client recovered after reconnecting => $syncMeetingStateResponse " )
935
928
936
- val latestPeersSet = syncMeetingStateResponse.roomInfo.peersList
937
- .orEmpty()
938
- .mapNotNull { it.peerId }
939
- .toSet()
929
+ val latestPeersSet =
930
+ syncMeetingStateResponse.roomInfo.peersList.orEmpty().mapNotNull { it.peerId }
931
+ .toSet()
940
932
941
933
remotePeers.entries.toList().forEach { (peerId, peer) ->
942
934
if (peerId in latestPeersSet) {
@@ -947,13 +939,11 @@ class LocalPeer(
947
939
remotePeers.remove(peerId)
948
940
room.emit(" peer-left" , peerId)
949
941
} else {
950
- val latestPeerInfo = syncMeetingStateResponse.roomInfo.peersList
951
- .find { it.peerId == peerId }
942
+ val latestPeerInfo =
943
+ syncMeetingStateResponse.roomInfo.peersList .find { it.peerId == peerId }
952
944
953
- val newProducerSet = latestPeerInfo?.producersList
954
- .orEmpty()
955
- .mapNotNull { it.label }
956
- .toSet()
945
+ val newProducerSet =
946
+ latestPeerInfo?.producersList.orEmpty().mapNotNull { it.label }.toSet()
957
947
958
948
peer.labels.forEach { label ->
959
949
if (label in newProducerSet) {
@@ -979,32 +969,30 @@ class LocalPeer(
979
969
}
980
970
981
971
// Handle new peers
982
- syncMeetingStateResponse.roomInfo.peersList
983
- .filter { it.peerId != null && ! remotePeers.containsKey(it.peerId) && it.peerId != this .peerId }
984
- .forEach { latestPeer ->
985
- val peerId = latestPeer.peerId
986
-
987
- val remotePeer = RemotePeer (
988
- peerId = peerId,
989
- role = latestPeer.role,
990
- metadata = latestPeer.metadata
991
- )
992
-
993
- remotePeers[peerId] = remotePeer
972
+ syncMeetingStateResponse.roomInfo.peersList.filter {
973
+ it.peerId != null && ! remotePeers.containsKey(
974
+ it.peerId
975
+ ) && it.peerId != this .peerId
976
+ }.forEach { latestPeer ->
977
+ val peerId = latestPeer.peerId
978
+
979
+ val remotePeer = RemotePeer (
980
+ peerId = peerId, role = latestPeer.role, metadata = latestPeer.metadata
981
+ )
994
982
995
- latestPeer.producersList.forEach { producer ->
996
- val producerId = producer.id
997
- val label = producer.label
983
+ remotePeers[peerId] = remotePeer
998
984
999
- remotePeer.addLabelData(
1000
- label = label,
1001
- producerId = producerId,
1002
- this @LocalPeer.appContext
1003
- )
1004
- }
985
+ latestPeer.producersList.forEach { producer ->
986
+ val producerId = producer.id
987
+ val label = producer.label
1005
988
1006
- room.emit(" new-peer-joined" , mapOf (" peer" to remotePeer))
989
+ remotePeer.addLabelData(
990
+ label = label, producerId = producerId, this @LocalPeer.appContext
991
+ )
1007
992
}
993
+
994
+ room.emit(" new-peer-joined" , mapOf (" peer" to remotePeer))
995
+ }
1008
996
} catch (error: Throwable ) {
1009
997
Timber .e(" ❌ Error Syncing Meeting State, Can't Recover | error: $error " )
1010
998
}
@@ -1092,7 +1080,7 @@ class LocalPeer(
1092
1080
put(" peerId" , peerId)
1093
1081
put(" role" , role)
1094
1082
}
1095
- scope .launch {
1083
+ CoroutineScope ( Dispatchers . Main ) .launch {
1096
1084
store.addPeer(peerId, peersData)
1097
1085
}
1098
1086
val remotePeer = room.getRemotePeerById(peerId)
@@ -1143,7 +1131,7 @@ class LocalPeer(
1143
1131
closeConsumer(consumeResponse.label, consumeResponse.producerPeerId)
1144
1132
Timber .w(" onTransportClose for consume" )
1145
1133
// store for removeConsumer
1146
- scope .launch {
1134
+ CoroutineScope ( Dispatchers . Main ) .launch {
1147
1135
store.removeConsumer(consumeResponse.producerPeerId)
1148
1136
}
1149
1137
}
@@ -1156,7 +1144,7 @@ class LocalPeer(
1156
1144
)
1157
1145
// store for addConsumer
1158
1146
if (consumer != null ) {
1159
- scope .launch {
1147
+ CoroutineScope ( Dispatchers . Main ) .launch {
1160
1148
store.addConsumer(consumeResponse.producerPeerId, consumer)
1161
1149
}
1162
1150
}
@@ -1266,7 +1254,7 @@ class LocalPeer(
1266
1254
put(" peerId" , peerId)
1267
1255
put(" role" , role)
1268
1256
}
1269
- scope .launch {
1257
+ CoroutineScope ( Dispatchers . Main ) .launch {
1270
1258
store.addPeer(newPeerId, peersData)
1271
1259
}
1272
1260
val remotePeer = RemotePeer (
@@ -1463,7 +1451,7 @@ class LocalPeer(
1463
1451
val peerId =
1464
1452
peerLeftResponse.peerId ? : throw IllegalArgumentException (" Peer ID not found" )
1465
1453
1466
- scope .launch {
1454
+ CoroutineScope ( Dispatchers . Main ) .launch {
1467
1455
// store for removePeer
1468
1456
store.removePeer(peerId)
1469
1457
}
@@ -1648,7 +1636,7 @@ class LocalPeer(
1648
1636
}, " new" to {
1649
1637
Timber .d(" 🔔 $transportType Transport New" )
1650
1638
})
1651
- scope.launch {
1639
+ runBlocking {
1652
1640
handler[state]?.invoke()
1653
1641
}
1654
1642
} catch (err: Exception ) {
@@ -1679,12 +1667,10 @@ class LocalPeer(
1679
1667
val peerId = peer.peerId
1680
1668
if (peerId != this .peerId) {
1681
1669
val remotePeer = RemotePeer (
1682
- peerId = peerId,
1683
- metadata = peer.metadata.orEmpty(),
1684
- role = peer.role
1670
+ peerId = peerId, metadata = peer.metadata.orEmpty(), role = peer.role
1685
1671
)
1686
1672
remotePeers[peerId] = remotePeer
1687
- scope .launch {
1673
+ CoroutineScope ( Dispatchers . Main ) .launch {
1688
1674
// store for removePeer
1689
1675
peer.producersList.orEmpty().forEach { producer ->
1690
1676
// store for addPeer
@@ -1693,9 +1679,7 @@ class LocalPeer(
1693
1679
put(" role" , peer.role)
1694
1680
})
1695
1681
remotePeer.addLabelData(
1696
- producer.label,
1697
- producer.id,
1698
- this @LocalPeer.appContext
1682
+ producer.label, producer.id, this @LocalPeer.appContext
1699
1683
)
1700
1684
}
1701
1685
}
@@ -1724,7 +1708,7 @@ class LocalPeer(
1724
1708
if (consumer != null ) {
1725
1709
closeConsumer(label, peerId)
1726
1710
consumers.delete(label, peerId)
1727
- scope .launch {
1711
+ CoroutineScope ( Dispatchers . Main ) .launch {
1728
1712
// store for removePeer
1729
1713
store.removePeer(peerId)
1730
1714
}
0 commit comments