diff --git a/taoyao-media-server/package.json b/taoyao-media-server/package.json index 38907e4..1f50ffd 100644 --- a/taoyao-media-server/package.json +++ b/taoyao-media-server/package.json @@ -10,10 +10,9 @@ }, "dependencies": { "ws": "^8.12.0", - "debug": "^4.3.1" + "debug": "^4.3.1", + "mediasoup": "file:./mediasoup" }, - "releaseDependencies": { - "mediasoup-local": "file:./mediasoup", - "mediasoup-online": "github:versatica/mediasoup#v3" + "devDependencies": { } } diff --git a/taoyao-media-server/src/Command.js b/taoyao-media-server/src/Command.js index e519265..fb29091 100644 --- a/taoyao-media-server/src/Command.js +++ b/taoyao-media-server/src/Command.js @@ -2,6 +2,9 @@ const Logger = require("./Logger"); const logger = new Logger(); +/** + * 交互式控制台 + */ function openCommandConsole() { logger.info("打开交互式控制台..."); process.stdin.resume(); diff --git a/taoyao-media-server/src/Config.js b/taoyao-media-server/src/Config.js index 45bec43..37a921e 100644 --- a/taoyao-media-server/src/Config.js +++ b/taoyao-media-server/src/Config.js @@ -133,5 +133,5 @@ module.exports = { }, maxSctpMessageSize: 262144, }, - }, + } }; diff --git a/taoyao-media-server/src/Logger.js b/taoyao-media-server/src/Logger.js index 512d821..b02b97d 100644 --- a/taoyao-media-server/src/Logger.js +++ b/taoyao-media-server/src/Logger.js @@ -4,21 +4,20 @@ const debug = require("debug"); const config = require("./Config"); -const APP_NAME = config.name; - class Logger { constructor(prefix) { + const appName = config.name; if (prefix) { - this._debug = debug(`${APP_NAME}:${prefix}`); - this._info = debug(`${APP_NAME}:INFO:${prefix}`); - this._warn = debug(`${APP_NAME}:WARN:${prefix}`); - this._error = debug(`${APP_NAME}:ERROR:${prefix}`); + this._debug = debug(`${appName}:DEBUG:${prefix}`); + this._info = debug(`${appName}:INFO:${prefix}`); + this._warn = debug(`${appName}:WARN:${prefix}`); + this._error = debug(`${appName}:ERROR:${prefix}`); } else { - this._debug = debug(APP_NAME); - this._info = debug(`${APP_NAME}:INFO`); - this._warn = debug(`${APP_NAME}:WARN`); - this._error = debug(`${APP_NAME}:ERROR`); + this._debug = debug(`${appName}:DEBUG`); + this._info = debug(`${appName}:INFO`); + this._warn = debug(`${appName}:WARN`); + this._error = debug(`${appName}:ERROR`); } this._debug.log = console.debug.bind(console); this._info.log = console.info.bind(console); diff --git a/taoyao-media-server/src/Server.js b/taoyao-media-server/src/Server.js index 1e96a8b..091ce12 100644 --- a/taoyao-media-server/src/Server.js +++ b/taoyao-media-server/src/Server.js @@ -13,44 +13,33 @@ const command = require("./Command"); // 日志 const logger = new Logger(); +// 信令 const signal = new Signal(); // HTTPS server let httpsServer; // WebSocket server let webSocketServer; -// Mediasoup Worker列表 +// Mediasoup Worker const mediasoupWorkers = []; -// Mediasoup Worker下个索引 -let nextMediasoupWorkerIndex = 0; process.title = config.name; process.env.DEBUG = process.env.DEBUG || "*mediasoup* *INFO* *WARN* *ERROR*"; -logger.info("开始启动:%s", config.name); -run(); - -async function run() { - // 启动Mediasoup服务 - await runMediasoupWorkers(); - // 启动服务 - await runSignalServer(); - logger.info("启动完成:%s", config.name); - // 交互式命令行 - if (config.command) { - await command(); - } -} - -async function runMediasoupWorkers() { +/** + * 启动Mediasoup Worker + */ +async function buildMediasoupWorkers() { const { numWorkers } = config.mediasoup; logger.info("启动Mediasoup服务(%d Worker)...", numWorkers); for (let i = 0; i < numWorkers; i++) { + // 新建Worker const worker = await mediasoup.createWorker({ logLevel: config.mediasoup.workerSettings.logLevel, logTags: config.mediasoup.workerSettings.logTags, rtcMinPort: Number(config.mediasoup.workerSettings.rtcMinPort), rtcMaxPort: Number(config.mediasoup.workerSettings.rtcMaxPort), }); + // 监听停止服务事件 worker.on("died", () => { logger.error( "Mediasoup Worker停止服务(两秒之后自动退出)... [PID:%d]", @@ -58,6 +47,7 @@ async function runMediasoupWorkers() { ); setTimeout(() => process.exit(1), 2000); }); + // 加入队列 mediasoupWorkers.push(worker); // 配置WebRTC服务 if (process.env.MEDIASOUP_USE_WEBRTC_SERVER !== "false") { @@ -70,7 +60,7 @@ async function runMediasoupWorkers() { const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions); worker.appData.webRtcServer = webRtcServer; } - // 记录日志 + // 定时记录使用日志 setInterval(async () => { const usage = await worker.getResourceUsage(); logger.info( @@ -82,7 +72,10 @@ async function runMediasoupWorkers() { } } -async function runSignalServer() { +/** + * 启动信令服务 + */ +async function buildSignalServer() { const tls = { cert: fs.readFileSync(config.https.tls.cert), key: fs.readFileSync(config.https.tls.key), @@ -119,12 +112,27 @@ async function runSignalServer() { } }); }); - logger.info("开启服务监听..."); - await new Promise((resolve) => { - httpsServer.listen( - Number(config.https.listenPort), - config.https.listenIp, - resolve - ); - }); + // 打开监听 + httpsServer.listen( + Number(config.https.listenPort), + config.https.listenIp, + () => { + logger.info("信令服务启动完成"); + } + ); } + +async function main() { + logger.info("开始启动:%s", config.name); + // 启动Mediasoup服务 + await buildMediasoupWorkers(); + // 启动服务 + await buildSignalServer(); + logger.info("启动完成:%s", config.name); + // 交互式命令行 + if (config.command) { + await command(); + } +} + +main(); diff --git a/taoyao-media-server/src/Signal.js b/taoyao-media-server/src/Signal.js index ff65127..dba9259 100644 --- a/taoyao-media-server/src/Signal.js +++ b/taoyao-media-server/src/Signal.js @@ -3,19 +3,24 @@ * 1. 终端媒体流向 * 2. 处理音频视频:降噪、水印等等 */ - class Signal { - /** - * 处理事件 - * - * @param {*} message 消息 - * @param {*} session websocket - */ - on(message, session) { + // Mediasoup Worker列表 + mediasoupWorkers = []; + // Mediasoup Worker下个索引 + nextMediasoupWorkerIndex = 0; - } + constructor(mediasoupWorkers) { + this.mediasoupWorkers = mediasoupWorkers; + } + /** + * 处理事件 + * + * @param {*} message 消息 + * @param {*} session websocket + */ + on(message, session) {} } module.exports = Signal; diff --git a/taoyao-media-server/src/config.js b/taoyao-media-server/src/config.js index 45bec43..37a921e 100644 --- a/taoyao-media-server/src/config.js +++ b/taoyao-media-server/src/config.js @@ -133,5 +133,5 @@ module.exports = { }, maxSctpMessageSize: 262144, }, - }, + } }; diff --git a/taoyao-media-server/src/server.js b/taoyao-media-server/src/server.js index 1e96a8b..091ce12 100644 --- a/taoyao-media-server/src/server.js +++ b/taoyao-media-server/src/server.js @@ -13,44 +13,33 @@ const command = require("./Command"); // 日志 const logger = new Logger(); +// 信令 const signal = new Signal(); // HTTPS server let httpsServer; // WebSocket server let webSocketServer; -// Mediasoup Worker列表 +// Mediasoup Worker const mediasoupWorkers = []; -// Mediasoup Worker下个索引 -let nextMediasoupWorkerIndex = 0; process.title = config.name; process.env.DEBUG = process.env.DEBUG || "*mediasoup* *INFO* *WARN* *ERROR*"; -logger.info("开始启动:%s", config.name); -run(); - -async function run() { - // 启动Mediasoup服务 - await runMediasoupWorkers(); - // 启动服务 - await runSignalServer(); - logger.info("启动完成:%s", config.name); - // 交互式命令行 - if (config.command) { - await command(); - } -} - -async function runMediasoupWorkers() { +/** + * 启动Mediasoup Worker + */ +async function buildMediasoupWorkers() { const { numWorkers } = config.mediasoup; logger.info("启动Mediasoup服务(%d Worker)...", numWorkers); for (let i = 0; i < numWorkers; i++) { + // 新建Worker const worker = await mediasoup.createWorker({ logLevel: config.mediasoup.workerSettings.logLevel, logTags: config.mediasoup.workerSettings.logTags, rtcMinPort: Number(config.mediasoup.workerSettings.rtcMinPort), rtcMaxPort: Number(config.mediasoup.workerSettings.rtcMaxPort), }); + // 监听停止服务事件 worker.on("died", () => { logger.error( "Mediasoup Worker停止服务(两秒之后自动退出)... [PID:%d]", @@ -58,6 +47,7 @@ async function runMediasoupWorkers() { ); setTimeout(() => process.exit(1), 2000); }); + // 加入队列 mediasoupWorkers.push(worker); // 配置WebRTC服务 if (process.env.MEDIASOUP_USE_WEBRTC_SERVER !== "false") { @@ -70,7 +60,7 @@ async function runMediasoupWorkers() { const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions); worker.appData.webRtcServer = webRtcServer; } - // 记录日志 + // 定时记录使用日志 setInterval(async () => { const usage = await worker.getResourceUsage(); logger.info( @@ -82,7 +72,10 @@ async function runMediasoupWorkers() { } } -async function runSignalServer() { +/** + * 启动信令服务 + */ +async function buildSignalServer() { const tls = { cert: fs.readFileSync(config.https.tls.cert), key: fs.readFileSync(config.https.tls.key), @@ -119,12 +112,27 @@ async function runSignalServer() { } }); }); - logger.info("开启服务监听..."); - await new Promise((resolve) => { - httpsServer.listen( - Number(config.https.listenPort), - config.https.listenIp, - resolve - ); - }); + // 打开监听 + httpsServer.listen( + Number(config.https.listenPort), + config.https.listenIp, + () => { + logger.info("信令服务启动完成"); + } + ); } + +async function main() { + logger.info("开始启动:%s", config.name); + // 启动Mediasoup服务 + await buildMediasoupWorkers(); + // 启动服务 + await buildSignalServer(); + logger.info("启动完成:%s", config.name); + // 交互式命令行 + if (config.command) { + await command(); + } +} + +main(); diff --git a/taoyao-media-server/src/signal.js b/taoyao-media-server/src/signal.js index ff65127..dba9259 100644 --- a/taoyao-media-server/src/signal.js +++ b/taoyao-media-server/src/signal.js @@ -3,19 +3,24 @@ * 1. 终端媒体流向 * 2. 处理音频视频:降噪、水印等等 */ - class Signal { - /** - * 处理事件 - * - * @param {*} message 消息 - * @param {*} session websocket - */ - on(message, session) { + // Mediasoup Worker列表 + mediasoupWorkers = []; + // Mediasoup Worker下个索引 + nextMediasoupWorkerIndex = 0; - } + constructor(mediasoupWorkers) { + this.mediasoupWorkers = mediasoupWorkers; + } + /** + * 处理事件 + * + * @param {*} message 消息 + * @param {*} session websocket + */ + on(message, session) {} } module.exports = Signal;