Здравствуйте.
Имеется связка Laravel 5.5 + Socket IO + Redis + Laravel Events.
Пытаюсь сделать приложение реального времени. Ранее с данной связкой не работал, но нужно учится!
Сейчас застрял при подбрасывании события, точнее даже не с проброской а с CORS.
Появляется вот такая ошибка когда запускаю Redis. если запускать nodejs ошибка остается.
Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на 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. Но как я не знаю. Помогите разобратся((