Use addEventListener fetch pattern for wws

- 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 <noreply@anthropic.com>
This commit is contained in:
2025-12-15 06:03:42 +01:00
parent 3fcebac27f
commit 838cac2bbf
3 changed files with 72 additions and 68 deletions

View File

@@ -1,7 +1,7 @@
// Health check and API info endpoint // Health check and API info endpoint
// Path: /api // Path: /api
async function handler(request) { const handler = (request) => {
const corsHeaders = { const corsHeaders = {
'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
@@ -10,10 +10,14 @@ async function handler(request) {
} }
if (request.method === 'OPTIONS') { 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', status: 'ok',
service: 'mylder-wws', service: 'mylder-wws',
version: '1.0.0', version: '1.0.0',
@@ -31,10 +35,12 @@ async function handler(request) {
] ]
} }
return new Response(JSON.stringify(response, null, 2), { let response = new Response(JSON.stringify(data, null, 2))
headers: corsHeaders response.headers.set('Content-Type', 'application/json')
}) response.headers.set('Access-Control-Allow-Origin', '*')
return response
} }
// ES Module export for wws addEventListener('fetch', event => {
export default handler return event.respondWith(handler(event.request))
})

View File

@@ -1,23 +1,20 @@
// Chat proxy - routes requests to n8n workflow // Chat proxy - routes requests to n8n workflow
// Path: /chat // Path: /chat
async function handler(request) { const handler = async (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'
}
if (request.method === 'OPTIONS') { 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') { if (request.method !== 'POST') {
return new Response(JSON.stringify({ error: 'Method not allowed' }), { let response = new Response(JSON.stringify({ error: 'Method not allowed' }))
status: 405, response.headers.set('Content-Type', 'application/json')
headers: corsHeaders response.headers.set('Access-Control-Allow-Origin', '*')
}) return response
} }
try { try {
@@ -28,10 +25,10 @@ async function handler(request) {
const provider = body.provider || 'zai' const provider = body.provider || 'zai'
if (!message) { if (!message) {
return new Response(JSON.stringify({ error: 'Message is required' }), { let response = new Response(JSON.stringify({ error: 'Message is required' }))
status: 400, response.headers.set('Content-Type', 'application/json')
headers: corsHeaders response.headers.set('Access-Control-Allow-Origin', '*')
}) return response
} }
// Forward to n8n webhook // Forward to n8n webhook
@@ -50,25 +47,27 @@ async function handler(request) {
const result = await n8nResponse.json() const result = await n8nResponse.json()
return new Response(JSON.stringify({ let response = new Response(JSON.stringify({
success: true, success: true,
response: result.response || result, response: result.response || result,
provider: provider, provider: provider,
timestamp: new Date().toISOString() timestamp: new Date().toISOString()
}), { }))
headers: corsHeaders response.headers.set('Content-Type', 'application/json')
}) response.headers.set('Access-Control-Allow-Origin', '*')
return response
} catch (error) { } catch (error) {
return new Response(JSON.stringify({ let response = new Response(JSON.stringify({
success: false, success: false,
error: error.message || 'Internal server error' error: error.message || 'Internal server error'
}), { }))
status: 500, response.headers.set('Content-Type', 'application/json')
headers: corsHeaders response.headers.set('Access-Control-Allow-Origin', '*')
}) return response
} }
} }
// ES Module export for wws addEventListener('fetch', event => {
export default handler return event.respondWith(handler(event.request))
})

View File

@@ -1,28 +1,26 @@
// Webhook receiver for external integrations // Webhook receiver for external integrations
// Path: /webhook // Path: /webhook
async function handler(request) { const handler = async (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'
}
if (request.method === 'OPTIONS') { 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 // GET request - return webhook info
if (request.method === 'GET') { if (request.method === 'GET') {
return new Response(JSON.stringify({ let response = new Response(JSON.stringify({
endpoint: '/webhook', endpoint: '/webhook',
method: 'POST', method: 'POST',
supported_sources: ['gitea', 'stripe', 'supabase', 'default'], supported_sources: ['gitea', 'stripe', 'supabase', 'default'],
usage: 'POST /webhook?source=gitea with JSON body' usage: 'POST /webhook?source=gitea with JSON body'
}, null, 2), { }, null, 2))
headers: corsHeaders response.headers.set('Content-Type', 'application/json')
}) response.headers.set('Access-Control-Allow-Origin', '*')
return response
} }
// POST request - receive and forward webhook // POST request - receive and forward webhook
@@ -42,8 +40,9 @@ async function handler(request) {
// Get source from query params // Get source from query params
let source = 'default' let source = 'default'
if (request.url && request.url.indexOf('?') !== -1) { const reqUrl = request.url || ''
const queryString = request.url.split('?')[1] if (reqUrl.indexOf('?') !== -1) {
const queryString = reqUrl.split('?')[1]
if (queryString) { if (queryString) {
const params = queryString.split('&') const params = queryString.split('&')
for (let i = 0; i < params.length; i++) { for (let i = 0; i < params.length; i++) {
@@ -75,35 +74,35 @@ async function handler(request) {
payload: payload, payload: payload,
received_at: timestamp received_at: timestamp
}) })
}).catch(function(err) {
console.error('Forward failed:', err)
}) })
return new Response(JSON.stringify({ let response = new Response(JSON.stringify({
received: true, received: true,
source: source, source: source,
timestamp: timestamp timestamp: timestamp
}), { }))
headers: corsHeaders response.headers.set('Content-Type', 'application/json')
}) response.headers.set('Access-Control-Allow-Origin', '*')
return response
} catch (error) { } catch (error) {
return new Response(JSON.stringify({ let response = new Response(JSON.stringify({
received: false, received: false,
error: error.message || 'Parse error' error: error.message || 'Parse error'
}), { }))
status: 400, response.headers.set('Content-Type', 'application/json')
headers: corsHeaders response.headers.set('Access-Control-Allow-Origin', '*')
}) return response
} }
} }
// Method not allowed // Method not allowed
return new Response(JSON.stringify({ error: 'Method not allowed' }), { let response = new Response(JSON.stringify({ error: 'Method not allowed' }))
status: 405, response.headers.set('Content-Type', 'application/json')
headers: corsHeaders response.headers.set('Access-Control-Allow-Origin', '*')
}) return response
} }
// ES Module export for wws addEventListener('fetch', event => {
export default handler return event.respondWith(handler(event.request))
})