From 6e5e6830afae22dc6bea1550bdab20a164b1879b Mon Sep 17 00:00:00 2001 From: Terraform Date: Wed, 15 Apr 2026 20:21:50 +0000 Subject: [PATCH 1/6] Fix release workflow to trigger production deployment --- .github/workflows/aws_auto_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/aws_auto_release.yml b/.github/workflows/aws_auto_release.yml index f536d63..5524e16 100644 --- a/.github/workflows/aws_auto_release.yml +++ b/.github/workflows/aws_auto_release.yml @@ -155,7 +155,7 @@ jobs: if: steps.auth_check.outputs.is_authorized == 'true' && steps.check.outputs.should_release == 'true' uses: actions/setup-node@v4 with: - node-version: 20.10 + node-version: ${{ vars.node_version }} - name: Calculate new version with cumulative bumps if: steps.auth_check.outputs.is_authorized == 'true' && steps.check.outputs.should_release == 'true' From a722e8959685438740379e053f8f6b1b7764b0fd Mon Sep 17 00:00:00 2001 From: Terraform Date: Wed, 15 Apr 2026 20:23:32 +0000 Subject: [PATCH 2/6] Add production release CICD --- .github/workflows/aws_dev_release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/aws_dev_release.yml b/.github/workflows/aws_dev_release.yml index 6d088c2..e5f079b 100644 --- a/.github/workflows/aws_dev_release.yml +++ b/.github/workflows/aws_dev_release.yml @@ -45,7 +45,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 20.10 + node-version: ${{ vars.node_version }} cache: 'npm' - run: npm i - name: Build @@ -67,7 +67,7 @@ jobs: - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::368076259134:role/github-actions-role + role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).dev }} aws-region: us-east-1 - name: Login to Amazon ECR @@ -115,7 +115,7 @@ jobs: - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::368076259134:role/github-actions-role + role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).dev }} aws-region: us-east-1 - name: deploy From 92d539a6d2e424e550bc8af77a132b38dddbad33 Mon Sep 17 00:00:00 2001 From: Terraform Date: Wed, 15 Apr 2026 20:26:35 +0000 Subject: [PATCH 3/6] Add production release CICD --- .github/workflows/aws_prod_release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/aws_prod_release.yml b/.github/workflows/aws_prod_release.yml index 34b5219..d692456 100644 --- a/.github/workflows/aws_prod_release.yml +++ b/.github/workflows/aws_prod_release.yml @@ -46,7 +46,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 20.10 + node-version: ${{ vars.node_version }} cache: 'npm' - run: git config --global user.email devops@topia.io - run: git config --global user.name Devops @@ -71,7 +71,7 @@ jobs: - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::368076259134:role/github-actions-role + role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).prod }} aws-region: us-east-1 - name: Login to Amazon ECR @@ -118,7 +118,7 @@ jobs: - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::471112828260:role/github-actions-role + role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).prod }} aws-region: us-east-1 - name: deploy From 4d8e94d7efef1edcd8c48050e8e71e5408afb409 Mon Sep 17 00:00:00 2001 From: Terraform Date: Wed, 15 Apr 2026 21:25:49 +0000 Subject: [PATCH 4/6] Add production release CICD --- .github/workflows/aws_dev_release.yml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/aws_dev_release.yml b/.github/workflows/aws_dev_release.yml index e5f079b..520d06e 100644 --- a/.github/workflows/aws_dev_release.yml +++ b/.github/workflows/aws_dev_release.yml @@ -64,10 +64,18 @@ jobs: with: platforms: arm64,amd64 + - name: Get role ARN + id: get_role + env: + ARN_JSON: ${{ secrets.AWS_ROLE_ARN }} + run: | + arn=$(echo "$ARN_JSON" | jq -r '.dev') + echo "::add-mask::$arn" + echo "arn=$arn" >> $GITHUB_OUTPUT - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).dev }} + role-to-assume: ${{ steps.get_role.outputs.arn }} aws-region: us-east-1 - name: Login to Amazon ECR @@ -112,10 +120,18 @@ jobs: matrix: service: ${{ fromJson(needs.Build.outputs.service) }} steps: + - name: Get role ARN + id: get_role + env: + ARN_JSON: ${{ secrets.AWS_ROLE_ARN }} + run: | + arn=$(echo "$ARN_JSON" | jq -r '.dev') + echo "::add-mask::$arn" + echo "arn=$arn" >> $GITHUB_OUTPUT - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).dev }} + role-to-assume: ${{ steps.get_role.outputs.arn }} aws-region: us-east-1 - name: deploy From 79d0c52bc9f82a61ed315df0a8163373d3091fdc Mon Sep 17 00:00:00 2001 From: Terraform Date: Wed, 15 Apr 2026 21:27:53 +0000 Subject: [PATCH 5/6] Add production release CICD --- .github/workflows/aws_prod_release.yml | 31 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/.github/workflows/aws_prod_release.yml b/.github/workflows/aws_prod_release.yml index d692456..42011fb 100644 --- a/.github/workflows/aws_prod_release.yml +++ b/.github/workflows/aws_prod_release.yml @@ -62,18 +62,27 @@ jobs: echo "::error::Build failed" exit 1 fi - + - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 with: platforms: arm64,amd64 - + + - name: Get role ARN + id: get_role + env: + ARN_JSON: ${{ secrets.AWS_ROLE_ARN }} + run: | + arn=$(echo "$ARN_JSON" | jq -r '.dev') + echo "::add-mask::$arn" + echo "arn=$arn" >> $GITHUB_OUTPUT + - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).prod }} + role-to-assume: ${{ steps.get_role.outputs.arn }} aws-region: us-east-1 - + - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v2 @@ -115,13 +124,21 @@ jobs: matrix: service: ${{ fromJson(needs.Build.outputs.service) }} steps: + - name: Get role ARN + id: get_role + env: + ARN_JSON: ${{ secrets.AWS_ROLE_ARN }} + run: | + arn=$(echo "$ARN_JSON" | jq -r '.prod') + echo "::add-mask::$arn" + echo "arn=$arn" >> $GITHUB_OUTPUT - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: ${{ fromJSON(secrets.AWS_ROLE_ARN).prod }} + role-to-assume: ${{ steps.get_role.outputs.arn }} aws-region: us-east-1 - name: deploy run: | - aws ecs update-service --cluster ${{ env.ECS_Cluster }} --service topia-${{ env.ENV }}-${{ matrix.service }}0 --force-new-deployment - + aws ecs update-service --cluster ${{ env.ECS_Cluster }} --service topia-${{ env.ENV }}-${{ matrix.service }}0 --force-new-deployment + From 1a69b6216e3de58fa22879405f42952d9f6a6ef9 Mon Sep 17 00:00:00 2001 From: Lina Date: Wed, 15 Apr 2026 17:53:09 -0700 Subject: [PATCH 6/6] Prevent crashes from API timeouts - Add res.headersSent guard in errorHandler to prevent double-send crashes - Add unhandledRejection and uncaughtException process handlers in index.ts - Fixes app crashes when Topia public API returns 502 timeout Co-Authored-By: Claude Opus 4.6 (1M context) --- server/index.ts | 16 ++++++++++++++++ server/utils/errorHandler.ts | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/server/index.ts b/server/index.ts index c94d590..77a9b84 100644 --- a/server/index.ts +++ b/server/index.ts @@ -77,6 +77,22 @@ if (process.env.NODE_ENV !== "development") { }); } + +// Prevent crashes from unhandled promise rejections (e.g., API timeouts after response sent) +process.on("unhandledRejection", (reason, promise) => { + console.error("Unhandled Rejection:", reason); +}); + +process.on("uncaughtException", (error) => { + // ERR_HTTP_HEADERS_SENT is non-fatal — response was already sent, just log it + if ((error as any).code === "ERR_HTTP_HEADERS_SENT") { + console.error("Caught ERR_HTTP_HEADERS_SENT (response already sent):", error.message); + return; + } + console.error("Uncaught Exception:", error); + process.exit(1); +}); + app.listen(PORT, () => { console.log(`Server is running on port: ${PORT}`); }); diff --git a/server/utils/errorHandler.ts b/server/utils/errorHandler.ts index 45347a5..07748fc 100644 --- a/server/utils/errorHandler.ts +++ b/server/utils/errorHandler.ts @@ -30,11 +30,11 @@ export const errorHandler = ({ }), ); - if (res) return res.status(error.status || 500).send({ error, message, success: false }); + if (res && !res.headersSent) return res.status(error.status || 500).send({ error, message, success: false }); return { error }; } catch (e) { console.error("❌ Error printing the logs", e); - if (res) return res.status(500).send({ error: e, message, success: false }); - return { e }; + if (res && !res.headersSent) return res.status(500).send({ error: e, message, success: false }); + return { error: e }; } };