# Mediasoup Routes

**URL:** <https://mediasoup.discourse.group/t/mediasoup-routes/3312>\
**Category:** mediasoup libraries\
**Created:** [September 17, 2021, 1:07pm UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312 "2021-09-17T13:07:38Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![metasebiya](https://avatars.discourse-cdn.com/v4/letter/m/b77776/32.png) [@metasebiya](https://mediasoup.discourse.group/u/metasebiya)\
**Post date:** [September 17, 2021, 1:07pm UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/1 "2021-09-17T13:07:38Z")

</div>

how can I create multiple routers per worker in I only could create a single router per worker; I am using mediasoup for broadcasting live events with ultra low latency

below is my implementation

```auto
for (const worker of mediasoupWorkers)
		{
			const router = await worker.createRouter({ mediaCodecs });

			mediasoupRouters.set(router.id, router);
		}

```

---

<div class="post-metadata">

**Author:** ![nazar-pc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/nazar-pc/32/369_2.png) [@nazar-pc](https://mediasoup.discourse.group/u/nazar-pc)\
**Post date:** [September 17, 2021, 1:17pm UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/2 "2021-09-17T13:17:10Z")

</div>

🤷‍♂️

```auto
for (const worker of mediasoupWorkers)
		{
			const router = await worker.createRouter({ mediaCodecs });

			mediasoupRouters.set(router.id, router);

			const router2 = await worker.createRouter({ mediaCodecs });

			mediasoupRouters.set(router2.id, router2);
		}

```

---

<div class="post-metadata">

**Author:** ![metasebiya](https://avatars.discourse-cdn.com/v4/letter/m/b77776/32.png) [@metasebiya](https://mediasoup.discourse.group/u/metasebiya)\
**Post date:** [September 17, 2021, 1:32pm UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/4 "2021-09-17T13:32:08Z")

</div>

I got confused with that, in my project the number of consumers grew; I am implementing a website for streaming live events like vimeo, youtube.  
I am planning to make the live stream reachable to every one; my question is that how can I scale my routers so that it can accommodate large number of audience?  
how can we check we automate the creation and deletion of routers in workers?

---

<div class="post-metadata">

**Author:** ![nazar-pc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/nazar-pc/32/369_2.png) [@nazar-pc](https://mediasoup.discourse.group/u/nazar-pc)\
**Post date:** [September 17, 2021, 4:17pm UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/5 "2021-09-17T16:17:03Z")

</div>

Please read the documentation, this question specifically has the whole page dedicated in documentation, take advantage of that and search the forum for numerous similar topics.

If you have something that wasn’t answered yet, I’ll try to help.

---

<div class="post-metadata">

**Author:** ![metasebiya](https://avatars.discourse-cdn.com/v4/letter/m/b77776/32.png) [@metasebiya](https://mediasoup.discourse.group/u/metasebiya)\
**Post date:** [September 21, 2021, 7:29am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/6 "2021-09-21T07:29:51Z")

</div>

hello, the connection transport state stacks on ‘new’ below is my implementation according to the documentation

```auto
async function publish(e) {
  const isWebcam = (e.target.id === 'btn_webcam');
  $txtPublish = isWebcam ? $txtWebcam : $txtScreen;

  const data = await socket.request('createProducerTransport', {
    forceTcp: false,
    rtpCapabilities: device.rtpCapabilities,
  });
  if (data.error) {
    console.error(data.error);
    return;
  }
 
  const transport = device.createSendTransport(data);
  transport.on('connect', async ({ dtlsParameters }, callback, errback) => {
    socket.request('connectProducerTransport', { 
      transportId : transport.id, 
      dtlsParameters 
    })
      .then(callback)
      .catch(errback);
  });
  //{ kind, rtpParameters }
  transport.on('produce', async (parameters, callback, errback) => {

    try {
      const data = await socket.request('produce', {
        transportId: transport.id,
        kind : parameters.kind,
        rtpParameters : parameters.rtpParameters

      });
      const { id } = data

      callback({ id });

    } 
    catch (err) {
      console.log('transport --> produce : error message --> ', err)
      errback(err);
    }
  });

  transport.on('connectionstatechange', (state) => {

    switch (state) {
      case 'connecting':
        $txtPublish.innerHTML = 'publishing...';
        $fsPublish.disabled = true;
        $fsSubscribe.disabled = true;
      break;

      case 'connected':
        document.querySelector('#local_video').srcObject = media_stream;
        $txtPublish.innerHTML = 'published';
        $fsPublish.disabled = true; 
        $fsSubscribe.disabled = false;
      break;

      case 'failed':
        transport.close();
        $txtPublish.innerHTML = 'failed';
        $fsPublish.disabled = false;
        $fsSubscribe.disabled = true;
      break;

      default: break;
    }
  });

  
  try {
    media_stream = await getUserMedia(transport, isWebcam);
  
    const track = media_stream.getVideoTracks()[0];
    const params = { track };
    if ($chkSimulcast.checked) {
      params.encodings = [
        { maxBitrate: 100000 },
        { maxBitrate: 300000 },
        { maxBitrate: 900000 },
      ];
      params.codecOptions = {
        videoGoogleStartBitrate : 1000
      };
    }
    producer = await transport.produce(params);

    // console.log(`tranport.produce(params) --> producer : ${JSON.stringify(producer)}`)
  }
   catch (err) {
    $txtPublish.innerHTML = 'failed';
  }

}//end of publish method

async function getUserMedia(transport, isWebcam) {
  if (!device.canProduce('video')) {
    console.error('cannot produce video');
    return;
  }

  let stream;
  try {
    stream = isWebcam ?
      await navigator.mediaDevices.getUserMedia({ video: true }) :
      await navigator.mediaDevices.getDisplayMedia({ video: true });
  } catch (err) {
    console.error('getUserMedia(transport, isWebcam) failed --> ', err.message);
    throw err;
  }
  return stream;
}

```

I set ip: ‘127.0.0.1’ and announcedIp: null,  
I tried to debug it for days but I couldn’t get any solutions

---

<div class="post-metadata">

**Author:** ![snnz](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/snnz/32/693_2.png) [@snnz](https://mediasoup.discourse.group/u/snnz)\
**Post date:** [September 21, 2021, 10:36am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/7 "2021-09-21T10:36:53Z")

</div>

Check the browser logs, what is it doing. For example, Firefox doesn’t allow ICE connections to the loopback interface by default.

---

<div class="post-metadata">

**Author:** ![anon19094649](https://avatars.discourse-cdn.com/v4/letter/a/ecccb3/32.png) [@anon19094649](https://mediasoup.discourse.group/u/anon19094649)\
**Post date:** [September 21, 2021, 11:23am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/8 "2021-09-21T11:23:53Z")

</div>

I asked this earlier,

please read the docs:

> **[mediasoup :: Communication Between Client and Server](https://mediasoup.org/documentation/v3/communication-between-client-and-server/#creating-transports)**
>
> Cutting Edge WebRTC Video Conferencing

Trust me: there is the answer to your (non) issue.

 ![Screenshot 2021-09-21 at 19.24.10](https://global.discourse-cdn.com/free1/uploads/mediasoup/original/2X/1/1872d5bf8b8bd7d159a673c2fd660bf5e0211b55.png)

---

<div class="post-metadata">

**Author:** ![metasebiya](https://avatars.discourse-cdn.com/v4/letter/m/b77776/32.png) [@metasebiya](https://mediasoup.discourse.group/u/metasebiya)\
**Post date:** [September 22, 2021, 5:10am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/9 "2021-09-22T05:10:14Z")

</div>

yaa, Firefox were the cause of the problem, it worked on google chrome, is there any solutions to allow ICE Connection Loop backs in Firefox

---

<div class="post-metadata">

**Author:** ![snnz](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/snnz/32/693_2.png) [@snnz](https://mediasoup.discourse.group/u/snnz)\
**Post date:** [September 22, 2021, 10:25am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/10 "2021-09-22T10:25:31Z")

</div>

There is a config option in Firefox, “media.peerconnection.ice.loopback”. However it does not guarantee that everything will work. The most reliable way is to set ip address to ‘0.0.0.0’ and announcedIp to the address of some real local interface. I.e., something like:  
listenIps: [{ ip: ‘0.0.0.0’, announcedIp: ‘192.168.1.1’ }]  
(where 192.168.1.1 is just for example).

---

<div class="post-metadata">

**Author:** ![metasebiya](https://avatars.discourse-cdn.com/v4/letter/m/b77776/32.png) [@metasebiya](https://mediasoup.discourse.group/u/metasebiya)\
**Post date:** [September 24, 2021, 5:29am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/11 "2021-09-24T05:29:41Z")

</div>

thanks it worked; i set the local ip address of the machine using ip.address() to the announced ip address

---

<div class="post-metadata">

**Author:** ![metasebiya](https://avatars.discourse-cdn.com/v4/letter/m/b77776/32.png) [@metasebiya](https://mediasoup.discourse.group/u/metasebiya)\
**Post date:** [September 28, 2021, 6:55am UTC](https://mediasoup.discourse.group/t/mediasoup-routes/3312/12 "2021-09-28T06:55:53Z")

</div>

hello, while trying to host my Livestream website on a remote server I set the announced IP to the public IP address of the server; but I got WEBRTC: ICE failed, add a stun server mediasoup in firefox, and in chrome, the connection states remain on connecting
