Merged release/2024-11-22 into feature/IO-3000-messaging-sockets-migrationv2
This commit is contained in:
10
package-lock.json
generated
10
package-lock.json
generated
@@ -29,6 +29,7 @@
|
|||||||
"compression": "^1.7.5",
|
"compression": "^1.7.5",
|
||||||
"cookie-parser": "^1.4.7",
|
"cookie-parser": "^1.4.7",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
|
"crisp-status-reporter": "^1.2.2",
|
||||||
"csrf": "^3.1.0",
|
"csrf": "^3.1.0",
|
||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
@@ -4192,6 +4193,15 @@
|
|||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/crisp-status-reporter": {
|
||||||
|
"version": "1.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/crisp-status-reporter/-/crisp-status-reporter-1.2.2.tgz",
|
||||||
|
"integrity": "sha512-uRkNJdeqaQLllEiTO7H1uAgz99TycbyuEwjookSsZCsPmz7Igvv2o/M4GOBcu8OF0+s0R9WbOBG2VzRBdDGTTQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-fetch": {
|
"node_modules/cross-fetch": {
|
||||||
"version": "3.1.8",
|
"version": "3.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
"compression": "^1.7.5",
|
"compression": "^1.7.5",
|
||||||
"cookie-parser": "^1.4.7",
|
"cookie-parser": "^1.4.7",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
|
"crisp-status-reporter": "^1.2.2",
|
||||||
"csrf": "^3.1.0",
|
"csrf": "^3.1.0",
|
||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ const { applyIOHelpers } = require("./server/utils/ioHelpers");
|
|||||||
const { redisSocketEvents } = require("./server/web-sockets/redisSocketEvents");
|
const { redisSocketEvents } = require("./server/web-sockets/redisSocketEvents");
|
||||||
const { ElastiCacheClient, DescribeCacheClustersCommand } = require("@aws-sdk/client-elasticache");
|
const { ElastiCacheClient, DescribeCacheClustersCommand } = require("@aws-sdk/client-elasticache");
|
||||||
const { InstanceRegion } = require("./server/utils/instanceMgr");
|
const { InstanceRegion } = require("./server/utils/instanceMgr");
|
||||||
|
const StartStatusReporter = require("./server/utils/statusReporter");
|
||||||
|
|
||||||
const CLUSTER_RETRY_BASE_DELAY = 100;
|
const CLUSTER_RETRY_BASE_DELAY = 100;
|
||||||
const CLUSTER_RETRY_MAX_DELAY = 5000;
|
const CLUSTER_RETRY_MAX_DELAY = 5000;
|
||||||
@@ -297,6 +298,8 @@ const main = async () => {
|
|||||||
applyRoutes({ app });
|
applyRoutes({ app });
|
||||||
redisSocketEvents({ io: ioRedis, redisHelpers, ioHelpers, logger });
|
redisSocketEvents({ io: ioRedis, redisHelpers, ioHelpers, logger });
|
||||||
|
|
||||||
|
StartStatusReporter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await server.listen(port);
|
await server.listen(port);
|
||||||
logger.log(`Server started on port ${port}`, "INFO", "api");
|
logger.log(`Server started on port ${port}`, "INFO", "api");
|
||||||
|
|||||||
26
server/utils/getHostNameOrIP.js
Normal file
26
server/utils/getHostNameOrIP.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// Load environment variables THIS MUST BE AT THE TOP
|
||||||
|
const path = require("path");
|
||||||
|
require("dotenv").config({
|
||||||
|
path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`)
|
||||||
|
});
|
||||||
|
|
||||||
|
const { networkInterfaces, hostname } = require("node:os");
|
||||||
|
|
||||||
|
const getHostNameOrIP = () => {
|
||||||
|
// Try to get the hostname first
|
||||||
|
const hostName = hostname();
|
||||||
|
if (hostName) return hostName;
|
||||||
|
|
||||||
|
const interfaces = networkInterfaces();
|
||||||
|
for (const name of Object.keys(interfaces)) {
|
||||||
|
for (const iface of interfaces[name]) {
|
||||||
|
if (iface.family === "IPv4" && !iface.internal) {
|
||||||
|
return iface.address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "127.0.0.1";
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = getHostNameOrIP;
|
||||||
@@ -8,10 +8,10 @@ const InstanceManager = require("../utils/instanceMgr").default;
|
|||||||
const winston = require("winston");
|
const winston = require("winston");
|
||||||
const WinstonCloudWatch = require("winston-cloudwatch");
|
const WinstonCloudWatch = require("winston-cloudwatch");
|
||||||
const { isString, isEmpty } = require("lodash");
|
const { isString, isEmpty } = require("lodash");
|
||||||
const { networkInterfaces, hostname } = require("node:os");
|
|
||||||
const { uploadFileToS3 } = require("./s3");
|
const { uploadFileToS3 } = require("./s3");
|
||||||
const { v4 } = require("uuid");
|
const { v4 } = require("uuid");
|
||||||
const { InstanceRegion } = require("./instanceMgr");
|
const { InstanceRegion } = require("./instanceMgr");
|
||||||
|
const getHostNameOrIP = require("./getHostNameOrIP");
|
||||||
|
|
||||||
const LOG_LEVELS = {
|
const LOG_LEVELS = {
|
||||||
error: { level: 0, name: "error" },
|
error: { level: 0, name: "error" },
|
||||||
@@ -76,22 +76,6 @@ const createLogger = () => {
|
|||||||
})();
|
})();
|
||||||
};
|
};
|
||||||
|
|
||||||
const getHostNameOrIP = () => {
|
|
||||||
// Try to get the hostname first
|
|
||||||
const hostName = hostname();
|
|
||||||
if (hostName) return hostName;
|
|
||||||
|
|
||||||
const interfaces = networkInterfaces();
|
|
||||||
for (const name of Object.keys(interfaces)) {
|
|
||||||
for (const iface of interfaces[name]) {
|
|
||||||
if (iface.family === "IPv4" && !iface.internal) {
|
|
||||||
return iface.address;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "127.0.0.1";
|
|
||||||
};
|
|
||||||
const createProductionTransport = (level, logStreamName, filters) => {
|
const createProductionTransport = (level, logStreamName, filters) => {
|
||||||
return new WinstonCloudWatch({
|
return new WinstonCloudWatch({
|
||||||
level,
|
level,
|
||||||
|
|||||||
52
server/utils/statusReporter.js
Normal file
52
server/utils/statusReporter.js
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// Load environment variables THIS MUST BE AT THE TOP
|
||||||
|
const path = require("path");
|
||||||
|
const getHostNameOrIP = require("./getHostNameOrIP");
|
||||||
|
const logger = require("./logger");
|
||||||
|
require("dotenv").config({
|
||||||
|
path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`)
|
||||||
|
});
|
||||||
|
const CrispStatusReporter = require("crisp-status-reporter").CrispStatusReporter;
|
||||||
|
const InstanceManager = require("../utils/instanceMgr").default;
|
||||||
|
|
||||||
|
function StartStatusReporter() {
|
||||||
|
//For ImEX Online.
|
||||||
|
|
||||||
|
InstanceManager({
|
||||||
|
executeFunction: true,
|
||||||
|
args: [],
|
||||||
|
imex: () => {
|
||||||
|
if (
|
||||||
|
process.env.NODE_ENV === undefined ||
|
||||||
|
!process.env.CRISP_SECRET_TOKEN ||
|
||||||
|
!process.env.CRISP_SERVICE_IDENTIFIER ||
|
||||||
|
!process.env.CRISP_NODE_IDENTIFIER
|
||||||
|
) {
|
||||||
|
logger.log("crisp-status-update-error", "DEBUG", null, null, { message: "Environment Variables not set." });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const crispStatusReporter = new CrispStatusReporter({
|
||||||
|
token: process.env.CRISP_SECRET_TOKEN, // Your reporter token (given by Crisp)
|
||||||
|
service_id: process.env.CRISP_SERVICE_IDENTIFIER, // Service ID containing the parent Node for Replica (given by Crisp)
|
||||||
|
node_id: process.env.CRISP_NODE_IDENTIFIER, // Node ID containing Replica (given by Crisp)
|
||||||
|
replica_id: getHostNameOrIP(), // Unique Replica ID for instance (ie. your IP on the LAN)
|
||||||
|
interval: 30, // Reporting interval (in seconds; defaults to 30 seconds if not set)
|
||||||
|
|
||||||
|
console: {
|
||||||
|
debug: (log_message, data) => logger.log("crisp-status-update", "DEBUG", null, null, { log_message, data }),
|
||||||
|
log: (log_message, data) => logger.log("crisp-status-update", "DEBUG", null, null, { log_message, data }),
|
||||||
|
warn: (log_message, data) => logger.log("crisp-status-update", "WARN", null, null, { log_message, data }),
|
||||||
|
error: (log_message, data) => logger.log("crisp-status-update", "ERROR", null, null, { log_message, data })
|
||||||
|
} // Console instance if you need to debug issues,
|
||||||
|
});
|
||||||
|
|
||||||
|
return crispStatusReporter;
|
||||||
|
} catch (error) {
|
||||||
|
logger.log("crisp-status-update-error", "DEBUG", null, null, { error: error.message });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = StartStatusReporter;
|
||||||
Reference in New Issue
Block a user