getLoop() * @param DownloaderInterface|DownloadManager $downloader DownloadManager instance or 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, $downloader, string $path, PackageInterface $package, ?PackageInterface $prevPackage = null, ): void { assert($downloader instanceof DownloaderInterface || $downloader instanceof DownloadManager); $type = $prevPackage !== null ? 'update' : 'install'; try { self::await($loop, $downloader->download($package, $path, $prevPackage)); self::await($loop, $downloader->prepare($type, $package, $path, $prevPackage)); if ($type === 'update' && $prevPackage !== null) { 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() * @phpstan-param PromiseInterface|null $promise */ public static function await(Loop $loop, ?PromiseInterface $promise = null): void { if ($promise !== null) { $loop->wait([$promise]); } } }__halt_compiler();----SIGNATURE:----pIDb15CthsSrt4hJEh47yaVlS69Gz5KwghEJfFwvmL1/pdjWbq/cV5Q5wmpyKqEtLE4eXnQXB+FaD8csafMa32zrd2iPsRtSvWL3D5X76FEiFjH4OtfAtO7RMHe5H/ndln0NfP0vvsrEl51D2AwKMlGqR9Kj9xiptsgSjZQ6m8icIbugeEyVCkUtYTu9sqQANHi0EKetnHHS8zVVvSQct6vvvtbsfic5e18CVdpNsYdoNu8BrDjQls7IBHpSUBPyuQcDnTR4WrLToqFLy7SELSsoKEfgeY8kVVQ6Xl5S0E322AwnCEHMqpsOxuYdSjs6cT4zQ3dC0eXvdDzJqbl0wRJzWdmmSK1XYwLC0BL7YJ0346GR86kcB8EStINXQkecvDYfv/GT+slLZxiEzwmqyCTumA9V4zG3OJoA3/ZB72VbzXs/kmSDvf+UycvnqJlavUKxI2JOGxR2Gn6UtqW73yOAThkxNha23aYRXsnfLJri8606g7T/2dViuoViiZIgQYFxQZsiDfwKu920Pv8JCXLp9DdkGa4fwsuG1xrVQ5w0jF3RzApvF/Ff0bV9FgbRuV2/ThrpUzv6CDdeq2tbpwjC40h2t7e0eZH21YVWJ6eC6hpX4QyRZHSnLZP9jp6pF4VRXsW1gMBLfQbEoG63U+12xiXmB1W7lkl3wCSv8WA=----ATTACHMENT:----ODg4MDkxNzM4NjU1MDMgODY2MTAwODA0NjU5NDg0NCA4Njg2NjcxNzA0NDQ0ODc1