"""人工流事件演示；没有网络连接，不处理任何供应商的原始事件格式。"""
import json


class ArgumentsBuffer:
    def __init__(self, max_bytes: int = 4096) -> None:
        self.parts: dict[str, list[str]] = {}
        self.finished: set[str] = set()
        self.max_bytes = max_bytes

    def feed(self, call_id: str, fragment: str) -> None:
        if call_id in self.finished:
            raise ValueError("调用已结束，不能追加参数")
        parts = self.parts.setdefault(call_id, [])
        # 限制累积字节，避免无止境占用内存；正式系统还需限制并行调用数。
        if len(("".join(parts) + fragment).encode("utf-8")) > self.max_bytes:
            raise ValueError("参数过大")
        parts.append(fragment)

    def complete(self, call_id: str) -> dict:
        # 只能由适配器收到真实完成事件后调用，不能通过“看起来像 JSON”猜结束。
        if call_id in self.finished or call_id not in self.parts:
            raise ValueError("未知或已完成调用")
        value = json.loads("".join(self.parts[call_id]))
        if not isinstance(value, dict):
            raise ValueError("参数必须是对象")
        self.finished.add(call_id)
        del self.parts[call_id]
        return value


if __name__ == "__main__":
    buffer = ArgumentsBuffer()
    for part in ('{"order_', 'id":"A10', '42"}'):
        buffer.feed("c1", part)
    print(buffer.complete("c1"))  # 完成后仍需业务参数校验，不能直接执行。
