123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?php
-
- namespace Illuminate\Broadcasting\Broadcasters;
-
- use Pusher\Pusher;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Str;
- use Illuminate\Broadcasting\BroadcastException;
- use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
-
- class PusherBroadcaster extends Broadcaster
- {
- /**
- * The Pusher SDK instance.
- *
- * @var \Pusher\Pusher
- */
- protected $pusher;
-
- /**
- * Create a new broadcaster instance.
- *
- * @param \Pusher\Pusher $pusher
- * @return void
- */
- public function __construct(Pusher $pusher)
- {
- $this->pusher = $pusher;
- }
-
- /**
- * Authenticate the incoming request for a given channel.
- *
- * @param \Illuminate\Http\Request $request
- * @return mixed
- * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
- */
- public function auth($request)
- {
- if (Str::startsWith($request->channel_name, ['private-', 'presence-']) &&
- ! $request->user()) {
- throw new AccessDeniedHttpException;
- }
-
- $channelName = Str::startsWith($request->channel_name, 'private-')
- ? Str::replaceFirst('private-', '', $request->channel_name)
- : Str::replaceFirst('presence-', '', $request->channel_name);
-
- return parent::verifyUserCanAccessChannel(
- $request, $channelName
- );
- }
-
- /**
- * Return the valid authentication response.
- *
- * @param \Illuminate\Http\Request $request
- * @param mixed $result
- * @return mixed
- */
- public function validAuthenticationResponse($request, $result)
- {
- if (Str::startsWith($request->channel_name, 'private')) {
- return $this->decodePusherResponse(
- $request, $this->pusher->socket_auth($request->channel_name, $request->socket_id)
- );
- }
-
- return $this->decodePusherResponse(
- $request,
- $this->pusher->presence_auth(
- $request->channel_name, $request->socket_id,
- $request->user()->getAuthIdentifier(), $result
- )
- );
- }
-
- /**
- * Decode the given Pusher response.
- *
- * @param \Illuminate\Http\Request $request
- * @param mixed $response
- * @return array
- */
- protected function decodePusherResponse($request, $response)
- {
- if (! $request->callback) {
- return json_decode($response, true);
- }
-
- return response()->json(json_decode($response, true))
- ->withCallback($request->callback);
- }
-
- /**
- * Broadcast the given event.
- *
- * @param array $channels
- * @param string $event
- * @param array $payload
- * @return void
- */
- public function broadcast(array $channels, $event, array $payload = [])
- {
- $socket = Arr::pull($payload, 'socket');
-
- $response = $this->pusher->trigger(
- $this->formatChannels($channels), $event, $payload, $socket, true
- );
-
- if ((is_array($response) && $response['status'] >= 200 && $response['status'] <= 299)
- || $response === true) {
- return;
- }
-
- throw new BroadcastException(
- is_bool($response) ? 'Failed to connect to Pusher.' : $response['body']
- );
- }
-
- /**
- * Get the Pusher SDK instance.
- *
- * @return \Pusher\Pusher
- */
- public function getPusher()
- {
- return $this->pusher;
- }
- }
|