aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api.js6
-rw-r--r--src/wallet.js15
2 files changed, 16 insertions, 5 deletions
diff --git a/src/api.js b/src/api.js
index a12ddc6..186a0ca 100644
--- a/src/api.js
+++ b/src/api.js
@@ -76,8 +76,8 @@ const DATA_SOURCES_BY_NET = {
{ id: 'custom', label: 'Custom', type: 'auto', url: '' },
],
regtest: [
- { id: 'local', label: 'Local Fulcrum', type: 'electrum', url: 'ws://localhost:50003' },
- { id: 'localesplora', label: 'Local Esplora', type: 'esplora', base: 'http://localhost:3000', web: 'http://localhost:3000', kind: 'esplora' },
+ { id: 'local', label: 'Local Fulcrum', type: 'electrum', url: '/electrum' },
+ { id: 'localesplora', label: 'Local Esplora', type: 'esplora', base: '/esplora', web: 'http://localhost:3000', kind: 'esplora' },
{ id: 'custom', label: 'Custom', type: 'auto', url: '' },
],
};
@@ -185,7 +185,7 @@ const SP_INDEXER_PRESETS_BY_NET = {
mainnet: [{ id: 'coinos', label: 'coinos', url: 'https://sp.coinos.io' }, { id: 'custom', label: 'Custom', url: '' }],
testnet: [{ id: 'custom', label: 'Custom', url: '' }],
mutinynet: [{ id: 'custom', label: 'Custom', url: '' }],
- regtest: [{ id: 'local', label: 'Local (localhost:8888)', url: 'http://localhost:8888' }, { id: 'custom', label: 'Custom', url: '' }],
+ regtest: [{ id: 'local', label: 'Local (proxied)', url: '/sp' }, { id: 'custom', label: 'Custom', url: '' }],
};
const SP_INDEXER_DEFAULT = { mainnet: 'coinos', testnet: 'custom', mutinynet: 'custom', regtest: 'local' };
const SP_INDEXER_KEY = 'btc-wallet-sp-indexer';
diff --git a/src/wallet.js b/src/wallet.js
index bc70561..519e3e1 100644
--- a/src/wallet.js
+++ b/src/wallet.js
@@ -27,6 +27,17 @@ import { NostrSync, getSyncConfig, encryptGiftPayload, npubOf } from './nostr.js
import { isSilentPaymentAddress, decodeSilentPaymentAddress, silentPaymentScripts, silentPaymentPlaceholder, deriveSilentPaymentKeys, encodeSilentPaymentAddress, silentPaymentScan, silentPaymentOutputPrivKey, silentPaymentCandidate, bloomHas } from './silentpay.js';
import { schnorr } from '@noble/curves/secp256k1';
+// Resolve a same-origin '/path' WebSocket URL to an absolute ws(s):// URL against
+// the page. The regtest backends are proxied through the dev server as relative
+// paths (e.g. '/electrum') so the app works from a phone over the LAN/Tailscale;
+// absolute URLs (real deployments, tests) pass through untouched.
+function absWsUrl(u) {
+ if (u && u[0] === '/' && typeof location !== 'undefined') {
+ return (location.protocol === 'https:' ? 'wss://' : 'ws://') + location.host + u;
+ }
+ return u;
+}
+
// No look-ahead: stop scanning a chain at the first unused address. This wallet
// only ever exposes ONE unused address at a time (freshReceive = first unused;
// there is no "generate another address" button), so used addresses stay
@@ -528,7 +539,7 @@ export class Wallet {
this._spDisconnect();
this._spWsUrl = url;
let ws;
- try { ws = new WebSocket(url); } catch { return; }
+ try { ws = new WebSocket(absWsUrl(url)); } catch { return; }
this._spWs = ws;
ws.onopen = () => {
this.spLive = true;
@@ -1772,7 +1783,7 @@ export class Wallet {
if (getBackend() === 'electrum') {
if (!this._wsCandidates || !this._wsCandidates.length) { this._wsCandidates = electrumCandidates(this.netName); this._wsCandIdx = 0; }
const list = this._wsCandidates;
- return list.length ? list[(this._wsCandIdx || 0) % list.length] : null;
+ return list.length ? absWsUrl(list[(this._wsCandIdx || 0) % list.length]) : null;
}
return null;
}