async def METHOD_NAME(
    app: ASGIApplication | Any,
    host: str,
    port: int,
    started: asyncio.Event | None,
) -> None:
    """Run a development server for an ASGI application"""
    import uvicorn
    server = uvicorn.Server(
        uvicorn.Config(
            app,
            host=host,
            port=port,
            loop="asyncio",
        )
    )
    server.config.setup_event_loop()
    coros: list[Awaitable[Any]] = [server.serve()]
    # If a started event is provided, then use it signal based on `server.started`
    if started:
        coros.append(_check_if_started(server, started))
    try:
        await asyncio.gather(*coros)
    finally:
        # Since we aren't using the uvicorn's `run()` API, we can't guarantee uvicorn's
        # order of operations. So we need to make sure `shutdown()` always has an initialized
        # list of `self.servers` to use.
        if not hasattr(server, "servers"):  # nocov
            server.servers = []
        await asyncio.wait_for(server.shutdown(), timeout=3)