script-transform-sendKeyFrameRequest.js (2413B)
1 onrtctransform = event => { 2 const transformer = event.transformer; 3 let gotFrame; 4 5 transformer.options.port.onmessage = event => { 6 const {method} = event.data; 7 if (method == 'sendKeyFrameRequest') { 8 sendKeyFrameRequest(); 9 } else if (method == 'sendKeyFrameRequestDoesNotThrow') { 10 sendKeyFrameRequestDoesNotThrow(); 11 } else if (method == 'waitForFrame') { 12 waitForFrame(); 13 } 14 } 15 16 async function rejectInMs(timeout) { 17 return new Promise((_, reject) => { 18 const rejectWithTimeout = () => { 19 reject(new DOMException(`Timed out after waiting for ${timeout} ms`, 20 'TimeoutError')); 21 }; 22 setTimeout(rejectWithTimeout, timeout); 23 }); 24 } 25 26 async function resolveInMs(timeout) { 27 return new Promise((resolve) => { 28 setTimeout(resolve, timeout); 29 }); 30 } 31 32 async function sendKeyFrameRequest() { 33 try { 34 await Promise.race([transformer.sendKeyFrameRequest(), rejectInMs(8000)]);; 35 transformer.options.port.postMessage('success'); 36 } catch (e) { 37 // TODO: This does not work if we send e.name, why? 38 transformer.options.port.postMessage(`failure: ${e.name}`); 39 } 40 } 41 42 async function sendKeyFrameRequestDoesNotThrow() { 43 try { 44 await Promise.race([transformer.sendKeyFrameRequest(), resolveInMs(50)]);; 45 transformer.options.port.postMessage('success'); 46 } catch (e) { 47 // TODO: This does not work if we send e.name, why? 48 transformer.options.port.postMessage(`failure: ${e.name}`); 49 } 50 } 51 52 async function waitForFrame() { 53 try { 54 await Promise.race([new Promise(r => gotFrameCallback = r), rejectInMs(8000)]); 55 transformer.options.port.postMessage('got frame'); 56 } catch (e) { 57 // TODO: This does not work if we send e.name, why? 58 transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`}); 59 } 60 } 61 62 transformer.options.port.postMessage('started'); 63 transformer.reader = transformer.readable.getReader(); 64 transformer.writer = transformer.writable.getWriter(); 65 66 function process(transformer) 67 { 68 transformer.reader.read().then(chunk => { 69 if (chunk.done) 70 return; 71 if (gotFrameCallback) { 72 gotFrameCallback(); 73 } 74 transformer.writer.write(chunk.value); 75 process(transformer); 76 }); 77 } 78 79 process(transformer); 80 }; 81 self.postMessage('registered');