from __future__ import annotations

import time
import uuid

PROTOCOL_VERSION = 1
JSON_CT = 'application/json'

def request_envelope(method: str, params: dict | None = None, *, source: str, target: str) -> dict:
  return {
    'sl': PROTOCOL_VERSION,
    'id': uuid.uuid4().hex,
    'kind': 'request',
    'method': method,
    'source': source,
    'target': target,
    'params': dict(params or {}),
    'meta': {'ts': time.time()},
  }

def unwrap_response(data: dict):
  if data.get('kind') == 'response':
    if data.get('ok') is True:
      return data.get('result')
    error = data.get('error') if isinstance(data.get('error'), dict) else {}
    code = error.get('code', 'remote_error')
    message = error.get('message', 'remote error')
    raise RuntimeError(f'{code}: {message}')
  if data.get('ok') is False and data.get('error'):
    raise RuntimeError(str(data.get('error')))
  return data
