Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/lib/services/voip/MediaCallEvents.ios.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ jest.mock('../restApi', () => ({
registerPushToken: jest.fn(() => Promise.resolve())
}));

jest.mock('../connect', () => ({
checkAndReopen: jest.fn()
}));

jest.mock('./MediaCallLogger', () => {
const log = jest.fn();
const debug = jest.fn();
Expand Down
65 changes: 65 additions & 0 deletions app/lib/services/voip/MediaCallEvents.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ jest.mock('../restApi', () => ({
registerPushToken: jest.fn(() => Promise.resolve())
}));

jest.mock('../connect', () => ({
checkAndReopen: jest.fn()
}));

jest.mock('./MediaCallLogger', () => ({
MediaCallLogger: class {
log = jest.fn();
Expand Down Expand Up @@ -159,6 +163,67 @@ describe('MediaCallEvents cross-server accept (slice 3)', () => {
expect(mockOnOpenDeepLink).not.toHaveBeenCalled();
});

it('triggers SDK reconnect via checkAndReopen when host matches active workspace', () => {
const { checkAndReopen } = jest.requireMock('../connect');
mockServerSelector.mockReturnValueOnce('https://workspace-a.example.com');
const payload = buildIncomingPayload({
callId: 'reopen-trigger-call',
host: 'https://workspace-a.example.com'
});

DeviceEventEmitter.emit('VoipAcceptSucceeded', payload);

expect(checkAndReopen).toHaveBeenCalledTimes(1);
});

it('does not trigger SDK reconnect when host belongs to a different workspace', () => {
const { checkAndReopen } = jest.requireMock('../connect');
const payload = buildIncomingPayload({
callId: 'cross-ws-call',
host: 'https://workspace-b.open.rocket.chat'
});

DeviceEventEmitter.emit('VoipAcceptSucceeded', payload);

expect(checkAndReopen).not.toHaveBeenCalled();
});

it('triggers SDK reconnect only once for duplicate VoipAcceptSucceeded with the same callId', () => {
const { checkAndReopen } = jest.requireMock('../connect');
mockServerSelector.mockReturnValue('https://workspace-a.example.com');
const payload = buildIncomingPayload({
callId: 'reopen-dedupe',
host: 'https://workspace-a.example.com'
});

DeviceEventEmitter.emit('VoipAcceptSucceeded', payload);
DeviceEventEmitter.emit('VoipAcceptSucceeded', payload);

expect(checkAndReopen).toHaveBeenCalledTimes(1);
});

it('triggers SDK reconnect before replaying REST state signals', () => {
const { checkAndReopen } = jest.requireMock('../connect');
const { mediaSessionInstance } = jest.requireMock('./MediaSessionInstance');
const callOrder: string[] = [];
(checkAndReopen as jest.Mock).mockImplementationOnce(() => {
callOrder.push('checkAndReopen');
});
(mediaSessionInstance.applyRestStateSignals as jest.Mock).mockImplementationOnce(() => {
callOrder.push('applyRestStateSignals');
return Promise.resolve();
});
mockServerSelector.mockReturnValueOnce('https://workspace-a.example.com');
const payload = buildIncomingPayload({
callId: 'reopen-order',
host: 'https://workspace-a.example.com'
});

DeviceEventEmitter.emit('VoipAcceptSucceeded', payload);

expect(callOrder).toEqual(['checkAndReopen', 'applyRestStateSignals']);
});

it('does not open deep link or set native id when type is not incoming_call', () => {
DeviceEventEmitter.emit(
'VoipAcceptSucceeded',
Expand Down
3 changes: 3 additions & 0 deletions app/lib/services/voip/MediaCallEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useCallStore } from './useCallStore';
import { mediaSessionInstance } from './MediaSessionInstance';
import type { VoipPayload } from '../../../definitions/Voip';
import NativeVoipModule from '../../native/NativeVoip';
import { checkAndReopen } from '../connect';
import { registerPushToken } from '../restApi';
import { MediaCallLogger } from './MediaCallLogger';

Expand Down Expand Up @@ -94,6 +95,8 @@ function handleVoipAcceptSucceededFromNative(data: VoipPayload, adapters: MediaC
NativeVoipModule.clearInitialEvents();
useCallStore.getState().setNativeAcceptedCallId(data.callId);
if (data.host && isVoipIncomingHostCurrentWorkspace(data.host, adapters.getActiveServerUrl)) {
mediaCallLogger.debug(`${TAG} Triggering SDK reconnect on native accept`);
checkAndReopen();
mediaSessionInstance.applyRestStateSignals().catch(error => {
mediaCallLogger.error(`${TAG} applyRestStateSignals failed:`, error);
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
Expand Down
Loading