-
Notifications
You must be signed in to change notification settings - Fork 27
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add option to retain fetchEvent handler
Signed-off-by: karthik2804 <[email protected]>
- Loading branch information
1 parent
544b4ed
commit ffc32b8
Showing
5 changed files
with
55 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -124,7 +124,12 @@ pub struct Componentization { | |
pub resource_imports: Vec<(String, String, u32)>, | ||
} | ||
|
||
pub fn componentize_bindgen(resolve: &Resolve, id: WorldId, name: &str) -> Componentization { | ||
pub fn componentize_bindgen( | ||
resolve: &Resolve, | ||
id: WorldId, | ||
name: &str, | ||
retain_fetch_event: bool, | ||
) -> Componentization { | ||
let mut bindgen = JsBindgen { | ||
src: Source::default(), | ||
esm_bindgen: EsmBindgen::default(), | ||
|
@@ -342,6 +347,7 @@ pub fn componentize_bindgen(resolve: &Resolve, id: WorldId, name: &str) -> Compo | |
"$source_mod", | ||
&mut bindgen.local_names, | ||
name, | ||
retain_fetch_event, | ||
); | ||
|
||
let js_intrinsics = render_intrinsics(&mut bindgen.all_intrinsics, false, true); | ||
|
@@ -1001,6 +1007,7 @@ impl EsmBindgen { | |
imports_object: &str, | ||
_local_names: &mut LocalNames, | ||
source_name: &str, | ||
retain_fetch_event: bool, | ||
) { | ||
// TODO: bring back these validations of imports | ||
// including using the flattened bindings | ||
|
@@ -1043,6 +1050,10 @@ impl EsmBindgen { | |
"); | ||
} | ||
for (export_name, binding) in &self.exports { | ||
// If we are retaining the fetch event, then we should just let StarlingMonkey handle the event directly. | ||
if retain_fetch_event && export_name == "wasi:http/[email protected]" { | ||
continue; | ||
} | ||
match binding { | ||
Binding::Interface(bindings) => { | ||
uwrite!(output, "const "); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,9 @@ | ||
use anyhow::{bail, Context, Result}; | ||
use bindgen::BindingItem; | ||
use std::path::{Path, PathBuf}; | ||
use std::{ | ||
collections::HashSet, | ||
path::{Path, PathBuf}, | ||
}; | ||
|
||
mod bindgen; | ||
mod splice; | ||
|
@@ -111,6 +114,7 @@ impl Guest for SpidermonkeyEmbeddingSplicerComponent { | |
wit_path: Option<String>, | ||
world_name: Option<String>, | ||
debug: bool, | ||
mut retain_fetch_event: bool, | ||
) -> Result<SpliceResult, String> { | ||
let source_name = source_name.unwrap_or("source.js".to_string()); | ||
|
||
|
@@ -131,7 +135,22 @@ impl Guest for SpidermonkeyEmbeddingSplicerComponent { | |
.map_err(|e| e.to_string())?; | ||
|
||
let mut wasm_bytes = wit_component::dummy_module(&resolve, world); | ||
let componentized = bindgen::componentize_bindgen(&resolve, world, &source_name); | ||
let componentized = | ||
bindgen::componentize_bindgen(&resolve, world, &source_name, retain_fetch_event); | ||
|
||
let target_world = &resolve.worlds[world]; | ||
let mut target_world_exports = HashSet::new(); | ||
|
||
for (key, _) in &target_world.exports { | ||
target_world_exports.insert(resolve.name_world_key(key)); | ||
} | ||
|
||
// Do not retain fetch event if the target world does not export the | ||
// incomingHandler Interface as that would make it incompatible with the | ||
// target world | ||
if !target_world_exports.contains("wasi:http/[email protected]") { | ||
retain_fetch_event = false; | ||
} | ||
|
||
// merge the engine world with the target world, retaining the engine producers | ||
let producers = if let Ok(( | ||
|
@@ -330,8 +349,8 @@ impl Guest for SpidermonkeyEmbeddingSplicerComponent { | |
// println!("{:?}", &imports); | ||
// println!("{:?}", &componentized.imports); | ||
// println!("{:?}", &exports); | ||
let mut wasm = | ||
splice::splice(engine, imports, exports, debug).map_err(|e| format!("{:?}", e))?; | ||
let mut wasm = splice::splice(engine, imports, exports, debug, retain_fetch_event) | ||
.map_err(|e| format!("{:?}", e))?; | ||
|
||
// add the world section to the spliced wasm | ||
wasm.push(section.id()); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,6 +38,7 @@ pub fn splice( | |
imports: Vec<(String, String, CoreFn, Option<i32>)>, | ||
exports: Vec<(String, CoreFn)>, | ||
debug: bool, | ||
retain_fetch_event: bool, | ||
) -> Result<Vec<u8>> { | ||
let mut config = walrus::ModuleConfig::new(); | ||
if debug { | ||
|
@@ -53,13 +54,16 @@ pub fn splice( | |
module.exports.delete(expt.id()); | ||
module.funcs.delete(run); | ||
} | ||
if let Ok(serve) = module | ||
.exports | ||
.get_func("wasi:http/[email protected]#handle") | ||
{ | ||
let expt = module.exports.get_exported_func(serve).unwrap(); | ||
module.exports.delete(expt.id()); | ||
module.funcs.delete(serve); | ||
|
||
if !retain_fetch_event { | ||
if let Ok(serve) = module | ||
.exports | ||
.get_func("wasi:http/[email protected]#handle") | ||
{ | ||
let expt = module.exports.get_exported_func(serve).unwrap(); | ||
module.exports.delete(expt.id()); | ||
module.funcs.delete(serve); | ||
} | ||
} | ||
|
||
// we reencode the WASI world component data, so strip it out from the | ||
|
@@ -79,7 +83,7 @@ pub fn splice( | |
synthesize_import_functions(&mut module, &imports)?; | ||
|
||
// create the exported functions as wrappers around the "cabi_call" function | ||
synthesize_export_functions(&mut module, &exports)?; | ||
synthesize_export_functions(&mut module, &exports, retain_fetch_event)?; | ||
|
||
Ok(module.emit_wasm()) | ||
} | ||
|
@@ -530,6 +534,7 @@ fn synthesize_import_functions( | |
fn synthesize_export_functions( | ||
module: &mut walrus::Module, | ||
exports: &Vec<(String, CoreFn)>, | ||
retain_fetch_event: bool, | ||
) -> Result<()> { | ||
let cabi_realloc = get_export_fid( | ||
module, | ||
|
@@ -561,6 +566,9 @@ fn synthesize_export_functions( | |
let arg_ptr = module.locals.add(ValType::I32); | ||
let ret_ptr = module.locals.add(ValType::I32); | ||
for (export_num, (expt_name, expt_sig)) in exports.iter().enumerate() { | ||
if retain_fetch_event && expt_name == "wasi:http/[email protected]#handle" { | ||
continue; | ||
} | ||
// Export function synthesis | ||
{ | ||
// add the function type | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters