Files
buuh/examples/sse/client.js
T

52 lines
1.1 KiB
JavaScript
Raw Normal View History

2016-06-20 15:56:42 +01:00
const choo = require('../../')
2016-06-30 08:18:07 -07:00
const html = require('../../html')
2016-06-20 15:56:42 +01:00
const app = choo()
app.model(createModel())
2016-12-11 19:35:29 +01:00
app.router(['/', mainView])
2016-06-20 15:56:42 +01:00
const tree = app.start()
document.body.appendChild(tree)
2016-12-11 19:35:29 +01:00
function mainView (state, prev, send) {
2016-06-30 08:18:07 -07:00
return html`
2016-06-20 15:56:42 +01:00
<div>${state.logger.msg}</div>
`
}
function createModel () {
const stream = new window.EventSource('/sse')
return {
namespace: 'logger',
state: {
msg: ''
},
subscriptions: [
2016-12-11 19:35:29 +01:00
function (send, done) {
2016-06-20 15:56:42 +01:00
stream.onerror = (e) => {
2016-12-11 19:35:29 +01:00
send('logger:error', { payload: JSON.stringify(e) }, done)
2016-06-20 15:56:42 +01:00
}
stream.onmessage = (e) => {
const msg = JSON.parse(e.data).message
2016-12-11 19:35:29 +01:00
send('logger:print', { payload: msg }, done)
2016-06-20 15:56:42 +01:00
}
}
],
reducers: {
2016-12-11 19:35:29 +01:00
'print': (state, data) => {
2016-07-02 21:09:08 -04:00
return ({ msg: state.msg + ' ' + data.payload })
2016-06-20 15:56:42 +01:00
}
},
effects: {
2016-12-11 19:35:29 +01:00
close: (state, data, send, done) => {
stream.close()
done()
},
2016-12-11 19:35:29 +01:00
error: (state, data, send, done) => {
2016-07-23 16:23:24 +08:00
console.error(`error: ${data.payload}`)
done()
}
2016-06-20 15:56:42 +01:00
}
}
}