/** * @param integer $discoverTime * @return $this */ public function discover(int $discoverTime = 10) : self { $client = new UDPClient(); $client->setHost($this->host); $client->setPort($this->port); $client->setTimeout($discoverTime, 0); $client->setAllowBrowscast(true); $client->connect(); $client->write($this->buildPacket('OPTIONS', max(1, $discoverTime / 2))); $client->write($this->buildPacket('M-SEARCH', max(1, $discoverTime / 2))); $endTime = time() + $discoverTime; while (time() < $endTime) { if ($this->server) { $this->server->listen(1); } /** @var string $msg */ if (!($msg = $client->read())) { usleep(0.01); continue; } self::$eventHandler->fireEvent(EventDiscover::EVENT_NAME, new EventDiscover((new SsdpResponse())->setFromString($msg))); } $client->disconnect(); return $this; }
public function testClicksWithStopPropagationAndPriority() { $clicks = 0; $this->eventHandler->addEvent(__METHOD__, function (Event $event) use(&$clicks) { $clicks++; $event->stopPropagation(); }); $this->eventHandler->addEvent(__METHOD__, function () use(&$clicks) { $clicks++; }, -1); $this->assertEquals(0, $clicks); $this->eventHandler->fireEvent(__METHOD__); $this->assertEquals(2, $clicks); }
/** * @param ServerClient $client * @param string $buffer * @return void */ public function onIncoming(ServerClient $client, string $buffer) { if (preg_match('/^NOTIFY/', $buffer)) { $response = new SsdpResponse(); $response->setFromString($buffer); if ($response->getHttpCode() !== 200) { return; } self::$eventHandler->fireEvent(EventDiscover::EVENT_NAME, new EventDiscover($response)); return; } if (preg_match('/^(OPTIONS|M-SEARCH) /', $buffer)) { foreach ($this->services as $service) { $buffer = sprintf("HTTP/1.1 200 OK\n" . "LOCATION: %s\n" . "SERVER: %s\n" . "CACHE-CONTROL: max-age=%d\n" . "EXT:\n" . "ST: %s\n" . "USN: %s\n", $service['location'], $service['server'], $service['ttl'], $service['usn'], $service['usn']); $this->send($client, $buffer); } } }