hono-status-monitor 1.0.2 → 1.0.3
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.
- package/README.md +11 -8
- package/dist/index-edge.d.ts +58 -0
- package/dist/index-edge.d.ts.map +1 -0
- package/dist/index-edge.js +94 -0
- package/dist/index-edge.js.map +1 -0
- package/package.json +20 -3
package/README.md
CHANGED
|
@@ -368,7 +368,7 @@ app.route('/status', monitor.routes);
|
|
|
368
368
|
|
|
369
369
|
## ☁️ Cloudflare Workers / Edge Support
|
|
370
370
|
|
|
371
|
-
This package
|
|
371
|
+
This package provides a separate edge entry point that has **zero Node.js dependencies**.
|
|
372
372
|
|
|
373
373
|
### Available Metrics in Edge Environments
|
|
374
374
|
|
|
@@ -386,13 +386,16 @@ This package automatically detects Cloudflare Workers and edge runtimes, providi
|
|
|
386
386
|
|
|
387
387
|
### Usage in Cloudflare Workers
|
|
388
388
|
|
|
389
|
+
> **Important:** Use the `/edge` import path for Cloudflare Workers!
|
|
390
|
+
|
|
389
391
|
```typescript
|
|
390
392
|
import { Hono } from 'hono';
|
|
391
|
-
|
|
393
|
+
// Use the edge-specific import (no Node.js dependencies)
|
|
394
|
+
import { statusMonitor } from 'hono-status-monitor/edge';
|
|
392
395
|
|
|
393
396
|
const app = new Hono();
|
|
394
397
|
|
|
395
|
-
// Create status monitor
|
|
398
|
+
// Create status monitor
|
|
396
399
|
const monitor = statusMonitor();
|
|
397
400
|
|
|
398
401
|
// Add middleware to track requests
|
|
@@ -407,16 +410,16 @@ app.get('/', (c) => c.text('Hello from Cloudflare Workers!'));
|
|
|
407
410
|
export default app;
|
|
408
411
|
```
|
|
409
412
|
|
|
410
|
-
> **Note:** In
|
|
413
|
+
> **Note:** In edge environments, the dashboard uses HTTP polling (every 5 seconds) instead of WebSocket for updates. The dashboard will display an "Edge Mode" indicator.
|
|
411
414
|
|
|
412
|
-
### Force Edge Mode
|
|
415
|
+
### Force Edge Mode in Node.js
|
|
413
416
|
|
|
414
|
-
You can
|
|
417
|
+
You can also use the edge-compatible monitor in Node.js if you don't need system metrics:
|
|
415
418
|
|
|
416
419
|
```typescript
|
|
417
|
-
import {
|
|
420
|
+
import { statusMonitor } from 'hono-status-monitor/edge';
|
|
418
421
|
|
|
419
|
-
const monitor =
|
|
422
|
+
const monitor = statusMonitor();
|
|
420
423
|
```
|
|
421
424
|
|
|
422
425
|
## 📋 Requirements
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { StatusMonitorConfig } from './types.js';
|
|
3
|
+
export type { StatusMonitorConfig, MetricsSnapshot, ChartData, RouteStats, ErrorEntry, PercentileData, AlertStatus } from './types.js';
|
|
4
|
+
export { createEdgeMonitor, type EdgeMonitor } from './monitor-edge.js';
|
|
5
|
+
export { generateEdgeDashboard } from './dashboard.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a status monitor for Edge/Cloudflare Workers environments
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { Hono } from 'hono';
|
|
12
|
+
* import { statusMonitor } from 'hono-status-monitor/edge';
|
|
13
|
+
*
|
|
14
|
+
* const app = new Hono();
|
|
15
|
+
* const monitor = statusMonitor();
|
|
16
|
+
*
|
|
17
|
+
* app.use('*', monitor.middleware);
|
|
18
|
+
* app.route('/status', monitor.routes);
|
|
19
|
+
*
|
|
20
|
+
* export default app;
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function statusMonitor(config?: StatusMonitorConfig): {
|
|
24
|
+
/** Hono middleware for tracking all requests */
|
|
25
|
+
middleware: (c: any, next: () => Promise<void>) => Promise<void>;
|
|
26
|
+
/** Pre-configured Hono routes for dashboard and API */
|
|
27
|
+
routes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
28
|
+
/** Initialize Socket.io - not available in edge, returns null */
|
|
29
|
+
initSocket: () => any;
|
|
30
|
+
/** Track rate limit events for the dashboard */
|
|
31
|
+
trackRateLimit: (blocked: boolean) => void;
|
|
32
|
+
/** Get current metrics snapshot */
|
|
33
|
+
getMetrics: () => Promise<import("./types.js").MetricsSnapshot>;
|
|
34
|
+
/** Get chart data for all metrics */
|
|
35
|
+
getCharts: () => import("./types.js").ChartData;
|
|
36
|
+
/** Stop metrics collection */
|
|
37
|
+
stop: () => void;
|
|
38
|
+
/** Access to the underlying monitor instance */
|
|
39
|
+
monitor: {
|
|
40
|
+
config: Required<StatusMonitorConfig>;
|
|
41
|
+
trackRequest: (path: string, method: string) => void;
|
|
42
|
+
trackRequestComplete: (path: string, method: string, durationMs: number, statusCode: number) => void;
|
|
43
|
+
trackRateLimitEvent: (blocked: boolean) => void;
|
|
44
|
+
getMetricsSnapshot: () => Promise<import("./types.js").MetricsSnapshot>;
|
|
45
|
+
getChartData: () => import("./types.js").ChartData;
|
|
46
|
+
start: () => void;
|
|
47
|
+
stop: () => void;
|
|
48
|
+
initSocket: () => null;
|
|
49
|
+
formatUptime: (seconds: number) => string;
|
|
50
|
+
isEdgeMode: boolean;
|
|
51
|
+
readonly io: null;
|
|
52
|
+
};
|
|
53
|
+
/** Whether running in edge mode */
|
|
54
|
+
isEdgeMode: boolean;
|
|
55
|
+
};
|
|
56
|
+
export declare const statusMonitorEdge: typeof statusMonitor;
|
|
57
|
+
export default statusMonitor;
|
|
58
|
+
//# sourceMappingURL=index-edge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-edge.d.ts","sourceRoot":"","sources":["../src/index-edge.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD,YAAY,EACR,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,UAAU,EACV,UAAU,EACV,cAAc,EACd,WAAW,EACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,mBAAwB;IAiDtD,gDAAgD;oBA5CvB,GAAG,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC;IA8CvD,uDAAuD;;IAEvD,iEAAiE;sBACvC,GAAG;IAC7B,gDAAgD;8BACtB,OAAO;IACjC,mCAAmC;;IAEnC,qCAAqC;;IAErC,8BAA8B;;IAE9B,gDAAgD;;;;;;;;;;;;;;;IAEhD,mCAAmC;;EAG1C;AAGD,eAAO,MAAM,iBAAiB,sBAAgB,CAAC;AAG/C,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// HONO STATUS MONITOR - EDGE ENTRY POINT
|
|
3
|
+
// For Cloudflare Workers / Edge environments only
|
|
4
|
+
// No Node.js dependencies (os, cluster, socket.io, etc.)
|
|
5
|
+
// =============================================================================
|
|
6
|
+
import { Hono } from 'hono';
|
|
7
|
+
import { createEdgeMonitor } from './monitor-edge.js';
|
|
8
|
+
import { generateEdgeDashboard } from './dashboard.js';
|
|
9
|
+
export { createEdgeMonitor } from './monitor-edge.js';
|
|
10
|
+
export { generateEdgeDashboard } from './dashboard.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create a status monitor for Edge/Cloudflare Workers environments
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { Hono } from 'hono';
|
|
17
|
+
* import { statusMonitor } from 'hono-status-monitor/edge';
|
|
18
|
+
*
|
|
19
|
+
* const app = new Hono();
|
|
20
|
+
* const monitor = statusMonitor();
|
|
21
|
+
*
|
|
22
|
+
* app.use('*', monitor.middleware);
|
|
23
|
+
* app.route('/status', monitor.routes);
|
|
24
|
+
*
|
|
25
|
+
* export default app;
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function statusMonitor(config = {}) {
|
|
29
|
+
const monitor = createEdgeMonitor(config);
|
|
30
|
+
const routes = new Hono();
|
|
31
|
+
// Create middleware for edge
|
|
32
|
+
const middleware = async (c, next) => {
|
|
33
|
+
const path = new URL(c.req.url).pathname;
|
|
34
|
+
const method = c.req.method;
|
|
35
|
+
// Skip status route itself
|
|
36
|
+
if (path.startsWith(config.path || '/status')) {
|
|
37
|
+
return next();
|
|
38
|
+
}
|
|
39
|
+
const start = performance.now();
|
|
40
|
+
monitor.trackRequest(path, method);
|
|
41
|
+
try {
|
|
42
|
+
await next();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
const duration = performance.now() - start;
|
|
46
|
+
const status = c.res?.status || 200;
|
|
47
|
+
monitor.trackRequestComplete(path, method, duration, status);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
// Dashboard page - uses polling mode
|
|
51
|
+
routes.get('/', async (c) => {
|
|
52
|
+
const snapshot = await monitor.getMetricsSnapshot();
|
|
53
|
+
const html = generateEdgeDashboard({
|
|
54
|
+
hostname: snapshot.hostname,
|
|
55
|
+
uptime: monitor.formatUptime(snapshot.uptime),
|
|
56
|
+
title: monitor.config.title
|
|
57
|
+
});
|
|
58
|
+
return c.html(html);
|
|
59
|
+
});
|
|
60
|
+
// JSON API endpoint
|
|
61
|
+
routes.get('/api/metrics', async (c) => {
|
|
62
|
+
return c.json({
|
|
63
|
+
snapshot: await monitor.getMetricsSnapshot(),
|
|
64
|
+
charts: monitor.getChartData()
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
// Start (no-op in edge mode)
|
|
68
|
+
monitor.start();
|
|
69
|
+
return {
|
|
70
|
+
/** Hono middleware for tracking all requests */
|
|
71
|
+
middleware,
|
|
72
|
+
/** Pre-configured Hono routes for dashboard and API */
|
|
73
|
+
routes,
|
|
74
|
+
/** Initialize Socket.io - not available in edge, returns null */
|
|
75
|
+
initSocket: () => null,
|
|
76
|
+
/** Track rate limit events for the dashboard */
|
|
77
|
+
trackRateLimit: (blocked) => monitor.trackRateLimitEvent(blocked),
|
|
78
|
+
/** Get current metrics snapshot */
|
|
79
|
+
getMetrics: () => monitor.getMetricsSnapshot(),
|
|
80
|
+
/** Get chart data for all metrics */
|
|
81
|
+
getCharts: () => monitor.getChartData(),
|
|
82
|
+
/** Stop metrics collection */
|
|
83
|
+
stop: () => monitor.stop(),
|
|
84
|
+
/** Access to the underlying monitor instance */
|
|
85
|
+
monitor,
|
|
86
|
+
/** Whether running in edge mode */
|
|
87
|
+
isEdgeMode: true
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Also export as statusMonitorEdge for clarity
|
|
91
|
+
export const statusMonitorEdge = statusMonitor;
|
|
92
|
+
// Default export
|
|
93
|
+
export default statusMonitor;
|
|
94
|
+
//# sourceMappingURL=index-edge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-edge.js","sourceRoot":"","sources":["../src/index-edge.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hono-status-monitor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Real-time server monitoring dashboard for Hono.js with WebSocket updates. Works with Node.js and Cloudflare Workers. Express-status-monitor style metrics.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./edge": {
|
|
15
|
+
"types": "./dist/index-edge.d.ts",
|
|
16
|
+
"import": "./dist/index-edge.js",
|
|
17
|
+
"require": "./dist/index-edge.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
8
20
|
"files": [
|
|
9
21
|
"dist"
|
|
10
22
|
],
|
|
@@ -41,16 +53,21 @@
|
|
|
41
53
|
"url": "https://github.com/vinitkumargoel/hono-status-monitor/issues"
|
|
42
54
|
},
|
|
43
55
|
"peerDependencies": {
|
|
44
|
-
"@hono/node-server": ">=1.0.0",
|
|
45
56
|
"hono": ">=4.0.0"
|
|
46
57
|
},
|
|
47
|
-
"
|
|
58
|
+
"peerDependenciesMeta": {
|
|
59
|
+
"@hono/node-server": {
|
|
60
|
+
"optional": true
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"optionalDependencies": {
|
|
48
64
|
"socket.io": "^4.7.0"
|
|
49
65
|
},
|
|
50
66
|
"devDependencies": {
|
|
51
67
|
"@hono/node-server": "^1.19.0",
|
|
52
68
|
"@types/node": "^20.0.0",
|
|
53
69
|
"hono": "^4.6.0",
|
|
70
|
+
"socket.io": "^4.7.0",
|
|
54
71
|
"typescript": "^5.3.0",
|
|
55
72
|
"vitest": "^4.0.16"
|
|
56
73
|
},
|