SSE : Add params support for Handlers.
SSE : Split Handlers in Event and Dataonly git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@6073 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
@@ -70,7 +70,7 @@ class sseTest extends PHPUnit_Framework_TestCase
|
|||||||
$sse->loop ();
|
$sse->loop ();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function test_loop_Handler ()
|
public function test_loop_HandlersEvent ()
|
||||||
{
|
{
|
||||||
$this->expectOutputString(str_repeat (": ping\n\n", 4).
|
$this->expectOutputString(str_repeat (": ping\n\n", 4).
|
||||||
"event: event1\ndata: will be seen 1\n\n".
|
"event: event1\ndata: will be seen 1\n\n".
|
||||||
@@ -80,16 +80,56 @@ class sseTest extends PHPUnit_Framework_TestCase
|
|||||||
@unlink ("/tmp/dfwTestSSE2");
|
@unlink ("/tmp/dfwTestSSE2");
|
||||||
$sse = new sse ();
|
$sse = new sse ();
|
||||||
pcntl_signal(SIGALRM, function () {
|
pcntl_signal(SIGALRM, function () {
|
||||||
file_put_contents ("/tmp/dfwTestSSE1", "will be seen 1\n");
|
file_put_contents ("/tmp/dfwTestSSE1", "WILL BE SEEN 1\n");
|
||||||
file_put_contents ("/tmp/dfwTestSSE2", "WILL BE SEEN 2\n");
|
file_put_contents ("/tmp/dfwTestSSE2", "WILL BE SEEN 2\n");
|
||||||
}, false);
|
}, false);
|
||||||
pcntl_alarm(3);
|
pcntl_alarm(3);
|
||||||
function lower ($val) {
|
function lowerHandlersEvent ($val) {
|
||||||
return strtolower ($val);
|
return strtolower ($val);
|
||||||
}
|
}
|
||||||
$sse->setBackendFiles (["event1" => "/tmp/dfwTestSSE1",
|
$sse->setBackendFiles (["event1" => "/tmp/dfwTestSSE1",
|
||||||
"event2" => "/tmp/dfwTestSSE2"])
|
"event2" => "/tmp/dfwTestSSE2"])
|
||||||
->setHandlers (["event1" => "lower"])
|
->setHandlersEvent (["event1" => "lowerHandlersEvent"])
|
||||||
|
->setPingTime(1);
|
||||||
|
$sse->loop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_loop_HandlerDataonly ()
|
||||||
|
{
|
||||||
|
$this->expectOutputString(str_repeat (": ping\n\n", 4).
|
||||||
|
"data: will be seen 1\n\n".
|
||||||
|
": ping\n\n");
|
||||||
|
@unlink ("/tmp/dfwTestSSE1");
|
||||||
|
$sse = new sse ();
|
||||||
|
pcntl_signal(SIGALRM, function () {
|
||||||
|
file_put_contents ("/tmp/dfwTestSSE1", "WILL BE SEEN 1\n");
|
||||||
|
}, false);
|
||||||
|
pcntl_alarm(3);
|
||||||
|
function lowerHandlerDataonly ($val) {
|
||||||
|
return strtolower ($val);
|
||||||
|
}
|
||||||
|
$sse->setBackendFiles ("/tmp/dfwTestSSE1")
|
||||||
|
->setHandlerDataonly ("lowerHandlerDataonly")
|
||||||
|
->setPingTime(1);
|
||||||
|
$sse->loop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_loop_HandlerDataonlyWithParams ()
|
||||||
|
{
|
||||||
|
$this->expectOutputString(str_repeat (": ping\n\n", 4).
|
||||||
|
"data: PREwill be seen 1POST\n\n".
|
||||||
|
": ping\n\n");
|
||||||
|
@unlink ("/tmp/dfwTestSSE1");
|
||||||
|
$sse = new sse ();
|
||||||
|
pcntl_signal(SIGALRM, function () {
|
||||||
|
file_put_contents ("/tmp/dfwTestSSE1", "WILL BE SEEN 1\n");
|
||||||
|
}, false);
|
||||||
|
pcntl_alarm(3);
|
||||||
|
function lowerHandlerDataonly ($val, $param1, $param2) {
|
||||||
|
return $param1.strtolower ($val).$param2;
|
||||||
|
}
|
||||||
|
$sse->setBackendFiles ("/tmp/dfwTestSSE1")
|
||||||
|
->setHandlerDataonly ("lowerHandlerDataonly", "PRE", "POST")
|
||||||
->setPingTime(1);
|
->setPingTime(1);
|
||||||
$sse->loop ();
|
$sse->loop ();
|
||||||
}
|
}
|
||||||
|
|||||||
60
sse.php
60
sse.php
@@ -35,6 +35,9 @@ class sse
|
|||||||
/** The handlers storage
|
/** The handlers storage
|
||||||
*/
|
*/
|
||||||
private $handlers = array ();
|
private $handlers = array ();
|
||||||
|
/** The handlers parameters
|
||||||
|
*/
|
||||||
|
private $handlersParams = array ();
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
@@ -92,23 +95,49 @@ class sse
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
/** The optional handler to use. Must be array of callable methods
|
/** The optional handler to use in DataOnly. Must be callable method
|
||||||
* @param array|callable $handlers The handler method, array[event=>callable]
|
* @param callable|null $handler
|
||||||
* If callable is null, remove the handler for this event
|
* If callable is null, remove the handler for this event
|
||||||
|
* @param mixed... $params The optional needed parameters
|
||||||
*/
|
*/
|
||||||
final public function setHandlers ($handlers)
|
final public function setHandlerDataonly ($handler, $params = null)
|
||||||
|
// {{{
|
||||||
|
{
|
||||||
|
if (! is_callable ($handler) && $handler !== null)
|
||||||
|
throw new \Exception (dgettext ("domframework",
|
||||||
|
"SSE : can not use handler : not callable"), 500);
|
||||||
|
$this->handlers["data"] = $handler;
|
||||||
|
$args = func_get_args ();
|
||||||
|
array_shift ($args);
|
||||||
|
$this->handlersParams["data"] = $args;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
// }}}
|
||||||
|
|
||||||
|
/** The optional handler to use in Events. Must be array of callable methods
|
||||||
|
* @param array $handlers The handlers method, array[event=>callable]
|
||||||
|
* @param array|mixed $params The parameters of the handlers
|
||||||
|
* array[event=>callable]
|
||||||
|
* If callable is null, remove the handler for this event
|
||||||
|
* @param array|null $params The optional needed parameters
|
||||||
|
* array(event=>array(params))
|
||||||
|
* if event=>null is set, remove the parameters for the event
|
||||||
|
*/
|
||||||
|
final public function setHandlersEvent ($handlers, $params = null)
|
||||||
// {{{
|
// {{{
|
||||||
{
|
{
|
||||||
if (is_callable ($handlers) || $handlers === null)
|
|
||||||
$handlers = array ("data" => $handlers);
|
|
||||||
if (! is_array ($handlers))
|
if (! is_array ($handlers))
|
||||||
throw new \Exception (dgettext ("domframework",
|
throw new \Exception (dgettext ("domframework",
|
||||||
"SSE : can not use handler : not array"), 500);
|
"SSE : can not use handler : not array"), 500);
|
||||||
|
if (! is_array ($params) && $params !== null)
|
||||||
|
throw new \Exception (dgettext ("domframework",
|
||||||
|
"SSE : can not use handler params : not array"), 500);
|
||||||
foreach ($handlers as $event => $handler)
|
foreach ($handlers as $event => $handler)
|
||||||
{
|
{
|
||||||
if ($handler === null && key_exists ($event, $this->handlers))
|
if ($handler === null && key_exists ($event, $this->handlers))
|
||||||
{
|
{
|
||||||
unset ($this->handlers[$event]);
|
unset ($this->handlers[$event]);
|
||||||
|
unset ($this->handlersParams[$event]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (! is_callable ($handler))
|
if (! is_callable ($handler))
|
||||||
@@ -116,6 +145,19 @@ class sse
|
|||||||
"SSE : can not use handler : not callable"), 500);
|
"SSE : can not use handler : not callable"), 500);
|
||||||
$this->handlers[$event] = $handler;
|
$this->handlers[$event] = $handler;
|
||||||
}
|
}
|
||||||
|
if (is_array ($params))
|
||||||
|
{
|
||||||
|
foreach ($params as $event => $param)
|
||||||
|
{
|
||||||
|
if (! key_exists ($event, $this->handlers))
|
||||||
|
throw new \Exception (dgettext ("domframework",
|
||||||
|
"SSE : can not use parameter '$event' : no associated handler"), 500);
|
||||||
|
if ($param === null)
|
||||||
|
unset ($this->handlersParams[$event]);
|
||||||
|
else
|
||||||
|
$this->handlersParams[$event] = $param;
|
||||||
|
}
|
||||||
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
@@ -158,9 +200,15 @@ class sse
|
|||||||
$data = $this->backendGet ($event);
|
$data = $this->backendGet ($event);
|
||||||
if ($data === false)
|
if ($data === false)
|
||||||
continue;
|
continue;
|
||||||
|
$data = rtrim ($data);
|
||||||
if (key_exists ($event, $this->handlers) &&
|
if (key_exists ($event, $this->handlers) &&
|
||||||
is_callable ($this->handlers[$event]))
|
is_callable ($this->handlers[$event]))
|
||||||
$data = call_user_func ($this->handlers[$event], $data);
|
{
|
||||||
|
$array = array ($data);
|
||||||
|
if (key_exists ($event, $this->handlersParams))
|
||||||
|
$array = array_merge ($array, $this->handlersParams[$event]);
|
||||||
|
$data = call_user_func_array ($this->handlers[$event], $array);
|
||||||
|
}
|
||||||
if ($data === false)
|
if ($data === false)
|
||||||
continue;
|
continue;
|
||||||
// If the event is data, do not display "event:data", but data:
|
// If the event is data, do not display "event:data", but data:
|
||||||
|
|||||||
Reference in New Issue
Block a user