IPC improvements
This commit is contained in:
parent
1c99fd2658
commit
a3a331542b
@ -20,6 +20,7 @@ namespace danog\MadelineProto;
|
||||
|
||||
use Amp\Promise;
|
||||
use Amp\Success;
|
||||
use danog\MadelineProto\Ipc\Client;
|
||||
use danog\MadelineProto\Ipc\LightState;
|
||||
|
||||
use function Amp\File\open;
|
||||
@ -181,6 +182,9 @@ final class APIWrapper
|
||||
if ($this->API === null && !$this->gettingApiId) {
|
||||
return new Success(false);
|
||||
}
|
||||
if ($this->API instanceof Client) {
|
||||
return new Success(false);
|
||||
}
|
||||
return Tools::callFork((function (): \Generator {
|
||||
if ($this->API) {
|
||||
yield from $this->API->initAsynchronously();
|
||||
|
@ -92,6 +92,9 @@ abstract class AbstractAPIFactory extends AsyncConstruct
|
||||
$a->lua =& $b->lua;
|
||||
$a->async =& $b->async;
|
||||
$a->methods =& $b->methods;
|
||||
if (!$b->inited()) {
|
||||
$a->setInitPromise($b->initAsynchronously());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Enable or disable async.
|
||||
@ -162,7 +165,6 @@ abstract class AbstractAPIFactory extends AsyncConstruct
|
||||
public function __call_async(string $name, array $arguments): \Generator
|
||||
{
|
||||
yield from $this->initAsynchronously();
|
||||
|
||||
$lower_name = \strtolower($name);
|
||||
if ($this->namespace !== '' || !isset($this->methods[$lower_name])) {
|
||||
$name = $this->namespace.$name;
|
||||
|
@ -18,8 +18,8 @@
|
||||
|
||||
namespace danog\MadelineProto\Ipc;
|
||||
|
||||
use danog\MadelineProto\MTProto;
|
||||
use danog\MadelineProto\EventHandler;
|
||||
use danog\MadelineProto\MTProto;
|
||||
|
||||
/**
|
||||
* Light state.
|
||||
@ -33,7 +33,7 @@ final class LightState
|
||||
*
|
||||
* @var null|class-string<EventHandler>
|
||||
*/
|
||||
private ?string $eventHandler;
|
||||
private ?string $eventHandler = null;
|
||||
|
||||
public function __construct(MTProto $API)
|
||||
{
|
||||
|
@ -73,8 +73,12 @@ class Server extends SignalLoop
|
||||
} catch (\Throwable $e) {
|
||||
Logger::log($e);
|
||||
}
|
||||
Logger::log("Starting IPC server $session (web)");
|
||||
WebRunner::start($session);
|
||||
try {
|
||||
Logger::log("Starting IPC server $session (web)");
|
||||
WebRunner::start($session);
|
||||
} catch (\Throwable $e) {
|
||||
Logger::log($e);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Main loop.
|
||||
|
@ -117,7 +117,7 @@ abstract class Serialization
|
||||
return [null, yield Tools::flock($session->getLockPath(), LOCK_EX, 1)];
|
||||
}
|
||||
|
||||
Logger::log('Waiting for exclusive session lock...');
|
||||
//Logger::log('Waiting for exclusive session lock...');
|
||||
$warningId = Loop::delay(1000, static function () use (&$warningId) {
|
||||
Logger::log("It seems like the session is busy.");
|
||||
if (\defined(\MADELINE_WORKER::class)) {
|
||||
@ -143,19 +143,21 @@ abstract class Serialization
|
||||
$canContinue = false;
|
||||
$cancelFlock->cancel();
|
||||
}
|
||||
} else {
|
||||
$lightState = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
Loop::cancel($warningId);
|
||||
|
||||
if (!$unlock) { // Canceled, don't have lock
|
||||
return [yield $ipcSocket, null];
|
||||
return $ipcSocket;
|
||||
}
|
||||
if (!$canContinue) { // Canceled, but have lock already
|
||||
if (!$canContinue) { // Have lock, can't use it
|
||||
Logger::log("IPC WARNING: Session has event handler, but it's not started, and we don't have access to the class, so we can't start it.", Logger::ERROR);
|
||||
Logger::log("IPC WARNING: Please start the event handler or unset it to use the IPC server.", Logger::ERROR);
|
||||
$unlock();
|
||||
return [yield $ipcSocket, null];
|
||||
return $ipcSocket;
|
||||
}
|
||||
|
||||
try {
|
||||
@ -169,9 +171,11 @@ abstract class Serialization
|
||||
// Unlock and fork
|
||||
$unlock();
|
||||
Server::startMe($session);
|
||||
return [$ipcSocket ?? yield from self::tryConnect($session->getIpcPath()), null];
|
||||
return $ipcSocket ?? yield from self::tryConnect($session->getIpcPath());
|
||||
} elseif (!\class_exists($class)) {
|
||||
return [$ipcSocket ?? yield from self::tryConnect($session->getIpcPath()), null];
|
||||
Logger::log("IPC WARNING: Session has event handler, but it's not started, and we don't have access to the class, so we can't start it.", Logger::ERROR);
|
||||
Logger::log("IPC WARNING: Please start the event handler or unset it to use the IPC server.", Logger::ERROR);
|
||||
return $ipcSocket ?? yield from self::tryConnect($session->getIpcPath());
|
||||
}
|
||||
}
|
||||
|
||||
@ -185,7 +189,7 @@ abstract class Serialization
|
||||
if ($isNew) {
|
||||
$unserialized = yield from self::newUnserialize($session->getSessionPath());
|
||||
} else {
|
||||
$unserialized = yield from self::legacyUnserialize($session);
|
||||
$unserialized = yield from self::legacyUnserialize($session->getLegacySessionPath());
|
||||
}
|
||||
|
||||
if ($unserialized === false) {
|
||||
@ -214,7 +218,7 @@ abstract class Serialization
|
||||
if ($cancel) {
|
||||
$cancel->cancel();
|
||||
}
|
||||
return $socket;
|
||||
return [$socket, null];
|
||||
} catch (\Throwable $e) {
|
||||
$e = $e->getMessage();
|
||||
Logger::log("$e while connecting to IPC socket");
|
||||
@ -247,12 +251,12 @@ abstract class Serialization
|
||||
/**
|
||||
* Deserialize legacy session.
|
||||
*
|
||||
* @param SessionPaths $session
|
||||
* @param string $session
|
||||
* @return \Generator
|
||||
*/
|
||||
private static function legacyUnserialize(SessionPaths $session): \Generator
|
||||
private static function legacyUnserialize(string $session): \Generator
|
||||
{
|
||||
$tounserialize = yield get($session->getLegacySessionPath());
|
||||
$tounserialize = yield get($session);
|
||||
|
||||
try {
|
||||
$unserialized = \unserialize($tounserialize);
|
||||
|
@ -582,9 +582,11 @@ abstract class Tools extends StrTools
|
||||
Tools::callFork($failureCb());
|
||||
$failureCb = null;
|
||||
}
|
||||
if ($token->isRequested()) {
|
||||
return null;
|
||||
}
|
||||
yield self::sleep($polling);
|
||||
if ($token->isRequested()) {
|
||||
var_dump("was requested pap");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user