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), '+/', '-_'), '='); } }