docs: function () {
  		
  		LOG.warn('starting [' + SR.Settings.SERVER_INFO.type + '] server at base port: ' + l_ip_port.port, l_name);
  		
  		// NOTE: name will determine which handler set to get/store
  		// create a listener that'll listen to the default socket port for this server
  		l_server = new SR.Listener({
  			port:           l_ip_port.port + SR.Settings.PORT_INC_SOCKET,
  			conn_module:    config.conn_handler
  		});
  		
  		// always load system.js (NOTE: before other handlers)
  		SR.Handler.addByFile({name: 'system',	file: 'system.js', owner: 'SR'}, config.path);
  		
  		// result may be true or false
  		l_server.init(function (result) {
  			if (result === false) {
  				LOG.error('server init fail, listen port: ' + l_ip_port.port, l_name);
  				
  				// NOTE: this is redundant judgement with frontier's 
  				//LOG.warn('treat this server as APP server, loading AppConnector...', l_name);
  				//SR.Module.addStep(SR.Component.AppConnector());
  				
  				// TODO: try to close down more gracefully, right now this will trigger many 
  				// unnecessary shutdown steps (& print too many error messages not useful)
  				//l_dispose();
  			}
  			else {
  				LOG.warn('server is ready & running...', l_name);
  								
  				// for entry server, we report the entry server HTTP base port
  				// TODO: cleaner approach?
  				if (SR.Settings.SERVER_INFO.type === 'entry')
  					SR.Settings.SERVER_INFO.port = SR.Settings.PORT_ENTRY_ACTUAL;
  				
  				// NOTE: this is redundant judgement with frontier's 
  				//else if (SR.Settings.SERVER_INFO.type === 'lobby') {
  				//	LOG.warn('treat this server as LOBBY server, loading AppManager...', l_name);
  				//	SR.Module.addStep(SR.Component.AppManager());
  				//}
  			}
  			
  			UTIL.safeCall(onDone, true);
  		});
  	}