Skip to content

get_broker_server

faststream.specification.asyncapi.v3_0_0.generate.get_broker_server #

get_broker_server(
    *brokers: BrokerUsecase[MsgType, ConnectionType, Any],
) -> tuple[
    dict[str, Server],
    dict[BrokerUsecase[Any, Any, Any], list[str]],
]

Get the broker server for an application.

Source code in faststream/specification/asyncapi/v3_0_0/generate.py
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
def get_broker_server(
    *brokers: "BrokerUsecase[MsgType, ConnectionType, Any]",
) -> tuple[
    dict[str, Server],
    dict["BrokerUsecase[Any, Any, Any]", list[str]],
]:
    """Get the broker server for an application."""
    servers: list[Server] = []
    broker_servers: list[tuple[BrokerUsecase[Any, Any, Any], Server]] = []

    for broker in brokers:
        specification = broker.specification

        broker_meta: dict[str, Any] = {
            "protocol": specification.protocol,
            "protocolVersion": specification.protocol_version,
            "description": specification.description,
            "tags": [Tag.from_spec(tag) for tag in specification.tags] or None,
            # TODO
            # "variables": "",
            # "bindings": "",
        }

        if specification.security is not None:
            broker_meta["security"] = [
                Reference(**ref("components", "securitySchemes", sec))
                for security_item in specification.security.get_requirement()
                for sec in security_item
            ]

        for url in specification.url:
            parsed_url = urlparse(url if "://" in url else f"//{url}")
            server = Server(
                host=parsed_url.netloc,
                pathname=parsed_url.path,
                **broker_meta,
            )

            # deduplicate servers
            broker_servers.append((broker, server))
            if server not in servers:
                servers.append(server)

    servers_by_names: dict[str, Server] = {}
    single_server = len(servers) == 1
    for i, server in enumerate(servers, 1):
        server_name = "development" if single_server else f"Server{i}"
        servers_by_names[server_name] = server

    broker_server_names: dict[BrokerUsecase[Any, Any, Any], list[str]] = {}
    for name, server in servers_by_names.items():
        for broker, br_server in broker_servers:
            if server == br_server:
                broker_server_names.setdefault(broker, []).append(name)

    return servers_by_names, broker_server_names