eoapi-cdk 11.5.0 → 11.6.0

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.
Files changed (37) hide show
  1. package/.jsii +4 -4
  2. package/README.md +2 -0
  3. package/lib/bastion-host/index.js +1 -1
  4. package/lib/database/index.js +1 -1
  5. package/lib/ingestor-api/index.js +1 -1
  6. package/lib/ingestor-api/runtime/pyproject.toml +1 -1
  7. package/lib/ingestor-api/runtime/src/handler.py +27 -4
  8. package/lib/ingestor-api/runtime/uv.lock +437 -403
  9. package/lib/lambda-api-gateway/index.js +1 -1
  10. package/lib/lambda-api-gateway-private/index.js +1 -1
  11. package/lib/stac-api/index.js +2 -2
  12. package/lib/stac-api/runtime/README.md +36 -0
  13. package/lib/stac-api/runtime/pyproject.toml +2 -2
  14. package/lib/stac-api/runtime/src/stac_api/handler.py +82 -86
  15. package/lib/stac-api/runtime/uv.lock +205 -181
  16. package/lib/stac-auth-proxy/index.js +2 -2
  17. package/lib/stac-auth-proxy/runtime/pyproject.toml +2 -2
  18. package/lib/stac-auth-proxy/runtime/src/stac_auth_proxy_api/handler.py +25 -2
  19. package/lib/stac-auth-proxy/runtime/uv.lock +174 -248
  20. package/lib/stac-browser/index.js +1 -1
  21. package/lib/stac-loader/index.js +2 -2
  22. package/lib/stac-loader/runtime/Dockerfile +1 -0
  23. package/lib/stac-loader/runtime/src/stac_loader/handler.py +2 -25
  24. package/lib/stac-loader/runtime/uv.lock +250 -251
  25. package/lib/stactools-item-generator/index.js +1 -1
  26. package/lib/stactools-item-generator/runtime/uv.lock +79 -75
  27. package/lib/tipg-api/index.js +2 -2
  28. package/lib/tipg-api/runtime/pyproject.toml +1 -1
  29. package/lib/tipg-api/runtime/src/tipg_api/handler.py +85 -75
  30. package/lib/tipg-api/runtime/uv.lock +247 -242
  31. package/lib/titiler-pgstac-api/index.js +2 -2
  32. package/lib/titiler-pgstac-api/runtime/pyproject.toml +2 -2
  33. package/lib/titiler-pgstac-api/runtime/src/titiler_pgstac_api/handler.py +79 -50
  34. package/lib/titiler-pgstac-api/runtime/uv.lock +319 -280
  35. package/lib/utils/utils.py +49 -15
  36. package/package.json +4 -4
  37. package/uv.lock +44 -25
@@ -47,7 +47,7 @@ class StacAuthProxyLambdaRuntime extends constructs_1.Construct {
47
47
  }
48
48
  exports.StacAuthProxyLambdaRuntime = StacAuthProxyLambdaRuntime;
49
49
  _a = JSII_RTTI_SYMBOL_1;
50
- StacAuthProxyLambdaRuntime[_a] = { fqn: "eoapi-cdk.StacAuthProxyLambdaRuntime", version: "11.5.0" };
50
+ StacAuthProxyLambdaRuntime[_a] = { fqn: "eoapi-cdk.StacAuthProxyLambdaRuntime", version: "11.6.0" };
51
51
  class StacAuthProxyLambda extends constructs_1.Construct {
52
52
  constructor(scope, id, props) {
53
53
  super(scope, id);
@@ -67,5 +67,5 @@ class StacAuthProxyLambda extends constructs_1.Construct {
67
67
  }
68
68
  exports.StacAuthProxyLambda = StacAuthProxyLambda;
69
69
  _b = JSII_RTTI_SYMBOL_1;
70
- StacAuthProxyLambda[_b] = { fqn: "eoapi-cdk.StacAuthProxyLambda", version: "11.5.0" };
70
+ StacAuthProxyLambda[_b] = { fqn: "eoapi-cdk.StacAuthProxyLambda", version: "11.6.0" };
71
71
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFtQztBQUVuQyxpREFBaUQ7QUFFakQsMkNBQXVDO0FBQ3ZDLDhEQUF5RDtBQUN6RCxvQ0FBd0U7QUFDeEUsNkJBQTZCO0FBRTdCLE1BQWEsMEJBQTJCLFNBQVEsc0JBQVM7SUFHdkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBc0M7UUFFdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLGtCQUFrQixFQUFFLEdBQzdDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUN4RCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxxQ0FBcUM7WUFDOUMsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVE7WUFDakQsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEVBQUUsSUFBQSx5QkFBaUIsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQzVELElBQUksRUFBRSxvQ0FBb0M7Z0JBQzFDLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUU7YUFDdEMsQ0FBQztZQUNGLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFVBQVUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUNqQyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLFdBQVcsRUFBRTtnQkFDWCx5QkFBeUI7Z0JBQ3pCLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDL0Isa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtnQkFFMUMsb0JBQW9CO2dCQUNwQixxQkFBcUIsRUFBRSxNQUFNO2dCQUM3QixtQkFBbUIsRUFBRSxXQUFXO2dCQUNoQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUM7b0JBQ3JELFFBQVEsRUFBRSxLQUFLLENBQUMsZUFBZTtvQkFDL0IsaUNBQWlDLEVBQUUsSUFBSTtpQkFDeEMsQ0FBQztnQkFFRixzQkFBc0I7Z0JBQ3RCLEdBQUcsS0FBSyxDQUFDLE1BQU07YUFDaEI7WUFDRCxpRUFBaUU7WUFDakUsR0FBRyxrQkFBa0I7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3Q0gsZ0VBOENDOzs7QUEwQ0QsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQVdoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQztRQUU5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLDBCQUEwQixDQUM1QyxJQUFJLEVBQ0osU0FBUyxFQUNULFlBQVksQ0FDYixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBRTdDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLHFDQUFnQixDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtZQUM1RCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsVUFBVTtTQUNYLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUksQ0FBQztRQUVwQixJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFO1lBQ2hELFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsc0JBQXNCO1lBQ2pFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDOztBQWxDSCxrREFtQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgYXBpZ2F0ZXdheXYyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTGFtYmRhQXBpR2F0ZXdheSB9IGZyb20gXCIuLi9sYW1iZGEtYXBpLWdhdGV3YXlcIjtcbmltcG9ydCB7IEN1c3RvbUxhbWJkYUZ1bmN0aW9uUHJvcHMsIHJlc29sdmVMYW1iZGFDb2RlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBjbGFzcyBTdGFjQXV0aFByb3h5TGFtYmRhUnVudGltZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogbGFtYmRhLkZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogU3RhY0F1dGhQcm94eUxhbWJkYVJ1bnRpbWVQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHsgY29kZTogdXNlckNvZGUsIC4uLm90aGVyTGFtYmRhT3B0aW9ucyB9ID1cbiAgICAgIHByb3BzLmxhbWJkYUZ1bmN0aW9uT3B0aW9ucyB8fCB7fTtcblxuICAgIHRoaXMubGFtYmRhRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwibGFtYmRhXCIsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzEzLFxuICAgICAgaGFuZGxlcjogXCJzdGFjX2F1dGhfcHJveHlfYXBpLmhhbmRsZXIuaGFuZGxlclwiLFxuICAgICAgbWVtb3J5U2l6ZTogODE5MixcbiAgICAgIGxvZ1JldGVudGlvbjogY2RrLmF3c19sb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICBjb2RlOiByZXNvbHZlTGFtYmRhQ29kZSh1c2VyQ29kZSwgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiKSwge1xuICAgICAgICBmaWxlOiBcInN0YWMtYXV0aC1wcm94eS9ydW50aW1lL0RvY2tlcmZpbGVcIixcbiAgICAgICAgYnVpbGRBcmdzOiB7IFBZVEhPTl9WRVJTSU9OOiBcIjMuMTNcIiB9LFxuICAgICAgfSksXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnN1Ym5ldFNlbGVjdGlvbixcbiAgICAgIGFsbG93UHVibGljU3VibmV0OiB0cnVlLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgLy8gc3RhYy1hdXRoLXByb3h5IGNvbmZpZ1xuICAgICAgICBVUFNUUkVBTV9VUkw6IHByb3BzLnVwc3RyZWFtVXJsLFxuICAgICAgICBPSURDX0RJU0NPVkVSWV9VUkw6IHByb3BzLm9pZGNEaXNjb3ZlcnlVcmwsXG5cbiAgICAgICAgLy8gc3dhZ2dlci11aSBjb25maWdcbiAgICAgICAgT1BFTkFQSV9TUEVDX0VORFBPSU5UOiBcIi9hcGlcIixcbiAgICAgICAgU1dBR0dFUl9VSV9FTkRQT0lOVDogXCIvYXBpLmh0bWxcIixcbiAgICAgICAgU1dBR0dFUl9VSV9JTklUX09BVVRIOiBjZGsuU3RhY2sub2YodGhpcykudG9Kc29uU3RyaW5nKHtcbiAgICAgICAgICBjbGllbnRJZDogcHJvcHMuc3RhY0FwaUNsaWVudElkLFxuICAgICAgICAgIHVzZVBrY2VXaXRoQXV0aG9yaXphdGlvbkNvZGVHcmFudDogdHJ1ZSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gY3VzdG9taXplZCBzZXR0aW5nc1xuICAgICAgICAuLi5wcm9wcy5hcGlFbnYsXG4gICAgICB9LFxuICAgICAgLy8gb3ZlcndyaXRlcyBkZWZhdWx0cyB3aXRoIHVzZXItcHJvdmlkZWQgY29uZmlndXJhYmxlIHByb3BlcnRpZXNcbiAgICAgIC4uLm90aGVyTGFtYmRhT3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNBdXRoUHJveHlMYW1iZGFSdW50aW1lUHJvcHMge1xuICAvKipcbiAgICogVVJMIHRvIHVwc3RyZWFtIFNUQUMgQVBJLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBzdHJlYW1Vcmw6IHN0cmluZztcblxuICAvKipcbiAgICogVVJMIHRvIE9JREMgRGlzY292ZXJ5IEVuZHBvaW50LlxuICAgKi9cbiAgcmVhZG9ubHkgb2lkY0Rpc2NvdmVyeVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPQXV0aCBDbGllbnQgSUQgZm9yIFN3YWdnZXIgVUkuXG4gICAqL1xuICByZWFkb25seSBzdGFjQXBpQ2xpZW50SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZQQyBpbnRvIHdoaWNoIHRoZSBsYW1iZGEgc2hvdWxkIGJlIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldCBpbnRvIHdoaWNoIHRoZSBsYW1iZGEgc2hvdWxkIGJlIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogQ3VzdG9taXplZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2VuZCB0byBzdGFjLWF1dGgtcHJveHkgcnVudGltZS5cbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BtZW50c2VlZC9zdGFjLWF1dGgtcHJveHkvP3RhYj1yZWFkbWUtb3YtZmlsZSNjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBhcGlFbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBsYW1iZGEgZnVuY3Rpb24gcHJvcGVydGllcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBsYW1iZGFGdW5jdGlvbk9wdGlvbnM/OiBDdXN0b21MYW1iZGFGdW5jdGlvblByb3BzO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhY0F1dGhQcm94eUxhbWJkYSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBVUkwgZm9yIHRoZSBTVEFDIEFQSS5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gZm9yIHRoZSBTVEFDIEFQSS5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFN0YWNBdXRoUHJveHlMYW1iZGFQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7IGRvbWFpbk5hbWUsIC4uLnJ1bnRpbWVQcm9wcyB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBydW50aW1lID0gbmV3IFN0YWNBdXRoUHJveHlMYW1iZGFSdW50aW1lKFxuICAgICAgdGhpcyxcbiAgICAgIFwicnVudGltZVwiLFxuICAgICAgcnVudGltZVByb3BzLFxuICAgICk7XG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IHJ1bnRpbWUubGFtYmRhRnVuY3Rpb247XG5cbiAgICBjb25zdCB7IGFwaSB9ID0gbmV3IExhbWJkYUFwaUdhdGV3YXkodGhpcywgXCJzdGFjLWF1dGgtcHJveHlcIiwge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHJ1bnRpbWUubGFtYmRhRnVuY3Rpb24sXG4gICAgICBkb21haW5OYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy51cmwgPSBhcGkudXJsITtcblxuICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsIFwic3RhYy1hdXRoLXByb3h5LW91dHB1dFwiLCB7XG4gICAgICBleHBvcnROYW1lOiBgJHtjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS1zdGFjLWF1dGgtcHJveHktdXJsYCxcbiAgICAgIHZhbHVlOiB0aGlzLnVybCxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNBdXRoUHJveHlMYW1iZGFQcm9wc1xuICBleHRlbmRzIFN0YWNBdXRoUHJveHlMYW1iZGFSdW50aW1lUHJvcHMge1xuICAvKipcbiAgICogRG9tYWluIE5hbWUgZm9yIHRoZSBTVEFDIEFQSS4gSWYgZGVmaW5lZCwgd2lsbCBjcmVhdGUgdGhlIGRvbWFpbiBuYW1lIGFuZCBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgU1RBQyBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lPzogYXBpZ2F0ZXdheXYyLklEb21haW5OYW1lO1xufVxuIl19
@@ -4,8 +4,8 @@ version = "0.0.0"
4
4
  description = "stac-auth-proxy-api runtime"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "mangum==0.19",
8
- "stac-auth-proxy>=0.6,<1",
7
+ "mangum>=0.21.0",
8
+ "stac-auth-proxy>=1.1.1,<2",
9
9
  ]
10
10
 
11
11
  [build-system]
@@ -4,14 +4,37 @@ Handler for AWS Lambda.
4
4
 
5
5
  import asyncio
6
6
  import os
7
+ from typing import Any
7
8
 
8
9
  from mangum import Mangum
9
10
  from stac_auth_proxy import create_app
10
11
 
12
+
13
+ def _ensure_event_loop() -> asyncio.AbstractEventLoop:
14
+ """Return the current event loop, creating and installing one if needed."""
15
+ try:
16
+ return asyncio.get_running_loop()
17
+ except RuntimeError:
18
+ pass
19
+
20
+ try:
21
+ return asyncio.get_event_loop()
22
+ except RuntimeError:
23
+ loop = asyncio.new_event_loop()
24
+ asyncio.set_event_loop(loop)
25
+ return loop
26
+
27
+
11
28
  app = create_app()
12
- handler = Mangum(app, lifespan="off")
29
+ _asgi_handler = Mangum(app, lifespan="off")
30
+
31
+
32
+ def handler(event: Any, context: Any) -> dict[str, Any]:
33
+ """Handle AWS Lambda events with a guaranteed current event loop."""
34
+ _ensure_event_loop()
35
+ return _asgi_handler(event, context)
13
36
 
14
37
 
15
38
  if "AWS_EXECUTION_ENV" in os.environ:
16
- loop = asyncio.get_event_loop()
39
+ loop = _ensure_event_loop()
17
40
  loop.run_until_complete(app.router.startup())