fix: wasm build
This commit is contained in:
parent
f2f3695cfb
commit
f7fcb66c95
|
|
@ -1,13 +1,6 @@
|
||||||
use std::{
|
|
||||||
pin::Pin,
|
|
||||||
task::{Context, Poll},
|
|
||||||
};
|
|
||||||
|
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use client_api_entity::{PublishCollabItem, PublishInfo, UpdatePublishNamespace};
|
use client_api_entity::{PublishInfo, UpdatePublishNamespace};
|
||||||
use futures::Stream;
|
use reqwest::Method;
|
||||||
use reqwest::{Body, Method};
|
|
||||||
use serde::Serialize;
|
|
||||||
use shared_entity::response::{AppResponse, AppResponseError};
|
use shared_entity::response::{AppResponse, AppResponseError};
|
||||||
|
|
||||||
use crate::Client;
|
use crate::Client;
|
||||||
|
|
@ -54,28 +47,6 @@ impl Client {
|
||||||
.into_data()
|
.into_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn publish_collabs<Metadata, Data>(
|
|
||||||
&self,
|
|
||||||
workspace_id: &str,
|
|
||||||
items: Vec<PublishCollabItem<Metadata, Data>>,
|
|
||||||
) -> Result<(), AppResponseError>
|
|
||||||
where
|
|
||||||
Metadata: serde::Serialize + Send + 'static + Unpin,
|
|
||||||
Data: AsRef<[u8]> + Send + 'static + Unpin,
|
|
||||||
{
|
|
||||||
let publish_collab_stream = PublishCollabItemStream::new(items);
|
|
||||||
let url = format!("{}/api/workspace/{}/publish", self.base_url, workspace_id,);
|
|
||||||
let resp = self
|
|
||||||
.http_client_with_auth(Method::POST, &url)
|
|
||||||
.await?
|
|
||||||
.header("Content-Type", "octet-stream")
|
|
||||||
.header("Transfer-Encoding", "chunked")
|
|
||||||
.body(Body::wrap_stream(publish_collab_stream))
|
|
||||||
.send()
|
|
||||||
.await?;
|
|
||||||
AppResponse::<()>::from_response(resp).await?.into_error()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn unpublish_collabs(
|
pub async fn unpublish_collabs(
|
||||||
&self,
|
&self,
|
||||||
workspace_id: &str,
|
workspace_id: &str,
|
||||||
|
|
@ -161,56 +132,3 @@ impl Client {
|
||||||
Ok(bytes)
|
Ok(bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PublishCollabItemStream<Metadata, Data> {
|
|
||||||
items: Vec<PublishCollabItem<Metadata, Data>>,
|
|
||||||
idx: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Metadata, Data> PublishCollabItemStream<Metadata, Data> {
|
|
||||||
pub fn new(publish_collab_items: Vec<PublishCollabItem<Metadata, Data>>) -> Self {
|
|
||||||
PublishCollabItemStream {
|
|
||||||
items: publish_collab_items,
|
|
||||||
idx: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Metadata, Data> Stream for PublishCollabItemStream<Metadata, Data>
|
|
||||||
where
|
|
||||||
Metadata: Serialize + Send + 'static + Unpin,
|
|
||||||
Data: AsRef<[u8]> + Send + 'static + Unpin,
|
|
||||||
{
|
|
||||||
type Item = Result<Bytes, std::io::Error>;
|
|
||||||
|
|
||||||
fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
|
||||||
let mut self_mut = self.as_mut();
|
|
||||||
|
|
||||||
if self_mut.idx >= self_mut.items.len() {
|
|
||||||
return Poll::Ready(None);
|
|
||||||
}
|
|
||||||
|
|
||||||
let item = &self_mut.items[self_mut.idx];
|
|
||||||
match serialize_metadata_data(&item.meta, item.data.as_ref()) {
|
|
||||||
Err(e) => Poll::Ready(Some(Err(e))),
|
|
||||||
Ok(chunk) => {
|
|
||||||
self_mut.idx += 1;
|
|
||||||
Poll::Ready(Some(Ok::<bytes::Bytes, std::io::Error>(chunk)))
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_metadata_data<Metadata>(m: Metadata, d: &[u8]) -> Result<Bytes, std::io::Error>
|
|
||||||
where
|
|
||||||
Metadata: Serialize,
|
|
||||||
{
|
|
||||||
let meta = serde_json::to_vec(&m)?;
|
|
||||||
|
|
||||||
let mut chunk = Vec::with_capacity(4 + meta.len() + d.len());
|
|
||||||
chunk.extend_from_slice(&(meta.len() as u32).to_le_bytes()); // Encode metadata length
|
|
||||||
chunk.extend_from_slice(&meta);
|
|
||||||
chunk.extend_from_slice(d);
|
|
||||||
|
|
||||||
Ok(Bytes::from(chunk))
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -7,19 +7,24 @@ use anyhow::anyhow;
|
||||||
use app_error::AppError;
|
use app_error::AppError;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|
||||||
use client_api_entity::{CollabParams, QueryCollabParams};
|
use bytes::Bytes;
|
||||||
|
use client_api_entity::{CollabParams, PublishCollabItem, QueryCollabParams};
|
||||||
use client_api_entity::{
|
use client_api_entity::{
|
||||||
CompleteUploadRequest, CreateUploadRequest, CreateUploadResponse, UploadPartResponse,
|
CompleteUploadRequest, CreateUploadRequest, CreateUploadResponse, UploadPartResponse,
|
||||||
};
|
};
|
||||||
use collab_rt_entity::HttpRealtimeMessage;
|
use collab_rt_entity::HttpRealtimeMessage;
|
||||||
|
use futures::Stream;
|
||||||
use futures_util::stream;
|
use futures_util::stream;
|
||||||
use prost::Message;
|
use prost::Message;
|
||||||
use reqwest::{Body, Method};
|
use reqwest::{Body, Method};
|
||||||
|
use serde::Serialize;
|
||||||
use shared_entity::dto::workspace_dto::CollabResponse;
|
use shared_entity::dto::workspace_dto::CollabResponse;
|
||||||
use shared_entity::response::{AppResponse, AppResponseError};
|
use shared_entity::response::{AppResponse, AppResponseError};
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
|
|
||||||
|
use std::pin::Pin;
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
|
use std::task::{Context, Poll};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio_retry::strategy::{ExponentialBackoff, FixedInterval};
|
use tokio_retry::strategy::{ExponentialBackoff, FixedInterval};
|
||||||
use tokio_retry::{Retry, RetryIf};
|
use tokio_retry::{Retry, RetryIf};
|
||||||
|
|
@ -247,6 +252,28 @@ impl Client {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn publish_collabs<Metadata, Data>(
|
||||||
|
&self,
|
||||||
|
workspace_id: &str,
|
||||||
|
items: Vec<PublishCollabItem<Metadata, Data>>,
|
||||||
|
) -> Result<(), AppResponseError>
|
||||||
|
where
|
||||||
|
Metadata: serde::Serialize + Send + 'static + Unpin,
|
||||||
|
Data: AsRef<[u8]> + Send + 'static + Unpin,
|
||||||
|
{
|
||||||
|
let publish_collab_stream = PublishCollabItemStream::new(items);
|
||||||
|
let url = format!("{}/api/workspace/{}/publish", self.base_url, workspace_id,);
|
||||||
|
let resp = self
|
||||||
|
.http_client_with_auth(Method::POST, &url)
|
||||||
|
.await?
|
||||||
|
.header("Content-Type", "octet-stream")
|
||||||
|
.header("Transfer-Encoding", "chunked")
|
||||||
|
.body(Body::wrap_stream(publish_collab_stream))
|
||||||
|
.send()
|
||||||
|
.await?;
|
||||||
|
AppResponse::<()>::from_response(resp).await?.into_error()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
|
@ -286,3 +313,56 @@ where
|
||||||
{
|
{
|
||||||
tokio::spawn(future)
|
tokio::spawn(future)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct PublishCollabItemStream<Metadata, Data> {
|
||||||
|
items: Vec<PublishCollabItem<Metadata, Data>>,
|
||||||
|
idx: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Metadata, Data> PublishCollabItemStream<Metadata, Data> {
|
||||||
|
pub fn new(publish_collab_items: Vec<PublishCollabItem<Metadata, Data>>) -> Self {
|
||||||
|
PublishCollabItemStream {
|
||||||
|
items: publish_collab_items,
|
||||||
|
idx: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Metadata, Data> Stream for PublishCollabItemStream<Metadata, Data>
|
||||||
|
where
|
||||||
|
Metadata: Serialize + Send + 'static + Unpin,
|
||||||
|
Data: AsRef<[u8]> + Send + 'static + Unpin,
|
||||||
|
{
|
||||||
|
type Item = Result<Bytes, std::io::Error>;
|
||||||
|
|
||||||
|
fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
||||||
|
let mut self_mut = self.as_mut();
|
||||||
|
|
||||||
|
if self_mut.idx >= self_mut.items.len() {
|
||||||
|
return Poll::Ready(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = &self_mut.items[self_mut.idx];
|
||||||
|
match serialize_metadata_data(&item.meta, item.data.as_ref()) {
|
||||||
|
Err(e) => Poll::Ready(Some(Err(e))),
|
||||||
|
Ok(chunk) => {
|
||||||
|
self_mut.idx += 1;
|
||||||
|
Poll::Ready(Some(Ok::<bytes::Bytes, std::io::Error>(chunk)))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_metadata_data<Metadata>(m: Metadata, d: &[u8]) -> Result<Bytes, std::io::Error>
|
||||||
|
where
|
||||||
|
Metadata: Serialize,
|
||||||
|
{
|
||||||
|
let meta = serde_json::to_vec(&m)?;
|
||||||
|
|
||||||
|
let mut chunk = Vec::with_capacity(4 + meta.len() + d.len());
|
||||||
|
chunk.extend_from_slice(&(meta.len() as u32).to_le_bytes()); // Encode metadata length
|
||||||
|
chunk.extend_from_slice(&meta);
|
||||||
|
chunk.extend_from_slice(d);
|
||||||
|
|
||||||
|
Ok(Bytes::from(chunk))
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue