Add InitialPeers class for manging initial peers
This commit is contained in:
81
include/InitialPeers.php
Normal file
81
include/InitialPeers.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace Arionum;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user