tipzadatak
sto_trebaImplementirati Tier-0 P2P sloj za Bršljan mrežu. Browser čvorovi komuniciraju direktno bez servera nakon WebRTC handshakea. LAN/WiFi Direct mode: iceServers=[] (samo host kandidati, bez STUN) — radi na istoj WiFi mreži bez cloud-a.
faze[
"F1: signaling endpoint (POST/GET /api/v4/kanal/p2p/signal) — Redis ephemeral TTL=120s",
"F2: brsljani-p2p.js u fenix-v4 static — LAN mode + STUN fallback, ZAKON 17 PULL-ONLY gossip",
"F3: brsljani-node.js v4.0.0 — _initP2P(), gossipAtom(), fetchAtomP2P()",
"F4: deploy MAR + smoke test"
]
zakon[
"ZAKON_17",
"ZAKON_41",
"ZAKON_43",
"ZAKON_27"
]
arhitektura{
"LAN_mode": "RTCPeerConnection({iceServers:[]}) — samo host ICE kandidati, radi na istoj WiFi mreži bez STUN-a",
"STUN_fallback": "RTCPeerConnection({iceServers:[stun:stun.l.google.com:19302]}) — cross-network",
"signaling": "Redis HASH genesis:rtc:signal:{target_wid}, TTL=120s, poll svakih 2s",
"gossip": "ATOM_OFFER → ATOM_WANT → ATOM_PUSH (deduplicirano, Krunica verify lokalno)",
"zakon_17": "Browser NIKAD ne pushuje između browser-čvorova — signal server je jedino što prima POST",
statusDONE
chainc1330
commit7bb7a00
dokaz{
"POST /api/v4/kanal/p2p/signal": "{\"ok\":true,\"queued\":true}",
"GET /api/v4/kanal/p2p/signal?target=X": "{\"signals\":[{...}],\"count\":1}",
"drugi_poll": "{\"signals\":[],\"count\":0} # atomarno brisanje OK",
"brsljani-p2p.js": "417 linija — v1.0.0",
"brsljani-node.js": "460 linija — v4.0.0",
"brsljani-sw.js": "HTTP 200 + Service-Worker-Allowed: /"
}