diff --git a/Tests/sseTest.php b/Tests/sseTest.php index 8bc54c6..2e4b83b 100644 --- a/Tests/sseTest.php +++ b/Tests/sseTest.php @@ -70,7 +70,7 @@ class sseTest extends PHPUnit_Framework_TestCase $sse->loop (); } - public function test_loop_Handler () + public function test_loop_HandlersEvent () { $this->expectOutputString(str_repeat (": ping\n\n", 4). "event: event1\ndata: will be seen 1\n\n". @@ -80,16 +80,56 @@ class sseTest extends PHPUnit_Framework_TestCase @unlink ("/tmp/dfwTestSSE2"); $sse = new sse (); 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"); }, false); pcntl_alarm(3); - function lower ($val) { + function lowerHandlersEvent ($val) { return strtolower ($val); } $sse->setBackendFiles (["event1" => "/tmp/dfwTestSSE1", "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); $sse->loop (); } diff --git a/sse.php b/sse.php index e702f8b..da659d7 100644 --- a/sse.php +++ b/sse.php @@ -35,6 +35,9 @@ class sse /** The handlers storage */ 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 - * @param array|callable $handlers The handler method, array[event=>callable] + /** The optional handler to use in DataOnly. Must be callable method + * @param callable|null $handler * 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)) throw new \Exception (dgettext ("domframework", "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) { if ($handler === null && key_exists ($event, $this->handlers)) { unset ($this->handlers[$event]); + unset ($this->handlersParams[$event]); continue; } if (! is_callable ($handler)) @@ -116,6 +145,19 @@ class sse "SSE : can not use handler : not callable"), 500); $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; } // }}} @@ -158,9 +200,15 @@ class sse $data = $this->backendGet ($event); if ($data === false) continue; + $data = rtrim ($data); if (key_exists ($event, $this->handlers) && 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) continue; // If the event is data, do not display "event:data", but data: