RTCDataChannel-helper.js (2679B)
1 async function negotiate(offerer, answerer) { 2 offerer.onicecandidate = e => answerer.addIceCandidate(e.candidate); 3 answerer.onicecandidate = e => offerer.addIceCandidate(e.candidate); 4 5 await offerer.setLocalDescription(); 6 await answerer.setRemoteDescription(offerer.localDescription); 7 await answerer.setLocalDescription(); 8 await offerer.setRemoteDescription(answerer.localDescription); 9 } 10 11 // Calling this will only work if the channel is brand new 12 async function maybeWrapChannel(channel, shim = null) { 13 if (shim) { 14 assert_true(shim instanceof WorkerBackedDataChannel); 15 await shim.init(channel); 16 channel = shim; 17 } 18 await new Promise(r => channel.addEventListener("open", r, {once: true})); 19 if (shim) { 20 await shim.updateState(); 21 } 22 return channel; 23 } 24 25 async function openChannelPair(pc1, pc2, label, config, workerShim1, workerShim2) { 26 const channelEvent = new Promise(r => { 27 pc2.addEventListener('datachannel', async ({channel}) => { 28 if (channel.label == label) { 29 channel = await maybeWrapChannel(channel, workerShim2); 30 r(channel); 31 } 32 }); 33 }); 34 35 return Promise.all([ 36 maybeWrapChannel(pc1.createDataChannel(label, config), workerShim1), 37 channelEvent 38 ]); 39 } 40 41 async function makeDataChannelTestFixture(label, config, workerShim1, workerShim2) { 42 const offerer = new RTCPeerConnection(); 43 const answerer = new RTCPeerConnection(); 44 const pairPromise = openChannelPair( 45 offerer, answerer, label, {}, workerShim1, workerShim2); 46 await negotiate(offerer, answerer); 47 const [offererChannel, answererChannel] = await pairPromise; 48 return {offerer, answerer, offererChannel, answererChannel}; 49 } 50 51 async function openChannelPairOffererShimmed() { 52 // Use worker shim in RTCDataChannel-worker-shim.js 53 const {offerer, answerer, offererChannel, answererChannel} = 54 await makeDataChannelTestFixture( 55 'foo', {}, new WorkerBackedDataChannel(), null); 56 57 return { 58 shimmedChannel: offererChannel, 59 nonShimmedChannel: answererChannel, 60 offerer, 61 answerer 62 }; 63 } 64 65 async function openChannelPairAnswererShimmed() { 66 // Use worker shim in RTCDataChannel-worker-shim.js 67 const {offerer, answerer, offererChannel, answererChannel} = 68 await makeDataChannelTestFixture( 69 'foo', {}, null, new WorkerBackedDataChannel()); 70 71 return { 72 shimmedChannel: answererChannel, 73 nonShimmedChannel: offererChannel, 74 offerer, 75 answerer 76 }; 77 } 78 79 async function openChannelPairWithShim(whichChannelShimmed) { 80 switch (whichChannelShimmed) { 81 case 'offerer': 82 return openChannelPairOffererShimmed(); 83 case 'answerer': 84 return openChannelPairAnswererShimmed(); 85 } 86 }