from __future__ import annotations import json from pathlib import Path from urllib import request def build_json_request( url: str, payload: dict, timeout_seconds: float = 5.0 ) -> request.Request: data = json.dumps(payload).encode("utf-8") req = request.Request(url=url, data=data, method="POST") req.add_header("Content-Type", "application/json") req.timeout_seconds = timeout_seconds return req def append_json_event(path: str | Path, payload: dict) -> None: output_path = Path(path) output_path.parent.mkdir(parents=True, exist_ok=True) with output_path.open("a", encoding="utf-8") as handle: handle.write(json.dumps(payload, ensure_ascii=False) + "\n") def post_json_event(url: str, payload: dict, timeout_seconds: float = 5.0) -> None: if not url.strip(): return req = build_json_request(url, payload, timeout_seconds=timeout_seconds) with request.urlopen(req, timeout=timeout_seconds): return def dispatch_json_event( path: str | Path, payload: dict, webhook_url: str = "", timeout_seconds: float = 5.0, ) -> None: append_json_event(path, payload) if webhook_url.strip(): post_json_event(webhook_url, payload, timeout_seconds=timeout_seconds)