Skip to content

Commit 1c8da72

Browse files
authored
clean up some error messages (#325)
1 parent 327dd3d commit 1c8da72

File tree

4 files changed

+35
-14
lines changed

4 files changed

+35
-14
lines changed

examples/next-app/components/Voice.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ export const Voice = ({ accessToken }: { accessToken: string }) => {
1616
// eslint-disable-next-line no-console
1717
console.log('message', message);
1818
}}
19+
onError={(message) => {
20+
// eslint-disable-next-line no-console
21+
console.error('onError', message);
22+
}}
1923
onAudioStart={(clipId) => {
2024
// eslint-disable-next-line no-console
2125
console.log('Start playing clip with ID:', clipId);

packages/react/src/lib/VoiceProvider.tsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,11 @@ export const VoiceProvider: FC<VoiceProviderProps> = ({
190190
}, []);
191191

192192
const onClientError: NonNullable<
193-
Parameters<typeof useVoiceClient>[0]['onError']
193+
Parameters<typeof useVoiceClient>[0]['onClientError']
194194
> = useCallback(
195-
(message, err) => {
195+
(msg, err) => {
196196
stopTimer();
197+
const message = `A websocket connection could not be established. Error message: ${msg ?? 'unknown'}`;
197198
updateError({ type: 'socket_error', message, error: err });
198199
},
199200
[stopTimer, updateError],
@@ -270,7 +271,18 @@ export const VoiceProvider: FC<VoiceProviderProps> = ({
270271
},
271272
[messageStore, player, toolStatus],
272273
),
273-
onError: onClientError,
274+
onClientError,
275+
onToolCallError: useCallback(
276+
(message: string, err?: Error) => {
277+
const error: VoiceError = {
278+
type: 'socket_error',
279+
message,
280+
error: err,
281+
};
282+
updateError(error);
283+
},
284+
[updateError],
285+
),
274286
onOpen: useCallback(() => {
275287
startTimer();
276288
messageStore.createConnectMessage();
@@ -358,7 +370,7 @@ export const VoiceProvider: FC<VoiceProviderProps> = ({
358370
const message = 'Microphone permission denied';
359371
const error: VoiceError = { type: 'mic_error', message };
360372
updateError(error);
361-
return Promise.reject(new Error(message));
373+
return;
362374
}
363375

364376
try {
@@ -367,10 +379,9 @@ export const VoiceProvider: FC<VoiceProviderProps> = ({
367379
verboseTranscription: true,
368380
});
369381
} catch (e) {
370-
const message = 'We could not connect to the voice. Please try again.';
371-
const error: VoiceError = { type: 'socket_error', message };
372-
updateError(error);
373-
return Promise.reject(new Error(message));
382+
// catching the thrown error here so we can return early from the connect function,
383+
// but the error itself is handled in the `onClientError` callback on the client
384+
return;
374385
}
375386

376387
try {

packages/react/src/lib/useVoiceClient.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ describe('useVoiceClient', () => {
77
it('creates a client with the given config', () => {
88
const hook = renderHook(() =>
99
useVoiceClient({
10-
onError: () => {},
10+
onClientError: () => {},
1111
}),
1212
);
1313

packages/react/src/lib/useVoiceClient.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ export const useVoiceClient = (props: {
5252
onAudioMessage?: (message: AudioOutputMessage) => void;
5353
onMessage?: (message: JSONMessage) => void;
5454
onToolCall?: ToolCallHandler;
55-
onError?: (message: string, error?: Error) => void;
55+
onToolCallError?: (message: string, error?: Error) => void;
56+
onClientError?: (message: string, error?: Error) => void;
5657
onOpen?: () => void;
5758
onClose?: Hume.empathicVoice.chat.ChatSocket.EventHandlers['close'];
5859
}) => {
@@ -75,8 +76,13 @@ export const useVoiceClient = (props: {
7576
const onToolCall = useRef<typeof props.onToolCall>(props.onToolCall);
7677
onToolCall.current = props.onToolCall;
7778

78-
const onError = useRef<typeof props.onError>(props.onError);
79-
onError.current = props.onError;
79+
const onClientError = useRef<typeof props.onClientError>(props.onClientError);
80+
onClientError.current = props.onClientError;
81+
82+
const onToolCallError = useRef<typeof props.onToolCallError>(
83+
props.onToolCallError,
84+
);
85+
onToolCallError.current = props.onToolCallError;
8086

8187
const onOpen = useRef<typeof props.onOpen>(props.onOpen);
8288
onOpen.current = props.onOpen;
@@ -178,7 +184,7 @@ export const useVoiceClient = (props: {
178184
} else if (response.type === 'tool_error') {
179185
client.current?.sendToolErrorMessage(response);
180186
} else {
181-
onError.current?.('Invalid response from tool call');
187+
onToolCallError.current?.('Invalid response from tool call');
182188
}
183189
});
184190
}
@@ -197,7 +203,7 @@ export const useVoiceClient = (props: {
197203

198204
client.current.on('error', (e) => {
199205
const message = e instanceof Error ? e.message : 'Unknown error';
200-
onError.current?.(message, e instanceof Error ? e : undefined);
206+
onClientError.current?.(message, e instanceof Error ? e : undefined);
201207
reject(e);
202208
});
203209

0 commit comments

Comments
 (0)