(
writer: &mut W,
selector: &str,
args: Dictionary,
)
| 969 | } |
| 970 | |
| 971 | async fn send_rpc<W: AsyncWrite + Unpin>( |
| 972 | writer: &mut W, |
| 973 | selector: &str, |
| 974 | args: Dictionary, |
| 975 | ) -> Result<(), AppError> { |
| 976 | let mut message = Dictionary::new(); |
| 977 | message.insert("__selector".to_owned(), Value::String(selector.to_owned())); |
| 978 | message.insert("__argument".to_owned(), Value::Dictionary(args)); |
| 979 | |
| 980 | let mut payload = Vec::new(); |
| 981 | plist::to_writer_binary(&mut payload, &Value::Dictionary(message)) |
| 982 | .map_err(|error| AppError::internal(format!("Unable to encode WebKit plist: {error}")))?; |
| 983 | if payload.len() > WEBKIT_PACKET_MAX_LEN { |
| 984 | return Err(AppError::internal("WebKit plist packet is too large.")); |
| 985 | } |
| 986 | |
| 987 | let mut packet = Vec::with_capacity(payload.len() + 4); |
| 988 | packet.extend_from_slice(&(payload.len() as u32).to_be_bytes()); |
| 989 | packet.extend_from_slice(&payload); |
| 990 | writer |
| 991 | .write_all(&packet) |
| 992 | .await |
| 993 | .map_err(|error| AppError::native(format!("Unable to write WebKit packet: {error}")))?; |
| 994 | Ok(()) |
| 995 | } |
| 996 | |
| 997 | async fn read_packet<R: AsyncRead + Unpin>(reader: &mut R) -> Result<Vec<u8>, AppError> { |
| 998 | let mut header = [0u8; 4]; |
no test coverage detected