diff --git a/changelog.md b/changelog.md index 482bee3..ec55512 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2025-05-03 - 4.0.1 - fix(formatting) +Fix minor formatting issues and newline consistency across project files + +- Ensure newline at end of package.json, errors.ts, logging.ts, and test files +- Refine code block formatting in readme.md +- Adjust whitespace and code style in smartnetwork classes and cloudflarespeed module +- Minor commitinfo data format update + ## 2025-04-28 - 4.0.0 - BREAKING CHANGE(smartnetwork) Enhance documentation and add configurable speed test options with plugin architecture improvements diff --git a/package.json b/package.json index 43a24ea..c6ebc05 100644 --- a/package.json +++ b/package.json @@ -69,4 +69,4 @@ "pnpm": { "overrides": {} } -} +} \ No newline at end of file diff --git a/readme.md b/readme.md index 1423a1c..1dacef4 100644 --- a/readme.md +++ b/readme.md @@ -16,9 +16,7 @@ You can perform a hop-by-hop traceroute to measure latency per hop. Falls back t ```typescript const hops = await myNetwork.traceroute('google.com', { maxHops: 10, timeout: 5000 }); -hops.forEach(h => - console.log(`${h.ttl}\t${h.ip}\t${h.rtt === null ? '*' : h.rtt + ' ms'}`), -); +hops.forEach((h) => console.log(`${h.ttl}\t${h.ip}\t${h.rtt === null ? '*' : h.rtt + ' ms'}`)); ``` This command will download `@push.rocks/smartnetwork` and add it to your project's `package.json` file. @@ -44,6 +42,7 @@ const myNetwork = new SmartNetwork(); ### Performing a Speed Test You can measure the network speed using the `getSpeed` method. It supports optional parameters: + - `parallelStreams`: number of concurrent streams (default: 1) - `duration`: test duration in seconds (default: fixed segments) @@ -143,6 +142,7 @@ console.log(`Public IPv6: ${publicIps.v6}`); The `@push.rocks/smartnetwork` package provides an easy-to-use, comprehensive suite of tools for network diagnostics and monitoring, encapsulating complex network operations into simple asynchronous methods. By leveraging TypeScript, developers can benefit from type checking, ensuring that they can work with clear structures and expectations. These examples offer a glimpse into the module's utility in real-world scenarios, demonstrating its versatility in handling common network tasks. Whether you're developing a network-sensitive application, diagnosing connectivity issues, or simply curious about your network performance, `@push.rocks/smartnetwork` equips you with the tools you need. + ### Plugin Architecture You can extend `SmartNetwork` with custom plugins by registering them at runtime: diff --git a/test/test.features.ts b/test/test.features.ts index b65d56e..f37ad9c 100644 --- a/test/test.features.ts +++ b/test/test.features.ts @@ -188,4 +188,4 @@ tap.test('traceroute real integration against google.com', async () => { } }); -tap.start(); \ No newline at end of file +tap.start(); diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 8d5800b..17e54cf 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/smartnetwork', - version: '4.0.0', + version: '4.0.1', description: 'A toolkit for network diagnostics including speed tests, port availability checks, and more.' } diff --git a/ts/errors.ts b/ts/errors.ts index 27e08e0..5fba097 100644 --- a/ts/errors.ts +++ b/ts/errors.ts @@ -17,4 +17,4 @@ export class TimeoutError extends NetworkError { this.name = 'TimeoutError'; Object.setPrototypeOf(this, new.target.prototype); } -} \ No newline at end of file +} diff --git a/ts/logging.ts b/ts/logging.ts index a0ad8c0..0f7a85b 100644 --- a/ts/logging.ts +++ b/ts/logging.ts @@ -27,4 +27,4 @@ export function setLogger(logger: Logger): void { */ export function getLogger(): Logger { return globalLogger; -} \ No newline at end of file +} diff --git a/ts/smartnetwork.classes.cloudflarespeed.ts b/ts/smartnetwork.classes.cloudflarespeed.ts index 89970f3..933723c 100644 --- a/ts/smartnetwork.classes.cloudflarespeed.ts +++ b/ts/smartnetwork.classes.cloudflarespeed.ts @@ -164,9 +164,10 @@ export class CloudflareSpeed { } public async fetchServerLocations(): Promise<{ [key: string]: string }> { - const res = JSON.parse( - await this.get('speed.cloudflare.com', '/locations'), - ) as Array<{ iata: string; city: string }>; + const res = JSON.parse(await this.get('speed.cloudflare.com', '/locations')) as Array<{ + iata: string; + city: string; + }>; return res.reduce( (data: Record, optionsArg) => { data[optionsArg.iata] = optionsArg.city; @@ -198,9 +199,9 @@ export class CloudflareSpeed { reject(e); } }); - req.on('error', (err: Error & { code?: string }) => { - reject(new NetworkError(err.message, err.code)); - }); + req.on('error', (err: Error & { code?: string }) => { + reject(new NetworkError(err.message, err.code)); + }); }, ); @@ -251,15 +252,15 @@ export class CloudflareSpeed { res.on('data', () => {}); res.on('end', () => { ended = plugins.perfHooks.performance.now(); - resolve([ - started, - dnsLookup, - tcpHandshake, - sslHandshake, - ttfb, - ended, - parseFloat((res.headers['server-timing'] as string).slice(22)), - ]); + resolve([ + started, + dnsLookup, + tcpHandshake, + sslHandshake, + ttfb, + ended, + parseFloat((res.headers['server-timing'] as string).slice(22)), + ]); }); }); @@ -296,11 +297,14 @@ export class CloudflareSpeed { const parts = i.split('='); return [parts[0], parts[1]]; }) - .reduce((data: Record, [k, v]) => { - if (v === undefined) return data; - data[k] = v; - return data; - }, {} as Record); + .reduce( + (data: Record, [k, v]) => { + if (v === undefined) return data; + data[k] = v; + return data; + }, + {} as Record, + ); return this.get('speed.cloudflare.com', '/cdn-cgi/trace').then(parseCfCdnCgiTrace); } diff --git a/ts/smartnetwork.classes.smartnetwork.ts b/ts/smartnetwork.classes.smartnetwork.ts index 6132b12..9a16cd6 100644 --- a/ts/smartnetwork.classes.smartnetwork.ts +++ b/ts/smartnetwork.classes.smartnetwork.ts @@ -44,9 +44,7 @@ export class SmartNetwork { * get network speed * @param opts optional speed test parameters */ - public async getSpeed( - opts?: { parallelStreams?: number; duration?: number }, - ) { + public async getSpeed(opts?: { parallelStreams?: number; duration?: number }) { const cloudflareSpeedInstance = new CloudflareSpeed(opts); return cloudflareSpeedInstance.speedTest(); } @@ -54,10 +52,7 @@ export class SmartNetwork { /** * Send ICMP pings to a host. Optionally specify count for multiple pings. */ - public async ping( - host: string, - opts?: { timeout?: number; count?: number }, - ): Promise { + public async ping(host: string, opts?: { timeout?: number; count?: number }): Promise { const timeout = opts?.timeout ?? 500; const count = opts?.count && opts.count > 1 ? opts.count : 1; const pinger = new plugins.smartping.Smartping(); @@ -85,11 +80,7 @@ export class SmartNetwork { const min = valid.length ? Math.min(...valid) : NaN; const max = valid.length ? Math.max(...valid) : NaN; const avg = valid.length ? stats.average(valid) : NaN; - const stddev = valid.length - ? Math.sqrt( - stats.average(valid.map((v) => (v - avg) ** 2)), - ) - : NaN; + const stddev = valid.length ? Math.sqrt(stats.average(valid.map((v) => (v - avg) ** 2))) : NaN; const packetLoss = ((count - aliveCount) / count) * 100; return { host, @@ -168,7 +159,9 @@ export class SmartNetwork { */ public async isRemotePortAvailable( target: string, - portOrOpts?: number | { port?: number; protocol?: 'tcp' | 'udp'; timeout?: number; retries?: number }, + portOrOpts?: + | number + | { port?: number; protocol?: 'tcp' | 'udp'; timeout?: number; retries?: number }, ): Promise { let hostPart: string; let port: number | undefined; @@ -252,7 +245,9 @@ export class SmartNetwork { /** * Resolve DNS records (A, AAAA, MX) */ - public async resolveDns(host: string): Promise<{ A: string[]; AAAA: string[]; MX: { exchange: string; priority: number }[] }> { + public async resolveDns( + host: string, + ): Promise<{ A: string[]; AAAA: string[]; MX: { exchange: string; priority: number }[] }> { try { const dns = await import('dns'); const { resolve4, resolve6, resolveMx } = dns.promises; @@ -316,14 +311,10 @@ export class SmartNetwork { const { exec } = await import('child_process'); const cmd = `traceroute -n -m ${maxHops} ${host}`; const stdout: string = await new Promise((resolve, reject) => { - exec( - cmd, - { encoding: 'utf8', timeout }, - (err, stdout) => { - if (err) return reject(err); - resolve(stdout); - }, - ); + exec(cmd, { encoding: 'utf8', timeout }, (err, stdout) => { + if (err) return reject(err); + resolve(stdout); + }); }); const hops: Hop[] = []; for (const raw of stdout.split('\n')) {