Files
taoyao/taoyao-client-media/src/Server.js
2023-07-25 08:50:28 +08:00

97 lines
3.1 KiB
JavaScript

#!/usr/bin/env node
const config = require("./Config");
const mediasoup = require("mediasoup");
const { Taoyao, signalChannel } = require("./Taoyao");
// 线程名称
process.title = config.name;
// 工作线程
const mediasoupWorkers = [];
// 桃夭信令
const taoyao = new Taoyao(mediasoupWorkers);
/**
* 创建工作线程
*/
async function buildMediasoupWorkers() {
mediasoup.observer.on("newworker", (worker) => {
console.info("mediasoup newworker", worker.pid);
});
const { workerSize } = config.mediasoup;
console.info("工作线程数量", workerSize);
for (let index = 0; index < workerSize; index++) {
// 创建工作线程
const worker = await mediasoup.createWorker({
logTags : config.mediasoup.workerSettings.logTags,
logLevel : config.mediasoup.workerSettings.logLevel,
rtcMinPort: Number(config.mediasoup.workerSettings.rtcMinPort),
rtcMaxPort: Number(config.mediasoup.workerSettings.rtcMaxPort),
});
// 监听事件
worker.on("died", (error) => {
// 正常情况不会出现
console.error("worker died", worker.pid, error);
});
worker.observer.on("close", () => {
console.debug("worker close", worker.pid);
});
worker.observer.on("newrouter", (router) => {
console.debug("worker newrouter", worker.pid, router.id);
});
worker.observer.on("newwebrtcserver", (webRtcServer) => {
console.debug("worker newwebrtcserver", worker.pid, webRtcServer.id);
});
// 创建WebRTC服务
const webRtcServerOptions = JSON.parse(JSON.stringify(config.mediasoup.webRtcServerOptions));
for (const listenInfos of webRtcServerOptions.listenInfos) {
listenInfos.port = Number(listenInfos.port) + mediasoupWorkers.length;
}
const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions);
// 监听事件
webRtcServer.on("workerclose", () => {
console.debug("webRtcServer workerclose", worker.pid, webRtcServer.id);
});
webRtcServer.observer.on("close", () => {
console.debug("webRtcServer close", worker.pid, webRtcServer.id);
});
webRtcServer.observer.on("webrtctransporthandled", (webRtcTransport) => {
console.debug("webRtcServer webrtctransporthandled", worker.pid, webRtcServer.id, webRtcTransport.id);
});
webRtcServer.observer.on("webrtctransportunhandled", (webRtcTransport) => {
console.debug("webRtcServer webrtctransportunhandled", worker.pid, webRtcServer.id, webRtcTransport.id);
});
// 配置WebRTC服务
worker.appData.webRtcServer = webRtcServer;
// 添加工作线程
mediasoupWorkers.push(worker);
}
}
/**
* 连接信令
*/
async function connectSignalServer() {
signalChannel.taoyao = taoyao;
await signalChannel.connect(`wss://${config.signal.host}:${config.signal.port}/websocket.signal`);
}
/**
* 启动方法
*/
async function main() {
console.debug(`
桃之夭夭,灼灼其华。
之子于归,宜其室家。
:: https://gitee.com/acgist/taoyao
`);
console.info("开始启动", config.name);
await buildMediasoupWorkers();
await connectSignalServer();
console.info("启动完成", config.name);
}
main();