35 lines
884 B
Python
35 lines
884 B
Python
|
|
import json
|
||
|
|
|
||
|
|
|
||
|
|
MAX_MESSAGE_SIZE = 1024 * 1024 # 1 MB
|
||
|
|
|
||
|
|
|
||
|
|
def decode_message(raw_line: str) -> dict:
|
||
|
|
if raw_line is None:
|
||
|
|
raise ValueError("Mensagem ausente")
|
||
|
|
|
||
|
|
if len(raw_line) > MAX_MESSAGE_SIZE:
|
||
|
|
raise ValueError("Mensagem excede tamanho máximo permitido")
|
||
|
|
|
||
|
|
raw_line = raw_line.strip()
|
||
|
|
if not raw_line:
|
||
|
|
raise ValueError("Mensagem vazia")
|
||
|
|
|
||
|
|
try:
|
||
|
|
data = json.loads(raw_line)
|
||
|
|
except json.JSONDecodeError as e:
|
||
|
|
raise ValueError(f"JSON inválido: {e.msg}") from e
|
||
|
|
|
||
|
|
if not isinstance(data, dict):
|
||
|
|
raise ValueError("Mensagem JSON deve ser um objeto")
|
||
|
|
|
||
|
|
return data
|
||
|
|
|
||
|
|
|
||
|
|
def encode_message(data: dict) -> bytes:
|
||
|
|
if not isinstance(data, dict):
|
||
|
|
raise ValueError("Resposta deve ser um objeto dict")
|
||
|
|
|
||
|
|
return (
|
||
|
|
json.dumps(data, ensure_ascii=False, separators=(",", ":")) + "\n"
|
||
|
|
).encode("utf-8")
|