From 4241fd10da5544c40f1b3c14c176a1ce12840c62 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:55:59 +0200 Subject: [PATCH] feat(error-handler): add actionable Node.js heap OOM guidance Detect probable Node.js heap out-of-memory failures from log patterns and common build exit codes, then print targeted remediation hints instead of only a generic SIGABRT/SIGKILL message. - Detect OOM patterns in last log lines (Reached heap limit, JS heap OOM) - Treat node build contexts with exit 134/137/243 as likely heap issues - Suggest computed --max-old-space-size based on NODE_OPTIONS, var_ram, or MemTotal (clamped to 1024..4096 MB) - Recommend calling setup_nodejs before build steps so defaults apply --- misc/error_handler.func | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/misc/error_handler.func b/misc/error_handler.func index dd816dc22..53ad6e215 100644 --- a/misc/error_handler.func +++ b/misc/error_handler.func @@ -313,6 +313,55 @@ error_handler() { echo -e "${TAB}-----------------------------------\n" fi + # Detect probable Node.js heap OOM and print actionable guidance. + # This avoids generic SIGABRT/SIGKILL confusion for frontend build failures. + local node_oom_detected="false" + local node_build_context="false" + if [[ "$command" =~ (npm|pnpm|yarn|node|vite|turbo) ]]; then + node_build_context="true" + fi + if [[ "$exit_code" == "243" ]]; then + node_oom_detected="true" + elif [[ -n "$active_log" && -s "$active_log" ]]; then + if tail -n 200 "$active_log" 2>/dev/null | grep -Eqi 'Reached heap limit|JavaScript heap out of memory|Allocation failed - JavaScript heap out of memory|FATAL ERROR: Reached heap limit'; then + node_oom_detected="true" + fi + fi + + if [[ "$node_oom_detected" == "true" ]] || { [[ "$node_build_context" == "true" ]] && [[ "$exit_code" =~ ^(134|137)$ ]]; }; then + local heap_hint_mb="" + + # If explicitly configured, prefer the current value for troubleshooting output. + if [[ -n "${NODE_OPTIONS:-}" ]] && [[ "${NODE_OPTIONS}" =~ max-old-space-size=([0-9]+) ]]; then + heap_hint_mb="${BASH_REMATCH[1]}" + elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then + heap_hint_mb=$((var_ram * 75 / 100)) + else + local mem_kb="" + mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "") + if [[ "$mem_kb" =~ ^[0-9]+$ ]]; then + local mem_mb=$((mem_kb / 1024)) + heap_hint_mb=$((mem_mb * 75 / 100)) + fi + fi + + if [[ -z "$heap_hint_mb" ]] || ((heap_hint_mb < 1024)); then + heap_hint_mb=1024 + elif ((heap_hint_mb > 4096)); then + heap_hint_mb=4096 + fi + + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "Detected possible Node.js heap OOM during build." + msg_warn "Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" before npm/pnpm/yarn build." + msg_warn "Recommendation: call setup_nodejs before build steps so heap defaults are applied automatically." + else + echo -e "${YW}Detected possible Node.js heap OOM during build.${CL}" + echo -e "${YW}Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" before npm/pnpm/yarn build.${CL}" + echo -e "${YW}Recommendation: call setup_nodejs before build steps so heap defaults are applied automatically.${CL}" + fi + fi + # Detect context: Container (INSTALL_LOG set + inside container /root) vs Host if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then # CONTAINER CONTEXT: Copy log and create flag file for host