ReadonlycanvasThe canvas to hand captureStream() — NOT the WebGL canvas.
Private ReadonlyctxPrivateunsubscribePrivateloggedLatched so a per-frame failure logs once instead of every frame.
Private ReadonlyglPrivate ReadonlyoverlaySubscribe to the post-render hook. Idempotent — a second call while already attached is a no-op rather than a duplicate blit per frame.
Unsubscribe. Idempotent, and safe to call from a dispose path.
PrivatecompositeBlit the GL canvas and draw the overlays over it.
Arrow-bound so eventBus.on/the matching unsubscribe see one stable
reference (the bind-a-new-function listener-leak trap).
Mirror canvas + per-frame compositing subscription. Construct via createLiveOverlayCompositor, which returns
nullwhen there is nothing to composite.