90 lines
2.6 KiB
PHP
90 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace Modules\Communication\Services;
|
|
|
|
use App\User;
|
|
|
|
class LiveKitTokenService
|
|
{
|
|
public function createToken(
|
|
User $user,
|
|
string $roomName,
|
|
bool $isHost = false,
|
|
?string $language = null,
|
|
bool $translationEnabled = false,
|
|
): string {
|
|
$apiKey = config('livekit.api_key');
|
|
$apiSecret = config('livekit.api_secret');
|
|
$language = $this->normalizeLanguage($language);
|
|
|
|
$now = time();
|
|
$identity = (string) $user->id;
|
|
$payload = [
|
|
'iss' => $apiKey,
|
|
'sub' => $identity,
|
|
'jti' => $identity,
|
|
'name' => $user->user_full_name ?: $user->first_name,
|
|
'nbf' => $now,
|
|
'iat' => $now,
|
|
'exp' => $now + 3600,
|
|
'attributes' => [
|
|
'lang' => $language,
|
|
'language' => $language,
|
|
'translation' => $translationEnabled ? 'true' : 'false',
|
|
],
|
|
'video' => array_filter([
|
|
'room' => $roomName,
|
|
'roomJoin' => true,
|
|
'canPublish' => true,
|
|
'canSubscribe' => true,
|
|
'roomAdmin' => $isHost ? true : null,
|
|
]),
|
|
];
|
|
|
|
if ($translationEnabled) {
|
|
$payload['roomConfig'] = [
|
|
'agents' => [
|
|
['agentName' => config('livekit.translator_agent', 'translator')],
|
|
],
|
|
];
|
|
}
|
|
|
|
return $this->encodeJwt($payload, $apiSecret);
|
|
}
|
|
|
|
public function getUrl(): string
|
|
{
|
|
return config('livekit.url');
|
|
}
|
|
|
|
public function normalizeLanguage(?string $language): string
|
|
{
|
|
$languages = array_keys(config('communication.translation_languages', ['fa' => 'فارسی', 'en' => 'English']));
|
|
$default = config('communication.default_meeting_language', 'fa');
|
|
|
|
if ($language && in_array($language, $languages, true)) {
|
|
return $language;
|
|
}
|
|
|
|
return in_array($default, $languages, true) ? $default : 'en';
|
|
}
|
|
|
|
private function encodeJwt(array $payload, string $secret): string
|
|
{
|
|
$header = ['typ' => 'JWT', 'alg' => 'HS256'];
|
|
$segments = [
|
|
$this->base64UrlEncode(json_encode($header)),
|
|
$this->base64UrlEncode(json_encode($payload)),
|
|
];
|
|
$signature = hash_hmac('sha256', implode('.', $segments), $secret, true);
|
|
$segments[] = $this->base64UrlEncode($signature);
|
|
|
|
return implode('.', $segments);
|
|
}
|
|
|
|
private function base64UrlEncode(string $data): string
|
|
{
|
|
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
|
|
}
|
|
}
|