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.

183 lines
6.3 KiB

  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. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." booted : ".\sizeToCleanSize(memory_get_usage())."\n");
  9. $loop = React\EventLoop\Factory::create();
  10. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." loop : ".\sizeToCleanSize(memory_get_usage())."\n");
  11. /*$dnsResolverFactory = new React\Dns\Resolver\Factory();
  12. $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);*/
  13. $connector = new Ratchet\Client\Factory($loop);
  14. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." connector : ".\sizeToCleanSize(memory_get_usage())."\n");
  15. $stdin = new React\Stream\Stream(STDIN, $loop);
  16. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." stdin : ".\sizeToCleanSize(memory_get_usage())."\n");
  17. $cd = new \Modl\ConfigDAO();
  18. $config = $cd->get();
  19. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." config : ".\sizeToCleanSize(memory_get_usage())."\n");
  20. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." widgets before : ".\sizeToCleanSize(memory_get_usage())."\n");
  21. // We load and register all the widgets
  22. $wrapper = WidgetWrapper::getInstance();
  23. $wrapper->registerAll(true);
  24. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." widgets : ".\sizeToCleanSize(memory_get_usage())."\n");
  25. $connector($config->websocketurl, array('xmpp'))->then(function($conn) use (&$stdin, $loop) {
  26. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." : ".colorize('linker launched', 'blue')."\n");
  27. fwrite(STDERR, colorize(getenv('sid'), 'yellow')." launched : ".\sizeToCleanSize(memory_get_usage())."\n");
  28. $conn->on('message', function($message) use ($conn, $loop) {
  29. if($message != '') {
  30. #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received', 'green')."\n");
  31. if($message == '</stream:stream>') {
  32. $conn->close();
  33. $loop->stop();
  34. }
  35. \Moxl\API::clear();
  36. \RPC::clear();
  37. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." before handle : ".\sizeToCleanSize(memory_get_usage())."\n");
  38. \Moxl\Xec\Handler::handleStanza($message);
  39. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." after handle : ".\sizeToCleanSize(memory_get_usage())."\n");
  40. $xml = \Moxl\API::commit();
  41. \Moxl\API::clear();
  42. //fwrite(STDERR, colorize(getenv('sid'), 'yellow')." after commit : ".\sizeToCleanSize(memory_get_usage())."\n");
  43. $msg = \RPC::commit();
  44. \RPC::clear();
  45. if(!empty($msg)) {
  46. $msg = json_encode($msg);
  47. #fwrite(STDERR, colorize($msg, 'yellow')." : ".colorize('sent to browser', 'green')."\n");
  48. echo base64_encode(gzcompress($msg, 9))."END";
  49. }
  50. if(!empty($xml)) {
  51. #fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
  52. $conn->send(trim($xml));
  53. }
  54. }
  55. });
  56. $conn->on('error', function($msg) use ($conn, $loop) {
  57. $loop->stop();
  58. });
  59. $conn->on('close', function($msg) use ($conn, $loop) {
  60. $loop->stop();
  61. });
  62. $stdin->removeAllListeners('data');
  63. $stdin->on('data', function ($data) use ($conn, $loop, &$buffer) {
  64. // A little bit of signalisation to use properly the buffer
  65. if(substr($data, -3) == "END") {
  66. $messages = explode("END", $buffer . substr($data, 0, -3));
  67. $buffer = '';
  68. foreach ($messages as $message) {
  69. #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received from the browser', 'green')."\n");
  70. $msg = json_decode($message);
  71. if($msg->func == 'message' && $msg->body != '') {
  72. $msg = $msg->body;
  73. } elseif($msg->func == 'unregister') {
  74. $conn->close();
  75. $loop->stop();
  76. } else {
  77. return;
  78. }
  79. $rpc = new \RPC();
  80. $rpc->handle_json($msg);
  81. $xml = \Moxl\API::commit();
  82. \Moxl\API::clear();
  83. if(!empty($xml)) {
  84. #fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
  85. $conn->send(trim($xml));
  86. }
  87. $msg = json_encode(\RPC::commit());
  88. \RPC::clear();
  89. if(!empty($msg)) {
  90. #fwrite(STDERR, colorize($msg, 'yellow')." : ".colorize('sent to the browser', 'green')."\n");
  91. echo base64_encode(gzcompress($msg, 9))."END";
  92. }
  93. }
  94. } else {
  95. $buffer .= $data;
  96. }
  97. });
  98. // And we say that we are ready !
  99. $obj = new \StdClass;
  100. $obj->func = 'registered';
  101. echo base64_encode(gzcompress(json_encode($obj), 9))."END";
  102. });
  103. // Fallback event, when the WebSocket is not enabled,
  104. // we still handle browser to Movim requests
  105. $stdin->on('data', function ($data) use ($loop) {
  106. if(substr($data, -3) == "END") {
  107. $messages = explode("END", $buffer . substr($data, 0, -3));
  108. $buffer = '';
  109. foreach ($messages as $message) {
  110. #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received from the browser', 'green')."\n");
  111. $msg = json_decode($message);
  112. if(isset($msg)) {
  113. if($msg->func == 'message' && $msg->body != '') {
  114. $msg = $msg->body;
  115. } elseif($msg->func == 'unregister') {
  116. $loop->stop();
  117. }
  118. } else {
  119. return;
  120. }
  121. $rpc = new \RPC();
  122. $rpc->handle_json($msg);
  123. $msg = json_encode(\RPC::commit());
  124. \RPC::clear();
  125. if(!empty($msg)) {
  126. #fwrite(STDERR, colorize($msg, 'yellow')." : ".colorize('sent to the browser', 'green')."\n");
  127. echo base64_encode(gzcompress($msg, 9))."END";
  128. }
  129. }
  130. } else {
  131. $buffer .= $data;
  132. }
  133. });
  134. $loop->run();