vh-dev-helper 1.0.1 → 1.0.2

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/dist/app.js CHANGED
@@ -3,18 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.App = void 0;
4
4
  const commander_1 = require("commander");
5
5
  const git_route_ts_1 = require("./features/git/git.route.js");
6
+ const logs_route_ts_1 = require("./features/logs/logs.route.js");
6
7
  class App {
7
8
  program;
8
9
  constructor() {
9
10
  this.program = new commander_1.Command();
10
11
  }
11
12
  initialiazeCommandar() {
12
- this.program.name("vh").description("VH Helper Cli").version("0.0.1");
13
+ this.program.name("vh").description("VH Helper CLI").version("1.0.1");
13
14
  this.registerAllCommands();
14
15
  this.program.parse();
15
16
  }
16
17
  registerAllCommands() {
17
18
  git_route_ts_1.gitCommandRouter.register(this.program);
19
+ logs_route_ts_1.logsCommandRouter.register(this.program);
18
20
  }
19
21
  }
20
22
  exports.App = App;
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,8DAA+D;AAE/D,MAAa,GAAG;IACN,OAAO,CAAU;IAEzB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,mBAAmB;QACjB,+BAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAhBD,kBAgBC;AAED,kBAAe,IAAI,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,8DAA+D;AAC/D,iEAAkE;AAElE,MAAa,GAAG;IACN,OAAO,CAAU;IAEzB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,mBAAmB;QACjB,+BAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,iCAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF;AAjBD,kBAiBC;AAED,kBAAe,IAAI,GAAG,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const logsCommandRouter: {
3
+ register(program: Command): void;
4
+ };
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logsCommandRouter = void 0;
4
+ const node_http_1 = require("node:http");
5
+ const logs_socket_js_1 = require("./logs.socket.js");
6
+ exports.logsCommandRouter = {
7
+ register(program) {
8
+ const logs = program
9
+ .command("logs")
10
+ .description("Application logging tools");
11
+ logs
12
+ .command("serve")
13
+ .description("Start the VH log collection server")
14
+ .option("-p, --port <port>", "Port to listen on", "4317")
15
+ .action((options) => {
16
+ const port = Number(options.port);
17
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
18
+ throw new Error("Port must be an integer from 1 to 65535");
19
+ }
20
+ const httpServer = (0, node_http_1.createServer)((req, res) => {
21
+ if (req.url === "/health") {
22
+ res.writeHead(200, {
23
+ "content-type": "application/json",
24
+ });
25
+ res.end(JSON.stringify({ ok: true, service: "vh-logs" }));
26
+ return;
27
+ }
28
+ res.writeHead(404, {
29
+ "content-type": "application/json",
30
+ });
31
+ res.end(JSON.stringify({ error: "Not found" }));
32
+ });
33
+ const logsServer = (0, logs_socket_js_1.createLogsSocketServer)(httpServer);
34
+ httpServer.listen(port, "0.0.0.0", () => {
35
+ console.log(`[VH] Log server listening on port ${port}`);
36
+ console.log(`[VH] Health check: http://localhost:${port}/health`);
37
+ });
38
+ const shutdown = () => {
39
+ console.log("\n[VH] Shutting down log server...");
40
+ logsServer.io.close(() => {
41
+ console.log("[VH] Log server stopped");
42
+ process.exit(0);
43
+ });
44
+ };
45
+ process.once("SIGINT", shutdown);
46
+ process.once("SIGTERM", shutdown);
47
+ });
48
+ },
49
+ };
50
+ //# sourceMappingURL=logs.route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.route.js","sourceRoot":"","sources":["../../../src/features/logs/logs.route.ts"],"names":[],"mappings":";;;AACA,yCAAyC;AACzC,qDAA0D;AAE7C,QAAA,iBAAiB,GAAG;IAC/B,QAAQ,CAAC,OAAgB;QACvB,MAAM,IAAI,GAAG,OAAO;aACjB,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,2BAA2B,CAAC,CAAC;QAE5C,IAAI;aACD,OAAO,CAAC,OAAO,CAAC;aAChB,WAAW,CAAC,oCAAoC,CAAC;aACjD,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,CAAC;aACxD,MAAM,CAAC,CAAC,OAAyB,EAAE,EAAE;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,UAAU,GAAG,IAAA,wBAAY,EAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC3C,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;wBACjB,cAAc,EAAE,kBAAkB;qBACnC,CAAC,CAAC;oBACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBAC1D,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,cAAc,EAAE,kBAAkB;iBACnC,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAA,uCAAsB,EAAC,UAAU,CAAC,CAAC;YAEtD,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;gBACtC,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,SAAS,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;gBACpB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAElD,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;oBACvB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=logs.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.service.js","sourceRoot":"","sources":["../../../src/features/logs/logs.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { Server as HttpServer } from "node:http";
2
+ import { Server } from "socket.io";
3
+ interface VHEvent {
4
+ eventId: string;
5
+ appName: string;
6
+ timestamp: number;
7
+ type: "log" | "network:req" | "network:res";
8
+ [key: string]: unknown;
9
+ }
10
+ export declare function createLogsSocketServer(httpServer: HttpServer): {
11
+ io: Server<import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, any>;
12
+ getEvents(): VHEvent[];
13
+ close(): Promise<void>;
14
+ };
15
+ export type LogsSocketServer = ReturnType<typeof createLogsSocketServer>;
16
+ export {};
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLogsSocketServer = createLogsSocketServer;
4
+ const socket_io_1 = require("socket.io");
5
+ const MAX_BATCH_SIZE = 50;
6
+ const MAX_STORED_EVENTS = 10_000;
7
+ const events = new Map();
8
+ function isVHEvent(value) {
9
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
10
+ return false;
11
+ }
12
+ const event = value;
13
+ if (typeof event.eventId !== "string" ||
14
+ event.eventId.length === 0 ||
15
+ typeof event.appName !== "string" ||
16
+ event.appName.length === 0 ||
17
+ typeof event.timestamp !== "number" ||
18
+ !Number.isFinite(event.timestamp)) {
19
+ return false;
20
+ }
21
+ switch (event.type) {
22
+ case "log":
23
+ return (typeof event.message === "string" &&
24
+ ["debug", "info", "warn", "error"].includes(String(event.level)) &&
25
+ typeof event.fingerprint === "string");
26
+ case "network:req":
27
+ return (typeof event.requestId === "string" &&
28
+ typeof event.method === "string" &&
29
+ typeof event.url === "string");
30
+ case "network:res":
31
+ return (typeof event.requestId === "string" &&
32
+ (event.status === undefined ||
33
+ (typeof event.status === "number" &&
34
+ Number.isFinite(event.status))) &&
35
+ (event.durationMs === undefined ||
36
+ (typeof event.durationMs === "number" &&
37
+ Number.isFinite(event.durationMs))) &&
38
+ (event.error === undefined || typeof event.error === "string"));
39
+ default:
40
+ return false;
41
+ }
42
+ }
43
+ function createLogsSocketServer(httpServer) {
44
+ const io = new socket_io_1.Server(httpServer, {
45
+ cors: {
46
+ // Adjust this to your dashboard origin when browser access is enabled.
47
+ origin: ["http://localhost:3000"],
48
+ },
49
+ });
50
+ io.engine.on("connection_error", (error) => {
51
+ console.error("[VH Logs] Connection error:", {
52
+ code: error.code,
53
+ message: error.message,
54
+ context: error.context,
55
+ });
56
+ });
57
+ io.on("connection", (socket) => {
58
+ console.log(`[VH Logs] Client connected: ${socket.id}`);
59
+ socket.on("vh:events", (payload, acknowledge) => {
60
+ console.log("[VH Logs] vh:events received", {
61
+ isArray: Array.isArray(payload),
62
+ count: Array.isArray(payload) ? payload.length : 0,
63
+ });
64
+ if (typeof acknowledge !== "function") {
65
+ console.warn("[VH Logs] Received batch without acknowledgement callback");
66
+ return;
67
+ }
68
+ if (!Array.isArray(payload) ||
69
+ payload.length === 0 ||
70
+ payload.length > MAX_BATCH_SIZE) {
71
+ acknowledge({
72
+ ok: false,
73
+ error: `Expected between 1 and ${MAX_BATCH_SIZE} events`,
74
+ });
75
+ return;
76
+ }
77
+ if (!payload.every(isVHEvent)) {
78
+ acknowledge({
79
+ ok: false,
80
+ error: "Batch contains invalid events",
81
+ });
82
+ return;
83
+ }
84
+ const batch = payload;
85
+ const batchIds = new Set();
86
+ // Reject conflicting duplicate IDs within the same batch.
87
+ for (const event of batch) {
88
+ if (batchIds.has(event.eventId)) {
89
+ acknowledge({
90
+ ok: false,
91
+ error: `Duplicate eventId in batch: ${event.eventId}`,
92
+ });
93
+ return;
94
+ }
95
+ batchIds.add(event.eventId);
96
+ }
97
+ for (const event of batch) {
98
+ // Retried events are already accepted; don't store them twice.
99
+ if (events.has(event.eventId)) {
100
+ continue;
101
+ }
102
+ events.set(event.eventId, event);
103
+ if (events.size > MAX_STORED_EVENTS) {
104
+ const oldestId = events.keys().next().value;
105
+ if (oldestId !== undefined) {
106
+ events.delete(oldestId);
107
+ }
108
+ }
109
+ console.log(`[VH Logs] ${event.appName} | ${event.type} | ${event.eventId}`);
110
+ }
111
+ // Confirms in-memory acceptance, not durable database storage.
112
+ acknowledge({
113
+ ok: true,
114
+ eventIds: batch.map((event) => event.eventId),
115
+ });
116
+ });
117
+ socket.on("disconnect", (reason) => {
118
+ console.log(`[VH Logs] Client disconnected: ${socket.id} (${reason})`);
119
+ });
120
+ });
121
+ return {
122
+ io,
123
+ getEvents() {
124
+ return Array.from(events.values());
125
+ },
126
+ close() {
127
+ return new Promise((resolve) => {
128
+ io.close(() => resolve());
129
+ });
130
+ },
131
+ };
132
+ }
133
+ //# sourceMappingURL=logs.socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.socket.js","sourceRoot":"","sources":["../../../src/features/logs/logs.socket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=logs.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.store.js","sourceRoot":"","sources":["../../../src/features/logs/logs.store.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=logs.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.types.js","sourceRoot":"","sources":["../../../src/features/logs/logs.types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vh-dev-helper",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Developer productivity CLI and dashboard toolkit",
5
5
  "type": "commonjs",
6
6
  "main": "dist/bin/index.js",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "scripts": {
19
19
  "clean": "rm -rf dist",
20
- "build": "tsc -p tsconfig.json",
20
+ "build": "yarn run clean && tsc -p tsconfig.json",
21
21
  "prepare": "yarn build",
22
22
  "dev": "tsc -w",
23
23
  "prepublishOnly": "yarn clean && yarn build"
@@ -43,6 +43,7 @@
43
43
  "commander": "^15.0.0",
44
44
  "enquirer": "^2.4.1",
45
45
  "log-update": "^8.0.0",
46
+ "socket.io": "^4.8.4",
46
47
  "typescript": "^6.0.3"
47
48
  },
48
49
  "devDependencies": {