Skip to content

Commit

Permalink
feat: add producer resume/ pause api
Browse files Browse the repository at this point in the history
  • Loading branch information
woody146 committed Jul 6, 2023
1 parent e946980 commit 162bc0b
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 36 deletions.
17 changes: 16 additions & 1 deletion src/apis/master.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
RoomService,
RouterService,
UserService,
ProducerService,
} from '../services/index.js';
import { RouteConfig, getDataSource } from '../utils/index.js';

Expand Down Expand Up @@ -95,7 +96,21 @@ export default [
method: 'POST',
url: '/producer_transports/:transportId/produce',
handler: (data) => {
return new TransportService(getDataSource()).produce(data);
return new ProducerService(getDataSource()).create(data);
},
},
{
method: 'POST',
url: '/producers/:producerId/resume',
handler: (data) => {
return new ProducerService(getDataSource()).resume(data);
},
},
{
method: 'POST',
url: '/producers/:producerId/pause',
handler: (data) => {
return new ProducerService(getDataSource()).pause(data);
},
},
{
Expand Down
14 changes: 14 additions & 0 deletions src/apis/slave.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,20 @@ export default [
return mediasoupConsumerManager.create(data);
},
},
{
method: 'POST',
url: '/producers/:producerId/resume',
handler: (data) => {
return mediasoupProducerManager.resume(data);
},
},
{
method: 'POST',
url: '/producers/:producerId/pause',
handler: (data) => {
return mediasoupProducerManager.pause(data);
},
},
{
method: 'POST',
url: '/consumers/:consumerId/resume',
Expand Down
1 change: 1 addition & 0 deletions src/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ export * from './room.js';
export * from './transport.js';
export * from './router.js';
export * from './user.js';
export * from './producer.js';
export * from './mediasoup/index.js';
21 changes: 21 additions & 0 deletions src/services/mediasoup/producer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { types } from 'mediasoup';
import { mediasoupProducerWebRTCTransportManager } from './webrtc.transport.js';
import { ServiceError } from '../base.js';

class MediasoupProducerManager {
static producers = new Map<string, types.Producer>();
Expand All @@ -18,6 +19,26 @@ class MediasoupProducerManager {

return { id: producer.id };
}

async pause(data: { producerId: string }) {
const producer = this.get(data);
await producer.pause();
return {};
}

async resume(data: { producerId: string }) {
const producer = this.get(data);
await producer.resume();
return {};
}

get(data: { producerId: string }) {
const producer = MediasoupProducerManager.producers.get(data.producerId);
if (producer) {
return producer;
}
throw new ServiceError(404, 'Producer not found');
}
}

export const mediasoupProducerManager = new MediasoupProducerManager();
85 changes: 85 additions & 0 deletions src/services/producer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { constants } from '../constants.js';
import { MediaProducer } from '../entities/index.js';
import { fetchApi } from '../utils/api.js';
import { BaseService, ServiceError } from './base.js';
import { TransportService } from './transport.js';

export class ProducerService extends BaseService {
async create(data: {
transportId: string;
kind: any;
rtpParameters: any;
}): Promise<{
/**
* Producer id
*/
id: string;
}> {
const transport = await this.createService(TransportService).get({
transportId: data.transportId,
});
if (transport.type === constants.PRODUCER) {
const result = await fetchApi({
host: transport.worker.apiHost,
port: transport.worker.apiPort,
path: '/transports/:transportId/producer',
method: 'POST',
data: {
transportId: transport.id,
kind: data.kind,
rtpParameters: data.rtpParameters,
},
});

const producer = new MediaProducer();
producer.id = result.id;
producer.kind = data.kind;
producer.transportId = transport.id;
await this.dataSource.getRepository(MediaProducer).save(producer);
return result;
}
throw new ServiceError(400, 'Invalid transport');
}

async pause(data: { producerId: string }) {
const producer = await this.get(data);
const transport = await this.createService(TransportService).get({
transportId: producer.transportId,
});
await fetchApi({
host: transport.worker.apiHost,
port: transport.worker.apiPort,
path: '/producers/:producerId/pause',
method: 'POST',
data: { producerId: data.producerId },
});
return {};
}

async resume(data: { producerId: string }) {
const producer = await this.get(data);
const transport = await this.createService(TransportService).get({
transportId: producer.transportId,
});
await fetchApi({
host: transport.worker.apiHost,
port: transport.worker.apiPort,
path: '/producers/:producerId/resume',
method: 'POST',
data: { producerId: data.producerId },
});
return {};
}

async get(data: { producerId: string }) {
const producer = await this.dataSource
.getRepository(MediaProducer)
.findOne({
where: { id: data.producerId },
});
if (producer) {
return producer;
}
throw new ServiceError(404, 'Producer not found');
}
}
35 changes: 0 additions & 35 deletions src/services/transport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { fetchApi } from '../utils/api.js';
import { BaseService, ServiceError } from './base.js';
import { RoomService } from './room.js';
import { RouterService } from './router.js';
import { MediaProducer } from '../entities/media.producer.js';

export class TransportService extends BaseService {
async createProducer(data: {
Expand Down Expand Up @@ -48,40 +47,6 @@ export class TransportService extends BaseService {
return result;
}

async produce(data: {
transportId: string;
kind: any;
rtpParameters: any;
}): Promise<{
/**
* Producer id
*/
id: string;
}> {
const transport = await this.get({ transportId: data.transportId });
if (transport.type === constants.PRODUCER) {
const result = await fetchApi({
host: transport.worker.apiHost,
port: transport.worker.apiPort,
path: '/transports/:transportId/producer',
method: 'POST',
data: {
transportId: transport.id,
kind: data.kind,
rtpParameters: data.rtpParameters,
},
});

const producer = new MediaProducer();
producer.id = result.id;
producer.kind = data.kind;
producer.transportId = transport.id;
await this.dataSource.getRepository(MediaProducer).save(producer);
return result;
}
throw new ServiceError(400, 'Invalid transport');
}

async createConsumer(data: { routerId: string; userId?: string }): Promise<{
id: string;
iceParameters: types.IceParameters;
Expand Down

0 comments on commit 162bc0b

Please sign in to comment.