Skip to content

Commit d105061

Browse files
authored
fix: WebRTC uncaught promise rejection on incoming connection (#2302)
We catch WebRTC errors, log them and throw normalised errors to ensure they are the same across WebRTC stacks (FF, Chrome, node). #2299 made one of these operations async which would cause an UHPR if thrown.
1 parent 64a915a commit d105061

File tree

3 files changed

+7
-18
lines changed

3 files changed

+7
-18
lines changed

packages/transport-webrtc/src/private-to-private/initiate-connection.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ export async function initiateConnection ({ peerConnection, signal, metrics, mul
9696
}
9797

9898
// create an offer
99-
const offerSdp = await peerConnection.createOffer()
99+
const offerSdp = await peerConnection.createOffer().catch(err => {
100+
log.error('could not execute createOffer', err)
101+
throw new CodeError('Failed to set createOffer', 'ERR_SDP_HANDSHAKE_FAILED')
102+
})
100103

101104
log.trace('initiator send SDP offer %s', offerSdp.sdp)
102105

@@ -117,7 +120,7 @@ export async function initiateConnection ({ peerConnection, signal, metrics, mul
117120
})
118121

119122
if (answerMessage.type !== Message.Type.SDP_ANSWER) {
120-
throw new CodeError('remote should send an SDP answer', 'ERR_SDP_HANDSHAKE_FAILED')
123+
throw new CodeError('Remote should send an SDP answer', 'ERR_SDP_HANDSHAKE_FAILED')
121124
}
122125

123126
log.trace('initiator receive SDP answer %s', answerMessage.data)

packages/transport-webrtc/src/private-to-private/signaling-stream-handler.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { CodeError } from '@libp2p/interface'
22
import { multiaddr, type Multiaddr } from '@multiformats/multiaddr'
33
import { pbStream } from 'it-protobuf-stream'
4-
import pDefer, { type DeferredPromise } from 'p-defer'
54
import { type RTCPeerConnection, RTCSessionDescription } from '../webrtc/index.js'
65
import { Message } from './pb/message.js'
76
import { readCandidatesUntilConnected } from './util.js'
@@ -20,8 +19,6 @@ export async function handleIncomingStream ({ peerConnection, stream, signal, co
2019
const messageStream = pbStream(stream).pb(Message)
2120

2221
try {
23-
const answerSentPromise: DeferredPromise<void> = pDefer()
24-
2522
// candidate callbacks
2623
peerConnection.onicecandidate = ({ candidate }) => {
2724
// a null candidate means end-of-candidates, an empty string candidate
@@ -67,7 +64,6 @@ export async function handleIncomingStream ({ peerConnection, stream, signal, co
6764
// create and write an SDP answer
6865
const answer = await peerConnection.createAnswer().catch(err => {
6966
log.error('could not execute createAnswer', err)
70-
answerSentPromise.reject(err)
7167
throw new CodeError('Failed to create answer', 'ERR_SDP_HANDSHAKE_FAILED')
7268
})
7369

@@ -78,16 +74,11 @@ export async function handleIncomingStream ({ peerConnection, stream, signal, co
7874
signal
7975
})
8076

81-
peerConnection.setLocalDescription(answer).then(() => {
82-
answerSentPromise.resolve()
83-
}, err => {
77+
await peerConnection.setLocalDescription(answer).catch(err => {
8478
log.error('could not execute setLocalDescription', err)
85-
answerSentPromise.reject(err)
8679
throw new CodeError('Failed to set localDescription', 'ERR_SDP_HANDSHAKE_FAILED')
8780
})
8881

89-
await answerSentPromise.promise
90-
9182
log.trace('recipient read candidates until connected')
9283

9384
// wait until candidates are connected
@@ -96,11 +87,6 @@ export async function handleIncomingStream ({ peerConnection, stream, signal, co
9687
signal,
9788
log
9889
})
99-
100-
log.trace('recipient connected, closing signaling stream')
101-
await messageStream.unwrap().unwrap().close({
102-
signal
103-
})
10490
} catch (err: any) {
10591
if (peerConnection.connectionState !== 'connected') {
10692
log.error('error while handling signaling stream from peer %a', connection.remoteAddr, err)

packages/transport-webrtc/test/peer.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ describe('webrtc dialer', () => {
214214
const answer = await pc.createAnswer()
215215
await pc.setLocalDescription(answer)
216216

217-
await expect(initiatorPeerConnectionPromise).to.be.rejectedWith(/remote should send an SDP answer/)
217+
await expect(initiatorPeerConnectionPromise).to.be.rejectedWith(/Remote should send an SDP answer/)
218218

219219
pc.close()
220220
})

0 commit comments

Comments
 (0)