|
10 | 10 |
|
11 | 11 | use clap::Parser; |
12 | 12 | use std::{error::Error, path::PathBuf}; |
13 | | -use tracing::{debug, error, info, warn}; |
| 13 | +use tracing::info; |
14 | 14 | use tracing_subscriber::EnvFilter; |
15 | 15 |
|
16 | 16 | use loro_websocket_server::protocol::CrdtType; |
17 | | -use loro_websocket_server::{serve_incoming_with_config, ServerConfig}; |
| 17 | +use loro_websocket_server::{ |
| 18 | + serve_incoming_with_config, LoadDocArgs, LoadedDoc, SaveDocArgs, ServerConfig, |
| 19 | +}; |
18 | 20 | use tokio::net::TcpListener; |
19 | 21 |
|
20 | 22 | #[derive(Parser, Debug)] |
@@ -72,37 +74,53 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> { |
72 | 74 |
|
73 | 75 | // Wire persistence hooks |
74 | 76 | let db_for_load = db_path.clone(); |
75 | | - type LoadFut = std::pin::Pin< |
76 | | - Box<dyn std::future::Future<Output = Result<Option<Vec<u8>>, String>> + Send>, |
77 | | - >; |
| 77 | + type LoadFut = |
| 78 | + std::pin::Pin<Box<dyn std::future::Future<Output = Result<LoadedDoc<()>, String>> + Send>>; |
78 | 79 | type SaveFut = std::pin::Pin<Box<dyn std::future::Future<Output = Result<(), String>> + Send>>; |
79 | 80 |
|
80 | | - let on_load = std::sync::Arc::new(move |workspace: String, room: String, crdt: CrdtType| { |
| 81 | + let on_load = std::sync::Arc::new(move |args: LoadDocArgs| { |
81 | 82 | let db_path = db_for_load.clone(); |
82 | 83 | let fut = async move { |
83 | | - tokio::task::spawn_blocking(move || load_snapshot(&db_path, &workspace, &room, crdt)) |
84 | | - .await |
85 | | - .map_err(|e| format!("task join error: {e}"))? |
| 84 | + let LoadDocArgs { |
| 85 | + workspace, |
| 86 | + room, |
| 87 | + crdt, |
| 88 | + } = args; |
| 89 | + let snapshot = tokio::task::spawn_blocking(move || { |
| 90 | + load_snapshot(&db_path, &workspace, &room, crdt) |
| 91 | + }) |
| 92 | + .await |
| 93 | + .map_err(|e| format!("task join error: {e}"))?; |
| 94 | + let snapshot = snapshot?; |
| 95 | + Ok(LoadedDoc { |
| 96 | + snapshot, |
| 97 | + ctx: None, |
| 98 | + }) |
86 | 99 | }; |
87 | 100 | let fut: LoadFut = Box::pin(fut); |
88 | 101 | fut |
89 | 102 | }); |
90 | 103 |
|
91 | 104 | let db_for_save = db_path.clone(); |
92 | | - let on_save = std::sync::Arc::new( |
93 | | - move |workspace: String, room: String, crdt: CrdtType, data: Vec<u8>| { |
94 | | - let db_path = db_for_save.clone(); |
95 | | - let fut = async move { |
96 | | - tokio::task::spawn_blocking(move || { |
97 | | - save_snapshot(&db_path, &workspace, &room, crdt, &data) |
98 | | - }) |
99 | | - .await |
100 | | - .map_err(|e| format!("task join error: {e}"))? |
101 | | - }; |
102 | | - let fut: SaveFut = Box::pin(fut); |
103 | | - fut |
104 | | - }, |
105 | | - ); |
| 105 | + let on_save = std::sync::Arc::new(move |args: SaveDocArgs<()>| { |
| 106 | + let db_path = db_for_save.clone(); |
| 107 | + let fut = async move { |
| 108 | + let SaveDocArgs { |
| 109 | + workspace, |
| 110 | + room, |
| 111 | + crdt, |
| 112 | + data, |
| 113 | + .. |
| 114 | + } = args; |
| 115 | + tokio::task::spawn_blocking(move || { |
| 116 | + save_snapshot(&db_path, &workspace, &room, crdt, &data) |
| 117 | + }) |
| 118 | + .await |
| 119 | + .map_err(|e| format!("task join error: {e}"))? |
| 120 | + }; |
| 121 | + let fut: SaveFut = Box::pin(fut); |
| 122 | + fut |
| 123 | + }); |
106 | 124 |
|
107 | 125 | let cfg = ServerConfig { |
108 | 126 | on_load_document: Some(on_load), |
|
0 commit comments