GenisysPro  for Minecraft PE/Windows 10 v1.1.x
Feature-rich server software for Minecraft PE and Windows 10 Edition
RakLibServer Class Reference

Public Member Functions

 __construct (\ThreadedLogger $logger, \ClassLoader $loader, $port, $interface="0.0.0.0")
 
 isShutdown ()
 
 shutdown ()
 
 getPort ()
 
 getInterface ()
 
 getLogger ()
 
 getExternalQueue ()
 
 getInternalQueue ()
 
 pushMainToThreadPacket ($str)
 
 readMainToThreadPacket ()
 
 pushThreadToMainPacket ($str)
 
 readThreadToMainPacket ()
 
 shutdownHandler ()
 
 errorHandler ($errno, $errstr, $errfile, $errline, $context, $trace=null)
 
 getTrace ($start=1, $trace=null)
 
 cleanPath ($path)
 
 run ()
 
- Public Member Functions inherited from Thread
 getCreatorId ()
 
 getThreadId ()
 
 isJoined ()
 
 isStarted ()
 
 join ()
 
 start (int $options=PTHREADS_INHERIT_ALL)
 
- Public Member Functions inherited from Threaded
 chunk ($size, bool $preserve=false)
 
 count ()
 
 isRunning ()
 
 isTerminated ()
 
 merge ($from, $overwrite=true)
 
 notify ()
 
 notifyOne ()
 
 offsetGet ($offset)
 
 offsetSet ($offset, $value)
 
 offsetExists ($offset)
 
 offsetUnset ($offset)
 
 pop ()
 
 run ()
 
 shift ()
 
 synchronized (\Closure $function, $args=null)
 
 wait ($timeout)
 
 getRefCount ()
 
 addRef ()
 
 delRef ()
 
 isGarbage ()
 

Data Fields

 $loadPaths
 

Protected Member Functions

 addDependency (array &$loadPaths, \ReflectionClass $dep)
 

Protected Attributes

 $port
 
 $interface
 
 $logger
 
 $loader
 
 $shutdown
 
 $externalQueue
 
 $internalQueue
 
 $mainPath
 

Additional Inherited Members

- Static Public Member Functions inherited from Thread
static getCurrentThread ()
 
static getCurrentThreadId ()
 
- Static Public Member Functions inherited from Threaded
static extend ($obj)
 

Constructor & Destructor Documentation

◆ __construct()

__construct ( \ThreadedLogger  $logger,
\ClassLoader  $loader,
  $port,
  $interface = "0.0.0.0" 
)
Parameters
\ThreadedLogger$logger
\ClassLoader$loader
int$port
string$interface
Exceptions
45  {
46  $this->port = (int) $port;
47  if($port < 1 or $port > 65536){
48  throw new \Exception("Invalid port range");
49  }
50 
51  $this->interface = $interface;
52  $this->logger = $logger;
53  $this->loader = $loader;
54  $loadPaths = [];
55  $this->addDependency($loadPaths, new \ReflectionClass($logger));
56  $this->addDependency($loadPaths, new \ReflectionClass($loader));
57  $this->loadPaths = array_reverse($loadPaths);
58  $this->shutdown = false;
59 
60  $this->externalQueue = new \Threaded;
61  $this->internalQueue = new \Threaded;
62 
63  if(\Phar::running(true) !== ""){
64  $this->mainPath = \Phar::running(true);
65  }else{
66  $this->mainPath = \getcwd() . DIRECTORY_SEPARATOR;
67  }
68  $this->start();
69  }

Member Function Documentation

◆ addDependency()

addDependency ( array &  $loadPaths,
\ReflectionClass  $dep 
)
protected
71  {
72  if($dep->getFileName() !== false){
73  $loadPaths[$dep->getName()] = $dep->getFileName();
74  }
75 
76  if($dep->getParentClass() instanceof \ReflectionClass){
77  $this->addDependency($loadPaths, $dep->getParentClass());
78  }
79 
80  foreach($dep->getInterfaces() as $interface){
82  }
83  }

◆ cleanPath()

cleanPath (   $path)
211  {
212  return rtrim(str_replace(["\\", ".php", "phar://", rtrim(str_replace(["\\", "phar://"], ["/", ""], $this->mainPath), "/")], ["/", "", "", ""], $path), "/");
213  }

◆ errorHandler()

errorHandler (   $errno,
  $errstr,
  $errfile,
  $errline,
  $context,
  $trace = null 
)
144  {
145  if(error_reporting() === 0){
146  return false;
147  }
148  $errorConversion = [
149  E_ERROR => "E_ERROR",
150  E_WARNING => "E_WARNING",
151  E_PARSE => "E_PARSE",
152  E_NOTICE => "E_NOTICE",
153  E_CORE_ERROR => "E_CORE_ERROR",
154  E_CORE_WARNING => "E_CORE_WARNING",
155  E_COMPILE_ERROR => "E_COMPILE_ERROR",
156  E_COMPILE_WARNING => "E_COMPILE_WARNING",
157  E_USER_ERROR => "E_USER_ERROR",
158  E_USER_WARNING => "E_USER_WARNING",
159  E_USER_NOTICE => "E_USER_NOTICE",
160  E_STRICT => "E_STRICT",
161  E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR",
162  E_DEPRECATED => "E_DEPRECATED",
163  E_USER_DEPRECATED => "E_USER_DEPRECATED",
164  ];
165  $errno = isset($errorConversion[$errno]) ? $errorConversion[$errno] : $errno;
166  if(($pos = strpos($errstr, "\n")) !== false){
167  $errstr = substr($errstr, 0, $pos);
168  }
169 
170  $errfile = $this->cleanPath($errfile);
171 
172  $this->getLogger()->debug("An $errno error happened: \"$errstr\" in \"$errfile\" at line $errline");
173 
174  foreach(($trace = $this->getTrace($trace === null ? 3 : 0, $trace)) as $i => $line){
175  $this->getLogger()->debug($line);
176  }
177 
178  return true;
179  }

◆ getExternalQueue()

getExternalQueue ( )
Returns
111  {
112  return $this->externalQueue;
113  }

◆ getInterface()

getInterface ( )
97  {
98  return $this->interface;
99  }

◆ getInternalQueue()

getInternalQueue ( )
Returns
118  {
119  return $this->internalQueue;
120  }

◆ getLogger()

getLogger ( )
Returns
104  {
105  return $this->logger;
106  }

◆ getPort()

getPort ( )
93  {
94  return $this->port;
95  }

◆ getTrace()

getTrace (   $start = 1,
  $trace = null 
)
181  {
182  if($trace === null){
183  if(function_exists("xdebug_get_function_stack")){
184  $trace = array_reverse(xdebug_get_function_stack());
185  }else{
186  $e = new \Exception();
187  $trace = $e->getTrace();
188  }
189  }
190 
191  $messages = [];
192  $j = 0;
193  for($i = (int) $start; isset($trace[$i]); ++$i, ++$j){
194  $params = "";
195  if(isset($trace[$i]["args"]) or isset($trace[$i]["params"])){
196  if(isset($trace[$i]["args"])){
197  $args = $trace[$i]["args"];
198  }else{
199  $args = $trace[$i]["params"];
200  }
201  foreach($args as $name => $value){
202  $params .= (is_object($value) ? get_class($value) . " " . (method_exists($value, "__toString") ? $value->__toString() : "object") : gettype($value) . " " . @strval($value)) . ", ";
203  }
204  }
205  $messages[] = "#$j " . (isset($trace[$i]["file"]) ? $this->cleanPath($trace[$i]["file"]) : "") . "(" . (isset($trace[$i]["line"]) ? $trace[$i]["line"] : "") . "): " . (isset($trace[$i]["class"]) ? $trace[$i]["class"] . (($trace[$i]["type"] === "dynamic" or $trace[$i]["type"] === "->") ? "->" : "::") : "") . $trace[$i]["function"] . "(" . substr($params, 0, -2) . ")";
206  }
207 
208  return $messages;
209  }

◆ isShutdown()

isShutdown ( )
85  {
86  return $this->shutdown === true;
87  }

◆ pushMainToThreadPacket()

pushMainToThreadPacket (   $str)
122  {
123  $this->internalQueue[] = $str;
124  }

◆ pushThreadToMainPacket()

pushThreadToMainPacket (   $str)
130  {
131  $this->externalQueue[] = $str;
132  }

◆ readMainToThreadPacket()

readMainToThreadPacket ( )
126  {
127  return $this->internalQueue->shift();
128  }

◆ readThreadToMainPacket()

readThreadToMainPacket ( )
134  {
135  return $this->externalQueue->shift();
136  }

◆ run()

run ( )
215  {
216  try{
217  //Load removed dependencies, can't use require_once()
218  foreach($this->loadPaths as $name => $path){
219  if(!class_exists($name, false) and !interface_exists($name, false)){
220  require($path);
221  }
222  }
223  $this->loader->register(true);
224 
225  gc_enable();
226  error_reporting(-1);
227  ini_set("display_errors", 1);
228  ini_set("display_startup_errors", 1);
229 
230  set_error_handler([$this, "errorHandler"], E_ALL);
231  register_shutdown_function([$this, "shutdownHandler"]);
232 
233 
234  $socket = new UDPServerSocket($this->getLogger(), $this->port, $this->interface);
235  new SessionManager($this, $socket);
236  }catch(\Throwable $e){
237  $this->logger->logException($e);
238  }
239  }

◆ shutdown()

shutdown ( )
89  {
90  $this->shutdown = true;
91  }

◆ shutdownHandler()

shutdownHandler ( )
138  {
139  if($this->shutdown !== true){
140  $this->getLogger()->emergency("RakLib crashed!");
141  }
142  }

Field Documentation

◆ $externalQueue

$externalQueue
protected

◆ $interface

$interface
protected

◆ $internalQueue

$internalQueue
protected

◆ $loader

$loader
protected

◆ $loadPaths

$loadPaths

◆ $logger

$logger
protected

◆ $mainPath

$mainPath
protected

◆ $port

$port
protected

◆ $shutdown

$shutdown
protected

The documentation for this class was generated from the following file: