lighthouse icon indicating copy to clipboard operation
lighthouse copied to clipboard

GraphQL subscription with Laravel Reverb

Open michaelLoeffelmann opened this issue 1 year ago • 4 comments

When a subscription request is received by Reverb, it throws the following error:

TypeError Laravel\Reverb\Protocols\Pusher\EventHandler::subscribe(): Argument #4 ($data) must be of type ?string, array given, called in /var/www/DemoGraphQL/vendor/laravel/reverb/src/Protocols/Pusher/EventHandler.php on line 29 at vendor/laravel/reverb/src/Protocols/Pusher/EventHandler.php:56

The error is caused by the payload data being an array instead of a string, which is expected by the subscribe method in the EventHandler class.

The payload that triggers the error looks like this:

[
  "channel_data" => [
    "user_id" => "363c7a56eee7c386bf2c4ac980b661e6"
    "user_info" => []
  ]
  "channel" => "private-lighthouse-vEibwD5lS5FA0xmHHrMuH3Z5A8nVSvbC-1717741629"
]

The authorizedMethod in the EchoBroadcaster Class should send an string for 'channel_data' instead an array.

Steps to reproduce

  1. Starting laravel reverb
  2. Add an Subscription to the Frontend

Output/Logs

Laravel Exception
  TypeError 

  Laravel\Reverb\Protocols\Pusher\EventHandler::subscribe(): Argument #4 ($data) must be of type ?string, array given, called in /Users/dev/Herd/lv-ep-gw-api/vendor/laravel/reverb/src/Protocols/Pusher/EventHandler.php on line 29

  at vendor/laravel/reverb/src/Protocols/Pusher/EventHandler.php:56
     52▕ 
     53▕     /**
     54▕      * Subscribe to the given channel.
     55▕      */
  ➜  56▕     public function subscribe(Connection $connection, string $channel, ?string $auth = null, ?string $data = null): void
     57▕     {
     58▕         $channel = $this->channels
     59▕             ->for($connection->app())
     60▕             ->findOrCreate($channel);

Lighthouse Version

6.36.3

michaelLoeffelmann avatar Jun 07 '24 06:06 michaelLoeffelmann

Could it be the case that previous versions of Laravel Reverb required an array? How can we fix this without breaking backwards compatibility?

spawnia avatar Jun 28 '24 07:06 spawnia

I don't know if older versions required an array. Maybe you can add a new Driver for laravel reverb, that can be set like this: LIGHTHOUSE_BROADCASTER=reverb in the config.

sOmiloef avatar Jul 15 '24 09:07 sOmiloef

I personally do not use subscriptions, so I do not plan to work on this. Feel free to contribute.

spawnia avatar Jul 15 '24 12:07 spawnia

I faced the same issue and fixed it by reusing the pusher driver for the reverb connection. #2612

dstemberger avatar Sep 05 '24 13:09 dstemberger

Released with https://github.com/nuwave/lighthouse/releases/tag/v6.47.0.

spawnia avatar Dec 11 '24 11:12 spawnia