Ruless
@Ruless
Frontend development

Почему не броадкастится эвент через Laravel Events+Redis+Socket.io?

Здравствуйте.
Имеется связка Laravel 5.5 + Socket IO + Redis + Laravel Events.
Пытаюсь сделать приложение реального времени. Ранее с данной связкой не работал, но нужно учится!
Сейчас застрял при подбрасывании события, точнее даже не с проброской а с CORS.
Появляется вот такая ошибка когда запускаю Redis. если запускать nodejs ошибка остается.

5a2e7ea13cb47351664575.png
Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на my_site.loc:6379/socket.io/?EIO=3&transport=pollin... (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).


Пытался прописывать этот заголовок везде где только можно. Но не помогает. Может кто то, по пунктам объяснить как правильно пробрасывать событие, получать данные redis и все остальное, буду очень благодарен.
Сброшу все исходники.
server.js
var request = require('request'),
	io = require('socket.io')(6379, {
		origins : 'my_site.loc:*'
	}),
	Redis = require('ioredis'),
	redis = new Redis();
io.use(function(socket, next) {
	request.get({
		url : 'http://my_site.loc/ws/check-auth',
		headers : {cookie : socket.request.headers.cookie},
		json : true
	}, function(error, response, json) {
		console.log(json);
		return json.auth ? next() : next(new Error('Auth error'));
	});	
});
io.on('connection', function(socket) {
	socket.on('subscribe', function(channel) {
		console.log('I want to subscribe on:', channel);
		request.get({
			url : 'http://my_site.loc/ws/check-sub/' + channel,
			headers : {cookie : socket.request.headers.cookie},
			json : true
		}, function(error, response, json) {
			if(json.can) {
				socket.join(channel, function(error) {
					socket.send('Join to ' + channel);
				});
				return;
			}
		});
	});
});
redis.psubscribe('*', function(error, count) {});

redis.on('pmessage', function(pattern, channel, message) {
	message = JSON.parse(message);
	io
		.to(channel + ':' + message.event)
		.emit(channel + ':' + message.event, message.data.message);
});


client
<script src="{{ asset('/js/socket.io.js') }}"></script>

   <script type="text/javascript">

        var socket = io(':6379'),
            channel = 'sectionAdd';
        socket.on('connect', function() {
            socket.emit('subscribe', channel)
        });
        socket.on('error', function(error) {
            console.warn('Error', error);
        });
        socket.on('message', function(message) {
            console.info(message);
        });
        function appendMessage(data) {
        	console.info(data);
            $('.project-list-section').append(
                $('<a/>').append(
                    $('<b/>').text(data.name)
                )
            );
        }
        socket.on(channel, function(data) {
            appendMessage(data);
        });
    </script>

Controller:
use App\Events\Project\SectionCreateEvent;
...
 event(new SectionCreateEvent($section));


namespace App\Events\Project;
..
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

use App\Model\Project\Section;
use App\Events\Event;

class SectionCreateEvent extends Event implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $section;

    public function __construct(Section $section)
    {
        //
     $this->section = $section;
    }

    public function broadcastOn()
    {
        return ['section-create'];
    }

    public function broadcastAs(){
        return 'sectionAdd';
    }
}


Также нужно реализовать rooms.

Я так понял что можно обойтись и без secket.io и nodejs. Но как я не знаю. Помогите разобратся((
  • Вопрос задан
  • 1308 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Nc_Soft
6379 это же порт редиса, зачем вы в него долбите по http?
Для работы broadcast надо запустить очередь
php artisan queue:work redis --tries=0 --timeout=0
Либо можно без очереди (синхронный драйвер очереди)
class SectionCreateEvent extends Event implements ShouldBroadcastNow
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы