docs: function ServerChannel(options, servernode, sio) {
  
      /**
       * ### ServerChannel.servernode
       *
       * Reference to the ServerNode
       */
      this.servernode = servernode;
  
      /**
       * ### ServerChannel.sio
       *
       * Reference to the Socket.IO app of ServerNode
       */
      this.sio = sio;
  
      /**
       * ### ServerChannel.options
       *
       * Configuration options
       *
       * // TODO: do not parse options
       * // (they are already parsed by ServerNode).
       */
      this.options = ServerChannel.parseOptions(options);
  
      /**
       * ### ServerChannel.name
       *
       * The name of the channel (under normal condition equal to gameName)
       */
      this.name = options.name;
  
      /**
       * ### ServerChannel.gameName
       *
       * The name of the game associated with the channel
       */
      this.gameName = options.gameName;
  
      /**
       * ### ServerChannel.defaultChannel
       *
       * TRUE, if this is the ServerNode's default Channel.
       */
      this.defaultChannel = null;
  
      /**
       * ### ServerChannel.gameInfo
       *
       * Reference to the game information, including treatments and client types
       */
      this.gameInfo = this.servernode.info.games[this.gameName];
  
      /**
       * ### ServerChannel.sysLogger
       *
       * The logger for the channel
       */
      this.sysLogger = Logger.get('channel', {name: this.name});
  
      /**
       * ### ServerChannel.session
       *
       * Unique session id, shared by both Player and Admin Server
       */
      this.session = '' + Math.floor(Math.random()*10000000000000000);
  
      /**
       * ## ServerChannel.credentials
       *
       * Administrator account to manage the channel
       *
       * The `GameLoader` will populate the object with the data read from
       * file system. The final object is of the type:
       *
       *  - {user: 'admin', pwd: 'pwd' }
       *
       * @see GameLoader.loadServerDir
       */
      this.credentials = null;
  
      /**
       * ### ServerChannel._loadingCredentials
       *
       * Flags that credentials are being loaded async
       */
      this._loadingCredentials = null;
  
      /**
       * ### ServerChannel.session
       *
       * Secret string used to sign channels' json tokens
       *
       * The `GameLoader` will read the secret from file system.
       *
       * @see GameLoader.loadServerDir
       * @see ServerChannel._loadingSecret
       */
      this.secret = null;
  
      /**
       * ### ServerChannel._loadingSecret
       *
       * Flags that secret is being loaded async
       */
      this._loadingSecret = null;
  
      /**
       * ### ServerChannel.registry
       *
       * The registry of all connected clients
       *
       * @see ChannelRegistry
       */
      this.registry = new ChannelRegistry({
          channelName: this.name
      });
  
      /**
       * ### ServerChannel.gameRouter
       *
       * Creates and handles routes from public/ and views/
       *
       * @see GameRouter
       */
      this.gameRouter = new GameRouter(this);
  
      /**
       * ### ServerChannel.admin
       *
       * The admin server
       *
       * @see GameServer
       * @see AdminServer
       */
      this.adminServer = null;
  
      /**
       * ### ServerChannel.player
       *
       * The player server
       *
       * @see GameServer
       * @see PlayerServer
       */
      this.playerServer = null;
  
      /**
       * ### ServerChannel.garageRoom
       *
       * The garage room for the channel
       */
      this.garageRoom = null;
  
      /**
       * ### ServerChannel.waitingRoom
       *
       * The waiting room for the channel
       *
       * @see ServerChannel.createWaitingRoom
       */
      this.waitingRoom = null;
  
      /**
       * ### ServerChannel.requirementsRoom
       *
       * The requirements room for the channel
       *
       * @see ServerChannel.createRequirementsRoom
       */
      this.requirementsRoom = null;
  
      /**
       * ### ServerChannel.gameRooms
       *
       * Associative container for all the game rooms in the channel
       *
       * @see ServerChannel.createGameRoom
       */
      this.gameRooms = {};
  
      /**
       * ### ServerChannel.maxRooms
       *
       * The maximum number of game rooms allowed in this channel
       *
       * The value -1 means unlimited.
       */
      this.maxRooms = 'undefined' === typeof options.maxRooms ?
          -1 : options.maxRooms;
  
      /**
       * ### ServerChannel.autoRoomNo
       *
       * Incremental index used when creating game rooms with a default name
       */
      if ('undefined' === typeof options.roomCounter) {
          this.autoRoomNo = 0;
      }
      else {
          this.autoRoomNo = options.roomCounter;
      }
  
      /**
       * ### ServerChannel.roomOwnDataDir
       *
       * If TRUE, each new room is assigned an own data dir
       */
      this.roomOwnDataDir = 'undefined' === typeof options.roomOwnDataDir ?
          true : !!options.roomOwnDataDir;
  
      /**
       * ### ServerChannel.logClients
       *
       * If TRUE, each room connection/disconnection is logged
       *
       * Note: rooms can overwrite this setting.
       *
       * Default: FALSE
       */
      this.logClients = options.logClients || false;
  
      /**
       * ### ServerChannel.logClientsExtra
       *
       * A callback adding extra information for every client log
       *
       * Note: rooms can overwrite this setting.
       *
       * Callback takes the full client object and must return an array
       * of strings to be serialized.
       *
       * Default: NULL
       *
       * @see ServerChannel.logClients
       */
      this.logClientsExtra = options.logClientsExtra || null;
  
      /**
       * ### ServerChannel.logClientsInterval
       *
       * How often in milliseconds clients log are dumped to file system
       *
       * Note: rooms can overwrite this setting.
       *
       * Default: 1000
       *
       * @see ServerChannel.logClients
       */
      this.logClientsInterval = options.logClientsInterval || 1000;
  
      /**
       * ### ServerChannel.roomCounterPadChars
       *
       * The number of chars for the roomCounter when saved as a directory on fs
       *
       * If room counter is less than roomCounterPadChars,
       * leading zeros are added.
       *
       * @see padFileNameNumber
       */
      if ('undefined' === typeof options.roomCounterPadChars) {
          this.roomCounterPadChars = 6;
      }
      else {
          this.roomCounterPadChars = options.roomCounterPadChars;
      }
  
      /**
       * ### ServerChannel.roomCounterSeparator
       *
       * A character to be inserted between 'room' and the room counter.
       *
       * This feature is not implemented now, and reserved for future versions.
       */
      this.roomCounterSeparator = '';
      //     if ('undefined' === typeof options.roomCounterSeparator) {
      //         this.roomCounterSeparator = '';
      //     }
      //     else {
      //         this.roomCounterSeparator = options.roomCounterSeparator;
      //     }
  
      /**
       * ### ServerChannel.gameLevels
       *
       * Active game levels of the game
       */
      this.gameLevels = {};
  
      /**
       * ### ServerChannel.bots
       *
       * node instances of bots inside the channel, indexed by Client ID
       */
      this.bots = {};
  
      /**
       * ### ServerChannel.phantoms
       *
       * Spawn phantomjs processes, indexed by PID
       */
      this.phantoms = {};
  
      // Creating the AdminServer and PlayerServer.
      this.createServers();
  
      // Create garage room.
      this.garageRoom = this.createRoom('Garage');
  }