2017-09-28 12:07:34 -06:00
|
|
|
import { generateReducer } from "../redux/generate_reducer";
|
|
|
|
import { Actions } from "../constants";
|
2019-09-17 15:06:30 -06:00
|
|
|
import {
|
|
|
|
ConnectionState,
|
|
|
|
EdgeStatus
|
|
|
|
} from "./interfaces";
|
2019-09-05 15:44:12 -06:00
|
|
|
import { startPing, completePing, failPing } from "../devices/connectivity/qos";
|
2017-10-04 08:21:05 -06:00
|
|
|
|
2017-09-29 13:46:08 -06:00
|
|
|
export const DEFAULT_STATE: ConnectionState = {
|
2019-09-05 08:17:05 -06:00
|
|
|
uptime: {
|
|
|
|
"bot.mqtt": undefined,
|
|
|
|
"user.mqtt": undefined,
|
|
|
|
"user.api": undefined
|
|
|
|
},
|
|
|
|
pings: {
|
2019-09-13 14:58:58 -06:00
|
|
|
},
|
2017-09-29 13:46:08 -06:00
|
|
|
};
|
2019-09-17 18:36:24 -06:00
|
|
|
export type PingResultPayload = { id: string, at: number };
|
2017-09-28 12:07:34 -06:00
|
|
|
|
2019-12-10 12:53:20 -07:00
|
|
|
export const connectivityReducer =
|
2017-09-29 13:46:08 -06:00
|
|
|
generateReducer<ConnectionState>(DEFAULT_STATE)
|
2019-09-11 15:58:53 -06:00
|
|
|
.add<{ id: string }>(Actions.PING_START, (s, { payload }) => {
|
2019-09-17 12:06:24 -06:00
|
|
|
return { ...s, pings: startPing(s.pings, payload.id) };
|
2019-09-05 15:44:12 -06:00
|
|
|
})
|
2019-09-13 17:18:58 -06:00
|
|
|
.add<PingResultPayload>(Actions.PING_OK, (s, { payload }) => {
|
2019-09-11 15:58:53 -06:00
|
|
|
s.pings = completePing(s.pings, payload.id, payload.at);
|
2019-09-17 15:06:30 -06:00
|
|
|
s.uptime["bot.mqtt"] = { state: "up", at: payload.at };
|
|
|
|
s.uptime["user.mqtt"] = { state: "up", at: payload.at };
|
|
|
|
|
2019-09-11 15:58:53 -06:00
|
|
|
return s;
|
|
|
|
})
|
2019-09-13 17:18:58 -06:00
|
|
|
.add<PingResultPayload>(Actions.PING_NO, (s, { payload }) => {
|
2019-09-11 15:58:53 -06:00
|
|
|
s.pings = failPing(s.pings, payload.id);
|
2019-09-17 15:06:30 -06:00
|
|
|
s.uptime["bot.mqtt"] = { state: "down", at: payload.at };
|
|
|
|
|
2019-09-11 15:58:53 -06:00
|
|
|
return s;
|
|
|
|
})
|
|
|
|
.add<EdgeStatus>(Actions.NETWORK_EDGE_CHANGE, (s, { payload }) => {
|
2019-09-17 15:06:30 -06:00
|
|
|
if (payload.name == "bot.mqtt") {
|
2019-09-17 15:45:40 -06:00
|
|
|
return s; // <= Let PING_OK / PING_NO handle it.
|
2019-09-17 15:06:30 -06:00
|
|
|
} else {
|
|
|
|
s.uptime[payload.name] = payload.status;
|
2019-09-17 10:31:07 -06:00
|
|
|
return s;
|
|
|
|
}
|
2017-09-29 13:46:08 -06:00
|
|
|
});
|