Change format of events sent by server, leveraging event type and id
This commit is contained in:
+23
-23
@@ -19,8 +19,15 @@ type Broker interface {
|
|||||||
|
|
||||||
const keepAliveFrequency = 15 * time.Second
|
const keepAliveFrequency = 15 * time.Second
|
||||||
|
|
||||||
|
var eventId uint32
|
||||||
|
|
||||||
type (
|
type (
|
||||||
messageChan chan []byte
|
message struct {
|
||||||
|
ID uint32
|
||||||
|
Event string
|
||||||
|
Data string
|
||||||
|
}
|
||||||
|
messageChan chan message
|
||||||
clientsChan chan client
|
clientsChan chan client
|
||||||
client struct {
|
client struct {
|
||||||
address string
|
address string
|
||||||
@@ -63,26 +70,19 @@ func NewBroker() Broker {
|
|||||||
return broker
|
return broker
|
||||||
}
|
}
|
||||||
|
|
||||||
func (broker *broker) SendMessage(event Event) {
|
func (broker *broker) SendMessage(evt Event) {
|
||||||
pkg := broker.preparePackage(event)
|
msg := broker.preparePackage(evt)
|
||||||
|
log.Trace("Broker received new event", "event", msg)
|
||||||
log.Trace("Broker received new event", "name", event.EventName(), "event", string(pkg))
|
broker.notifier <- msg
|
||||||
broker.notifier <- pkg
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var eventId uint32
|
func (broker *broker) preparePackage(event Event) message {
|
||||||
|
pkg := message{}
|
||||||
func (broker *broker) preparePackage(event Event) []byte {
|
pkg.ID = atomic.AddUint32(&eventId, 1)
|
||||||
pkg := struct {
|
pkg.Event = event.EventName()
|
||||||
Event `json:"data"`
|
data, _ := json.Marshal(event)
|
||||||
Id uint32 `json:"id"`
|
pkg.Data = string(data)
|
||||||
Name string `json:"name"`
|
return pkg
|
||||||
}{}
|
|
||||||
pkg.Id = atomic.AddUint32(&eventId, 1)
|
|
||||||
pkg.Name = event.EventName()
|
|
||||||
pkg.Event = event
|
|
||||||
data, _ := json.Marshal(pkg)
|
|
||||||
return data
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (broker *broker) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
func (broker *broker) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||||
@@ -133,8 +133,8 @@ func (broker *broker) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|||||||
// Write to the ResponseWriter
|
// Write to the ResponseWriter
|
||||||
// Server Sent Events compatible
|
// Server Sent Events compatible
|
||||||
event := <-client.channel
|
event := <-client.channel
|
||||||
log.Trace(ctx, "Sending event to client", "event", string(event), "client", client.String())
|
log.Trace(ctx, "Sending event to client", "event", event, "client", client.String())
|
||||||
_, _ = fmt.Fprintf(rw, "data: %s\n\n", event)
|
_, _ = fmt.Fprintf(rw, "id: %d\nevent: %s\ndata: %s\n\n", event.ID, event.Event, event.Data)
|
||||||
|
|
||||||
// Flush the data immediately instead of buffering it for later.
|
// Flush the data immediately instead of buffering it for later.
|
||||||
flusher.Flush()
|
flusher.Flush()
|
||||||
@@ -157,7 +157,7 @@ func (broker *broker) listen() {
|
|||||||
s.channel <- broker.preparePackage(&ServerStart{serverStart})
|
s.channel <- broker.preparePackage(&ServerStart{serverStart})
|
||||||
|
|
||||||
case s := <-broker.closingClients:
|
case s := <-broker.closingClients:
|
||||||
// A client has dettached and we want to
|
// A client has detached and we want to
|
||||||
// stop sending them messages.
|
// stop sending them messages.
|
||||||
delete(broker.clients, s)
|
delete(broker.clients, s)
|
||||||
log.Debug("Removed client from event broker", "numClients", len(broker.clients), "client", s.String())
|
log.Debug("Removed client from event broker", "numClients", len(broker.clients), "client", s.String())
|
||||||
@@ -166,7 +166,7 @@ func (broker *broker) listen() {
|
|||||||
// We got a new event from the outside!
|
// We got a new event from the outside!
|
||||||
// Send event to all connected clients
|
// Send event to all connected clients
|
||||||
for client := range broker.clients {
|
for client := range broker.clients {
|
||||||
log.Trace("Putting event on client's queue", "client", client.String(), "event", string(event))
|
log.Trace("Putting event on client's queue", "client", client.String(), "event", event)
|
||||||
client.channel <- event
|
client.channel <- event
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,11 @@
|
|||||||
export const EVENT_SCAN_STATUS = 'EVENT_SCAN_STATUS'
|
export const EVENT_SCAN_STATUS = 'scanStatus'
|
||||||
export const EVENT_SERVER_START = 'EVENT_SERVER_START'
|
export const EVENT_SERVER_START = 'serverStart'
|
||||||
|
|
||||||
const actionsMap = {
|
export const processEvent = (type, event) => {
|
||||||
scanStatus: EVENT_SCAN_STATUS,
|
const data = JSON.parse(event)
|
||||||
serverStart: EVENT_SERVER_START,
|
|
||||||
}
|
|
||||||
|
|
||||||
export const processEvent = (data) => {
|
|
||||||
let type = actionsMap[data.name]
|
|
||||||
if (!type) type = data.name
|
|
||||||
return {
|
return {
|
||||||
type,
|
type,
|
||||||
data: data.data,
|
data: data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+18
-13
@@ -13,7 +13,7 @@ let timeout = null
|
|||||||
|
|
||||||
const getEventStream = async () => {
|
const getEventStream = async () => {
|
||||||
if (es === null) {
|
if (es === null) {
|
||||||
return httpClient(`${REST_URL}/keepalive/`).then(() => {
|
return httpClient(`${REST_URL}/keepalive/eventSource`).then(() => {
|
||||||
es = new EventSource(
|
es = new EventSource(
|
||||||
baseUrl(`/app/api/events?jwt=${localStorage.getItem('token')}`)
|
baseUrl(`/app/api/events?jwt=${localStorage.getItem('token')}`)
|
||||||
)
|
)
|
||||||
@@ -53,29 +53,34 @@ const setDispatch = (dispatchFunc) => {
|
|||||||
dispatch = dispatchFunc
|
dispatch = dispatchFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const eventHandler = throttle(
|
||||||
|
(event) => {
|
||||||
|
if (event.type !== 'keepAlive') {
|
||||||
|
dispatch(processEvent(event.type, event.data))
|
||||||
|
}
|
||||||
|
setTimeout(defaultIntervalCheck) // Reset timeout on every received message
|
||||||
|
},
|
||||||
|
100,
|
||||||
|
{ trailing: true }
|
||||||
|
)
|
||||||
|
|
||||||
const startEventStream = async () => {
|
const startEventStream = async () => {
|
||||||
setTimeout(currentIntervalCheck)
|
setTimeout(currentIntervalCheck)
|
||||||
if (!localStorage.getItem('token')) {
|
if (!localStorage.getItem('token')) {
|
||||||
console.log('Cannot create a unauthenticated EventSource connection')
|
console.log('Cannot create a unauthenticated EventSource connection')
|
||||||
return
|
return Promise.reject()
|
||||||
}
|
}
|
||||||
getEventStream().then((newStream) => {
|
getEventStream().then((newStream) => {
|
||||||
newStream.onmessage = throttle(
|
newStream.addEventListener('serverStart', eventHandler)
|
||||||
(msg) => {
|
newStream.addEventListener('scanStatus', eventHandler)
|
||||||
const data = JSON.parse(msg.data)
|
newStream.addEventListener('keepAlive', eventHandler)
|
||||||
if (data.name !== 'keepAlive') {
|
|
||||||
dispatch(processEvent(data))
|
|
||||||
}
|
|
||||||
setTimeout(defaultIntervalCheck) // Reset timeout on every received message
|
|
||||||
},
|
|
||||||
100,
|
|
||||||
{ trailing: true }
|
|
||||||
)
|
|
||||||
newStream.onerror = (e) => {
|
newStream.onerror = (e) => {
|
||||||
|
console.log('EventStream error', e)
|
||||||
setTimeout(reconnectIntervalCheck)
|
setTimeout(reconnectIntervalCheck)
|
||||||
dispatch(serverDown())
|
dispatch(serverDown())
|
||||||
}
|
}
|
||||||
es = newStream
|
es = newStream
|
||||||
|
return es
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user