@akbeniwal/react-native-smart-netinfo 1.0.1 → 1.0.3
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/dist/SmartNetInfo.d.ts +3 -1
- package/dist/SmartNetInfo.d.ts.map +1 -1
- package/dist/SmartNetInfo.js +65 -26
- package/dist/SmartNetInfo.js.map +1 -1
- package/dist/utils/getLatency.d.ts +1 -1
- package/dist/utils/getLatency.d.ts.map +1 -1
- package/dist/utils/getLatency.js +23 -7
- package/dist/utils/getLatency.js.map +1 -1
- package/dist/utils/runSpeedTest.d.ts +1 -1
- package/dist/utils/runSpeedTest.d.ts.map +1 -1
- package/dist/utils/runSpeedTest.js +14 -2
- package/dist/utils/runSpeedTest.js.map +1 -1
- package/package.json +2 -1
package/dist/SmartNetInfo.d.ts
CHANGED
|
@@ -3,9 +3,10 @@ declare class SmartNetInfoManager {
|
|
|
3
3
|
private config;
|
|
4
4
|
private state;
|
|
5
5
|
private listeners;
|
|
6
|
-
private
|
|
6
|
+
private timeoutId;
|
|
7
7
|
private appStateSubscription;
|
|
8
8
|
private isMonitoring;
|
|
9
|
+
private isChecking;
|
|
9
10
|
/**
|
|
10
11
|
* Configure the SmartNetInfo options.
|
|
11
12
|
* If already monitoring, it will restart the monitoring process to apply new intervals.
|
|
@@ -47,6 +48,7 @@ declare class SmartNetInfoManager {
|
|
|
47
48
|
private handleAppStateChange;
|
|
48
49
|
private handleWebOnline;
|
|
49
50
|
private handleWebOffline;
|
|
51
|
+
private scheduleNextCheck;
|
|
50
52
|
private checkConnectivity;
|
|
51
53
|
private updateState;
|
|
52
54
|
private notifyListeners;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartNetInfo.d.ts","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQjF,cAAM,mBAAmB;IACvB,OAAO,CAAC,MAAM,CAKZ;IAEF,OAAO,CAAC,KAAK,CAOX;IAEF,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"SmartNetInfo.d.ts","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQjF,cAAM,mBAAmB;IACvB,OAAO,CAAC,MAAM,CAKZ;IAEF,OAAO,CAAC,KAAK,CAOX;IAEF,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,oBAAoB,CAAuC;IACnE,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;IAgC9B;;OAEG;IACI,cAAc,IAAI,IAAI;IA0B7B,OAAO,CAAC,oBAAoB,CAM1B;IAEF,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,gBAAgB,CAOtB;IAEF,OAAO,CAAC,iBAAiB;YAuBX,iBAAiB;IAsC/B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,eAAe;CASxB;AAED,eAAO,MAAM,YAAY,qBAA4B,CAAC;AACtD,eAAe,YAAY,CAAC"}
|
package/dist/SmartNetInfo.js
CHANGED
|
@@ -21,17 +21,22 @@ class SmartNetInfoManager {
|
|
|
21
21
|
isTestingSpeed: false,
|
|
22
22
|
};
|
|
23
23
|
this.listeners = new Set();
|
|
24
|
-
this.
|
|
24
|
+
this.timeoutId = null;
|
|
25
25
|
this.appStateSubscription = null;
|
|
26
26
|
this.isMonitoring = false;
|
|
27
|
+
this.isChecking = false;
|
|
27
28
|
this.handleAppStateChange = (nextAppState) => {
|
|
28
29
|
if (nextAppState === 'active') {
|
|
29
|
-
this.checkConnectivity()
|
|
30
|
+
this.checkConnectivity().finally(() => {
|
|
31
|
+
this.scheduleNextCheck();
|
|
32
|
+
});
|
|
30
33
|
}
|
|
31
34
|
};
|
|
32
35
|
this.handleWebOnline = () => {
|
|
33
36
|
this.updateState({ isConnected: true, isInternetReachable: true });
|
|
34
|
-
this.checkConnectivity()
|
|
37
|
+
this.checkConnectivity().finally(() => {
|
|
38
|
+
this.scheduleNextCheck();
|
|
39
|
+
});
|
|
35
40
|
};
|
|
36
41
|
this.handleWebOffline = () => {
|
|
37
42
|
this.updateState({
|
|
@@ -98,7 +103,8 @@ class SmartNetInfoManager {
|
|
|
98
103
|
return this.state.internetSpeed;
|
|
99
104
|
}
|
|
100
105
|
this.updateState({ isTestingSpeed: true });
|
|
101
|
-
const
|
|
106
|
+
const timeout = Math.max(this.config.timeoutMs * 3, 15000);
|
|
107
|
+
const speed = await executeSpeedTest(SPEED_TEST_URL, this.config.speedTestFileSizeInBytes, timeout);
|
|
102
108
|
this.updateState({
|
|
103
109
|
internetSpeed: speed,
|
|
104
110
|
isTestingSpeed: false,
|
|
@@ -112,7 +118,7 @@ class SmartNetInfoManager {
|
|
|
112
118
|
if (this.isMonitoring)
|
|
113
119
|
return;
|
|
114
120
|
this.isMonitoring = true;
|
|
115
|
-
// Run initial check immediately
|
|
121
|
+
// Run initial check immediately and then schedule subsequent checks
|
|
116
122
|
this.checkConnectivity().then(() => {
|
|
117
123
|
// Auto run speed test on initial connect if online
|
|
118
124
|
if (this.state.isInternetReachable &&
|
|
@@ -120,11 +126,8 @@ class SmartNetInfoManager {
|
|
|
120
126
|
!this.config.disableAutoSpeedTest) {
|
|
121
127
|
this.runSpeedTest();
|
|
122
128
|
}
|
|
129
|
+
this.scheduleNextCheck();
|
|
123
130
|
});
|
|
124
|
-
// Set up periodic polling
|
|
125
|
-
if (this.config.pingIntervalMs > 0) {
|
|
126
|
-
this.intervalId = setInterval(() => this.checkConnectivity(), this.config.pingIntervalMs);
|
|
127
|
-
}
|
|
128
131
|
// React Native AppState listener to detect foreground transitions
|
|
129
132
|
try {
|
|
130
133
|
this.appStateSubscription = AppState.addEventListener('change', this.handleAppStateChange);
|
|
@@ -146,9 +149,9 @@ class SmartNetInfoManager {
|
|
|
146
149
|
if (!this.isMonitoring)
|
|
147
150
|
return;
|
|
148
151
|
this.isMonitoring = false;
|
|
149
|
-
if (this.
|
|
150
|
-
|
|
151
|
-
this.
|
|
152
|
+
if (this.timeoutId) {
|
|
153
|
+
clearTimeout(this.timeoutId);
|
|
154
|
+
this.timeoutId = null;
|
|
152
155
|
}
|
|
153
156
|
if (this.appStateSubscription) {
|
|
154
157
|
if (typeof this.appStateSubscription.remove === 'function') {
|
|
@@ -166,21 +169,57 @@ class SmartNetInfoManager {
|
|
|
166
169
|
window.removeEventListener('offline', this.handleWebOffline);
|
|
167
170
|
}
|
|
168
171
|
}
|
|
172
|
+
scheduleNextCheck() {
|
|
173
|
+
if (!this.isMonitoring)
|
|
174
|
+
return;
|
|
175
|
+
if (this.timeoutId) {
|
|
176
|
+
clearTimeout(this.timeoutId);
|
|
177
|
+
this.timeoutId = null;
|
|
178
|
+
}
|
|
179
|
+
if (this.config.pingIntervalMs <= 0)
|
|
180
|
+
return;
|
|
181
|
+
// When offline, check more frequently (every 3 seconds) to detect recovery quickly.
|
|
182
|
+
// When online, use the configured pingIntervalMs.
|
|
183
|
+
const isOffline = this.state.isInternetReachable === false;
|
|
184
|
+
const interval = isOffline
|
|
185
|
+
? Math.min(this.config.pingIntervalMs, 3000)
|
|
186
|
+
: this.config.pingIntervalMs;
|
|
187
|
+
this.timeoutId = setTimeout(async () => {
|
|
188
|
+
await this.checkConnectivity();
|
|
189
|
+
this.scheduleNextCheck();
|
|
190
|
+
}, interval);
|
|
191
|
+
}
|
|
169
192
|
async checkConnectivity() {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
this.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
wasInternetReachable
|
|
181
|
-
this.
|
|
182
|
-
|
|
183
|
-
|
|
193
|
+
if (this.isChecking)
|
|
194
|
+
return;
|
|
195
|
+
this.isChecking = true;
|
|
196
|
+
try {
|
|
197
|
+
// Add a buffer to timeout when we are currently offline to allow the radio to wake up
|
|
198
|
+
const isCurrentlyOffline = this.state.isInternetReachable === false;
|
|
199
|
+
const actualTimeout = isCurrentlyOffline
|
|
200
|
+
? Math.max(this.config.timeoutMs, 4000)
|
|
201
|
+
: this.config.timeoutMs;
|
|
202
|
+
const { isReachable, latencyMs } = await getLatency(PING_URL, actualTimeout);
|
|
203
|
+
const wasInternetReachable = this.state.isInternetReachable;
|
|
204
|
+
this.updateState({
|
|
205
|
+
isConnected: isReachable,
|
|
206
|
+
isInternetReachable: isReachable,
|
|
207
|
+
latencyMs,
|
|
208
|
+
connectionQuality: getConnectionQuality(latencyMs),
|
|
209
|
+
});
|
|
210
|
+
// If internet just became reachable and we haven't run speed test yet, trigger auto speed test
|
|
211
|
+
if (isReachable &&
|
|
212
|
+
wasInternetReachable === false &&
|
|
213
|
+
this.state.internetSpeed === null &&
|
|
214
|
+
!this.config.disableAutoSpeedTest) {
|
|
215
|
+
this.runSpeedTest();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.warn('SmartNetInfo failed during checkConnectivity:', error);
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
this.isChecking = false;
|
|
184
223
|
}
|
|
185
224
|
}
|
|
186
225
|
updateState(partialState) {
|
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,MAAM,cAAc,CAAC;AAExD,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,QAAQ,GAAG,0CAA0C,CAAC;AAC5D,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAE1F,MAAM,mBAAmB;IAAzB;QACU,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,
|
|
1
|
+
{"version":3,"file":"SmartNetInfo.js","sourceRoot":"","sources":["../src/SmartNetInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export interface LatencyResult {
|
|
|
5
5
|
latencyMs: number | null;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
|
-
* Pings a URL
|
|
8
|
+
* Pings a URL to verify internet reachability and measure round-trip latency.
|
|
9
9
|
* Uses an AbortController to support timeouts.
|
|
10
10
|
*
|
|
11
11
|
* @param pingUrl The target URL to ping
|
|
@@ -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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pings a URL
|
|
2
|
+
* Pings a URL to verify internet reachability and measure round-trip latency.
|
|
3
3
|
* Uses an AbortController to support timeouts.
|
|
4
4
|
*
|
|
5
5
|
* @param pingUrl The target URL to ping
|
|
@@ -8,14 +8,20 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export async function getLatency(pingUrl, timeoutMs) {
|
|
10
10
|
const startTime = Date.now();
|
|
11
|
+
let timeoutId = null;
|
|
11
12
|
try {
|
|
12
13
|
const controller = new AbortController();
|
|
13
|
-
|
|
14
|
+
timeoutId = setTimeout(() => {
|
|
14
15
|
controller.abort();
|
|
15
16
|
}, timeoutMs);
|
|
16
|
-
//
|
|
17
|
-
const
|
|
18
|
-
|
|
17
|
+
// Append dynamic timestamp and random string to strictly bypass network/DNS caching
|
|
18
|
+
const uniqueUrl = `${pingUrl}${pingUrl.includes('?') ? '&' : '?'}t=${Date.now()}&r=${Math.random().toString().slice(2)}`;
|
|
19
|
+
// Perform GET request to verify connectivity.
|
|
20
|
+
// We use GET instead of HEAD for maximum compatibility across various CDNs and proxies.
|
|
21
|
+
// Since clients3.google.com/generate_204 returns a 204 No Content response,
|
|
22
|
+
// using GET has negligible bandwidth usage.
|
|
23
|
+
const response = await fetch(uniqueUrl, {
|
|
24
|
+
method: 'GET',
|
|
19
25
|
signal: controller.signal,
|
|
20
26
|
headers: {
|
|
21
27
|
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
@@ -23,15 +29,25 @@ export async function getLatency(pingUrl, timeoutMs) {
|
|
|
23
29
|
'Expires': '0',
|
|
24
30
|
},
|
|
25
31
|
});
|
|
26
|
-
|
|
32
|
+
// Fully consume the response body to prevent connection leaks in React Native
|
|
33
|
+
try {
|
|
34
|
+
await response.text();
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
// ignore
|
|
38
|
+
}
|
|
27
39
|
const isReachable = response.ok || response.status < 400;
|
|
28
40
|
const latencyMs = Date.now() - startTime;
|
|
29
41
|
return { isReachable, latencyMs };
|
|
30
42
|
}
|
|
31
43
|
catch (error) {
|
|
32
|
-
// If HEAD fails, we could try GET, but usually standard endpoints support HEAD or GET.
|
|
33
44
|
// If it fails due to network/timeout, we are offline.
|
|
34
45
|
return { isReachable: false, latencyMs: null };
|
|
35
46
|
}
|
|
47
|
+
finally {
|
|
48
|
+
if (timeoutId) {
|
|
49
|
+
clearTimeout(timeoutId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
36
52
|
}
|
|
37
53
|
//# sourceMappingURL=getLatency.js.map
|
|
@@ -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,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,
|
|
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"}
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
* @param speedTestFileSizeInBytes Known size of the remote asset in bytes
|
|
7
7
|
* @returns A promise resolving to the estimated download speed in Mbps, or null if the test fails
|
|
8
8
|
*/
|
|
9
|
-
export declare function runSpeedTest(speedTestUrl: string, speedTestFileSizeInBytes: number): Promise<number | null>;
|
|
9
|
+
export declare function runSpeedTest(speedTestUrl: string, speedTestFileSizeInBytes: number, timeoutMs?: number): Promise<number | null>;
|
|
10
10
|
//# sourceMappingURL=runSpeedTest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runSpeedTest.d.ts","sourceRoot":"","sources":["../../src/utils/runSpeedTest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,wBAAwB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"runSpeedTest.d.ts","sourceRoot":"","sources":["../../src/utils/runSpeedTest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,wBAAwB,EAAE,MAAM,EAChC,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB"}
|
|
@@ -6,11 +6,18 @@
|
|
|
6
6
|
* @param speedTestFileSizeInBytes Known size of the remote asset in bytes
|
|
7
7
|
* @returns A promise resolving to the estimated download speed in Mbps, or null if the test fails
|
|
8
8
|
*/
|
|
9
|
-
export async function runSpeedTest(speedTestUrl, speedTestFileSizeInBytes) {
|
|
9
|
+
export async function runSpeedTest(speedTestUrl, speedTestFileSizeInBytes, timeoutMs = 15000) {
|
|
10
|
+
let timeoutId = null;
|
|
10
11
|
try {
|
|
11
12
|
const startTime = Date.now();
|
|
12
|
-
const
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
timeoutId = setTimeout(() => {
|
|
15
|
+
controller.abort();
|
|
16
|
+
}, timeoutMs);
|
|
17
|
+
const uniqueUrl = `${speedTestUrl}${speedTestUrl.includes('?') ? '&' : '?'}t=${Date.now()}&r=${Math.random().toString().slice(2)}`;
|
|
18
|
+
const response = await fetch(uniqueUrl, {
|
|
13
19
|
method: 'GET',
|
|
20
|
+
signal: controller.signal,
|
|
14
21
|
headers: {
|
|
15
22
|
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
16
23
|
'Pragma': 'no-cache',
|
|
@@ -35,5 +42,10 @@ export async function runSpeedTest(speedTestUrl, speedTestFileSizeInBytes) {
|
|
|
35
42
|
console.warn('Network speed test failed:', error);
|
|
36
43
|
return null;
|
|
37
44
|
}
|
|
45
|
+
finally {
|
|
46
|
+
if (timeoutId) {
|
|
47
|
+
clearTimeout(timeoutId);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
38
50
|
}
|
|
39
51
|
//# sourceMappingURL=runSpeedTest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runSpeedTest.js","sourceRoot":"","sources":["../../src/utils/runSpeedTest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,wBAAgC;
|
|
1
|
+
{"version":3,"file":"runSpeedTest.js","sourceRoot":"","sources":["../../src/utils/runSpeedTest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,wBAAgC,EAChC,YAAoB,KAAK;IAEzB,IAAI,SAAS,GAAyC,IAAI,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,SAAS,GAAG,GAAG,YAAY,GAAG,YAAY,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;QAEnI,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,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,oFAAoF;QACpF,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtB,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QACpD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,wBAAwB,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;QAEvD,yCAAyC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akbeniwal/react-native-smart-netinfo",
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
"version": "1.0.3",
|
|
4
5
|
"description": "A lightweight smart network monitoring library for React Native with internet reachability, latency monitoring, connection quality detection and speed testing.",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"types": "dist/index.d.ts",
|