mirror of
https://github.com/uqbar-dao/nectar.git
synced 2024-12-02 08:02:23 +03:00
WIP
This commit is contained in:
parent
55664c30e5
commit
1b9cbaf3d0
@ -670,8 +670,7 @@ fn handle_remote_request(
|
||||
return Resp::RemoteResponse(RemoteResponse::DownloadDenied);
|
||||
}
|
||||
// get the .zip from VFS and attach as payload to response
|
||||
let drive_name = format!("/{}/pkg", package);
|
||||
let file_path = format!("/{}.zip", drive_name);
|
||||
let file_path = format!("/{}/pkg.zip", package);
|
||||
let Ok(Ok(_)) = Request::new()
|
||||
.target(("our", "vfs", "sys", "uqbar"))
|
||||
.ipc(serde_json::to_vec(&kt::VfsRequest {
|
||||
|
@ -23,8 +23,6 @@ pub enum FTWorkerProtocol {
|
||||
call_init!(init);
|
||||
|
||||
fn init(our: Address) {
|
||||
println!("{}: start", our.process);
|
||||
|
||||
let Ok(Message::Request { source: parent_process, ipc, .. }) = await_message() else {
|
||||
panic!("ft_worker: got bad init message");
|
||||
};
|
||||
|
@ -9,7 +9,6 @@
|
||||
"filesystem:sys:uqbar",
|
||||
"http_server:sys:uqbar",
|
||||
"http_client:sys:uqbar",
|
||||
"encryptor:sys:uqbar",
|
||||
"net:sys:uqbar",
|
||||
"vfs:sys:uqbar",
|
||||
"kernel:sys:uqbar",
|
||||
|
@ -6,8 +6,7 @@
|
||||
"request_networking": false,
|
||||
"request_messaging": [
|
||||
"http_bindings:http_bindings:uqbar",
|
||||
"http_server:sys:uqbar",
|
||||
"encryptor:sys:uqbar"
|
||||
"http_server:sys:uqbar"
|
||||
],
|
||||
"public": false
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ pub async fn send_and_await_response(
|
||||
}
|
||||
let id = process
|
||||
.process
|
||||
.handle_request(source, target, request, None, payload)
|
||||
.send_request(source, target, request, None, payload)
|
||||
.await;
|
||||
match id {
|
||||
Ok(id) => match process.process.get_specific_message_for_process(id).await {
|
||||
@ -103,7 +103,7 @@ impl ProcessState {
|
||||
/// will only fail if process does not have capability to send to target.
|
||||
/// if the request has a timeout (expects response), start a task to track
|
||||
/// that timeout and return timeout error if it expires.
|
||||
pub async fn handle_request(
|
||||
pub async fn send_request(
|
||||
&mut self,
|
||||
fake_source: Option<t::Address>, // only used when kernel steps in to get/set state
|
||||
target: wit::Address,
|
||||
|
@ -579,7 +579,7 @@ impl StandardHost for process::ProcessWasi {
|
||||
) -> Result<()> {
|
||||
let id = self
|
||||
.process
|
||||
.handle_request(None, target, request, context, payload)
|
||||
.send_request(None, target, request, context, payload)
|
||||
.await;
|
||||
match id {
|
||||
Ok(_id) => Ok(()),
|
||||
@ -599,7 +599,7 @@ impl StandardHost for process::ProcessWasi {
|
||||
for request in requests {
|
||||
let id = self
|
||||
.process
|
||||
.handle_request(None, request.0, request.1, request.2, request.3)
|
||||
.send_request(None, request.0, request.1, request.2, request.3)
|
||||
.await;
|
||||
match id {
|
||||
Ok(_id) => continue,
|
||||
|
160
src/state.rs
160
src/state.rs
@ -348,7 +348,7 @@ async fn bootstrap(
|
||||
|
||||
let packages = get_zipped_packages().await;
|
||||
|
||||
for (package_name, mut package) in packages {
|
||||
for (package_name, mut package) in packages.clone() {
|
||||
// special case tester: only load it in if in simulation mode
|
||||
if package_name == "tester" {
|
||||
#[cfg(not(feature = "simulation-mode"))]
|
||||
@ -488,56 +488,6 @@ async fn bootstrap(
|
||||
}
|
||||
}
|
||||
|
||||
// grant capabilities to other initially spawned processes, distro
|
||||
if let Some(to_grant) = &entry.grant_messaging {
|
||||
for value in to_grant {
|
||||
let mut capability = None;
|
||||
let mut to_process = None;
|
||||
match value {
|
||||
serde_json::Value::String(process_name) => {
|
||||
if let Ok(parsed_process_id) = ProcessId::from_str(process_name) {
|
||||
capability = Some(Capability {
|
||||
issuer: Address {
|
||||
node: our_name.to_string(),
|
||||
process: ProcessId::from_str(&our_process_id).unwrap(),
|
||||
},
|
||||
params: "\"messaging\"".into(),
|
||||
});
|
||||
to_process = Some(parsed_process_id);
|
||||
}
|
||||
}
|
||||
serde_json::Value::Object(map) => {
|
||||
if let Some(process_name) = map.get("process") {
|
||||
if let Ok(parsed_process_id) =
|
||||
ProcessId::from_str(&process_name.as_str().unwrap())
|
||||
{
|
||||
if let Some(params) = map.get("params") {
|
||||
capability = Some(Capability {
|
||||
issuer: Address {
|
||||
node: our_name.to_string(),
|
||||
process: ProcessId::from_str(&our_process_id)
|
||||
.unwrap(),
|
||||
},
|
||||
params: params.to_string(),
|
||||
});
|
||||
to_process = Some(parsed_process_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(cap) = capability {
|
||||
if let Some(process) = process_map.get_mut(&to_process.unwrap()) {
|
||||
process.capabilities.insert(cap);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if entry.request_networking {
|
||||
requested_caps.insert(Capability {
|
||||
issuer: Address {
|
||||
@ -587,6 +537,114 @@ async fn bootstrap(
|
||||
);
|
||||
}
|
||||
}
|
||||
// second loop: go and grant_capabilities to processes
|
||||
// can't do this in first loop because we need to have all processes in the map first
|
||||
for (package_name, mut package) in packages {
|
||||
// special case tester: only load it in if in simulation mode
|
||||
if package_name == "tester" {
|
||||
#[cfg(not(feature = "simulation-mode"))]
|
||||
continue;
|
||||
#[cfg(feature = "simulation-mode")]
|
||||
{}
|
||||
}
|
||||
|
||||
// get and read manifest.json
|
||||
let Ok(mut package_manifest_zip) = package.by_name("manifest.json") else {
|
||||
println!(
|
||||
"fs: missing manifest for package {}, skipping",
|
||||
package_name
|
||||
);
|
||||
continue;
|
||||
};
|
||||
let mut manifest_content = Vec::new();
|
||||
package_manifest_zip
|
||||
.read_to_end(&mut manifest_content)
|
||||
.unwrap();
|
||||
drop(package_manifest_zip);
|
||||
let package_manifest = String::from_utf8(manifest_content)?;
|
||||
let package_manifest = serde_json::from_str::<Vec<PackageManifestEntry>>(&package_manifest)
|
||||
.expect("fs: manifest parse error");
|
||||
|
||||
// get and read metadata.json
|
||||
let Ok(mut package_metadata_zip) = package.by_name("metadata.json") else {
|
||||
println!(
|
||||
"fs: missing metadata for package {}, skipping",
|
||||
package_name
|
||||
);
|
||||
continue;
|
||||
};
|
||||
let mut metadata_content = Vec::new();
|
||||
package_metadata_zip
|
||||
.read_to_end(&mut metadata_content)
|
||||
.unwrap();
|
||||
drop(package_metadata_zip);
|
||||
let package_metadata: serde_json::Value =
|
||||
serde_json::from_slice(&metadata_content).expect("fs: metadata parse error");
|
||||
|
||||
println!("fs: found package metadata: {:?}\r", package_metadata);
|
||||
|
||||
let package_name = package_metadata["package"]
|
||||
.as_str()
|
||||
.expect("fs: metadata parse error: bad package name");
|
||||
|
||||
let package_publisher = package_metadata["publisher"]
|
||||
.as_str()
|
||||
.expect("fs: metadata parse error: bad publisher name");
|
||||
|
||||
// for each process-entry in manifest.json:
|
||||
for entry in package_manifest {
|
||||
let our_process_id = format!(
|
||||
"{}:{}:{}",
|
||||
entry.process_name, package_name, package_publisher
|
||||
);
|
||||
|
||||
// grant capabilities to other initially spawned processes, distro
|
||||
if let Some(to_grant) = &entry.grant_messaging {
|
||||
for value in to_grant {
|
||||
match value {
|
||||
serde_json::Value::String(process_name) => {
|
||||
if let Ok(parsed_process_id) = ProcessId::from_str(process_name) {
|
||||
if let Some(process) = process_map.get_mut(&parsed_process_id) {
|
||||
process.capabilities.insert(Capability {
|
||||
issuer: Address {
|
||||
node: our_name.to_string(),
|
||||
process: ProcessId::from_str(&our_process_id).unwrap(),
|
||||
},
|
||||
params: "\"messaging\"".into(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
serde_json::Value::Object(map) => {
|
||||
if let Some(process_name) = map.get("process") {
|
||||
if let Ok(parsed_process_id) =
|
||||
ProcessId::from_str(&process_name.as_str().unwrap())
|
||||
{
|
||||
if let Some(params) = map.get("params") {
|
||||
if let Some(process) =
|
||||
process_map.get_mut(&parsed_process_id)
|
||||
{
|
||||
process.capabilities.insert(Capability {
|
||||
issuer: Address {
|
||||
node: our_name.to_string(),
|
||||
process: ProcessId::from_str(&our_process_id)
|
||||
.unwrap(),
|
||||
},
|
||||
params: params.to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,6 @@ use std::collections::{HashMap, HashSet};
|
||||
use thiserror::Error;
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref ENCRYPTOR_PROCESS_ID: ProcessId = ProcessId::new(Some("encryptor"), "sys", "uqbar");
|
||||
pub static ref ETH_RPC_PROCESS_ID: ProcessId = ProcessId::new(Some("eth_rpc"), "sys", "uqbar");
|
||||
pub static ref HTTP_CLIENT_PROCESS_ID: ProcessId = ProcessId::new(Some("http_client"), "sys", "uqbar");
|
||||
pub static ref HTTP_SERVER_PROCESS_ID: ProcessId = ProcessId::new(Some("http_server"), "sys", "uqbar");
|
||||
|
Loading…
Reference in New Issue
Block a user