@logwatch/node 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.
@@ -0,0 +1,31 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface LogWatchConfig {
3
+ apiKey: string;
4
+ baseUrl?: string;
5
+ flushInterval?: number;
6
+ batchSize?: number;
7
+ }
8
+ export interface FlushResult {
9
+ accepted: number;
10
+ dropped: number;
11
+ }
12
+ export declare class LogWatch extends EventEmitter {
13
+ private readonly apiKey;
14
+ private readonly baseUrl;
15
+ private readonly flushInterval;
16
+ private readonly batchSize;
17
+ private buffer;
18
+ private timer;
19
+ constructor(config: LogWatchConfig);
20
+ /** Start periodic flushing of buffered log lines. */
21
+ attach(): this;
22
+ /** Stop the flush timer and drain remaining buffer. */
23
+ detach(): this;
24
+ /** Buffer a single log line for ingestion. */
25
+ log(line: string): this;
26
+ /** Flush all buffered lines to the LogWatch ingest API. */
27
+ flush(): Promise<FlushResult | null>;
28
+ private _post;
29
+ }
30
+ export default LogWatch;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAA+C;gBAEhD,MAAM,EAAE,cAAc;IAQlC,qDAAqD;IACrD,MAAM,IAAI,IAAI;IAOd,uDAAuD;IACvD,MAAM,IAAI,IAAI;IAUd,8CAA8C;IAC9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWvB,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAa1C,OAAO,CAAC,KAAK;CA0Cd;AAED,eAAe,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,138 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LogWatch = void 0;
37
+ const events_1 = require("events");
38
+ const https = __importStar(require("https"));
39
+ const http = __importStar(require("http"));
40
+ class LogWatch extends events_1.EventEmitter {
41
+ constructor(config) {
42
+ super();
43
+ this.buffer = [];
44
+ this.timer = null;
45
+ this.apiKey = config.apiKey;
46
+ this.baseUrl = config.baseUrl ?? 'http://localhost:8080';
47
+ this.flushInterval = config.flushInterval ?? 5000;
48
+ this.batchSize = config.batchSize ?? 100;
49
+ }
50
+ /** Start periodic flushing of buffered log lines. */
51
+ attach() {
52
+ if (this.timer)
53
+ return this;
54
+ this.timer = setInterval(() => { void this.flush(); }, this.flushInterval);
55
+ this.emit('attached');
56
+ return this;
57
+ }
58
+ /** Stop the flush timer and drain remaining buffer. */
59
+ detach() {
60
+ if (this.timer) {
61
+ clearInterval(this.timer);
62
+ this.timer = null;
63
+ }
64
+ void this.flush();
65
+ this.emit('detached');
66
+ return this;
67
+ }
68
+ /** Buffer a single log line for ingestion. */
69
+ log(line) {
70
+ const trimmed = line.trimEnd();
71
+ if (trimmed) {
72
+ this.buffer.push(trimmed);
73
+ if (this.buffer.length >= this.batchSize) {
74
+ void this.flush();
75
+ }
76
+ }
77
+ return this;
78
+ }
79
+ /** Flush all buffered lines to the LogWatch ingest API. */
80
+ async flush() {
81
+ if (this.buffer.length === 0)
82
+ return null;
83
+ const lines = this.buffer.splice(0);
84
+ try {
85
+ const result = await this._post(lines);
86
+ this.emit('flushed', result);
87
+ return result;
88
+ }
89
+ catch (err) {
90
+ this.emit('error', err);
91
+ return null;
92
+ }
93
+ }
94
+ _post(lines) {
95
+ return new Promise((resolve, reject) => {
96
+ const body = JSON.stringify({ lines });
97
+ const url = new URL('/api/ingest', this.baseUrl);
98
+ const isHttps = url.protocol === 'https:';
99
+ const transport = isHttps ? https : http;
100
+ const options = {
101
+ hostname: url.hostname,
102
+ port: url.port ? parseInt(url.port, 10) : (isHttps ? 443 : 80),
103
+ path: url.pathname,
104
+ method: 'POST',
105
+ headers: {
106
+ 'Content-Type': 'application/json',
107
+ 'Content-Length': Buffer.byteLength(body),
108
+ 'X-Api-Key': this.apiKey,
109
+ },
110
+ };
111
+ const req = transport.request(options, (res) => {
112
+ let data = '';
113
+ res.on('data', (chunk) => {
114
+ data += typeof chunk === 'string' ? chunk : chunk.toString();
115
+ });
116
+ res.on('end', () => {
117
+ if (res.statusCode !== undefined && res.statusCode >= 400) {
118
+ reject(new Error(`LogWatch ingest failed: HTTP ${res.statusCode}`));
119
+ }
120
+ else {
121
+ try {
122
+ resolve(JSON.parse(data));
123
+ }
124
+ catch {
125
+ resolve({ accepted: lines.length, dropped: 0 });
126
+ }
127
+ }
128
+ });
129
+ });
130
+ req.on('error', reject);
131
+ req.write(body);
132
+ req.end();
133
+ });
134
+ }
135
+ }
136
+ exports.LogWatch = LogWatch;
137
+ exports.default = LogWatch;
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@logwatch/node",
3
+ "version": "1.0.0",
4
+ "description": "Node.js SDK for LogWatch — AI-powered log anomaly detection",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "keywords": [
15
+ "logwatch",
16
+ "anomaly",
17
+ "detection",
18
+ "monitoring",
19
+ "observability"
20
+ ],
21
+ "license": "MIT",
22
+ "devDependencies": {
23
+ "@types/node": "^20.14.0",
24
+ "typescript": "^5.4.5"
25
+ }
26
+ }