@akbeniwal/react-native-smart-netinfo 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{ReactNativeSmartNetinfo.podspec → AKBeniwalNativeReactNativeSmartNetinfo.podspec} +1 -1
- package/android/src/main/java/com/akbeniwal/reactnativesmartnetinfo/ReactNativeSmartNetinfoModule.kt +13 -3
- package/android/src/main/java/com/akbeniwal/reactnativesmartnetinfo/ReactNativeSmartNetinfoPackage.kt +1 -0
- package/dist/SmartNetInfo.d.ts.map +1 -1
- package/dist/SmartNetInfo.js +12 -9
- package/dist/SmartNetInfo.js.map +1 -1
- package/dist/types.d.ts +4 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/getLatency.d.ts.map +1 -1
- package/dist/utils/getLatency.js +0 -1
- package/dist/utils/getLatency.js.map +1 -1
- package/ios/ReactNativeSmartNetinfo.h +1 -1
- package/ios/ReactNativeSmartNetinfo.mm +13 -3
- package/package.json +2 -2
- package/src/SmartNetInfo.ts +12 -10
- package/src/types.ts +4 -1
- package/src/utils/getLatency.ts +0 -1
|
@@ -3,7 +3,7 @@ require "json"
|
|
|
3
3
|
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
4
|
|
|
5
5
|
Pod::Spec.new do |s|
|
|
6
|
-
s.name = "
|
|
6
|
+
s.name = "AKBeniwalNativeReactNativeSmartNetinfo"
|
|
7
7
|
s.version = package["version"]
|
|
8
8
|
s.summary = package["description"]
|
|
9
9
|
s.homepage = package["homepage"]
|
package/android/src/main/java/com/akbeniwal/reactnativesmartnetinfo/ReactNativeSmartNetinfoModule.kt
CHANGED
|
@@ -28,13 +28,22 @@ class ReactNativeSmartNetinfoModule(private val reactContext: ReactApplicationCo
|
|
|
28
28
|
override fun onAvailable(network: Network) {
|
|
29
29
|
super.onAvailable(network)
|
|
30
30
|
isConnected = true
|
|
31
|
-
|
|
31
|
+
val caps = connectivityManager?.getNetworkCapabilities(network)
|
|
32
|
+
var type = "unknown"
|
|
33
|
+
if (caps != null) {
|
|
34
|
+
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
|
|
35
|
+
type = "wifi"
|
|
36
|
+
} else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
|
|
37
|
+
type = "cellular"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
sendEvent("NetworkStatusChanged", true, type)
|
|
32
41
|
}
|
|
33
42
|
|
|
34
43
|
override fun onLost(network: Network) {
|
|
35
44
|
super.onLost(network)
|
|
36
45
|
isConnected = false
|
|
37
|
-
sendEvent("NetworkStatusChanged", false)
|
|
46
|
+
sendEvent("NetworkStatusChanged", false, "none")
|
|
38
47
|
}
|
|
39
48
|
}
|
|
40
49
|
|
|
@@ -47,10 +56,11 @@ class ReactNativeSmartNetinfoModule(private val reactContext: ReactApplicationCo
|
|
|
47
56
|
}
|
|
48
57
|
}
|
|
49
58
|
|
|
50
|
-
private fun sendEvent(eventName: String, isConnected: Boolean) {
|
|
59
|
+
private fun sendEvent(eventName: String, isConnected: Boolean, type: String) {
|
|
51
60
|
try {
|
|
52
61
|
val params: WritableMap = Arguments.createMap()
|
|
53
62
|
params.putBoolean("isConnected", isConnected)
|
|
63
|
+
params.putString("type", type)
|
|
54
64
|
reactContext
|
|
55
65
|
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
56
66
|
.emit(eventName, params)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartNetInfo.d.ts","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAcjF,cAAM,mBAAmB;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAKZ;IAEF,OAAO,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"SmartNetInfo.d.ts","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAcjF,cAAM,mBAAmB;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAKZ;IAEF,OAAO,CAAC,KAAK,CAQX;IAEF,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,oBAAoB,CAAuC;IACnE,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,uBAAuB,CAAuC;IACtE,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;OAGG;IACI,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAQ3D;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAK3C;;;;;;OAMG;IACI,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAanE;;;;;OAKG;IACI,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAOhE;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkBnD;;OAEG;IACI,eAAe,IAAI,IAAI;IA6C9B;;OAEG;IACI,cAAc,IAAI,IAAI;IA+B7B,OAAO,CAAC,yBAAyB,CAoB/B;IAEF,OAAO,CAAC,oBAAoB,CAM1B;IAEF,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,gBAAgB,CAOtB;IAEF,OAAO,CAAC,iBAAiB;YA0BX,iBAAiB;IAmD/B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,eAAe;CASxB;AAED,eAAO,MAAM,YAAY,qBAA4B,CAAC;AACtD,eAAe,YAAY,CAAC"}
|
package/dist/SmartNetInfo.js
CHANGED
|
@@ -14,7 +14,7 @@ class SmartNetInfoManager {
|
|
|
14
14
|
constructor() {
|
|
15
15
|
this.pingUrlIndex = 0;
|
|
16
16
|
this.config = {
|
|
17
|
-
pingIntervalMs:
|
|
17
|
+
pingIntervalMs: 10000,
|
|
18
18
|
timeoutMs: 5000,
|
|
19
19
|
speedTestFileSizeInBytes: 90000,
|
|
20
20
|
disableAutoSpeedTest: false,
|
|
@@ -22,6 +22,7 @@ class SmartNetInfoManager {
|
|
|
22
22
|
this.state = {
|
|
23
23
|
isConnected: null,
|
|
24
24
|
isInternetReachable: null,
|
|
25
|
+
type: 'unknown',
|
|
25
26
|
latencyMs: null,
|
|
26
27
|
connectionQuality: null,
|
|
27
28
|
internetSpeed: null,
|
|
@@ -39,6 +40,7 @@ class SmartNetInfoManager {
|
|
|
39
40
|
this.updateState({
|
|
40
41
|
isConnected: false,
|
|
41
42
|
isInternetReachable: false,
|
|
43
|
+
type: 'none',
|
|
42
44
|
latencyMs: null,
|
|
43
45
|
connectionQuality: null,
|
|
44
46
|
});
|
|
@@ -46,9 +48,10 @@ class SmartNetInfoManager {
|
|
|
46
48
|
clearTimeout(this.timeoutId);
|
|
47
49
|
this.timeoutId = null;
|
|
48
50
|
}
|
|
51
|
+
this.scheduleNextCheck();
|
|
49
52
|
}
|
|
50
53
|
else {
|
|
51
|
-
this.updateState({ isConnected: true });
|
|
54
|
+
this.updateState({ isConnected: true, type: event.type || 'unknown' });
|
|
52
55
|
this.checkConnectivity().finally(() => {
|
|
53
56
|
this.scheduleNextCheck();
|
|
54
57
|
});
|
|
@@ -221,11 +224,8 @@ class SmartNetInfoManager {
|
|
|
221
224
|
}
|
|
222
225
|
if (this.config.pingIntervalMs <= 0)
|
|
223
226
|
return;
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
if (this.state.isConnected === false && this.nativeEventEmitter) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
227
|
+
// We always keep polling as a bulletproof fallback, even if native module says offline.
|
|
228
|
+
// If the native module misses an event, polling will catch the recovery.
|
|
229
229
|
// When offline (without native fallback), check more frequently (every 3 seconds) to detect recovery quickly.
|
|
230
230
|
// When online, use the configured pingIntervalMs.
|
|
231
231
|
const isOffline = this.state.isInternetReachable === false;
|
|
@@ -253,11 +253,14 @@ class SmartNetInfoManager {
|
|
|
253
253
|
const { isReachable, latencyMs } = await getLatency(currentPingUrl, actualTimeout);
|
|
254
254
|
const wasInternetReachable = this.state.isInternetReachable;
|
|
255
255
|
let nextIsConnected = this.state.isConnected;
|
|
256
|
-
if (
|
|
256
|
+
if (isReachable) {
|
|
257
|
+
nextIsConnected = true;
|
|
258
|
+
}
|
|
259
|
+
else if (this.nativeEventEmitter && this.state.isConnected !== null) {
|
|
257
260
|
nextIsConnected = this.state.isConnected;
|
|
258
261
|
}
|
|
259
262
|
else {
|
|
260
|
-
nextIsConnected =
|
|
263
|
+
nextIsConnected = false;
|
|
261
264
|
}
|
|
262
265
|
this.updateState({
|
|
263
266
|
isConnected: nextIsConnected,
|
package/dist/SmartNetInfo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartNetInfo.js","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,6BAA6B,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,SAAS,GAAG;IAChB,0CAA0C;IAC1C,iDAAiD;IACjD,sCAAsC;IACtC,iCAAiC;CAClC,CAAC;AAEF,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAE1F,MAAM,mBAAmB;IAAzB;QACU,iBAAY,GAAG,CAAC,CAAC;QACjB,WAAM,GAAiC;YAC7C,cAAc,EAAE,KAAK;YACrB,SAAS,EAAE,IAAI;YACf,wBAAwB,EAAE,KAAK;YAC/B,oBAAoB,EAAE,KAAK;SAC5B,CAAC;QAEM,UAAK,GAAiB;YAC5B,WAAW,EAAE,IAAI;YACjB,mBAAmB,EAAE,IAAI;YACzB,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,KAAK;SACtB,CAAC;QAEM,cAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;QAC5C,cAAS,GAAyC,IAAI,CAAC;QACvD,yBAAoB,GAAkC,IAAI,CAAC;QAC3D,uBAAkB,GAA8B,IAAI,CAAC;QACrD,4BAAuB,GAAkC,IAAI,CAAC;QAC9D,iBAAY,GAAG,KAAK,CAAC;QACrB,eAAU,GAAG,KAAK,CAAC;QAgKnB,8BAAyB,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"SmartNetInfo.js","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export type ConnectionQuality = 'poor' | 'good' | 'excellent';
|
|
2
|
+
export type NetworkType = 'wifi' | 'cellular' | 'none' | 'unknown';
|
|
2
3
|
export interface NetworkState {
|
|
3
4
|
/** True if the network check succeeded, false if it failed or timed out */
|
|
4
5
|
isConnected: boolean | null;
|
|
5
6
|
/** True if internet reachability check succeeded */
|
|
6
7
|
isInternetReachable: boolean | null;
|
|
8
|
+
/** The type of network connection */
|
|
9
|
+
type: NetworkType;
|
|
7
10
|
/** Round-trip ping latency in milliseconds */
|
|
8
11
|
latencyMs: number | null;
|
|
9
12
|
/** Connection quality based on latency ('poor' | 'good' | 'excellent') */
|
|
@@ -14,7 +17,7 @@ export interface NetworkState {
|
|
|
14
17
|
isTestingSpeed: boolean;
|
|
15
18
|
}
|
|
16
19
|
export interface SmartNetInfoConfig {
|
|
17
|
-
/** The interval in milliseconds to poll the connection (defaults to
|
|
20
|
+
/** The interval in milliseconds to poll the connection (defaults to 10000ms, set to 0 to disable polling) */
|
|
18
21
|
pingIntervalMs?: number;
|
|
19
22
|
/** The fetch timeout in milliseconds (defaults to 5000ms) */
|
|
20
23
|
timeoutMs?: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,oDAAoD;IACpD,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,qCAAqC;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0EAA0E;IAC1E,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,qFAAqF;IACrF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gDAAgD;IAChD,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,6GAA6G;IAC7G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iGAAiG;IACjG,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLatency.d.ts","sourceRoot":"","sources":["../../src/utils/getLatency.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,WAAW,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"getLatency.d.ts","sourceRoot":"","sources":["../../src/utils/getLatency.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,WAAW,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4C3F"}
|
package/dist/utils/getLatency.js
CHANGED
|
@@ -41,7 +41,6 @@ export async function getLatency(pingUrl, timeoutMs) {
|
|
|
41
41
|
return { isReachable, latencyMs };
|
|
42
42
|
}
|
|
43
43
|
catch (error) {
|
|
44
|
-
console.warn(`[SmartNetInfo] getLatency failed:`, error instanceof Error ? error.message : error);
|
|
45
44
|
// If it fails due to network/timeout, we are offline.
|
|
46
45
|
return { isReachable: false, latencyMs: null };
|
|
47
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLatency.js","sourceRoot":"","sources":["../../src/utils/getLatency.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,SAAiB;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,SAAS,GAAyC,IAAI,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,oFAAoF;QACpF,MAAM,SAAS,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzH,8CAA8C;QAC9C,wFAAwF;QACxF,4EAA4E;QAC5E,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,eAAe,EAAE,qCAAqC;gBACtD,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,GAAG;aACf;SACF,CAAC,CAAC;QAEH,8EAA8E;QAC9E,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,
|
|
1
|
+
{"version":3,"file":"getLatency.js","sourceRoot":"","sources":["../../src/utils/getLatency.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,SAAiB;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,SAAS,GAAyC,IAAI,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,oFAAoF;QACpF,MAAM,SAAS,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzH,8CAA8C;QAC9C,wFAAwF;QACxF,4EAA4E;QAC5E,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,eAAe,EAAE,qCAAqC;gBACtD,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,GAAG;aACf;SACF,CAAC,CAAC;QAEH,8EAA8E;QAC9E,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#import <React/RCTEventEmitter.h>
|
|
2
|
-
#import <
|
|
2
|
+
#import <AKBeniwalNativeReactNativeSmartNetinfo/AKBeniwalNativeReactNativeSmartNetinfo.h>
|
|
3
3
|
|
|
4
4
|
@interface ReactNativeSmartNetinfo : RCTEventEmitter <NativeReactNativeSmartNetinfoSpec>
|
|
5
5
|
|
|
@@ -18,7 +18,17 @@ RCT_EXPORT_MODULE()
|
|
|
18
18
|
nw_path_monitor_set_update_handler(_monitor, ^(nw_path_t path) {
|
|
19
19
|
nw_path_status_t status = nw_path_get_status(path);
|
|
20
20
|
BOOL isConnected = (status == nw_path_status_satisfied);
|
|
21
|
-
|
|
21
|
+
|
|
22
|
+
NSString *type = @"unknown";
|
|
23
|
+
if (!isConnected) {
|
|
24
|
+
type = @"none";
|
|
25
|
+
} else if (nw_path_uses_interface_type(path, nw_interface_type_wifi)) {
|
|
26
|
+
type = @"wifi";
|
|
27
|
+
} else if (nw_path_uses_interface_type(path, nw_interface_type_cellular)) {
|
|
28
|
+
type = @"cellular";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
[weakSelf sendNetworkStatusEvent:isConnected type:type];
|
|
22
32
|
});
|
|
23
33
|
|
|
24
34
|
nw_path_monitor_set_queue(_monitor, _queue);
|
|
@@ -45,9 +55,9 @@ RCT_EXPORT_MODULE()
|
|
|
45
55
|
_hasListeners = NO;
|
|
46
56
|
}
|
|
47
57
|
|
|
48
|
-
- (void)sendNetworkStatusEvent:(BOOL)isConnected {
|
|
58
|
+
- (void)sendNetworkStatusEvent:(BOOL)isConnected type:(NSString *)type {
|
|
49
59
|
if (_hasListeners) {
|
|
50
|
-
[self sendEventWithName:@"NetworkStatusChanged" body:@{@"isConnected": @(isConnected)}];
|
|
60
|
+
[self sendEventWithName:@"NetworkStatusChanged" body:@{@"isConnected": @(isConnected), @"type": type}];
|
|
51
61
|
}
|
|
52
62
|
}
|
|
53
63
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akbeniwal/react-native-smart-netinfo",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "A lightweight smart network monitoring library for React Native with internet reachability, latency monitoring, connection quality detection and speed testing.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"node": ">=18"
|
|
58
58
|
},
|
|
59
59
|
"codegenConfig": {
|
|
60
|
-
"name": "
|
|
60
|
+
"name": "AKBeniwalNativeReactNativeSmartNetinfo",
|
|
61
61
|
"type": "modules",
|
|
62
62
|
"jsSrcsDir": "src",
|
|
63
63
|
"android": {
|
package/src/SmartNetInfo.ts
CHANGED
|
@@ -17,7 +17,7 @@ const SPEED_TEST_URL = 'https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquer
|
|
|
17
17
|
class SmartNetInfoManager {
|
|
18
18
|
private pingUrlIndex = 0;
|
|
19
19
|
private config: Required<SmartNetInfoConfig> = {
|
|
20
|
-
pingIntervalMs:
|
|
20
|
+
pingIntervalMs: 10000,
|
|
21
21
|
timeoutMs: 5000,
|
|
22
22
|
speedTestFileSizeInBytes: 90000,
|
|
23
23
|
disableAutoSpeedTest: false,
|
|
@@ -26,6 +26,7 @@ class SmartNetInfoManager {
|
|
|
26
26
|
private state: NetworkState = {
|
|
27
27
|
isConnected: null,
|
|
28
28
|
isInternetReachable: null,
|
|
29
|
+
type: 'unknown',
|
|
29
30
|
latencyMs: null,
|
|
30
31
|
connectionQuality: null,
|
|
31
32
|
internetSpeed: null,
|
|
@@ -198,11 +199,12 @@ class SmartNetInfoManager {
|
|
|
198
199
|
}
|
|
199
200
|
}
|
|
200
201
|
|
|
201
|
-
private handleNativeNetworkChange = (event: { isConnected: boolean }) => {
|
|
202
|
+
private handleNativeNetworkChange = (event: { isConnected: boolean, type?: any }) => {
|
|
202
203
|
if (!event.isConnected) {
|
|
203
204
|
this.updateState({
|
|
204
205
|
isConnected: false,
|
|
205
206
|
isInternetReachable: false,
|
|
207
|
+
type: 'none',
|
|
206
208
|
latencyMs: null,
|
|
207
209
|
connectionQuality: null,
|
|
208
210
|
});
|
|
@@ -210,8 +212,9 @@ class SmartNetInfoManager {
|
|
|
210
212
|
clearTimeout(this.timeoutId);
|
|
211
213
|
this.timeoutId = null;
|
|
212
214
|
}
|
|
215
|
+
this.scheduleNextCheck();
|
|
213
216
|
} else {
|
|
214
|
-
this.updateState({ isConnected: true });
|
|
217
|
+
this.updateState({ isConnected: true, type: event.type || 'unknown' });
|
|
215
218
|
this.checkConnectivity().finally(() => {
|
|
216
219
|
this.scheduleNextCheck();
|
|
217
220
|
});
|
|
@@ -252,11 +255,8 @@ class SmartNetInfoManager {
|
|
|
252
255
|
|
|
253
256
|
if (this.config.pingIntervalMs <= 0) return;
|
|
254
257
|
|
|
255
|
-
//
|
|
256
|
-
//
|
|
257
|
-
if (this.state.isConnected === false && this.nativeEventEmitter) {
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
258
|
+
// We always keep polling as a bulletproof fallback, even if native module says offline.
|
|
259
|
+
// If the native module misses an event, polling will catch the recovery.
|
|
260
260
|
|
|
261
261
|
// When offline (without native fallback), check more frequently (every 3 seconds) to detect recovery quickly.
|
|
262
262
|
// When online, use the configured pingIntervalMs.
|
|
@@ -291,10 +291,12 @@ class SmartNetInfoManager {
|
|
|
291
291
|
const wasInternetReachable = this.state.isInternetReachable;
|
|
292
292
|
|
|
293
293
|
let nextIsConnected = this.state.isConnected;
|
|
294
|
-
if (
|
|
294
|
+
if (isReachable) {
|
|
295
|
+
nextIsConnected = true;
|
|
296
|
+
} else if (this.nativeEventEmitter && this.state.isConnected !== null) {
|
|
295
297
|
nextIsConnected = this.state.isConnected;
|
|
296
298
|
} else {
|
|
297
|
-
nextIsConnected =
|
|
299
|
+
nextIsConnected = false;
|
|
298
300
|
}
|
|
299
301
|
|
|
300
302
|
this.updateState({
|
package/src/types.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
export type ConnectionQuality = 'poor' | 'good' | 'excellent';
|
|
2
|
+
export type NetworkType = 'wifi' | 'cellular' | 'none' | 'unknown';
|
|
2
3
|
|
|
3
4
|
export interface NetworkState {
|
|
4
5
|
/** True if the network check succeeded, false if it failed or timed out */
|
|
5
6
|
isConnected: boolean | null;
|
|
6
7
|
/** True if internet reachability check succeeded */
|
|
7
8
|
isInternetReachable: boolean | null;
|
|
9
|
+
/** The type of network connection */
|
|
10
|
+
type: NetworkType;
|
|
8
11
|
/** Round-trip ping latency in milliseconds */
|
|
9
12
|
latencyMs: number | null;
|
|
10
13
|
/** Connection quality based on latency ('poor' | 'good' | 'excellent') */
|
|
@@ -16,7 +19,7 @@ export interface NetworkState {
|
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
export interface SmartNetInfoConfig {
|
|
19
|
-
/** The interval in milliseconds to poll the connection (defaults to
|
|
22
|
+
/** The interval in milliseconds to poll the connection (defaults to 10000ms, set to 0 to disable polling) */
|
|
20
23
|
pingIntervalMs?: number;
|
|
21
24
|
/** The fetch timeout in milliseconds (defaults to 5000ms) */
|
|
22
25
|
timeoutMs?: number;
|
package/src/utils/getLatency.ts
CHANGED
|
@@ -50,7 +50,6 @@ export async function getLatency(pingUrl: string, timeoutMs: number): Promise<La
|
|
|
50
50
|
const latencyMs = Date.now() - startTime;
|
|
51
51
|
return { isReachable, latencyMs };
|
|
52
52
|
} catch (error) {
|
|
53
|
-
console.warn(`[SmartNetInfo] getLatency failed:`, error instanceof Error ? error.message : error);
|
|
54
53
|
// If it fails due to network/timeout, we are offline.
|
|
55
54
|
return { isReachable: false, latencyMs: null };
|
|
56
55
|
} finally {
|