Page MenuHomePhorge

D1960.1775253524.diff
No OneTemporary

Authored By
Unknown
Size
12 KB
Referenced Files
None
Subscribers
None

D1960.1775253524.diff

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

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)

Event Timeline