fix: race condition after resumable stream ends (#986)

This commit is contained in:
Jeremy 2025-05-07 16:02:53 -07:00 committed by GitHub
parent 566b01f367
commit 75af1320f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 145 additions and 18 deletions

47
hooks/use-auto-resume.ts Normal file
View file

@ -0,0 +1,47 @@
'use client';
import { useEffect } from 'react';
import type { UIMessage } from 'ai';
import type { UseChatHelpers } from '@ai-sdk/react';
import type { DataPart } from '@/lib/types';
export interface UseAutoResumeParams {
autoResume: boolean;
initialMessages: UIMessage[];
experimental_resume: UseChatHelpers['experimental_resume'];
data: UseChatHelpers['data'];
setMessages: UseChatHelpers['setMessages'];
}
export function useAutoResume({
autoResume,
initialMessages,
experimental_resume,
data,
setMessages,
}: UseAutoResumeParams) {
useEffect(() => {
if (!autoResume) return;
const mostRecentMessage = initialMessages.at(-1);
if (mostRecentMessage?.role === 'user') {
experimental_resume();
}
// we intentionally run this once
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
useEffect(() => {
if (!data) return;
if (data.length === 0) return;
const dataPart = data[0] as DataPart;
if (dataPart.type === 'append-message') {
const message = JSON.parse(dataPart.message) as UIMessage;
setMessages([...initialMessages, message]);
}
}, [data, initialMessages, setMessages]);
}