code: func Obfs4Init(node Node, isServeNode bool) error {
  	if _, ok := obfs4Map[node.Addr]; ok {
  		return fmt.Errorf("obfs4 context already inited")
  	}
  
  	t := new(obfs4.Transport)
  
  	stateDir := node.Values.Get("state-dir")
  	if stateDir == "" {
  		stateDir = "."
  	}
  
  	ptArgs := pt.Args(node.Values)
  
  	if !isServeNode {
  		cf, err := t.ClientFactory(stateDir)
  		if err != nil {
  			return err
  		}
  
  		cargs, err := cf.ParseArgs(&ptArgs)
  		if err != nil {
  			return err
  		}
  
  		obfs4Map[node.Addr] = obfs4Context{cf: cf, cargs: cargs}
  	} else {
  		sf, err := t.ServerFactory(stateDir, &ptArgs)
  		if err != nil {
  			return err
  		}
  
  		sargs := sf.Args()
  
  		obfs4Map[node.Addr] = obfs4Context{sf: sf, sargs: sargs}
  
  		log.Log("[obfs4] server inited:", obfs4ServerURL(node))
  	}
  
  	return nil
  }
docs: // Obfs4Init initializes the obfs client or server based on isServeNode