diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index f1af549ca..5849e39eb 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -128,7 +128,9 @@ export enum CallEvent { AssertedIdentityChanged = 'asserted_identity_changed', - LengthChanged = 'length_changed' + LengthChanged = 'length_changed', + + DataChannel = 'datachannel', } export enum CallErrorCode { @@ -342,6 +344,18 @@ export class MatrixCall extends EventEmitter { await this.placeCall(true, true); } + /** + * Create a datachannel using this call's peer connection. + * @param label A human readable label for this datachannel + * @param options An object providing configuration options for the data channel. + */ + public createDataChannel(label: string, options: RTCDataChannelInit) { + const dataChannel = this.peerConn.createDataChannel(label, options); + this.emit(CallEvent.DataChannel, dataChannel); + logger.debug("created data channel"); + return dataChannel; + } + public getOpponentMember(): RoomMember { return this.opponentMember; } @@ -1495,6 +1509,10 @@ export class MatrixCall extends EventEmitter { stream.addEventListener("removetrack", () => this.deleteFeedByStream(stream)); }; + private onDataChannel = (ev: RTCDataChannelEvent): void => { + this.emit(CallEvent.DataChannel, ev.channel); + }; + /** * This method removes all video/rtx codecs from screensharing video * transceivers. This is necessary since they can cause problems. Without @@ -1866,6 +1884,7 @@ export class MatrixCall extends EventEmitter { pc.addEventListener('icegatheringstatechange', this.onIceGatheringStateChange); pc.addEventListener('track', this.onTrack); pc.addEventListener('negotiationneeded', this.onNegotiationNeeded); + pc.addEventListener('datachannel', this.onDataChannel); return pc; }