pingflux 1.0.0

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.
Files changed (49) hide show
  1. package/dist/core/emitter.d.ts +44 -0
  2. package/dist/core/emitter.d.ts.map +1 -0
  3. package/dist/core/emitter.js +58 -0
  4. package/dist/core/emitter.js.map +1 -0
  5. package/dist/core/monitor.d.ts +47 -0
  6. package/dist/core/monitor.d.ts.map +1 -0
  7. package/dist/core/monitor.js +156 -0
  8. package/dist/core/monitor.js.map +1 -0
  9. package/dist/index.d.ts +63 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +79 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/interfaces/index.d.ts +92 -0
  14. package/dist/interfaces/index.d.ts.map +1 -0
  15. package/dist/interfaces/index.js +3 -0
  16. package/dist/interfaces/index.js.map +1 -0
  17. package/dist/probes/dns.d.ts +17 -0
  18. package/dist/probes/dns.d.ts.map +1 -0
  19. package/dist/probes/dns.js +86 -0
  20. package/dist/probes/dns.js.map +1 -0
  21. package/dist/probes/http.d.ts +17 -0
  22. package/dist/probes/http.d.ts.map +1 -0
  23. package/dist/probes/http.js +117 -0
  24. package/dist/probes/http.js.map +1 -0
  25. package/dist/probes/ping.d.ts +21 -0
  26. package/dist/probes/ping.d.ts.map +1 -0
  27. package/dist/probes/ping.js +37 -0
  28. package/dist/probes/ping.js.map +1 -0
  29. package/dist/probes/tcp.d.ts +14 -0
  30. package/dist/probes/tcp.d.ts.map +1 -0
  31. package/dist/probes/tcp.js +115 -0
  32. package/dist/probes/tcp.js.map +1 -0
  33. package/dist/probes/udp.d.ts +19 -0
  34. package/dist/probes/udp.d.ts.map +1 -0
  35. package/dist/probes/udp.js +135 -0
  36. package/dist/probes/udp.js.map +1 -0
  37. package/dist/utils/latency.d.ts +14 -0
  38. package/dist/utils/latency.d.ts.map +1 -0
  39. package/dist/utils/latency.js +19 -0
  40. package/dist/utils/latency.js.map +1 -0
  41. package/dist/utils/probes/ping.d.ts +24 -0
  42. package/dist/utils/probes/ping.d.ts.map +1 -0
  43. package/dist/utils/probes/ping.js +218 -0
  44. package/dist/utils/probes/ping.js.map +1 -0
  45. package/dist/utils/timer.d.ts +13 -0
  46. package/dist/utils/timer.d.ts.map +1 -0
  47. package/dist/utils/timer.js +19 -0
  48. package/dist/utils/timer.js.map +1 -0
  49. package/package.json +47 -0
@@ -0,0 +1,24 @@
1
+ export type PingResult = {
2
+ ok: boolean;
3
+ latency: number | null;
4
+ error?: string;
5
+ };
6
+ /**
7
+ * Send a raw ICMP echo request to the given IP address and wait for a matching reply.
8
+ * The blocking `recvfrom` syscall runs inside a Worker thread to avoid blocking the main event loop.
9
+ *
10
+ * Requires elevated privileges:
11
+ * - Linux: root or `CAP_NET_RAW` capability
12
+ * - macOS: root or process entitlement
13
+ * - Windows: Administrator
14
+ *
15
+ * @param host - Target IPv4 address. Hostname resolution is not supported — resolve before calling.
16
+ * @param id - ICMP echo identifier (0x0001–0xfffe).
17
+ * @param seq - ICMP echo sequence number (0x0001–0xfffe).
18
+ *
19
+ * @example
20
+ * const result = await rawPing("1.1.1.1", 1, 1);
21
+ * console.log(result.ok, result.latency);
22
+ */
23
+ export declare function rawPing(host: string, id: number, seq: number): Promise<PingResult>;
24
+ //# sourceMappingURL=ping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../../src/utils/probes/ping.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA0HjF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQlF"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.rawPing = rawPing;
40
+ const koffi_1 = __importDefault(require("koffi"));
41
+ const os = __importStar(require("os"));
42
+ const worker_threads_1 = require("worker_threads");
43
+ const timer_1 = require("../timer");
44
+ const platform = os.platform();
45
+ const lib = platform === "win32"
46
+ ? koffi_1.default.load("ws2_32.dll")
47
+ : koffi_1.default.load(platform === "darwin" ? "libSystem.B.dylib" : "libc.so.6");
48
+ const _socket = lib.func("int socket(int domain, int type, int protocol)");
49
+ const _close = platform === "win32"
50
+ ? lib.func("int closesocket(int s)")
51
+ : lib.func("int close(int fd)");
52
+ const _sendto = lib.func(platform === "win32"
53
+ ? "int sendto(int s, uint8* buf, int len, int flags, uint8* to, int tolen)"
54
+ : "int sendto(int sockfd, uint8* buf, size_t len, int flags, uint8* dest_addr, uint32 addrlen)");
55
+ const _recvfrom = lib.func(platform === "win32"
56
+ ? "int recvfrom(int s, uint8* buf, int len, int flags, uint8* from, int* fromlen)"
57
+ : "int recvfrom(int sockfd, uint8* buf, size_t len, int flags, uint8* src_addr, uint32* addrlen)");
58
+ const _inet_addr = lib.func("uint32 inet_addr(str cp)");
59
+ const _setsockopt = lib.func(platform === "win32"
60
+ ? "int setsockopt(int s, int level, int optname, uint8* optval, int optlen)"
61
+ : "int setsockopt(int sockfd, int level, int optname, uint8* optval, uint32 optlen)");
62
+ if (platform === "win32") {
63
+ const _WSAStartup = lib.func("int WSAStartup(uint16 wVersionRequired, uint8* lpWSAData)");
64
+ _WSAStartup(0x0202, Buffer.alloc(408));
65
+ }
66
+ function icmpChecksum(buffer) {
67
+ let sum = 0;
68
+ for (let i = 0; i < buffer.length - 1; i += 2) {
69
+ sum += (buffer[i] << 8) + buffer[i + 1];
70
+ }
71
+ if (buffer.length % 2 !== 0) {
72
+ sum += buffer[buffer.length - 1] << 8;
73
+ }
74
+ while (sum >> 16) {
75
+ sum = (sum & 0xffff) + (sum >> 16);
76
+ }
77
+ return (~sum) & 0xffff;
78
+ }
79
+ function buildICMPPacket(id, seq) {
80
+ const payload = Buffer.from("pingflux-icmp-probe");
81
+ const packet = Buffer.alloc(8 + payload.length);
82
+ packet.writeUInt8(8, 0);
83
+ packet.writeUInt8(0, 1);
84
+ packet.writeUInt16BE(0, 2);
85
+ packet.writeUInt16BE(id & 0xffff, 4);
86
+ packet.writeUInt16BE(seq & 0xffff, 6);
87
+ payload.copy(packet, 8);
88
+ packet.writeUInt16BE(icmpChecksum(packet), 2);
89
+ return packet;
90
+ }
91
+ function parseICMPReply(buffer) {
92
+ if (buffer.length < 28)
93
+ return { type: -1, id: 0, seq: 0 };
94
+ const ihl = (buffer[0] & 0x0f) * 4;
95
+ if (buffer.length < ihl + 8)
96
+ return { type: -1, id: 0, seq: 0 };
97
+ return {
98
+ type: buffer.readUInt8(ihl),
99
+ id: buffer.readUInt16BE(ihl + 4),
100
+ seq: buffer.readUInt16BE(ihl + 6),
101
+ };
102
+ }
103
+ function buildSockAddr(host) {
104
+ const ip = _inet_addr(host);
105
+ if (ip === 0xffffffff)
106
+ return null;
107
+ const addr = Buffer.alloc(16);
108
+ addr.writeUInt16LE(2, 0);
109
+ addr.writeUInt32LE(ip, 4);
110
+ return addr;
111
+ }
112
+ function applyTimeout(sock) {
113
+ if (platform === "win32") {
114
+ const tv = Buffer.alloc(4);
115
+ tv.writeUInt32LE(2000, 0);
116
+ _setsockopt(sock, 0xffff, 0x1006, tv, 4);
117
+ }
118
+ else if (platform === "darwin") {
119
+ const tv = Buffer.alloc(8);
120
+ tv.writeInt32LE(2, 0);
121
+ tv.writeInt32LE(0, 4);
122
+ _setsockopt(sock, 0xffff, 0x1006, tv, 8);
123
+ }
124
+ else {
125
+ const tv = Buffer.alloc(16);
126
+ tv.writeBigInt64LE(BigInt(2), 0);
127
+ tv.writeBigInt64LE(BigInt(0), 8);
128
+ _setsockopt(sock, 1, 20, tv, 16);
129
+ }
130
+ }
131
+ function receiveMatchingReply(sock, id, seq) {
132
+ for (let attempt = 0; attempt < 5; attempt++) {
133
+ const recvBuf = Buffer.alloc(1024);
134
+ const fromLen = Buffer.alloc(4);
135
+ fromLen.writeUInt32LE(16, 0);
136
+ const received = _recvfrom(sock, recvBuf, recvBuf.length, 0, Buffer.alloc(16), fromLen);
137
+ if (received < 0)
138
+ break;
139
+ const reply = parseICMPReply(recvBuf.slice(0, received));
140
+ if (reply.type === 0 && reply.id === id && reply.seq === seq)
141
+ return true;
142
+ }
143
+ return false;
144
+ }
145
+ if (!worker_threads_1.isMainThread && worker_threads_1.workerData?.pingfluxWorker === true) {
146
+ const { host, id, seq } = worker_threads_1.workerData;
147
+ let sock = -1;
148
+ try {
149
+ sock = _socket(2, 3, 1);
150
+ if (sock < 0) {
151
+ worker_threads_1.parentPort.postMessage({
152
+ ok: false,
153
+ latency: null,
154
+ error: platform === "win32"
155
+ ? "Failed to create raw socket — run as Administrator"
156
+ : "Failed to create raw socket — run as root or set CAP_NET_RAW",
157
+ });
158
+ }
159
+ else {
160
+ applyTimeout(sock);
161
+ const addr = buildSockAddr(host);
162
+ if (!addr) {
163
+ _close(sock);
164
+ worker_threads_1.parentPort.postMessage({ ok: false, latency: null, error: "Invalid IP — hostname resolution not supported" });
165
+ }
166
+ else {
167
+ const packet = buildICMPPacket(id, seq);
168
+ const stop = (0, timer_1.startTimer)();
169
+ if (_sendto(sock, packet, packet.length, 0, addr, 16) < 0) {
170
+ _close(sock);
171
+ worker_threads_1.parentPort.postMessage({ ok: false, latency: null, error: "Failed to send ICMP packet" });
172
+ }
173
+ else {
174
+ const matched = receiveMatchingReply(sock, id, seq);
175
+ const latency = stop();
176
+ _close(sock);
177
+ worker_threads_1.parentPort.postMessage(matched
178
+ ? { ok: true, latency }
179
+ : { ok: false, latency: null, error: "ICMP timeout — no matching reply received" });
180
+ }
181
+ }
182
+ }
183
+ }
184
+ catch (err) {
185
+ try {
186
+ _close(sock);
187
+ }
188
+ catch { }
189
+ worker_threads_1.parentPort.postMessage({ ok: false, latency: null, error: err.message });
190
+ }
191
+ }
192
+ /**
193
+ * Send a raw ICMP echo request to the given IP address and wait for a matching reply.
194
+ * The blocking `recvfrom` syscall runs inside a Worker thread to avoid blocking the main event loop.
195
+ *
196
+ * Requires elevated privileges:
197
+ * - Linux: root or `CAP_NET_RAW` capability
198
+ * - macOS: root or process entitlement
199
+ * - Windows: Administrator
200
+ *
201
+ * @param host - Target IPv4 address. Hostname resolution is not supported — resolve before calling.
202
+ * @param id - ICMP echo identifier (0x0001–0xfffe).
203
+ * @param seq - ICMP echo sequence number (0x0001–0xfffe).
204
+ *
205
+ * @example
206
+ * const result = await rawPing("1.1.1.1", 1, 1);
207
+ * console.log(result.ok, result.latency);
208
+ */
209
+ function rawPing(host, id, seq) {
210
+ return new Promise((resolve) => {
211
+ const worker = new worker_threads_1.Worker(__filename, {
212
+ workerData: { pingfluxWorker: true, host, id, seq },
213
+ });
214
+ worker.once("message", (result) => resolve(result));
215
+ worker.once("error", (err) => resolve({ ok: false, latency: null, error: err.message }));
216
+ });
217
+ }
218
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../src/utils/probes/ping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Start a high-resolution timer using `process.hrtime.bigint()`.
3
+ * Call the returned function to get the elapsed time in milliseconds.
4
+ *
5
+ * @returns A function that, when called, returns the elapsed time in milliseconds (floating-point).
6
+ *
7
+ * @example
8
+ * const stop = startTimer();
9
+ * await doSomething();
10
+ * const ms = stop(); // e.g. 42.317
11
+ */
12
+ export declare function startTimer(): () => number;
13
+ //# sourceMappingURL=timer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../../src/utils/timer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,IAAI,MAAM,MAAM,CAGzC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startTimer = startTimer;
4
+ /**
5
+ * Start a high-resolution timer using `process.hrtime.bigint()`.
6
+ * Call the returned function to get the elapsed time in milliseconds.
7
+ *
8
+ * @returns A function that, when called, returns the elapsed time in milliseconds (floating-point).
9
+ *
10
+ * @example
11
+ * const stop = startTimer();
12
+ * await doSomething();
13
+ * const ms = stop(); // e.g. 42.317
14
+ */
15
+ function startTimer() {
16
+ const start = process.hrtime.bigint();
17
+ return () => Number(process.hrtime.bigint() - start) / 1000000;
18
+ }
19
+ //# sourceMappingURL=timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.js","sourceRoot":"","sources":["../../src/utils/timer.ts"],"names":[],"mappings":";;AAWA,gCAGC;AAdD;;;;;;;;;;GAUG;AACH,SAAgB,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACtC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,OAAS,CAAC;AACnE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "pingflux",
3
+ "version": "1.0.0",
4
+ "description": "A lightweight, event-driven network diagnostics and observability SDK for Node.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepublishOnly": "npm run build"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "keywords": [
15
+ "network",
16
+ "ping",
17
+ "tcp",
18
+ "udp",
19
+ "dns",
20
+ "http",
21
+ "latency",
22
+ "diagnostics"
23
+ ],
24
+ "author": "AmirVoid12 (https://github.com/AmirVoid12)",
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/AmirVoid12/pingflux.git"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/AmirVoid12/pingflux/issues"
32
+ },
33
+ "homepage": "https://github.com/AmirVoid12/pingflux#readme",
34
+ "engines": {
35
+ "node": ">=16.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^25.9.1",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "dependencies": {
42
+ "koffi": "^3.0.2"
43
+ },
44
+ "directories": {
45
+ "test": "test"
46
+ }
47
+ }