eoapi-cdk 11.4.1 → 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 (46) hide show
  1. package/.jsii +38 -23
  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.d.ts +4 -0
  6. package/lib/ingestor-api/index.js +8 -3
  7. package/lib/ingestor-api/runtime/Dockerfile +13 -9
  8. package/lib/ingestor-api/runtime/pyproject.toml +37 -0
  9. package/lib/ingestor-api/runtime/src/config.py +9 -0
  10. package/lib/ingestor-api/runtime/src/handler.py +27 -4
  11. package/lib/ingestor-api/runtime/src/ingestor.py +1 -1
  12. package/lib/ingestor-api/runtime/src/schemas.py +11 -19
  13. package/lib/ingestor-api/runtime/src/services.py +4 -2
  14. package/lib/ingestor-api/runtime/uv.lock +1313 -0
  15. package/lib/lambda-api-gateway/index.js +1 -1
  16. package/lib/lambda-api-gateway-private/index.js +1 -1
  17. package/lib/stac-api/index.js +2 -2
  18. package/lib/stac-api/runtime/README.md +36 -0
  19. package/lib/stac-api/runtime/pyproject.toml +2 -2
  20. package/lib/stac-api/runtime/src/stac_api/handler.py +82 -86
  21. package/lib/stac-api/runtime/uv.lock +206 -182
  22. package/lib/stac-auth-proxy/index.js +2 -2
  23. package/lib/stac-auth-proxy/runtime/pyproject.toml +2 -2
  24. package/lib/stac-auth-proxy/runtime/src/stac_auth_proxy_api/handler.py +25 -2
  25. package/lib/stac-auth-proxy/runtime/uv.lock +174 -248
  26. package/lib/stac-browser/index.js +1 -1
  27. package/lib/stac-loader/index.js +2 -2
  28. package/lib/stac-loader/runtime/Dockerfile +1 -0
  29. package/lib/stac-loader/runtime/src/stac_loader/handler.py +2 -25
  30. package/lib/stac-loader/runtime/uv.lock +251 -252
  31. package/lib/stactools-item-generator/index.js +1 -1
  32. package/lib/stactools-item-generator/runtime/uv.lock +79 -75
  33. package/lib/tipg-api/index.js +2 -2
  34. package/lib/tipg-api/runtime/pyproject.toml +1 -1
  35. package/lib/tipg-api/runtime/src/tipg_api/handler.py +85 -75
  36. package/lib/tipg-api/runtime/uv.lock +248 -243
  37. package/lib/titiler-pgstac-api/index.js +2 -2
  38. package/lib/titiler-pgstac-api/runtime/pyproject.toml +2 -2
  39. package/lib/titiler-pgstac-api/runtime/src/titiler_pgstac_api/handler.py +79 -50
  40. package/lib/titiler-pgstac-api/runtime/uv.lock +319 -280
  41. package/lib/utils/utils.py +49 -15
  42. package/package.json +4 -4
  43. package/pyproject.toml +4 -0
  44. package/uv.lock +475 -73
  45. package/lib/ingestor-api/runtime/dev_requirements.txt +0 -4
  46. package/lib/ingestor-api/runtime/requirements.txt +0 -10
@@ -24,5 +24,5 @@ class LambdaApiGateway extends constructs_1.Construct {
24
24
  }
25
25
  exports.LambdaApiGateway = LambdaApiGateway;
26
26
  _a = JSII_RTTI_SYMBOL_1;
27
- LambdaApiGateway[_a] = { fqn: "eoapi-cdk.LambdaApiGateway", version: "11.4.1" };
27
+ LambdaApiGateway[_a] = { fqn: "eoapi-cdk.LambdaApiGateway", version: "11.6.0" };
28
28
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUtxQjtBQUNyQiwyQ0FBdUM7QUFzQnZDLE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFHN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sRUFDSixPQUFPLEdBQUcsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLEVBQzdDLFVBQVUsRUFDVixjQUFjLEdBQ2YsR0FBRyxLQUFLLENBQUM7UUFFVixNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRXJFLE1BQU0sa0JBQWtCLEdBQ3RCLElBQUksMkNBQXlCLENBQUMscUJBQXFCLENBQ2pELGFBQWEsRUFDYixjQUFjLEVBQ2QsVUFBVTtZQUNSLENBQUMsQ0FBQztnQkFDRSxnQkFBZ0IsRUFDZCxJQUFJLDhCQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQ2pELE1BQU0sRUFDTiw4QkFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUNsRDthQUNKO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FDZCxDQUFDO1FBRUosSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLDhCQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDL0MsT0FBTztZQUNQLG9CQUFvQjtZQUNwQixrQkFBa0IsRUFBRSxrQkFBa0I7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFsQ0gsNENBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgU3RhY2ssXG4gIGF3c19hcGlnYXRld2F5djIgYXMgYXBpZ2F0ZXdheXYyLFxuICBhd3NfYXBpZ2F0ZXdheXYyX2ludGVncmF0aW9ucyBhcyBhcGlnYXRld2F5djJfaW50ZWdyYXRpb25zLFxuICBhd3NfbGFtYmRhIGFzIGxhbWJkYSxcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUFwaUdhdGV3YXlQcm9wcyB7XG4gIC8qKlxuICAgKiBMYW1iZGEgZnVuY3Rpb24gdG8gaW50ZWdyYXRlIHdpdGggdGhlIEFQSSBHYXRld2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IGxhbWJkYS5GdW5jdGlvbiB8IGxhbWJkYS5WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gRG9tYWluIE5hbWUgZm9yIHRoZSBBUEkuIElmIGRlZmluZWQsIHdpbGwgY3JlYXRlIHRoZVxuICAgKiBkb21haW4gbmFtZSBhbmQgaW50ZWdyYXRlIGl0IHdpdGggdGhlIEFQSS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU/OiBhcGlnYXRld2F5djIuSURvbWFpbk5hbWU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIEFQSSBHYXRld2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYUFwaUdhdGV3YXkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICByZWFkb25seSBhcGk6IGFwaWdhdGV3YXl2Mi5IdHRwQXBpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBMYW1iZGFBcGlHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgYXBpTmFtZSA9IGAke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tJHtpZH1gLFxuICAgICAgZG9tYWluTmFtZSxcbiAgICAgIGxhbWJkYUZ1bmN0aW9uLFxuICAgIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IGRlZmF1bHREb21haW5NYXBwaW5nID0gZG9tYWluTmFtZSA/IHsgZG9tYWluTmFtZSB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZGVmYXVsdEludGVncmF0aW9uID1cbiAgICAgIG5ldyBhcGlnYXRld2F5djJfaW50ZWdyYXRpb25zLkh0dHBMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgXCJpbnRlZ3JhdGlvblwiLFxuICAgICAgICBsYW1iZGFGdW5jdGlvbixcbiAgICAgICAgZG9tYWluTmFtZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOlxuICAgICAgICAgICAgICAgIG5ldyBhcGlnYXRld2F5djIuUGFyYW1ldGVyTWFwcGluZygpLm92ZXJ3cml0ZUhlYWRlcihcbiAgICAgICAgICAgICAgICAgIFwiaG9zdFwiLFxuICAgICAgICAgICAgICAgICAgYXBpZ2F0ZXdheXYyLk1hcHBpbmdWYWx1ZS5jdXN0b20oZG9tYWluTmFtZS5uYW1lKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICB0aGlzLmFwaSA9IG5ldyBhcGlnYXRld2F5djIuSHR0cEFwaSh0aGlzLCBcImFwaVwiLCB7XG4gICAgICBhcGlOYW1lLFxuICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmcsXG4gICAgICBkZWZhdWx0SW50ZWdyYXRpb246IGRlZmF1bHRJbnRlZ3JhdGlvbixcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -52,5 +52,5 @@ class PrivateLambdaApiGateway extends constructs_1.Construct {
52
52
  }
53
53
  exports.PrivateLambdaApiGateway = PrivateLambdaApiGateway;
54
54
  _a = JSII_RTTI_SYMBOL_1;
55
- PrivateLambdaApiGateway[_a] = { fqn: "eoapi-cdk.PrivateLambdaApiGateway", version: "11.4.1" };
55
+ PrivateLambdaApiGateway[_a] = { fqn: "eoapi-cdk.PrivateLambdaApiGateway", version: "11.6.0" };
56
56
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUtxQjtBQUNyQiwyQ0FBdUM7QUEwRHZDLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFJcEQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBbUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQ0osV0FBVyxFQUNYLFdBQVcsRUFDWCxjQUFjLEVBQ2QsR0FBRyxFQUNILDBCQUEwQixFQUMxQixpQkFBaUIsR0FBRyxJQUFJLEVBQ3hCLGFBQWEsRUFDYixNQUFNLEVBQ04sd0JBQXdCLEdBQ3pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkscUJBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO2dCQUNwRSxHQUFHO2dCQUNILE9BQU8sRUFBRSxxQkFBRyxDQUFDLDhCQUE4QixDQUFDLFVBQVU7Z0JBQ3RELE9BQU8sRUFBRSwwQkFBMEI7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSw0QkFBVSxDQUFDLGlCQUFpQixDQUN6RCxjQUFjLEVBQ2Qsd0JBQXdCLENBQ3pCLENBQUM7UUFFRixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLDRCQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbEQsV0FBVyxFQUFFLFdBQVcsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjO1lBQzFELFdBQVcsRUFBRSxXQUFXLElBQUksMEJBQTBCO1lBQ3RELGFBQWEsRUFBRSxDQUFDLDRCQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUNoRCxNQUFNLEVBQ0osTUFBTTtnQkFDTixJQUFJLHFCQUFHLENBQUMsY0FBYyxDQUFDO29CQUNyQixVQUFVLEVBQUU7d0JBQ1YsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQzs0QkFDdEIsTUFBTSxFQUFFLHFCQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7NEJBQ3hCLFVBQVUsRUFBRSxDQUFDLElBQUkscUJBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDcEMsT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUM7NEJBQy9CLFNBQVMsRUFBRSxDQUFDLGdCQUFnQixDQUFDOzRCQUM3QixVQUFVLEVBQUU7Z0NBQ1YsWUFBWSxFQUFFLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUU7NkJBQzdDO3lCQUNGLENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQztZQUNKLGFBQWEsRUFBRSxhQUFhLElBQUk7Z0JBQzlCLFlBQVksRUFBRSw0QkFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUk7Z0JBQ2hELGdCQUFnQixFQUFFLElBQUk7YUFDdkI7WUFDRCxrQkFBa0I7WUFDbEIsb0JBQW9CLEVBQUU7Z0JBQ3BCLGlCQUFpQixFQUFFLDRCQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSTthQUNyRDtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7O0FBckVILDBEQXNFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGF3c19hcGlnYXRld2F5IGFzIGFwaWdhdGV3YXksXG4gIGF3c19lYzIgYXMgZWMyLFxuICBhd3NfaWFtIGFzIGlhbSxcbiAgYXdzX2xhbWJkYSBhcyBsYW1iZGEsXG59IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTGFtYmRhQXBpR2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIExhbWJkYSBmdW5jdGlvbiB0byBpbnRlZ3JhdGUgd2l0aCB0aGUgQVBJIEdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogbGFtYmRhLklGdW5jdGlvbjtcblxuICAvKipcbiAgICogTGFtYmRhIGludGVncmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBUEkgR2F0ZXdheS5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUludGVncmF0aW9uT3B0aW9ucz86IGFwaWdhdGV3YXkuTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBWUEMgdG8gY3JlYXRlIHRoZSBBUEkgR2F0ZXdheSBpbi5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY3JlYXRlIGEgVlBDIGVuZHBvaW50IGZvciB0aGUgQVBJIEdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlVnBjRW5kcG9pbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VibmV0cyBpbiB3aGljaCB0byBjcmVhdGUgYSBWUEMgZW5kcG9pbnQgbmV0d29yayBpbnRlcmZhY2UuIEF0IG1vc3Qgb25lIHBlciBhdmFpbGFiaWxpdHkgem9uZS5cblxuICAgKi9cbiAgcmVhZG9ubHkgdnBjRW5kcG9pbnRTdWJuZXRTZWxlY3Rpb24/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lIGZvciB0aGUgQVBJIEdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYCR7c2NvcGUubm9kZS5pZH0tcHJpdmF0ZS1hcGlgXG4gICAqL1xuICByZWFkb25seSByZXN0QXBpTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gZm9yIHRoZSBBUEkgR2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBcIlByaXZhdGUgUkVTVCBBUEkgR2F0ZXdheVwiXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRGVwbG95IG9wdGlvbnMgZm9yIHRoZSBBUEkgR2F0ZXdheS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveU9wdGlvbnM/OiBhcGlnYXRld2F5LlN0YWdlT3B0aW9ucztcblxuICAvKipcbiAgICogUG9saWN5IGZvciB0aGUgQVBJIEdhdGV3YXkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUG9saWN5IHRoYXQgYWxsb3dzIGFueSBwcmluY2lwYWwgd2l0aCB0aGUgc2FtZSBWUEMgdG8gaW52b2tlIHRoZSBBUEkuXG4gICAqL1xuICByZWFkb25seSBwb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQcml2YXRlTGFtYmRhQXBpR2F0ZXdheSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBhcGk6IGFwaWdhdGV3YXkuUmVzdEFwaTtcbiAgcHVibGljIHJlYWRvbmx5IHZwY0VuZHBvaW50PzogZWMyLkludGVyZmFjZVZwY0VuZHBvaW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogUHJpdmF0ZUxhbWJkYUFwaUdhdGV3YXlQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgcmVzdEFwaU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGxhbWJkYUZ1bmN0aW9uLFxuICAgICAgdnBjLFxuICAgICAgdnBjRW5kcG9pbnRTdWJuZXRTZWxlY3Rpb24sXG4gICAgICBjcmVhdGVWcGNFbmRwb2ludCA9IHRydWUsXG4gICAgICBkZXBsb3lPcHRpb25zLFxuICAgICAgcG9saWN5LFxuICAgICAgbGFtYmRhSW50ZWdyYXRpb25PcHRpb25zLFxuICAgIH0gPSBwcm9wcztcblxuICAgIGlmIChjcmVhdGVWcGNFbmRwb2ludCkge1xuICAgICAgLy8gQ3JlYXRlIFZQQyBFbmRwb2ludCBmb3IgQVBJIEdhdGV3YXlcbiAgICAgIHRoaXMudnBjRW5kcG9pbnQgPSBuZXcgZWMyLkludGVyZmFjZVZwY0VuZHBvaW50KHRoaXMsIFwidnBjLWVuZHBvaW50XCIsIHtcbiAgICAgICAgdnBjLFxuICAgICAgICBzZXJ2aWNlOiBlYzIuSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkFQSUdBVEVXQVksXG4gICAgICAgIHN1Ym5ldHM6IHZwY0VuZHBvaW50U3VibmV0U2VsZWN0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEludGVncmF0aW9uID0gbmV3IGFwaWdhdGV3YXkuTGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICBsYW1iZGFGdW5jdGlvbixcbiAgICAgIGxhbWJkYUludGVncmF0aW9uT3B0aW9uc1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgUHJpdmF0ZSBSRVNUIEFQSSBHYXRld2F5XG4gICAgdGhpcy5hcGkgPSBuZXcgYXBpZ2F0ZXdheS5SZXN0QXBpKHRoaXMsIFwicmVzdC1hcGlcIiwge1xuICAgICAgcmVzdEFwaU5hbWU6IHJlc3RBcGlOYW1lID8/IGAke3Njb3BlLm5vZGUuaWR9LXByaXZhdGUtYXBpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBcIlByaXZhdGUgUkVTVCBBUEkgR2F0ZXdheVwiLFxuICAgICAgZW5kcG9pbnRUeXBlczogW2FwaWdhdGV3YXkuRW5kcG9pbnRUeXBlLlBSSVZBVEVdLFxuICAgICAgcG9saWN5OlxuICAgICAgICBwb2xpY3kgPz9cbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wiZXhlY3V0ZS1hcGk6SW52b2tlXCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcImV4ZWN1dGUtYXBpOi8qXCJdLFxuICAgICAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7IFwiYXdzOlNvdXJjZVZwY1wiOiB2cGMudnBjSWQgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgZGVwbG95T3B0aW9uczogZGVwbG95T3B0aW9ucyA/PyB7XG4gICAgICAgIGxvZ2dpbmdMZXZlbDogYXBpZ2F0ZXdheS5NZXRob2RMb2dnaW5nTGV2ZWwuSU5GTyxcbiAgICAgICAgZGF0YVRyYWNlRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0SW50ZWdyYXRpb24sXG4gICAgICBkZWZhdWx0TWV0aG9kT3B0aW9uczoge1xuICAgICAgICBhdXRob3JpemF0aW9uVHlwZTogYXBpZ2F0ZXdheS5BdXRob3JpemF0aW9uVHlwZS5OT05FLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYXBpLnJvb3QuYWRkTWV0aG9kKFwiQU5ZXCIpO1xuICAgIHRoaXMuYXBpLnJvb3QuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKS5hZGRNZXRob2QoXCJBTllcIik7XG4gIH1cbn1cbiJdfQ==
@@ -81,7 +81,7 @@ class PgStacApiLambdaRuntime extends constructs_1.Construct {
81
81
  }
82
82
  exports.PgStacApiLambdaRuntime = PgStacApiLambdaRuntime;
83
83
  _a = JSII_RTTI_SYMBOL_1;
84
- PgStacApiLambdaRuntime[_a] = { fqn: "eoapi-cdk.PgStacApiLambdaRuntime", version: "11.4.1" };
84
+ PgStacApiLambdaRuntime[_a] = { fqn: "eoapi-cdk.PgStacApiLambdaRuntime", version: "11.6.0" };
85
85
  class PgStacApiLambda extends constructs_1.Construct {
86
86
  constructor(scope, id, props) {
87
87
  super(scope, id);
@@ -120,5 +120,5 @@ class PgStacApiLambda extends constructs_1.Construct {
120
120
  }
121
121
  exports.PgStacApiLambda = PgStacApiLambda;
122
122
  _b = JSII_RTTI_SYMBOL_1;
123
- PgStacApiLambda[_b] = { fqn: "eoapi-cdk.PgStacApiLambda", version: "11.4.1" };
123
+ PgStacApiLambda[_b] = { fqn: "eoapi-cdk.PgStacApiLambda", version: "11.6.0" };
124
124
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQVVxQjtBQUNyQiwyQ0FBdUM7QUFDdkMsNkJBQTZCO0FBQzdCLDhEQUF5RDtBQUN6RCxvQ0FLa0I7QUFFTCxRQUFBLFVBQVUsR0FBRztJQUN4QixLQUFLLEVBQUUsT0FBTztJQUNkLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsU0FBUyxFQUFFLFdBQVc7SUFDdEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLFdBQVcsRUFBRSxhQUFhO0lBQzFCLGdCQUFnQixFQUFFLG1CQUFtQjtDQUM3QixDQUFDO0FBSVg7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQWE7SUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBWSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQWEsc0JBQXVCLFNBQVEsc0JBQVM7SUFHbkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBa0M7UUFFbEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLGlCQUFpQixHQUFvQjtZQUN6QyxrQkFBVSxDQUFDLEtBQUs7WUFDaEIsa0JBQVUsQ0FBQyxJQUFJO1lBQ2Ysa0JBQVUsQ0FBQyxNQUFNO1lBQ2pCLGtCQUFVLENBQUMsTUFBTTtZQUNqQixrQkFBVSxDQUFDLFNBQVM7WUFDcEIsa0JBQVUsQ0FBQyxVQUFVO1lBQ3JCLGtCQUFVLENBQUMsaUJBQWlCO1NBQzdCLENBQUM7UUFFRixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JB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Q3BCLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUN0QyxxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCO1NBQ25ELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFFMUUsZ0RBQWdEO1FBQ2hELElBQUksU0FBMkMsQ0FBQztRQUNoRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQiw2RUFBNkU7WUFDN0UsTUFBTSxjQUFjLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFN0QscUVBQXFFO1lBQ3JFLFNBQVMsR0FBRyxJQUFBLDJDQUFtQyxFQUM3QyxPQUFPLENBQUMsY0FBYyxFQUN0QixjQUFjLENBQ2YsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDckMsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLHFDQUFnQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDckQsY0FBYyxFQUFFLFNBQVM7WUFDekIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLGlCQUFpQjtTQUN4RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFJLENBQUM7UUFFcEIsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtZQUNyQyxVQUFVLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLE1BQU07WUFDN0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBekRILDBDQTBEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGF3c19hcGlnYXRld2F5djIgYXMgYXBpZ2F0ZXdheXYyLFxuICBhd3NfbG9ncyxcbiAgQ2ZuT3V0cHV0LFxuICBEdXJhdGlvbixcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGF3c19sYW1iZGEgYXMgbGFtYmRhLFxuICBhd3NfcmRzIGFzIHJkcyxcbiAgYXdzX3NlY3JldHNtYW5hZ2VyIGFzIHNlY3JldHNtYW5hZ2VyLFxuICBTdGFjayxcbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTGFtYmRhQXBpR2F0ZXdheSB9IGZyb20gXCIuLi9sYW1iZGEtYXBpLWdhdGV3YXlcIjtcbmltcG9ydCB7XG4gIEN1c3RvbUxhbWJkYUZ1bmN0aW9uUHJvcHMsXG4gIHJlc29sdmVMYW1iZGFDb2RlLFxuICBleHRyYWN0RGF0YWJhc2VEZXBlbmRlbmNpZXMsXG4gIGNyZWF0ZUxhbWJkYVZlcnNpb25XaXRoRGVwZW5kZW5jaWVzLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IEVYVEVOU0lPTlMgPSB7XG4gIFFVRVJZOiBcInF1ZXJ5XCIsXG4gIFNPUlQ6IFwic29ydFwiLFxuICBGSUVMRFM6IFwiZmllbGRzXCIsXG4gIEZJTFRFUjogXCJmaWx0ZXJcIixcbiAgRlJFRV9URVhUOiBcImZyZWVfdGV4dFwiLFxuICBQQUdJTkFUSU9OOiBcInBhZ2luYXRpb25cIixcbiAgQ09MTEVDVElPTl9TRUFSQ0g6IFwiY29sbGVjdGlvbl9zZWFyY2hcIixcbiAgVFJBTlNBQ1RJT046IFwidHJhbnNhY3Rpb25cIixcbiAgQlVMS19UUkFOU0FDVElPTjogXCJidWxrX3RyYW5zYWN0aW9uc1wiLFxufSBhcyBjb25zdDtcblxudHlwZSBFeHRlbnNpb25UeXBlID0gKHR5cGVvZiBFWFRFTlNJT05TKVtrZXlvZiB0eXBlb2YgRVhURU5TSU9OU107XG5cbi8qKlxuICogVmFsaWRhdGVzIGlmIGEgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgU1RBQyBleHRlbnNpb25cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEV4dGVuc2lvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgRXh0ZW5zaW9uVHlwZSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKEVYVEVOU0lPTlMpLmluY2x1ZGVzKHZhbHVlIGFzIGFueSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQZ1N0YWNBcGlMYW1iZGFSdW50aW1lIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBQZ1N0YWNBcGlMYW1iZGFSdW50aW1lUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBkZWZhdWx0RXh0ZW5zaW9uczogRXh0ZW5zaW9uVHlwZVtdID0gW1xuICAgICAgRVhURU5TSU9OUy5RVUVSWSxcbiAgICAgIEVYVEVOU0lPTlMuU09SVCxcbiAgICAgIEVYVEVOU0lPTlMuRklFTERTLFxuICAgICAgRVhURU5TSU9OUy5GSUxURVIsXG4gICAgICBFWFRFTlNJT05TLkZSRUVfVEVYVCxcbiAgICAgIEVYVEVOU0lPTlMuUEFHSU5BVElPTixcbiAgICAgIEVYVEVOU0lPTlMuQ09MTEVDVElPTl9TRUFSQ0gsXG4gICAgXTtcblxuICAgIGlmIChwcm9wcy5lbmFibGVkRXh0ZW5zaW9ucykge1xuICAgICAgZm9yIChjb25zdCBleHQgb2YgcHJvcHMuZW5hYmxlZEV4dGVuc2lvbnMpIHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkRXh0ZW5zaW9uKGV4dCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBleHRlbnNpb246IFwiJHtleHR9XCIuIE11c3QgYmUgb25lIG9mOiAke09iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgIEVYVEVOU0lPTlMsXG4gICAgICAgICAgICApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVkRXh0ZW5zaW9ucyA9IHByb3BzLmVuYWJsZWRFeHRlbnNpb25zIHx8IGRlZmF1bHRFeHRlbnNpb25zO1xuXG4gICAgY29uc3QgeyBjb2RlOiB1c2VyQ29kZSwgLi4ub3RoZXJMYW1iZGFPcHRpb25zIH0gPVxuICAgICAgcHJvcHMubGFtYmRhRnVuY3Rpb25PcHRpb25zIHx8IHt9O1xuXG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJsYW1iZGFcIiwge1xuICAgICAgLy8gZGVmYXVsdHNcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzEyLFxuICAgICAgaGFuZGxlcjogXCJzdGFjX2FwaS5oYW5kbGVyLmhhbmRsZXJcIixcbiAgICAgIG1lbW9yeVNpemU6IDgxOTIsXG4gICAgICBsb2dSZXRlbnRpb246IGF3c19sb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIGNvZGU6IHJlc29sdmVMYW1iZGFDb2RlKHVzZXJDb2RlLCBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIpLCB7XG4gICAgICAgIGZpbGU6IFwic3RhYy1hcGkvcnVudGltZS9Eb2NrZXJmaWxlXCIsXG4gICAgICAgIGJ1aWxkQXJnczogeyBQWVRIT05fVkVSU0lPTjogXCIzLjEyXCIgfSxcbiAgICAgIH0pLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy5zdWJuZXRTZWxlY3Rpb24sXG4gICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogdHJ1ZSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFBHU1RBQ19TRUNSRVRfQVJOOiBwcm9wcy5kYlNlY3JldC5zZWNyZXRBcm4sXG4gICAgICAgIERCX01JTl9DT05OX1NJWkU6IFwiMFwiLFxuICAgICAgICBEQl9NQVhfQ09OTl9TSVpFOiBcIjFcIixcbiAgICAgICAgRU5BQkxFRF9FWFRFTlNJT05TOiBlbmFibGVkRXh0ZW5zaW9ucy5qb2luKFwiLFwiKSxcbiAgICAgICAgLi4ucHJvcHMuYXBpRW52LFxuICAgICAgfSxcbiAgICAgIHNuYXBTdGFydDogcHJvcHMuZW5hYmxlU25hcFN0YXJ0XG4gICAgICAgID8gbGFtYmRhLlNuYXBTdGFydENvbmYuT05fUFVCTElTSEVEX1ZFUlNJT05TXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gb3ZlcndyaXRlcyBkZWZhdWx0cyB3aXRoIHVzZXItcHJvdmlkZWQgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgKGV4Y2x1ZGluZyBjb2RlKVxuICAgICAgLi4ub3RoZXJMYW1iZGFPcHRpb25zLFxuICAgIH0pO1xuXG4gICAgcHJvcHMuZGJTZWNyZXQuZ3JhbnRSZWFkKHRoaXMubGFtYmRhRnVuY3Rpb24pO1xuXG4gICAgaWYgKHByb3BzLnZwYykge1xuICAgICAgdGhpcy5sYW1iZGFGdW5jdGlvbi5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgICBwcm9wcy5kYixcbiAgICAgICAgZWMyLlBvcnQudGNwKDU0MzIpLFxuICAgICAgICBcImFsbG93IGNvbm5lY3Rpb25zIGZyb20gc3RhYy1mYXN0YXBpLXBnc3RhY1wiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZ1N0YWNBcGlMYW1iZGFSdW50aW1lUHJvcHMge1xuICAvKipcbiAgICogVlBDIGludG8gd2hpY2ggdGhlIGxhbWJkYSBzaG91bGQgYmUgZGVwbG95ZWQuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogUkRTIEluc3RhbmNlIHdpdGggaW5zdGFsbGVkIHBnU1RBQyBvciBwZ2JvdW5jZXIgc2VydmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZGI6IHJkcy5JRGF0YWJhc2VJbnN0YW5jZSB8IGVjMi5JSW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldCBpbnRvIHdoaWNoIHRoZSBsYW1iZGEgc2hvdWxkIGJlIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogU2VjcmV0IGNvbnRhaW5pbmcgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgcGdTVEFDIGRhdGFiYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGJTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIEN1c3RvbWl6ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNlbmQgdG8gZmFzdGFwaS1wZ3N0YWMgcnVudGltZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwaUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgU1RBQyBBUEkgZXh0ZW5zaW9ucyB0byBlbmFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcXVlcnksIHNvcnQsIGZpZWxkcywgZmlsdGVyLCBmcmVlX3RleHQsIHBhZ2luYXRpb24sIGNvbGxlY3Rpb25fc2VhcmNoXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkRXh0ZW5zaW9ucz86IEV4dGVuc2lvblR5cGVbXTtcblxuICAvKipcbiAgICogRW5hYmxlIFNuYXBTdGFydCB0byByZWR1Y2UgY29sZCBzdGFydCBsYXRlbmN5LlxuICAgKlxuICAgKiBTbmFwU3RhcnQgY3JlYXRlcyBhIHNuYXBzaG90IG9mIHRoZSBpbml0aWFsaXplZCBMYW1iZGEgZnVuY3Rpb24sIGFsbG93aW5nIG5ldyBpbnN0YW5jZXNcbiAgICogdG8gc3RhcnQgZnJvbSB0aGlzIHByZS1pbml0aWFsaXplZCBzdGF0ZSBpbnN0ZWFkIG9mIHN0YXJ0aW5nIGZyb20gc2NyYXRjaC5cbiAgICpcbiAgICogQmVuZWZpdHM6XG4gICAqIC0gU2lnbmlmaWNhbnRseSByZWR1Y2VzIGNvbGQgc3RhcnQgdGltZXMgKHR5cGljYWxseSAxMHggZmFzdGVyKVxuICAgKiAtIEltcHJvdmVzIEFQSSByZXNwb25zZSB0aW1lIGZvciBpbmZyZXF1ZW50IHJlcXVlc3RzXG4gICAqXG4gICAqIENvbnNpZGVyYXRpb25zOlxuICAgKiAtIEFkZGl0aW9uYWwgY29zdDogY2hhcmdlcyBmb3Igc25hcHNob3Qgc3RvcmFnZSBhbmQgcmVzdG9yZSBvcGVyYXRpb25zXG4gICAqIC0gUmVxdWlyZXMgTGFtYmRhIHZlcnNpb25pbmcgKGF1dG9tYXRpY2FsbHkgY29uZmlndXJlZCBieSB0aGlzIGNvbnN0cnVjdClcbiAgICogLSBEYXRhYmFzZSBjb25uZWN0aW9ucyBhcmUgcmVjcmVhdGVkIG9uIHJlc3RvcmUgdXNpbmcgc25hcHNob3QgbGlmZWN5Y2xlIGhvb2tzXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvc25hcHN0YXJ0Lmh0bWxcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVNuYXBTdGFydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGxhbWJkYSBmdW5jdGlvbiBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uT3B0aW9ucz86IEN1c3RvbUxhbWJkYUZ1bmN0aW9uUHJvcHM7XG59XG5cbmV4cG9ydCBjbGFzcyBQZ1N0YWNBcGlMYW1iZGEgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVVJMIGZvciB0aGUgU1RBQyBBUEkuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIGZvciB0aGUgU1RBQyBBUEkuXG4gICAqL1xuICByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogbGFtYmRhLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBsYW1iZGFGdW5jdGlvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhY0FwaUxhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFBnU3RhY0FwaUxhbWJkYVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgUGdTdGFjQXBpTGFtYmRhUnVudGltZSh0aGlzLCBcInJ1bnRpbWVcIiwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBzdWJuZXRTZWxlY3Rpb246IHByb3BzLnN1Ym5ldFNlbGVjdGlvbixcbiAgICAgIGRiOiBwcm9wcy5kYixcbiAgICAgIGRiU2VjcmV0OiBwcm9wcy5kYlNlY3JldCxcbiAgICAgIGVuYWJsZWRFeHRlbnNpb25zOiBwcm9wcy5lbmFibGVkRXh0ZW5zaW9ucyxcbiAgICAgIGFwaUVudjogcHJvcHMuYXBpRW52LFxuICAgICAgZW5hYmxlU25hcFN0YXJ0OiBwcm9wcy5lbmFibGVTbmFwU3RhcnQsXG4gICAgICBsYW1iZGFGdW5jdGlvbk9wdGlvbnM6IHByb3BzLmxhbWJkYUZ1bmN0aW9uT3B0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnN0YWNBcGlMYW1iZGFGdW5jdGlvbiA9IHRoaXMubGFtYmRhRnVuY3Rpb24gPSBydW50aW1lLmxhbWJkYUZ1bmN0aW9uO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxhbWJkYSB0byB1c2UgZm9yIEFQSSBHYXRld2F5XG4gICAgbGV0IGFwaUxhbWJkYTogbGFtYmRhLkZ1bmN0aW9uIHwgbGFtYmRhLlZlcnNpb247XG4gICAgaWYgKHByb3BzLmVuYWJsZVNuYXBTdGFydCkge1xuICAgICAgLy8gRXh0cmFjdCBkZXBlbmRlbmNpZXMgZnJvbSBkYXRhYmFzZSBpZiBpdCdzIGEgUGdTdGFjRGF0YWJhc2Ugd2l0aCBQZ0JvdW5jZXJcbiAgICAgIGNvbnN0IGRiRGVwZW5kZW5jaWVzID0gZXh0cmFjdERhdGFiYXNlRGVwZW5kZW5jaWVzKHByb3BzLmRiKTtcblxuICAgICAgLy8gQ3JlYXRlIHZlcnNpb24gd2l0aCBkZXBlbmRlbmNpZXMgdG8gZW5zdXJlIHNuYXBzaG90IGNyZWF0aW9uIHdhaXRzXG4gICAgICBhcGlMYW1iZGEgPSBjcmVhdGVMYW1iZGFWZXJzaW9uV2l0aERlcGVuZGVuY2llcyhcbiAgICAgICAgcnVudGltZS5sYW1iZGFGdW5jdGlvbixcbiAgICAgICAgZGJEZXBlbmRlbmNpZXMsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGlMYW1iZGEgPSBydW50aW1lLmxhbWJkYUZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXBpIH0gPSBuZXcgTGFtYmRhQXBpR2F0ZXdheSh0aGlzLCBcInN0YWMtYXBpXCIsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiBhcGlMYW1iZGEsXG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lID8/IHByb3BzLnN0YWNBcGlEb21haW5OYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy51cmwgPSBhcGkudXJsITtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJzdGFjLWFwaS1vdXRwdXRcIiwge1xuICAgICAgZXhwb3J0TmFtZTogYCR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS11cmxgLFxuICAgICAgdmFsdWU6IHRoaXMudXJsLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGdTdGFjQXBpTGFtYmRhUHJvcHMgZXh0ZW5kcyBQZ1N0YWNBcGlMYW1iZGFSdW50aW1lUHJvcHMge1xuICAvKipcbiAgICogRG9tYWluIE5hbWUgZm9yIHRoZSBTVEFDIEFQSS4gSWYgZGVmaW5lZCwgd2lsbCBjcmVhdGUgdGhlIGRvbWFpbiBuYW1lIGFuZCBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgU1RBQyBBUEkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lPzogYXBpZ2F0ZXdheXYyLklEb21haW5OYW1lO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gRG9tYWluIE5hbWUgT3B0aW9ucyBmb3IgU1RBQyBBUEkuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSAnZG9tYWluTmFtZScgaW5zdGVhZC5cbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBzdGFjQXBpRG9tYWluTmFtZT86IGFwaWdhdGV3YXl2Mi5JRG9tYWluTmFtZTtcbn1cbiJdfQ==
@@ -0,0 +1,36 @@
1
+ # STAC API Lambda runtime notes
2
+
3
+ This runtime uses a small event-loop helper layer around `Mangum(app, lifespan="off")`.
4
+
5
+ ## Why this exists
6
+
7
+ We built a separate Lambda sandbox to understand FastAPI + Mangum + `asyncio` behavior in the eoapi-cdk deployment pattern. The goal was to explain why the runtime does explicit async initialization for database pools instead of relying on FastAPI startup hooks alone.
8
+
9
+ Observed behavior from that sandbox:
10
+
11
+ - Ordinary FastAPI route execution under Mangum worked without calling `ensure_event_loop()` first.
12
+ - The synchronous Lambda handler did not always have a running loop, but route execution inside Mangum did.
13
+ - `asyncio.run(...)` created long-lived async resources on a temporary loop that was different from the later request-handling loop.
14
+ - Under the sandbox setup, FastAPI startup/lifespan with Mangum `lifespan="auto"` ran per invocation rather than once per warm container.
15
+ - SnapStart restore hooks were synchronous, so async resource recreation still needed a reusable installed loop.
16
+
17
+ These were sandbox observations, not universal AWS guarantees. We use them as rationale for the runtime pattern below.
18
+
19
+ ## Recommended eoapi-cdk pattern
20
+
21
+ For Lambda-container-scoped async resources such as database pools, eoapi-cdk prefers:
22
+
23
+ - explicit async initialization through a reusable installed event loop
24
+ - `Mangum(app, lifespan="off")`
25
+ - `ensure_event_loop()` before delegating to Mangum
26
+ - SnapStart before-snapshot and after-restore hooks when SnapStart is enabled
27
+
28
+ This means `ensure_event_loop()` is defensive support for synchronous setup paths such as cold-start initialization and SnapStart restore. It is not documented as a requirement for normal FastAPI route execution.
29
+
30
+ ## Practical guidance
31
+
32
+ - Do not use `asyncio.run(...)` for long-lived async pools or clients created at import time.
33
+ - Do not assume FastAPI startup/lifespan under Mangum is a drop-in replacement for Lambda-container-scoped pool initialization.
34
+ - If SnapStart is enabled, close network resources before snapshot and recreate them after restore.
35
+
36
+ See [`src/stac_api/handler.py`](src/stac_api/handler.py) and [`../../utils/utils.py`](../../utils/utils.py) for the runtime implementation.
@@ -5,8 +5,8 @@ description = "stac-api runtime"
5
5
  authors = [{ name = "hrodmn", email = "henry@developmentseed.org" }]
6
6
  requires-python = ">=3.12"
7
7
  dependencies = [
8
- "mangum==0.19",
9
- "stac-fastapi-pgstac>=6.2,<6.3",
8
+ "mangum>=0.21.0",
9
+ "stac-fastapi-pgstac>=6.2,<7.0",
10
10
  "starlette-cramjam>=0.4,<0.5",
11
11
  ]
12
12
 
@@ -1,17 +1,17 @@
1
- """
2
- Handler for AWS Lambda.
3
- """
1
+ """Handler for AWS Lambda."""
4
2
 
5
- import asyncio
6
3
  import logging
7
4
  import os
5
+ from collections.abc import AsyncIterator, Mapping
6
+ from contextlib import asynccontextmanager
7
+ from typing import Any
8
8
 
9
9
  from mangum import Mangum
10
10
  from snapshot_restore_py import register_after_restore, register_before_snapshot
11
11
  from stac_fastapi.pgstac.app import app, with_transactions
12
12
  from stac_fastapi.pgstac.config import PostgresSettings
13
13
  from stac_fastapi.pgstac.db import close_db_connection, connect_to_db
14
- from utils import get_secret_dict
14
+ from utils import ensure_event_loop, get_secret_dict, run_async
15
15
 
16
16
  logging.basicConfig(
17
17
  level=logging.INFO,
@@ -19,8 +19,8 @@ logging.basicConfig(
19
19
  )
20
20
  logger = logging.getLogger(__name__)
21
21
 
22
-
23
22
  _connection_initialized = False
23
+ _original_lifespan = app.router.lifespan_context
24
24
 
25
25
 
26
26
  def _build_postgres_settings() -> PostgresSettings:
@@ -36,122 +36,118 @@ def _build_postgres_settings() -> PostgresSettings:
36
36
  )
37
37
 
38
38
 
39
- @register_before_snapshot
40
- def on_snapshot():
41
- """
42
- Runtime hook called by Lambda before taking a snapshot.
43
- We close database connections that shouldn't be in the snapshot.
44
- """
45
-
46
- # Close any existing database connections before the snapshot is taken
39
+ def _close_db_pools() -> None:
40
+ """Close the current database pools if they exist."""
47
41
  if hasattr(app, "state") and hasattr(app.state, "readpool") and app.state.readpool:
48
42
  try:
49
43
  app.state.readpool.close()
44
+ except Exception:
45
+ logger.exception("SnapStart: error closing database readpool")
46
+ finally:
50
47
  app.state.readpool = None
51
- except Exception as e:
52
- logger.info(f"SnapStart: Error closing database readpool: {e}")
53
48
 
54
49
  if hasattr(app, "state") and hasattr(app.state, "writepool") and app.state.writepool:
55
50
  try:
56
51
  app.state.writepool.close()
52
+ except Exception:
53
+ logger.exception("SnapStart: error closing database writepool")
54
+ finally:
57
55
  app.state.writepool = None
58
- except Exception as e:
59
- logger.info(f"SnapStart: Error closing database writepool: {e}")
60
56
 
61
- return {"statusCode": 200}
62
57
 
58
+ async def _initialize_connection() -> None:
59
+ """Create fresh database connection pools for the application."""
60
+ global _connection_initialized
63
61
 
64
- @register_after_restore
65
- def on_snap_restore():
66
- """
67
- Runtime hook called by Lambda after restoring from a snapshot.
68
- We recreate database connections that were closed before the snapshot.
69
- """
62
+ _close_db_pools()
63
+ await connect_to_db(
64
+ app,
65
+ postgres_settings=_build_postgres_settings(),
66
+ add_write_connection_pool=with_transactions,
67
+ )
68
+ _connection_initialized = True
69
+
70
+
71
+ async def _shutdown_connection() -> None:
72
+ """Close the current database connection pools if they exist."""
70
73
  global _connection_initialized
71
74
 
72
- try:
73
- # Get the event loop or create a new one
74
- try:
75
- loop = asyncio.get_running_loop()
76
- except RuntimeError:
77
- loop = asyncio.new_event_loop()
78
- asyncio.set_event_loop(loop)
79
-
80
- # Close any existing pool (from snapshot)
81
- if hasattr(app.state, "readpool") and app.state.readpool:
82
- try:
83
- app.state.readpool.close()
84
- except Exception as e:
85
- logger.info(f"SnapStart: Error closing stale readpool: {e}")
86
- app.state.readpool = None
75
+ if hasattr(app, "state") and hasattr(app.state, "readpool") and app.state.readpool:
76
+ await close_db_connection(app)
77
+ app.state.readpool = None
87
78
 
88
- if hasattr(app.state, "writepool") and app.state.writepool:
89
- try:
90
- app.state.writepool.close()
91
- except Exception as e:
92
- logger.info(f"SnapStart: Error closing stale writepool: {e}")
93
- app.state.writepool = None
79
+ if hasattr(app, "state") and hasattr(app.state, "writepool"):
80
+ app.state.writepool = None
81
+
82
+ _connection_initialized = False
94
83
 
95
- # Create fresh connection pool
96
- postgres_settings = _build_postgres_settings()
97
- loop.run_until_complete(
98
- connect_to_db(
99
- app,
100
- postgres_settings=postgres_settings,
101
- add_write_connection_pool=with_transactions,
102
- )
103
- )
104
84
 
105
- _connection_initialized = True
85
+ @register_before_snapshot
86
+ def on_snapshot() -> dict[str, int]:
87
+ """Close database connections before Lambda SnapStart takes a snapshot."""
88
+ _close_db_pools()
89
+ return {"statusCode": 200}
90
+
106
91
 
107
- except Exception as e:
108
- logger.error(f"SnapStart: Failed to initialize database connection: {e}")
92
+ @register_after_restore
93
+ def on_snap_restore() -> dict[str, int]:
94
+ """Recreate database connections after Lambda SnapStart restores a snapshot."""
95
+ try:
96
+ run_async(_initialize_connection())
97
+ except Exception:
98
+ logger.exception("SnapStart: failed to initialize database connection")
109
99
  raise
110
100
 
111
101
  return {"statusCode": 200}
112
102
 
113
103
 
114
- @app.on_event("startup")
115
- async def startup_event():
116
- """Connect to database on startup."""
117
- logger.info("Setting up DB connection...")
118
- postgres_settings = _build_postgres_settings()
119
- await connect_to_db(
120
- app,
121
- postgres_settings=postgres_settings,
122
- add_write_connection_pool=with_transactions,
123
- )
124
- logger.info("DB connection setup.")
104
+ @asynccontextmanager
105
+ async def lifespan(app_instance) -> AsyncIterator[Mapping[str, Any] | None]:
106
+ """Wrap the upstream lifespan with database setup and teardown.
125
107
 
108
+ We keep the app's lifespan wiring intact for non-Lambda contexts, but the
109
+ Lambda runtime below uses ``Mangum(..., lifespan="off")`` and performs
110
+ connection setup explicitly. In sandbox testing, Mangum lifespan handling
111
+ was not a drop-in replacement for Lambda-container-scoped pool reuse.
112
+ """
113
+ async with _original_lifespan(app_instance) as state:
114
+ await _initialize_connection()
115
+ try:
116
+ yield state
117
+ finally:
118
+ await _shutdown_connection()
126
119
 
127
- @app.on_event("shutdown")
128
- async def shutdown_event():
129
- """Close database connection."""
130
- print("Closing up DB connection...")
131
- await close_db_connection(app)
132
- print("DB connection closed.")
133
120
 
121
+ app.router.lifespan_context = lifespan
134
122
 
135
- handler = Mangum(
123
+ # The Lambda runtime initializes long-lived async resources on an installed
124
+ # reusable loop, then hands request execution to Mangum. ``ensure_event_loop``
125
+ # is a defensive step for those synchronous initialization paths. It is not here
126
+ # because normal FastAPI route execution cannot run without it.
127
+ _asgi_handler = Mangum(
136
128
  app,
137
129
  lifespan="off",
138
130
  text_mime_types=[
139
- # Avoid base64 encoding any text/* or application/* mime-types
140
131
  "text/",
141
132
  "application/",
142
133
  ],
143
134
  )
144
135
 
145
136
 
137
+ def handler(event: Any, context: Any) -> dict[str, Any]:
138
+ """Handle AWS Lambda events with a reusable installed event loop.
139
+
140
+ This supports synchronous Lambda-side async setup such as cold-start and
141
+ SnapStart restore initialization before control passes to Mangum.
142
+ """
143
+ ensure_event_loop()
144
+ return _asgi_handler(event, context)
145
+
146
+
146
147
  if "AWS_EXECUTION_ENV" in os.environ:
147
148
  logger.info("Cold start: initializing database connection...")
148
- loop = asyncio.new_event_loop()
149
- asyncio.set_event_loop(loop)
150
- loop.run_until_complete(
151
- connect_to_db(
152
- app,
153
- postgres_settings=_build_postgres_settings(),
154
- add_write_connection_pool=with_transactions,
155
- )
156
- )
149
+ # Avoid ``asyncio.run(...)`` here. It would create the pools on a temporary
150
+ # loop and then close it, which is a poor fit for container-scoped async
151
+ # resources that should live on the installed reusable loop.
152
+ run_async(_initialize_connection())
157
153
  logger.info("Database connection initialized.")