Explicitly handle first state change
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
parent
533f2c2c98
commit
1d664f0914
1 changed files with 86 additions and 79 deletions
|
@ -464,8 +464,66 @@ export default class CallHandler extends EventEmitter {
|
||||||
this.removeCallForRoom(mappedRoomId);
|
this.removeCallForRoom(mappedRoomId);
|
||||||
});
|
});
|
||||||
call.on(CallEvent.State, (newState: CallState, oldState: CallState) => {
|
call.on(CallEvent.State, (newState: CallState, oldState: CallState) => {
|
||||||
|
this.onCallStateChanged(newState, oldState, call);
|
||||||
|
});
|
||||||
|
call.on(CallEvent.Replaced, (newCall: MatrixCall) => {
|
||||||
if (!this.matchesCallForThisRoom(call)) return;
|
if (!this.matchesCallForThisRoom(call)) return;
|
||||||
|
|
||||||
|
console.log(`Call ID ${call.callId} is being replaced by call ID ${newCall.callId}`);
|
||||||
|
|
||||||
|
if (call.state === CallState.Ringing) {
|
||||||
|
this.pause(AudioID.Ring);
|
||||||
|
} else if (call.state === CallState.InviteSent) {
|
||||||
|
this.pause(AudioID.Ringback);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.calls.set(mappedRoomId, newCall);
|
||||||
|
this.emit(CallHandlerEvent.CallsChanged, this.calls);
|
||||||
|
this.setCallListeners(newCall);
|
||||||
|
this.setCallState(newCall, newCall.state);
|
||||||
|
});
|
||||||
|
call.on(CallEvent.AssertedIdentityChanged, async () => {
|
||||||
|
if (!this.matchesCallForThisRoom(call)) return;
|
||||||
|
|
||||||
|
console.log(`Call ID ${call.callId} got new asserted identity:`, call.getRemoteAssertedIdentity());
|
||||||
|
|
||||||
|
const newAssertedIdentity = call.getRemoteAssertedIdentity().id;
|
||||||
|
let newNativeAssertedIdentity = newAssertedIdentity;
|
||||||
|
if (newAssertedIdentity) {
|
||||||
|
const response = await this.sipNativeLookup(newAssertedIdentity);
|
||||||
|
if (response.length && response[0].fields.lookup_success) {
|
||||||
|
newNativeAssertedIdentity = response[0].userid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(`Asserted identity ${newAssertedIdentity} mapped to ${newNativeAssertedIdentity}`);
|
||||||
|
|
||||||
|
if (newNativeAssertedIdentity) {
|
||||||
|
this.assertedIdentityNativeUsers[call.callId] = newNativeAssertedIdentity;
|
||||||
|
|
||||||
|
// If we don't already have a room with this user, make one. This will be slightly odd
|
||||||
|
// if they called us because we'll be inviting them, but there's not much we can do about
|
||||||
|
// this if we want the actual, native room to exist (which we do). This is why it's
|
||||||
|
// important to only obey asserted identity in trusted environments, since anyone you're
|
||||||
|
// on a call with can cause you to send a room invite to someone.
|
||||||
|
await ensureDMExists(MatrixClientPeg.get(), newNativeAssertedIdentity);
|
||||||
|
|
||||||
|
const newMappedRoomId = this.roomIdForCall(call);
|
||||||
|
console.log(`Old room ID: ${mappedRoomId}, new room ID: ${newMappedRoomId}`);
|
||||||
|
if (newMappedRoomId !== mappedRoomId) {
|
||||||
|
this.removeCallForRoom(mappedRoomId);
|
||||||
|
mappedRoomId = newMappedRoomId;
|
||||||
|
console.log("Moving call to room " + mappedRoomId);
|
||||||
|
this.calls.set(mappedRoomId, call);
|
||||||
|
this.emit(CallHandlerEvent.CallChangeRoom, call);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private onCallStateChanged = (newState: CallState, oldState: CallState, call: MatrixCall): void => {
|
||||||
|
if (!this.matchesCallForThisRoom(call)) return;
|
||||||
|
|
||||||
|
const mappedRoomId = this.roomIdForCall(call);
|
||||||
this.setCallState(call, newState);
|
this.setCallState(call, newState);
|
||||||
|
|
||||||
switch (oldState) {
|
switch (oldState) {
|
||||||
|
@ -543,60 +601,7 @@ export default class CallHandler extends EventEmitter {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
call.on(CallEvent.Replaced, (newCall: MatrixCall) => {
|
|
||||||
if (!this.matchesCallForThisRoom(call)) return;
|
|
||||||
|
|
||||||
console.log(`Call ID ${call.callId} is being replaced by call ID ${newCall.callId}`);
|
|
||||||
|
|
||||||
if (call.state === CallState.Ringing) {
|
|
||||||
this.pause(AudioID.Ring);
|
|
||||||
} else if (call.state === CallState.InviteSent) {
|
|
||||||
this.pause(AudioID.Ringback);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.calls.set(mappedRoomId, newCall);
|
|
||||||
this.emit(CallHandlerEvent.CallsChanged, this.calls);
|
|
||||||
this.setCallListeners(newCall);
|
|
||||||
this.setCallState(newCall, newCall.state);
|
|
||||||
});
|
|
||||||
call.on(CallEvent.AssertedIdentityChanged, async () => {
|
|
||||||
if (!this.matchesCallForThisRoom(call)) return;
|
|
||||||
|
|
||||||
console.log(`Call ID ${call.callId} got new asserted identity:`, call.getRemoteAssertedIdentity());
|
|
||||||
|
|
||||||
const newAssertedIdentity = call.getRemoteAssertedIdentity().id;
|
|
||||||
let newNativeAssertedIdentity = newAssertedIdentity;
|
|
||||||
if (newAssertedIdentity) {
|
|
||||||
const response = await this.sipNativeLookup(newAssertedIdentity);
|
|
||||||
if (response.length && response[0].fields.lookup_success) {
|
|
||||||
newNativeAssertedIdentity = response[0].userid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(`Asserted identity ${newAssertedIdentity} mapped to ${newNativeAssertedIdentity}`);
|
|
||||||
|
|
||||||
if (newNativeAssertedIdentity) {
|
|
||||||
this.assertedIdentityNativeUsers[call.callId] = newNativeAssertedIdentity;
|
|
||||||
|
|
||||||
// If we don't already have a room with this user, make one. This will be slightly odd
|
|
||||||
// if they called us because we'll be inviting them, but there's not much we can do about
|
|
||||||
// this if we want the actual, native room to exist (which we do). This is why it's
|
|
||||||
// important to only obey asserted identity in trusted environments, since anyone you're
|
|
||||||
// on a call with can cause you to send a room invite to someone.
|
|
||||||
await ensureDMExists(MatrixClientPeg.get(), newNativeAssertedIdentity);
|
|
||||||
|
|
||||||
const newMappedRoomId = this.roomIdForCall(call);
|
|
||||||
console.log(`Old room ID: ${mappedRoomId}, new room ID: ${newMappedRoomId}`);
|
|
||||||
if (newMappedRoomId !== mappedRoomId) {
|
|
||||||
this.removeCallForRoom(mappedRoomId);
|
|
||||||
mappedRoomId = newMappedRoomId;
|
|
||||||
console.log("Moving call to room " + mappedRoomId);
|
|
||||||
this.calls.set(mappedRoomId, call);
|
|
||||||
this.emit(CallHandlerEvent.CallChangeRoom, call);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private async logCallStats(call: MatrixCall, mappedRoomId: string) {
|
private async logCallStats(call: MatrixCall, mappedRoomId: string) {
|
||||||
const stats = await call.getCurrentCallStats();
|
const stats = await call.getCurrentCallStats();
|
||||||
|
@ -861,6 +866,8 @@ export default class CallHandler extends EventEmitter {
|
||||||
this.calls.set(mappedRoomId, call);
|
this.calls.set(mappedRoomId, call);
|
||||||
this.emit(CallHandlerEvent.CallsChanged, this.calls);
|
this.emit(CallHandlerEvent.CallsChanged, this.calls);
|
||||||
this.setCallListeners(call);
|
this.setCallListeners(call);
|
||||||
|
// Explicitly handle first state change
|
||||||
|
this.onCallStateChanged(call.state, null, call);
|
||||||
|
|
||||||
// get ready to send encrypted events in the room, so if the user does answer
|
// get ready to send encrypted events in the room, so if the user does answer
|
||||||
// the call, we'll be ready to send. NB. This is the protocol-level room ID not
|
// the call, we'll be ready to send. NB. This is the protocol-level room ID not
|
||||||
|
|
Loading…
Reference in a new issue