onrtctransform = (event) => { const transformer = event.transformer; transformer.reader = transformer.readable.getReader(); transformer.writer = transformer.writable.getWriter(); async function waitForDetachAndPostMetadata(frame) { while (true) { if (frame.data.byteLength == 0) { // frame.data has been detached! Verify metadata is still there. self.postMessage({ name: `${transformer.options.name} after write`, timestamp: frame.timestamp, type: frame.type, metadata: frame.getMetadata() }); return; } await new Promise(r => setTimeout(r, 100)); } } let isFirstFrame = true; function process(transformer) { transformer.reader.read().then(chunk => { if (chunk.done) return; if (isFirstFrame) { isFirstFrame = false; self.postMessage({ name: transformer.options.name, timestamp: chunk.value.timestamp, type: chunk.value.type, metadata: chunk.value.getMetadata() }); waitForDetachAndPostMetadata(chunk.value); } transformer.writer.write(chunk.value); process(transformer); }); } process(transformer); }; self.postMessage("registered");