code: func openChromeTarget(addr string, target *TargetInfo) (*ChromeTarget, error) {
  	conn, err := wsConnection(addr, target.WebSocketDebuggerUrl)
  	if err != nil {
  		return nil, err
  	}
  	replier := make(map[int64]chan *gcdmessage.Message)
  	//var replyLock sync.RWMutex
  	//var eventLock sync.RWMutex
  	eventer := make(map[string]func(*ChromeTarget, []byte))
  	sendCh := make(chan *gcdmessage.Message)
  	doneCh := make(chan struct{})
  	chromeTarget := &ChromeTarget{conn: conn, Target: target, sendCh: sendCh, replyDispatcher: replier, eventDispatcher: eventer, doneCh: doneCh, sendId: 0}
  	chromeTarget.apiTimeout = 120 * time.Second // default 120 seconds to wait for chrome to respond to us
  	chromeTarget.Init()
  	chromeTarget.listen()
  	return chromeTarget, nil
  }
docs: // openChromeTarget creates a new Chrome Target by connecting to the service given the URL taken from initial connection.