Server/php/service.php (77 lines of code) (raw):

<?php class Service { const WILDCARD_CHARACTERS = "*"; const ENABLE_PRIVILEGE = 1; const ENABLE_AUDIO_PRIVILEGE = 2; const ENABLE_VIDEO_PRIVILEGE = 4; const ENABLE_SCREEN_PRIVILEGE = 8; private $channel_id; private $user_id; private $privilege; public function __construct(string $channel_id, string $user_id, $privilege = null) { $this->channel_id = $channel_id; $this->user_id = $user_id; $this->privilege = $privilege; } public static function create_service_only_with_user_id(string $user_id): self { return new self(self::WILDCARD_CHARACTERS, $user_id); } public static function create_service_only_with_channel_id(string $channel_id): self { return new self($channel_id, self::WILDCARD_CHARACTERS); } public function add_audio_publish_privilege() { if ($this->privilege === null) { $this->privilege = 0 | self::ENABLE_PRIVILEGE; } $this->privilege |= self::ENABLE_AUDIO_PRIVILEGE; } public function add_video_publish_privilege() { if ($this->privilege === null) { $this->privilege = 0 | self::ENABLE_PRIVILEGE; } $this->privilege |= self::ENABLE_VIDEO_PRIVILEGE; } public function add_screen_publish_privilege() { if ($this->privilege === null) { $this->privilege = 0 | self::ENABLE_PRIVILEGE; } $this->privilege |= self::ENABLE_SCREEN_PRIVILEGE; } public function pack(): string { $buf = ''; $channel_id_bytes = $this->channel_id; $buf .= pack('N', strlen($channel_id_bytes)); $buf .= $channel_id_bytes; $user_id_bytes = $this->user_id; $buf .= pack('N', strlen($user_id_bytes)); $buf .= $user_id_bytes; if ($this->privilege !== null) { $buf .= pack('C', 1); $buf .= pack('N', $this->privilege); } else { $buf .= pack('C', 0); } return $buf; } public static function unpack($buffer): self { $channel_id_length = unpack('N', fread($buffer, 4))[1]; $channel_id = fread($buffer, $channel_id_length); $user_id_length = unpack('N', fread($buffer, 4))[1]; $user_id = fread($buffer, $user_id_length); $has_privilege = unpack('C', fread($buffer, 1))[1]; $privilege = null; if ($has_privilege === 1) { $privilege = unpack('N', fread($buffer, 4))[1]; } return new self($channel_id, $user_id, $privilege); } }