-
Notifications
You must be signed in to change notification settings - Fork 0
/
socket.ts
130 lines (116 loc) · 3.22 KB
/
socket.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import type { Server, Socket } from "socket.io";
import { useReadings } from "~/hooks/useReadings";
import {
getStationByUUID,
createStation,
updateStationLastContactedAt,
} from "~/models/stations";
type SocketBootData = {
uuid: string;
name: string;
location: string;
};
type SocketData = SocketBootData & {
epoch: number;
temperature: number;
pressure: number;
humidity: number;
iaq: number;
staticIaq: number;
eco2: number;
bvoc: number;
gasResistance: number;
gasPercentage: number;
iaqAccuracy: 0 | 1 | 2 | 3;
staticIaqAccuracy: 0 | 1 | 2 | 3;
bvocAccuracy: 0 | 1 | 2 | 3;
co2Accuracy: 0 | 1 | 2 | 3;
gasPercentageAccuracy: 0 | 1 | 2 | 3;
stabStatus: 0 | 1;
runInStatus: 0 | 1;
vbat: number;
};
interface ServerToClientEvents {
ack: (s: string) => void;
msg: (o: SocketData) => void;
boot: (o: SocketBootData) => void;
}
interface ClientToServerEvents {
msg: (o: SocketData) => void;
boot: (o: SocketBootData) => void;
disconnect: () => void;
}
interface InterServerEvents {
ping: () => void;
ack: () => void;
}
const LOG_PREFIX = "[WSS]";
const handleSocketEvent = (
socket: Socket,
io: Server<
ClientToServerEvents,
ServerToClientEvents,
InterServerEvents,
SocketData
>,
) => {
console.log(
[LOG_PREFIX, "New client with id", socket.id, "connected"].join(" "),
);
socket.emit("ack", "connected!");
console.dir(socket.handshake.headers["user-agent"]);
// When we receive a boot message from a station we create the station
// if it doesn't already exist. Once created we broadcast the boot
// message to all other clients (the browsers) so they can update their
// UIs.
socket.on("boot", ({ uuid, name, location }: SocketBootData) => {
console.log(
[LOG_PREFIX, "Got boot message from", socket.id, ":"].join(" "),
);
console.dir({ uuid, name, location });
getStationByUUID(uuid).then((station) => {
if (station) {
updateStationLastContactedAt(uuid).then((station) => {
console.log(
[LOG_PREFIX, "Station with UUID", station.uuid, "updated:"].join(
" ",
),
);
console.dir(station);
});
return;
}
createStation(uuid, name).then((station) => {
console.log(
[LOG_PREFIX, "Station with UUID", station.uuid, "created:"].join(" "),
);
console.dir(station);
socket.broadcast.emit("boot", { uuid, name, location });
});
});
});
// When we receive a message from a station we broadcast it to all other
// clients (the browsers) so they can update their UIs. We also save the
// readings to the database.
socket.on("msg", (data: SocketData) => {
console.log([LOG_PREFIX, "Got message from", socket.id, ":"].join(" "));
console.dir(data);
socket.broadcast.emit("msg", data);
useReadings({ data }).then((readings) => {
readings && console.dir(readings);
});
});
socket.on("disconnect", (_reason) => {
console.log(
[LOG_PREFIX, "Client with id", socket.id, "disconnected."].join(" "),
);
});
};
export { handleSocketEvent };
export type {
ServerToClientEvents,
ClientToServerEvents,
InterServerEvents,
SocketData,
SocketBootData,
};