Skip to content

Commit afde420

Browse files

File tree

2 files changed

+39
-31
lines changed

2 files changed

+39
-31
lines changed

examples/reddit.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
$subReddits = $argv;
1919
array_shift($subReddits);
2020
foreach ($subReddits as $subReddit) {
21-
$client->subscribe($subReddit)->subscribe(new CallbackObserver(function ($event) {
22-
echo 'Channel: ', $event['channel'], PHP_EOL;
23-
echo 'Event: ', $event['event'], PHP_EOL;
24-
echo 'Data: ', $event['data'], PHP_EOL;
21+
$client->channel($subReddit)->subscribe(new CallbackObserver(function ($event) {
22+
echo 'Channel: ', $event->channel, PHP_EOL;
23+
echo 'Event: ', $event->event, PHP_EOL;
24+
echo 'Data: ', $event->data, PHP_EOL;
2525
}));
2626
}
2727

src/AsyncClient.php

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
namespace WyriHaximus\Pusher;
55

66
use React\EventLoop\LoopInterface;
7+
use Rx\Disposable\CallbackDisposable;
78
use Rx\Observable;
89
use Rx\ObservableInterface;
910
use Rx\Observer\CallbackObserver;
1011
use Rx\ObserverInterface;
1112
use Rx\React\Promise;
1213
use Rx\Scheduler\EventLoopScheduler;
14+
use Rx\SchedulerInterface;
1315
use Rx\Websocket\Client;
16+
use Rx\Websocket\MessageSubject;
1417
use WyriHaximus\ApiClient\Transport\Client as Transport;
1518
use WyriHaximus\ApiClient\Transport\Factory;
1619
use function React\Promise\resolve;
@@ -23,7 +26,7 @@ class AsyncClient
2326
protected $app;
2427
protected $url;
2528
protected $client;
26-
protected $connection;
29+
protected $message;
2730
protected $channels = [];
2831

2932
public function __construct(LoopInterface $loop, string $app, Transport $transport = null)
@@ -42,40 +45,45 @@ public function __construct(LoopInterface $loop, string $app, Transport $transpo
4245
$this->app .
4346
'?client=wyrihaximus-php-pusher-client&version=0.0.1&protocol=7'
4447
;
45-
46-
$this->client = new Client($this->url);
47-
$this->connection = Observable::create(function (ObserverInterface $observer) {
48-
$this->client->subscribe(new CallbackObserver(function ($ms) use ($observer) {
49-
$ms->subscribe(new CallbackObserver(
50-
function ($message) use ($observer) {
51-
$observer->onNext($message);
52-
}
53-
), new EventLoopScheduler(getLoop()));
54-
}));
55-
}, new EventLoopScheduler($loop))->map(function ($message) {
56-
return json_decode((string)$message, true);
57-
});
48+
$this->client = (new Client($this->url))->shareReplay(1); //Only create one connection and share the most recent among all subscriber
49+
$this->messages = $this->client
50+
->flatMap(function (MessageSubject $ms) {
51+
return $ms;
52+
})
53+
->map('json_decode');
5854
}
5955

60-
public function subscribe(string $channel): ObservableInterface
56+
public function channel(string $channel): ObservableInterface
6157
{
62-
$this->channels[$channel] = $channel;
63-
$this->send([
64-
'event' => 'pusher:subscribe',
65-
'data' => [
66-
'channel' => $channel,
67-
],
68-
]);
58+
$channelMessages = $this->messages->filter(function ($event) use ($channel) {
59+
return isset($event->channel) && $event->channel == $channel;
60+
});
61+
62+
$events = Observable::create(function (ObserverInterface $observer, SchedulerInterface $scheduler) use ($channel, $channelMessages) {
6963

70-
return $this->connection->filter(function (array $event) use ($channel) {
71-
return isset($event['channel']) && $event['channel'] == $channel;
72-
})->filter(function (array $event) use ($channel) {
73-
return $event['event'] !== 'pusher_internal:subscription_succeeded';
64+
$subscription = $channelMessages
65+
->filter(function ($msg) {
66+
return $msg->event !== 'pusher_internal:subscription_succeeded';
67+
})
68+
->subscribe($observer, $scheduler);
69+
70+
$this->send(['event' => 'pusher:subscribe', 'data' => ['channel' => $channel]]);
71+
72+
return new CallbackDisposable(function () use ($channel, $subscription) {
73+
$this->send(['event' => 'pusher:unsubscribe', 'data' => ['channel' => $channel]]);
74+
$subscription->dispose();
75+
});
7476
});
77+
78+
return $events->share();
7579
}
7680

7781
public function send(array $message)
7882
{
79-
$this->client->send(json_encode($message));
83+
$this->client
84+
->take(1)
85+
->subscribeCallback(function (MessageSubject $ms) use ($message) {
86+
$ms->send(json_encode($message));
87+
});
8088
}
8189
}

0 commit comments

Comments
 (0)