-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
88 lines (76 loc) · 3.17 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import express, { Request, Response } from "express"
import chalk from "chalk";
import env from "./env"
import { requestButtonsBatteryStatus } from "./button-request";
// Erzeugt eine Express Server Applikation (Web Server)
const server = express()
// Server starten, hört auf Port 3000 und erzeugt Lognachricht, wenn der Server gestartet ist
server.listen(env.server.port, () => console.log(`Server started and listening to port ${env.server.port}`))
// disable default headers
server.disable('x-powered-by')
//
// --- WEB HANDLER handling Requests to this server ----
//
// Verarbeitet GET Anfragen an den REST-Endpunkt `/button/short/1`
server.get("/button/short/1", (req: Request, res: Response) => {
handleRequestSendMessageAndLog(req, res, "short url 1")
})
// Verarbeitet GET Anfragen an den REST-Endpunkt `/button/short/2`
server.get("/button/short/2", (req: Request, res: Response) => {
handleRequestSendMessageAndLog(req, res, "short url 2")
})
// Verarbeitet GET Anfragen an den REST-Endpunkt `/button/short/3`
server.get("/button/short/3", (req: Request, res: Response) => {
handleRequestSendMessageAndLog(req, res, "short url 3")
})
// Verarbeitet GET Anfragen an den REST-Endpunkt `/button/long/1`
server.get("/button/long/1", (req: Request, res: Response) => {
handleRequestSendMessageAndLog(req, res, "long url 1")
})
/**
* Erzeugt eine Nachricht mit Hilfe des Express Antwort-Objekts und
* sendet diese zurück an den Aufrufer.
* @param res Antwort Objekt des Express Webserver
* @param urlName Name der URL, die in der Antwort angezeigt wird
*/
function handleRequestSendMessageAndLog(req: Request, res: Response, urlName: string) {
const message = `'${urlName}' was called`
if (isLogEnabled()) {
logRequestToStdOut(req, message);
}
res.status(200).json({ message })
}
/**
* Loggt eine farbige Nachricht nach `STDOUT`.
* @param req Express Anfrageobjekt
* @param message Nachricht, die in der Lognachricht angezeigt werden soll
*/
async function logRequestToStdOut(req: Request, message: string) {
const shellyButtonIp = extractIpFrom(req)
const currentTimeAsIso = new Date().toISOString();
console.log(`${chalk.yellow(currentTimeAsIso)} ${chalk.blue("SERVER:")} ${chalk.green(message)} from ${chalk.magenta(shellyButtonIp)}`);
const batteryStatus = await requestButtonBattery(shellyButtonIp)
console.log(`${chalk.yellow(currentTimeAsIso)} ${chalk.blue("SERVER:")} ${chalk.green("Shelly status (")}${chalk.yellowBright(shellyButtonIp)}${chalk.green(")")} => ${chalk.blueBright(`Battery ${batteryStatus.bat.value}% and ${batteryStatus.bat.voltage} Volts`)}`);
}
/**
* Sends request to get battery status of the Shelly Button1
* that should requested a resource on this server.
* @param url Ip Address of the Shelly Button1
*/
async function requestButtonBattery(url: string) {
return requestButtonsBatteryStatus(url)
}
/**
* Extracts the IPv4 address from the ip property
* of the express request object.
* @param req express request object
*/
function extractIpFrom(req: Request) {
return req.ip.replace(/^::ffff:/, "")
}
/**
* Prüft, ob die Anwendung loggen soll.
*/
function isLogEnabled() {
return env.enableLog === "true"
}