diff --git a/openvidu-recording-node/public/style.css b/openvidu-recording-node/public/style.css
index 9a832e9f..e0f49323 100644
--- a/openvidu-recording-node/public/style.css
+++ b/openvidu-recording-node/public/style.css
@@ -46,7 +46,7 @@ nav i.fa:hover {
#main-container {
padding-bottom: 80px;
height: 100%;
- margin-top: -70px;
+ margin-top: -70px;
}
.vertical-center {
@@ -225,20 +225,27 @@ a:hover .demo-logo {
#session-header {
margin-bottom: 20px;
height: 8%;
- margin-top: 70px;
+ margin-top: 70px;
}
#session-header form {
display: inline;
}
+#session-header input.btn {
+ float: right;
+ margin-top: 20px;
+ margin-left: 5px;
+}
+
#session-title {
display: inline-block;
}
-#buttonLeaveSession {
+#session-header .form-control {
+ width: initial;
float: right;
- margin-top: 20px;
+ margin: 18px 0px 0px 5px;
}
#video-container {
@@ -248,15 +255,15 @@ a:hover .demo-logo {
overflow: hidden;
}
-#video-container video.two{
+#video-container video.two {
width: 50%;
}
-#video-container video.three{
+#video-container video.three {
width: 33.33%;
}
-#video-container video.four{
+#video-container video.four {
width: 25%;
}
@@ -295,7 +302,7 @@ video {
#session {
height: 100%;
- padding-bottom: 80px;
+ padding-bottom: 80px;
}
#session img {
@@ -353,19 +360,20 @@ table i {
height: 40%;
}
-#recording-btns input {
- margin-top: 5px;
+#recording-btns #btns {
+ margin-top: 10px;
}
-#recording-btns #btns {
- margin-top: 5px;
+#recording-btns #btns .form-control {
+ width: initial;
+ display: inline-block;
}
#recording-btns #text-area {
display: inline-block;
- width: 100%;
- height: 80%;
- margin-top: 20px;
+ width: 100%;
+ height: 80%;
+ margin-top: 20px;
}
/* xs ans md screen resolutions*/
diff --git a/openvidu-recording-node/server.js b/openvidu-recording-node/server.js
index 5ef6d6db..28fd84d4 100644
--- a/openvidu-recording-node/server.js
+++ b/openvidu-recording-node/server.js
@@ -67,7 +67,7 @@ app.post('/api/get-token', function (req, res) {
console.log("Getting a token | {sessionName}={" + sessionName + "}");
- // Build tokenOptions object with PUBLIHSER role
+ // Build tokenOptions object with PUBLISHER role
var tokenOptions = { role: role }
if (mapSessions[sessionName]) {
@@ -133,8 +133,8 @@ app.post('/api/remove-user', function (req, res) {
var token = req.body.token;
console.log('Removing user | {sessionName, token}={' + sessionName + ', ' + token + '}');
- // If the session exists
- if (mapSessions[sessionName] && mapSessionNamesTokens[sessionName]) {
+ // If the session exists
+ if (mapSessions[sessionName] && mapSessionNamesTokens[sessionName]) {
var tokens = mapSessionNamesTokens[sessionName];
var index = tokens.indexOf(token);
@@ -161,6 +161,96 @@ app.post('/api/remove-user', function (req, res) {
}
});
+// Close session
+app.delete('/api/close-session', function (req, res) {
+ // Retrieve params from POST body
+ var sessionName = req.body.sessionName;
+ console.log("Closing session | {sessionName}=" + sessionName);
+
+ // If the session exists
+ if (mapSessions[sessionName]) {
+ var session = mapSessions[sessionName];
+ session.close();
+ delete mapSessions[sessionName];
+ delete mapSessionNamesTokens[sessionName];
+ res.status(200).send();
+ } else {
+ var msg = 'Problems in the app server: the SESSION does not exist';
+ console.log(msg);
+ res.status(500).send(msg);
+ }
+});
+
+// Fetch session info
+app.post('/api/fetch-info', function (req, res) {
+ // Retrieve params from POST body
+ var sessionName = req.body.sessionName;
+ console.log("Fetching session info | {sessionName}=" + sessionName);
+
+ // If the session exists
+ if (mapSessions[sessionName]) {
+ mapSessions[sessionName].fetch()
+ .then(changed => {
+ console.log("Any change: " + changed);
+ res.status(200).send(sessionToJson(mapSessions[sessionName]));
+ })
+ .catch(error => res.status(400).send(error.message));
+ } else {
+ var msg = 'Problems in the app server: the SESSION does not exist';
+ console.log(msg);
+ res.status(500).send(msg);
+ }
+});
+
+// Fetch all session info
+app.get('/api/fetch-all', function (req, res) {
+ console.log("Fetching all session info");
+ OV.fetch()
+ .then(changed => {
+ var sessions = [];
+ OV.activeSessions.forEach(s => {
+ sessions.push(sessionToJson(s));
+ });
+ console.log("Any change: " + changed);
+ res.status(200).send(sessions);
+ })
+ .catch(error => res.status(400).send(error.message));
+});
+
+// Force disconnect
+app.delete('/api/force-disconnect', function (req, res) {
+ // Retrieve params from POST body
+ var sessionName = req.body.sessionName;
+ var connectionId = req.body.connectionId;
+ // If the session exists
+ if (mapSessions[sessionName]) {
+ mapSessions[sessionName].forceDisconnect(connectionId)
+ .then(() => res.status(200).send())
+ .catch(error => res.status(400).send(error.message));
+ } else {
+ var msg = 'Problems in the app server: the SESSION does not exist';
+ console.log(msg);
+ res.status(500).send(msg);
+ }
+});
+
+// Force unpublish
+app.delete('/api/force-unpublish', function (req, res) {
+ // Retrieve params from POST body
+ var sessionName = req.body.sessionName;
+ var streamId = req.body.streamId;
+ // If the session exists
+ if (mapSessions[sessionName]) {
+ mapSessions[sessionName].forceUnpublish(streamId)
+ .then(() => res.status(200).send())
+ .catch(error => res.status(400).send(error.message));
+ } else {
+ var msg = 'Problems in the app server: the SESSION does not exist';
+ console.log(msg);
+ res.status(500).send(msg);
+ }
+});
+
/* Recording API */
@@ -180,7 +270,7 @@ app.post('/api/recording/start', function (req, res) {
app.post('/api/recording/stop', function (req, res) {
// Retrieve params from POST body
var recordingId = req.body.recording;
- console.log("Stoping recording | {recordingId}=" + recordingId);
+ console.log("Stopping recording | {recordingId}=" + recordingId);
OV.stopRecording(recordingId)
.then(recording => res.status(200).send(getJsonFromRecording(recording)))
@@ -240,4 +330,49 @@ function getJsonArrayFromRecordingList(recordings) {
jsonArray.push(getJsonFromRecording(recording));
})
return jsonArray;
+}
+
+function sessionToJson(session) {
+ var json = {};
+ json.sessionId = session.sessionId;
+ json.customSessionId = !!session.properties.customSessionId ? session.properties.customSessionId : "";
+ json.recording = session.recording;
+ json.mediaMode = session.properties.mediaMode;
+ json.recordingMode = session.properties.recordingMode;
+ json.defaultRecordingLayout = session.properties.defaultRecordingLayout;
+ json.defaultCustomLayout = !!session.properties.defaultCustomLayout ? session.properties.defaultCustomLayout : "";
+ var connections = {};
+ connections.numberOfElements = session.activeConnections.length;
+ var jsonArrayConnections = [];
+ session.activeConnections.forEach(con => {
+ var c = {};
+ c.connectionId = con.connectionId;
+ c.role = con.role;
+ c.token = con.token;
+ c.clientData = con.clientData;
+ c.serverData = con.serverData;
+ var pubs = [];
+ con.publishers.forEach(p => {
+ jsonP = {};
+ jsonP.streamId = p.streamId
+ jsonP.hasAudio = p.hasAudio;
+ jsonP.hasVideo = p.hasVideo;
+ jsonP.audioActive = p.audioActive;
+ jsonP.videoActive = p.videoActive;
+ jsonP.frameRate = p.frameRate;
+ jsonP.typeOfVideo = p.typeOfVideo;
+ jsonP.videoDimensions = p.videoDimensions;
+ pubs.push(jsonP);
+ });
+ var subs = [];
+ con.subscribers.forEach(s => {
+ subs.push(s);
+ });
+ c.publishers = pubs;
+ c.subscribers = subs;
+ jsonArrayConnections.push(c);
+ });
+ connections.content = jsonArrayConnections;
+ json.connections = connections;
+ return json;
}
\ No newline at end of file