diff --git a/lib/private/command/asyncbus.php b/lib/private/command/asyncbus.php index fc9c85acc3fb2a2f89960a44e7a5209705c63523..084842fa6f16e2a94e627d35c4c73775029576c1 100644 --- a/lib/private/command/asyncbus.php +++ b/lib/private/command/asyncbus.php @@ -21,6 +21,13 @@ class AsyncBus implements IBus { */ private $jobList; + /** + * List of traits for command which require sync execution + * + * @var string[] + */ + private $syncTraits = []; + /** * @param \OCP\BackgroundJob\IJobList $jobList */ @@ -34,7 +41,31 @@ class AsyncBus implements IBus { * @param \OCP\Command\ICommand | callable $command */ public function push($command) { - $this->jobList->add($this->getJobClass($command), $this->serializeCommand($command)); + if ($this->canRunAsync($command)) { + $this->jobList->add($this->getJobClass($command), $this->serializeCommand($command)); + } else { + $this->runCommand($command); + } + } + + /** + * Require all commands using a trait to be run synchronous + * + * @param string $trait + */ + public function requireSync($trait) { + $this->syncTraits[] = trim($trait, '\\'); + } + + /** + * @param \OCP\Command\ICommand | callable $command + */ + private function runCommand($command) { + if ($command instanceof ICommand) { + $command->handle(); + } else { + $command(); + } } /** @@ -67,4 +98,30 @@ class AsyncBus implements IBus { throw new \InvalidArgumentException('Invalid command'); } } + + /** + * @param \OCP\Command\ICommand | callable $command + * @return bool + */ + private function canRunAsync($command) { + $traits = $this->getTraits($command); + foreach ($traits as $trait) { + if (array_search($trait, $this->syncTraits) !== false) { + return false; + } + } + return true; + } + + /** + * @param \OCP\Command\ICommand | callable $command + * @return string[] + */ + private function getTraits($command) { + if ($command instanceof ICommand) { + return class_uses($command); + } else { + return []; + } + } } diff --git a/lib/public/command/ibus.php b/lib/public/command/ibus.php index 707f8fd072d342cea368dcc64d88b63a68f3afec..bbb89ee04e6a1b5602dbfc45df489c1a6696deab 100644 --- a/lib/public/command/ibus.php +++ b/lib/public/command/ibus.php @@ -15,4 +15,11 @@ interface IBus { * @param \OCP\Command\ICommand | callable $command */ public function push($command); + + /** + * Require all commands using a trait to be run synchronous + * + * @param string $trait + */ + public function requireSync($trait); }