Skip to content

Commit 64815f0

Browse files
committed
Initial concept for collecting a list of action response events
1 parent 5897351 commit 64815f0

3 files changed

Lines changed: 145 additions & 0 deletions

File tree

example/peers.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
use Clue\React\Ami\Factory;
4+
use Clue\React\Ami\Client;
5+
use Clue\React\Ami\Api;
6+
use Clue\React\Ami\Collector;
7+
use Clue\React\Ami\Protocol\Collection;
8+
9+
require __DIR__ . '/../vendor/autoload.php';
10+
11+
$loop = React\EventLoop\Factory::create();
12+
$factory = new Factory($loop);
13+
14+
$target = isset($argv[1]) ? $argv[1] : 'name:password@localhost';
15+
16+
$factory->createClient($target)->then(function (Client $client) use ($loop) {
17+
echo 'Successfully connected' . PHP_EOL;
18+
19+
$collector = new Collector($client);
20+
21+
$collector->sipPeers()->then(function (Collection $collection) {
22+
var_dump('result', $collection);
23+
$peers = $collection->getEntryEvents();
24+
25+
echo 'found ' . count($peers) . ' peers' . PHP_EOL;
26+
});
27+
}, 'var_dump');
28+
29+
$loop->run();

src/Collector.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace Clue\React\Ami;
4+
5+
use Clue\React\Ami\Client;
6+
use Clue\React\Ami\Protocol\Response;
7+
use Clue\React\Ami\Protocol\Action;
8+
use UnexpectedValueException;
9+
use Clue\React\Ami\Protocol\Event;
10+
use Clue\React\Ami\Protocol\Collection;
11+
use React\Promise\Deferred;
12+
13+
class Collector
14+
{
15+
private $client;
16+
17+
public function __construct(Client $client)
18+
{
19+
$this->client = $client;
20+
}
21+
22+
public function coreShowChannels()
23+
{
24+
return $this->collectEvents('CoreShowChannels');
25+
}
26+
27+
public function sipPeers()
28+
{
29+
return $this->collectEvents('SIPPeers');
30+
}
31+
32+
public function agents()
33+
{
34+
return $this->collectEvents('Agents');
35+
}
36+
37+
private function collectEvents($command)
38+
{
39+
$req = new Action($command);
40+
$ret = $this->client->request($req);
41+
$id = $req->getActionId();
42+
43+
$deferred = new Deferred();
44+
45+
// collect all intermediary channel events with this action ID
46+
$collected = array();
47+
$collector = function (Event $event) use ($id, &$collected, $deferred) {
48+
if ($event->getActionId() === $id) {
49+
$collected []= $event;
50+
51+
if ($event->getPart('EventList') === 'Complete') {
52+
$deferred->resolve($collected);
53+
}
54+
}
55+
};
56+
$this->client->on('event', $collector);
57+
58+
// unregister collector if client fails
59+
$client = $this->client;
60+
$unregister = function () use ($client, $collector) {
61+
$client->removeListener('event', $collector);
62+
};
63+
$ret->then(null, $unregister);
64+
65+
// stop waiting for events
66+
$deferred->promise()->then($unregister);
67+
68+
return $ret->then(function (Response $response) use ($deferred) {
69+
// final result has been received => merge all intermediary channel events
70+
return $deferred->promise()->then(function ($collected) use ($response) {
71+
$last = array_pop($collected);
72+
return new Collection($response, $collected, $last);
73+
});
74+
});
75+
}
76+
}

src/Protocol/Collection.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Clue\React\Ami\Protocol;
4+
5+
use UnexpectedValueException;
6+
7+
class Collection extends Message
8+
{
9+
private $response;
10+
private $entryEvents;
11+
private $completeEvent;
12+
13+
public function __construct(Response $response, array $entryEvents, Event $completeEvent)
14+
{
15+
// if ($response->getPart('EventItems') !== count($events)) {
16+
// var_dump($response, $events);
17+
// throw new UnexpectedValueException('Expected ' . $response->getPart('EventItems') . ' entries, but collected ' . count($events));
18+
// }
19+
20+
$this->parts = $response->getParts();
21+
$this->response = $response;
22+
$this->entryEvents = $entryEvents;
23+
$this->completeEvent = $completeEvent;
24+
}
25+
26+
public function getResponse()
27+
{
28+
return $this->response;
29+
}
30+
31+
public function getEntryEvents()
32+
{
33+
return $this->entryEvents;
34+
}
35+
36+
public function getCompleteEvent()
37+
{
38+
return $this->completeEvent;
39+
}
40+
}

0 commit comments

Comments
 (0)