(options_json: Option<String>)
| 135 | } |
| 136 | |
| 137 | fn parse_options(options_json: Option<String>) -> Result<WsOptions> { |
| 138 | let Some(options_json) = options_json else { |
| 139 | return Ok(WsOptions::default()); |
| 140 | }; |
| 141 | if options_json.trim().is_empty() { |
| 142 | return Ok(WsOptions::default()); |
| 143 | } |
| 144 | let parsed: Value = serde_json::from_str(&options_json) |
| 145 | .map_err(|err| napi_error(format!("invalid websocket options json: {err}")))?; |
| 146 | let Some(object) = parsed.as_object() else { |
| 147 | return Err(napi_error("websocket options json must be an object")); |
| 148 | }; |
| 149 | let options = Value::Object(object.clone()); |
| 150 | let ping_interval = duration_from_options_ms( |
| 151 | &options, |
| 152 | "pingIntervalMs", |
| 153 | "ping_interval_ms", |
| 154 | DEFAULT_PING_INTERVAL, |
| 155 | ); |
| 156 | let ping_timeout = duration_from_options_ms( |
| 157 | &options, |
| 158 | "pingTimeoutMs", |
| 159 | "ping_timeout_ms", |
| 160 | DEFAULT_PING_TIMEOUT, |
| 161 | ) |
| 162 | .max(ping_interval.saturating_mul(2)); |
| 163 | let read_timeout = duration_from_options_ms( |
| 164 | &options, |
| 165 | "readTimeoutMs", |
| 166 | "read_timeout_ms", |
| 167 | DEFAULT_READ_TIMEOUT, |
| 168 | ); |
| 169 | Ok(WsOptions { |
| 170 | ping_interval, |
| 171 | ping_timeout, |
| 172 | read_timeout, |
| 173 | }) |
| 174 | } |
| 175 | |
| 176 | async fn request_ws_command( |
| 177 | session: &Session, |
no test coverage detected