@@ -925,19 +925,32 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
925925 }
926926 let folder = self . path . as_ref ( ) . and_then ( |path| path. parent ( ) ) . map ( |parent| parent. to_path_buf ( ) ) ;
927927
928- let exported = resources. export ( & Vec :: from_iter ( self . used_resources ( ) ) ) ;
929- self . embedded_resources = EmbeddedResources :: from_iter ( exported) ;
930- let content = self . serialize_document ( ) ;
931-
932- // Clear embedded resources after serialization to free memory.
933- let _ = std:: mem:: take ( & mut self . embedded_resources ) ;
934-
935- responses. add ( FrontendMessage :: TriggerSaveDocument {
936- document_id,
937- name : format ! ( "{}.{}" , self . name. clone( ) , FILE_EXTENSION ) ,
938- path,
939- folder,
940- content : content. into_bytes ( ) . into ( ) ,
928+ let resource_hashes = Vec :: from_iter ( self . used_resources ( ) ) . into_boxed_slice ( ) ;
929+ let resources = resources. resources ( ) ;
930+ let mut document = self . clone ( ) ;
931+ let name = format ! ( "{}.{}" , self . name. clone( ) , FILE_EXTENSION ) ;
932+
933+ responses. add ( FrontendMessage :: Await {
934+ future : FrontendMessageFuture :: new ( async move {
935+ let loads = resource_hashes
936+ . into_iter ( )
937+ . map ( |hash| {
938+ let resource = resources. load ( hash) ;
939+ async move { resource. await . map ( |resource| ( hash, resource) ) }
940+ } )
941+ . collect :: < Vec < _ > > ( ) ;
942+
943+ document. embedded_resources = EmbeddedResources :: from_iter ( futures:: future:: join_all ( loads) . await . into_iter ( ) . flatten ( ) ) ;
944+ let content = document. serialize_document ( ) ;
945+
946+ FrontendMessage :: TriggerSaveDocument {
947+ document_id,
948+ name,
949+ path,
950+ folder,
951+ content : content. into_bytes ( ) . into ( ) ,
952+ }
953+ } ) ,
941954 } ) ;
942955 }
943956 DocumentMessage :: SavedDocument { path } => {
0 commit comments