ultimatepos/Modules/Communication/Services/LiveKitTokenService.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), '+/', '-_'), '=');
}
}