Create an offer
If you are the first user to join a room (the person initiating the call), the app creates an offer and tries to store it inside a structured data with an ID based on the name of the room. This offer includes a session description in SDP format, and it needs to be delivered to the call recipient (the person receiving the call).
Contents
Create a new WebRTC peer connection
The app creates a new RTCPeerConnection using the simple-peer module. If you are the first user to join this room, props.peerPayload
is false
and therefore the value of initiator
will be true
. This means that the app will create an offer.
PeerView.js
const initiator = !props.peerPayload
const peer = new Peer({ initiator: initiator,
stream: props.stream,
config : {
iceServers: CONFIG.iceServers
},
trickle: false })
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 offer inside a structured data
After the offer 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 tries to create a structured data with an ID based on the name of the room. This structured data will contain the offer as well as a random ID, which will be used to store the answer of the call recipient.
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 offer.
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 name of the room. 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?