Compose sandbox message
Draft
"""Resettable localhost mail UI used by the real Playwright Experiment 9-5. The server is deliberately small, but it is not a mocked browser: Chromium loads the page, JavaScript sends HTTP requests, and the final sent-list is rendered from server-side state. All side effects remain inside this process. """ from __future__ import annotations from contextlib import contextmanager from dataclasses import dataclass, field from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer import json from threading import Lock, Thread from typing import Any, Iterator from urllib.parse import urlparse @dataclass class MailState: messages: list[dict[str, str]] = field(default_factory=list) version: int = 1 fault: str = "normal" reset_count: int = 0 events: list[dict[str, Any]] = field(default_factory=list) lock: Lock = field(default_factory=Lock, repr=False) def reset(self, *, version: int = 1, fault: str = "normal") -> None: with self.lock: self.messages.clear() self.version = version self.fault = fault self.reset_count += 1 self.events.append({ "event": "validation_reset", "version": version, "fault": fault, "reset_index": self.reset_count, }) def send(self, payload: dict[str, Any]) -> dict[str, Any]: message = {key: str(payload.get(key, "")) for key in ("recipient", "subject", "content")} with self.lock: self.events.append({"event": "send_request", "message": message, "version": self.version}) if not all(value.strip() for value in message.values()): self.events.append({"event": "validation_rejected", "reason": "blank_field"}) return {"ok": False, "persisted": False, "reason": "blank_field"} if self.fault == "drop_persistence": self.events.append({"event": "persistence_dropped"}) return {"ok": True, "persisted": False, "reason": "storage_write_dropped"} self.messages.append(message) self.events.append({"event": "message_persisted", "message": message}) return {"ok": True, "persisted": True, "reason": None} def snapshot(self) -> dict[str, Any]: with self.lock: return { "messages": list(self.messages), "version": self.version, "fault": self.fault, "reset_count": self.reset_count, "events": list(self.events), } def _html(version: int) -> str: button_id = "send" if version == 1 else "deliver-v2" button_text = "Send message" if version == 1 else "Deliver message" return f"""
Draft