Added MultiStreamChannel to handle multiple endpoints
This commit is contained in:
67
src/Interop/Channel/MultiStreamChannel.php
Normal file
67
src/Interop/Channel/MultiStreamChannel.php
Normal file
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace NoccyLabs\Ipc\Interop\Channel;
|
||||
|
||||
/**
|
||||
* The MultiChannel is used to create a single channel and allow other threads
|
||||
* to each grab an end of it. Think for example a web server that could write
|
||||
* log output to a channel (as it´the MultiStreamChannel is always open); one
|
||||
* thread could grab a channel to dump it to the console, and another thread
|
||||
* could write to a logfile.
|
||||
*/
|
||||
class MultiStreamChannel implements ChannelInterface
|
||||
{
|
||||
|
||||
protected $clients = [];
|
||||
|
||||
/**
|
||||
* Create a new client to receive data sent to the channel
|
||||
*
|
||||
* @return StreamChannel
|
||||
*/
|
||||
public function createClient(): StreamChannel
|
||||
{
|
||||
[ $a, $b ] = StreamChannel::createPair();
|
||||
$this->clients[] = $a;
|
||||
return $b;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isOpen(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @param mixed $data
|
||||
* @return void
|
||||
*/
|
||||
public function send($data)
|
||||
{
|
||||
foreach ($this->clients as $client) {
|
||||
$client->send($data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function receive()
|
||||
{
|
||||
foreach ($this->clients as $client) {
|
||||
if ($read = $client->receive()) {
|
||||
return $read;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user