You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
6.7 KiB

10 years ago
  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. define('DOCUMENT_ROOT', dirname(__FILE__));
  4. require_once(DOCUMENT_ROOT.'/bootstrap.php');
  5. gc_enable();
  6. $bootstrap = new Bootstrap();
  7. $booted = $bootstrap->boot();
  8. $loop = React\EventLoop\Factory::create();
  9. $dnsResolverFactory = new React\Dns\Resolver\Factory();
  10. $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
  11. $connector = new React\SocketClient\Connector($loop, $dns);
  12. $stdin = new React\Stream\Stream(STDIN, $loop);
  13. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." widgets before : ".\sizeToCleanSize(memory_get_usage())."\n");
  14. // We load and register all the widgets
  15. $wrapper = WidgetWrapper::getInstance();
  16. $wrapper->registerAll(true);
  17. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." widgets : ".\sizeToCleanSize(memory_get_usage())."\n");
  18. $conn = null;
  19. $parser = new \Moxl\Parser;
  20. $buffer = '';
  21. $stdin_behaviour = function ($data) use (&$conn, $loop, &$buffer, &$connector, &$xmpp_behaviour, &$parser) {
  22. if(substr($data, -1) == "") {
  23. $messages = explode("", $buffer . substr($data, 0, -1));
  24. $buffer = '';
  25. foreach ($messages as $message) {
  26. #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received from the browser', 'green')."\n");
  27. $msg = json_decode($message);
  28. if(isset($msg)) {
  29. if($msg->func == 'message' && $msg->body != '') {
  30. $msg = $msg->body;
  31. } elseif($msg->func == 'unregister') {
  32. \Moxl\Stanza\Stream::end();
  33. } elseif($msg->func == 'register') {
  34. $cd = new \Modl\ConfigDAO();
  35. $config = $cd->get();
  36. $port = 5222;
  37. $dns = \Moxl\Utils::resolveHost($msg->host);
  38. if(isset($dns->target) && $dns->target != null) $msg->host = $dns->target;
  39. if(isset($dns->port) && $dns->port != null) $port = $dns->port;
  40. #fwrite(STDERR, colorize('open a socket to '.$domain, 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
  41. $connector->create($msg->host, $port)->then($xmpp_behaviour);
  42. }
  43. } else {
  44. return;
  45. }
  46. $rpc = new \RPC();
  47. $rpc->handle_json($msg);
  48. $msg = \RPC::commit();
  49. \RPC::clear();
  50. if(!empty($msg)) {
  51. //echo json_encode($msg)."";
  52. echo base64_encode(gzcompress(json_encode($msg), 9))."";
  53. //fwrite(STDERR, colorize(json_encode($msg), 'yellow')." : ".colorize('sent to the browser', 'green')."\n");
  54. }
  55. $xml = \Moxl\API::commit();
  56. \Moxl\API::clear();
  57. //$loop->tick();
  58. if(!empty($xml) && $conn) {
  59. $conn->write(trim($xml));
  60. #fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
  61. }
  62. }
  63. } else {
  64. $buffer .= $data;
  65. }
  66. //$loop->tick();
  67. };
  68. $xmpp_behaviour = function (React\Stream\Stream $stream) use (&$conn, $loop, &$stdin, $stdin_behaviour, $parser) {
  69. $conn = $stream;
  70. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." : ".colorize('linker launched', 'blue')."\n");
  71. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." launched : ".\sizeToCleanSize(memory_get_usage())."\n");
  72. $stdin->removeAllListeners('data');
  73. $stdin->on('data', $stdin_behaviour);
  74. // We define a huge buffer to prevent issues with SSL streams, see https://bugs.php.net/bug.php?id=65137
  75. $conn->bufferSize = 1024*32;
  76. $conn->on('data', function($message) use (&$conn, $loop, $parser) {
  77. if(!empty($message)) {
  78. $restart = false;
  79. if($message == '</stream:stream>') {
  80. $conn->close();
  81. $loop->stop();
  82. } elseif($message == "<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
  83. || $message == '<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>') {
  84. stream_set_blocking($conn->stream, 1);
  85. stream_context_set_option($conn->stream, 'ssl', 'allow_self_signed', true);
  86. #stream_context_set_option($conn->stream, 'ssl', 'verify_peer_name', false);
  87. #stream_context_set_option($conn->stream, 'ssl', 'verify_peer', false);
  88. $out = stream_socket_enable_crypto($conn->stream, 1, STREAM_CRYPTO_METHOD_TLS_CLIENT);
  89. $restart = true;
  90. }
  91. #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received', 'green')."\n");
  92. #fwrite(STDERR, colorize(getenv('sid'), 'yellow')." widgets : ".\sizeToCleanSize(memory_get_usage())."\n");
  93. \Moxl\API::clear();
  94. \RPC::clear();
  95. if(!$parser->parse($message)) {
  96. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." ".$parser->getError()."\n");
  97. }
  98. if($restart) {
  99. $session = \Sessionx::start();
  100. \Moxl\Stanza\Stream::init($session->host);
  101. stream_set_blocking($conn->stream, 0);
  102. $restart = false;
  103. }
  104. $msg = \RPC::commit();
  105. \RPC::clear();
  106. if(!empty($msg)) {
  107. //echo json_encode($msg)."";
  108. echo base64_encode(gzcompress(json_encode($msg), 9))."";
  109. //fwrite(STDERR, colorize(json_encode($msg).' '.strlen($msg), 'yellow')." : ".colorize('sent to browser', 'green')."\n");
  110. }
  111. $xml = \Moxl\API::commit();
  112. \Moxl\API::clear();
  113. if(!empty($xml)) {
  114. $conn->write(trim($xml));
  115. #fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
  116. }
  117. }
  118. // Two ticks to be sure that we get everything from the socket, sic…
  119. $loop->tick();
  120. //$loop->tick();
  121. });
  122. $conn->on('error', function($msg) use ($conn, $loop) {
  123. #fwrite(STDERR, colorize(serialize($msg), 'red')." : ".colorize('error', 'green')."\n");
  124. $loop->stop();
  125. });
  126. $conn->on('close', function($msg) use ($conn, $loop) {
  127. #fwrite(STDERR, colorize(serialize($msg), 'red')." : ".colorize('closed', 'green')."\n");
  128. $loop->stop();
  129. });
  130. // And we say that we are ready !
  131. $obj = new \StdClass;
  132. $obj->func = 'registered';
  133. //echo json_encode($obj)."";
  134. //fwrite(STDERR, colorize(json_encode($obj).' '.strlen($obj), 'yellow')." : ".colorize('obj sent to browser', 'green')."\n");
  135. echo base64_encode(gzcompress(json_encode($obj), 9))."";
  136. };
  137. $stdin->on('data', $stdin_behaviour);
  138. $stdin->on('error', function() use($loop) { $loop->stop(); } );
  139. $stdin->on('close', function() use($loop) { $loop->stop(); } );
  140. $loop->run();