Ctrl K
ComunidadGuías…

butler/gateway/gateway_contracts.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Gateway wiring for :class:`butler.contracts` OwnerGate + BridgeAccess (R1 续)."""

from __future__ import annotations

from typing import Any, cast


def register_gateway_contracts() -> None:
    """Wire contracts registries to live gateway owner/bridge helpers (idempotent)."""
    from butler.contracts.gateway_registry import (
        get_bridge_access,
        get_owner_gate,
        set_bridge_access,
        set_owner_gate,
    )

    if get_owner_gate() is not None and get_bridge_access() is not None:
        return

    from butler.gateway.completion_notify import try_push_workflow_failure
    from butler.gateway.outbound_bridge import get_gateway_bridge_optional
    from butler.gateway.owner_gate import is_gateway_owner, owner_required_message

    class _GatewayOwnerGate:
        def is_gateway_owner(
            self,
            *,
            platform: str,
            external_id: str | None = None,
            session_key: str = "",
        ) -> bool:
            return bool(
                is_gateway_owner(
                    platform=platform,
                    external_id=external_id,
                    session_key=session_key,
                )
            )

        def owner_required_message(self) -> str:
            return cast(str, owner_required_message())

    class _GatewayBridgeAccess:
        def get_optional_bridge(self) -> Any:
            return get_gateway_bridge_optional()

        def try_push_workflow_failure(
            self,
            workflow_name: str,
            error: Exception | str,
            *,
            session_key: str = "",
        ) -> bool:
            bridge = self.get_optional_bridge()
            return bool(
                try_push_workflow_failure(
                    bridge,
                    workflow_name,
                    error,
                    session_key=session_key,
                )
            )

    if get_owner_gate() is None:
        set_owner_gate(_GatewayOwnerGate())
    if get_bridge_access() is None:
        set_bridge_access(_GatewayBridgeAccess())

    from butler.contracts.inbound_idempotency_registry import (
        get_inbound_idempotency_port,
        set_inbound_idempotency_port,
    )

    if get_inbound_idempotency_port() is None:

        class _GatewayInboundIdempotencyPort:
            def reset_session(self, session_id: str) -> None:
                from butler.resilience.inbound_idempotency import reset_session

                reset_session(session_id)

        set_inbound_idempotency_port(_GatewayInboundIdempotencyPort())


__all__ = ["register_gateway_contracts"]