1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-07 23:02:56 +03:00

Add more access modifiers

This commit is contained in:
David Baker
2022-11-01 16:14:48 +00:00
parent cb8123dec7
commit 476f6f78b1
3 changed files with 83 additions and 81 deletions

View File

@@ -84,18 +84,18 @@ export const USERMEDIA_STREAM_ID = "mock_stream_from_media_handler";
export const SCREENSHARE_STREAM_ID = "mock_screen_stream_from_media_handler"; export const SCREENSHARE_STREAM_ID = "mock_screen_stream_from_media_handler";
class MockMediaStreamAudioSourceNode { class MockMediaStreamAudioSourceNode {
connect() {} public connect() {}
} }
class MockAnalyser { class MockAnalyser {
getFloatFrequencyData() { return 0.0; } public getFloatFrequencyData() { return 0.0; }
} }
export class MockAudioContext { export class MockAudioContext {
constructor() {} constructor() {}
createAnalyser() { return new MockAnalyser(); } public createAnalyser() { return new MockAnalyser(); }
createMediaStreamSource() { return new MockMediaStreamAudioSourceNode(); } public createMediaStreamSource() { return new MockMediaStreamAudioSourceNode(); }
close() {} public close() {}
} }
export class MockRTCPeerConnection { export class MockRTCPeerConnection {
@@ -107,8 +107,8 @@ export class MockRTCPeerConnection {
public needsNegotiation = false; public needsNegotiation = false;
public readyToNegotiate: Promise<void>; public readyToNegotiate: Promise<void>;
private onReadyToNegotiate?: () => void; private onReadyToNegotiate?: () => void;
localDescription: RTCSessionDescription; public localDescription: RTCSessionDescription;
signalingState: RTCSignalingState = "stable"; public signalingState: RTCSignalingState = "stable";
public transceivers: MockRTCRtpTransceiver[] = []; public transceivers: MockRTCRtpTransceiver[] = [];
public static triggerAllNegotiations(): void { public static triggerAllNegotiations(): void {
@@ -139,7 +139,7 @@ export class MockRTCPeerConnection {
MockRTCPeerConnection.instances.push(this); MockRTCPeerConnection.instances.push(this);
} }
addEventListener(type: string, listener: () => void) { public addEventListener(type: string, listener: () => void) {
if (type === 'negotiationneeded') { if (type === 'negotiationneeded') {
this.negotiationNeededListener = listener; this.negotiationNeededListener = listener;
} else if (type == 'icecandidate') { } else if (type == 'icecandidate') {
@@ -148,28 +148,28 @@ export class MockRTCPeerConnection {
this.onTrackListener = listener; this.onTrackListener = listener;
} }
} }
createDataChannel(label: string, opts: RTCDataChannelInit) { return { label, ...opts }; } public createDataChannel(label: string, opts: RTCDataChannelInit) { return { label, ...opts }; }
createOffer() { public createOffer() {
return Promise.resolve({ return Promise.resolve({
type: 'offer', type: 'offer',
sdp: DUMMY_SDP, sdp: DUMMY_SDP,
}); });
} }
createAnswer() { public createAnswer() {
return Promise.resolve({ return Promise.resolve({
type: 'answer', type: 'answer',
sdp: DUMMY_SDP, sdp: DUMMY_SDP,
}); });
} }
setRemoteDescription() { public setRemoteDescription() {
return Promise.resolve(); return Promise.resolve();
} }
setLocalDescription() { public setLocalDescription() {
return Promise.resolve(); return Promise.resolve();
} }
close() { } public close() { }
getStats() { return []; } public getStats() { return []; }
addTransceiver(track: MockMediaStreamTrack): MockRTCRtpTransceiver { public addTransceiver(track: MockMediaStreamTrack): MockRTCRtpTransceiver {
this.needsNegotiation = true; this.needsNegotiation = true;
if (this.onReadyToNegotiate) this.onReadyToNegotiate(); if (this.onReadyToNegotiate) this.onReadyToNegotiate();
@@ -184,19 +184,21 @@ export class MockRTCPeerConnection {
return newTransceiver; return newTransceiver;
} }
addTrack(track: MockMediaStreamTrack): MockRTCRtpSender { public addTrack(track: MockMediaStreamTrack): MockRTCRtpSender {
return this.addTransceiver(track).sender as unknown as MockRTCRtpSender; return this.addTransceiver(track).sender as unknown as MockRTCRtpSender;
} }
removeTrack() { public removeTrack() {
this.needsNegotiation = true; this.needsNegotiation = true;
if (this.onReadyToNegotiate) this.onReadyToNegotiate(); if (this.onReadyToNegotiate) this.onReadyToNegotiate();
} }
getTransceivers(): MockRTCRtpTransceiver[] { return this.transceivers; } public getTransceivers(): MockRTCRtpTransceiver[] { return this.transceivers; }
getSenders(): MockRTCRtpSender[] { return this.transceivers.map(t => t.sender as unknown as MockRTCRtpSender); } public getSenders(): MockRTCRtpSender[] {
return this.transceivers.map(t => t.sender as unknown as MockRTCRtpSender);
}
doNegotiation() { public doNegotiation() {
if (this.needsNegotiation && this.negotiationNeededListener) { if (this.needsNegotiation && this.negotiationNeededListener) {
this.needsNegotiation = false; this.needsNegotiation = false;
this.negotiationNeededListener(); this.negotiationNeededListener();
@@ -207,7 +209,7 @@ export class MockRTCPeerConnection {
export class MockRTCRtpSender { export class MockRTCRtpSender {
constructor(public track: MockMediaStreamTrack) { } constructor(public track: MockMediaStreamTrack) { }
replaceTrack(track: MockMediaStreamTrack) { this.track = track; } public replaceTrack(track: MockMediaStreamTrack) { this.track = track; }
} }
export class MockRTCRtpReceiver { export class MockRTCRtpReceiver {
@@ -224,38 +226,38 @@ export class MockRTCRtpTransceiver {
this.peerConn.needsNegotiation = true; this.peerConn.needsNegotiation = true;
} }
setCodecPreferences = jest.fn<void, RTCRtpCodecCapability[]>(); public setCodecPreferences = jest.fn<void, RTCRtpCodecCapability[]>();
} }
export class MockMediaStreamTrack { export class MockMediaStreamTrack {
constructor(public readonly id: string, public readonly kind: "audio" | "video", public enabled = true) { } constructor(public readonly id: string, public readonly kind: "audio" | "video", public enabled = true) { }
stop = jest.fn<void, []>(); public stop = jest.fn<void, []>();
listeners: [string, (...args: any[]) => any][] = []; public listeners: [string, (...args: any[]) => any][] = [];
public isStopped = false; public isStopped = false;
public settings?: MediaTrackSettings; public settings?: MediaTrackSettings;
getSettings(): MediaTrackSettings { return this.settings!; } public getSettings(): MediaTrackSettings { return this.settings!; }
// XXX: Using EventTarget in jest doesn't seem to work, so we write our own // XXX: Using EventTarget in jest doesn't seem to work, so we write our own
// implementation // implementation
dispatchEvent(eventType: string) { public dispatchEvent(eventType: string) {
this.listeners.forEach(([t, c]) => { this.listeners.forEach(([t, c]) => {
if (t !== eventType) return; if (t !== eventType) return;
c(); c();
}); });
} }
addEventListener(eventType: string, callback: (...args: any[]) => any) { public addEventListener(eventType: string, callback: (...args: any[]) => any) {
this.listeners.push([eventType, callback]); this.listeners.push([eventType, callback]);
} }
removeEventListener(eventType: string, callback: (...args: any[]) => any) { public removeEventListener(eventType: string, callback: (...args: any[]) => any) {
this.listeners.filter(([t, c]) => { this.listeners.filter(([t, c]) => {
return t !== eventType || c !== callback; return t !== eventType || c !== callback;
}); });
} }
typed(): MediaStreamTrack { return this as unknown as MediaStreamTrack; } public typed(): MediaStreamTrack { return this as unknown as MediaStreamTrack; }
} }
// XXX: Using EventTarget in jest doesn't seem to work, so we write our own // XXX: Using EventTarget in jest doesn't seem to work, so we write our own
@@ -266,42 +268,42 @@ export class MockMediaStream {
private tracks: MockMediaStreamTrack[] = [], private tracks: MockMediaStreamTrack[] = [],
) {} ) {}
listeners: [string, (...args: any[]) => any][] = []; public listeners: [string, (...args: any[]) => any][] = [];
public isStopped = false; public isStopped = false;
dispatchEvent(eventType: string) { public dispatchEvent(eventType: string) {
this.listeners.forEach(([t, c]) => { this.listeners.forEach(([t, c]) => {
if (t !== eventType) return; if (t !== eventType) return;
c(); c();
}); });
} }
getTracks() { return this.tracks; } public getTracks() { return this.tracks; }
getAudioTracks() { return this.tracks.filter((track) => track.kind === "audio"); } public getAudioTracks() { return this.tracks.filter((track) => track.kind === "audio"); }
getVideoTracks() { return this.tracks.filter((track) => track.kind === "video"); } public getVideoTracks() { return this.tracks.filter((track) => track.kind === "video"); }
addEventListener(eventType: string, callback: (...args: any[]) => any) { public addEventListener(eventType: string, callback: (...args: any[]) => any) {
this.listeners.push([eventType, callback]); this.listeners.push([eventType, callback]);
} }
removeEventListener(eventType: string, callback: (...args: any[]) => any) { public removeEventListener(eventType: string, callback: (...args: any[]) => any) {
this.listeners.filter(([t, c]) => { this.listeners.filter(([t, c]) => {
return t !== eventType || c !== callback; return t !== eventType || c !== callback;
}); });
} }
addTrack(track: MockMediaStreamTrack) { public addTrack(track: MockMediaStreamTrack) {
this.tracks.push(track); this.tracks.push(track);
this.dispatchEvent("addtrack"); this.dispatchEvent("addtrack");
} }
removeTrack(track: MockMediaStreamTrack) { this.tracks.splice(this.tracks.indexOf(track), 1); } public removeTrack(track: MockMediaStreamTrack) { this.tracks.splice(this.tracks.indexOf(track), 1); }
clone(): MediaStream { public clone(): MediaStream {
return new MockMediaStream(this.id + ".clone", this.tracks).typed(); return new MockMediaStream(this.id + ".clone", this.tracks).typed();
} }
isCloneOf(stream: MediaStream) { public isCloneOf(stream: MediaStream) {
return this.id === stream.id + ".clone"; return this.id === stream.id + ".clone";
} }
// syntactic sugar for typing // syntactic sugar for typing
typed(): MediaStream { public typed(): MediaStream {
return this as unknown as MediaStream; return this as unknown as MediaStream;
} }
} }
@@ -311,14 +313,14 @@ export class MockMediaDeviceInfo {
public kind: "audioinput" | "videoinput" | "audiooutput", public kind: "audioinput" | "videoinput" | "audiooutput",
) { } ) { }
typed(): MediaDeviceInfo { return this as unknown as MediaDeviceInfo; } public typed(): MediaDeviceInfo { return this as unknown as MediaDeviceInfo; }
} }
export class MockMediaHandler { export class MockMediaHandler {
public userMediaStreams: MockMediaStream[] = []; public userMediaStreams: MockMediaStream[] = [];
public screensharingStreams: MockMediaStream[] = []; public screensharingStreams: MockMediaStream[] = [];
getUserMediaStream(audio: boolean, video: boolean) { public getUserMediaStream(audio: boolean, video: boolean) {
const tracks: MockMediaStreamTrack[] = []; const tracks: MockMediaStreamTrack[] = [];
if (audio) tracks.push(new MockMediaStreamTrack("usermedia_audio_track", "audio")); if (audio) tracks.push(new MockMediaStreamTrack("usermedia_audio_track", "audio"));
if (video) tracks.push(new MockMediaStreamTrack("usermedia_video_track", "video")); if (video) tracks.push(new MockMediaStreamTrack("usermedia_video_track", "video"));
@@ -327,10 +329,10 @@ export class MockMediaHandler {
this.userMediaStreams.push(stream); this.userMediaStreams.push(stream);
return stream; return stream;
} }
stopUserMediaStream(stream: MockMediaStream) { public stopUserMediaStream(stream: MockMediaStream) {
stream.isStopped = true; stream.isStopped = true;
} }
getScreensharingStream = jest.fn((opts?: IScreensharingOpts) => { public getScreensharingStream = jest.fn((opts?: IScreensharingOpts) => {
const tracks = [new MockMediaStreamTrack("screenshare_video_track", "video")]; const tracks = [new MockMediaStreamTrack("screenshare_video_track", "video")];
if (opts?.audio) tracks.push(new MockMediaStreamTrack("screenshare_audio_track", "audio")); if (opts?.audio) tracks.push(new MockMediaStreamTrack("screenshare_audio_track", "audio"));
@@ -338,31 +340,31 @@ export class MockMediaHandler {
this.screensharingStreams.push(stream); this.screensharingStreams.push(stream);
return stream; return stream;
}); });
stopScreensharingStream(stream: MockMediaStream) { public stopScreensharingStream(stream: MockMediaStream) {
stream.isStopped = true; stream.isStopped = true;
} }
hasAudioDevice() { return true; } public hasAudioDevice() { return true; }
hasVideoDevice() { return true; } public hasVideoDevice() { return true; }
stopAllStreams() {} public stopAllStreams() {}
typed(): MediaHandler { return this as unknown as MediaHandler; } public typed(): MediaHandler { return this as unknown as MediaHandler; }
} }
export class MockMediaDevices { export class MockMediaDevices {
enumerateDevices = jest.fn<Promise<MediaDeviceInfo[]>, []>().mockResolvedValue([ public enumerateDevices = jest.fn<Promise<MediaDeviceInfo[]>, []>().mockResolvedValue([
new MockMediaDeviceInfo("audioinput").typed(), new MockMediaDeviceInfo("audioinput").typed(),
new MockMediaDeviceInfo("videoinput").typed(), new MockMediaDeviceInfo("videoinput").typed(),
]); ]);
getUserMedia = jest.fn<Promise<MediaStream>, [MediaStreamConstraints]>().mockReturnValue( public getUserMedia = jest.fn<Promise<MediaStream>, [MediaStreamConstraints]>().mockReturnValue(
Promise.resolve(new MockMediaStream("local_stream").typed()), Promise.resolve(new MockMediaStream("local_stream").typed()),
); );
getDisplayMedia = jest.fn<Promise<MediaStream>, [DisplayMediaStreamConstraints]>().mockReturnValue( public getDisplayMedia = jest.fn<Promise<MediaStream>, [DisplayMediaStreamConstraints]>().mockReturnValue(
Promise.resolve(new MockMediaStream("local_display_stream").typed()), Promise.resolve(new MockMediaStream("local_display_stream").typed()),
); );
typed(): MediaDevices { return this as unknown as MediaDevices; } public typed(): MediaDevices { return this as unknown as MediaDevices; }
} }
type EmittedEvents = CallEventHandlerEvent | CallEvent | ClientEvent | RoomStateEvent | GroupCallEventHandlerEvent; type EmittedEvents = CallEventHandlerEvent | CallEvent | ClientEvent | RoomStateEvent | GroupCallEventHandlerEvent;
@@ -379,44 +381,44 @@ export class MockCallMatrixClient extends TypedEventEmitter<EmittedEvents, Emitt
super(); super();
} }
groupCallEventHandler = { public groupCallEventHandler = {
groupCalls: new Map<string, GroupCall>(), groupCalls: new Map<string, GroupCall>(),
}; };
callEventHandler = { public callEventHandler = {
calls: new Map<string, MatrixCall>(), calls: new Map<string, MatrixCall>(),
}; };
sendStateEvent = jest.fn<Promise<ISendEventResponse>, [ public sendStateEvent = jest.fn<Promise<ISendEventResponse>, [
roomId: string, eventType: EventType, content: any, statekey: string, roomId: string, eventType: EventType, content: any, statekey: string,
]>(); ]>();
sendToDevice = jest.fn<Promise<{}>, [ public sendToDevice = jest.fn<Promise<{}>, [
eventType: string, eventType: string,
contentMap: { [userId: string]: { [deviceId: string]: Record<string, any> } }, contentMap: { [userId: string]: { [deviceId: string]: Record<string, any> } },
txnId?: string, txnId?: string,
]>(); ]>();
getMediaHandler(): MediaHandler { return this.mediaHandler.typed(); } public getMediaHandler(): MediaHandler { return this.mediaHandler.typed(); }
getUserId(): string { return this.userId; } public getUserId(): string { return this.userId; }
getDeviceId(): string { return this.deviceId; } public getDeviceId(): string { return this.deviceId; }
getSessionId(): string { return this.sessionId; } public getSessionId(): string { return this.sessionId; }
getTurnServers = () => []; public getTurnServers = () => [];
isFallbackICEServerAllowed = () => false; public isFallbackICEServerAllowed = () => false;
reEmitter = new ReEmitter(new TypedEventEmitter()); public reEmitter = new ReEmitter(new TypedEventEmitter());
getUseE2eForGroupCall = () => false; public getUseE2eForGroupCall = () => false;
checkTurnServers = () => null; public checkTurnServers = () => null;
getSyncState = jest.fn<SyncState | null, []>().mockReturnValue(SyncState.Syncing); public getSyncState = jest.fn<SyncState | null, []>().mockReturnValue(SyncState.Syncing);
getRooms = jest.fn<Room[], []>().mockReturnValue([]); public getRooms = jest.fn<Room[], []>().mockReturnValue([]);
getRoom = jest.fn(); public getRoom = jest.fn();
typed(): MatrixClient { return this as unknown as MatrixClient; } public typed(): MatrixClient { return this as unknown as MatrixClient; }
emitRoomState(event: MatrixEvent, state: RoomState): void { public emitRoomState(event: MatrixEvent, state: RoomState): void {
this.emit( this.emit(
RoomStateEvent.Events, RoomStateEvent.Events,
event, event,
@@ -432,10 +434,10 @@ export class MockCallFeed {
public stream: MockMediaStream, public stream: MockMediaStream,
) {} ) {}
measureVolumeActivity(val: boolean) {} public measureVolumeActivity(val: boolean) {}
dispose() {} public dispose() {}
typed(): CallFeed { public typed(): CallFeed {
return this as unknown as CallFeed; return this as unknown as CallFeed;
} }
} }

View File

@@ -125,16 +125,16 @@ class MockCall {
public sendMetadataUpdate = jest.fn<void, []>(); public sendMetadataUpdate = jest.fn<void, []>();
on = jest.fn(); public on = jest.fn();
removeListener = jest.fn(); public removeListener = jest.fn();
getOpponentMember(): Partial<RoomMember> { public getOpponentMember(): Partial<RoomMember> {
return { return {
userId: this.opponentUserId, userId: this.opponentUserId,
}; };
} }
typed(): MatrixCall { return this as unknown as MatrixCall; } public typed(): MatrixCall { return this as unknown as MatrixCall; }
} }
describe('Group Call', function() { describe('Group Call', function() {

View File

@@ -71,7 +71,7 @@ export enum GroupCallErrorCode {
} }
export class GroupCallError extends Error { export class GroupCallError extends Error {
code: string; public code: string;
constructor(code: GroupCallErrorCode, msg: string, err?: Error) { constructor(code: GroupCallErrorCode, msg: string, err?: Error) {
// Still don't think there's any way to have proper nested errors // Still don't think there's any way to have proper nested errors