mirror of https://github.com/OpenVidu/openvidu.git
openvidu-browser: ensure Promise return on every resolve and reject
parent
e9e3bbaf09
commit
ad8e8938d4
|
@ -99,7 +99,7 @@ export class Filter {
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMsg = "'params' property must be a JSON formatted object";
|
const errorMsg = "'params' property must be a JSON formatted object";
|
||||||
logger.error(errorMsg);
|
logger.error(errorMsg);
|
||||||
reject(errorMsg);
|
return reject(errorMsg);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stringParams = <string>params;
|
stringParams = <string>params;
|
||||||
|
@ -111,9 +111,9 @@ export class Filter {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error executing filter method for Stream ' + this.stream.streamId, error);
|
logger.error('Error executing filter method for Stream ' + this.stream.streamId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to execute a filter method"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to execute a filter method"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info('Filter method successfully executed on Stream ' + this.stream.streamId);
|
logger.info('Filter method successfully executed on Stream ' + this.stream.streamId);
|
||||||
|
@ -121,7 +121,7 @@ export class Filter {
|
||||||
this.stream.filter!.lastExecMethod = { method, params: JSON.parse(stringParams) };
|
this.stream.filter!.lastExecMethod = { method, params: JSON.parse(stringParams) };
|
||||||
this.stream.session.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.stream.session, this.stream, 'filter', this.stream.filter!, oldValue, 'execFilterMethod')]);
|
this.stream.session.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.stream.session, this.stream, 'filter', this.stream.filter!, oldValue, 'execFilterMethod')]);
|
||||||
this.stream.streamManager.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.stream.streamManager, this.stream, 'filter', this.stream.filter!, oldValue, 'execFilterMethod')]);
|
this.stream.streamManager.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.stream.streamManager, this.stream, 'filter', this.stream.filter!, oldValue, 'execFilterMethod')]);
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -147,14 +147,14 @@ export class Filter {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error adding filter event listener to event ' + eventType + 'for Stream ' + this.stream.streamId, error);
|
logger.error('Error adding filter event listener to event ' + eventType + 'for Stream ' + this.stream.streamId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to add a filter event listener"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to add a filter event listener"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.handlers.set(eventType, handler);
|
this.handlers.set(eventType, handler);
|
||||||
logger.info('Filter event listener to event ' + eventType + ' successfully applied on Stream ' + this.stream.streamId);
|
logger.info('Filter event listener to event ' + eventType + ' successfully applied on Stream ' + this.stream.streamId);
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -179,14 +179,14 @@ export class Filter {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error removing filter event listener to event ' + eventType + 'for Stream ' + this.stream.streamId, error);
|
logger.error('Error removing filter event listener to event ' + eventType + 'for Stream ' + this.stream.streamId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to add a filter event listener"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to add a filter event listener"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.handlers.delete(eventType);
|
this.handlers.delete(eventType);
|
||||||
logger.info('Filter event listener to event ' + eventType + ' successfully removed on Stream ' + this.stream.streamId);
|
logger.info('Filter event listener to event ' + eventType + ' successfully removed on Stream ' + this.stream.streamId);
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -90,7 +90,7 @@ export class LocalRecorder {
|
||||||
if (typeof MediaRecorder.isTypeSupported === 'function') {
|
if (typeof MediaRecorder.isTypeSupported === 'function') {
|
||||||
if (!!mimeType) {
|
if (!!mimeType) {
|
||||||
if (!MediaRecorder.isTypeSupported(mimeType)) {
|
if (!MediaRecorder.isTypeSupported(mimeType)) {
|
||||||
reject(new Error('mimeType "' + mimeType + '" is not supported'));
|
return reject(new Error('mimeType "' + mimeType + '" is not supported'));
|
||||||
}
|
}
|
||||||
options = { mimeType };
|
options = { mimeType };
|
||||||
} else {
|
} else {
|
||||||
|
@ -104,7 +104,7 @@ export class LocalRecorder {
|
||||||
this.mediaRecorder.start(10);
|
this.mediaRecorder.start(10);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
reject(err);
|
return reject(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mediaRecorder.ondataavailable = (e) => {
|
this.mediaRecorder.ondataavailable = (e) => {
|
||||||
|
@ -136,7 +136,7 @@ export class LocalRecorder {
|
||||||
};
|
};
|
||||||
|
|
||||||
this.state = LocalRecorderState.RECORDING;
|
this.state = LocalRecorderState.RECORDING;
|
||||||
resolve();
|
return resolve();
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -154,11 +154,11 @@ export class LocalRecorder {
|
||||||
}
|
}
|
||||||
this.mediaRecorder.onstop = () => {
|
this.mediaRecorder.onstop = () => {
|
||||||
this.onStopDefault();
|
this.onStopDefault();
|
||||||
resolve();
|
return resolve();
|
||||||
};
|
};
|
||||||
this.mediaRecorder.stop();
|
this.mediaRecorder.stop();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
reject(e);
|
return reject(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -172,13 +172,13 @@ export class LocalRecorder {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
if (this.state !== LocalRecorderState.RECORDING) {
|
if (this.state !== LocalRecorderState.RECORDING) {
|
||||||
reject(Error('\'LocalRecord.pause()\' needs \'LocalRecord.state\' to be \'RECORDING\' (current value: \'' + this.state + '\'). Call \'LocalRecorder.start()\' or \'LocalRecorder.resume()\' before'));
|
return reject(Error('\'LocalRecord.pause()\' needs \'LocalRecord.state\' to be \'RECORDING\' (current value: \'' + this.state + '\'). Call \'LocalRecorder.start()\' or \'LocalRecorder.resume()\' before'));
|
||||||
}
|
}
|
||||||
this.mediaRecorder.pause();
|
this.mediaRecorder.pause();
|
||||||
this.state = LocalRecorderState.PAUSED;
|
this.state = LocalRecorderState.PAUSED;
|
||||||
resolve();
|
return resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -195,9 +195,9 @@ export class LocalRecorder {
|
||||||
}
|
}
|
||||||
this.mediaRecorder.resume();
|
this.mediaRecorder.resume();
|
||||||
this.state = LocalRecorderState.RECORDING;
|
this.state = LocalRecorderState.RECORDING;
|
||||||
resolve();
|
return resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -300,7 +300,7 @@ export class LocalRecorder {
|
||||||
uploadAsBinary(endpoint: string, headers?: any): Promise<any> {
|
uploadAsBinary(endpoint: string, headers?: any): Promise<any> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (this.state !== LocalRecorderState.FINISHED) {
|
if (this.state !== LocalRecorderState.FINISHED) {
|
||||||
reject(Error('\'LocalRecord.uploadAsBinary()\' needs \'LocalRecord.state\' to be \'FINISHED\' (current value: \'' + this.state + '\'). Call \'LocalRecorder.stop()\' before'));
|
return reject(Error('\'LocalRecord.uploadAsBinary()\' needs \'LocalRecord.state\' to be \'FINISHED\' (current value: \'' + this.state + '\'). Call \'LocalRecorder.stop()\' before'));
|
||||||
} else {
|
} else {
|
||||||
const http = new XMLHttpRequest();
|
const http = new XMLHttpRequest();
|
||||||
http.open('POST', endpoint, true);
|
http.open('POST', endpoint, true);
|
||||||
|
@ -315,9 +315,9 @@ export class LocalRecorder {
|
||||||
if (http.readyState === 4) {
|
if (http.readyState === 4) {
|
||||||
if (http.status.toString().charAt(0) === '2') {
|
if (http.status.toString().charAt(0) === '2') {
|
||||||
// Success response from server (HTTP status standard: 2XX is success)
|
// Success response from server (HTTP status standard: 2XX is success)
|
||||||
resolve(http.responseText);
|
return resolve(http.responseText);
|
||||||
} else {
|
} else {
|
||||||
reject(http.status);
|
return reject(http.status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -340,7 +340,7 @@ export class LocalRecorder {
|
||||||
uploadAsMultipartfile(endpoint: string, headers?: any): Promise<any> {
|
uploadAsMultipartfile(endpoint: string, headers?: any): Promise<any> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (this.state !== LocalRecorderState.FINISHED) {
|
if (this.state !== LocalRecorderState.FINISHED) {
|
||||||
reject(Error('\'LocalRecord.uploadAsMultipartfile()\' needs \'LocalRecord.state\' to be \'FINISHED\' (current value: \'' + this.state + '\'). Call \'LocalRecorder.stop()\' before'));
|
return reject(Error('\'LocalRecord.uploadAsMultipartfile()\' needs \'LocalRecord.state\' to be \'FINISHED\' (current value: \'' + this.state + '\'). Call \'LocalRecorder.stop()\' before'));
|
||||||
} else {
|
} else {
|
||||||
const http = new XMLHttpRequest();
|
const http = new XMLHttpRequest();
|
||||||
http.open('POST', endpoint, true);
|
http.open('POST', endpoint, true);
|
||||||
|
@ -358,9 +358,9 @@ export class LocalRecorder {
|
||||||
if (http.readyState === 4) {
|
if (http.readyState === 4) {
|
||||||
if (http.status.toString().charAt(0) === '2') {
|
if (http.status.toString().charAt(0) === '2') {
|
||||||
// Success response from server (HTTP status standard: 2XX is success)
|
// Success response from server (HTTP status standard: 2XX is success)
|
||||||
resolve(http.responseText);
|
return resolve(http.responseText);
|
||||||
} else {
|
} else {
|
||||||
reject(http.status);
|
return reject(http.status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -272,9 +272,9 @@ export class OpenVidu {
|
||||||
|
|
||||||
const callback = (error: Error) => {
|
const callback = (error: Error) => {
|
||||||
if (!!error) {
|
if (!!error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
resolve(publisher);
|
return resolve(publisher);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -416,7 +416,7 @@ export class OpenVidu {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
resolve(devices);
|
return resolve(devices);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -430,11 +430,11 @@ export class OpenVidu {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
resolve(devices);
|
return resolve(devices);
|
||||||
}
|
}
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
logger.error('Error getting devices', error);
|
logger.error('Error getting devices', error);
|
||||||
reject(error);
|
return reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -497,7 +497,7 @@ export class OpenVidu {
|
||||||
navigator.mediaDevices.getUserMedia(constraintsAux)
|
navigator.mediaDevices.getUserMedia(constraintsAux)
|
||||||
.then(audioOnlyStream => {
|
.then(audioOnlyStream => {
|
||||||
previousMediaStream.addTrack(audioOnlyStream.getAudioTracks()[0]);
|
previousMediaStream.addTrack(audioOnlyStream.getAudioTracks()[0]);
|
||||||
resolve(previousMediaStream);
|
return resolve(previousMediaStream);
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
previousMediaStream.getAudioTracks().forEach((track) => {
|
previousMediaStream.getAudioTracks().forEach((track) => {
|
||||||
|
@ -506,7 +506,7 @@ export class OpenVidu {
|
||||||
previousMediaStream.getVideoTracks().forEach((track) => {
|
previousMediaStream.getVideoTracks().forEach((track) => {
|
||||||
track.stop();
|
track.stop();
|
||||||
});
|
});
|
||||||
reject(this.generateAudioDeviceError(error, constraintsAux));
|
return reject(this.generateAudioDeviceError(error, constraintsAux));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +517,7 @@ export class OpenVidu {
|
||||||
!!myConstraints.videoTrack && myConstraints.constraints?.audio === false) {
|
!!myConstraints.videoTrack && myConstraints.constraints?.audio === false) {
|
||||||
|
|
||||||
// No need to call getUserMedia at all. Both tracks provided, or only AUDIO track provided or only VIDEO track provided
|
// No need to call getUserMedia at all. Both tracks provided, or only AUDIO track provided or only VIDEO track provided
|
||||||
resolve(this.addAlreadyProvidedTracks(myConstraints, new MediaStream()));
|
return resolve(this.addAlreadyProvidedTracks(myConstraints, new MediaStream()));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// getUserMedia must be called. AUDIO or VIDEO are requesting a new track
|
// getUserMedia must be called. AUDIO or VIDEO are requesting a new track
|
||||||
|
@ -547,13 +547,13 @@ export class OpenVidu {
|
||||||
askForAudioStreamOnly(mediaStream, <MediaStreamConstraints>myConstraints.constraints);
|
askForAudioStreamOnly(mediaStream, <MediaStreamConstraints>myConstraints.constraints);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
resolve(mediaStream);
|
return resolve(mediaStream);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
let errorName: OpenViduErrorName = OpenViduErrorName.SCREEN_CAPTURE_DENIED;
|
let errorName: OpenViduErrorName = OpenViduErrorName.SCREEN_CAPTURE_DENIED;
|
||||||
const errorMessage = error.toString();
|
const errorMessage = error.toString();
|
||||||
reject(new OpenViduError(errorName, errorMessage));
|
return reject(new OpenViduError(errorName, errorMessage));
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
@ -572,7 +572,7 @@ export class OpenVidu {
|
||||||
askForAudioStreamOnly(mediaStream, <MediaStreamConstraints>myConstraints.constraints);
|
askForAudioStreamOnly(mediaStream, <MediaStreamConstraints>myConstraints.constraints);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
resolve(mediaStream);
|
return resolve(mediaStream);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
|
@ -583,12 +583,10 @@ export class OpenVidu {
|
||||||
} else {
|
} else {
|
||||||
errorName = OpenViduErrorName.SCREEN_CAPTURE_DENIED;
|
errorName = OpenViduErrorName.SCREEN_CAPTURE_DENIED;
|
||||||
}
|
}
|
||||||
reject(new OpenViduError(errorName, errorMessage));
|
return reject(new OpenViduError(errorName, errorMessage));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}).catch((error: OpenViduError) => {
|
}).catch((error: OpenViduError) => reject(error));
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,7 +695,7 @@ export class OpenVidu {
|
||||||
}
|
}
|
||||||
if (myConstraints.constraints!.audio === false && myConstraints.constraints!.video === false) {
|
if (myConstraints.constraints!.audio === false && myConstraints.constraints!.video === false) {
|
||||||
// ERROR! audioSource and videoSource cannot be both false at the same time
|
// ERROR! audioSource and videoSource cannot be both false at the same time
|
||||||
reject(new OpenViduError(OpenViduErrorName.NO_INPUT_SOURCE_SET,
|
return reject(new OpenViduError(OpenViduErrorName.NO_INPUT_SOURCE_SET,
|
||||||
"Properties 'audioSource' and 'videoSource' cannot be set to false or null at the same time"));
|
"Properties 'audioSource' and 'videoSource' cannot be set to false or null at the same time"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -749,7 +747,7 @@ export class OpenVidu {
|
||||||
// CASE 4: deviceId or screen sharing
|
// CASE 4: deviceId or screen sharing
|
||||||
this.configureDeviceIdOrScreensharing(myConstraints, publisherProperties, resolve, reject);
|
this.configureDeviceIdOrScreensharing(myConstraints, publisherProperties, resolve, reject);
|
||||||
|
|
||||||
resolve(myConstraints);
|
return resolve(myConstraints);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -919,7 +917,7 @@ export class OpenVidu {
|
||||||
if (!this.checkScreenSharingCapabilities()) {
|
if (!this.checkScreenSharingCapabilities()) {
|
||||||
const error = new OpenViduError(OpenViduErrorName.SCREEN_SHARING_NOT_SUPPORTED, 'You can only screen share in desktop Chrome, Firefox, Opera, Safari (>=13.0), Edge (>= 80) or Electron. Detected client: ' + platform.getName() + ' ' + platform.getVersion());
|
const error = new OpenViduError(OpenViduErrorName.SCREEN_SHARING_NOT_SUPPORTED, 'You can only screen share in desktop Chrome, Firefox, Opera, Safari (>=13.0), Edge (>= 80) or Electron. Detected client: ' + platform.getName() + ' ' + platform.getVersion());
|
||||||
logger.error(error);
|
logger.error(error);
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (platform.isElectron()) {
|
if (platform.isElectron()) {
|
||||||
|
@ -932,7 +930,7 @@ export class OpenVidu {
|
||||||
chromeMediaSourceId: electronScreenId
|
chromeMediaSourceId: electronScreenId
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
resolve(myConstraints);
|
return resolve(myConstraints);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -945,26 +943,26 @@ export class OpenVidu {
|
||||||
if (error === 'permission-denied' || error === 'PermissionDeniedError') {
|
if (error === 'permission-denied' || error === 'PermissionDeniedError') {
|
||||||
const error = new OpenViduError(OpenViduErrorName.SCREEN_CAPTURE_DENIED, 'You must allow access to one window of your desktop');
|
const error = new OpenViduError(OpenViduErrorName.SCREEN_CAPTURE_DENIED, 'You must allow access to one window of your desktop');
|
||||||
logger.error(error);
|
logger.error(error);
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
const extensionId = this.advancedConfiguration.screenShareChromeExtension!.split('/').pop()!!.trim();
|
const extensionId = this.advancedConfiguration.screenShareChromeExtension!.split('/').pop()!!.trim();
|
||||||
screenSharing.getChromeExtensionStatus(extensionId, status => {
|
screenSharing.getChromeExtensionStatus(extensionId, status => {
|
||||||
if (status === 'installed-disabled') {
|
if (status === 'installed-disabled') {
|
||||||
const error = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_DISABLED, 'You must enable the screen extension');
|
const error = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_DISABLED, 'You must enable the screen extension');
|
||||||
logger.error(error);
|
logger.error(error);
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
if (status === 'not-installed') {
|
if (status === 'not-installed') {
|
||||||
const error = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_NOT_INSTALLED, (<string>this.advancedConfiguration.screenShareChromeExtension));
|
const error = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_NOT_INSTALLED, (<string>this.advancedConfiguration.screenShareChromeExtension));
|
||||||
logger.error(error);
|
logger.error(error);
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
myConstraints.constraints!.video = screenConstraints;
|
myConstraints.constraints!.video = screenConstraints;
|
||||||
resolve(myConstraints);
|
return resolve(myConstraints);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -972,7 +970,7 @@ export class OpenVidu {
|
||||||
|
|
||||||
if (navigator.mediaDevices['getDisplayMedia']) {
|
if (navigator.mediaDevices['getDisplayMedia']) {
|
||||||
// getDisplayMedia support (Chrome >= 72, Firefox >= 66, Safari >= 13)
|
// getDisplayMedia support (Chrome >= 72, Firefox >= 66, Safari >= 13)
|
||||||
resolve(myConstraints);
|
return resolve(myConstraints);
|
||||||
} else {
|
} else {
|
||||||
// Default screen sharing extension for Chrome/Opera, or is Firefox < 66
|
// Default screen sharing extension for Chrome/Opera, or is Firefox < 66
|
||||||
const firefoxString = (platform.isFirefoxBrowser() || platform.isFirefoxMobileBrowser()) ? publisherProperties.videoSource : undefined;
|
const firefoxString = (platform.isFirefoxBrowser() || platform.isFirefoxMobileBrowser()) ? publisherProperties.videoSource : undefined;
|
||||||
|
@ -984,24 +982,24 @@ export class OpenVidu {
|
||||||
'https://chrome.google.com/webstore/detail/openvidu-screensharing/lfcgfepafnobdloecchnfaclibenjold';
|
'https://chrome.google.com/webstore/detail/openvidu-screensharing/lfcgfepafnobdloecchnfaclibenjold';
|
||||||
const err = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_NOT_INSTALLED, extensionUrl);
|
const err = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_NOT_INSTALLED, extensionUrl);
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
reject(err);
|
return reject(err);
|
||||||
} else if (error === 'installed-disabled') {
|
} else if (error === 'installed-disabled') {
|
||||||
const err = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_DISABLED, 'You must enable the screen extension');
|
const err = new OpenViduError(OpenViduErrorName.SCREEN_EXTENSION_DISABLED, 'You must enable the screen extension');
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
reject(err);
|
return reject(err);
|
||||||
} else if (error === 'permission-denied') {
|
} else if (error === 'permission-denied') {
|
||||||
const err = new OpenViduError(OpenViduErrorName.SCREEN_CAPTURE_DENIED, 'You must allow access to one window of your desktop');
|
const err = new OpenViduError(OpenViduErrorName.SCREEN_CAPTURE_DENIED, 'You must allow access to one window of your desktop');
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
reject(err);
|
return reject(err);
|
||||||
} else {
|
} else {
|
||||||
const err = new OpenViduError(OpenViduErrorName.GENERIC_ERROR, 'Unknown error when accessing screen share');
|
const err = new OpenViduError(OpenViduErrorName.GENERIC_ERROR, 'Unknown error when accessing screen share');
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
logger.error(error);
|
logger.error(error);
|
||||||
reject(err);
|
return reject(err);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
myConstraints.constraints!.video = screenConstraints.video;
|
myConstraints.constraints!.video = screenConstraints.video;
|
||||||
resolve(myConstraints);
|
return resolve(myConstraints);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -304,7 +304,7 @@ export class Publisher extends StreamManager {
|
||||||
this.openvidu.sendNewVideoDimensionsIfRequired(this, 'trackReplaced', 50, 30);
|
this.openvidu.sendNewVideoDimensionsIfRequired(this, 'trackReplaced', 50, 30);
|
||||||
this.session.sendVideoData(this.stream.streamManager, 5, true, 5);
|
this.session.sendVideoData(this.stream.streamManager, 5, true, 5);
|
||||||
}
|
}
|
||||||
resolve();
|
return resolve();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,24 +315,19 @@ export class Publisher extends StreamManager {
|
||||||
if (track.kind === 'video') {
|
if (track.kind === 'video') {
|
||||||
sender = senders.find(s => !!s.track && s.track.kind === 'video');
|
sender = senders.find(s => !!s.track && s.track.kind === 'video');
|
||||||
if (!sender) {
|
if (!sender) {
|
||||||
reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'));
|
return reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else if (track.kind === 'audio') {
|
} else if (track.kind === 'audio') {
|
||||||
sender = senders.find(s => !!s.track && s.track.kind === 'audio');
|
sender = senders.find(s => !!s.track && s.track.kind === 'audio');
|
||||||
if (!sender) {
|
if (!sender) {
|
||||||
reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'));
|
return reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
reject(new Error('Unknown track kind ' + track.kind));
|
return reject(new Error('Unknown track kind ' + track.kind));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
(sender as RTCRtpSender).replaceTrack(track).then(() => {
|
(sender as RTCRtpSender).replaceTrack(track)
|
||||||
resolve();
|
.then(() => resolve())
|
||||||
}).catch(error => {
|
.catch(error => reject(error));
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +371,7 @@ export class Publisher extends StreamManager {
|
||||||
this.accessDenied = true;
|
this.accessDenied = true;
|
||||||
this.accessAllowed = false;
|
this.accessAllowed = false;
|
||||||
logger.error(`Publisher initialization failed. ${openViduError.name}: ${openViduError.message}`)
|
logger.error(`Publisher initialization failed. ${openViduError.name}: ${openViduError.message}`)
|
||||||
reject(openViduError);
|
return reject(openViduError);
|
||||||
};
|
};
|
||||||
|
|
||||||
const successCallback = (mediaStream: MediaStream) => {
|
const successCallback = (mediaStream: MediaStream) => {
|
||||||
|
@ -448,7 +443,7 @@ export class Publisher extends StreamManager {
|
||||||
this.stream.isLocalStreamReadyToPublish = true;
|
this.stream.isLocalStreamReadyToPublish = true;
|
||||||
this.stream.ee.emitEvent('stream-ready-to-publish', []);
|
this.stream.ee.emitEvent('stream-ready-to-publish', []);
|
||||||
}
|
}
|
||||||
resolve();
|
return resolve();
|
||||||
};
|
};
|
||||||
|
|
||||||
const getMediaSuccess = (mediaStream: MediaStream, definedAudioConstraint) => {
|
const getMediaSuccess = (mediaStream: MediaStream, definedAudioConstraint) => {
|
||||||
|
@ -643,7 +638,7 @@ export class Publisher extends StreamManager {
|
||||||
document.body.removeChild(this.videoReference);
|
document.body.removeChild(this.videoReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve({ width, height });
|
return resolve({ width, height });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.videoReference.readyState >= 1) {
|
if (this.videoReference.readyState >= 1) {
|
||||||
|
|
|
@ -170,13 +170,11 @@ export class Session extends EventDispatcher {
|
||||||
participantId: token,
|
participantId: token,
|
||||||
metadata: !!metadata ? this.stringClientMetadata(metadata) : ''
|
metadata: !!metadata ? this.stringClientMetadata(metadata) : ''
|
||||||
};
|
};
|
||||||
this.connectAux(token).then(() => {
|
this.connectAux(token)
|
||||||
resolve();
|
.then(() =>resolve())
|
||||||
}).catch(error => {
|
.catch(error => reject(error));
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
reject(new OpenViduError(OpenViduErrorName.BROWSER_NOT_SUPPORTED, 'Browser ' + platform.getName() + ' (version ' + platform.getVersion() + ') for ' + platform.getFamily() + ' is not supported in OpenVidu'));
|
return reject(new OpenViduError(OpenViduErrorName.BROWSER_NOT_SUPPORTED, 'Browser ' + platform.getName() + ' (version ' + platform.getVersion() + ') for ' + platform.getFamily() + ' is not supported in OpenVidu'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -294,16 +292,16 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise<Subscriber>((resolve, reject) => {
|
return new Promise<Subscriber>((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.sessionConnected()) {
|
if (!this.sessionConnected()) {
|
||||||
reject(this.notConnectedError());
|
return reject(this.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
let subscriber: Subscriber;
|
let subscriber: Subscriber;
|
||||||
|
|
||||||
const callback = (error: Error) => {
|
const callback = (error: Error) => {
|
||||||
if (!!error) {
|
if (!!error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
resolve(subscriber);
|
return resolve(subscriber);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -332,7 +330,7 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.sessionConnected()) {
|
if (!this.sessionConnected()) {
|
||||||
reject(this.notConnectedError());
|
return reject(this.notConnectedError());
|
||||||
} else {
|
} else {
|
||||||
const connectionId = subscriber.stream.connection.connectionId;
|
const connectionId = subscriber.stream.connection.connectionId;
|
||||||
|
|
||||||
|
@ -344,13 +342,13 @@ export class Session extends EventDispatcher {
|
||||||
(error, response) => {
|
(error, response) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error unsubscribing from ' + connectionId);
|
logger.error('Error unsubscribing from ' + connectionId);
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
logger.info('Unsubscribed correctly from ' + connectionId);
|
logger.info('Unsubscribed correctly from ' + connectionId);
|
||||||
subscriber.stream.streamManager.removeAllVideos();
|
subscriber.stream.streamManager.removeAllVideos();
|
||||||
subscriber.stream.disposeWebRtcPeer();
|
subscriber.stream.disposeWebRtcPeer();
|
||||||
subscriber.stream.disposeMediaStream();
|
subscriber.stream.disposeMediaStream();
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -376,7 +374,7 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.sessionConnected()) {
|
if (!this.sessionConnected()) {
|
||||||
reject(this.notConnectedError());
|
return reject(this.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
publisher.session = this;
|
publisher.session = this;
|
||||||
|
@ -388,11 +386,9 @@ export class Session extends EventDispatcher {
|
||||||
publisher.stream.publish()
|
publisher.stream.publish()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.sendVideoData(publisher, 8, true, 5);
|
this.sendVideoData(publisher, 8, true, 5);
|
||||||
resolve();
|
return resolve();
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => reject(error));
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
// 'Session.unpublish(Publisher)' has been called. Must initialize again Publisher
|
// 'Session.unpublish(Publisher)' has been called. Must initialize again Publisher
|
||||||
publisher.initialize()
|
publisher.initialize()
|
||||||
|
@ -402,14 +398,10 @@ export class Session extends EventDispatcher {
|
||||||
publisher.stream.publish()
|
publisher.stream.publish()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.sendVideoData(publisher, 8, true, 5);
|
this.sendVideoData(publisher, 8, true, 5);
|
||||||
resolve();
|
return resolve();
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => reject(error));
|
||||||
reject(error);
|
}).catch(error => reject(error));
|
||||||
});
|
|
||||||
}).catch((error) => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -445,9 +437,9 @@ export class Session extends EventDispatcher {
|
||||||
const stream = publisher.stream;
|
const stream = publisher.stream;
|
||||||
|
|
||||||
if (!stream.connection) {
|
if (!stream.connection) {
|
||||||
reject(new Error('The associated Connection object of this Publisher is null'));
|
return reject(new Error('The associated Connection object of this Publisher is null'));
|
||||||
} else if (stream.connection !== this.connection) {
|
} else if (stream.connection !== this.connection) {
|
||||||
reject(new Error('The associated Connection object of this Publisher is not your local Connection.' +
|
return reject(new Error('The associated Connection object of this Publisher is not your local Connection.' +
|
||||||
"Only moderators can force unpublish on remote Streams via 'forceUnpublish' method"));
|
"Only moderators can force unpublish on remote Streams via 'forceUnpublish' method"));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -455,7 +447,7 @@ export class Session extends EventDispatcher {
|
||||||
|
|
||||||
this.openvidu.sendRequest('unpublishVideo', (error, response) => {
|
this.openvidu.sendRequest('unpublishVideo', (error, response) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
logger.info('Media unpublished correctly');
|
logger.info('Media unpublished correctly');
|
||||||
|
|
||||||
|
@ -470,7 +462,7 @@ export class Session extends EventDispatcher {
|
||||||
publisher.emitEvent('streamDestroyed', [streamEvent]);
|
publisher.emitEvent('streamDestroyed', [streamEvent]);
|
||||||
streamEvent.callDefaultBehavior();
|
streamEvent.callDefaultBehavior();
|
||||||
|
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -499,7 +491,7 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.sessionConnected()) {
|
if (!this.sessionConnected()) {
|
||||||
reject(this.notConnectedError());
|
return reject(this.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info('Forcing disconnect for connection ' + connection.connectionId);
|
logger.info('Forcing disconnect for connection ' + connection.connectionId);
|
||||||
|
@ -510,13 +502,13 @@ export class Session extends EventDispatcher {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error forcing disconnect for Connection ' + connection.connectionId, error);
|
logger.error('Error forcing disconnect for Connection ' + connection.connectionId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to force a disconnection"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to force a disconnection"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info('Forcing disconnect correctly for Connection ' + connection.connectionId);
|
logger.info('Forcing disconnect correctly for Connection ' + connection.connectionId);
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -543,7 +535,7 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.sessionConnected()) {
|
if (!this.sessionConnected()) {
|
||||||
reject(this.notConnectedError());
|
return reject(this.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info('Forcing unpublish for stream ' + stream.streamId);
|
logger.info('Forcing unpublish for stream ' + stream.streamId);
|
||||||
|
@ -554,13 +546,13 @@ export class Session extends EventDispatcher {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error forcing unpublish for Stream ' + stream.streamId, error);
|
logger.error('Error forcing unpublish for Stream ' + stream.streamId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to force an unpublishing"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to force an unpublishing"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info('Forcing unpublish correctly for Stream ' + stream.streamId);
|
logger.info('Forcing unpublish correctly for Stream ' + stream.streamId);
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -584,7 +576,7 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.sessionConnected()) {
|
if (!this.sessionConnected()) {
|
||||||
reject(this.notConnectedError());
|
return reject(this.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
const signalMessage = {};
|
const signalMessage = {};
|
||||||
|
@ -615,9 +607,9 @@ export class Session extends EventDispatcher {
|
||||||
message: JSON.stringify(signalMessage)
|
message: JSON.stringify(signalMessage)
|
||||||
}, (error, response) => {
|
}, (error, response) => {
|
||||||
if (!!error) {
|
if (!!error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1129,7 +1121,7 @@ export class Session extends EventDispatcher {
|
||||||
// of the subscriber was already taking place. Always use the last one to retry the re-subscription
|
// of the subscriber was already taking place. Always use the last one to retry the re-subscription
|
||||||
// process, as that SDP offer will be the only one available at the server side. Ignore previous ones
|
// process, as that SDP offer will be the only one available at the server side. Ignore previous ones
|
||||||
stream.reconnectionEventEmitter!['onForciblyReconnectSubscriberLastEvent'] = event;
|
stream.reconnectionEventEmitter!['onForciblyReconnectSubscriberLastEvent'] = event;
|
||||||
reject('Ongoing forced subscriber reconnection');
|
return reject('Ongoing forced subscriber reconnection');
|
||||||
} else {
|
} else {
|
||||||
// One onForciblyReconnectSubscriber even has been received while a reconnection process
|
// One onForciblyReconnectSubscriber even has been received while a reconnection process
|
||||||
// of the subscriber was already taking place. Set up a listener to wait for it to retry the
|
// of the subscriber was already taking place. Set up a listener to wait for it to retry the
|
||||||
|
@ -1156,12 +1148,12 @@ export class Session extends EventDispatcher {
|
||||||
} else {
|
} else {
|
||||||
const errMsg = "No stream with streamId '" + event.streamId + "' found for connection '" + event.connectionId + "' on 'streamPropertyChanged' event";
|
const errMsg = "No stream with streamId '" + event.streamId + "' found for connection '" + event.connectionId + "' on 'streamPropertyChanged' event";
|
||||||
logger.error(errMsg);
|
logger.error(errMsg);
|
||||||
reject(errMsg);
|
return reject(errMsg);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(openViduError => {
|
.catch(openViduError => {
|
||||||
logger.error(openViduError);
|
logger.error(openViduError);
|
||||||
reject(openViduError);
|
return reject(openViduError);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1354,14 +1346,14 @@ export class Session extends EventDispatcher {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.openvidu.startWs((error) => {
|
this.openvidu.startWs((error) => {
|
||||||
if (!!error) {
|
if (!!error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
const joinParams = this.initializeParams(token);
|
const joinParams = this.initializeParams(token);
|
||||||
|
|
||||||
this.openvidu.sendRequest('joinRoom', joinParams, (error, response: LocalConnectionOptions) => {
|
this.openvidu.sendRequest('joinRoom', joinParams, (error, response: LocalConnectionOptions) => {
|
||||||
if (!!error) {
|
if (!!error) {
|
||||||
reject(error);
|
return reject(error);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Process join room response
|
// Process join room response
|
||||||
|
@ -1402,7 +1394,7 @@ export class Session extends EventDispatcher {
|
||||||
this.ee.emitEvent('streamCreated', [new StreamEvent(false, this, 'streamCreated', stream, '')]);
|
this.ee.emitEvent('streamCreated', [new StreamEvent(false, this, 'streamCreated', stream, '')]);
|
||||||
});
|
});
|
||||||
|
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1439,14 +1431,14 @@ export class Session extends EventDispatcher {
|
||||||
const connection = this.remoteConnections.get(connectionId);
|
const connection = this.remoteConnections.get(connectionId);
|
||||||
if (!!connection) {
|
if (!!connection) {
|
||||||
// Resolve remote connection
|
// Resolve remote connection
|
||||||
resolve(connection);
|
return resolve(connection);
|
||||||
} else {
|
} else {
|
||||||
if (this.connection.connectionId === connectionId) {
|
if (this.connection.connectionId === connectionId) {
|
||||||
// Resolve local connection
|
// Resolve local connection
|
||||||
resolve(this.connection);
|
return resolve(this.connection);
|
||||||
} else {
|
} else {
|
||||||
// Connection not found. Reject with OpenViduError
|
// Connection not found. Reject with OpenViduError
|
||||||
reject(new OpenViduError(OpenViduErrorName.GENERIC_ERROR, errorMessage));
|
return reject(new OpenViduError(OpenViduErrorName.GENERIC_ERROR, errorMessage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1457,12 +1449,12 @@ export class Session extends EventDispatcher {
|
||||||
const connection = this.remoteConnections.get(connectionId);
|
const connection = this.remoteConnections.get(connectionId);
|
||||||
if (!!connection) {
|
if (!!connection) {
|
||||||
// Resolve remote connection
|
// Resolve remote connection
|
||||||
resolve(connection);
|
return resolve(connection);
|
||||||
} else {
|
} else {
|
||||||
// Remote connection not found. Reject with OpenViduError
|
// Remote connection not found. Reject with OpenViduError
|
||||||
const errorMessage = 'Remote connection ' + connectionId + " unknown when '" + operation + "'. " +
|
const errorMessage = 'Remote connection ' + connectionId + " unknown when '" + operation + "'. " +
|
||||||
'Existing remote connections: ' + JSON.stringify(this.remoteConnections.keys());
|
'Existing remote connections: ' + JSON.stringify(this.remoteConnections.keys());
|
||||||
reject(new OpenViduError(OpenViduErrorName.GENERIC_ERROR, errorMessage));
|
return reject(new OpenViduError(OpenViduErrorName.GENERIC_ERROR, errorMessage));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -306,7 +306,7 @@ export class Stream {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.session.sessionConnected()) {
|
if (!this.session.sessionConnected()) {
|
||||||
reject(this.session.notConnectedError());
|
return reject(this.session.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info('Applying filter to stream ' + this.streamId);
|
logger.info('Applying filter to stream ' + this.streamId);
|
||||||
|
@ -322,9 +322,9 @@ export class Stream {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error applying filter for Stream ' + this.streamId, error);
|
logger.error('Error applying filter for Stream ' + this.streamId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to apply a filter"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to apply a filter"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info('Filter successfully applied on Stream ' + this.streamId);
|
logger.info('Filter successfully applied on Stream ' + this.streamId);
|
||||||
|
@ -333,7 +333,7 @@ export class Stream {
|
||||||
this.filter.stream = this;
|
this.filter.stream = this;
|
||||||
this.session.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.session, this, 'filter', this.filter, oldValue, 'applyFilter')]);
|
this.session.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.session, this, 'filter', this.filter, oldValue, 'applyFilter')]);
|
||||||
this.streamManager.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.streamManager, this, 'filter', this.filter, oldValue, 'applyFilter')]);
|
this.streamManager.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.streamManager, this, 'filter', this.filter, oldValue, 'applyFilter')]);
|
||||||
resolve(this.filter);
|
return resolve(this.filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -349,7 +349,7 @@ export class Stream {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
if (!this.session.sessionConnected()) {
|
if (!this.session.sessionConnected()) {
|
||||||
reject(this.session.notConnectedError());
|
return reject(this.session.notConnectedError());
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info('Removing filter of stream ' + this.streamId);
|
logger.info('Removing filter of stream ' + this.streamId);
|
||||||
|
@ -360,9 +360,9 @@ export class Stream {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error('Error removing filter for Stream ' + this.streamId, error);
|
logger.error('Error removing filter for Stream ' + this.streamId, error);
|
||||||
if (error.code === 401) {
|
if (error.code === 401) {
|
||||||
reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to remove a filter"));
|
return reject(new OpenViduError(OpenViduErrorName.OPENVIDU_PERMISSION_DENIED, "You don't have permissions to remove a filter"));
|
||||||
} else {
|
} else {
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info('Filter successfully removed from Stream ' + this.streamId);
|
logger.info('Filter successfully removed from Stream ' + this.streamId);
|
||||||
|
@ -370,7 +370,7 @@ export class Stream {
|
||||||
delete this.filter;
|
delete this.filter;
|
||||||
this.session.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.session, this, 'filter', this.filter!, oldValue, 'applyFilter')]);
|
this.session.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.session, this, 'filter', this.filter!, oldValue, 'applyFilter')]);
|
||||||
this.streamManager.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.streamManager, this, 'filter', this.filter!, oldValue, 'applyFilter')]);
|
this.streamManager.emitEvent('streamPropertyChanged', [new StreamPropertyChangedEvent(this.streamManager, this, 'filter', this.filter!, oldValue, 'applyFilter')]);
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -438,12 +438,8 @@ export class Stream {
|
||||||
subscribe(): Promise<void> {
|
subscribe(): Promise<void> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.initWebRtcPeerReceive(false)
|
this.initWebRtcPeerReceive(false)
|
||||||
.then(() => {
|
.then(() => resolve())
|
||||||
resolve();
|
.catch(error => reject(error));
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,21 +450,13 @@ export class Stream {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (this.isLocalStreamReadyToPublish) {
|
if (this.isLocalStreamReadyToPublish) {
|
||||||
this.initWebRtcPeerSend(false)
|
this.initWebRtcPeerSend(false)
|
||||||
.then(() => {
|
.then(() => resolve())
|
||||||
resolve();
|
.catch(error => reject(error));
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
this.ee.once('stream-ready-to-publish', () => {
|
this.ee.once('stream-ready-to-publish', () => {
|
||||||
this.publish()
|
this.publish()
|
||||||
.then(() => {
|
.then(() => resolve())
|
||||||
resolve();
|
.catch(error => reject(error));
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -826,12 +814,8 @@ export class Stream {
|
||||||
} else {
|
} else {
|
||||||
// Ongoing reconnection
|
// Ongoing reconnection
|
||||||
console.warn(`Trying to reconnect stream ${this.streamId} (${this.isLocal() ? 'Publisher' : 'Subscriber'}) but an ongoing reconnection process is active. Waiting for response...`);
|
console.warn(`Trying to reconnect stream ${this.streamId} (${this.isLocal() ? 'Publisher' : 'Subscriber'}) but an ongoing reconnection process is active. Waiting for response...`);
|
||||||
this.reconnectionEventEmitter.once('success', () => {
|
this.reconnectionEventEmitter.once('success', () => resolve());
|
||||||
resolve();
|
this.reconnectionEventEmitter.once('error', error => reject(error));
|
||||||
});
|
|
||||||
this.reconnectionEventEmitter.once('error', error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -857,7 +841,7 @@ export class Stream {
|
||||||
this.reconnectionEventEmitter?.emitEvent('success');
|
this.reconnectionEventEmitter?.emitEvent('success');
|
||||||
delete this.reconnectionEventEmitter;
|
delete this.reconnectionEventEmitter;
|
||||||
}
|
}
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
const finalReject = error => {
|
const finalReject = error => {
|
||||||
|
@ -865,7 +849,7 @@ export class Stream {
|
||||||
this.reconnectionEventEmitter?.emitEvent('error', [error]);
|
this.reconnectionEventEmitter?.emitEvent('error', [error]);
|
||||||
delete this.reconnectionEventEmitter;
|
delete this.reconnectionEventEmitter;
|
||||||
}
|
}
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const successOfferCallback = (sdpOfferParam) => {
|
const successOfferCallback = (sdpOfferParam) => {
|
||||||
|
@ -985,7 +969,7 @@ export class Stream {
|
||||||
this.reconnectionEventEmitter?.emitEvent('success');
|
this.reconnectionEventEmitter?.emitEvent('success');
|
||||||
delete this.reconnectionEventEmitter;
|
delete this.reconnectionEventEmitter;
|
||||||
}
|
}
|
||||||
resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -997,7 +981,7 @@ export class Stream {
|
||||||
this.reconnectionEventEmitter?.emitEvent('error', [error]);
|
this.reconnectionEventEmitter?.emitEvent('error', [error]);
|
||||||
delete this.reconnectionEventEmitter;
|
delete this.reconnectionEventEmitter;
|
||||||
}
|
}
|
||||||
reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1038,10 +1022,13 @@ export class Stream {
|
||||||
*/
|
*/
|
||||||
initWebRtcPeerReceiveFromClient(reconnect: boolean): Promise<void> {
|
initWebRtcPeerReceiveFromClient(reconnect: boolean): Promise<void> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.completeWebRtcPeerReceive(reconnect, false).then(response => {
|
this.completeWebRtcPeerReceive(reconnect, false)
|
||||||
|
.then(response => {
|
||||||
this.webRtcPeer.processRemoteAnswer(response.sdpAnswer)
|
this.webRtcPeer.processRemoteAnswer(response.sdpAnswer)
|
||||||
.then(() => resolve()).catch(error => reject(error));
|
.then(() => resolve())
|
||||||
}).catch(error => reject(error));
|
.catch(error => reject(error));
|
||||||
|
})
|
||||||
|
.catch(error => reject(error));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,10 +1040,11 @@ export class Stream {
|
||||||
// Server initiates negotiation
|
// Server initiates negotiation
|
||||||
this.session.openvidu.sendRequest('prepareReceiveVideoFrom', { sender: this.streamId, reconnect }, (error, response) => {
|
this.session.openvidu.sendRequest('prepareReceiveVideoFrom', { sender: this.streamId, reconnect }, (error, response) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(new Error('Error on prepareReceiveVideoFrom: ' + JSON.stringify(error)));
|
return reject(new Error('Error on prepareReceiveVideoFrom: ' + JSON.stringify(error)));
|
||||||
} else {
|
} else {
|
||||||
this.completeWebRtcPeerReceive(reconnect, false, response.sdpOffer)
|
this.completeWebRtcPeerReceive(reconnect, false, response.sdpOffer)
|
||||||
.then(() => resolve()).catch(error => reject(error));
|
.then(() => resolve())
|
||||||
|
.catch(error => reject(error));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1088,9 +1076,9 @@ export class Stream {
|
||||||
|
|
||||||
this.session.openvidu.sendRequest(method, params, (error, response) => {
|
this.session.openvidu.sendRequest(method, params, (error, response) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(new Error('Error on ' + method + ' : ' + JSON.stringify(error)));
|
return reject(new Error('Error on ' + method + ' : ' + JSON.stringify(error)));
|
||||||
} else {
|
} else {
|
||||||
resolve(response);
|
return resolve(response);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -1121,13 +1109,13 @@ export class Stream {
|
||||||
this.webRtcPeer.processLocalAnswer(sdpAnswer).then(() => {
|
this.webRtcPeer.processLocalAnswer(sdpAnswer).then(() => {
|
||||||
sendSdpToServer(sdpAnswer.sdp!);
|
sendSdpToServer(sdpAnswer.sdp!);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(new Error('(subscribe) SDP process local answer error: ' + JSON.stringify(error)));
|
return reject(new Error('(subscribe) SDP process local answer error: ' + JSON.stringify(error)));
|
||||||
});
|
});
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(new Error('(subscribe) SDP create answer error: ' + JSON.stringify(error)));
|
return reject(new Error('(subscribe) SDP create answer error: ' + JSON.stringify(error)));
|
||||||
});
|
});
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(new Error('(subscribe) SDP process remote offer error: ' + JSON.stringify(error)));
|
return reject(new Error('(subscribe) SDP process remote offer error: ' + JSON.stringify(error)));
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -1136,10 +1124,10 @@ export class Stream {
|
||||||
this.webRtcPeer.processLocalOffer(sdpOffer).then(() => {
|
this.webRtcPeer.processLocalOffer(sdpOffer).then(() => {
|
||||||
sendSdpToServer(sdpOffer.sdp!);
|
sendSdpToServer(sdpOffer.sdp!);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(new Error('(subscribe) SDP process local offer error: ' + JSON.stringify(error)));
|
return reject(new Error('(subscribe) SDP process local offer error: ' + JSON.stringify(error)));
|
||||||
});
|
});
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(new Error('(subscribe) SDP create offer error: ' + JSON.stringify(error)));
|
return reject(new Error('(subscribe) SDP create offer error: ' + JSON.stringify(error)));
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1306,20 +1294,20 @@ export class Stream {
|
||||||
if (wsReadyState === 1) {
|
if (wsReadyState === 1) {
|
||||||
const responseTimeout = setTimeout(() => {
|
const responseTimeout = setTimeout(() => {
|
||||||
console.warn(`[${event}] Websocket timeout of ${msResponseTimeout}ms`);
|
console.warn(`[${event}] Websocket timeout of ${msResponseTimeout}ms`);
|
||||||
resolve(false);
|
return resolve(false);
|
||||||
}, msResponseTimeout);
|
}, msResponseTimeout);
|
||||||
this.session.openvidu.sendRequest('echo', {}, (error, response) => {
|
this.session.openvidu.sendRequest('echo', {}, (error, response) => {
|
||||||
clearTimeout(responseTimeout);
|
clearTimeout(responseTimeout);
|
||||||
if (!!error) {
|
if (!!error) {
|
||||||
console.warn(`[${event}] Websocket 'echo' returned error: ${error}`);
|
console.warn(`[${event}] Websocket 'echo' returned error: ${error}`);
|
||||||
resolve(false);
|
return resolve(false);
|
||||||
} else {
|
} else {
|
||||||
resolve(true);
|
return resolve(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn(`[${event}] Websocket readyState is ${wsReadyState}`);
|
console.warn(`[${event}] Websocket readyState is ${wsReadyState}`);
|
||||||
resolve(false);
|
return resolve(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,8 +196,7 @@ export class WebRtcPeer {
|
||||||
// MediaStream.
|
// MediaStream.
|
||||||
|
|
||||||
if (!this.configuration.mediaStream) {
|
if (!this.configuration.mediaStream) {
|
||||||
reject(new Error(`${this.configuration.mode} direction requested, but no stream was configured to be sent`));
|
return reject(new Error(`${this.configuration.mode} direction requested, but no stream was configured to be sent`));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const track of this.configuration.mediaStream.getTracks()) {
|
for (const track of this.configuration.mediaStream.getTracks()) {
|
||||||
|
@ -320,7 +319,7 @@ export class WebRtcPeer {
|
||||||
// Enforce our desired direction.
|
// Enforce our desired direction.
|
||||||
tc.direction = this.configuration.mode;
|
tc.direction = this.configuration.mode;
|
||||||
} else {
|
} else {
|
||||||
reject(new Error(`${kind} requested, but no transceiver was created from remote description`));
|
return reject(new Error(`${kind} requested, but no transceiver was created from remote description`));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,11 +343,9 @@ export class WebRtcPeer {
|
||||||
offerToReceiveAudio: offerAudio,
|
offerToReceiveAudio: offerAudio,
|
||||||
offerToReceiveVideo: offerVideo
|
offerToReceiveVideo: offerVideo
|
||||||
};
|
};
|
||||||
this.pc!.createAnswer(constraints).then(sdpAnswer => {
|
this.pc!.createAnswer(constraints)
|
||||||
resolve(sdpAnswer);
|
.then(sdpAnswer => resolve(sdpAnswer))
|
||||||
}).catch(error => {
|
.catch(error => reject(error));
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -368,14 +365,12 @@ export class WebRtcPeer {
|
||||||
const localDescription = this.pc.localDescription;
|
const localDescription = this.pc.localDescription;
|
||||||
if (!!localDescription) {
|
if (!!localDescription) {
|
||||||
logger.debug('Local description set', localDescription.sdp);
|
logger.debug('Local description set', localDescription.sdp);
|
||||||
resolve();
|
return resolve();
|
||||||
} else {
|
} else {
|
||||||
reject('Local description is not defined');
|
return reject('Local description is not defined');
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => reject(error));
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -391,15 +386,11 @@ export class WebRtcPeer {
|
||||||
logger.debug('SDP offer received, setting remote description', offer);
|
logger.debug('SDP offer received, setting remote description', offer);
|
||||||
|
|
||||||
if (this.pc.signalingState === 'closed') {
|
if (this.pc.signalingState === 'closed') {
|
||||||
reject('RTCPeerConnection is closed when trying to set remote description');
|
return reject('RTCPeerConnection is closed when trying to set remote description');
|
||||||
}
|
}
|
||||||
this.setRemoteDescription(offer)
|
this.setRemoteDescription(offer)
|
||||||
.then(() => {
|
.then(() => resolve())
|
||||||
resolve();
|
.catch(error => reject(error));
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,7 +401,7 @@ export class WebRtcPeer {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
logger.debug('SDP answer created, setting local description');
|
logger.debug('SDP answer created, setting local description');
|
||||||
if (this.pc.signalingState === 'closed') {
|
if (this.pc.signalingState === 'closed') {
|
||||||
reject('RTCPeerConnection is closed when trying to set local description');
|
return reject('RTCPeerConnection is closed when trying to set local description');
|
||||||
}
|
}
|
||||||
this.pc.setLocalDescription(answer)
|
this.pc.setLocalDescription(answer)
|
||||||
.then(() => resolve())
|
.then(() => resolve())
|
||||||
|
@ -430,7 +421,7 @@ export class WebRtcPeer {
|
||||||
logger.debug('SDP answer received, setting remote description');
|
logger.debug('SDP answer received, setting remote description');
|
||||||
|
|
||||||
if (this.pc.signalingState === 'closed') {
|
if (this.pc.signalingState === 'closed') {
|
||||||
reject('RTCPeerConnection is closed when trying to set remote description');
|
return reject('RTCPeerConnection is closed when trying to set remote description');
|
||||||
}
|
}
|
||||||
this.setRemoteDescription(answer)
|
this.setRemoteDescription(answer)
|
||||||
.then(() => resolve())
|
.then(() => resolve())
|
||||||
|
|
|
@ -278,7 +278,7 @@ export class WebRtcStats {
|
||||||
finalRemoteCandidate = 'ERROR: No active remote ICE candidate. Probably ICE-TCP is being used';
|
finalRemoteCandidate = 'ERROR: No active remote ICE candidate. Probably ICE-TCP is being used';
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve({
|
return resolve({
|
||||||
localCandidate: finalLocalCandidate,
|
localCandidate: finalLocalCandidate,
|
||||||
remoteCandidate: finalRemoteCandidate
|
remoteCandidate: finalRemoteCandidate
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue