更改项目名为NebulaShell
This commit is contained in:
59
store/@{NebulaShell}/http-api/events.py
Normal file
59
store/@{NebulaShell}/http-api/events.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""HTTP 事件系统 - 请求/响应生命周期事件"""
|
||||
from typing import Callable, Any, Optional
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
@dataclass
|
||||
class HttpEvent:
|
||||
"""HTTP 事件"""
|
||||
type: str # request, response, error, etc
|
||||
request: Any = None
|
||||
response: Any = None
|
||||
error: Exception = None
|
||||
context: dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
|
||||
class HttpEventBus:
|
||||
"""HTTP 事件总线"""
|
||||
|
||||
def __init__(self):
|
||||
self._handlers: dict[str, list[Callable]] = {}
|
||||
|
||||
def on(self, event_type: str, handler: Callable):
|
||||
"""订阅事件"""
|
||||
if event_type not in self._handlers:
|
||||
self._handlers[event_type] = []
|
||||
self._handlers[event_type].append(handler)
|
||||
|
||||
def off(self, event_type: str, handler: Callable):
|
||||
"""取消订阅"""
|
||||
if event_type in self._handlers:
|
||||
try:
|
||||
self._handlers[event_type].remove(handler)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def emit(self, event: HttpEvent):
|
||||
"""发布事件"""
|
||||
handlers = self._handlers.get(event.type, [])
|
||||
for handler in handlers:
|
||||
try:
|
||||
handler(event)
|
||||
except Exception as e:
|
||||
import traceback; print(f"[events.py] 错误:{type(e).__name__}:{e}"); traceback.print_exc()
|
||||
pass
|
||||
|
||||
def clear(self):
|
||||
"""清空所有订阅"""
|
||||
self._handlers.clear()
|
||||
|
||||
|
||||
# 事件类型常量
|
||||
EVENT_REQUEST = "http.request"
|
||||
EVENT_BEFORE_ROUTE = "http.before_route"
|
||||
EVENT_AFTER_ROUTE = "http.after_route"
|
||||
EVENT_BEFORE_HANDLER = "http.before_handler"
|
||||
EVENT_AFTER_HANDLER = "http.after_handler"
|
||||
EVENT_RESPONSE = "http.response"
|
||||
EVENT_ERROR = "http.error"
|
||||
EVENT_COMPLETE = "http.complete"
|
||||
Reference in New Issue
Block a user