PushEvent 接收远程事件并推送到本地 EventBus 这是 RemoteAgent 的核心方法,用于接收来自远程进程的事件
(envelope types.AgentEventEnvelope)
| 76 | // PushEvent 接收远程事件并推送到本地 EventBus |
| 77 | // 这是 RemoteAgent 的核心方法,用于接收来自远程进程的事件 |
| 78 | func (r *RemoteAgent) PushEvent(envelope types.AgentEventEnvelope) error { |
| 79 | if envelope.Event == nil { |
| 80 | return errors.New("event is nil") |
| 81 | } |
| 82 | |
| 83 | // 根据事件类型推送到对应的通道 |
| 84 | if ev, ok := envelope.Event.(types.EventType); ok { |
| 85 | channel := ev.Channel() |
| 86 | |
| 87 | switch channel { |
| 88 | case types.ChannelProgress: |
| 89 | r.eventBus.EmitProgress(envelope.Event) |
| 90 | case types.ChannelControl: |
| 91 | r.eventBus.EmitControl(envelope.Event) |
| 92 | case types.ChannelMonitor: |
| 93 | r.eventBus.EmitMonitor(envelope.Event) |
| 94 | default: |
| 95 | remoteAgentLog.Warn(context.Background(), "remote_agent.unknown_channel", map[string]any{ |
| 96 | "agent_id": r.id, |
| 97 | "channel": string(channel), |
| 98 | }) |
| 99 | } |
| 100 | |
| 101 | // 更新状态 |
| 102 | r.updateStateFromEvent(envelope.Event) |
| 103 | } else if eventMap, ok := envelope.Event.(map[string]any); ok { |
| 104 | // 处理从 JSON 反序列化的事件(map[string]any 类型) |
| 105 | // 从事件 map 中推断 channel |
| 106 | channel := r.inferChannelFromEventMap(eventMap) |
| 107 | |
| 108 | switch types.AgentChannel(channel) { |
| 109 | case types.ChannelProgress: |
| 110 | r.eventBus.EmitProgress(envelope.Event) |
| 111 | case types.ChannelControl: |
| 112 | r.eventBus.EmitControl(envelope.Event) |
| 113 | case types.ChannelMonitor: |
| 114 | r.eventBus.EmitMonitor(envelope.Event) |
| 115 | default: |
| 116 | // 默认发送到 Progress 通道 |
| 117 | r.eventBus.EmitProgress(envelope.Event) |
| 118 | } |
| 119 | |
| 120 | remoteAgentLog.Debug(context.Background(), "remote_agent.event_pushed", map[string]any{ |
| 121 | "agent_id": r.id, |
| 122 | "channel": channel, |
| 123 | "event": eventMap, |
| 124 | }) |
| 125 | } else { |
| 126 | remoteAgentLog.Warn(context.Background(), "remote_agent.unknown_event_type", map[string]any{ |
| 127 | "agent_id": r.id, |
| 128 | "event_type": fmt.Sprintf("%T", envelope.Event), |
| 129 | }) |
| 130 | } |
| 131 | |
| 132 | return nil |
| 133 | } |
| 134 | |
| 135 | // inferChannelFromEventMap 从事件 map 中推断通道类型 |
no test coverage detected