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?