Simple JavaScript Speedometer
Speedometer is a lightweight JavaScript utility designed for measuring throughput in bytes per second over a sliding time window. It is particularly useful in Node.js environments for tracking data transfer rates, such as file streaming or network activity. The current stable version is 1.1.0, and the package appears to be in a maintenance state, with infrequent updates primarily for tooling rather than new features or significant API changes. Its key differentiator lies in its extreme simplicity and low-level focus, providing a raw numerical measurement without UI components, contrasting with many other 'speedometer' packages that offer graphical gauges for web frameworks. Users can configure the buffer duration for averaging speed, which defaults to 5 seconds, allowing for flexible measurement intervals.
Common errors
-
TypeError: speedometer is not a function
cause Attempting to use `import speedometer from 'speedometer'` in an ESM context when the package only exports CommonJS.fixChange your import statement to `const speedometer = require('speedometer')` and ensure your environment supports CommonJS modules. -
ReferenceError: require is not defined
cause Trying to use `require('speedometer')` in an environment where CommonJS `require` is not available, such as a pure ES module Node.js project (`"type": "module"` in `package.json`) or a browser context without a CJS-compatible bundler.fixThis package is CommonJS-only and primarily for Node.js. If in a Node.js ESM project, you might need to wrap it in a CJS loader or reconsider using a different package. For browser use, a bundler might make it work, but direct use is not supported.
Warnings
- gotcha The `speedometer` package is designed for Node.js environments and uses Node.js-specific features like `require`. It does not provide an ES module (ESM) export and is not intended for direct browser usage.
- gotcha The default buffer window for speed calculation is 5 seconds. If you need more immediate feedback or a longer-term average, remember to adjust this value during initialization.
- gotcha The `speedometer` function expects numerical values representing the number of bytes transferred. Passing non-numeric or invalid input can lead to incorrect speed calculations or runtime errors.
Install
-
npm install speedometer -
yarn add speedometer -
pnpm add speedometer
Imports
- speedometer
import speedometer from 'speedometer'
const speedometer = require('speedometer')
Quickstart
const speedometer = require('speedometer');
const fs = require('fs');
// Create a speedometer instance with a 10-second buffer
const speed = speedometer(10);
const stream = fs.createReadStream('/dev/urandom', { highWaterMark: 1024 * 1024 }); // Read in 1MB chunks
let totalBytes = 0;
let lastLogTime = Date.now();
stream.on('data', function(data) {
// Pass the amount of bytes transferred to the speedometer
const bytesPerSecond = speed(data.length);
totalBytes += data.length;
// Log speed every second
if (Date.now() - lastLogTime >= 1000) {
console.log(`Current speed: ${bytesPerSecond.toFixed(2)} bytes/second`);
lastLogTime = Date.now();
}
});
stream.on('end', () => {
console.log(`
Finished reading. Total bytes: ${totalBytes}`);
const finalSpeed = speed(); // Get current speed one last time
console.log(`Final calculated speed (over buffer): ${finalSpeed.toFixed(2)} bytes/second`);
});
stream.on('error', (err) => {
console.error('Stream error:', err);
});