Skip to content

Commit ced106e

Browse files
committed
Refactored AblyBroadcaster and tests with socketIdObject
1 parent fdac7b0 commit ced106e

File tree

3 files changed

+41
-33
lines changed

3 files changed

+41
-33
lines changed

src/AblyBroadcaster.php

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace Ably\LaravelBroadcaster;
44

5-
use _PHPStan_cb8f9103f\Nette\Neon\Exception;
65
use Ably\AblyRest;
76
use Ably\Exceptions\AblyException;
87
use Ably\Models\Message as AblyMessage;
@@ -169,17 +168,19 @@ public function validAuthenticationResponse($request, $result)
169168
/**
170169
* Broadcast the given event.
171170
*
172-
* @param array $channels
173-
* @param string $event
174-
* @param array $payload
171+
* @param array $channels
172+
* @param string $event
173+
* @param array $payload
175174
* @return void
176175
*
177176
* @throws \Illuminate\Broadcasting\BroadcastException
177+
* @throws \Exception
178178
*/
179179
public function broadcast($channels, $event, $payload = [])
180180
{
181-
$socketIdObject = Utils::decodeSocketId(Arr::pull($payload, 'socket'));
181+
$socketId = Arr::pull($payload, 'socket');
182182
try {
183+
$socketIdObject = Utils::decodeSocketId($socketId);
183184
foreach ($this->formatChannels($channels) as $channel) {
184185
$this->ably->channels->get($channel)->publish(
185186
$this->buildAblyMessage($event, $payload, $socketIdObject)
@@ -314,9 +315,8 @@ public function formatChannels($channels)
314315
*
315316
* @param string $event
316317
* @param array $payload
317-
* @param array|null $socketIdObject
318+
* @param object $socketIdObject
318319
* @return AblyMessage
319-
* @throws Exception
320320
*/
321321
protected function buildAblyMessage($event, $payload = [], $socketIdObject = null)
322322
{
@@ -326,18 +326,8 @@ protected function buildAblyMessage($event, $payload = [], $socketIdObject = nul
326326
});
327327

328328
if ($socketIdObject) {
329-
$connectionKey_key = 'connectionKey';
330-
if (array_key_exists($connectionKey_key, $socketIdObject)) {
331-
$message->connectionKey = $socketIdObject[$connectionKey_key];
332-
} else {
333-
throw new Exception(Utils::missingKeyErrorForSocketId($connectionKey_key));
334-
}
335-
$clientId_key = 'clientId';
336-
if (array_key_exists($clientId_key, $socketIdObject)) {
337-
$message->clientId = $socketIdObject[$clientId_key];
338-
} else {
339-
throw new Exception(Utils::missingKeyErrorForSocketId($clientId_key));
340-
}
329+
$message->connectionKey = $socketIdObject->connectionKey;
330+
$message->clientId = $socketIdObject->clientId;
341331
}
342332
return $message;
343333
}

src/Utils.php

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Ably\LaravelBroadcaster;
44

5+
use Ably\Exceptions\AblyException;
56
use Illuminate\Broadcasting\BroadcastException;
67

78
class Utils
@@ -65,15 +66,28 @@ public static function base64urlEncode($str)
6566
return rtrim(strtr(base64_encode($str), '+/', '-_'), '=');
6667
}
6768

69+
70+
const SOCKET_ID_ERROR = "please make sure to send base64 encoded json with "
71+
."'connectionKey' and 'clientId' as keys. 'clientId' is null if connection is not identified";
72+
73+
/**
74+
* @throws AblyException
75+
*/
6876
public static function decodeSocketId($socketId) {
77+
$socketIdObject = null;
6978
if ($socketId) {
70-
return json_decode(base64_decode($socketId), true);
79+
try {
80+
$socketIdObject = json_decode(base64_decode($socketId));
81+
} catch (\Exception $e) {
82+
throw new AblyException("SocketId decoding failed, ".self::SOCKET_ID_ERROR, 0, $e);
83+
}
84+
if (!isset($socketIdObject->connectionKey)) {
85+
throw new AblyException("ConnectionKey is missing, ".self::SOCKET_ID_ERROR);
86+
}
87+
if (!isset($socketIdObject->clientId)) {
88+
throw new AblyException("ClientId is missing, ".self::SOCKET_ID_ERROR);
89+
}
7190
}
72-
return null;
73-
}
74-
75-
public static function missingKeyErrorForSocketId($keyName) {
76-
return $keyName." not present in socketId, please make sure to send base64 encoded json with "
77-
."connectionKey and clientId as keys. clientId is null if connection is not identified.";
91+
return $socketIdObject;
7892
}
7993
}

tests/AblyBroadcasterTest.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -347,25 +347,29 @@ public function testPayloadShouldNotIncludeSocketKey()
347347
// self::assertArrayNotHasKey('socket', $message->data);
348348

349349
}
350-
public function testBuildMessageUsingProvidedSocketIdObject()
350+
public function testBuildMessageBasedOnSocketIdObject()
351351
{
352352
$broadcaster = m::mock(AblyBroadcasterExposed::class, [$this->ably, []])->makePartial();
353353

354354
$payload = [
355355
'foo' => 'bar',
356356
'chat' => 'hello there'
357357
];
358+
$message = $broadcaster->buildAblyMessage('testEvent', $payload);
359+
self::assertEquals('testEvent', $message->name);
360+
self::assertEquals($payload, $message->data);
361+
self::assertNull($message->connectionKey);
362+
self::assertNull($message->clientId);
358363

359-
$socketIdObject = [
360-
'connectionKey' => 'key',
361-
'clientId' => 'id'
362-
];
364+
$socketIdObject = new \stdClass();
365+
$socketIdObject->connectionKey = 'foo';
366+
$socketIdObject->clientId = 'sacOO7';
363367

364368
$message = $broadcaster->buildAblyMessage('testEvent', $payload, $socketIdObject);
365-
self::assertEquals('key', $message->connectionKey);
366-
self::assertEquals('id', $message->clientId);
367369
self::assertEquals('testEvent', $message->name);
368370
self::assertEquals($payload, $message->data);
371+
self::assertEquals('foo', $message->connectionKey);
372+
self::assertEquals('sacOO7', $message->clientId);
369373
}
370374
}
371375

0 commit comments

Comments
 (0)