From 42b7760157d560458028606eab28fd0b6e5d92a5 Mon Sep 17 00:00:00 2001 From: crapStone Date: Mon, 16 May 2022 19:50:48 +0200 Subject: [PATCH] Remove base64 encoding from wasm boundary (#1358) Co-authored-by: crapStone Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1358 Reviewed-by: 6543 <6543@noreply.codeberg.org> Co-authored-by: crapStone Co-committed-by: crapStone --- frontend/src-wasm/Cargo.lock | 3 ++- frontend/src-wasm/Cargo.toml | 4 ++-- frontend/src-wasm/src/lib.rs | 10 ++++------ .../@core/services/loadSave/web/loadSave.service.ts | 10 ++-------- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/frontend/src-wasm/Cargo.lock b/frontend/src-wasm/Cargo.lock index 004e5b9ca..4aed885cb 100644 --- a/frontend/src-wasm/Cargo.lock +++ b/frontend/src-wasm/Cargo.lock @@ -56,11 +56,11 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" name = "cabr2_wasm_lib" version = "0.5.2" dependencies = [ - "base64", "cfg-if", "chrono", "console_error_panic_hook", "console_log", + "js-sys", "load_save", "log", "search", @@ -408,6 +408,7 @@ dependencies = [ "quick-xml 0.22.0", "regex", "serde", + "serde_json", "thiserror", "types", ] diff --git a/frontend/src-wasm/Cargo.toml b/frontend/src-wasm/Cargo.toml index 494c8c769..38750cccd 100644 --- a/frontend/src-wasm/Cargo.toml +++ b/frontend/src-wasm/Cargo.toml @@ -13,11 +13,11 @@ repository = "https://codeberg.org/Calciumdibromid/CaBr2" crate-type = ["cdylib", "rlib"] [dependencies] -base64 = "0.13.0" cfg-if = "1.0.0" chrono = { version = "0.4.19", features = ["wasmbind"] } console_error_panic_hook = { version = "0.1.7", optional = true } console_log = { version = "0.2.0", features = ["color"] } +js-sys = "0.3.57" load_save = { path = "../../crates/load_save/", default-features = false } log = "0.4.17" search = { path = "../../crates/search/", default-features = false } @@ -28,7 +28,7 @@ wasm-bindgen = { version = "=0.2.80", features = ["serde-serialize"] } # TODO(#1 wasm-bindgen-futures = "0.4.30" [features] -default = ["load_save/beryllium", "search/gestis"] +default = ["load_save/beryllium", "load_save/cabr2", "search/gestis"] debug_build = ["console_error_panic_hook"] [profile.release] diff --git a/frontend/src-wasm/src/lib.rs b/frontend/src-wasm/src/lib.rs index cba21ac13..2854b547a 100644 --- a/frontend/src-wasm/src/lib.rs +++ b/frontend/src-wasm/src/lib.rs @@ -2,8 +2,8 @@ mod impls; use std::{env, future::Future}; -use base64::encode; use cfg_if::cfg_if; +use js_sys::Uint8Array; use log::Level; use serde::Serialize; use wasm_bindgen::prelude::*; @@ -35,20 +35,18 @@ pub async fn init() { load_save::init(search::get_provider_mapping().await).await; } -/// Converts a `CaBr2Document` into a `base64` encoded `string` that can be saved by the client. +/// Converts a `CaBr2Document` into a binary array that can be saved by the client. /// /// May throw errors. #[wasm_bindgen] -pub async fn save_document(file_type: String, document: String) -> Result { - // TODO change back to original signature when it is supported by `wasm-bindgen` - // pub async fn save_document(file_type: String, document: String) -> Result> { +pub async fn save_document(file_type: String, document: String) -> Result { let document: CaBr2Document = match serde_json::from_str(&document) { Ok(document) => document, Err(err) => return Err(JsValue::from(err.to_string())), }; match load_save::save_document(file_type, document).await { - Ok(res) => Ok(encode(res)), + Ok(res) => Ok(Uint8Array::from(res.as_slice())), Err(err) => Err(JsValue::from(err.to_string())), } } diff --git a/frontend/src/app/@core/services/loadSave/web/loadSave.service.ts b/frontend/src/app/@core/services/loadSave/web/loadSave.service.ts index dd96e3a94..819ce1f34 100644 --- a/frontend/src/app/@core/services/loadSave/web/loadSave.service.ts +++ b/frontend/src/app/@core/services/loadSave/web/loadSave.service.ts @@ -76,18 +76,12 @@ export class LoadSaveService implements ILoadSaveService { }); break; - case 'cb2': - const blob = new Blob([JSON.stringify(document)], { type: 'text/plain' }); - downloadFile(blob, fileType); - sub.next(); - break; - default: logger.debug('saving file with wasm:', fileType); wasm .save_document(fileType, JSON.stringify(document)) - .then((contents: string) => { - const blob2 = new Blob([window.atob(contents)], { type: 'application/octet-stream' }); + .then((contents: Uint8Array) => { + const blob2 = new Blob([contents], { type: 'application/octet-stream' }); downloadFile(blob2, fileType); sub.next(); })