Browse Source

Check the signaling server connection and show the version in the admin UI

Signed-off-by: Joas Schilling <coding@schilljs.com>
pull/3274/head
Joas Schilling 6 years ago
committed by Daniel Calviño Sánchez
parent
commit
2edf878c9d
  1. 9
      appinfo/routes.php
  2. 51
      lib/Controller/SignalingController.php
  3. 75
      src/components/AdminSettings/SignalingServer.vue
  4. 5
      src/services/signalingService.js

9
appinfo/routes.php

@ -46,6 +46,15 @@ return [
'apiVersion' => 'v1',
],
],
[
'name' => 'Signaling#getWelcomeMessage',
'url' => '/api/{apiVersion}/signaling/welcome/{serverId}',
'verb' => 'GET',
'requirements' => [
'apiVersion' => 'v1',
'serverId' => '^\d+$',
],
],
[
'name' => 'Signaling#backend',
'url' => '/api/{apiVersion}/signaling/backend',

51
lib/Controller/SignalingController.php

@ -38,6 +38,7 @@ use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Http\Client\IClientService;
use OCP\IDBConnection;
use OCP\IRequest;
use OCP\IUser;
@ -66,6 +67,8 @@ class SignalingController extends OCSController {
private $dispatcher;
/** @var ITimeFactory */
private $timeFactory;
/** @var IClientService */
private $clientService;
/** @var string|null */
private $userId;
@ -79,6 +82,7 @@ class SignalingController extends OCSController {
IUserManager $userManager,
IEventDispatcher $dispatcher,
ITimeFactory $timeFactory,
IClientService $clientService,
?string $UserId) {
parent::__construct($appName, $request);
$this->config = $config;
@ -89,6 +93,7 @@ class SignalingController extends OCSController {
$this->userManager = $userManager;
$this->dispatcher = $dispatcher;
$this->timeFactory = $timeFactory;
$this->clientService = $clientService;
$this->userId = $UserId;
}
@ -104,6 +109,52 @@ class SignalingController extends OCSController {
return new DataResponse($this->config->getSettings($this->userId));
}
/**
* Only available for logged in users because guests can not use the apps
* right now.
*
* @param int $serverId
* @return DataResponse
*/
public function getWelcomeMessage(int $serverId): DataResponse {
$signalingServers = $this->config->getSignalingServers();
if (empty($signalingServers) || !isset($signalingServers[$serverId])) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
$url = rtrim($signalingServers[$serverId]['server'], '/');
if (strpos($url, 'wss://') === 0) {
$url = 'https://' . substr($url, 6);
}
if (strpos($url, 'ws://') === 0) {
$url = 'http://' . substr($url, 5);
}
$client = $this->clientService->newClient();
try {
$response = $client->get($url . '/api/v1/welcome', [
'verify' => (bool) $signalingServers[$serverId]['verify'],
]);
$body = $response->getBody();
$data = json_decode($body, true);
if (!is_array($data)) {
return new DataResponse(['error' => 'JSON_INVALID'], Http::STATUS_INTERNAL_SERVER_ERROR);
}
if (!isset($data['version'])) {
return new DataResponse(['error' => 'VERSION_TOO_OLD'], Http::STATUS_INTERNAL_SERVER_ERROR);
}
return new DataResponse($data);
} catch (\Exception $e) {
return new DataResponse(['error' => $e->getCode()], Http::STATUS_INTERNAL_SERVER_ERROR);
}
}
/**
* @PublicPage
*

75
src/components/AdminSettings/SignalingServer.vue

@ -28,7 +28,7 @@
placeholder="wss://signaling.example.org"
:value="server"
:disabled="loading"
:aria-label="t('spreed', 'TURN server URL')"
:aria-label="t('spreed', 'Signaling server URL')"
@input="updateServer">
<input :id="'verify' + index"
type="checkbox"
@ -42,11 +42,14 @@
v-tooltip.auto="t('spreed', 'Delete this server')"
class="icon icon-delete"
@click="removeServer" />
<span v-if="server">{{ connectionState }}</span>
</div>
</template>
<script>
import Tooltip from '@nextcloud/vue/dist/Directives/Tooltip'
import { getWelcomeMessage } from '../../services/signalingService'
export default {
name: 'SignalingServer',
@ -77,6 +80,50 @@ export default {
},
},
data() {
return {
checked: false,
customError: '',
versionFound: '',
responseNotValidJson: false,
versionNotSupported: false,
}
},
computed: {
connectionState() {
if (!this.checked) {
return t('spreed', 'Status: Checking connection')
}
if (this.responseNotValidJson) {
return t('spreed', 'Error: Server did not respond with proper JSON')
}
if (this.versionNotSupported) {
return t('spreed', 'Error: Server version is too old')
}
if (this.customError) {
return this.customError
}
return t('spreed', 'OK: Running version: {version}', {
version: this.versionFound,
})
},
},
watch: {
loading(isLoading) {
if (!isLoading) {
this.checkServerVersion()
}
},
},
mounted() {
if (this.server) {
this.checkServerVersion()
}
},
methods: {
removeServer() {
this.$emit('removeServer', this.index)
@ -87,6 +134,32 @@ export default {
updateVerify(event) {
this.$emit('update:verify', event.target.checked)
},
async checkServerVersion() {
this.checked = false
this.customError = ''
this.versionFound = ''
this.responseNotValidJson = false
this.versionNotSupported = false
try {
const response = await getWelcomeMessage(this.index)
this.checked = true
this.versionFound = response.data.ocs.data.version
} catch (exception) {
this.checked = true
this.customError = t('spreed', 'Error: Unknown error occurred')
if (exception.response.data.ocs.data.error === 'JSON_INVALID') {
this.responseNotValidJson = true
} else if (exception.response.data.ocs.data.error === 'VERSION_TOO_OLD') {
this.versionNotSupported = true
} else if (exception.response.data.ocs.data.error) {
this.customError = t('spreed', 'Error: Server responded with: {error}', exception.response.data.ocs.data)
}
console.debug(exception.response.data.ocs.data.error)
}
},
},
}
</script>

5
src/services/signalingService.js

@ -37,7 +37,12 @@ const pullSignalingMessages = async(token) => {
return axios.get(generateOcsUrl('apps/spreed/api/v1/signaling', 2) + token)
}
const getWelcomeMessage = async(serverId) => {
return axios.get(generateOcsUrl('apps/spreed/api/v1/signaling', 2) + 'welcome/' + serverId)
}
export {
fetchSignalingSettings,
pullSignalingMessages,
getWelcomeMessage,
}
Loading…
Cancel
Save