@pwrdrvr/microapps-cdk 0.4.0-alpha.13 → 0.4.0-alpha.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +36 -10
- package/changelog.md +1 -1
- package/lib/MicroApps.js +1 -1
- package/lib/MicroAppsAPIGwy.js +1 -1
- package/lib/MicroAppsCF.js +1 -1
- package/lib/MicroAppsChildDeployer.js +1 -1
- package/lib/MicroAppsEdgeToOrigin.js +1 -1
- package/lib/MicroAppsS3.js +1 -1
- package/lib/MicroAppsSvcs.js +1 -1
- package/lib/MicroAppsTable.js +1 -1
- package/lib/microapps-deployer/index.js +1 -1
- package/lib/microapps-deployer/index.js.map +2 -2
- package/lib/microapps-edge-to-origin/index.js +2 -2
- package/lib/microapps-edge-to-origin/index.js.map +2 -2
- package/lib/microapps-router/index.js +32 -32
- package/lib/microapps-router/index.js.map +1 -1
- package/package.json +9 -9
- package/releasetag.txt +1 -1
- package/version.txt +1 -1
|
@@ -78,7 +78,7 @@ For more information please go to https://github.com/aws/aws-sdk-js-v3#functiona
|
|
|
78
78
|
`+e.slice(i,s),i=s+1),a=o;return d+=`
|
|
79
79
|
`,e.length-i>t&&a>i?d+=e.slice(i,a)+`
|
|
80
80
|
`+e.slice(a+1):d+=e.slice(i),d.slice(1)}function Qmt(e){for(var t="",n=0,r,i=0;i<e.length;n>=65536?i+=2:i++)n=kf(e,i),r=kn[n],!r&&Df(n)?(t+=e[i],n>=65536&&(t+=e[i+1])):t+=r||Gmt(n);return t}function Ymt(e,t,n){var r="",i=e.tag,s,a,o;for(s=0,a=n.length;s<a;s+=1)o=n[s],e.replacer&&(o=e.replacer.call(n,String(s),o)),(fs(e,t,o,!1,!1)||typeof o>"u"&&fs(e,t,null,!1,!1))&&(r!==""&&(r+=","+(e.condenseFlow?"":" ")),r+=e.dump);e.tag=i,e.dump="["+r+"]"}function vie(e,t,n,r){var i="",s=e.tag,a,o,d;for(a=0,o=n.length;a<o;a+=1)d=n[a],e.replacer&&(d=e.replacer.call(n,String(a),d)),(fs(e,t+1,d,!0,!0,!1,!0)||typeof d>"u"&&fs(e,t+1,null,!0,!0,!1,!0))&&((!r||i!=="")&&(i+=GO(e,t)),e.dump&&qf===e.dump.charCodeAt(0)?i+="-":i+="- ",i+=e.dump);e.tag=s,e.dump=i||"[]"}function Zmt(e,t,n){var r="",i=e.tag,s=Object.keys(n),a,o,d,c,l;for(a=0,o=s.length;a<o;a+=1)l="",r!==""&&(l+=", "),e.condenseFlow&&(l+='"'),d=s[a],c=n[d],e.replacer&&(c=e.replacer.call(n,d,c)),fs(e,t,d,!1,!1)&&(e.dump.length>1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),fs(e,t,c,!1,!1)&&(l+=e.dump,r+=l));e.tag=i,e.dump="{"+r+"}"}function eft(e,t,n,r){var i="",s=e.tag,a=Object.keys(n),o,d,c,l,f,m;if(e.sortKeys===!0)a.sort();else if(typeof e.sortKeys=="function")a.sort(e.sortKeys);else if(e.sortKeys)throw new Wn("sortKeys must be a boolean or a function");for(o=0,d=a.length;o<d;o+=1)m="",(!r||i!=="")&&(m+=GO(e,t)),c=a[o],l=n[c],e.replacer&&(l=e.replacer.call(n,c,l)),fs(e,t+1,c,!0,!0,!0)&&(f=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,f&&(e.dump&&qf===e.dump.charCodeAt(0)?m+="?":m+="? "),m+=e.dump,f&&(m+=GO(e,t)),fs(e,t+1,l,!0,f)&&(e.dump&&qf===e.dump.charCodeAt(0)?m+=":":m+=": ",m+=e.dump,i+=m));e.tag=s,e.dump=i||"{}"}function Sie(e,t,n){var r,i,s,a,o,d;for(i=n?e.explicitTypes:e.implicitTypes,s=0,a=i.length;s<a;s+=1)if(o=i[s],(o.instanceOf||o.predicate)&&(!o.instanceOf||typeof t=="object"&&t instanceof o.instanceOf)&&(!o.predicate||o.predicate(t))){if(n?o.multi&&o.representName?e.tag=o.representName(t):e.tag=o.tag:e.tag="?",o.represent){if(d=e.styleMap[o.tag]||o.defaultStyle,Die.call(o.represent)==="[object Function]")r=o.represent(t,d);else if(Mie.call(o.represent,d))r=o.represent[d](t,d);else throw new Wn("!<"+o.tag+'> tag resolver accepts not "'+d+'" style');e.dump=r}return!0}return!1}function fs(e,t,n,r,i,s,a){e.tag=null,e.dump=n,Sie(e,n,!1)||Sie(e,n,!0);var o=Die.call(e.dump),d=r,c;r&&(r=e.flowLevel<0||e.flowLevel>t);var l=o==="[object Object]"||o==="[object Array]",f,m;if(l&&(f=e.duplicates.indexOf(n),m=f!==-1),(e.tag!==null&&e.tag!=="?"||m||e.indent!==2&&t>0)&&(i=!1),m&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(l&&m&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),o==="[object Object]")r&&Object.keys(e.dump).length!==0?(eft(e,t,e.dump,i),m&&(e.dump="&ref_"+f+e.dump)):(Zmt(e,t,e.dump),m&&(e.dump="&ref_"+f+" "+e.dump));else if(o==="[object Array]")r&&e.dump.length!==0?(e.noArrayIndent&&!a&&t>0?vie(e,t-1,e.dump,i):vie(e,t,e.dump,i),m&&(e.dump="&ref_"+f+e.dump)):(Ymt(e,t,e.dump),m&&(e.dump="&ref_"+f+" "+e.dump));else if(o==="[object String]")e.tag!=="?"&&Kmt(e,e.dump,t,s,d);else{if(o==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new Wn("unacceptable kind of an object to dump "+o)}e.tag!==null&&e.tag!=="?"&&(c=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?c="!"+c:c.slice(0,18)==="tag:yaml.org,2002:"?c="!!"+c.slice(18):c="!<"+c+">",e.dump=c+" "+e.dump)}return!0}function tft(e,t){var n=[],r=[],i,s;for(VO(e,n,r),i=0,s=r.length;i<s;i+=1)t.duplicates.push(n[r[i]]);t.usedDuplicates=new Array(s)}function VO(e,t,n){var r,i,s;if(e!==null&&typeof e=="object")if(i=t.indexOf(e),i!==-1)n.indexOf(i)===-1&&n.push(i);else if(t.push(e),Array.isArray(e))for(i=0,s=e.length;i<s;i+=1)VO(e[i],t,n);else for(r=Object.keys(e),i=0,s=r.length;i<s;i+=1)VO(e[r[i]],t,n)}function nft(e,t){t=t||{};var n=new Vmt(t);n.noRefs||tft(e,n);var r=e;return n.replacer&&(r=n.replacer.call({"":r},"",r)),fs(n,0,r,!0,!0)?n.dump+`
|
|
81
|
-
`:""}var rft=nft,ift={dump:rft};function KO(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var Jie=Lie.load,Pin=Lie.loadAll,Nin=ift.dump;var kin=KO("safeLoad","load"),zin=KO("safeLoadAll","loadAll"),qin=KO("safeDump","dump");var pr=Rt(hc()),pde=Rt(hc());var Kb=Rt(ude()),Xb=class{static async getExistingFiles(t){let n=[];for(let r of t)await(0,Kb.pathExists)(r)&&n.push(r);return n}static getExistingFilesSync(t){let n=[];for(let r of t)(0,Kb.pathExistsSync)(r)&&n.push(r);return n}};var mde=Rt(hc());var ep=class{};dn([(0,mde.Property)({doc:"ID of API Gateway to integrate with",nullable:!1,default:"none",env:"APIGWY_ID"})],ep.prototype,"apiId",2);var fde=Rt(hc());var tp=class{};dn([(0,fde.Property)({doc:"DynamoDB Table Name",default:"MicroApps",env:"DATABASE_TABLE_NAME"})],tp.prototype,"tableName",2);var VB=Rt(hc());var Ec=class{};dn([(0,VB.Property)({doc:"Staging bucket to copy staged apps from",default:"microapps-staging",env:"FILESTORE_STAGING_BUCKET"})],Ec.prototype,"stagingBucket",2),dn([(0,VB.Property)({doc:"Destination bucket to copy staged apps to",default:"microapps",env:"FILESTORE_DEST_BUCKET"})],Ec.prototype,"destinationBucket",2);var oyt={name:"StringArray",coerce:e=>(e??"").split(","),validate:()=>{}},Dt=class{static configFiles(){let t=["./configs/config.yaml","./configs/config.yml",`./configs/config-${Dt.envLevel}.yaml`,`./configs/config-${Dt.envLevel}.yml`];return Xb.getExistingFilesSync(t)}static get instance(){if(Dt._instance===void 0){let t=new pde.TSConvict(Dt);Dt._instance=t.load(Dt.configFiles())}return Dt._instance}static get envLevel(){let t=process.env.NODE_ENV||"dev";return t.startsWith("prod")?"prod":t==="qa"?"qa":t==="local"?"local":"dev"}};dn([pr.Property(tp)],Dt.prototype,"db",2),dn([pr.Property(ep)],Dt.prototype,"apigwy",2),dn([pr.Property(Ec)],Dt.prototype,"filestore",2),dn([pr.Property({doc:"AWS Account ID for app Lambda function",default:"",env:"AWS_ACCOUNT_ID"})],Dt.prototype,"awsAccountID",2),dn([pr.Property({doc:"AWS Region for app Lambda function",default:"us-east-1",env:"AWS_REGION"})],Dt.prototype,"awsRegion",2),dn([pr.Property({doc:"Role name to be used for temp STS upload tokens",default:"microapps-deployer-upload-dev",env:"UPLOAD_ROLE_NAME"})],Dt.prototype,"uploadRoleName",2),dn([pr.Property({doc:"Path prefix for this deployment",default:"",env:"ROOT_PATH_PREFIX"})],Dt.prototype,"rootPathPrefix",2),dn([pr.Property({doc:"Require IAM Authorization on all created routes",default:!0,env:"REQUIRE_IAM_AUTHORIZATION"})],Dt.prototype,"requireIAMAuthorization",2),dn([pr.Property({doc:"ARN of parent deployer Lambda function",default:"",env:"PARENT_DEPLOYER_LAMBDA_ARN"})],Dt.prototype,"parentDeployerLambdaARN",2),dn([pr.Property({doc:"ARN of the Role used by the Edge to Origin Lambda function to invoke the app",default:"",env:"EDGE_TO_ORIGIN_ROLE_ARN",format:"StringArray"})],Dt.prototype,"edgeToOriginRoleARN",2),Dt=dn([pr.Config({file:"config.yml",validationMethod:"strict",parser:{extension:["yml","yaml"],parse:Jie},formats:{url:Wb.url,ipaddress:Wb.ipaddress,StringArray:oyt}})],Dt);var HB=Rt(co());function $B(e){return e==null||e===""}var np=class{static async CreateApp(t){let{dbManager:n,app:r}=t;return $B(r.appName)||$B(r.displayName)||$B(r.type)?{statusCode:400}:await HB.Application.Load({dbManager:n,key:{AppName:r.appName}})!==void 0?{statusCode:200}:(await new HB.Application({AppName:r.appName,DisplayName:r.displayName}).Save(n),{statusCode:201})}};var rp=class{static GetConfig(t){let{config:n,request:r}=t;if(r.type!=="getConfig")throw new Error("Invalid request type");return{statusCode:200,type:"getConfig",originRequestRoleARNs:Array.isArray(n.edgeToOriginRoleARN)?n.edgeToOriginRoleARN:n.edgeToOriginRoleARN?[n.edgeToOriginRoleARN]:[]}}};var dl=Rt(LG()),Lo=Rt(Hd()),cl=Rt(g$()),w$=Rt(co());var ZCe=Rt(YCe()),ce=class{};ce.Instance=new ZCe.LambdaLog({silent:process.env.JEST_WORKER_ID!==void 0});function al({lambdaARN:e,config:t}){var a;let n=e,r,i,s="function";return((a=e.match(/:/g))==null?void 0:a.length)===7?/^[0-9]+$/.test(e.substring(e.lastIndexOf(":")+1))?(s="version",n=e==null?void 0:e.substring(0,e.lastIndexOf(":")),r=e.substring(e.lastIndexOf(":")+1),ce.Instance.info(`Lambda ARN has Version: ${e}`)):(s="alias",n=e==null?void 0:e.substring(0,e.lastIndexOf(":")),i=e.substring(e.lastIndexOf(":")+1),ce.Instance.info(`Lambda ARN has Alias: ${e}`)):/:/.test(e)?(s="function",n=e,ce.Instance.info(`Lambda ARN does not have Alias: ${e}`)):(s="function",n=`arn:aws:lambda:${t.awsRegion}:${t.awsAccountID}:function:${e}`,ce.Instance.info(`Lambda ARN does not have Alias: ${e}`)),{lambdaARNBase:n,lambdaAlias:i,lambdaVersion:r,lambdaARNType:s}}function e0e(e){return e.appName==="[root]"?"":`${e.appName}/`}function Jr(e,t){return`${t.rootPathPrefix===""?"":`${t.rootPathPrefix}/`}${e0e(e)}${e.semVer}`.toLowerCase()}var _$=Rt(Hd()),$p=new Lo.LambdaClient({maxAttempts:8}),t0e=new cl.S3Client({maxAttempts:16}),n0e=new dl.ApiGatewayV2Client({maxAttempts:8});async function r0e(e){var l,f,m,S,b;let{dbManager:t,request:n,config:r}=e,{requestFromChildAccount:i=!1}=n;ce.Instance.debug("Got Body:",n);let s;if(!r.parentDeployerLambdaARN||i){if(s=await w$.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}}),s===void 0)return ce.Instance.info("Error: App/Version does not exist",{appName:n.appName,semVer:n.semVer}),{statusCode:404};let v=Jr(n,r)+"/";if(await l6t(v,r),s.Type==="lambda"){let N=r.apigwy.apiId;if(s.RouteIDAppVersion===""&&s.RouteIDAppVersionSplat==="")ce.Instance.warn("no RouteIDs to delete");else{for(let D of[s.RouteIDAppVersion,s.RouteIDAppVersionSplat])try{await n0e.send(new dl.DeleteRouteCommand({ApiId:N,RouteId:D}))}catch(M){if(M.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException removing route from API Gateway",{error:M,apiId:N,routeId:D}),{statusCode:401};ce.Instance.error("Caught unexpected error on app/ver route remove",{error:M,apiId:N,routeId:D})}if(s.IntegrationID!==void 0&&s.IntegrationID!=="")try{await n0e.send(new dl.DeleteIntegrationCommand({ApiId:N,IntegrationId:s.IntegrationID}))}catch(D){if(D.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException removing integration from API Gateway",{error:D,apiId:N,integrationId:s.IntegrationID}),{statusCode:401};ce.Instance.error("Caught unexpected error removing integration from API Gateway",{error:D,apiId:N,integrationId:s.IntegrationID})}}}}let a={appName:n.appName,semVer:n.semVer,type:"getVersion"},o=!s&&r.parentDeployerLambdaARN?await $p.send(new _$.InvokeCommand({FunctionName:r.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(a))})):void 0,d=o!=null&&o.Payload?JSON.parse(Buffer.from(o.Payload).toString("utf-8")):void 0;if(!d&&!s)throw new Error("Could not find version record and did not get version response from parent");let c={type:"getVersion",version:{appName:n.appName,semVer:n.semVer,type:s?s.Type:d.version.type,lambdaArn:s?s==null?void 0:s.LambdaARN:(l=d==null?void 0:d.version)==null?void 0:l.lambdaArn},statusCode:200};if(!i&&(((f=c.version)==null?void 0:f.type)==="lambda"||((m=c.version)==null?void 0:m.type)==="lambda-url")&&((S=c.version)==null?void 0:S.lambdaArn)){let{lambdaARNBase:v,lambdaAlias:N}=al({lambdaARN:(b=c.version)==null?void 0:b.lambdaArn,config:r});try{let D=await $p.send(new Lo.GetAliasCommand({FunctionName:v,Name:N}));if(await $p.send(new Lo.DeleteAliasCommand({FunctionName:v,Name:N})),D.FunctionVersion)try{await $p.send(new Lo.DeleteFunctionCommand({FunctionName:v,Qualifier:D.FunctionVersion}))}catch(M){if(M.name!=="ResourceConflictException")throw M;ce.Instance.info("Version is still in use by another alias, not deleting")}}catch(D){if(D.name!=="ResourceNotFoundException")throw D}}if(r.parentDeployerLambdaARN){let v={...n,requestFromChildAccount:!0},N=!s&&r.parentDeployerLambdaARN?await $p.send(new _$.InvokeCommand({FunctionName:r.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(v))})):void 0;if(!(N!=null&&N.Payload?JSON.parse(Buffer.from(N.Payload).toString("utf-8")):void 0))throw new Error("Did not get delete response from parent")}else await w$.Version.DeleteVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});return ce.Instance.info("finished request"),{statusCode:200}}async function l6t(e,t){var r;let n;do{let i=(n==null?void 0:n.NextContinuationToken)!==void 0?{ContinuationToken:n.NextContinuationToken}:{};n=await t0e.send(new cl.ListObjectsV2Command({Bucket:t.filestore.destinationBucket,Prefix:e,...i}));let s=[];(r=n.Contents)==null||r.map(a=>{s.push({Key:a.Key})}),s.length>0&&await t0e.send(new cl.DeleteObjectsCommand({Bucket:t.filestore.destinationBucket,Delete:{Objects:s}}))}while(n.IsTruncated)}var nr=Rt(LG()),Fn=Rt(Hd()),ll=Rt(co());var p0e=Rt(f0e()),Do=Rt(g$()),S$=new Do.S3Client({maxAttempts:8});async function y6t(e,t,n,r,i){e===void 0||e.Contents===void 0||await(0,p0e.default)(e.Contents,async s=>{var o;let a=(o=s.Key)==null?void 0:o.slice(n.length);await S$.send(new Do.CopyObjectCommand({CopySource:`${t}/${s.Key}`,Bucket:i.filestore.destinationBucket,Key:`${r}/${a}`})),await S$.send(new Do.DeleteObjectCommand({Bucket:t,Key:s.Key}))},{concurrency:20})}async function EP(e,t,n,r){let i;do{let s=(i==null?void 0:i.NextContinuationToken)!==void 0?{ContinuationToken:i.NextContinuationToken}:{};i=await S$.send(new Do.ListObjectsV2Command({Bucket:e,Prefix:t,...s})),await y6t(i,e,t,n,r)}while(i.IsTruncated)}var Da=new Fn.LambdaClient({}),C$=new nr.ApiGatewayV2Client({});async function g0e(e){let{dbManager:t,request:n,config:r}=e,{appType:i="lambda",overwrite:s=!1,startupType:a="iframe"}=n;ce.Instance.debug("Got Body:",n);let o=await ll.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});if(o!==void 0&&o.Status==="routed")if(s)ce.Instance.info("Warning: App/Version already exists",{appName:n.appName,semVer:n.semVer});else return ce.Instance.info("Error: App/Version already exists",{appName:n.appName,semVer:n.semVer}),{statusCode:409};if(a==="direct"&&["lambda"].includes(i))return ce.Instance.info("Error: Incompatible app type and startup type",{appType:i,startupType:a}),{statusCode:400};if(s&&o&&(o.DefaultFile=n.defaultFile,o.Type=i,o.StartupType=a,n.lambdaARN&&(o.LambdaARN=n.lambdaARN)),o===void 0&&(o=new ll.Version({AppName:n.appName,SemVer:n.semVer,Type:i,Status:"pending",DefaultFile:n.defaultFile,StartupType:a,...n.lambdaARN?{LambdaARN:n.lambdaARN}:{}}),await o.Save(t)),(s||o.Status==="pending")&&i!=="url"){let{stagingBucket:c}=r.filestore,l=Jr(n,r)+"/";await EP(c,l,Jr(n,r),r),o.DefaultFile=n.defaultFile,o.Status="assets-copied",await o.Save(t)}if(i==="lambda"){let c=r.apigwy.apiId;if(s||o.Status==="assets-copied"){let f=r.awsAccountID,m=r.awsRegion,S=!0;try{let b=await Da.send(new Fn.GetPolicyCommand({FunctionName:n.lambdaARN}));if(b.Policy!==void 0){let v=JSON.parse(b.Policy);v.Statement!==void 0&&v.Statement.filter(D=>D.Sid==="microapps-version-root"||D.Sid==="microapps-version").length===2&&(S=!1)}}catch(b){if(b.name!=="ResourceNotFoundException")throw b}S&&(await Da.send(new Fn.AddPermissionCommand({Principal:"apigateway.amazonaws.com",StatementId:"microapps-version-root",Action:"lambda:InvokeFunction",FunctionName:n.lambdaARN,SourceArn:`arn:aws:execute-api:${m}:${f}:${c}/*/*/${n.appName}/${n.semVer}`})),await Da.send(new Fn.AddPermissionCommand({Principal:"apigateway.amazonaws.com",StatementId:"microapps-version",Action:"lambda:InvokeFunction",FunctionName:n.lambdaARN,SourceArn:`arn:aws:execute-api:${m}:${f}:${c}/*/*/${n.appName}/${n.semVer}/{proxy+}`}))),o.Status="permissioned",await o.Save(t)}let l="";if(s||o.Status==="permissioned")if(o.IntegrationID!==void 0&&o.IntegrationID!=="")l=o.IntegrationID,ce.Instance.info("integration already created, skipping creation",{IntegrationId:l});else{try{l=(await C$.send(new nr.CreateIntegrationCommand({ApiId:c,IntegrationType:nr.IntegrationType.AWS_PROXY,IntegrationMethod:"POST",PayloadFormatVersion:"2.0",IntegrationUri:n.lambdaARN}))).IntegrationId}catch(f){if(f.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException adding integration to API Gateway",{error:f}),{statusCode:401}}o.IntegrationID=l,o.Status="integrated",await o.Save(t)}if(s||o.Status==="integrated"){if(o.RouteIDAppVersion!==void 0&&o.RouteIDAppVersion!=="")ce.Instance.info("route app/version already created, skipping creation",{IntegrationId:l,RouteIDAppVersion:o.RouteIDAppVersion});else try{let f=await C$.send(new nr.CreateRouteCommand({ApiId:c,Target:`integrations/${l}`,RouteKey:`ANY /${n.appName}/${n.semVer}`,AuthorizationType:r.requireIAMAuthorization?nr.AuthorizationType.AWS_IAM:nr.AuthorizationType.NONE}));ce.Instance.info("created RouteIDAppVersion",{result:f}),o.RouteIDAppVersion=`${f.RouteId}`}catch(f){if(f.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException adding route to API Gateway",{error:f}),{statusCode:401};ce.Instance.error("Caught unexpected error on app/ver route add"),ce.Instance.error(f)}if(o.RouteIDAppVersionSplat!==void 0&&o.RouteIDAppVersionSplat!=="")ce.Instance.info("route app/version/* already created, skipping creation",{IntegrationId:l,RouteIDAppVersionSplat:o.RouteIDAppVersionSplat});else try{let f=await C$.send(new nr.CreateRouteCommand({ApiId:c,Target:`integrations/${l}`,RouteKey:`ANY /${n.appName}/${n.semVer}/{proxy+}`,AuthorizationType:r.requireIAMAuthorization?nr.AuthorizationType.AWS_IAM:nr.AuthorizationType.NONE}));ce.Instance.info("created RouteIDAppVersionSplat",{result:f}),o.RouteIDAppVersionSplat=`${f.RouteId}`}catch(f){if(f.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException adding route to API Gateway",{error:f}),{statusCode:401};ce.Instance.error("Caught unexpected error on {proxy+} route add"),ce.Instance.error(f)}o.Status="routed",await o.Save(t)}}else if(i==="lambda-url"){if(!n.lambdaARN)throw new Error("Missing lambdaARN for lambda-url app type");let{lambdaARNBase:c,lambdaAlias:l}=al({lambdaARN:o.LambdaARN,config:r});if(s||o.Status==="assets-copied"){let f=await Da.send(new Fn.ListTagsCommand({Resource:c}));(f.Tags===void 0||f.Tags["microapp-managed"]!=="true")&&await Da.send(new Fn.TagResourceCommand({Resource:c,Tags:{"microapp-managed":"true"}})),o.Status="permissioned",await o.Save(t)}if(s||o.Status==="permissioned"){let f,m;try{m=await Da.send(new Fn.GetFunctionUrlConfigCommand({FunctionName:c,Qualifier:l})),m.FunctionUrl&&(f=m.FunctionUrl)}catch(S){if(S.name!=="ResourceNotFoundException")throw S}m!=null&&m.FunctionUrl||(f=(await Da.send(new Fn.CreateFunctionUrlConfigCommand({FunctionName:c,Qualifier:l,AuthType:"AWS_IAM"}))).FunctionUrl),o.Status="routed",f&&(o.URL=f),await o.Save(t)}}else if(i==="static")o.Status==="assets-copied"&&(o.Status="routed",await o.Save(t));else if(i==="url"){if(!n.url)throw new Error("Missing url for url app type");o.URL=n.url,o.Status="routed",await o.Save(t)}else throw new Error(`Unknown app type: ${i}`);let d=await ll.Rules.Load({dbManager:t,key:{AppName:n.appName}});return d===void 0&&(d=new ll.Rules({AppName:n.appName,RuleSet:{},Version:1}),d.RuleSet.default={SemVer:n.semVer,AttributeName:"",AttributeValue:""},await d.Save(t)),ce.Instance.info("finished request"),{statusCode:201}}var bP=Rt(Cd()),w0e=Rt(co());var h0e=Rt(require("crypto"));function y0e(e){return h0e.default.createHash("sha1").update(e).digest("hex")}var w6t=new bP.STSClient({maxAttempts:8});async function _0e(e){var l,f,m;let{dbManager:t,request:n,config:r}=e,{appName:i,semVer:s,needS3Creds:a=!0,overwrite:o=!1}=n,d={createAlias:"true"},c=await w0e.Version.LoadVersion({dbManager:t,key:{AppName:i,SemVer:s}});if(c!==void 0&&c.Status!=="pending")if(o)ce.Instance.info("Warning: App/Version already exists",{appName:n.appName,semVer:n.semVer});else return ce.Instance.info("Error: App/Version already exists",{appName:n.appName,semVer:n.semVer}),{statusCode:200,capabilities:d};if(ce.Instance.info("App/Version does not exist",{appName:i,semVer:s}),a){let S={Statement:[{Effect:"Allow",Action:["s3:PutObject","s3:GetObject","s3:AbortMultipartUpload"],Resource:[`arn:aws:s3:::${r.filestore.stagingBucket}/*`]},{Effect:"Allow",Action:["s3:ListBucket"],Resource:[`arn:aws:s3:::${r.filestore.stagingBucket}`]}],Version:"2012-10-17"};ce.Instance.debug("Temp IAM Policy",{policy:JSON.stringify(S)});let b=await w6t.send(new bP.AssumeRoleCommand({RoleArn:`arn:aws:iam::${r.awsAccountID}:role/${r.uploadRoleName}`,DurationSeconds:60*60,RoleSessionName:y0e(Jr(n,r)),Policy:JSON.stringify(S)}));return ce.Instance.info("finished request - returning s3 creds"),{statusCode:404,capabilities:d,s3UploadUrl:`s3://${r.filestore.stagingBucket}/${Jr(n,r)}`,awsCredentials:{accessKeyId:(l=b.Credentials)==null?void 0:l.AccessKeyId,secretAccessKey:(f=b.Credentials)==null?void 0:f.SecretAccessKey,sessionToken:(m=b.Credentials)==null?void 0:m.SessionToken}}}else return ce.Instance.info("finished request - not returning s3 creds"),{capabilities:d,statusCode:404}}var v0e=Rt(co());async function S0e(e){let{dbManager:t,request:n}=e;ce.Instance.debug("Got Body:",n);let r=await v0e.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});return r===void 0?(ce.Instance.info("Error: App/Version does not exist",{appName:n.appName,semVer:n.semVer}),{type:"getVersion",statusCode:404}):{type:"getVersion",statusCode:200,version:{appName:r.AppName,semVer:r.SemVer,type:r.Type,lambdaArn:r.LambdaARN}}}var zt=Rt(Hd()),E0e=require("crypto"),b0e=require("util");function C0e(e){return{version:e,alias:`v${e.replace(/\./g,"_")}`}}var _6t=(0,b0e.promisify)(setTimeout),gr=new zt.LambdaClient({});async function A0e(e){var m,S;let{config:t,request:n}=e,{lambdaARN:r,overwrite:i=!1,semVer:s}=n,a=al({lambdaARN:r,config:t});if(a.lambdaVersion==="$LATEST")throw new Error(`Lambda version cannot be $LATEST, must be a version number: ${r}`);if(a.lambdaARNType==="alias")throw new Error(`Lambda version cannot be an alias: ${r}`);a.lambdaARNType==="function"&&ce.Instance.warn("Lambda ARN is a function, not a version - It is safer to publish a version using IaC and to pass that version to `pwrdrvr publish`",{lambdaARN:r});let o=a.lambdaVersion;if(a.lambdaARNType==="function"){ce.Instance.info("Creating version for Lambda $LATEST");let b=await gr.send(new zt.PublishVersionCommand({FunctionName:a.lambdaARNBase}));o=b.Version,ce.Instance.info(`Lambda version created: ${b.Version}`);let v=b.LastUpdateStatus;for(let N=0;N<5;N++){if(v==="Successful"){ce.Instance.info(`Lambda function updated, version: ${o}`);break}await _6t(1e3*N);let D=await gr.send(new zt.GetFunctionCommand({FunctionName:a.lambdaARNBase,Qualifier:o}));v=(m=D==null?void 0:D.Configuration)==null?void 0:m.LastUpdateStatus}}if(!o)throw new Error(`Lambda version not found: ${o}, for lambda: ${r}`);try{if(((S=(await gr.send(new zt.GetFunctionCommand({FunctionName:a.lambdaARNBase,Qualifier:o}))).Configuration)==null?void 0:S.FunctionArn)===void 0)return ce.Instance.error(`Lambda version not found: ${o}, for lambda: ${r}`),{statusCode:404,errorMessage:`Lambda version not found: ${o}, for lambda: ${r}`}}catch(b){return ce.Instance.error("Error getting Lambda version",b),b.name==="ResourceNotFoundException"?{statusCode:404,errorMessage:b.message}:{statusCode:500,errorMessage:b.message}}let d=C0e(s),c=await C6t({lambdaArnBase:a.lambdaARNBase,lambdaVersion:o,overwrite:i,versions:d});await v6t({lambdaARNBase:a.lambdaARNBase});let{url:l}=await S6t({lambdaARNBase:a.lambdaARNBase,lambdaAlias:d.alias}),f={...c,functionUrl:l};return await E6t({config:t,lambdaBaseARN:a.lambdaARNBase,lambdaAlias:d.alias}),f}async function v6t({lambdaARNBase:e}){let t=await gr.send(new zt.ListTagsCommand({Resource:e}));(t.Tags===void 0||t.Tags["microapp-managed"]!=="true")&&await gr.send(new zt.TagResourceCommand({Resource:e,Tags:{"microapp-managed":"true"}}))}async function S6t({lambdaARNBase:e,lambdaAlias:t}){let n,r;try{r=await gr.send(new zt.GetFunctionUrlConfigCommand({FunctionName:e,Qualifier:t})),r.FunctionUrl&&(n=r.FunctionUrl)}catch(i){if(i.name!=="ResourceNotFoundException")throw i}return r!=null&&r.FunctionUrl||(n=(await gr.send(new zt.CreateFunctionUrlConfigCommand({FunctionName:e,Qualifier:t,AuthType:"AWS_IAM"}))).FunctionUrl),{url:n}}async function C6t(e){let{lambdaArnBase:t,lambdaVersion:n,overwrite:r,versions:i}=e;try{let a=await gr.send(new zt.GetAliasCommand({FunctionName:t,Name:i.alias}));if(n&&a.FunctionVersion===n&&a.AliasArn)return ce.Instance.info(`Lambda alias already exists and already points to the desired version: ${n}`),{statusCode:200,type:"lambdaAlias",lambdaAliasARN:a.AliasArn,actionTaken:"verified"};if(!r&&a.FunctionVersion!==n)throw ce.Instance.info(`Lambda alias already exists and does not point to the desired version: ${n}`),new Error("Lambda alias already exists, points to wrong version");ce.Instance.info(`Updating the lambda alias for the desired version: ${n}`);let o=await gr.send(new zt.UpdateAliasCommand({FunctionName:t,Name:i.alias,FunctionVersion:n}));if(ce.Instance.info(`Lambda alias updated, name: ${o.Name}, arn: ${o.AliasArn}`),!o.AliasArn)throw new Error("AliasArn failed to create");return{statusCode:200,type:"lambdaAlias",lambdaAliasARN:o.AliasArn,actionTaken:"updated"}}catch(a){if(a.name!=="ResourceNotFoundException")throw a}ce.Instance.info(`Creating the lambda alias for the desired version: ${n}, lambdaArnBase: ${t}`);let s=await gr.send(new zt.CreateAliasCommand({FunctionName:t,Name:i.alias,FunctionVersion:n}));if(ce.Instance.info(`Lambda alias created, name: ${s.Name}, arn: ${s.AliasArn}, points to version: ${s.FunctionVersion}`),!s.AliasArn)throw new Error("AliasArn failed to create");return{statusCode:201,type:"lambdaAlias",lambdaAliasARN:s.AliasArn,actionTaken:"created"}}async function E6t({config:e,lambdaBaseARN:t,lambdaAlias:n}){if(!e.parentDeployerLambdaARN){ce.Instance.info("No parent account, skipping cross-account permissions");return}ce.Instance.info("Adding cross-account permissions to lambda alias",{lambdaBaseARN:t,lambdaAlias:n});let r=e.edgeToOriginRoleARN&&e.edgeToOriginRoleARN.length>0?[...e.edgeToOriginRoleARN]:[],i={type:"getConfig"},s=await gr.send(new zt.InvokeCommand({FunctionName:e.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(i))}));if(s.$metadata.httpStatusCode===200&&s.Payload!==void 0){let c=JSON.parse(Buffer.from(s.Payload).toString("utf-8"));if(c.statusCode!==400){if(c.statusCode!==200)throw new Error(`Get config failed: ${JSON.stringify(c)}`);if(c.originRequestRoleARNs&&c.originRequestRoleARNs.length>0){let l=c.originRequestRoleARNs.filter(f=>f&&!r.includes(f));l.length>0&&r.push(...l)}}else ce.Instance.info("Get config failed, adding only locally configurd role")}else throw new Error(`AddCrossAccountPermissions - Lambda Invoke Failed: ${JSON.stringify(s)}`);let a;try{let c=await gr.send(new zt.GetPolicyCommand({FunctionName:t,Qualifier:n}));c.Policy&&(a=JSON.parse(c.Policy))}catch(c){if(c.name!=="ResourceNotFoundException")throw c}a||(a={Version:"2012-10-17",Id:`${t}/default`,Statement:[]});let o=a.Statement.filter(c=>c.Sid.startsWith("microapps-edge-to-origin")).map(c=>c.Principal.AWS),d=r.filter(c=>!o.includes(c));for(let c of d){let l=(0,E0e.createHash)("sha256").update(c).digest("hex").substring(0,8);await gr.send(new zt.AddPermissionCommand({Principal:c,StatementId:`microapps-edge-to-origin-${l}`,Action:"lambda:InvokeFunctionUrl",FunctionName:t,Qualifier:n,FunctionUrlAuthType:"AWS_IAM"}))}}var ul=Rt(co());async function x0e(e){let{dbManager:t,request:n,config:r}=e,{appType:i="lambda",overwrite:s=!1,startupType:a="iframe"}=n;ce.Instance.debug("Got Body:",n);let o=await ul.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});if(o!==void 0&&o.Status==="routed")if(s)ce.Instance.info("Warning: App/Version already exists",{appName:n.appName,semVer:n.semVer});else return ce.Instance.info("Error: App/Version already exists",{appName:n.appName,semVer:n.semVer}),{statusCode:409};if(a==="direct"&&["lambda"].includes(i))return ce.Instance.info("Error: Incompatible app type and startup type",{appType:i,startupType:a}),{statusCode:400};if(s&&o&&(o.DefaultFile=n.defaultFile,o.Type=i,o.StartupType=a,n.lambdaARN&&(o.LambdaARN=n.lambdaARN)),o===void 0&&(o=new ul.Version({AppName:n.appName,SemVer:n.semVer,Type:i,Status:"pending",DefaultFile:n.defaultFile,StartupType:a,...n.lambdaARN?{LambdaARN:n.lambdaARN}:{}}),await o.Save(t)),(s||o.Status==="pending")&&i!=="url"){let{stagingBucket:c}=r.filestore,l=Jr(n,r)+"/";await EP(c,l,Jr(n,r),r),o.DefaultFile=n.defaultFile,o.Status="assets-copied",await o.Save(t)}if(i==="lambda")o.Status="routed",await o.Save(t);else if(i==="lambda-url"){if(!n.url)throw new Error("Missing url for lambda-url app type");o.Status="routed",o.URL=n.url,await o.Save(t)}else if(i==="static")o.Status==="assets-copied"&&(o.Status="routed",await o.Save(t));else if(i==="url"){if(!n.url)throw new Error("Missing url for url app type");o.URL=n.url,o.Status="routed",await o.Save(t)}else throw new Error(`Unknown app type: ${i}`);let d=await ul.Rules.Load({dbManager:t,key:{AppName:n.appName}});return d===void 0&&(d=new ul.Rules({AppName:n.appName,RuleSet:{},Version:1}),d.RuleSet.default={SemVer:n.semVer,AttributeName:"",AttributeValue:""},await d.Save(t)),ce.Instance.info("finished request"),{statusCode:201}}var b6t=ce.Instance,A6t=new AP.LambdaClient({}),$i,b$=new R0e.DynamoDBClient({maxAttempts:8}),x6t="2023-01-31-01";ce.Instance.info("Deployer build trigger",{buildTrigger:x6t});function R6t(e){$i=e.dbManager,b$=e.dynamoClient}$i=new E$.DBManager({dynamoClient:b$,tableName:Dt.instance.db.tableName});var kr=Dt.instance;ce.Instance.info("Deployer config",kr);async function T6t(e,t){if(b6t.options.meta={awsRequestId:t==null?void 0:t.awsRequestId,requestType:e.type},$i===void 0&&($i=new E$.DBManager({dynamoClient:b$,tableName:Dt.instance.db.tableName})),kr.awsAccountID===""&&(t==null?void 0:t.invokedFunctionArn)!==void 0){let r=t.invokedFunctionArn.split(":")[4];r!==""&&(kr.awsAccountID=r)}ce.Instance.info("received request",{request:e});try{if(kr.parentDeployerLambdaARN){if(["createApp","deployVersionPreflight","deployVersionLite"].includes(e.type)){let n=await A6t.send(new AP.InvokeCommand({FunctionName:kr.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(e))})),r=n.Payload?JSON.parse(Buffer.from(n.Payload).toString()):{statusCode:500};return ce.Instance.info("response from parent deployer",{...n,Payload:r}),r}else if(["deployVersion"].includes(e.type))return{statusCode:400,errorMessage:"Deployer is in proxy mode - `deployVersion` is not allowed"}}switch(e.type){case"createApp":{let n=e;return await np.CreateApp({dbManager:$i,app:n})}case"deleteVersion":return await r0e({dbManager:$i,request:e,config:kr});case"deployVersionPreflight":return await _0e({dbManager:$i,request:e,config:kr});case"deployVersion":return await g0e({dbManager:$i,request:e,config:kr});case"deployVersionLite":return await x0e({dbManager:$i,request:e,config:kr});case"getVersion":return await S0e({dbManager:$i,request:e,config:kr});case"getConfig":{let n=e;return rp.GetConfig({request:n,config:kr})}case"lambdaAlias":{let r=await A0e({request:e,config:kr});return ce.Instance.info("lambdaAlias response",{response:r}),r}default:return{statusCode:400}}}catch(n){return ce.Instance.error("Caught unexpected exception in handler"),ce.Instance.error(n),{statusCode:500}}}0&&(module.exports={handler,overrideDBManager});
|
|
81
|
+
`:""}var rft=nft,ift={dump:rft};function KO(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var Jie=Lie.load,Pin=Lie.loadAll,Nin=ift.dump;var kin=KO("safeLoad","load"),zin=KO("safeLoadAll","loadAll"),qin=KO("safeDump","dump");var pr=Rt(hc()),pde=Rt(hc());var Kb=Rt(ude()),Xb=class{static async getExistingFiles(t){let n=[];for(let r of t)await(0,Kb.pathExists)(r)&&n.push(r);return n}static getExistingFilesSync(t){let n=[];for(let r of t)(0,Kb.pathExistsSync)(r)&&n.push(r);return n}};var mde=Rt(hc());var ep=class{};dn([(0,mde.Property)({doc:"ID of API Gateway to integrate with",nullable:!1,default:"none",env:"APIGWY_ID"})],ep.prototype,"apiId",2);var fde=Rt(hc());var tp=class{};dn([(0,fde.Property)({doc:"DynamoDB Table Name",default:"MicroApps",env:"DATABASE_TABLE_NAME"})],tp.prototype,"tableName",2);var VB=Rt(hc());var Ec=class{};dn([(0,VB.Property)({doc:"Staging bucket to copy staged apps from",default:"microapps-staging",env:"FILESTORE_STAGING_BUCKET"})],Ec.prototype,"stagingBucket",2),dn([(0,VB.Property)({doc:"Destination bucket to copy staged apps to",default:"microapps",env:"FILESTORE_DEST_BUCKET"})],Ec.prototype,"destinationBucket",2);var oyt={name:"StringArray",coerce:e=>(e??"").split(","),validate:()=>{}},Dt=class{static configFiles(){let t=["./configs/config.yaml","./configs/config.yml",`./configs/config-${Dt.envLevel}.yaml`,`./configs/config-${Dt.envLevel}.yml`];return Xb.getExistingFilesSync(t)}static get instance(){if(Dt._instance===void 0){let t=new pde.TSConvict(Dt);Dt._instance=t.load(Dt.configFiles())}return Dt._instance}static get envLevel(){let t=process.env.NODE_ENV||"dev";return t.startsWith("prod")?"prod":t==="qa"?"qa":t==="local"?"local":"dev"}};dn([pr.Property(tp)],Dt.prototype,"db",2),dn([pr.Property(ep)],Dt.prototype,"apigwy",2),dn([pr.Property(Ec)],Dt.prototype,"filestore",2),dn([pr.Property({doc:"AWS Account ID for app Lambda function",default:"",env:"AWS_ACCOUNT_ID"})],Dt.prototype,"awsAccountID",2),dn([pr.Property({doc:"AWS Region for app Lambda function",default:"us-east-1",env:"AWS_REGION"})],Dt.prototype,"awsRegion",2),dn([pr.Property({doc:"Role name to be used for temp STS upload tokens",default:"microapps-deployer-upload-dev",env:"UPLOAD_ROLE_NAME"})],Dt.prototype,"uploadRoleName",2),dn([pr.Property({doc:"Path prefix for this deployment",default:"",env:"ROOT_PATH_PREFIX"})],Dt.prototype,"rootPathPrefix",2),dn([pr.Property({doc:"Require IAM Authorization on all created routes",default:!0,env:"REQUIRE_IAM_AUTHORIZATION"})],Dt.prototype,"requireIAMAuthorization",2),dn([pr.Property({doc:"ARN of parent deployer Lambda function",default:"",env:"PARENT_DEPLOYER_LAMBDA_ARN"})],Dt.prototype,"parentDeployerLambdaARN",2),dn([pr.Property({doc:"ARN of the Role used by the Edge to Origin Lambda function to invoke the app",default:"",env:"EDGE_TO_ORIGIN_ROLE_ARN",format:"StringArray"})],Dt.prototype,"edgeToOriginRoleARN",2),Dt=dn([pr.Config({file:"config.yml",validationMethod:"strict",parser:{extension:["yml","yaml"],parse:Jie},formats:{url:Wb.url,ipaddress:Wb.ipaddress,StringArray:oyt}})],Dt);var HB=Rt(co());function $B(e){return e==null||e===""}var np=class{static async CreateApp(t){let{dbManager:n,app:r}=t;return $B(r.appName)||$B(r.displayName)||$B(r.type)?{statusCode:400}:await HB.Application.Load({dbManager:n,key:{AppName:r.appName}})!==void 0?{statusCode:200}:(await new HB.Application({AppName:r.appName,DisplayName:r.displayName}).Save(n),{statusCode:201})}};var rp=class{static GetConfig(t){let{config:n,request:r}=t;if(r.type!=="getConfig")throw new Error("Invalid request type");return{statusCode:200,type:"getConfig",originRequestRoleARNs:Array.isArray(n.edgeToOriginRoleARN)?n.edgeToOriginRoleARN:n.edgeToOriginRoleARN?[n.edgeToOriginRoleARN]:[]}}};var dl=Rt(LG()),Lo=Rt(Hd()),cl=Rt(g$()),w$=Rt(co());var ZCe=Rt(YCe()),ce=class{};ce.Instance=new ZCe.LambdaLog({silent:process.env.JEST_WORKER_ID!==void 0});function al({lambdaARN:e,config:t}){var a;let n=e,r,i,s="function";return((a=e.match(/:/g))==null?void 0:a.length)===7?/^[0-9]+$/.test(e.substring(e.lastIndexOf(":")+1))?(s="version",n=e==null?void 0:e.substring(0,e.lastIndexOf(":")),r=e.substring(e.lastIndexOf(":")+1),ce.Instance.info(`Lambda ARN has Version: ${e}`)):(s="alias",n=e==null?void 0:e.substring(0,e.lastIndexOf(":")),i=e.substring(e.lastIndexOf(":")+1),ce.Instance.info(`Lambda ARN has Alias: ${e}`)):/:/.test(e)?(s="function",n=e,ce.Instance.info(`Lambda ARN does not have Alias: ${e}`)):(s="function",n=`arn:aws:lambda:${t.awsRegion}:${t.awsAccountID}:function:${e}`,ce.Instance.info(`Lambda ARN does not have Alias: ${e}`)),{lambdaARNBase:n,lambdaAlias:i,lambdaVersion:r,lambdaARNType:s}}function e0e(e){return e.appName==="[root]"?"":`${e.appName}/`}function Jr(e,t){return`${t.rootPathPrefix===""?"":`${t.rootPathPrefix}/`}${e0e(e)}${e.semVer}`.toLowerCase()}var _$=Rt(Hd()),$p=new Lo.LambdaClient({maxAttempts:8}),t0e=new cl.S3Client({maxAttempts:16}),n0e=new dl.ApiGatewayV2Client({maxAttempts:8});async function r0e(e){var l,f,m,S,b;let{dbManager:t,request:n,config:r}=e,{requestFromChildAccount:i=!1}=n;ce.Instance.debug("Got Body:",n);let s;if(!r.parentDeployerLambdaARN||i){if(s=await w$.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}}),s===void 0)return ce.Instance.info("Error: App/Version does not exist",{appName:n.appName,semVer:n.semVer}),{statusCode:404};let v=Jr(n,r)+"/";if(await l6t(v,r),s.Type==="lambda"){let N=r.apigwy.apiId;if(s.RouteIDAppVersion===""&&s.RouteIDAppVersionSplat==="")ce.Instance.warn("no RouteIDs to delete");else{for(let D of[s.RouteIDAppVersion,s.RouteIDAppVersionSplat])try{await n0e.send(new dl.DeleteRouteCommand({ApiId:N,RouteId:D}))}catch(M){if(M.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException removing route from API Gateway",{error:M,apiId:N,routeId:D}),{statusCode:401};ce.Instance.error("Caught unexpected error on app/ver route remove",{error:M,apiId:N,routeId:D})}if(s.IntegrationID!==void 0&&s.IntegrationID!=="")try{await n0e.send(new dl.DeleteIntegrationCommand({ApiId:N,IntegrationId:s.IntegrationID}))}catch(D){if(D.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException removing integration from API Gateway",{error:D,apiId:N,integrationId:s.IntegrationID}),{statusCode:401};ce.Instance.error("Caught unexpected error removing integration from API Gateway",{error:D,apiId:N,integrationId:s.IntegrationID})}}}}let a={appName:n.appName,semVer:n.semVer,type:"getVersion"},o=!s&&r.parentDeployerLambdaARN?await $p.send(new _$.InvokeCommand({FunctionName:r.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(a))})):void 0,d=o!=null&&o.Payload?JSON.parse(Buffer.from(o.Payload).toString("utf-8")):void 0;if(!d&&!s)throw new Error("Could not find version record and did not get version response from parent");let c={type:"getVersion",version:{appName:n.appName,semVer:n.semVer,type:s?s.Type:d.version.type,lambdaArn:s?s==null?void 0:s.LambdaARN:(l=d==null?void 0:d.version)==null?void 0:l.lambdaArn},statusCode:200};if(!i&&(((f=c.version)==null?void 0:f.type)==="lambda"||((m=c.version)==null?void 0:m.type)==="lambda-url")&&((S=c.version)==null?void 0:S.lambdaArn)){let{lambdaARNBase:v,lambdaAlias:N}=al({lambdaARN:(b=c.version)==null?void 0:b.lambdaArn,config:r});try{let D=await $p.send(new Lo.GetAliasCommand({FunctionName:v,Name:N}));if(await $p.send(new Lo.DeleteAliasCommand({FunctionName:v,Name:N})),D.FunctionVersion)try{await $p.send(new Lo.DeleteFunctionCommand({FunctionName:v,Qualifier:D.FunctionVersion}))}catch(M){if(M.name!=="ResourceConflictException")throw M;ce.Instance.info("Version is still in use by another alias, not deleting")}}catch(D){if(D.name!=="ResourceNotFoundException")throw D}}if(r.parentDeployerLambdaARN){let v={...n,requestFromChildAccount:!0},N=!s&&r.parentDeployerLambdaARN?await $p.send(new _$.InvokeCommand({FunctionName:r.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(v))})):void 0;if(!(N!=null&&N.Payload?JSON.parse(Buffer.from(N.Payload).toString("utf-8")):void 0))throw new Error("Did not get delete response from parent")}else await w$.Version.DeleteVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});return ce.Instance.info("finished request"),{statusCode:200}}async function l6t(e,t){var r;let n;do{let i=(n==null?void 0:n.NextContinuationToken)!==void 0?{ContinuationToken:n.NextContinuationToken}:{};n=await t0e.send(new cl.ListObjectsV2Command({Bucket:t.filestore.destinationBucket,Prefix:e,...i}));let s=[];(r=n.Contents)==null||r.map(a=>{s.push({Key:a.Key})}),s.length>0&&await t0e.send(new cl.DeleteObjectsCommand({Bucket:t.filestore.destinationBucket,Delete:{Objects:s}}))}while(n.IsTruncated)}var nr=Rt(LG()),Fn=Rt(Hd()),ll=Rt(co());var p0e=Rt(f0e()),Do=Rt(g$()),S$=new Do.S3Client({maxAttempts:8});async function y6t(e,t,n,r,i){e===void 0||e.Contents===void 0||await(0,p0e.default)(e.Contents,async s=>{var o;let a=(o=s.Key)==null?void 0:o.slice(n.length);await S$.send(new Do.CopyObjectCommand({CopySource:`${t}/${s.Key}`,Bucket:i.filestore.destinationBucket,Key:`${r}/${a}`})),await S$.send(new Do.DeleteObjectCommand({Bucket:t,Key:s.Key}))},{concurrency:20})}async function EP(e,t,n,r){let i;do{let s=(i==null?void 0:i.NextContinuationToken)!==void 0?{ContinuationToken:i.NextContinuationToken}:{};i=await S$.send(new Do.ListObjectsV2Command({Bucket:e,Prefix:t,...s})),await y6t(i,e,t,n,r)}while(i.IsTruncated)}var Da=new Fn.LambdaClient({}),C$=new nr.ApiGatewayV2Client({});async function g0e(e){let{dbManager:t,request:n,config:r}=e,{appType:i="lambda",overwrite:s=!1,startupType:a="iframe"}=n;ce.Instance.debug("Got Body:",n);let o=await ll.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});if(o!==void 0&&o.Status==="routed")if(s)ce.Instance.info("Warning: App/Version already exists",{appName:n.appName,semVer:n.semVer});else return ce.Instance.info("Error: App/Version already exists",{appName:n.appName,semVer:n.semVer}),{statusCode:409};if(a==="direct"&&["lambda"].includes(i))return ce.Instance.info("Error: Incompatible app type and startup type",{appType:i,startupType:a}),{statusCode:400};if(s&&o&&(o.DefaultFile=n.defaultFile,o.Type=i,o.StartupType=a,n.lambdaARN&&(o.LambdaARN=n.lambdaARN)),o===void 0&&(o=new ll.Version({AppName:n.appName,SemVer:n.semVer,Type:i,Status:"pending",DefaultFile:n.defaultFile,StartupType:a,...n.lambdaARN?{LambdaARN:n.lambdaARN}:{}}),await o.Save(t)),(s||o.Status==="pending")&&i!=="url"){let{stagingBucket:c}=r.filestore,l=Jr(n,r)+"/";await EP(c,l,Jr(n,r),r),o.DefaultFile=n.defaultFile,o.Status="assets-copied",await o.Save(t)}if(i==="lambda"){let c=r.apigwy.apiId;if(s||o.Status==="assets-copied"){let f=r.awsAccountID,m=r.awsRegion,S=!0;try{let b=await Da.send(new Fn.GetPolicyCommand({FunctionName:n.lambdaARN}));if(b.Policy!==void 0){let v=JSON.parse(b.Policy);v.Statement!==void 0&&v.Statement.filter(D=>D.Sid==="microapps-version-root"||D.Sid==="microapps-version").length===2&&(S=!1)}}catch(b){if(b.name!=="ResourceNotFoundException")throw b}S&&(await Da.send(new Fn.AddPermissionCommand({Principal:"apigateway.amazonaws.com",StatementId:"microapps-version-root",Action:"lambda:InvokeFunction",FunctionName:n.lambdaARN,SourceArn:`arn:aws:execute-api:${m}:${f}:${c}/*/*/${n.appName}/${n.semVer}`})),await Da.send(new Fn.AddPermissionCommand({Principal:"apigateway.amazonaws.com",StatementId:"microapps-version",Action:"lambda:InvokeFunction",FunctionName:n.lambdaARN,SourceArn:`arn:aws:execute-api:${m}:${f}:${c}/*/*/${n.appName}/${n.semVer}/{proxy+}`}))),o.Status="permissioned",await o.Save(t)}let l="";if(s||o.Status==="permissioned")if(o.IntegrationID!==void 0&&o.IntegrationID!=="")l=o.IntegrationID,ce.Instance.info("integration already created, skipping creation",{IntegrationId:l});else{try{l=(await C$.send(new nr.CreateIntegrationCommand({ApiId:c,IntegrationType:nr.IntegrationType.AWS_PROXY,IntegrationMethod:"POST",PayloadFormatVersion:"2.0",IntegrationUri:n.lambdaARN}))).IntegrationId}catch(f){if(f.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException adding integration to API Gateway",{error:f}),{statusCode:401}}o.IntegrationID=l,o.Status="integrated",await o.Save(t)}if(s||o.Status==="integrated"){if(o.RouteIDAppVersion!==void 0&&o.RouteIDAppVersion!=="")ce.Instance.info("route app/version already created, skipping creation",{IntegrationId:l,RouteIDAppVersion:o.RouteIDAppVersion});else try{let f=await C$.send(new nr.CreateRouteCommand({ApiId:c,Target:`integrations/${l}`,RouteKey:`ANY /${n.appName}/${n.semVer}`,AuthorizationType:r.requireIAMAuthorization?nr.AuthorizationType.AWS_IAM:nr.AuthorizationType.NONE}));ce.Instance.info("created RouteIDAppVersion",{result:f}),o.RouteIDAppVersion=`${f.RouteId}`}catch(f){if(f.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException adding route to API Gateway",{error:f}),{statusCode:401};ce.Instance.error("Caught unexpected error on app/ver route add"),ce.Instance.error(f)}if(o.RouteIDAppVersionSplat!==void 0&&o.RouteIDAppVersionSplat!=="")ce.Instance.info("route app/version/* already created, skipping creation",{IntegrationId:l,RouteIDAppVersionSplat:o.RouteIDAppVersionSplat});else try{let f=await C$.send(new nr.CreateRouteCommand({ApiId:c,Target:`integrations/${l}`,RouteKey:`ANY /${n.appName}/${n.semVer}/{proxy+}`,AuthorizationType:r.requireIAMAuthorization?nr.AuthorizationType.AWS_IAM:nr.AuthorizationType.NONE}));ce.Instance.info("created RouteIDAppVersionSplat",{result:f}),o.RouteIDAppVersionSplat=`${f.RouteId}`}catch(f){if(f.name==="AccessDeniedException")return ce.Instance.error("AccessDeniedException adding route to API Gateway",{error:f}),{statusCode:401};ce.Instance.error("Caught unexpected error on {proxy+} route add"),ce.Instance.error(f)}o.Status="routed",await o.Save(t)}}else if(i==="lambda-url"){if(!n.lambdaARN)throw new Error("Missing lambdaARN for lambda-url app type");let{lambdaARNBase:c,lambdaAlias:l}=al({lambdaARN:o.LambdaARN,config:r});if(s||o.Status==="assets-copied"){let f=await Da.send(new Fn.ListTagsCommand({Resource:c}));(f.Tags===void 0||f.Tags["microapp-managed"]!=="true")&&await Da.send(new Fn.TagResourceCommand({Resource:c,Tags:{"microapp-managed":"true"}})),o.Status="permissioned",await o.Save(t)}if(s||o.Status==="permissioned"){let f,m;try{m=await Da.send(new Fn.GetFunctionUrlConfigCommand({FunctionName:c,Qualifier:l})),m.FunctionUrl&&(f=m.FunctionUrl)}catch(S){if(S.name!=="ResourceNotFoundException")throw S}m!=null&&m.FunctionUrl||(f=(await Da.send(new Fn.CreateFunctionUrlConfigCommand({FunctionName:c,Qualifier:l,AuthType:"AWS_IAM"}))).FunctionUrl),o.Status="routed",f&&(o.URL=f),await o.Save(t)}}else if(i==="static")o.Status==="assets-copied"&&(o.Status="routed",await o.Save(t));else if(i==="url"){if(!n.url)throw new Error("Missing url for url app type");o.URL=n.url,o.Status="routed",await o.Save(t)}else throw new Error(`Unknown app type: ${i}`);let d=await ll.Rules.Load({dbManager:t,key:{AppName:n.appName}});return d===void 0&&(d=new ll.Rules({AppName:n.appName,RuleSet:{},Version:1}),d.RuleSet.default={SemVer:n.semVer,AttributeName:"",AttributeValue:""},await d.Save(t)),ce.Instance.info("finished request"),{statusCode:201}}var bP=Rt(Cd()),w0e=Rt(co());var h0e=Rt(require("crypto"));function y0e(e){return h0e.default.createHash("sha1").update(e).digest("hex")}var w6t=new bP.STSClient({maxAttempts:8});async function _0e(e){var l,f,m;let{dbManager:t,request:n,config:r}=e,{appName:i,semVer:s,needS3Creds:a=!0,overwrite:o=!1}=n,d={createAlias:"true"},c=await w0e.Version.LoadVersion({dbManager:t,key:{AppName:i,SemVer:s}});if(c!==void 0&&c.Status!=="pending")if(o)ce.Instance.info("Warning: App/Version already exists",{appName:n.appName,semVer:n.semVer});else return ce.Instance.info("Error: App/Version already exists",{appName:n.appName,semVer:n.semVer}),{statusCode:200,capabilities:d};if(ce.Instance.info("App/Version does not exist",{appName:i,semVer:s}),a){let S={Statement:[{Effect:"Allow",Action:["s3:PutObject","s3:GetObject","s3:AbortMultipartUpload"],Resource:[`arn:aws:s3:::${r.filestore.stagingBucket}/*`]},{Effect:"Allow",Action:["s3:ListBucket"],Resource:[`arn:aws:s3:::${r.filestore.stagingBucket}`]}],Version:"2012-10-17"};ce.Instance.debug("Temp IAM Policy",{policy:JSON.stringify(S)});let b=await w6t.send(new bP.AssumeRoleCommand({RoleArn:`arn:aws:iam::${r.awsAccountID}:role/${r.uploadRoleName}`,DurationSeconds:60*60,RoleSessionName:y0e(Jr(n,r)),Policy:JSON.stringify(S)}));return ce.Instance.info("finished request - returning s3 creds"),{statusCode:404,capabilities:d,s3UploadUrl:`s3://${r.filestore.stagingBucket}/${Jr(n,r)}`,awsCredentials:{accessKeyId:(l=b.Credentials)==null?void 0:l.AccessKeyId,secretAccessKey:(f=b.Credentials)==null?void 0:f.SecretAccessKey,sessionToken:(m=b.Credentials)==null?void 0:m.SessionToken}}}else return ce.Instance.info("finished request - not returning s3 creds"),{capabilities:d,statusCode:404}}var v0e=Rt(co());async function S0e(e){let{dbManager:t,request:n}=e;ce.Instance.debug("Got Body:",n);let r=await v0e.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});return r===void 0?(ce.Instance.info("Error: App/Version does not exist",{appName:n.appName,semVer:n.semVer}),{type:"getVersion",statusCode:404}):{type:"getVersion",statusCode:200,version:{appName:r.AppName,semVer:r.SemVer,type:r.Type,lambdaArn:r.LambdaARN}}}var zt=Rt(Hd()),E0e=require("crypto"),b0e=require("util");function C0e(e){return{version:e,alias:`v${e.replace(/\./g,"_")}`}}var _6t=(0,b0e.promisify)(setTimeout),gr=new zt.LambdaClient({});async function A0e(e){var m,S;let{config:t,request:n}=e,{lambdaARN:r,overwrite:i=!1,semVer:s}=n,a=al({lambdaARN:r,config:t});if(a.lambdaVersion==="$LATEST")throw new Error(`Lambda version cannot be $LATEST, must be a version number: ${r}`);if(a.lambdaARNType==="alias")throw new Error(`Lambda version cannot be an alias: ${r}`);a.lambdaARNType==="function"&&ce.Instance.warn("Lambda ARN is a function, not a version - It is safer to publish a version using IaC and to pass that version to `pwrdrvr publish`",{lambdaARN:r});let o=a.lambdaVersion;if(a.lambdaARNType==="function"){ce.Instance.info("Creating version for Lambda $LATEST");let b=await gr.send(new zt.PublishVersionCommand({FunctionName:a.lambdaARNBase}));o=b.Version,ce.Instance.info(`Lambda version created: ${b.Version}`);let v=b.LastUpdateStatus;for(let N=0;N<5;N++){if(v==="Successful"){ce.Instance.info(`Lambda function updated, version: ${o}`);break}await _6t(1e3*N);let D=await gr.send(new zt.GetFunctionCommand({FunctionName:a.lambdaARNBase,Qualifier:o}));v=(m=D==null?void 0:D.Configuration)==null?void 0:m.LastUpdateStatus}}if(!o)throw new Error(`Lambda version not found: ${o}, for lambda: ${r}`);try{if(((S=(await gr.send(new zt.GetFunctionCommand({FunctionName:a.lambdaARNBase,Qualifier:o}))).Configuration)==null?void 0:S.FunctionArn)===void 0)return ce.Instance.error(`Lambda version not found: ${o}, for lambda: ${r}`),{statusCode:404,errorMessage:`Lambda version not found: ${o}, for lambda: ${r}`}}catch(b){return ce.Instance.error("Error getting Lambda version",b),b.name==="ResourceNotFoundException"?{statusCode:404,errorMessage:b.message}:{statusCode:500,errorMessage:b.message}}let d=C0e(s),c=await C6t({lambdaArnBase:a.lambdaARNBase,lambdaVersion:o,overwrite:i,versions:d});await v6t({lambdaARNBase:a.lambdaARNBase});let{url:l}=await S6t({lambdaARNBase:a.lambdaARNBase,lambdaAlias:d.alias}),f={...c,functionUrl:l};return await E6t({config:t,lambdaBaseARN:a.lambdaARNBase,lambdaAlias:d.alias}),f}async function v6t({lambdaARNBase:e}){let t=await gr.send(new zt.ListTagsCommand({Resource:e}));(t.Tags===void 0||t.Tags["microapp-managed"]!=="true")&&await gr.send(new zt.TagResourceCommand({Resource:e,Tags:{"microapp-managed":"true"}}))}async function S6t({lambdaARNBase:e,lambdaAlias:t}){let n,r;try{r=await gr.send(new zt.GetFunctionUrlConfigCommand({FunctionName:e,Qualifier:t})),r.FunctionUrl&&(n=r.FunctionUrl)}catch(i){if(i.name!=="ResourceNotFoundException")throw i}return r!=null&&r.FunctionUrl||(n=(await gr.send(new zt.CreateFunctionUrlConfigCommand({FunctionName:e,Qualifier:t,AuthType:"AWS_IAM"}))).FunctionUrl),{url:n}}async function C6t(e){let{lambdaArnBase:t,lambdaVersion:n,overwrite:r,versions:i}=e;try{let a=await gr.send(new zt.GetAliasCommand({FunctionName:t,Name:i.alias}));if(n&&a.FunctionVersion===n&&a.AliasArn)return ce.Instance.info(`Lambda alias already exists and already points to the desired version: ${n}`),{statusCode:200,type:"lambdaAlias",lambdaAliasARN:a.AliasArn,actionTaken:"verified"};if(!r&&a.FunctionVersion!==n)throw ce.Instance.info(`Lambda alias already exists and does not point to the desired version: ${n}`),new Error("Lambda alias already exists, points to wrong version");ce.Instance.info(`Updating the lambda alias for the desired version: ${n}`);let o=await gr.send(new zt.UpdateAliasCommand({FunctionName:t,Name:i.alias,FunctionVersion:n}));if(ce.Instance.info(`Lambda alias updated, name: ${o.Name}, arn: ${o.AliasArn}`),!o.AliasArn)throw new Error("AliasArn failed to create");return{statusCode:200,type:"lambdaAlias",lambdaAliasARN:o.AliasArn,actionTaken:"updated"}}catch(a){if(a.name!=="ResourceNotFoundException")throw a}ce.Instance.info(`Creating the lambda alias for the desired version: ${n}, lambdaArnBase: ${t}`);let s=await gr.send(new zt.CreateAliasCommand({FunctionName:t,Name:i.alias,FunctionVersion:n}));if(ce.Instance.info(`Lambda alias created, name: ${s.Name}, arn: ${s.AliasArn}, points to version: ${s.FunctionVersion}`),!s.AliasArn)throw new Error("AliasArn failed to create");return{statusCode:201,type:"lambdaAlias",lambdaAliasARN:s.AliasArn,actionTaken:"created"}}async function E6t({config:e,lambdaBaseARN:t,lambdaAlias:n}){if(!e.parentDeployerLambdaARN){ce.Instance.info("No parent account, skipping cross-account permissions");return}ce.Instance.info("Adding cross-account permissions to lambda alias",{lambdaBaseARN:t,lambdaAlias:n});let r=e.edgeToOriginRoleARN&&e.edgeToOriginRoleARN.length>0?[...e.edgeToOriginRoleARN]:[],i={type:"getConfig"},s=await gr.send(new zt.InvokeCommand({FunctionName:e.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(i))}));if(s.$metadata.httpStatusCode===200&&s.Payload!==void 0){let c=JSON.parse(Buffer.from(s.Payload).toString("utf-8"));if(c.statusCode!==400){if(c.statusCode!==200)throw new Error(`Get config failed: ${JSON.stringify(c)}`);if(c.originRequestRoleARNs&&c.originRequestRoleARNs.length>0){let l=c.originRequestRoleARNs.filter(f=>f&&!r.includes(f));l.length>0&&r.push(...l)}}else ce.Instance.info("Get config failed, adding only locally configurd role")}else throw new Error(`AddCrossAccountPermissions - Lambda Invoke Failed: ${JSON.stringify(s)}`);let a;try{let c=await gr.send(new zt.GetPolicyCommand({FunctionName:t,Qualifier:n}));c.Policy&&(a=JSON.parse(c.Policy))}catch(c){if(c.name!=="ResourceNotFoundException")throw c}a||(a={Version:"2012-10-17",Id:`${t}/default`,Statement:[]});let o=a.Statement.filter(c=>c.Sid.startsWith("microapps-edge-to-origin")).map(c=>c.Principal.AWS),d=r.filter(c=>!o.includes(c));for(let c of d){let l=(0,E0e.createHash)("sha256").update(c).digest("hex").substring(0,8);await gr.send(new zt.AddPermissionCommand({Principal:c,StatementId:`microapps-edge-to-origin-${l}`,Action:"lambda:InvokeFunctionUrl",FunctionName:t,Qualifier:n,FunctionUrlAuthType:"AWS_IAM"}))}}var ul=Rt(co());async function x0e(e){let{dbManager:t,request:n,config:r}=e,{appType:i="lambda",overwrite:s=!1,startupType:a="iframe"}=n;ce.Instance.debug("Got Body:",n);let o=await ul.Version.LoadVersion({dbManager:t,key:{AppName:n.appName,SemVer:n.semVer}});if(o!==void 0&&o.Status==="routed")if(s)ce.Instance.info("Warning: App/Version already exists",{appName:n.appName,semVer:n.semVer});else return ce.Instance.info("Error: App/Version already exists",{appName:n.appName,semVer:n.semVer}),{statusCode:409};if(a==="direct"&&["lambda"].includes(i))return ce.Instance.info("Error: Incompatible app type and startup type",{appType:i,startupType:a}),{statusCode:400};if(s&&o&&(o.DefaultFile=n.defaultFile,o.Type=i,o.StartupType=a,n.lambdaARN&&(o.LambdaARN=n.lambdaARN)),o===void 0&&(o=new ul.Version({AppName:n.appName,SemVer:n.semVer,Type:i,Status:"pending",DefaultFile:n.defaultFile,StartupType:a,...n.lambdaARN?{LambdaARN:n.lambdaARN}:{}}),await o.Save(t)),(s||o.Status==="pending")&&i!=="url"){let{stagingBucket:c}=r.filestore,l=Jr(n,r)+"/";await EP(c,l,Jr(n,r),r),o.DefaultFile=n.defaultFile,o.Status="assets-copied",await o.Save(t)}if(i==="lambda")o.Status="routed",await o.Save(t);else if(i==="lambda-url"){if(!n.url)throw new Error("Missing url for lambda-url app type");o.Status="routed",o.URL=n.url,await o.Save(t)}else if(i==="static")o.Status==="assets-copied"&&(o.Status="routed",await o.Save(t));else if(i==="url"){if(!n.url)throw new Error("Missing url for url app type");o.URL=n.url,o.Status="routed",await o.Save(t)}else throw new Error(`Unknown app type: ${i}`);let d=await ul.Rules.Load({dbManager:t,key:{AppName:n.appName}});return d===void 0&&(d=new ul.Rules({AppName:n.appName,RuleSet:{},Version:1}),d.RuleSet.default={SemVer:n.semVer,AttributeName:"",AttributeValue:""},await d.Save(t)),ce.Instance.info("finished request"),{statusCode:201}}var b6t=ce.Instance,A6t=new AP.LambdaClient({}),$i,b$=new R0e.DynamoDBClient({maxAttempts:8}),x6t="2023-01-31-01";ce.Instance.info("Deployer build trigger",{buildTrigger:x6t});function R6t(e){$i=e.dbManager,b$=e.dynamoClient}$i=new E$.DBManager({dynamoClient:b$,tableName:Dt.instance.db.tableName});var kr=Dt.instance;ce.Instance.info("Deployer config",kr);async function T6t(e,t){if(b6t.options.meta={awsRequestId:t==null?void 0:t.awsRequestId,requestType:e.type},$i===void 0&&($i=new E$.DBManager({dynamoClient:b$,tableName:Dt.instance.db.tableName})),kr.awsAccountID===""&&(t==null?void 0:t.invokedFunctionArn)!==void 0){let r=t.invokedFunctionArn.split(":")[4];r!==""&&(kr.awsAccountID=r)}ce.Instance.info("received request",{request:e});try{if(kr.parentDeployerLambdaARN){if(["createApp","deployVersionPreflight","deployVersionLite"].includes(e.type)){let n=await A6t.send(new AP.InvokeCommand({FunctionName:kr.parentDeployerLambdaARN,Qualifier:"currentVersion",Payload:Buffer.from(JSON.stringify(e))})),r=n.Payload?JSON.parse(Buffer.from(n.Payload).toString()):{statusCode:500};return ce.Instance.info("response from parent deployer",{...n,Payload:{...r,awsCredentials:"redacted"}}),r}else if(["deployVersion"].includes(e.type))return{statusCode:400,errorMessage:"Deployer is in proxy mode - `deployVersion` is not allowed"}}switch(e.type){case"createApp":{let n=e;return await np.CreateApp({dbManager:$i,app:n})}case"deleteVersion":return await r0e({dbManager:$i,request:e,config:kr});case"deployVersionPreflight":return await _0e({dbManager:$i,request:e,config:kr});case"deployVersion":return await g0e({dbManager:$i,request:e,config:kr});case"deployVersionLite":return await x0e({dbManager:$i,request:e,config:kr});case"getVersion":return await S0e({dbManager:$i,request:e,config:kr});case"getConfig":{let n=e;return rp.GetConfig({request:n,config:kr})}case"lambdaAlias":{let r=await A0e({request:e,config:kr});return ce.Instance.info("lambdaAlias response",{response:r}),r}default:return{statusCode:400}}}catch(n){return ce.Instance.error("Caught unexpected exception in handler"),ce.Instance.error(n),{statusCode:500}}}0&&(module.exports={handler,overrideDBManager});
|
|
82
82
|
/*! *****************************************************************************
|
|
83
83
|
Copyright (C) Microsoft. All rights reserved.
|
|
84
84
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|