@100mslive/react-native-hms 0.7.2 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.md +37 -39
  2. package/android/.gradle/checksums/checksums.lock +0 -0
  3. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  4. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  5. package/android/.project +34 -0
  6. package/android/build.gradle +1 -1
  7. package/android/src/main/java/com/reactnativehmssdk/HmsDecoder.kt +129 -29
  8. package/android/src/main/java/com/reactnativehmssdk/HmsHelper.kt +124 -2
  9. package/android/src/main/java/com/reactnativehmssdk/HmsModule.kt +138 -495
  10. package/android/src/main/java/com/reactnativehmssdk/HmsSDK.kt +899 -0
  11. package/android/src/main/java/com/reactnativehmssdk/HmsView.kt +26 -8
  12. package/android/src/main/java/com/reactnativehmssdk/HmssdkViewManager.kt +8 -6
  13. package/ios/HmsDecoder.swift +142 -20
  14. package/ios/HmsHelper.swift +110 -0
  15. package/ios/HmsManager.m +13 -7
  16. package/ios/HmsManager.swift +115 -375
  17. package/ios/HmsSDK.swift +716 -0
  18. package/ios/HmsView.swift +16 -8
  19. package/lib/commonjs/classes/HMSAudioTrack.js.map +1 -1
  20. package/lib/commonjs/classes/HMSAudioTrackSettings.js +3 -0
  21. package/lib/commonjs/classes/HMSAudioTrackSettings.js.map +1 -1
  22. package/lib/commonjs/classes/HMSBrowserRecordingState.js +23 -0
  23. package/lib/commonjs/classes/HMSBrowserRecordingState.js.map +1 -0
  24. package/lib/commonjs/classes/HMSCameraFacing.js +14 -0
  25. package/lib/commonjs/classes/HMSCameraFacing.js.map +1 -0
  26. package/lib/commonjs/classes/HMSConfig.js +3 -7
  27. package/lib/commonjs/classes/HMSConfig.js.map +1 -1
  28. package/lib/commonjs/classes/HMSEncoder.js +60 -32
  29. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  30. package/lib/commonjs/classes/HMSException.js +30 -0
  31. package/lib/commonjs/classes/HMSException.js.map +1 -0
  32. package/lib/commonjs/classes/HMSHelper.js +2 -2
  33. package/lib/commonjs/classes/HMSHelper.js.map +1 -1
  34. package/lib/commonjs/classes/HMSLocalAudioTrack.js +19 -1
  35. package/lib/commonjs/classes/HMSLocalAudioTrack.js.map +1 -1
  36. package/lib/commonjs/classes/HMSLocalPeer.js.map +1 -1
  37. package/lib/commonjs/classes/HMSLocalVideoTrack.js +10 -2
  38. package/lib/commonjs/classes/HMSLocalVideoTrack.js.map +1 -1
  39. package/lib/commonjs/classes/HMSLogger.js.map +1 -1
  40. package/lib/commonjs/classes/HMSPeer.js +3 -0
  41. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  42. package/lib/commonjs/classes/HMSPeerUpdate.js +1 -0
  43. package/lib/commonjs/classes/HMSPeerUpdate.js.map +1 -1
  44. package/lib/commonjs/classes/HMSPermissions.js +7 -7
  45. package/lib/commonjs/classes/HMSPermissions.js.map +1 -1
  46. package/lib/commonjs/classes/HMSRTMPConfig.js +26 -0
  47. package/lib/commonjs/classes/HMSRTMPConfig.js.map +1 -0
  48. package/lib/commonjs/classes/HMSRemoteAudioTrack.js +2 -0
  49. package/lib/commonjs/classes/HMSRemoteAudioTrack.js.map +1 -1
  50. package/lib/commonjs/classes/HMSRemotePeer.js.map +1 -1
  51. package/lib/commonjs/classes/HMSRemoteVideoTrack.js +2 -0
  52. package/lib/commonjs/classes/HMSRemoteVideoTrack.js.map +1 -1
  53. package/lib/commonjs/classes/HMSRoom.js +9 -0
  54. package/lib/commonjs/classes/HMSRoom.js.map +1 -1
  55. package/lib/commonjs/classes/HMSRtmpStreamingState.js +23 -0
  56. package/lib/commonjs/classes/HMSRtmpStreamingState.js.map +1 -0
  57. package/lib/commonjs/classes/HMSSDK.js +336 -109
  58. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  59. package/lib/commonjs/classes/HMSServerRecordingState.js +23 -0
  60. package/lib/commonjs/classes/HMSServerRecordingState.js.map +1 -0
  61. package/lib/commonjs/classes/HMSTrack.js +8 -18
  62. package/lib/commonjs/classes/HMSTrack.js.map +1 -1
  63. package/lib/commonjs/classes/HMSTrackType.js +14 -0
  64. package/lib/commonjs/classes/HMSTrackType.js.map +1 -0
  65. package/lib/commonjs/classes/HMSVideoResolution.js +23 -0
  66. package/lib/commonjs/classes/HMSVideoResolution.js.map +1 -0
  67. package/lib/commonjs/classes/HMSVideoSettings.js.map +1 -1
  68. package/lib/commonjs/classes/HMSVideoTrack.js +2 -0
  69. package/lib/commonjs/classes/HMSVideoTrack.js.map +1 -1
  70. package/lib/commonjs/classes/HMSVideoTrackSettings.js +0 -3
  71. package/lib/commonjs/classes/HMSVideoTrackSettings.js.map +1 -1
  72. package/lib/commonjs/classes/HmsView.js +10 -7
  73. package/lib/commonjs/classes/HmsView.js.map +1 -1
  74. package/lib/commonjs/index.js +98 -0
  75. package/lib/commonjs/index.js.map +1 -1
  76. package/lib/module/classes/HMSAudioTrack.js.map +1 -1
  77. package/lib/module/classes/HMSAudioTrackSettings.js +3 -0
  78. package/lib/module/classes/HMSAudioTrackSettings.js.map +1 -1
  79. package/lib/module/classes/HMSBrowserRecordingState.js +14 -0
  80. package/lib/module/classes/HMSBrowserRecordingState.js.map +1 -0
  81. package/lib/module/classes/HMSCameraFacing.js +7 -0
  82. package/lib/module/classes/HMSCameraFacing.js.map +1 -0
  83. package/lib/module/classes/HMSConfig.js +3 -7
  84. package/lib/module/classes/HMSConfig.js.map +1 -1
  85. package/lib/module/classes/HMSEncoder.js +59 -32
  86. package/lib/module/classes/HMSEncoder.js.map +1 -1
  87. package/lib/module/classes/HMSException.js +21 -0
  88. package/lib/module/classes/HMSException.js.map +1 -0
  89. package/lib/module/classes/HMSHelper.js +2 -2
  90. package/lib/module/classes/HMSHelper.js.map +1 -1
  91. package/lib/module/classes/HMSLocalAudioTrack.js +20 -2
  92. package/lib/module/classes/HMSLocalAudioTrack.js.map +1 -1
  93. package/lib/module/classes/HMSLocalPeer.js.map +1 -1
  94. package/lib/module/classes/HMSLocalVideoTrack.js +10 -2
  95. package/lib/module/classes/HMSLocalVideoTrack.js.map +1 -1
  96. package/lib/module/classes/HMSLogger.js.map +1 -1
  97. package/lib/module/classes/HMSPeer.js +3 -0
  98. package/lib/module/classes/HMSPeer.js.map +1 -1
  99. package/lib/module/classes/HMSPeerUpdate.js +1 -0
  100. package/lib/module/classes/HMSPeerUpdate.js.map +1 -1
  101. package/lib/module/classes/HMSPermissions.js +7 -7
  102. package/lib/module/classes/HMSPermissions.js.map +1 -1
  103. package/lib/module/classes/HMSRTMPConfig.js +17 -0
  104. package/lib/module/classes/HMSRTMPConfig.js.map +1 -0
  105. package/lib/module/classes/HMSRemoteAudioTrack.js +2 -0
  106. package/lib/module/classes/HMSRemoteAudioTrack.js.map +1 -1
  107. package/lib/module/classes/HMSRemotePeer.js.map +1 -1
  108. package/lib/module/classes/HMSRemoteVideoTrack.js +2 -0
  109. package/lib/module/classes/HMSRemoteVideoTrack.js.map +1 -1
  110. package/lib/module/classes/HMSRoom.js +9 -0
  111. package/lib/module/classes/HMSRoom.js.map +1 -1
  112. package/lib/module/classes/HMSRtmpStreamingState.js +14 -0
  113. package/lib/module/classes/HMSRtmpStreamingState.js.map +1 -0
  114. package/lib/module/classes/HMSSDK.js +328 -109
  115. package/lib/module/classes/HMSSDK.js.map +1 -1
  116. package/lib/module/classes/HMSServerRecordingState.js +14 -0
  117. package/lib/module/classes/HMSServerRecordingState.js.map +1 -0
  118. package/lib/module/classes/HMSTrack.js +8 -16
  119. package/lib/module/classes/HMSTrack.js.map +1 -1
  120. package/lib/module/classes/HMSTrackType.js +7 -0
  121. package/lib/module/classes/HMSTrackType.js.map +1 -0
  122. package/lib/module/classes/HMSVideoResolution.js +14 -0
  123. package/lib/module/classes/HMSVideoResolution.js.map +1 -0
  124. package/lib/module/classes/HMSVideoSettings.js.map +1 -1
  125. package/lib/module/classes/HMSVideoTrack.js +2 -0
  126. package/lib/module/classes/HMSVideoTrack.js.map +1 -1
  127. package/lib/module/classes/HMSVideoTrackSettings.js +0 -3
  128. package/lib/module/classes/HMSVideoTrackSettings.js.map +1 -1
  129. package/lib/module/classes/HmsView.js +10 -7
  130. package/lib/module/classes/HmsView.js.map +1 -1
  131. package/lib/module/index.js +7 -0
  132. package/lib/module/index.js.map +1 -1
  133. package/lib/typescript/classes/HMSAudioTrack.d.ts +3 -0
  134. package/lib/typescript/classes/HMSAudioTrackSettings.d.ts +3 -0
  135. package/lib/typescript/classes/HMSBrowserRecordingState.d.ts +9 -0
  136. package/lib/typescript/classes/HMSCameraFacing.d.ts +4 -0
  137. package/lib/typescript/classes/HMSConfig.d.ts +2 -4
  138. package/lib/typescript/classes/HMSEncoder.d.ts +14 -12
  139. package/lib/typescript/classes/HMSException.d.ts +22 -0
  140. package/lib/typescript/classes/HMSLocalAudioTrack.d.ts +5 -0
  141. package/lib/typescript/classes/HMSLocalPeer.d.ts +3 -0
  142. package/lib/typescript/classes/HMSLocalVideoTrack.d.ts +4 -0
  143. package/lib/typescript/classes/HMSLogger.d.ts +4 -4
  144. package/lib/typescript/classes/HMSPeer.d.ts +2 -0
  145. package/lib/typescript/classes/HMSPeerUpdate.d.ts +1 -0
  146. package/lib/typescript/classes/HMSPermissions.d.ts +6 -6
  147. package/lib/typescript/classes/HMSRTMPConfig.d.ts +10 -0
  148. package/lib/typescript/classes/HMSRemoteAudioTrack.d.ts +4 -0
  149. package/lib/typescript/classes/HMSRemotePeer.d.ts +3 -0
  150. package/lib/typescript/classes/HMSRemoteVideoTrack.d.ts +4 -0
  151. package/lib/typescript/classes/HMSRoom.d.ts +9 -0
  152. package/lib/typescript/classes/HMSRtmpStreamingState.d.ts +9 -0
  153. package/lib/typescript/classes/HMSSDK.d.ts +36 -6
  154. package/lib/typescript/classes/HMSServerRecordingState.d.ts +9 -0
  155. package/lib/typescript/classes/HMSTrack.d.ts +6 -1
  156. package/lib/typescript/classes/HMSTrackType.d.ts +4 -0
  157. package/lib/typescript/classes/HMSVideoResolution.d.ts +8 -0
  158. package/lib/typescript/classes/HMSVideoSettings.d.ts +3 -3
  159. package/lib/typescript/classes/HMSVideoTrack.d.ts +5 -1
  160. package/lib/typescript/classes/HMSVideoTrackSettings.d.ts +13 -10
  161. package/lib/typescript/classes/HmsView.d.ts +2 -1
  162. package/lib/typescript/index.d.ts +7 -0
  163. package/package.json +1 -1
  164. package/src/classes/HMSAudioTrack.ts +3 -0
  165. package/src/classes/HMSAudioTrackSettings.ts +9 -1
  166. package/src/classes/HMSBrowserRecordingState.ts +11 -0
  167. package/src/classes/HMSCameraFacing.ts +4 -0
  168. package/src/classes/HMSConfig.ts +3 -7
  169. package/src/classes/HMSEncoder.ts +62 -28
  170. package/src/classes/HMSException.ts +33 -0
  171. package/src/classes/HMSHelper.ts +2 -2
  172. package/src/classes/HMSLocalAudioTrack.ts +19 -2
  173. package/src/classes/HMSLocalPeer.ts +3 -0
  174. package/src/classes/HMSLocalVideoTrack.ts +7 -2
  175. package/src/classes/HMSLogger.ts +5 -5
  176. package/src/classes/HMSPeer.ts +3 -0
  177. package/src/classes/HMSPeerUpdate.ts +1 -0
  178. package/src/classes/HMSPermissions.ts +9 -9
  179. package/src/classes/HMSRTMPConfig.ts +15 -0
  180. package/src/classes/HMSRemoteAudioTrack.ts +13 -2
  181. package/src/classes/HMSRemotePeer.ts +3 -0
  182. package/src/classes/HMSRemoteVideoTrack.ts +13 -2
  183. package/src/classes/HMSRoom.ts +12 -0
  184. package/src/classes/HMSRtmpStreamingState.ts +11 -0
  185. package/src/classes/{HMSSDK.ts → HMSSDK.tsx} +284 -42
  186. package/src/classes/HMSServerRecordingState.ts +11 -0
  187. package/src/classes/HMSTrack.ts +9 -15
  188. package/src/classes/HMSTrackType.ts +4 -0
  189. package/src/classes/HMSVideoResolution.ts +9 -0
  190. package/src/classes/HMSVideoSettings.ts +3 -3
  191. package/src/classes/HMSVideoTrack.ts +6 -1
  192. package/src/classes/HMSVideoTrackSettings.ts +13 -10
  193. package/src/classes/HmsView.tsx +4 -0
  194. package/src/index.ts +7 -0
  195. package/ios/Hmssdk.m +0 -8
  196. package/ios/Hmssdk.swift +0 -8
@@ -0,0 +1,899 @@
1
+ package com.reactnativehmssdk
2
+
3
+ import com.facebook.react.bridge.*
4
+ import java.util.*
5
+ import kotlinx.coroutines.launch
6
+ import live.hms.video.error.HMSException
7
+ import live.hms.video.media.settings.HMSTrackSettings
8
+ import live.hms.video.media.tracks.*
9
+ import live.hms.video.sdk.*
10
+ import live.hms.video.sdk.models.*
11
+ import live.hms.video.sdk.models.HMSConfig
12
+ import live.hms.video.sdk.models.enums.HMSPeerUpdate
13
+ import live.hms.video.sdk.models.enums.HMSRoomUpdate
14
+ import live.hms.video.sdk.models.enums.HMSTrackUpdate
15
+ import live.hms.video.sdk.models.trackchangerequest.HMSChangeTrackStateRequest
16
+ import live.hms.video.utils.HMSCoroutineScope
17
+
18
+ class HmsSDK(
19
+ data: ReadableMap?,
20
+ HmsDelegate: HmsModule,
21
+ sdkId: String,
22
+ reactApplicationContext: ReactApplicationContext
23
+ ) {
24
+ var hmsSDK: HMSSDK? = null
25
+ private var recentRoleChangeRequest: HMSRoleChangeRequest? = null
26
+ private var changeTrackStateRequest: HMSChangeTrackStateRequest? = null
27
+ val delegate: HmsModule = HmsDelegate
28
+ val id: String = sdkId
29
+ val self = this
30
+
31
+ init {
32
+ val videoSettings = HmsHelper.getVideoTrackSettings(data?.getMap("video"))
33
+ val audioSettings = HmsHelper.getAudioTrackSettings(data?.getMap("audio"))
34
+
35
+ val trackSettingsBuilder = HMSTrackSettings.Builder()
36
+ val trackSettings = trackSettingsBuilder.audio(audioSettings).video(videoSettings).build()
37
+
38
+ this.hmsSDK = HMSSDK.Builder(reactApplicationContext).setTrackSettings(trackSettings).build()
39
+ }
40
+
41
+ fun emitRequiredKeysError() {
42
+ val data: WritableMap = Arguments.createMap()
43
+ val hmsError =
44
+ HMSException(
45
+ 102,
46
+ "NOT_FOUND",
47
+ "SEND_ALL_REQUIRED_KEYS",
48
+ "REQUIRED_KEYS_NOT_FOUND",
49
+ "REQUIRED_KEYS_NOT_FOUND"
50
+ )
51
+ data.putString("event", "ON_ERROR")
52
+ data.putString("id", id)
53
+ data.putMap("error", HmsDecoder.getError(hmsError))
54
+ delegate.emitEvent("ON_ERROR", data)
55
+ }
56
+
57
+ fun emitHMSError(error: HMSException) {
58
+ val data: WritableMap = Arguments.createMap()
59
+ data.putString("event", "ON_ERROR")
60
+ data.putString("id", id)
61
+ data.putMap("error", HmsDecoder.getError(error))
62
+ delegate.emitEvent("ON_ERROR", data)
63
+ }
64
+
65
+ fun preview(credentials: ReadableMap) {
66
+ val requiredKeys =
67
+ HmsHelper.areAllRequiredKeysAvailable(
68
+ credentials,
69
+ arrayOf(Pair("username", "String"), Pair("authToken", "String"))
70
+ )
71
+ if (requiredKeys) {
72
+ var config =
73
+ HMSConfig(
74
+ credentials.getString("username") as String,
75
+ credentials.getString("authToken") as String,
76
+ )
77
+
78
+ if (HmsHelper.areAllRequiredKeysAvailable(
79
+ credentials,
80
+ arrayOf(Pair("endpoint", "String"), Pair("metadata", "String"))
81
+ )
82
+ ) {
83
+ config =
84
+ HMSConfig(
85
+ credentials.getString("username") as String,
86
+ credentials.getString("authToken") as String,
87
+ initEndpoint = credentials.getString("endpoint") as String,
88
+ metadata = credentials.getString("metadata") as String,
89
+ )
90
+ } else if (HmsHelper.areAllRequiredKeysAvailable(
91
+ credentials,
92
+ arrayOf(Pair("endpoint", "String"))
93
+ )
94
+ ) {
95
+ config =
96
+ HMSConfig(
97
+ credentials.getString("username") as String,
98
+ credentials.getString("authToken") as String,
99
+ initEndpoint = credentials.getString("endpoint") as String,
100
+ )
101
+ } else if (HmsHelper.areAllRequiredKeysAvailable(
102
+ credentials,
103
+ arrayOf(Pair("metadata", "String"))
104
+ )
105
+ ) {
106
+ config =
107
+ HMSConfig(
108
+ credentials.getString("username") as String,
109
+ credentials.getString("authToken") as String,
110
+ metadata = credentials.getString("metadata") as String,
111
+ )
112
+ }
113
+
114
+ hmsSDK?.preview(
115
+ config,
116
+ object : HMSPreviewListener {
117
+ override fun onError(error: HMSException) {
118
+ self.emitHMSError(error)
119
+ }
120
+
121
+ override fun onPreview(room: HMSRoom, localTracks: Array<HMSTrack>) {
122
+ val previewTracks = HmsDecoder.getPreviewTracks(localTracks)
123
+ val hmsRoom = HmsDecoder.getHmsRoom(room)
124
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
125
+ val data: WritableMap = Arguments.createMap()
126
+
127
+ data.putMap("previewTracks", previewTracks)
128
+ data.putMap("room", hmsRoom)
129
+ data.putMap("localPeer", localPeerData)
130
+ data.putString("id", id)
131
+ delegate.emitEvent("ON_PREVIEW", data)
132
+ }
133
+ }
134
+ )
135
+ } else {
136
+ self.emitRequiredKeysError()
137
+ }
138
+ }
139
+
140
+ fun join(credentials: ReadableMap) {
141
+ val requiredKeys =
142
+ HmsHelper.areAllRequiredKeysAvailable(
143
+ credentials,
144
+ arrayOf(Pair("username", "String"), Pair("authToken", "String"))
145
+ )
146
+ if (requiredKeys) {
147
+ var config =
148
+ HMSConfig(
149
+ credentials.getString("username") as String,
150
+ credentials.getString("authToken") as String
151
+ )
152
+
153
+ if (HmsHelper.areAllRequiredKeysAvailable(
154
+ credentials,
155
+ arrayOf(Pair("endpoint", "String"), Pair("metadata", "String"))
156
+ )
157
+ ) {
158
+ config =
159
+ HMSConfig(
160
+ credentials.getString("username") as String,
161
+ credentials.getString("authToken") as String,
162
+ initEndpoint = credentials.getString("endpoint") as String,
163
+ metadata = credentials.getString("metadata") as String,
164
+ )
165
+ } else if (HmsHelper.areAllRequiredKeysAvailable(
166
+ credentials,
167
+ arrayOf(Pair("endpoint", "String"))
168
+ )
169
+ ) {
170
+ config =
171
+ HMSConfig(
172
+ credentials.getString("username") as String,
173
+ credentials.getString("authToken") as String,
174
+ initEndpoint = credentials.getString("endpoint") as String,
175
+ )
176
+ } else if (HmsHelper.areAllRequiredKeysAvailable(
177
+ credentials,
178
+ arrayOf(Pair("metadata", "String"))
179
+ )
180
+ ) {
181
+ config =
182
+ HMSConfig(
183
+ credentials.getString("username") as String,
184
+ credentials.getString("authToken") as String,
185
+ metadata = credentials.getString("metadata") as String,
186
+ )
187
+ }
188
+
189
+ HMSCoroutineScope.launch {
190
+ try {
191
+ hmsSDK?.join(
192
+ config,
193
+ object : HMSUpdateListener {
194
+ override fun onChangeTrackStateRequest(request: HMSChangeTrackStateRequest) {
195
+ val decodedChangeTrackStateRequest =
196
+ HmsDecoder.getHmsChangeTrackStateRequest(request)
197
+ delegate.emitEvent(
198
+ "ON_CHANGE_TRACK_STATE_REQUEST",
199
+ decodedChangeTrackStateRequest
200
+ )
201
+ changeTrackStateRequest = request
202
+ }
203
+
204
+ override fun onRemovedFromRoom(notification: HMSRemovedFromRoom) {
205
+ super.onRemovedFromRoom(notification)
206
+
207
+ val data: WritableMap = Arguments.createMap()
208
+ val requestedBy =
209
+ HmsDecoder.getHmsRemotePeer(notification.peerWhoRemoved as HMSRemotePeer?)
210
+ val roomEnded = notification.roomWasEnded
211
+ val reason = notification.reason
212
+
213
+ data.putMap("requestedBy", requestedBy)
214
+ data.putBoolean("roomEnded", roomEnded)
215
+ data.putString("reason", reason)
216
+ data.putString("id", id)
217
+
218
+ delegate.emitEvent("ON_REMOVED_FROM_ROOM", data)
219
+ }
220
+
221
+ override fun onError(error: HMSException) {
222
+ self.emitHMSError(error)
223
+ }
224
+
225
+ override fun onJoin(room: HMSRoom) {
226
+ val roomData = HmsDecoder.getHmsRoom(room)
227
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
228
+ val remotePeerData = HmsDecoder.getHmsRemotePeers(hmsSDK?.getRemotePeers())
229
+ val roles = HmsDecoder.getAllRoles(hmsSDK?.getRoles())
230
+
231
+ val data: WritableMap = Arguments.createMap()
232
+
233
+ data.putMap("room", roomData)
234
+ data.putMap("localPeer", localPeerData)
235
+ data.putArray("remotePeers", remotePeerData)
236
+ data.putArray("roles", roles)
237
+ data.putString("id", id)
238
+ delegate.emitEvent("ON_JOIN", data)
239
+ }
240
+
241
+ override fun onPeerUpdate(type: HMSPeerUpdate, hmsPeer: HMSPeer) {
242
+ val type = type.name
243
+ val roomData = HmsDecoder.getHmsRoom(hmsSDK?.getRoom())
244
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
245
+ val remotePeerData = HmsDecoder.getHmsRemotePeers(hmsSDK?.getRemotePeers())
246
+
247
+ val data: WritableMap = Arguments.createMap()
248
+
249
+ data.putMap("room", roomData)
250
+ data.putString("type", type)
251
+ data.putMap("localPeer", localPeerData)
252
+ data.putArray("remotePeers", remotePeerData)
253
+ data.putString("id", id)
254
+ delegate.emitEvent("ON_PEER_UPDATE", data)
255
+ }
256
+
257
+ override fun onRoomUpdate(type: HMSRoomUpdate, hmsRoom: HMSRoom) {
258
+ val type = type.name
259
+ val roomData = HmsDecoder.getHmsRoom(hmsRoom)
260
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
261
+ val remotePeerData = HmsDecoder.getHmsRemotePeers(hmsSDK?.getRemotePeers())
262
+
263
+ val data: WritableMap = Arguments.createMap()
264
+
265
+ data.putString("type", type)
266
+ data.putMap("room", roomData)
267
+ data.putMap("localPeer", localPeerData)
268
+ data.putArray("remotePeers", remotePeerData)
269
+ data.putString("id", id)
270
+ delegate.emitEvent("ON_ROOM_UPDATE", data)
271
+ }
272
+
273
+ override fun onTrackUpdate(type: HMSTrackUpdate, track: HMSTrack, peer: HMSPeer) {
274
+ val type = type.name
275
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
276
+ val remotePeerData = HmsDecoder.getHmsRemotePeers(hmsSDK?.getRemotePeers())
277
+ val roomData = HmsDecoder.getHmsRoom(hmsSDK?.getRoom())
278
+
279
+ val data: WritableMap = Arguments.createMap()
280
+
281
+ data.putMap("room", roomData)
282
+ data.putString("type", type)
283
+ data.putMap("localPeer", localPeerData)
284
+ data.putArray("remotePeers", remotePeerData)
285
+ data.putString("id", id)
286
+ delegate.emitEvent("ON_TRACK_UPDATE", data)
287
+ }
288
+
289
+ override fun onMessageReceived(message: HMSMessage) {
290
+ val data: WritableMap = Arguments.createMap()
291
+
292
+ data.putString("sender", message.sender.name)
293
+ data.putString("message", message.message)
294
+ data.putString("type", message.type)
295
+ data.putString("time", message.serverReceiveTime.toString())
296
+ data.putString("id", id)
297
+ data.putString("event", "ON_MESSAGE")
298
+
299
+ delegate.emitEvent("ON_MESSAGE", data)
300
+ }
301
+
302
+ override fun onReconnected() {
303
+ val data: WritableMap = Arguments.createMap()
304
+ data.putString("event", "RECONNECTED")
305
+ data.putString("id", id)
306
+ delegate.emitEvent("RECONNECTED", data)
307
+ }
308
+
309
+ override fun onReconnecting(error: HMSException) {
310
+ val data: WritableMap = Arguments.createMap()
311
+ data.putString("event", "RECONNECTING")
312
+ data.putString("id", id)
313
+ delegate.emitEvent("RECONNECTING", data)
314
+ }
315
+
316
+ override fun onRoleChangeRequest(request: HMSRoleChangeRequest) {
317
+ val decodedChangeRoleRequest = HmsDecoder.getHmsRoleChangeRequest(request, id)
318
+ delegate.emitEvent("ON_ROLE_CHANGE_REQUEST", decodedChangeRoleRequest)
319
+ recentRoleChangeRequest = request
320
+ }
321
+ }
322
+ )
323
+ } catch (e: HMSException) {
324
+ self.emitHMSError(e)
325
+ }
326
+
327
+ hmsSDK?.addAudioObserver(
328
+ object : HMSAudioListener {
329
+ override fun onAudioLevelUpdate(speakers: Array<HMSSpeaker>) {
330
+ val data: WritableMap = Arguments.createMap()
331
+ data.putInt("count", speakers.size)
332
+ data.putString("event", "ON_SPEAKER")
333
+
334
+ val peers: WritableArray = Arguments.createArray()
335
+ for (speaker in speakers) {
336
+ val speakerArray: WritableMap = Arguments.createMap()
337
+ speakerArray.putMap("peer", HmsDecoder.getHmsPeer(speaker?.peer))
338
+ speakerArray.putInt("level", speaker?.level)
339
+ speakerArray.putMap("track", HmsDecoder.getHmsTrack(speaker?.hmsTrack))
340
+ peers.pushMap(speakerArray)
341
+ }
342
+ data.putArray("peers", peers)
343
+ data.putString("id", id)
344
+ delegate.emitEvent("ON_SPEAKER", data)
345
+ }
346
+ }
347
+ )
348
+ }
349
+ } else {
350
+ self.emitRequiredKeysError()
351
+ }
352
+ }
353
+
354
+ fun setLocalMute(data: ReadableMap) {
355
+ val isMute = data.getBoolean("isMute")
356
+ hmsSDK?.getLocalPeer()?.audioTrack?.setMute(isMute)
357
+ val type = if (isMute) "TRACK_MUTED" else "TRACK_UNMUTED"
358
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
359
+ val remotePeerData = HmsDecoder.getHmsRemotePeers(hmsSDK?.getRemotePeers())
360
+ val roomData = HmsDecoder.getHmsRoom(hmsSDK?.getRoom())
361
+
362
+ val data: WritableMap = Arguments.createMap()
363
+
364
+ data.putMap("room", roomData)
365
+ data.putString("type", type)
366
+ data.putMap("localPeer", localPeerData)
367
+ data.putArray("remotePeers", remotePeerData)
368
+ data.putString("id", id)
369
+ delegate.emitEvent("ON_TRACK_UPDATE", data)
370
+ }
371
+
372
+ fun setLocalVideoMute(data: ReadableMap) {
373
+ val isMute = data.getBoolean("isMute")
374
+ hmsSDK?.getLocalPeer()?.videoTrack?.setMute(isMute)
375
+ }
376
+
377
+ fun switchCamera() {
378
+ if (hmsSDK?.getLocalPeer()?.videoTrack?.isMute ?: true) {} else {
379
+ HMSCoroutineScope.launch { hmsSDK?.getLocalPeer()?.videoTrack?.switchCamera() }
380
+ }
381
+ }
382
+
383
+ fun leave(callback: Promise?) {
384
+ hmsSDK?.leave(
385
+ object : HMSActionResultListener {
386
+ override fun onSuccess() {
387
+ callback?.resolve("")
388
+ }
389
+
390
+ override fun onError(error: HMSException) {
391
+ callback?.reject("101", "NOT_FOUND")
392
+ self.emitHMSError(error)
393
+ }
394
+ }
395
+ )
396
+ }
397
+
398
+ fun sendBroadcastMessage(data: ReadableMap) {
399
+ val requiredKeys =
400
+ HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("message", "String")))
401
+ if (requiredKeys) {
402
+ val type =
403
+ if (HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("type", "String"))))
404
+ data.getString("type")
405
+ else "chat"
406
+ hmsSDK?.sendBroadcastMessage(
407
+ data.getString("message") as String,
408
+ type as String,
409
+ object : HMSMessageResultListener {
410
+ override fun onError(error: HMSException) {
411
+ self.emitHMSError(error)
412
+ }
413
+ override fun onSuccess(hmsMessage: HMSMessage) {}
414
+ }
415
+ )
416
+ } else {
417
+ self.emitRequiredKeysError()
418
+ }
419
+ }
420
+
421
+ fun sendGroupMessage(data: ReadableMap) {
422
+ val requiredKeys =
423
+ HmsHelper.areAllRequiredKeysAvailable(
424
+ data,
425
+ arrayOf(Pair("message", "String"), Pair("roles", "Array"))
426
+ )
427
+ if (requiredKeys) {
428
+ val type =
429
+ if (HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("type", "String"))))
430
+ data.getString("type")
431
+ else "chat"
432
+ val message = data.getString("message")
433
+ val targetedRoles = data.getArray("roles")?.toArrayList() as? ArrayList<String>
434
+ val roles = hmsSDK?.getRoles()
435
+ val encodedTargetedRoles = HmsHelper.getRolesFromRoleNames(targetedRoles, roles)
436
+
437
+ if (message != null) {
438
+ hmsSDK?.sendGroupMessage(
439
+ message,
440
+ type as String,
441
+ encodedTargetedRoles,
442
+ object : HMSMessageResultListener {
443
+ override fun onError(error: HMSException) {
444
+ self.emitHMSError(error)
445
+ }
446
+ override fun onSuccess(hmsMessage: HMSMessage) {}
447
+ }
448
+ )
449
+ }
450
+ } else {
451
+ self.emitRequiredKeysError()
452
+ }
453
+ }
454
+
455
+ fun sendDirectMessage(data: ReadableMap) {
456
+ val requiredKeys =
457
+ HmsHelper.areAllRequiredKeysAvailable(
458
+ data,
459
+ arrayOf(Pair("message", "String"), Pair("peerId", "String"))
460
+ )
461
+ if (requiredKeys) {
462
+ val type =
463
+ if (HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("type", "String"))))
464
+ data.getString("type")
465
+ else "chat"
466
+ val message = data.getString("message")
467
+ val peerId = data.getString("peerId")
468
+ val peers = hmsSDK?.getPeers()
469
+ val peer = HmsHelper.getPeerFromPeerId(peerId, peers)
470
+ if (message != null && peer != null) {
471
+ hmsSDK?.sendDirectMessage(
472
+ message,
473
+ type as String,
474
+ peer,
475
+ object : HMSMessageResultListener {
476
+ override fun onError(error: HMSException) {
477
+ self.emitHMSError(error)
478
+ }
479
+ override fun onSuccess(hmsMessage: HMSMessage) {}
480
+ }
481
+ )
482
+ }
483
+ } else {
484
+ self.emitRequiredKeysError()
485
+ }
486
+ }
487
+
488
+ fun changeRole(data: ReadableMap) {
489
+ val requiredKeys =
490
+ HmsHelper.areAllRequiredKeysAvailable(
491
+ data,
492
+ arrayOf(Pair("peerId", "String"), Pair("role", "String"), Pair("force", "Boolean"))
493
+ )
494
+ if (requiredKeys) {
495
+ val peerId = data.getString("peerId")
496
+ val role = data.getString("role")
497
+ val force = data.getBoolean("force")
498
+
499
+ if (peerId !== null && role !== null) {
500
+ val hmsPeer = HmsHelper.getPeerFromPeerId(peerId, hmsSDK?.getPeers())
501
+ val hmsRole = HmsHelper.getRoleFromRoleName(role, hmsSDK?.getRoles())
502
+
503
+ if (hmsRole != null && hmsPeer != null) {
504
+ hmsSDK?.changeRole(
505
+ hmsPeer as HMSRemotePeer,
506
+ hmsRole,
507
+ force,
508
+ object : HMSActionResultListener {
509
+ override fun onSuccess() {}
510
+ override fun onError(error: HMSException) {
511
+ self.emitHMSError(error)
512
+ }
513
+ }
514
+ )
515
+ }
516
+ }
517
+ } else {
518
+ self.emitRequiredKeysError()
519
+ }
520
+ }
521
+
522
+ fun changeTrackState(data: ReadableMap) {
523
+ val requiredKeys =
524
+ HmsHelper.areAllRequiredKeysAvailable(
525
+ data,
526
+ arrayOf(Pair("trackId", "String"), Pair("mute", "Boolean"))
527
+ )
528
+ if (requiredKeys) {
529
+ val trackId = data.getString("trackId")
530
+ val mute = data.getBoolean("mute")
531
+ val remotePeers = hmsSDK?.getRemotePeers()
532
+ val track = HmsHelper.getTrackFromTrackId(trackId, remotePeers)
533
+ if (track != null) {
534
+ hmsSDK?.changeTrackState(
535
+ track,
536
+ mute,
537
+ object : HMSActionResultListener {
538
+ override fun onSuccess() {}
539
+ override fun onError(error: HMSException) {
540
+ self.emitHMSError(error)
541
+ }
542
+ }
543
+ )
544
+ }
545
+ } else {
546
+ self.emitRequiredKeysError()
547
+ }
548
+ }
549
+
550
+ fun changeTrackStateRoles(data: ReadableMap) {
551
+ val requiredKeys =
552
+ HmsHelper.areAllRequiredKeysAvailable(
553
+ data,
554
+ arrayOf(
555
+ Pair("source", "String"),
556
+ Pair("mute", "Boolean"),
557
+ Pair("type", "String"),
558
+ Pair("roles", "Array")
559
+ )
560
+ )
561
+ if (requiredKeys) {
562
+ val mute: Boolean = data.getBoolean("mute")
563
+ val type =
564
+ if (data.getString("type") == HMSTrackType.AUDIO.toString()) HMSTrackType.AUDIO
565
+ else HMSTrackType.VIDEO
566
+ val source = data.getString("source")
567
+ val targetedRoles = data.getArray("roles")?.toArrayList() as? ArrayList<String>
568
+ val roles = hmsSDK?.getRoles()
569
+ val encodedTargetedRoles = HmsHelper.getRolesFromRoleNames(targetedRoles, roles)
570
+ hmsSDK?.changeTrackState(
571
+ mute,
572
+ type,
573
+ source,
574
+ encodedTargetedRoles,
575
+ object : HMSActionResultListener {
576
+ override fun onSuccess() {}
577
+ override fun onError(error: HMSException) {
578
+ self.emitHMSError(error)
579
+ }
580
+ }
581
+ )
582
+ } else {
583
+ self.emitRequiredKeysError()
584
+ }
585
+ }
586
+
587
+ fun isMute(data: ReadableMap, callback: Promise?) {
588
+ val requiredKeys =
589
+ HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("trackId", "String")))
590
+ if (requiredKeys) {
591
+ val trackId = data.getString("trackId")
592
+ val remotePeers = hmsSDK?.getRemotePeers()
593
+ val localPeer = hmsSDK?.getLocalPeer()
594
+ val localTrack = HmsHelper.getLocalTrackFromTrackId(trackId, localPeer)
595
+ if (localTrack == null) {
596
+ val track = HmsHelper.getTrackFromTrackId(trackId, remotePeers)
597
+ if (track != null) {
598
+ val mute = track.isMute
599
+ callback?.resolve(mute)
600
+ } else {
601
+ callback?.reject("101", "NOT_FOUND")
602
+ }
603
+ } else {
604
+ val mute = localTrack.isMute
605
+ callback?.resolve(mute)
606
+ }
607
+ } else {
608
+ callback?.reject("102", "REQUIRED_KEYS_NOT_AVAILABLE")
609
+ }
610
+ }
611
+
612
+ fun removePeer(data: ReadableMap) {
613
+ val requiredKeys =
614
+ HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("peerId", "String")))
615
+ if (requiredKeys) {
616
+ val peerId = data.getString("peerId")
617
+ var reason = data.getString("reason")
618
+
619
+ if (reason == null) {
620
+ reason = ""
621
+ }
622
+
623
+ val peers = hmsSDK?.getRemotePeers()
624
+
625
+ val peer = HmsHelper.getRemotePeerFromPeerId(peerId, peers)
626
+
627
+ if (peer != null) {
628
+ hmsSDK?.removePeerRequest(
629
+ peer,
630
+ reason,
631
+ object : HMSActionResultListener {
632
+ override fun onSuccess() {}
633
+ override fun onError(error: HMSException) {
634
+ self.emitHMSError(error)
635
+ }
636
+ }
637
+ )
638
+ }
639
+ } else {
640
+ self.emitRequiredKeysError()
641
+ }
642
+ }
643
+
644
+ fun endRoom(data: ReadableMap) {
645
+ val lock = data.getBoolean("lock")
646
+ var reason = data.getString("reason")
647
+ if (reason == null) {
648
+ reason = ""
649
+ }
650
+
651
+ hmsSDK?.endRoom(
652
+ reason,
653
+ lock,
654
+ object : HMSActionResultListener {
655
+ override fun onSuccess() {}
656
+ override fun onError(error: HMSException) {
657
+ self.emitHMSError(error)
658
+ }
659
+ }
660
+ )
661
+ }
662
+
663
+ fun acceptRoleChange() {
664
+ if (recentRoleChangeRequest !== null) {
665
+ hmsSDK?.acceptChangeRole(
666
+ recentRoleChangeRequest!!,
667
+ object : HMSActionResultListener {
668
+ override fun onSuccess() {
669
+ recentRoleChangeRequest = null
670
+ }
671
+
672
+ override fun onError(error: HMSException) {
673
+ recentRoleChangeRequest = null
674
+ self.emitHMSError(error)
675
+ }
676
+ }
677
+ )
678
+ }
679
+ }
680
+
681
+ fun muteAllPeersAudio(data: ReadableMap) {
682
+ val requiredKeys = HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("mute", "Boolean")))
683
+ if (requiredKeys) {
684
+ val mute = data.getBoolean("mute")
685
+ val peers = hmsSDK?.getRemotePeers()
686
+ if (peers != null) {
687
+ for (remotePeer in peers) {
688
+ val peerId = remotePeer.peerID
689
+ val peer = HmsHelper.getRemotePeerFromPeerId(peerId, peers)
690
+ if (peerId != null) {
691
+ peer?.audioTrack?.isPlaybackAllowed = !mute
692
+ }
693
+ }
694
+ val localPeerData = HmsDecoder.getHmsLocalPeer(hmsSDK?.getLocalPeer())
695
+ val remotePeerData = HmsDecoder.getHmsRemotePeers(hmsSDK?.getRemotePeers())
696
+
697
+ val data: WritableMap = Arguments.createMap()
698
+
699
+ data.putMap("localPeer", localPeerData)
700
+ data.putArray("remotePeers", remotePeerData)
701
+ data.putString("id", id)
702
+ delegate.emitEvent("ON_PEER_UPDATE", data)
703
+ }
704
+ } else {
705
+ this.emitRequiredKeysError()
706
+ }
707
+ }
708
+
709
+ fun setPlaybackAllowed(data: ReadableMap) {
710
+ val requiredKeys =
711
+ HmsHelper.areAllRequiredKeysAvailable(
712
+ data,
713
+ arrayOf(Pair("trackId", "String"), Pair("playbackAllowed", "Boolean"))
714
+ )
715
+ if (requiredKeys) {
716
+ val trackId = data.getString("trackId")
717
+ val playbackAllowed = data.getBoolean("playbackAllowed")
718
+ val remotePeers = hmsSDK?.getRemotePeers()
719
+ val remoteAudioTrack = HmsHelper.getRemoteAudioTrackFromTrackId(trackId, remotePeers)
720
+ val remoteVideoTrack = HmsHelper.getRemoteVideoTrackFromTrackId(trackId, remotePeers)
721
+ if (remoteAudioTrack != null) {
722
+ remoteAudioTrack.isPlaybackAllowed = playbackAllowed
723
+ } else if (remoteVideoTrack != null) {
724
+ remoteVideoTrack.isPlaybackAllowed = playbackAllowed
725
+ }
726
+ } else {
727
+ this.emitRequiredKeysError()
728
+ }
729
+ }
730
+
731
+ fun isPlaybackAllowed(data: ReadableMap, callback: Promise?) {
732
+ val requiredKeys =
733
+ HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("trackId", "String")))
734
+ if (requiredKeys) {
735
+ val trackId = data.getString("trackId")
736
+ val remotePeers = hmsSDK?.getRemotePeers()
737
+ val remoteAudioTrack = HmsHelper.getRemoteAudioTrackFromTrackId(trackId, remotePeers)
738
+ val remoteVideoTrack = HmsHelper.getRemoteVideoTrackFromTrackId(trackId, remotePeers)
739
+ if (remoteAudioTrack != null) {
740
+ val isPlaybackAllowed = remoteAudioTrack.isPlaybackAllowed
741
+ callback?.resolve(isPlaybackAllowed)
742
+ } else if (remoteVideoTrack != null) {
743
+ val isPlaybackAllowed = remoteVideoTrack.isPlaybackAllowed
744
+ callback?.resolve(isPlaybackAllowed)
745
+ } else {
746
+ callback?.reject("101", "NOT_FOUND")
747
+ }
748
+ } else {
749
+ callback?.reject("101", "TRACK_ID_NOT_FOUND")
750
+ }
751
+ }
752
+
753
+ fun getRoom(callback: Promise?) {
754
+ val roomData = HmsDecoder.getHmsRoom(hmsSDK?.getRoom())
755
+
756
+ callback?.resolve(roomData)
757
+ }
758
+
759
+ fun setVolume(data: ReadableMap) {
760
+ val requiredKeys =
761
+ HmsHelper.areAllRequiredKeysAvailable(
762
+ data,
763
+ arrayOf(Pair("trackId", "String"), Pair("volume", "Float"))
764
+ )
765
+
766
+ if (requiredKeys) {
767
+ val trackId = data.getString("trackId")
768
+ val volume = data.getDouble("volume")
769
+
770
+ val remotePeers = hmsSDK?.getRemotePeers()
771
+
772
+ if (remotePeers != null) {
773
+ for (peer in remotePeers) {
774
+ val audioTrackId = peer.audioTrack?.trackId
775
+
776
+ if (audioTrackId == trackId) {
777
+ peer.audioTrack?.setVolume(volume)
778
+ return
779
+ }
780
+
781
+ for (auxTrack in peer.auxiliaryTracks) {
782
+ if (auxTrack.trackId == trackId && auxTrack.type == HMSTrackType.AUDIO) {
783
+ val trackExtracted = auxTrack as? HMSRemoteAudioTrack
784
+
785
+ if (trackExtracted != null) {
786
+ trackExtracted.setVolume(volume)
787
+ return
788
+ }
789
+ }
790
+ }
791
+ }
792
+ }
793
+ } else {
794
+ this.emitRequiredKeysError()
795
+ }
796
+ }
797
+
798
+ fun getVolume(data: ReadableMap, callback: Promise?) {
799
+ val requiredKeys =
800
+ HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("trackId", "String")))
801
+
802
+ if (requiredKeys) {
803
+ val trackId = data.getString("trackId")
804
+
805
+ val localPeer = hmsSDK?.getLocalPeer()
806
+
807
+ if (localPeer?.audioTrack?.trackId == trackId) {
808
+ val volume = localPeer?.audioTrack?.volume
809
+ callback?.resolve(volume)
810
+ return
811
+ }
812
+ callback?.reject("101", "TRACK_IDS_DO_NOT_MATCH")
813
+ } else {
814
+ callback?.reject("101", "TRACK_NOT_FOUND")
815
+ }
816
+ }
817
+
818
+ fun changeMetadata(data: ReadableMap, callback: Promise?) {
819
+ val requiredKeys =
820
+ HmsHelper.areAllRequiredKeysAvailable(data, arrayOf(Pair("metadata", "String")))
821
+
822
+ if (requiredKeys) {
823
+ val metadata = data.getString("metadata")
824
+
825
+ if (metadata != null) {
826
+ hmsSDK?.changeMetadata(
827
+ metadata,
828
+ object : HMSActionResultListener {
829
+ override fun onSuccess() {
830
+ val result: WritableMap = Arguments.createMap()
831
+
832
+ result.putBoolean("success", true)
833
+
834
+ callback?.resolve(result)
835
+ }
836
+ override fun onError(error: HMSException) {
837
+ callback?.reject(error.message, error.description)
838
+ self.emitHMSError(error)
839
+ }
840
+ }
841
+ )
842
+ }
843
+ } else {
844
+ self.emitRequiredKeysError()
845
+ }
846
+ }
847
+
848
+ fun startRTMPOrRecording(data: ReadableMap, callback: Promise?) {
849
+ val requiredKeys =
850
+ HmsHelper.areAllRequiredKeysAvailable(
851
+ data,
852
+ arrayOf(Pair("record", "Boolean"), Pair("meetingURL", "String"))
853
+ )
854
+ if (requiredKeys) {
855
+ val record = data.getBoolean("record")
856
+ var meetingURL = data.getString("meetingURL") as String
857
+ var rtmpURLs = data.getArray("rtmpURLs")
858
+ if (rtmpURLs == null) {
859
+ rtmpURLs = Arguments.createArray()
860
+ }
861
+ val rtmpURLsList = HmsHelper.getRtmpUrls(rtmpURLs)
862
+ val config = HMSRecordingConfig(meetingURL, rtmpURLsList, record)
863
+
864
+ hmsSDK?.startRtmpOrRecording(
865
+ config,
866
+ object : HMSActionResultListener {
867
+ override fun onSuccess() {
868
+ val result: WritableMap = Arguments.createMap()
869
+ result.putBoolean("success", true)
870
+ callback?.resolve(result)
871
+ }
872
+ override fun onError(error: HMSException) {
873
+ callback?.reject(error.message, error.description)
874
+ self.emitHMSError(error)
875
+ }
876
+ }
877
+ )
878
+ } else {
879
+ callback?.reject("101", "REQUIRED_KEYS_NOT_FOUND")
880
+ self.emitRequiredKeysError()
881
+ }
882
+ }
883
+
884
+ fun stopRtmpAndRecording(callback: Promise?) {
885
+ hmsSDK?.stopRtmpAndRecording(
886
+ object : HMSActionResultListener {
887
+ override fun onSuccess() {
888
+ val result: WritableMap = Arguments.createMap()
889
+ result.putBoolean("success", true)
890
+ callback?.resolve(result)
891
+ }
892
+ override fun onError(error: HMSException) {
893
+ callback?.reject(error.message, error.description)
894
+ self.emitHMSError(error)
895
+ }
896
+ }
897
+ )
898
+ }
899
+ }