From ad0facb5769fccf26ca46894ef4265e260820a65 Mon Sep 17 00:00:00 2001 From: Anders Karlsen Date: Mon, 22 Sep 2025 21:40:00 +0200 Subject: [PATCH 01/18] Dockerfile created --- .dockerignore | 2 -- Dockerfile | 32 +++++++++++++++++--------------- docker-compose.yaml | 21 --------------------- 3 files changed, 17 insertions(+), 38 deletions(-) delete mode 100644 .dockerignore delete mode 100644 docker-compose.yaml diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 70fd7ba..0000000 --- a/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!target/*-with-dependencies.jar \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7e4179d..f9a1869 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,18 @@ -# Fetch the application jar from the target directory and rename it to application.jar -FROM amazoncorretto:21-al2023-headless AS fetch +# Build: docker build -t moresleep-app:latest . +# Run: docker run --name moresleep-container -p 8082:8082 moresleep-app:latest +# Check localhost:8082 and you should get a homepage +# Stage 1: Build the application +FROM maven:3.9.6-eclipse-temurin-21 AS build +WORKDIR /app +COPY pom.xml . +COPY src ./src +RUN mvn clean package -Dmaven.test.skip=true -COPY target /target -RUN mv /target/*-with-dependencies.jar /target/application.jar - - -# Actual image to run the application -FROM amazoncorretto:21-al2023-headless - -EXPOSE 8082 -ENV RUN_FROM_JAR=true - -COPY --from=fetch /target/application.jar /work/application.jar - -CMD ["java", "-jar", "/work/application.jar"] \ No newline at end of file +# Stage 2: Create the final runtime image +FROM eclipse-temurin:21-jre-jammy AS final +ENV DO_FLYWAY_MIGRATION false +ENV RUN_FROM_JAR true +WORKDIR /app +COPY --from=build /app/target/moresleep-0.0.1-jar-with-dependencies.jar app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 64a1a6c..0000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: moresleep - -services: - db: - build: docker/postgres - ports: - - "5432:5432" - volumes: - - .postgres_data:/var/lib/postgresql/data - - service: - build: . - ports: - - "8082:8082" - volumes: - - ./:/src - environment: - - DBHOST=db - env_file: - - path: ./.env - required: false \ No newline at end of file From 2676f7ae3e7f16cd12b2f8046a7eb670bb2057be Mon Sep 17 00:00:00 2001 From: Anders Karlsen Date: Wed, 24 Sep 2025 19:54:19 +0200 Subject: [PATCH 02/18] Sops config file --- conf/.enc.prod.properties | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 conf/.enc.prod.properties diff --git a/conf/.enc.prod.properties b/conf/.enc.prod.properties new file mode 100644 index 0000000..537b165 --- /dev/null +++ b/conf/.enc.prod.properties @@ -0,0 +1,17 @@ +{ + "data": "ENC[AES256_GCM,data:lt45vaNBkrYd+dyheaOqknraxv2NDScmoLS2VU/5RP/rIkq52JHd+2tUoHXMgjpE4NoaAD6I1ERtpkdLhdkphcvH3gN4c8ixXPaZrNIqwJCasMF2GEoKiqfOFgc+VketMJFzAzk7ZLDGE98X7um0nb+202UUeUu8SUVR9AML9PNY98Y2TmaoaD8bB+sUjWUVSBA0lWwIQqYqsLOlb0NB9HItJEK41qln3P6Vc/88VupPT8oDHPg2deeGSAUqo4vQNypfW7P5MqcKQhRebSNvj0+EKWEJrnChoPrhBxFY0I3Lu1uRJ+892eT1lhOlugHs6T/Q98pLZphUc/RmRLvS2jLfVMYWZCUmSj47cH/tKXiE7+LsSth+h+09wkyPsTTmKIWpgESwd6DZKPZw+xUuSbnnDGoWvLWIicciiggghzh19Js5P/c9MM40V7URiTY+iAEUkLbjOcvgB83L2PP8qqyZRhPGV7s7KXzzzwXYcKlhHGQqLRqTFIO8pBPLYwKPTv+35MZUnZ/HMl6C88TC6hSM1qMSag549Kba7qCElvANZpl90KyipGnn0eN1,iv:gvvtIDtYbiag18Uio5ZecuLTtZj0WMFrGV6dYhQOr6M=,tag:ktFwPtFnxTuBwTAZ6WQ/oQ==,type:str]", + "sops": { + "kms": [ + { + "arn": "arn:aws:kms:eu-central-1:553637109631:key/a6a46dc7-d14e-4638-b3bb-b919aa251296", + "created_at": "2025-09-24T17:53:14Z", + "enc": "AQICAHgZkjtcSytIpxYRtaElneeEBKhzfRCADUc3yHgqWJe8kwGXMYKWkYVj9oKLL1+lUyAEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhd14zekznZeGR0LtAgEQgDvWyM0lHKTgON9y6HRgqrplonB55zdYVjK+S1lT2FcbQA5tAioL+xABdnBQVtdvoklthUDdSMKIvakmyw==", + "aws_profile": "javabin" + } + ], + "lastmodified": "2025-09-24T17:53:14Z", + "mac": "ENC[AES256_GCM,data:hRBbb+vsEzg+KcTeMQtDgXa6XHIQrTx+tE3hnVnq7c2CUctUwc650I/R7+ljq+QoDYEjtmbEEYO5hEw2Atf8426a4v6FeC6nV9HqUgipT6dlNEDeFx/mzSVP2G5h89sNx0p3Il+mSSirPbt0JDawMGJ/6KGHr4pBgh8bgDZd7P0=,iv:XpohWAqesyr3DlSR5IOD9jkD5/Jo5ChMa57jJcpLPwI=,tag:V6c6teQ34DcQd3dkl/sF9Q==,type:str]", + "unencrypted_suffix": "_unencrypted", + "version": "3.10.2" + } +} From f177f1cb066183a050f3f43efeec890bed8a02b8 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Wed, 24 Sep 2025 21:15:48 +0200 Subject: [PATCH 03/18] Update Dockerfile and add .enc.env for environment variables; create run-local.sh for local setup --- Dockerfile | 31 +++++++++++++++++++++++++------ conf/.enc.env | 19 +++++++++++++++++++ conf/.enc.prod.properties | 17 ----------------- run-local.sh | 10 ++++++++++ 4 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 conf/.enc.env delete mode 100644 conf/.enc.prod.properties create mode 100755 run-local.sh diff --git a/Dockerfile b/Dockerfile index f9a1869..764dc5b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # Build: docker build -t moresleep-app:latest . -# Run: docker run --name moresleep-container -p 8082:8082 moresleep-app:latest -# Check localhost:8082 and you should get a homepage +# Run: docker run --name moresleep-container -p 5000:5000 moresleep-app:latest +# Check localhost:5000 and you should get a homepage # Stage 1: Build the application FROM maven:3.9.6-eclipse-temurin-21 AS build WORKDIR /app @@ -10,9 +10,28 @@ RUN mvn clean package -Dmaven.test.skip=true # Stage 2: Create the final runtime image FROM eclipse-temurin:21-jre-jammy AS final -ENV DO_FLYWAY_MIGRATION false -ENV RUN_FROM_JAR true + +# Install SOPS +RUN curl -L -o /usr/local/bin/sops https://github.com/getsops/sops/releases/download/v3.10.2/sops-v3.10.2.linux.amd64 && \ + chmod +x /usr/local/bin/sops + + # Install unzip and curl +RUN apt-get update && \ + apt-get install -y curl unzip && \ + rm -rf /var/lib/apt/lists/* + + # Install AWS CLI v2 +RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "/tmp/awscliv2.zip" && \ + unzip /tmp/awscliv2.zip -d /tmp && \ + /tmp/aws/install && \ + rm -rf /tmp/aws /tmp/awscliv2.zip + +# Set environment variables +ENV DO_FLYWAY_MIGRATION=false +ENV RUN_FROM_JAR=true + WORKDIR /app COPY --from=build /app/target/moresleep-0.0.1-jar-with-dependencies.jar app.jar -EXPOSE 8080 -ENTRYPOINT ["java", "-jar", "app.jar"] \ No newline at end of file +COPY ./conf/.enc.env /app/.enc.env +EXPOSE 5000 +ENTRYPOINT ["sops", "exec-env", ".enc.env", "java -jar app.jar"] \ No newline at end of file diff --git a/conf/.enc.env b/conf/.enc.env new file mode 100644 index 0000000..4c75f5e --- /dev/null +++ b/conf/.enc.env @@ -0,0 +1,19 @@ +SERVER_PORT=ENC[AES256_GCM,data:5U1OsA==,iv:7QLr31rKdOFoHy6rK9/odu9RdPds2643khe19y23E88=,tag:2t9K4XpzBdJCt297QkHXIw==,type:str] +SLEEPINGPILL_AUTH=ENC[AES256_GCM,data:BrCFHXjpwrbESZq4Gm9k1Vhm2ISq,iv:qmiu64aboMpK2CL39EaD1a0TO701f9p+cOvlyXWq0dY=,tag:JYYjCyXs3tImbS9QfT6ZGQ==,type:str] +LOAD_FROM_SLEEPINGPILL=ENC[AES256_GCM,data:zRTp9Q==,iv:NKk3JpeUWaTizjGFr7QkWu+5I4C5aMzB8zgx7yWeA2s=,tag:gdFTsP/bF2UE54gWMJ33AA==,type:str] +ALLACCESS_USER=ENC[AES256_GCM,data:S/urGpLDdw2UdRB118dqqWAi/6AHtqPljCEsBsUE+gHLte4V5WcSy7TBwcHAA/lAfS7ZmoSMviCcKPxzZqkCwtd1EueOdY8Iv/VPoquDMz7dTxqgi8rpXssPoVarQP0RHfrOPmssxNuQHhyjIdFs1i+TISPikGp+Qg==,iv:IwV7xgNGP16E+ZtpwMuKSVs7dNe+OMKG08qhMf17N6Q=,tag:EL6j+U8foj+pglOEdPY0BA==,type:str] +READ_USER=ENC[AES256_GCM,data:GRTJT/8jt8usKdtmP24PBjTijk0=,iv:9WmSOd5eLzyVDNt+c37TQO60Q9BoDpU4yP/pLXEL0GY=,tag:yC5YAbtO68XefleZ1uQ9Qg==,type:str] +ALL_OPEN_MODE=ENC[AES256_GCM,data:MTgX49s=,iv:vGWm/5PEQvAUggxWjj6cQgqQvX8Pc7rLhSrmVLsZbzo=,tag:rI48QhbWqhpgT6xdkK3LgA==,type:str] +RUN_FROM_JAR=ENC[AES256_GCM,data:SqCEZQ==,iv:2KJxysffyv9RwXLz5+x16cJsQCgqf78eUPHxas+QyPs=,tag:7iJqV+tJPmc/VHJtBTUkSA==,type:str] +DBHOST=ENC[AES256_GCM,data:X2+3ZjWFpzVjpwM89dylxGY3ghEs0sC5xnMsO5XARZKm/Fgp968M8uFS6OW6xZKLBNkOFTW56A==,iv:bG7bwQKKEfggQnz7OIJU9DwYHQ4dQSkcq4qhraRB2eA=,tag:BtK4thQGadV37FelOsN9UA==,type:str] +DATASOURCENAME=ENC[AES256_GCM,data:WrhgONaD0ls=,iv:7WyH7kfIB/Vcn0liW6TqZPJPda8kCxQc9Ivfs7JYtvg=,tag:rX2jGkdTF8BpgLlWJVUb4Q==,type:str] +DBUSER=ENC[AES256_GCM,data:gqGPlE5Iwb140gqlQGOW,iv:TQWGxaGO8kc6clkKWs0Dq1/Hfy4+HB4sLx8cwyn6pu8=,tag:XtJtwrvhHsxbVB4HGBuCOw==,type:str] +DBPASSWORD=ENC[AES256_GCM,data:+gaOPwefvdkwD26ye9HE,iv:mJBAQ8+uvN2MiHgL6tz/Pz6gSFI/S4a4HFWZYRrClgc=,tag:UfOr9pUSmdVuSj2pYW3fJw==,type:str] +sops_kms__list_0__map_arn=arn:aws:kms:eu-central-1:553637109631:key/a6a46dc7-d14e-4638-b3bb-b919aa251296 +sops_kms__list_0__map_aws_profile=javabin +sops_kms__list_0__map_created_at=2025-09-24T18:57:15Z +sops_kms__list_0__map_enc=AQICAHgZkjtcSytIpxYRtaElneeEBKhzfRCADUc3yHgqWJe8kwHXMCZMmGHTcb2ebix25032AAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMMMtKF0C7o1QNNLJ+AgEQgDsLHrFj4QWYl+/wemNfLHoBr0FppJ4UAf3ROYxnIVhe6kVAQXRjD88W8VmBidn4utGKtcNAets5LnsmhA== +sops_lastmodified=2025-09-24T18:57:15Z +sops_mac=ENC[AES256_GCM,data:SBpUFxsTfabQFH9ca7NlLGSSJlDDsKJYeghBfFLWoLlZydkQ43p330Tq4/COknx+1BZN1zhNVbdMx3ynh0+/Z8k5hqSegsMwY5MRGYG8mvJSh6x686jBXfRI1GZ4WnLJjDXGOFT27ijszD18sP7IOhCpaF0385LgHCgSNkym9w0=,iv:qKnsXG5qwc8KJ3p5NLsIJIn4d4jgCtO0n0r3trfHV5o=,tag:9v9vj1R/xRSwnvdlGR6CIg==,type:str] +sops_unencrypted_suffix=_unencrypted +sops_version=3.10.2 diff --git a/conf/.enc.prod.properties b/conf/.enc.prod.properties deleted file mode 100644 index 537b165..0000000 --- a/conf/.enc.prod.properties +++ /dev/null @@ -1,17 +0,0 @@ -{ - "data": "ENC[AES256_GCM,data:lt45vaNBkrYd+dyheaOqknraxv2NDScmoLS2VU/5RP/rIkq52JHd+2tUoHXMgjpE4NoaAD6I1ERtpkdLhdkphcvH3gN4c8ixXPaZrNIqwJCasMF2GEoKiqfOFgc+VketMJFzAzk7ZLDGE98X7um0nb+202UUeUu8SUVR9AML9PNY98Y2TmaoaD8bB+sUjWUVSBA0lWwIQqYqsLOlb0NB9HItJEK41qln3P6Vc/88VupPT8oDHPg2deeGSAUqo4vQNypfW7P5MqcKQhRebSNvj0+EKWEJrnChoPrhBxFY0I3Lu1uRJ+892eT1lhOlugHs6T/Q98pLZphUc/RmRLvS2jLfVMYWZCUmSj47cH/tKXiE7+LsSth+h+09wkyPsTTmKIWpgESwd6DZKPZw+xUuSbnnDGoWvLWIicciiggghzh19Js5P/c9MM40V7URiTY+iAEUkLbjOcvgB83L2PP8qqyZRhPGV7s7KXzzzwXYcKlhHGQqLRqTFIO8pBPLYwKPTv+35MZUnZ/HMl6C88TC6hSM1qMSag549Kba7qCElvANZpl90KyipGnn0eN1,iv:gvvtIDtYbiag18Uio5ZecuLTtZj0WMFrGV6dYhQOr6M=,tag:ktFwPtFnxTuBwTAZ6WQ/oQ==,type:str]", - "sops": { - "kms": [ - { - "arn": "arn:aws:kms:eu-central-1:553637109631:key/a6a46dc7-d14e-4638-b3bb-b919aa251296", - "created_at": "2025-09-24T17:53:14Z", - "enc": "AQICAHgZkjtcSytIpxYRtaElneeEBKhzfRCADUc3yHgqWJe8kwGXMYKWkYVj9oKLL1+lUyAEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhd14zekznZeGR0LtAgEQgDvWyM0lHKTgON9y6HRgqrplonB55zdYVjK+S1lT2FcbQA5tAioL+xABdnBQVtdvoklthUDdSMKIvakmyw==", - "aws_profile": "javabin" - } - ], - "lastmodified": "2025-09-24T17:53:14Z", - "mac": "ENC[AES256_GCM,data:hRBbb+vsEzg+KcTeMQtDgXa6XHIQrTx+tE3hnVnq7c2CUctUwc650I/R7+ljq+QoDYEjtmbEEYO5hEw2Atf8426a4v6FeC6nV9HqUgipT6dlNEDeFx/mzSVP2G5h89sNx0p3Il+mSSirPbt0JDawMGJ/6KGHr4pBgh8bgDZd7P0=,iv:XpohWAqesyr3DlSR5IOD9jkD5/Jo5ChMa57jJcpLPwI=,tag:V6c6teQ34DcQd3dkl/sF9Q==,type:str]", - "unencrypted_suffix": "_unencrypted", - "version": "3.10.2" - } -} diff --git a/run-local.sh b/run-local.sh new file mode 100755 index 0000000..5d06d0a --- /dev/null +++ b/run-local.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# Build the Docker image +docker build -t moresleep-app:latest . + +# Run the container with AWS credentials mounted +docker run --rm -it \ + -p 5000:5000 \ + -v $HOME/.aws:/root/.aws:ro \ + -e AWS_PROFILE=javabin \ + moresleep-app:latest \ No newline at end of file From 56b922d999a1231c43587f8a85d2900be8068030 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Thu, 25 Sep 2025 00:10:18 +0200 Subject: [PATCH 04/18] Add support for optional PATH_PREFIX in servlet mappings and normalize path handling due to ALB adding prefix to path --- .../kotlin/no/java/moresleep/Application.kt | 9 +++++++ .../kotlin/no/java/moresleep/HttpMethod.kt | 26 ++++++++++++++++++- src/main/kotlin/no/java/moresleep/Setup.kt | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/no/java/moresleep/Application.kt b/src/main/kotlin/no/java/moresleep/Application.kt index 74a84da..b75014d 100644 --- a/src/main/kotlin/no/java/moresleep/Application.kt +++ b/src/main/kotlin/no/java/moresleep/Application.kt @@ -48,6 +48,15 @@ private fun createHandler(): Handler { webAppContext.resourceBase = "src/main/resources/webapp" } + // Add servlet mappings with optional PATH_PREFIX support + val pathPrefix = Setup.readValue(SetupValue.PATH_PREFIX) + if (pathPrefix.isNotEmpty()) { + println("Adding servlet mappings with prefix: $pathPrefix") + webAppContext.addServlet(ServletHolder(ApiServlet("/data")), "/$pathPrefix/data/*") + webAppContext.addServlet(ServletHolder(ApiServlet("/public")), "/$pathPrefix/public/*") + } + + // Keep original mappings for backward compatibility webAppContext.addServlet(ServletHolder(ApiServlet("/data")), "/data/*") webAppContext.addServlet(ServletHolder(ApiServlet("/public")), "/public/*") diff --git a/src/main/kotlin/no/java/moresleep/HttpMethod.kt b/src/main/kotlin/no/java/moresleep/HttpMethod.kt index 9ad361a..16ed42b 100644 --- a/src/main/kotlin/no/java/moresleep/HttpMethod.kt +++ b/src/main/kotlin/no/java/moresleep/HttpMethod.kt @@ -8,6 +8,7 @@ enum class HttpMethod { GET,DELETE,POST,PUT; fun commandFromPathInfo(pathinfo: String,additionalParas: Map): PathInfoMapped? { + val normalizedPath = normalizePath(pathinfo) val decitionList:List>> = when (this) { POST -> listOf( Pair("/data/conference", CreateNewConference::class), @@ -40,7 +41,7 @@ enum class HttpMethod { ) } for (decition in decitionList) { - val pathmatch = mapFromPath(pathinfo,decition.first,additionalParas) + val pathmatch = mapFromPath(normalizedPath,decition.first,additionalParas) if (pathmatch != null) { return PathInfoMapped(decition.second, pathmatch) } @@ -49,6 +50,29 @@ enum class HttpMethod { return null } + private fun normalizePath(pathinfo: String): String { + val pathPrefix = Setup.readValue(SetupValue.PATH_PREFIX) + if (pathPrefix.isEmpty()) { + return pathinfo + } + + // Ensure both path and prefix start with / + val normalizedPathinfo = if (pathinfo.startsWith("/")) pathinfo else "/$pathinfo" + val normalizedPrefix = if (pathPrefix.startsWith("/")) pathPrefix else "/$pathPrefix" + + return if (normalizedPathinfo.startsWith(normalizedPrefix)) { + val remaining = normalizedPathinfo.substring(normalizedPrefix.length) + // Ensure the remaining path starts with / or is empty + when { + remaining.isEmpty() -> "/" + remaining.startsWith("/") -> remaining + else -> "/$remaining" // Add leading slash if missing + } + } else { + normalizedPathinfo + } + } + private fun mapFromPath(pathinfo: String,pattern:String,additionalParas:Map):Map? { if (pathinfo == pattern) return emptyMap() var pathpos = 0 diff --git a/src/main/kotlin/no/java/moresleep/Setup.kt b/src/main/kotlin/no/java/moresleep/Setup.kt index 1f1dc98..7fe6721 100644 --- a/src/main/kotlin/no/java/moresleep/Setup.kt +++ b/src/main/kotlin/no/java/moresleep/Setup.kt @@ -22,7 +22,7 @@ enum class SetupValue(val defaultValue:String) { DO_FLYWAY_MIGRATION("true"), STORE_UPDATES("true"), CONFIG_SLOTS("false"), - + PATH_PREFIX(""), } object Setup { From 8a2d76a7f890f9e13f1fef51600fbd5d4b555dbf Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Thu, 25 Sep 2025 00:10:53 +0200 Subject: [PATCH 05/18] clean up old files --- .ebextensions/00-set-timezone.config | 3 --- .ebextensions/cw-logging.config | 6 ------ .elasticbeanstalk/config.global.yml | 11 ----------- conf/prod.properties.encrypted | 26 -------------------------- 4 files changed, 46 deletions(-) delete mode 100644 .ebextensions/00-set-timezone.config delete mode 100644 .ebextensions/cw-logging.config delete mode 100644 .elasticbeanstalk/config.global.yml delete mode 100644 conf/prod.properties.encrypted diff --git a/.ebextensions/00-set-timezone.config b/.ebextensions/00-set-timezone.config deleted file mode 100644 index 353ef50..0000000 --- a/.ebextensions/00-set-timezone.config +++ /dev/null @@ -1,3 +0,0 @@ -commands: - link_Oslo: - command: "ln -sf /usr/share/zoneinfo/Europe/Oslo /etc/localtime" diff --git a/.ebextensions/cw-logging.config b/.ebextensions/cw-logging.config deleted file mode 100644 index a688766..0000000 --- a/.ebextensions/cw-logging.config +++ /dev/null @@ -1,6 +0,0 @@ -option_settings: - aws:elasticbeanstalk:cloudwatch:logs: - StreamLogs: true - DeleteOnTerminate: false - RetentionInDays: 365 - diff --git a/.elasticbeanstalk/config.global.yml b/.elasticbeanstalk/config.global.yml deleted file mode 100644 index e63a9fb..0000000 --- a/.elasticbeanstalk/config.global.yml +++ /dev/null @@ -1,11 +0,0 @@ -branch-defaults: - master: - environment: Moresleep-prod21 -global: - application_name: moresleep - default_ec2_keyname: javabin - default_region: eu-central-1 - profile: javabin - sc: git -deploy: - artifact: app.zip \ No newline at end of file diff --git a/conf/prod.properties.encrypted b/conf/prod.properties.encrypted deleted file mode 100644 index 0593787..0000000 --- a/conf/prod.properties.encrypted +++ /dev/null @@ -1,26 +0,0 @@ -$ANSIBLE_VAULT;1.1;AES256 -31646338333166623035623761346436373438366137663934663261633236613932376336633234 -3036323433633565656535616164383561353635383163630a383262306639366631393839383133 -62333363303663613162376634373366323963353633316238336330383339613838646134303039 -3138376162326265620a346437643338343763636364633866343636626633646530666239373661 -61333465626430643165623235343162616164393331306464333239623238613566383733323032 -35313435616338383738646265636438626334613066306630303936383766336439323362646263 -62323731353937636263663331346130643366356535366635653366363030656262363563343361 -38326161636434653638353861363832393161303936396464313562356236643736313635303466 -33323763346365336565336537653636316133386566353363626430396533643365653231396533 -32393736346436393030316563656663316139383536336135356466353162386438656465626530 -66383065383737336665616631353666636364373164643636376333633031653536383266356166 -39633363383933623334646665623732376562663535363831383731343066353031383563333334 -34613562636465353739346263346439623861363463306139363032306439396335363039383162 -38393462633763656566306534646263396132343137393738363939316439333966346533393164 -39363662646665363333373437363736323161376366376530303939343338323533616233376565 -66653261663132666565306334376533363962393032646530663466386137313463383165353134 -33643534363637356561613966326539643665306439313833386131396463303261313866653030 -37323266323866616431306265306462303538323238356265323966383239333433386263613535 -36346664393561663030646539366431393061333037636330306539356366356165366662316137 -38623833623630343864663661643931626531663034323866626533636665626165333266373864 -36393365623933626335323966346339376334633565306132396662656239373636623333666561 -35316539366137623436613864636130643931323861336131386439643738623736393938313730 -61613731336434373366616465303631613935373766653231333730613839316262353632373937 -66323636636239353162303634333035376165386164623963313632346533663161646665336132 -33623030346563663434333264376333646130633837353235323832333661646138 From dd39b06b2af8304d9bbdb2a9566bb30c7e8d4768 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Thu, 25 Sep 2025 00:11:43 +0200 Subject: [PATCH 06/18] working cdk stack https://default-alb-1235825687.eu-central-1.elb.amazonaws.com/moresleep/public/allSessions --- .dockerignore | 7 + .gitignore | 2 + Dockerfile | 6 +- cdk/bin/stacks.ts | 10 + cdk/cdk.context.json | 55 + cdk/cdk.json | 87 ++ cdk/lib/existing-resources.ts | 48 + cdk/lib/moresleep-stack.ts | 80 ++ cdk/package-lock.json | 2304 +++++++++++++++++++++++++++++++++ cdk/package.json | 23 + cdk/tsconfig.json | 31 + run-local.sh | 10 +- 12 files changed, 2661 insertions(+), 2 deletions(-) create mode 100644 .dockerignore create mode 100644 cdk/bin/stacks.ts create mode 100644 cdk/cdk.context.json create mode 100644 cdk/cdk.json create mode 100644 cdk/lib/existing-resources.ts create mode 100644 cdk/lib/moresleep-stack.ts create mode 100644 cdk/package-lock.json create mode 100644 cdk/package.json create mode 100644 cdk/tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..957dd61 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +cdk/ +target/ +test/ +node_modules/ +*.md +LICENSE.txt diff --git a/.gitignore b/.gitignore index 70bfc69..a0f7840 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ src/main/kotlin/no/anksoft .DS_Store .env .postgres_data +cdk.out/ +node_modules \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 764dc5b..2aef973 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Run: docker run --name moresleep-container -p 5000:5000 moresleep-app:latest # Check localhost:5000 and you should get a homepage # Stage 1: Build the application -FROM maven:3.9.6-eclipse-temurin-21 AS build +FROM maven:3.9.11-eclipse-temurin-21 AS build WORKDIR /app COPY pom.xml . COPY src ./src @@ -33,5 +33,9 @@ ENV RUN_FROM_JAR=true WORKDIR /app COPY --from=build /app/target/moresleep-0.0.1-jar-with-dependencies.jar app.jar COPY ./conf/.enc.env /app/.enc.env + +# Remove AWS profile from SOPS config to use container's AWS credentials +RUN sed -i 's/sops_kms__list_0__map_aws_profile=javabin/sops_kms__list_0__map_aws_profile=/' /app/.enc.env + EXPOSE 5000 ENTRYPOINT ["sops", "exec-env", ".enc.env", "java -jar app.jar"] \ No newline at end of file diff --git a/cdk/bin/stacks.ts b/cdk/bin/stacks.ts new file mode 100644 index 0000000..7963e29 --- /dev/null +++ b/cdk/bin/stacks.ts @@ -0,0 +1,10 @@ + +import * as cdk from 'aws-cdk-lib'; +import { MoresleepStack } from '../lib/moresleep-stack.js'; + +const app = new cdk.App(); +new MoresleepStack(app, 'moresleepstack', { + env: { account: '553637109631', region: 'eu-central-1' }, +}); + + diff --git a/cdk/cdk.context.json b/cdk/cdk.context.json new file mode 100644 index 0000000..97eb694 --- /dev/null +++ b/cdk/cdk.context.json @@ -0,0 +1,55 @@ +{ + "acknowledged-issue-numbers": [ + 34892 + ], + "vpc-provider:account=553637109631:filter.isDefault=true:region=eu-central-1:returnAsymmetricSubnets=true": { + "vpcId": "vpc-d55e68bc", + "vpcCidrBlock": "172.31.0.0/16", + "ownerAccountId": "553637109631", + "availabilityZones": [], + "subnetGroups": [ + { + "name": "Public", + "type": "Public", + "subnets": [ + { + "subnetId": "subnet-0347ca5488bd97167", + "cidr": "172.31.48.0/20", + "availabilityZone": "eu-central-1a", + "routeTableId": "rtb-f0626d99" + }, + { + "subnetId": "subnet-19746c70", + "cidr": "172.31.0.0/20", + "availabilityZone": "eu-central-1a", + "routeTableId": "rtb-f0626d99" + }, + { + "subnetId": "subnet-01210e22afbd300aa", + "cidr": "172.31.64.0/20", + "availabilityZone": "eu-central-1b", + "routeTableId": "rtb-f0626d99" + }, + { + "subnetId": "subnet-35c1f74e", + "cidr": "172.31.16.0/20", + "availabilityZone": "eu-central-1b", + "routeTableId": "rtb-f0626d99" + }, + { + "subnetId": "subnet-2f3d0c65", + "cidr": "172.31.32.0/20", + "availabilityZone": "eu-central-1c", + "routeTableId": "rtb-f0626d99" + }, + { + "subnetId": "subnet-0f462674c4b62bd57", + "cidr": "172.31.80.0/20", + "availabilityZone": "eu-central-1c", + "routeTableId": "rtb-f0626d99" + } + ] + } + ] + } +} diff --git a/cdk/cdk.json b/cdk/cdk.json new file mode 100644 index 0000000..1ae1a71 --- /dev/null +++ b/cdk/cdk.json @@ -0,0 +1,87 @@ +{ + "app": "npx tsx bin/stacks.ts", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "**/*.d.ts", + "**/*.js", + "tsconfig.json", + "package*.json", + "yarn.lock", + "node_modules", + "test" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false, + "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false, + "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false, + "@aws-cdk/aws-ecs:disableEcsImdsBlocking": true, + "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true, + "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true, + "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true, + "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true, + "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true, + "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true, + "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true, + "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true, + "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true, + "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true, + "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true, + "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true, + "@aws-cdk/core:enableAdditionalMetadataCollection": true + } +} diff --git a/cdk/lib/existing-resources.ts b/cdk/lib/existing-resources.ts new file mode 100644 index 0000000..3033f1c --- /dev/null +++ b/cdk/lib/existing-resources.ts @@ -0,0 +1,48 @@ +import * as ec2 from 'aws-cdk-lib/aws-ec2'; +import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; +import { Construct } from 'constructs'; +export interface ExistingResources { + vpc: ec2.IVpc; + existingListener: elbv2.IApplicationListener; +} + +export function importExistingResources(scope: Construct): ExistingResources { + // Import existing VPC + const vpc = ec2.Vpc.fromLookup(scope, 'ImportedVPC', { + isDefault: true, // Assuming you're using the default VPC + }); + + // Import the existing ALB + const existingAlb = + elbv2.ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes( + scope, + 'ExistingALB', + { + loadBalancerArn: + 'arn:aws:elasticloadbalancing:eu-central-1:553637109631:loadbalancer/app/Default-ALB/1c9b1a5fd7bded5e', + loadBalancerCanonicalHostedZoneId: 'Z215JYRZR1TBD5', + loadBalancerDnsName: + 'Default-ALB-1235825687.eu-central-1.elb.amazonaws.com', + securityGroupId: 'sg-06d60bddabf369fb2', + vpc, + } + ); + + // Import existing listener + const existingListener = + elbv2.ApplicationListener.fromApplicationListenerAttributes( + scope, + 'ExistingListener', + { + listenerArn: + 'arn:aws:elasticloadbalancing:eu-central-1:553637109631:listener/app/Default-ALB/1c9b1a5fd7bded5e/b211e068a4b86a7b', // Replace with your listener ARN + securityGroup: existingAlb.connections.securityGroups[0], + } + ); + + + return { + vpc, + existingListener, + }; +} diff --git a/cdk/lib/moresleep-stack.ts b/cdk/lib/moresleep-stack.ts new file mode 100644 index 0000000..0a0d76f --- /dev/null +++ b/cdk/lib/moresleep-stack.ts @@ -0,0 +1,80 @@ +import * as cdk from 'aws-cdk-lib'; +import * as ecs from 'aws-cdk-lib/aws-ecs'; +import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import { type Construct } from 'constructs'; +import { importExistingResources } from './existing-resources'; + +const port = 5000; +const pathPattern = '/moresleep/*'; +const healthCheckPath = '/'; +const priority = 15; + +export class MoresleepStack extends cdk.Stack { + constructor(scope: Construct, id: string, properties?: cdk.StackProps) { + super(scope, id, properties); + + // Import existing resources + const { vpc, existingListener } = importExistingResources(this); + + + // Create ECS Cluster + const cluster = new ecs.Cluster(this, 'Cluster', { + vpc, + clusterName: 'moresleep-test', + }); + // Create the Fargate service first + const taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDef', { + memoryLimitMiB: 512, + cpu: 256, + }); + + // Attach the SOPS KMS policy to the task role usin arn + + taskDefinition.taskRole.addManagedPolicy( + iam.ManagedPolicy.fromManagedPolicyArn( + this, + 'SopsKmsPolicy', + 'arn:aws:iam::553637109631:policy/sops-kms-policy' + ) + ); + + // console.log pwd + console.log('Current working directory:', process.cwd()); + + taskDefinition.addContainer('web', { + image: ecs.ContainerImage.fromAsset('../', { file: 'Dockerfile' }), + environment: { + PATH_PREFIX: 'moresleep' + }, + + portMappings: [{ containerPort: port }], + logging: new ecs.AwsLogDriver({ streamPrefix: 'web' }), + }); + + const service = new ecs.FargateService(this, 'Service', { + cluster, + taskDefinition, + desiredCount: 1, + assignPublicIp: true, + circuitBreaker: { rollback: true }, + }); + + // Create a target group and add it to the existing listener + const targetGroup = new elbv2.ApplicationTargetGroup(this, 'TargetGroup', { + vpc, + port: port, + protocol: elbv2.ApplicationProtocol.HTTP, + targets: [service], + healthCheck: { + path: healthCheckPath, + }, + }); + + existingListener.addTargetGroups('AddTargetGroup', { + targetGroups: [targetGroup], + priority, + conditions: [elbv2.ListenerCondition.pathPatterns([pathPattern])], + }); + } +} diff --git a/cdk/package-lock.json b/cdk/package-lock.json new file mode 100644 index 0000000..2ac389f --- /dev/null +++ b/cdk/package-lock.json @@ -0,0 +1,2304 @@ +{ + "name": "ia_c-testing", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ia_c-testing", + "version": "0.1.0", + "dependencies": { + "@aws-sdk/client-elastic-load-balancing-v2": "^3.896.0", + "aws-cdk-lib": "2.216.0", + "constructs": "10.4.2" + }, + "bin": { + "ia_c-testing": "bin/ia_c-testing.js" + }, + "devDependencies": { + "@types/node": "22.7.9", + "aws-cdk": "2.1029.2", + "tsx": "4.20.5", + "typescript": "5.9.2" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.242", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.242.tgz", + "integrity": "sha512-4c1bAy2ISzcdKXYS1k4HYZsNrgiwbiDzj36ybwFVxEWZXVAP0dimQTCaB9fxu7sWzEjw3d+eaw6Fon+QTfTIpQ==", + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", + "integrity": "sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==", + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "48.11.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.11.0.tgz", + "integrity": "sha512-1qMR8EYwgVBrSEK/zIoYIEuvHNT9busOXncCrV5uqRtjJTPTOJh5oJQjuzbBBy6ERLhTyLPTR/bu8f1aI3SLGw==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "license": "Apache-2.0", + "dependencies": { + "jsonschema": "~1.4.1", + "semver": "^7.7.2" + }, + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.7.2", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.896.0.tgz", + "integrity": "sha512-3nBzKlXytcpqx8IegcVhYZMPyw9CqJ8BV/kXYK+aiAa6uPd86Ag6G4A/D+2DLZMXnRO7Jx3OBfHINXbb/cejvg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-node": "3.896.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.12.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", + "@smithy/util-endpoints": "^3.1.2", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-utf8": "^4.1.0", + "@smithy/util-waiter": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.896.0.tgz", + "integrity": "sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.12.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", + "@smithy/util-endpoints": "^3.1.2", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.896.0.tgz", + "integrity": "sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@aws-sdk/xml-builder": "3.894.0", + "@smithy/core": "^3.12.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/signature-v4": "^5.2.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.896.0.tgz", + "integrity": "sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.896.0.tgz", + "integrity": "sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/property-provider": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.896.0.tgz", + "integrity": "sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/credential-provider-env": "3.896.0", + "@aws-sdk/credential-provider-http": "3.896.0", + "@aws-sdk/credential-provider-process": "3.896.0", + "@aws-sdk/credential-provider-sso": "3.896.0", + "@aws-sdk/credential-provider-web-identity": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/credential-provider-imds": "^4.1.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.896.0.tgz", + "integrity": "sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.896.0", + "@aws-sdk/credential-provider-http": "3.896.0", + "@aws-sdk/credential-provider-ini": "3.896.0", + "@aws-sdk/credential-provider-process": "3.896.0", + "@aws-sdk/credential-provider-sso": "3.896.0", + "@aws-sdk/credential-provider-web-identity": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/credential-provider-imds": "^4.1.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.896.0.tgz", + "integrity": "sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.896.0.tgz", + "integrity": "sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.896.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/token-providers": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.896.0.tgz", + "integrity": "sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.893.0.tgz", + "integrity": "sha512-qL5xYRt80ahDfj9nDYLhpCNkDinEXvjLe/Qen/Y/u12+djrR2MB4DRa6mzBCkLkdXDtf0WAoW2EZsNCfGrmOEQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.893.0.tgz", + "integrity": "sha512-ZqzMecjju5zkBquSIfVfCORI/3Mge21nUY4nWaGQy+NUXehqCGG4W7AiVpiHGOcY2cGJa7xeEkYcr2E2U9U0AA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.893.0.tgz", + "integrity": "sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.896.0.tgz", + "integrity": "sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@smithy/core": "^3.12.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.896.0.tgz", + "integrity": "sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.896.0", + "@aws-sdk/middleware-host-header": "3.893.0", + "@aws-sdk/middleware-logger": "3.893.0", + "@aws-sdk/middleware-recursion-detection": "3.893.0", + "@aws-sdk/middleware-user-agent": "3.896.0", + "@aws-sdk/region-config-resolver": "3.893.0", + "@aws-sdk/types": "3.893.0", + "@aws-sdk/util-endpoints": "3.895.0", + "@aws-sdk/util-user-agent-browser": "3.893.0", + "@aws-sdk/util-user-agent-node": "3.896.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/core": "^3.12.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-retry": "^4.3.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.4", + "@smithy/util-defaults-mode-node": "^4.1.4", + "@smithy/util-endpoints": "^3.1.2", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.893.0.tgz", + "integrity": "sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", + "@smithy/util-config-provider": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.896.0.tgz", + "integrity": "sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.896.0", + "@aws-sdk/nested-clients": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.893.0.tgz", + "integrity": "sha512-Aht1nn5SnA0N+Tjv0dzhAY7CQbxVtmq1bBR6xI0MhG7p2XYVh1wXuKTzrldEvQWwA3odOYunAfT9aBiKZx9qIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.895.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.895.0.tgz", + "integrity": "sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-endpoints": "^3.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.893.0.tgz", + "integrity": "sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.893.0", + "@smithy/types": "^4.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.896.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.896.0.tgz", + "integrity": "sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.896.0", + "@aws-sdk/types": "3.893.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.894.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.894.0.tgz", + "integrity": "sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz", + "integrity": "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.1.tgz", + "integrity": "sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.2.tgz", + "integrity": "sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", + "@smithy/util-config-provider": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.12.0.tgz", + "integrity": "sha512-zJeAgogZfbwlPGL93y4Z/XNeIN37YCreRUd6YMIRvaq+6RnBK8PPYYIQ85Is/GglPh3kNImD5riDCXbVSDpCiQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-stream": "^4.3.2", + "@smithy/util-utf8": "^4.1.0", + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz", + "integrity": "sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz", + "integrity": "sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.2.1", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.1.tgz", + "integrity": "sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz", + "integrity": "sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz", + "integrity": "sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz", + "integrity": "sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.4.tgz", + "integrity": "sha512-FZ4hzupOmthm8Q8ujYrd0I+/MHwVMuSTdkDtIQE0xVuvJt9pLT6Q+b0p4/t+slDyrpcf+Wj7SN+ZqT5OryaaZg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.12.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-middleware": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.3.0.tgz", + "integrity": "sha512-qhEX9745fAxZvtLM4bQJAVC98elWjiMO2OiHl1s6p7hUzS4QfZO1gXUYNwEK8m0J6NoCD5W52ggWxbIDHI0XSg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.2.2", + "@smithy/protocol-http": "^5.2.1", + "@smithy/service-error-classification": "^4.1.2", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.2", + "@smithy/uuid": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz", + "integrity": "sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz", + "integrity": "sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz", + "integrity": "sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz", + "integrity": "sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.1.tgz", + "integrity": "sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.1.tgz", + "integrity": "sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz", + "integrity": "sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "@smithy/util-uri-escape": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz", + "integrity": "sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.2.tgz", + "integrity": "sha512-Kqd8wyfmBWHZNppZSMfrQFpc3M9Y/kjyN8n8P4DqJJtuwgK1H914R471HTw7+RL+T7+kI1f1gOnL7Vb5z9+NgQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz", + "integrity": "sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.1.tgz", + "integrity": "sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.1.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-uri-escape": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.4.tgz", + "integrity": "sha512-qL7O3VDyfzCSN9r+sdbQXGhaHtrfSJL30En6Jboj0I3bobf2g1/T0eP2L4qxqrEW26gWhJ4THI4ElVVLjYyBHg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.12.0", + "@smithy/middleware-endpoint": "^4.2.4", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.5.0.tgz", + "integrity": "sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.1.tgz", + "integrity": "sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.1.0.tgz", + "integrity": "sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz", + "integrity": "sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz", + "integrity": "sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz", + "integrity": "sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz", + "integrity": "sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.4.tgz", + "integrity": "sha512-mLDJ1s4eA3vwOGaQOEPlg5LB4LdZUUMpB5UMOMofeGhWqiS7WR7dTpLiNi9zVn+YziKUd3Af5NLfxDs7NJqmIw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.1.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.4.tgz", + "integrity": "sha512-pjX2iMTcOASaSanAd7bu6i3fcMMezr3NTr8Rh64etB0uHRZi+Aw86DoCxPESjY4UTIuA06hhqtTtw95o//imYA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.2.2", + "@smithy/credential-provider-imds": "^4.1.2", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/smithy-client": "^4.6.4", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz", + "integrity": "sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz", + "integrity": "sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.1.tgz", + "integrity": "sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.2.tgz", + "integrity": "sha512-NCgr1d0/EdeP6U5PSZ9Uv5SMR5XRRYoVr1kRVtKZxWL3tixEL3UatrPIMFZSKwHlCcp2zPLDvMubVDULRqeunA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.1.2", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.2.tgz", + "integrity": "sha512-Ka+FA2UCC/Q1dEqUanCdpqwxOFdf5Dg2VXtPtB1qxLcSGh5C1HdzklIt18xL504Wiy9nNUKwDMRTVCbKGoK69g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz", + "integrity": "sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.1.0.tgz", + "integrity": "sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.1.1.tgz", + "integrity": "sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.0.0.tgz", + "integrity": "sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/node": { + "version": "22.7.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", + "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/aws-cdk": { + "version": "2.1029.2", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1029.2.tgz", + "integrity": "sha512-VkgxcbDLygHtnIuZHDYosQSlYwqmnYogzgB4zq+n6prHUP3Q9R8b/eOeo5bG+5OhE+r6+ZXrrVSmfISyaxA0og==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 18.0.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.216.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.216.0.tgz", + "integrity": "sha512-Y8u5HiMVeJp3HLJy8Ok3tr+Fgk0oUbhQfbSAyEBVZts7T9olEkQPfmBf1TiybcQmt/C/pjk3qQFHsGL+fgxtvw==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml", + "mime-types" + ], + "license": "Apache-2.0", + "dependencies": { + "@aws-cdk/asset-awscli-v1": "2.2.242", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", + "@aws-cdk/cloud-assembly-schema": "^48.6.0", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.3.1", + "ignore": "^5.3.2", + "jsonschema": "^1.5.0", + "mime-types": "^2.1.35", + "minimatch": "^3.1.2", + "punycode": "^2.3.1", + "semver": "^7.7.2", + "table": "^6.9.0", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.17.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.12", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-uri": { + "version": "3.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.3.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.3.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/mime-db": { + "version": "1.52.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/mime-types": { + "version": "2.1.35", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.7.2", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.9.0", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "license": "MIT" + }, + "node_modules/constructs": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.4.2.tgz", + "integrity": "sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA==", + "license": "Apache-2.0" + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/cdk/package.json b/cdk/package.json new file mode 100644 index 0000000..fff96db --- /dev/null +++ b/cdk/package.json @@ -0,0 +1,23 @@ +{ + "name": "ia_c-testing", + "version": "0.1.0", + "bin": { + "ia_c-testing": "bin/ia_c-testing.js" + }, + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "cdk": "cdk" + }, + "devDependencies": { + "@types/node": "22.7.9", + "aws-cdk": "2.1029.2", + "tsx": "4.20.5", + "typescript": "5.9.2" + }, + "dependencies": { + "@aws-sdk/client-elastic-load-balancing-v2": "^3.896.0", + "aws-cdk-lib": "2.216.0", + "constructs": "10.4.2" + } +} diff --git a/cdk/tsconfig.json b/cdk/tsconfig.json new file mode 100644 index 0000000..aaa7dc5 --- /dev/null +++ b/cdk/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": [ + "es2020", + "dom" + ], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": [ + "./node_modules/@types" + ] + }, + "exclude": [ + "node_modules", + "cdk.out" + ] +} diff --git a/run-local.sh b/run-local.sh index 5d06d0a..fd6a99c 100755 --- a/run-local.sh +++ b/run-local.sh @@ -1,10 +1,18 @@ #!/bin/sh +# Usage: ./run-local.sh [path_prefix] +# Example: ./run-local.sh moresleep + +PATH_PREFIX="$1" + +echo "Setting PATH_PREFIX to: '$PATH_PREFIX'" + # Build the Docker image docker build -t moresleep-app:latest . # Run the container with AWS credentials mounted docker run --rm -it \ -p 5000:5000 \ - -v $HOME/.aws:/root/.aws:ro \ + -v "$HOME/.aws:/root/.aws:ro" \ -e AWS_PROFILE=javabin \ + -e PATH_PREFIX="$PATH_PREFIX" \ moresleep-app:latest \ No newline at end of file From 48f28156763f4ef2ae37fed694a0e8415cfd873a Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 13:48:23 +0200 Subject: [PATCH 07/18] Add GitHub Actions workflow for CDK infrastructure deployment --- .github/workflows/cdk-deploy.yml | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/cdk-deploy.yml diff --git a/.github/workflows/cdk-deploy.yml b/.github/workflows/cdk-deploy.yml new file mode 100644 index 0000000..aee16f5 --- /dev/null +++ b/.github/workflows/cdk-deploy.yml @@ -0,0 +1,39 @@ +name: Deploy infrastructure +on: + workflow_dispatch: + +permissions: + id-token: write + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-region: eu-central-1 + role-to-assume: ${{ secrets.AWS_OIDC_ROLE }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + cache-dependency-path: 'cdk/package-lock.json' + + - name: Install CDK dependencies + working-directory: ./cdk + run: npm ci + + - name: Install AWS CDK CLI + run: npm install -g aws-cdk + + - name: CDK Deploy + working-directory: ./cdk + run: cdk deploy --require-approval never + From eb0d6fd77393ea3c0461dbbe5c2986c65fa5f276 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 13:59:37 +0200 Subject: [PATCH 08/18] Add optional PATH_PREFIX support for context path and servlet mappings --- src/main/kotlin/no/java/moresleep/Application.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/no/java/moresleep/Application.kt b/src/main/kotlin/no/java/moresleep/Application.kt index b75014d..028eec0 100644 --- a/src/main/kotlin/no/java/moresleep/Application.kt +++ b/src/main/kotlin/no/java/moresleep/Application.kt @@ -36,7 +36,15 @@ private fun setupAndStartServer(args: Array) { private fun createHandler(): Handler { val webAppContext = WebAppContext() webAppContext.initParams["org.eclipse.jetty.servlet.Default.useFileMappedBuffer"] = "false" - webAppContext.contextPath = "/" + + // Set context path with optional PATH_PREFIX support + val pathPrefix = Setup.readValue(SetupValue.PATH_PREFIX) + if (pathPrefix.isNotEmpty()) { + webAppContext.contextPath = "/$pathPrefix" + println("Setting context path to: /$pathPrefix") + } else { + webAppContext.contextPath = "/" + } if (Setup.readBoolValue(SetupValue.RUN_FROM_JAR)) { // Prod ie running from jar @@ -49,7 +57,6 @@ private fun createHandler(): Handler { } // Add servlet mappings with optional PATH_PREFIX support - val pathPrefix = Setup.readValue(SetupValue.PATH_PREFIX) if (pathPrefix.isNotEmpty()) { println("Adding servlet mappings with prefix: $pathPrefix") webAppContext.addServlet(ServletHolder(ApiServlet("/data")), "/$pathPrefix/data/*") From 94feca6eb6c019c518fb99518a963ceed991dc27 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:03:21 +0200 Subject: [PATCH 09/18] Add input for branch reference in CDK deployment workflow --- .github/workflows/cdk-deploy.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/cdk-deploy.yml b/.github/workflows/cdk-deploy.yml index aee16f5..898a141 100644 --- a/.github/workflows/cdk-deploy.yml +++ b/.github/workflows/cdk-deploy.yml @@ -1,6 +1,12 @@ name: Deploy infrastructure on: workflow_dispatch: + inputs: + ref: + description: 'Branch, tag or commit SHA to deploy' + required: false + default: 'master' + type: string permissions: id-token: write @@ -12,6 +18,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.ref }} - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 From c0cde964984550483b64bb6e12b659040fcbeb17 Mon Sep 17 00:00:00 2001 From: Kullsyreholdig <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:04:02 +0200 Subject: [PATCH 10/18] Update cdk-deploy.yml --- .github/workflows/cdk-deploy.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/cdk-deploy.yml b/.github/workflows/cdk-deploy.yml index 898a141..edd5b28 100644 --- a/.github/workflows/cdk-deploy.yml +++ b/.github/workflows/cdk-deploy.yml @@ -44,4 +44,3 @@ jobs: - name: CDK Deploy working-directory: ./cdk run: cdk deploy --require-approval never - From 289fbd6d25fbadb34d20402db66a327d5455bcd5 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:39:09 +0200 Subject: [PATCH 11/18] sleepingpill.javazone.no from alb --- cdk/lib/moresleep-stack.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cdk/lib/moresleep-stack.ts b/cdk/lib/moresleep-stack.ts index 0a0d76f..2223de2 100644 --- a/cdk/lib/moresleep-stack.ts +++ b/cdk/lib/moresleep-stack.ts @@ -6,7 +6,6 @@ import { type Construct } from 'constructs'; import { importExistingResources } from './existing-resources'; const port = 5000; -const pathPattern = '/moresleep/*'; const healthCheckPath = '/'; const priority = 15; @@ -44,9 +43,6 @@ export class MoresleepStack extends cdk.Stack { taskDefinition.addContainer('web', { image: ecs.ContainerImage.fromAsset('../', { file: 'Dockerfile' }), - environment: { - PATH_PREFIX: 'moresleep' - }, portMappings: [{ containerPort: port }], logging: new ecs.AwsLogDriver({ streamPrefix: 'web' }), @@ -63,7 +59,7 @@ export class MoresleepStack extends cdk.Stack { // Create a target group and add it to the existing listener const targetGroup = new elbv2.ApplicationTargetGroup(this, 'TargetGroup', { vpc, - port: port, + port, protocol: elbv2.ApplicationProtocol.HTTP, targets: [service], healthCheck: { @@ -74,7 +70,7 @@ export class MoresleepStack extends cdk.Stack { existingListener.addTargetGroups('AddTargetGroup', { targetGroups: [targetGroup], priority, - conditions: [elbv2.ListenerCondition.pathPatterns([pathPattern])], + conditions: [elbv2.ListenerCondition.hostHeaders(['sleepingpill.javazone.no'])], }); } } From afd52c6ee2b034a92cc5a79433b42755c3c32a20 Mon Sep 17 00:00:00 2001 From: Dennis Knudsen <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:47:50 +0200 Subject: [PATCH 12/18] Update greeting in index.html to specify ECS environment --- src/main/resources/webapp/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/webapp/index.html b/src/main/resources/webapp/index.html index 2b8c1e8..5e768c9 100644 --- a/src/main/resources/webapp/index.html +++ b/src/main/resources/webapp/index.html @@ -5,6 +5,6 @@ Moresleep -

Hello from moresleep

+

Hello from moresleep ecs

\ No newline at end of file From 65066f103efe4eb1e4c171d4f39199d55a541379 Mon Sep 17 00:00:00 2001 From: Kullsyreholdig <7996317+Kullsyreholdig@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:57:14 +0200 Subject: [PATCH 13/18] Update moresleep-stack.ts desiredCount to 2 --- cdk/lib/moresleep-stack.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cdk/lib/moresleep-stack.ts b/cdk/lib/moresleep-stack.ts index 2223de2..d6e0df1 100644 --- a/cdk/lib/moresleep-stack.ts +++ b/cdk/lib/moresleep-stack.ts @@ -8,6 +8,7 @@ import { importExistingResources } from './existing-resources'; const port = 5000; const healthCheckPath = '/'; const priority = 15; +const desiredCount = 2; export class MoresleepStack extends cdk.Stack { constructor(scope: Construct, id: string, properties?: cdk.StackProps) { @@ -51,7 +52,7 @@ export class MoresleepStack extends cdk.Stack { const service = new ecs.FargateService(this, 'Service', { cluster, taskDefinition, - desiredCount: 1, + desiredCount, assignPublicIp: true, circuitBreaker: { rollback: true }, }); From d554475fff593fb96c4ef8740a5787276b37b011 Mon Sep 17 00:00:00 2001 From: Anders Karlsen Date: Sun, 26 Oct 2025 15:24:03 +0200 Subject: [PATCH 14/18] Added webhooks --- src/main/kotlin/no/java/moresleep/Setup.kt | 1 + .../conference/CreateNewConference.kt | 7 ++++++ .../java/moresleep/hooks/DummyHookReporter.kt | 7 ++++++ .../no/java/moresleep/hooks/HookMessage.kt | 15 ++++++++++++ .../no/java/moresleep/hooks/HookReporter.kt | 17 +++++++++++++ .../moresleep/hooks/HookReporterInterface.kt | 5 ++++ .../java/moresleep/hooks/HttpHookReporter.kt | 24 +++++++++++++++++++ .../java/moresleep/talk/CreateNewSession.kt | 10 +++++++- .../no/java/moresleep/talk/PublishUpdates.kt | 7 ++++++ .../no/java/moresleep/talk/UpdateSession.kt | 10 +++++++- 10 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/no/java/moresleep/hooks/DummyHookReporter.kt create mode 100644 src/main/kotlin/no/java/moresleep/hooks/HookMessage.kt create mode 100644 src/main/kotlin/no/java/moresleep/hooks/HookReporter.kt create mode 100644 src/main/kotlin/no/java/moresleep/hooks/HookReporterInterface.kt create mode 100644 src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt diff --git a/src/main/kotlin/no/java/moresleep/Setup.kt b/src/main/kotlin/no/java/moresleep/Setup.kt index 7fe6721..bc146b9 100644 --- a/src/main/kotlin/no/java/moresleep/Setup.kt +++ b/src/main/kotlin/no/java/moresleep/Setup.kt @@ -23,6 +23,7 @@ enum class SetupValue(val defaultValue:String) { STORE_UPDATES("true"), CONFIG_SLOTS("false"), PATH_PREFIX(""), + HOOK_WEB_ADDR(""), } object Setup { diff --git a/src/main/kotlin/no/java/moresleep/conference/CreateNewConference.kt b/src/main/kotlin/no/java/moresleep/conference/CreateNewConference.kt index 60dcf43..36b9955 100644 --- a/src/main/kotlin/no/java/moresleep/conference/CreateNewConference.kt +++ b/src/main/kotlin/no/java/moresleep/conference/CreateNewConference.kt @@ -1,6 +1,9 @@ package no.java.moresleep.conference import no.java.moresleep.* +import no.java.moresleep.hooks.HookMessage +import no.java.moresleep.hooks.HookMessageType +import no.java.moresleep.hooks.HookReporter import javax.servlet.http.HttpServletResponse class CreateConferenceResult(val id:String):ServiceResult() @@ -18,6 +21,10 @@ class CreateNewConference(val name:String?=null,val slug:String?=null,val id:Str throw ForbiddenRequest("No id allowed") } val id = ConferenceRepo.addNewConference(name,slug,id) + HookReporter.reportHook(HookMessage( + type = HookMessageType.ADDED_CONFERENCE, + reference = id + )) return CreateConferenceResult(id) } diff --git a/src/main/kotlin/no/java/moresleep/hooks/DummyHookReporter.kt b/src/main/kotlin/no/java/moresleep/hooks/DummyHookReporter.kt new file mode 100644 index 0000000..ae3d6dc --- /dev/null +++ b/src/main/kotlin/no/java/moresleep/hooks/DummyHookReporter.kt @@ -0,0 +1,7 @@ +package no.java.moresleep.hooks + +class DummyHookReporter:HookReporterInterface { + override fun reportHook(hookMessage: HookMessage) { + println("Hook reported $hookMessage") + } +} \ No newline at end of file diff --git a/src/main/kotlin/no/java/moresleep/hooks/HookMessage.kt b/src/main/kotlin/no/java/moresleep/hooks/HookMessage.kt new file mode 100644 index 0000000..fec5d99 --- /dev/null +++ b/src/main/kotlin/no/java/moresleep/hooks/HookMessage.kt @@ -0,0 +1,15 @@ +package no.java.moresleep.hooks + +import org.jsonbuddy.JsonObject +import java.util.UUID + +enum class HookMessageType { + ADDED_TALK, CHANGED_TALK, ADDED_CONFERENCE, PUBLISH_UOPDATES +} + +data class HookMessage( + val type:HookMessageType, + val reference:String, +) { + val messageId:String = UUID.randomUUID().toString() +} \ No newline at end of file diff --git a/src/main/kotlin/no/java/moresleep/hooks/HookReporter.kt b/src/main/kotlin/no/java/moresleep/hooks/HookReporter.kt new file mode 100644 index 0000000..0a4d6d7 --- /dev/null +++ b/src/main/kotlin/no/java/moresleep/hooks/HookReporter.kt @@ -0,0 +1,17 @@ +package no.java.moresleep.hooks + +import no.java.moresleep.Setup +import no.java.moresleep.SetupValue + +object HookReporter { + var givenHook: HookReporterInterface? = null + + private val reporter:HookReporterInterface by lazy { + val url = Setup.readValue(SetupValue.HOOK_WEB_ADDR) + givenHook ?: if (url.trim().isNotEmpty()) HttpHookReporter(url) else DummyHookReporter() + } + + fun reportHook(hookMessage: HookMessage) { + reporter.reportHook(hookMessage) + } +} \ No newline at end of file diff --git a/src/main/kotlin/no/java/moresleep/hooks/HookReporterInterface.kt b/src/main/kotlin/no/java/moresleep/hooks/HookReporterInterface.kt new file mode 100644 index 0000000..aa53f9e --- /dev/null +++ b/src/main/kotlin/no/java/moresleep/hooks/HookReporterInterface.kt @@ -0,0 +1,5 @@ +package no.java.moresleep.hooks + +interface HookReporterInterface { + fun reportHook(hookMessage: HookMessage) +} \ No newline at end of file diff --git a/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt b/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt new file mode 100644 index 0000000..799c54c --- /dev/null +++ b/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt @@ -0,0 +1,24 @@ +package no.java.moresleep.hooks + +import org.jsonbuddy.pojo.JsonGenerator +import java.io.BufferedWriter +import java.io.OutputStreamWriter +import java.io.PrintWriter +import java.net.* +import kotlin.concurrent.* + +class HttpHookReporter(private val url:String): HookReporterInterface { + override fun reportHook(hookMessage: HookMessage) { + thread(start = true) { + val jsonPaylload = JsonGenerator.generate(hookMessage) + val urlpath = URI(url).toURL() + val conn = urlpath.openConnection() as HttpURLConnection + conn.setRequestMethod("POST") + conn.setDoOutput(true) + val printWriter = PrintWriter(OutputStreamWriter(conn.outputStream), true) + printWriter.use { + jsonPaylload.toJson(it) + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/no/java/moresleep/talk/CreateNewSession.kt b/src/main/kotlin/no/java/moresleep/talk/CreateNewSession.kt index 71e4635..a4407d4 100644 --- a/src/main/kotlin/no/java/moresleep/talk/CreateNewSession.kt +++ b/src/main/kotlin/no/java/moresleep/talk/CreateNewSession.kt @@ -2,6 +2,9 @@ package no.java.moresleep.talk import no.java.moresleep.* import no.java.moresleep.conference.ConferenceRepo +import no.java.moresleep.hooks.HookMessage +import no.java.moresleep.hooks.HookMessageType +import no.java.moresleep.hooks.HookReporter import org.jsonbuddy.JsonObject import org.jsonbuddy.pojo.JsonGenerator import java.time.LocalDateTime @@ -72,7 +75,12 @@ class CreateNewSession(val data: Map?=null,val postedBy:String payload = if (Setup.readBoolValue(SetupValue.STORE_UPDATES)) dataObject else null ) - return ReadOneTalk().execute(systemUser, mapOf(Pair("id",sessionId))) + val talkDetail = ReadOneTalk().execute(systemUser, mapOf(Pair("id", sessionId))) + HookReporter.reportHook(HookMessage( + type = HookMessageType.ADDED_TALK, + reference = talkDetail.id, + )) + return talkDetail } diff --git a/src/main/kotlin/no/java/moresleep/talk/PublishUpdates.kt b/src/main/kotlin/no/java/moresleep/talk/PublishUpdates.kt index be36652..7f46985 100644 --- a/src/main/kotlin/no/java/moresleep/talk/PublishUpdates.kt +++ b/src/main/kotlin/no/java/moresleep/talk/PublishUpdates.kt @@ -1,6 +1,9 @@ package no.java.moresleep.talk import no.java.moresleep.* +import no.java.moresleep.hooks.HookMessage +import no.java.moresleep.hooks.HookMessageType +import no.java.moresleep.hooks.HookReporter import org.jsonbuddy.JsonObject class PublishOk:ServiceResult() { @@ -15,6 +18,10 @@ class PublishUpdates:Command { throw BadRequest("Talk $talkid is not pubished. Publish before change") } PublishTalk.doPublish(talkid,talkInDb.status) + HookReporter.reportHook(HookMessage( + type = HookMessageType.PUBLISH_UOPDATES, + reference = talkid + )) return PublishOk() } diff --git a/src/main/kotlin/no/java/moresleep/talk/UpdateSession.kt b/src/main/kotlin/no/java/moresleep/talk/UpdateSession.kt index 19695d5..cc273ef 100644 --- a/src/main/kotlin/no/java/moresleep/talk/UpdateSession.kt +++ b/src/main/kotlin/no/java/moresleep/talk/UpdateSession.kt @@ -1,6 +1,9 @@ package no.java.moresleep.talk import no.java.moresleep.* +import no.java.moresleep.hooks.HookMessage +import no.java.moresleep.hooks.HookMessageType +import no.java.moresleep.hooks.HookReporter import org.jsonbuddy.JsonObject import org.jsonbuddy.pojo.JsonGenerator import javax.servlet.http.HttpServletResponse @@ -61,7 +64,12 @@ class UpdateSession(val data: Map?=null,val speakers:List Date: Mon, 27 Oct 2025 14:44:22 +0200 Subject: [PATCH 15/18] A little adjustment to web hook --- src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt b/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt index 799c54c..6530076 100644 --- a/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt +++ b/src/main/kotlin/no/java/moresleep/hooks/HttpHookReporter.kt @@ -1,7 +1,6 @@ package no.java.moresleep.hooks import org.jsonbuddy.pojo.JsonGenerator -import java.io.BufferedWriter import java.io.OutputStreamWriter import java.io.PrintWriter import java.net.* @@ -19,6 +18,8 @@ class HttpHookReporter(private val url:String): HookReporterInterface { printWriter.use { jsonPaylload.toJson(it) } + val inputStream = conn.getInputStream() + inputStream.bufferedReader().use { it.readText() } } } } \ No newline at end of file From 5ff8efac6518aef9d3593d45d38f99a5d039274e Mon Sep 17 00:00:00 2001 From: Anders Karlsen Date: Wed, 19 Aug 2026 18:21:15 +0200 Subject: [PATCH 16/18] Added 2026 config dates --- .../no/java/moresleep/conference/ReadConfigCommand.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/no/java/moresleep/conference/ReadConfigCommand.kt b/src/main/kotlin/no/java/moresleep/conference/ReadConfigCommand.kt index 3252345..a541125 100644 --- a/src/main/kotlin/no/java/moresleep/conference/ReadConfigCommand.kt +++ b/src/main/kotlin/no/java/moresleep/conference/ReadConfigCommand.kt @@ -6,10 +6,10 @@ import no.java.moresleep.SystemUser import no.java.moresleep.UserType class ReadConfig( - val conferenceUrl:String="https://sleepingpill.javazone.no/public/allSessions/javazone_2025", - val conferenceName:String="JavaZone 2025", - val conferenceDates:List = listOf("03.09.2025","04.09.2025"), - val workshopDate:String="02.09.2025" + val conferenceUrl:String="https://sleepingpill.javazone.no/public/allSessions/javazone_2026", + val conferenceName:String="JavaZone 2026", + val conferenceDates:List = listOf("02.09.2026","03.09.2026"), + val workshopDate:String="01.09.2026" ):ServiceResult() class ReadConfigCommand:Command { From 0e393962f024aa5ddf2410e46c58b703ecd99a44 Mon Sep 17 00:00:00 2001 From: Alexanderamiri Date: Sat, 24 Oct 2026 15:38:20 +0200 Subject: [PATCH 17/18] fix(build): drop the duplicate maven-surefire-plugin declaration pom.xml declared maven-surefire-plugin twice: an empty entry and the configured 2.19.1 one. Older Maven merged them with a warning; the Maven on current GitHub runners rejects the POM ('must be unique'), so every build of master fails before compiling. Keep only the configured declaration, which is what Maven used anyway. Co-Authored-By: Claude Opus 5.5 (1M context) --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index 13d2625..42fad94 100644 --- a/pom.xml +++ b/pom.xml @@ -108,10 +108,6 @@ - - org.apache.maven.plugins - maven-surefire-plugin - maven-compiler-plugin 1.81.8 From 03d8f4694a2b01e09c8055b9b8ec6bc44ced97d7 Mon Sep 17 00:00:00 2001 From: Alexanderamiri Date: Sat, 24 Oct 2026 15:49:25 +0200 Subject: [PATCH 18/18] ci(build): publish the edge image only from merged code maven.yaml pushed ghcr.io/javabin/moresleep:edge on every pull request run, so any open PR could replace the image other repos use for local development (javaBin/submittheforce compose.yaml). Push only for pushes and releases; pull requests still build and test. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/maven.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/maven.yaml b/.github/workflows/maven.yaml index ff76d2a..f4b43bf 100644 --- a/.github/workflows/maven.yaml +++ b/.github/workflows/maven.yaml @@ -50,5 +50,8 @@ jobs: if-no-files-found: error retention-days: 7 + # Only merged code becomes :edge (other repos' local setups pull it, e.g. + # javaBin/submittheforce compose.yaml). Pull requests build and test only. - name: Build and push docker image [edge] + if: github.event_name != 'pull_request' run: docker buildx build --push -t ghcr.io/javabin/moresleep:edge --platform linux/amd64,linux/arm64 .