Beispiel #1
0
<?php

require '../bootstrap.php';
$router = new \Thruway\Peer\Router();
$router->registerModule(new \Thruway\Transport\RawSocketTransportProvider("127.0.0.1", 8181));
$router->start();
Beispiel #2
0
 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();
         }
     }
 }
Beispiel #3
0
 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");
 }
Beispiel #4
0
| 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();
Beispiel #5
0
 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();