public function update(Server $server) : Promise { switch ($server->state()) { case Server::STARTED: $this->watcherId = \Amp\repeat([$this, "updateTime"], 1000); $this->updateTime(); break; case Server::STOPPED: \Amp\cancel($this->watcherId); $this->watcherId = null; break; } return new Success(); }
/** * React to server state changes * * Here we generate our dispatcher when the server notifies us that it is * ready to start (Server::STARTING). * * @param Server $server * @return \Amp\Promise */ public function update(Server $server) : Promise { switch ($this->state = $server->state()) { case Server::STOPPED: $this->routeDispatcher = null; break; case Server::STARTING: if (empty($this->routes)) { return new Failure(new \DomainException("Router start failure: no routes registered")); } $this->routeDispatcher = simpleDispatcher(function ($rc) use($server) { $this->buildRouter($rc, $server); }); break; } return new Success(); }
public function update(Server $server) : Promise { if ($server->state() === Server::STOPPING) { $this->isStopping = true; } return new Success(); }
public function update(Server $server) : Promise { switch ($this->state = $server->state()) { case Server::STARTING: $result = $this->application->onStart($this->proxy); if ($result instanceof \Generator) { return resolve($result); } break; case Server::STARTED: $f = (new \ReflectionClass($this))->getMethod("timeout")->getClosure($this); $this->timeoutWatcher = \Amp\repeat($f, 1000); break; case Server::STOPPING: $result = $this->application->onStop(); if ($result instanceof \Generator) { $promise = resolve($result); } elseif ($result instanceof Promise) { $promise = $result; } else { $promise = new Success(); } $promise->when(function () { $code = Code::GOING_AWAY; $reason = "Server shutting down!"; foreach ($this->clients as $client) { $this->close($client->id, $code, $reason); } }); \Amp\cancel($this->timeoutWatcher); $this->timeoutWatcher = null; return $promise; case Server::STOPPED: $promises = []; // we are not going to wait for a proper self::OP_CLOSE answer (because else we'd need to timeout for 3 seconds, not worth it), but we will ensure to at least *have written* it foreach ($this->clients as $client) { // only if we couldn't successfully send it in STOPPING $code = Code::GOING_AWAY; $reason = "Server shutting down!"; $result = $this->doClose($client, $code, $reason); if ($result instanceof \Generator) { $promise[] = resolve($result); } if (!empty($client->writeDeferredControlQueue)) { $promise = end($client->writeDeferredControlQueue)->promise(); if ($promise) { $promises[] = $promise; } } } $promise = any($promises); $promise->when(function () { foreach ($this->clients as $client) { $this->unloadClient($client); } }); return $promise; } return new Success(); }