jsonrpc.rs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. use std::{
  2. net::{TcpStream, ToSocketAddrs},
  3. os::unix::net::UnixStream,
  4. str,
  5. };
  6. use async_std::io::{ReadExt, WriteExt};
  7. use rand::Rng;
  8. use serde::{Deserialize, Serialize};
  9. use serde_json::{json, Value};
  10. use smol::Async;
  11. use crate::Error;
  12. #[derive(Debug, Clone)]
  13. pub enum ErrorCode {
  14. ParseError,
  15. InvalidRequest,
  16. MethodNotFound,
  17. InvalidParams,
  18. InternalError,
  19. KeyGenError,
  20. GetAddressesError,
  21. ImportAndExportFile,
  22. SetDefaultAddress,
  23. InvalidAmountParam,
  24. InvalidNetworkParam,
  25. InvalidTokenIdParam,
  26. InvalidAddressParam,
  27. InvalidSymbolParam,
  28. ServerError(i64),
  29. }
  30. impl ErrorCode {
  31. pub fn code(&self) -> i64 {
  32. match *self {
  33. ErrorCode::ParseError => -32700,
  34. ErrorCode::InvalidRequest => -32600,
  35. ErrorCode::MethodNotFound => -32601,
  36. ErrorCode::InvalidParams => -32602,
  37. ErrorCode::InternalError => -32603,
  38. ErrorCode::KeyGenError => -32002,
  39. ErrorCode::GetAddressesError => -32003,
  40. ErrorCode::ImportAndExportFile => -32004,
  41. ErrorCode::SetDefaultAddress => -32005,
  42. ErrorCode::InvalidAmountParam => -32010,
  43. ErrorCode::InvalidNetworkParam => -32011,
  44. ErrorCode::InvalidTokenIdParam => -32012,
  45. ErrorCode::InvalidAddressParam => -32013,
  46. ErrorCode::InvalidSymbolParam => -32014,
  47. ErrorCode::ServerError(c) => c,
  48. }
  49. }
  50. pub fn description(&self) -> String {
  51. let desc = match *self {
  52. ErrorCode::ParseError => "Parse error",
  53. ErrorCode::InvalidRequest => "Invalid request",
  54. ErrorCode::MethodNotFound => "Method not found",
  55. ErrorCode::InvalidParams => "Invalid params",
  56. ErrorCode::InternalError => "Internal error",
  57. ErrorCode::KeyGenError => "Key gen error",
  58. ErrorCode::GetAddressesError => "get addresses error",
  59. ErrorCode::ImportAndExportFile => "error import/export a file",
  60. ErrorCode::SetDefaultAddress => "error set default address",
  61. ErrorCode::InvalidAmountParam => "Invalid amount param",
  62. ErrorCode::InvalidNetworkParam => "Invalid network param",
  63. ErrorCode::InvalidTokenIdParam => "Invalid token id param",
  64. ErrorCode::InvalidAddressParam => "Invalid address param",
  65. ErrorCode::InvalidSymbolParam => "Invalid symbol param",
  66. ErrorCode::ServerError(_) => "Server error",
  67. };
  68. desc.to_string()
  69. }
  70. }
  71. #[derive(Serialize, Deserialize)]
  72. #[serde(untagged)]
  73. pub enum JsonResult {
  74. Resp(JsonResponse),
  75. Err(JsonError),
  76. Notif(JsonNotification),
  77. }
  78. #[derive(Serialize, Deserialize, Clone, Debug)]
  79. pub struct JsonRequest {
  80. pub jsonrpc: Value,
  81. pub method: Value,
  82. pub params: Value,
  83. pub id: Value,
  84. }
  85. #[derive(Serialize, Deserialize, Clone, Debug)]
  86. pub struct JsonErrorVal {
  87. pub code: Value,
  88. pub message: Value,
  89. }
  90. #[derive(Serialize, Deserialize, Clone, Debug)]
  91. pub struct JsonError {
  92. pub jsonrpc: Value,
  93. pub error: JsonErrorVal,
  94. pub id: Value,
  95. }
  96. #[derive(Serialize, Deserialize, Clone, Debug)]
  97. pub struct JsonResponse {
  98. pub jsonrpc: Value,
  99. pub result: Value,
  100. pub id: Value,
  101. }
  102. #[derive(Serialize, Deserialize, Clone, Debug)]
  103. pub struct JsonNotification {
  104. pub jsonrpc: Value,
  105. pub method: Value,
  106. pub params: Value,
  107. }
  108. pub fn request(m: Value, p: Value) -> JsonRequest {
  109. let mut rng = rand::thread_rng();
  110. JsonRequest { jsonrpc: json!("2.0"), method: m, params: p, id: json!(rng.gen::<u32>()) }
  111. }
  112. pub fn response(r: Value, i: Value) -> JsonResponse {
  113. JsonResponse { jsonrpc: json!("2.0"), result: r, id: i }
  114. }
  115. pub fn error(c: ErrorCode, m: Option<String>, i: Value) -> JsonError {
  116. let ev = JsonErrorVal {
  117. code: json!(c.code()),
  118. message: if m.is_none() { json!(c.description()) } else { json!(Some(m)) },
  119. };
  120. JsonError { jsonrpc: json!("2.0"), error: ev, id: i }
  121. }
  122. pub fn notification(m: Value, p: Value) -> JsonNotification {
  123. JsonNotification { jsonrpc: json!("2.0"), method: m, params: p }
  124. }
  125. pub async fn send_raw_request(url: &str, data: Value) -> Result<JsonResult, Error> {
  126. let use_tls: bool;
  127. let parsed_url = url::Url::parse(url)?;
  128. match parsed_url.scheme() {
  129. "tcp" => use_tls = false,
  130. "tls" => use_tls = true,
  131. scheme => {
  132. return Err(Error::UrlParseError(format!(
  133. "Invalid scheme `{}` found in `{}`",
  134. scheme, parsed_url
  135. )))
  136. }
  137. }
  138. let host = parsed_url
  139. .host()
  140. .ok_or_else(|| Error::UrlParseError(format!("Missing host in {}", url)))?
  141. .to_string();
  142. let port = parsed_url
  143. .port()
  144. .ok_or_else(|| Error::UrlParseError(format!("Missing port in {}", url)))?;
  145. let socket_addr = {
  146. let host = host.clone();
  147. smol::unblock(move || (host.as_str(), port).to_socket_addrs())
  148. .await?
  149. .next()
  150. .ok_or(Error::NoUrlFound)?
  151. };
  152. let mut buf = [0; 2048];
  153. let bytes_read: usize;
  154. let data_str = serde_json::to_string(&data)?;
  155. let mut stream = Async::<TcpStream>::connect(socket_addr).await?;
  156. if use_tls {
  157. let mut stream = async_native_tls::connect(&host, stream).await?;
  158. stream.write_all(data_str.as_bytes()).await?;
  159. bytes_read = stream.read(&mut buf[..]).await?;
  160. } else {
  161. stream.write_all(data_str.as_bytes()).await?;
  162. bytes_read = stream.read(&mut buf[..]).await?;
  163. }
  164. let reply: JsonResult = serde_json::from_slice(&buf[0..bytes_read])?;
  165. Ok(reply)
  166. }
  167. pub async fn send_unix_request(path: &str, data: Value) -> Result<JsonResult, Error> {
  168. let mut buf = [0; 2048];
  169. let data_str = serde_json::to_string(&data)?;
  170. let mut stream = Async::<UnixStream>::connect(path).await?;
  171. stream.write_all(data_str.as_bytes()).await?;
  172. let bytes_read: usize = stream.read(&mut buf[..]).await?;
  173. let reply: JsonResult = serde_json::from_slice(&buf[0..bytes_read])?;
  174. Ok(reply)
  175. }