<?php require '../bootstrap.php'; $router = new \Thruway\Peer\Router(); $router->registerModule(new \Thruway\Transport\RawSocketTransportProvider("127.0.0.1", 8181)); $router->start();
public function testRealmJoinNoAutocreate() { $loop = new \React\EventLoop\StreamSelectLoop(); $router = new \Thruway\Peer\Router($loop); // you have to have at least one transport for the router to start // internal client in this case $iClient = new \Thruway\Peer\Client('some_realm'); $router->registerModule(new \Thruway\Transport\InternalClientTransportProvider($iClient)); $router->start(false); $router->getRealmManager()->setAllowRealmAutocreate(false); $this->assertEquals(1, count($router->getRealmManager()->getRealms())); $transport = new \Thruway\Transport\DummyTransport(); $session = $router->createNewSession($transport); $prevMsg = null; $router->getEventDispatcher()->dispatch("connection_open", new \Thruway\Event\ConnectionOpenEvent($session)); $fromRouter = []; $toRouter = [new \Thruway\Message\HelloMessage("another_realm", (object) []), function () use(&$fromRouter) { $this->assertEquals(1, count($fromRouter)); $this->assertInstanceOf('\\Thruway\\Message\\AbortMessage', $fromRouter[0]); /** @var \Thruway\Message\AbortMessage $abortMessage */ $abortMessage = $fromRouter[0]; $this->assertEquals("wamp.error.no_such_realm", $abortMessage->getResponseURI()); }]; foreach ($toRouter as $msg) { if (is_callable($msg)) { $msg = $msg(); if (!$msg instanceof \Thruway\Message\Message) { continue; } } $session->dispatchMessage($msg); if ($prevMsg !== $transport->getLastMessageSent()) { $fromRouter[] = $prevMsg = $transport->getLastMessageSent(); } } }
public function testAuthExtraSentBackOnAuthenticate() { $this->_result = null; $this->_error = null; $this->_resultPS = null; $this->_errorPS = null; $this->_challenged = false; $loop = \React\EventLoop\Factory::create(); $router = new \Thruway\Peer\Router($loop); $router->registerModule(new \Thruway\Authentication\AuthenticationManager()); $authClient = new TheAuthProvider(['my_realm'], $loop); $router->addInternalClient($authClient); $client = new \Thruway\Peer\Client('my_realm', $loop); $client->setAuthMethods(['extra_auth']); $client->setAuthId('authenticate_me'); $client->setAttemptRetry(false); $callCount = 0; $stopOnSecondCall = function () use($loop, &$callCount) { $callCount++; if ($callCount == 2) { $loop->stop(); } }; $client->on('challenge', function (\Thruway\ClientSession $session, $msg) { $this->_challenged = true; $session->sendMessage(new \Thruway\Message\AuthenticateMessage("some_signature")); }); $client->on('open', function (\Thruway\ClientSession $session) use($stopOnSecondCall) { // RPC stuff $session->register('get_the_authextra', function ($args, $argskw, $details) { return [$details]; }, ['disclose_caller' => true])->then(function () use($session, $stopOnSecondCall) { $session->call('get_the_authextra')->then(function ($args) use($stopOnSecondCall) { $this->_result = $args; $stopOnSecondCall(); }, function ($err) use($stopOnSecondCall) { $this->_error = "call failed"; $stopOnSecondCall(); }); }, function () use($stopOnSecondCall) { $this->_error = "registration failed"; $stopOnSecondCall(); }); // PubSub $session->subscribe('test_sub', function ($args, $argskw, $details) use($stopOnSecondCall) { $this->_resultPS = $details; $stopOnSecondCall(); }, ["disclose_publisher" => true])->then(function () use($session, $stopOnSecondCall) { $session->publish('test_sub', [], null, ["exclude_me" => false, "acknowledge" => true])->then(function () use($stopOnSecondCall) { }, function () use($stopOnSecondCall) { $this->_errorPS = "Error publishing"; $stopOnSecondCall(); }); }, function () use($stopOnSecondCall) { $this->_errorPS = "Error subscribing"; $stopOnSecondCall(); }); }); $router->addTransportProvider(new \Thruway\Transport\RatchetTransportProvider('127.0.0.1', 8087)); $client->addTransportProvider(new \Thruway\Transport\PawlTransportProvider('ws://127.0.0.1:8087/')); $loop->addTimer(5, function () use($loop) { $loop->stop(); }); $loop->addTimer(0.1, function () use($client) { $client->start(false); }); $router->start(); $this->assertNull($this->_error, $this->_error); $this->assertNull($this->_errorPS, $this->_errorPS); $this->assertNotNull($this->_result); $args = $this->_result; $this->assertArrayHasKey(0, $args); $this->assertTrue(is_object($args[0])); $this->assertObjectHasAttribute('_thruway_authextra', $args[0]); $this->assertNotNull($this->_resultPS); $this->assertTrue(is_object($this->_resultPS)); $this->assertObjectHasAttribute('_thruway_authextra', $this->_resultPS); $this->assertEquals('authenticate', $this->_resultPS->_thruway_authextra->from); $this->assertTrue($this->_challenged, "We were supposed to be challenged"); }
| The composer auto-load class can be used to add lookup directories for | custom application classes. This class can be assessed from the app | controller using $app->loader. | Alternatively you may use Budkit/Utitlity/Loader | */ $loop = React\EventLoop\Factory::create(); $pusher = new \Thruway\Peer\Client("pubsub", $loop); $pusher->on('open', function ($session) use($loop) { $context = new React\ZMQ\Context($loop); $pull = $context->getSocket(ZMQ::SOCKET_PULL); $pull->bind('tcp://127.0.0.1:5555'); $pull->on('message', function ($message) use($session) { //messages should be sent as encode json? $data = json_decode($message, true); //must tell us the topic if (isset($data["topic"])) { $session->publish($data["topic"], [$data]); } }); }); $router = new Thruway\Peer\Router($loop); $authMgr = new \Thruway\Authentication\AuthenticationManager(); //$router->setAuthenticationManager( $authMgr ); //$router->addTransportProvider( new \Thruway\Transport\InternalClientTransportProvider($authMgr)); $router->registerModule($authMgr); //maybe register the auth as a module, extend module $router->addInternalClient($app->createInstance(Helper\PubsubAuth::class, [$app, ["*"]])); $router->addInternalClient($pusher); $router->addTransportProvider(new Thruway\Transport\RatchetTransportProvider("0.0.0.0", 8080)); $router->start();
public function testStateRestoreWithNoQueue() { $router = new \Thruway\Peer\Router(); $stateHandlerRegistry = new \Thruway\Subscription\StateHandlerRegistry('state.test.realm'); $router->registerModule($stateHandlerRegistry); $router->start(false); $transportStateHandler = $this->createTransportMock(); $registrationId = 0; $invocationReqId = 0; $subscriptionId = 0; $transportStateHandler->expects($this->exactly(7))->method('sendMessage')->withConsecutive([$this->isInstanceOf('\\Thruway\\Message\\WelcomeMessage')], [$this->callback(function (\Thruway\Message\RegisteredMessage $msg) use(&$registrationId) { $registrationId = $msg->getRegistrationId(); return true; })], [$this->callback(function (\Thruway\Message\ErrorMessage $msg) { $this->assertEquals("No uri set for state handler registration.", $msg->getArguments()[0]); return true; })], [$this->callback(function (\Thruway\Message\ErrorMessage $msg) { $this->assertEquals("No handler uri set for state handler registration.", $msg->getArguments()[0]); return true; })], [$this->callback(function (\Thruway\Message\ErrorMessage $msg) { $this->assertEquals("No uri set for state handler registration.", $msg->getArguments()[0]); return true; })], [$this->callback(function (\Thruway\Message\ResultMessage $msg) { return true; })], [$this->callback(function (\Thruway\Message\InvocationMessage $msg) use(&$registrationId, &$invocationReqId) { $this->assertEquals($registrationId, $msg->getRegistrationId()); $invocationReqId = $msg->getRequestId(); return true; })]); $transportSubscriber = $this->createTransportMock(); $transportSubscriber->expects($this->exactly(5))->method("sendMessage")->withConsecutive([$this->isInstanceOf('\\Thruway\\Message\\WelcomeMessage')], [$this->callback(function (\Thruway\Message\SubscribedMessage $msg) use(&$subscriptionId) { $subscriptionId = $msg->getSubscriptionId(); return true; })], [$this->callback(function ($msg) { $this->assertEventMessageWithArgument0(3, $msg); return true; })], [$this->callback(function ($msg) { $this->assertEventMessageWithArgument0(4, $msg); return true; })], [$this->callback(function ($msg) { $this->assertEventMessageWithArgument0(5, $msg); return true; })]); $sessionStateHandler = new \Thruway\Session($transportStateHandler); $sessionSubscriber = new \Thruway\Session($transportSubscriber); $router->getEventDispatcher()->dispatch("connection_open", new \Thruway\Event\ConnectionOpenEvent($sessionStateHandler)); $router->getEventDispatcher()->dispatch("connection_open", new \Thruway\Event\ConnectionOpenEvent($sessionSubscriber)); $hello = new \Thruway\Message\HelloMessage('state.test.realm', (object) []); $sessionStateHandler->dispatchMessage($hello); $sessionSubscriber->dispatchMessage($hello); $register = new \Thruway\Message\RegisterMessage(12345, (object) [], 'my_state_handler'); $sessionStateHandler->dispatchMessage($register); $call = new \Thruway\Message\CallMessage(2, (object) [], 'add_state_handler', [[]]); $sessionStateHandler->dispatchMessage($call); $call->setArguments([(object) ["uri" => "test.stateful.uri"]]); $sessionStateHandler->dispatchMessage($call); $call->setArguments([(object) ["handler_uri" => "my_state_handler"]]); $sessionStateHandler->dispatchMessage($call); $call->setArguments([(object) ["uri" => "test.stateful.uri", "handler_uri" => "my_state_handler"]]); $sessionStateHandler->dispatchMessage($call); $subscribe = new \Thruway\Message\SubscribeMessage(2, (object) [], "test.stateful.uri"); $sessionSubscriber->dispatchMessage($subscribe); $yield = new \Thruway\Message\YieldMessage($invocationReqId, (object) []); $sessionStateHandler->dispatchMessage($yield); for ($i = 3; $i < 6; $i++) { $publish = new \Thruway\Message\PublishMessage($i, (object) [], "test.stateful.uri", [$i]); $publish->setPublicationId($i); $sessionStateHandler->dispatchMessage($publish); } }
<?php require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/MysqlAuthProvider.php'; $loop = \React\EventLoop\Factory::create(); $router = new \Thruway\Peer\Router($loop); // You need the authentication manager to do auth $router->registerModule(new \Thruway\Authentication\AuthenticationManager()); // register our mysql auth provider for the "somerealm" realm $mysqlAuth = new MysqlAuthProvider(['somerealm'], $loop); $router->addInternalClient($mysqlAuth); // add a transport so other people can connect $router->registerModule(new \Thruway\Transport\RatchetTransportProvider("127.0.0.1", 9090)); $router->start();