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