2016-01-20 12:01:40 +01:00
|
|
|
<?php
|
|
|
|
|
2016-05-26 17:05:17 +02:00
|
|
|
namespace Interop\Async\Loop;
|
2016-01-20 12:01:40 +01:00
|
|
|
|
2016-05-26 17:05:17 +02:00
|
|
|
interface Driver
|
2016-01-20 12:01:40 +01:00
|
|
|
{
|
2016-02-17 16:25:39 +01:00
|
|
|
/**
|
2016-03-14 11:56:31 +01:00
|
|
|
* Start the event loop.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-20 12:49:31 +02:00
|
|
|
* The loop MUST continue to run until it is either stopped explicitly, no referenced watchers exist anymore, or an
|
|
|
|
* exception is thrown that cannot be handled. Exceptions that cannot be handled are exceptions thrown from an
|
2016-05-22 19:36:13 +02:00
|
|
|
* error handler or exceptions that would be passed to an error handler but none exists to handle them.
|
2016-05-20 12:49:31 +02:00
|
|
|
*
|
2016-02-17 16:25:39 +01:00
|
|
|
* @return void
|
|
|
|
*/
|
2016-03-14 11:56:31 +01:00
|
|
|
public function run();
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-03-14 11:56:31 +01:00
|
|
|
* Stop the event loop.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-20 12:49:31 +02:00
|
|
|
* When an event loop is stopped, it continues with its current tick and exits the loop afterwards. Multiple calls
|
|
|
|
* to stop MUST be ignored and MUST NOT raise an exception.
|
|
|
|
*
|
2016-02-17 16:25:39 +01:00
|
|
|
* @return void
|
|
|
|
*/
|
2016-03-01 01:52:59 +01:00
|
|
|
public function stop();
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-03-14 11:56:31 +01:00
|
|
|
* Defer the execution of a callback.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-06-07 01:44:28 +02:00
|
|
|
* The deferred callable MUST be executed in the next tick of the event loop and before any other type of watcher. Order of enabling MUST be preserved when executing the callbacks.
|
2016-05-20 12:49:31 +02:00
|
|
|
*
|
2016-06-02 19:15:52 +02:00
|
|
|
* @param callable(string $watcherId, mixed $data) $callback The callback to defer. The $watcherId will be invalidated before the callback call.
|
2016-05-15 00:13:35 +02:00
|
|
|
* @param mixed $data Arbitrary data given to the callback function as the $data parameter.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-28 15:57:07 +02:00
|
|
|
* @return string An unique identifier that can be used to cancel, enable or disable the watcher.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-15 00:13:35 +02:00
|
|
|
public function defer(callable $callback, $data = null);
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-20 12:49:31 +02:00
|
|
|
* Delay the execution of a callback.
|
|
|
|
*
|
2016-06-07 01:44:28 +02:00
|
|
|
* The delay is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which timers expire first and secondarily the order of enabling.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-12 12:28:46 +02:00
|
|
|
* @param int $delay The amount of time, in milliseconds, to delay the execution for.
|
2016-06-02 19:15:52 +02:00
|
|
|
* @param callable(string $watcherId, mixed $data) $callback The callback to delay. The $watcherId will be invalidated before the callback call.
|
2016-05-15 00:13:35 +02:00
|
|
|
* @param mixed $data Arbitrary data given to the callback function as the $data parameter.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-28 15:57:07 +02:00
|
|
|
* @return string An unique identifier that can be used to cancel, enable or disable the watcher.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-22 18:07:21 +02:00
|
|
|
public function delay($delay, callable $callback, $data = null);
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-20 12:49:31 +02:00
|
|
|
* Repeatedly execute a callback.
|
|
|
|
*
|
2016-06-07 01:44:28 +02:00
|
|
|
* The interval between executions is a minimum and approximate, accuracy is not guaranteed. Order of calls MUST be determined by which timers expire first and secondarily the order of enabling.
|
2016-05-23 20:29:10 +02:00
|
|
|
* The first execution is scheduled after the first interval period.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-12 12:28:46 +02:00
|
|
|
* @param int $interval The time interval, in milliseconds, to wait between executions.
|
2016-05-22 18:07:21 +02:00
|
|
|
* @param callable(string $watcherId, mixed $data) $callback The callback to repeat.
|
2016-05-15 00:13:35 +02:00
|
|
|
* @param mixed $data Arbitrary data given to the callback function as the $data parameter.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-28 15:57:07 +02:00
|
|
|
* @return string An unique identifier that can be used to cancel, enable or disable the watcher.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-22 18:07:21 +02:00
|
|
|
public function repeat($interval, callable $callback, $data = null);
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-03-14 11:56:31 +01:00
|
|
|
* Execute a callback when a stream resource becomes readable.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-06-07 01:44:28 +02:00
|
|
|
* In case of multiple watchers on a same stream, order of enabling MUST be preserved when executing the callbacks.
|
2016-06-04 18:27:30 +02:00
|
|
|
*
|
2016-03-14 11:56:31 +01:00
|
|
|
* @param resource $stream The stream to monitor.
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute.
|
2016-05-15 00:13:35 +02:00
|
|
|
* @param mixed $data Arbitrary data given to the callback function as the $data parameter.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-28 15:57:07 +02:00
|
|
|
* @return string An unique identifier that can be used to cancel, enable or disable the watcher.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-15 00:13:35 +02:00
|
|
|
public function onReadable($stream, callable $callback, $data = null);
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-03-14 11:56:31 +01:00
|
|
|
* Execute a callback when a stream resource becomes writable.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-06-07 01:44:28 +02:00
|
|
|
* In case of multiple watchers on a same stream, order of enabling MUST be preserved when executing the callbacks.
|
2016-06-04 18:27:30 +02:00
|
|
|
*
|
2016-03-14 11:56:31 +01:00
|
|
|
* @param resource $stream The stream to monitor.
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param callable(string $watcherId, resource $stream, mixed $data) $callback The callback to execute.
|
2016-05-15 00:13:35 +02:00
|
|
|
* @param mixed $data Arbitrary data given to the callback function as the $data parameter.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-28 15:57:07 +02:00
|
|
|
* @return string An unique identifier that can be used to cancel, enable or disable the watcher.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-15 00:13:35 +02:00
|
|
|
public function onWritable($stream, callable $callback, $data = null);
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-03-14 11:56:31 +01:00
|
|
|
* Execute a callback when a signal is received.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-06-07 01:44:28 +02:00
|
|
|
* In case of multiple watchers on a same signal, order of enabling MUST be preserved when executing the callbacks.
|
2016-06-04 18:27:30 +02:00
|
|
|
*
|
2016-03-14 11:56:31 +01:00
|
|
|
* @param int $signo The signal number to monitor.
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param callable(string $watcherId, int $signo, mixed $data) $callback The callback to execute.
|
2016-05-15 00:13:35 +02:00
|
|
|
* @param mixed $data Arbitrary data given to the callback function as the $data parameter.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-28 15:57:07 +02:00
|
|
|
* @return string An unique identifier that can be used to cancel, enable or disable the watcher.
|
2016-05-26 17:43:03 +02:00
|
|
|
*
|
|
|
|
* @throws UnsupportedFeatureException Thrown if signal handling is not supported.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-15 00:13:35 +02:00
|
|
|
public function onSignal($signo, callable $callback, $data = null);
|
2016-02-17 16:25:39 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-15 00:19:05 +02:00
|
|
|
* Enable a watcher.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param string $watcherId The watcher identifier.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-03-01 01:52:59 +01:00
|
|
|
* @return void
|
2016-05-28 15:57:07 +02:00
|
|
|
*
|
|
|
|
* @throws InvalidWatcherException Thrown if the watcher identifier is invalid.
|
2016-02-17 16:25:39 +01:00
|
|
|
*/
|
2016-05-19 17:21:26 +02:00
|
|
|
public function enable($watcherId);
|
2016-03-01 01:52:59 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-26 19:36:56 +02:00
|
|
|
* Disable a watcher. Disabling a watcher MUST NOT invalidate the watcher.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param string $watcherId The watcher identifier.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-03-01 01:52:59 +01:00
|
|
|
* @return void
|
2016-05-28 15:57:07 +02:00
|
|
|
*
|
|
|
|
* @throws InvalidWatcherException Thrown if the watcher identifier is invalid.
|
2016-03-01 01:52:59 +01:00
|
|
|
*/
|
2016-05-19 17:21:26 +02:00
|
|
|
public function disable($watcherId);
|
2016-03-01 01:52:59 +01:00
|
|
|
|
|
|
|
/**
|
2016-06-06 22:37:17 +02:00
|
|
|
* Cancel a watcher. This will detatch the event loop from all resources that are associated to the watcher. After this
|
|
|
|
* operation the watcher is permanently invalid. Calling this function MUST never fail, even when passed an invalid
|
|
|
|
* watcher.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param string $watcherId The watcher identifier.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-03-01 01:52:59 +01:00
|
|
|
* @return void
|
|
|
|
*/
|
2016-05-19 17:21:26 +02:00
|
|
|
public function cancel($watcherId);
|
2016-03-23 10:47:18 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-15 00:19:05 +02:00
|
|
|
* Reference a watcher.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-20 12:49:31 +02:00
|
|
|
* This will keep the event loop alive whilst the watcher is still being monitored. Watchers have this state by
|
|
|
|
* default.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param string $watcherId The watcher identifier.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-03-23 10:47:18 +01:00
|
|
|
* @return void
|
2016-05-28 15:57:07 +02:00
|
|
|
*
|
|
|
|
* @throws InvalidWatcherException Thrown if the watcher identifier is invalid.
|
2016-03-23 10:47:18 +01:00
|
|
|
*/
|
2016-05-19 17:21:26 +02:00
|
|
|
public function reference($watcherId);
|
2016-03-23 10:47:18 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-15 00:19:05 +02:00
|
|
|
* Unreference a watcher.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-20 12:49:31 +02:00
|
|
|
* The event loop should exit the run method when only unreferenced watchers are still being monitored. Watchers
|
|
|
|
* are all referenced by default.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-05-19 17:21:26 +02:00
|
|
|
* @param string $watcherId The watcher identifier.
|
2016-05-12 17:57:02 +02:00
|
|
|
*
|
2016-03-23 10:47:18 +01:00
|
|
|
* @return void
|
2016-05-28 15:57:07 +02:00
|
|
|
*
|
|
|
|
* @throws InvalidWatcherException Thrown if the watcher identifier is invalid.
|
2016-03-23 10:47:18 +01:00
|
|
|
*/
|
2016-05-19 17:21:26 +02:00
|
|
|
public function unreference($watcherId);
|
2016-05-27 17:45:45 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Stores information in the loop bound registry. This can be used to store loop bound information. Stored
|
|
|
|
* information is package private. Packages MUST NOT retrieve the stored state of other packages.
|
|
|
|
*
|
|
|
|
* Therefore packages SHOULD use the following prefix to keys: `vendor.package.`
|
|
|
|
*
|
|
|
|
* @param string $key namespaced storage key
|
|
|
|
* @param mixed $value the value to be stored
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function storeState($key, $value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fetches information stored bound to the loop. Stored information is package private. Packages MUST NOT retrieve
|
|
|
|
* the stored state of other packages.
|
|
|
|
*
|
|
|
|
* Therefore packages SHOULD use the following prefix to keys: `vendor.package.`
|
|
|
|
*
|
|
|
|
* @param string $key namespaced storage key
|
|
|
|
*
|
|
|
|
* @return mixed previously stored value or null if it doesn't exist
|
|
|
|
*/
|
|
|
|
public function fetchState($key);
|
2016-05-13 23:41:54 +02:00
|
|
|
|
2016-05-18 13:12:42 +02:00
|
|
|
/**
|
|
|
|
* Set a callback to be executed when an error occurs.
|
|
|
|
*
|
|
|
|
* Subsequent calls to this method will overwrite the previous handler.
|
|
|
|
*
|
|
|
|
* @param callable(\Throwable|\Exception $error)|null $callback The callback to execute; null will clear the current handler.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function setErrorHandler(callable $callback = null);
|
|
|
|
|
2016-05-21 11:00:01 +02:00
|
|
|
/**
|
|
|
|
* Retrieve an associative array of information about the event loop driver.
|
|
|
|
*
|
|
|
|
* The returned array MUST contain the following data describing the driver's
|
|
|
|
* currently registered watchers:
|
|
|
|
*
|
|
|
|
* [
|
|
|
|
* "defer" => ["enabled" => int, "disabled" => int],
|
|
|
|
* "delay" => ["enabled" => int, "disabled" => int],
|
|
|
|
* "repeat" => ["enabled" => int, "disabled" => int],
|
|
|
|
* "on_readable" => ["enabled" => int, "disabled" => int],
|
|
|
|
* "on_writable" => ["enabled" => int, "disabled" => int],
|
|
|
|
* "on_signal" => ["enabled" => int, "disabled" => int],
|
2016-05-21 19:49:04 +02:00
|
|
|
* "watchers" => ["referenced" => int, "unreferenced" => int],
|
2016-05-21 11:00:01 +02:00
|
|
|
* ];
|
|
|
|
*
|
|
|
|
* Implementations MAY optionally add more information in the array but
|
|
|
|
* at minimum the above key => value format MUST always be provided.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function info();
|
|
|
|
|
2016-05-19 01:12:56 +02:00
|
|
|
/**
|
|
|
|
* Get the underlying loop handle.
|
|
|
|
*
|
|
|
|
* Example: the uv_loop resource for libuv or the EvLoop object for libev or null for a native driver
|
|
|
|
*
|
2016-05-21 01:31:18 +02:00
|
|
|
* Note: This function is *not* exposed in the Loop class; users shall access it directly on the respective loop instance.
|
|
|
|
*
|
2016-05-19 01:12:56 +02:00
|
|
|
* @return null|object|resource The loop handle the event loop operates on. Null if there is none.
|
|
|
|
*/
|
2016-05-22 15:47:34 +02:00
|
|
|
public function getHandle();
|
2016-01-20 12:01:40 +01:00
|
|
|
}
|