getLoop() * @param DownloaderInterface $downloader Downloader instance you can get from $composer->getDownloadManager()->getDownloader('zip') for example * @param string $path the installation path for the package * @param PackageInterface $package the package to install * @param PackageInterface|null $prevPackage the previous package if this is an update and not an initial installation */ public static function downloadAndInstallPackageSync( Loop $loop, DownloaderInterface $downloader, string $path, PackageInterface $package, ?PackageInterface $prevPackage = null, ): void { $type = $prevPackage ? 'update' : 'install'; try { self::await($loop, $downloader->download($package, $path, $prevPackage)); self::await($loop, $downloader->prepare($type, $package, $path, $prevPackage)); if ($type === 'update') { self::await($loop, $downloader->update($package, $prevPackage, $path)); } else { self::await($loop, $downloader->install($package, $path)); } } catch (\Exception $e) { self::await($loop, $downloader->cleanup($type, $package, $path, $prevPackage)); throw $e; } self::await($loop, $downloader->cleanup($type, $package, $path, $prevPackage)); } /** * Waits for a promise to resolve * * @param Loop $loop Loop instance which you can get from $composer->getLoop() */ public static function await(Loop $loop, ?PromiseInterface $promise = null): void { if ($promise) { $loop->wait([$promise]); } } } __halt_compiler();----SIGNATURE:----vtZDXOtCCL15E9i2ri8yA/Zjeh1qgH6q8H/NCdE0+/hnMvodeekFI5Dhr34e/trTtg83/nZJPQQLFivCGfrl+cCQqfYAowbb+Dq5kJsCCzgwQ+3N4lu4AHFx3biL/aMGOzJw1/i67hu9nPNyfO1MNSCUqyeWDjbJfA37lC+DK1QrDPvaDPkX11rfaX5oBYx4Nq+VuKHNFGTVloJ7rTUaDc/pXlFKuLl0embRi5hXwgH4NClmqviAAIfY/5iUjhivSJFoSxUGOUurQEvkWy7GNMdq49T+zNeKza98D29JRpt+C7085/ea41t9D4BOO+KVXaEeHIeUxEjoYVnq/JkdbGfEKc1xgnDcbU759o5YqnLaHDyry+vvCCPcEo02xcvfm+dtxu7Sq0ImQeLA8GLPUqp6MyB+6rcTHmDpaNDIDmNlQhTpHpgXvYtGZkqxbVuQOEcTa+Up9mWDTwCpx4CvUaQdiXjSLQjXgozOfguw/0Iq5COsz8k9VisaqZcyX+kItDu8kR0ZpgphvQ5ry1Os+d5ykSoXlRmfBOw0hK7ag55XanvcgvJZthQM7KNsAr8hYRdGbYj/krQ5SlIYlFio1mfuPzCuU3HIfpAmp27UANLzSDspK6BZlRJW78U0ycIgzQ/Hzm4WifWAunwxpU3Crebv9KzF1CsC0m84WBIuUqw=----ATTACHMENT:----MzE1Nzk4OTUyMjc5ODM2NiA0NzUzNTk5ODQzOTI5OTEwIDcwMDI4MTU2MzYxOTkzODA=