public function wsHandle($server)
{
$self = $this;
$buffers = array();
$server->on('open', function ($server, $request) use($self, &$buffers) {
$fd = $request->fd;
if (isset($buffers[$fd])) {
unset($buffers[$fd]);
}
$context = new stdClass();
$context->server = $server;
$context->fd = $fd;
$context->userdata = new stdClass();
try {
$onAccept = $self->onAccept;
if (is_callable($onAccept)) {
call_user_func($onAccept, $context);
}
} catch (Exception $e) {
$server->close($fd);
} catch (Throwable $e) {
$server->close($fd);
}
});
$server->on('close', function ($server, $fd) use($self, &$buffers) {
if (isset($buffers[$fd])) {
unset($buffers[$fd]);
}
$context = new stdClass();
$context->server = $server;
$context->fd = $fd;
$context->userdata = new stdClass();
try {
$onClose = $self->onClose;
if (is_callable($onClose)) {
call_user_func($onClose, $context);
}
} catch (Exception $e) {
} catch (Throwable $e) {
}
});
$server->on('message', function ($server, $frame) use($self, &$buffers) {
if (isset($buffers[$frame->fd])) {
if ($frame->finish) {
$data = $buffers[$frame->fd] . $frame->data;
unset($buffers[$frame->fd]);
$self->onMessage($server, $frame->fd, $data);
} else {
$buffers[$frame->fd] .= $frame->data;
}
} else {
if ($frame->finish) {
$self->onMessage($server, $frame->fd, $frame->data);
} else {
$buffers[$frame->fd] = $frame->data;
}
}
});
}