sst 3.0.0 → 3.0.1-10
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/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/resource.d.ts +4 -0
- package/dist/resource.js +15 -0
- package/dist/vector-client.d.ts +126 -0
- package/dist/vector-client.js +38 -0
- package/package.json +16 -137
- package/LICENSE +0 -21
- package/README.md +0 -43
- package/bootstrap.d.ts +0 -5
- package/bootstrap.js +0 -318
- package/bus.d.ts +0 -20
- package/bus.js +0 -52
- package/cache.d.ts +0 -4
- package/cache.js +0 -31
- package/cdk/deploy-stack.d.ts +0 -223
- package/cdk/deploy-stack.js +0 -562
- package/cdk/deployments-wrapper.d.ts +0 -3
- package/cdk/deployments-wrapper.js +0 -135
- package/cdk/deployments.d.ts +0 -327
- package/cdk/deployments.js +0 -360
- package/cdk/util.d.ts +0 -1
- package/cdk/util.js +0 -17
- package/cli/ci-info.d.ts +0 -4
- package/cli/ci-info.js +0 -8
- package/cli/colors.d.ts +0 -17
- package/cli/colors.js +0 -27
- package/cli/commands/bind.d.ts +0 -19
- package/cli/commands/bind.js +0 -360
- package/cli/commands/bootstrap.d.ts +0 -15
- package/cli/commands/bootstrap.js +0 -11
- package/cli/commands/build.d.ts +0 -17
- package/cli/commands/build.js +0 -25
- package/cli/commands/connect.d.ts +0 -17
- package/cli/commands/connect.js +0 -55
- package/cli/commands/console.d.ts +0 -15
- package/cli/commands/console.js +0 -22
- package/cli/commands/deploy.d.ts +0 -19
- package/cli/commands/deploy.js +0 -112
- package/cli/commands/dev.d.ts +0 -25
- package/cli/commands/dev.js +0 -351
- package/cli/commands/diff.d.ts +0 -19
- package/cli/commands/diff.js +0 -89
- package/cli/commands/plugins/kysely.d.ts +0 -1
- package/cli/commands/plugins/kysely.js +0 -87
- package/cli/commands/plugins/pothos.d.ts +0 -1
- package/cli/commands/plugins/pothos.js +0 -58
- package/cli/commands/plugins/warmer.d.ts +0 -1
- package/cli/commands/plugins/warmer.js +0 -33
- package/cli/commands/remove.d.ts +0 -19
- package/cli/commands/remove.js +0 -62
- package/cli/commands/secrets/get.d.ts +0 -19
- package/cli/commands/secrets/get.js +0 -27
- package/cli/commands/secrets/list.d.ts +0 -19
- package/cli/commands/secrets/list.js +0 -69
- package/cli/commands/secrets/load.d.ts +0 -17
- package/cli/commands/secrets/load.js +0 -47
- package/cli/commands/secrets/remove.d.ts +0 -19
- package/cli/commands/secrets/remove.js +0 -27
- package/cli/commands/secrets/secrets.d.ts +0 -2
- package/cli/commands/secrets/secrets.js +0 -16
- package/cli/commands/secrets/set.d.ts +0 -21
- package/cli/commands/secrets/set.js +0 -54
- package/cli/commands/telemetry.d.ts +0 -17
- package/cli/commands/telemetry.js +0 -24
- package/cli/commands/transform.d.ts +0 -17
- package/cli/commands/transform.js +0 -62
- package/cli/commands/types.d.ts +0 -15
- package/cli/commands/types.js +0 -25
- package/cli/commands/update.d.ts +0 -17
- package/cli/commands/update.js +0 -116
- package/cli/commands/version.d.ts +0 -15
- package/cli/commands/version.js +0 -15
- package/cli/local/router.d.ts +0 -44
- package/cli/local/router.js +0 -43
- package/cli/local/server.d.ts +0 -22
- package/cli/local/server.js +0 -319
- package/cli/program.d.ts +0 -19
- package/cli/program.js +0 -87
- package/cli/spinner.d.ts +0 -3
- package/cli/spinner.js +0 -14
- package/cli/sst.d.ts +0 -2
- package/cli/sst.js +0 -74
- package/cli/telemetry/environment.d.ts +0 -15
- package/cli/telemetry/environment.js +0 -27
- package/cli/telemetry/post-payload.d.ts +0 -1
- package/cli/telemetry/post-payload.js +0 -27
- package/cli/telemetry/project-id.d.ts +0 -2
- package/cli/telemetry/project-id.js +0 -47
- package/cli/telemetry/telemetry.d.ts +0 -19
- package/cli/telemetry/telemetry.js +0 -103
- package/cli/terminal.d.ts +0 -1
- package/cli/terminal.js +0 -8
- package/cli/ui/deploy.d.ts +0 -10
- package/cli/ui/deploy.js +0 -172
- package/cli/ui/functions.d.ts +0 -2
- package/cli/ui/functions.js +0 -130
- package/cli/ui/header.d.ts +0 -5
- package/cli/ui/header.js +0 -16
- package/cli/ui/stack.d.ts +0 -1
- package/cli/ui/stack.js +0 -6
- package/config.d.ts +0 -56
- package/config.js +0 -244
- package/constructs/Api.d.ts +0 -814
- package/constructs/Api.js +0 -743
- package/constructs/ApiGatewayV1Api.d.ts +0 -642
- package/constructs/ApiGatewayV1Api.js +0 -767
- package/constructs/App.d.ts +0 -168
- package/constructs/App.js +0 -493
- package/constructs/AppSyncApi.d.ts +0 -550
- package/constructs/AppSyncApi.js +0 -493
- package/constructs/AstroSite.d.ts +0 -39
- package/constructs/AstroSite.js +0 -78
- package/constructs/AstroSite.tsdoc.d.ts +0 -2
- package/constructs/AstroSite.tsdoc.js +0 -2
- package/constructs/Auth.d.ts +0 -100
- package/constructs/Auth.js +0 -177
- package/constructs/BaseSite.d.ts +0 -29
- package/constructs/BaseSite.js +0 -43
- package/constructs/Bucket.d.ts +0 -364
- package/constructs/Bucket.js +0 -327
- package/constructs/Cognito.d.ts +0 -232
- package/constructs/Cognito.js +0 -370
- package/constructs/Config.d.ts +0 -3
- package/constructs/Config.js +0 -3
- package/constructs/Construct.d.ts +0 -23
- package/constructs/Construct.js +0 -46
- package/constructs/Cron.d.ts +0 -164
- package/constructs/Cron.js +0 -114
- package/constructs/Distribution.d.ts +0 -143
- package/constructs/Distribution.js +0 -260
- package/constructs/EdgeFunction.d.ts +0 -49
- package/constructs/EdgeFunction.js +0 -442
- package/constructs/EventBus.d.ts +0 -444
- package/constructs/EventBus.js +0 -440
- package/constructs/Function.d.ts +0 -690
- package/constructs/Function.js +0 -583
- package/constructs/FunctionalStack.d.ts +0 -13
- package/constructs/FunctionalStack.js +0 -62
- package/constructs/Job.d.ts +0 -337
- package/constructs/Job.js +0 -404
- package/constructs/KinesisStream.d.ts +0 -224
- package/constructs/KinesisStream.js +0 -207
- package/constructs/Metadata.d.ts +0 -60
- package/constructs/Metadata.js +0 -1
- package/constructs/NextjsSite.d.ts +0 -104
- package/constructs/NextjsSite.js +0 -308
- package/constructs/Parameter.d.ts +0 -37
- package/constructs/Parameter.js +0 -53
- package/constructs/Queue.d.ts +0 -194
- package/constructs/Queue.js +0 -204
- package/constructs/RDS.d.ts +0 -221
- package/constructs/RDS.js +0 -363
- package/constructs/RemixSite.d.ts +0 -42
- package/constructs/RemixSite.js +0 -158
- package/constructs/RemixSite.tsdoc.d.ts +0 -2
- package/constructs/RemixSite.tsdoc.js +0 -2
- package/constructs/Script.d.ts +0 -160
- package/constructs/Script.js +0 -179
- package/constructs/Secret.d.ts +0 -30
- package/constructs/Secret.js +0 -59
- package/constructs/Service.d.ts +0 -487
- package/constructs/Service.js +0 -655
- package/constructs/SolidStartSite.d.ts +0 -37
- package/constructs/SolidStartSite.js +0 -66
- package/constructs/SolidStartSite.tsdoc.d.ts +0 -2
- package/constructs/SolidStartSite.tsdoc.js +0 -2
- package/constructs/SsrFunction.d.ts +0 -60
- package/constructs/SsrFunction.js +0 -226
- package/constructs/SsrSite.d.ts +0 -407
- package/constructs/SsrSite.js +0 -850
- package/constructs/Stack.d.ts +0 -127
- package/constructs/Stack.js +0 -243
- package/constructs/StaticSite.d.ts +0 -348
- package/constructs/StaticSite.js +0 -468
- package/constructs/SvelteKitSite.d.ts +0 -40
- package/constructs/SvelteKitSite.js +0 -106
- package/constructs/SvelteKitSite.tsdoc.d.ts +0 -2
- package/constructs/SvelteKitSite.tsdoc.js +0 -2
- package/constructs/Table.d.ts +0 -410
- package/constructs/Table.js +0 -425
- package/constructs/Topic.d.ts +0 -257
- package/constructs/Topic.js +0 -273
- package/constructs/WebSocketApi.d.ts +0 -355
- package/constructs/WebSocketApi.js +0 -404
- package/constructs/cdk/HttpAwsIntegration.d.ts +0 -32
- package/constructs/cdk/HttpAwsIntegration.js +0 -24
- package/constructs/cdk/certificate-base.d.ts +0 -18
- package/constructs/cdk/certificate-base.js +0 -26
- package/constructs/cdk/dns-validated-certificate.d.ts +0 -77
- package/constructs/cdk/dns-validated-certificate.js +0 -125
- package/constructs/cdk/website-redirect.d.ts +0 -53
- package/constructs/cdk/website-redirect.js +0 -77
- package/constructs/context.d.ts +0 -3
- package/constructs/context.js +0 -27
- package/constructs/deferred_task.d.ts +0 -6
- package/constructs/deferred_task.js +0 -45
- package/constructs/deprecated/NextjsSite.d.ts +0 -309
- package/constructs/deprecated/NextjsSite.js +0 -1074
- package/constructs/deprecated/cross-region-helper.d.ts +0 -7
- package/constructs/deprecated/cross-region-helper.js +0 -152
- package/constructs/deprecated/index.d.ts +0 -1
- package/constructs/deprecated/index.js +0 -1
- package/constructs/future/Auth.d.ts +0 -80
- package/constructs/future/Auth.js +0 -122
- package/constructs/future/index.d.ts +0 -1
- package/constructs/future/index.js +0 -1
- package/constructs/index.d.ts +0 -32
- package/constructs/index.js +0 -32
- package/constructs/static-file-list.d.ts +0 -1
- package/constructs/static-file-list.js +0 -51
- package/constructs/util/apiGatewayV1AccessLog.d.ts +0 -15
- package/constructs/util/apiGatewayV1AccessLog.js +0 -76
- package/constructs/util/apiGatewayV2AccessLog.d.ts +0 -10
- package/constructs/util/apiGatewayV2AccessLog.js +0 -107
- package/constructs/util/apiGatewayV2Cors.d.ts +0 -67
- package/constructs/util/apiGatewayV2Cors.js +0 -21
- package/constructs/util/apiGatewayV2Domain.d.ts +0 -47
- package/constructs/util/apiGatewayV2Domain.js +0 -208
- package/constructs/util/appSyncApiDomain.d.ts +0 -41
- package/constructs/util/appSyncApiDomain.js +0 -176
- package/constructs/util/builder.d.ts +0 -3
- package/constructs/util/builder.js +0 -9
- package/constructs/util/duration.d.ts +0 -3
- package/constructs/util/duration.js +0 -19
- package/constructs/util/functionBinding.d.ts +0 -31
- package/constructs/util/functionBinding.js +0 -104
- package/constructs/util/functionUrlCors.d.ts +0 -67
- package/constructs/util/functionUrlCors.js +0 -23
- package/constructs/util/permission.d.ts +0 -8
- package/constructs/util/permission.js +0 -228
- package/constructs/util/size.d.ts +0 -3
- package/constructs/util/size.js +0 -12
- package/constructs/util/warning.d.ts +0 -11
- package/constructs/util/warning.js +0 -21
- package/context/context.d.ts +0 -13
- package/context/context.js +0 -69
- package/context/context2.d.ts +0 -16
- package/context/context2.js +0 -108
- package/context/handler.d.ts +0 -25
- package/context/handler.js +0 -21
- package/context/index.d.ts +0 -2
- package/context/index.js +0 -2
- package/credentials.d.ts +0 -9
- package/credentials.js +0 -145
- package/error.d.ts +0 -6
- package/error.js +0 -10
- package/index.d.ts +0 -1
- package/index.js +0 -1
- package/iot.d.ts +0 -6
- package/iot.js +0 -163
- package/logger.d.ts +0 -3
- package/logger.js +0 -32
- package/node/actor/index.d.ts +0 -29
- package/node/actor/index.js +0 -17
- package/node/api/index.d.ts +0 -64
- package/node/api/index.js +0 -179
- package/node/auth/adapter/adapter.d.ts +0 -3
- package/node/auth/adapter/adapter.js +0 -3
- package/node/auth/adapter/facebook.d.ts +0 -2
- package/node/auth/adapter/facebook.js +0 -26
- package/node/auth/adapter/github.d.ts +0 -2
- package/node/auth/adapter/github.js +0 -21
- package/node/auth/adapter/google.d.ts +0 -9
- package/node/auth/adapter/google.js +0 -18
- package/node/auth/adapter/link.d.ts +0 -8
- package/node/auth/adapter/link.js +0 -39
- package/node/auth/adapter/oauth.d.ts +0 -25
- package/node/auth/adapter/oauth.js +0 -52
- package/node/auth/adapter/oidc.d.ts +0 -17
- package/node/auth/adapter/oidc.js +0 -50
- package/node/auth/adapter/twitch.d.ts +0 -2
- package/node/auth/adapter/twitch.js +0 -11
- package/node/auth/auth.d.ts +0 -24
- package/node/auth/auth.js +0 -74
- package/node/auth/index.d.ts +0 -13
- package/node/auth/index.js +0 -12
- package/node/auth/session.d.ts +0 -76
- package/node/auth/session.js +0 -121
- package/node/bucket/index.d.ts +0 -3
- package/node/bucket/index.js +0 -2
- package/node/config/index.d.ts +0 -13
- package/node/config/index.js +0 -22
- package/node/event-bus/index.d.ts +0 -51
- package/node/event-bus/index.js +0 -76
- package/node/function/index.d.ts +0 -3
- package/node/function/index.js +0 -3
- package/node/future/auth/adapter/adapter.d.ts +0 -10
- package/node/future/auth/adapter/adapter.js +0 -1
- package/node/future/auth/adapter/code.d.ts +0 -17
- package/node/future/auth/adapter/code.js +0 -68
- package/node/future/auth/adapter/facebook.d.ts +0 -16
- package/node/future/auth/adapter/facebook.js +0 -27
- package/node/future/auth/adapter/github.d.ts +0 -23
- package/node/future/auth/adapter/github.js +0 -23
- package/node/future/auth/adapter/google.d.ts +0 -28
- package/node/future/auth/adapter/google.js +0 -22
- package/node/future/auth/adapter/link.d.ts +0 -13
- package/node/future/auth/adapter/link.js +0 -47
- package/node/future/auth/adapter/microsoft.d.ts +0 -22
- package/node/future/auth/adapter/microsoft.js +0 -16
- package/node/future/auth/adapter/oauth.d.ts +0 -41
- package/node/future/auth/adapter/oauth.js +0 -67
- package/node/future/auth/adapter/oidc.d.ts +0 -30
- package/node/future/auth/adapter/oidc.js +0 -63
- package/node/future/auth/adapter/spotify.d.ts +0 -23
- package/node/future/auth/adapter/spotify.js +0 -22
- package/node/future/auth/encryption.d.ts +0 -2
- package/node/future/auth/encryption.js +0 -30
- package/node/future/auth/handler.d.ts +0 -46
- package/node/future/auth/handler.js +0 -280
- package/node/future/auth/index.d.ts +0 -17
- package/node/future/auth/index.js +0 -15
- package/node/future/auth/session.d.ts +0 -71
- package/node/future/auth/session.js +0 -146
- package/node/graphql/index.d.ts +0 -15
- package/node/graphql/index.js +0 -32
- package/node/job/index.d.ts +0 -37
- package/node/job/index.js +0 -64
- package/node/kinesis-stream/index.d.ts +0 -3
- package/node/kinesis-stream/index.js +0 -3
- package/node/queue/index.d.ts +0 -3
- package/node/queue/index.js +0 -2
- package/node/rds/index.d.ts +0 -3
- package/node/rds/index.js +0 -2
- package/node/service/index.d.ts +0 -3
- package/node/service/index.js +0 -4
- package/node/site/index.d.ts +0 -18
- package/node/site/index.js +0 -18
- package/node/table/index.d.ts +0 -3
- package/node/table/index.js +0 -4
- package/node/topic/index.d.ts +0 -3
- package/node/topic/index.js +0 -4
- package/node/util/index.d.ts +0 -2
- package/node/util/index.js +0 -196
- package/node/util/loader.d.ts +0 -2
- package/node/util/loader.js +0 -51
- package/node/websocket-api/index.d.ts +0 -23
- package/node/websocket-api/index.js +0 -48
- package/pothos.d.ts +0 -7
- package/pothos.js +0 -160
- package/project.d.ts +0 -75
- package/project.js +0 -188
- package/runtime/handlers/container.d.ts +0 -2
- package/runtime/handlers/container.js +0 -263
- package/runtime/handlers/dotnet.d.ts +0 -2
- package/runtime/handlers/dotnet.js +0 -115
- package/runtime/handlers/go.d.ts +0 -2
- package/runtime/handlers/go.js +0 -126
- package/runtime/handlers/java.d.ts +0 -2
- package/runtime/handlers/java.js +0 -103
- package/runtime/handlers/node.d.ts +0 -2
- package/runtime/handlers/node.js +0 -269
- package/runtime/handlers/python.d.ts +0 -2
- package/runtime/handlers/python.js +0 -141
- package/runtime/handlers/pythonBundling.d.ts +0 -82
- package/runtime/handlers/pythonBundling.js +0 -80
- package/runtime/handlers/rust.d.ts +0 -2
- package/runtime/handlers/rust.js +0 -110
- package/runtime/handlers.d.ts +0 -74
- package/runtime/handlers.js +0 -151
- package/runtime/iot.d.ts +0 -1
- package/runtime/iot.js +0 -17
- package/runtime/runtime.d.ts +0 -32
- package/runtime/runtime.js +0 -1
- package/runtime/server.d.ts +0 -6
- package/runtime/server.js +0 -150
- package/runtime/workers.d.ts +0 -37
- package/runtime/workers.js +0 -85
- package/stacks/app-metadata.d.ts +0 -7
- package/stacks/app-metadata.js +0 -75
- package/stacks/assembly.d.ts +0 -1
- package/stacks/assembly.js +0 -4
- package/stacks/build.d.ts +0 -9
- package/stacks/build.js +0 -110
- package/stacks/deploy.d.ts +0 -9
- package/stacks/deploy.js +0 -240
- package/stacks/diff.d.ts +0 -8
- package/stacks/diff.js +0 -62
- package/stacks/index.d.ts +0 -10
- package/stacks/index.js +0 -10
- package/stacks/metadata.d.ts +0 -11
- package/stacks/metadata.js +0 -83
- package/stacks/monitor.d.ts +0 -32
- package/stacks/monitor.js +0 -151
- package/stacks/remove.d.ts +0 -8
- package/stacks/remove.js +0 -76
- package/stacks/synth.d.ts +0 -12
- package/stacks/synth.js +0 -94
- package/support/base-site-archiver.mjs +0 -99
- package/support/base-site-custom-resource/s3-handler.py +0 -195
- package/support/base-site-custom-resource/s3-upload.py +0 -89
- package/support/bootstrap-metadata-function/index.mjs +0 -58011
- package/support/bridge/Dockerfile +0 -3
- package/support/bridge/bridge.mjs +0 -146
- package/support/certificate-requestor/index.js +0 -549
- package/support/custom-resources/index.mjs +0 -180627
- package/support/dotnet31-bootstrap/Program.cs +0 -17
- package/support/dotnet31-bootstrap/dotnet-bootstrap.csproj +0 -12
- package/support/dotnet31-bootstrap/release/Amazon.Lambda.Core.dll +0 -0
- package/support/dotnet31-bootstrap/release/Amazon.Lambda.RuntimeSupport.dll +0 -0
- package/support/dotnet31-bootstrap/release/System.Runtime.CompilerServices.Unsafe.dll +0 -0
- package/support/dotnet31-bootstrap/release/System.Text.Encodings.Web.dll +0 -0
- package/support/dotnet31-bootstrap/release/System.Text.Json.dll +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.deps.json +0 -230
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.dll +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.pdb +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.runtimeconfig.json +0 -9
- package/support/dotnet6-bootstrap/Program.cs +0 -17
- package/support/dotnet6-bootstrap/dotnet-bootstrap.csproj +0 -12
- package/support/dotnet6-bootstrap/release/Amazon.Lambda.Core.dll +0 -0
- package/support/dotnet6-bootstrap/release/Amazon.Lambda.RuntimeSupport.dll +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.deps.json +0 -59
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.dll +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.pdb +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.runtimeconfig.json +0 -12
- package/support/edge-function/edge-lambda-version.mjs +0 -3
- package/support/edge-function/edge-lambda.mjs +0 -3
- package/support/edge-function/s3-bucket.mjs +0 -3
- package/support/event-bus-retrier/index.mjs +0 -75
- package/support/java-runtime/install.sh +0 -25
- package/support/java-runtime/pom.xml +0 -39
- package/support/java-runtime/release/aws-lambda-java-core-1.2.0.jar +0 -0
- package/support/java-runtime/release/aws-lambda-java-runtime-interface-client-1.1.0.jar +0 -0
- package/support/java-runtime/release/aws-lambda-java-serialization-1.0.0.jar +0 -0
- package/support/job-manager/index.mjs +0 -57679
- package/support/nixpacks/Dockerfile +0 -6
- package/support/nodejs-runtime/index.mjs +0 -169
- package/support/python-runtime/Dockerfile +0 -9
- package/support/python-runtime/Dockerfile.custom +0 -21
- package/support/python-runtime/Dockerfile.dependencies +0 -26
- package/support/python-runtime/runtime.py +0 -127
- package/support/rds-migrator/index.mjs +0 -49
- package/support/remix-site-function/edge-server.js +0 -161
- package/support/remix-site-function/polyfill.js +0 -24
- package/support/remix-site-function/regional-server.js +0 -164
- package/support/script-function/index.mjs +0 -48760
- package/support/service-dev-function/index.js +0 -1
- package/support/signing-function/index.mjs +0 -3769
- package/support/sls-nextjs-site-build-helper/build.cjs +0 -91
- package/support/sls-nextjs-site-build-helper/index-wrapper.js +0 -19
- package/support/sls-nextjs-site-function-code-replacer/lambda-code-updater.py +0 -156
- package/support/sls-nextjs-site-stub/index.html +0 -99
- package/support/ssr-site-function-archiver.mjs +0 -96
- package/support/ssr-site-function-stub/index.js +0 -5
- package/support/ssr-warmer/index.mjs +0 -34235
- package/util/error.d.ts +0 -3
- package/util/error.js +0 -6
- package/util/fs.d.ts +0 -4
- package/util/fs.js +0 -46
- package/util/lazy.d.ts +0 -1
- package/util/lazy.js +0 -11
- package/util/module.d.ts +0 -1
- package/util/module.js +0 -5
- package/util/process.d.ts +0 -2
- package/util/process.js +0 -3
- package/watcher.d.ts +0 -14
- package/watcher.js +0 -35
package/constructs/Api.js
DELETED
|
@@ -1,743 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { Role, ServicePrincipal, PolicyDocument, PolicyStatement, } from "aws-cdk-lib/aws-iam";
|
|
3
|
-
import { HttpUrlIntegration, HttpAlbIntegration, HttpNlbIntegration, HttpLambdaIntegration, } from "@aws-cdk/aws-apigatewayv2-integrations-alpha";
|
|
4
|
-
import { HttpAwsIntegration, } from "./cdk/HttpAwsIntegration.js";
|
|
5
|
-
import { Stack } from "./Stack.js";
|
|
6
|
-
import { getFunctionRef, isCDKConstruct } from "./Construct.js";
|
|
7
|
-
import { Function as Fn, } from "./Function.js";
|
|
8
|
-
import { toCdkDuration } from "./util/duration.js";
|
|
9
|
-
import * as apigV2Cors from "./util/apiGatewayV2Cors.js";
|
|
10
|
-
import * as apigV2Domain from "./util/apiGatewayV2Domain.js";
|
|
11
|
-
import * as apigV2AccessLog from "./util/apiGatewayV2AccessLog.js";
|
|
12
|
-
import { HttpApi, HttpMethod, HttpNoneAuthorizer, HttpRoute, HttpRouteKey, HttpStage, IntegrationCredentials, PayloadFormatVersion, } from "@aws-cdk/aws-apigatewayv2-alpha";
|
|
13
|
-
import { HttpIamAuthorizer, HttpJwtAuthorizer, HttpLambdaAuthorizer, HttpLambdaResponseType, HttpUserPoolAuthorizer, } from "@aws-cdk/aws-apigatewayv2-authorizers-alpha";
|
|
14
|
-
import { UserPool, UserPoolClient } from "aws-cdk-lib/aws-cognito";
|
|
15
|
-
const PayloadFormatVersions = ["1.0", "2.0"];
|
|
16
|
-
/////////////////////
|
|
17
|
-
// Construct
|
|
18
|
-
/////////////////////
|
|
19
|
-
/**
|
|
20
|
-
* The Api construct is a higher level CDK construct that makes it easy to create an API.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
*
|
|
24
|
-
* ```ts
|
|
25
|
-
* import { Api } from "sst/constructs";
|
|
26
|
-
*
|
|
27
|
-
* new Api(stack, "Api", {
|
|
28
|
-
* routes: {
|
|
29
|
-
* "GET /notes": "src/list.main",
|
|
30
|
-
* "POST /notes": "src/create.main",
|
|
31
|
-
* "GET /notes/{id}": "src/get.main",
|
|
32
|
-
* "PUT /notes/{id}": "src/update.main",
|
|
33
|
-
* "DELETE /notes/{id}": "src/delete.main",
|
|
34
|
-
* },
|
|
35
|
-
* });
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export class Api extends Construct {
|
|
39
|
-
id;
|
|
40
|
-
cdk;
|
|
41
|
-
props;
|
|
42
|
-
_customDomainUrl;
|
|
43
|
-
routesData;
|
|
44
|
-
authorizersData;
|
|
45
|
-
bindingForAllRoutes = [];
|
|
46
|
-
permissionsAttachedForAllRoutes = [];
|
|
47
|
-
constructor(scope, id, props) {
|
|
48
|
-
super(scope, props?.cdk?.id || id);
|
|
49
|
-
this.id = id;
|
|
50
|
-
this.props = props || {};
|
|
51
|
-
this.cdk = {};
|
|
52
|
-
this.routesData = {};
|
|
53
|
-
this.authorizersData = {};
|
|
54
|
-
this.createHttpApi();
|
|
55
|
-
this.addAuthorizers(this.props.authorizers || {});
|
|
56
|
-
this.addRoutes(this, this.props.routes || {});
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* The AWS generated URL of the Api.
|
|
60
|
-
*/
|
|
61
|
-
get url() {
|
|
62
|
-
const app = this.node.root;
|
|
63
|
-
return this.cdk.httpApi instanceof HttpApi
|
|
64
|
-
? this.cdk.httpApi.apiEndpoint
|
|
65
|
-
: `https://${this.cdk.httpApi.apiId}.execute-api.${app.region}.amazonaws.com`;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* If custom domain is enabled, this is the custom domain URL of the Api.
|
|
69
|
-
*
|
|
70
|
-
* :::note
|
|
71
|
-
* If you are setting the base mapping for the custom domain, you need to include the trailing slash while using the custom domain URL. For example, if the [`domainName`](#domainname) is set to `api.domain.com` and the [`path`](#path) is `v1`, the custom domain URL of the API will be `https://api.domain.com/v1/`.
|
|
72
|
-
* :::
|
|
73
|
-
*/
|
|
74
|
-
get customDomainUrl() {
|
|
75
|
-
return this._customDomainUrl;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* The routes for the Api
|
|
79
|
-
*/
|
|
80
|
-
get routes() {
|
|
81
|
-
return Object.keys(this.routesData);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* The ARN of the internally created API Gateway HTTP API
|
|
85
|
-
*/
|
|
86
|
-
get httpApiArn() {
|
|
87
|
-
const stack = Stack.of(this);
|
|
88
|
-
return `arn:${stack.partition}:apigateway:${stack.region}::/apis/${this.cdk.httpApi.apiId}`;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* The id of the internally created API Gateway HTTP API
|
|
92
|
-
*/
|
|
93
|
-
get httpApiId() {
|
|
94
|
-
return this.cdk.httpApi.apiId;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Adds routes to the Api after it has been created.
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* ```js
|
|
101
|
-
* api.addRoutes(stack, {
|
|
102
|
-
* "GET /notes/{id}": "src/get.main",
|
|
103
|
-
* "PUT /notes/{id}": "src/update.main",
|
|
104
|
-
* "DELETE /notes/{id}": "src/delete.main",
|
|
105
|
-
* });
|
|
106
|
-
* ```
|
|
107
|
-
*/
|
|
108
|
-
addRoutes(scope, routes) {
|
|
109
|
-
Object.keys(routes).forEach((routeKey) => {
|
|
110
|
-
this.addRoute(scope, routeKey, routes[routeKey]);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Get the instance of the internally created Function, for a given route key where the `routeKey` is the key used to define a route. For example, `GET /notes`.
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* ```js
|
|
118
|
-
* const api = new Api(stack, "Api", {
|
|
119
|
-
* routes: {
|
|
120
|
-
* "GET /notes": "src/list.main",
|
|
121
|
-
* },
|
|
122
|
-
* });
|
|
123
|
-
*
|
|
124
|
-
* const listFunction = api.getFunction("GET /notes");
|
|
125
|
-
* ```
|
|
126
|
-
*/
|
|
127
|
-
getFunction(routeKey) {
|
|
128
|
-
const route = this.routesData[this.normalizeRouteKey(routeKey)];
|
|
129
|
-
if (!route)
|
|
130
|
-
return;
|
|
131
|
-
if (route.type === "function" || route.type === "graphql") {
|
|
132
|
-
return route.function;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Binds the given list of resources to all the routes.
|
|
137
|
-
*
|
|
138
|
-
* @example
|
|
139
|
-
*
|
|
140
|
-
* ```js
|
|
141
|
-
* api.bind([STRIPE_KEY, bucket]);
|
|
142
|
-
* ```
|
|
143
|
-
*/
|
|
144
|
-
bind(constructs) {
|
|
145
|
-
for (const route of Object.values(this.routesData)) {
|
|
146
|
-
if (route.type === "function" || route.type === "graphql") {
|
|
147
|
-
route.function.bind(constructs);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
this.bindingForAllRoutes.push(...constructs);
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Binds the given list of resources to a specific route.
|
|
154
|
-
*
|
|
155
|
-
* @example
|
|
156
|
-
* ```js
|
|
157
|
-
* const api = new Api(stack, "Api", {
|
|
158
|
-
* routes: {
|
|
159
|
-
* "GET /notes": "src/list.main",
|
|
160
|
-
* },
|
|
161
|
-
* });
|
|
162
|
-
*
|
|
163
|
-
* api.bindToRoute("GET /notes", [STRIPE_KEY, bucket]);
|
|
164
|
-
* ```
|
|
165
|
-
*
|
|
166
|
-
*/
|
|
167
|
-
bindToRoute(routeKey, constructs) {
|
|
168
|
-
const fn = this.getFunction(routeKey);
|
|
169
|
-
if (!fn) {
|
|
170
|
-
throw new Error(`Failed to bind resources. Route "${routeKey}" does not exist.`);
|
|
171
|
-
}
|
|
172
|
-
fn.bind(constructs);
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Attaches the given list of permissions to all the routes. This allows the functions to access other AWS resources.
|
|
176
|
-
*
|
|
177
|
-
* @example
|
|
178
|
-
*
|
|
179
|
-
* ```js
|
|
180
|
-
* api.attachPermissions(["s3"]);
|
|
181
|
-
* ```
|
|
182
|
-
*/
|
|
183
|
-
attachPermissions(permissions) {
|
|
184
|
-
for (const route of Object.values(this.routesData)) {
|
|
185
|
-
if (route.type === "function" || route.type === "graphql") {
|
|
186
|
-
route.function.attachPermissions(permissions);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
this.permissionsAttachedForAllRoutes.push(permissions);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Attaches the given list of permissions to a specific route. This allows that function to access other AWS resources.
|
|
193
|
-
*
|
|
194
|
-
* @example
|
|
195
|
-
* ```js
|
|
196
|
-
* const api = new Api(stack, "Api", {
|
|
197
|
-
* routes: {
|
|
198
|
-
* "GET /notes": "src/list.main",
|
|
199
|
-
* },
|
|
200
|
-
* });
|
|
201
|
-
*
|
|
202
|
-
* api.attachPermissionsToRoute("GET /notes", ["s3"]);
|
|
203
|
-
* ```
|
|
204
|
-
*
|
|
205
|
-
*/
|
|
206
|
-
attachPermissionsToRoute(routeKey, permissions) {
|
|
207
|
-
const fn = this.getFunction(routeKey);
|
|
208
|
-
if (!fn) {
|
|
209
|
-
throw new Error(`Failed to attach permissions. Route "${routeKey}" does not exist.`);
|
|
210
|
-
}
|
|
211
|
-
fn.attachPermissions(permissions);
|
|
212
|
-
}
|
|
213
|
-
getConstructMetadata() {
|
|
214
|
-
return {
|
|
215
|
-
type: "Api",
|
|
216
|
-
data: {
|
|
217
|
-
graphql: false,
|
|
218
|
-
url: this.cdk.httpApi.url,
|
|
219
|
-
httpApiId: this.cdk.httpApi.apiId,
|
|
220
|
-
customDomainUrl: this._customDomainUrl,
|
|
221
|
-
routes: Object.entries(this.routesData).map(([key, data]) => {
|
|
222
|
-
if (data.type === "function")
|
|
223
|
-
return {
|
|
224
|
-
type: "function",
|
|
225
|
-
route: key,
|
|
226
|
-
fn: getFunctionRef(data.function),
|
|
227
|
-
};
|
|
228
|
-
if (data.type === "graphql")
|
|
229
|
-
return {
|
|
230
|
-
type: "graphql",
|
|
231
|
-
route: key,
|
|
232
|
-
fn: getFunctionRef(data.function),
|
|
233
|
-
schema: data.schema,
|
|
234
|
-
internalPackages: data.internalPackages,
|
|
235
|
-
output: data.output,
|
|
236
|
-
commands: data.commands,
|
|
237
|
-
};
|
|
238
|
-
return { type: data.type, route: key };
|
|
239
|
-
}),
|
|
240
|
-
},
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
/** @internal */
|
|
244
|
-
getFunctionBinding() {
|
|
245
|
-
return {
|
|
246
|
-
clientPackage: "api",
|
|
247
|
-
variables: {
|
|
248
|
-
url: {
|
|
249
|
-
type: "plain",
|
|
250
|
-
value: this.customDomainUrl || this.url,
|
|
251
|
-
},
|
|
252
|
-
},
|
|
253
|
-
permissions: {},
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
createHttpApi() {
|
|
257
|
-
const { cdk, cors, defaults, accessLog, customDomain } = this.props;
|
|
258
|
-
const id = this.node.id;
|
|
259
|
-
const app = this.node.root;
|
|
260
|
-
if (isCDKConstruct(cdk?.httpApi)) {
|
|
261
|
-
if (cors !== undefined) {
|
|
262
|
-
throw new Error(`Cannot configure the "cors" when "cdk.httpApi" is a construct`);
|
|
263
|
-
}
|
|
264
|
-
if (accessLog !== undefined) {
|
|
265
|
-
throw new Error(`Cannot configure the "accessLog" when "cdk.httpApi" is a construct`);
|
|
266
|
-
}
|
|
267
|
-
if (customDomain !== undefined) {
|
|
268
|
-
throw new Error(`Cannot configure the "customDomain" when "cdk.httpApi" is a construct`);
|
|
269
|
-
}
|
|
270
|
-
if (cdk?.httpStages !== undefined) {
|
|
271
|
-
throw new Error(`Cannot configure the "stages" when "cdk.httpApi" is a construct`);
|
|
272
|
-
}
|
|
273
|
-
this.cdk.httpApi = cdk?.httpApi;
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
const httpApiProps = (cdk?.httpApi || {});
|
|
277
|
-
// Validate input
|
|
278
|
-
if (httpApiProps.corsPreflight !== undefined) {
|
|
279
|
-
throw new Error(`Cannot configure the "httpApi.corsPreflight" in the Api`);
|
|
280
|
-
}
|
|
281
|
-
if (httpApiProps.defaultDomainMapping !== undefined) {
|
|
282
|
-
throw new Error(`Cannot configure the "httpApi.defaultDomainMapping" in the Api`);
|
|
283
|
-
}
|
|
284
|
-
// Handle Custom Domain
|
|
285
|
-
const customDomainData = apigV2Domain.buildCustomDomainData(this, customDomain);
|
|
286
|
-
let defaultDomainMapping;
|
|
287
|
-
if (customDomainData) {
|
|
288
|
-
if (customDomainData.isApigDomainCreated) {
|
|
289
|
-
this.cdk.domainName = customDomainData.apigDomain;
|
|
290
|
-
}
|
|
291
|
-
if (customDomainData.isCertificatedCreated) {
|
|
292
|
-
this.cdk.certificate = customDomainData.certificate;
|
|
293
|
-
}
|
|
294
|
-
defaultDomainMapping = {
|
|
295
|
-
domainName: customDomainData.apigDomain,
|
|
296
|
-
mappingKey: customDomainData.mappingKey,
|
|
297
|
-
};
|
|
298
|
-
this._customDomainUrl = `https://${customDomainData.url}`;
|
|
299
|
-
}
|
|
300
|
-
this.cdk.httpApi = new HttpApi(this, "Api", {
|
|
301
|
-
apiName: app.logicalPrefixedName(id),
|
|
302
|
-
corsPreflight: apigV2Cors.buildCorsConfig(cors),
|
|
303
|
-
defaultDomainMapping,
|
|
304
|
-
...httpApiProps,
|
|
305
|
-
});
|
|
306
|
-
const httpStage = this.cdk.httpApi.defaultStage;
|
|
307
|
-
// Configure throttling
|
|
308
|
-
if (defaults?.throttle?.burst && defaults?.throttle?.rate) {
|
|
309
|
-
const cfnStage = httpStage.node.defaultChild;
|
|
310
|
-
cfnStage.defaultRouteSettings = {
|
|
311
|
-
...(cfnStage.routeSettings || {}),
|
|
312
|
-
throttlingBurstLimit: defaults.throttle.burst,
|
|
313
|
-
throttlingRateLimit: defaults.throttle.rate,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
// Configure access log
|
|
317
|
-
for (const def of cdk?.httpStages || []) {
|
|
318
|
-
const stage = new HttpStage(this, "Stage" + def.stageName, {
|
|
319
|
-
...def,
|
|
320
|
-
httpApi: this.cdk.httpApi,
|
|
321
|
-
});
|
|
322
|
-
apigV2AccessLog.buildAccessLogData(this, accessLog, stage, false);
|
|
323
|
-
}
|
|
324
|
-
if (this.cdk.httpApi.defaultStage)
|
|
325
|
-
this.cdk.accessLogGroup = apigV2AccessLog.buildAccessLogData(this, accessLog, this.cdk.httpApi.defaultStage, true);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
addAuthorizers(authorizers) {
|
|
329
|
-
Object.entries(authorizers).forEach(([key, value]) => {
|
|
330
|
-
if (key === "none") {
|
|
331
|
-
throw new Error(`Cannot name an authorizer "none"`);
|
|
332
|
-
}
|
|
333
|
-
else if (key === "iam") {
|
|
334
|
-
throw new Error(`Cannot name an authorizer "iam"`);
|
|
335
|
-
}
|
|
336
|
-
else if (value.type === "user_pool") {
|
|
337
|
-
if (value.cdk?.authorizer) {
|
|
338
|
-
this.authorizersData[key] = value.cdk.authorizer;
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
if (!value.userPool) {
|
|
342
|
-
throw new Error(`Missing "userPool" for "${key}" authorizer`);
|
|
343
|
-
}
|
|
344
|
-
const userPool = UserPool.fromUserPoolId(this, `Api-${this.node.id}-Authorizer-${key}-UserPool`, value.userPool.id);
|
|
345
|
-
const userPoolClients = value.userPool.clientIds &&
|
|
346
|
-
value.userPool.clientIds.map((clientId, i) => UserPoolClient.fromUserPoolClientId(this, `Api-${this.node.id}-Authorizer-${key}-UserPoolClient-${i}`, clientId));
|
|
347
|
-
this.authorizersData[key] = new HttpUserPoolAuthorizer(key, userPool, {
|
|
348
|
-
authorizerName: value.name,
|
|
349
|
-
identitySource: value.identitySource,
|
|
350
|
-
userPoolClients,
|
|
351
|
-
userPoolRegion: value.userPool.region,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
else if (value.type === "jwt") {
|
|
356
|
-
if (value.cdk?.authorizer) {
|
|
357
|
-
this.authorizersData[key] = value.cdk.authorizer;
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
if (!value.jwt) {
|
|
361
|
-
throw new Error(`Missing "jwt" for "${key}" authorizer`);
|
|
362
|
-
}
|
|
363
|
-
this.authorizersData[key] = new HttpJwtAuthorizer(key, value.jwt.issuer, {
|
|
364
|
-
authorizerName: value.name,
|
|
365
|
-
identitySource: value.identitySource,
|
|
366
|
-
jwtAudience: value.jwt.audience,
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
else if (value.type === "lambda") {
|
|
371
|
-
if (value.cdk?.authorizer) {
|
|
372
|
-
this.authorizersData[key] = value.cdk.authorizer;
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
if (!value.function) {
|
|
376
|
-
throw new Error(`Missing "function" for "${key}" authorizer`);
|
|
377
|
-
}
|
|
378
|
-
this.authorizersData[key] = new HttpLambdaAuthorizer(key, value.function, {
|
|
379
|
-
authorizerName: value.name,
|
|
380
|
-
identitySource: value.identitySource,
|
|
381
|
-
responseTypes: value.responseTypes &&
|
|
382
|
-
value.responseTypes.map((type) => HttpLambdaResponseType[type.toUpperCase()]),
|
|
383
|
-
resultsCacheTtl: value.resultsCacheTtl
|
|
384
|
-
? toCdkDuration(value.resultsCacheTtl)
|
|
385
|
-
: toCdkDuration("0 seconds"),
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
addRoute(scope, routeKey, routeValue) {
|
|
392
|
-
///////////////////
|
|
393
|
-
// Normalize routeKey
|
|
394
|
-
///////////////////
|
|
395
|
-
routeKey = this.normalizeRouteKey(routeKey);
|
|
396
|
-
if (this.routesData[routeKey]) {
|
|
397
|
-
throw new Error(`A route already exists for "${routeKey}"`);
|
|
398
|
-
}
|
|
399
|
-
///////////////////
|
|
400
|
-
// Get path and method
|
|
401
|
-
///////////////////
|
|
402
|
-
let postfixName;
|
|
403
|
-
let httpRouteKey;
|
|
404
|
-
let method;
|
|
405
|
-
let path;
|
|
406
|
-
if (routeKey === "$default") {
|
|
407
|
-
postfixName = "default";
|
|
408
|
-
httpRouteKey = HttpRouteKey.DEFAULT;
|
|
409
|
-
method = "ANY";
|
|
410
|
-
path = routeKey;
|
|
411
|
-
}
|
|
412
|
-
else {
|
|
413
|
-
const routeKeyParts = routeKey.split(" ");
|
|
414
|
-
if (routeKeyParts.length !== 2) {
|
|
415
|
-
throw new Error(`Invalid route ${routeKey}`);
|
|
416
|
-
}
|
|
417
|
-
method = routeKeyParts[0].toUpperCase();
|
|
418
|
-
if (!HttpMethod[method]) {
|
|
419
|
-
throw new Error(`Invalid method defined for "${routeKey}"`);
|
|
420
|
-
}
|
|
421
|
-
path = routeKeyParts[1];
|
|
422
|
-
if (path.length === 0) {
|
|
423
|
-
throw new Error(`Invalid path defined for "${routeKey}"`);
|
|
424
|
-
}
|
|
425
|
-
postfixName = `${method}_${path}`;
|
|
426
|
-
httpRouteKey = HttpRouteKey.with(path, HttpMethod[method]);
|
|
427
|
-
}
|
|
428
|
-
///////////////////
|
|
429
|
-
// Create route
|
|
430
|
-
///////////////////
|
|
431
|
-
const [routeProps, integration] = (() => {
|
|
432
|
-
if (Fn.isInlineDefinition(routeValue)) {
|
|
433
|
-
const routeProps = {
|
|
434
|
-
function: routeValue,
|
|
435
|
-
};
|
|
436
|
-
return [
|
|
437
|
-
routeProps,
|
|
438
|
-
this.createFunctionIntegration(scope, routeKey, routeProps, postfixName),
|
|
439
|
-
];
|
|
440
|
-
}
|
|
441
|
-
if (routeValue.type === "aws") {
|
|
442
|
-
return [
|
|
443
|
-
routeValue,
|
|
444
|
-
this.createAwsProxyIntegration(scope, routeKey, routeValue, postfixName),
|
|
445
|
-
];
|
|
446
|
-
}
|
|
447
|
-
if (routeValue.type === "alb") {
|
|
448
|
-
return [
|
|
449
|
-
routeValue,
|
|
450
|
-
this.createAlbIntegration(scope, routeKey, routeValue, postfixName),
|
|
451
|
-
];
|
|
452
|
-
}
|
|
453
|
-
if (routeValue.type === "nlb") {
|
|
454
|
-
return [
|
|
455
|
-
routeValue,
|
|
456
|
-
this.createNlbIntegration(scope, routeKey, routeValue, postfixName),
|
|
457
|
-
];
|
|
458
|
-
}
|
|
459
|
-
if (routeValue.type === "url") {
|
|
460
|
-
return [
|
|
461
|
-
routeValue,
|
|
462
|
-
this.createHttpIntegration(scope, routeKey, routeValue, postfixName),
|
|
463
|
-
];
|
|
464
|
-
}
|
|
465
|
-
if (routeValue.type === "graphql") {
|
|
466
|
-
return [
|
|
467
|
-
routeValue,
|
|
468
|
-
this.createGraphQLIntegration(scope, routeKey, routeValue, postfixName),
|
|
469
|
-
];
|
|
470
|
-
}
|
|
471
|
-
if (routeValue.cdk?.function) {
|
|
472
|
-
return [
|
|
473
|
-
routeValue,
|
|
474
|
-
this.createCdkFunctionIntegration(scope, routeKey, routeValue, postfixName),
|
|
475
|
-
];
|
|
476
|
-
}
|
|
477
|
-
if ("function" in routeValue) {
|
|
478
|
-
return [
|
|
479
|
-
routeValue,
|
|
480
|
-
this.createFunctionIntegration(scope, routeKey, routeValue, postfixName),
|
|
481
|
-
];
|
|
482
|
-
}
|
|
483
|
-
if ("handler" in routeValue)
|
|
484
|
-
throw new Error(`Function definition must be nested under the "function" key in the route props for "${routeKey}". ie. { function: { handler: "myfunc.handler" } }`);
|
|
485
|
-
throw new Error(`Invalid route type "${routeValue.type}" for "${routeKey}".`);
|
|
486
|
-
})();
|
|
487
|
-
const { authorizationType, authorizer, authorizationScopes } = this.buildRouteAuth(routeProps);
|
|
488
|
-
const route = new HttpRoute(scope, `Route_${postfixName}`, {
|
|
489
|
-
httpApi: this.cdk.httpApi,
|
|
490
|
-
routeKey: httpRouteKey,
|
|
491
|
-
integration,
|
|
492
|
-
authorizer,
|
|
493
|
-
authorizationScopes,
|
|
494
|
-
});
|
|
495
|
-
////////////////////
|
|
496
|
-
// Configure route authorization type
|
|
497
|
-
////////////////////
|
|
498
|
-
// Note: we need to explicitly set `cfnRoute.authorizationType` to `NONE`
|
|
499
|
-
// because if it were set to `AWS_IAM`, and then it is removed from
|
|
500
|
-
// the CloudFormation template (ie. set to undefined), CloudFormation
|
|
501
|
-
// doesn't updates the route. The route's authorizationType would still
|
|
502
|
-
// be `AWS_IAM`.
|
|
503
|
-
const cfnRoute = route.node.defaultChild;
|
|
504
|
-
if (authorizationType === "iam") {
|
|
505
|
-
cfnRoute.authorizationType = "AWS_IAM";
|
|
506
|
-
}
|
|
507
|
-
else if (authorizationType === "none") {
|
|
508
|
-
cfnRoute.authorizationType = "NONE";
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
createAwsProxyIntegration(scope, routeKey, routeProps, postfixName) {
|
|
512
|
-
// Create IAM role for API Gateway to call the AWS services
|
|
513
|
-
const [service, serviceApi] = routeProps.cdk.integration.subtype.split("-");
|
|
514
|
-
const servicePrefix = {
|
|
515
|
-
EventBridge: "events",
|
|
516
|
-
SQS: "sqs",
|
|
517
|
-
AppConfig: "appconfig",
|
|
518
|
-
Kinesis: "kinesis",
|
|
519
|
-
StepFunctions: "states",
|
|
520
|
-
}[service];
|
|
521
|
-
const role = new Role(scope, `IntegrationRole_${postfixName}`, {
|
|
522
|
-
assumedBy: new ServicePrincipal("apigateway.amazonaws.com"),
|
|
523
|
-
inlinePolicies: {
|
|
524
|
-
Policy: new PolicyDocument({
|
|
525
|
-
statements: [
|
|
526
|
-
new PolicyStatement({
|
|
527
|
-
actions: [`${servicePrefix}:${serviceApi}`],
|
|
528
|
-
resources: ["*"],
|
|
529
|
-
}),
|
|
530
|
-
],
|
|
531
|
-
}),
|
|
532
|
-
},
|
|
533
|
-
});
|
|
534
|
-
// Create integration
|
|
535
|
-
const integration = new HttpAwsIntegration(`Integration_${postfixName}`, {
|
|
536
|
-
...routeProps.cdk.integration,
|
|
537
|
-
credentials: IntegrationCredentials.fromRole(role),
|
|
538
|
-
});
|
|
539
|
-
// Store route
|
|
540
|
-
this.routesData[routeKey] = {
|
|
541
|
-
type: "aws",
|
|
542
|
-
};
|
|
543
|
-
return integration;
|
|
544
|
-
}
|
|
545
|
-
createHttpIntegration(_scope, routeKey, routeProps, postfixName) {
|
|
546
|
-
///////////////////
|
|
547
|
-
// Create integration
|
|
548
|
-
///////////////////
|
|
549
|
-
const integration = new HttpUrlIntegration(`Integration_${postfixName}`, routeProps.url, routeProps.cdk?.integration);
|
|
550
|
-
// Store route
|
|
551
|
-
this.routesData[routeKey] = {
|
|
552
|
-
type: "url",
|
|
553
|
-
url: routeProps.url,
|
|
554
|
-
};
|
|
555
|
-
return integration;
|
|
556
|
-
}
|
|
557
|
-
createAlbIntegration(_scope, routeKey, routeProps, postfixName) {
|
|
558
|
-
///////////////////
|
|
559
|
-
// Create integration
|
|
560
|
-
///////////////////
|
|
561
|
-
const integration = new HttpAlbIntegration(`Integration_${postfixName}`, routeProps.cdk?.albListener, routeProps.cdk?.integration);
|
|
562
|
-
// Store route
|
|
563
|
-
this.routesData[routeKey] = {
|
|
564
|
-
type: "alb",
|
|
565
|
-
alb: routeProps.cdk?.albListener,
|
|
566
|
-
};
|
|
567
|
-
return integration;
|
|
568
|
-
}
|
|
569
|
-
createNlbIntegration(_scope, routeKey, routeProps, postfixName) {
|
|
570
|
-
///////////////////
|
|
571
|
-
// Create integration
|
|
572
|
-
///////////////////
|
|
573
|
-
const integration = new HttpNlbIntegration(`Integration_${postfixName}`, routeProps.cdk?.nlbListener, routeProps.cdk?.integration);
|
|
574
|
-
// Store route
|
|
575
|
-
this.routesData[routeKey] = {
|
|
576
|
-
type: "nlb",
|
|
577
|
-
nlb: routeProps.cdk?.nlbListener,
|
|
578
|
-
};
|
|
579
|
-
return integration;
|
|
580
|
-
}
|
|
581
|
-
createGraphQLIntegration(scope, routeKey, routeProps, postfixName) {
|
|
582
|
-
const result = this.createFunctionIntegration(scope, routeKey, {
|
|
583
|
-
...routeProps,
|
|
584
|
-
type: "function",
|
|
585
|
-
payloadFormatVersion: "2.0",
|
|
586
|
-
}, postfixName);
|
|
587
|
-
const data = this.routesData[routeKey];
|
|
588
|
-
if (data.type === "function") {
|
|
589
|
-
data.function.addEnvironment("GRAPHQL_ENDPOINT", routeKey.split(" ")[1]);
|
|
590
|
-
this.routesData[routeKey] = {
|
|
591
|
-
...data,
|
|
592
|
-
type: "graphql",
|
|
593
|
-
output: routeProps.pothos?.output,
|
|
594
|
-
schema: routeProps.pothos?.schema,
|
|
595
|
-
commands: routeProps.pothos?.commands,
|
|
596
|
-
internalPackages: routeProps.pothos?.internalPackages,
|
|
597
|
-
};
|
|
598
|
-
}
|
|
599
|
-
return result;
|
|
600
|
-
}
|
|
601
|
-
createCdkFunctionIntegration(_scope, routeKey, routeProps, postfixName) {
|
|
602
|
-
///////////////////
|
|
603
|
-
// Get payload format
|
|
604
|
-
///////////////////
|
|
605
|
-
const payloadFormatVersion = routeProps.payloadFormatVersion ||
|
|
606
|
-
this.props.defaults?.payloadFormatVersion ||
|
|
607
|
-
"2.0";
|
|
608
|
-
if (!PayloadFormatVersions.includes(payloadFormatVersion)) {
|
|
609
|
-
throw new Error(`PayloadFormatVersion: sst.Api does not currently support ${payloadFormatVersion} payload format version. Only "V1" and "V2" are currently supported.`);
|
|
610
|
-
}
|
|
611
|
-
const integrationPayloadFormatVersion = payloadFormatVersion === "1.0"
|
|
612
|
-
? PayloadFormatVersion.VERSION_1_0
|
|
613
|
-
: PayloadFormatVersion.VERSION_2_0;
|
|
614
|
-
///////////////////
|
|
615
|
-
// Create Function
|
|
616
|
-
///////////////////
|
|
617
|
-
const lambda = routeProps.cdk?.function;
|
|
618
|
-
///////////////////
|
|
619
|
-
// Create integration
|
|
620
|
-
///////////////////
|
|
621
|
-
const integration = new HttpLambdaIntegration(`Integration_${postfixName}`, lambda, {
|
|
622
|
-
payloadFormatVersion: integrationPayloadFormatVersion,
|
|
623
|
-
});
|
|
624
|
-
// Store route
|
|
625
|
-
this.routesData[routeKey] = {
|
|
626
|
-
type: "lambda_function",
|
|
627
|
-
function: lambda,
|
|
628
|
-
};
|
|
629
|
-
return integration;
|
|
630
|
-
}
|
|
631
|
-
createFunctionIntegration(scope, routeKey, routeProps, postfixName) {
|
|
632
|
-
///////////////////
|
|
633
|
-
// Get payload format
|
|
634
|
-
///////////////////
|
|
635
|
-
const payloadFormatVersion = routeProps.payloadFormatVersion ||
|
|
636
|
-
this.props.defaults?.payloadFormatVersion ||
|
|
637
|
-
"2.0";
|
|
638
|
-
if (!PayloadFormatVersions.includes(payloadFormatVersion)) {
|
|
639
|
-
throw new Error(`PayloadFormatVersion: sst.Api does not currently support ${payloadFormatVersion} payload format version. Only "V1" and "V2" are currently supported.`);
|
|
640
|
-
}
|
|
641
|
-
const integrationPayloadFormatVersion = payloadFormatVersion === "1.0"
|
|
642
|
-
? PayloadFormatVersion.VERSION_1_0
|
|
643
|
-
: PayloadFormatVersion.VERSION_2_0;
|
|
644
|
-
///////////////////
|
|
645
|
-
// Create Function
|
|
646
|
-
///////////////////
|
|
647
|
-
const lambda = Fn.fromDefinition(scope, `Lambda_${postfixName}`, routeProps.function, this.props.defaults?.function, `The "defaults.function" cannot be applied if an instance of a Function construct is passed in. Make sure to define all the routes using FunctionProps, so the Api construct can apply the "defaults.function" to them.`);
|
|
648
|
-
// Add an environment variable to determine if the function is an Api route.
|
|
649
|
-
// If it is, when "sst start" is not connected, we want to return an 500
|
|
650
|
-
// status code and a descriptive error message.
|
|
651
|
-
const root = scope.node.root;
|
|
652
|
-
if (root.local) {
|
|
653
|
-
lambda.addEnvironment("SST_DEBUG_IS_API_ROUTE", "1", {
|
|
654
|
-
removeInEdge: true,
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
///////////////////
|
|
658
|
-
// Create integration
|
|
659
|
-
///////////////////
|
|
660
|
-
const integration = new HttpLambdaIntegration(`Integration_${postfixName}`, lambda, {
|
|
661
|
-
payloadFormatVersion: integrationPayloadFormatVersion,
|
|
662
|
-
});
|
|
663
|
-
// Store route
|
|
664
|
-
this.routesData[routeKey] = {
|
|
665
|
-
type: "function",
|
|
666
|
-
function: lambda,
|
|
667
|
-
};
|
|
668
|
-
// Attached existing permissions
|
|
669
|
-
this.permissionsAttachedForAllRoutes.forEach((permissions) => lambda.attachPermissions(permissions));
|
|
670
|
-
lambda.bind(this.bindingForAllRoutes);
|
|
671
|
-
return integration;
|
|
672
|
-
}
|
|
673
|
-
buildRouteAuth(routeProps) {
|
|
674
|
-
const authorizerKey = routeProps?.authorizer || this.props.defaults?.authorizer || "none";
|
|
675
|
-
if (authorizerKey === "none") {
|
|
676
|
-
return {
|
|
677
|
-
authorizationType: "none",
|
|
678
|
-
authorizer: new HttpNoneAuthorizer(),
|
|
679
|
-
};
|
|
680
|
-
}
|
|
681
|
-
else if (authorizerKey === "iam") {
|
|
682
|
-
return {
|
|
683
|
-
authorizationType: "iam",
|
|
684
|
-
authorizer: new HttpIamAuthorizer(),
|
|
685
|
-
};
|
|
686
|
-
}
|
|
687
|
-
if (!this.props.authorizers ||
|
|
688
|
-
!this.props.authorizers[authorizerKey]) {
|
|
689
|
-
throw new Error(`Cannot find authorizer "${authorizerKey.toString()}"`);
|
|
690
|
-
}
|
|
691
|
-
const authorizer = this.authorizersData[authorizerKey];
|
|
692
|
-
const authorizationType = this.props.authorizers[authorizerKey].type;
|
|
693
|
-
const authorizationScopes = authorizationType === "jwt" || authorizationType === "user_pool"
|
|
694
|
-
? routeProps?.authorizationScopes ||
|
|
695
|
-
this.props.defaults?.authorizationScopes
|
|
696
|
-
: undefined;
|
|
697
|
-
return { authorizationType, authorizer, authorizationScopes };
|
|
698
|
-
}
|
|
699
|
-
normalizeRouteKey(routeKey) {
|
|
700
|
-
return routeKey.split(/\s+/).join(" ");
|
|
701
|
-
}
|
|
702
|
-
/**
|
|
703
|
-
* Binds the given list of resources to a specific route.
|
|
704
|
-
*
|
|
705
|
-
* @example
|
|
706
|
-
* ```js
|
|
707
|
-
* const api = new Api(stack, "Api");
|
|
708
|
-
*
|
|
709
|
-
* api.setCors({
|
|
710
|
-
* allowMethods: ["GET"],
|
|
711
|
-
* });
|
|
712
|
-
* ```
|
|
713
|
-
*
|
|
714
|
-
*/
|
|
715
|
-
setCors(cors) {
|
|
716
|
-
const { cdk } = this.props;
|
|
717
|
-
if (isCDKConstruct(cdk?.httpApi)) {
|
|
718
|
-
// Cannot set CORS if cdk.httpApi is a construct.
|
|
719
|
-
if (cors !== undefined) {
|
|
720
|
-
throw new Error(`Cannot configure the "cors" when "cdk.httpApi" is a construct`);
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
else {
|
|
724
|
-
// Cannot set CORS via cdk.httpApi. Always use Api.cors.
|
|
725
|
-
const httpApiProps = (cdk?.httpApi || {});
|
|
726
|
-
if (httpApiProps.corsPreflight !== undefined) {
|
|
727
|
-
throw new Error(`Cannot configure the "httpApi.corsPreflight" in the Api`);
|
|
728
|
-
}
|
|
729
|
-
const corsConfig = apigV2Cors.buildCorsConfig(cors);
|
|
730
|
-
if (corsConfig) {
|
|
731
|
-
const cfnApi = this.cdk.httpApi.node.defaultChild;
|
|
732
|
-
cfnApi.corsConfiguration = {
|
|
733
|
-
allowCredentials: corsConfig?.allowCredentials,
|
|
734
|
-
allowHeaders: corsConfig?.allowHeaders,
|
|
735
|
-
allowMethods: corsConfig?.allowMethods,
|
|
736
|
-
allowOrigins: corsConfig?.allowOrigins,
|
|
737
|
-
exposeHeaders: corsConfig?.exposeHeaders,
|
|
738
|
-
maxAge: corsConfig?.maxAge?.toSeconds(),
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
}
|