mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2025-01-12 14:51:14 +01:00
157 lines
3.8 KiB
PHP
157 lines
3.8 KiB
PHP
|
<?php
|
||
|
namespace Aws;
|
||
|
|
||
|
use Psr\Http\Message\RequestInterface;
|
||
|
use Aws\Exception\AwsException;
|
||
|
|
||
|
/**
|
||
|
* Represents a history container that is required when using the history
|
||
|
* middleware.
|
||
|
*/
|
||
|
class History implements \Countable, \IteratorAggregate
|
||
|
{
|
||
|
private $maxEntries;
|
||
|
private $entries = array();
|
||
|
|
||
|
/**
|
||
|
* @param int $maxEntries Maximum number of entries to store.
|
||
|
*/
|
||
|
public function __construct($maxEntries = 10)
|
||
|
{
|
||
|
$this->maxEntries = $maxEntries;
|
||
|
}
|
||
|
|
||
|
public function count()
|
||
|
{
|
||
|
return count($this->entries);
|
||
|
}
|
||
|
|
||
|
public function getIterator()
|
||
|
{
|
||
|
return new \ArrayIterator(array_values($this->entries));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the last finished command seen by the history container.
|
||
|
*
|
||
|
* @return CommandInterface
|
||
|
* @throws \LogicException if no commands have been seen.
|
||
|
*/
|
||
|
public function getLastCommand()
|
||
|
{
|
||
|
if (!$this->entries) {
|
||
|
throw new \LogicException('No commands received');
|
||
|
}
|
||
|
|
||
|
return end($this->entries)['command'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the last finished request seen by the history container.
|
||
|
*
|
||
|
* @return RequestInterface
|
||
|
* @throws \LogicException if no requests have been seen.
|
||
|
*/
|
||
|
public function getLastRequest()
|
||
|
{
|
||
|
if (!$this->entries) {
|
||
|
throw new \LogicException('No requests received');
|
||
|
}
|
||
|
|
||
|
return end($this->entries)['request'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the last received result or exception.
|
||
|
*
|
||
|
* @return ResultInterface|AwsException
|
||
|
* @throws \LogicException if no return values have been received.
|
||
|
*/
|
||
|
public function getLastReturn()
|
||
|
{
|
||
|
if (!$this->entries) {
|
||
|
throw new \LogicException('No entries');
|
||
|
}
|
||
|
|
||
|
$last = end($this->entries);
|
||
|
|
||
|
if (isset($last['result'])) {
|
||
|
return $last['result'];
|
||
|
}
|
||
|
|
||
|
if (isset($last['exception'])) {
|
||
|
return $last['exception'];
|
||
|
}
|
||
|
|
||
|
throw new \LogicException('No return value for last entry.');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initiate an entry being added to the history.
|
||
|
*
|
||
|
* @param CommandInterface $cmd Command be executed.
|
||
|
* @param RequestInterface $req Request being sent.
|
||
|
*
|
||
|
* @return string Returns the ticket used to finish the entry.
|
||
|
*/
|
||
|
public function start(CommandInterface $cmd, RequestInterface $req)
|
||
|
{
|
||
|
$ticket = uniqid();
|
||
|
$this->entries[$ticket] = [
|
||
|
'command' => $cmd,
|
||
|
'request' => $req,
|
||
|
'result' => null,
|
||
|
'exception' => null,
|
||
|
];
|
||
|
|
||
|
return $ticket;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Finish adding an entry to the history container.
|
||
|
*
|
||
|
* @param string $ticket Ticket returned from the start call.
|
||
|
* @param mixed $result The result (an exception or AwsResult).
|
||
|
*/
|
||
|
public function finish($ticket, $result)
|
||
|
{
|
||
|
if (!isset($this->entries[$ticket])) {
|
||
|
throw new \InvalidArgumentException('Invalid history ticket');
|
||
|
}
|
||
|
|
||
|
if (isset($this->entries[$ticket]['result'])
|
||
|
|| isset($this->entries[$ticket]['exception'])
|
||
|
) {
|
||
|
throw new \LogicException('History entry is already finished');
|
||
|
}
|
||
|
|
||
|
if ($result instanceof \Exception) {
|
||
|
$this->entries[$ticket]['exception'] = $result;
|
||
|
} else {
|
||
|
$this->entries[$ticket]['result'] = $result;
|
||
|
}
|
||
|
|
||
|
if (count($this->entries) >= $this->maxEntries) {
|
||
|
$this->entries = array_slice($this->entries, -$this->maxEntries, null, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Flush the history
|
||
|
*/
|
||
|
public function clear()
|
||
|
{
|
||
|
$this->entries = [];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts the history to an array.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function toArray()
|
||
|
{
|
||
|
return array_values($this->entries);
|
||
|
}
|
||
|
}
|