fix: normalize relay websocket endpoint
**Motivations :** - ensure client always targets the correct /ws websocket path - avoid invalid bootstrap URLs breaking relay connections **Modifications :** - sanitize bootstrap relay URLs and enforce /ws suffix when missing - update documentation to reference wss://relay235.4nkweb.com/ws exactly - align local env files with the normalized relay endpoint **Page affectées :** - src/services/service.ts - README.md - docs/INTEGRATION.md
This commit is contained in:
parent
274b19e410
commit
74093a12eb
@ -72,9 +72,9 @@ src/
|
|||||||
- **Communication**: WebSockets, PostMessage API
|
- **Communication**: WebSockets, PostMessage API
|
||||||
|
|
||||||
### **WebSocket Relay Configuration**
|
### **WebSocket Relay Configuration**
|
||||||
- Default relay runs locally on `127.0.0.1:8091` and is exposed securely via `wss://relay235.4nkweb.com`
|
- Default relay runs locally on `127.0.0.1:8091` and is exposed securely via `wss://relay235.4nkweb.com/ws`
|
||||||
- Nginx TLS termination is defined in `nginx.relay235.conf` (kept alongside the existing `nginx.dev.conf`)
|
- Nginx TLS termination is defined in `nginx.relay235.conf` (kept alongside the existing `nginx.dev.conf`)
|
||||||
- Clients must configure `VITE_BOOTSTRAPURL=wss://relay235.4nkweb.com` to avoid mixed-content issues when the app is served over HTTPS
|
- Clients must configure `VITE_BOOTSTRAPURL=wss://relay235.4nkweb.com/ws` to avoid mixed-content issues when the app is served over HTTPS
|
||||||
|
|
||||||
## 🔧 Développement
|
## 🔧 Développement
|
||||||
|
|
||||||
|
|||||||
@ -109,9 +109,9 @@ Les styles s'adaptent automatiquement :
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 1.1 Relai WebSocket
|
### 1.1 Relai WebSocket
|
||||||
- Relai principal exposé en `wss://relay235.4nkweb.com`
|
- Relai principal exposé en `wss://relay235.4nkweb.com/ws`
|
||||||
- Terminaison TLS gérée par `nginx.relay235.conf` (reverse proxy vers le service local sur `127.0.0.1:8091`)
|
- Terminaison TLS gérée par `nginx.relay235.conf` (reverse proxy vers le service local sur `127.0.0.1:8091`)
|
||||||
- Variables d’environnement cliente à utiliser : `VITE_BOOTSTRAPURL=wss://relay235.4nkweb.com`
|
- Variables d’environnement cliente à utiliser : `VITE_BOOTSTRAPURL=wss://relay235.4nkweb.com/ws`
|
||||||
|
|
||||||
### 2. Intégration personnalisée
|
### 2. Intégration personnalisée
|
||||||
```html
|
```html
|
||||||
|
|||||||
@ -24,11 +24,60 @@ import { DATABASE_CONFIG } from './database-config';
|
|||||||
export const U32_MAX = 4294967295;
|
export const U32_MAX = 4294967295;
|
||||||
|
|
||||||
const BASEURL = import.meta.env.VITE_BASEURL || `http://localhost`;
|
const BASEURL = import.meta.env.VITE_BASEURL || `http://localhost`;
|
||||||
const BOOTSTRAPURL = [import.meta.env.VITE_BOOTSTRAPURL || `${BASEURL}:8090`];
|
const BOOTSTRAPURL = sanitizeBootstrapUrls(
|
||||||
|
import.meta.env.VITE_BOOTSTRAPURL || `${BASEURL}:8090`
|
||||||
|
);
|
||||||
const STORAGEURL = import.meta.env.VITE_STORAGEURL || `${BASEURL}:8081`;
|
const STORAGEURL = import.meta.env.VITE_STORAGEURL || `${BASEURL}:8081`;
|
||||||
const BLINDBITURL = import.meta.env.VITE_BLINDBITURL || `${BASEURL}:8000`;
|
const BLINDBITURL = import.meta.env.VITE_BLINDBITURL || `${BASEURL}:8000`;
|
||||||
const DEFAULTAMOUNT = 1000n;
|
const DEFAULTAMOUNT = 1000n;
|
||||||
|
|
||||||
|
function sanitizeBootstrapUrls(rawUrls: string): string[] {
|
||||||
|
const urls = rawUrls
|
||||||
|
.split(',')
|
||||||
|
.map(url => url.trim())
|
||||||
|
.filter(url => url.length > 0)
|
||||||
|
.map(url => sanitizeBootstrapUrl(url));
|
||||||
|
|
||||||
|
if (urls.length === 0) {
|
||||||
|
throw new Error('No bootstrap relay URL configured (VITE_BOOTSTRAPURL)');
|
||||||
|
}
|
||||||
|
|
||||||
|
return urls;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sanitizeBootstrapUrl(url: string): string {
|
||||||
|
const trimmed = url.trim();
|
||||||
|
if (trimmed.length === 0) {
|
||||||
|
throw new Error('Empty bootstrap relay URL provided');
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed: URL;
|
||||||
|
try {
|
||||||
|
parsed = new URL(trimmed);
|
||||||
|
} catch (error) {
|
||||||
|
secureLogger.error('Invalid bootstrap relay URL format', error as Error, {
|
||||||
|
component: 'Service',
|
||||||
|
data: trimmed,
|
||||||
|
});
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {
|
||||||
|
throw new Error(`Invalid bootstrap relay protocol for ${trimmed}. Expected ws:// or wss://`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parsed.pathname || parsed.pathname === '/') {
|
||||||
|
parsed.pathname = '/ws';
|
||||||
|
} else if (parsed.pathname.endsWith('/ws/')) {
|
||||||
|
parsed.pathname = '/ws';
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed.search = '';
|
||||||
|
parsed.hash = '';
|
||||||
|
|
||||||
|
return parsed.toString();
|
||||||
|
}
|
||||||
|
|
||||||
// Global loading spinner functions removed - now using updateUserStatus instead
|
// Global loading spinner functions removed - now using updateUserStatus instead
|
||||||
|
|
||||||
// Helper function to update user status (can be called from static methods)
|
// Helper function to update user status (can be called from static methods)
|
||||||
@ -326,7 +375,7 @@ export default class Services {
|
|||||||
|
|
||||||
this.sdkClient = await import('../../pkg/sdk_client');
|
this.sdkClient = await import('../../pkg/sdk_client');
|
||||||
this.sdkClient.setup();
|
this.sdkClient.setup();
|
||||||
for (const wsurl of Object.values(BOOTSTRAPURL)) {
|
for (const wsurl of BOOTSTRAPURL) {
|
||||||
this.updateRelay(wsurl, '');
|
this.updateRelay(wsurl, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -617,10 +666,11 @@ export default class Services {
|
|||||||
* @param spAddress - The SP Address (value).
|
* @param spAddress - The SP Address (value).
|
||||||
*/
|
*/
|
||||||
public updateRelay(url: string, spAddress: string) {
|
public updateRelay(url: string, spAddress: string) {
|
||||||
secureLogger.info(' Updating relay ${url} with spAddress ${spAddress}', {
|
const normalizedUrl = sanitizeBootstrapUrl(url);
|
||||||
|
secureLogger.info(' Updating relay ${normalizedUrl} with spAddress ${spAddress}', {
|
||||||
component: 'Service',
|
component: 'Service',
|
||||||
});
|
});
|
||||||
this.relayAddresses[url] = spAddress;
|
this.relayAddresses[normalizedUrl] = spAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user