diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs index 34c634da7..d943691fa 100644 --- a/ecosystem.config.cjs +++ b/ecosystem.config.cjs @@ -107,6 +107,20 @@ module.exports = { COMPUTE_MODE: 'local', ALWAYS_ON: 'true' } + }, + // === CONTINUOUS BUILDING === + { + name: 'project-genie', + script: './scripts/genesis.cjs', + autorestart: true, + watch: false, + max_memory_restart: '300M', + restart_delay: 5000, + env: { + GENESIS_LOOP: 'true', + FORCE_MUTATION: 'true', + ALWAYS_ON: 'true' + } } ] }; diff --git a/workers/index.js b/workers/index.mjs similarity index 96% rename from workers/index.js rename to workers/index.mjs index c55c3b2b6..5cccab61e 100644 --- a/workers/index.js +++ b/workers/index.mjs @@ -105,9 +105,15 @@ async function getJWKS() { // ─── JWT Validation (native Web Crypto) ────────────────────────────────────── function base64UrlDecode(str) { - str = str.replace(/-/g, '+').replace(/_/g, '/'); - while (str.length % 4) str += '='; - return Uint8Array.from(atob(str), c => c.charCodeAt(0)); + const b64 = str.replaceAll('-', '+').replaceAll('_', '/'); + const padded = b64.padEnd(b64.length + (4 - (b64.length % 4)) % 4, '='); + const bin = atob(padded); + const len = bin.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = bin.charCodeAt(i); + } + return bytes; } async function validateJWT(request) { diff --git a/wrangler.toml b/wrangler.toml index cd821b031..0bfe54681 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,29 +1,17 @@ name = "yennefer" -main = "workers/index.js" -compatibility_date = "2024-09-23" +main = "workers/index.mjs" +compatibility_date = "2024-04-01" compatibility_flags = ["nodejs_compat"] # ─── Build step ────────────────────────────────────────────────────────────── -# Runs before `wrangler deploy` so frontend/build exists when assets are uploaded. [build] -# Installs frontend deps and builds the SPA so frontend/build exists before -# `wrangler deploy` uploads assets. NODE_OPTIONS is required for -# react-scripts 5.x + Node 18+ (webpack 4 OpenSSL 3.0 compatibility). -command = "cd frontend && npm install --include=dev && GENERATE_SOURCEMAP=false CI=false NODE_OPTIONS=--openssl-legacy-provider npm run build" +command = "cd yennefer-observatory && npm install --legacy-peer-deps && npm run build" # ─── Static Assets (React SPA build output) ────────────────────────────────── -# Built by `npm run build` (root package.json) before every `wrangler deploy`. -# Cloudflare Workers Builds CI runs that script automatically if present. -# The ASSETS binding serves the React bundle with proper cache headers and -# falls back to index.html for client-side routing. [assets] -directory = "frontend/build" +directory = "yennefer-observatory/dist" binding = "ASSETS" -# ─── Placement ─────────────────────────────────────────────────────────────── -[placement] -mode = "smart" - # ─── Production environment (yennefer.quest) ───────────────────────────────── # BACKEND_URL is set as a Cloudflare Worker secret (not a plain var) so it # stays encrypted and is never committed to source: