mxmbsocket/lib/Ratchet/Application/WAMP/App.php
Chris Boden dbcb6f2cde WAMP Cleanup
Fixed a bug in getURI
Cleaned up roc calls - cleaner api, no more call_() calls
2012-01-17 22:47:17 -05:00

116 lines
3.3 KiB
PHP

<?php
namespace Ratchet\Application\WAMP;
use Ratchet\Application\ApplicationInterface;
use Ratchet\Application\WebSocket\WebSocketAppInterface;
use Ratchet\Resource\Connection;
/**
* WebSocket Application Messaging Protocol
*
* +--------------+----+------------------+
* | Message Type | ID | DIRECTION |
* |--------------+----+------------------+
* | PREFIX | 1 | Bi-Directional |
* | CALL | 2 | Client-to-Server |
* | CALL RESULT | 3 | Server-to-Client |
* | CALL ERROR | 4 | Server-to-Client |
* | SUBSCRIBE | 5 | Client-to-Server |
* | UNSUBSCRIBE | 6 | Client-to-Server |
* | PUBLISH | 7 | Client-to-Server |
* | EVENT | 8 | Server-to-Client |
* +--------------+----+------------------+
* @link http://www.tavendo.de/autobahn/protocol.html
*/
class App implements WebSocketAppInterface {
protected $_app;
public function getSubProtocol() {
return 'wamp';
}
/**
* @todo WAMP spec does not say what to do when there is an error with PREFIX...
*/
public function addPrefix(Connection $conn, $curie, $uri) {
// validate uri
// validate curie
// make sure the curie is shorter than the uri
$conn->WAMP->prefixes[$curie] = $uri;
}
public function onOpen(Connection $conn) {
$conn->WAMP = new \StdClass;
$conn->WAMP->prefixes = array();
$conn->WAMP->subscriptions = array();
return $this->_app->onOpen($conn);
}
/**
* @{inherit}
* @throws Exception
* @throws JSONException
*/
public function onMessage(Connection $from, $msg) {
if (null === ($json = @json_decode($msg, true))) {
throw new JSONException;
}
switch ($json[0]) {
case 1:
return $this->addPrefix($from, $json[1], $json[2]);
break;
case 2:
array_shift($json);
$callID = array_shift($json);
$procURI = array_shift($json);
if (count($json) == 1 && is_array($json[0])) {
$json = $json[0];
}
return $this->_app->onCall($from, $callID, $procURI, $json);
break;
case 5:
return $this->_app->onSubscribe($from, $this->getUri($from, $json[1]));
break;
case 6:
return $this->_app->onUnSubscribe($from, $this->getUri($from, $json[1]));
break;
case 7:
return $this->_app->onPublish($from, $this->getUri($from, $json[1]), $json[2]);
break;
default:
throw new Exception('Invalid message type');
}
}
/**
* Get the full request URI from the connection object if a prefix has been established for it
* @param Ratchet\Resource\Connection
* @param ...
* @return string
*/
protected function getUri(Connection $conn, $uri) {
return (isset($conn->WAMP->prefixes[$uri]) ? $conn->WAMP->prefixes[$uri] : $uri);
}
public function __construct(ServerInterface $app) {
$this->_app = $app;
}
public function onClose(Connection $conn) {
return $this->_app->onClose($conn);
}
public function onError(Connection $conn, \Exception $e) {
return $this->_app->onError($conn, $e);
}
}