aboutsummaryrefslogtreecommitdiffstats
path: root/adenosine-pds/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'adenosine-pds/src/lib.rs')
-rw-r--r--adenosine-pds/src/lib.rs71
1 files changed, 21 insertions, 50 deletions
diff --git a/adenosine-pds/src/lib.rs b/adenosine-pds/src/lib.rs
index 1785640..a8dc46a 100644
--- a/adenosine-pds/src/lib.rs
+++ b/adenosine-pds/src/lib.rs
@@ -1,23 +1,29 @@
use anyhow::Result;
use log::{error, info};
use rouille::{router, Request, Response};
+use std::path::PathBuf;
+use std::sync::Mutex;
-use futures::TryStreamExt;
use ipfs_sqlite_block_store::BlockStore;
-use iroh_car::CarReader;
-use libipld::block::Block;
-use std::path::PathBuf;
-use tokio::fs::File;
-use tokio::io::BufReader;
+mod car;
+mod db;
+mod models;
mod mst;
+pub use car::{load_car_to_blockstore, load_car_to_sqlite};
+pub use db::AtpDatabase;
+pub use models::*;
pub use mst::{dump_mst_keys, repro_mst};
-pub fn run_server(port: u16) -> Result<()> {
- // TODO: log access requests
+pub fn run_server(port: u16, blockstore_db_path: &PathBuf, atp_db_path: &PathBuf) -> Result<()> {
// TODO: some static files? https://github.com/tomaka/rouille/blob/master/examples/static-files.rs
+ // TODO: could just open connection on every request?
+ let db = Mutex::new(AtpDatabase::open(atp_db_path)?);
+ let mut _blockstore: BlockStore<libipld::DefaultParams> =
+ BlockStore::open(blockstore_db_path, Default::default())?;
+
let log_ok = |req: &Request, _resp: &Response, elap: std::time::Duration| {
info!("{} {} ({:?})", req.method(), req.raw_url(), elap);
};
@@ -43,50 +49,15 @@ pub fn run_server(port: u16) -> Result<()> {
Response::text("didn't get other thing")
// TODO: parse and echo back JSON body
},
+
+ (GET) ["/xrpc/com.atproto.getRecord"] => {
+ // TODO: JSON response
+ // TODO: handle error
+ let mut db = db.lock().unwrap().new_connection().unwrap();
+ Response::text(db.get_record("asdf", "123", "blah").unwrap().to_string())
+ },
_ => rouille::Response::empty_404()
)
})
});
}
-
-pub fn load_car_to_sqlite(db_path: &PathBuf, car_path: &PathBuf) -> Result<()> {
- let mut db: BlockStore<libipld::DefaultParams> =
- { BlockStore::open(db_path, Default::default())? };
-
- load_car_to_blockstore(&mut db, car_path)
-}
-
-pub fn load_car_to_blockstore(db: &mut BlockStore<libipld::DefaultParams>, car_path: &PathBuf) -> Result<()> {
- let rt = tokio::runtime::Builder::new_current_thread()
- .enable_all()
- .build()?;
- rt.block_on(inner_car_loader(db, car_path))
-}
-
-// this async function is wrapped in the sync version above
-async fn inner_car_loader(db: &mut BlockStore<libipld::DefaultParams>, car_path: &PathBuf) -> Result<()> {
- println!("{} - {}", std::env::current_dir()?.display(), car_path.display());
- let car_reader = {
- let file = File::open(car_path).await?;
- let buf_reader = BufReader::new(file);
- CarReader::new(buf_reader).await?
- };
- let car_header = car_reader.header().clone();
-
- car_reader
- .stream()
- .try_for_each(|(cid, raw)| {
- // TODO: error handling here instead of unwrap (?)
- let block = Block::new(cid, raw).unwrap();
- db.put_block(block, None).unwrap();
- futures::future::ready(Ok(()))
- })
- .await?;
-
- // pin the header
- if car_header.roots().len() >= 1 {
- db.alias(b"import".to_vec(), Some(&car_header.roots()[0]))?;
- }
-
- Ok(())
-}