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.
- package/.jsii +38 -23
- package/README.md +2 -0
- package/lib/bastion-host/index.js +1 -1
- package/lib/database/index.js +1 -1
- package/lib/ingestor-api/index.d.ts +4 -0
- package/lib/ingestor-api/index.js +8 -3
- package/lib/ingestor-api/runtime/Dockerfile +13 -9
- package/lib/ingestor-api/runtime/pyproject.toml +37 -0
- package/lib/ingestor-api/runtime/src/config.py +9 -0
- package/lib/ingestor-api/runtime/src/handler.py +27 -4
- package/lib/ingestor-api/runtime/src/ingestor.py +1 -1
- package/lib/ingestor-api/runtime/src/schemas.py +11 -19
- package/lib/ingestor-api/runtime/src/services.py +4 -2
- package/lib/ingestor-api/runtime/uv.lock +1313 -0
- package/lib/lambda-api-gateway/index.js +1 -1
- package/lib/lambda-api-gateway-private/index.js +1 -1
- package/lib/stac-api/index.js +2 -2
- package/lib/stac-api/runtime/README.md +36 -0
- package/lib/stac-api/runtime/pyproject.toml +2 -2
- package/lib/stac-api/runtime/src/stac_api/handler.py +82 -86
- package/lib/stac-api/runtime/uv.lock +206 -182
- package/lib/stac-auth-proxy/index.js +2 -2
- package/lib/stac-auth-proxy/runtime/pyproject.toml +2 -2
- package/lib/stac-auth-proxy/runtime/src/stac_auth_proxy_api/handler.py +25 -2
- package/lib/stac-auth-proxy/runtime/uv.lock +174 -248
- package/lib/stac-browser/index.js +1 -1
- package/lib/stac-loader/index.js +2 -2
- package/lib/stac-loader/runtime/Dockerfile +1 -0
- package/lib/stac-loader/runtime/src/stac_loader/handler.py +2 -25
- package/lib/stac-loader/runtime/uv.lock +251 -252
- package/lib/stactools-item-generator/index.js +1 -1
- package/lib/stactools-item-generator/runtime/uv.lock +79 -75
- package/lib/tipg-api/index.js +2 -2
- package/lib/tipg-api/runtime/pyproject.toml +1 -1
- package/lib/tipg-api/runtime/src/tipg_api/handler.py +85 -75
- package/lib/tipg-api/runtime/uv.lock +248 -243
- package/lib/titiler-pgstac-api/index.js +2 -2
- package/lib/titiler-pgstac-api/runtime/pyproject.toml +2 -2
- package/lib/titiler-pgstac-api/runtime/src/titiler_pgstac_api/handler.py +79 -50
- package/lib/titiler-pgstac-api/runtime/uv.lock +319 -280
- package/lib/utils/utils.py +49 -15
- package/package.json +4 -4
- package/pyproject.toml +4 -0
- package/uv.lock +475 -73
- package/lib/ingestor-api/runtime/dev_requirements.txt +0 -4
- 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.
|
|
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.
|
|
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==
|
package/lib/stac-api/index.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
9
|
-
"stac-fastapi-pgstac>=6.2,<
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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
|
-
@
|
|
115
|
-
async def
|
|
116
|
-
"""
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
loop.
|
|
151
|
-
|
|
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.")
|