@@ -370,14 +370,26 @@ impl Client {
370370 let locked_url = write_locked_app ( & locked, working_dir) . await . unwrap ( ) ;
371371
372372 for mut c in locked. components {
373- let complicate =
374- |data : Vec < u8 > | compose_trigger_extras ( & c, & locked_url, working_dir, data) ;
373+ // TODO: what if, instead of having a separate complicate that
374+ // called the trigger, we had the trigger do the full compose
375+ // (in the presence of extras)? The trigger already has logic
376+ // for that...
377+ let extras = c. metadata . get ( "trigger-extras" ) . and_then ( |e| e. as_object ( ) ) ;
378+
379+ let composed = if extras. is_none_or ( |e| e. is_empty ( ) ) {
380+ spin_compose:: compose ( & ComponentSourceLoaderFs , & c, async |a| Ok ( a) ) . await ?
381+ } else {
382+ compose_trigger_extras_2 ( & c, & locked_url, working_dir) . await ?
383+ } ;
375384
376- let composed = spin_compose:: compose ( & ComponentSourceLoaderFs , & c, complicate)
377- . await
378- . with_context ( || {
379- format ! ( "failed to resolve dependencies for component {:?}" , c. id)
380- } ) ?;
385+ // let complicate =
386+ // |data: Vec<u8>| compose_trigger_extras(&c, &locked_url, working_dir, data);
387+
388+ // let composed = spin_compose::compose(&ComponentSourceLoaderFs, &c, complicate)
389+ // .await
390+ // .with_context(|| {
391+ // format!("failed to resolve dependencies for component {:?}", c.id)
392+ // })?;
381393 let layer = ImageLayer :: new ( composed, WASM_LAYER_MEDIA_TYPE . to_string ( ) , None ) ;
382394 c. source . content = self . content_ref_for_layer ( & layer) ;
383395 c. dependencies . clear ( ) ;
@@ -938,11 +950,76 @@ fn add_inferred(map: &mut BTreeMap<String, String>, key: &str, value: Option<Str
938950const SPIN_LOCKED_URL : & str = "SPIN_LOCKED_URL" ;
939951const SPIN_WORKING_DIR : & str = "SPIN_WORKING_DIR" ;
940952
941- async fn compose_trigger_extras (
953+ // async fn compose_trigger_extras(
954+ // c: &LockedComponent,
955+ // locked_url: &str,
956+ // working_dir: &Path,
957+ // data: Vec<u8>,
958+ // ) -> Result<Vec<u8>, spin_compose::ComposeError> {
959+ // use spin_compose::ComposeError;
960+
961+ // let Some(resolve_extras_using) = c
962+ // .metadata
963+ // .get("resolve-extras-using")
964+ // .and_then(|v| v.as_str())
965+ // else {
966+ // return Result::<_, ComposeError>::Ok(data);
967+ // };
968+
969+ // let resolver_subcmd = match resolve_extras_using {
970+ // "http" | "redis" => vec!["trigger".into(), resolve_extras_using.into()],
971+ // _ => vec![format!("trigger-{resolve_extras_using}")],
972+ // };
973+
974+ // let mut cmd = tokio::process::Command::new(std::env::current_exe().unwrap());
975+ // cmd.args(resolver_subcmd)
976+ // .args(["--resolve-extras-only", "--resolve-extras-component-id"])
977+ // .arg(&c.id)
978+ // // .stdin(std::process::Stdio::piped())
979+ // .stdout(std::process::Stdio::piped())
980+ // .stderr(std::process::Stdio::inherit())
981+ // .env("SPIN_PLUGINS_SUPPRESS_COMPATIBILITY_WARNINGS", "1")
982+ // .env(SPIN_LOCKED_URL, locked_url)
983+ // .env(SPIN_WORKING_DIR, working_dir);
984+
985+ // let child = cmd
986+ // .spawn()
987+ // .map_err(|e| ComposeError::PrepareError(e.into()))?;
988+
989+ // // use tokio::io::AsyncWriteExt;
990+
991+ // // let mut input = child.stdin.take().unwrap();
992+ // // input
993+ // // .write_all(&data)
994+ // // .await
995+ // // .map_err(|e| ComposeError::PrepareError(e.into()))?;
996+ // // input
997+ // // .flush()
998+ // // .await
999+ // // .map_err(|e| ComposeError::PrepareError(e.into()))?;
1000+ // // drop(input);
1001+
1002+ // let trigger_out = child
1003+ // .wait_with_output()
1004+ // .await
1005+ // .map_err(|e| ComposeError::PrepareError(e.into()))?;
1006+
1007+ // if !trigger_out.status.success() {
1008+ // return Err(ComposeError::PrepareError(anyhow::anyhow!(
1009+ // "unable to compose additional components for {} using `{}`",
1010+ // c.id,
1011+ // resolve_extras_using
1012+ // )));
1013+ // }
1014+
1015+ // let complicated = trigger_out.stdout;
1016+ // Ok(complicated)
1017+ // }
1018+
1019+ async fn compose_trigger_extras_2 (
9421020 c : & LockedComponent ,
9431021 locked_url : & str ,
9441022 working_dir : & Path ,
945- data : Vec < u8 > ,
9461023) -> Result < Vec < u8 > , spin_compose:: ComposeError > {
9471024 use spin_compose:: ComposeError ;
9481025
@@ -951,7 +1028,8 @@ async fn compose_trigger_extras(
9511028 . get ( "resolve-extras-using" )
9521029 . and_then ( |v| v. as_str ( ) )
9531030 else {
954- return Result :: < _ , ComposeError > :: Ok ( data) ;
1031+ return spin_compose:: compose ( & ComponentSourceLoaderFs , & c, async |a| Ok ( a) ) . await ;
1032+ // return Result::<_, ComposeError>::Ok(data);
9551033 } ;
9561034
9571035 let resolver_subcmd = match resolve_extras_using {
@@ -961,32 +1039,18 @@ async fn compose_trigger_extras(
9611039
9621040 let mut cmd = tokio:: process:: Command :: new ( std:: env:: current_exe ( ) . unwrap ( ) ) ;
9631041 cmd. args ( resolver_subcmd)
964- . args ( [ "--resolve-extras- only" , "--resolve-extras -component-id" ] )
1042+ . args ( [ "--precompose- only" , "--precompose -component-id" ] )
9651043 . arg ( & c. id )
966- . stdin ( std:: process:: Stdio :: piped ( ) )
9671044 . stdout ( std:: process:: Stdio :: piped ( ) )
9681045 . stderr ( std:: process:: Stdio :: inherit ( ) )
9691046 . env ( "SPIN_PLUGINS_SUPPRESS_COMPATIBILITY_WARNINGS" , "1" )
9701047 . env ( SPIN_LOCKED_URL , locked_url)
9711048 . env ( SPIN_WORKING_DIR , working_dir) ;
9721049
973- let mut child = cmd
1050+ let child = cmd
9741051 . spawn ( )
9751052 . map_err ( |e| ComposeError :: PrepareError ( e. into ( ) ) ) ?;
9761053
977- use tokio:: io:: AsyncWriteExt ;
978-
979- let mut input = child. stdin . take ( ) . unwrap ( ) ;
980- input
981- . write_all ( & data)
982- . await
983- . map_err ( |e| ComposeError :: PrepareError ( e. into ( ) ) ) ?;
984- input
985- . flush ( )
986- . await
987- . map_err ( |e| ComposeError :: PrepareError ( e. into ( ) ) ) ?;
988- drop ( input) ;
989-
9901054 let trigger_out = child
9911055 . wait_with_output ( )
9921056 . await
0 commit comments