import ast
import contextlib
import io
import json
import sys
import traceback
import uuid
from pathlib import Path
from typing import Dict, List, Optional, Union
STDIN = sys.stdin
STDOUT = sys.stdout
STDERR = sys.stderr
USER_GLOBALS = {}
def _send_message(msg: str):
# Content-Length is the data size in bytes.
length_msg = len(msg.encode())
STDOUT.buffer.write(f"Content-Length: {length_msg}\r\n\r\n{msg}".encode())
STDOUT.buffer.flush()
def send_message(**kwargs):
_send_message(json.dumps({"jsonrpc": "2.0", **kwargs}))
def print_log(msg: str):
send_message(method="log", params=msg)
def send_response(
response: str,
response_id: int,
execution_status: bool = True, # noqa: FBT001, FBT002
):
send_message(
id=response_id,
result={"status": execution_status, "output": response},
)
def send_request(params: Optional[Union[List, Dict]] = None):
request_id = uuid.uuid4().hex
if params is None:
send_message(id=request_id, method="input")
else:
send_message(id=request_id, method="input", params=params)
return request_id
original_input = input
def custom_input(prompt=""):
try:
send_request({"prompt": prompt})
headers = get_headers()
# Content-Length is the data size in bytes.
content_length = int(headers.get("Content-Length", 0))
if content_length:
message_text = STDIN.buffer.read(content_length).decode()
message_json = json.loads(message_text)
return message_json["result"]["userInput"]
except EOFError:
# Input stream closed, exit gracefully
sys.exit(0)
except Exception:
print_log(traceback.format_exc())
# Set input to our custom input
USER_GLOBALS["input"] = custom_input
input = custom_input # noqa: A001
def handle_response(request_id):
while True:
try:
headers = get_headers()
# Content-Length is the data size in bytes.
content_length = int(headers.get("Content-Length", 0))
if content_length:
message_text = STDIN.buffer.read(content_length).decode()
message_json = json.loads(message_text)
our_user_input = message_json["result"]["userInput"]
if message_json["id"] == request_id:
send_response(our_user_input, message_json["id"])
elif message_json["method"] == "exit":
sys.exit(0)
except EOFError: # noqa: PERF203
# Input stream closed, exit gracefully
sys.exit(0)
except Exception:
print_log(traceback.format_exc())
def exec_function(user_input):
try:
compile(user_input, "