openvidu-components: Updated testapp

pull/739/head
csantosm 2022-06-22 12:42:02 +02:00
parent 26f96761cd
commit fd45988bfc
9 changed files with 7619 additions and 2228 deletions

File diff suppressed because it is too large Load Diff

View File

@ -35,7 +35,7 @@
"@angular/platform-browser-dynamic": "13.0.0", "@angular/platform-browser-dynamic": "13.0.0",
"@angular/router": "13.0.0", "@angular/router": "13.0.0",
"autolinker": "3.14.3", "autolinker": "3.14.3",
"openvidu-browser": "2.22.0", "openvidu-browser": "^2.22.0",
"rxjs": "7.5.4", "rxjs": "7.5.4",
"tslib": "2.3.1", "tslib": "2.3.1",
"zone.js": "0.11.4" "zone.js": "0.11.4"
@ -70,7 +70,7 @@
"karma-notify-reporter": "1.3.0", "karma-notify-reporter": "1.3.0",
"mocha": "9.2.2", "mocha": "9.2.2",
"ng-packagr": "13.0.3", "ng-packagr": "13.0.3",
"selenium-webdriver": "4.1.2", "selenium-webdriver": "4.2.0",
"ts-node": "10.4.0", "ts-node": "10.4.0",
"tslint": "6.1.3", "tslint": "6.1.3",
"typescript": "4.4.4", "typescript": "4.4.4",

View File

@ -1 +1,11 @@
<p>admin-dashboard works!</p> <ov-admin-login *ngIf="!logged" [error]="error" (onLoginButtonClicked)="login($event)"></ov-admin-login>
<ov-admin-dashboard
*ngIf="logged"
[recordingsList]="recordings"
(onLogoutClicked)="onLogoutClicked()"
(onRefreshRecordingsClicked)="onRefreshRecordingsClicked()"
(onDeleteRecordingClicked)="onDeleteRecordingClicked($event)"
(onDownloadRecordingClicked)="onDownloadRecordingClicked($event)"
></ov-admin-dashboard>

View File

@ -1,15 +1,65 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { RecordingService } from 'openvidu-angular';
import { RestService } from 'src/app/services/rest.service';
@Component({ @Component({
selector: 'app-admin-dashboard', selector: 'app-admin-dashboard',
templateUrl: './admin-dashboard.component.html', templateUrl: './admin-dashboard.component.html',
styleUrls: ['./admin-dashboard.component.scss'] styleUrls: ['./admin-dashboard.component.scss']
}) })
export class AdminDashboardComponent implements OnInit { export class AdminDashboardComponent implements OnInit {
recordings: any[] = [];
logged: boolean;
error: any;
constructor(private restService: RestService, private recordingService: RecordingService) {}
constructor() { } async ngOnInit() {
try {
const resp: any = await this.restService.login('');
this.logged = true;
this.recordings = resp.recordings;
} catch (error) {}
}
ngOnInit(): void { async login(pass: string) {
} try {
const resp: any = await this.restService.login(pass);
this.logged = true;
this.recordings = resp.recordings;
} catch (error) {
this.error = error;
console.log(error);
}
}
async onLogoutClicked() {
this.logged = false;
await this.restService.logout();
}
async onRefreshRecordingsClicked() {
console.log('GET ALL ');
const ecordings = await this.restService.getRecordings();
console.log(this.recordings);
this.recordings = ecordings;
}
async onDeleteRecordingClicked(recordingId: string) {
console.warn('DELETE RECORDING CLICKED');
try {
this.recordings = await this.restService.deleteRecording(recordingId);
} catch (error) {
console.error(error);
}
}
async onDownloadRecordingClicked(recordingId: string) {
try {
const file = await this.restService.getRecording(recordingId);
this.recordingService.downloadRecording(recordingId, file);
} catch (error) {
console.error(error);
}
}
} }

View File

@ -25,7 +25,7 @@ import { ParticipantsPanelDirectiveComponent } from './examples/participantsPane
import { ParticipantPanelItemDirectiveComponent } from './examples/participantPanelItem-directive/participantPanelItem-directive.component'; import { ParticipantPanelItemDirectiveComponent } from './examples/participantPanelItem-directive/participantPanelItem-directive.component';
import { ParticipantPanelItemElementsDirectiveComponent } from './examples/participantPanelItemElements-directive/participantPanelItemElements-directive.component'; import { ParticipantPanelItemElementsDirectiveComponent } from './examples/participantPanelItemElements-directive/participantPanelItemElements-directive.component';
import { ChatPanelDirectiveComponent } from './examples/chatPanel-directive/chatPanel-directive.component'; import { ChatPanelDirectiveComponent } from './examples/chatPanel-directive/chatPanel-directive.component';
import { AdminDashboardComponent } from './admin/admin-dashboard/admin-dashboard.component';
// openvidu-angular // openvidu-angular
import { OpenViduAngularModule } from 'openvidu-angular'; import { OpenViduAngularModule } from 'openvidu-angular';
import { ExamplesDashboardComponent } from './examples/examples-dashboard/examples-dashboard.component'; import { ExamplesDashboardComponent } from './examples/examples-dashboard/examples-dashboard.component';
@ -34,6 +34,7 @@ import { ExamplesDashboardComponent } from './examples/examples-dashboard/exampl
declarations: [ declarations: [
AppComponent, AppComponent,
DashboardComponent, DashboardComponent,
AdminDashboardComponent,
CallComponent, CallComponent,
TestingComponent, TestingComponent,
ExamplesDashboardComponent, ExamplesDashboardComponent,

View File

@ -16,11 +16,13 @@ import { ParticipantPanelItemElementsDirectiveComponent } from './examples/parti
import { ParticipantPanelItemDirectiveComponent } from './examples/participantPanelItem-directive/participantPanelItem-directive.component'; import { ParticipantPanelItemDirectiveComponent } from './examples/participantPanelItem-directive/participantPanelItem-directive.component';
import { ToolbarAdditionalPanelButtonsDirectiveComponent } from './examples/toolbarAdditionalPanelButtons-directive/toolbarAdditionalPanelButtons-directive.component'; import { ToolbarAdditionalPanelButtonsDirectiveComponent } from './examples/toolbarAdditionalPanelButtons-directive/toolbarAdditionalPanelButtons-directive.component';
import { AdditionalPanelsDirectiveComponent } from './examples/additionalPanels-directive/additionalPanels-directive.component'; import { AdditionalPanelsDirectiveComponent } from './examples/additionalPanels-directive/additionalPanels-directive.component';
import { AdminDashboardComponent } from './admin/admin-dashboard/admin-dashboard.component';
const routes: Routes = [ const routes: Routes = [
{ path: '', component: DashboardComponent }, { path: '', component: DashboardComponent },
{ path: 'call', component: CallComponent }, { path: 'call', component: CallComponent },
{ path: 'testing', component: TestingComponent }, { path: 'testing', component: TestingComponent },
{ path: 'admin', component: AdminDashboardComponent },
{ path: 'examples', component: ExamplesDashboardComponent}, { path: 'examples', component: ExamplesDashboardComponent},
{ path: 'examples/toolbarDirective', component: ToolbarDirectiveComponent }, { path: 'examples/toolbarDirective', component: ToolbarDirectiveComponent },

View File

@ -8,6 +8,21 @@
(onToolbarFullscreenButtonClicked)="onToolbarFullscreenButtonClicked()" (onToolbarFullscreenButtonClicked)="onToolbarFullscreenButtonClicked()"
(onToolbarParticipantsPanelButtonClicked)="onToolbarParticipantsPanelButtonClicked()" (onToolbarParticipantsPanelButtonClicked)="onToolbarParticipantsPanelButtonClicked()"
(onToolbarChatPanelButtonClicked)="onToolbarChatPanelButtonClicked()" (onToolbarChatPanelButtonClicked)="onToolbarChatPanelButtonClicked()"
(onToolbarStartRecordingClicked)="onStartRecordingClicked()"
(onToolbarStopRecordingClicked)="onStopRecordingClicked()"
(onActivitiesPanelStartRecordingClicked)="onStartRecordingClicked()"
(onActivitiesPanelStopRecordingClicked)="onStopRecordingClicked()"
(onActivitiesPanelDeleteRecordingClicked)="onDeleteRecordingClicked($event)"
(onActivitiesPanelDownloadRecordingClicked)="onDownloadRecordingClicked($event)"
[minimal]="false" [minimal]="false"
[prejoin]="true"
[activitiesPanelRecordingActivity]="true"
[recordingActivityRecordingsList]="recordingList"
[recordingActivityRecordingError]="recordingError"
[toolbarSettingsButton]="true"
> >
<!-- <div *ovActivitiesPanel>HOLA</div> -->
<!-- <ov-toolbar *ovToolbar [activitiesPanelButton]="false"
[chatPanelButton]="false"></ov-toolbar> -->
</ov-videoconference> </ov-videoconference>

View File

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { TokenModel } from 'dist/openvidu-angular/public-api'; import { RecordingInfo, TokenModel, RecordingService } from 'openvidu-angular';
import { RestService } from '../services/rest.service'; import { RestService } from '../services/rest.service';
@Component({ @Component({
@ -17,17 +17,28 @@ export class CallComponent implements OnInit {
joinSessionClicked: boolean = false; joinSessionClicked: boolean = false;
closeClicked: boolean = false; closeClicked: boolean = false;
isSessionAlive: boolean = false; isSessionAlive: boolean = false;
recordingList: RecordingInfo[] = [];
recordingError: any;
constructor(private restService: RestService) {} constructor(private restService: RestService, private recordingService: RecordingService) {}
async ngOnInit() { async ngOnInit() {
// this.tokens = {
// webcam: await this.restService.getToken(this.sessionId, this.OPENVIDU_URL, this.OPENVIDU_SECRET),
// screen: await this.restService.getToken(this.sessionId, this.OPENVIDU_URL, this.OPENVIDU_SECRET)
// };
// console.log(this.tokens)
const response = await this.restService.getTokensFromBackend(this.sessionId);
this.recordingList = response.recordings;
this.tokens = { this.tokens = {
webcam: await this.restService.getToken(this.sessionId, this.OPENVIDU_URL, this.OPENVIDU_SECRET), webcam: response.cameraToken,
screen: await this.restService.getToken(this.sessionId, this.OPENVIDU_URL, this.OPENVIDU_SECRET) screen: response.screenToken
}; };
console.log(this.tokens) console.log(this.tokens);
} }
onJoinClicked() { onJoinClicked() {
@ -81,4 +92,48 @@ export class CallComponent implements OnInit {
this.isSessionAlive = false; this.isSessionAlive = false;
console.log('TOOLBAR LEAVE CLICKED'); console.log('TOOLBAR LEAVE CLICKED');
} }
async onStartRecordingClicked() {
console.warn('START RECORDING CLICKED');
try {
await this.restService.startRecording(this.sessionId);
} catch (error) {
this.recordingError = error;
}
}
async onStopRecordingClicked() {
console.warn('STOP RECORDING CLICKED');
try {
// await this.restService.startRecording(this.sessionId);
this.recordingList = await this.restService.stopRecording(this.sessionId);
console.log('RECORDING LIST ', this.recordingList);
} catch (error) {
this.recordingError = error;
}
}
async onDeleteRecordingClicked(recordingId: string) {
console.warn('DELETE RECORDING CLICKED');
try {
this.recordingList = await this.restService.deleteRecording(recordingId);
} catch (error) {
this.recordingError = error;
console.error('?', error)
}
}
async onDownloadRecordingClicked(recordingId: string) {
try {
const file = await this.restService.getRecording(recordingId);
this.recordingService.downloadRecording(recordingId, file);
} catch (error) {
this.recordingError = error;
}
}
} }

View File

@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpHeaders } from '@angular/common/http';
import { catchError, lastValueFrom } from 'rxjs'; import { catchError, lastValueFrom } from 'rxjs';
import { throwError as observableThrowError } from 'rxjs/internal/observable/throwError'; import { throwError as observableThrowError } from 'rxjs/internal/observable/throwError';
import { RecordingInfo } from 'openvidu-angular';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@ -17,14 +18,117 @@ export class RestService {
const _sessionId = await this.createSession(sessionId, openviduServerUrl, openviduSecret); const _sessionId = await this.createSession(sessionId, openviduServerUrl, openviduSecret);
return await this.createToken(_sessionId, openviduServerUrl, openviduSecret); return await this.createToken(_sessionId, openviduServerUrl, openviduSecret);
} }
// try { }
// return lastValueFrom(this.http.post<any>(this.baseHref + 'call', { sessionId })); async getTokensFromBackend(sessionId: string): Promise<{ cameraToken: string; screenToken: string; recordings?: RecordingInfo[] }> {
// } catch (error) { try {
// if (error.status === 404) { return lastValueFrom(this.http.post<any>(this.baseHref + 'sessions', { sessionId }));
// throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' }; } catch (error) {
// } if (error.status === 404) {
// throw error; throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
// } }
throw error;
}
}
async startRecording(sessionId: string) {
try {
return lastValueFrom(this.http.post<any>(this.baseHref + 'recordings/start', { sessionId }));
} catch (error) {
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
}
async stopRecording(sessionId: string) {
try {
return lastValueFrom(this.http.post<any>(this.baseHref + 'recordings/stop', { sessionId }));
} catch (error) {
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
}
async login(password: string): Promise<any[]> {
try {
return lastValueFrom(
this.http.post<any>(`${this.baseHref}admin/login`, {
password
})
);
} catch (error) {
console.log(error);
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
}
async logout(): Promise<void> {
try {
return lastValueFrom(
this.http.post<any>(`${this.baseHref}admin/logout`, {})
);
} catch (error) {
console.log(error);
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
}
async deleteRecording(id: string): Promise<any[]> {
try {
return lastValueFrom(this.http.delete<any>(`${this.baseHref}recordings/delete/${id}`));
} catch (error) {
console.log(error);
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
}
getRecordings(): Promise<any[]> {
return lastValueFrom(
this.http.get<any>(`${this.baseHref}recordings`)
);
}
getRecording(recordingId: string) {
try {
return lastValueFrom(
this.http.get(`${this.baseHref}recordings/${recordingId}`, {
responseType: 'blob'
})
);
} catch (error) {
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
}
getRecording2(recordingId: string) {
try {
return lastValueFrom(
this.http.get(`${this.baseHref}recordings/${recordingId}`,{
responseType: 'blob'
})
);
} catch (error) {
if (error.status === 404) {
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
}
throw error;
}
} }
/** /**
@ -79,7 +183,6 @@ export class RestService {
}) })
) )
.subscribe((response) => { .subscribe((response) => {
console.warn(response); console.warn(response);
resolve(response.token); resolve(response.token);