support of _start

This commit is contained in:
vms 2020-06-11 19:11:34 +03:00
parent 255a131a4f
commit 46ac364c69
8 changed files with 61 additions and 55 deletions

51
Cargo.lock generated
View File

@ -242,12 +242,13 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-queue" name = "crossbeam-queue"
version = "0.2.1" version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crossbeam-utils", "crossbeam-utils",
"maybe-uninit",
] ]
[[package]] [[package]]
@ -273,9 +274,9 @@ dependencies = [
[[package]] [[package]]
name = "ctor" name = "ctor"
version = "0.1.14" version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf6b25ee9ac1995c54d7adb2eff8cfffb7260bc774fb63c601ec65467f43cd9d" checksum = "39858aa5bac06462d4dd4b9164848eb81ffc4aa5c479746393598fd193afa227"
dependencies = [ dependencies = [
"quote", "quote",
"syn", "syn",
@ -479,9 +480,9 @@ checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "1.3.2" version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"serde", "serde",
@ -706,9 +707,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.17" version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1502d12e458c49a4c9cbff560d0fe0060c252bc29799ed94ca2ed4bb665a0101" checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
dependencies = [ dependencies = [
"unicode-xid", "unicode-xid",
] ]
@ -726,9 +727,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.6" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -791,9 +792,9 @@ dependencies = [
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.4" version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
@ -837,9 +838,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_bytes" name = "serde_bytes"
version = "0.11.4" version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3bf487fbf5c6239d7ea2ff8b10cb6b811cd4b5080d1c2aeed1dec18753c06e10" checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -857,9 +858,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.53" version = "1.0.55"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" checksum = "ec2c5d7e739bc07a3e73381a39d61fdb5f671c60c1df26a130690665803d8226"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -892,9 +893,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.27" version = "1.0.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef781e621ee763a2a40721a8861ec519cb76966aee03bb5d00adb6a31dc1c1de" checksum = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -903,9 +904,9 @@ dependencies = [
[[package]] [[package]]
name = "synstructure" name = "synstructure"
version = "0.12.3" version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -975,9 +976,9 @@ checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
[[package]] [[package]]
name = "typetag" name = "typetag"
version = "0.1.4" version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ebb2c484029d695fb68a06d80e1536c68d491b3e0cf874c66abed255e831cfe" checksum = "9275125decb5d75fe57ebfe92debd119b15757aae27c56d7cb61ecab871960bc"
dependencies = [ dependencies = [
"erased-serde", "erased-serde",
"inventory", "inventory",
@ -988,9 +989,9 @@ dependencies = [
[[package]] [[package]]
name = "typetag-impl" name = "typetag-impl"
version = "0.1.4" version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b63fd4799e4d0ec5cf0b055ebb8e2c3a657bbf76a84f6edc77ca60780e000204" checksum = "dc232cda3b1d82664153e6c95d1071809aa0f1011f306c3d6989f33d8c6ede17"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1128,7 +1129,7 @@ dependencies = [
[[package]] [[package]]
name = "wasmer-interface-types" name = "wasmer-interface-types"
version = "0.17.0" version = "0.17.0"
source = "git+https://github.com/fluencelabs/interface-types#c2f2a23c38af049bce7a3e93a51ff287b3898410" source = "git+https://github.com/fluencelabs/interface-types#82986d10358f02c8ae64850ed0b79efb4e823c54"
dependencies = [ dependencies = [
"nom", "nom",
"serde", "serde",

View File

@ -24,7 +24,7 @@ pub enum NodeError {
/// An error related to config parsing. /// An error related to config parsing.
ConfigParseError(String), ConfigParseError(String),
/// Various errors related to file io. /// Various errors related to file i/o.
IOError(String), IOError(String),
/// WIT doesn't contain such type. /// WIT doesn't contain such type.

View File

@ -20,6 +20,8 @@ mod config;
mod imports; mod imports;
mod node_public_interface; mod node_public_interface;
pub use fce::IValue;
pub use node::IpfsNode; pub use node::IpfsNode;
pub use node_public_interface::NodePublicInterface; pub use node_public_interface::NodePublicInterface;
pub use node_public_interface::NodeModulePublicInterface; pub use node_public_interface::NodeModulePublicInterface;

View File

@ -4,7 +4,6 @@ version = "0.1.0"
authors = ["Fluence Labs"] authors = ["Fluence Labs"]
edition = "2018" edition = "2018"
[lib] [[bin]]
name = "wasm_ipfs_node" name = "wasm_ipfs_node"
path = "src/lib.rs" path = "src/main.rs"
crate-type = ["cdylib"]

View File

@ -23,12 +23,15 @@ use crate::result::{RESULT_PTR, RESULT_SIZE};
const RESULT_PATH: &str = "/tmp/ipfs_rpc_file"; const RESULT_PATH: &str = "/tmp/ipfs_rpc_file";
pub fn main() {
println!("ipfs_node.main: WASI initialization finished");
}
#[no_mangle] #[no_mangle]
pub unsafe fn put(file_path_ptr: *mut u8, file_path_size: usize) { pub unsafe fn put(file_path_ptr: *mut u8, file_path_size: usize) {
let file_path = String::from_raw_parts(file_path_ptr, file_path_size, file_path_size); let file_path = String::from_raw_parts(file_path_ptr, file_path_size, file_path_size);
let msg = format!("ipfs_node.put: file path is {}\n", file_path); println!("ipfs_node.put: file path is {}\n", file_path);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
let cmd = format!("add -Q {}", file_path); let cmd = format!("add -Q {}", file_path);
let result = ipfs(cmd.as_ptr() as _, cmd.len() as _); let result = ipfs(cmd.as_ptr() as _, cmd.len() as _);
@ -43,8 +46,7 @@ pub unsafe fn put(file_path_ptr: *mut u8, file_path_size: usize) {
"host ipfs call failed".to_string() "host ipfs call failed".to_string()
}; };
let msg = format!("ipfs_node.put: file add wtih hash is {} \n", hash); println!("ipfs_node.put: file add wtih hash is {} \n", hash);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
*RESULT_PTR.get_mut() = hash.as_ptr() as _; *RESULT_PTR.get_mut() = hash.as_ptr() as _;
*RESULT_SIZE.get_mut() = hash.len(); *RESULT_SIZE.get_mut() = hash.len();
@ -55,8 +57,7 @@ pub unsafe fn put(file_path_ptr: *mut u8, file_path_size: usize) {
pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) { pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) {
let hash = String::from_raw_parts(hash_ptr, hash_size, hash_size); let hash = String::from_raw_parts(hash_ptr, hash_size, hash_size);
let msg = format!("ipfs_node.get: file hash is {}\n", hash); println!("ipfs_node.get: file hash is {}\n", hash);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
let cmd = format!("get -o {} {}", RESULT_PATH, hash); let cmd = format!("get -o {} {}", RESULT_PATH, hash);
let _result = ipfs(cmd.as_ptr() as _, cmd.len() as _); let _result = ipfs(cmd.as_ptr() as _, cmd.len() as _);
@ -70,8 +71,7 @@ pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) {
// TODO: check output // TODO: check output
let file_path = RESULT_PATH.to_string(); let file_path = RESULT_PATH.to_string();
let msg = format!("ipfs_node.get: file path is {}", file_path); println!("ipfs_node.get: file path is {}", file_path);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
*RESULT_PTR.get_mut() = file_path.as_ptr() as _; *RESULT_PTR.get_mut() = file_path.as_ptr() as _;
*RESULT_SIZE.get_mut() = file_path.len(); *RESULT_SIZE.get_mut() = file_path.len();

View File

@ -4,7 +4,6 @@ version = "0.1.0"
authors = ["Fluence Labs"] authors = ["Fluence Labs"]
edition = "2018" edition = "2018"
[lib] [[bin]]
name = "wasm_ipfs_rpc" name = "wasm_ipfs_rpc"
path = "src/lib.rs" path = "src/main.rs"
crate-type = ["cdylib"]

View File

@ -22,13 +22,17 @@ use crate::result::{RESULT_PTR, RESULT_SIZE};
use std::fs; use std::fs;
use std::path::PathBuf; use std::path::PathBuf;
const RPC_TMP_FILEPATH: &str = "/tmp/ipfs_rpc_file";
pub fn main() {
println!("ipfs_rpc.main: WASI initialization finished");
}
#[no_mangle] #[no_mangle]
pub unsafe fn invoke(_ptr: *mut u8, _size: usize) { pub unsafe fn invoke(_ptr: *mut u8, _size: usize) {
let msg = "ipfs_rpc.invoke: invoke called"; println!("ipfs_rpc.invoke: invoke called");
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
let result = "IFPFS_RPC wasm example, it allow:\nput\nget".to_string();
let result = "IPFS_RPC wasm example, it allow:\nput\nget".to_string();
*RESULT_PTR.get_mut() = result.as_ptr() as _; *RESULT_PTR.get_mut() = result.as_ptr() as _;
*RESULT_SIZE.get_mut() = result.len(); *RESULT_SIZE.get_mut() = result.len();
std::mem::forget(result); std::mem::forget(result);
@ -39,15 +43,13 @@ pub unsafe fn put(file_content_ptr: *mut u8, file_content_size: usize) {
let file_content = let file_content =
String::from_raw_parts(file_content_ptr, file_content_size, file_content_size); String::from_raw_parts(file_content_ptr, file_content_size, file_content_size);
let msg = format!("ipfs_rpc.put: file_content is {}\n", file_content); println!("ipfs_rpc.put: file_content is {}\n", file_content);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
let rpc_tmp_filepath = "/tmp/ipfs_rpc.tmp".to_string(); let rpc_tmp_filepath = RPC_TMP_FILEPATH.to_string();
let r = fs::write(PathBuf::from(rpc_tmp_filepath.clone()), file_content); let r = fs::write(PathBuf::from(rpc_tmp_filepath.clone()), file_content);
if let Err(e) = r { if let Err(e) = r {
let msg: String = e.to_string(); println!("{}", e);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
} }
ipfs_put(rpc_tmp_filepath.as_ptr() as _, rpc_tmp_filepath.len() as _); ipfs_put(rpc_tmp_filepath.as_ptr() as _, rpc_tmp_filepath.len() as _);
@ -59,8 +61,7 @@ pub unsafe fn put(file_content_ptr: *mut u8, file_content_size: usize) {
*RESULT_SIZE.get_mut(), *RESULT_SIZE.get_mut(),
); );
let msg = format!("ipfs_rpc.put: file add with hash {}\n", hash); println!("ipfs_rpc.put: file add with hash {}\n", hash);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
*RESULT_PTR.get_mut() = hash.as_ptr() as _; *RESULT_PTR.get_mut() = hash.as_ptr() as _;
*RESULT_SIZE.get_mut() = hash.len(); *RESULT_SIZE.get_mut() = hash.len();
@ -71,8 +72,7 @@ pub unsafe fn put(file_content_ptr: *mut u8, file_content_size: usize) {
pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) { pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) {
let hash = String::from_raw_parts(hash_ptr, hash_size, hash_size); let hash = String::from_raw_parts(hash_ptr, hash_size, hash_size);
let msg = format!("ipfs_rpc.get: getting file with hash {}\n", hash); println!("ipfs_rpc.get: getting file with hash {}\n", hash);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
ipfs_get(hash.as_ptr() as _, hash.len() as _); ipfs_get(hash.as_ptr() as _, hash.len() as _);
@ -82,8 +82,7 @@ pub unsafe fn get(hash_ptr: *mut u8, hash_size: usize) {
*RESULT_SIZE.get_mut(), *RESULT_SIZE.get_mut(),
); );
let msg = format!("ipfs_rpc.get: reading file from {}\n", file_path); println!("ipfs_rpc.get: reading file from {}\n", file_path);
log_utf8_string(msg.as_ptr() as _, msg.len() as _);
let file_content = fs::read(file_path).unwrap_or_else(|_| b"error while reading file".to_vec()); let file_content = fs::read(file_path).unwrap_or_else(|_| b"error while reading file".to_vec());

View File

@ -81,6 +81,8 @@ impl FCEModule {
mut fce_imports: ImportObject, mut fce_imports: ImportObject,
modules: &HashMap<String, FCEModule>, modules: &HashMap<String, FCEModule>,
) -> Result<Self, FCEError> { ) -> Result<Self, FCEError> {
use wasmer_runtime::Func;
let wasmer_module = compile(&wasm_bytes)?; let wasmer_module = compile(&wasm_bytes)?;
let wit = extract_wit(&wasmer_module)?; let wit = extract_wit(&wasmer_module)?;
let fce_wit = FCEWITInterfaces::new(wit); let fce_wit = FCEWITInterfaces::new(wit);
@ -100,6 +102,10 @@ impl FCEModule {
let exports_funcs = Self::instantiate_wit_exports(wit_instance, &fce_wit)?; let exports_funcs = Self::instantiate_wit_exports(wit_instance, &fce_wit)?;
if let Ok(start_func) = wasmer_instance.exports.get::<Func<'_, (), ()>>("_start") {
start_func.call()?;
}
Ok(Self { Ok(Self {
wamser_instance: Box::new(wasmer_instance), wamser_instance: Box::new(wasmer_instance),
import_object, import_object,