jsonrpc.rs 5.3 KB

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