93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
/*
|
||
! /servers/gateway/functions.js – Central Gateway Server Functions
|
||
? This modules exports the functionality for the express gateway server
|
||
*/
|
||
|
||
// % import nodejs dependencies
|
||
const WebSocket = require('ws');
|
||
|
||
// % core variables
|
||
const ip = process.env.INTERNAL_HOST_IP;
|
||
const port = process.env.INTERNAL_GATEWAY_PORT;
|
||
|
||
// % create a reference for the websocket client
|
||
let wsClient = null;
|
||
|
||
// % create an event emitter for the gateway
|
||
const EventEmitter = require('events');
|
||
const gatewayEvents = new EventEmitter();
|
||
|
||
// $ helper: send messages through websocket
|
||
function sendToWs(payload) {
|
||
if (wsClient && wsClient.readyState === WebSocket.OPEN) {
|
||
wsClient.send(JSON.stringify(payload));
|
||
} else {
|
||
console.error('WebSocket not connected.');
|
||
}
|
||
}
|
||
|
||
// $ server start function
|
||
async function boot(server) {
|
||
// ~ start express server
|
||
server.listen(port, ip, () => {
|
||
console.info(`Express server is now running on http://${ip}:${port}`);
|
||
});
|
||
|
||
// ~ connect to the websocket server
|
||
const wsUrl = `ws://${process.env.INTERNAL_HOST_IP}:${process.env.INTERNAL_WEBSOCKET_PORT}?key=${process.env.INTERNAL_SECRET}&codename=gateway`;
|
||
wsClient = new WebSocket(wsUrl);
|
||
|
||
wsClient.on('open', () => {
|
||
console.info('Connected to central websocket server');
|
||
});
|
||
|
||
wsClient.on('message', (data) => {
|
||
const msg = JSON.parse(data);
|
||
gatewayEvents.emit('ws_message', msg);
|
||
});
|
||
|
||
wsClient.on('error', (err) => {
|
||
console.error('WebSocket error:', err.message);
|
||
});
|
||
|
||
// ~ return running express server reference
|
||
return server;
|
||
};
|
||
|
||
// $ server shutdown function
|
||
async function shutdown(server) {
|
||
// ~ close websocket server
|
||
if (wsClient) {
|
||
wsClient.close();
|
||
wsClient = null;
|
||
}
|
||
|
||
// ~ shutdown running express server
|
||
return new Promise((resolve) => {
|
||
server.close(() => {
|
||
console.info('Express server shut down.');
|
||
resolve(server);
|
||
});
|
||
});
|
||
};
|
||
|
||
// $ server restart function
|
||
async function restart(server) {
|
||
// ~ shutdown the running express server
|
||
await shutdown(server);
|
||
|
||
// ~ restart the express server
|
||
await boot(server);
|
||
|
||
// ~ return the server reference
|
||
return server;
|
||
};
|
||
|
||
// $ server status function
|
||
async function status(server) {
|
||
// ~ get and return server listening status
|
||
return server.listening ? 'online' : 'offline';
|
||
};
|
||
|
||
// § export server functions module
|
||
module.exports = { boot, shutdown, restart, status, sendToWs, gatewayEvents }; |