requestBody = @file_get_contents('php://input'); $this->requestedFile = dirname(__DIR__) . "/" . $_SERVER["REQUEST_URI"]; $this->URI = $_SERVER["REQUEST_URI"]; } public function handleRequest(): void { @session_start(); try { if (str_starts_with($this->URI, "/assets") or str_starts_with($this->URI, "/plugins") and str_ends_with($this->URI, ".js")) { $this->handleAsset(); } elseif (!str_starts_with($this->URI, "/rpc")) { $this->redirect("/assets/index.html"); } else { $this->handleJRPC(); } } finally { session_write_close(); } } private function handleJRPC(): void { try { $request = @json_decode($this->requestBody, true); if ($request === null) { throw new RuntimeException("Failed to parse JRPC"); } foreach (["id", "jsonrpc", "method", "params"] as $param) { if (!isset($request[$param])) { throw new RuntimeException("Bad JRPC structure"); } } $rpc = new RPC(); $response = $rpc($request["method"], $request["params"]); header("content-type: application/json"); echo json_encode([ "jsonrpc" => "2.0", "id" => $request["id"] ?? 0, "result" => $response ]); } catch (Throwable $e) { http_response_code(500); echo json_encode([ "jsonrpc" => "2.0", "id" => $request["id"], "error" => $e->getMessage() ]); } } private function handleAsset(): void { if (!file_exists($this->requestedFile)) { http_response_code(404); echo "File not found: " . $this->URI; } else { header("content-type: " . mime_content_type($this->requestedFile)); echo file_get_contents($this->requestedFile); } } private function redirect($where): void { http_response_code(302); header("location: " . $where); } }