async def METHOD_NAME(
    client: ModuleStatusClient,
    modules: Sequence[ModuleType],
    timeout: float,
) -> None:
    """Wait for module emulators to connect.
    Args:
        client: module server client.
        modules: collection of of module types to wait for.
        timeout: how long to wait for emulators to connect (in seconds)
    Returns:
        None
    Raises:
        asyncio.TimeoutError on timeout.
    """
    async def _wait_modules() -> None:
        """Read messages from module server waiting for modules in module_set to
        be connected."""
        module_set: Set[str] = set(modules)
        while module_set:
            m: Message = await client.read()
            if m.status == "dump" or m.status == "connected":
                for c in m.connections:
                    module_set.discard(c.module_type)
            elif m.status == "disconnected":
                for c in m.connections:
                    module_set.add(c.module_type)
            log.debug(f"after message: {m}, awaiting module set is: {module_set}")
    await asyncio.wait_for(_wait_modules(), timeout=timeout)