use std::{
ops::DerefMut,
str::FromStr,
sync::{Arc, Mutex},
thread,
};
use anyhow::Context;
use orchestra_toolkit::*;
const STEP: usize = 100_000;
fn sync_world(session: Session, outlet: Entity, auth: Token) {
let len = Arc::new(Mutex::new(STEP));
loop {
let l1 = len.clone();
let s1 = session.clone();
let res = session
.adapt_outlet(
outlet,
auth,
Box::new(|args: AdapterArgs| sync_callback_ok(s1, args, l1)),
)
.call();
match res {
Ok(_) => println!(" sync adapt returned, no error"),
Err(e) => println!(" sync adapt returned with error {e}"),
}
}
}
fn sync_callback_ok(
_session: Session,
_args: AdapterArgs,
len: Arc<Mutex<usize>>,
) -> Result<Value, AvesterraError> {
let mut l = len.lock();
let l = l.as_mut().unwrap().deref_mut();
let str = include_str!("../big_file.txt");
let res = Value::Text(str.to_string());
*l += STEP;
Ok(res)
}
fn main() -> anyhow::Result<()> {
dotenv::dotenv().ok();
let mut config = SessionConfig::default();
if let Ok(host) = std::env::var("AVESTERRA_HOST") {
config.address = host;
}
if let Ok(port_str) = std::env::var("AVESTERRA_PORT") {
config.port = u16::from_str(&port_str).context("Parsing `AVESTERRA_PORT`")?;
}
if let Ok(cert_dir_path) = std::env::var("AVESTERRA_CERTIFICATE_DIR_PATH") {
config.pem_filepath = (cert_dir_path + "/avesterra.pem").try_into()?;
}
let auth = if let Ok(auth_str) = std::env::var("AVESTERRA_AUTH") {
Token::from_str(&auth_str).context("Parsing authorization token given from env")?
} else {
Token::NULL
};
let session = Session::initialize(config)?;
let outlet = session
.create_outlet(String255::unchecked("Test outlet"), auth)
.call()?;
session.connect_method(outlet, outlet, auth).call()?;
let s1 = session.clone();
let s3 = session.clone();
let t1 = thread::spawn(move || sync_world(s1, outlet, auth));
let t3 = thread::spawn(move || loop {
let res = s3.invoke_entity(outlet, Method::Null, auth).call();
let expected = include_str!("../big_file.txt");
let actual = res.unwrap().text().unwrap();
println!(
"received len {}, expected len {}",
actual.len(),
expected.len()
);
assert_eq!(actual, expected);
println!("ok equal");
});
t1.join().unwrap();
t3.join().unwrap();
session.finalize();
Ok(())
}