One socket, two objects
A request object and a response object are built the same way: a stream base, an HTTP layer that adds protocol semantics, and a framework layer that adds conveniences. Both are assembled by rewriting one object's prototype chain, not by wrapping it. Every section below shows the same structure on whichever side you pick. The last section is where the symmetry breaks.
Coloured terms open an explanation. Boxes in every diagram open a detailed panel.
The chain
Every member you use lives on one of these objects. The instance holds almost nothing of its own, so each property access walks upward until it finds a declaring class.
Click a link in the chain to change the panel.
What each layer declares
The full public surface, grouped by the class that declares it. Colour is the declaring layer, so a name's colour tells you how far up the chain the lookup travels.
Click any name for its one-line meaning. Names ending in () are methods.
Declared shapes
The same members again, as declarations with types and return types. The unions carry most of the meaning, so they are annotated beside the lines they sit on.
One message, traced
Seven moments in the life of a single message, with the state at each one.
The irreversible step
Each side has exactly one action that cannot be undone, and most of the confusing errors on that side trace back to it.
Where the two diverge
Same assembly, six points of asymmetry. This section does not follow the toggle.