diff --git a/openvidu-browser/src/OpenVidu/Connection.ts b/openvidu-browser/src/OpenVidu/Connection.ts
index 6c13c9ba..72ad4e32 100644
--- a/openvidu-browser/src/OpenVidu/Connection.ts
+++ b/openvidu-browser/src/OpenVidu/Connection.ts
@@ -51,6 +51,23 @@ export class Connection {
*/
data: string;
+ /**
+ * Role of the connection.
+ * - `SUBSCRIBER`: can subscribe to published Streams of other users by calling [[Session.subscribe]]
+ * - `PUBLISHER`: SUBSCRIBER permissions + can publish their own Streams by calling [[Session.publish]]
+ * - `MODERATOR`: SUBSCRIBER + PUBLISHER permissions + can force the unpublishing or disconnection over a third-party Stream or Connection by call [[Session.forceUnpublish]] and [[Session.forceDisconnect]]
+ *
+ * **Only defined for the local connection. In remote connections will be `undefined`**
+ */
+ role: string;
+
+ /**
+ * Whether the streams published by this connection will be recorded or not. This only affects [INDIVIDUAL recording](/en/stable/advanced-features/recording#selecting-streams-to-be-recorded) PRO
+ *
+ * **Only defined for the local connection. In remote connections will be `undefined`**
+ */
+ record: boolean;
+
/**
* @hidden
*/
@@ -88,6 +105,8 @@ export class Connection {
this.creationTime = this.localOptions.createdAt;
this.data = this.localOptions.metadata;
this.rpcSessionId = this.localOptions.sessionId;
+ this.role = this.localOptions.role;
+ this.record = this.localOptions.record;
msg += '(local)';
} else {
// Connection is remote
diff --git a/openvidu-browser/src/OpenVidu/OpenVidu.ts b/openvidu-browser/src/OpenVidu/OpenVidu.ts
index 3b5d80c1..d4f01140 100644
--- a/openvidu-browser/src/OpenVidu/OpenVidu.ts
+++ b/openvidu-browser/src/OpenVidu/OpenVidu.ts
@@ -759,6 +759,7 @@ export class OpenVidu {
recordingStopped: this.session.onRecordingStopped.bind(this.session),
sendMessage: this.session.onNewMessage.bind(this.session),
streamPropertyChanged: this.session.onStreamPropertyChanged.bind(this.session),
+ connectionPropertyChanged: this.session.onConnectionPropertyChanged.bind(this.session),
networkQualityLevelChanged: this.session.onNetworkQualityLevelChangedChanged.bind(this.session),
filterEventDispatched: this.session.onFilterEventDispatched.bind(this.session),
iceCandidate: this.session.recvIceCandidate.bind(this.session),
diff --git a/openvidu-browser/src/OpenVidu/Session.ts b/openvidu-browser/src/OpenVidu/Session.ts
index dc09d650..450213f2 100644
--- a/openvidu-browser/src/OpenVidu/Session.ts
+++ b/openvidu-browser/src/OpenVidu/Session.ts
@@ -38,6 +38,7 @@ import { SessionDisconnectedEvent } from '../OpenViduInternal/Events/SessionDisc
import { SignalEvent } from '../OpenViduInternal/Events/SignalEvent';
import { StreamEvent } from '../OpenViduInternal/Events/StreamEvent';
import { StreamPropertyChangedEvent } from '../OpenViduInternal/Events/StreamPropertyChangedEvent';
+import { ConnectionPropertyChangedEvent } from '../OpenViduInternal/Events/ConnectionPropertyChangedEvent';
import { NetworkQualityLevelChangedEvent } from '../OpenViduInternal/Events/NetworkQualityLevelChangedEvent';
import { OpenViduError, OpenViduErrorName } from '../OpenViduInternal/Enums/OpenViduError';
import { VideoInsertMode } from '../OpenViduInternal/Enums/VideoInsertMode';
@@ -63,6 +64,7 @@ const platform: PlatformUtils = PlatformUtils.getInstance();
*
* - connectionCreated ([[ConnectionEvent]])
* - connectionDestroyed ([[ConnectionEvent]])
+ * - connectionPropertyChanged ([[ConnectionPropertyChangedEvent]]) PRO
* - sessionDisconnected ([[SessionDisconnectedEvent]])
* - streamCreated ([[StreamEvent]])
* - streamDestroyed ([[StreamEvent]])
@@ -95,7 +97,7 @@ export class Session extends EventDispatcher {
streamManagers: StreamManager[] = [];
/**
- * Object defining the methods that the client is able to call. These are defined by the role of the token used to connect to the Session.
+ * Object defining the methods that the client is able to call. These are defined by the [[Connection.role]].
* This object is only defined after [[Session.connect]] has been successfully resolved
*/
capabilities: Capabilities;
@@ -930,6 +932,26 @@ export class Session extends EventDispatcher {
}
}
+ /**
+ * @hidden
+ */
+ onConnectionPropertyChanged(msg): void {
+ let oldValue;
+ switch (msg.property) {
+ case 'role':
+ oldValue = this.connection.role.slice();
+ this.connection.role = msg.newValue;
+ this.connection.localOptions!.role = msg.newValue;
+ break;
+ case 'record':
+ oldValue = this.connection.record;
+ msg.newValue = msg.newValue === 'true';
+ this.connection.record = msg.newValue;
+ this.connection.localOptions!.record = msg.newValue;
+ break;
+ }
+ this.ee.emitEvent('connectionPropertyChanged', [new ConnectionPropertyChangedEvent(this, this.connection, msg.property, msg.newValue, oldValue)]);
+ }
/**
* @hidden
diff --git a/openvidu-browser/src/OpenViduInternal/Events/ConnectionPropertyChangedEvent.ts b/openvidu-browser/src/OpenViduInternal/Events/ConnectionPropertyChangedEvent.ts
new file mode 100644
index 00000000..2747925e
--- /dev/null
+++ b/openvidu-browser/src/OpenViduInternal/Events/ConnectionPropertyChangedEvent.ts
@@ -0,0 +1,74 @@
+/*
+ * (C) Copyright 2017-2020 OpenVidu (https://openvidu.io)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { Connection } from '../../OpenVidu/Connection';
+import { Session } from '../../OpenVidu/Session';
+import { Event } from './Event';
+
+/**
+ * **This feature is part of OpenVidu Pro tier** PRO
+ *
+ * Defines event `connectionPropertyChanged` dispatched by [[Session]] object.
+ * This event is fired when any property of the local [[Connection]] object changes.
+ * The properties that may change are [[Connection.role]] and [[Connection.record]].
+ *
+ * The only way the Connection properties may change is by updating them through:
+ *
+ * - [API REST](/en/stable/reference-docs/REST-API/#patch-openviduapisessionsltsession_idgtconnectionltconnection_idgt)
+ * - [openvidu-java-client](/en/stable/reference-docs/openvidu-java-client/#update-a-connection)
+ * - [openvidu-node-client](/en/stable/reference-docs/openvidu-node-client/#update-a-connection)
+ */
+export class ConnectionPropertyChangedEvent extends Event {
+
+ /**
+ * The Connection whose property has changed
+ */
+ connection: Connection;
+
+ /**
+ * The property of the stream that changed. This value is either `"role"` or `"record"`
+ */
+ changedProperty: string;
+
+ /**
+ * New value of the property (after change, current value)
+ */
+ newValue: Object;
+
+ /**
+ * Previous value of the property (before change)
+ */
+ oldValue: Object;
+
+ /**
+ * @hidden
+ */
+ constructor(target: Session, connection: Connection, changedProperty: string, newValue: Object, oldValue: Object) {
+ super(false, target, 'connectionPropertyChanged');
+ this.connection = connection;
+ this.changedProperty = changedProperty;
+ this.newValue = newValue;
+ this.oldValue = oldValue;
+ }
+
+ /**
+ * @hidden
+ */
+ // tslint:disable-next-line:no-empty
+ callDefaultBehavior() { }
+
+}
\ No newline at end of file
diff --git a/openvidu-browser/src/OpenViduInternal/Events/NetworkQualityLevelChangedEvent.ts b/openvidu-browser/src/OpenViduInternal/Events/NetworkQualityLevelChangedEvent.ts
index a9eba26b..0dbfdc95 100644
--- a/openvidu-browser/src/OpenViduInternal/Events/NetworkQualityLevelChangedEvent.ts
+++ b/openvidu-browser/src/OpenViduInternal/Events/NetworkQualityLevelChangedEvent.ts
@@ -20,8 +20,10 @@ import { Session } from '../../OpenVidu/Session';
import { Connection } from '../../OpenVidu/Connection';
/**
+ * **This feature is part of OpenVidu Pro tier** PRO
+ *
* Defines event `networkQualityLevelChanged` dispatched by [[Session]].
- * This event is fired when the network quality level of a [[Connection]] changes.
+ * This event is fired when the network quality level of a [[Connection]] changes. See [network quality](/en/stable/advanced-features/network-quality/)
*/
export class NetworkQualityLevelChangedEvent extends Event {
diff --git a/openvidu-browser/src/OpenViduInternal/Interfaces/Private/LocalConnectionOptions.ts b/openvidu-browser/src/OpenViduInternal/Interfaces/Private/LocalConnectionOptions.ts
index 27cbd8be..b53c4940 100644
--- a/openvidu-browser/src/OpenViduInternal/Interfaces/Private/LocalConnectionOptions.ts
+++ b/openvidu-browser/src/OpenViduInternal/Interfaces/Private/LocalConnectionOptions.ts
@@ -25,6 +25,7 @@ export interface LocalConnectionOptions {
session: string; // OpenVidu Session identifier
sessionId: string; // JSON-RPC session identifier
role: string;
+ record: boolean;
coturnIp: string;
turnUsername: string;
turnCredential: string;
diff --git a/openvidu-browser/src/index.ts b/openvidu-browser/src/index.ts
index a2d82dda..8576b022 100644
--- a/openvidu-browser/src/index.ts
+++ b/openvidu-browser/src/index.ts
@@ -22,6 +22,7 @@ export { StreamEvent } from './OpenViduInternal/Events/StreamEvent';
export { StreamManagerEvent } from './OpenViduInternal/Events/StreamManagerEvent';
export { VideoElementEvent } from './OpenViduInternal/Events/VideoElementEvent';
export { StreamPropertyChangedEvent } from './OpenViduInternal/Events/StreamPropertyChangedEvent';
+export { ConnectionPropertyChangedEvent } from './OpenViduInternal/Events/ConnectionPropertyChangedEvent';
export { FilterEvent } from './OpenViduInternal/Events/FilterEvent';
export { NetworkQualityLevelChangedEvent } from './OpenViduInternal/Events/NetworkQualityLevelChangedEvent';
diff --git a/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java b/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java
index 2d5afd0d..52c6145d 100644
--- a/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java
+++ b/openvidu-client/src/main/java/io/openvidu/client/internal/ProtocolElements.java
@@ -93,6 +93,10 @@ public class ProtocolElements {
public static final String STREAMPROPERTYCHANGED_NEWVALUE_PARAM = "newValue";
public static final String STREAMPROPERTYCHANGED_REASON_PARAM = "reason";
+ public static final String CONNECTIONPERTYCHANGED_METHOD = "connectionPropertyChanged";
+ public static final String CONNECTIONROPERTYCHANGED_PROPERTY_PARAM = "property";
+ public static final String CONNECTIONPROPERTYCHANGED_NEWVALUE_PARAM = "newValue";
+
public static final String NETWORKQUALITYLEVELCHANGED_METHOD = "networkQualityLevelChanged";
public static final String NETWORKQUALITYCHANGED_CONNECTIONID_PARAM = "connectionId";
public static final String NETWORKQUALITYCHANGED_QUALITYLEVEL_PARAM = "qualityLevel";
@@ -125,7 +129,7 @@ public class ProtocolElements {
public static final String RECONNECTSTREAM_METHOD = "reconnectStream";
public static final String RECONNECTSTREAM_STREAM_PARAM = "stream";
public static final String RECONNECTSTREAM_SDPOFFER_PARAM = "sdpOffer";
-
+
public static final String VIDEODATA_METHOD = "videoData";
// ---------------------------- SERVER RESPONSES & EVENTS -----------------
diff --git a/openvidu-java-client/src/main/java/io/openvidu/java/client/Session.java b/openvidu-java-client/src/main/java/io/openvidu/java/client/Session.java
index b45e9e4f..1682f006 100644
--- a/openvidu-java-client/src/main/java/io/openvidu/java/client/Session.java
+++ b/openvidu-java-client/src/main/java/io/openvidu/java/client/Session.java
@@ -463,9 +463,12 @@ public class Session {
}
/**
- * Updates the properties of a Connection with a
- * {@link io.openvidu.java.client.ConnectionProperties} object. Only these
- * properties can be updated:
+ * PRO Updates the properties of a Connection with a
+ * {@link io.openvidu.java.client.ConnectionProperties} object. Only these properties can be updated:
*
* - {@link io.openvidu.java.client.ConnectionProperties.Builder#role(OpenViduRole)
* ConnectionProperties.Builder.role(OpenViduRole)}
@@ -481,9 +484,9 @@ public class Session {
* changes consequence of the execution of this method applied in the local
* objects.
*
- * @param connectionId The Connection to modify
- * @param connectionProperties A ConnectionProperties object with the new values to
- * apply
+ * @param connectionId The Connection to modify
+ * @param connectionProperties A ConnectionProperties object with the new values
+ * to apply
*
* @return The updated {@link io.openvidu.java.client.Connection Connection}
* object
diff --git a/openvidu-node-client/src/Session.ts b/openvidu-node-client/src/Session.ts
index f1333182..eacf8bba 100644
--- a/openvidu-node-client/src/Session.ts
+++ b/openvidu-node-client/src/Session.ts
@@ -49,7 +49,7 @@ export class Session {
* **will remain unchanged since the last time method [[Session.fetch]] or [[OpenVidu.fetch]] was called**.
* Exceptions to this rule are:
*
- * - Calling [[Session.createConnection]] automatically adds the new Connection object to the local collection.
+ * - Calling [[Session.createConnection]] automatically adds the new Connection object to the local collection.
* - Calling [[Session.forceUnpublish]] automatically updates each affected local Connection object.
* - Calling [[Session.forceDisconnect]] automatically updates each affected local Connection object.
* - Calling [[Session.updateConnection]] automatically updates the attributes of the affected local Connection object.
@@ -390,6 +390,8 @@ export class Session {
}
/**
+ * **This feature is part of OpenVidu Pro tier** PRO
+ *
* Updates the properties of a Connection with a [[ConnectionProperties]] object.
* Only these properties can be updated:
*
@@ -420,8 +422,6 @@ export class Session {
.then(res => {
if (res.status === 200) {
console.log('Connection ' + connectionId + ' updated');
- } else if (res.status === 204) {
- console.log('Properties of Connection ' + connectionId + ' remain the same');
} else {
// ERROR response from openvidu-server. Resolve HTTP status
reject(new Error(res.status.toString()));
diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java
index c23de26a..791b2be6 100644
--- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java
+++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionEventsHandler.java
@@ -61,7 +61,7 @@ public class SessionEventsHandler {
@Autowired
protected OpenviduBuildInfo openviduBuildConfig;
- private Map recordingsToSendClientEvents = new ConcurrentHashMap<>();
+ protected Map recordingsToSendClientEvents = new ConcurrentHashMap<>();
public void onSessionCreated(Session session) {
CDR.recordSessionCreated(session);
@@ -155,17 +155,18 @@ public class SessionEventsHandler {
result.addProperty(ProtocolElements.PARTICIPANTJOINED_METADATA_PARAM, participant.getFullMetadata());
result.add("value", resultArray);
+ result.addProperty("session", participant.getSessionId());
+ result.addProperty("version", openviduBuildConfig.getOpenViduServerVersion());
if (participant.getToken() != null) {
- result.addProperty("session", participant.getSessionId());
- result.addProperty("coturnIp", openviduConfig.getCoturnIp());
+ result.addProperty("record", participant.getToken().record());
if (participant.getToken().getRole() != null) {
result.addProperty("role", participant.getToken().getRole().name());
}
+ result.addProperty("coturnIp", openviduConfig.getCoturnIp());
if (participant.getToken().getTurnCredentials() != null) {
result.addProperty("turnUsername", participant.getToken().getTurnCredentials().getUsername());
result.addProperty("turnCredential", participant.getToken().getTurnCredentials().getCredential());
}
- result.addProperty("version", openviduBuildConfig.getOpenViduServerVersion());
}
rpcNotificationService.sendResponse(participant.getParticipantPrivateId(), transactionId, result);
@@ -315,13 +316,6 @@ public class SessionEventsHandler {
rpcNotificationService.sendResponse(participant.getParticipantPrivateId(), transactionId, new JsonObject());
}
- public void onNetworkQualityLevelChanged(Session session, JsonObject params) {
- session.getParticipants().forEach(p -> {
- rpcNotificationService.sendNotification(p.getParticipantPrivateId(),
- ProtocolElements.NETWORKQUALITYLEVELCHANGED_METHOD, params);
- });
- }
-
public void onSendMessage(Participant participant, JsonObject message, Set participants,
Integer transactionId, OpenViduException error) {
@@ -593,7 +587,13 @@ public class SessionEventsHandler {
recordingsToSendClientEvents.put(recording.getSessionId(), recording);
}
- private Set filterParticipantsByRole(OpenViduRole[] roles, Set participants) {
+ public void onNetworkQualityLevelChanged(Session session, JsonObject params) {
+ }
+
+ public void onConnectionPropertyChanged(Participant participant, String property, Object newValue) {
+ }
+
+ protected Set filterParticipantsByRole(OpenViduRole[] roles, Set participants) {
return participants.stream().filter(part -> {
if (ProtocolElements.RECORDER_PARTICIPANT_PUBLICID.equals(part.getParticipantPublicId())) {
return false;
diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionEventsHandler.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionEventsHandler.java
index a47f18ce..ebf4aa0d 100644
--- a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionEventsHandler.java
+++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionEventsHandler.java
@@ -29,9 +29,6 @@ import io.openvidu.server.core.SessionEventsHandler;
public class KurentoSessionEventsHandler extends SessionEventsHandler {
- public KurentoSessionEventsHandler() {
- }
-
public void onIceCandidate(String roomName, String participantPrivateId, String senderPublicId, String endpointName,
IceCandidate candidate) {
JsonObject params = new JsonObject();
@@ -59,11 +56,4 @@ public class KurentoSessionEventsHandler extends SessionEventsHandler {
rpcNotificationService.sendNotification(participantId, ProtocolElements.MEDIAERROR_METHOD, notifParams);
}
- public void updateFilter(String roomName, Participant participant, String filterId, String state) {
- }
-
- public String getNextFilterState(String filterId, String state) {
- return null;
- }
-
}
diff --git a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java
index 2641c9a2..01df4abc 100644
--- a/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java
+++ b/openvidu-test-e2e/src/test/java/io/openvidu/test/e2e/OpenViduProTestAppE2eTest.java
@@ -189,7 +189,8 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
String body = "{'customSessionId': 'CUSTOM_SESSION_ID'}";
restClient.rest(HttpMethod.POST, "/openvidu/api/sessions", body, HttpStatus.SC_OK);
body = "{'role':'PUBLISHER','record':false}";
- JsonObject res = restClient.rest(HttpMethod.POST, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection", body, HttpStatus.SC_OK);
+ JsonObject res = restClient.rest(HttpMethod.POST, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection", body,
+ HttpStatus.SC_OK);
final String token = res.get("token").getAsString();
final String connectionId = res.get("connectionId").getAsString();
final long createdAt = res.get("createdAt").getAsLong();
@@ -208,6 +209,16 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/WRONG",
"{'role':'PUBLISHER','record':true}", HttpStatus.SC_NOT_FOUND);
+ // No change should return 200. At this point role=PUBLISHER and record=false
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId, "{}",
+ HttpStatus.SC_OK);
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
+ "{'role':'PUBLISHER'}", HttpStatus.SC_OK);
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
+ "{'record':false}", HttpStatus.SC_OK);
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
+ "{'role':'PUBLISHER','record':false}", HttpStatus.SC_OK);
+
// Updating only role should let record value untouched
restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
"{'role':'MODERATOR'}", HttpStatus.SC_OK, true, true, true,
@@ -279,9 +290,20 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
Assert.assertEquals("Wrong role in Connection object", OpenViduRole.SUBSCRIBER, connection.getRole());
Assert.assertFalse("Wrong record in Connection object", connection.record());
- /** UPDATE CONNECTION **/
+ /** UPDATE ACTIVE CONNECTION **/
// Test with REST API
+
+ // No change should return 200. At this point role=SUBSCRIBER and record=false
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId, "{}",
+ HttpStatus.SC_OK);
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
+ "{'role':'SUBSCRIBER'}", HttpStatus.SC_OK);
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
+ "{'record':false}", HttpStatus.SC_OK);
+ restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
+ "{'role':'SUBSCRIBER','record':false}", HttpStatus.SC_OK);
+
// Updating only role should let record value untouched
restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
"{'role':'MODERATOR'}", HttpStatus.SC_OK, false, true, true,
@@ -291,6 +313,9 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
+ "','sessionId':'CUSTOM_SESSION_ID','createdAt':" + createdAt + ",'activeAt':"
+ activeAt + ",'serverData':''}",
new String[] { "location", "platform", "clientData" }));
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 1);
+
// Updating only record should let role value untouched
restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
"{'record':true}", HttpStatus.SC_OK, false, true, true,
@@ -300,6 +325,9 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
+ "','sessionId':'CUSTOM_SESSION_ID','createdAt':" + createdAt + ",'activeAt':"
+ activeAt + ",'serverData':''}",
new String[] { "location", "platform", "clientData" }));
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 2);
+
restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
"{'role':'SUBSCRIBER','record':true,'data':'OTHER DATA'}", HttpStatus.SC_OK, false, true, true,
mergeJson(DEFAULT_JSON_ACTIVE_CONNECTION,
@@ -308,6 +336,9 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
+ "','sessionId':'CUSTOM_SESSION_ID','createdAt':" + createdAt + ",'activeAt':"
+ activeAt + ",'serverData':''}",
new String[] { "location", "platform", "clientData" }));
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 3);
+
restClient.rest(HttpMethod.PATCH, "/openvidu/api/sessions/CUSTOM_SESSION_ID/connection/" + connectionId,
"{'role':'PUBLISHER'}", HttpStatus.SC_OK, false, true, true,
mergeJson(DEFAULT_JSON_ACTIVE_CONNECTION,
@@ -317,6 +348,8 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
+ activeAt + ",'serverData':''}",
new String[] { "location", "platform", "clientData" }));
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 4);
+
// Test with openvidu-node-client
user.getDriver().findElement(By.id("session-api-btn-0")).click();
Thread.sleep(1000);
@@ -333,6 +366,9 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
user.getDriver().findElement(By.id("update-connection-api-btn")).click();
user.getWaiter().until(ExpectedConditions.attributeToBe(By.id("api-response-text-area"), "value",
"Connection updated: {\"role\":\"SUBSCRIBER\",\"record\":false}"));
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 6);
+
user.getDriver().findElement(By.id("close-dialog-btn")).click();
Thread.sleep(1000);
@@ -347,6 +383,9 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
Assert.assertFalse("Session object should not have changed", session.fetch());
connection = session.updateConnection(connectionId,
new ConnectionProperties.Builder().role(OpenViduRole.PUBLISHER).build());
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 7);
+
Assert.assertFalse("Session object should not have changed", session.fetch());
Assert.assertEquals("Wrong connectionId in Connection object", connectionId, connection.getConnectionId());
Assert.assertEquals("Wrong role in Connection object", OpenViduRole.PUBLISHER, connection.getRole());
@@ -354,10 +393,16 @@ public class OpenViduProTestAppE2eTest extends AbstractOpenViduTestAppE2eTest {
Assert.assertEquals("Wrong status in Connection object", "active", connection.getStatus());
connection = session.updateConnection(connectionId,
new ConnectionProperties.Builder().role(OpenViduRole.SUBSCRIBER).build());
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 8);
+
Assert.assertEquals("Wrong role in Connection object", OpenViduRole.SUBSCRIBER, connection.getRole());
Assert.assertFalse("Session object should not have changed", session.fetch());
- connection = session.updateConnection(connectionId,
- new ConnectionProperties.Builder().role(OpenViduRole.MODERATOR).record(false).data("NO CHANGE").build());
+ connection = session.updateConnection(connectionId, new ConnectionProperties.Builder()
+ .role(OpenViduRole.MODERATOR).record(false).data("NO CHANGE").build());
+
+ user.getEventManager().waitUntilEventReaches("connectionPropertyChanged", 9);
+
Assert.assertFalse("Session object should not have changed", session.fetch());
Assert.assertEquals("Wrong role in Connection object", OpenViduRole.MODERATOR, connection.getRole());
Assert.assertFalse("Wrong record in Connection object", connection.record());
diff --git a/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts b/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts
index 32610b07..5cfb392f 100644
--- a/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts
+++ b/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts
@@ -6,7 +6,7 @@ import {
import {
OpenVidu, Session, Subscriber, Publisher, Event, StreamEvent, ConnectionEvent,
SessionDisconnectedEvent, SignalEvent, RecordingEvent,
- PublisherSpeakingEvent, PublisherProperties, StreamPropertyChangedEvent, OpenViduError
+ PublisherSpeakingEvent, PublisherProperties, StreamPropertyChangedEvent, ConnectionPropertyChangedEvent, OpenViduError
} from 'openvidu-browser';
import {
OpenVidu as OpenViduAPI,
@@ -115,6 +115,7 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
streamCreated: true,
streamDestroyed: true,
streamPropertyChanged: true,
+ connectionPropertyChanged: true,
recordingStarted: true,
recordingStopped: true,
signal: true,
@@ -223,6 +224,7 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
streamCreated: false,
streamDestroyed: false,
streamPropertyChanged: false,
+ connectionPropertyChanged: false,
recordingStarted: false,
recordingStopped: false,
signal: false,
@@ -372,6 +374,15 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
}
}
+ if (this.sessionEvents.connectionPropertyChanged !== oldValues.connectionPropertyChanged || firstTime) {
+ this.session.off('connectionPropertyChanged');
+ if (this.sessionEvents.connectionPropertyChanged) {
+ this.session.on('connectionPropertyChanged', (event: ConnectionPropertyChangedEvent) => {
+ this.updateEventList('connectionPropertyChanged', event.changedProperty + ' [' + event.newValue + ']', event);
+ });
+ }
+ }
+
if (this.sessionEvents.connectionCreated !== oldValues.connectionCreated || firstTime) {
this.session.off('connectionCreated');
if (this.sessionEvents.connectionCreated) {
@@ -626,6 +637,7 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
streamCreated: this.sessionEvents.streamCreated,
streamDestroyed: this.sessionEvents.streamDestroyed,
streamPropertyChanged: this.sessionEvents.streamPropertyChanged,
+ connectionPropertyChanged: this.sessionEvents.connectionPropertyChanged,
recordingStarted: this.sessionEvents.recordingStarted,
recordingStopped: this.sessionEvents.recordingStopped,
signal: this.sessionEvents.signal,
@@ -658,6 +670,7 @@ export class OpenviduInstanceComponent implements OnInit, OnChanges, OnDestroy {
streamCreated: result.streamCreated,
streamDestroyed: result.streamDestroyed,
streamPropertyChanged: result.streamPropertyChanged,
+ connectionPropertyChanged: result.connectionPropertyChanged,
recordingStarted: result.recordingStarted,
recordingStopped: result.recordingStopped,
signal: result.signal,