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; } }