revert keepalive mechanism

This commit is contained in:
Flowseal 2026-03-22 08:00:14 +03:00
parent 18a1bced83
commit afb7c5f56d
1 changed files with 1 additions and 22 deletions

View File

@ -145,7 +145,6 @@ _st_I_net = struct.Struct('!I')
_st_Ih = struct.Struct('<Ih') _st_Ih = struct.Struct('<Ih')
_st_I_le = struct.Struct('<I') _st_I_le = struct.Struct('<I')
_VALID_PROTOS = frozenset((0xEFEFEFEF, 0xEEEEEEEE, 0xDDDDDDDD)) _VALID_PROTOS = frozenset((0xEFEFEFEF, 0xEEEEEEEE, 0xDDDDDDDD))
_WS_PING_FRAME = _st_BB4s.pack(0x80 | 0x9, 0x80 | 0, os.urandom(4))
class RawWebSocket: class RawWebSocket:
@ -621,7 +620,6 @@ async def _bridge_ws(reader, writer, ws: RawWebSocket, label,
up_packets = 0 up_packets = 0
down_packets = 0 down_packets = 0
start_time = asyncio.get_event_loop().time() start_time = asyncio.get_event_loop().time()
last_recv_time = start_time
async def tcp_to_ws(): async def tcp_to_ws():
nonlocal up_bytes, up_packets nonlocal up_bytes, up_packets
@ -648,13 +646,12 @@ async def _bridge_ws(reader, writer, ws: RawWebSocket, label,
log.debug("[%s] tcp->ws ended: %s", label, e) log.debug("[%s] tcp->ws ended: %s", label, e)
async def ws_to_tcp(): async def ws_to_tcp():
nonlocal down_bytes, down_packets, last_recv_time nonlocal down_bytes, down_packets
try: try:
while True: while True:
data = await ws.recv() data = await ws.recv()
if data is None: if data is None:
break break
last_recv_time = asyncio.get_event_loop().time()
n = len(data) n = len(data)
_stats.bytes_down += n _stats.bytes_down += n
down_bytes += n down_bytes += n
@ -666,29 +663,11 @@ async def _bridge_ws(reader, writer, ws: RawWebSocket, label,
except Exception as e: except Exception as e:
log.debug("[%s] ws->tcp ended: %s", label, e) log.debug("[%s] ws->tcp ended: %s", label, e)
async def ws_keepalive():
try:
while not ws._closed:
await asyncio.sleep(2)
idle = asyncio.get_event_loop().time() - last_recv_time
if idle >= 2 and not ws._closed:
try:
ws.writer.write(_WS_PING_FRAME)
await ws.writer.drain()
log.debug("[%s] %s WS PING (idle %.1fs)",
label, dc_tag, idle)
except Exception:
break
except asyncio.CancelledError:
pass
ka_task = asyncio.create_task(ws_keepalive())
tasks = [asyncio.create_task(tcp_to_ws()), tasks = [asyncio.create_task(tcp_to_ws()),
asyncio.create_task(ws_to_tcp())] asyncio.create_task(ws_to_tcp())]
try: try:
await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
finally: finally:
ka_task.cancel()
for t in tasks: for t in tasks:
t.cancel() t.cancel()
for t in tasks: for t in tasks: