network.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. export type Navigator = NavigatorNetworkInformation;
  2. export declare interface NavigatorNetworkInformation {
  3. readonly connection?: NetworkInformation;
  4. }
  5. type Megabit = number;
  6. type Millisecond = number;
  7. export type EffectiveConnectionType = '2g' | '3g' | '4g' | 'slow-2g' | 'unknown';
  8. export type ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'mixed' | 'none' | 'other' | 'unknown' | 'wifi' | 'wimax';
  9. export interface NetworkInformation extends EventTarget {
  10. readonly type?: ConnectionType;
  11. readonly effectiveType?: EffectiveConnectionType;
  12. readonly downlinkMax?: Megabit;
  13. readonly downlink?: Megabit;
  14. readonly rtt?: Millisecond;
  15. readonly saveData?: boolean;
  16. onchange?: EventListener;
  17. }
  18. export function getNetworkType(): string {
  19. /* wired 有线
  20. bluetooth,
  21. wifi,
  22. 2g,3g,4g,5g...,
  23. unkown
  24. */
  25. const ua = navigator.userAgent;
  26. const ut = (navigator as Navigator).connection as NetworkInformation;
  27. let utt = ut ? (ut.type ? ut.type.toLowerCase() : ut.effectiveType.toLowerCase()) : null;
  28. if (utt) {
  29. switch (
  30. utt //bluetooth,
  31. ) {
  32. case 'cellular':
  33. case 'wimax':
  34. utt = ut ? (ut.effectiveType ? ut.effectiveType.toLowerCase() : null) : null;
  35. break;
  36. case 'wifi':
  37. break;
  38. case 'ethernet':
  39. utt = 'wired';
  40. break;
  41. case 'none':
  42. case 'other':
  43. case 'unknown':
  44. utt = null;
  45. break;
  46. default:
  47. break;
  48. }
  49. }
  50. let networkStr = utt ? utt : ua.match(/NetType\/\w+/) ? ua.match(/NetType\/\w+/)[0] : 'unknown';
  51. networkStr = networkStr.toLowerCase().replace('nettype/', '');
  52. return networkStr ? (networkStr === '3gnet' ? '3g' : networkStr) : 'unknown';
  53. }