From 838cac2bbfe88bacf4022e062e4a510a094f46a5 Mon Sep 17 00:00:00 2001 From: christiankrag Date: Mon, 15 Dec 2025 06:03:42 +0100 Subject: [PATCH] Use addEventListener fetch pattern for wws MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Switch to addEventListener('fetch') pattern - Use response.headers.set() instead of headers object - wws uses Fetch API event handler pattern - Avoid URL constructor (not available in wws) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- api/index.js | 22 +++++++++++------ chat/index.js | 55 +++++++++++++++++++++--------------------- webhook/index.js | 63 ++++++++++++++++++++++++------------------------ 3 files changed, 72 insertions(+), 68 deletions(-) diff --git a/api/index.js b/api/index.js index c842f2d..741dcdd 100644 --- a/api/index.js +++ b/api/index.js @@ -1,7 +1,7 @@ // Health check and API info endpoint // Path: /api -async function handler(request) { +const handler = (request) => { const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', @@ -10,10 +10,14 @@ async function handler(request) { } if (request.method === 'OPTIONS') { - return new Response('', { headers: corsHeaders }) + let response = new Response('') + response.headers.set('Access-Control-Allow-Origin', '*') + response.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization') + return response } - const response = { + const data = { status: 'ok', service: 'mylder-wws', version: '1.0.0', @@ -31,10 +35,12 @@ async function handler(request) { ] } - return new Response(JSON.stringify(response, null, 2), { - headers: corsHeaders - }) + let response = new Response(JSON.stringify(data, null, 2)) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } -// ES Module export for wws -export default handler +addEventListener('fetch', event => { + return event.respondWith(handler(event.request)) +}) diff --git a/chat/index.js b/chat/index.js index 19b2a2d..8dd4a82 100644 --- a/chat/index.js +++ b/chat/index.js @@ -1,23 +1,20 @@ // Chat proxy - routes requests to n8n workflow // Path: /chat -async function handler(request) { - const corsHeaders = { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', - 'Access-Control-Allow-Headers': 'Content-Type, Authorization', - 'Content-Type': 'application/json' - } - +const handler = async (request) => { if (request.method === 'OPTIONS') { - return new Response('', { headers: corsHeaders }) + let response = new Response('') + response.headers.set('Access-Control-Allow-Origin', '*') + response.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization') + return response } if (request.method !== 'POST') { - return new Response(JSON.stringify({ error: 'Method not allowed' }), { - status: 405, - headers: corsHeaders - }) + let response = new Response(JSON.stringify({ error: 'Method not allowed' })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } try { @@ -28,10 +25,10 @@ async function handler(request) { const provider = body.provider || 'zai' if (!message) { - return new Response(JSON.stringify({ error: 'Message is required' }), { - status: 400, - headers: corsHeaders - }) + let response = new Response(JSON.stringify({ error: 'Message is required' })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } // Forward to n8n webhook @@ -50,25 +47,27 @@ async function handler(request) { const result = await n8nResponse.json() - return new Response(JSON.stringify({ + let response = new Response(JSON.stringify({ success: true, response: result.response || result, provider: provider, timestamp: new Date().toISOString() - }), { - headers: corsHeaders - }) + })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } catch (error) { - return new Response(JSON.stringify({ + let response = new Response(JSON.stringify({ success: false, error: error.message || 'Internal server error' - }), { - status: 500, - headers: corsHeaders - }) + })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } } -// ES Module export for wws -export default handler +addEventListener('fetch', event => { + return event.respondWith(handler(event.request)) +}) diff --git a/webhook/index.js b/webhook/index.js index 6c8bfcd..f913284 100644 --- a/webhook/index.js +++ b/webhook/index.js @@ -1,28 +1,26 @@ // Webhook receiver for external integrations // Path: /webhook -async function handler(request) { - const corsHeaders = { - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', - 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Webhook-Secret', - 'Content-Type': 'application/json' - } - +const handler = async (request) => { if (request.method === 'OPTIONS') { - return new Response('', { headers: corsHeaders }) + let response = new Response('') + response.headers.set('Access-Control-Allow-Origin', '*') + response.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Webhook-Secret') + return response } // GET request - return webhook info if (request.method === 'GET') { - return new Response(JSON.stringify({ + let response = new Response(JSON.stringify({ endpoint: '/webhook', method: 'POST', supported_sources: ['gitea', 'stripe', 'supabase', 'default'], usage: 'POST /webhook?source=gitea with JSON body' - }, null, 2), { - headers: corsHeaders - }) + }, null, 2)) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } // POST request - receive and forward webhook @@ -42,8 +40,9 @@ async function handler(request) { // Get source from query params let source = 'default' - if (request.url && request.url.indexOf('?') !== -1) { - const queryString = request.url.split('?')[1] + const reqUrl = request.url || '' + if (reqUrl.indexOf('?') !== -1) { + const queryString = reqUrl.split('?')[1] if (queryString) { const params = queryString.split('&') for (let i = 0; i < params.length; i++) { @@ -75,35 +74,35 @@ async function handler(request) { payload: payload, received_at: timestamp }) - }).catch(function(err) { - console.error('Forward failed:', err) }) - return new Response(JSON.stringify({ + let response = new Response(JSON.stringify({ received: true, source: source, timestamp: timestamp - }), { - headers: corsHeaders - }) + })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } catch (error) { - return new Response(JSON.stringify({ + let response = new Response(JSON.stringify({ received: false, error: error.message || 'Parse error' - }), { - status: 400, - headers: corsHeaders - }) + })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } } // Method not allowed - return new Response(JSON.stringify({ error: 'Method not allowed' }), { - status: 405, - headers: corsHeaders - }) + let response = new Response(JSON.stringify({ error: 'Method not allowed' })) + response.headers.set('Content-Type', 'application/json') + response.headers.set('Access-Control-Allow-Origin', '*') + return response } -// ES Module export for wws -export default handler +addEventListener('fetch', event => { + return event.respondWith(handler(event.request)) +})