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 CHANGED
@@ -368,7 +368,7 @@ app.route('/status', monitor.routes);
368
368
 
369
369
  ## ☁️ Cloudflare Workers / Edge Support
370
370
 
371
- This package automatically detects Cloudflare Workers and edge runtimes, providing a lightweight monitor with available metrics.
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
- import { statusMonitor } from 'hono-status-monitor';
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 - automatically detects edge environment
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 Cloudflare Workers, the dashboard uses HTTP polling (every 5 seconds) instead of WebSocket for updates. The dashboard will display an "Edge Mode" indicator.
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 explicitly use the edge-compatible monitor:
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 { statusMonitorEdge } from 'hono-status-monitor';
420
+ import { statusMonitor } from 'hono-status-monitor/edge';
418
421
 
419
- const monitor = statusMonitorEdge();
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":"AAAA,gFAAgF;AAChF,yCAAyC;AACzC,kDAAkD;AAClD,yDAAyD;AACzD,gFAAgF;AAEhF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAavD,OAAO,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,SAA8B,EAAE;IAC1D,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAE1B,6BAA6B;IAC7B,MAAM,UAAU,GAAG,KAAK,EAAE,CAAM,EAAE,IAAyB,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAE5B,2BAA2B;QAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnC,IAAI,CAAC;YACD,MAAM,IAAI,EAAE,CAAC;QACjB,CAAC;gBAAS,CAAC;YACP,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,CAAC;YACpC,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;IACL,CAAC,CAAC;IAEF,qCAAqC;IACrC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC;YAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,MAAM,OAAO,CAAC,kBAAkB,EAAE;YAC5C,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE;SACjC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,OAAO;QACH,gDAAgD;QAChD,UAAU;QACV,uDAAuD;QACvD,MAAM;QACN,iEAAiE;QACjE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAW;QAC7B,gDAAgD;QAChD,cAAc,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC;QAC1E,mCAAmC;QACnC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE;QAC9C,qCAAqC;QACrC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE;QACvC,8BAA8B;QAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1B,gDAAgD;QAChD,OAAO;QACP,mCAAmC;QACnC,UAAU,EAAE,IAAI;KACnB,CAAC;AACN,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C,iBAAiB;AACjB,eAAe,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,22 @@
1
1
  {
2
2
  "name": "hono-status-monitor",
3
- "version": "1.0.2",
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
- "dependencies": {
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
  },