Farmbot-Web-App/frontend/connectivity/ping_mqtt.tsx

67 lines
1.7 KiB
TypeScript

import { Farmbot, uuid } from "farmbot";
import {
dispatchNetworkDown,
dispatchNetworkUp,
dispatchQosStart,
pingOK,
pingNO,
} from "./index";
import { isNumber } from "lodash";
import axios from "axios";
import { API } from "../api/index";
import { FarmBotInternalConfig } from "farmbot/dist/config";
import { now } from "../devices/connectivity/qos";
export const PING_INTERVAL = 2000;
export const LAST_IN: keyof FarmBotInternalConfig = "LAST_PING_IN";
export const LAST_OUT: keyof FarmBotInternalConfig = "LAST_PING_OUT";
type Direction = "in" | "out";
export function readPing(bot: Farmbot, direction: Direction): number | undefined {
const val = bot.getConfig(direction === "out" ? LAST_OUT : LAST_IN);
return isNumber(val) ? val : undefined;
}
export function sendOutboundPing(bot: Farmbot) {
return new Promise((resolve, reject) => {
const id = uuid();
const x = { done: false };
const ok = () => {
if (!x.done) {
x.done = true;
pingOK(id, now());
resolve();
}
};
const no = () => {
if (!x.done) {
x.done = true;
pingNO(id, now());
reject(new Error("sendOutboundPing failed: " + id));
}
};
dispatchQosStart(id);
setTimeout(no, PING_INTERVAL + 150);
bot.ping().then(ok, no);
});
}
const beep = (bot: Farmbot) => sendOutboundPing(bot)
.then(() => { }, () => { }); // Silence errors;
export function startPinging(bot: Farmbot) {
beep(bot);
setInterval(() => beep(bot), PING_INTERVAL);
}
export function pingAPI() {
const ok = () => dispatchNetworkUp("user.api", now());
const no = () => dispatchNetworkDown("user.api", now());
return axios.get(API.current.devicePath).then(ok, no);
}