Pepguy commited on
Commit
42e18e6
·
verified ·
1 Parent(s): 46c084c

Update app.js

Browse files
Files changed (1) hide show
  1. app.js +107 -53
app.js CHANGED
@@ -1,57 +1,111 @@
1
- const express = require('express');
2
- const app = express();
3
- const bodyParser = require('body-parser');
4
- const webrtc = require("wrtc");
5
-
6
- let senderStream;
7
-
8
- app.use(express.static('public'));
9
- app.use(bodyParser.json());
10
- app.use(bodyParser.urlencoded({ extended: true }));
11
-
12
- app.post("/consumer", async ({ body }, res) => {
13
- const peer = new webrtc.RTCPeerConnection({
14
- iceServers: [
15
- {
16
- urls: "stun:stun.stunprotocol.org"
17
- }
18
- ]
19
- });
20
- const desc = new webrtc.RTCSessionDescription(body.sdp);
21
- await peer.setRemoteDescription(desc);
22
- senderStream.getTracks().forEach(track => peer.addTrack(track, senderStream));
23
- const answer = await peer.createAnswer();
24
- await peer.setLocalDescription(answer);
25
- const payload = {
26
- sdp: peer.localDescription
27
- }
28
-
29
- res.json(payload);
30
- });
31
-
32
- app.post('/broadcast', async ({ body }, res) => {
33
- const peer = new webrtc.RTCPeerConnection({
34
- iceServers: [
35
- {
36
- urls: "stun:stun.stunprotocol.org"
37
- }
38
- ]
39
- });
40
- peer.ontrack = (e) => handleTrackEvent(e, peer);
41
- const desc = new webrtc.RTCSessionDescription(body.sdp);
42
- await peer.setRemoteDescription(desc);
43
- const answer = await peer.createAnswer();
44
- await peer.setLocalDescription(answer);
45
- const payload = {
46
- sdp: peer.localDescription
47
- }
48
 
49
- res.json(payload);
50
- });
 
51
 
52
- function handleTrackEvent(e, peer) {
53
- senderStream = e.streams[0];
54
- };
 
 
 
 
 
 
 
 
55
 
 
 
 
 
 
 
 
56
 
57
- app.listen(7860, () => console.log('server started'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // server.js
2
+ const http = require('http');
3
+ const WebSocket = require('ws');
4
+ const mediasoup = require('mediasoup');
5
+
6
+ const PORT = 7860;
7
+ let worker, router;
8
+ const producerTransports = new Map(); // ws → { transport, producer }
9
+ const consumerTransports = new Map(); // ws → [ { transport, consumer } ]
10
+
11
+ (async () => {
12
+ // 1) Start HTTP + WebSocket server
13
+ const server = http.createServer();
14
+ const wss = new WebSocket.Server({ server });
15
+ server.listen(PORT, () => console.log(`Server running on ${PORT}`));
16
+
17
+ // 2) Create a single Mediasoup Worker + Router
18
+ worker = await mediasoup.createWorker();
19
+ router = await worker.createRouter({ mediaCodecs: [
20
+ { kind: 'audio', mimeType: 'audio/opus', clockRate: 48000, channels: 2 },
21
+ { kind: 'video', mimeType: 'video/VP8', clockRate: 90000 },
22
+ ]});
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
+ wss.on('connection', ws => {
25
+ ws.on('message', async msg => {
26
+ const { action, data } = JSON.parse(msg);
27
 
28
+ switch (action) {
29
+ case 'createProducerTransport': {
30
+ // Create transport for broadcaster
31
+ const transport = await router.createWebRtcTransport({ listenIps: ['127.0.0.1'], enableUdp: true, enableTcp: true });
32
+ producerTransports.set(ws, { transport, producer: null });
33
+ ws.send(JSON.stringify({
34
+ action: 'producerTransportCreated',
35
+ data: { id: transport.id, iceParameters: transport.iceParameters, iceCandidates: transport.iceCandidates, dtlsParameters: transport.dtlsParameters }
36
+ }));
37
+ break;
38
+ }
39
 
40
+ case 'connectProducerTransport': {
41
+ const { dtlsParameters } = data;
42
+ const { transport } = producerTransports.get(ws);
43
+ await transport.connect({ dtlsParameters });
44
+ ws.send(JSON.stringify({ action: 'producerTransportConnected' }));
45
+ break;
46
+ }
47
 
48
+ case 'produce': {
49
+ const { kind, rtpParameters } = data;
50
+ const { transport } = producerTransports.get(ws);
51
+ const producer = await transport.produce({ kind, rtpParameters });
52
+ producerTransports.get(ws).producer = producer;
53
+ ws.send(JSON.stringify({ action: 'produced', data: { producerId: producer.id } }));
54
+ break;
55
+ }
56
+
57
+ case 'createConsumerTransport': {
58
+ // Create transport for a viewer
59
+ const transport = await router.createWebRtcTransport({ listenIps: ['127.0.0.1'], enableUdp: true, enableTcp: true });
60
+ const arr = consumerTransports.get(ws) || [];
61
+ arr.push({ transport, consumer: null });
62
+ consumerTransports.set(ws, arr);
63
+ ws.send(JSON.stringify({
64
+ action: 'consumerTransportCreated',
65
+ data: { id: transport.id, iceParameters: transport.iceParameters, iceCandidates: transport.iceCandidates, dtlsParameters: transport.dtlsParameters }
66
+ }));
67
+ break;
68
+ }
69
+
70
+ case 'connectConsumerTransport': {
71
+ const { dtlsParameters } = data;
72
+ // assume latest transport
73
+ const arr = consumerTransports.get(ws);
74
+ await arr[arr.length - 1].transport.connect({ dtlsParameters });
75
+ ws.send(JSON.stringify({ action: 'consumerTransportConnected' }));
76
+ break;
77
+ }
78
+
79
+ case 'consume': {
80
+ // find the broadcaster’s producer
81
+ const producerEntry = [...producerTransports.values()].find(e => e.producer);
82
+ if (!producerEntry) {
83
+ ws.send(JSON.stringify({ action: 'consumeError', data: 'No producer available yet' }));
84
+ return;
85
+ }
86
+ const producer = producerEntry.producer;
87
+ const arr = consumerTransports.get(ws);
88
+ const { transport } = arr[arr.length - 1];
89
+
90
+ const consumer = await transport.consume({
91
+ producerId: producer.id,
92
+ rtpCapabilities: router.rtpCapabilities,
93
+ paused: false
94
+ });
95
+ arr[arr.length - 1].consumer = consumer;
96
+
97
+ ws.send(JSON.stringify({
98
+ action: 'consumed',
99
+ data: {
100
+ producerId: producer.id,
101
+ id: consumer.id,
102
+ kind: consumer.kind,
103
+ rtpParameters: consumer.rtpParameters
104
+ }
105
+ }));
106
+ break;
107
+ }
108
+ }
109
+ });
110
+ });
111
+ })();