|
@@ -5,6 +5,10 @@ import ActionType from "#/types/ActionType";
|
|
|
import EventLogger from "#/utils/event-logger";
|
|
import EventLogger from "#/utils/event-logger";
|
|
|
import AgentState from "#/types/AgentState";
|
|
import AgentState from "#/types/AgentState";
|
|
|
import { handleAssistantMessage } from "#/services/actions";
|
|
import { handleAssistantMessage } from "#/services/actions";
|
|
|
|
|
+import { useRate } from "#/utils/use-rate";
|
|
|
|
|
+
|
|
|
|
|
+const isOpenHandsMessage = (event: Record<string, unknown>) =>
|
|
|
|
|
+ event.action === "message";
|
|
|
|
|
|
|
|
const RECONNECT_RETRIES = 5;
|
|
const RECONNECT_RETRIES = 5;
|
|
|
|
|
|
|
@@ -17,12 +21,14 @@ export enum WsClientProviderStatus {
|
|
|
|
|
|
|
|
interface UseWsClient {
|
|
interface UseWsClient {
|
|
|
status: WsClientProviderStatus;
|
|
status: WsClientProviderStatus;
|
|
|
|
|
+ isLoadingMessages: boolean;
|
|
|
events: Record<string, unknown>[];
|
|
events: Record<string, unknown>[];
|
|
|
send: (event: Record<string, unknown>) => void;
|
|
send: (event: Record<string, unknown>) => void;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const WsClientContext = React.createContext<UseWsClient>({
|
|
const WsClientContext = React.createContext<UseWsClient>({
|
|
|
status: WsClientProviderStatus.STOPPED,
|
|
status: WsClientProviderStatus.STOPPED,
|
|
|
|
|
+ isLoadingMessages: true,
|
|
|
events: [],
|
|
events: [],
|
|
|
send: () => {
|
|
send: () => {
|
|
|
throw new Error("not connected");
|
|
throw new Error("not connected");
|
|
@@ -51,6 +57,8 @@ export function WsClientProvider({
|
|
|
const [events, setEvents] = React.useState<Record<string, unknown>[]>([]);
|
|
const [events, setEvents] = React.useState<Record<string, unknown>[]>([]);
|
|
|
const [retryCount, setRetryCount] = React.useState(RECONNECT_RETRIES);
|
|
const [retryCount, setRetryCount] = React.useState(RECONNECT_RETRIES);
|
|
|
|
|
|
|
|
|
|
+ const messageRateHandler = useRate({ threshold: 500 });
|
|
|
|
|
+
|
|
|
function send(event: Record<string, unknown>) {
|
|
function send(event: Record<string, unknown>) {
|
|
|
if (!wsRef.current) {
|
|
if (!wsRef.current) {
|
|
|
EventLogger.error("WebSocket is not connected.");
|
|
EventLogger.error("WebSocket is not connected.");
|
|
@@ -71,6 +79,9 @@ export function WsClientProvider({
|
|
|
|
|
|
|
|
function handleMessage(messageEvent: MessageEvent) {
|
|
function handleMessage(messageEvent: MessageEvent) {
|
|
|
const event = JSON.parse(messageEvent.data);
|
|
const event = JSON.parse(messageEvent.data);
|
|
|
|
|
+ if (isOpenHandsMessage(event)) {
|
|
|
|
|
+ messageRateHandler.record(new Date().getTime());
|
|
|
|
|
+ }
|
|
|
setEvents((prevEvents) => [...prevEvents, event]);
|
|
setEvents((prevEvents) => [...prevEvents, event]);
|
|
|
if (event.extras?.agent_state === AgentState.INIT) {
|
|
if (event.extras?.agent_state === AgentState.INIT) {
|
|
|
setStatus(WsClientProviderStatus.ACTIVE);
|
|
setStatus(WsClientProviderStatus.ACTIVE);
|
|
@@ -177,10 +188,11 @@ export function WsClientProvider({
|
|
|
const value = React.useMemo<UseWsClient>(
|
|
const value = React.useMemo<UseWsClient>(
|
|
|
() => ({
|
|
() => ({
|
|
|
status,
|
|
status,
|
|
|
|
|
+ isLoadingMessages: messageRateHandler.isUnderThreshold,
|
|
|
events,
|
|
events,
|
|
|
send,
|
|
send,
|
|
|
}),
|
|
}),
|
|
|
- [status, events],
|
|
|
|
|
|
|
+ [status, messageRateHandler.isUnderThreshold, events],
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
return (
|