chat.html: share-link + QR for SDP exchange (near-automated handshake)

manual copy-paste of raw SDP was v1. this adds:

1. share-link encoding: SDP description → JSON → deflate-raw (native
   CompressionStream) → base64url → URL hash. typical 2 KB SDP fits
   in ~700 chars after compression. fits in any text channel.
   URL format:  .../zebra-report/#o=<deflated-base64>    (offer)
                .../zebra-report/#a=<deflated-base64>    (answer)

2. QR rendering: same URL rendered as 180x180 QR using inlined
   davidshimjs qrcodejs (MIT, 28 KB). offers a visual scan path
   (phone scanners) without an in-browser decoder library yet.

3. auto-fill on link open: page reads location.hash on load.
     #o=... → autofills remote-offer textarea, prompts user to
              complete identity + audio + click "create answer"
     #a=... → autofills remote-answer textarea, prompts "accept"
   hash is cleared from address bar after parse so a reload doesn't
   double-trigger.

4. parsers tolerate either input form: full URL with #o=/#a= hash,
   or raw JSON SDP. peer A can paste back a URL or a textarea dump,
   same handler.

5. tucked the raw SDP textareas behind a "show raw SDP" toggle so
   the default UI is just the URL + QR. expert users still get the
   raw bytes when needed.

UX flow (cross-internet, two peers):
  A: enter room → start audio → "create offer" → "copy link"
     → send link to B via Signal/SMS/anywhere
  B: open link → page auto-fills offer → enter room → start audio
     → "create answer" → "copy link" → send back to A
  A: paste link into the answer textarea → "accept answer"
  → SRTP candidates pair → chat begins.

deferred: in-browser camera scanning of QR (needs jsQR or similar
~60 KB inlined; not on disk currently). v3.

file: 1509 lines, ~85 KB. JS syntax-clean (qrcode lib + main IIFE),
HTML balanced. CompressionStream + DecompressionStream available
in all current browsers (Chrome 80+, Firefox 113+, Safari 16.4+).
This commit is contained in:
Russell Ballestrini 2026-05-27 18:37:18 -04:00
parent 0ff2c788d6
commit 9e67b05f2f

File diff suppressed because one or more lines are too long