Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117787125
D1960.1775253524.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
12 KB
Referenced Files
None
Subscribers
None
D1960.1775253524.diff
View Options
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/, '<br>')
// 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 @@
<div id="meet-component">
<div id="meet-session-toolbar" class="hidden">
<div id="meet-session-menu">
- <button class="btn btn-link link-audio" @click="switchSound" title="Mute audio">
+ <button class="btn btn-link link-audio" @click="switchSound" :disabled="!isPublisher()" title="Mute audio">
<svg-icon icon="microphone"></svg-icon>
</button>
- <button class="btn btn-link link-video" @click="switchVideo" title="Mute video">
+ <button class="btn btn-link link-video" @click="switchVideo" :disabled="!isPublisher()" title="Mute video">
<svg-icon icon="video"></svg-icon>
</button>
- <button class="btn btn-link link-screen text-danger" @click="switchScreen" :disabled="!canShareScreen" title="Share screen">
+ <button class="btn btn-link link-screen text-danger" @click="switchScreen" :disabled="!canShareScreen || !isPublisher()" title="Share screen">
<svg-icon icon="desktop"></svg-icon>
</button>
<button class="btn btn-link link-chat text-danger" @click="switchChat" title="Chat">
@@ -204,7 +204,8 @@
screenShare: this.canShareScreen ? 1 : 0,
init: init ? 1 : 0,
picture: init ? this.makePicture() : '',
- requestId: this.requestId()
+ requestId: this.requestId(),
+ role: this.camera || this.microphone ? 'PUBLISHER' : 'SUBSCRIBER'
}
$('#setup-password,#setup-nickname').removeClass('is-invalid')
@@ -265,8 +266,11 @@
$('#meet-session-menu').find('.link-fullscreen.closed').removeClass('hidden')
}
},
+ isPublisher() {
+ return this.session && this.session.role && this.session.role != 'SUBSCRIBER'
+ },
isRoomReady() {
- return ['ready', 324, 325, 326, 327].includes(this.roomState)
+ return ['ready', 322, 324, 325, 326, 327].includes(this.roomState)
},
// An event received by the room owner when a participant is asking for a permission to join the room
joinRequest(data) {
diff --git a/src/resources/vue/Widgets/StatusMessage.vue b/src/resources/vue/Widgets/StatusMessage.vue
--- a/src/resources/vue/Widgets/StatusMessage.vue
+++ b/src/resources/vue/Widgets/StatusMessage.vue
@@ -1,5 +1,5 @@
<template>
- <div v-if="status != 'ready'" :class="statusClass()">
+ <div v-if="statusLabel()" :class="statusClass()">
<div v-if="status == 'init'" class="app-loader small">
<div class="spinner-border" role="status"></div>
</div>
diff --git a/src/tests/Browser/Meet/RoomControlsTest.php b/src/tests/Browser/Meet/RoomControlsTest.php
--- a/src/tests/Browser/Meet/RoomControlsTest.php
+++ b/src/tests/Browser/Meet/RoomControlsTest.php
@@ -153,7 +153,7 @@
$guest->assertToolbar([
'audio' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_DISABLED,
'video' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_DISABLED,
- 'screen' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_ENABLED,
+ 'screen' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_DISABLED,
'chat' => RoomPage::BUTTON_INACTIVE | RoomPage::BUTTON_ENABLED,
'fullscreen' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
'logout' => RoomPage::BUTTON_ACTIVE | RoomPage::BUTTON_ENABLED,
diff --git a/src/tests/Browser/Meet/RoomSetupTest.php b/src/tests/Browser/Meet/RoomSetupTest.php
--- a/src/tests/Browser/Meet/RoomSetupTest.php
+++ b/src/tests/Browser/Meet/RoomSetupTest.php
@@ -162,6 +162,7 @@
->waitFor('@setup-form')
->assertMissing('@login-form')
->waitUntilMissing('@setup-status-message.loading')
+ ->waitFor('@setup-status-message')
->assertSeeIn('@setup-status-message', "The room is closed. It will be open for others after you join.")
->assertSeeIn('@setup-button', "JOIN")
->type('@setup-nickname-input', 'john')
diff --git a/src/tests/Feature/Controller/OpenViduTest.php b/src/tests/Feature/Controller/OpenViduTest.php
--- a/src/tests/Feature/Controller/OpenViduTest.php
+++ b/src/tests/Feature/Controller/OpenViduTest.php
@@ -122,8 +122,31 @@
$john_token = $json['token'];
- // Non-owner, now the session exists
+ // Non-owner, now the session exists, no 'init' argument
$response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}");
+ $response->assertStatus(422);
+
+ $json = $response->json();
+
+ $this->assertSame(322, $json['code']);
+ $this->assertTrue(empty($json['token']));
+ $this->assertTrue(empty($json['shareToken']));
+
+ // Non-owner, now the session exists, with 'init', but no 'role' argument
+ $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", ['init' => 1]);
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertSame(Room::ROLE_SUBSCRIBER, $json['role']);
+ $this->assertSame($session_id, $json['session']);
+ $this->assertTrue(strpos($json['token'], 'wss://') === 0);
+ $this->assertTrue($json['token'] != $john_token);
+ $this->assertTrue(empty($json['shareToken']));
+
+ // Non-owner, now the session exists, with 'init', and with 'role=PUBLISHER'
+ $post = ['role' => Room::ROLE_PUBLISHER, 'init' => 1];
+ $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(200);
$json = $response->json();
@@ -158,7 +181,9 @@
$this->assertSame(325, $json['code']);
// Non-owner, password protected room, valid password provided
- $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", ['password' => 'pass']);
+ // TODO: Test without init=1
+ $post = ['password' => 'pass', 'init' => 'init'];
+ $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(200);
$json = $response->json();
@@ -166,7 +191,9 @@
$this->assertSame($session_id, $json['session']);
// Make sure the room owner can access the password protected room w/o password
- $response = $this->actingAs($john)->post("api/v4/openvidu/rooms/{$room->name}");
+ // TODO: Test without init=1
+ $post = ['init' => 'init'];
+ $response = $this->actingAs($john)->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(200);
}
@@ -203,7 +230,7 @@
$this->assertTrue($json['config']['locked']);
// Non-owner, locked room, invalid requestId
- $post = ['nickname' => 'name', 'requestId' => '-----'];
+ $post = ['nickname' => 'name', 'requestId' => '-----', 'init' => 1];
$response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(422);
@@ -211,7 +238,7 @@
$this->assertSame(326, $json['code']);
// Non-owner, locked room, invalid requestId
- $post = ['nickname' => 'name', 'picture' => '-----'];
+ $post = ['nickname' => 'name', 'init' => 1];
$response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(422);
@@ -294,6 +321,8 @@
$this->assertSame('success', $json['status']);
// Non-owner, locked room, join request accepted
+ $post['init'] = 1;
+ $post['role'] = Room::ROLE_PUBLISHER;
$response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(200);
$json = $response->json();
@@ -319,7 +348,8 @@
$room = Room::where('name', 'john')->first();
// Guest, request with screenShare token
- $response = $this->post("api/v4/openvidu/rooms/{$room->name}", ['screenShare' => 1]);
+ $post = ['role' => Room::ROLE_PUBLISHER, 'screenShare' => 1, 'init' => 1];
+ $response = $this->post("api/v4/openvidu/rooms/{$room->name}", $post);
$response->assertStatus(200);
$json = $response->json();
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 3, 9:58 PM (4 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18826858
Default Alt Text
D1960.1775253524.diff (12 KB)
Attached To
Mode
D1960: OpenVidu: Join the room with subscriber role if media are switched off
Attached
Detach File
Event Timeline