sst 3.0.0 → 3.0.1-1
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/package.json +7 -139
- package/src/index.ts +1 -0
- package/src/resource.ts +15 -0
- package/tsconfig.json +11 -0
- 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
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Construct, IConstruct } from "constructs";
|
|
2
|
-
import { Role } from "aws-cdk-lib/aws-iam";
|
|
3
|
-
import { IVersion, IFunction as CdkIFunction } from "aws-cdk-lib/aws-lambda";
|
|
4
|
-
import { SSTConstruct } from "./Construct.js";
|
|
5
|
-
import { NodeJSProps } from "./Function.js";
|
|
6
|
-
import { Size } from "./util/size.js";
|
|
7
|
-
import { Duration } from "./util/duration.js";
|
|
8
|
-
import { Permissions } from "./util/permission.js";
|
|
9
|
-
export interface EdgeFunctionProps {
|
|
10
|
-
bundle?: string;
|
|
11
|
-
handler: string;
|
|
12
|
-
runtime: "nodejs14.x" | "nodejs16.x" | "nodejs18.x";
|
|
13
|
-
timeout: number | Duration;
|
|
14
|
-
memorySize: number | Size;
|
|
15
|
-
permissions?: Permissions;
|
|
16
|
-
environment?: Record<string, string>;
|
|
17
|
-
bind?: SSTConstruct[];
|
|
18
|
-
nodejs?: NodeJSProps;
|
|
19
|
-
scopeOverride?: IConstruct;
|
|
20
|
-
}
|
|
21
|
-
export declare class EdgeFunction extends Construct {
|
|
22
|
-
role: Role;
|
|
23
|
-
functionArn: string;
|
|
24
|
-
function: CdkIFunction;
|
|
25
|
-
currentVersion: IVersion;
|
|
26
|
-
private functionCR;
|
|
27
|
-
private assetReplacer;
|
|
28
|
-
private assetReplacerPolicy;
|
|
29
|
-
private scope;
|
|
30
|
-
private bindingEnvs;
|
|
31
|
-
private props;
|
|
32
|
-
constructor(scope: Construct, id: string, props: EdgeFunctionProps);
|
|
33
|
-
build(): Promise<void>;
|
|
34
|
-
attachPermissions(permissions: Permissions): void;
|
|
35
|
-
addEnvironment(key: string, value: string): void;
|
|
36
|
-
private buildAssetFromHandler;
|
|
37
|
-
private buildAssetFromBundle;
|
|
38
|
-
private bind;
|
|
39
|
-
private createCodeReplacer;
|
|
40
|
-
private updateCodeReplacer;
|
|
41
|
-
private createRole;
|
|
42
|
-
private createSingletonBucketInUsEast1;
|
|
43
|
-
private createFunctionInUsEast1;
|
|
44
|
-
private updateFunctionInUsEast1;
|
|
45
|
-
private createVersionInUsEast1;
|
|
46
|
-
private getHandlerExtension;
|
|
47
|
-
private trimFromStart;
|
|
48
|
-
private calculateHash;
|
|
49
|
-
}
|
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import url from "url";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import crypto from "crypto";
|
|
5
|
-
import spawn from "cross-spawn";
|
|
6
|
-
import { Construct } from "constructs";
|
|
7
|
-
import { Effect, Role, Policy, PolicyStatement, CompositePrincipal, ServicePrincipal, ManagedPolicy, } from "aws-cdk-lib/aws-iam";
|
|
8
|
-
import { Version, Code, Runtime, Function as CdkFunction, } from "aws-cdk-lib/aws-lambda";
|
|
9
|
-
import { Asset } from "aws-cdk-lib/aws-s3-assets";
|
|
10
|
-
import { Lazy, Duration as CdkDuration, CustomResource, } from "aws-cdk-lib/core";
|
|
11
|
-
import { useProject } from "../project.js";
|
|
12
|
-
import { useRuntimeHandlers } from "../runtime/handlers.js";
|
|
13
|
-
import { Stack } from "./Stack.js";
|
|
14
|
-
import { useFunctions } from "./Function.js";
|
|
15
|
-
import { bindEnvironment, bindPermissions, getReferencedSecrets, } from "./util/functionBinding.js";
|
|
16
|
-
import { toCdkSize } from "./util/size.js";
|
|
17
|
-
import { toCdkDuration } from "./util/duration.js";
|
|
18
|
-
import { attachPermissionsToRole } from "./util/permission.js";
|
|
19
|
-
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
|
|
20
|
-
/////////////////////
|
|
21
|
-
// Construct
|
|
22
|
-
/////////////////////
|
|
23
|
-
export class EdgeFunction extends Construct {
|
|
24
|
-
role;
|
|
25
|
-
functionArn;
|
|
26
|
-
function;
|
|
27
|
-
currentVersion;
|
|
28
|
-
functionCR;
|
|
29
|
-
assetReplacer;
|
|
30
|
-
assetReplacerPolicy;
|
|
31
|
-
scope;
|
|
32
|
-
bindingEnvs;
|
|
33
|
-
props;
|
|
34
|
-
constructor(scope, id, props) {
|
|
35
|
-
super(scope, id);
|
|
36
|
-
// Override scope
|
|
37
|
-
// note: this is intended to be used internally by SST to make constructs
|
|
38
|
-
// backwards compatible when the hirechical structure of the constructs
|
|
39
|
-
// changes. When the hirerchical structure changes, the child AWS
|
|
40
|
-
// resources' logical ID will change. And CloudFormation will recreate
|
|
41
|
-
// them.
|
|
42
|
-
this.scope = props.scopeOverride || this;
|
|
43
|
-
this.props = {
|
|
44
|
-
...props,
|
|
45
|
-
environment: props.environment || {},
|
|
46
|
-
permissions: props.permissions || [],
|
|
47
|
-
};
|
|
48
|
-
// Bind first b/e function's environment variables cannot be added after
|
|
49
|
-
this.bindingEnvs = {};
|
|
50
|
-
this.bind(props.bind || []);
|
|
51
|
-
// Create function with placeholder code
|
|
52
|
-
const assetBucket = "placeholder";
|
|
53
|
-
const assetKey = "placeholder";
|
|
54
|
-
const handlerFilename = "placeholder";
|
|
55
|
-
const { assetReplacer, assetReplacerPolicy } = this.createCodeReplacer(assetBucket, assetKey, handlerFilename);
|
|
56
|
-
this.role = this.createRole();
|
|
57
|
-
const lambdaBucket = this.createSingletonBucketInUsEast1();
|
|
58
|
-
const { fn, fnArn } = this.createFunctionInUsEast1(assetBucket, assetKey, lambdaBucket);
|
|
59
|
-
const { versionId } = this.createVersionInUsEast1(fn, fnArn);
|
|
60
|
-
fn.node.addDependency(assetReplacer);
|
|
61
|
-
this.function = CdkFunction.fromFunctionAttributes(this.scope, "ICdkFunction", {
|
|
62
|
-
functionArn: fnArn,
|
|
63
|
-
role: this.role,
|
|
64
|
-
});
|
|
65
|
-
this.functionCR = fn;
|
|
66
|
-
this.functionArn = fnArn;
|
|
67
|
-
this.currentVersion = Version.fromVersionArn(this, `${id}FunctionVersion`, `${fnArn}:${versionId}`);
|
|
68
|
-
this.assetReplacer = assetReplacer;
|
|
69
|
-
this.assetReplacerPolicy = assetReplacerPolicy;
|
|
70
|
-
}
|
|
71
|
-
async build() {
|
|
72
|
-
const { bundle, handler } = this.props;
|
|
73
|
-
const { asset, handlerFilename } = bundle
|
|
74
|
-
? await this.buildAssetFromBundle(bundle, handler)
|
|
75
|
-
: await this.buildAssetFromHandler();
|
|
76
|
-
this.updateCodeReplacer(asset.s3BucketName, asset.s3ObjectKey, handlerFilename);
|
|
77
|
-
this.updateFunctionInUsEast1(asset.s3BucketName, asset.s3ObjectKey);
|
|
78
|
-
}
|
|
79
|
-
attachPermissions(permissions) {
|
|
80
|
-
attachPermissionsToRole(this.role, permissions);
|
|
81
|
-
}
|
|
82
|
-
addEnvironment(key, value) {
|
|
83
|
-
// Note: addEnvironment currently only updates AssetReplacer's
|
|
84
|
-
// "_SST_FUNCTION_ENVIRONMENT_" replacements
|
|
85
|
-
this.props.environment[key] = value;
|
|
86
|
-
const cfnReplacer = this.assetReplacer.node
|
|
87
|
-
.defaultChild;
|
|
88
|
-
cfnReplacer.addPropertyOverride("replacements.0.replace", JSON.stringify({
|
|
89
|
-
...this.props.environment,
|
|
90
|
-
...this.bindingEnvs,
|
|
91
|
-
}));
|
|
92
|
-
}
|
|
93
|
-
async buildAssetFromHandler() {
|
|
94
|
-
const { nodejs } = this.props;
|
|
95
|
-
useFunctions().add(this.node.addr, {
|
|
96
|
-
...this.props,
|
|
97
|
-
nodejs: {
|
|
98
|
-
...nodejs,
|
|
99
|
-
banner: [
|
|
100
|
-
`process.env = { ...process.env, ..."{{ _SST_FUNCTION_ENVIRONMENT_ }}" };`,
|
|
101
|
-
nodejs?.banner || "",
|
|
102
|
-
].join("\n"),
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
// Build function
|
|
106
|
-
const bundle = await useRuntimeHandlers().build(this.node.addr, "deploy");
|
|
107
|
-
// create wrapper that calls the handler
|
|
108
|
-
if (bundle.type === "error")
|
|
109
|
-
throw new Error([
|
|
110
|
-
`There was a problem bundling the SSR function for the "${this.scope.node.id}" Site.`,
|
|
111
|
-
...bundle.errors,
|
|
112
|
-
].join("\n"));
|
|
113
|
-
const asset = new Asset(this.scope, `FunctionAsset`, {
|
|
114
|
-
path: bundle.out,
|
|
115
|
-
});
|
|
116
|
-
// Get handler filename
|
|
117
|
-
const isESM = (nodejs?.format || "esm") === "esm";
|
|
118
|
-
const parsed = path.parse(bundle.handler);
|
|
119
|
-
const handlerFilename = `${parsed.dir}/${parsed.name}${isESM ? ".mjs" : ".cjs"}`;
|
|
120
|
-
return { asset, handlerFilename };
|
|
121
|
-
}
|
|
122
|
-
async buildAssetFromBundle(bundle, handler) {
|
|
123
|
-
// We expose an environment variable token which is used by the code
|
|
124
|
-
// replacer to inject the environment variables assigned to the
|
|
125
|
-
// EdgeFunction construct.
|
|
126
|
-
//
|
|
127
|
-
// "{{ _SST_FUNCTION_ENVIRONMENT_ }}" will get replaced during
|
|
128
|
-
// deployment with an object of environment key-value pairs, ie.
|
|
129
|
-
// const environment = {"API_URL": "https://api.example.com"};
|
|
130
|
-
//
|
|
131
|
-
// This inlining strategy is required as Lambda@Edge doesn't natively
|
|
132
|
-
// support runtime environment variables. A downside of this approach
|
|
133
|
-
// is that environment variables cannot be toggled after deployment,
|
|
134
|
-
// each change to one requires a redeployment.
|
|
135
|
-
const { dir: inputPath, name: inputFilename, ext: inputHandlerFunction, } = path.parse(handler);
|
|
136
|
-
const inputFileExt = this.getHandlerExtension(path.join(bundle, inputPath, inputFilename));
|
|
137
|
-
const handlerFilename = handler.replace(inputHandlerFunction, inputFileExt);
|
|
138
|
-
const filePath = path.join(bundle, handlerFilename);
|
|
139
|
-
const fileData = fs.readFileSync(filePath, "utf8");
|
|
140
|
-
fs.writeFileSync(filePath, `process.env = { ...process.env, ..."{{ _SST_FUNCTION_ENVIRONMENT_ }}" };\n${fileData}`);
|
|
141
|
-
// Note: cannot point the bundle to the `.open-next/server-function`
|
|
142
|
-
// b/c the folder contains node_modules. And pnpm node_modules
|
|
143
|
-
// contains symlinks. CDK cannot zip symlinks correctly.
|
|
144
|
-
// https://github.com/aws/aws-cdk/issues/9251
|
|
145
|
-
// We will zip the folder ourselves.
|
|
146
|
-
const outputPath = path.resolve(useProject().paths.artifacts, `SsrFunction-${this.node.id}-${this.node.addr}`);
|
|
147
|
-
const script = path.resolve(__dirname, "../support/ssr-site-function-archiver.mjs");
|
|
148
|
-
const result = spawn.sync("node", [script, path.join(bundle), path.join(outputPath, "server-function.zip")], { stdio: "inherit" });
|
|
149
|
-
if (result.status !== 0) {
|
|
150
|
-
throw new Error(`There was a problem generating the assets package.`);
|
|
151
|
-
}
|
|
152
|
-
// Create asset
|
|
153
|
-
const asset = new Asset(this.scope, `FunctionAsset`, {
|
|
154
|
-
path: path.join(outputPath, "server-function.zip"),
|
|
155
|
-
});
|
|
156
|
-
return { handlerFilename, asset };
|
|
157
|
-
}
|
|
158
|
-
bind(constructs) {
|
|
159
|
-
const app = this.node.root;
|
|
160
|
-
this.bindingEnvs = {
|
|
161
|
-
SST_APP: app.name,
|
|
162
|
-
SST_STAGE: app.stage,
|
|
163
|
-
SST_REGION: app.region,
|
|
164
|
-
SST_SSM_PREFIX: useProject().config.ssmPrefix,
|
|
165
|
-
};
|
|
166
|
-
// Get referenced secrets
|
|
167
|
-
const referencedSecrets = [];
|
|
168
|
-
constructs.forEach((c) => referencedSecrets.push(...getReferencedSecrets(c)));
|
|
169
|
-
[...constructs, ...referencedSecrets].forEach((c) => {
|
|
170
|
-
// Bind environment
|
|
171
|
-
this.bindingEnvs = {
|
|
172
|
-
...this.bindingEnvs,
|
|
173
|
-
...bindEnvironment(c),
|
|
174
|
-
};
|
|
175
|
-
// Bind permissions
|
|
176
|
-
if (this.props.permissions !== "*") {
|
|
177
|
-
this.props.permissions.push(...Object.entries(bindPermissions(c)).map(([action, resources]) => new PolicyStatement({
|
|
178
|
-
actions: [action],
|
|
179
|
-
effect: Effect.ALLOW,
|
|
180
|
-
resources,
|
|
181
|
-
})));
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
createCodeReplacer(assetBucket, assetKey, handlerFilename) {
|
|
186
|
-
const { environment } = this.props;
|
|
187
|
-
const stack = Stack.of(this);
|
|
188
|
-
// Note: Source code for the Lambda functions have "{{ ENV_KEY }}" in them.
|
|
189
|
-
// They need to be replaced with real values before the Lambda
|
|
190
|
-
// functions get deployed.
|
|
191
|
-
const replacements = [
|
|
192
|
-
{
|
|
193
|
-
files: handlerFilename,
|
|
194
|
-
search: '"{{ _SST_FUNCTION_ENVIRONMENT_ }}"',
|
|
195
|
-
replace: JSON.stringify({
|
|
196
|
-
...environment,
|
|
197
|
-
...this.bindingEnvs,
|
|
198
|
-
}),
|
|
199
|
-
},
|
|
200
|
-
...Object.entries(environment).map(([key, value]) => ({
|
|
201
|
-
files: "**/*.@(*js|json|html)",
|
|
202
|
-
search: `{{ ${key} }}`,
|
|
203
|
-
replace: value,
|
|
204
|
-
})),
|
|
205
|
-
];
|
|
206
|
-
const policy = new Policy(this, "AssetReplacerPolicy", {
|
|
207
|
-
statements: [
|
|
208
|
-
new PolicyStatement({
|
|
209
|
-
effect: Effect.ALLOW,
|
|
210
|
-
actions: ["s3:GetObject", "s3:PutObject"],
|
|
211
|
-
resources: [`arn:${stack.partition}:s3:::${assetBucket}/*`],
|
|
212
|
-
}),
|
|
213
|
-
],
|
|
214
|
-
});
|
|
215
|
-
stack.customResourceHandler.role?.attachInlinePolicy(policy);
|
|
216
|
-
const resource = new CustomResource(this.scope, "AssetReplacer", {
|
|
217
|
-
serviceToken: stack.customResourceHandler.functionArn,
|
|
218
|
-
resourceType: "Custom::AssetReplacer",
|
|
219
|
-
properties: {
|
|
220
|
-
bucket: assetBucket,
|
|
221
|
-
key: assetKey,
|
|
222
|
-
replacements,
|
|
223
|
-
},
|
|
224
|
-
});
|
|
225
|
-
resource.node.addDependency(policy);
|
|
226
|
-
return { assetReplacer: resource, assetReplacerPolicy: policy };
|
|
227
|
-
}
|
|
228
|
-
updateCodeReplacer(assetBucket, assetKey, handlerFilename) {
|
|
229
|
-
const stack = Stack.of(this);
|
|
230
|
-
const cfnReplacer = this.assetReplacer.node
|
|
231
|
-
.defaultChild;
|
|
232
|
-
cfnReplacer.addPropertyOverride("bucket", assetBucket);
|
|
233
|
-
cfnReplacer.addPropertyOverride("key", assetKey);
|
|
234
|
-
cfnReplacer.addPropertyOverride("replacements.0.files", handlerFilename);
|
|
235
|
-
const cfnPolicy = this.assetReplacerPolicy.node.defaultChild;
|
|
236
|
-
cfnPolicy.addPropertyOverride("PolicyDocument.Statement.0.Resource", `arn:${stack.partition}:s3:::${assetBucket}/*`);
|
|
237
|
-
}
|
|
238
|
-
createRole() {
|
|
239
|
-
const { permissions } = this.props;
|
|
240
|
-
// Create function role
|
|
241
|
-
const role = new Role(this.scope, `ServerLambdaRole`, {
|
|
242
|
-
assumedBy: new CompositePrincipal(new ServicePrincipal("lambda.amazonaws.com"), new ServicePrincipal("edgelambda.amazonaws.com")),
|
|
243
|
-
managedPolicies: [
|
|
244
|
-
ManagedPolicy.fromManagedPolicyArn(this, "EdgeLambdaPolicy", `arn:${Stack.of(this).partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole`),
|
|
245
|
-
],
|
|
246
|
-
});
|
|
247
|
-
// Attach permission
|
|
248
|
-
if (permissions) {
|
|
249
|
-
attachPermissionsToRole(role, permissions);
|
|
250
|
-
}
|
|
251
|
-
return role;
|
|
252
|
-
}
|
|
253
|
-
createSingletonBucketInUsEast1() {
|
|
254
|
-
// Create a S3 bucket in us-east-1 to store Lambda code. Create
|
|
255
|
-
// 1 bucket for all Edge functions.
|
|
256
|
-
// Do not recreate if exist
|
|
257
|
-
const providerId = "EdgeLambdaBucketProvider";
|
|
258
|
-
const resId = "EdgeLambdaBucket";
|
|
259
|
-
const stack = Stack.of(this);
|
|
260
|
-
const existingResource = stack.node.tryFindChild(resId);
|
|
261
|
-
if (existingResource) {
|
|
262
|
-
return existingResource;
|
|
263
|
-
}
|
|
264
|
-
// Create provider
|
|
265
|
-
const provider = new CdkFunction(stack, providerId, {
|
|
266
|
-
code: Code.fromAsset(path.join(__dirname, "../support/edge-function")),
|
|
267
|
-
handler: "s3-bucket.handler",
|
|
268
|
-
runtime: Runtime.NODEJS_16_X,
|
|
269
|
-
timeout: CdkDuration.minutes(15),
|
|
270
|
-
memorySize: 1024,
|
|
271
|
-
initialPolicy: [
|
|
272
|
-
new PolicyStatement({
|
|
273
|
-
effect: Effect.ALLOW,
|
|
274
|
-
actions: ["s3:*"],
|
|
275
|
-
resources: ["*"],
|
|
276
|
-
}),
|
|
277
|
-
],
|
|
278
|
-
});
|
|
279
|
-
// Create custom resource
|
|
280
|
-
const resource = new CustomResource(stack, resId, {
|
|
281
|
-
serviceToken: provider.functionArn,
|
|
282
|
-
resourceType: "Custom::SSTEdgeLambdaBucket",
|
|
283
|
-
properties: {
|
|
284
|
-
BucketNamePrefix: `${stack.stackName}-${resId}`,
|
|
285
|
-
},
|
|
286
|
-
});
|
|
287
|
-
return resource;
|
|
288
|
-
}
|
|
289
|
-
createFunctionInUsEast1(assetBucket, assetKey, lambdaBucket) {
|
|
290
|
-
const { handler, runtime, timeout, memorySize } = this.props;
|
|
291
|
-
// Do not recreate if exist
|
|
292
|
-
const providerId = "EdgeLambdaProvider";
|
|
293
|
-
const resId = `${this.node.id}EdgeLambda`;
|
|
294
|
-
const stack = Stack.of(this);
|
|
295
|
-
let provider = stack.node.tryFindChild(providerId);
|
|
296
|
-
// Create provider if not already created
|
|
297
|
-
if (!provider) {
|
|
298
|
-
provider = new CdkFunction(stack, providerId, {
|
|
299
|
-
code: Code.fromAsset(path.join(__dirname, "../support/edge-function")),
|
|
300
|
-
handler: "edge-lambda.handler",
|
|
301
|
-
runtime: Runtime.NODEJS_16_X,
|
|
302
|
-
timeout: CdkDuration.minutes(15),
|
|
303
|
-
memorySize: 1024,
|
|
304
|
-
initialPolicy: [
|
|
305
|
-
new PolicyStatement({
|
|
306
|
-
effect: Effect.ALLOW,
|
|
307
|
-
actions: ["lambda:*", "s3:*"],
|
|
308
|
-
resources: ["*"],
|
|
309
|
-
}),
|
|
310
|
-
],
|
|
311
|
-
});
|
|
312
|
-
if (provider.role) {
|
|
313
|
-
this.role.grantPassRole(provider.role);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
// Create custom resource
|
|
317
|
-
const fn = new CustomResource(this.scope, resId, {
|
|
318
|
-
serviceToken: provider.functionArn,
|
|
319
|
-
resourceType: "Custom::SSTEdgeLambda",
|
|
320
|
-
properties: {
|
|
321
|
-
FunctionNamePrefix: `${Stack.of(this).stackName}-${resId}`,
|
|
322
|
-
FunctionBucket: lambdaBucket.getAttString("BucketName"),
|
|
323
|
-
FunctionParams: {
|
|
324
|
-
Description: `${this.node.id} handler`,
|
|
325
|
-
Handler: handler,
|
|
326
|
-
Code: {
|
|
327
|
-
S3Bucket: assetBucket,
|
|
328
|
-
S3Key: assetKey,
|
|
329
|
-
},
|
|
330
|
-
Runtime: runtime === "nodejs14.x"
|
|
331
|
-
? Runtime.NODEJS_14_X.name
|
|
332
|
-
: runtime === "nodejs16.x"
|
|
333
|
-
? Runtime.NODEJS_16_X.name
|
|
334
|
-
: Runtime.NODEJS_18_X.name,
|
|
335
|
-
MemorySize: typeof memorySize === "string"
|
|
336
|
-
? toCdkSize(memorySize).toMebibytes()
|
|
337
|
-
: memorySize,
|
|
338
|
-
Timeout: typeof timeout === "string"
|
|
339
|
-
? toCdkDuration(timeout).toSeconds()
|
|
340
|
-
: timeout,
|
|
341
|
-
Role: this.role.roleArn,
|
|
342
|
-
},
|
|
343
|
-
},
|
|
344
|
-
});
|
|
345
|
-
return { fn, fnArn: fn.getAttString("FunctionArn") };
|
|
346
|
-
}
|
|
347
|
-
updateFunctionInUsEast1(assetBucket, assetKey) {
|
|
348
|
-
const cfnLambda = this.functionCR.node.defaultChild;
|
|
349
|
-
cfnLambda.addPropertyOverride("FunctionParams.Code", {
|
|
350
|
-
S3Bucket: assetBucket,
|
|
351
|
-
S3Key: assetKey,
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
createVersionInUsEast1(fn, fnArn) {
|
|
355
|
-
// Do not recreate if exist
|
|
356
|
-
const providerId = "EdgeLambdaVersionProvider";
|
|
357
|
-
const resId = `${this.node.id}EdgeLambdaVersion`;
|
|
358
|
-
const stack = Stack.of(this);
|
|
359
|
-
let provider = stack.node.tryFindChild(providerId);
|
|
360
|
-
// Create provider if not already created
|
|
361
|
-
if (!provider) {
|
|
362
|
-
provider = new CdkFunction(stack, providerId, {
|
|
363
|
-
code: Code.fromAsset(path.join(__dirname, "../support/edge-function")),
|
|
364
|
-
handler: "edge-lambda-version.handler",
|
|
365
|
-
runtime: Runtime.NODEJS_16_X,
|
|
366
|
-
timeout: CdkDuration.minutes(15),
|
|
367
|
-
memorySize: 1024,
|
|
368
|
-
initialPolicy: [
|
|
369
|
-
new PolicyStatement({
|
|
370
|
-
effect: Effect.ALLOW,
|
|
371
|
-
actions: ["lambda:*"],
|
|
372
|
-
resources: ["*"],
|
|
373
|
-
}),
|
|
374
|
-
],
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
// Create custom resource
|
|
378
|
-
const version = new CustomResource(this.scope, resId, {
|
|
379
|
-
serviceToken: provider.functionArn,
|
|
380
|
-
resourceType: "Custom::SSTEdgeLambdaVersion",
|
|
381
|
-
properties: {
|
|
382
|
-
FunctionArn: fnArn,
|
|
383
|
-
},
|
|
384
|
-
});
|
|
385
|
-
// Override the version's logical ID with a lazy string which includes the
|
|
386
|
-
// hash of the function itself, so a new version resource is created when
|
|
387
|
-
// the function configuration changes.
|
|
388
|
-
const cfn = version.node.defaultChild;
|
|
389
|
-
const originalLogicalId = Stack.of(version).resolve(cfn.logicalId);
|
|
390
|
-
cfn.overrideLogicalId(Lazy.uncachedString({
|
|
391
|
-
produce: () => {
|
|
392
|
-
const hash = this.calculateHash(fn);
|
|
393
|
-
const logicalId = this.trimFromStart(originalLogicalId, 255 - 32);
|
|
394
|
-
return `${logicalId}${hash}`;
|
|
395
|
-
},
|
|
396
|
-
}));
|
|
397
|
-
return { version, versionId: version.getAttString("Version") };
|
|
398
|
-
}
|
|
399
|
-
getHandlerExtension(pathWithoutExtension) {
|
|
400
|
-
const ext = [
|
|
401
|
-
".ts",
|
|
402
|
-
".tsx",
|
|
403
|
-
".mts",
|
|
404
|
-
".cts",
|
|
405
|
-
".js",
|
|
406
|
-
".jsx",
|
|
407
|
-
".mjs",
|
|
408
|
-
".cjs",
|
|
409
|
-
].find((ext) => fs.existsSync(pathWithoutExtension + ext));
|
|
410
|
-
if (!ext) {
|
|
411
|
-
throw new Error(`Cannot find the SSR function handler file for the "${this.scope.node.id}" Site.`);
|
|
412
|
-
}
|
|
413
|
-
return ext;
|
|
414
|
-
}
|
|
415
|
-
trimFromStart(s, maxLength) {
|
|
416
|
-
const desiredLength = Math.min(maxLength, s.length);
|
|
417
|
-
const newStart = s.length - desiredLength;
|
|
418
|
-
return s.substring(newStart);
|
|
419
|
-
}
|
|
420
|
-
calculateHash(resource) {
|
|
421
|
-
// render the cloudformation resource from this function
|
|
422
|
-
// config is of the shape:
|
|
423
|
-
// {
|
|
424
|
-
// Resources: {
|
|
425
|
-
// LogicalId: {
|
|
426
|
-
// Type: 'Function',
|
|
427
|
-
// Properties: { ... }
|
|
428
|
-
// }}}
|
|
429
|
-
const cfnResource = resource.node.defaultChild;
|
|
430
|
-
const config = Stack.of(resource).resolve(cfnResource._toCloudFormation());
|
|
431
|
-
const resources = config.Resources;
|
|
432
|
-
const resourceKeys = Object.keys(resources);
|
|
433
|
-
if (resourceKeys.length !== 1) {
|
|
434
|
-
throw new Error(`Expected one rendered CloudFormation resource but found ${resourceKeys.length}`);
|
|
435
|
-
}
|
|
436
|
-
const logicalId = resourceKeys[0];
|
|
437
|
-
const properties = resources[logicalId].Properties.FunctionParams;
|
|
438
|
-
const hash = crypto.createHash("md5");
|
|
439
|
-
hash.update(JSON.stringify(properties));
|
|
440
|
-
return hash.digest("hex");
|
|
441
|
-
}
|
|
442
|
-
}
|