From 4e01083cd6ea93442e80dfde851f2303b0884473 Mon Sep 17 00:00:00 2001 From: "Jyotirmoy Bandyopadhyaya [Bravo68]" Date: Sat, 22 Apr 2023 12:08:58 +0530 Subject: [PATCH] Added ping service --- packages/api/controllers/ping.controller.ts | 47 +++++++++++++++++++++ packages/api/routes/api/ping.routes.ts | 12 ++++++ packages/api/services/ping.service.ts | 36 ++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 packages/api/controllers/ping.controller.ts create mode 100644 packages/api/routes/api/ping.routes.ts create mode 100644 packages/api/services/ping.service.ts diff --git a/packages/api/controllers/ping.controller.ts b/packages/api/controllers/ping.controller.ts new file mode 100644 index 0000000..9420b9a --- /dev/null +++ b/packages/api/controllers/ping.controller.ts @@ -0,0 +1,47 @@ +import { Request, Response } from 'express' +import { makeResponse } from '../libs' +import PingService from '../services/ping.service' + +export default class PingController extends PingService { + public ping = async (req: Request, res: Response) => { + try { + const { host } = req.query as { host: string } + const data = await this.pingHost(host) + res.send(makeResponse(data)) + } catch (err: any) { + res.send(makeResponse(err.message, {}, 'Failed', true)) + } + } + + public pingParallel = async (req: Request, res: Response) => { + try { + const { hosts } = req.query as { hosts: string } + const data = await this.pingHostsParallel(hosts.split(',')) + res.send(makeResponse(data)) + } catch (err: any) { + res.send(makeResponse(err.message, {}, 'Failed', true)) + } + } + + public pingAll = async (req: Request, res: Response) => { + try { + const { hosts } = req.query as { hosts: string } + const data = await this.pingHosts(hosts.split(',')) + res.send(makeResponse(data)) + } catch (err: any) { + res.send(makeResponse(err.message, {}, 'Failed', true)) + } + } + + public pingSelf = async (req: Request, res: Response) => { + try { + const locIps = ['::1', '::ffff:', '127.0.0.1', 'localhost'] + if (locIps.includes(req.ip)) + return res.send(makeResponse('localhost', {}, 'Failed', true)) + const data = await this.pingHost(req.ip) + res.send(makeResponse(data)) + } catch (err: any) { + res.send(makeResponse(err.message, {}, 'Failed', true)) + } + } +} diff --git a/packages/api/routes/api/ping.routes.ts b/packages/api/routes/api/ping.routes.ts new file mode 100644 index 0000000..d0780d7 --- /dev/null +++ b/packages/api/routes/api/ping.routes.ts @@ -0,0 +1,12 @@ +import { Router } from 'express' +import PingController from '../../controllers/ping.controller' + +const router = Router() +const pingController = new PingController() + +router.get('/', pingController.ping) +router.get('/parallel', pingController.pingParallel) +router.get('/all', pingController.pingAll) +router.get('/self', pingController.pingSelf) + +export default router diff --git a/packages/api/services/ping.service.ts b/packages/api/services/ping.service.ts new file mode 100644 index 0000000..eaa1559 --- /dev/null +++ b/packages/api/services/ping.service.ts @@ -0,0 +1,36 @@ +import ping from 'ping' + +export default class PingService { + public async pingHost(host: string) { + try { + const response = await ping.promise.probe(host) + return response + } catch (error) { + return error + } + } + + public async pingHosts(hosts: string[]) { + try { + const response = await Promise.all( + hosts.map((host) => ping.promise.probe(host)) + ) + return response + } catch (error) { + return error + } + } + + public async pingHostsParallel(hosts: string[]) { + try { + const response = await Promise.all( + hosts.map((host) => + ping.promise.probe(host, { parallel: true }) + ) + ) + return response + } catch (error) { + return error + } + } +}