From 957e14a8b9d5e3fb5a22d882f976685c4600e2e5 Mon Sep 17 00:00:00 2001 From: woody Date: Thu, 8 Jun 2023 10:13:03 +0700 Subject: [PATCH] feat: add MediasoupSlaveService.addFromEnv() --- .env.dev | 6 +++++- package.json | 2 +- src/entities/mediasoup.slave.ts | 13 ++++++++++--- src/run_slave.ts | 12 ++++++++++-- src/services/index.ts | 1 + src/services/mediasoup.slave.ts | 26 ++++++++++++++++++++++++-- 6 files changed, 51 insertions(+), 9 deletions(-) diff --git a/.env.dev b/.env.dev index 1e82fee..fb0ed27 100644 --- a/.env.dev +++ b/.env.dev @@ -2,7 +2,11 @@ DATABASE_URL = "postgresql://postgres:123456@localhost:5432/mediasoup" DATABASE_SYNC = 1 DATABASE_LOGGING = 1 -PORT = 3000 +# PORT = 3000 +SLAVE_FOR = producer +SLAVE_INTERNAL_HOST = 'localhost' +SLAVE_EXTERNAL_HOST = 'localhost' +SLAVE_MAX_PEER = 1000 MEDIASOUP_LOG_LEVEL = warn MEDIASOUP_LOG_TAGS = 'info ice dtls rtp srtp rtcp rtx bwe score simulcast svc sctp' diff --git a/package.json b/package.json index 711cf0a..015754e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "build": "tsc", "test": "echo \"Error: no test specified\" && exit 1", - "start:master": "node dist/run_master.js", + "start:master": "PORT=3000 node dist/run_master.js", "start:slave": "PORT=3002 node dist/run_slave.js", "dev": "node dist/run_master.js", "prepare": "husky install" diff --git a/src/entities/mediasoup.slave.ts b/src/entities/mediasoup.slave.ts index 5a96482..b6cb319 100644 --- a/src/entities/mediasoup.slave.ts +++ b/src/entities/mediasoup.slave.ts @@ -1,6 +1,13 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + BaseEntity, + Index, +} from 'typeorm'; @Entity() +@Index(['internalHost', 'apiPort'], { unique: true }) export class MediasoupSlave extends BaseEntity { @PrimaryGeneratedColumn('increment') id!: number; @@ -17,8 +24,8 @@ export class MediasoupSlave extends BaseEntity { @Column('integer') apiPort!: number; - @Column('integer', { nullable: true }) - maxPeer?: number; + @Column('integer', { default: 1e9 }) + maxPeer!: number; @Column('integer', { default: 0 }) peerCount!: number; diff --git a/src/run_slave.ts b/src/run_slave.ts index 15f460f..47b6a98 100644 --- a/src/run_slave.ts +++ b/src/run_slave.ts @@ -1,3 +1,11 @@ -import { startServer } from './utils/index.js'; +import { MediasoupSlaveService } from './services/mediasoup.slave.js'; +import { startServer, getDataSource } from './utils/index.js'; -startServer([]); +async function bootstrap() { + await startServer([]); + try { + await new MediasoupSlaveService(getDataSource()).addFromEnv(); + } catch (e) {} +} + +bootstrap(); diff --git a/src/services/index.ts b/src/services/index.ts index 7bcaf27..977b098 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,2 +1,3 @@ export * from './mediasoup.slave.js'; export * from './mediasoup.room.js'; +export * from './mediasoup.worker.js'; diff --git a/src/services/mediasoup.slave.ts b/src/services/mediasoup.slave.ts index 69f9c73..0c6037e 100644 --- a/src/services/mediasoup.slave.ts +++ b/src/services/mediasoup.slave.ts @@ -1,9 +1,10 @@ +import { Raw } from 'typeorm'; import { constants } from '../constants.js'; import { MediasoupSlave } from '../entities/index.js'; import { BaseService } from './base.js'; export class MediasoupSlaveService extends BaseService { - add(data: { + async add(data: { internalHost: string; externalHost: string; for: string; // consumer | producer @@ -15,6 +16,27 @@ export class MediasoupSlaveService extends BaseService { throw new Error('Invalid for param'); } Object.assign(mediasoupSlave, data); - return this.dataSource.getRepository(MediasoupSlave).save(mediasoupSlave); + await this.dataSource.getRepository(MediasoupSlave).save(mediasoupSlave); + return {}; + } + + addFromEnv() { + return this.add({ + internalHost: process.env.SLAVE_INTERNAL_HOST || 'localhost', + externalHost: process.env.SLAVE_EXTERNAL_HOST || 'localhost', + for: process.env.SLAVE_FOR || constants.CONSUMER, + apiPort: Number(process.env.PORT || 80), + maxPeer: Number(process.env.SLAVE_MAX_PEER), + }); + } + + async getForNewRoom() { + const result = await this.dataSource.getRepository(MediasoupSlave).findOne({ + where: { + for: constants.PRODUCER, + peerCount: Raw((alias) => `${alias} < maxPeer`), + }, + }); + return result; } }