MCPcopy Create free account
hub / github.com/NativeScript/SimDeck / proxy_websocket_inner

Function proxy_websocket_inner

packages/server/src/devtools.rs:347–398  ·  view source on GitHub ↗
(socket: WebSocket, upstream_url: String)

Source from the content-addressed store, hash-verified

345}
346
347async fn proxy_websocket_inner(socket: WebSocket, upstream_url: String) -> Result<(), String> {
348 let mut request = upstream_url
349 .as_str()
350 .into_client_request()
351 .map_err(|error| format!("Invalid DevTools upstream URL: {error}"))?;
352 // Metro's React Native dev-middleware rejects inspector WebSocket upgrades
353 // whose Origin does not match the dev server itself (HTTP 401). Present the
354 // upstream's own origin so the proxied connection is accepted.
355 if let Some(origin) = upstream_websocket_origin(&upstream_url) {
356 if let Ok(value) = HeaderValue::from_str(&origin) {
357 request.headers_mut().insert(header::ORIGIN, value);
358 }
359 }
360 let (upstream, _) = tokio_tungstenite::connect_async(request)
361 .await
362 .map_err(|error| format!("Unable to connect to DevTools socket: {error}"))?;
363 let (mut downstream_writer, mut downstream_reader) = socket.split();
364 let (mut upstream_writer, mut upstream_reader) = upstream.split();
365
366 loop {
367 tokio::select! {
368 downstream = downstream_reader.next() => {
369 let Some(message) = downstream else {
370 break;
371 };
372 let message = message.map_err(|error| format!("Browser WebSocket error: {error}"))?;
373 let Some(message) = to_upstream_message(message) else {
374 break;
375 };
376 upstream_writer
377 .send(message)
378 .await
379 .map_err(|error| format!("Unable to forward browser message to DevTools: {error}"))?;
380 }
381 upstream = upstream_reader.next() => {
382 let Some(message) = upstream else {
383 break;
384 };
385 let message = message.map_err(|error| format!("DevTools WebSocket error: {error}"))?;
386 let Some(message) = to_downstream_message(message) else {
387 break;
388 };
389 downstream_writer
390 .send(message)
391 .await
392 .map_err(|error| format!("Unable to forward DevTools message to browser: {error}"))?;
393 }
394 }
395 }
396
397 Ok(())
398}
399
400fn upstream_websocket_origin(url: &str) -> Option<String> {
401 let (scheme, rest) = url

Callers 1

proxy_websocketFunction · 0.85

Calls 3

insertMethod · 0.80
as_strMethod · 0.45

Tested by

no test coverage detected