@_molaidrislabs/react-native-internet-speed-test
v0.1.4
Published
JavaScript-first NDT7 client for React Native and React Native Web.
Maintainers
Readme
@_molaidrislabs/react-native-internet-speed-test
JavaScript-first NDT7 client for React Native and React Native Web.
Features
- API parity with
react-native-ndt7 - no native code or platform setup
- event-driven API only
- works in React Native and React Native Web environments with
fetch,URL, andWebSocket - lightweight package shape with a soft-cancel v1 controller
Installation
npm install @_molaidrislabs/react-native-internet-speed-testyarn add @_molaidrislabs/react-native-internet-speed-testThis package currently pins @m-lab/ndt7 to the tested upstream version to avoid behavior drift.
API
import { Ndt7 } from '@_molaidrislabs/react-native-internet-speed-test';
const progressSub = Ndt7.addListener('progress', event => {
console.log(event.phase, event.speedMbps);
});
const completeSub = Ndt7.addListener('complete', result => {
console.log(result.downloadMbps, result.uploadMbps);
});
await Ndt7.startSpeedTest({ userAcceptedDataPolicy: true });
await Ndt7.stopSpeedTest();
const state = await Ndt7.getState();
progressSub.remove();
completeSub.remove();Methods
startSpeedTest(options?) => Promise<{ state, alreadyRunning }>stopSpeedTest() => Promise<void>getState() => Promise<SpeedTestState>addListener(event, listener) => EventSubscription
State lifecycle
idlestartingrunningstoppingcompletedthen auto-resets toidlefailedthen auto-resets toidle
If a test is already active, startSpeedTest() returns the current state with alreadyRunning: true.
Usage scenarios
1. Minimal fire-and-forget test
import { Ndt7 } from '@_molaidrislabs/react-native-internet-speed-test';
await Ndt7.startSpeedTest({
userAcceptedDataPolicy: true,
});2. Subscribe to progress and completion
import { Ndt7 } from '@_molaidrislabs/react-native-internet-speed-test';
const subscriptions = [
Ndt7.addListener('stateChange', event => {
console.log('state', event.state);
}),
Ndt7.addListener('progress', event => {
console.log(`${event.phase}: ${event.speedMbps.toFixed(2)} Mbps`);
}),
Ndt7.addListener('complete', event => {
console.log('done', event.downloadMbps, event.uploadMbps);
}),
Ndt7.addListener('error', event => {
console.warn(event.code, event.message);
}),
];
await Ndt7.startSpeedTest({ userAcceptedDataPolicy: true });
// Later
subscriptions.forEach(subscription => subscription.remove());3. Best-effort cancellation
import { Ndt7 } from '@_molaidrislabs/react-native-internet-speed-test';
await Ndt7.startSpeedTest({ userAcceptedDataPolicy: true });
setTimeout(() => {
void Ndt7.stopSpeedTest();
}, 2_000);stopSpeedTest() is a soft cancel in v1. The controller invalidates the active run and returns state to idle, but underlying WebSocket shutdown is still best-effort.
4. Target a specific server or load balancer
import { Ndt7 } from '@_molaidrislabs/react-native-internet-speed-test';
await Ndt7.startSpeedTest({
userAcceptedDataPolicy: true,
protocol: 'wss',
server: 'ndt.example.net',
metadata: {
client_name: 'my-app',
client_version: '1.2.3',
},
});Or use a custom locate service:
await Ndt7.startSpeedTest({
userAcceptedDataPolicy: true,
loadbalancer: 'https://locate.example.net/v2/nearest/ndt/ndt7',
});