|  | @@ -35,26 +35,26 @@ type session struct {
 | 
	
		
			
				|  |  |  	downlinkClosed bool
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (s *session) checkAndRemove() {
 | 
	
		
			
				|  |  | -	s.Lock()
 | 
	
		
			
				|  |  | -	if s.uplinkClosed && s.downlinkClosed {
 | 
	
		
			
				|  |  | -		s.parent.remove(s.id)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	s.Unlock()
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  func (s *session) closeUplink() {
 | 
	
		
			
				|  |  | +	var allDone bool
 | 
	
		
			
				|  |  |  	s.Lock()
 | 
	
		
			
				|  |  |  	s.uplinkClosed = true
 | 
	
		
			
				|  |  | +	allDone = s.uplinkClosed && s.downlinkClosed
 | 
	
		
			
				|  |  |  	s.Unlock()
 | 
	
		
			
				|  |  | -	s.checkAndRemove()
 | 
	
		
			
				|  |  | +	if allDone {
 | 
	
		
			
				|  |  | +		s.parent.remove(s.id)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (s *session) closeDownlink() {
 | 
	
		
			
				|  |  | +	var allDone bool
 | 
	
		
			
				|  |  |  	s.Lock()
 | 
	
		
			
				|  |  |  	s.downlinkClosed = true
 | 
	
		
			
				|  |  | +	allDone = s.uplinkClosed && s.downlinkClosed
 | 
	
		
			
				|  |  |  	s.Unlock()
 | 
	
		
			
				|  |  | -	s.checkAndRemove()
 | 
	
		
			
				|  |  | +	if allDone {
 | 
	
		
			
				|  |  | +		s.parent.remove(s.id)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type ClientManager struct {
 | 
	
	
		
			
				|  | @@ -177,7 +177,7 @@ func fetchInput(ctx context.Context, s *session, output buf.Writer) {
 | 
	
		
			
				|  |  |  			return
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	_, timer := signal.CancelAfterInactivity(ctx, time.Minute*5)
 | 
	
		
			
				|  |  | +	_, timer := signal.CancelAfterInactivity(ctx, time.Minute*30)
 | 
	
		
			
				|  |  |  	if err := buf.PipeUntilEOF(timer, s.input, writer); err != nil {
 | 
	
		
			
				|  |  |  		log.Info("Proxyman|Mux|Client: Failed to fetch all input: ", err)
 | 
	
		
			
				|  |  |  	}
 |