| (function() { |
| const TARGET_WS_HOST = 'generativelanguage.googleapis.com'; |
| const originalWebSocket = window.WebSocket; |
|
|
| if (!originalWebSocket) { |
| console.error('[WebSocketInterceptor] Original window.WebSocket not found. Cannot apply interceptor.'); |
| return; |
| } |
|
|
| const handler = { |
| construct(target, args) { |
| let [url, protocols] = args; |
| |
| let newUrlString = typeof url === 'string' ? url : (url && typeof url.toString === 'function' ? url.toString() : null); |
| |
| let isTarget = false; |
|
|
| if (newUrlString) { |
| try { |
| |
| if (newUrlString.startsWith('ws://') || newUrlString.startsWith('wss://')) { |
| |
| const parsedUrl = new URL(newUrlString); |
| if (parsedUrl.host === TARGET_WS_HOST) { |
| isTarget = true; |
| |
| const proxyScheme = window.location.protocol === 'https:' ? 'wss' : 'ws'; |
| const proxyHost = window.location.host; |
| newUrlString = `${proxyScheme}://${proxyHost}/api-proxy${parsedUrl.pathname}${parsedUrl.search}`; |
| } |
| } |
| } catch (e) { |
| console.warn('[WebSocketInterceptor-Proxy] Error parsing WebSocket URL, using original:', url, e); |
| } |
| } else { |
| console.warn('[WebSocketInterceptor-Proxy] WebSocket URL is not a string or stringifiable. Using original.'); |
| } |
|
|
| if (isTarget) { |
| console.log('[WebSocketInterceptor-Proxy] Original WebSocket URL:', url); |
| console.log('[WebSocketInterceptor-Proxy] Redirecting to proxy URL:', newUrlString); |
| } |
|
|
| |
| |
| if (protocols) { |
| return Reflect.construct(target, [newUrlString, protocols]); |
| } else { |
| return Reflect.construct(target, [newUrlString]); |
| } |
| }, |
| get(target, prop, receiver) { |
| |
| |
| if (prop === 'prototype') { |
| return target.prototype; |
| } |
| return Reflect.get(target, prop, receiver); |
| } |
| }; |
|
|
| window.WebSocket = new Proxy(originalWebSocket, handler); |
|
|
| console.log('[WebSocketInterceptor-Proxy] Global WebSocket constructor has been wrapped using Proxy.'); |
| })(); |
|
|