script-metadata-transform-worker.js (1477B)
1 onrtctransform = (event) => { 2 const transformer = event.transformer; 3 4 transformer.reader = transformer.readable.getReader(); 5 transformer.writer = transformer.writable.getWriter(); 6 7 async function waitForDetachAndPostMetadata(frame) { 8 while (true) { 9 if (frame.data.byteLength == 0) { 10 // frame.data has been detached! Verify metadata is still there. 11 self.postMessage({ 12 name: `${transformer.options.name} after write`, 13 timestamp: frame.timestamp, type: frame.type, 14 metadata: frame.getMetadata() 15 }); 16 return; 17 } 18 await new Promise(r => setTimeout(r, 100)); 19 } 20 } 21 22 let isFirstFrame = true; 23 function process(transformer) 24 { 25 transformer.reader.read().then(chunk => { 26 if (chunk.done) 27 return; 28 29 if (isFirstFrame) { 30 isFirstFrame = false; 31 self.postMessage({ 32 name: transformer.options.name, 33 timestamp: chunk.value.timestamp, 34 type: chunk.value.type, 35 metadata: chunk.value.getMetadata() 36 }); 37 waitForDetachAndPostMetadata(chunk.value); 38 } 39 transformer.writer.write(chunk.value); 40 process(transformer); 41 }); 42 } 43 process(transformer); 44 }; 45 self.postMessage("registered");