This commit is contained in:
2024-11-12 14:34:17 +05:00
parent 312082d94c
commit 1cf520814e
8 changed files with 205 additions and 20 deletions
+48
View File
@@ -36,11 +36,15 @@ const child_process_1 = require("child_process");
const tree_kill_1 = __importDefault(require("tree-kill"));
const SessionServer_1 = __importDefault(require("./models/SessionServer"));
const ActiveSession_1 = __importDefault(require("./models/ActiveSession"));
const node_cron_1 = require("node-cron");
const sendMessage_1 = __importDefault(require("./routes/sendMessage"));
const ServerStatusLog_1 = __importDefault(require("./models/ServerStatusLog"));
(0, db_1.default)();
const app = (0, express_1.default)();
const port = process.env.PORT;
app.use((0, express_1.json)());
app.use((0, cors_1.default)());
app.use("/sendMessage", sendMessage_1.default);
const serverLocation = process.env.SERVER_LOCATION;
const serverName = process.env.SERVER_NAME;
const serverType = process.env.SERVER_TYPE;
@@ -170,6 +174,10 @@ async function endSession(activeSessionId) {
}
async function init() {
try {
await ServerStatusLog_1.default.create({
hostname: serverHostname,
action: "online",
});
await SessionServer_1.default.findOneAndUpdate({ hostname: serverHostname }, {
location: serverLocation,
name: serverName,
@@ -210,3 +218,43 @@ app.listen(port, () => {
console.log(`Server is listening on port ${port}`);
init();
});
(0, node_cron_1.schedule)("*/3 * * * * *", async () => {
// TODO - hostname
try {
const activeSessions = await ActiveSession_1.default.find({
location: serverLocation,
name: serverName,
});
for (const activeSession of activeSessions) {
const { ueProcessId, buildName, uePort, id } = activeSession;
const { stdout } = await execAsync(`wmic process where processId=${ueProcessId}`, { windowsHide: true });
const ueProcessInfo = stdout.trim();
if (ueProcessInfo)
return;
const filePath = `C:/pixel-streaming/builds/${buildName}/${buildName}.exe`;
const newUeProcess = (0, child_process_1.execFile)(filePath, [
"-PixelStreamingIP=127.0.0.1",
`-PixelStreamingPort=${uePort}`,
"-RenderOffScreen",
"-ForceRes",
"-ResX=1920",
"-ResY=1080",
"-Unattended",
"-PixelStreamingWebRTCMinBitrate=5000000",
"-PixelStreamingWebRTCMaxBitrate=20000000",
"-PixelStreamingH264Profile=HIGH",
"-PixelStreamingWebRTCDisableReceiveAudio=true",
"-PixelStreamingEncoderRateControl=VBR",
// "-PixelStreamingHudStats=true",
// `-SessionID=${session.id}`,
]);
const newUeProcesscessId = newUeProcess.pid;
await ActiveSession_1.default.findByIdAndUpdate(id, {
ueProcessId: newUeProcesscessId,
});
}
}
catch (error) {
console.log(error);
}
});
-9
View File
@@ -1,9 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const router = (0, express_1.Router)();
router.post("/", async (req, res) => {
res.json({ ok: 1 });
});
const registerRouter = router;
exports.default = registerRouter;
+4
View File
@@ -14,6 +14,8 @@
"express": "^4.18.2",
"jsonwebtoken": "^9.0.2",
"mongoose": "^8.2.0",
"node-cron": "^3.0.3",
"nodemailer": "^6.9.15",
"tree-kill": "^1.2.2"
},
"devDependencies": {
@@ -22,6 +24,8 @@
"@types/express": "^4.17.21",
"@types/jsonwebtoken": "^9.0.6",
"@types/node": "^20.11.20",
"@types/node-cron": "^3.0.11",
"@types/nodemailer": "^6.4.16",
"nodemon": "^3.1.0",
"ts-node": "^10.9.2",
"typescript": "^5.3.3"
+60
View File
@@ -8,6 +8,9 @@ import { exec, execFile } from "child_process";
import treeKill from "tree-kill";
import SessionServer from "./models/SessionServer";
import ActiveSession from "./models/ActiveSession";
import { schedule } from "node-cron";
import sendMessageRoute from "./routes/sendMessage";
import ServerStatusLog from "./models/ServerStatusLog";
connectDB();
@@ -17,6 +20,8 @@ const port = process.env.PORT;
app.use(json());
app.use(cors());
app.use("/sendMessage", sendMessageRoute);
const serverLocation = process.env.SERVER_LOCATION;
const serverName = process.env.SERVER_NAME;
const serverType = process.env.SERVER_TYPE;
@@ -182,6 +187,11 @@ async function endSession(activeSessionId: string) {
async function init() {
try {
await ServerStatusLog.create({
hostname: serverHostname,
action: "online",
});
await SessionServer.findOneAndUpdate(
{ hostname: serverHostname },
{
@@ -236,3 +246,53 @@ app.listen(port, () => {
console.log(`Server is listening on port ${port}`);
init();
});
schedule("*/3 * * * * *", async () => {
// TODO - hostname
try {
const activeSessions = await ActiveSession.find({
location: serverLocation,
name: serverName,
});
for (const activeSession of activeSessions) {
const { ueProcessId, buildName, uePort, id } = activeSession;
const { stdout } = await execAsync(
`wmic process where processId=${ueProcessId}`,
{ windowsHide: true }
);
const ueProcessInfo = stdout.trim();
if (ueProcessInfo) return;
const filePath = `C:/pixel-streaming/builds/${buildName}/${buildName}.exe`;
const newUeProcess = execFile(filePath, [
"-PixelStreamingIP=127.0.0.1",
`-PixelStreamingPort=${uePort}`,
"-RenderOffScreen",
"-ForceRes",
"-ResX=1920",
"-ResY=1080",
"-Unattended",
"-PixelStreamingWebRTCMinBitrate=5000000",
"-PixelStreamingWebRTCMaxBitrate=20000000",
"-PixelStreamingH264Profile=HIGH",
"-PixelStreamingWebRTCDisableReceiveAudio=true",
"-PixelStreamingEncoderRateControl=VBR",
// "-PixelStreamingHudStats=true",
// `-SessionID=${session.id}`,
]);
const newUeProcesscessId = newUeProcess.pid;
await ActiveSession.findByIdAndUpdate(id, {
ueProcessId: newUeProcesscessId,
});
}
} catch (error) {
console.log(error);
}
});
+23
View File
@@ -0,0 +1,23 @@
import { model, Schema } from "mongoose";
const serverStatusLogSchema = new Schema(
{
hostname: {
type: String,
required: true,
},
action: {
type: String,
required: true,
},
},
{
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
}
);
const ServerStatusLog = model("ServerStatusLog", serverStatusLogSchema);
export default ServerStatusLog;
+41
View File
@@ -0,0 +1,41 @@
import { Router } from "express";
import { createTransport } from "nodemailer";
import fs from "fs";
const router = Router();
router.post("/", async (req, res) => {
console.log(req.body);
try {
const transporter = createTransport({
host: req.body.host,
port: req.body.port,
secure: true, // true for 465, false for other ports
auth: {
user: req.body.from, // generated ethereal user
pass: req.body.password, // generated ethereal password
},
});
const files = fs.readdirSync(req.body.path);
// send mail with defined transport object
await transporter.sendMail({
from: req.body.from, // sender address
to: req.body.to, // list of receivers
subject: req.body.subject, // Subject line
html: req.body.text, // html body
attachments: files.map((file) => ({ path: `${req.body.path}/${file}` })), // attachment files
});
return res.json({ ok: 1 });
} catch (error) {
console.log(error);
return res.json({ error: 1 });
}
});
const sendMessageRoute = router;
export default sendMessageRoute;
-11
View File
@@ -1,11 +0,0 @@
import { Router } from "express";
const router = Router();
router.get("/", async (_req, res) => {
res.json({ ok: 1 });
});
const testRouter = router;
export default testRouter;
+29
View File
@@ -140,6 +140,11 @@
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690"
integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
"@types/node-cron@^3.0.11":
version "3.0.11"
resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.11.tgz#70b7131f65038ae63cfe841354c8aba363632344"
integrity sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==
"@types/node@*", "@types/node@^20.11.20":
version "20.11.24"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
@@ -147,6 +152,13 @@
dependencies:
undici-types "~5.26.4"
"@types/nodemailer@^6.4.16":
version "6.4.16"
resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.16.tgz#db006abcb1e1c8e6ea2fb53b27fefec3c03eaa6c"
integrity sha512-uz6hN6Pp0upXMcilM61CoKyjT7sskBoOWpptkjjJp8jIMlTdc3xG01U7proKkXzruMS4hS0zqtHNkNPFB20rKQ==
dependencies:
"@types/node" "*"
"@types/qs@*":
version "6.9.12"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.12.tgz#afa96b383a3a6fdc859453a1892d41b607fc7756"
@@ -977,6 +989,13 @@ node-addon-api@^5.0.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
node-cron@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.3.tgz#c4bc7173dd96d96c50bdb51122c64415458caff2"
integrity sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==
dependencies:
uuid "8.3.2"
node-fetch@^2.6.7:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
@@ -984,6 +1003,11 @@ node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
nodemailer@^6.9.15:
version "6.9.15"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.15.tgz#57b79dc522be27e0e47ac16cc860aa0673e62e04"
integrity sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==
nodemon@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9"
@@ -1383,6 +1407,11 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
uuid@8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
v8-compile-cache-lib@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"