@ethora/chat-component-rn 26.10.10 → 26.10.11
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.
- package/CHANGELOG.md +16 -0
- package/README.md +125 -0
- package/lib/commonjs/booking/index.js +44 -0
- package/lib/commonjs/booking/index.js.map +1 -0
- package/lib/commonjs/booking/pendingScheduledCall.js +275 -0
- package/lib/commonjs/booking/pendingScheduledCall.js.map +1 -0
- package/lib/commonjs/booking/scheduleForm.js +91 -0
- package/lib/commonjs/booking/scheduleForm.js.map +1 -0
- package/lib/commonjs/booking/scheduledCall.js +141 -0
- package/lib/commonjs/booking/scheduledCall.js.map +1 -0
- package/lib/commonjs/booking/scheduledCallActions.js +128 -0
- package/lib/commonjs/booking/scheduledCallActions.js.map +1 -0
- package/lib/commonjs/booking/scheduledCallLink.js +143 -0
- package/lib/commonjs/booking/scheduledCallLink.js.map +1 -0
- package/lib/commonjs/booking/scheduledCallStore.js +64 -0
- package/lib/commonjs/booking/scheduledCallStore.js.map +1 -0
- package/lib/commonjs/booking/startRoomCall.js +84 -0
- package/lib/commonjs/booking/startRoomCall.js.map +1 -0
- package/lib/commonjs/calls/callBusy.js +18 -0
- package/lib/commonjs/calls/callBusy.js.map +1 -0
- package/lib/commonjs/calls/callDisplay.js +73 -0
- package/lib/commonjs/calls/callDisplay.js.map +1 -0
- package/lib/commonjs/calls/callMode.js +175 -0
- package/lib/commonjs/calls/callMode.js.map +1 -0
- package/lib/commonjs/calls/declineReport.js +20 -0
- package/lib/commonjs/calls/declineReport.js.map +1 -0
- package/lib/commonjs/calls/p2p/P2PCallController.js +724 -0
- package/lib/commonjs/calls/p2p/P2PCallController.js.map +1 -0
- package/lib/commonjs/calls/p2p/icePolicy.js +107 -0
- package/lib/commonjs/calls/p2p/icePolicy.js.map +1 -0
- package/lib/commonjs/calls/p2p/negotiator.js +202 -0
- package/lib/commonjs/calls/p2p/negotiator.js.map +1 -0
- package/lib/commonjs/calls/p2p/p2pRuntime.js +147 -0
- package/lib/commonjs/calls/p2p/p2pRuntime.js.map +1 -0
- package/lib/commonjs/calls/p2p/signalInbox.js +98 -0
- package/lib/commonjs/calls/p2p/signalInbox.js.map +1 -0
- package/lib/commonjs/calls/p2p/signalStanza.js +141 -0
- package/lib/commonjs/calls/p2p/signalStanza.js.map +1 -0
- package/lib/commonjs/calls/p2p/webrtcRuntime.js +53 -0
- package/lib/commonjs/calls/p2p/webrtcRuntime.js.map +1 -0
- package/lib/commonjs/calls/senderTrust.js +43 -0
- package/lib/commonjs/calls/senderTrust.js.map +1 -0
- package/lib/commonjs/calls/startCall.js +51 -0
- package/lib/commonjs/calls/startCall.js.map +1 -0
- package/lib/commonjs/components/Booking/BookingIcons.js +55 -0
- package/lib/commonjs/components/Booking/BookingIcons.js.map +1 -0
- package/lib/commonjs/components/Booking/ScheduleCallButton.js +64 -0
- package/lib/commonjs/components/Booking/ScheduleCallButton.js.map +1 -0
- package/lib/commonjs/components/Booking/ScheduleCallSheet.js +351 -0
- package/lib/commonjs/components/Booking/ScheduleCallSheet.js.map +1 -0
- package/lib/commonjs/components/Booking/ScheduledCallCard.js +203 -0
- package/lib/commonjs/components/Booking/ScheduledCallCard.js.map +1 -0
- package/lib/commonjs/components/Booking/ScheduledCallHost.js +23 -0
- package/lib/commonjs/components/Booking/ScheduledCallHost.js.map +1 -0
- package/lib/commonjs/components/Booking/ScheduledCallMessage.js +55 -0
- package/lib/commonjs/components/Booking/ScheduledCallMessage.js.map +1 -0
- package/lib/commonjs/components/Booking/ScheduledCallPreJoin.js +235 -0
- package/lib/commonjs/components/Booking/ScheduledCallPreJoin.js.map +1 -0
- package/lib/commonjs/components/Booking/bookingShared.js +305 -0
- package/lib/commonjs/components/Booking/bookingShared.js.map +1 -0
- package/lib/commonjs/components/MainComponents/ChatHeader.js +2 -1
- package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/commonjs/components/MainComponents/LanguageSelectorButton.js +5 -2
- package/lib/commonjs/components/MainComponents/LanguageSelectorButton.js.map +1 -1
- package/lib/commonjs/components/MainComponents/LanguageSelectorModal.js +6 -3
- package/lib/commonjs/components/MainComponents/LanguageSelectorModal.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageContainer.js +13 -0
- package/lib/commonjs/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js +10 -0
- package/lib/commonjs/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js +19 -15
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +15 -8
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/LanguageCard.js +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/LanguageCard.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/ActiveCallBar.js +3 -2
- package/lib/commonjs/components/VideoCalls/ActiveCallBar.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/CallButtons.js +19 -11
- package/lib/commonjs/components/VideoCalls/CallButtons.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/CallControlBar.js +119 -0
- package/lib/commonjs/components/VideoCalls/CallControlBar.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/CallVideo.js +49 -0
- package/lib/commonjs/components/VideoCalls/CallVideo.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/GroupCallView.js +281 -0
- package/lib/commonjs/components/VideoCalls/GroupCallView.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/P2PCallRunner.js +151 -0
- package/lib/commonjs/components/VideoCalls/P2PCallRunner.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/VideoCallOverlay.js +38 -14
- package/lib/commonjs/components/VideoCalls/VideoCallOverlay.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js +57 -128
- package/lib/commonjs/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/callActions.js +3 -0
- package/lib/commonjs/components/VideoCalls/callActions.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/callElapsed.js +38 -0
- package/lib/commonjs/components/VideoCalls/callElapsed.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/callLive.js +15 -0
- package/lib/commonjs/components/VideoCalls/callLive.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/callSessionController.js +81 -24
- package/lib/commonjs/components/VideoCalls/callSessionController.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/callSessionTypes.js +41 -0
- package/lib/commonjs/components/VideoCalls/callSessionTypes.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/groupLayout.js +43 -0
- package/lib/commonjs/components/VideoCalls/groupLayout.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/p2pCallSession.js +272 -0
- package/lib/commonjs/components/VideoCalls/p2pCallSession.js.map +1 -0
- package/lib/commonjs/components/VideoCalls/useCallKeep.js +7 -2
- package/lib/commonjs/components/VideoCalls/useCallKeep.js.map +1 -1
- package/lib/commonjs/components/VideoCalls/useOngoingCallNotification.js +2 -1
- package/lib/commonjs/components/VideoCalls/useOngoingCallNotification.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +2 -1
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/callPush.js +3 -1
- package/lib/commonjs/helpers/callPush.js.map +1 -1
- package/lib/commonjs/helpers/incomingCallFromPush.js +63 -7
- package/lib/commonjs/helpers/incomingCallFromPush.js.map +1 -1
- package/lib/commonjs/helpers/pushPayload.js +5 -0
- package/lib/commonjs/helpers/pushPayload.js.map +1 -1
- package/lib/commonjs/helpers/reportRoom.js +76 -0
- package/lib/commonjs/helpers/reportRoom.js.map +1 -0
- package/lib/commonjs/i18n/strings.js +444 -0
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/main.js +93 -0
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/callState.api.js +75 -0
- package/lib/commonjs/networking/api-requests/callState.api.js.map +1 -0
- package/lib/commonjs/networking/api-requests/push.api.js +29 -6
- package/lib/commonjs/networking/api-requests/push.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/rooms.api.js +8 -2
- package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/commonjs/networking/api-requests/scheduledCalls.api.js +141 -0
- package/lib/commonjs/networking/api-requests/scheduledCalls.api.js.map +1 -0
- package/lib/commonjs/networking/callTokenStanza.js +210 -50
- package/lib/commonjs/networking/callTokenStanza.js.map +1 -1
- package/lib/commonjs/roomStore/callSlice.js +59 -4
- package/lib/commonjs/roomStore/callSlice.js.map +1 -1
- package/lib/commonjs/services/appBadge.js +80 -0
- package/lib/commonjs/services/appBadge.js.map +1 -0
- package/lib/commonjs/services/languageSettings.js +47 -15
- package/lib/commonjs/services/languageSettings.js.map +1 -1
- package/lib/commonjs/services/pushRegistration.js +21 -5
- package/lib/commonjs/services/pushRegistration.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/module/booking/index.js +5 -0
- package/lib/module/booking/index.js.map +1 -0
- package/lib/module/booking/pendingScheduledCall.js +261 -0
- package/lib/module/booking/pendingScheduledCall.js.map +1 -0
- package/lib/module/booking/scheduleForm.js +79 -0
- package/lib/module/booking/scheduleForm.js.map +1 -0
- package/lib/module/booking/scheduledCall.js +129 -0
- package/lib/module/booking/scheduledCall.js.map +1 -0
- package/lib/module/booking/scheduledCallActions.js +118 -0
- package/lib/module/booking/scheduledCallActions.js.map +1 -0
- package/lib/module/booking/scheduledCallLink.js +136 -0
- package/lib/module/booking/scheduledCallLink.js.map +1 -0
- package/lib/module/booking/scheduledCallStore.js +60 -0
- package/lib/module/booking/scheduledCallStore.js.map +1 -0
- package/lib/module/booking/startRoomCall.js +80 -0
- package/lib/module/booking/startRoomCall.js.map +1 -0
- package/lib/module/calls/callBusy.js +13 -0
- package/lib/module/calls/callBusy.js.map +1 -0
- package/lib/module/calls/callDisplay.js +65 -0
- package/lib/module/calls/callDisplay.js.map +1 -0
- package/lib/module/calls/callMode.js +168 -0
- package/lib/module/calls/callMode.js.map +1 -0
- package/lib/module/calls/declineReport.js +16 -0
- package/lib/module/calls/declineReport.js.map +1 -0
- package/lib/module/calls/p2p/P2PCallController.js +718 -0
- package/lib/module/calls/p2p/P2PCallController.js.map +1 -0
- package/lib/module/calls/p2p/icePolicy.js +102 -0
- package/lib/module/calls/p2p/icePolicy.js.map +1 -0
- package/lib/module/calls/p2p/negotiator.js +197 -0
- package/lib/module/calls/p2p/negotiator.js.map +1 -0
- package/lib/module/calls/p2p/p2pRuntime.js +137 -0
- package/lib/module/calls/p2p/p2pRuntime.js.map +1 -0
- package/lib/module/calls/p2p/signalInbox.js +93 -0
- package/lib/module/calls/p2p/signalInbox.js.map +1 -0
- package/lib/module/calls/p2p/signalStanza.js +135 -0
- package/lib/module/calls/p2p/signalStanza.js.map +1 -0
- package/lib/module/calls/p2p/webrtcRuntime.js +46 -0
- package/lib/module/calls/p2p/webrtcRuntime.js.map +1 -0
- package/lib/module/calls/senderTrust.js +38 -0
- package/lib/module/calls/senderTrust.js.map +1 -0
- package/lib/module/calls/startCall.js +47 -0
- package/lib/module/calls/startCall.js.map +1 -0
- package/lib/module/components/Booking/BookingIcons.js +48 -0
- package/lib/module/components/Booking/BookingIcons.js.map +1 -0
- package/lib/module/components/Booking/ScheduleCallButton.js +59 -0
- package/lib/module/components/Booking/ScheduleCallButton.js.map +1 -0
- package/lib/module/components/Booking/ScheduleCallSheet.js +345 -0
- package/lib/module/components/Booking/ScheduleCallSheet.js.map +1 -0
- package/lib/module/components/Booking/ScheduledCallCard.js +197 -0
- package/lib/module/components/Booking/ScheduledCallCard.js.map +1 -0
- package/lib/module/components/Booking/ScheduledCallHost.js +18 -0
- package/lib/module/components/Booking/ScheduledCallHost.js.map +1 -0
- package/lib/module/components/Booking/ScheduledCallMessage.js +48 -0
- package/lib/module/components/Booking/ScheduledCallMessage.js.map +1 -0
- package/lib/module/components/Booking/ScheduledCallPreJoin.js +229 -0
- package/lib/module/components/Booking/ScheduledCallPreJoin.js.map +1 -0
- package/lib/module/components/Booking/bookingShared.js +291 -0
- package/lib/module/components/Booking/bookingShared.js.map +1 -0
- package/lib/module/components/MainComponents/ChatHeader.js +2 -1
- package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
- package/lib/module/components/MainComponents/LanguageSelectorButton.js +5 -2
- package/lib/module/components/MainComponents/LanguageSelectorButton.js.map +1 -1
- package/lib/module/components/MainComponents/LanguageSelectorModal.js +7 -4
- package/lib/module/components/MainComponents/LanguageSelectorModal.js.map +1 -1
- package/lib/module/components/MainComponents/MessageContainer.js +13 -0
- package/lib/module/components/MainComponents/MessageContainer.js.map +1 -1
- package/lib/module/components/MainComponents/ReduxWrapper.js +10 -0
- package/lib/module/components/MainComponents/ReduxWrapper.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js +21 -15
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +17 -10
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/LanguageCard.js +1 -1
- package/lib/module/components/Modals/UserSettingsModal/LanguageCard.js.map +1 -1
- package/lib/module/components/VideoCalls/ActiveCallBar.js +3 -2
- package/lib/module/components/VideoCalls/ActiveCallBar.js.map +1 -1
- package/lib/module/components/VideoCalls/CallButtons.js +19 -11
- package/lib/module/components/VideoCalls/CallButtons.js.map +1 -1
- package/lib/module/components/VideoCalls/CallControlBar.js +113 -0
- package/lib/module/components/VideoCalls/CallControlBar.js.map +1 -0
- package/lib/module/components/VideoCalls/CallVideo.js +43 -0
- package/lib/module/components/VideoCalls/CallVideo.js.map +1 -0
- package/lib/module/components/VideoCalls/GroupCallView.js +275 -0
- package/lib/module/components/VideoCalls/GroupCallView.js.map +1 -0
- package/lib/module/components/VideoCalls/P2PCallRunner.js +147 -0
- package/lib/module/components/VideoCalls/P2PCallRunner.js.map +1 -0
- package/lib/module/components/VideoCalls/VideoCallOverlay.js +38 -14
- package/lib/module/components/VideoCalls/VideoCallOverlay.js.map +1 -1
- package/lib/module/components/VideoCalls/VideoCallSession.js +46 -127
- package/lib/module/components/VideoCalls/VideoCallSession.js.map +1 -1
- package/lib/module/components/VideoCalls/callActions.js +3 -0
- package/lib/module/components/VideoCalls/callActions.js.map +1 -1
- package/lib/module/components/VideoCalls/callElapsed.js +33 -0
- package/lib/module/components/VideoCalls/callElapsed.js.map +1 -0
- package/lib/module/components/VideoCalls/callLive.js +10 -0
- package/lib/module/components/VideoCalls/callLive.js.map +1 -0
- package/lib/module/components/VideoCalls/callSessionController.js +80 -24
- package/lib/module/components/VideoCalls/callSessionController.js.map +1 -1
- package/lib/module/components/VideoCalls/callSessionTypes.js +37 -0
- package/lib/module/components/VideoCalls/callSessionTypes.js.map +1 -0
- package/lib/module/components/VideoCalls/groupLayout.js +36 -0
- package/lib/module/components/VideoCalls/groupLayout.js.map +1 -0
- package/lib/module/components/VideoCalls/p2pCallSession.js +256 -0
- package/lib/module/components/VideoCalls/p2pCallSession.js.map +1 -0
- package/lib/module/components/VideoCalls/useCallKeep.js +8 -2
- package/lib/module/components/VideoCalls/useCallKeep.js.map +1 -1
- package/lib/module/components/VideoCalls/useOngoingCallNotification.js +2 -1
- package/lib/module/components/VideoCalls/useOngoingCallNotification.js.map +1 -1
- package/lib/module/context/xmppProvider.js +2 -1
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/callPush.js +3 -1
- package/lib/module/helpers/callPush.js.map +1 -1
- package/lib/module/helpers/incomingCallFromPush.js +63 -7
- package/lib/module/helpers/incomingCallFromPush.js.map +1 -1
- package/lib/module/helpers/pushPayload.js +5 -0
- package/lib/module/helpers/pushPayload.js.map +1 -1
- package/lib/module/helpers/reportRoom.js +70 -0
- package/lib/module/helpers/reportRoom.js.map +1 -0
- package/lib/module/i18n/strings.js +444 -0
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/main.js +5 -0
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/callState.api.js +66 -0
- package/lib/module/networking/api-requests/callState.api.js.map +1 -0
- package/lib/module/networking/api-requests/push.api.js +29 -6
- package/lib/module/networking/api-requests/push.api.js.map +1 -1
- package/lib/module/networking/api-requests/rooms.api.js +8 -2
- package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
- package/lib/module/networking/api-requests/scheduledCalls.api.js +130 -0
- package/lib/module/networking/api-requests/scheduledCalls.api.js.map +1 -0
- package/lib/module/networking/callTokenStanza.js +210 -50
- package/lib/module/networking/callTokenStanza.js.map +1 -1
- package/lib/module/roomStore/callSlice.js +57 -3
- package/lib/module/roomStore/callSlice.js.map +1 -1
- package/lib/module/services/appBadge.js +74 -0
- package/lib/module/services/appBadge.js.map +1 -0
- package/lib/module/services/languageSettings.js +44 -13
- package/lib/module/services/languageSettings.js.map +1 -1
- package/lib/module/services/pushRegistration.js +21 -5
- package/lib/module/services/pushRegistration.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/typescript/booking/index.d.ts +3 -0
- package/lib/typescript/booking/index.d.ts.map +1 -0
- package/lib/typescript/booking/pendingScheduledCall.d.ts +80 -0
- package/lib/typescript/booking/pendingScheduledCall.d.ts.map +1 -0
- package/lib/typescript/booking/scheduleForm.d.ts +28 -0
- package/lib/typescript/booking/scheduleForm.d.ts.map +1 -0
- package/lib/typescript/booking/scheduledCall.d.ts +52 -0
- package/lib/typescript/booking/scheduledCall.d.ts.map +1 -0
- package/lib/typescript/booking/scheduledCallActions.d.ts +22 -0
- package/lib/typescript/booking/scheduledCallActions.d.ts.map +1 -0
- package/lib/typescript/booking/scheduledCallLink.d.ts +37 -0
- package/lib/typescript/booking/scheduledCallLink.d.ts.map +1 -0
- package/lib/typescript/booking/scheduledCallStore.d.ts +47 -0
- package/lib/typescript/booking/scheduledCallStore.d.ts.map +1 -0
- package/lib/typescript/booking/startRoomCall.d.ts +12 -0
- package/lib/typescript/booking/startRoomCall.d.ts.map +1 -0
- package/lib/typescript/calls/callBusy.d.ts +9 -0
- package/lib/typescript/calls/callBusy.d.ts.map +1 -0
- package/lib/typescript/calls/callDisplay.d.ts +23 -0
- package/lib/typescript/calls/callDisplay.d.ts.map +1 -0
- package/lib/typescript/calls/callMode.d.ts +106 -0
- package/lib/typescript/calls/callMode.d.ts.map +1 -0
- package/lib/typescript/calls/declineReport.d.ts +11 -0
- package/lib/typescript/calls/declineReport.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/P2PCallController.d.ts +150 -0
- package/lib/typescript/calls/p2p/P2PCallController.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/icePolicy.d.ts +37 -0
- package/lib/typescript/calls/p2p/icePolicy.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/negotiator.d.ts +57 -0
- package/lib/typescript/calls/p2p/negotiator.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/p2pRuntime.d.ts +41 -0
- package/lib/typescript/calls/p2p/p2pRuntime.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/signalInbox.d.ts +35 -0
- package/lib/typescript/calls/p2p/signalInbox.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/signalStanza.d.ts +52 -0
- package/lib/typescript/calls/p2p/signalStanza.d.ts.map +1 -0
- package/lib/typescript/calls/p2p/webrtcRuntime.d.ts +32 -0
- package/lib/typescript/calls/p2p/webrtcRuntime.d.ts.map +1 -0
- package/lib/typescript/calls/senderTrust.d.ts +8 -0
- package/lib/typescript/calls/senderTrust.d.ts.map +1 -0
- package/lib/typescript/calls/startCall.d.ts +17 -0
- package/lib/typescript/calls/startCall.d.ts.map +1 -0
- package/lib/typescript/components/Booking/BookingIcons.d.ts +9 -0
- package/lib/typescript/components/Booking/BookingIcons.d.ts.map +1 -0
- package/lib/typescript/components/Booking/ScheduleCallButton.d.ts +11 -0
- package/lib/typescript/components/Booking/ScheduleCallButton.d.ts.map +1 -0
- package/lib/typescript/components/Booking/ScheduleCallSheet.d.ts +4 -0
- package/lib/typescript/components/Booking/ScheduleCallSheet.d.ts.map +1 -0
- package/lib/typescript/components/Booking/ScheduledCallCard.d.ts +14 -0
- package/lib/typescript/components/Booking/ScheduledCallCard.d.ts.map +1 -0
- package/lib/typescript/components/Booking/ScheduledCallHost.d.ts +10 -0
- package/lib/typescript/components/Booking/ScheduledCallHost.d.ts.map +1 -0
- package/lib/typescript/components/Booking/ScheduledCallMessage.d.ts +20 -0
- package/lib/typescript/components/Booking/ScheduledCallMessage.d.ts.map +1 -0
- package/lib/typescript/components/Booking/ScheduledCallPreJoin.d.ts +8 -0
- package/lib/typescript/components/Booking/ScheduledCallPreJoin.d.ts.map +1 -0
- package/lib/typescript/components/Booking/bookingShared.d.ts +199 -0
- package/lib/typescript/components/Booking/bookingShared.d.ts.map +1 -0
- package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/LanguageSelectorButton.d.ts +3 -1
- package/lib/typescript/components/MainComponents/LanguageSelectorButton.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/LanguageSelectorModal.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageContainer.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ReduxWrapper.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/LanguageCard.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/ActiveCallBar.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/CallButtons.d.ts +2 -1
- package/lib/typescript/components/VideoCalls/CallButtons.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/CallControlBar.d.ts +17 -0
- package/lib/typescript/components/VideoCalls/CallControlBar.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/CallVideo.d.ts +23 -0
- package/lib/typescript/components/VideoCalls/CallVideo.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/GroupCallView.d.ts +22 -0
- package/lib/typescript/components/VideoCalls/GroupCallView.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/P2PCallRunner.d.ts +2 -0
- package/lib/typescript/components/VideoCalls/P2PCallRunner.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/VideoCallOverlay.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts +10 -12
- package/lib/typescript/components/VideoCalls/VideoCallSession.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/callActions.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/callElapsed.d.ts +8 -0
- package/lib/typescript/components/VideoCalls/callElapsed.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/callLive.d.ts +9 -0
- package/lib/typescript/components/VideoCalls/callLive.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/callSessionController.d.ts +10 -31
- package/lib/typescript/components/VideoCalls/callSessionController.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/callSessionTypes.d.ts +60 -0
- package/lib/typescript/components/VideoCalls/callSessionTypes.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/groupLayout.d.ts +23 -0
- package/lib/typescript/components/VideoCalls/groupLayout.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/p2pCallSession.d.ts +31 -0
- package/lib/typescript/components/VideoCalls/p2pCallSession.d.ts.map +1 -0
- package/lib/typescript/components/VideoCalls/useCallKeep.d.ts.map +1 -1
- package/lib/typescript/components/VideoCalls/useOngoingCallNotification.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/callPush.d.ts +11 -1
- package/lib/typescript/helpers/callPush.d.ts.map +1 -1
- package/lib/typescript/helpers/incomingCallFromPush.d.ts.map +1 -1
- package/lib/typescript/helpers/pushPayload.d.ts +1 -1
- package/lib/typescript/helpers/pushPayload.d.ts.map +1 -1
- package/lib/typescript/helpers/reportRoom.d.ts +19 -0
- package/lib/typescript/helpers/reportRoom.d.ts.map +1 -0
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/main.d.ts +6 -1
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/callState.api.d.ts +25 -0
- package/lib/typescript/networking/api-requests/callState.api.d.ts.map +1 -0
- package/lib/typescript/networking/api-requests/push.api.d.ts +9 -2
- package/lib/typescript/networking/api-requests/push.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts +2 -1
- package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/scheduledCalls.api.d.ts +86 -0
- package/lib/typescript/networking/api-requests/scheduledCalls.api.d.ts.map +1 -0
- package/lib/typescript/networking/callTokenStanza.d.ts.map +1 -1
- package/lib/typescript/roomStore/callSlice.d.ts +23 -1
- package/lib/typescript/roomStore/callSlice.d.ts.map +1 -1
- package/lib/typescript/services/appBadge.d.ts +3 -0
- package/lib/typescript/services/appBadge.d.ts.map +1 -0
- package/lib/typescript/services/languageSettings.d.ts +7 -0
- package/lib/typescript/services/languageSettings.d.ts.map +1 -1
- package/lib/typescript/services/pushRegistration.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +67 -4
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/booking/index.ts +10 -0
- package/src/booking/pendingScheduledCall.ts +272 -0
- package/src/booking/scheduleForm.ts +84 -0
- package/src/booking/scheduledCall.ts +163 -0
- package/src/booking/scheduledCallActions.ts +141 -0
- package/src/booking/scheduledCallLink.ts +145 -0
- package/src/booking/scheduledCallStore.ts +69 -0
- package/src/booking/startRoomCall.ts +103 -0
- package/src/calls/callBusy.ts +10 -0
- package/src/calls/callDisplay.ts +74 -0
- package/src/calls/callMode.ts +286 -0
- package/src/calls/declineReport.ts +16 -0
- package/src/calls/p2p/P2PCallController.ts +813 -0
- package/src/calls/p2p/icePolicy.ts +99 -0
- package/src/calls/p2p/negotiator.ts +186 -0
- package/src/calls/p2p/p2pRuntime.ts +164 -0
- package/src/calls/p2p/signalInbox.ts +117 -0
- package/src/calls/p2p/signalStanza.ts +205 -0
- package/src/calls/p2p/webrtcRuntime.ts +60 -0
- package/src/calls/senderTrust.ts +40 -0
- package/src/calls/startCall.ts +56 -0
- package/src/components/Booking/BookingIcons.tsx +44 -0
- package/src/components/Booking/ScheduleCallButton.tsx +66 -0
- package/src/components/Booking/ScheduleCallSheet.tsx +380 -0
- package/src/components/Booking/ScheduledCallCard.tsx +216 -0
- package/src/components/Booking/ScheduledCallHost.tsx +18 -0
- package/src/components/Booking/ScheduledCallMessage.tsx +62 -0
- package/src/components/Booking/ScheduledCallPreJoin.tsx +230 -0
- package/src/components/Booking/bookingShared.tsx +295 -0
- package/src/components/MainComponents/ChatHeader.tsx +2 -0
- package/src/components/MainComponents/LanguageSelectorButton.tsx +9 -2
- package/src/components/MainComponents/LanguageSelectorModal.tsx +10 -6
- package/src/components/MainComponents/MessageContainer.tsx +15 -0
- package/src/components/MainComponents/ReduxWrapper.tsx +10 -0
- package/src/components/Modals/ChatProfileModal/ReportChatModal.tsx +22 -22
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +28 -9
- package/src/components/Modals/UserSettingsModal/LanguageCard.tsx +9 -7
- package/src/components/VideoCalls/ActiveCallBar.tsx +6 -5
- package/src/components/VideoCalls/CallButtons.tsx +23 -12
- package/src/components/VideoCalls/CallControlBar.tsx +131 -0
- package/src/components/VideoCalls/CallVideo.tsx +59 -0
- package/src/components/VideoCalls/GroupCallView.tsx +324 -0
- package/src/components/VideoCalls/P2PCallRunner.tsx +192 -0
- package/src/components/VideoCalls/VideoCallOverlay.tsx +62 -17
- package/src/components/VideoCalls/VideoCallSession.tsx +55 -133
- package/src/components/VideoCalls/callActions.ts +3 -0
- package/src/components/VideoCalls/callElapsed.ts +27 -0
- package/src/components/VideoCalls/callLive.ts +13 -0
- package/src/components/VideoCalls/callSessionController.ts +130 -55
- package/src/components/VideoCalls/callSessionTypes.ts +80 -0
- package/src/components/VideoCalls/groupLayout.ts +48 -0
- package/src/components/VideoCalls/p2pCallSession.ts +291 -0
- package/src/components/VideoCalls/useCallKeep.ts +9 -2
- package/src/components/VideoCalls/useOngoingCallNotification.ts +2 -2
- package/src/context/xmppProvider.tsx +3 -0
- package/src/helpers/callPush.ts +13 -1
- package/src/helpers/incomingCallFromPush.ts +65 -7
- package/src/helpers/pushPayload.ts +9 -1
- package/src/helpers/reportRoom.ts +93 -0
- package/src/i18n/strings.ts +444 -0
- package/src/main.ts +33 -0
- package/src/networking/api-requests/callState.api.ts +83 -0
- package/src/networking/api-requests/push.api.ts +28 -3
- package/src/networking/api-requests/rooms.api.ts +12 -3
- package/src/networking/api-requests/scheduledCalls.api.ts +232 -0
- package/src/networking/callTokenStanza.ts +247 -50
- package/src/roomStore/callSlice.ts +86 -2
- package/src/services/appBadge.ts +85 -0
- package/src/services/languageSettings.ts +43 -8
- package/src/services/pushRegistration.ts +34 -3
- package/src/types/types.ts +70 -4
- package/src/version.ts +1 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { Element } from 'ltx';
|
|
2
|
+
import { xml } from '@xmpp/client';
|
|
3
|
+
|
|
4
|
+
// Wire format of the peer to peer call signalling. It travels as a direct
|
|
5
|
+
// XMPP chat message between the two users, no server involvement:
|
|
6
|
+
//
|
|
7
|
+
// <message type="chat" to="<peer bare jid>">
|
|
8
|
+
// <body>system</body>
|
|
9
|
+
// <data type="call-p2p" callId="..." signal="offer|answer|candidate|end"
|
|
10
|
+
// payload="<JSON string>"/>
|
|
11
|
+
// </message>
|
|
12
|
+
//
|
|
13
|
+
// payload is the SDP init ({type, sdp}) for offer/answer, the
|
|
14
|
+
// RTCIceCandidateInit for candidate and {reason} for end. This module only
|
|
15
|
+
// builds and parses stanzas, so it stays unit testable without a connection.
|
|
16
|
+
|
|
17
|
+
export const P2P_SIGNAL_TYPE = 'call-p2p';
|
|
18
|
+
|
|
19
|
+
export type P2PSignalName = 'offer' | 'answer' | 'candidate' | 'end';
|
|
20
|
+
|
|
21
|
+
export interface P2PSdpPayload {
|
|
22
|
+
type: 'offer' | 'answer';
|
|
23
|
+
sdp: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface P2PCandidatePayload {
|
|
27
|
+
candidate: string;
|
|
28
|
+
sdpMid?: string | null;
|
|
29
|
+
sdpMLineIndex?: number | null;
|
|
30
|
+
usernameFragment?: string | null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface P2PEndPayload {
|
|
34
|
+
reason?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type P2PSignalPayload =
|
|
38
|
+
| P2PSdpPayload
|
|
39
|
+
| P2PCandidatePayload
|
|
40
|
+
| P2PEndPayload;
|
|
41
|
+
|
|
42
|
+
export interface P2PSignal {
|
|
43
|
+
callId: string;
|
|
44
|
+
signal: P2PSignalName;
|
|
45
|
+
payload: P2PSignalPayload;
|
|
46
|
+
/** Sender's bare JID as written in `from` (lower-cased), '' when missing. */
|
|
47
|
+
fromBare: string;
|
|
48
|
+
/** Sender's xmpp localpart (the part before '@'), '' when missing. */
|
|
49
|
+
fromLocal: string;
|
|
50
|
+
/**
|
|
51
|
+
* Age of the stanza from the server's stanza-id timestamp, null when the
|
|
52
|
+
* stanza carries none (direct messages often do not).
|
|
53
|
+
*/
|
|
54
|
+
ageMs: number | null;
|
|
55
|
+
/** Carries <delay/>: it was stored offline and replayed, so it is stale. */
|
|
56
|
+
delayed: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// SDP for a call with audio + video + data-less sections is a few KB; this
|
|
60
|
+
// only guards against a hostile peer pushing megabytes through an attribute.
|
|
61
|
+
const MAX_SDP_LENGTH = 64 * 1024;
|
|
62
|
+
const MAX_REASON_LENGTH = 64;
|
|
63
|
+
|
|
64
|
+
// A signal older than this (by the server's own timestamp) is not part of a
|
|
65
|
+
// live negotiation. Call-tokens use 5 s; signalling gets more headroom because
|
|
66
|
+
// candidates can queue behind a slow permission prompt on the sender, but
|
|
67
|
+
// anything the server replays after a reconnect is far older.
|
|
68
|
+
export const MAX_P2P_SIGNAL_AGE_MS = 15_000;
|
|
69
|
+
|
|
70
|
+
let outgoingCounter = 0;
|
|
71
|
+
|
|
72
|
+
export const buildP2PSignalStanza = (params: {
|
|
73
|
+
to: string;
|
|
74
|
+
callId: string;
|
|
75
|
+
signal: P2PSignalName;
|
|
76
|
+
payload?: P2PSignalPayload;
|
|
77
|
+
}): Element => {
|
|
78
|
+
outgoingCounter = (outgoingCounter + 1) % 1_000_000;
|
|
79
|
+
return xml(
|
|
80
|
+
'message',
|
|
81
|
+
{
|
|
82
|
+
to: params.to,
|
|
83
|
+
type: 'chat',
|
|
84
|
+
id: `call-p2p-${Date.now()}-${outgoingCounter}`,
|
|
85
|
+
},
|
|
86
|
+
xml('body', {}, 'system'),
|
|
87
|
+
xml('data', {
|
|
88
|
+
type: P2P_SIGNAL_TYPE,
|
|
89
|
+
callId: params.callId,
|
|
90
|
+
signal: params.signal,
|
|
91
|
+
// JSON.stringify escapes newlines in the SDP, so the attribute survives
|
|
92
|
+
// XML attribute-value normalisation on the receiving parser.
|
|
93
|
+
payload: JSON.stringify(params.payload ?? {}),
|
|
94
|
+
}),
|
|
95
|
+
// Signalling is only meaningful live: keep it out of the archive and the
|
|
96
|
+
// offline store (a replayed offer for a finished call is just noise).
|
|
97
|
+
xml('no-store', { xmlns: 'urn:xmpp:hints' }),
|
|
98
|
+
xml('no-permanent-store', { xmlns: 'urn:xmpp:hints' })
|
|
99
|
+
) as unknown as Element;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const SIGNAL_NAMES: ReadonlySet<string> = new Set([
|
|
103
|
+
'offer',
|
|
104
|
+
'answer',
|
|
105
|
+
'candidate',
|
|
106
|
+
'end',
|
|
107
|
+
]);
|
|
108
|
+
|
|
109
|
+
const validatePayload = (
|
|
110
|
+
signal: P2PSignalName,
|
|
111
|
+
raw: unknown
|
|
112
|
+
): P2PSignalPayload | null => {
|
|
113
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
114
|
+
const p = raw as Record<string, unknown>;
|
|
115
|
+
if (signal === 'offer' || signal === 'answer') {
|
|
116
|
+
if (p.type !== signal) return null;
|
|
117
|
+
if (typeof p.sdp !== 'string' || !p.sdp || p.sdp.length > MAX_SDP_LENGTH) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return { type: signal, sdp: p.sdp };
|
|
121
|
+
}
|
|
122
|
+
if (signal === 'candidate') {
|
|
123
|
+
if (typeof p.candidate !== 'string' || p.candidate.length > 2048) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
candidate: p.candidate,
|
|
128
|
+
sdpMid: typeof p.sdpMid === 'string' ? p.sdpMid : null,
|
|
129
|
+
sdpMLineIndex:
|
|
130
|
+
typeof p.sdpMLineIndex === 'number' ? p.sdpMLineIndex : null,
|
|
131
|
+
usernameFragment:
|
|
132
|
+
typeof p.usernameFragment === 'string' ? p.usernameFragment : null,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
reason:
|
|
137
|
+
typeof p.reason === 'string'
|
|
138
|
+
? p.reason.slice(0, MAX_REASON_LENGTH)
|
|
139
|
+
: undefined,
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// Same trick as the call-token freshness check: the server stamps a
|
|
144
|
+
// microsecond id on archived stanzas and the first 13 digits are epoch ms.
|
|
145
|
+
const stanzaAgeMs = (stanza: Element, now: number): number | null => {
|
|
146
|
+
const id = String(stanza.getChild('stanza-id')?.attrs?.id || '').trim();
|
|
147
|
+
if (!id) return null;
|
|
148
|
+
const match = id.match(/\d{13,}/)?.[0];
|
|
149
|
+
if (!match) return null;
|
|
150
|
+
const ts = Number(match.slice(0, 13));
|
|
151
|
+
return Number.isFinite(ts) && ts > 0 ? Math.abs(now - ts) : null;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Reads a `call-p2p` message. Returns null for anything that is not a
|
|
156
|
+
* well formed signal (wrong type, unknown signal, bad JSON, bad payload).
|
|
157
|
+
*/
|
|
158
|
+
export const parseP2PSignalStanza = (
|
|
159
|
+
stanza: Element,
|
|
160
|
+
now: number = Date.now()
|
|
161
|
+
): P2PSignal | null => {
|
|
162
|
+
const data = stanza?.getChild?.('data');
|
|
163
|
+
if (!data || String(data.attrs?.type || '').toLowerCase() !== P2P_SIGNAL_TYPE) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const callId = String(data.attrs?.callId || data.attrs?.callid || '').trim();
|
|
167
|
+
const signal = String(data.attrs?.signal || '')
|
|
168
|
+
.trim()
|
|
169
|
+
.toLowerCase();
|
|
170
|
+
if (!callId || !SIGNAL_NAMES.has(signal)) return null;
|
|
171
|
+
|
|
172
|
+
let parsed: unknown;
|
|
173
|
+
try {
|
|
174
|
+
parsed = JSON.parse(String(data.attrs?.payload || '{}'));
|
|
175
|
+
} catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const payload = validatePayload(signal as P2PSignalName, parsed);
|
|
179
|
+
if (!payload) return null;
|
|
180
|
+
|
|
181
|
+
const fromBare = String(stanza.attrs?.from || '')
|
|
182
|
+
.split('/')[0]
|
|
183
|
+
.trim()
|
|
184
|
+
.toLowerCase();
|
|
185
|
+
return {
|
|
186
|
+
callId,
|
|
187
|
+
signal: signal as P2PSignalName,
|
|
188
|
+
payload,
|
|
189
|
+
fromBare,
|
|
190
|
+
fromLocal: fromBare.split('@')[0],
|
|
191
|
+
ageMs: stanzaAgeMs(stanza, now),
|
|
192
|
+
delayed: !!stanza.getChild?.('delay'),
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Whether a parsed signal belongs to a live negotiation. An `end` is always
|
|
198
|
+
* accepted unless replayed (it only ever acts on a call that is still
|
|
199
|
+
* active, and stopping a call late is better than never).
|
|
200
|
+
*/
|
|
201
|
+
export const isP2PSignalFresh = (signal: P2PSignal): boolean => {
|
|
202
|
+
if (signal.delayed) return false;
|
|
203
|
+
if (signal.signal === 'end') return true;
|
|
204
|
+
return signal.ageMs === null || signal.ageMs <= MAX_P2P_SIGNAL_AGE_MS;
|
|
205
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional-dependency bridge for the WebRTC classes behind peer to peer calls.
|
|
3
|
+
*
|
|
4
|
+
* LiveKit's React Native SDK already ships a fork of react-native-webrtc,
|
|
5
|
+
* `@livekit/react-native-webrtc`. The p2p path uses ITS RTCPeerConnection and
|
|
6
|
+
* mediaDevices rather than adding the upstream `react-native-webrtc` package:
|
|
7
|
+
* two copies of the WebRTC native classes in one app do not link. Like every
|
|
8
|
+
* other call dependency it is an optional peer, so it is required lazily and
|
|
9
|
+
* a host without it simply cannot take or place a p2p call (a call-token for
|
|
10
|
+
* one is declined, see callTokenStanza).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export interface WebRTCRuntime {
|
|
14
|
+
/** `RTCPeerConnection` constructor of the fork. */
|
|
15
|
+
RTCPeerConnection: any;
|
|
16
|
+
/** `mediaDevices.getUserMedia` of the fork. */
|
|
17
|
+
mediaDevices: any;
|
|
18
|
+
/** `MediaStream` constructor of the fork. */
|
|
19
|
+
MediaStream: any;
|
|
20
|
+
/** `<RTCView streamURL={...} />` renderer. */
|
|
21
|
+
RTCView: any;
|
|
22
|
+
/**
|
|
23
|
+
* `RTCAudioSession`: tells WebRTC when CallKit activates/deactivates the
|
|
24
|
+
* iOS audio session. Null on builds that lack it.
|
|
25
|
+
*/
|
|
26
|
+
RTCAudioSession: any;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let cached: WebRTCRuntime | null | undefined;
|
|
30
|
+
|
|
31
|
+
export const loadWebRTC = (): WebRTCRuntime | null => {
|
|
32
|
+
if (cached !== undefined) {
|
|
33
|
+
return cached;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const webrtc = require('@livekit/react-native-webrtc');
|
|
37
|
+
if (!webrtc?.RTCPeerConnection || !webrtc?.mediaDevices) {
|
|
38
|
+
cached = null;
|
|
39
|
+
} else {
|
|
40
|
+
cached = {
|
|
41
|
+
RTCPeerConnection: webrtc.RTCPeerConnection,
|
|
42
|
+
mediaDevices: webrtc.mediaDevices,
|
|
43
|
+
MediaStream: webrtc.MediaStream,
|
|
44
|
+
RTCView: webrtc.RTCView,
|
|
45
|
+
RTCAudioSession: webrtc.RTCAudioSession ?? null,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
} catch {
|
|
49
|
+
cached = null;
|
|
50
|
+
}
|
|
51
|
+
return cached;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** True when this build can run a peer to peer call. */
|
|
55
|
+
export const isP2PAvailable = (): boolean => loadWebRTC() !== null;
|
|
56
|
+
|
|
57
|
+
/** Reset memoised state. Test seam only. */
|
|
58
|
+
export const __resetWebRTCRuntimeForTests = (): void => {
|
|
59
|
+
cached = undefined;
|
|
60
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Which senders may steer a call's network targets.
|
|
2
|
+
//
|
|
3
|
+
// A call-token can carry two attributes that decide WHERE media goes: the
|
|
4
|
+
// LiveKit `livekitUrl` and, for p2p, the `ice` list (TURN servers and their
|
|
5
|
+
// credentials). Honouring them from an arbitrary sender would let any user
|
|
6
|
+
// ring a victim with a forged call-token and route their camera and
|
|
7
|
+
// microphone to a server the sender controls once the call is accepted. The
|
|
8
|
+
// backend sends every genuine call-token from the app's system account, and
|
|
9
|
+
// ejabberd stamps the real JID on every message a client sends, so a normal
|
|
10
|
+
// user cannot appear as that account.
|
|
11
|
+
//
|
|
12
|
+
// The system account's local part is `<appId>_<appId>`: the 24 hex character
|
|
13
|
+
// app id, an underscore, the same 24 hex characters again.
|
|
14
|
+
|
|
15
|
+
const SYSTEM_ACCOUNT_LOCAL = /^([0-9a-fA-F]{24})_\1$/;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* True when `fromJid` is the app's system account. The resource is ignored.
|
|
19
|
+
* When `expectedDomain` is given the sender must also be on that XMPP domain,
|
|
20
|
+
* so a same-looking account on a federated server is not accepted. A missing
|
|
21
|
+
* or malformed JID is never trusted.
|
|
22
|
+
*/
|
|
23
|
+
export const isSystemAccountSender = (
|
|
24
|
+
fromJid: unknown,
|
|
25
|
+
expectedDomain?: string | null
|
|
26
|
+
): boolean => {
|
|
27
|
+
const from = typeof fromJid === 'string' ? fromJid.trim() : '';
|
|
28
|
+
if (!from) return false;
|
|
29
|
+
const bare = from.split('/')[0];
|
|
30
|
+
const at = bare.indexOf('@');
|
|
31
|
+
if (at <= 0 || bare.indexOf('@', at + 1) !== -1) return false;
|
|
32
|
+
const local = bare.slice(0, at);
|
|
33
|
+
const domain = bare.slice(at + 1).toLowerCase();
|
|
34
|
+
if (!domain) return false;
|
|
35
|
+
if (!SYSTEM_ACCOUNT_LOCAL.test(local)) return false;
|
|
36
|
+
const expected = String(expectedDomain || '')
|
|
37
|
+
.trim()
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
return !expected || domain === expected;
|
|
40
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { store } from '../roomStore';
|
|
2
|
+
import { setOutgoingCallRoute } from '../roomStore/callSlice';
|
|
3
|
+
import { createChatCall } from '../networking/api-requests/rooms.api';
|
|
4
|
+
import { reportCallEnded } from '../networking/api-requests/callState.api';
|
|
5
|
+
import { sendCallStateSignal } from '../networking/callTokenStanza';
|
|
6
|
+
import type { CallKindName } from './callMode';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Second half of placing a call, shared by every dial entry point (chat
|
|
10
|
+
* header, profile modal): POST /v1/chats/call/create and record how the server
|
|
11
|
+
* decided to carry the call in the call slice. The caller has already
|
|
12
|
+
* dispatched startOutgoingCall.
|
|
13
|
+
*
|
|
14
|
+
* Throws when the request fails (the entry point shows the message). A p2p
|
|
15
|
+
* answer that lands after the user already cancelled is cleaned up here: the
|
|
16
|
+
* server has already rung the callee, and nothing else knows its callId.
|
|
17
|
+
*/
|
|
18
|
+
export async function requestOutgoingCall(params: {
|
|
19
|
+
chatName: string;
|
|
20
|
+
kind: CallKindName;
|
|
21
|
+
peerXmppUsername?: string | null;
|
|
22
|
+
}): Promise<void> {
|
|
23
|
+
const startedAt = store.getState().call.startedAt;
|
|
24
|
+
const result = await createChatCall(params.chatName, { kind: params.kind });
|
|
25
|
+
|
|
26
|
+
const current = store.getState().call;
|
|
27
|
+
const stillCurrent =
|
|
28
|
+
current.phase !== 'idle' &&
|
|
29
|
+
current.direction === 'outgoing' &&
|
|
30
|
+
current.startedAt === startedAt;
|
|
31
|
+
|
|
32
|
+
if (!stillCurrent) {
|
|
33
|
+
if (result.mode === 'p2p') {
|
|
34
|
+
reportCallEnded(result.callId);
|
|
35
|
+
if (params.peerXmppUsername) {
|
|
36
|
+
sendCallStateSignal('cancelled', {
|
|
37
|
+
peerXmppUsername: params.peerXmppUsername,
|
|
38
|
+
callId: result.callId,
|
|
39
|
+
roomBareName: params.chatName,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
store.dispatch(
|
|
47
|
+
setOutgoingCallRoute({
|
|
48
|
+
startedAt,
|
|
49
|
+
callId: result.callId,
|
|
50
|
+
mode: result.mode,
|
|
51
|
+
group: result.group,
|
|
52
|
+
livekitUrl: result.livekitUrl,
|
|
53
|
+
iceServers: result.iceServers,
|
|
54
|
+
})
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Svg, { Line, Rect } from 'react-native-svg';
|
|
3
|
+
|
|
4
|
+
interface IconProps {
|
|
5
|
+
color?: string;
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Calendar glyph for the header's "Schedule a call" button. */
|
|
10
|
+
export const ScheduleCallIcon: React.FC<IconProps> = ({
|
|
11
|
+
color = '#000000',
|
|
12
|
+
size = 22,
|
|
13
|
+
}) => (
|
|
14
|
+
<Svg width={size} height={size} viewBox="0 0 24 24" fill="none">
|
|
15
|
+
<Rect
|
|
16
|
+
x="3.5"
|
|
17
|
+
y="5"
|
|
18
|
+
width="17"
|
|
19
|
+
height="15.5"
|
|
20
|
+
rx="2.5"
|
|
21
|
+
stroke={color}
|
|
22
|
+
strokeWidth={1.8}
|
|
23
|
+
/>
|
|
24
|
+
<Line x1="3.5" y1="10" x2="20.5" y2="10" stroke={color} strokeWidth={1.8} />
|
|
25
|
+
<Line
|
|
26
|
+
x1="8"
|
|
27
|
+
y1="3"
|
|
28
|
+
x2="8"
|
|
29
|
+
y2="6.5"
|
|
30
|
+
stroke={color}
|
|
31
|
+
strokeWidth={1.8}
|
|
32
|
+
strokeLinecap="round"
|
|
33
|
+
/>
|
|
34
|
+
<Line
|
|
35
|
+
x1="16"
|
|
36
|
+
y1="3"
|
|
37
|
+
x2="16"
|
|
38
|
+
y2="6.5"
|
|
39
|
+
stroke={color}
|
|
40
|
+
strokeWidth={1.8}
|
|
41
|
+
strokeLinecap="round"
|
|
42
|
+
/>
|
|
43
|
+
</Svg>
|
|
44
|
+
);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StyleSheet, TouchableOpacity } from 'react-native';
|
|
3
|
+
import { useSelector } from 'react-redux';
|
|
4
|
+
import type { RootState } from '../../roomStore';
|
|
5
|
+
import { useChatSettingState } from '../../hooks/useChatSettingState';
|
|
6
|
+
import { useT } from '../../i18n/useT';
|
|
7
|
+
import { getIconColor } from '../../helpers/getIconColor';
|
|
8
|
+
import { scheduledCallUi } from '../../booking/scheduledCallStore';
|
|
9
|
+
import { ScheduleCallIcon } from './BookingIcons';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* "Schedule a call" next to the call buttons of the room header. Renders
|
|
13
|
+
* nothing unless calls are on and calls are allowed in this kind of room
|
|
14
|
+
* (`videoCalls.allowedRoomTypes`, private and group by default) and `scheduledCalls.enabled`
|
|
15
|
+
* is not false, so a host that does
|
|
16
|
+
* not use calls sees no change.
|
|
17
|
+
*/
|
|
18
|
+
export const ScheduleCallButton: React.FC = () => {
|
|
19
|
+
const t = useT();
|
|
20
|
+
const { config } = useChatSettingState();
|
|
21
|
+
const room = useSelector((state: RootState) => {
|
|
22
|
+
const jid = state.rooms.activeRoomJID;
|
|
23
|
+
return jid ? state.rooms.rooms[jid] : null;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const calls = config?.videoCalls;
|
|
27
|
+
// 1:1 and members-only group rooms by default (the room types a call can run
|
|
28
|
+
// in), narrowed or widened by the host's videoCalls.allowedRoomTypes.
|
|
29
|
+
const allowed = ((calls?.allowedRoomTypes as string[] | undefined) || [
|
|
30
|
+
'private',
|
|
31
|
+
'group',
|
|
32
|
+
]).includes(String(room?.type || ''));
|
|
33
|
+
if (
|
|
34
|
+
calls?.enabled !== true ||
|
|
35
|
+
config?.scheduledCalls?.enabled === false ||
|
|
36
|
+
!room?.jid ||
|
|
37
|
+
!allowed
|
|
38
|
+
) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<TouchableOpacity
|
|
44
|
+
testID="schedule-call-button"
|
|
45
|
+
accessibilityRole="button"
|
|
46
|
+
accessibilityLabel={t('booking.scheduleCallLabel')}
|
|
47
|
+
onPress={() => scheduledCallUi.openCreate(room.jid)}
|
|
48
|
+
style={styles.button}
|
|
49
|
+
hitSlop={8}
|
|
50
|
+
>
|
|
51
|
+
<ScheduleCallIcon color={getIconColor(config)} size={22} />
|
|
52
|
+
</TouchableOpacity>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const styles = StyleSheet.create({
|
|
57
|
+
button: {
|
|
58
|
+
width: 36,
|
|
59
|
+
height: 36,
|
|
60
|
+
borderRadius: 18,
|
|
61
|
+
alignItems: 'center',
|
|
62
|
+
justifyContent: 'center',
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export default ScheduleCallButton;
|