-
Notifications
You must be signed in to change notification settings - Fork 0
/
webSocketServer.js
93 lines (79 loc) · 2.65 KB
/
webSocketServer.js
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
import WebSocket, { WebSocketServer } from "ws";
import chalkTemplate from "chalk-template";
const messages = {
running: () => chalkTemplate`
WebSocket Server is running on port {bold 8080}
${new Date().toTimeString()}
`,
connected: () => chalkTemplate`
WebSocket status: {bold.green connected}
${new Date().toTimeString()}
`,
};
const getHandlers = (mockFile) => {
const wsHandler = (method, func) => ({ [method]: func(method) });
const listGetter = () => (method) => (request, response) =>
response({
result: mockFile[request.method] || [],
});
const byIdGetter =
(path, id = "system_id") =>
(defaultPath) =>
(request, response) => {
response({
result: request.params
? mockFile[path || defaultPath].find?.(
(node) => node[id] === request.params[id]
)
: null,
});
};
return [
wsHandler("*", listGetter()),
wsHandler("machine.get", byIdGetter()),
wsHandler("controller.check_images", byIdGetter()),
wsHandler("device.get", byIdGetter()),
wsHandler("controller.set_active", byIdGetter()),
wsHandler("controller.get", byIdGetter("controller.set_active")),
];
};
async function main(getMockData) {
const webSocketServer = new WebSocketServer({ noServer: true });
console.log(messages.running());
const LOG_LEVEL = process.env.LOG_LEVEL || "normal";
const isLogLevelVerbose = LOG_LEVEL === "verbose";
webSocketServer.on("connection", async function connection(ws) {
console.log(messages.connected());
ws.on("close", async function close() {
ws.close(1000);
});
ws.on("message", async function message(data) {
const dataString = data.toString();
isLogLevelVerbose && console.log("received: %s", dataString);
const { method, request_id, params } = JSON.parse(dataString);
const mockData = await getMockData();
const handlersObj = getHandlers(mockData).reduce(
(acc, curr) => ({ ...acc, ...curr }),
{}
);
const handlerFunc = handlersObj[method] || handlersObj["*"];
handlerFunc({ method, request_id, params }, (message) => {
const responseMessage = JSON.stringify({
request_id,
...message,
rtype: 0,
type: 1,
});
ws.send(responseMessage);
isLogLevelVerbose && console.log("message sent", responseMessage);
webSocketServer.clients.forEach(function each(client) {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(responseMessage);
}
});
});
});
});
return webSocketServer;
}
export default main;