from __future__ import annotations from yuxi.channel.application.pipeline.middlewares.access_policy_middleware import AccessPolicyMiddleware from yuxi.channel.application.pipeline.middlewares.auth_middleware import AuthMiddleware from yuxi.channel.application.pipeline.middlewares.dedup_middleware import DedupMiddleware from yuxi.channel.application.pipeline.middlewares.enqueue_mq_middleware import EnqueueMQMiddleware from yuxi.channel.application.pipeline.middlewares.keyword_filter_middleware import KeywordFilterMiddleware from yuxi.channel.application.pipeline.middlewares.mention_gate_middleware import MentionGateMiddleware from yuxi.channel.application.pipeline.middlewares.rate_limit_middleware import RateLimitMiddleware from yuxi.channel.application.pipeline.middlewares.validation_middleware import ValidationMiddleware from yuxi.channel.application.service.auth_service import AuthService from yuxi.channel.domain.port.keyword_matcher_port import KeywordMatcherPort from yuxi.channel.domain.port.metrics_port import MetricsPort from yuxi.channel.domain.port.queue_port import QueuePort from yuxi.channel.domain.port.rate_limit_port import RateLimitPort from yuxi.channel.domain.port.signature_verify_port import SignatureVerifyPort from yuxi.channel.domain.port.cache_port import CachePort from yuxi.channel.domain.service.pipeline import Pipeline from yuxi.channel.domain.service.pipeline_builder import PipelineBuilder def build_inbound_pipeline( auth_service: AuthService, cache_port: CachePort, rate_limit_port: RateLimitPort, queue_port: QueuePort, *, keyword_matcher: KeywordMatcherPort | None = None, signature_verifier: SignatureVerifyPort | None = None, metrics: MetricsPort | None = None, channel_config: dict | None = None, bot_id: str | None = None, ) -> Pipeline: config = channel_config or {} mention_gate = MentionGateMiddleware() if bot_id: mention_gate.set_bot_id(bot_id) if keyword_matcher is None: from yuxi.channel.infrastructure.matching.aho_corasick_matcher import AhoCorasickMatcher keyword_matcher = AhoCorasickMatcher(set(config.get("keyword_blocklist") or [])) return ( PipelineBuilder() .add(AuthMiddleware(auth_service)) .add( ValidationMiddleware( signature_verifier=signature_verifier, allow_from=config.get("allow_from", {}), ) ) .add(KeywordFilterMiddleware(keyword_matcher)) .add(DedupMiddleware(cache_port)) .add(RateLimitMiddleware(rate_limit_port)) .add(AccessPolicyMiddleware(policies=config.get("access_policies", {}))) .add(mention_gate) .add(EnqueueMQMiddleware(queue_port)) .metrics(metrics) .build() )