Skip to content

Latest commit

 

History

History
60 lines (48 loc) · 2.14 KB

3-Peer-to-Peer-Signaling.md

File metadata and controls

60 lines (48 loc) · 2.14 KB

Overview

Communicating across platforms in a decentralized manner

Decisions

  • Limit dependency on WebSockets to signaling
  • Allow bidirectional communication between peers
  • Enforce locality of device?

Implementation

A WebSocket Service should establish the SDP handshake and emit ICE candidates for WebRTC clients.

This implementation should replace Wallet Connect with the following sequence

sequenceDiagram
    participant Website
    participant Server
    participant Wallet
    Note over Website, Wallet: Link devices
    Website->>Server: GET Challenge Message
    Server->>Website: Send Challenge Message
    
    Website-->>Website: Display QR Connect Nonce
    Website->>Server: Subscribe to 'wss:link'
    Wallet->>Website: Scan QR Code
    Wallet->>Server: POST Nonce + Signature + Answer
    Server-->>Server: Validate Signature
    Server-->>Website: HTTPOnly Session
    Server->>Wallet: Ok Response + HTTPOnly Session
    Server->>Website: Emit to `wss:link` client
    Note over Website, Wallet: Passkeys/FIDO2
    Website-->>Website: Continue FIDO2 Flow
    Wallet-->>Wallet: Continue FIDO2 Flow
    Note over Website, Wallet: Signaling Peer Offer/Answer
    Website-->>Server: Subscribe to 'wss:answer-${address}'
    Wallet-->>Server: Subscribe to 'wss:offer-${address}'

    Website-->>Website: Create Peer Offer & DataChannel
    Website-->>Server: POST Offer
    Server-->>Wallet: Emit Offer
    
    Wallet-->>Wallet: Create Peer Answer with Offer & DataChannel
   
    Wallet-->>Server: POST Answer
    Server-->>Website: Emit Answer
    Website-->>Website: Set Remote SDP
    Website-->>Website: Discover ICE Candidates
    Website->>Server: Emit candidates to `wss:offer-${address}`
    Server->>Wallet: Emit candidates to `wss:offer-${address}`
    Wallet-->>Wallet: Set Candidates
    Wallet-->>Wallet: Discover ICE Candidates
    Wallet->>Server: Emit candidates to `wss:answer-${address}`
    Server->>Website: Emit to `wss:answer`
    Website->>Website: Set Candidates
    
Loading

*Note: This process may be deprecated in the future in favor of libp2p which allows for an agnostic discovery layer and also supports the WebRTC transport