Events the client attaches to eagerly, at construction.
Eager attachment is load-bearing, not laziness: the viewer only provisions
its picking pipeline if a selection / element-* listener exists at
dataset-load time (core/app.ts, hasSelectionConsumer). A client that
waited for a subscribe call would leave those three events silently dead
forever, with no error to explain it. So the client listens to everything
from the start and subscribe / unsubscribe only gate forwarding.
The cost is that picking runs for any scene loaded with ?control present.
That is opt-in by construction — no ?control, no client, no cost.
Events the client attaches to eagerly, at construction.
Eager attachment is load-bearing, not laziness: the viewer only provisions its picking pipeline if a
selection/element-*listener exists at dataset-load time (core/app.ts,hasSelectionConsumer). A client that waited for asubscribecall would leave those three events silently dead forever, with no error to explain it. So the client listens to everything from the start andsubscribe/unsubscribeonly gate forwarding.The cost is that picking runs for any scene loaded with
?controlpresent. That is opt-in by construction — no?control, no client, no cost.