From 6834137f502ac0858a8e61f4294711f388ca924e Mon Sep 17 00:00:00 2001 From: Robert Long Date: Wed, 15 Sep 2021 12:28:09 -0700 Subject: [PATCH] Add datachannels to MatrixCall --- src/webrtc/call.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 79df07b43..f52c09a5b 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; } @@ -1499,6 +1513,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 @@ -1864,6 +1882,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; }