Skip to content

Commit 3f08426

Browse files
committed
feat: add support for calling start() again if state is only have-local-offer
1 parent fb7b66c commit 3f08426

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

src/peer.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
setTracksEnabled,
1111
} from './utils';
1212

13+
const POLITE_DEFAULT_VALUE = true;
14+
1315
export default class Peer {
1416
private peerConn: RTCPeerConnection;
1517

@@ -19,7 +21,7 @@ export default class Peer {
1921

2022
private readonly emitter = new EventEmitter() as TypedEmitter<PeerEvents>;
2123

22-
private polite = true;
24+
private polite = POLITE_DEFAULT_VALUE;
2325

2426
private makingOffer = false;
2527

@@ -165,8 +167,12 @@ export default class Peer {
165167
return this.peerConn;
166168
}
167169

168-
public start({ polite = false }: { polite?: boolean } = {}) {
170+
public start({ polite = POLITE_DEFAULT_VALUE }: { polite?: boolean } = {}) {
169171
try {
172+
// reset peer if only local offer is set
173+
if (this.peerConn?.signalingState === 'have-local-offer') {
174+
this.destroy();
175+
}
170176
if (this.isClosed()) {
171177
this.init();
172178
}
@@ -209,7 +215,7 @@ export default class Peer {
209215
this.emit('signal', this.peerConn.localDescription);
210216
}
211217
}
212-
this.polite = true;
218+
this.polite = POLITE_DEFAULT_VALUE;
213219
} catch (err) {
214220
this.error('Failed to set local/remote descriptions', err);
215221
}
@@ -282,7 +288,7 @@ export default class Peer {
282288
/** Closes any active peer connection */
283289
public destroy() {
284290
if (!this.isClosed()) {
285-
this.polite = true;
291+
this.polite = POLITE_DEFAULT_VALUE;
286292
this.makingOffer = false;
287293
this.ignoreOffer = false;
288294
this.peerConn.close();

test/peer.spec.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,29 @@ test('should set the local stream and be active', async ({ page }) => {
7070
expect(isStreamLocalActive).toEqual(true);
7171
});
7272

73+
test('should start peer if called twice afters listeners added', async ({ page }) => {
74+
await page.evaluate(
75+
() =>
76+
new Promise<void>(async (resolve) => {
77+
const peer1 = getPeer({ name: 'peer1' });
78+
const peer2 = getPeer({ name: 'peer2' });
79+
80+
peer1.start();
81+
peer2.start({ polite: false });
82+
83+
const stream = await window.Peer.getUserMedia();
84+
85+
peer1.on('connected', () => {
86+
resolve();
87+
});
88+
89+
setupPeers(peer1, peer2, stream);
90+
peer1.start();
91+
peer2.start({ polite: false });
92+
})
93+
);
94+
});
95+
7396
test('should remove tracks from local stream peer', async ({ page }) => {
7497
const isNoTracks = await page.evaluate(async () => {
7598
const stream = await window.Peer.getUserMedia();
@@ -274,7 +297,7 @@ test('should connect two peers that make an offer simultaneously when one is pol
274297
});
275298

276299
setupPeers(peer1, peer2, stream);
277-
peer1.start({ polite: true });
300+
peer1.start({ polite: false });
278301
peer2.start();
279302
})
280303
);

0 commit comments

Comments
 (0)