wsBase.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /**
  2. * WebSocket 基础地址
  3. * - HTTPS:wss://当前页面 host/alienStore/socket(不写死域名/IP,UAT/生产/测试域名通用)
  4. * - HTTP:优先 VITE_WS_BASE;若 env 为异名 wss 则回退 ws://当前 hostname + VITE_WS_DIRECT_PORT(默认 8000)直连 store
  5. * - 不配 env 的 HTTP:同上,用当前 hostname,避免写死某台 SIT IP
  6. */
  7. export function getWebSocketBase(): string {
  8. const envBase = (import.meta.env.VITE_WS_BASE as string | undefined)?.trim();
  9. const directPort = String(import.meta.env.VITE_WS_DIRECT_PORT || "8000").replace(/^:/, "");
  10. const httpDirectWs = (hostname: string) => `ws://${hostname}:${directPort}/alienStore/socket`;
  11. if (typeof window !== "undefined" && window.location) {
  12. const isHttps = window.location.protocol === "https:";
  13. const host = window.location.host; // hostname + port(如 uat.ailien.shop)
  14. if (isHttps) {
  15. return `wss://${host}/alienStore/socket`;
  16. }
  17. const locHost = window.location.hostname;
  18. if (envBase && envBase.trim()) {
  19. const e = envBase.replace(/\/$/, "");
  20. const isLocal = locHost === "localhost" || locHost === "127.0.0.1";
  21. if (e.startsWith("wss://") && !isLocal) {
  22. try {
  23. const envHost = new URL(e.replace(/^wss:/, "https:")).hostname;
  24. if (envHost !== locHost) {
  25. return httpDirectWs(locHost);
  26. }
  27. } catch (_) {
  28. /* ignore */
  29. }
  30. }
  31. return e;
  32. }
  33. return httpDirectWs(locHost);
  34. }
  35. if (envBase) {
  36. return envBase.replace(/\/$/, "");
  37. }
  38. return `ws://127.0.0.1:${directPort}/alienStore/socket`;
  39. }