Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/cli/src/tunnels/server_bridge.rs
3314 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
use super::socket_signal::{ClientMessageDecoder, ServerMessageSink};
6
use crate::{
7
async_pipe::{get_socket_rw_stream, socket_stream_split, AsyncPipeWriteHalf},
8
util::errors::AnyError,
9
};
10
use std::path::Path;
11
use tokio::io::{AsyncReadExt, AsyncWriteExt};
12
13
pub struct ServerBridge {
14
write: AsyncPipeWriteHalf,
15
decoder: ClientMessageDecoder,
16
}
17
18
const BUFFER_SIZE: usize = 65536;
19
20
impl ServerBridge {
21
pub async fn new(
22
path: &Path,
23
mut target: ServerMessageSink,
24
decoder: ClientMessageDecoder,
25
) -> Result<Self, AnyError> {
26
let stream = get_socket_rw_stream(path).await?;
27
let (mut read, write) = socket_stream_split(stream);
28
29
tokio::spawn(async move {
30
let mut read_buf = vec![0; BUFFER_SIZE];
31
loop {
32
match read.read(&mut read_buf).await {
33
Err(_) => return,
34
Ok(0) => {
35
let _ = target.server_closed().await;
36
return; // EOF
37
}
38
Ok(s) => {
39
let send = target.server_message(&read_buf[..s]).await;
40
if send.is_err() {
41
return;
42
}
43
}
44
}
45
}
46
});
47
48
Ok(ServerBridge { write, decoder })
49
}
50
51
pub async fn write(&mut self, b: Vec<u8>) -> std::io::Result<()> {
52
let dec = self.decoder.decode(&b)?;
53
if !dec.is_empty() {
54
self.write.write_all(dec).await?;
55
}
56
Ok(())
57
}
58
59
pub async fn close(mut self) -> std::io::Result<()> {
60
self.write.shutdown().await?;
61
Ok(())
62
}
63
}
64
65