|
|
@ -6,8 +6,7 @@ use serde_json::Value;
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::sync::Arc;
|
|
|
|
use std::sync::Arc;
|
|
|
|
use tokio::{
|
|
|
|
use tokio::{
|
|
|
|
io::{AsyncBufRead, AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader, BufWriter},
|
|
|
|
io::{AsyncBufRead, AsyncBufReadExt, AsyncReadExt, AsyncWrite, AsyncWriteExt},
|
|
|
|
process::{ChildStdin, ChildStdout},
|
|
|
|
|
|
|
|
sync::{
|
|
|
|
sync::{
|
|
|
|
mpsc::{unbounded_channel, Sender, UnboundedReceiver, UnboundedSender},
|
|
|
|
mpsc::{unbounded_channel, Sender, UnboundedReceiver, UnboundedSender},
|
|
|
|
Mutex,
|
|
|
|
Mutex,
|
|
|
@ -65,8 +64,8 @@ pub struct Transport {
|
|
|
|
|
|
|
|
|
|
|
|
impl Transport {
|
|
|
|
impl Transport {
|
|
|
|
pub fn start(
|
|
|
|
pub fn start(
|
|
|
|
server_stdout: BufReader<ChildStdout>,
|
|
|
|
server_stdout: Box<dyn AsyncBufRead + Unpin + Send>,
|
|
|
|
server_stdin: BufWriter<ChildStdin>,
|
|
|
|
server_stdin: Box<dyn AsyncWrite + Unpin + Send>,
|
|
|
|
id: usize,
|
|
|
|
id: usize,
|
|
|
|
) -> (UnboundedReceiver<Payload>, UnboundedSender<Request>) {
|
|
|
|
) -> (UnboundedReceiver<Payload>, UnboundedSender<Request>) {
|
|
|
|
let (client_tx, rx) = unbounded_channel();
|
|
|
|
let (client_tx, rx) = unbounded_channel();
|
|
|
@ -86,7 +85,7 @@ impl Transport {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async fn recv_server_message(
|
|
|
|
async fn recv_server_message(
|
|
|
|
reader: &mut (impl AsyncBufRead + Unpin + Send),
|
|
|
|
reader: &mut Box<dyn AsyncBufRead + Unpin + Send>,
|
|
|
|
buffer: &mut String,
|
|
|
|
buffer: &mut String,
|
|
|
|
) -> Result<Payload> {
|
|
|
|
) -> Result<Payload> {
|
|
|
|
let mut content_length = None;
|
|
|
|
let mut content_length = None;
|
|
|
@ -133,7 +132,7 @@ impl Transport {
|
|
|
|
|
|
|
|
|
|
|
|
async fn send_payload_to_server(
|
|
|
|
async fn send_payload_to_server(
|
|
|
|
&self,
|
|
|
|
&self,
|
|
|
|
server_stdin: &mut BufWriter<ChildStdin>,
|
|
|
|
server_stdin: &mut Box<dyn AsyncWrite + Unpin + Send>,
|
|
|
|
req: Request,
|
|
|
|
req: Request,
|
|
|
|
) -> Result<()> {
|
|
|
|
) -> Result<()> {
|
|
|
|
let json = serde_json::to_string(&req)?;
|
|
|
|
let json = serde_json::to_string(&req)?;
|
|
|
@ -145,7 +144,7 @@ impl Transport {
|
|
|
|
|
|
|
|
|
|
|
|
async fn send_string_to_server(
|
|
|
|
async fn send_string_to_server(
|
|
|
|
&self,
|
|
|
|
&self,
|
|
|
|
server_stdin: &mut BufWriter<ChildStdin>,
|
|
|
|
server_stdin: &mut Box<dyn AsyncWrite + Unpin + Send>,
|
|
|
|
request: String,
|
|
|
|
request: String,
|
|
|
|
) -> Result<()> {
|
|
|
|
) -> Result<()> {
|
|
|
|
info!("-> DAP {}", request);
|
|
|
|
info!("-> DAP {}", request);
|
|
|
@ -237,7 +236,7 @@ impl Transport {
|
|
|
|
|
|
|
|
|
|
|
|
async fn recv(
|
|
|
|
async fn recv(
|
|
|
|
transport: Arc<Self>,
|
|
|
|
transport: Arc<Self>,
|
|
|
|
mut server_stdout: BufReader<ChildStdout>,
|
|
|
|
mut server_stdout: Box<dyn AsyncBufRead + Unpin + Send>,
|
|
|
|
client_tx: UnboundedSender<Payload>,
|
|
|
|
client_tx: UnboundedSender<Payload>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
let mut recv_buffer = String::new();
|
|
|
|
let mut recv_buffer = String::new();
|
|
|
@ -259,7 +258,7 @@ impl Transport {
|
|
|
|
|
|
|
|
|
|
|
|
async fn send(
|
|
|
|
async fn send(
|
|
|
|
transport: Arc<Self>,
|
|
|
|
transport: Arc<Self>,
|
|
|
|
mut server_stdin: BufWriter<ChildStdin>,
|
|
|
|
mut server_stdin: Box<dyn AsyncWrite + Unpin + Send>,
|
|
|
|
mut client_rx: UnboundedReceiver<Request>,
|
|
|
|
mut client_rx: UnboundedReceiver<Request>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
while let Some(req) = client_rx.recv().await {
|
|
|
|
while let Some(req) = client_rx.recv().await {
|
|
|
|