From a6f70dbb76b6690a0dcb780d6da452565e6c5551 Mon Sep 17 00:00:00 2001 From: Christopher Vagnetoft Date: Wed, 21 Feb 2024 22:43:31 +0100 Subject: [PATCH] Added events to GroupManager --- doc/ConnectionGroups.md | 26 +++++++++++++++++++++++++- src/Group/GroupManager.php | 11 ++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/doc/ConnectionGroups.md b/doc/ConnectionGroups.md index 8d096af..a5829df 100644 --- a/doc/ConnectionGroups.md +++ b/doc/ConnectionGroups.md @@ -15,4 +15,28 @@ foreach ($websocket->getGroup() as $other) { To remove a group from a connection, pass `null` to `WebSocketConnection::setGroup()`. -The group will emit a `join` event (`WebSocketConnection::EVENT_JOIN`) when another member joins the group, and a `leave` event (`WebSocketConnection::EVENT_LEAVE`) when a member leaves. The events will be sent to the leaving member as well, so consider this in your logic. +The group will emit a `join` event (`ConnectionGroup::EVENT_JOIN`) when another member joins the group, and a `leave` event (`ConnectionGroup::EVENT_LEAVE`) when a member leaves. The events will be sent to the leaving member as well, so consider this in your logic. + +## Events + +The GroupManager emits events when a group is `created` (`GroupManager::EVENT_CREATED`) or `destroyed` (`GroupManager::EVENT_DESTROYED`). You can use these events to hook the join and leave events. + +```php +// Create a GroupManager +$groupManager = new GroupManager(); +$groupManager->on('created', function (ConnectionGroup $group) { + // Listen for joins + $group->on('join', function (WebSocketConnection $connection) use ($group) { + // Someone joined the group! + $group->write("Someone joined!"); + }) +}); + +// The GroupManager is injected into the WebSocketMiddleware +$middleware = new WebSocketMiddleware($groupManager); +``` + +## Future + +* Add a GroupManagerImplementation so custom logic can be provided. +* Make it possible to reject setting a group by GroupManager not returning a group. diff --git a/src/Group/GroupManager.php b/src/Group/GroupManager.php index 77acf0f..ab9870d 100644 --- a/src/Group/GroupManager.php +++ b/src/Group/GroupManager.php @@ -2,12 +2,19 @@ namespace NoccyLabs\React\WebSocket\Group; +use Evenement\EventEmitterInterface; +use Evenement\EventEmitterTrait; use NoccyLabs\React\WebSocket\WebSocketInterface; use React\EventLoop\Loop; use WeakReference; -class GroupManager +class GroupManager implements EventEmitterInterface { + use EventEmitterTrait; + + const EVENT_CREATED = 'created'; + const EVENT_DESTROYED = 'destroyed'; + /** @var array */ private array $groups = []; @@ -20,11 +27,13 @@ class GroupManager $group->on(ConnectionGroup::EVENT_LEAVE, function () use ($group) { Loop::futureTick(function () use ($group) { if (count($group) === 0) { + $this->emit(self::EVENT_DESTROYED, [ $group ]); $group->removeAllListeners(); unset($this->groups[$group->getName()]); } }); }); + $this->emit(self::EVENT_CREATED, [ $group ]); } else { $group = $this->groups[$name]; }