UNPKG

nativescript-dna-netservices

Version:

NativeScript plugin for Bonjour/ZeroConf and network monitoring. RxJS based APIs for Android and iOS.

123 lines 5.81 kB
import { Observable, from, of, throwError } from "rxjs"; import { finalize, mergeMap, catchError } from "rxjs/operators"; import { android as androidApplication } from "@nativescript/core/application"; import * as Connectivity from "@nativescript/core/connectivity"; import * as Permissions from "nativescript-permissions"; import { addressType, networkType } from "./netservice.common"; export class NetworkMonitorService { static monitorNetwork() { const netMon = new Observable(observer => { observer.next(NetworkMonitorService.getNetworkStatus()); Connectivity.startMonitoring((newConnectionType) => { observer.next(NetworkMonitorService.getNetworkStatusFromType(newConnectionType)); }); return () => { Connectivity.stopMonitoring(); }; }); return netMon.pipe(mergeMap(value => value), finalize(() => Connectivity.stopMonitoring())); } static getWiFiIpAddress() { const ipAddrObserable = new Observable(observer => { const context = android.content.Context; const wifiManager = androidApplication.context.getSystemService(context.WIFI_SERVICE); const javaByteOrder = java.nio.ByteOrder; const wInfo = wifiManager.getConnectionInfo(); let ipAddress = wInfo.getIpAddress(); if (javaByteOrder.nativeOrder().equals(javaByteOrder.LITTLE_ENDIAN)) { ipAddress = java.lang.Integer.reverseBytes(ipAddress); } const wifiIpAddress = java.lang.String.format("%d.%d.%d.%d", [ (ipAddress >> 24) & 0xff, (ipAddress >> 16) & 0xff, (ipAddress >> 8) & 0xff, ipAddress & 0xff ]); observer.next(wifiIpAddress); observer.complete(); }); return NetworkMonitorService.requestNetworkPermission().pipe(mergeMap(() => ipAddrObserable)); } static getCellularIpAddress() { const ipAddrObserable = new Observable(observer => { try { const javaCollections = java.util.Collections; const interfaces = javaCollections.list(java.net.NetworkInterface.getNetworkInterfaces()); for (let i = 0; i < interfaces.size(); i++) { const addrs = javaCollections.list(interfaces.get(i).getInetAddresses()); for (let a = 0; a < addrs.size(); a++) { if (!addrs.get(a).isLoopbackAddress()) { observer.next(addrs.get(a).getHostAddress()); observer.complete(); break; } } } } catch (Exception) { } observer.next(""); observer.complete(); }); return NetworkMonitorService.requestNetworkPermission().pipe(mergeMap(() => ipAddrObserable)); } static getNetworkStatus() { return NetworkMonitorService.getNetworkStatusFromType(Connectivity.getConnectionType()); } static dumpIpAddress() { const ipAddrObserable = new Observable((observer) => { let addresses = []; const NI = java.net.NetworkInterface; try { for (let en = NI.getNetworkInterfaces(); en.hasMoreElements();) { let intf = en.nextElement(); for (let adr = intf.getInetAddresses(); adr.hasMoreElements();) { const inetAddress = adr.nextElement(); { let ipAddr = inetAddress.getHostAddress().toString(); const pos = ipAddr.search("%"); if (pos !== -1) ipAddr = ipAddr.substr(0, pos); const displayName = intf.getDisplayName(); const type = inetAddress.getClass() === java.net.Inet4Address.class ? addressType.IPv4 : addressType.IPv6; addresses.push({ address: ipAddr, adapterName: displayName, type: type }); } } } } catch (ex) { } observer.next(addresses); observer.complete(); }); return NetworkMonitorService.requestNetworkPermission().pipe(mergeMap(() => ipAddrObserable)); } static getNetworkStatusFromType(cType) { switch (cType) { case Connectivity.connectionType.wifi: return NetworkMonitorService.getWiFiIpAddress().pipe(mergeMap(ipAddr => of({ connType: networkType.wifi, ipAddress: ipAddr }))); case Connectivity.connectionType.mobile: return NetworkMonitorService.getCellularIpAddress().pipe(mergeMap(ipAddr => of({ connType: networkType.cellular, ipAddress: ipAddr }))); default: return of({ connType: networkType.none, ipAddress: "" }); } } static requestNetworkPermission() { return from(Permissions.requestPermission([ "android.permission.ACCESS_NETWORK_STATE", "android.permission.INTERNET", "android.permission.ACCESS_WIFI_STATE" ], "App requires Network permissions")).pipe(catchError(() => throwError("Failed to get required permissions."))); } } //# sourceMappingURL=network-monitor-service.android.js.map