| 'use strict'; |
| |
| // This file depends on RTCIceTransport-extension-helper.js which should be |
| // loaded from the main HTML file. |
| // The following helper functions are called from |
| // RTCIceTransport-extension-helper.js: |
| // makeIceTransport |
| // makeGatherAndStartTwoIceTransports |
| |
| // Return a promise to generate an RTCCertificate with the given keygen |
| // algorithm or a default one if none provided. |
| function generateCertificate(keygenAlgorithm) { |
| return RTCPeerConnection.generateCertificate({ |
| name: 'ECDSA', |
| namedCurve: 'P-256', |
| ...keygenAlgorithm, |
| }); |
| } |
| |
| // Construct an RTCQuicTransport instance with the given RTCIceTransport |
| // instance and the given certificates. The RTCQuicTransport instance will be |
| // automatically cleaned up when the test finishes. |
| function makeQuicTransport(t, iceTransport, certificates) { |
| const quicTransport = new RTCQuicTransport(iceTransport, certificates); |
| t.add_cleanup(() => quicTransport.stop()); |
| return quicTransport; |
| } |
| |
| // Construct an RTCQuicTransport instance with a new RTCIceTransport instance |
| // and a single, newly-generated certificate. The RTCQuicTransport and |
| // RTCIceTransport instances will be automatically cleaned up when the test |
| // finishes. |
| async function makeStandaloneQuicTransport(t) { |
| const certificate = await generateCertificate(); |
| return makeQuicTransport(t, makeIceTransport(t), [ certificate ]); |
| } |
| |
| // Construct two RTCQuicTransport instances and each call start() with the other |
| // transport's local parameters. |
| // Returns a 2-list: |
| // [ server RTCQuicTransport, |
| // client RTCQuicTransport ] |
| async function makeAndStartTwoQuicTransports(t) { |
| const [ localCertificate, remoteCertificate ] = |
| await Promise.all([ generateCertificate(), generateCertificate() ]); |
| const [ localIceTransport, remoteIceTransport ] = |
| makeGatherAndStartTwoIceTransports(t); |
| const localQuicTransport = |
| makeQuicTransport(t, localIceTransport, [ localCertificate ]); |
| const remoteQuicTransport = |
| makeQuicTransport(t, remoteIceTransport, [ remoteCertificate ]); |
| localQuicTransport.start(remoteQuicTransport.getLocalParameters()); |
| remoteQuicTransport.start(localQuicTransport.getLocalParameters()); |
| return [ localQuicTransport, remoteQuicTransport ]; |
| } |
| |
| // Construct two RTCQuicTransport instances and wait for them to connect. |
| // Returns a 2-list: |
| // [ server RTCQuicTransport, |
| // client RTCQuicTransport ] |
| async function makeTwoConnectedQuicTransports(t) { |
| // Returns a promise that resolves when the transport fires a 'statechange' |
| // event to 'connected'. |
| function waitForConnected(transport) { |
| return new Promise((resolve, reject) => { |
| const eventHandler = t.step_func(() => { |
| assert_equals(transport.state, 'connected'); |
| transport.removeEventListener('statechange', eventHandler, false); |
| resolve(); |
| }); |
| transport.addEventListener('statechange', eventHandler, false); |
| }); |
| } |
| const [ localQuicTransport, remoteQuicTransport ] = |
| await makeAndStartTwoQuicTransports(t); |
| await Promise.all([ |
| waitForConnected(localQuicTransport), |
| waitForConnected(remoteQuicTransport), |
| ]); |
| return [ localQuicTransport, remoteQuicTransport ]; |
| } |
| |