use std::{ collections::BTreeMap, io::Write, net::{Shutdown, TcpListener, TcpStream}, sync::{Arc, Mutex}, thread, time::Duration, }; use super::{ http_surface::{ HttpRequest, dispatch_json_request, dispatch_xml_request, handle_rpc_http_request, }, websocket_session::flush_websocket_session_queue_shared, websocket_surface::{ flush_websocket_session_queue, handle_websocket_rpc_frame, process_websocket_session_frames, read_websocket_frame, serve_upgraded_websocket_session, websocket_frame_from_bytes, websocket_frame_to_bytes, }, *, }; use crate::{ InProcessRpcDispatcher, JsonRpcRequest, RpcMeta, RpcMethod, RpcNotificationEvent, RpcNotificationKind, RpcValue, RpcWebSocketFrame, WebSocketSessionRegistry, XmlRpcMethodCall, XmlRpcParam, XmlRpcValue, jsonrpc::JsonRpcId, }; mod http_surface; mod websocket_dispatch; mod websocket_handshake; mod websocket_session; #[doc(hidden)] fn masked_text_frame_bytes(text: &str) -> Vec { let payload = text.as_bytes(); let mask = [0x11, 0x22, 0x33, 0x44]; let masked_payload = payload .iter() .enumerate() .map(|(index, byte)| byte ^ mask[index % mask.len()]) .collect::>(); let payload_len = u8::try_from(payload.len()).expect("test websocket payload should fit in a short frame"); let mut frame = vec![0x81, 0x80 | payload_len]; frame.extend_from_slice(&mask); frame.extend_from_slice(&masked_payload); frame }