public function getOnReceive()
{
$self = $this;
$bytes = '';
$headerLength = 4;
$dataLength = -1;
$id = null;
return function ($server, $socket, $fromid, $data) use($self, &$bytes, &$headerLength, &$dataLength, &$id) {
$bytes .= $data;
while (true) {
$length = strlen($bytes);
if ($dataLength < 0 && $length >= $headerLength) {
list(, $dataLength) = unpack('N', substr($bytes, 0, 4));
if (($dataLength & 0x80000000) !== 0) {
$dataLength &= 0x7fffffff;
$headerLength = 8;
}
}
if ($headerLength === 8 && $id === null && $length >= $headerLength) {
list(, $id) = unpack('N', substr($bytes, 4, 4));
}
if ($dataLength >= 0 && $length - $headerLength >= $dataLength) {
$context = new stdClass();
$context->server = $server;
$context->socket = $socket;
$context->fd = $socket;
$context->fromid = $fromid;
$context->userdata = new stdClass();
$data = substr($bytes, $headerLength, $dataLength);
$self->userFatalErrorHandler = function ($error) use($self, $server, $socket, $id, $context) {
$self->socketSend($server, $socket, $self->endError($error, $context), $id);
};
$self->defaultHandle($data, $context)->then(function ($data) use($self, $server, $socket, $id) {
$self->socketSend($server, $socket, $data, $id);
});
$bytes = substr($bytes, $headerLength + $dataLength);
$id = null;
$headerLength = 4;
$dataLength = -1;
} else {
break;
}
}
};
}