subscribe and handle status changes

This commit is contained in:
slice 2018-07-15 21:22:06 -07:00
parent 8d517ec037
commit c1f2b38ba2
No known key found for this signature in database
GPG Key ID: 1508C19D7436A26D
1 changed files with 50 additions and 16 deletions

View File

@ -24,8 +24,15 @@ export default class App extends Component {
} }
subscribeToChannels () { subscribeToChannels () {
const channels = Object.keys(this.state.metrics.graph).map((channel) => `latency:${channel}`) const { graph } = this.state.metrics
log('subscribing to channels:', channels) const channels = Object.keys(graph).reduce(
(channels, name) => [...channels, `latency:${name}`, `status:${name}`],
[]
)
log(
`subscribing to ${channels.length} channels: ${channels.join(', ')}`
)
this._send({ this._send({
op: OP.SUBSCRIBE, op: OP.SUBSCRIBE,
@ -33,37 +40,64 @@ export default class App extends Component {
}) })
} }
handlePacket (packet) { handleStatus (name, [, status]) {
const { op, c: channel, d: data } = packet const { status: statuses } = this.state.metrics
log('updating status on:', name)
if (op !== OP.DATA) { if (!(name in statuses)) {
log('ignoring boring packet:', packet) log(`failed to locate channel ${name} to update statuses`)
return return
} }
const [, name] = channel.split(':') if (statuses[name].status === status) {
log(`ignoring stale status (${status}) for ${name}`)
return
}
log('updating from channel:', channel) this.setState(({ metrics: old }, _props) => {
const metrics = { ...old }
metrics.status[name].status = status
return { metrics }
})
}
handleLatency (name, data) {
const { metrics } = this.state const { metrics } = this.state
const graph = metrics.graph[name].slice(1) const graph = metrics.graph[name].slice(1)
const newGraph = [data, ...graph] const newGraph = [data, ...graph]
log('adding data:', data) log('adding latency entry:', data)
this.setState(({ metrics: oldMetrics }, _props) => { this.setState(({ metrics: old }, _props) => {
const newMetrics = { ...oldMetrics } const metrics = { ...old }
newMetrics.graph[name] = newGraph metrics.graph[name] = newGraph
const [, latency] = data const [, latency] = data
newMetrics.status[name].latency = latency metrics.status[name].latency = latency
return { return { metrics }
metrics: newMetrics,
}
}) })
} }
handlePacket (packet) {
const { op, c: channel, d: data } = packet
if (op !== OP.DATA) {
return
}
const [type, name] = channel.split(':')
log('updating from channel:', channel)
if (type === 'latency') {
this.handleLatency(name, data)
} else if (type === 'status') {
this.handleStatus(name, data)
}
}
connect () { connect () {
log('connecting to ws') log('connecting to ws')