From 4a97e36299ed823dfeb57ae2a00e0bd49f146772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 5 May 2026 15:20:28 +0100 Subject: [PATCH 1/6] fetch with cors proxy --- src/lib/lnurl.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/lnurl.ts b/src/lib/lnurl.ts index f4f19c44..a7dec42b 100644 --- a/src/lib/lnurl.ts +++ b/src/lib/lnurl.ts @@ -26,6 +26,11 @@ type LnUrlCallbackResponse = { pr: string } +const fetchWithCorsProxy = (url: string, options?: RequestInit): Promise => { + const proxyUrl = `https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=${url}` + return fetch(proxyUrl, options) +} + const checkResponse = (response: Response): Promise => { if (!response.ok) return Promise.reject(response) return response.json() @@ -41,7 +46,7 @@ const checkLnUrlResponse = (amount: number, data: LnUrlResponse) => { const fetchLnUrlInvoice = async (amount: number, note: string, data: LnUrlResponse) => { let url = `${data.callback}?amount=${amount}` if (note) url += `&comment=${note}` - const res = await fetch(url).then(checkResponse) + const res = await fetchWithCorsProxy(url).then(checkResponse) return res.pr } @@ -78,7 +83,7 @@ export const getCallbackUrl = (lnurl: string): string => { export const checkLnUrlConditions = (lnurl: string): Promise => { return new Promise((resolve, reject) => { const url = getCallbackUrl(lnurl) - fetch(url) + fetchWithCorsProxy(url) .then(checkResponse) .then(resolve) .catch(reject) @@ -89,7 +94,7 @@ export const fetchInvoice = (lnurl: string, sats: number, note: string): Promise return new Promise((resolve, reject) => { const url = getCallbackUrl(lnurl) const amount = Math.round(sats * 1000) // millisatoshis - fetch(url) + fetchWithCorsProxy(url) .then(checkResponse) .then((data) => checkLnUrlResponse(amount, data)) .then((data) => fetchLnUrlInvoice(amount, note, data)) @@ -101,7 +106,7 @@ export const fetchInvoice = (lnurl: string, sats: number, note: string): Promise export const fetchArkAddress = (lnurl: string): Promise => { return new Promise((resolve, reject) => { const url = getCallbackUrl(lnurl) + '?method=ark' - fetch(url) + fetchWithCorsProxy(url) .then(checkResponse) .then(resolve) .catch(reject) From 3e758e10de18045298b09ff2127a886cd6c200d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 5 May 2026 15:28:31 +0100 Subject: [PATCH 2/6] encode url --- src/lib/lnurl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/lnurl.ts b/src/lib/lnurl.ts index a7dec42b..3cb3f9f2 100644 --- a/src/lib/lnurl.ts +++ b/src/lib/lnurl.ts @@ -27,7 +27,7 @@ type LnUrlCallbackResponse = { } const fetchWithCorsProxy = (url: string, options?: RequestInit): Promise => { - const proxyUrl = `https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=${url}` + const proxyUrl = `https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=${encodeURIComponent(url)}` return fetch(proxyUrl, options) } From 239597d3926308dfb7dc2edcff684b7071170dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 5 May 2026 17:13:53 +0100 Subject: [PATCH 3/6] fix tests --- src/lib/constants.ts | 1 + src/lib/lnurl.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index c6334ffe..5354feb0 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -13,6 +13,7 @@ export const maxPercentage = import.meta.env.VITE_MAX_PERCENTAGE ?? 10 export const psaMessage = import.meta.env.VITE_PSA_MESSAGE ?? '' export const enableChainSwapsReceive = import.meta.env.VITE_CHAIN_SWAPS_RECEIVE_ENABLED === 'true' export const lnurlServerUrl: string | undefined = import.meta.env.VITE_LNURL_SERVER_URL +export const corsProxyUrl = 'https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=' export const defaultArkServer = () => { if (import.meta.env.VITE_ARK_SERVER) return import.meta.env.VITE_ARK_SERVER diff --git a/src/lib/lnurl.ts b/src/lib/lnurl.ts index 3cb3f9f2..66952c2c 100644 --- a/src/lib/lnurl.ts +++ b/src/lib/lnurl.ts @@ -1,4 +1,5 @@ import { bech32, utf8 } from '@scure/base' +import { corsProxyUrl } from './constants' const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ @@ -27,7 +28,8 @@ type LnUrlCallbackResponse = { } const fetchWithCorsProxy = (url: string, options?: RequestInit): Promise => { - const proxyUrl = `https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=${encodeURIComponent(url)}` + // don't use proxy in tests to avoid CORS issues with Playwright's request interception + const proxyUrl = process.env.PLAYWRIGHT_TEST === '1' ? url : `${corsProxyUrl}${encodeURIComponent(url)}` return fetch(proxyUrl, options) } From 855af8d045156065c339478c207179ee8b45bea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 5 May 2026 18:15:42 +0100 Subject: [PATCH 4/6] fix --- src/lib/constants.ts | 3 ++- src/lib/lnurl.ts | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 5354feb0..ba75824a 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -13,7 +13,8 @@ export const maxPercentage = import.meta.env.VITE_MAX_PERCENTAGE ?? 10 export const psaMessage = import.meta.env.VITE_PSA_MESSAGE ?? '' export const enableChainSwapsReceive = import.meta.env.VITE_CHAIN_SWAPS_RECEIVE_ENABLED === 'true' export const lnurlServerUrl: string | undefined = import.meta.env.VITE_LNURL_SERVER_URL -export const corsProxyUrl = 'https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=' +// export const corsProxyUrl = 'https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=' +export const corsProxyUrl = 'http://localhost:8787/proxy?apiurl=' export const defaultArkServer = () => { if (import.meta.env.VITE_ARK_SERVER) return import.meta.env.VITE_ARK_SERVER diff --git a/src/lib/lnurl.ts b/src/lib/lnurl.ts index 66952c2c..c148762e 100644 --- a/src/lib/lnurl.ts +++ b/src/lib/lnurl.ts @@ -28,8 +28,10 @@ type LnUrlCallbackResponse = { } const fetchWithCorsProxy = (url: string, options?: RequestInit): Promise => { + console.log('Fetching URL with CORS proxy:', url) // don't use proxy in tests to avoid CORS issues with Playwright's request interception - const proxyUrl = process.env.PLAYWRIGHT_TEST === '1' ? url : `${corsProxyUrl}${encodeURIComponent(url)}` + const isPlaywrightTest = typeof process !== 'undefined' && process?.env?.PLAYWRIGHT_TEST === '1' + const proxyUrl = isPlaywrightTest ? url : `${corsProxyUrl}${encodeURIComponent(url)}` return fetch(proxyUrl, options) } From 50346ffcb5efd4c3ad036d9d2a2f1fb17ac3e3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Tue, 5 May 2026 18:16:17 +0100 Subject: [PATCH 5/6] remove console.log --- src/lib/lnurl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/lnurl.ts b/src/lib/lnurl.ts index c148762e..790b4222 100644 --- a/src/lib/lnurl.ts +++ b/src/lib/lnurl.ts @@ -28,7 +28,6 @@ type LnUrlCallbackResponse = { } const fetchWithCorsProxy = (url: string, options?: RequestInit): Promise => { - console.log('Fetching URL with CORS proxy:', url) // don't use proxy in tests to avoid CORS issues with Playwright's request interception const isPlaywrightTest = typeof process !== 'undefined' && process?.env?.PLAYWRIGHT_TEST === '1' const proxyUrl = isPlaywrightTest ? url : `${corsProxyUrl}${encodeURIComponent(url)}` From 76c153c3cc94661a70c7afc5b01071bb9adae3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bordalo?= Date: Wed, 6 May 2026 13:26:10 +0100 Subject: [PATCH 6/6] fix tests --- src/lib/constants.ts | 2 -- src/lib/lnurl.ts | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index ba75824a..c6334ffe 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -13,8 +13,6 @@ export const maxPercentage = import.meta.env.VITE_MAX_PERCENTAGE ?? 10 export const psaMessage = import.meta.env.VITE_PSA_MESSAGE ?? '' export const enableChainSwapsReceive = import.meta.env.VITE_CHAIN_SWAPS_RECEIVE_ENABLED === 'true' export const lnurlServerUrl: string | undefined = import.meta.env.VITE_LNURL_SERVER_URL -// export const corsProxyUrl = 'https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=' -export const corsProxyUrl = 'http://localhost:8787/proxy?apiurl=' export const defaultArkServer = () => { if (import.meta.env.VITE_ARK_SERVER) return import.meta.env.VITE_ARK_SERVER diff --git a/src/lib/lnurl.ts b/src/lib/lnurl.ts index 790b4222..75429bbf 100644 --- a/src/lib/lnurl.ts +++ b/src/lib/lnurl.ts @@ -1,5 +1,6 @@ import { bech32, utf8 } from '@scure/base' -import { corsProxyUrl } from './constants' + +const corsProxyUrl = 'https://cors-header-proxy.bordalix.workers.dev/proxy?apiurl=' const emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/