Portal Community

subscribeToNodeStream()

// Available on the useExecutionSignalR hook return
const { subscribeToNodeStream, unsubscribeFromNodeStream } = useExecutionSignalR(executionId);

// Subscribe to logs for a specific node
const unsubscribe = subscribeToNodeStream('node-httpReq1', (log) => {
  console.log(`[${log.level.toUpperCase()}] ${log.message}`);
  appendToNodeLogBuffer(log);
});

// Cleanup when component unmounts or node changes
return () => unsubscribe();

Log Buffering

All incoming NodeLogEmitted events are buffered in memory in the flowObserverPanelStore. The buffer is:

Real-Time Log Architecture

1

Executor Logs

Backend executor calls ctx.Logger.LogInformation("message", data)

2

SignalR Emit

Log provider intercepts the log entry and emits NodeLogEmitted to the execution group

3

Client Receives

useExecutionSignalR handler receives the event and dispatches to all subscribeToNodeStream listeners

4

Logs Tab Updates

New log entry appended to virtual scroll list. Sanitization runs before display.