From 34bb05bd8840522a865087fa83baee8e940ebeae Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 25 Mar 2021 19:57:20 +0000 Subject: [PATCH] WIP attended transfer --- src/webrtc/call.ts | 44 +++++++++++++++++++++++++++++++++--- src/webrtc/callEventTypes.ts | 1 + 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index eb567ce70..c5d370499 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -1527,7 +1527,10 @@ export class MatrixCall extends EventEmitter { } } - async transfer(targetUserId: string, targetRoomId?: string) { + /* + * Transfers this call to another user + */ + async transfer(targetUserId: string) { // Fetch the target user's global profile info: their room avatar / displayname // could be different in whatever room we shae with them. const profileInfo = await this.client.getProfileInfo(targetUserId); @@ -1544,11 +1547,46 @@ export class MatrixCall extends EventEmitter { create_call: replacementId, } as MCallReplacesEvent; - if (targetRoomId) body.target_room = targetRoomId; - return this.sendVoipEvent(EventType.CallReplaces, body); } + /* + * Transfers this call to the target call, effectively 'joining' the + * two calls (so the remote parties on each call are connected together). + */ + async transferToCall(transferTargetCall?: MatrixCall) { + const targetProfileInfo = await this.client.getProfileInfo(transferTargetCall.getOpponentMember().userId); + const transfereeProfileInfo = await this.client.getProfileInfo(this.getOpponentMember().userId); + + const newCallId = genCallID(); + + const bodyToTransferTarget = { + // the replacements on each side have their own ID, and it's distinct from the + // ID of the new call (but we can use the same function to generate it) + replacement_id: genCallID(), + target_user: { + id: this.getOpponentMember().userId, + display_name: transfereeProfileInfo.display_name, + avatar_url: transfereeProfileInfo.avatar_url, + }, + await_call: newCallId, + } as MCallReplacesEvent; + + await transferTargetCall.sendVoipEvent(EventType.CallReplaces, bodyToTransferTarget); + + const bodyToTransferee = { + replacement_id: genCallID(), + target_user: { + id: transferTargetCall.getOpponentMember().userId, + display_name: targetProfileInfo.display_name, + avatar_url: targetProfileInfo.avatar_url, + }, + create_call: newCallId, + } as MCallReplacesEvent; + + await this.sendVoipEvent(EventType.CallReplaces, bodyToTransferee); + } + private async terminate(hangupParty: CallParty, hangupReason: CallErrorCode, shouldEmit: boolean) { if (this.callHasEnded()) return; diff --git a/src/webrtc/callEventTypes.ts b/src/webrtc/callEventTypes.ts index 11d1cdd76..c68903bb8 100644 --- a/src/webrtc/callEventTypes.ts +++ b/src/webrtc/callEventTypes.ts @@ -32,6 +32,7 @@ export interface MCallReplacesEvent { replacement_id: string; target_user: MCallReplacesTarget; create_call: string; + await_call: string; target_room: string; } /* eslint-enable camelcase */