35 lines
780 B
Python
35 lines
780 B
Python
|
import dataclasses
|
||
|
import json
|
||
|
import logging
|
||
|
import sys
|
||
|
from typing import Any
|
||
|
from typing import Union
|
||
|
|
||
|
logger = logging.getLogger("esbonio.sphinx_agent")
|
||
|
|
||
|
|
||
|
def format_message(data: Any) -> str:
|
||
|
if dataclasses.is_dataclass(data):
|
||
|
data = dataclasses.asdict(data)
|
||
|
|
||
|
content = json.dumps(data)
|
||
|
content_length = len(content)
|
||
|
|
||
|
return f"Content-Length: {content_length}\r\n\r\n{content}"
|
||
|
|
||
|
|
||
|
def send_error(id: Union[str, int], code: int, message: str, data=None):
|
||
|
send_message(
|
||
|
dict(
|
||
|
id=id,
|
||
|
jsonrpc="2.0",
|
||
|
error=dict(code=code, message=message, data=data),
|
||
|
)
|
||
|
)
|
||
|
|
||
|
|
||
|
def send_message(data: Any):
|
||
|
content = format_message(data).encode("utf8")
|
||
|
sys.stdout.buffer.write(content)
|
||
|
sys.stdout.flush()
|