NodeJs server for Laravel Echo broadcasting with Socket.io.
The following are required to function properly.
Additional information on broadcasting with Laravel can be found on theofficial docs: https://laravel.com/docs/master/broadcasting
Install npm package globally with the following command:
$ npm install -g laravel-echo-server
Run the init command in your project directory:
$ laravel-echo-server init
The cli tool will help you setup a laravel-echo-server.json file in the root directory of your project. This file will be loaded by the server during start up. You may edit this file later on to manage the configuration of your server.
The Laravel Echo Server exposes a light http API to perform broadcasting functionality. For security purposes, access to these endpoints from http referrers must be authenticated with an APP id and key. This can be generated using the cli command:
$ laravel-echo-server client:add APP_ID
If you run client:add
without an app id argument, one will be generated for you. After running this command, the client id and key will be displayed and stored in the laravel-echo-server.json file.
In this example, requests will be allowed as long as the app id and key are both provided with http requests.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
You can remove clients with laravel-echo-server client:remove APP_ID
in your project root directory, run
$ laravel-echo-server start
in your project root directory, run
$ laravel-echo-server stop
Edit the default configuration of the server by adding options to your laravel-echo-server.json file.
Title | Default | Description |
---|---|---|
apiOriginAllow |
{} |
Configuration to allow API be accessed over CORS. Example |
authEndpoint |
/broadcasting/auth |
The route that authenticates private channels |
authHost |
http://localhost |
The host of the server that authenticates private and presence channels |
database |
redis |
Database used to store data that should persist, like presence channel members. Options are currently redis and sqlite |
databaseConfig |
{} |
Configurations for the different database drivers Example |
devMode |
false |
Adds additional logging for development purposes |
host |
null |
The host of the socket.io server ex.app.dev . null will accept connections on any IP-address |
port |
6001 |
The port that the socket.io server should run on |
protocol |
http |
Must be either http or https |
sslCertPath |
'' |
The path to your server's ssl certificate |
sslKeyPath |
'' |
The path to your server's ssl key |
sslCertChainPath |
'' |
The path to your server's ssl certificate chain |
sslPassphrase |
'' |
The pass phrase to use for the certificate (if applicable) |
socketio |
{} |
Options to pass to the socket.io instance (available options) |
subscribers |
{"http": true, "redis": true} |
Allows to disable subscribers individually. Available subscribers: http and redis |
If a .env file is found in the same directory as the laravel-echo-server.jsonfile, the following options can be overridden:
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
Note: This option will fall back to the LARAVEL_ECHO_SERVER_HOST
option as the default if that is set in the .env file.host
: LARAVEL_ECHO_SERVER_HOST
port
: LARAVEL_ECHO_SERVER_PORT
devMode
: LARAVEL_ECHO_SERVER_DEBUG
databaseConfig.redis.host
: LARAVEL_ECHO_SERVER_REDIS_HOST
databaseConfig.redis.port
: LARAVEL_ECHO_SERVER_REDIS_PORT
databaseConfig.redis.password
: LARAVEL_ECHO_SERVER_REDIS_PASSWORD
protocol
: LARAVEL_ECHO_SERVER_PROTO
sslKeyPath
: LARAVEL_ECHO_SERVER_SSL_KEY
sslCertPath
: LARAVEL_ECHO_SERVER_SSL_CERT
sslPassphrase
: LARAVEL_ECHO_SERVER_SSL_PASS
sslCertChainPath
: LARAVEL_ECHO_SERVER_SSL_CHAIN
Note: This library currently only supports serving from either http or https, not both.
If you are struggling to get SSL implemented with this package, you could look at using a proxy module within Apache or NginX. Essentially, instead of connecting your websocket traffic to https://yourserver.dev:6001/socket.io?..... and trying to secure it, you can connect your websocket traffic to https://yourserver.dev/socket.io. Behind the scenes, the proxy module of Apache or NginX will be configured to intercept requests for /socket.io, and internally redirect those to your echo server over non-ssl on port 6001. This keeps all of the traffic encrypted between browser and web server, as your web server will still do the SSL encryption/decryption. The only thing that is left unsecured is the traffic between your webserver and your Echo server, which might be acceptable in many cases.
#the following would go within the server{} block of your web server config
location /socket.io {
proxy_pass http://laravel-echo-server:6001; #could be localhost if Echo and NginX are on the same box
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
The working directory in which laravel-echo-server
will look for the configuration file laravel-echo-server.json
can be passed to the start
command through the --dir
parameter like so: laravel-echo-server start --dir=/var/www/html/example.com/configuration
The Laravel Echo Server subscribes to incoming events with two methods: Redis & Http.
Your core application can use Redis to publish events to channels. The Laravel Echo Server will subscribe to those channels and broadcast those messages via socket.io.
Using Http, you can also publish events to the Laravel Echo Server in the same fashion you would with Redis by submitting a channel
and message
to the broadcast endpoint. You need to generate an API key as described in the API Clients section and provide the correct API key.
Request Endpoint
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
Request Body
{
"channel": "channel-name",
"name": "event-name",
"data": {
"key": "value"
},
"socket_id": "h3nAdb134tbvqwrg"
}
channel - The name of the channel to broadcast an event to. For private or presence channels prepend private-
or presence-
.channels - Instead of a single channel, you can broadcast to an array of channels with 1 request.name - A string that represents the event key within your app.data - Data you would like to broadcast to channel.socket_id (optional) - The socket id of the user that initiated the event. When present, the server will only "broadcast to others".
The HTTP subscriber is compatible with the Laravel Pusher subscriber. Just configure the host and port for your Socket.IO server and set the app id and key in config/broadcasting.php. Secret is not required.
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_KEY'),
'secret' => null,
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'host' => 'localhost',
'port' => 6001,
'scheme' => 'http'
],
],
You can now send events using HTTP, without using Redis. This also allows you to use the Pusher API to list channels/users as described in the Pusher PHP library
The HTTP API exposes endpoints that allow you to gather information about your running server and channels.
StatusGet total number of clients, uptime of the server, and memory usage.
GET /apps/:APP_ID/status
ChannelsList of all channels.
GET /apps/:APP_ID/channels
ChannelGet information about a particular channel.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
Channel UsersList of users on a channel.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
Cross domain access can be specified in the laravel-echo-server.json file by changing allowCors
in apiOriginAllow
to true
. You can then set the CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods as a comma separated string (GET and POST are enabled by default) and the Access-Control-Allow-Headers that the API can receive.
Example below:
{
"apiOriginAllow":{
"allowCors" : true,
"allowOrigin" : "http://127.0.0.1",
"allowMethods" : "GET, POST",
"allowHeaders" : "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
}
}
This allows you to send requests to the API via AJAX from an app that may be running on the same domain but a different port or an entirely different domain.
To persist presence channel data, there is support for use of Redis or SQLite as a key/value store. The key being the channel name, and the value being the list of presence channel members.
Each database driver may be configured in the laravel-echo-server.json file under the databaseConfig
property. The options get passed through to the database provider, so developers are free to set these up as they wish.
For example, if you wanted to pass a custom configuration to Redis:
{
"databaseConfig" : {
"redis" : {
"port": "3001",
"host": "redis.app.dev",
"keyPrefix": "my-redis-prefix"
}
}
}
Note: No scheme (http/https etc) should be used for the host address
A full list of Redis options can be found here.
For example, if you wanted to use redis-sentinel, you need to pass a custom configuration :
"databaseConfig": {
"redis": {
"sentinels": [
{
"host": "redis-sentinel-0",
"port": 26379
},
{
"host": "redis-sentinel-1",
"port": 26379
}
{
"host": "redis-sentinel-2",
"port": 26379
}
],
"name": "mymaster",
"sentinelPassword": "redis-password"
},
},
For more information about redis sentinel configuration you can check this
With SQLite you may be interested in changing the path where the database is stored.
{
"databaseConfig" : {
"sqlite" : {
"databasePath": "/path/to/laravel-echo-server.sqlite"
}
}
}
Note 1: The path is relative to the root of your application, not your system.
Note 2: node-sqlite3 is required for this database. Please install before using.
npm install sqlite3 -g
When users join a presence channel, their presence channel authentication data is stored using Redis.
While presence channels contain a list of users, there will be instances where a user joins a presence channel multiple times. For example, this would occur when opening multiple browser tabs. In this situation "joining" and "leaving" events are only emitted to the first and last instance of the user.
Optionally, you can configure laravel-echo-server to publish an event on each update to a presence channel, by setting databaseConfig.publishPresence
to true
:
{
"database": "redis",
"databaseConfig": {
"redis" : {
"port": "6379",
"host": "localhost"
},
"publishPresence": true
}
}
You can use Laravel's Redis integration, to trigger Application code from there:
Redis::subscribe(['PresenceChannelUpdated'], function ($message) {
var_dump($message);
});
See the official Laravel documentation for more information. https://laravel.com/docs/master/broadcasting#introduction
You can include the socket.io client library from your running server. For example, if your server is running at app.dev:6001
you should be able toadd a script tag to your html like so:
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
Note: When using the socket.io client library from your running server, remember to check that the io
global variable is defined before subscribing to events.
µWebSockets has been officially deprecated. Currently there is no support for µWebSockets in Socket.IO, but it may have the new ClusterWS support incoming. Meanwhile Laravel Echo Server will use ws
engine by default until there is another option.
在我看来,实时通信才是 APP 应用的将来。 Socket 服务通常不是那么容易实现,但是 Laravel Echo 服务改变了这个情况。 在本文中,我将会简要的介绍如何建立一个可以运行的 Socket 服务并且在这个服务上进行事件的广播。(https://github.com/tlaverdure/laravel-echo…, Laravel 的支持文档: https://learnku.com
聊天频道上查看在线状态/状态。 如何确定服务器上是否有人在线? API客户端 laravelecho服务器公开了一个轻量级的httpapi来执行广播功能。出于安全目的,必须使用应用程序id和密钥对来自http引用程序的这些终结点的访问进行身份验证。这可以使用cli命令生成: laravel-echo-server client:add APP_ID 如果你跑了客户端:添加不带一个app id参数,
NativeScript Laravel-Echo This is a laravel-echo plugin for native applications made with nativescript For more information read Laravel Broadcast. Prerequisites / Requirements Necesary api authentica
拉威尔5.6 我正在尝试创建一个实时应用程序。我遵循了在谷歌上找到的教程,但它似乎不起作用。我不明白为什么,因为它在控制台中没有显示错误。 在config/app中。php 这是我的活动 这是我的控制器 在我的引导程序的底部。js 我的laravel-echo-server.json 我的聊天组件。vue 如果有人知道这个问题的解决方案。请帮忙。非常感谢你!
无论出于何种原因,我无法从laravel echo接收客户端的任何数据。我使用的是LaravelEcho服务器(socket.io)、redis广播和redis队列。据我所知,它们都是功能性的。我将带您了解如何为测试设置它。首先,我创建了一个UserCreated事件: 然后,为了测试此事件,我创建了一个CreateUser命令: 最后,这是我的laravel echo服务器。json: 接下来,
大家好,我工作与Laravel回声和SocketIO没有Vue只有jQuery,但我有一个问题与私人渠道在这里我向你展示,我有两个事件正常和私人渠道正常渠道(todocanales我的事件Hola活动)工作正常,当我午餐的事件 在我的laravel echo服务器控制台中,向我展示: 在浏览器控制台中,我得到 ~~~对象{数据:对象,套接字:null}~~~ 所有完美的,但与私人频道我有问题Lar
我不明白为什么我在尝试连接到私人频道时会遇到这个问题。我有这篇文章的100%相同的代码-无法使用laravel echo服务器、redis和socket对laravel专用频道进行身份验证。虽然带有redis前缀的io不起作用。。。它与简单通道一起工作。。。这是我的错误- 无法对客户端进行身份验证,已通过laravel echo服务器获取HTTP状态403 这是我的代码- 路线/channels.
我正在设置一个laravel-echo-server,当我试图验证到一个私有通道时,我得到了错误:客户端无法被验证,得到了HTTP状态404。 授权公共渠道工程。 //channels.php //前端脚本验证到私有通道 //拉威尔回声服务器。json //引导。js 简单地说,我的laravel echo是通过应用程序加载的。在public/js中的js,引导程序中的所有库。js被加载进来。好的