tlaverdure / laravel-echo-server

Socket.io server for Laravel Echo
MIT License
2.65k stars 510 forks source link

[REDIS & Socket.io] Can join a channel but cannot receive any message's broadcasted #442

Open handhikadj opened 4 years ago

handhikadj commented 4 years ago

anyway this is my:

.env

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis

my event

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class NotifyAMurrotalNamePlaying implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $song;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($song)
    {
        $this->song = $song;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('notifyMurrotal');
    }

    public function broadcastAs()
    {
        return "event.notify";
    }
}

laravel-echo-server.json

{
    "authHost": "http://localhost",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "753a4acdc90ddbe7",
            "key": "a084deb08bf76a23c30cab1618ee8d82"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {
            "host": "127.0.0.1",
            "port": 6379
        },
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "http://localhost:80",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

my shell

L A R A V E L  E C H O  S E R V E R

version 1.5.8

⚠ Starting server in DEV mode...

✔  Running at localhost on port 6001
✔  Channels are ready.
✔  Listening for http events...
✔  Listening for redis events...

Server ready!

[00:21:28] - nqRyIwGqlQZJjB1uAAAA joined channel: notifyMurrotal
[00:21:32] - nqRyIwGqlQZJjB1uAAAA left channel: notifyMurrotal (transport close)
[00:21:33] - ErYqh9t7n4TKBrE3AAAB joined channel: notifyMurrotal

bootstrap.js

window.io = require("socket.io-client");

import Echo from "laravel-echo";

window.Echo = new Echo({
    broadcaster: "socket.io",
    host: window.location.hostname + ":6001"
});

app.js

import "./bootstrap";

Echo.channel("notifyMurrotal").listen(".event.notify", song => {
    console.log(song);
});

my step to produce is I created a dummy route to test the event via postman but still cannot log any messages to the console. please help!

note: I'm on mac mojave

shafter commented 4 years ago

did you start the laravel queue workers? https://laravel.com/docs/5.8/queues

handhikadj commented 4 years ago

definitely I did

image

by the way, this is my config/queue.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Queue Driver
    |--------------------------------------------------------------------------
    |
    | The Laravel queue API supports a variety of back-ends via an unified
    | API, giving you convenient access to each back-end using the same
    | syntax for each one. Here you may set the default queue driver.
    |
    | Supported: "null", "sync", "database", "beanstalkd",
    |            "sqs", "iron", "redis"
    |
    */

    'default' => env('QUEUE_DRIVER', 'sync'),

    /*
    |--------------------------------------------------------------------------
    | Queue Connections
    |--------------------------------------------------------------------------
    |
    | Here you may configure the connection information for each server that
    | is used by your application. A default configuration has been added
    | for each back-end shipped with Laravel. You are free to add more.
    |
    */

    'connections' => [

        'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'expire' => 60,
        ],

        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host' => 'localhost',
            'queue' => 'default',
            'ttr' => 60,
        ],

        'sqs' => [
            'driver' => 'sqs',
            'key' => 'your-public-key',
            'secret' => 'your-secret-key',
            'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
            'queue' => 'your-queue-name',
            'region' => 'us-east-1',
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'default',
            'expire' => 60,
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Failed Queue Jobs
    |--------------------------------------------------------------------------
    |
    | These options configure the behavior of failed queue job logging so you
    | can control which database and table are used to store the jobs that
    | have failed. You may change them to any database / table you wish.
    |
    */

    'failed' => [
        'database' => env('DB_CONNECTION', 'mysql'),
        'table' => 'failed_jobs',
    ],

];

still nothing happened

KristianI commented 4 years ago

@handhikadj Did you find the issue?

I am experiencing exactly the same: the laravel-echo-server debug log shows that the client joined the channel + the event was broadcasted, but on the frontend the event is not picked up by the listener.

KristianI commented 4 years ago

Okay, so actually not exactly the same, as I can see the broadcasted event in the laravel-echo-server log.

You could try changing "ShouldBroadcast" to "ShouldBroadcastNow" to narrow down where the issue is happening.

handhikadj commented 4 years ago

@KristianI never think there's ShouldBroadcastNow interface. okay thank you very much for that. gonna give it a shot

KristianI commented 4 years ago

I resolved my own issue - it was due to the channel names being prefixed by laravel recently - see this thread: https://github.com/tlaverdure/laravel-echo-server/issues/400 - it could potentially be of your interest , too.