Create an answer

After receiving an offer, the call recipient creates an answer and stores it inside a structured data with an ID based on the random ID provided by the caller. This answer includes a session description in SDP format, and it needs to be delivered to the caller (the person initiating the call).

Contents

Create a new WebRTC peer connection

The app creates a new RTCPeerConnection using the simple-peer module. If you are joining a room where another user is waiting for you, props.peerPayload contains the offer of that user and therefore the value of initiator will be false. This means that the app will create an answer.

PeerView.js

const initiator = !props.peerPayload
const peer = new Peer({ initiator: initiator,
                      stream: props.stream,
                      config : {
                        iceServers: CONFIG.iceServers
                      },
                      trickle: false })

PeerView.js

if (!initiator) {
  // let's connect to the other peer
  peer.signal(props.peerPayload.payload)
}

For now, only the connection establishment is done using the SAFE Network. The actual connection is either peer-to-peer (STUN) or via a TURN server. At some point later, we will integrate this functionality directly in CRUST.

Store the answer inside a structured data

After the answer is created, the signal event is fired.

PeerView.js

peer.on('signal', (d) => {
  // try to automatically establish connection
  publishData(targetId, {payload: d, targetId: myNewId})
    .catch(console.log.bind(console))

  if (initiator) {
    let poller = window.setInterval(() => {
      readData(myNewId).then((data) => {
        window.clearInterval(poller)
        peer.signal(data.payload)
      })
    }, 2000) // we poll once every 2 seconds
  }
})

The app creates a structured data with an ID based on the random ID provided by the caller.

PeerView.js

const targetId = initiator ? props.room : props.peerPayload.targetId
const myNewId = this.props.room + '-' + (Math.random())

Create a structured data

The app creates a structured data handle for the answer.

POST /structured-data

store.js

safeStructuredData.create(ACCESS_TOKEN, address, 500, data)

The address of the structured data is based on the app ID (example.signaling.v1) and the random ID provided by the caller. The structured data is unversioned (type 500). The data is stored as a base64 string.

store.js

const address = btoa(`${APP_ID}-${name}`)
const data = new Buffer(JSON.stringify(payload)).toString('base64')

Save the structured data

The app saves the structured data by sending a PUT request to the SAFE Network.

PUT /structured-data/:handleId

store.js

safeStructuredData.put(ACCESS_TOKEN, handleId)

Last updated

Was this helpful?