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 @@