// +build js,wasm package webrtc import ( "fmt" "time" ) func signalPair(pcOffer *PeerConnection, pcAnswer *PeerConnection) (err error) { offerChan := make(chan SessionDescription) pcOffer.OnICECandidate(func(candidate *string) { if candidate == nil { offerChan <- *pcOffer.PendingLocalDescription() } }) // Note(albrow): We need to create a data channel in order to trigger ICE // candidate gathering in the background. if _, err := pcOffer.CreateDataChannel("initial_data_channel", nil); err != nil { return err } offer, err := pcOffer.CreateOffer(nil) if err != nil { return err } if err := pcOffer.SetLocalDescription(offer); err != nil { return err } timeout := time.After(3 * time.Second) select { case <-timeout: return fmt.Errorf("timed out waiting to receive offer") case offer := <-offerChan: if err := pcAnswer.SetRemoteDescription(offer); err != nil { return err } answer, err := pcAnswer.CreateAnswer(nil) if err != nil { return err } if err = pcAnswer.SetLocalDescription(answer); err != nil { return err } err = pcOffer.SetRemoteDescription(answer) if err != nil { return err } return nil } return nil }