167 lines
4.8 KiB
TypeScript
167 lines
4.8 KiB
TypeScript
import { Component } from "@angular/core";
|
|
import { Subscription } from 'rxjs';
|
|
import { catchError, throwError as observableThrowError } from 'rxjs';
|
|
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
|
|
import { ParticipantAbstractModel, ParticipantService, TokenModel } from 'openvidu-angular';
|
|
|
|
@Component({
|
|
selector: "app-root",
|
|
template: `
|
|
<ov-videoconference
|
|
(onJoinButtonClicked)="onJoinButtonClicked()"
|
|
[tokens]="tokens"
|
|
>
|
|
<div *ovLayout>
|
|
<div class="container">
|
|
<div class="item" *ngFor="let stream of localParticipant | streams">
|
|
<ov-stream [stream]="stream"></ov-stream>
|
|
</div>
|
|
|
|
<div class="item" *ngFor="let stream of remoteParticipants | streams">
|
|
<ov-stream [stream]="stream"></ov-stream>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</ov-videoconference>
|
|
`,
|
|
styles: [
|
|
`
|
|
.container {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.item {
|
|
flex: 0 50%;
|
|
height: 250px;
|
|
margin-bottom: 2%;
|
|
}
|
|
`,
|
|
],
|
|
})
|
|
export class AppComponent {
|
|
title = "openvidu-custom-layout";
|
|
tokens!: TokenModel;
|
|
sessionId = 'layout-directive-example';
|
|
OPENVIDU_SERVER_URL = 'https://localhost:4443';
|
|
OPENVIDU_SERVER_SECRET = 'MY_SECRET';
|
|
localParticipant!: ParticipantAbstractModel;
|
|
remoteParticipants!: ParticipantAbstractModel[];
|
|
localParticipantSubs!: Subscription;
|
|
remoteParticipantsSubs!: Subscription;
|
|
|
|
constructor(private httpClient: HttpClient, private participantService: ParticipantService) {}
|
|
|
|
ngOnInit(): void {
|
|
this.subscribeToParticipants();
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
this.localParticipantSubs.unsubscribe();
|
|
this.remoteParticipantsSubs.unsubscribe();
|
|
}
|
|
subscribeToParticipants() {
|
|
this.localParticipantSubs = this.participantService.localParticipantObs.subscribe((p) => {
|
|
this.localParticipant = p;
|
|
});
|
|
|
|
this.remoteParticipantsSubs = this.participantService.remoteParticipantsObs.subscribe((participants) => {
|
|
this.remoteParticipants = participants;
|
|
});
|
|
}
|
|
|
|
async onJoinButtonClicked() {
|
|
this.tokens = {
|
|
webcam: await this.getToken(),
|
|
screen: await this.getToken()
|
|
};
|
|
}
|
|
|
|
/**
|
|
* --------------------------
|
|
* SERVER-SIDE RESPONSIBILITY
|
|
* --------------------------
|
|
* This method retrieve the mandatory user token from OpenVidu Server,
|
|
* in this case making use Angular http API.
|
|
* This behavior MUST BE IN YOUR SERVER-SIDE IN PRODUCTION. In this case:
|
|
* 1) Initialize a Session in OpenVidu Server (POST /openvidu/api/sessions)
|
|
* 2) Create a Connection in OpenVidu Server (POST /openvidu/api/sessions/<SESSION_ID>/connection)
|
|
* 3) The Connection.token must be consumed in Session.connect() method
|
|
*/
|
|
|
|
getToken(): Promise<string> {
|
|
return this.createSession(this.sessionId).then((sessionId: string) => {
|
|
return this.createToken(sessionId);
|
|
});
|
|
}
|
|
|
|
createSession(sessionId: string): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
const body = JSON.stringify({ customSessionId: sessionId });
|
|
const options = {
|
|
headers: new HttpHeaders({
|
|
Authorization: 'Basic ' + btoa('OPENVIDUAPP:' + this.OPENVIDU_SERVER_SECRET),
|
|
'Content-Type': 'application/json'
|
|
})
|
|
};
|
|
return this.httpClient
|
|
.post(this.OPENVIDU_SERVER_URL + '/openvidu/api/sessions', body, options)
|
|
.pipe(
|
|
catchError((error) => {
|
|
if (error.status === 409) {
|
|
resolve(sessionId);
|
|
} else {
|
|
console.warn(
|
|
'No connection to OpenVidu Server. This may be a certificate error at ' + this.OPENVIDU_SERVER_URL
|
|
);
|
|
if (
|
|
window.confirm(
|
|
'No connection to OpenVidu Server. This may be a certificate error at "' +
|
|
this.OPENVIDU_SERVER_URL +
|
|
'"\n\nClick OK to navigate and accept it. If no certificate warning is shown, then check that your OpenVidu Server' +
|
|
'is up and running at "' +
|
|
this.OPENVIDU_SERVER_URL +
|
|
'"'
|
|
)
|
|
) {
|
|
location.assign(this.OPENVIDU_SERVER_URL + '/accept-certificate');
|
|
}
|
|
}
|
|
return observableThrowError(error);
|
|
})
|
|
)
|
|
.subscribe((response: any) => {
|
|
console.log(response);
|
|
resolve(response['id']);
|
|
});
|
|
});
|
|
}
|
|
|
|
createToken(sessionId: string): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
const body = {};
|
|
const options = {
|
|
headers: new HttpHeaders({
|
|
Authorization: 'Basic ' + btoa('OPENVIDUAPP:' + this.OPENVIDU_SERVER_SECRET),
|
|
'Content-Type': 'application/json'
|
|
})
|
|
};
|
|
return this.httpClient
|
|
.post(this.OPENVIDU_SERVER_URL + '/openvidu/api/sessions/' + sessionId + '/connection', body, options)
|
|
.pipe(
|
|
catchError((error) => {
|
|
reject(error);
|
|
return observableThrowError(error);
|
|
})
|
|
)
|
|
.subscribe((response: any) => {
|
|
console.log(response);
|
|
resolve(response['token']);
|
|
});
|
|
});
|
|
}
|
|
|
|
}
|