Skip to content
This repository was archived by the owner on Jun 19, 2023. It is now read-only.

Commit 16e8503

Browse files
authored
fix: added peer connection state listener to emit closed events (#134)
* fix: added peer connection state listener to emit closed events * fix: updated listening event name for disconnect/closed events (#138) * fix: removed listener once connection is closed (#138) * fix: removed listener once connection is closed (#138)
1 parent d6e5784 commit 16e8503

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

src/maconn.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ export class WebRTCMultiaddrConnection implements MultiaddrConnection {
6161
log.error('error closing connection', err)
6262
}
6363

64-
this.timeline.close = new Date().getTime()
64+
log.trace('closing connection')
65+
66+
this.timeline.close = Date.now()
6567
this.peerConnection.close()
6668
}
6769
}

src/peer_transport/transport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export class WebRTCTransport implements Transport, Startable {
131131
const result = await options.upgrader.upgradeOutbound(
132132
new WebRTCMultiaddrConnection({
133133
peerConnection: pc,
134-
timeline: { open: (new Date()).getTime() },
134+
timeline: { open: Date.now() },
135135
remoteAddr: webrtcMultiaddr
136136
}),
137137
{

src/peer_transport/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as pb from './pb/index.js'
44
import { detect } from 'detect-browser'
55

66
const browser = detect()
7-
const isFirefox = ((browser != null) && browser.name === 'firefox')
7+
export const isFirefox = ((browser != null) && browser.name === 'firefox')
88

99
interface MessageStream {
1010
read: () => Promise<pb.Message>

src/transport.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import * as sdp from './sdp.js'
1616
import { WebRTCStream } from './stream.js'
1717
import { genUfrag } from './util.js'
1818
import { protocols } from '@multiformats/multiaddr'
19+
import { isFirefox } from './peer_transport/util.js'
1920

2021
const log = logger('libp2p:webrtc:transport')
2122

@@ -97,6 +98,9 @@ export class WebRTCDirectTransport implements Transport {
9798
* Connect to a peer using a multiaddr
9899
*/
99100
async _connect (ma: Multiaddr, options: WebRTCDialOptions): Promise<Connection> {
101+
const controller = new AbortController()
102+
const signal = controller.signal
103+
100104
const remotePeerString = ma.getPeerId()
101105
if (remotePeerString === null) {
102106
throw inappropriateMultiaddr("we need to have the remote's PeerId")
@@ -183,13 +187,32 @@ export class WebRTCDirectTransport implements Transport {
183187
}
184188
}
185189

190+
const eventListeningName = isFirefox ? 'iceconnectionstatechange' : 'connectionstatechange'
191+
192+
peerConnection.addEventListener(eventListeningName, () => {
193+
switch (peerConnection.connectionState) {
194+
case 'failed':
195+
case 'disconnected':
196+
case 'closed':
197+
maConn.close().catch((err) => {
198+
log.error('error closing connection', err)
199+
}).finally(() => {
200+
// Remove the event listener once the connection is closed
201+
controller.abort()
202+
})
203+
break
204+
default:
205+
break
206+
}
207+
}, { signal })
208+
186209
// Creating the connection before completion of the noise
187210
// handshake ensures that the stream opening callback is set up
188211
const maConn = new WebRTCMultiaddrConnection({
189212
peerConnection,
190213
remoteAddr: ma,
191214
timeline: {
192-
open: (new Date()).getTime()
215+
open: Date.now()
193216
}
194217
})
195218

0 commit comments

Comments
 (0)