@sbhjt-gr/react-native-webrtc 124.0.3 → 124.0.5

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 (361) hide show
  1. package/.clang-format +11 -11
  2. package/.eslintignore +6 -6
  3. package/.nvmrc +1 -1
  4. package/ISSUE_TEMPLATE.md +40 -40
  5. package/LICENSE +22 -22
  6. package/README.md +103 -103
  7. package/android/build.gradle +37 -37
  8. package/android/consumer-rules.pro +3 -3
  9. package/android/src/main/AndroidManifest.xml +11 -11
  10. package/android/src/main/java/com/oney/WebRTCModule/AbstractVideoCaptureController.java +113 -113
  11. package/android/src/main/java/com/oney/WebRTCModule/CameraCaptureController.java +338 -338
  12. package/android/src/main/java/com/oney/WebRTCModule/CameraEventsHandler.java +49 -49
  13. package/android/src/main/java/com/oney/WebRTCModule/DataChannelWrapper.java +99 -99
  14. package/android/src/main/java/com/oney/WebRTCModule/DataPacketCryptorManager.java +62 -62
  15. package/android/src/main/java/com/oney/WebRTCModule/DisplayUtils.java +16 -16
  16. package/android/src/main/java/com/oney/WebRTCModule/EglUtils.java +66 -66
  17. package/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +539 -539
  18. package/android/src/main/java/com/oney/WebRTCModule/LibraryLoader.java +21 -21
  19. package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionNotification.java +70 -70
  20. package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionService.java +82 -82
  21. package/android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java +588 -588
  22. package/android/src/main/java/com/oney/WebRTCModule/RTCCryptoManager.java +493 -493
  23. package/android/src/main/java/com/oney/WebRTCModule/RTCVideoViewManager.java +98 -98
  24. package/android/src/main/java/com/oney/WebRTCModule/ReactBridgeUtil.java +35 -35
  25. package/android/src/main/java/com/oney/WebRTCModule/ScreenCaptureController.java +94 -94
  26. package/android/src/main/java/com/oney/WebRTCModule/SerializeUtils.java +342 -342
  27. package/android/src/main/java/com/oney/WebRTCModule/StringUtils.java +100 -100
  28. package/android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java +41 -41
  29. package/android/src/main/java/com/oney/WebRTCModule/TrackCapturerEventsEmitter.java +34 -34
  30. package/android/src/main/java/com/oney/WebRTCModule/VideoTrackAdapter.java +137 -137
  31. package/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +1649 -1643
  32. package/android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java +33 -33
  33. package/android/src/main/java/com/oney/WebRTCModule/WebRTCModulePackage.java +21 -21
  34. package/android/src/main/java/com/oney/WebRTCModule/WebRTCView.java +583 -583
  35. package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraClient.java +529 -501
  36. package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraConfig.java +17 -17
  37. package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraListener.java +7 -7
  38. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/ProcessorProvider.java +38 -38
  39. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoEffectProcessor.java +59 -59
  40. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessor.java +19 -19
  41. package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessorFactoryInterface.java +12 -12
  42. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoDecoderFactory.java +73 -73
  43. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoEncoderFactory.java +73 -73
  44. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoDecoderFactoryProxy.java +36 -36
  45. package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoEncoderFactoryProxy.java +36 -36
  46. package/android/src/main/java/org/webrtc/Camera1Helper.java +54 -54
  47. package/android/src/main/java/org/webrtc/Camera2Helper.java +52 -52
  48. package/android/src/main/res/values/strings.xml +5 -5
  49. package/android/src/main/res/values/styles.xml +8 -8
  50. package/ios/RCTWebRTC/CaptureController.h +18 -18
  51. package/ios/RCTWebRTC/CaptureController.m +28 -28
  52. package/ios/RCTWebRTC/CapturerEventsDelegate.h +12 -12
  53. package/ios/RCTWebRTC/DataChannelWrapper.h +27 -27
  54. package/ios/RCTWebRTC/DataChannelWrapper.m +42 -42
  55. package/ios/RCTWebRTC/I420Converter.h +22 -22
  56. package/ios/RCTWebRTC/I420Converter.m +164 -164
  57. package/ios/RCTWebRTC/PIPController.h +24 -24
  58. package/ios/RCTWebRTC/PIPController.m +234 -234
  59. package/ios/RCTWebRTC/PalabraAudioSink.h +13 -13
  60. package/ios/RCTWebRTC/PalabraAudioSink.m +18 -18
  61. package/ios/RCTWebRTC/PalabraClient.h +42 -36
  62. package/ios/RCTWebRTC/PalabraClient.m +680 -644
  63. package/ios/RCTWebRTC/RCTConvert+WebRTC.h +16 -16
  64. package/ios/RCTWebRTC/RCTConvert+WebRTC.m +206 -206
  65. package/ios/RCTWebRTC/RTCMediaStreamTrack+React.h +10 -10
  66. package/ios/RCTWebRTC/RTCMediaStreamTrack+React.m +16 -16
  67. package/ios/RCTWebRTC/RTCVideoViewManager.h +29 -29
  68. package/ios/RCTWebRTC/RTCVideoViewManager.m +411 -411
  69. package/ios/RCTWebRTC/SampleBufferVideoCallView.h +12 -12
  70. package/ios/RCTWebRTC/SampleBufferVideoCallView.m +178 -178
  71. package/ios/RCTWebRTC/ScreenCaptureController.h +20 -20
  72. package/ios/RCTWebRTC/ScreenCaptureController.m +82 -82
  73. package/ios/RCTWebRTC/ScreenCapturePickerViewManager.h +7 -7
  74. package/ios/RCTWebRTC/ScreenCapturePickerViewManager.m +59 -59
  75. package/ios/RCTWebRTC/ScreenCapturer.h +19 -19
  76. package/ios/RCTWebRTC/ScreenCapturer.m +263 -263
  77. package/ios/RCTWebRTC/SerializeUtils.h +28 -28
  78. package/ios/RCTWebRTC/SerializeUtils.m +314 -314
  79. package/ios/RCTWebRTC/SocketConnection.h +13 -13
  80. package/ios/RCTWebRTC/SocketConnection.m +137 -137
  81. package/ios/RCTWebRTC/TrackCapturerEventsEmitter.h +14 -14
  82. package/ios/RCTWebRTC/TrackCapturerEventsEmitter.m +36 -36
  83. package/ios/RCTWebRTC/VideoCaptureController.h +21 -21
  84. package/ios/RCTWebRTC/VideoCaptureController.m +328 -328
  85. package/ios/RCTWebRTC/WLVAudioDevice.h +12 -12
  86. package/ios/RCTWebRTC/WLVAudioDevice.m +137 -137
  87. package/ios/RCTWebRTC/WebRTCModule+Palabra.h +4 -4
  88. package/ios/RCTWebRTC/WebRTCModule+Palabra.m +92 -83
  89. package/ios/RCTWebRTC/WebRTCModule+Permissions.m +75 -75
  90. package/ios/RCTWebRTC/WebRTCModule+RTCAudioSession.m +20 -20
  91. package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.h +14 -14
  92. package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.m +165 -165
  93. package/ios/RCTWebRTC/WebRTCModule+RTCFrameCryptor.m +611 -611
  94. package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h +13 -13
  95. package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +728 -728
  96. package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.h +24 -24
  97. package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +1004 -1004
  98. package/ios/RCTWebRTC/WebRTCModule+Transceivers.m +267 -267
  99. package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.h +12 -12
  100. package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.m +166 -166
  101. package/ios/RCTWebRTC/WebRTCModule.h +58 -58
  102. package/ios/RCTWebRTC/WebRTCModule.m +169 -169
  103. package/ios/RCTWebRTC/WebRTCModuleOptions.h +24 -24
  104. package/ios/RCTWebRTC/WebRTCModuleOptions.m +31 -31
  105. package/ios/RCTWebRTC/videoEffects/ProcessorProvider.h +9 -9
  106. package/ios/RCTWebRTC/videoEffects/ProcessorProvider.m +23 -23
  107. package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.h +13 -13
  108. package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.m +23 -23
  109. package/ios/RCTWebRTC/videoEffects/VideoFrameProcessor.h +8 -8
  110. package/ios/RCTWebRTC.xcodeproj/project.pbxproj +404 -404
  111. package/ios/RCTWebRTC.xcworkspace/contents.xcworkspacedata +10 -10
  112. package/lib/commonjs/Constraints.js.map +1 -1
  113. package/lib/commonjs/EventEmitter.js.map +1 -1
  114. package/lib/commonjs/Logger.js.map +1 -1
  115. package/lib/commonjs/MediaDevices.js +17 -17
  116. package/lib/commonjs/MediaDevices.js.map +1 -1
  117. package/lib/commonjs/MediaStream.js +19 -19
  118. package/lib/commonjs/MediaStream.js.map +1 -1
  119. package/lib/commonjs/MediaStreamError.js.map +1 -1
  120. package/lib/commonjs/MediaStreamErrorEvent.js.map +1 -1
  121. package/lib/commonjs/MediaStreamTrack.js +28 -28
  122. package/lib/commonjs/MediaStreamTrack.js.map +1 -1
  123. package/lib/commonjs/MediaStreamTrackEvent.js +6 -6
  124. package/lib/commonjs/MediaStreamTrackEvent.js.map +1 -1
  125. package/lib/commonjs/MessageEvent.js +7 -7
  126. package/lib/commonjs/MessageEvent.js.map +1 -1
  127. package/lib/commonjs/Permissions.js +28 -28
  128. package/lib/commonjs/Permissions.js.map +1 -1
  129. package/lib/commonjs/RTCAudioSession.js +4 -4
  130. package/lib/commonjs/RTCAudioSession.js.map +1 -1
  131. package/lib/commonjs/RTCDataChannel.js +2 -2
  132. package/lib/commonjs/RTCDataChannel.js.map +1 -1
  133. package/lib/commonjs/RTCDataChannelEvent.js +6 -6
  134. package/lib/commonjs/RTCDataChannelEvent.js.map +1 -1
  135. package/lib/commonjs/RTCDataPacketCryptor.js.map +1 -1
  136. package/lib/commonjs/RTCDataPacketCryptorFactory.js.map +1 -1
  137. package/lib/commonjs/RTCErrorEvent.js +3 -3
  138. package/lib/commonjs/RTCErrorEvent.js.map +1 -1
  139. package/lib/commonjs/RTCFrameCryptor.js +8 -8
  140. package/lib/commonjs/RTCFrameCryptor.js.map +1 -1
  141. package/lib/commonjs/RTCFrameCryptorFactory.js.map +1 -1
  142. package/lib/commonjs/RTCIceCandidate.js.map +1 -1
  143. package/lib/commonjs/RTCIceCandidateEvent.js +7 -7
  144. package/lib/commonjs/RTCIceCandidateEvent.js.map +1 -1
  145. package/lib/commonjs/RTCKeyProvider.js.map +1 -1
  146. package/lib/commonjs/RTCPIPView.js +2 -2
  147. package/lib/commonjs/RTCPIPView.js.map +1 -1
  148. package/lib/commonjs/RTCPIPView.web.js.map +1 -1
  149. package/lib/commonjs/RTCPeerConnection.js +36 -36
  150. package/lib/commonjs/RTCPeerConnection.js.map +1 -1
  151. package/lib/commonjs/RTCRtcpParameters.js.map +1 -1
  152. package/lib/commonjs/RTCRtpCapabilities.js +2 -2
  153. package/lib/commonjs/RTCRtpCapabilities.js.map +1 -1
  154. package/lib/commonjs/RTCRtpCodecCapability.js.map +1 -1
  155. package/lib/commonjs/RTCRtpCodecParameters.js.map +1 -1
  156. package/lib/commonjs/RTCRtpEncodingParameters.js.map +1 -1
  157. package/lib/commonjs/RTCRtpHeaderExtension.js.map +1 -1
  158. package/lib/commonjs/RTCRtpParameters.js.map +1 -1
  159. package/lib/commonjs/RTCRtpReceiveParameters.js.map +1 -1
  160. package/lib/commonjs/RTCRtpReceiver.js +7 -7
  161. package/lib/commonjs/RTCRtpReceiver.js.map +1 -1
  162. package/lib/commonjs/RTCRtpSendParameters.js +3 -3
  163. package/lib/commonjs/RTCRtpSendParameters.js.map +1 -1
  164. package/lib/commonjs/RTCRtpSender.js +7 -7
  165. package/lib/commonjs/RTCRtpSender.js.map +1 -1
  166. package/lib/commonjs/RTCRtpTransceiver.js.map +1 -1
  167. package/lib/commonjs/RTCSessionDescription.js.map +1 -1
  168. package/lib/commonjs/RTCTrackEvent.js +6 -6
  169. package/lib/commonjs/RTCTrackEvent.js.map +1 -1
  170. package/lib/commonjs/RTCUtil.js +28 -28
  171. package/lib/commonjs/RTCUtil.js.map +1 -1
  172. package/lib/commonjs/RTCView.js +5 -5
  173. package/lib/commonjs/RTCView.js.map +1 -1
  174. package/lib/commonjs/RTCView.web.js.map +1 -1
  175. package/lib/commonjs/ScreenCapturePickerView.js.map +1 -1
  176. package/lib/commonjs/ScreenCapturePickerView.web.js.map +1 -1
  177. package/lib/commonjs/getDisplayMedia.js.map +1 -1
  178. package/lib/commonjs/getUserMedia.js.map +1 -1
  179. package/lib/commonjs/index.js.map +1 -1
  180. package/lib/commonjs/index.web.js.map +1 -1
  181. package/lib/commonjs/webStream.js.map +1 -1
  182. package/lib/module/Constraints.js.map +1 -1
  183. package/lib/module/EventEmitter.js.map +1 -1
  184. package/lib/module/Logger.js.map +1 -1
  185. package/lib/module/MediaDevices.js +17 -17
  186. package/lib/module/MediaDevices.js.map +1 -1
  187. package/lib/module/MediaStream.js +19 -19
  188. package/lib/module/MediaStream.js.map +1 -1
  189. package/lib/module/MediaStreamError.js.map +1 -1
  190. package/lib/module/MediaStreamErrorEvent.js.map +1 -1
  191. package/lib/module/MediaStreamTrack.js +28 -28
  192. package/lib/module/MediaStreamTrack.js.map +1 -1
  193. package/lib/module/MediaStreamTrackEvent.js +6 -6
  194. package/lib/module/MediaStreamTrackEvent.js.map +1 -1
  195. package/lib/module/MessageEvent.js +7 -7
  196. package/lib/module/MessageEvent.js.map +1 -1
  197. package/lib/module/Permissions.js +28 -28
  198. package/lib/module/Permissions.js.map +1 -1
  199. package/lib/module/RTCAudioSession.js +4 -4
  200. package/lib/module/RTCAudioSession.js.map +1 -1
  201. package/lib/module/RTCDataChannel.js +2 -2
  202. package/lib/module/RTCDataChannel.js.map +1 -1
  203. package/lib/module/RTCDataChannelEvent.js +6 -6
  204. package/lib/module/RTCDataChannelEvent.js.map +1 -1
  205. package/lib/module/RTCDataPacketCryptor.js.map +1 -1
  206. package/lib/module/RTCDataPacketCryptorFactory.js.map +1 -1
  207. package/lib/module/RTCErrorEvent.js +3 -3
  208. package/lib/module/RTCErrorEvent.js.map +1 -1
  209. package/lib/module/RTCFrameCryptor.js +8 -8
  210. package/lib/module/RTCFrameCryptor.js.map +1 -1
  211. package/lib/module/RTCFrameCryptorFactory.js.map +1 -1
  212. package/lib/module/RTCIceCandidate.js.map +1 -1
  213. package/lib/module/RTCIceCandidateEvent.js +7 -7
  214. package/lib/module/RTCIceCandidateEvent.js.map +1 -1
  215. package/lib/module/RTCKeyProvider.js.map +1 -1
  216. package/lib/module/RTCPIPView.js +2 -2
  217. package/lib/module/RTCPIPView.js.map +1 -1
  218. package/lib/module/RTCPIPView.web.js.map +1 -1
  219. package/lib/module/RTCPeerConnection.js +36 -36
  220. package/lib/module/RTCPeerConnection.js.map +1 -1
  221. package/lib/module/RTCRtcpParameters.js.map +1 -1
  222. package/lib/module/RTCRtpCapabilities.js +2 -2
  223. package/lib/module/RTCRtpCapabilities.js.map +1 -1
  224. package/lib/module/RTCRtpCodecCapability.js.map +1 -1
  225. package/lib/module/RTCRtpCodecParameters.js.map +1 -1
  226. package/lib/module/RTCRtpEncodingParameters.js.map +1 -1
  227. package/lib/module/RTCRtpHeaderExtension.js.map +1 -1
  228. package/lib/module/RTCRtpParameters.js.map +1 -1
  229. package/lib/module/RTCRtpReceiveParameters.js.map +1 -1
  230. package/lib/module/RTCRtpReceiver.js +7 -7
  231. package/lib/module/RTCRtpReceiver.js.map +1 -1
  232. package/lib/module/RTCRtpSendParameters.js +3 -3
  233. package/lib/module/RTCRtpSendParameters.js.map +1 -1
  234. package/lib/module/RTCRtpSender.js +7 -7
  235. package/lib/module/RTCRtpSender.js.map +1 -1
  236. package/lib/module/RTCRtpTransceiver.js.map +1 -1
  237. package/lib/module/RTCSessionDescription.js.map +1 -1
  238. package/lib/module/RTCTrackEvent.js +6 -6
  239. package/lib/module/RTCTrackEvent.js.map +1 -1
  240. package/lib/module/RTCUtil.js +28 -28
  241. package/lib/module/RTCUtil.js.map +1 -1
  242. package/lib/module/RTCView.js +5 -5
  243. package/lib/module/RTCView.js.map +1 -1
  244. package/lib/module/RTCView.web.js.map +1 -1
  245. package/lib/module/ScreenCapturePickerView.js.map +1 -1
  246. package/lib/module/ScreenCapturePickerView.web.js.map +1 -1
  247. package/lib/module/getDisplayMedia.js.map +1 -1
  248. package/lib/module/getUserMedia.js.map +1 -1
  249. package/lib/module/index.js.map +1 -1
  250. package/lib/module/index.web.js.map +1 -1
  251. package/lib/module/webStream.js.map +1 -1
  252. package/lib/typescript/Constraints.d.ts +19 -19
  253. package/lib/typescript/EventEmitter.d.ts +6 -6
  254. package/lib/typescript/Logger.d.ts +13 -13
  255. package/lib/typescript/MediaDevices.d.ts +30 -30
  256. package/lib/typescript/MediaStream.d.ts +48 -48
  257. package/lib/typescript/MediaStreamError.d.ts +6 -6
  258. package/lib/typescript/MediaStreamErrorEvent.d.ts +6 -6
  259. package/lib/typescript/MediaStreamTrack.d.ts +101 -101
  260. package/lib/typescript/MediaStreamTrackEvent.d.ts +19 -19
  261. package/lib/typescript/MessageEvent.d.ts +20 -20
  262. package/lib/typescript/Permissions.d.ts +55 -55
  263. package/lib/typescript/RTCAudioSession.d.ts +10 -10
  264. package/lib/typescript/RTCDataChannel.d.ts +43 -43
  265. package/lib/typescript/RTCDataChannelEvent.d.ts +19 -19
  266. package/lib/typescript/RTCDataPacketCryptor.d.ts +12 -12
  267. package/lib/typescript/RTCDataPacketCryptorFactory.d.ts +6 -6
  268. package/lib/typescript/RTCErrorEvent.d.ts +12 -12
  269. package/lib/typescript/RTCFrameCryptor.d.ts +47 -47
  270. package/lib/typescript/RTCFrameCryptorFactory.d.ts +21 -21
  271. package/lib/typescript/RTCIceCandidate.d.ts +17 -17
  272. package/lib/typescript/RTCIceCandidateEvent.d.ts +20 -20
  273. package/lib/typescript/RTCKeyProvider.d.ts +21 -21
  274. package/lib/typescript/RTCPIPView.d.ts +15 -15
  275. package/lib/typescript/RTCPIPView.web.d.ts +13 -13
  276. package/lib/typescript/RTCPeerConnection.d.ts +117 -117
  277. package/lib/typescript/RTCRtcpParameters.d.ts +10 -10
  278. package/lib/typescript/RTCRtpCapabilities.d.ts +9 -9
  279. package/lib/typescript/RTCRtpCodecCapability.d.ts +7 -7
  280. package/lib/typescript/RTCRtpCodecParameters.d.ts +16 -16
  281. package/lib/typescript/RTCRtpEncodingParameters.d.ts +23 -23
  282. package/lib/typescript/RTCRtpHeaderExtension.d.ts +12 -12
  283. package/lib/typescript/RTCRtpParameters.d.ts +19 -19
  284. package/lib/typescript/RTCRtpReceiveParameters.d.ts +4 -4
  285. package/lib/typescript/RTCRtpReceiver.d.ts +21 -21
  286. package/lib/typescript/RTCRtpSendParameters.d.ts +20 -20
  287. package/lib/typescript/RTCRtpSender.d.ts +22 -22
  288. package/lib/typescript/RTCRtpTransceiver.d.ts +31 -31
  289. package/lib/typescript/RTCSessionDescription.d.ts +12 -12
  290. package/lib/typescript/RTCTrackEvent.d.ts +29 -29
  291. package/lib/typescript/RTCUtil.d.ts +37 -37
  292. package/lib/typescript/RTCView.d.ts +117 -117
  293. package/lib/typescript/RTCView.web.d.ts +25 -25
  294. package/lib/typescript/ScreenCapturePickerView.d.ts +2 -2
  295. package/lib/typescript/ScreenCapturePickerView.web.d.ts +1 -1
  296. package/lib/typescript/getDisplayMedia.d.ts +2 -2
  297. package/lib/typescript/getUserMedia.d.ts +7 -7
  298. package/lib/typescript/index.d.ts +22 -22
  299. package/lib/typescript/index.web.d.ts +101 -101
  300. package/lib/typescript/webStream.d.ts +3 -3
  301. package/livekit-react-native-webrtc.podspec +29 -29
  302. package/macos/RCTWebRTC.xcodeproj/project.pbxproj +324 -324
  303. package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -7
  304. package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -8
  305. package/metro.config.js +7 -7
  306. package/metro.config.macos.js +14 -14
  307. package/package.json +66 -66
  308. package/react-native.config.js +11 -11
  309. package/src/.eslintrc.cjs +67 -67
  310. package/src/Constraints.ts +20 -20
  311. package/src/EventEmitter.ts +65 -65
  312. package/src/Logger.ts +49 -49
  313. package/src/MediaDevices.ts +53 -53
  314. package/src/MediaStream.ts +161 -161
  315. package/src/MediaStreamError.ts +12 -12
  316. package/src/MediaStreamErrorEvent.ts +11 -11
  317. package/src/MediaStreamTrack.ts +282 -282
  318. package/src/MediaStreamTrackEvent.ts +25 -25
  319. package/src/MessageEvent.ts +26 -26
  320. package/src/Permissions.ts +133 -133
  321. package/src/RTCAudioSession.ts +25 -25
  322. package/src/RTCDataChannel.ts +190 -190
  323. package/src/RTCDataChannelEvent.ts +28 -28
  324. package/src/RTCDataPacketCryptor.ts +90 -90
  325. package/src/RTCDataPacketCryptorFactory.ts +24 -24
  326. package/src/RTCErrorEvent.ts +20 -20
  327. package/src/RTCFrameCryptor.ts +162 -162
  328. package/src/RTCFrameCryptorFactory.ts +101 -101
  329. package/src/RTCIceCandidate.ts +29 -29
  330. package/src/RTCIceCandidateEvent.ts +26 -26
  331. package/src/RTCKeyProvider.ts +117 -117
  332. package/src/RTCPIPView.tsx +46 -46
  333. package/src/RTCPIPView.web.tsx +18 -18
  334. package/src/RTCPeerConnection.ts +935 -935
  335. package/src/RTCRtcpParameters.ts +23 -23
  336. package/src/RTCRtpCapabilities.ts +16 -16
  337. package/src/RTCRtpCodecCapability.ts +12 -12
  338. package/src/RTCRtpCodecParameters.ts +44 -44
  339. package/src/RTCRtpEncodingParameters.ts +90 -90
  340. package/src/RTCRtpHeaderExtension.ts +27 -27
  341. package/src/RTCRtpParameters.ts +37 -37
  342. package/src/RTCRtpReceiveParameters.ts +7 -7
  343. package/src/RTCRtpReceiver.ts +60 -60
  344. package/src/RTCRtpSendParameters.ts +63 -63
  345. package/src/RTCRtpSender.ts +78 -78
  346. package/src/RTCRtpTransceiver.ts +107 -107
  347. package/src/RTCSessionDescription.ts +30 -30
  348. package/src/RTCTrackEvent.ts +42 -42
  349. package/src/RTCUtil.ts +211 -211
  350. package/src/RTCView.ts +122 -122
  351. package/src/RTCView.web.tsx +80 -80
  352. package/src/ScreenCapturePickerView.ts +4 -4
  353. package/src/ScreenCapturePickerView.web.tsx +3 -3
  354. package/src/getDisplayMedia.ts +30 -30
  355. package/src/getUserMedia.ts +136 -136
  356. package/src/index.ts +107 -107
  357. package/src/index.web.ts +191 -191
  358. package/src/webStream.ts +31 -31
  359. package/tools/format.sh +6 -6
  360. package/tools/release.sh +45 -45
  361. package/tsconfig.json +17 -17
@@ -1,493 +1,493 @@
1
- package com.oney.WebRTCModule;
2
-
3
- import android.util.Base64;
4
- import android.util.Log;
5
-
6
- import androidx.annotation.NonNull;
7
- import androidx.annotation.Nullable;
8
-
9
- import com.facebook.react.bridge.Arguments;
10
- import com.facebook.react.bridge.Promise;
11
- import com.facebook.react.bridge.ReadableMap;
12
- import com.facebook.react.bridge.WritableMap;
13
-
14
- import org.webrtc.DataPacketCryptor;
15
- import org.webrtc.FrameCryptor;
16
- import org.webrtc.FrameCryptorAlgorithm;
17
- import org.webrtc.FrameCryptorFactory;
18
- import org.webrtc.FrameCryptorKeyProvider;
19
- import org.webrtc.RtpReceiver;
20
- import org.webrtc.RtpSender;
21
-
22
- import java.nio.charset.StandardCharsets;
23
- import java.util.HashMap;
24
- import java.util.Map;
25
- import java.util.Objects;
26
- import java.util.UUID;
27
-
28
- public class RTCCryptoManager {
29
- private static final String TAG = "RTCFrameCryptor";
30
- private final Map<String, FrameCryptor> frameCryptos = new HashMap<>();
31
- private final Map<String, FrameCryptorStateObserver> frameCryptoObservers = new HashMap<>();
32
- private final Map<String, FrameCryptorKeyProvider> keyProviders = new HashMap<>();
33
- private final Map<String, DataPacketCryptorManager> dataPacketCryptors = new HashMap<>();
34
- private final WebRTCModule webRTCModule;
35
-
36
- public RTCCryptoManager(WebRTCModule webRTCModule) {
37
- this.webRTCModule = webRTCModule;
38
- }
39
-
40
- private void sendEvent(String eventName, WritableMap params) {
41
- webRTCModule.sendEvent(eventName, params);
42
- }
43
-
44
- class FrameCryptorStateObserver implements FrameCryptor.Observer {
45
- public FrameCryptorStateObserver(String frameCryptorId) {
46
- this.frameCryptorId = frameCryptorId;
47
- }
48
-
49
- private final String frameCryptorId;
50
-
51
- private String frameCryptorErrorStateToString(FrameCryptor.FrameCryptionState state) {
52
- switch (state) {
53
- case NEW:
54
- return "new";
55
- case OK:
56
- return "ok";
57
- case DECRYPTIONFAILED:
58
- return "decryptionFailed";
59
- case ENCRYPTIONFAILED:
60
- return "encryptionFailed";
61
- case INTERNALERROR:
62
- return "internalError";
63
- case KEYRATCHETED:
64
- return "keyRatcheted";
65
- case MISSINGKEY:
66
- return "missingKey";
67
- default:
68
- throw new IllegalArgumentException("Unknown FrameCryptorErrorState: " + state);
69
- }
70
- }
71
-
72
- @Override
73
- public void onFrameCryptionStateChanged(String participantId, FrameCryptor.FrameCryptionState state) {
74
- WritableMap event = Arguments.createMap();
75
- event.putString("event", "frameCryptionStateChanged");
76
- event.putString("participantId", participantId);
77
- event.putString("state", frameCryptorErrorStateToString(state));
78
- event.putString("frameCryptorId", frameCryptorId);
79
- sendEvent("frameCryptionStateChanged", event);
80
- }
81
- }
82
- //
83
-
84
- private FrameCryptorAlgorithm frameCryptorAlgorithmFromInt(int algorithm) {
85
- switch (algorithm) {
86
- case 0:
87
- return FrameCryptorAlgorithm.AES_GCM;
88
- // case 1:
89
- // return FrameCryptorAlgorithm.AES_CBC;
90
- default:
91
- return FrameCryptorAlgorithm.AES_GCM;
92
- }
93
- }
94
-
95
- public String frameCryptorFactoryCreateFrameCryptor(ReadableMap params) {
96
- String keyProviderId = params.getString("keyProviderId");
97
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
98
- if (keyProvider == null) {
99
- Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: keyProvider not found");
100
- return null;
101
- }
102
- int peerConnectionId = params.getInt("peerConnectionId");
103
- PeerConnectionObserver pco = webRTCModule.getPeerConnectionObserver(peerConnectionId);
104
- if (pco == null) {
105
- Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: peerConnection not found");
106
- return null;
107
- }
108
- String participantId = params.getString("participantId");
109
- String type = params.getString("type");
110
- int algorithm = params.getInt("algorithm");
111
- String rtpSenderId = params.getString("rtpSenderId");
112
- String rtpReceiverId = params.getString("rtpReceiverId");
113
-
114
- if (type == null || !(type.equals("sender") || type.equals("receiver"))) {
115
- Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: type must be sender or receiver");
116
- return null;
117
- } else if (type.equals("sender")) {
118
- RtpSender rtpSender = pco.getSender(rtpSenderId);
119
-
120
- FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpSender(webRTCModule.mFactory,
121
- rtpSender,
122
- participantId,
123
- frameCryptorAlgorithmFromInt(algorithm),
124
- keyProvider);
125
- String frameCryptorId = UUID.randomUUID().toString();
126
- frameCryptos.put(frameCryptorId, frameCryptor);
127
- FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
128
- frameCryptor.setObserver(observer);
129
- frameCryptoObservers.put(frameCryptorId, observer);
130
-
131
- return frameCryptorId;
132
- } else {
133
- RtpReceiver rtpReceiver = pco.getReceiver(rtpReceiverId);
134
-
135
- FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpReceiver(webRTCModule.mFactory,
136
- rtpReceiver,
137
- participantId,
138
- frameCryptorAlgorithmFromInt(algorithm),
139
- keyProvider);
140
- String frameCryptorId = UUID.randomUUID().toString();
141
- frameCryptos.put(frameCryptorId, frameCryptor);
142
- FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
143
- frameCryptor.setObserver(observer);
144
- frameCryptoObservers.put(frameCryptorId, observer);
145
-
146
- return frameCryptorId;
147
- }
148
- }
149
-
150
- public void frameCryptorSetKeyIndex(ReadableMap params, @NonNull Promise result) {
151
- String frameCryptorId = params.getString("frameCryptorId");
152
- FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
153
- if (frameCryptor == null) {
154
- result.reject("frameCryptorSetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
155
- return;
156
- }
157
- int keyIndex = params.getInt("keyIndex");
158
- frameCryptor.setKeyIndex(keyIndex);
159
- WritableMap paramsResult = Arguments.createMap();
160
- paramsResult.putBoolean("result", true);
161
- result.resolve(paramsResult);
162
- }
163
-
164
- public void frameCryptorGetKeyIndex(ReadableMap params, @NonNull Promise result) {
165
- String frameCryptorId = params.getString("frameCryptorId");
166
- FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
167
- if (frameCryptor == null) {
168
- result.reject("frameCryptorGetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
169
- return;
170
- }
171
- int keyIndex = frameCryptor.getKeyIndex();
172
- WritableMap paramsResult = Arguments.createMap();
173
- paramsResult.putInt("keyIndex", keyIndex);
174
- result.resolve(paramsResult);
175
- }
176
-
177
- public void frameCryptorSetEnabled(ReadableMap params, @NonNull Promise result) {
178
- String frameCryptorId = params.getString("frameCryptorId");
179
- FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
180
- if (frameCryptor == null) {
181
- result.reject("frameCryptorSetEnabledFailed", "frameCryptor not found", (Throwable) null);
182
- return;
183
- }
184
- boolean enabled = params.getBoolean("enabled");
185
- frameCryptor.setEnabled(enabled);
186
-
187
- WritableMap paramsResult = Arguments.createMap();
188
- paramsResult.putBoolean("result", enabled);
189
- result.resolve(paramsResult);
190
- }
191
-
192
- public void frameCryptorGetEnabled(ReadableMap params, @NonNull Promise result) {
193
- String frameCryptorId = params.getString("frameCryptorId");
194
- FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
195
- if (frameCryptor == null) {
196
- result.reject("frameCryptorGetEnabledFailed", "frameCryptor not found", (Throwable) null);
197
- return;
198
- }
199
- boolean enabled = frameCryptor.isEnabled();
200
- WritableMap paramsResult = Arguments.createMap();
201
- paramsResult.putBoolean("enabled", enabled);
202
- result.resolve(paramsResult);
203
- }
204
-
205
- public void frameCryptorDispose(ReadableMap params, @NonNull Promise result) {
206
- String frameCryptorId = params.getString("frameCryptorId");
207
- FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
208
- if (frameCryptor == null) {
209
- result.reject("frameCryptorDisposeFailed", "frameCryptor not found", (Throwable) null);
210
- return;
211
- }
212
- frameCryptor.dispose();
213
- frameCryptos.remove(frameCryptorId);
214
- frameCryptoObservers.remove(frameCryptorId);
215
- WritableMap paramsResult = Arguments.createMap();
216
- paramsResult.putString("result", "success");
217
- result.resolve(paramsResult);
218
- }
219
-
220
- @Nullable
221
- public String frameCryptorFactoryCreateKeyProvider(ReadableMap keyProviderOptions) {
222
- String keyProviderId = UUID.randomUUID().toString();
223
-
224
- if (keyProviderOptions == null) {
225
- Log.w(TAG, "frameCryptorFactoryCreateKeyProvider: keyProviderOptions is null!");
226
- return null;
227
- }
228
- boolean sharedKey = keyProviderOptions.getBoolean("sharedKey");
229
- int ratchetWindowSize = keyProviderOptions.getInt("ratchetWindowSize");
230
- int failureTolerance = keyProviderOptions.getInt("failureTolerance");
231
-
232
- byte[] ratchetSalt = getBytesFromMap(keyProviderOptions, "ratchetSalt", "ratchetSaltIsBase64");
233
-
234
- byte[] uncryptedMagicBytes = new byte[0];
235
- if (keyProviderOptions.hasKey("uncryptedMagicBytes")) {
236
- uncryptedMagicBytes = Base64.decode(keyProviderOptions.getString("uncryptedMagicBytes"), Base64.DEFAULT);
237
- }
238
- int keyRingSize = (int) keyProviderOptions.getInt("keyRingSize");
239
- boolean discardFrameWhenCryptorNotReady =
240
- (boolean) keyProviderOptions.getBoolean("discardFrameWhenCryptorNotReady");
241
- FrameCryptorKeyProvider keyProvider = FrameCryptorFactory.createFrameCryptorKeyProvider(sharedKey,
242
- ratchetSalt,
243
- ratchetWindowSize,
244
- uncryptedMagicBytes,
245
- failureTolerance,
246
- keyRingSize,
247
- discardFrameWhenCryptorNotReady);
248
- keyProviders.put(keyProviderId, keyProvider);
249
- return keyProviderId;
250
- }
251
-
252
- public void keyProviderSetSharedKey(ReadableMap params, @NonNull Promise result) {
253
- String keyProviderId = params.getString("keyProviderId");
254
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
255
- if (keyProvider == null) {
256
- result.reject("keyProviderSetKeySharedFailed", "keyProvider not found", (Throwable) null);
257
- return;
258
- }
259
- int keyIndex = params.getInt("keyIndex");
260
- byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
261
- keyProvider.setSharedKey(keyIndex, key);
262
-
263
- WritableMap paramsResult = Arguments.createMap();
264
- paramsResult.putBoolean("result", true);
265
- result.resolve(paramsResult);
266
- }
267
-
268
- public void keyProviderRatchetSharedKey(ReadableMap params, @NonNull Promise result) {
269
- String keyProviderId = params.getString("keyProviderId");
270
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
271
- if (keyProvider == null) {
272
- result.reject("keyProviderRatchetSharedKeyFailed", "keyProvider not found", (Throwable) null);
273
- return;
274
- }
275
- int keyIndex = params.getInt("keyIndex");
276
-
277
- byte[] newKey = keyProvider.ratchetSharedKey(keyIndex);
278
-
279
- WritableMap paramsResult = Arguments.createMap();
280
- paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
281
- result.resolve(paramsResult);
282
- }
283
-
284
- public void keyProviderExportSharedKey(ReadableMap params, @NonNull Promise result) {
285
- String keyProviderId = params.getString("keyProviderId");
286
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
287
- if (keyProvider == null) {
288
- result.reject("keyProviderExportSharedKeyFailed", "keyProvider not found", (Throwable) null);
289
- return;
290
- }
291
- int keyIndex = params.getInt("keyIndex");
292
-
293
- byte[] key = keyProvider.exportSharedKey(keyIndex);
294
-
295
- WritableMap paramsResult = Arguments.createMap();
296
- paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
297
- result.resolve(paramsResult);
298
- }
299
-
300
- public void keyProviderSetKey(ReadableMap params, @NonNull Promise result) {
301
- String keyProviderId = params.getString("keyProviderId");
302
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
303
- if (keyProvider == null) {
304
- result.reject("keyProviderSetKeyFailed", "keyProvider not found", (Throwable) null);
305
- return;
306
- }
307
- int keyIndex = params.getInt("keyIndex");
308
- String participantId = params.getString("participantId");
309
- byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
310
- keyProvider.setKey(participantId, keyIndex, key);
311
-
312
- WritableMap paramsResult = Arguments.createMap();
313
- paramsResult.putBoolean("result", true);
314
- result.resolve(paramsResult);
315
- }
316
-
317
- public void keyProviderRatchetKey(ReadableMap params, @NonNull Promise result) {
318
- String keyProviderId = params.getString("keyProviderId");
319
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
320
- if (keyProvider == null) {
321
- result.reject("keyProviderSetKeysFailed", "keyProvider not found", (Throwable) null);
322
- return;
323
- }
324
- String participantId = params.getString("participantId");
325
- int keyIndex = params.getInt("keyIndex");
326
-
327
- byte[] newKey = keyProvider.ratchetKey(participantId, keyIndex);
328
-
329
- WritableMap paramsResult = Arguments.createMap();
330
- paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
331
- result.resolve(paramsResult);
332
- }
333
-
334
- public void keyProviderExportKey(ReadableMap params, @NonNull Promise result) {
335
- String keyProviderId = params.getString("keyProviderId");
336
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
337
- if (keyProvider == null) {
338
- result.reject("keyProviderExportKeyFailed", "keyProvider not found", (Throwable) null);
339
- return;
340
- }
341
- String participantId = params.getString("participantId");
342
- int keyIndex = params.getInt("keyIndex");
343
-
344
- byte[] key = keyProvider.exportKey(participantId, keyIndex);
345
-
346
- WritableMap paramsResult = Arguments.createMap();
347
- paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
348
- result.resolve(paramsResult);
349
- }
350
-
351
- public void keyProviderSetSifTrailer(ReadableMap params, @NonNull Promise result) {
352
- String keyProviderId = params.getString("keyProviderId");
353
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
354
- if (keyProvider == null) {
355
- result.reject("keyProviderSetSifTrailerFailed", "keyProvider not found", (Throwable) null);
356
- return;
357
- }
358
- byte[] sifTrailer = Base64.decode(params.getString("sifTrailer"), Base64.NO_WRAP);
359
- keyProvider.setSifTrailer(sifTrailer);
360
-
361
- WritableMap paramsResult = Arguments.createMap();
362
- paramsResult.putBoolean("result", true);
363
- result.resolve(paramsResult);
364
- }
365
-
366
- public void keyProviderDispose(ReadableMap params, @NonNull Promise result) {
367
- String keyProviderId = params.getString("keyProviderId");
368
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
369
- if (keyProvider == null) {
370
- result.reject("keyProviderDisposeFailed", "keyProvider not found", (Throwable) null);
371
- return;
372
- }
373
- keyProvider.dispose();
374
- keyProviders.remove(keyProviderId);
375
- WritableMap paramsResult = Arguments.createMap();
376
- paramsResult.putString("result", "success");
377
- result.resolve(paramsResult);
378
- }
379
-
380
- public void dataPacketCryptorFactoryCreateDataPacketCryptor(ReadableMap params, @NonNull Promise result) {
381
- int algorithm = params.getInt("algorithm");
382
- String keyProviderId = params.getString("keyProviderId");
383
-
384
- FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
385
- if (keyProvider == null) {
386
- result.reject(
387
- "dataPacketCryptorFactoryCreateDataPacketCryptorFailed", "keyProvider not found", (Throwable) null);
388
- return;
389
- }
390
-
391
- DataPacketCryptorManager cryptor =
392
- new DataPacketCryptorManager(frameCryptorAlgorithmFromInt(algorithm), keyProvider);
393
-
394
- String dataPacketCryptorId = UUID.randomUUID().toString();
395
- dataPacketCryptors.put(dataPacketCryptorId, cryptor);
396
-
397
- WritableMap paramsResult = Arguments.createMap();
398
- paramsResult.putString("dataPacketCryptorId", dataPacketCryptorId);
399
- result.resolve(paramsResult);
400
- }
401
-
402
- public void dataPacketCryptorEncrypt(ReadableMap params, @NonNull Promise result) {
403
- String dataPacketCryptorId = params.getString("dataPacketCryptorId");
404
- String participantId = params.getString("participantId");
405
- int keyIndex = params.getInt("keyIndex");
406
- byte[] data = getBytesFromMap(params, "data", null);
407
-
408
- DataPacketCryptorManager cryptor = dataPacketCryptors.get(dataPacketCryptorId);
409
-
410
- if (cryptor == null) {
411
- result.reject("dataPacketCryptorEncryptFailed", "data packet cryptor not found", (Throwable) null);
412
- return;
413
- }
414
-
415
- DataPacketCryptor.EncryptedPacket packet = cryptor.encrypt(participantId, keyIndex, data);
416
-
417
- if (packet == null) {
418
- result.reject("dataPacketCryptorEncryptFailed", "null packet", (Throwable) null);
419
- return;
420
- }
421
-
422
- WritableMap paramsResult = Arguments.createMap();
423
- paramsResult.putString("payload", Base64.encodeToString(packet.payload, Base64.NO_WRAP));
424
- paramsResult.putString("iv", Base64.encodeToString(packet.iv, Base64.NO_WRAP));
425
- paramsResult.putInt("keyIndex", packet.keyIndex);
426
- result.resolve(paramsResult);
427
- }
428
-
429
- public void dataPacketCryptorDecrypt(ReadableMap params, @NonNull Promise result) {
430
- String dataPacketCryptorId = params.getString("dataPacketCryptorId");
431
- String participantId = params.getString("participantId");
432
- int keyIndex = params.getInt("keyIndex");
433
- byte[] payload = getBytesFromMap(params, "payload", null);
434
- byte[] iv = getBytesFromMap(params, "iv", null);
435
-
436
- DataPacketCryptorManager cryptor = dataPacketCryptors.get(dataPacketCryptorId);
437
-
438
- if (cryptor == null) {
439
- result.reject("dataPacketCryptorDecryptFailed", "data packet cryptor not found", (Throwable) null);
440
- return;
441
- }
442
-
443
- DataPacketCryptor.EncryptedPacket packet = new DataPacketCryptor.EncryptedPacket(payload, iv, keyIndex);
444
-
445
- byte[] decryptedData = cryptor.decrypt(participantId, packet);
446
-
447
- if (decryptedData == null) {
448
- result.reject("dataPacketCryptorDecryptFailed", "null decrypted data", (Throwable) null);
449
- return;
450
- }
451
-
452
- WritableMap paramsResult = Arguments.createMap();
453
- paramsResult.putString("data", Base64.encodeToString(decryptedData, Base64.NO_WRAP));
454
- result.resolve(paramsResult);
455
- }
456
-
457
- public void dataPacketCryptorDispose(ReadableMap params, @NonNull Promise result) {
458
- String dataPacketCryptorId = params.getString("dataPacketCryptorId");
459
-
460
- DataPacketCryptorManager cryptor = dataPacketCryptors.get(dataPacketCryptorId);
461
-
462
- if (cryptor == null) {
463
- result.reject("dataPacketCryptorDisposeFailed", "data packet cryptor not found", (Throwable) null);
464
- return;
465
- }
466
-
467
- cryptor.dispose();
468
- dataPacketCryptors.remove(dataPacketCryptorId);
469
- WritableMap paramsResult = Arguments.createMap();
470
- paramsResult.putString("result", "success");
471
-
472
- result.resolve(paramsResult);
473
- }
474
-
475
- private byte[] getBytesFromMap(ReadableMap map, String key, @Nullable String isBase64Key) {
476
- boolean isBase64;
477
-
478
- if (isBase64Key != null) {
479
- isBase64 = map.getBoolean(isBase64Key);
480
- } else {
481
- isBase64 = true;
482
- }
483
-
484
- byte[] bytes;
485
-
486
- if (isBase64) {
487
- bytes = Base64.decode(map.getString(key), Base64.DEFAULT);
488
- } else {
489
- bytes = Objects.requireNonNull(map.getString(key)).getBytes(StandardCharsets.UTF_8);
490
- }
491
- return bytes;
492
- }
493
- }
1
+ package com.oney.WebRTCModule;
2
+
3
+ import android.util.Base64;
4
+ import android.util.Log;
5
+
6
+ import androidx.annotation.NonNull;
7
+ import androidx.annotation.Nullable;
8
+
9
+ import com.facebook.react.bridge.Arguments;
10
+ import com.facebook.react.bridge.Promise;
11
+ import com.facebook.react.bridge.ReadableMap;
12
+ import com.facebook.react.bridge.WritableMap;
13
+
14
+ import org.webrtc.DataPacketCryptor;
15
+ import org.webrtc.FrameCryptor;
16
+ import org.webrtc.FrameCryptorAlgorithm;
17
+ import org.webrtc.FrameCryptorFactory;
18
+ import org.webrtc.FrameCryptorKeyProvider;
19
+ import org.webrtc.RtpReceiver;
20
+ import org.webrtc.RtpSender;
21
+
22
+ import java.nio.charset.StandardCharsets;
23
+ import java.util.HashMap;
24
+ import java.util.Map;
25
+ import java.util.Objects;
26
+ import java.util.UUID;
27
+
28
+ public class RTCCryptoManager {
29
+ private static final String TAG = "RTCFrameCryptor";
30
+ private final Map<String, FrameCryptor> frameCryptos = new HashMap<>();
31
+ private final Map<String, FrameCryptorStateObserver> frameCryptoObservers = new HashMap<>();
32
+ private final Map<String, FrameCryptorKeyProvider> keyProviders = new HashMap<>();
33
+ private final Map<String, DataPacketCryptorManager> dataPacketCryptors = new HashMap<>();
34
+ private final WebRTCModule webRTCModule;
35
+
36
+ public RTCCryptoManager(WebRTCModule webRTCModule) {
37
+ this.webRTCModule = webRTCModule;
38
+ }
39
+
40
+ private void sendEvent(String eventName, WritableMap params) {
41
+ webRTCModule.sendEvent(eventName, params);
42
+ }
43
+
44
+ class FrameCryptorStateObserver implements FrameCryptor.Observer {
45
+ public FrameCryptorStateObserver(String frameCryptorId) {
46
+ this.frameCryptorId = frameCryptorId;
47
+ }
48
+
49
+ private final String frameCryptorId;
50
+
51
+ private String frameCryptorErrorStateToString(FrameCryptor.FrameCryptionState state) {
52
+ switch (state) {
53
+ case NEW:
54
+ return "new";
55
+ case OK:
56
+ return "ok";
57
+ case DECRYPTIONFAILED:
58
+ return "decryptionFailed";
59
+ case ENCRYPTIONFAILED:
60
+ return "encryptionFailed";
61
+ case INTERNALERROR:
62
+ return "internalError";
63
+ case KEYRATCHETED:
64
+ return "keyRatcheted";
65
+ case MISSINGKEY:
66
+ return "missingKey";
67
+ default:
68
+ throw new IllegalArgumentException("Unknown FrameCryptorErrorState: " + state);
69
+ }
70
+ }
71
+
72
+ @Override
73
+ public void onFrameCryptionStateChanged(String participantId, FrameCryptor.FrameCryptionState state) {
74
+ WritableMap event = Arguments.createMap();
75
+ event.putString("event", "frameCryptionStateChanged");
76
+ event.putString("participantId", participantId);
77
+ event.putString("state", frameCryptorErrorStateToString(state));
78
+ event.putString("frameCryptorId", frameCryptorId);
79
+ sendEvent("frameCryptionStateChanged", event);
80
+ }
81
+ }
82
+ //
83
+
84
+ private FrameCryptorAlgorithm frameCryptorAlgorithmFromInt(int algorithm) {
85
+ switch (algorithm) {
86
+ case 0:
87
+ return FrameCryptorAlgorithm.AES_GCM;
88
+ // case 1:
89
+ // return FrameCryptorAlgorithm.AES_CBC;
90
+ default:
91
+ return FrameCryptorAlgorithm.AES_GCM;
92
+ }
93
+ }
94
+
95
+ public String frameCryptorFactoryCreateFrameCryptor(ReadableMap params) {
96
+ String keyProviderId = params.getString("keyProviderId");
97
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
98
+ if (keyProvider == null) {
99
+ Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: keyProvider not found");
100
+ return null;
101
+ }
102
+ int peerConnectionId = params.getInt("peerConnectionId");
103
+ PeerConnectionObserver pco = webRTCModule.getPeerConnectionObserver(peerConnectionId);
104
+ if (pco == null) {
105
+ Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: peerConnection not found");
106
+ return null;
107
+ }
108
+ String participantId = params.getString("participantId");
109
+ String type = params.getString("type");
110
+ int algorithm = params.getInt("algorithm");
111
+ String rtpSenderId = params.getString("rtpSenderId");
112
+ String rtpReceiverId = params.getString("rtpReceiverId");
113
+
114
+ if (type == null || !(type.equals("sender") || type.equals("receiver"))) {
115
+ Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: type must be sender or receiver");
116
+ return null;
117
+ } else if (type.equals("sender")) {
118
+ RtpSender rtpSender = pco.getSender(rtpSenderId);
119
+
120
+ FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpSender(webRTCModule.mFactory,
121
+ rtpSender,
122
+ participantId,
123
+ frameCryptorAlgorithmFromInt(algorithm),
124
+ keyProvider);
125
+ String frameCryptorId = UUID.randomUUID().toString();
126
+ frameCryptos.put(frameCryptorId, frameCryptor);
127
+ FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
128
+ frameCryptor.setObserver(observer);
129
+ frameCryptoObservers.put(frameCryptorId, observer);
130
+
131
+ return frameCryptorId;
132
+ } else {
133
+ RtpReceiver rtpReceiver = pco.getReceiver(rtpReceiverId);
134
+
135
+ FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpReceiver(webRTCModule.mFactory,
136
+ rtpReceiver,
137
+ participantId,
138
+ frameCryptorAlgorithmFromInt(algorithm),
139
+ keyProvider);
140
+ String frameCryptorId = UUID.randomUUID().toString();
141
+ frameCryptos.put(frameCryptorId, frameCryptor);
142
+ FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
143
+ frameCryptor.setObserver(observer);
144
+ frameCryptoObservers.put(frameCryptorId, observer);
145
+
146
+ return frameCryptorId;
147
+ }
148
+ }
149
+
150
+ public void frameCryptorSetKeyIndex(ReadableMap params, @NonNull Promise result) {
151
+ String frameCryptorId = params.getString("frameCryptorId");
152
+ FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
153
+ if (frameCryptor == null) {
154
+ result.reject("frameCryptorSetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
155
+ return;
156
+ }
157
+ int keyIndex = params.getInt("keyIndex");
158
+ frameCryptor.setKeyIndex(keyIndex);
159
+ WritableMap paramsResult = Arguments.createMap();
160
+ paramsResult.putBoolean("result", true);
161
+ result.resolve(paramsResult);
162
+ }
163
+
164
+ public void frameCryptorGetKeyIndex(ReadableMap params, @NonNull Promise result) {
165
+ String frameCryptorId = params.getString("frameCryptorId");
166
+ FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
167
+ if (frameCryptor == null) {
168
+ result.reject("frameCryptorGetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
169
+ return;
170
+ }
171
+ int keyIndex = frameCryptor.getKeyIndex();
172
+ WritableMap paramsResult = Arguments.createMap();
173
+ paramsResult.putInt("keyIndex", keyIndex);
174
+ result.resolve(paramsResult);
175
+ }
176
+
177
+ public void frameCryptorSetEnabled(ReadableMap params, @NonNull Promise result) {
178
+ String frameCryptorId = params.getString("frameCryptorId");
179
+ FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
180
+ if (frameCryptor == null) {
181
+ result.reject("frameCryptorSetEnabledFailed", "frameCryptor not found", (Throwable) null);
182
+ return;
183
+ }
184
+ boolean enabled = params.getBoolean("enabled");
185
+ frameCryptor.setEnabled(enabled);
186
+
187
+ WritableMap paramsResult = Arguments.createMap();
188
+ paramsResult.putBoolean("result", enabled);
189
+ result.resolve(paramsResult);
190
+ }
191
+
192
+ public void frameCryptorGetEnabled(ReadableMap params, @NonNull Promise result) {
193
+ String frameCryptorId = params.getString("frameCryptorId");
194
+ FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
195
+ if (frameCryptor == null) {
196
+ result.reject("frameCryptorGetEnabledFailed", "frameCryptor not found", (Throwable) null);
197
+ return;
198
+ }
199
+ boolean enabled = frameCryptor.isEnabled();
200
+ WritableMap paramsResult = Arguments.createMap();
201
+ paramsResult.putBoolean("enabled", enabled);
202
+ result.resolve(paramsResult);
203
+ }
204
+
205
+ public void frameCryptorDispose(ReadableMap params, @NonNull Promise result) {
206
+ String frameCryptorId = params.getString("frameCryptorId");
207
+ FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
208
+ if (frameCryptor == null) {
209
+ result.reject("frameCryptorDisposeFailed", "frameCryptor not found", (Throwable) null);
210
+ return;
211
+ }
212
+ frameCryptor.dispose();
213
+ frameCryptos.remove(frameCryptorId);
214
+ frameCryptoObservers.remove(frameCryptorId);
215
+ WritableMap paramsResult = Arguments.createMap();
216
+ paramsResult.putString("result", "success");
217
+ result.resolve(paramsResult);
218
+ }
219
+
220
+ @Nullable
221
+ public String frameCryptorFactoryCreateKeyProvider(ReadableMap keyProviderOptions) {
222
+ String keyProviderId = UUID.randomUUID().toString();
223
+
224
+ if (keyProviderOptions == null) {
225
+ Log.w(TAG, "frameCryptorFactoryCreateKeyProvider: keyProviderOptions is null!");
226
+ return null;
227
+ }
228
+ boolean sharedKey = keyProviderOptions.getBoolean("sharedKey");
229
+ int ratchetWindowSize = keyProviderOptions.getInt("ratchetWindowSize");
230
+ int failureTolerance = keyProviderOptions.getInt("failureTolerance");
231
+
232
+ byte[] ratchetSalt = getBytesFromMap(keyProviderOptions, "ratchetSalt", "ratchetSaltIsBase64");
233
+
234
+ byte[] uncryptedMagicBytes = new byte[0];
235
+ if (keyProviderOptions.hasKey("uncryptedMagicBytes")) {
236
+ uncryptedMagicBytes = Base64.decode(keyProviderOptions.getString("uncryptedMagicBytes"), Base64.DEFAULT);
237
+ }
238
+ int keyRingSize = (int) keyProviderOptions.getInt("keyRingSize");
239
+ boolean discardFrameWhenCryptorNotReady =
240
+ (boolean) keyProviderOptions.getBoolean("discardFrameWhenCryptorNotReady");
241
+ FrameCryptorKeyProvider keyProvider = FrameCryptorFactory.createFrameCryptorKeyProvider(sharedKey,
242
+ ratchetSalt,
243
+ ratchetWindowSize,
244
+ uncryptedMagicBytes,
245
+ failureTolerance,
246
+ keyRingSize,
247
+ discardFrameWhenCryptorNotReady);
248
+ keyProviders.put(keyProviderId, keyProvider);
249
+ return keyProviderId;
250
+ }
251
+
252
+ public void keyProviderSetSharedKey(ReadableMap params, @NonNull Promise result) {
253
+ String keyProviderId = params.getString("keyProviderId");
254
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
255
+ if (keyProvider == null) {
256
+ result.reject("keyProviderSetKeySharedFailed", "keyProvider not found", (Throwable) null);
257
+ return;
258
+ }
259
+ int keyIndex = params.getInt("keyIndex");
260
+ byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
261
+ keyProvider.setSharedKey(keyIndex, key);
262
+
263
+ WritableMap paramsResult = Arguments.createMap();
264
+ paramsResult.putBoolean("result", true);
265
+ result.resolve(paramsResult);
266
+ }
267
+
268
+ public void keyProviderRatchetSharedKey(ReadableMap params, @NonNull Promise result) {
269
+ String keyProviderId = params.getString("keyProviderId");
270
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
271
+ if (keyProvider == null) {
272
+ result.reject("keyProviderRatchetSharedKeyFailed", "keyProvider not found", (Throwable) null);
273
+ return;
274
+ }
275
+ int keyIndex = params.getInt("keyIndex");
276
+
277
+ byte[] newKey = keyProvider.ratchetSharedKey(keyIndex);
278
+
279
+ WritableMap paramsResult = Arguments.createMap();
280
+ paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
281
+ result.resolve(paramsResult);
282
+ }
283
+
284
+ public void keyProviderExportSharedKey(ReadableMap params, @NonNull Promise result) {
285
+ String keyProviderId = params.getString("keyProviderId");
286
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
287
+ if (keyProvider == null) {
288
+ result.reject("keyProviderExportSharedKeyFailed", "keyProvider not found", (Throwable) null);
289
+ return;
290
+ }
291
+ int keyIndex = params.getInt("keyIndex");
292
+
293
+ byte[] key = keyProvider.exportSharedKey(keyIndex);
294
+
295
+ WritableMap paramsResult = Arguments.createMap();
296
+ paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
297
+ result.resolve(paramsResult);
298
+ }
299
+
300
+ public void keyProviderSetKey(ReadableMap params, @NonNull Promise result) {
301
+ String keyProviderId = params.getString("keyProviderId");
302
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
303
+ if (keyProvider == null) {
304
+ result.reject("keyProviderSetKeyFailed", "keyProvider not found", (Throwable) null);
305
+ return;
306
+ }
307
+ int keyIndex = params.getInt("keyIndex");
308
+ String participantId = params.getString("participantId");
309
+ byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
310
+ keyProvider.setKey(participantId, keyIndex, key);
311
+
312
+ WritableMap paramsResult = Arguments.createMap();
313
+ paramsResult.putBoolean("result", true);
314
+ result.resolve(paramsResult);
315
+ }
316
+
317
+ public void keyProviderRatchetKey(ReadableMap params, @NonNull Promise result) {
318
+ String keyProviderId = params.getString("keyProviderId");
319
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
320
+ if (keyProvider == null) {
321
+ result.reject("keyProviderSetKeysFailed", "keyProvider not found", (Throwable) null);
322
+ return;
323
+ }
324
+ String participantId = params.getString("participantId");
325
+ int keyIndex = params.getInt("keyIndex");
326
+
327
+ byte[] newKey = keyProvider.ratchetKey(participantId, keyIndex);
328
+
329
+ WritableMap paramsResult = Arguments.createMap();
330
+ paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
331
+ result.resolve(paramsResult);
332
+ }
333
+
334
+ public void keyProviderExportKey(ReadableMap params, @NonNull Promise result) {
335
+ String keyProviderId = params.getString("keyProviderId");
336
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
337
+ if (keyProvider == null) {
338
+ result.reject("keyProviderExportKeyFailed", "keyProvider not found", (Throwable) null);
339
+ return;
340
+ }
341
+ String participantId = params.getString("participantId");
342
+ int keyIndex = params.getInt("keyIndex");
343
+
344
+ byte[] key = keyProvider.exportKey(participantId, keyIndex);
345
+
346
+ WritableMap paramsResult = Arguments.createMap();
347
+ paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
348
+ result.resolve(paramsResult);
349
+ }
350
+
351
+ public void keyProviderSetSifTrailer(ReadableMap params, @NonNull Promise result) {
352
+ String keyProviderId = params.getString("keyProviderId");
353
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
354
+ if (keyProvider == null) {
355
+ result.reject("keyProviderSetSifTrailerFailed", "keyProvider not found", (Throwable) null);
356
+ return;
357
+ }
358
+ byte[] sifTrailer = Base64.decode(params.getString("sifTrailer"), Base64.NO_WRAP);
359
+ keyProvider.setSifTrailer(sifTrailer);
360
+
361
+ WritableMap paramsResult = Arguments.createMap();
362
+ paramsResult.putBoolean("result", true);
363
+ result.resolve(paramsResult);
364
+ }
365
+
366
+ public void keyProviderDispose(ReadableMap params, @NonNull Promise result) {
367
+ String keyProviderId = params.getString("keyProviderId");
368
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
369
+ if (keyProvider == null) {
370
+ result.reject("keyProviderDisposeFailed", "keyProvider not found", (Throwable) null);
371
+ return;
372
+ }
373
+ keyProvider.dispose();
374
+ keyProviders.remove(keyProviderId);
375
+ WritableMap paramsResult = Arguments.createMap();
376
+ paramsResult.putString("result", "success");
377
+ result.resolve(paramsResult);
378
+ }
379
+
380
+ public void dataPacketCryptorFactoryCreateDataPacketCryptor(ReadableMap params, @NonNull Promise result) {
381
+ int algorithm = params.getInt("algorithm");
382
+ String keyProviderId = params.getString("keyProviderId");
383
+
384
+ FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
385
+ if (keyProvider == null) {
386
+ result.reject(
387
+ "dataPacketCryptorFactoryCreateDataPacketCryptorFailed", "keyProvider not found", (Throwable) null);
388
+ return;
389
+ }
390
+
391
+ DataPacketCryptorManager cryptor =
392
+ new DataPacketCryptorManager(frameCryptorAlgorithmFromInt(algorithm), keyProvider);
393
+
394
+ String dataPacketCryptorId = UUID.randomUUID().toString();
395
+ dataPacketCryptors.put(dataPacketCryptorId, cryptor);
396
+
397
+ WritableMap paramsResult = Arguments.createMap();
398
+ paramsResult.putString("dataPacketCryptorId", dataPacketCryptorId);
399
+ result.resolve(paramsResult);
400
+ }
401
+
402
+ public void dataPacketCryptorEncrypt(ReadableMap params, @NonNull Promise result) {
403
+ String dataPacketCryptorId = params.getString("dataPacketCryptorId");
404
+ String participantId = params.getString("participantId");
405
+ int keyIndex = params.getInt("keyIndex");
406
+ byte[] data = getBytesFromMap(params, "data", null);
407
+
408
+ DataPacketCryptorManager cryptor = dataPacketCryptors.get(dataPacketCryptorId);
409
+
410
+ if (cryptor == null) {
411
+ result.reject("dataPacketCryptorEncryptFailed", "data packet cryptor not found", (Throwable) null);
412
+ return;
413
+ }
414
+
415
+ DataPacketCryptor.EncryptedPacket packet = cryptor.encrypt(participantId, keyIndex, data);
416
+
417
+ if (packet == null) {
418
+ result.reject("dataPacketCryptorEncryptFailed", "null packet", (Throwable) null);
419
+ return;
420
+ }
421
+
422
+ WritableMap paramsResult = Arguments.createMap();
423
+ paramsResult.putString("payload", Base64.encodeToString(packet.payload, Base64.NO_WRAP));
424
+ paramsResult.putString("iv", Base64.encodeToString(packet.iv, Base64.NO_WRAP));
425
+ paramsResult.putInt("keyIndex", packet.keyIndex);
426
+ result.resolve(paramsResult);
427
+ }
428
+
429
+ public void dataPacketCryptorDecrypt(ReadableMap params, @NonNull Promise result) {
430
+ String dataPacketCryptorId = params.getString("dataPacketCryptorId");
431
+ String participantId = params.getString("participantId");
432
+ int keyIndex = params.getInt("keyIndex");
433
+ byte[] payload = getBytesFromMap(params, "payload", null);
434
+ byte[] iv = getBytesFromMap(params, "iv", null);
435
+
436
+ DataPacketCryptorManager cryptor = dataPacketCryptors.get(dataPacketCryptorId);
437
+
438
+ if (cryptor == null) {
439
+ result.reject("dataPacketCryptorDecryptFailed", "data packet cryptor not found", (Throwable) null);
440
+ return;
441
+ }
442
+
443
+ DataPacketCryptor.EncryptedPacket packet = new DataPacketCryptor.EncryptedPacket(payload, iv, keyIndex);
444
+
445
+ byte[] decryptedData = cryptor.decrypt(participantId, packet);
446
+
447
+ if (decryptedData == null) {
448
+ result.reject("dataPacketCryptorDecryptFailed", "null decrypted data", (Throwable) null);
449
+ return;
450
+ }
451
+
452
+ WritableMap paramsResult = Arguments.createMap();
453
+ paramsResult.putString("data", Base64.encodeToString(decryptedData, Base64.NO_WRAP));
454
+ result.resolve(paramsResult);
455
+ }
456
+
457
+ public void dataPacketCryptorDispose(ReadableMap params, @NonNull Promise result) {
458
+ String dataPacketCryptorId = params.getString("dataPacketCryptorId");
459
+
460
+ DataPacketCryptorManager cryptor = dataPacketCryptors.get(dataPacketCryptorId);
461
+
462
+ if (cryptor == null) {
463
+ result.reject("dataPacketCryptorDisposeFailed", "data packet cryptor not found", (Throwable) null);
464
+ return;
465
+ }
466
+
467
+ cryptor.dispose();
468
+ dataPacketCryptors.remove(dataPacketCryptorId);
469
+ WritableMap paramsResult = Arguments.createMap();
470
+ paramsResult.putString("result", "success");
471
+
472
+ result.resolve(paramsResult);
473
+ }
474
+
475
+ private byte[] getBytesFromMap(ReadableMap map, String key, @Nullable String isBase64Key) {
476
+ boolean isBase64;
477
+
478
+ if (isBase64Key != null) {
479
+ isBase64 = map.getBoolean(isBase64Key);
480
+ } else {
481
+ isBase64 = true;
482
+ }
483
+
484
+ byte[] bytes;
485
+
486
+ if (isBase64) {
487
+ bytes = Base64.decode(map.getString(key), Base64.DEFAULT);
488
+ } else {
489
+ bytes = Objects.requireNonNull(map.getString(key)).getBytes(StandardCharsets.UTF_8);
490
+ }
491
+ return bytes;
492
+ }
493
+ }