changeset 698: | 96958d3eb5b0 |
parent: | 94d358919982 |
author: | Richard Westhaver <ellis@rwest.io> |
date: | Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: | -rw-r--r-- |
description: | fixes |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
1 | /// app/cli/alik/lib.rs --- Alik Lib |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
2 | |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
3 | // Helper of man |
167 | 4 | |
189 | 5 | /// Code: |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
6 | pub mod graphql; |
268
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
7 | pub mod http; |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
8 | pub mod ping; |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
9 | pub mod udp; |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
10 | |
268
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
11 | use db::{rocksdb, Db, DbConfigExt}; |
189 | 12 | use net::{ |
13 | axum::{ |
|
14 | body::{Body, Bytes}, |
|
15 | extract::State, |
|
16 | http::{HeaderMap, HeaderName, HeaderValue, StatusCode}, |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
17 | response::{IntoResponse, Response}, |
189 | 18 | routing::get, |
19 | Router, |
|
20 | }, |
|
268
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
21 | http::tower::trace::TraceLayer, |
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
22 | reqwest::Client, |
189 | 23 | }; |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
24 | |
213 | 25 | use serde::{Deserialize, Serialize}; |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
26 | |
213 | 27 | use std::{ |
28 | collections::HashMap, |
|
29 | fs, |
|
30 | path::{Path, PathBuf}, |
|
268
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
31 | sync::Arc, |
213 | 32 | }; |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
33 | |
213 | 34 | pub use krypt::KryptConfig; |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
35 | |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
36 | use logger::{info, log, tracing::Span}; |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
37 | |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
38 | use obj::{Configure, NetworkConfig, Objective}; |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
39 | |
213 | 40 | use std::time::Duration; |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
41 | |
213 | 42 | #[derive(Serialize, Deserialize, Clone, Debug, Default)] |
43 | pub struct AlikConfig { |
|
44 | krypt: KryptConfig, |
|
45 | db_path: Option<PathBuf>, |
|
46 | db_opts: HashMap<String, String>, |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
47 | net: NetworkConfig, |
213 | 48 | } |
49 | impl AlikConfig { |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
50 | pub fn new() -> Self { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
51 | AlikConfig::default() |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
52 | } |
213 | 53 | pub fn load<P: AsRef<Path>>(path: P) -> Result<Self, obj::Error> { |
54 | let s = fs::read_to_string(path)?; |
|
55 | AlikConfig::from_json_str(&s) |
|
56 | } |
|
57 | } |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
58 | |
213 | 59 | obj::impl_config!(AlikConfig); |
60 | ||
61 | impl DbConfigExt for AlikConfig { |
|
62 | fn db_path(self) -> Option<PathBuf> { |
|
63 | self.db_path |
|
64 | } |
|
65 | fn db_user(self) -> Option<String> { |
|
66 | None |
|
67 | } |
|
68 | fn set_db_config_value(&mut self, key: &str, val: &str) -> Option<String> { |
|
69 | self.db_opts.insert(key.to_string(), val.to_string()) |
|
70 | } |
|
71 | fn get_db_config_value(self, key: &str) -> Option<String> { |
|
72 | self.db_opts.get(key).cloned() |
|
73 | } |
|
74 | } |
|
75 | ||
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
76 | pub trait AlikService {} |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
77 | |
213 | 78 | #[derive(Debug)] |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
79 | pub struct Alik { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
80 | db: Option<rocksdb::DB>, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
81 | config: Arc<AlikConfig>, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
82 | router: Option<Router>, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
83 | } |
213 | 84 | |
85 | impl Alik { |
|
86 | pub fn new() -> Alik { |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
87 | Alik { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
88 | db: None, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
89 | config: Arc::new(AlikConfig::new()), |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
90 | router: None, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
91 | } |
213 | 92 | } |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
93 | pub fn with_config(cfg: &AlikConfig) -> Alik { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
94 | Alik { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
95 | db: None, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
96 | config: Arc::new(cfg.to_owned()), |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
97 | router: None, |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
98 | } |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
99 | } |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
100 | pub fn network_init(&mut self) -> Result<(), net::Error> { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
101 | let socket = &self.config.net.socket; |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
102 | let peers = self.config.net.peers.as_ref(); |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
103 | info!("initializing on socket {:?}", socket); |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
104 | info!("initializing with peers {:?}", peers.unwrap()); |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
105 | self.router = Some(Router::new().route("/", get(""))); |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
106 | Ok(()) |
213 | 107 | } |
108 | } |
|
109 | ||
110 | impl Db for Alik { |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
111 | fn db_init(&self) -> Result<rocksdb::DB, db::Error> { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
112 | let path = self.config.db_path.as_ref(); |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
113 | let opts = &self.config.db_opts; |
268
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
114 | info!("{:?}", opts); |
a52d42f30617
rocksdb alien functions and cargo fmt
Richard Westhaver <ellis@rwest.io>
parents:
267
diff
changeset
|
115 | rocksdb::DB::open(&rocksdb::Options::default(), path.unwrap()).unwrap(); |
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
116 | Ok(rocksdb::DB::open_default("").unwrap()) |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
117 | } |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
118 | fn db_init_mut(&mut self) -> Result<(), db::Error> { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
119 | self.db = Some(self.db_init().unwrap()); |
213 | 120 | Ok(()) |
121 | } |
|
122 | fn db_open(&self) -> Result<(), db::Error> { |
|
123 | Ok(()) |
|
124 | } |
|
125 | fn db_close(&self) -> Result<(), db::Error> { |
|
267
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
126 | if let Some(db) = &self.db { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
127 | db.cancel_all_background_work(true) |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
128 | }; |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
129 | Ok(()) |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
130 | } |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
131 | fn db_close_mut(&mut self) -> Result<(), db::Error> { |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
132 | self.db_close().unwrap(); |
f3d814fb136a
db upgrades, alik, ignoring c files (for now)
Richard Westhaver <ellis@rwest.io>
parents:
238
diff
changeset
|
133 | self.db = None; |
213 | 134 | Ok(()) |
135 | } |
|
136 | fn db_query(&self) -> Result<(), db::Error> { |
|
137 | Ok(()) |
|
138 | } |
|
139 | fn db_transaction(&self) -> Result<(), db::Error> { |
|
140 | Ok(()) |
|
141 | } |
|
142 | } |
|
167 | 143 | |
189 | 144 | /// Server |
167 | 145 | pub async fn proxy_via_reqwest(State(client): State<Client>) -> Response { |
189 | 146 | let reqwest_response = |
213 | 147 | match client.get("https://compiler.company").send().await { |
189 | 148 | Ok(res) => res, |
149 | Err(err) => { |
|
150 | log::error!("{} {}", &err, "request failed"); |
|
151 | return (StatusCode::BAD_REQUEST, Body::empty()).into_response(); |
|
152 | } |
|
167 | 153 | }; |
154 | ||
189 | 155 | let response_builder = |
156 | Response::builder().status(reqwest_response.status().as_u16()); |
|
167 | 157 | |
213 | 158 | // different http crate versions? |
189 | 159 | let mut headers = HeaderMap::with_capacity(reqwest_response.headers().len()); |
160 | headers.extend(reqwest_response.headers().into_iter().map( |
|
161 | |(name, value)| { |
|
162 | let name = HeaderName::from_bytes(name.as_ref()).unwrap(); |
|
163 | let value = HeaderValue::from_bytes(value.as_ref()).unwrap(); |
|
164 | (name, value) |
|
165 | }, |
|
166 | )); |
|
167 | 167 | |
189 | 168 | response_builder |
169 | .body(Body::from_stream(reqwest_response.bytes_stream())) |
|
213 | 170 | // body is empty, no error |
189 | 171 | .unwrap() |
167 | 172 | } |
173 | ||
213 | 174 | pub async fn start_http_proxy(addr: &str) { |
167 | 175 | let client = Client::new(); |
189 | 176 | let app = Router::new() |
177 | .route("/", get(proxy_via_reqwest)) |
|
178 | .layer(TraceLayer::new_for_http().on_body_chunk( |
|
179 | |chunk: &Bytes, _latency: Duration, _span: &Span| { |
|
224 | 180 | log::debug!("streaming {} bytes", chunk.len()); |
189 | 181 | }, |
182 | )) |
|
183 | .with_state(client); |
|
213 | 184 | let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); |
185 | println!( |
|
186 | "http_proxy running on: http://{}", |
|
187 | listener.local_addr().unwrap() |
|
188 | ); |
|
189 | 189 | net::axum::serve(listener, app).await.unwrap(); |
167 | 190 | } |
191 | ||
213 | 192 | // pub async fn stream_some_data() -> Body { |
193 | // let stream = net::stream::iter(0..5) |
|
194 | // .throttle(Duration::from_secs(1)) |
|
195 | // .map(|n| n.to_string()) |
|
196 | // .map(Ok::<_, Infallible>); |
|
197 | // Body::from_stream(stream) |
|
198 | // } |