Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions apps/api/src/browserbase/browserbase-session.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,22 @@ describe('BrowserbaseSessionService', () => {
expect(createContext).toHaveBeenCalledTimes(3);
});

it('includes the underlying cause in the exhausted-retry message', async () => {
jest.useFakeTimers();
const service = new BrowserbaseSessionService();
const createContext = jest.fn().mockRejectedValue(prematureCloseError());
jest
.spyOn(service, 'getBrowserbase')
.mockReturnValue(mockBrowserbaseClient({ createContext }));

const promise = service.createBrowserbaseContext().catch((error) => error);
await jest.advanceTimersByTimeAsync(1_000);
const error = await promise;

expect(error).toBeInstanceOf(ServiceUnavailableException);
expect(error.message).toContain('Premature close');
});

it('preserves non-retryable Browserbase failures', async () => {
const service = new BrowserbaseSessionService();
const browserbaseError = Object.assign(
Expand Down
4 changes: 3 additions & 1 deletion apps/api/src/browserbase/browserbase-session.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,9 @@ export class BrowserbaseSessionService {
attempt,
error: getBrowserbaseErrorText(error),
});
throw browserbaseUnavailableException();
// Surface the underlying cause in the message so an exhausted retry
// is diagnosable from the UI/response, not just the server logs.
throw browserbaseUnavailableException(getBrowserbaseErrorText(error));
}

this.logger.warn(`Browserbase ${operationName} failed; retrying`, {
Expand Down
8 changes: 8 additions & 0 deletions apps/api/src/browserbase/browserbase-upstream-error.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,12 @@ describe('browserbase upstream errors', () => {
'Browserbase is temporarily unavailable. Please retry in a moment.',
);
});

it('appends the underlying cause when provided', () => {
const error = browserbaseUnavailableException('Premature close');

expect(error.message).toBe(
'Browserbase is temporarily unavailable. Please retry in a moment. (Premature close)',
);
});
});
6 changes: 4 additions & 2 deletions apps/api/src/browserbase/browserbase-upstream-error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ export const isRetryableBrowserbaseUpstreamError = (
return RETRYABLE_MESSAGE_PARTS.some((part) => message.includes(part));
};

export const browserbaseUnavailableException = () =>
export const browserbaseUnavailableException = (detail?: string) =>
new ServiceUnavailableException(
'Browserbase is temporarily unavailable. Please retry in a moment.',
detail
? `Browserbase is temporarily unavailable. Please retry in a moment. (${detail})`
: 'Browserbase is temporarily unavailable. Please retry in a moment.',
);
Loading