function fetch()
{
// Unmask payload
$server = $this->server();
if (is_bool($buf = $server->read($this->socket))) {
$this->free();
return FALSE;
}
$buf = $this->buffer .= $buf;
$op = ord($buf[0]) & WS::OpCode;
$len = ord($buf[1]) & WS::Length;
$pos = 2;
if ($len == 0x7e) {
$len = ord($buf[2]) * 256 + ord($buf[3]);
$pos += 2;
} else {
if ($len == 0x7f) {
for ($i = 0, $len = 0; $i < 8; $i++) {
$len = $len * 256 + ord($buf[$i + 2]);
}
$pos += 8;
}
}
for ($i = 0, $mask = []; $i < 4; $i++) {
$mask[$i] = ord($buf[$pos + $i]);
}
$pos += 4;
if (strlen($buf) < $len + $pos) {
return FALSE;
}
for ($i = 0, $data = ''; $i < $len; $i++) {
$data .= chr(ord($buf[$pos + $i]) ^ $mask[$i % 4]);
}
$this->buffer = '';
return [$op, $data];
}