routines.js (3261B)
1 async function getNextMessage(portOrWorker) { 2 return new Promise(resolve => { 3 const resolveWithData = event => resolve(event.data); 4 const rejectWithData = event => reject(event.data); 5 portOrWorker.addEventListener('message', resolveWithData, {once: true}); 6 portOrWorker.addEventListener('messageerror', rejectWithData, {once: true}); 7 }); 8 } 9 10 11 async function postMethod(port, method, options) { 12 port.postMessage(Object.assign({method}, options)); 13 return await getNextMessage(port); 14 } 15 16 async function createWorker(script) { 17 const worker = new Worker(script); 18 const data = await getNextMessage(worker); 19 assert_equals(data, "registered"); 20 return worker; 21 } 22 23 async function createTransform(worker) { 24 const channel = new MessageChannel; 25 const transform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: channel.port2}, [channel.port2]); 26 transform.port = channel.port1; 27 channel.port1.start(); 28 assert_equals(await getNextMessage(channel.port1), "started"); 29 return transform; 30 } 31 32 async function createTransforms(script) { 33 const worker = await createWorker(script) 34 return Promise.all([createTransform(worker), createTransform(worker)]); 35 } 36 37 async function createConnectionWithTransform(test, script, gumOptions) { 38 const [senderTransform, receiverTransform] = await createTransforms(script); 39 40 const localStream = await navigator.mediaDevices.getUserMedia(gumOptions); 41 42 let senderPc, receiverPc, sender, receiver; 43 44 await createConnections(test, (firstConnection) => { 45 senderPc = firstConnection; 46 sender = firstConnection.addTrack(localStream.getTracks()[0], localStream); 47 sender.transform = senderTransform; 48 }, (secondConnection) => { 49 receiverPc = secondConnection; 50 secondConnection.ontrack = (trackEvent) => { 51 receiver = trackEvent.receiver; 52 receiver.transform = receiverTransform; 53 }; 54 }); 55 56 assert_true(!!sender, "sender should be set"); 57 assert_true(!!receiver, "receiver should be set"); 58 59 return {sender, receiver, senderPc, receiverPc}; 60 } 61 62 async function createConnections(test, setupLocalConnection, setupRemoteConnection, doNotCloseAutmoatically) { 63 const localConnection = new RTCPeerConnection(); 64 const remoteConnection = new RTCPeerConnection(); 65 66 remoteConnection.onicecandidate = (event) => { localConnection.addIceCandidate(event.candidate); }; 67 localConnection.onicecandidate = (event) => { remoteConnection.addIceCandidate(event.candidate); }; 68 69 await setupLocalConnection(localConnection); 70 await setupRemoteConnection(remoteConnection); 71 72 const offer = await localConnection.createOffer(); 73 await localConnection.setLocalDescription(offer); 74 await remoteConnection.setRemoteDescription(offer); 75 76 const answer = await remoteConnection.createAnswer(); 77 await remoteConnection.setLocalDescription(answer); 78 await localConnection.setRemoteDescription(answer); 79 80 if (!doNotCloseAutmoatically) { 81 test.add_cleanup(() => { 82 localConnection.close(); 83 remoteConnection.close(); 84 }); 85 } 86 87 return [localConnection, remoteConnection]; 88 } 89 90 function waitFor(test, duration) 91 { 92 return new Promise((resolve) => test.step_timeout(resolve, duration)); 93 }