<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
    <title>Licode Blog</title>
    <link href="http://lynckia.com/feed/atom.xml" rel="self"/>
    <link href="http://lynckia.com/licode"/>
    <updated>2023-03-16T08:44:09+00:00</updated>
    <id>http://lynckia.com/feed/atom.xml</id>
    <author>
        <name>Lynckia</name>
        <mail>contact@lynckia.com</mail>
    </author>

<entry>
    <title>Deploying Licode with Nginx</title>
    <link href="http://lynckia.com/licode/nginx-dep.html"/>
    <updated>2017-07-31T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/nginx-dep.html</id>
    <content type="html">&lt;p&gt;Hi all!&lt;/p&gt;

&lt;p&gt;Today we are going to briefly show you how to configure your Licode deployment to use Nginx and secure HTTP connections for both the application and the socket.io server. In the following figure you can see the configuration we want to deploy:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../img/nginx_ports.jpg&quot; alt=&quot;Nginx deployment&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see, clients connect to the application and to the socket.io server using the HTTPS port (443). Then, Nginx redirects the requests to the HTTP ports (3001 and 8080 respectively).&lt;/p&gt;

&lt;p&gt;Configuring the scenario is very simple. You have just to install and configure an instance of Nginx and to introduce a small change in Licode’s default configuration. The following steps explain how to proceed with this configuration in Ubuntu 14.04):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Install nginx
    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt-get install nginx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Configure nginx by editing the default configuration file (in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/nginx/sites-enabled/&lt;/code&gt;) or by creating and enabling your own one:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name {your_server_name};
    return 301 https://$server_name$request_uri;
}

server {
   listen 443;
   server_name {your_server_name};

   ssl on;
   ssl_certificate {path/to/your/ssl_cert/file};
   ssl_certificate_key {path/to/your/ssl_key/file};
   ssl_session_cache shared:SSL:10m;

   ssl_ciphers !RC4:HIGH:!aNULL:!MD5;
   ssl_prefer_server_ciphers on;
   ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

	location /socket.io/ {
		proxy_pass http://localhost:8080/socket.io/;

		proxy_http_version 1.1;
		proxy_redirect off;

		proxy_set_header 'Access-Control-Allow-Origin' '*';
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection &quot;upgrade&quot;;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-NginX-Proxy true;
		proxy_read_timeout 86400;
	}

	location / {
		proxy_pass http://localhost:3001/;
		proxy_set_header Host $host;
		proxy_http_version 1.1;
	}

}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that you have to modify the text in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{your_server_name}&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{path/to/your/ssl_cert/file}&lt;/code&gt;  and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{path/to/your/ssl_key/file}&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Configure &lt;em&gt;socket.io&lt;/em&gt; connection in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;licode_config.js&lt;/code&gt; file. You have just to change the following parameters:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[...]

// This configuration is used by the clients to reach erizoController
// Use '' to use the public IP address instead of a hostname
config.erizoController.hostname = ''; //default value: ''
config.erizoController.port = 443; //default value: 8080
// Use true if clients communicate with erizoController over SSL
config.erizoController.ssl = true; //default value: false

// This configuration is used by erizoController server to listen for connections
// Use true if erizoController listens in HTTPS.
config.erizoController.listen_ssl = false; //default value: false
config.erizoController.listen_port = 8080; //default value: 8080

[...]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, &lt;em&gt;erizoController&lt;/em&gt; is still listening on 8080 port but clients will try to reach it on 443 port using SSL. Then, Nginx will redirect them to the correct port based on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/socket.io/&lt;/code&gt; path.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Configure your application to listen on port HTTP 3001. If you are using the Basic Example this is already done!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And… that’s all. &lt;strong&gt;Enjoy Licode!&lt;/strong&gt;&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Licode now uses Discourse!</title>
    <link href="http://lynckia.com/licode/discourse.html"/>
    <updated>2016-12-01T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/discourse.html</id>
    <content type="html">&lt;p&gt;We’re happy to announce we’re moving our forum to http://discourse.lynckia.com
Using Google Groups as a mailing list is no longer working for us. While it has served us well in the years we’ve been here, we feel we have outlived it’s utility for us and we’re ready to move the discussion to greener (and newer) pastures.&lt;/p&gt;

&lt;p&gt;Discourse provides a better way to engage in discussions and also its is ready to serve as a knowledge repository for Licode, something we’re lacking and want to correct. On top of all that, it’s an open source project and we love open source projects :). Bare with us as we figure out how to better use it, and feel free to posts your suggestions/feedback on the switch.&lt;/p&gt;

&lt;p&gt;We’ve already moved all the content over there (discourse.lynckia.com) and all of the accounts.&lt;/p&gt;

&lt;p&gt;To recover your account over at discourse.lynckia.com if you made one here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Go to discourse.lynckia.com&lt;/li&gt;
  &lt;li&gt;Click login&lt;/li&gt;
  &lt;li&gt;Introduce the email you used to register in Google Groups&lt;/li&gt;
  &lt;li&gt;Click “I forgot my password”&lt;/li&gt;
  &lt;li&gt;You should receive an activation link -&amp;gt; follow it and you should have your new account set up :)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;See you in discourse!&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Multiple Ice Servers Configuration</title>
    <link href="http://lynckia.com/licode/ice-servers.html"/>
    <updated>2016-02-19T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/ice-servers.html</id>
    <content type="html">&lt;p&gt;Till now, Licode configuration file allows only to configure a single Stun server and a single Turn server. We have just published an update that allows you to introduce multiple Ice servers. The new configuration parameter &lt;code&gt;iceServers&lt;/code&gt; is an array in wich you can set several servers independently of the type:&lt;/p&gt;

&lt;p&gt;Use undefined to run clients without Ice Servers&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Stun&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;servers&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;format&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;Turn&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;servers&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;format&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;credential&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For instance:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;erizoController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;iceServers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;stun:stun.l.google.com:19302&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;stun:stun.mystunserver.com:19302&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;turn_username&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;credential&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;turn_password&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;url: &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;turn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;myturnserver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tcp&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;
	}
];
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>

<entry>
    <title>Introducing custom Cloud Handler policies</title>
    <link href="http://lynckia.com/licode/ch-policies.html"/>
    <updated>2015-06-08T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/ch-policies.html</id>
    <content type="html">&lt;p&gt;As you know Licode is designed to be deployed in private or public clouds taking advantage of the scalability capabilities of this type of environments. One of the scalability levels that Licode offers is the possibility of having more than one Erizo Controller conected to the same Nuve. Thus, in the same service you can have different Erizo Controllers managing different rooms. When a user connects to a new Room, Nuve decides to which Erizo Controller assign the room depending on different conditions.&lt;/p&gt;

&lt;p&gt;The component that takes that decision is called Cloud Handler and until know it took the decision basing on the number of rooms each Erizo Controller was managing. Today we introduce a machanism to customize that decision thus enabling a more advanced resource handling.&lt;/p&gt;

&lt;p&gt;And it is so easy, you can start from the template we have created as the &lt;a href=&quot;https://github.com/ging/licode/blob/master/nuve/nuveAPI/ch_policies/default_policy.js&quot;&gt;default policy script&lt;/a&gt; and modify it introducing your own algorithm. The algorithm has to be encapsulated in a method with the following format:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Params:
---
room: room to which we need to assing a erizoController.
	{
	name: String, 
	[p2p: bool], 
	[data: Object], 
	_id: ObjectId
	}
ec_list: array with erizo controller objects
	
	{
    ip: String,
    rpcID: String,
    state: Int,
    keepAlive: Int,
    hostname: String,
    port: Int,
    ssl: bool
	}
ec_queue: array with erizo controllers priority according rooms load

Returns:
---
erizoControlerId: the key of the erizo controller selected from ec_list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once implemented, you have only to set it in your &lt;code&gt;licode_config.js&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Cloud Handler policies are in nuve/nuveAPI/ch_policies/ folder
config.nuve.cloudHandlerPolicy = 'my_own_policy.js'; // default value: 'default_policy.js'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>

<entry>
    <title>New master branch, now with 100% more trickle</title>
    <link href="http://lynckia.com/licode/trickle-ice.html"/>
    <updated>2015-02-04T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/trickle-ice.html</id>
    <content type="html">&lt;p&gt;We have just updated the master branch with the changes in trickle_ice.
The most obvious new feature is the support of &lt;a href=&quot;https://webrtchacks.com/trickle-ice/&quot;&gt;Trickle Ice&lt;/a&gt;. It will make the delay until you start receiving or sending media via Licode a lot smaller.&lt;/p&gt;

&lt;p&gt;However, this has a drawback, this new implementation modifies the protocol used to communicate erizoController with erizoClients.&lt;/p&gt;

&lt;p&gt;Basically, if you modified erizoClient, erizoJSController or erizoController you will find you have to work a little to merge the new changes, we promise it is worth it :)&lt;/p&gt;

&lt;p&gt;As always, we created a new [release/tag] (https://github.com/ging/licode/releases/tag/v1.1.0) to the previous version so you guys can find easily the exact commit we made the change. Furthermore, the &lt;a href=&quot;https://github.com/ging/licode/tree/legacy&quot;&gt;legacy branch&lt;/a&gt; also points to the previous state of master.&lt;/p&gt;

&lt;p&gt;But enough about the past, let’s summarize the new additions:&lt;/p&gt;

&lt;p&gt;Main new features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Trickle ICE support&lt;/li&gt;
  &lt;li&gt;Initial &lt;a href=&quot;http://www.openwebrtc.io&quot;&gt;Openwebrtc/Bowser&lt;/a&gt; support: There are still some things to improve but we’ll get there soon&lt;/li&gt;
  &lt;li&gt;Support for Ubuntu 14.04: Licode should now work with the latest LTS release out of the box! I’d advise to start moving to 14.04 ;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fixes to Video/only audio/only streams in Firefox&lt;/li&gt;
  &lt;li&gt;Fixes to erizoJS management&lt;/li&gt;
  &lt;li&gt;Fixed the infamous ‘Cannot call method ‘hasAudio’ of undefined&lt;/li&gt;
  &lt;li&gt;A lot of smaller fixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We hope all of you switch to this branch as soon as possible and, as always, report your problems so we can keep fixing them.
Thanks to everyone that contributed with code or reports!&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Configuration of roles in Licode (update)</title>
    <link href="http://lynckia.com/licode/roles-update.html"/>
    <updated>2014-11-14T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/roles-update.html</id>
    <content type="html">&lt;p&gt;This is an update of the previous &lt;a href=&quot;http://lynckia.com/licode/roles.html&quot;&gt;post&lt;/a&gt; about roles management in Licode.&lt;/p&gt;

&lt;p&gt;We have changed the format in which roles are defined in Licode’s installation. The new format is:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;roles&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;teacher&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;publish&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;We can edit the roles in the configuration file that we can find at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;licode/licode_config.js&lt;/code&gt; once installed.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>The new Licode master branch</title>
    <link href="http://lynckia.com/licode/async.html"/>
    <updated>2014-08-12T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/async.html</id>
    <content type="html">&lt;p&gt;We have finally made the switch from the async_events branch to master.
This branch includes a host of new features that make Licode more potent, configurable, scalable and stable than ever!&lt;/p&gt;

&lt;p&gt;Here we will discuss the new &lt;em&gt;distributed MCU&lt;/em&gt; architecture. As you know, erizo was a single process started with erizoController, the whole MCU is a single process. From now on, each publisher in Licode will have its own process in the Licode server.&lt;/p&gt;

&lt;p&gt;What once was the erizoController process has been divided into three components. These new modules follow the same design philosophy we use in all Licode, they can be deployed separately in different machines or together. This components are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;ErizoController&lt;/strong&gt;: The good old erizoController, it still has the same function in terms of control and signalling.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;ErizoAgent&lt;/strong&gt;: This new component is in charge of starting new processes. Any machine running erizoAgent will be able to host resources for the distributed MCU by starting and stopping ErizoJSs. These ErizoJSs can be started on demand and/or have a pool of pre-started ones.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;ErizoJS&lt;/strong&gt;: A single broadcaster of the distributed MCU.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This iteration in the architecture brings many new features. Let’s go over some of them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Improved Scalability&lt;/strong&gt;: A single Licode Room can be now easily distributed among an array of servers. By starting erizoAgent in different machines and configuring them properly, the workload of a room will be intelligently distributed.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Improved Stability&lt;/strong&gt;: Before, an irrecoverable error caused by a single stream could potentially bring down erizoController, shutting down all the rooms managed by it. In the new distributed architecture, a fatal error in a stream will only shutdown that stream, while the rest of the room(s) keep working.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Configurable&lt;/strong&gt;: You can manage this behavior in the revamped Licode configuration file (licode_config.js):&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;config.erizoAgent.maxProcesses&lt;/strong&gt;: The maximum amount of ErizoJSs this particular ErizoAgent is allowed to start.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;&lt;strong&gt;config.erizoAgent.prerunProcesses&lt;/strong&gt;: The amount of prestarted processes ErizoAgent will have at all times.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the other new features have already been documented in our Server and Client API Doc pages, or even in this blog:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Client Roles.&lt;/li&gt;
  &lt;li&gt;Enhancements to recording and playback&lt;/li&gt;
  &lt;li&gt;Better STUN and TURN configuration&lt;/li&gt;
  &lt;li&gt;Tons of fixes and improvements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To ease the transition, we will move the current master branch to &lt;em&gt;legacy&lt;/em&gt; in our github repository. As always, feel free to write in the list with any problems, suggestions or ideas you have!&lt;/p&gt;

</content>
</entry>

<entry>
    <title>Configuration of roles in Licode</title>
    <link href="http://lynckia.com/licode/roles.html"/>
    <updated>2014-08-07T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/roles.html</id>
    <content type="html">&lt;p&gt;In this post we will explain in detail how to configure our custom roles in our Licode’s service.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Erizo Controller&lt;/em&gt; now supports the definition of role as a set of permissions, and these permissions are already predefined in this component. A permission allows a user to perform an action on a resource.
Below you can find a list of the current permissions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Publish&lt;/strong&gt;: it allows a user to make a local stream public into the room. This stream can be used to send video, audio or data, and once published other users should be able to subscribe to it.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Subscribe&lt;/strong&gt;: it allows a user to receive a stream that has been previously published into the room. The stream can be also stored or can be received from external sources.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Record&lt;/strong&gt;: it allows a user to store publishing streams in a room, even if it only contains audio or video.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These permissions are fixed in the source code, we can not create new ones without changing the code. But we can create roles from them. For example, if we aim to create e-learning applications we could create a role for the teacher, who should be able to publish, subscribe and even record the stream. On the other hand, the student could only subscribe to other streams. In this case our application would have both roles. In this case we should configure our Licode’s installation with the next line:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;roles&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;teacher&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;publish&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Important update: the new format to specify roles is:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;roles&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;teacher&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;publish&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;student&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As said above we can edit the roles in the configuration file that we can find at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;licode/licode_config.js&lt;/code&gt; once installed.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Lynckia Screensharing extension</title>
    <link href="http://lynckia.com/licode/plugin.html"/>
    <updated>2014-05-28T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/plugin.html</id>
    <content type="html">&lt;p&gt;As you know, some days ago Chrome has updated the screensharing feature in WebRTC. Now you need to add a Chrome extension in order to share your desktop. Of course, Licode is totally compatible with the new feature and from Lynckia team we have uploaded our own extension to Google Web Store in order to support it.&lt;/p&gt;

&lt;p&gt;Thanks to the extension now you can select the screen or the window that you are going to share.&lt;/p&gt;

&lt;p&gt;You can download the extension &lt;a href=&quot;https://chrome.google.com/webstore/detail/lynckia-screensharing/okeephmleflklcdebijnponpabbmmgeo&quot;&gt;here&lt;/a&gt; and test it in our screen sharing rooms at &lt;a href=&quot;http://chotis2.dit.upm.es/&quot;&gt;Licode’s demo portal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Enjoy it!&lt;/p&gt;

</content>
</entry>

<entry>
    <title>Licode + Vagrant</title>
    <link href="http://lynckia.com/licode/vagrant.html"/>
    <updated>2014-02-21T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/vagrant.html</id>
    <content type="html">&lt;p&gt;We are always looking for ways to improve the productivity when it comes to developing, deploying and testing Licode. As a project with several library dependencies, 2-3 programming languages, etc. setting up a new machine for development can be daunting at times, even with our super-easy installation scripts.&lt;/p&gt;

&lt;p&gt;Furthermore, testing in different network configurations (behind NAT, firewall, with remote erizos…) can be quite time consuming.
We have found the solution to these problems with &lt;a href=&quot;http://www.vagrantup.com&quot;&gt;Vagrant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vagrant is a very powerful tool to easily create, configure and port work environments. It uses virtualization and advanced provisioning tools such as Chef to automatically set up and provision virtual machines.&lt;/p&gt;

&lt;p&gt;Not only that, but Vagrant also makes it easy for us to deploy several machines at the same time with only one configuration file. Furthermore, it supports several VM provides such as VMWare, VirtualBox and even cloud providers (AWS, Openstack) via plug-ins.&lt;/p&gt;

&lt;p&gt;We have included our own Vagrantfile configuration and provision shell script in the &lt;a href=&quot;https://github.com/ging/licode/tree/master/extras/vagrant&quot;&gt;repository&lt;/a&gt;. The provision script will download the repository inside the new virtual machine, install the dependencies and compile everything.&lt;/p&gt;

&lt;p&gt;The prerequisites are: Vagrant (of course :)) and VirtualBox.&lt;/p&gt;

&lt;p&gt;So what you have at the end is :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ubuntu 12.04 64 bits&lt;/li&gt;
  &lt;li&gt;All Licode dependencies installed&lt;/li&gt;
  &lt;li&gt;Licode installed in /vagrant/licode in the guest VM&lt;/li&gt;
  &lt;li&gt;Host IP automatically configured in the guest VM&lt;/li&gt;
  &lt;li&gt;Ports forwarded:
    &lt;ul&gt;
      &lt;li&gt;3001 for BasicExample&lt;/li&gt;
      &lt;li&gt;3000 for Nuve&lt;/li&gt;
      &lt;li&gt;30000-31000 udp for WebRTC also configured for Licode&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using vagrant ssh you can start and stop Licode as usual.
So there you have your full Licode development environment.&lt;/p&gt;

&lt;p&gt;Besides, by changing things in the Vagrantfile you can set up several machines, network configurations, etc. to help you with your testing. Take a look at the tutorials in http://www.vagrantup.com for more information.&lt;/p&gt;

&lt;p&gt;We will be playing with this the next weeks, trying AWS, OpenStack, etc. Any experiences, comments suggestions are welcome :)&lt;/p&gt;

&lt;p&gt;See you all developers in the &lt;a href=&quot;http://groups.google.com/group/lynckia&quot;&gt;list&lt;/a&gt;!&lt;/p&gt;

</content>
</entry>

<entry>
    <title>New demos portal</title>
    <link href="http://lynckia.com/licode/new-demos.html"/>
    <updated>2013-11-21T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/new-demos.html</id>
    <content type="html">&lt;p&gt;This week we have uploaded our demos portal with new types of applications of Licode. We have videoconference, audioconference and screen sharing demos. Furthermore, some of them are in peer-to-peer configuration.&lt;/p&gt;

&lt;p&gt;You can try them as always at &lt;a href=&quot;http://chotis2.dit.upm.es/&quot;&gt;Licode’s demos portal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, of course, we are going to add new demos very soon!&lt;/p&gt;

&lt;p&gt;Best regards and enjoy Licode.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Branch merging and reorganization post</title>
    <link href="http://lynckia.com/licode/master-branch.html"/>
    <updated>2013-10-29T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/master-branch.html</id>
    <content type="html">&lt;p&gt;Last week we took Licode a step further by incorporating in the main branch many of the repository several features that have been in the works in the last few months.&lt;/p&gt;

&lt;p&gt;Here are some highlights:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://lynckia.com/licode/turn.html&quot;&gt;TURN server support&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Stream recording&lt;/li&gt;
  &lt;li&gt;DTLS/Firefox support&lt;/li&gt;
  &lt;li&gt;Cleaner logging system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As well as a bunch of bugfixes!&lt;/p&gt;

&lt;p&gt;We encourage all of you to switch to this branch and keep helping Licode with your feedback and opinions. We have already posted here regarding the TURN server support feature and we will keep posting more information about the others in the next few weeks as well as the documentation part of this site.&lt;/p&gt;

&lt;p&gt;We will keep the other branches for a while but will soon be replaced or removed as we move on into new territories :)&lt;/p&gt;

&lt;p&gt;You can start testing it, and again, feedback is very welcome! Thank you!&lt;/p&gt;

</content>
</entry>

<entry>
    <title>Turn Support</title>
    <link href="http://lynckia.com/licode/turn.html"/>
    <updated>2013-10-28T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/turn.html</id>
    <content type="html">&lt;p&gt;In the latest version of Chrome Turn support in PeerConnection objects is enabled. So from today we have included this feature in Licode.&lt;/p&gt;

&lt;p&gt;You can use it including the Turn Server configuration in licode-config file:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;config.erizoController.turnServer = {};
config.erizoController.turnServer.url = &quot;turn:myTurnServerHost:443?transport=tcp&quot;;
config.erizoController.turnServer.username = &quot;username&quot;;
config.erizoController.turnServer.password =  &quot;pass&quot;;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This way all clients connected to Licode will include that Turn server in their PeerConnection configuration. We have made some test with &lt;a href=&quot;https://code.google.com/p/rfc5766-turn-server/&quot;&gt;rfc5766-turn-server&lt;/a&gt; and the results are really cool. You can start testing and tell us your impressions.&lt;/p&gt;

&lt;p&gt;Thanks to Turn servers relay, Firefox compatibility and Chrome mobile for Android support, every day more types of web clients and in very different conditions of connectivity can connect to Licode services. And a very important part of this work is due to our community’s tests and feedback.&lt;/p&gt;

&lt;p&gt;Thank you again.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Peer – to – peer functionality</title>
    <link href="http://lynckia.com/licode/p2p-rooms.html"/>
    <updated>2013-09-04T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/p2p-rooms.html</id>
    <content type="html">&lt;p&gt;We have developed a very cool feature in Licode. Now you can use peer – to – peer rooms in your services. That means that you can communicate your users directly between their browsers without passing through the MCU server (only for signalling). And this is very useful in applications with a low number of users in which you want to save server side resources.&lt;/p&gt;

&lt;p&gt;An initial version is implemented in Licode’s “cleanup” branch (by the moment it only works between peers using the same browser, we are developing the interoperability Chrome - Firefox). And use it is very easy! You only need to create a p2p room using Nuve API like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;var roomName = 'myP2PRoom';

N.API.createRoom(roomName, function(room) {
	console.log('P2P room created with id: ', room._id);
}, errorCallback, {p2p: true});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And from here use the room with the client API as always!&lt;/p&gt;

&lt;p&gt;You can start testing it, and again, every feedback is very welcome!&lt;/p&gt;

&lt;p&gt;Thank you very much and enjoy Licode!&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Licode now supports Firefox</title>
    <link href="http://lynckia.com/licode/firefox.html"/>
    <updated>2013-07-17T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/firefox.html</id>
    <content type="html">&lt;p&gt;Today we’ve finished the main tasks of making Licode compatible with Firefox.&lt;/p&gt;

&lt;p&gt;Now users can access Licode rooms from stable versions of Chrome and Firefox. If you’re developing a solution with Licode and can’t wait to try this new functionality you have to pull the code from the “cleanup” branch.&lt;/p&gt;

&lt;p&gt;There is still work to be done. For example, feedback compatibility and overall stabilization. So, please, don’t install it if you’re already providing a service using Licode.&lt;/p&gt;

&lt;p&gt;As part of this work we’ve also switched the security mechanism from SDES to DTLS, and we’re making a partial refactorization of the transport and connection files in Erizo.&lt;/p&gt;

&lt;p&gt;During the next weeks we’ll continue testing this new feature in several scenarios and we’ll let yu know when it is ready to use. And we’ll probably finish the very first version of the recording API very soon.&lt;/p&gt;

&lt;p&gt;Stay tuned!&lt;/p&gt;
</content>
</entry>

<entry>
    <title>We are 100 Licode developers!</title>
    <link href="http://lynckia.com/licode/community-100.html"/>
    <updated>2013-06-13T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/community-100.html</id>
    <content type="html">&lt;p&gt;We are very happy to announce that today we have processed the membership request of the 100th developer in Licode community.&lt;/p&gt;

&lt;p&gt;Since November 2012, when we started with the community, we have more than 55 discussions with about 4 messages per day. Moreover, Licode GitHub repository has 94 stars, 27 forks, 503 commits, 8 branches and every day developers are more interested in contribute to our code.&lt;/p&gt;

&lt;p&gt;All these numbers are the evidence of Licode is becoming a bigger and richer project every day. Thanks to all of you, your interest, testing and hard work Licode is a reference in the Open Source WebRTC communications providers.&lt;/p&gt;

&lt;p&gt;Thank you very much.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Screen sharing with Licode</title>
    <link href="http://lynckia.com/licode/screen-sharing.html"/>
    <updated>2013-06-07T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/screen-sharing.html</id>
    <content type="html">&lt;p&gt;We have just implemented a new very interesting functionality in Licode. From today you can include in your Licode applications the feature of share any client screen using the GetUserMedia API of WebRTC.&lt;/p&gt;

&lt;p&gt;This is very easy. To allow it in a Stream you only need to create it this way:&lt;/p&gt;

&lt;p&gt;var stream = Erizo.Stream({screen: true, data: true, attributes: {name:’myStream’}});&lt;/p&gt;

&lt;p&gt;And then publish it in a room in the traditional way. Instructions in &lt;a href=&quot;http://lynckia.com/licode/client-api.html&quot;&gt;Client API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We think this is a very useful feature and, in the tests that we have made, its performance its very amazing. We are also developing a demo service in order to you can try the new functionality and use to share your screen in any scenario.&lt;/p&gt;

&lt;p&gt;Note that the clients that will share their screen have to access your web application using a secure connection (https protocol). Furthermore, by the moment, he or she has to allow the access activating a flag in Chrome browser (Enable screen capture support in getUserMedia()).&lt;/p&gt;
</content>
</entry>

<entry>
    <title>New GitHub repository name</title>
    <link href="http://lynckia.com/licode/new-repo-name.html"/>
    <updated>2013-06-07T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/new-repo-name.html</id>
    <content type="html">&lt;p&gt;Regarding the new name of our project &lt;a href=&quot;http://lynckia.com/licode/LicodeNow.html&quot;&gt;Licode&lt;/a&gt; today we have made the last change. It consists of update the name of our github repository. The new path is &lt;a href=&quot;https://github.com/ging/licode&quot;&gt;Licode GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;GitHub &lt;a href=&quot;https://github.com/blog/1508-repository-redirects-are-here&quot;&gt;redirects automatically&lt;/a&gt; your project to the new one. So if you have already cloned it you only need to make a pull in order to update the changes (we have made some changes in scripts names and so on).&lt;/p&gt;

&lt;p&gt;In advance you should clone the repository from the new path. We have updated the instructions in &lt;a href=&quot;http://lynckia.com/licode/install.html&quot;&gt;installing Licode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you very much and enjoy Licode.
Best regards&lt;/p&gt;

</content>
</entry>

<entry>
    <title>Licode wins the Open Source University Challenge</title>
    <link href="http://lynckia.com/licode/Licode-prize.html"/>
    <updated>2013-05-28T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/Licode-prize.html</id>
    <content type="html">&lt;p&gt;Last Friday Lynckia team have won with Licode the seventh Open Source University Challenge &lt;a href=&quot;http://www.concursosoftwarelibre.org/1213/premiados-vii-cusl&quot;&gt;CUSL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this edition have been participated more than 80 Open Source projects developed by the Spain University community. Licode has been specially valued because its increasing community and its ambitious development.&lt;/p&gt;

&lt;p&gt;We want to thank the whole community because the effort, the testing and the contributions. This prize is also yours.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../img/cusl2.jpg&quot; alt=&quot;Lynckia CUSL&quot; /&gt;&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Lynckia project now is Licode</title>
    <link href="http://lynckia.com/licode/LicodeNow.html"/>
    <updated>2013-05-10T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/LicodeNow.html</id>
    <content type="html">&lt;p&gt;Today we announce that our Open Source project Lynckia now is called Licode. But don’t worry! Nothing is different in Licode. We are working hard on new features and with your help, and all the community Licode is becoming more and more amazing every day.&lt;/p&gt;

&lt;p&gt;You can find some information about our development group at &lt;a href=&quot;http://lynckia.com&quot;&gt;Lynckia&lt;/a&gt; and all the resources and documentation of Licode at &lt;a href=&quot;http://lynckia.com/licode&quot;&gt;Licode&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you very much.  And enjoy Licode.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Licode working with Chrome beta on Android!!</title>
    <link href="http://lynckia.com/licode/lynckia-android.html"/>
    <updated>2013-03-06T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/lynckia-android.html</id>
    <content type="html">&lt;p&gt;Great news everyone!&lt;/p&gt;

&lt;p&gt;Licode is now officially working with the last version of Chrome Beta
on Android. That means all your applications using Licode are now going
mobile.&lt;/p&gt;

&lt;p&gt;To enable WebRTC on Chrome Dev for Android:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Type in “chrome://flags” in the omnibox to access the flags&lt;/li&gt;
  &lt;li&gt;Scroll about a third down and enable the “Enable WebRTC” flag&lt;/li&gt;
  &lt;li&gt;You will be asked to relaunch the browser at the bottom of the page in order for the flag to take effect.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you can open your Licode application url (or our [test page]
(http://chotis2.dit.upm.es) ) and that’s it :)&lt;/p&gt;

&lt;p&gt;Keep in mind this is still a beta version and there is still a lot of
work to be done for it to work perfectly.&lt;/p&gt;

&lt;p&gt;You can see it in action in this video:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/4gCfiLaYV2U&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;We want to thank Google WebRTC group for their great work implementing
the standard in Chrome in every platform.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Nuve Client now available in ruby</title>
    <link href="http://lynckia.com/licode/Nuve-client-ruby.html"/>
    <updated>2013-03-01T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/Nuve-client-ruby.html</id>
    <content type="html">&lt;p&gt;Today we announce that now you can access to nuve API from your ruby server applications. Thanks to the nuve library developed in ruby now Licode is able to run with the three most popular server side languages: node.js, python and ruby.&lt;/p&gt;

&lt;p&gt;You can find the library in our github repository (https://github.com/ging/licode/tree/master/nuve/nuveClient_ruby) and use it following the same API that in the rest of languages (http://lynckia.com/licode/server-api.html). You can feedback your impressions or problems in our mail list. Enjoy it!&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Introducing RTCP feedback forwarding in Licode.</title>
    <link href="http://lynckia.com/licode/rtcp-feedback.html"/>
    <updated>2013-01-17T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/rtcp-feedback.html</id>
    <content type="html">&lt;p&gt;One of the most important problems to be faced when working with real
time communications is how to react to varying network conditions. Even
if a bandwidth and general quality is agreed during the signalling or
negotiation phase, any change in one of the participants’ connection
will degrade the communication. There are many studies and implemented
mechanisms to help solve this problem. These solutions are heavily
dependant on the protocols and technologies used in each application&lt;/p&gt;

&lt;p&gt;Licode lives in the WebRTC world and has to communicate with the
current implementations, being &lt;a href=&quot;http://google.com/chrome&quot;&gt;Google Chrome&lt;/a&gt; the
most important today. Chrome has been advancing in the implementation of
the &lt;a href=&quot;http://tools.ietf.org/html/rfc5124&quot;&gt;SAVPF RTP Profile&lt;/a&gt; for some
months that, among other things, defines feedback RTCP packets to adapt
the communication between the peers.&lt;/p&gt;

&lt;p&gt;Today we announce we have implemented the forwarding of RTCP packets via
Licode in the master branch. In our tests it has greatly improved the communication in
environments with high packet losses and latency. While this is only the
first step, it is very important for providing a high quality service.&lt;/p&gt;

&lt;p&gt;We encourage all of you to test it and tell us what you think of it. Please remember to uninstall libsrtp
and use the one included in the repository now. All the scripts have
been fixed so installing everything again should work just fine.&lt;/p&gt;

&lt;p&gt;We also have updated our &lt;a href=&quot;http://chotis2.dit.upm.es&quot;&gt;demo page&lt;/a&gt; and we
also encourage you to try it :)&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Connecting erizo clients to Licode in your node.js applications.</title>
    <link href="http://lynckia.com/licode/erizofc.html"/>
    <updated>2012-12-19T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/erizofc.html</id>
    <content type="html">&lt;p&gt;Some weeks ago we had a very cool idea. We were talking about the
posibility of running an erizo client in a node.js application and
connect it to a Licode session. With this feature you can include in
your Licode rooms streams from a client that not necessarily runs in a
browser. It may be of interest, for example, for doing some operations with the streams like processing or synchronization.&lt;/p&gt;

&lt;p&gt;Today it is posible with &lt;code&gt;erizofc&lt;/code&gt;, a node module that you can include in your node application to run erizo clients with the same API used in browsers. You can check the API &lt;a href=&quot;http://lynckia.com/licode/client-api.html&quot;&gt;here&lt;/a&gt;. &lt;code&gt;erizofc&lt;/code&gt; is simply a new compilation of the erizoClient source code changing the socket.io library and considering some particular characteristics that differentiates browser and node applications. To connect with socket.io a node.js application working like a client to another working like a server we use the node module &lt;a href=&quot;http://npmjs.org/package/socket.io-client&quot;&gt;&lt;em&gt;socket.io-client&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At the moment it is only possible to publish and subscribe data streams from the node.js clients. However we are working in the feature of manage different ways of obtain media streams using streams from URLs rtp, rtsp, rtmp …&lt;/p&gt;
</content>
</entry>

<entry>
    <title>Automated testing in Travis CI for WebRTC</title>
    <link href="http://lynckia.com/licode/travis-webrtc.html"/>
    <updated>2012-12-17T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/travis-webrtc.html</id>
    <content type="html">&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;

&lt;p&gt;We’ve been working on developing tests for checking WebRTC connections 
in Licode and Google Chrome (stable and unstable versions). We started 
using Travis for the server tests some weeks ago, but at this time, we
wanted to go beyond simple tests of Nuve and basic room’s functionality.&lt;/p&gt;

&lt;p&gt;Our idea is to test publishng, subscribing and further features of our 
client library in Chrome and in future versions of Firefox. During these
tests we need to automatically start Chrome, accept the browser’s 
GetUserMedia request, and to send a fake video stream to check whether 
streams are sent or not.&lt;/p&gt;

&lt;h2 id=&quot;testing-environment&quot;&gt;Testing environment&lt;/h2&gt;

&lt;p&gt;For this puporse we used three different and compatible frameworks:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://travis-ci.org/&quot;&gt;&lt;em&gt;Travis CI&lt;/em&gt;&lt;/a&gt;: We continued using it for running 
tests in a standalone machine. It allows to setup experimental environments 
based on a Linux machine that is almost fully configurable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/0qPjt.png?1&quot; alt=&quot;Travis Logo&quot; title=&quot;Travis-CI Logo&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://vojtajina.github.com/testacular/&quot;&gt;&lt;em&gt;Testacular&lt;/em&gt;&lt;/a&gt;: This is a Test 
Runner for JavaScript that allows to test JS applications directly on the 
browser. It supports different providers, such as Google Chrome, Firefox, 
and so on. And it also supports custom browser launchers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Testacular also allows you to use several testing frameworks, but it comes 
 with built-in Jasmine and Mocha integration.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://pivotal.github.com/jasmine/&quot;&gt;&lt;em&gt;Jasmine&lt;/em&gt;&lt;/a&gt;: It is a behavior-driven 
development framework for testing JavaScript code. It does not depend on any 
other JavaScript frameworks. It does not require a DOM. And it has a clean, 
obvious syntax so that you can easily write tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ve also tested it against Mocha in our experiments, so you can choose 
 your own framework.&lt;/p&gt;

&lt;h2 id=&quot;setting-up-travis-and-testacular&quot;&gt;Setting up Travis and Testacular&lt;/h2&gt;

&lt;p&gt;We first need to install Chrome in the Travis machine for every test. Travis 
helps us to do it by the &lt;code&gt;before_install&lt;/code&gt; command:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;language: node_js
node_js:
  - 0.8
before_install:
  - ./.travis/scripts/install_chrome.sh
  - export DISPLAY=:99.0
  - sh -e /etc/init.d/xvfb start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this case you have to create the &lt;code&gt;install_chrome.sh&lt;/code&gt; script to 
start chrome before the tests. You can access this script [here]
(https://github.com/ging/licode/blob/master/.travis/scripts/install_chrome.sh).&lt;/p&gt;

&lt;p&gt;Since Travis runs &lt;code&gt;npm test&lt;/code&gt; for running tests we also need to 
create a &lt;code&gt;package.json&lt;/code&gt; with info about the tests. Here we should 
add the next lines to our code:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;scripts&quot;: {
    &quot;test&quot;: &quot;./node_modules/coffee-script/bin/cake test&quot;
} 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And we’ll also add the corresponding Cakefile:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;exec = require('child_process').exec
task 'test', 'run all tests suites', -&amp;gt;
    console.log 'Running front-end tests'
    chrome_bin = &quot;DISPLAY=:99&quot;
    testacular = &quot;#{__dirname}/node_modules/testacular/bin/testacular&quot;
    browsers = '.travis/chrome-start.sh'
    options = &quot;--single-run --browsers=#{browsers}&quot;
    exec &quot;#{chrome_bin} #{testacular} start #{__dirname}/.travis/testacular.conf.js&quot;, (err, stdout, stderr) -&amp;gt;
        console.error err if err
        console.log stdout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the 
&lt;a href=&quot;https://github.com/ging/licode/blob/master/.travis/chrome-start.sh&quot;&gt;chrome-start.sh&lt;/a&gt; 
file we have the corresponding starting scripts. With this script we setup 
Chrome with some default Chrome 
&lt;a href=&quot;https://github.com/ging/licode/blob/master/.travis/Preferences&quot;&gt;Preferences&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;It allows the user to start Chrome and use Webrtc from a local URL 
(http://localhost:9876/) without asking permissions. This is configured in the 
Preferences file.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It also starts Chrome by using a fake video device, that is used to send 
synthetic video packets between clients. This is achieved in the starting script, 
with the option: &lt;code&gt;--use-fake-device-for-media-stream&lt;/code&gt;. Below you can see the resulting video.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/Q0ReP.png?1&quot; alt=&quot;Fake Video on Google Chrome&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;/h2&gt;

&lt;p&gt;For testing we used Jasmine and its asynchronous functionalities. We use it to 
test Licode but it can also be used to test WebRTC applications. Below we show 
one of our examples in the 
&lt;a href=&quot;https://github.com/ging/licode/blob/master/test/nuve-test.js&quot;&gt;test cases&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;it('should get access to user media', function () {
    var callback = jasmine.createSpy(&quot;getusermedia&quot;);

    localStream = Erizo.Stream({audio: true, video: true, data: true});

    localStream.addEventListener(&quot;access-accepted&quot;, callback);

    localStream.init();

    waitsFor(function () {
        return callback.callCount &amp;gt; 0;
    });

    runs(function () {

        expect(callback).toHaveBeenCalled();
    });
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example we call the GetUserMedia command, and it automatically accepts on 
behalf of the user given the previous configuration. Once it is accept we check 
whether the Jasmine’s Spy has been called.&lt;/p&gt;
</content>
</entry>

<entry>
    <title>New LookAndFeel in Licode</title>
    <link href="http://lynckia.com/licode/Lynckia-first-test.html"/>
    <updated>2012-12-04T00:00:00+00:00</updated>
    <id>http://lynckia.com//licode/Lynckia-first-test.html</id>
    <content type="html">&lt;p&gt;Lately, we’ve been changing the LookAndFeel of Licode’s Web Site. Now we can
introduce the brand new Blog!!&lt;/p&gt;

&lt;p&gt;Here we’ll talk about news related to Licode and other WebRTC stuff, like
demos, examples, screencasts, and so on.&lt;/p&gt;
</content>
</entry>

 
</feed>
