diff --git a/src/app/Http/Controllers/API/V4/OpenViduController.php b/src/app/Http/Controllers/API/V4/OpenViduController.php
--- a/src/app/Http/Controllers/API/V4/OpenViduController.php
+++ b/src/app/Http/Controllers/API/V4/OpenViduController.php
@@ -197,6 +197,7 @@
$user = Auth::guard()->user();
$isOwner = $user && $user->id == $room->user_id;
+ $init = !empty(request()->input('init'));
// There's no existing session
if (!$room->hasSession()) {
@@ -206,7 +207,7 @@
}
// The room owner can create the session on request
- if (empty(request()->input('init'))) {
+ if (!$init) {
return $this->errorResponse(422, \trans('meet.session-not-found'), ['code' => 324]);
}
@@ -276,28 +277,41 @@
}
}
- // Create session token for the current user/connection
- $response = $room->getSessionToken($isOwner ? Room::ROLE_MODERATOR : Room::ROLE_PUBLISHER);
-
- if (empty($response)) {
- return $this->errorResponse(500, \trans('meet.session-join-error'));
- }
+ // Initialize connection tokens
+ if ($init) {
+ // Choose the connection role
+ if ($isOwner) {
+ $role = Room::ROLE_MODERATOR;
+ } elseif (request()->input('role') === Room::ROLE_PUBLISHER) {
+ $role = Room::ROLE_PUBLISHER;
+ } else {
+ $role = Room::ROLE_SUBSCRIBER;
+ }
- // Create session token for screen sharing connection
- if (!empty(request()->input('screenShare'))) {
- $add_token = $room->getSessionToken(Room::ROLE_PUBLISHER);
+ // Create session token for the current user/connection
+ $response = $room->getSessionToken($role);
- $response['shareToken'] = $add_token['token'];
- }
+ if (empty($response)) {
+ return $this->errorResponse(500, \trans('meet.session-join-error'));
+ }
- // Tell the UI who's the room owner
- $response['owner'] = $isOwner;
+ // Create session token for screen sharing connection
+ if ($role != Room::ROLE_SUBSCRIBER && !empty(request()->input('screenShare'))) {
+ $add_token = $room->getSessionToken(Room::ROLE_PUBLISHER);
- // Append the room configuration
+ $response['shareToken'] = $add_token['token'];
+ }
- $response['config'] = $config;
+ $response_code = 200;
+ $response['role'] = $role;
+ $response['owner'] = $isOwner;
+ $response['config'] = $config;
+ } else {
+ $response_code = 422;
+ $response['code'] = 322;
+ }
- return response()->json($response);
+ return response()->json($response, $response_code);
}
/**
diff --git a/src/resources/js/meet/app.js b/src/resources/js/meet/app.js
--- a/src/resources/js/meet/app.js
+++ b/src/resources/js/meet/app.js
@@ -70,7 +70,7 @@
/**
* Join the room session
*
- * @param data Session metadata and event handlers (session, token, shareToken, nickname,
+ * @param data Session metadata and event handlers (session, token, shareToken, nickname, role,
* chatElement, menuElement, onDestroy, onJoinRequest)
*/
function joinRoom(data) {
@@ -191,10 +191,13 @@
})
publisher.createVideoElement(wrapper, 'PREPEND')
+
sessionData.wrapper = wrapper
// Publish the stream
- session.publish(publisher)
+ if (sessionData.role != 'SUBSCRIBER') {
+ session.publish(publisher)
+ }
})
.catch(error => {
console.error('There was an error connecting to the session: ', error.message);
@@ -488,7 +491,7 @@
message = message.replace(/\r?\n/, '
')
// Display the message
- let isSelf = data.id == publisher.stream.connection.connectionId
+ let isSelf = data.id == session.connectionId
let chat = $(sessionData.chatElement).find('.chat')
let box = chat.find('.message').last()
diff --git a/src/resources/vue/Meet/Room.vue b/src/resources/vue/Meet/Room.vue
--- a/src/resources/vue/Meet/Room.vue
+++ b/src/resources/vue/Meet/Room.vue
@@ -2,13 +2,13 @@