-
Notifications
You must be signed in to change notification settings - Fork 477
/
MeetingSessionConfiguration.ts
234 lines (212 loc) · 8.28 KB
/
MeetingSessionConfiguration.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import ApplicationMetadata from '../applicationmetadata/ApplicationMetadata';
import ConnectionHealthPolicyConfiguration from '../connectionhealthpolicy/ConnectionHealthPolicyConfiguration';
import VideoQualitySettings from '../devicecontroller/VideoQualitySettings';
import { toLowerCasePropertyNames } from '../utils/Utils';
import VideoDownlinkBandwidthPolicy from '../videodownlinkbandwidthpolicy/VideoDownlinkBandwidthPolicy';
import VideoUplinkBandwidthPolicy from '../videouplinkbandwidthpolicy/VideoUplinkBandwidthPolicy';
import MeetingFeatures from './MeetingFeatures';
import MeetingSessionCredentials from './MeetingSessionCredentials';
import MeetingSessionURLs from './MeetingSessionURLs';
/**
* [[MeetingSessionConfiguration]] contains the information necessary to start
* a session.
*/
export default class MeetingSessionConfiguration {
/**
* The id of the meeting the session is joining.
*/
meetingId: string | null = null;
/**
* The external meeting id of the meeting the session is joining.
*/
externalMeetingId: string | null = null;
/**
* The credentials used to authenticate the session.
*/
credentials: MeetingSessionCredentials | null = null;
/**
* The URLs the session uses to reach the meeting service.
*/
urls: MeetingSessionURLs | null = null;
/**
* Maximum amount of time in milliseconds to allow for connecting.
*/
connectionTimeoutMs: number = 15000;
/**
* Maximum amount of time in milliseconds to wait for the current attendee to be present
* after initial connection.
*/
attendeePresenceTimeoutMs: number = 0;
/**
* Configuration for connection health policies: reconnection, unusable audio warning connection,
* and signal strength bars connection.
*/
connectionHealthPolicyConfiguration: ConnectionHealthPolicyConfiguration = new ConnectionHealthPolicyConfiguration();
/**
* Maximum amount of time in milliseconds to allow for reconnecting.
*/
reconnectTimeoutMs = 120 * 1000;
/**
* Fixed wait amount in milliseconds between reconnecting attempts.
*/
reconnectFixedWaitMs = 0;
/**
* The short back-off time in milliseconds between reconnecting attempts.
*/
reconnectShortBackOffMs = 1 * 1000;
/**
* The long back-off time in milliseconds between reconnecting attempts.
*/
reconnectLongBackOffMs = 5 * 1000;
/**
* Feature flag to enable Simulcast
*/
enableSimulcastForUnifiedPlanChromiumBasedBrowsers: boolean = false;
/**
* Feature flag to enable scalable video coding (SVC) on supported browsers, which is determined by `BrowserBehavior.supportsScalableVideoCoding`
*/
enableSVC: boolean = false;
/**
* Video downlink bandwidth policy to determine which remote videos
* are subscribed to.
*/
videoDownlinkBandwidthPolicy: VideoDownlinkBandwidthPolicy = null;
/**
* Video uplink bandwidth policy to determine the bandwidth constraints
* of the local video.
*/
videoUplinkBandwidthPolicy: VideoUplinkBandwidthPolicy = null;
/**
* Builder's application metadata such as application name or version.
* This is an optional parameter. Please check [[ApplicationMetadata]] for more information.
*/
applicationMetadata: ApplicationMetadata;
/**
* Keep the last frame of the video when a remote video is paused via the pauseVideoTile API.
* This is done by not clearing the srcObject property of the videoElement.
*/
keepLastFrameWhenPaused: boolean = false;
/**
* The Amazon Chime SDK media backends currently send a keyframe request to content share senders every 10 seconds to help mitigate
* decoder issues on receivers. This flag requests the backed to disable that feature.
*
* Setting this flag to true may or may not lead to issues with content received for your application, as it depends on browsers used
* and whether they have fixed previous issues leading to the introduction of this periodic keyframe request. It will however
* reduce CPU consumption on content senders which no longer have to generate as many expensive keyframes.
*/
disablePeriodicKeyframeRequestOnContentSender: boolean = false;
/**
* Additional features in the meeting
*/
meetingFeatures: MeetingFeatures = new MeetingFeatures();
/**
* Constructs a MeetingSessionConfiguration optionally with a chime:CreateMeeting and
* chime:CreateAttendee response. You can pass in either a JSON object containing the
* responses, or a JSON object containing the information in the Meeting and Attendee
* root-level fields. Examples:
*
* ```
* const configuration = new MeetingSessionConfiguration({
* "Meeting": {
* "MeetingId": "...",
* "MediaPlacement": {
* "AudioHostUrl": "...",
* "SignalingUrl": "...",
* "TurnControlUrl": "..."
* },
* "MeetingFeatures":{
* "Audio":"...",
* "Video":"....",
* "Content":"...",
* "Attendee":"..."
* },
* }
* }
* }, {
* "Attendee": {
* "ExternalUserId": "...",
* "AttendeeId": "...",
* "JoinToken": "..."
* }
* });
* ```
*
* ```
* const configuration = new MeetingSessionConfiguration({
* "MeetingId": "...",
* "MediaPlacement": {
* "AudioHostUrl": "...",
* "SignalingUrl": "...",
* "TurnControlUrl": "..."
* }
* }, {
* "ExternalUserId": "...",
* "AttendeeId": "...",
* "JoinToken": "..."
* });
* ```
*/
constructor(createMeetingResponse?: any, createAttendeeResponse?: any) { // eslint-disable-line
if (createMeetingResponse) {
createMeetingResponse = toLowerCasePropertyNames(createMeetingResponse);
if (createMeetingResponse.meeting) {
createMeetingResponse = createMeetingResponse.meeting;
}
this.meetingId = createMeetingResponse.meetingid;
this.externalMeetingId = createMeetingResponse.externalmeetingid;
this.urls = new MeetingSessionURLs();
this.urls.audioHostURL = createMeetingResponse.mediaplacement.audiohosturl;
this.urls.signalingURL = createMeetingResponse.mediaplacement.signalingurl;
this.urls.turnControlURL = createMeetingResponse.mediaplacement.turncontrolurl;
if (createMeetingResponse.mediaplacement.eventingestionurl) {
this.urls.eventIngestionURL = createMeetingResponse.mediaplacement.eventingestionurl;
}
const parseVideoResolution = (
resolution: string,
defaultValue: VideoQualitySettings
): VideoQualitySettings => {
switch (resolution) {
case 'None':
return VideoQualitySettings.VideoDisabled;
case 'HD':
return VideoQualitySettings.VideoResolutionHD;
case 'FHD':
return VideoQualitySettings.VideoResolutionFHD;
case 'UHD':
return VideoQualitySettings.VideoResolutionUHD;
default:
return defaultValue;
}
};
if (
createMeetingResponse.meetingfeatures?.video !== undefined ||
createMeetingResponse.meetingfeatures?.content !== undefined
) {
const videoMaxResolution =
createMeetingResponse.meetingfeatures.video === undefined
? 'HD'
: createMeetingResponse.meetingfeatures.video.maxresolution;
const contentMaxResolution =
createMeetingResponse.meetingfeatures.content === undefined
? 'FHD'
: createMeetingResponse.meetingfeatures.content.maxresolution;
this.meetingFeatures = new MeetingFeatures(
parseVideoResolution(videoMaxResolution, VideoQualitySettings.VideoResolutionHD),
parseVideoResolution(contentMaxResolution, VideoQualitySettings.VideoResolutionFHD)
);
}
}
if (createAttendeeResponse) {
createAttendeeResponse = toLowerCasePropertyNames(createAttendeeResponse);
if (createAttendeeResponse.attendee) {
createAttendeeResponse = createAttendeeResponse.attendee;
}
this.credentials = new MeetingSessionCredentials();
this.credentials.attendeeId = createAttendeeResponse.attendeeid;
this.credentials.externalUserId = createAttendeeResponse.externaluserid;
this.credentials.joinToken = createAttendeeResponse.jointoken;
}
}
}