itender/src/WebSocketHandler.ts
Tobias Hopp 3e522ceb0a Fix #6
Took 7 seconds
2022-12-01 12:22:12 +01:00

106 lines
3.5 KiB
TypeScript

import {WebSocketPayload} from "./WebSocketPayload";
import {WebSocketEvent} from "./WebSocketEvent";
import {iTender} from "./iTender";
import {Settings} from "./Settings";
import Container from "./database/Container";
import Job from "./database/Job";
import Drink from "./database/Drink";
import {IDrink} from "./database/IDrink";
import Ingredient from "./database/Ingredient";
import {RequestType} from "./RequestType";
import debug from "debug";
const log = debug("itender:WShandler");
export class WebSocketHandler {
private static _ws: WebSocket;
static get ws(): WebSocket {
return this._ws;
}
static set ws(value: WebSocket) {
this._ws = value;
}
public static send(payload: WebSocketPayload): Promise<void> {
return new Promise(async (resolve, reject) => {
try {
if (this.ws && this.ws.readyState == 1) {
log("Sending " + payload.event);
await this.ws.send(payload.toString());
resolve();
}
} catch (e) {
}
});
}
public static answerRequest(type: RequestType, content: any) {
WebSocketHandler.send(new WebSocketPayload(WebSocketEvent.RESPONSE, false, {type: type, content: content}));
log("Answered " + type + " request");
}
public static sendStatus() {
return new Promise(resolve => {
let payload = new WebSocketPayload(WebSocketEvent.STATUS, false, {status: iTender.status});
WebSocketHandler.send(payload).then(resolve);
});
}
static sendRunningConfig() {
return new Promise(resolve => {
let payload = new WebSocketPayload(WebSocketEvent.CONFIG, false, Settings.json);
WebSocketHandler.send(payload).then(resolve);
});
}
static sendStats() {
return new Promise(async resolve => {
let counts: IDrink[] = [];
for (let drink of (await Drink.find())) {
// @ts-ignore
drink.count = (await Job.countDocuments({drink: drink}));
counts.push(drink)
}
counts.sort((a: IDrink, b: IDrink) => {
// @ts-ignore
if (a.count < b.count)
return -1;
// @ts-ignore
else if (a.count > b.count)
return 1;
else
return 0;
});
let stats = {
"drinks_finished": (await Job.countDocuments({successful: true})),
"drink_most": ( counts.length == 0 ) ? "Keiner" : counts[0].name,
"count_ingredients": (await Ingredient.countDocuments()),
"count_cocktails": (await Drink.countDocuments())
};
let payload = new WebSocketPayload(WebSocketEvent.RESPONSE, false, {
type: RequestType.STATS,
content: stats
});
WebSocketHandler.send(payload).then(resolve);
});
}
static sendContainers() {
return new Promise(async resolve => {
let payload = new WebSocketPayload(WebSocketEvent.CONTAINERS, false, (await Container.find()));
WebSocketHandler.send(payload).then(resolve);
})
}
static sendDrinks() {
return new Promise(async resolve => {
let payload = new WebSocketPayload(WebSocketEvent.DRINKS, false, iTender.drinks);
WebSocketHandler.send(payload).then(resolve);
})
}
}