/
WaitForAttendeePresenceTask.ts
60 lines (52 loc) · 2.05 KB
/
WaitForAttendeePresenceTask.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
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import AudioVideoControllerState from '../audiovideocontroller/AudioVideoControllerState';
import MeetingSessionStatusCode from '../meetingsession/MeetingSessionStatusCode';
import RealtimeAttendeePositionInFrame from '../realtimecontroller/RealtimeAttendeePositionInFrame';
import BaseTask from './BaseTask';
/*
* [[WaitForAttendeePresenceTask]] waits until an attendee presence event happens.
*/
export default class WaitForAttendeePresenceTask extends BaseTask {
protected taskName = 'WaitForAttendeePresenceTask';
private cancelPromise: undefined | ((error: Error) => void);
constructor(private context: AudioVideoControllerState) {
super(context.logger);
}
cancel(): void {
// Just in case. The baseCancel behavior should prevent this.
/* istanbul ignore else */
if (this.cancelPromise) {
const error = new Error(
`canceling ${this.name()} due to the meeting status code: ${
MeetingSessionStatusCode.NoAttendeePresent
}`
);
this.cancelPromise(error);
delete this.cancelPromise;
}
}
async run(): Promise<void> {
const attendeeId = this.context.meetingSessionConfiguration.credentials.attendeeId;
return new Promise<void>((resolve, reject) => {
const handler = (
presentAttendeeId: string,
present: boolean,
_externalUserId: string | undefined,
_dropped: boolean | undefined,
_pos: RealtimeAttendeePositionInFrame | undefined
): void => {
if (attendeeId === presentAttendeeId && present) {
this.context.realtimeController.realtimeUnsubscribeToAttendeeIdPresence(handler);
resolve();
delete this.cancelPromise;
}
};
this.cancelPromise = (error: Error) => {
this.context.realtimeController.realtimeUnsubscribeToAttendeeIdPresence(handler);
reject(error);
};
this.context.realtimeController.realtimeSubscribeToAttendeeIdPresence(handler);
});
}
}