private function start(int $port, string $address, array $options)
{
if (!$this->open) {
throw new ClosedError('The server has been closed.');
}
$cryptoMethod = isset($options['crypto_method']) ? (int) $options['crypto_method'] : (isset($options['pem']) ? self::DEFAULT_CRYPTO_METHOD : 0);
$timeout = isset($options['timeout']) ? (double) $options['timeout'] : self::DEFAULT_TIMEOUT;
$allowPersistent = isset($options['allow_persistent']) ? (bool) $options['allow_persistent'] : true;
try {
$server = $this->factory->create($address, $port, $options);
} catch (Throwable $exception) {
$this->close();
throw $exception;
}
$this->servers[] = $server;
$coroutine = new Coroutine($this->accept($server, $cryptoMethod, $timeout, $allowPersistent));
$coroutine->done(null, $this->onError);
}