From 3589406bacc7e2d658e12c4c625b67e6b3ca54cb Mon Sep 17 00:00:00 2001 From: jwinterm Date: Wed, 24 Dec 2025 16:45:35 -0500 Subject: [PATCH] fix payment addy bug --- README.md | 33 +++++++++++++++++++++++++++------ src/game/gameModeManager.js | 15 +++++++++++++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f954572..d6346e5 100644 --- a/README.md +++ b/README.md @@ -392,14 +392,35 @@ The systemd hardening options: - `PrivateTmp=yes` - isolates /tmp - `ReadWritePaths` - whitelists writable directories -### Reverse Proxy +### Reverse Proxy (Nginx Proxy Manager) -Use your existing reverse proxy (Nginx Proxy Manager, Caddy, Traefik, etc.) to forward traffic to port 3000. Key settings for WebSocket support: +If using Nginx Proxy Manager: -- Enable WebSocket proxying -- Set timeout to at least 86400s for long-lived connections -- Forward `/socket.io/` path to the backend -- Optionally protect `/admin.html` with authentication +1. **Add Proxy Host** + - Domain Names: `yourdomain.com` + - Scheme: `http` + - Forward Hostname/IP: Your server's LAN IP (e.g., `192.168.1.100`) + - Forward Port: `3000` + - Enable "Websockets Support" toggle + +2. **SSL Tab** + - Request a new SSL certificate + - Enable "Force SSL" + +3. **Advanced Tab** - Paste this config for WebSocket support: + +```nginx +location /socket.io/ { + proxy_pass http://192.168.1.100:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; +} +``` --- diff --git a/src/game/gameModeManager.js b/src/game/gameModeManager.js index 9a98111..7a9575f 100644 --- a/src/game/gameModeManager.js +++ b/src/game/gameModeManager.js @@ -333,6 +333,17 @@ class GameModeManager { return result.rows[0] || null; } + /** + * Convert package info to JSON-safe format (BigInt price -> Number) + */ + _serializePackageInfo(packageInfo) { + if (!packageInfo) return null; + return { + ...packageInfo, + price: typeof packageInfo.price === 'bigint' ? Number(packageInfo.price) : packageInfo.price + }; + } + _mapPaymentRowToRequest(row, paymentType, packageInfo) { if (!row) return null; const amount = Number(row.expected_amount); @@ -345,7 +356,7 @@ class GameModeManager { expiresAt: row.expires_at, paymentType, description: row.description, - package: packageInfo || null, + package: this._serializePackageInfo(packageInfo), reused: true }; } @@ -876,7 +887,7 @@ class GameModeManager { amountFormatted: this.formatAtomicHuman(amount, 4), currency: this.cryptoType, expiresAt: insertedRow?.expires_at || expiresAt, - package: packageInfo, + package: this._serializePackageInfo(packageInfo), paymentType, description, reused: false