Files
faveo/vendor/itsgoingd/clockwork/Clockwork/Clockwork.php
2023-06-08 18:56:00 +05:30

284 lines
8.0 KiB
PHP

<?php namespace Clockwork;
use Clockwork\Authentication\AuthenticatorInterface;
use Clockwork\Authentication\NullAuthenticator;
use Clockwork\DataSource\DataSourceInterface;
use Clockwork\Helpers\Serializer;
use Clockwork\Request\Log;
use Clockwork\Request\Request;
use Clockwork\Request\RequestType;
use Clockwork\Request\ShouldCollect;
use Clockwork\Request\ShouldRecord;
use Clockwork\Storage\StorageInterface;
use Closure;
// A central class implementing the core flow of the library
class Clockwork
{
// Clockwork library version
const VERSION = '5.1.12';
// Array of data sources, these objects collect metadata for the current application run
protected $dataSources = [];
// Request object, data structure which stores metadata about the current application run
protected $request;
// Storage object, provides implementation for storing and retrieving request objects
protected $storage;
// Authenticator implementation, authenticates requests for clockwork metadata
protected $authenticator;
// An object specifying the rules for collecting requests
protected $shouldCollect;
// An object specifying the rules for recording requests
protected $shouldRecord;
// Create a new Clockwork instance with default request object, a storage implementation has to be additionally set
public function __construct()
{
$this->request = new Request;
$this->authenticator = new NullAuthenticator;
$this->shouldCollect = new ShouldCollect;
$this->shouldRecord = new ShouldRecord;
}
// Add a new data source
public function addDataSource(DataSourceInterface $dataSource)
{
$this->dataSources[] = $dataSource;
return $this;
}
// Resolve the current request, sending it through all data sources, finalizing log and timeline
public function resolveRequest()
{
foreach ($this->dataSources as $dataSource) {
$dataSource->resolve($this->request);
}
$this->request->log()->sort();
$this->request->timeline()->finalize($this->request->time);
return $this;
}
// Resolve the current request as a "command" type request with command-specific data
public function resolveAsCommand($name, $exitCode = null, $arguments = [], $options = [], $argumentsDefaults = [], $optionsDefaults = [], $output = null)
{
$this->resolveRequest();
$this->request->type = RequestType::COMMAND;
$this->request->commandName = $name;
$this->request->commandArguments = $arguments;
$this->request->commandArgumentsDefaults = $argumentsDefaults;
$this->request->commandOptions = $options;
$this->request->commandOptionsDefaults = $optionsDefaults;
$this->request->commandExitCode = $exitCode;
$this->request->commandOutput = $output;
return $this;
}
// Resolve the current request as a "queue-job" type request with queue-job-specific data
public function resolveAsQueueJob($name, $description = null, $status = 'processed', $payload = [], $queue = null, $connection = null, $options = [])
{
$this->resolveRequest();
$this->request->type = RequestType::QUEUE_JOB;
$this->request->jobName = $name;
$this->request->jobDescription = $description;
$this->request->jobStatus = $status;
$this->request->jobPayload = (new Serializer)->normalize($payload);
$this->request->jobQueue = $queue;
$this->request->jobConnection = $connection;
$this->request->jobOptions = (new Serializer)->normalizeEach($options);
return $this;
}
// Resolve the current request as a "test" type request with test-specific data, accepts test name, status, status
// message in case of failure and array of ran asserts
public function resolveAsTest($name, $status = 'passed', $statusMessage = null, $asserts = [])
{
$this->resolveRequest();
$this->request->type = RequestType::TEST;
$this->request->testName = $name;
$this->request->testStatus = $status;
$this->request->testStatusMessage = $statusMessage;
foreach ($asserts as $assert) {
$this->request->addTestAssert($assert['name'], $assert['arguments'], $assert['passed'], $assert['trace']);
}
return $this;
}
// Extends the request with an additional data form all data sources, which is not required for normal use
public function extendRequest(Request $request = null)
{
foreach ($this->dataSources as $dataSource) {
$dataSource->extend($request ?: $this->request);
}
return $this;
}
// Store the current request via configured storage implementation
public function storeRequest()
{
return $this->storage->store($this->request);
}
// Reset all data sources to an empty state, clearing any collected data
public function reset()
{
foreach ($this->dataSources as $dataSource) {
$dataSource->reset();
}
return $this;
}
// Get or set the current request instance
public function request(Request $request = null)
{
if (! $request) return $this->request;
$this->request = $request;
return $this;
}
// Get the log instance for the current request or log a new message
public function log($level = null, $message = null, array $context = [])
{
if ($level) {
return $this->request->log()->log($level, $message, $context);
}
return $this->request->log();
}
// Get the timeline instance for the current request
public function timeline()
{
return $this->request->timeline();
}
// Shortcut to create a new event on the current timeline instance
public function event($description, $data = [])
{
return $this->request->timeline()->event($description, $data);
}
// Configure which requests should be collected, can be called with arrey of options, a custom closure or with no
// arguments for a fluent configuration api
public function shouldCollect($shouldCollect = null)
{
if ($shouldCollect instanceof Closure) return $this->shouldCollect->callback($shouldCollect);
if (is_array($shouldCollect)) return $this->shouldCollect->merge($shouldCollect);
return $this->shouldCollect;
}
// Configure which requests should be recorded, can be called with arrey of options, a custom closure or with no
// arguments for a fluent configuration api
public function shouldRecord($shouldRecord = null)
{
if ($shouldRecord instanceof Closure) return $this->shouldRecord->callback($shouldRecord);
if (is_array($shouldRecord)) return $this->shouldRecord->merge($shouldRecord);
return $this->shouldRecord;
}
// Get or set all data sources at once
public function dataSources($dataSources = null)
{
if (! $dataSources) return $this->dataSources;
$this->dataSources = $dataSources;
return $this;
}
// Get or set a storage implementation
public function storage(StorageInterface $storage = null)
{
if (! $storage) return $this->storage;
$this->storage = $storage;
return $this;
}
// Get or set an authenticator implementation
public function authenticator(AuthenticatorInterface $authenticator = null)
{
if (! $authenticator) return $this->authenticator;
$this->authenticator = $authenticator;
return $this;
}
// Forward any other method calls to the current request and log instances
public function __call($method, $args)
{
if (in_array($method, [ 'emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug' ])) {
return $this->request->log()->$method(...$args);
}
return $this->request->$method(...$args);
}
// DEPRECATED The following apis are deprecated and will be removed in a future version
// Get all added data sources
public function getDataSources()
{
return $this->dataSources;
}
// Get the current request instance
public function getRequest()
{
return $this->request;
}
// Set the current request instance
public function setRequest(Request $request)
{
$this->request = $request;
return $this;
}
// Get a storage implementation
public function getStorage()
{
return $this->storage;
}
// Set a storage implementation
public function setStorage(StorageInterface $storage)
{
$this->storage = $storage;
return $this;
}
// Get an authenticator implementation
public function getAuthenticator()
{
return $this->authenticator;
}
// Set an authenticator implementation
public function setAuthenticator(AuthenticatorInterface $authenticator)
{
$this->authenticator = $authenticator;
return $this;
}
}