mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
feat: wasm build (#4412)
* chore: enable wasm build * chore: bump collab * chore: fix build * chore: flowy-document wasm * chore: fix compile * chore: fix compile * chore: fix compile * chore: fix compile * chore: fix ci * chore: fix ci * chore: fix ci
This commit is contained in:
@ -4,6 +4,8 @@ version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[lib]
|
||||
crate-type = ["cdylib", "rlib"]
|
||||
|
||||
[dependencies]
|
||||
collab = { version = "0.1.0" }
|
||||
@ -20,4 +22,4 @@ lib-infra = { workspace = true }
|
||||
|
||||
[features]
|
||||
default = []
|
||||
wasm_build = []
|
||||
wasm_build = ["collab-plugins/wasm_build"]
|
@ -1,20 +1,27 @@
|
||||
use std::fmt::{Debug, Display};
|
||||
use std::sync::{Arc, Weak};
|
||||
|
||||
use crate::CollabKVDB;
|
||||
use anyhow::Error;
|
||||
use collab::core::collab::{CollabDocState, MutexCollab};
|
||||
use collab::preclude::{CollabBuilder, CollabPlugin};
|
||||
use collab_entity::{CollabObject, CollabType};
|
||||
use collab_plugins::connect_state::{CollabConnectReachability, CollabConnectState};
|
||||
use collab_plugins::local_storage::kv::snapshot::SnapshotPersistence;
|
||||
if_native! {
|
||||
use collab_plugins::local_storage::rocksdb::rocksdb_plugin::{RocksdbBackup, RocksdbDiskPlugin};
|
||||
}
|
||||
|
||||
if_wasm! {
|
||||
use collab_plugins::local_storage::indexeddb::IndexeddbDiskPlugin;
|
||||
}
|
||||
|
||||
use collab_plugins::local_storage::CollabPersistenceConfig;
|
||||
use lib_infra::future::Fut;
|
||||
use lib_infra::{if_native, if_wasm};
|
||||
use parking_lot::{Mutex, RwLock};
|
||||
use tracing::trace;
|
||||
|
||||
use crate::CollabKVDB;
|
||||
use lib_infra::future::Fut;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum CollabPluginProviderType {
|
||||
Local,
|
||||
@ -87,6 +94,7 @@ pub struct AppFlowyCollabBuilder {
|
||||
workspace_id: RwLock<Option<String>>,
|
||||
plugin_provider: tokio::sync::RwLock<Arc<dyn CollabCloudPluginProvider>>,
|
||||
snapshot_persistence: Mutex<Option<Arc<dyn SnapshotPersistence>>>,
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
rocksdb_backup: Mutex<Option<Arc<dyn RocksdbBackup>>>,
|
||||
device_id: String,
|
||||
}
|
||||
@ -115,6 +123,7 @@ impl AppFlowyCollabBuilder {
|
||||
workspace_id: Default::default(),
|
||||
plugin_provider: tokio::sync::RwLock::new(Arc::new(storage_provider)),
|
||||
snapshot_persistence: Default::default(),
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
rocksdb_backup: Default::default(),
|
||||
device_id,
|
||||
}
|
||||
@ -124,6 +133,7 @@ impl AppFlowyCollabBuilder {
|
||||
*self.snapshot_persistence.lock() = Some(snapshot_persistence);
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn set_rocksdb_backup(&self, rocksdb_backup: Arc<dyn RocksdbBackup>) {
|
||||
*self.rocksdb_backup.lock() = Some(rocksdb_backup);
|
||||
}
|
||||
@ -221,23 +231,36 @@ impl AppFlowyCollabBuilder {
|
||||
object_type: CollabType,
|
||||
collab_db: Weak<CollabKVDB>,
|
||||
collab_doc_state: CollabDocState,
|
||||
persistence_config: CollabPersistenceConfig,
|
||||
#[allow(unused_variables)] persistence_config: CollabPersistenceConfig,
|
||||
build_config: CollabBuilderConfig,
|
||||
) -> Result<Arc<MutexCollab>, Error> {
|
||||
let collab = Arc::new(
|
||||
CollabBuilder::new(uid, object_id)
|
||||
.with_doc_state(collab_doc_state)
|
||||
.with_plugin(RocksdbDiskPlugin::new_with_config(
|
||||
uid,
|
||||
object_id.to_string(),
|
||||
object_type.clone(),
|
||||
collab_db.clone(),
|
||||
persistence_config.clone(),
|
||||
None,
|
||||
))
|
||||
.with_device_id(self.device_id.clone())
|
||||
.build()?,
|
||||
);
|
||||
let mut builder = CollabBuilder::new(uid, object_id)
|
||||
.with_doc_state(collab_doc_state)
|
||||
.with_device_id(self.device_id.clone());
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
{
|
||||
builder = builder.with_plugin(IndexeddbDiskPlugin::new(
|
||||
uid,
|
||||
object_id.to_string(),
|
||||
object_type.clone(),
|
||||
collab_db.clone(),
|
||||
));
|
||||
}
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
{
|
||||
builder = builder.with_plugin(RocksdbDiskPlugin::new_with_config(
|
||||
uid,
|
||||
object_id.to_string(),
|
||||
object_type.clone(),
|
||||
collab_db.clone(),
|
||||
persistence_config.clone(),
|
||||
None,
|
||||
));
|
||||
}
|
||||
|
||||
let collab = Arc::new(builder.build()?);
|
||||
{
|
||||
let collab_object = self.collab_object(uid, object_id, object_type)?;
|
||||
if build_config.sync_enable {
|
||||
@ -265,22 +288,25 @@ impl AppFlowyCollabBuilder {
|
||||
}
|
||||
},
|
||||
CollabPluginProviderType::Supabase => {
|
||||
trace!("init supabase collab plugins");
|
||||
let local_collab = Arc::downgrade(&collab);
|
||||
let local_collab_db = collab_db.clone();
|
||||
let plugins = self
|
||||
.plugin_provider
|
||||
.read()
|
||||
.await
|
||||
.get_plugins(CollabPluginProviderContext::Supabase {
|
||||
uid,
|
||||
collab_object,
|
||||
local_collab,
|
||||
local_collab_db,
|
||||
})
|
||||
.await;
|
||||
for plugin in plugins {
|
||||
collab.lock().add_plugin(plugin);
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
{
|
||||
trace!("init supabase collab plugins");
|
||||
let local_collab = Arc::downgrade(&collab);
|
||||
let local_collab_db = collab_db.clone();
|
||||
let plugins = self
|
||||
.plugin_provider
|
||||
.read()
|
||||
.await
|
||||
.get_plugins(CollabPluginProviderContext::Supabase {
|
||||
uid,
|
||||
collab_object,
|
||||
local_collab,
|
||||
local_collab_db,
|
||||
})
|
||||
.await;
|
||||
for plugin in plugins {
|
||||
collab.lock().add_plugin(plugin);
|
||||
}
|
||||
}
|
||||
},
|
||||
CollabPluginProviderType::Local => {},
|
||||
@ -288,7 +314,12 @@ impl AppFlowyCollabBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
collab.lock().initialize().await;
|
||||
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
collab.lock().initialize();
|
||||
|
||||
trace!("collab initialized: {}", object_id);
|
||||
Ok(collab)
|
||||
}
|
||||
|
Reference in New Issue
Block a user