Skip to content

Commit 37c1363

Browse files
committed
Merge pull request #21 from clue-labs/unexpected
Emit "error" event for unexpected response messages
2 parents 4f33e56 + 5ba53f7 commit 37c1363

4 files changed

Lines changed: 51 additions & 2 deletions

File tree

src/Client.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use UnexpectedValueException;
1313
use Clue\React\Ami\Protocol\Message;
1414
use Clue\React\Ami\Protocol\ErrorException;
15+
use Clue\React\Ami\Protocol\UnexpectedMessageException;
1516

1617
class Client extends EventEmitter
1718
{
@@ -66,6 +67,7 @@ public function request(Action $message)
6667
return $deferred->promise();
6768
}
6869

70+
/** @internal */
6971
public function handleMessage(Message $message)
7072
{
7173
if ($message instanceof Event) {
@@ -74,8 +76,7 @@ public function handleMessage(Message $message)
7476
}
7577
$id = $message->getActionId();
7678
if (!isset($this->pending[$id])) {
77-
var_dump('unexpected', $message);
78-
// unexpected message
79+
$this->emit('error', array(new UnexpectedMessageException($message), $this));
7980
return;
8081
}
8182

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Clue\React\Ami\Protocol;
4+
5+
use UnexpectedValueException;
6+
7+
class UnexpectedMessageException extends UnexpectedValueException
8+
{
9+
private $response;
10+
11+
public function __construct(Response $response)
12+
{
13+
parent::__construct('Unexpected message with action ID "' . $response->getActionId() . '" received');
14+
$this->response = $response;
15+
}
16+
17+
public function getResponse()
18+
{
19+
return $this->response;
20+
}
21+
}

tests/ClientTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use Clue\React\Ami\Protocol\Parser;
55
use Clue\React\Ami\Client;
66
use React\EventLoop\Factory;
7+
use Clue\React\Ami\Protocol\Response;
78

89
class ClientTest extends TestCase
910
{
@@ -32,6 +33,16 @@ public function testParserExceptionForwardsErrorAndClosesClient()
3233
$stream->emit('data', array("invalid chunk\r\n\r\ninvalid chunk\r\n\r\n"));
3334
}
3435

36+
public function testUnexpectedResponseEmitsErrorAndClosesClient()
37+
{
38+
$client = new Client($this->createStreamMock());
39+
40+
$client->on('error', $this->expectCallableOnce());
41+
$client->on('close', $this->expectCallableOnce());
42+
43+
$client->handleMessage(new Response(array('ActionID' => 1)));
44+
}
45+
3546
private function createStreamMock()
3647
{
3748
return new Stream(fopen('php://memory', 'r+'), $this->getMock('React\EventLoop\LoopInterface'));
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
use Clue\React\Ami\Protocol\Response;
4+
use Clue\React\Ami\Protocol\UnexpectedMessageException;
5+
6+
class UnexpectedMessageExceptionTest extends TestCase
7+
{
8+
public function testGetResponse()
9+
{
10+
$response = new Response(array('ActionID' => 1));
11+
12+
$exception = new UnexpectedMessageException($response);
13+
14+
$this->assertSame($response, $exception->getResponse());
15+
}
16+
}

0 commit comments

Comments
 (0)