import { ILocalVideoTrack } from "agora-rtc-sdk-ng"; import { ActionParams } from "../action/type/ActionParams"; import { ShareCameraActionParams } from "../action/type/ShareCameraActionParams"; import { Context } from "../context/Context"; import { CustomError } from "../exception/CustomError"; import { ErrorType } from "../exception/enum/ErrorType"; import { BaseOperation } from "./base/BaseOperation"; import { EOperationStatus } from "./enum/EOperationStatus"; import { EOperationType } from "./enum/EOperationType"; import { IOperation } from "./interface/IOperation"; export class ShareCameraOperation extends BaseOperation implements IOperation { constructor(context: Context){ super(context); this.type=EOperationType.SHARE_CAMERA; } /*@overwrite*/ public async handler(params ? : ActionParams) : Promise{ return new Promise( async (resolve, reject)=>{ try { this.context.getDeterminants().setUpdating(true); let track; let shareCameraActionParams : ShareCameraActionParams = Object.assign(params ? params : {}); let cameraTrack : ILocalVideoTrack = await this.context.getResources().getVideoTrack(); if(cameraTrack == undefined || cameraTrack == null){ cameraTrack = await this.context.getResources().createVideoTrack(this.context.getDeterminants().getCameraSelected()); } await cameraTrack.setEnabled(true); track = cameraTrack; let client = this.context.getResources().getClient(); if(track){ if(shareCameraActionParams.active == true){ await client.unpublish(track); await client.publish(track); this.context.getDeterminants().setHasCamera(true); }else{ await client.unpublish(track); await track.setEnabled(false); this.context.getDeterminants().setHasCamera(false); } this.status = EOperationStatus.PERFORMED; }else{ this.addError(new CustomError(ErrorType.BUSINESS, "Cannot publish track", "Cannot publish track, because no stream tracks were found")); this.status = EOperationStatus.FAILED; } } catch (error) { this.addError(error); this.status = EOperationStatus.FAILED; } resolve(this.status); }); } }