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:
Nathan.fooo
2024-01-22 13:34:15 +08:00
committed by GitHub
parent c4acba8216
commit 90516b6adc
43 changed files with 555 additions and 316 deletions

View File

@ -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"]

View File

@ -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)
}