Server Sent Event for eggjs
npm install egg-sse``bash`
$ npm i egg-sse --save
`js`
// {app_root}/config/plugin.js
exports.sse = {
enable: true,
package: 'egg-sse',
};
`js`
// {app_root}/config/config.default.js
exports.sse = {
path: '/stream', // event path
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache, no-transform',
'Connection': 'keep-alive',
'X-Accel-Buffering': 'no',
'Transfer-Encoding': 'off',
'Access-Control-Allow-Origin': '*',
},
maxClients: 10000,
pingInterval: 10000,
};
see config/config.default.js for more detail.
/**
* Publish message to some connections.
* @param {String} key the key of pool.
* @param {String} data sse data to send, if it's a string, an anonymous event will be sent.
* @param {Object} data sse send object mode
* @param {Object|String} data.data data to send, if it's object, it will be converted to json
* @param {String} data.event sse event name
* @param {Number} data.id sse event id
* @param {Number} data.retry sse retry times
*/
publish(key, data)
}
``
/**
* Publish message to all connections.
* @param {String} data sse data to send, if it's a string, an anonymous event will be sent.
* @param {Object} data sse send object mode
* @param {Object|String} data.data data to send, if it's object, it will be converted to json
* @param {String} data.event sse event name
* @param {Number} data.id sse event id
* @param {Number} data.retry sse retry times
*/
publishAll(data)
`Server Side Usage
$3
Get data to publish to all the clients.`
'use strict';
module.exports = {
schedule: {
interval: '5s',
type: 'all', // must be all
},
async task(ctx) {
const data = {
id: Math.random(),
event: 'data',
data: {
aa: 11,
},
};
// Publish data to all connections.
ctx.app.sse.publishAll(data);
},
};`$3
Here is the demo for redis.
`
// app.js
module.exports = app => {
app.beforeStart(() => {
if (app.config.redis.app) {
// redis subcribe the news.
app.redis.get('client1').subscribe('news');
// listen to the message
app.redis.get('client1').on('message', (channel, message) => {
// Publish data to the connections of channel pool.
app.see.publish(channel, {
id: Math.random(),
event: 'data',
data: message,
};)
});
}
});
};// publush.js
ctx.app.redis.clients.get('client2').publish('news', 'hello')
`$3
`
// app.js
module.exports = app => {
app.beforeStart(() => {
app.messenger.on('message', message => {
// Publish data to all connections.
app.see.publish({
id: Math.random(),
event: 'data',
data: message,
};)
});
});
};// publish.js
ctx.app.sendToApp('message', 'hello')
`Client Side Usage
`
const eventSource = new EventSource(http://myhost.com/stream?connectKey=${YOUR_BIZ_KEY});
eventSource.onopen = e => {
console.log('Server sent event is opened.', e);
};
eventSource.onerror = e => {
console.log('Server sent event is error.', e);
};
eventSource.onmessage = e => {
const data = JSON.parse(e.data);
console.log('Recieve message from server:\n', data);
};
``Please open an issue here.