63 lines
2.7 KiB
Python
63 lines
2.7 KiB
Python
|
|
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()
|
||
|
|
)
|