outbounds-tab-helpers.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { OutboundProtocols as Protocols } from '@/schemas/primitives';
  2. import type { OutboundTestState, OutboundTrafficRow } from '@/hooks/useXraySetting';
  3. import type { OutboundRow } from './outbounds-tab-types';
  4. export function outboundAddresses(o: OutboundRow): string[] {
  5. const settings = o.settings as Record<string, unknown> | undefined;
  6. switch (o.protocol) {
  7. case Protocols.VMess: {
  8. const serverObj = settings?.vnext as Array<{ address: string; port: number }> | undefined;
  9. return serverObj ? serverObj.map((s) => `${s.address}:${s.port}`) : [];
  10. }
  11. case Protocols.VLESS:
  12. return [`${settings?.address || ''}:${settings?.port || ''}`];
  13. case Protocols.HTTP:
  14. case Protocols.Socks:
  15. case Protocols.Shadowsocks:
  16. case Protocols.Trojan: {
  17. const serverObj = settings?.servers as Array<{ address: string; port: number }> | undefined;
  18. return serverObj ? serverObj.map((s) => `${s.address}:${s.port}`) : [];
  19. }
  20. case Protocols.DNS: {
  21. const addr = (settings?.rewriteAddress as string) || (settings?.address as string) || '';
  22. const port = (settings?.rewritePort as string | number) || (settings?.port as string | number) || '';
  23. return addr || port ? [`${addr}:${port}`] : [];
  24. }
  25. case Protocols.Wireguard:
  26. return (((settings?.peers as Array<{ endpoint?: string }>) || []).map((p) => p.endpoint || '').filter(Boolean));
  27. default:
  28. return [];
  29. }
  30. }
  31. export function isUntestable(o: OutboundRow): boolean {
  32. if (!o) return true;
  33. if (o.protocol === Protocols.Blackhole || o.protocol === Protocols.Loopback || o.tag === 'blocked') return true;
  34. // freedom ("direct") and dns aren't proxies — a TCP dial has no endpoint and
  35. // an HTTP probe would only measure the host's own direct reachability, so
  36. // they're untestable in every mode.
  37. if (o.protocol === Protocols.Freedom || o.protocol === Protocols.DNS) return true;
  38. return false;
  39. }
  40. export function showSecurity(security?: string): boolean {
  41. return security === 'tls' || security === 'reality';
  42. }
  43. export function trafficFor(outboundsTraffic: OutboundTrafficRow[], o: OutboundRow): { up: number; down: number } {
  44. const tr = outboundsTraffic.find((x) => x.tag === o.tag);
  45. return { up: tr?.up || 0, down: tr?.down || 0 };
  46. }
  47. export function isTesting<K extends string | number>(states: Record<K, OutboundTestState>, idx: K): boolean {
  48. return !!states?.[idx]?.testing;
  49. }
  50. export function testResult<K extends string | number>(states: Record<K, OutboundTestState>, idx: K) {
  51. return states?.[idx]?.result || null;
  52. }