82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Arionum\Node;
 | |
| 
 | |
| /**
 | |
|  * Class InitialPeers
 | |
|  */
 | |
| final class InitialPeers
 | |
| {
 | |
|     public const MINIMUM_PEERS_REQUIRED = 2;
 | |
|     public const PRELOAD_ERROR = 'Unable to retrieve peers from the preload list.';
 | |
|     public const PRELOAD_LIST = 'https://www.arionum.com/peers.txt';
 | |
| 
 | |
|     /**
 | |
|      * @var array
 | |
|      */
 | |
|     private $peerList = [];
 | |
| 
 | |
|     /**
 | |
|      * InitialPeers constructor.
 | |
|      * @param array|null $peerList
 | |
|      * @return void
 | |
|      */
 | |
|     public function __construct(?array $peerList = [])
 | |
|     {
 | |
|         $this->peerList = $peerList;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Retrieve a peer from the initial peer list.
 | |
|      * @return string
 | |
|      * @throws Exception
 | |
|      */
 | |
|     public function get(): string
 | |
|     {
 | |
|         if (!$this->peerList || count($this->peerList) < self::MINIMUM_PEERS_REQUIRED) {
 | |
|             $this->retrieveFromPreloadList();
 | |
|         }
 | |
| 
 | |
|         return $this->selectPeer();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Retrieve all available initial peers.
 | |
|      * @return array
 | |
|      * @throws Exception
 | |
|      */
 | |
|     public function getAll(): array
 | |
|     {
 | |
|         if (!$this->peerList || count($this->peerList) < self::MINIMUM_PEERS_REQUIRED) {
 | |
|             $this->retrieveFromPreloadList();
 | |
|         }
 | |
| 
 | |
|         return $this->peerList;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return string
 | |
|      */
 | |
|     private function selectPeer(): string
 | |
|     {
 | |
|         return $this->peerList[array_rand($this->peerList)];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Retrieve a peer from
 | |
|      *
 | |
|      * @return void
 | |
|      * @throws Exception
 | |
|      */
 | |
|     private function retrieveFromPreloadList(): void
 | |
|     {
 | |
|         $peerList = file(self::PRELOAD_LIST, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
 | |
| 
 | |
|         if (!$peerList || count($peerList) < self::MINIMUM_PEERS_REQUIRED) {
 | |
|             throw new Exception(self::PRELOAD_ERROR);
 | |
|         }
 | |
| 
 | |
|         $this->peerList = $peerList;
 | |
|     }
 | |
| }
 | 
