diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 938100cf..9989b96c 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -6,6 +6,7 @@ members = [ "automerge-test", "automerge-wasm", "edit-trace", + "badmessage", ] resolver = "2" diff --git a/rust/badmessage/.gitignore b/rust/badmessage/.gitignore new file mode 100644 index 00000000..55778aca --- /dev/null +++ b/rust/badmessage/.gitignore @@ -0,0 +1,6 @@ +/target +Cargo.lock +node_modules +yarn.lock +flamegraph.svg +/prof diff --git a/rust/badmessage/Cargo.toml b/rust/badmessage/Cargo.toml new file mode 100644 index 00000000..e6b93447 --- /dev/null +++ b/rust/badmessage/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "badmessage" +version = "0.1.0" +edition = "2021" +license = "MIT" + +[dependencies] +automerge = { path = "../automerge" } +criterion = "0.3.5" +json = "0.12.4" +rand = "^0.8" + + +[[bin]] +name = "badmessage" +doc = false +bench = false + diff --git a/rust/badmessage/automerge-js.js b/rust/badmessage/automerge-js.js new file mode 100644 index 00000000..80d19051 --- /dev/null +++ b/rust/badmessage/automerge-js.js @@ -0,0 +1,26 @@ +// Apply the paper editing trace to an Automerge.Text object, one char at a time +const Automerge = require('../../javascript') + +const fs = require('fs'); + +const start = new Date() + +let contents = fs.readFileSync("badmessage"); +let doc = Automerge.init(); +let state = Automerge.initSyncState(); +[doc,state] = Automerge.receiveSyncMessage(doc, state, contents); + +console.log(`doc.receiveSyncMessage in ${new Date() - start} ms`) + +let t_time = new Date() +let saved = Automerge.save(doc); +console.log(`doc.save in ${new Date() - t_time} ms`) + +t_time = new Date() +Automerge.load(saved) +console.log(`doc.load in ${new Date() - t_time} ms`) + +t_time = new Date() +let doc2 = Automerge.init() +doc2 = Automerge.loadIncremental(doc2,saved) +console.log(`doc.loadIncremental in ${new Date() - t_time} ms`) diff --git a/rust/badmessage/automerge-wasm.js b/rust/badmessage/automerge-wasm.js new file mode 100644 index 00000000..33ac46bc --- /dev/null +++ b/rust/badmessage/automerge-wasm.js @@ -0,0 +1,26 @@ +const Automerge = require('../automerge-wasm') +const fs = require('fs'); + + +let contents = fs.readFileSync("badmessage"); +let doc = Automerge.create(); +let state = Automerge.initSyncState(); + +let t_time = new Date() + +doc.receiveSyncMessage(state,contents); + +console.log(`doc.receiveSyncMessage in ${new Date() - t_time} ms`) + +t_time = new Date() +let saved = doc.save() +console.log(`doc.save in ${new Date() - t_time} ms`) + +t_time = new Date() +Automerge.load(saved) +console.log(`doc.load in ${new Date() - t_time} ms`) + +t_time = new Date() +let doc2 = Automerge.create() +doc2.loadIncremental(saved) +console.log(`doc.loadIncremental in ${new Date() - t_time} ms`) diff --git a/rust/badmessage/badmessage b/rust/badmessage/badmessage new file mode 100755 index 00000000..f2d5ff29 Binary files /dev/null and b/rust/badmessage/badmessage differ diff --git a/rust/badmessage/package.json b/rust/badmessage/package.json new file mode 100644 index 00000000..e8d2ad3f --- /dev/null +++ b/rust/badmessage/package.json @@ -0,0 +1,13 @@ +{ + "name": "badmessage", + "version": "1.0.0", + "main": "wasm-text.js", + "license": "MIT", + "scripts": { + "wasm": "0x -D prof automerge-wasm.js", + "js": "0x -D prof automerge-js.js" + }, + "devDependencies": { + "0x": "^5.4.1" + } +} diff --git a/rust/badmessage/src/main.rs b/rust/badmessage/src/main.rs new file mode 100644 index 00000000..a67005c7 --- /dev/null +++ b/rust/badmessage/src/main.rs @@ -0,0 +1,25 @@ +use automerge::sync; +use automerge::{Automerge, AutomergeError}; +use std::fs; +use std::time::Instant; + +fn main() -> Result<(), AutomergeError> { + let contents = fs::read("badmessage").expect("cant read badmessage file"); + let mut doc = Automerge::new(); + let mut state = sync::State::new(); + let now = Instant::now(); + // decode and receive happen at the same time in wasm so lets keep it apples to apples + let message = sync::Message::decode(contents.as_slice()).expect("cant decode message"); + doc.receive_sync_message(&mut state, message).unwrap(); + println!("decode/receive in {} ms", now.elapsed().as_millis()); + let now = Instant::now(); + let saved = doc.save(); + println!("save in {} ms", now.elapsed().as_millis()); + let now = Instant::now(); + let _ = Automerge::load(&saved).unwrap(); + println!("load in {} ms", now.elapsed().as_millis()); + let mut doc2 = Automerge::new(); + doc2.load_incremental(saved.as_slice()).unwrap(); + println!("load_incremental in {} ms", now.elapsed().as_millis()); + Ok(()) +}