public final function update(\SplSubject $subject) : Promise { switch ($subject->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 \SplSubject $subject * @return \Amp\Promise */ public function update(\SplSubject $subject) : Promise { switch ($this->state = $subject->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($subject) { $this->buildRouter($rc, $subject); }); break; } return new Success(); }
/** * Receive notifications from the server when it starts/stops * * @param \SplSubject $subject * @return \Amp\Promise */ public function update(\SplSubject $subject) : amp\Promise { switch ($subject->state()) { case Server::STARTED: $this->debug = $subject->getOption("debug"); amp\enable($this->cacheWatcher); break; case Server::STOPPED: amp\disable($this->cacheWatcher); $this->cache = []; $this->cacheTimeouts = []; $this->cacheEntryCount = 0; $this->bufferedFileCount = 0; break; } return new amp\Success(); }
public function update(\SplSubject $subject) : Promise { switch ($this->state = $subject->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: $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; break; case Server::STOPPED: $promises = []; $result = $this->application->onStop(); if ($result instanceof \Generator) { $promises[] = resolve($result); } // 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) { 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(); }
public function update(\SplSubject $subject) : Promise { if ($subject->state() === Server::STOPPING) { $this->isStopping = true; } return new Success(); }