()
| 311 | } |
| 312 | |
| 313 | func (s *Send) setupWebrtcConnection() { |
| 314 | var err error |
| 315 | s.RtcConn, err = webrtc.NewPeerConnection(getWebRTCConfig()) |
| 316 | if err != nil { |
| 317 | panic("failed to create webrtc connection: " + err.Error()) |
| 318 | } |
| 319 | |
| 320 | s.RtcConn.OnICECandidate(func(i *webrtc.ICECandidate) { |
| 321 | if i == nil { |
| 322 | return |
| 323 | } |
| 324 | ic := i.ToJSON() |
| 325 | |
| 326 | <-s.waitIce |
| 327 | s.out <- &overlayMessage{ |
| 328 | Typ: messageTypeWebRTCCandidate, |
| 329 | WebrtcCandidate: &ic, |
| 330 | } |
| 331 | }) |
| 332 | |
| 333 | s.RtcDc, err = s.RtcConn.CreateDataChannel("fileTransfer", nil) |
| 334 | if err != nil { |
| 335 | fmt.Println("failed to create dc:", err) |
| 336 | } |
| 337 | |
| 338 | // Add message handler to our created data channel |
| 339 | s.RtcDc.OnMessage(func(msg webrtc.DataChannelMessage) { |
| 340 | if msg.IsString { |
| 341 | meta := RtcMetadata{} |
| 342 | |
| 343 | err := json.Unmarshal(msg.Data, &meta) |
| 344 | if err != nil { |
| 345 | fmt.Println("failed to unmarshal metadata:", err) |
| 346 | return |
| 347 | } |
| 348 | |
| 349 | if meta.Type == RtcMetadataTypeFileAck { |
| 350 | close(s.WaitTransferDone) |
| 351 | return |
| 352 | } |
| 353 | return |
| 354 | } |
| 355 | }) |
| 356 | |
| 357 | answer, err := s.RtcConn.CreateOffer(nil) |
| 358 | if err != nil { |
| 359 | fmt.Println("failed to create answer:", err) |
| 360 | } |
| 361 | |
| 362 | err = s.RtcConn.SetLocalDescription(answer) |
| 363 | if err != nil { |
| 364 | fmt.Println("failed to set local description:", err) |
| 365 | } |
| 366 | |
| 367 | s.offer = answer |
| 368 | } |
no test coverage detected