Skip to content

Async streaming response wrappers leak an unawaited coroutine when not entered #175

Description

@abhinavkr26104

Description

The async .with_streaming_response wrappers create the endpoint coroutine immediately, before the returned context manager is entered. If the context manager is conditionally discarded or never entered, Python emits RuntimeWarning: coroutine ... was never awaited.

This differs from the synchronous wrapper, which stores a callable and does not invoke the endpoint until __enter__.

Code reference

  • src/browserbase/_response.py:669-685
  • AsyncResponseContextManager stores an already-created Awaitable at src/browserbase/_response.py:632-637

Reproduction

import asyncio
import gc
import warnings

from browserbase import AsyncBrowserbase

async def main():
    client = AsyncBrowserbase(api_key="test")
    with warnings.catch_warnings(record=True) as caught:
        warnings.simplefilter("always")
        cm = client.sessions.with_streaming_response.create(project_id="p")
        del cm
        gc.collect()
        await asyncio.sleep(0)
        print([str(w.message) for w in caught])
    await client.close()

asyncio.run(main())

Actual output includes:

coroutine 'AsyncSessionsResource.create' was never awaited

No HTTP request is needed to reproduce this.

Expected behavior

Creating and discarding an unentered response context manager should not allocate an unawaited coroutine or emit a resource warning. The async manager could retain a callable/partial and invoke it lazily from __aenter__, matching ResponseContextManager.

Why it matters

Warnings are promoted to errors in many test suites, and conditional streaming code can produce noisy, nondeterministic resource warnings. This path currently has no direct lifecycle test.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions