in src/index.js [71:108]
static _makePairingChannel(wsUri, ConnectionClass, psk) {
const socket = new WebSocket(wsUri);
return new Promise((resolve, reject) => {
// eslint-disable-next-line prefer-const
let stopListening;
const onConnectionError = async () => {
stopListening();
reject(new Error('Error while creating the pairing channel'));
};
const onFirstMessage = async event => {
stopListening();
try {
// The channelserver echos back the channel id, and we use it as an
// additional input to the TLS handshake via the "psk id" field.
const {channelid: channelId} = JSON.parse(event.data);
const pskId = utf8ToBytes(channelId);
const connection = await ConnectionClass.create(psk, pskId, data => {
// Send data by forwarding it via the channelserver websocket.
// The TLS connection gives us `data` as raw bytes, but channelserver
// expects b64urlsafe strings, because it wraps them in a JSON object envelope.
socket.send(bytesToBase64url(data));
});
const instance = new this(channelId, psk, socket, connection);
resolve(instance);
} catch (err) {
reject(err);
}
};
stopListening = () => {
socket.removeEventListener('close', onConnectionError);
socket.removeEventListener('error', onConnectionError);
socket.removeEventListener('message', onFirstMessage);
};
socket.addEventListener('close', onConnectionError);
socket.addEventListener('error', onConnectionError);
socket.addEventListener('message', onFirstMessage);
});
}