웹트랜스포트 데이터그램

WebTransport datagrams

순서 보장과 재전송보다 최신 위치 같은 상태를 빠르게 전달하는 방식을 고릅니다.

···
html
<div class="n-demo"><div class="n-head"><strong>LATEST STATE WINS</strong><span>LIVE TRACE</span></div><div class="n-stage"><div class="dg"><div class="dg-packets"><span id="dg0">1 ✓</span><span id="dg1">2 ×</span><span id="dg2">3 ✓</span></div><div class="dg-track"><i id="dg-dot"></i></div><div id="dg-label">position 1 applied</div></div></div><div class="n-foot">tap to step · auto replay</div></div>
css
.n-demo{width:min(94vw,760px);height:min(88vh,324px);padding:clamp(9px,2.2vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(5px,1.3vmin,10px);font:600 clamp(12px,2.4vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;overflow:hidden}.n-head,.n-foot{display:flex;justify-content:space-between;align-items:center;color:var(--muted)}.n-head strong{color:var(--accent)}.n-head span,.n-foot{font-size:12px}.n-stage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(4px,1vmin,10px)}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.n-box{padding:clamp(5px,1.5vmin,11px);border:1px solid var(--line);border-radius:8px;background:var(--bg);text-align:center}.n-on{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.n-muted{color:var(--muted)}@media(max-width:400px){.n-head span{display:none}}.dg{width:93%;display:grid;gap:14px}.dg-packets{display:flex;justify-content:space-between}.dg-packets span{border:1px solid var(--line);border-radius:6px;padding:5px 8px}.dg-track{height:18px;border-radius:9px;background:var(--bg);position:relative}.dg-track i{position:absolute;top:-6px;left:10%;height:30px;width:30px;border-radius:50%;background:var(--accent);transition:left .55s}.dg #dg-label{text-align:center;color:var(--muted)}
js
let step=1;function advance(){const positions=['10%','10%','78%'];for(let i=0;i<3;i++)document.getElementById('dg'+i).classList.toggle('n-on',i===step&&i!==1);document.getElementById('dg1').style.color=step===1?'var(--accent-3)':'var(--muted)';document.getElementById('dg-dot').style.left=positions[step];document.getElementById('dg-label').textContent=['position 1 applied','position 2 lost','position 3 applied now'][step];step=(step+1)%3}
const clickTarget=document.querySelector('.n-demo');if(clickTarget&&typeof advance==='function'){advance();const timer=setInterval(advance,1050);clickTarget.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})}

WebTransport 데이터그램은 신뢰성 없는 작은 메시지를 보냅니다. 중간 업데이트가 사라져도 뒤에 온 최신 업데이트를 먼저 반영할 수 있습니다.

데모는 1번 좌표가 도착하고 2번은 손실되지만 3번 좌표가 화면의 마커를 바로 옮기는 모습을 보여줍니다. 반드시 도착해야 하는 명령이나 문서는 신뢰성 있는 스트림으로 보내야 합니다.

언제 쓰나

게임 위치나 센서 값처럼 오래된 메시지보다 최신 값이 중요한 실시간 상태에 씁니다.

페이지로 열기 ↗