%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/im/lib/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/im/lib/janus.php |
<?php namespace Bitrix\Im; use Bitrix\Main\Result; use Bitrix\Main\Web\HttpClient; use Bitrix\Main\Web\Json; use Bitrix\Main\Error; class Janus { const PLUGIN_VIDEOROOM = 'janus.plugin.videoroom'; const USER_AGENT = 'Bitrix IM'; protected static $serverAddress = 'https://testphone.bitrix.info:8089/janus'; protected static $apiSecret = 'eaff35df4cf027ffb36300d9b9604d8f'; //protected static $serverAddress = 'https://cp.perevozov.bx:8089/janus'; //protected static $apiSecret = 'bitrix'; protected $transaction = null; protected $sessionId = ''; protected $pluginEndpoints = array(); public function __construct() { $this->transaction = uniqid(); } /** * @param array $config * @return string|false Returns room id or false in case of failure */ public function createRoom(array $config = array()) { $request = array( 'janus' => 'message', 'body' => array( 'request' => 'create', 'description' => ($config['description'] ?: 'Nameless room'), 'publishers' => ($config['publishers'] ?: 2) ) ); if(isset($config['bitrate'])) { $request['body']['bitrate'] = $config['bitrate']; } $result = $this->query($request, self::PLUGIN_VIDEOROOM); if(!$result->isSuccess()) return $result; $response = $result->getData(); if($response['plugindata']['data']['videoroom'] === 'created') return $response['plugindata']['data']['room']; else return false; } /** * @return Result */ public function login() { $request = array( 'janus' => 'create', ); $result = $this->query($request); if(!$result->isSuccess()) { return $result; } $response = $result->getData(); if($response['data']['id']) $this->sessionId = (string)$response['data']['id']; else $result->addError(new Error('Session id is not found in gateway response')); return $result; } /** * @return bool */ protected function isLogged() { return ($this->sessionId != ''); } /** * @param string $pluginName * @return Result */ public function attachToPlugin($pluginName) { $request = array( 'janus' => 'attach', 'plugin' => $pluginName, ); $result = $this->query($request); if(!$result->isSuccess()) return $result; $response = $result->getData(); if($response['data']['id']) $this->pluginEndpoints[$pluginName] = (string)$response['data']['id']; else $result->addError(new Error('Session id is not found in gateway response')); return $result; } /** * @param $pluginName * @return bool */ protected function isAttachedToPlugin($pluginName) { return isset($this->pluginEndpoints[$pluginName]); } /** * @param array $request * @param string $pluginName * @return Result */ protected function query(array $request, $pluginName = '') { $request['transaction'] = $this->transaction; $request['apisecret'] = self::$apiSecret; $endpoint = self::$serverAddress; if($this->sessionId) { $endpoint = $endpoint . '/' .$this->sessionId; } if($pluginName) { if(!$this->isAttachedToPlugin($pluginName)) { $attachResult = $this->attachToPlugin($pluginName); if(!$attachResult->isSuccess()) { return $attachResult; } } $endpoint = $endpoint . '/' . $this->pluginEndpoints[$pluginName]; } $result = new Result(); $encodedRequest = Json::encode($request); $httpClient = new HttpClient(array( "socketTimeout" => 5, "streamTimeout" => 5, "disableSslVerification" => true )); $httpClient->setHeader('User-Agent', self::USER_AGENT, true); $httpClient->query('POST', $endpoint, $encodedRequest); if($httpClient->getStatus() !== 200) { $result->addError(new Error('Error connecting to Janus Media Gateway')); return $result; } $response = $httpClient->getResult(); $decodedResponse = json_decode($response, true, 512, JSON_BIGINT_AS_STRING); if(!is_array($decodedResponse)) { $result->addError(new Error('Error decoding gateway response')); return $result; } $result->setData($decodedResponse); return $result; } /** * @return string */ public static function getServerAddress() { return self::$serverAddress; } /** * @return string */ public static function getApiSecret() { return self::$apiSecret; } }