mirror of
https://github.com/snowy-yang/qqbotsdk.git
synced 2026-10-21 10:19:33 +00:00
refactor!: 协议帧与业务事件分流,各接入方式配专有协议处理器
BaseProtocol 从 emitter.py 移入新模块 protocol.py,接口由 register(emitter) 改为 async on_frame(payload)(返回需回送的响应体);协议处理器不再注册进 emitter,而由 run_loop 注入对应的 connecter,由适配器逐帧调用。 破坏性变更:只有 op=0 的业务事件进事件队列交给 EventEmitter 分发, HELLO/READY/INVALID_SESSION/op=13 等协议帧在连接器内就地处理——用户 handler 不再收到协议帧(此前 HELLO/INVALID_SESSION 等会路由到 handler)。 EventEmitter.register_protocol()/handle() 与 emitter 持有协议层的机制删除, 协议类不再用 register() 注册 handler。 附带修掉一处时序耦合:INVALID_SESSION 的会话重置此前依赖分发泵在重连前 消费掉该事件(慢 handler 会推迟它,导致带着已死 session_id 去 RESUME), 现在连接器在 break 重连前同步完成重置。 同时做的事件流优化: - emit() 先取事件名、无 listener 时不构造 Event(未订阅事件省一次对象与拷贝) - Event.data 改为惰性拷贝(只用 .typed/.raw 的 handler 不再触发 dict(d)) - ws 重连收尾 await 被取消的 reply/heartbeat 任务,避免异常无人取用 - EventQueue.put_event/put_reply 去掉多余的 return await 测试 80 全绿(新增协议帧处理测试组、ws 集成断言协议帧不触达 handler), ruff/pyright 干净。文档 ARCHITECTURE/API/GUIDE/README/CHANGELOG 同步。
This commit is contained in:
1 parent
71cbfdaf5d
commit
7accbd1ead
16 files changed
+335
-238
No files matched your search
@@ -11,6 +11,7 @@ from aiohttp import ClientSession, WSMsgType, web
|
||||
from qqbotsdk.config import Config
|
||||
from qqbotsdk.connecter import WebsocketConnecter
|
||||
from qqbotsdk.emitter import EventEmitter
|
||||
from qqbotsdk.model import Opcode
|
||||
from qqbotsdk.payloads import GroupAtMessage
|
||||
from qqbotsdk.queue import EventQueue
|
||||
from qqbotsdk.session import Session
|
||||
@@ -115,16 +116,25 @@ async def test_websocket_end_to_end():
|
||||
session = Session()
|
||||
emitter = EventEmitter(queue)
|
||||
protocol = WebsocketProtocol(config, session, token)
|
||||
emitter.register_protocol(protocol)
|
||||
connecter = WebsocketConnecter(config, http, token, session, queue)
|
||||
connecter = WebsocketConnecter(config, http, token, session, queue, protocol)
|
||||
|
||||
received: list[GroupAtMessage] = []
|
||||
# 协议帧(HELLO/HEARTBEAT_ACK)绝不该触达 handler——只有 op=0 业务事件入队
|
||||
protocol_frames: list[object] = []
|
||||
|
||||
@emitter.on("GROUP_AT_MESSAGE_CREATE")
|
||||
async def on_msg(msg: GroupAtMessage) -> None:
|
||||
received.append(msg)
|
||||
gw.got_dispatch.set()
|
||||
|
||||
@emitter.on(Opcode.HELLO)
|
||||
async def on_hello(_) -> None:
|
||||
protocol_frames.append("HELLO")
|
||||
|
||||
@emitter.on(Opcode.HEARTBEAT_ACK)
|
||||
async def on_ack(_) -> None:
|
||||
protocol_frames.append("HEARTBEAT_ACK")
|
||||
|
||||
dispatch_task = asyncio.create_task(emitter.dispatch())
|
||||
connect_task = asyncio.create_task(connecter.run())
|
||||
try:
|
||||
@@ -146,6 +156,8 @@ async def test_websocket_end_to_end():
|
||||
assert len(received) == 1
|
||||
assert received[0].content == "ping"
|
||||
assert received[0].group_openid == "G1"
|
||||
# 协议帧(HELLO/HEARTBEAT_ACK)没进分发路径
|
||||
assert protocol_frames == []
|
||||
finally:
|
||||
dispatch_task.cancel()
|
||||
connect_task.cancel()
|
||||
|
||||
Reference in new issue
Block a user