%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sender/lib/integration/sender/webhook/ |
Current File : //home/bitrix/www/bitrix/modules/sender/lib/integration/sender/webhook/transportwebhook.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage sender * @copyright 2001-2012 Bitrix */ namespace Bitrix\Sender\Integration\Sender\WebHook; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Web\HttpClient; use Bitrix\Main\Web\Json; use Bitrix\Sender\Message; use Bitrix\Sender\Transport; use Bitrix\Sender\Recipient; Loc::loadMessages(__FILE__); /** * Class TransportWebHook * @package Bitrix\Sender\Integration\Sender\WebHook */ class TransportWebHook implements Transport\iBase, Transport\iLimitation { const CODE = self::CODE_WEB_HOOK; const MAX_BUFFER_SIZE = 200; /** @var Message\Configuration $configuration Configuration. */ protected $configuration; /** @var Transport\CountLimiter $limiter Limiter. */ protected $limiter; /** @var HttpClient $httpClient Http client. */ protected $httpClient = array(); /** @var array $buffer Buffer. */ protected $buffer = array( 'uri' => null, 'list' => array() ); /** * TransportWebHook constructor. */ public function __construct() { $this->configuration = new Message\Configuration(); } /** * Get name. * * @return string */ public function getName() { return Loc::getMessage('SENDER_INTEGRATION_WEBHOOK_TRANSPORT_NAME'); } /** * Get code. * * @return string */ public function getCode() { return self::CODE; } /** * Get supported recipient types. * * @return integer[] */ public function getSupportedRecipientTypes() { return array(Recipient\Type::EMAIL, Recipient\Type::PHONE); } /** * Load configuration. * * @return Message\Configuration */ public function loadConfiguration() { return $this->configuration; } /** * Save configuration. * * @param Message\Configuration $configuration Configuration. */ public function saveConfiguration(Message\Configuration $configuration) { $this->configuration = $configuration; } /** * Start. */ public function start() { $clientOptions = array( 'waitResponse' => true, 'socketTimeout' => 5, ); $this->httpClient = new HttpClient($clientOptions); $this->httpClient->setTimeout(5); $this->resetBuffer(); } /** * Send. * * @param Message\Adapter $message Message. * * @return bool */ public function send(Message\Adapter $message) { $this->buffer['uri'] = $message->getConfiguration()->get('URI'); $this->buffer['list'][$message->getRecipientType()][] = $message->getTo(); $count = 0; $types = $this->getSupportedRecipientTypes(); foreach ($types as $type) { if (!isset($this->buffer['list'][$type])) { continue; } $count += count($this->buffer['list'][$type]); } if ($count >= self::MAX_BUFFER_SIZE) { $this->flushBuffer(); } return true; } /** * End. */ public function end() { $this->flushBuffer(); } protected function resetBuffer() { $this->buffer = array( 'uri' => null, 'list' => array() ); $types = $this->getSupportedRecipientTypes(); foreach ($types as $type) { $this->buffer['list'][$type] = array(); } } protected function flushBuffer() { if (!$this->buffer['uri']) { return; } $count = count($this->buffer['list']); if ($count === 0) { return; } $this->httpClient->post($this->buffer['uri'], array( 'list' => Json::encode($this->buffer['list']), )); $this->getCountLimiter()->inc($count); $this->resetBuffer(); } /** * Get limiters. * * @param Message\iBase $message Message. * @return Transport\iLimiter[] */ public function getLimiters(Message\iBase $message = null) { return array( $this->getCountLimiter() ); } protected function getCountLimiter() { if ($this->limiter === null) { $this->limiter = Transport\CountLimiter::create() ->withName('web_hook') ->withLimit(5000) ->withUnit("1 " . Transport\iLimiter::DAYS) ->withUnitName(Loc::getMessage('SENDER_INTEGRATION_WEBHOOK_TRANSPORT_LIMIT_PER_DAY')); } return $this->limiter; } }