Skip to content

Commit 45f5d1b

Browse files
authored
Merge pull request #81 from boostcampwm-2024/dev-be
[MERGE] 프론트, 백엔드 통합 준비
2 parents 61d958d + 7b8d5f8 commit 45f5d1b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+6398
-3547
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
!.yarn/sdks
66
!.yarn/versions
77

8+
.DS_Store
89
.idea
910

1011
# Swap the comments on the following lines if you wish to use zero-installs

.yarn/sdks/integrations.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33

44
integrations:
55
- vscode
6+

backend/.env

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
OBJECT_STORAGE_ACCESS_KEY_ID: ncp_iam_BPAMKR1RRjFz97yoco59
2+
OBJECT_STORAGE_SECRET_ACCESS_KEY: ncp_iam_BPKMKRWpU9HKDIyLUCrSzk0ZZTQiKTTYay
3+
OBJECT_STORAGE_REGION: kr-standard
4+
OBJECT_STORAGE_ENDPOINT: https://kr.object.ncloudstorage.com
5+
OBJECT_STORAGE_BUCKET_NAME: web22

backend/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
node_modules
2+
ffmpeg
3+
nodeMediaServer/media/*
4+
5+
.env

backend/nodeMediaServer/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# nodeMediaServer

backend/nodeMediaServer/package.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"name": "nodeMediaServer",
3+
"version": "2.7.0",
4+
"description": "A Node.js implementation of RTMP Server",
5+
"bin": "bin/app.js",
6+
"main": "src/node_media_server.js",
7+
"types": "types/index.d.ts",
8+
"packageManager": "[email protected]",
9+
"scripts": {
10+
"start": ""
11+
},
12+
"keywords": [
13+
"rtmp",
14+
"flv",
15+
"server"
16+
],
17+
"bugs": {
18+
"url": "https://github.com/illuspas/Node-Media-Server/issues"
19+
},
20+
"homepage": "https://github.com/illuspas/Node-Media-Server#readme",
21+
"dependencies": {
22+
"@aws-sdk/client-s3": "^3.685.0",
23+
"aws-sdk": "^2.1691.0",
24+
"basic-auth-connect": "^1.0.0",
25+
"body-parser": "^1.20.3",
26+
"chalk": "^4.1.0",
27+
"dateformat": "^4.6.3",
28+
"dotenv": "^16.4.5",
29+
"express": "^4.19.2",
30+
"http2-express-bridge": "^1.0.7",
31+
"lodash": "^4.17.21",
32+
"minimist": "^1.2.8",
33+
"mkdirp": "^2.1.5",
34+
"ws": "^8.13.0"
35+
}
36+
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
//
2+
// Created by Mingliang Chen on 19/4/11.
3+
// illuspas[a]gmail.com
4+
// Copyright (c) 2019 Nodemedia. All rights reserved.
5+
//
6+
const { get, set } = require('lodash');
7+
const Express = require('express');
8+
const { once } = require('events');
9+
10+
/**
11+
* get all relay tasks
12+
* @param {Express.Request} req
13+
* @param {Express.Response} res
14+
* @param {*} next
15+
*/
16+
function getStreams(req, res, next) {
17+
let stats = {};
18+
this.sessions.forEach(function (session, id) {
19+
if (session.constructor.name !== 'NodeRelaySession') {
20+
return;
21+
}
22+
23+
let { app, name } = session.conf;
24+
25+
if (!get(stats, [app, name])) {
26+
set(stats, [app, name], {
27+
relays: [],
28+
});
29+
}
30+
31+
stats[app][name]['relays'].push({
32+
app: app,
33+
name: name,
34+
path: session.conf.inPath,
35+
url: session.conf.ouPath,
36+
mode: session.conf.mode,
37+
ts: session.ts,
38+
id: id,
39+
});
40+
});
41+
res.json(stats);
42+
}
43+
44+
/**
45+
* get relay task by id
46+
* @param {Express.Request} req
47+
* @param {Express.Response} res
48+
* @param {*} next
49+
*/
50+
function getStreamByID(req, res, next) {
51+
const relaySession = Array.from(this.sessions.values()).filter(
52+
(session) =>
53+
session.constructor.name === 'NodeRelaySession' &&
54+
req.params.id === session.id
55+
);
56+
const relays = relaySession.map((item) => ({
57+
app: item.conf.app,
58+
name: item.conf.name,
59+
path: item.conf.inPath,
60+
url: item.conf.ouPath,
61+
mode: item.conf.mode,
62+
ts: item.ts,
63+
id: item.id,
64+
}));
65+
res.json(relays);
66+
}
67+
68+
/**
69+
* get relay task by name
70+
* @param {Express.Request} req
71+
* @param {Express.Response} res
72+
* @param {*} next
73+
*/
74+
function getStreamByName(req, res, next) {
75+
const relaySession = Array.from(this.sessions.values()).filter(
76+
(session) =>
77+
session.constructor.name === 'NodeRelaySession' &&
78+
req.params.app === session.conf.app &&
79+
req.params.name === session.conf.name
80+
);
81+
const relays = relaySession.map((item) => ({
82+
app: item.conf.app,
83+
name: item.conf.name,
84+
url: item.conf.ouPath,
85+
mode: item.conf.mode,
86+
ts: item.ts,
87+
id: item.id,
88+
}));
89+
res.json(relays);
90+
}
91+
92+
/**
93+
* create relay url to url task
94+
* @param {Express.Request} req
95+
* @param {Express.Response} res
96+
* @param {*} next
97+
*/
98+
async function relayStream(req, res, next) {
99+
let path = req.body.path;
100+
let url = req.body.url;
101+
if (path && url) {
102+
process.nextTick(() => this.nodeEvent.emit('relayTask', path, url));
103+
let ret = await once(this.nodeEvent, 'relayTaskDone');
104+
res.send(ret[0]);
105+
} else {
106+
res.sendStatus(400);
107+
}
108+
}
109+
110+
111+
/**
112+
* create relay pull task
113+
* @param {Express.Request} req
114+
* @param {Express.Response} res
115+
* @param {*} next
116+
*/
117+
async function pullStream(req, res, next) {
118+
let url = req.body.url;
119+
let app = req.body.app;
120+
let name = req.body.name;
121+
let rtsp_transport = req.body.rtsp_transport ? req.body.rtsp_transport : null;
122+
if (url && app && name) {
123+
process.nextTick(() => this.nodeEvent.emit('relayPull', url, app, name, rtsp_transport));
124+
let ret = await once(this.nodeEvent, 'relayPullDone');
125+
res.send(ret[0]);
126+
127+
} else {
128+
res.sendStatus(400);
129+
}
130+
}
131+
132+
/**
133+
* create relay push task
134+
* @param {Express.Request} req
135+
* @param {Express.Response} res
136+
* @param {*} next
137+
*/
138+
async function pushStream(req, res, next) {
139+
let url = req.body.url;
140+
let app = req.body.app;
141+
let name = req.body.name;
142+
if (url && app && name) {
143+
process.nextTick(() => this.nodeEvent.emit('relayPush', url, app, name));
144+
let ret = await once(this.nodeEvent, 'relayPushDone');
145+
res.send(ret[0]);
146+
} else {
147+
res.sendStatus(400);
148+
}
149+
}
150+
151+
/**
152+
* delete relay task
153+
* @param {Express.Request} req
154+
* @param {Express.Response} res
155+
* @param {*} next
156+
*/
157+
function delStream(req, res, next) {
158+
let relaySession = this.sessions.get(req.params.id);
159+
if (relaySession) {
160+
relaySession.end();
161+
res.sendStatus(200);
162+
} else {
163+
res.sendStatus(404);
164+
}
165+
}
166+
167+
module.exports = {
168+
getStreams,
169+
getStreamByID,
170+
getStreamByName,
171+
relayStream,
172+
pullStream,
173+
pushStream,
174+
delStream,
175+
};
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
//
2+
// Created by Mingliang Chen on 17/12/24. Merry Christmas
3+
// illuspas[a]gmail.com
4+
// Copyright (c) 2018 Nodemedia. All rights reserved.
5+
//
6+
7+
const OS = require('os');
8+
const Package = require('../../../package.json');
9+
function cpuAverage() {
10+
11+
//Initialise sum of idle and time of cores and fetch CPU info
12+
let totalIdle = 0, totalTick = 0;
13+
let cpus = OS.cpus();
14+
15+
//Loop through CPU cores
16+
for (let i = 0, len = cpus.length; i < len; i++) {
17+
18+
//Select CPU core
19+
let cpu = cpus[i];
20+
21+
//Total up the time in the cores tick
22+
for (type in cpu.times) {
23+
totalTick += cpu.times[type];
24+
}
25+
26+
//Total up the idle time of the core
27+
totalIdle += cpu.times.idle;
28+
}
29+
30+
//Return the average Idle and Tick times
31+
return { idle: totalIdle / cpus.length, total: totalTick / cpus.length };
32+
}
33+
34+
function percentageCPU() {
35+
return new Promise(function (resolve, reject) {
36+
let startMeasure = cpuAverage();
37+
setTimeout(() => {
38+
let endMeasure = cpuAverage();
39+
//Calculate the difference in idle and total time between the measures
40+
let idleDifference = endMeasure.idle - startMeasure.idle;
41+
let totalDifference = endMeasure.total - startMeasure.total;
42+
43+
//Calculate the average percentage CPU usage
44+
let percentageCPU = 100 - ~~(100 * idleDifference / totalDifference);
45+
resolve(percentageCPU);
46+
}, 100);
47+
});
48+
}
49+
50+
function getSessionsInfo(sessions) {
51+
let info = {
52+
inbytes: 0,
53+
outbytes: 0,
54+
rtmp: 0,
55+
http: 0,
56+
ws: 0,
57+
};
58+
59+
for (let session of sessions.values()) {
60+
if (session.TAG === 'relay') continue;
61+
let socket = session.TAG === 'rtmp' ? session.socket : session.req.socket;
62+
info.inbytes += socket.bytesRead;
63+
info.outbytes += socket.bytesWritten;
64+
info.rtmp += session.TAG === 'rtmp' ? 1 : 0;
65+
info.http += session.TAG === 'http-flv' ? 1 : 0;
66+
info.ws += session.TAG === 'websocket-flv' ? 1 : 0;
67+
}
68+
69+
return info;
70+
}
71+
72+
73+
function getInfo(req, res, next) {
74+
let s = this.sessions;
75+
percentageCPU().then((cpuload) => {
76+
let sinfo = getSessionsInfo(s);
77+
let info = {
78+
os: {
79+
arch: OS.arch(),
80+
platform: OS.platform(),
81+
release: OS.release(),
82+
},
83+
cpu: {
84+
num: OS.cpus().length,
85+
load: cpuload,
86+
model: OS.cpus()[0].model,
87+
speed: OS.cpus()[0].speed,
88+
},
89+
mem: {
90+
totle: OS.totalmem(),
91+
free: OS.freemem()
92+
},
93+
net: {
94+
inbytes: this.stat.inbytes + sinfo.inbytes,
95+
outbytes: this.stat.outbytes + sinfo.outbytes,
96+
},
97+
nodejs: {
98+
uptime: Math.floor(process.uptime()),
99+
version: process.version,
100+
mem: process.memoryUsage()
101+
},
102+
clients: {
103+
accepted: this.stat.accepted,
104+
active: this.sessions.size - this.idlePlayers.size,
105+
idle: this.idlePlayers.size,
106+
rtmp: sinfo.rtmp,
107+
http: sinfo.http,
108+
ws: sinfo.ws
109+
},
110+
version: Package.version
111+
};
112+
res.json(info);
113+
});
114+
}
115+
116+
exports.getInfo = getInfo;

0 commit comments

Comments
 (0)