File: webrtc.js

package info (click to toggle)
firefox-esr 140.5.0esr-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie-proposed-updates
  • size: 4,539,036 kB
  • sloc: cpp: 7,381,527; javascript: 6,388,905; ansic: 3,710,087; python: 1,393,776; xml: 628,165; asm: 426,918; java: 184,004; sh: 65,744; makefile: 19,302; objc: 13,059; perl: 12,912; yacc: 4,583; cs: 3,846; pascal: 3,352; lex: 1,720; ruby: 1,226; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (56 lines) | stat: -rw-r--r-- 1,974 bytes parent folder | download | duplicates (18)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

// Creates two RTCPeerConnection and tries to connect them. Returns
// "allowed" if the connection is permitted, "blocked" if it is
// blocked on both sides and "inconsistent" in the event that the
// result is not the same on both sides (should never happen).
async function tryConnect() {
    const pc1 = new RTCPeerConnection();
    const pc2 = new RTCPeerConnection();

    // Returns a promise which resolves to a boolean which is true
    // if and only if pc.iceConnectionState settles in the "failed"
    // state, and never transitions to any state other than "new"
    // or "failed."
    const pcFailed = (pc) => {
        return new Promise((resolve, _reject) => {
            pc.oniceconnectionstatechange = (e) => {
                resolve(pc.iceConnectionState == "failed");
            };
        });
    }
    pc1Failed = pcFailed(pc1);
    pc2Failed = pcFailed(pc2);

    // Creating a data channel is necessary to induce negotiation:
    const channel = pc1.createDataChannel('test');

    // Usual webrtc signaling dance:
    pc1.onicecandidate = ({candidate}) => pc2.addIceCandidate(candidate);
    pc2.onicecandidate = ({candidate}) => pc1.addIceCandidate(candidate);
    const offer = await pc1.createOffer();
    await pc1.setLocalDescription(offer);
    await pc2.setRemoteDescription(pc1.localDescription);
    const answer = await pc2.createAnswer();
    await pc2.setLocalDescription(answer);
    await pc1.setRemoteDescription(pc2.localDescription);

    const failed1 = await pc1Failed;
    const failed2 = await pc2Failed;
    if(failed1 && failed2) {
        return 'blocked';
    } else if(!failed1 && !failed2) {
        return 'allowed';
    } else {
        return 'inconsistent';
    }
}

async function expectAllow() {
    promise_test(async () => assert_equals(await tryConnect(), 'allowed'));
}

async function expectBlock() {
    promise_test(async () => assert_equals(await tryConnect(), 'blocked'));
}

// vim: set ts=4 sw=4 et :