WebRTC IP vs header IP
A build of the pixel that keeps the production fire semantics — immediate fire on execution, SPA refire on history changes, bfcache refire — but replaces the payload. It never calls the wire API. Each fire asks the same question two ways: what IP does STUN report, and what IP does the HTTPS request itself carry? The second is what the collector resolves households from today.
/wire or /wire/img request is made, and nothing is recorded server-side. All results stay in this tab.RTCPeerConnection with a data channel, gathering ICE candidates against three public STUN servers. No getUserMedia, no permission prompt.
Plain CORS fetches. Each endpoint echoes the source IP of the request it received — the same value the wire collector reads off the socket for a pixel fire.
| waiting for first fire… |
ICE candidates (0)
| Address | Type | Family | Proto | Note | t |
|---|---|---|---|---|---|
| No candidates gathered yet. | |||||
What changed vs the production pixel
function firePixel() {
- new Image().src = ENDPOINT
- + '?token=' + TOKEN
- + '&u=' + encodeURIComponent(location.href)
- + '&t=' + (Date.now() + '_' + performance.now().toFixed(3));
+ probeWebrtc(run); // RTCPeerConnection -> ICE candidates -> srflx IP
+ probeHeaders(run); // CORS fetch -> source IP of the HTTPS request
}Full source: /wire-ip-probe.js. The SPA hooks, debounce and bfcache handler below firePixel() are unchanged from what staging serves for /wire.js.