Server/php/app_token_options.php (48 lines of code) (raw):

<?php class AppTokenOptions { private $engine_options = []; public function __construct($engine_options = []) { $this->set_engine_options($engine_options); } public function set_engine_options($engine_options) { $this->engine_options = $engine_options ?? []; } public function pack(): string { $buf = ''; if ($this->engine_options === null) { $buf .= pack('C', 0); } else { $buf .= pack('C', 1); $buf .= pack('N', count($this->engine_options)); ksort($this->engine_options); foreach ($this->engine_options as $key => $value) { if ($key === null || $value === null) { throw new \ValueError('illegal engineOptions entry'); } $buf .= pack('N', strlen($key)) . $key; $buf .= pack('N', strlen($value)) . $value; } } return $buf; } public static function unpack($buffer): self { $has_engine_options = unpack('C', fread($buffer,1))[1]; $engine_options = []; if ($has_engine_options) { $size = unpack('N', fread($buffer,4))[1]; for ($i = 0; $i < $size; $i++) { $key_length = unpack('N', fread($buffer,4))[1]; $key = fread($buffer,$key_length); $value_length = unpack('N', fread($buffer,4))[1]; $value = fread($buffer,$value_length); $engine_options[$key] = $value; } } return new self($engine_options); } }