(derpPub key.NodePublic, selfPriv key.NodePrivate, peerPub key.NodePublic, msg []byte)
| 378 | } |
| 379 | |
| 380 | func (r *Wasm) handleNextMessage(derpPub key.NodePublic, selfPriv key.NodePrivate, peerPub key.NodePublic, msg []byte) (resRaw []byte, nodeKey key.NodePublic, _ overlayMessage, _ error) { |
| 381 | cleartext, ok := selfPriv.OpenFrom(peerPub, msg) |
| 382 | if !ok { |
| 383 | return nil, key.NodePublic{}, overlayMessage{}, errors.New("message failed decryption") |
| 384 | } |
| 385 | |
| 386 | var ovMsg overlayMessage |
| 387 | fmt.Println(string(cleartext)) |
| 388 | err := json.Unmarshal(cleartext, &ovMsg) |
| 389 | if err != nil { |
| 390 | fmt.Printf("Unmarshal error: %#v\n", err) |
| 391 | panic("unmarshal node: " + err.Error()) |
| 392 | } |
| 393 | |
| 394 | res := overlayMessage{} |
| 395 | switch ovMsg.Typ { |
| 396 | case messageTypePing: |
| 397 | res.Typ = messageTypePong |
| 398 | case messageTypePong: |
| 399 | // do nothing |
| 400 | case messageTypeHello: |
| 401 | res.Typ = messageTypeHelloResponse |
| 402 | res.HostInfo.Username = r.username |
| 403 | res.HostInfo.Hostname = "wush.dev" |
| 404 | username := "unknown" |
| 405 | if u := ovMsg.HostInfo.Username; u != "" { |
| 406 | username = u |
| 407 | } |
| 408 | hostname := "unknown" |
| 409 | if h := ovMsg.HostInfo.Hostname; h != "" { |
| 410 | hostname = h |
| 411 | } |
| 412 | if node := r.lastNode.Load(); node != nil { |
| 413 | res.Node = *node |
| 414 | } |
| 415 | r.HumanLogf("%s Received connection request from %s", cliui.Timestamp(time.Now()), cliui.Keyword(fmt.Sprintf("%s@%s", username, hostname))) |
| 416 | // TODO: impl |
| 417 | r.onNewPeer.Invoke(map[string]any{ |
| 418 | "id": js.ValueOf(derpPub.String()), |
| 419 | "name": js.ValueOf("test"), |
| 420 | "ip": js.ValueOf("1.2.3.4"), |
| 421 | "cancel": js.FuncOf(func(this js.Value, args []js.Value) any { |
| 422 | return nil |
| 423 | }), |
| 424 | }) |
| 425 | |
| 426 | if ovMsg.WebrtcDescription != nil { |
| 427 | r.handleWebrtcOffer(derpPub, &res, *ovMsg.WebrtcDescription) |
| 428 | } |
| 429 | |
| 430 | case messageTypeHelloResponse: |
| 431 | if !ovMsg.Node.Key.IsZero() { |
| 432 | r.in <- &ovMsg.Node |
| 433 | } |
| 434 | |
| 435 | if ovMsg.WebrtcDescription != nil { |
| 436 | r.onWebrtcAnswer.Invoke(js.ValueOf(derpPub.String()), map[string]any{ |
| 437 | "type": js.ValueOf(ovMsg.WebrtcDescription.Type.String()), |
no test coverage detected