log-search 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.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/bin/log-search.js +45 -0
- package/dist/cli/commands/clear.d.ts +9 -0
- package/dist/cli/commands/clear.d.ts.map +1 -0
- package/dist/cli/commands/clear.js +116 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/index.d.ts +8 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +118 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/info.d.ts +8 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +96 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/search.d.ts +9 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +178 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +8 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +141 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +57 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output/colorizer.d.ts +36 -0
- package/dist/cli/output/colorizer.d.ts.map +1 -0
- package/dist/cli/output/colorizer.js +101 -0
- package/dist/cli/output/colorizer.js.map +1 -0
- package/dist/cli/output/formatter.d.ts +31 -0
- package/dist/cli/output/formatter.d.ts.map +1 -0
- package/dist/cli/output/formatter.js +146 -0
- package/dist/cli/output/formatter.js.map +1 -0
- package/dist/cli/output/table.d.ts +12 -0
- package/dist/cli/output/table.d.ts.map +1 -0
- package/dist/cli/output/table.js +48 -0
- package/dist/cli/output/table.js.map +1 -0
- package/dist/core/indexer/ChunkProcessor.d.ts +21 -0
- package/dist/core/indexer/ChunkProcessor.d.ts.map +1 -0
- package/dist/core/indexer/ChunkProcessor.js +105 -0
- package/dist/core/indexer/ChunkProcessor.js.map +1 -0
- package/dist/core/indexer/IndexBuilder.d.ts +47 -0
- package/dist/core/indexer/IndexBuilder.d.ts.map +1 -0
- package/dist/core/indexer/IndexBuilder.js +274 -0
- package/dist/core/indexer/IndexBuilder.js.map +1 -0
- package/dist/core/indexer/IndexSerializer.d.ts +30 -0
- package/dist/core/indexer/IndexSerializer.d.ts.map +1 -0
- package/dist/core/indexer/IndexSerializer.js +142 -0
- package/dist/core/indexer/IndexSerializer.js.map +1 -0
- package/dist/core/indexer/OffsetMapper.d.ts +55 -0
- package/dist/core/indexer/OffsetMapper.d.ts.map +1 -0
- package/dist/core/indexer/OffsetMapper.js +94 -0
- package/dist/core/indexer/OffsetMapper.js.map +1 -0
- package/dist/core/indexer/TokenExtractor.d.ts +27 -0
- package/dist/core/indexer/TokenExtractor.d.ts.map +1 -0
- package/dist/core/indexer/TokenExtractor.js +92 -0
- package/dist/core/indexer/TokenExtractor.js.map +1 -0
- package/dist/core/searcher/IndexSearcher.d.ts +37 -0
- package/dist/core/searcher/IndexSearcher.d.ts.map +1 -0
- package/dist/core/searcher/IndexSearcher.js +360 -0
- package/dist/core/searcher/IndexSearcher.js.map +1 -0
- package/dist/core/searcher/RankEngine.d.ts +29 -0
- package/dist/core/searcher/RankEngine.d.ts.map +1 -0
- package/dist/core/searcher/RankEngine.js +90 -0
- package/dist/core/searcher/RankEngine.js.map +1 -0
- package/dist/core/searcher/ResultFetcher.d.ts +37 -0
- package/dist/core/searcher/ResultFetcher.d.ts.map +1 -0
- package/dist/core/searcher/ResultFetcher.js +118 -0
- package/dist/core/searcher/ResultFetcher.js.map +1 -0
- package/dist/core/streaming/ChunkSplitter.d.ts +25 -0
- package/dist/core/streaming/ChunkSplitter.d.ts.map +1 -0
- package/dist/core/streaming/ChunkSplitter.js +71 -0
- package/dist/core/streaming/ChunkSplitter.js.map +1 -0
- package/dist/core/streaming/FileStreamer.d.ts +39 -0
- package/dist/core/streaming/FileStreamer.d.ts.map +1 -0
- package/dist/core/streaming/FileStreamer.js +138 -0
- package/dist/core/streaming/FileStreamer.js.map +1 -0
- package/dist/core/streaming/LineBuffer.d.ts +26 -0
- package/dist/core/streaming/LineBuffer.d.ts.map +1 -0
- package/dist/core/streaming/LineBuffer.js +52 -0
- package/dist/core/streaming/LineBuffer.js.map +1 -0
- package/dist/core/workers/IndexWorker.d.ts +8 -0
- package/dist/core/workers/IndexWorker.d.ts.map +1 -0
- package/dist/core/workers/IndexWorker.js +41 -0
- package/dist/core/workers/IndexWorker.js.map +1 -0
- package/dist/core/workers/SearchWorker.d.ts +7 -0
- package/dist/core/workers/SearchWorker.d.ts.map +1 -0
- package/dist/core/workers/SearchWorker.js +63 -0
- package/dist/core/workers/SearchWorker.js.map +1 -0
- package/dist/core/workers/WorkerPool.d.ts +30 -0
- package/dist/core/workers/WorkerPool.d.ts.map +1 -0
- package/dist/core/workers/WorkerPool.js +132 -0
- package/dist/core/workers/WorkerPool.js.map +1 -0
- package/dist/formats/LogFormatDetector.d.ts +22 -0
- package/dist/formats/LogFormatDetector.d.ts.map +1 -0
- package/dist/formats/LogFormatDetector.js +123 -0
- package/dist/formats/LogFormatDetector.js.map +1 -0
- package/dist/formats/parsers/ApacheParser.d.ts +10 -0
- package/dist/formats/parsers/ApacheParser.d.ts.map +1 -0
- package/dist/formats/parsers/ApacheParser.js +54 -0
- package/dist/formats/parsers/ApacheParser.js.map +1 -0
- package/dist/formats/parsers/GenericParser.d.ts +11 -0
- package/dist/formats/parsers/GenericParser.d.ts.map +1 -0
- package/dist/formats/parsers/GenericParser.js +61 -0
- package/dist/formats/parsers/GenericParser.js.map +1 -0
- package/dist/formats/parsers/JsonParser.d.ts +12 -0
- package/dist/formats/parsers/JsonParser.d.ts.map +1 -0
- package/dist/formats/parsers/JsonParser.js +92 -0
- package/dist/formats/parsers/JsonParser.js.map +1 -0
- package/dist/formats/parsers/NginxParser.d.ts +15 -0
- package/dist/formats/parsers/NginxParser.d.ts.map +1 -0
- package/dist/formats/parsers/NginxParser.js +78 -0
- package/dist/formats/parsers/NginxParser.js.map +1 -0
- package/dist/formats/parsers/SyslogParser.d.ts +10 -0
- package/dist/formats/parsers/SyslogParser.d.ts.map +1 -0
- package/dist/formats/parsers/SyslogParser.js +73 -0
- package/dist/formats/parsers/SyslogParser.js.map +1 -0
- package/dist/formats/schemas/LogSchema.d.ts +70 -0
- package/dist/formats/schemas/LogSchema.d.ts.map +1 -0
- package/dist/formats/schemas/LogSchema.js +7 -0
- package/dist/formats/schemas/LogSchema.js.map +1 -0
- package/dist/index-store/CacheManager.d.ts +45 -0
- package/dist/index-store/CacheManager.d.ts.map +1 -0
- package/dist/index-store/CacheManager.js +84 -0
- package/dist/index-store/CacheManager.js.map +1 -0
- package/dist/index-store/FileWatcher.d.ts +39 -0
- package/dist/index-store/FileWatcher.d.ts.map +1 -0
- package/dist/index-store/FileWatcher.js +121 -0
- package/dist/index-store/FileWatcher.js.map +1 -0
- package/dist/index-store/IncrementalUpdater.d.ts +19 -0
- package/dist/index-store/IncrementalUpdater.d.ts.map +1 -0
- package/dist/index-store/IncrementalUpdater.js +62 -0
- package/dist/index-store/IncrementalUpdater.js.map +1 -0
- package/dist/index-store/IndexStore.d.ts +66 -0
- package/dist/index-store/IndexStore.d.ts.map +1 -0
- package/dist/index-store/IndexStore.js +183 -0
- package/dist/index-store/IndexStore.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/pro/alerts/AlertEngine.d.ts +35 -0
- package/dist/pro/alerts/AlertEngine.d.ts.map +1 -0
- package/dist/pro/alerts/AlertEngine.js +162 -0
- package/dist/pro/alerts/AlertEngine.js.map +1 -0
- package/dist/pro/alerts/Notifier.d.ts +23 -0
- package/dist/pro/alerts/Notifier.d.ts.map +1 -0
- package/dist/pro/alerts/Notifier.js +173 -0
- package/dist/pro/alerts/Notifier.js.map +1 -0
- package/dist/pro/alerts/RuleParser.d.ts +32 -0
- package/dist/pro/alerts/RuleParser.d.ts.map +1 -0
- package/dist/pro/alerts/RuleParser.js +86 -0
- package/dist/pro/alerts/RuleParser.js.map +1 -0
- package/dist/pro/auth/LicenseValidator.d.ts +29 -0
- package/dist/pro/auth/LicenseValidator.d.ts.map +1 -0
- package/dist/pro/auth/LicenseValidator.js +122 -0
- package/dist/pro/auth/LicenseValidator.js.map +1 -0
- package/dist/pro/auth/TokenManager.d.ts +27 -0
- package/dist/pro/auth/TokenManager.d.ts.map +1 -0
- package/dist/pro/auth/TokenManager.js +98 -0
- package/dist/pro/auth/TokenManager.js.map +1 -0
- package/dist/pro/webui/UIServer.d.ts +34 -0
- package/dist/pro/webui/UIServer.d.ts.map +1 -0
- package/dist/pro/webui/UIServer.js +353 -0
- package/dist/pro/webui/UIServer.js.map +1 -0
- package/dist/query/QueryEngine.d.ts +34 -0
- package/dist/query/QueryEngine.d.ts.map +1 -0
- package/dist/query/QueryEngine.js +187 -0
- package/dist/query/QueryEngine.js.map +1 -0
- package/dist/query/operators/AndOperator.d.ts +18 -0
- package/dist/query/operators/AndOperator.d.ts.map +1 -0
- package/dist/query/operators/AndOperator.js +55 -0
- package/dist/query/operators/AndOperator.js.map +1 -0
- package/dist/query/operators/NotOperator.d.ts +19 -0
- package/dist/query/operators/NotOperator.d.ts.map +1 -0
- package/dist/query/operators/NotOperator.js +43 -0
- package/dist/query/operators/NotOperator.js.map +1 -0
- package/dist/query/operators/OrOperator.d.ts +17 -0
- package/dist/query/operators/OrOperator.d.ts.map +1 -0
- package/dist/query/operators/OrOperator.js +54 -0
- package/dist/query/operators/OrOperator.js.map +1 -0
- package/dist/query/operators/RangeOperator.d.ts +23 -0
- package/dist/query/operators/RangeOperator.d.ts.map +1 -0
- package/dist/query/operators/RangeOperator.js +63 -0
- package/dist/query/operators/RangeOperator.js.map +1 -0
- package/dist/query/regex/FuzzyMatcher.d.ts +29 -0
- package/dist/query/regex/FuzzyMatcher.d.ts.map +1 -0
- package/dist/query/regex/FuzzyMatcher.js +89 -0
- package/dist/query/regex/FuzzyMatcher.js.map +1 -0
- package/dist/query/regex/RegexMatcher.d.ts +31 -0
- package/dist/query/regex/RegexMatcher.d.ts.map +1 -0
- package/dist/query/regex/RegexMatcher.js +73 -0
- package/dist/query/regex/RegexMatcher.js.map +1 -0
- package/dist/types/ConfigTypes.d.ts +78 -0
- package/dist/types/ConfigTypes.d.ts.map +1 -0
- package/dist/types/ConfigTypes.js +7 -0
- package/dist/types/ConfigTypes.js.map +1 -0
- package/dist/types/IndexTypes.d.ts +86 -0
- package/dist/types/IndexTypes.d.ts.map +1 -0
- package/dist/types/IndexTypes.js +7 -0
- package/dist/types/IndexTypes.js.map +1 -0
- package/dist/types/SearchTypes.d.ts +102 -0
- package/dist/types/SearchTypes.d.ts.map +1 -0
- package/dist/types/SearchTypes.js +7 -0
- package/dist/types/SearchTypes.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fs-helpers.d.ts +9 -0
- package/dist/utils/fs-helpers.d.ts.map +1 -0
- package/dist/utils/fs-helpers.js +76 -0
- package/dist/utils/fs-helpers.js.map +1 -0
- package/dist/utils/hash.d.ts +7 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +49 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performance.d.ts +14 -0
- package/dist/utils/performance.d.ts.map +1 -0
- package/dist/utils/performance.js +32 -0
- package/dist/utils/performance.js.map +1 -0
- package/dist/utils/progress.d.ts +7 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +22 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JsonParser.ts
|
|
4
|
+
* Parses JSON-structured log lines (e.g., Bunyan, Pino, Winston JSON format).
|
|
5
|
+
* Extracts common fields: timestamp, level, message, and all other fields.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.JsonParser = void 0;
|
|
9
|
+
// Common timestamp field names
|
|
10
|
+
const TS_FIELDS = ['timestamp', 'time', '@timestamp', 'ts', 'date', 'datetime'];
|
|
11
|
+
// Common level field names
|
|
12
|
+
const LEVEL_FIELDS = ['level', 'severity', 'log.level', 'logLevel'];
|
|
13
|
+
// Common message field names
|
|
14
|
+
const MSG_FIELDS = ['message', 'msg', 'text', 'body', 'content'];
|
|
15
|
+
class JsonParser {
|
|
16
|
+
parse(line, lineNumber, byteOffset) {
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
if (!trimmed.startsWith('{'))
|
|
19
|
+
return null;
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(trimmed);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Extract timestamp
|
|
28
|
+
let timestamp;
|
|
29
|
+
for (const field of TS_FIELDS) {
|
|
30
|
+
const val = parsed[field];
|
|
31
|
+
if (val) {
|
|
32
|
+
const d = new Date(val);
|
|
33
|
+
if (!isNaN(d.getTime())) {
|
|
34
|
+
timestamp = d;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Extract level
|
|
40
|
+
let level;
|
|
41
|
+
for (const field of LEVEL_FIELDS) {
|
|
42
|
+
const val = parsed[field];
|
|
43
|
+
if (typeof val === 'string') {
|
|
44
|
+
level = val.toUpperCase();
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
else if (typeof val === 'number') {
|
|
48
|
+
// Bunyan level numbers
|
|
49
|
+
level = this.bunyanLevelToString(val);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Extract message
|
|
54
|
+
let message;
|
|
55
|
+
for (const field of MSG_FIELDS) {
|
|
56
|
+
const val = parsed[field];
|
|
57
|
+
if (typeof val === 'string') {
|
|
58
|
+
message = val;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
raw: line,
|
|
64
|
+
lineNumber,
|
|
65
|
+
byteOffset,
|
|
66
|
+
format: 'json',
|
|
67
|
+
timestamp,
|
|
68
|
+
level,
|
|
69
|
+
message,
|
|
70
|
+
...parsed,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
bunyanLevelToString(level) {
|
|
74
|
+
if (level <= 10)
|
|
75
|
+
return 'TRACE';
|
|
76
|
+
if (level <= 20)
|
|
77
|
+
return 'DEBUG';
|
|
78
|
+
if (level <= 30)
|
|
79
|
+
return 'INFO';
|
|
80
|
+
if (level <= 40)
|
|
81
|
+
return 'WARN';
|
|
82
|
+
if (level <= 50)
|
|
83
|
+
return 'ERROR';
|
|
84
|
+
return 'FATAL';
|
|
85
|
+
}
|
|
86
|
+
static test(line) {
|
|
87
|
+
const t = line.trim();
|
|
88
|
+
return t.startsWith('{') && t.endsWith('}');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.JsonParser = JsonParser;
|
|
92
|
+
//# sourceMappingURL=JsonParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/JsonParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NginxParser.ts
|
|
3
|
+
* Parses Nginx combined/common access log format.
|
|
4
|
+
* Example: 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.1" 200 2326
|
|
5
|
+
*/
|
|
6
|
+
import type { NginxLogEntry } from '../schemas/LogSchema';
|
|
7
|
+
export declare class NginxParser {
|
|
8
|
+
parse(line: string, lineNumber?: number, byteOffset?: number): NginxLogEntry | null;
|
|
9
|
+
private statusToLevel;
|
|
10
|
+
/**
|
|
11
|
+
* Test if a line looks like Nginx format.
|
|
12
|
+
*/
|
|
13
|
+
static test(line: string): boolean;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=NginxParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NginxParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/NginxParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,qBAAa,WAAW;IACtB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAiDnF,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NginxParser.ts
|
|
4
|
+
* Parses Nginx combined/common access log format.
|
|
5
|
+
* Example: 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.1" 200 2326
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.NginxParser = void 0;
|
|
9
|
+
// Nginx combined log format pattern
|
|
10
|
+
const NGINX_PATTERN = /^(\S+)\s+(\S+)\s+(\S+)\s+\[([^\]]+)\]\s+"([^"]*?)"\s+(\d+)\s+(\d+)(?:\s+"([^"]*?)"\s+"([^"]*?)")?/;
|
|
11
|
+
const MONTHS = {
|
|
12
|
+
Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5,
|
|
13
|
+
Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11,
|
|
14
|
+
};
|
|
15
|
+
class NginxParser {
|
|
16
|
+
parse(line, lineNumber, byteOffset) {
|
|
17
|
+
const match = line.match(NGINX_PATTERN);
|
|
18
|
+
if (!match)
|
|
19
|
+
return null;
|
|
20
|
+
const [, remoteAddr, , remoteUser, timeLocal, request, status, bodyBytesSent, httpReferer = '', httpUserAgent = ''] = match;
|
|
21
|
+
// Parse timestamp: "10/Oct/2000:13:55:36 -0700"
|
|
22
|
+
let timestamp;
|
|
23
|
+
try {
|
|
24
|
+
const [datePart, timePart, tzPart] = timeLocal.split(/[\s:]/);
|
|
25
|
+
const [day, mon, year] = datePart.split('/');
|
|
26
|
+
const [hh, mm, ss] = timePart ? [timePart, ...timeLocal.split(':').slice(1)] : ['0', '0', '0'];
|
|
27
|
+
timestamp = new Date(`${year}-${String(MONTHS[mon] + 1).padStart(2, '0')}-${day}T${hh}:${mm}:${ss}${tzPart ?? ''}`);
|
|
28
|
+
if (isNaN(timestamp.getTime()))
|
|
29
|
+
timestamp = undefined;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
timestamp = undefined;
|
|
33
|
+
}
|
|
34
|
+
// Parse request line: "GET /path HTTP/1.1"
|
|
35
|
+
let method;
|
|
36
|
+
let path;
|
|
37
|
+
let protocol;
|
|
38
|
+
const reqParts = request.split(' ');
|
|
39
|
+
if (reqParts.length === 3) {
|
|
40
|
+
[method, path, protocol] = reqParts;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
raw: line,
|
|
44
|
+
lineNumber,
|
|
45
|
+
byteOffset,
|
|
46
|
+
format: 'nginx',
|
|
47
|
+
timestamp,
|
|
48
|
+
remoteAddr,
|
|
49
|
+
remoteUser: remoteUser === '-' ? '' : remoteUser,
|
|
50
|
+
timeLocal,
|
|
51
|
+
request,
|
|
52
|
+
method,
|
|
53
|
+
path,
|
|
54
|
+
protocol,
|
|
55
|
+
status: parseInt(status, 10),
|
|
56
|
+
bodyBytesSent: parseInt(bodyBytesSent, 10),
|
|
57
|
+
httpReferer: httpReferer === '-' ? '' : httpReferer,
|
|
58
|
+
httpUserAgent,
|
|
59
|
+
level: this.statusToLevel(parseInt(status, 10)),
|
|
60
|
+
message: `${method} ${path} ${status}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
statusToLevel(status) {
|
|
64
|
+
if (status >= 500)
|
|
65
|
+
return 'ERROR';
|
|
66
|
+
if (status >= 400)
|
|
67
|
+
return 'WARN';
|
|
68
|
+
return 'INFO';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Test if a line looks like Nginx format.
|
|
72
|
+
*/
|
|
73
|
+
static test(line) {
|
|
74
|
+
return NGINX_PATTERN.test(line);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.NginxParser = NginxParser;
|
|
78
|
+
//# sourceMappingURL=NginxParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NginxParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/NginxParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SyslogParser.ts
|
|
3
|
+
* Parses RFC 3164 and RFC 5424 Syslog formats.
|
|
4
|
+
*/
|
|
5
|
+
import type { SyslogEntry } from '../schemas/LogSchema';
|
|
6
|
+
export declare class SyslogParser {
|
|
7
|
+
parse(line: string, lineNumber?: number, byteOffset?: number): SyslogEntry | null;
|
|
8
|
+
static test(line: string): boolean;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=SyslogParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyslogParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/SyslogParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAoBxD,qBAAa,YAAY;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAoDjF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SyslogParser.ts
|
|
4
|
+
* Parses RFC 3164 and RFC 5424 Syslog formats.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SyslogParser = void 0;
|
|
8
|
+
// RFC 5424: <priority>version timestamp hostname app-name proc-id msg-id msg
|
|
9
|
+
const RFC5424 = /^<(\d+)>(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.*)/;
|
|
10
|
+
// RFC 3164: <priority>Mmm dd hh:mm:ss hostname message
|
|
11
|
+
const RFC3164 = /^(?:<(\d+)>)?(\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})\s+(\S+)\s+(.*)/;
|
|
12
|
+
// Common app log: 2024-01-15T10:00:00Z [LEVEL] message
|
|
13
|
+
const COMMON_LOG = /^(\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)\s+(?:\[?(\w+)\]?\s+)?(.*)/;
|
|
14
|
+
const FACILITY_NAMES = [
|
|
15
|
+
'kern', 'user', 'mail', 'daemon', 'auth', 'syslog', 'lpr', 'news',
|
|
16
|
+
'uucp', 'cron', 'authpriv', 'ftp', 'ntp', 'security', 'console', 'clockd',
|
|
17
|
+
];
|
|
18
|
+
const SEVERITY_NAMES = ['EMERG', 'ALERT', 'CRITICAL', 'ERROR', 'WARN', 'NOTICE', 'INFO', 'DEBUG'];
|
|
19
|
+
class SyslogParser {
|
|
20
|
+
parse(line, lineNumber, byteOffset) {
|
|
21
|
+
// Try RFC 5424
|
|
22
|
+
let match = line.match(RFC5424);
|
|
23
|
+
if (match) {
|
|
24
|
+
const [, priority, , timestamp, hostname, appName, procId, msgId, message] = match;
|
|
25
|
+
const pri = parseInt(priority, 10);
|
|
26
|
+
return {
|
|
27
|
+
raw: line, lineNumber, byteOffset,
|
|
28
|
+
format: 'syslog',
|
|
29
|
+
timestamp: new Date(timestamp),
|
|
30
|
+
level: SEVERITY_NAMES[pri & 7] ?? 'INFO',
|
|
31
|
+
facility: FACILITY_NAMES[pri >> 3] ?? 'user',
|
|
32
|
+
severity: SEVERITY_NAMES[pri & 7],
|
|
33
|
+
hostname: hostname === '-' ? undefined : hostname,
|
|
34
|
+
appName: appName === '-' ? undefined : appName,
|
|
35
|
+
procId: procId === '-' ? undefined : procId,
|
|
36
|
+
msgId: msgId === '-' ? undefined : msgId,
|
|
37
|
+
message,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Try RFC 3164
|
|
41
|
+
match = line.match(RFC3164);
|
|
42
|
+
if (match) {
|
|
43
|
+
const [, priority, timestamp, hostname, message] = match;
|
|
44
|
+
const pri = priority ? parseInt(priority, 10) : 0;
|
|
45
|
+
return {
|
|
46
|
+
raw: line, lineNumber, byteOffset,
|
|
47
|
+
format: 'syslog',
|
|
48
|
+
timestamp: new Date(`${new Date().getFullYear()} ${timestamp}`),
|
|
49
|
+
level: SEVERITY_NAMES[pri & 7] ?? 'INFO',
|
|
50
|
+
hostname,
|
|
51
|
+
message,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Try common log format with ISO timestamp
|
|
55
|
+
match = line.match(COMMON_LOG);
|
|
56
|
+
if (match) {
|
|
57
|
+
const [, timestamp, level, message] = match;
|
|
58
|
+
return {
|
|
59
|
+
raw: line, lineNumber, byteOffset,
|
|
60
|
+
format: 'syslog',
|
|
61
|
+
timestamp: new Date(timestamp),
|
|
62
|
+
level: level?.toUpperCase(),
|
|
63
|
+
message,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
static test(line) {
|
|
69
|
+
return RFC5424.test(line) || RFC3164.test(line) || COMMON_LOG.test(line);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.SyslogParser = SyslogParser;
|
|
73
|
+
//# sourceMappingURL=SyslogParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyslogParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/SyslogParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogSchema.ts
|
|
3
|
+
* Defines parsed log entry structures for all supported formats.
|
|
4
|
+
*/
|
|
5
|
+
export interface BaseLogEntry {
|
|
6
|
+
raw: string;
|
|
7
|
+
lineNumber?: number;
|
|
8
|
+
byteOffset?: number;
|
|
9
|
+
timestamp?: Date;
|
|
10
|
+
level?: string;
|
|
11
|
+
message?: string;
|
|
12
|
+
format: string;
|
|
13
|
+
}
|
|
14
|
+
export interface NginxLogEntry extends BaseLogEntry {
|
|
15
|
+
format: 'nginx';
|
|
16
|
+
remoteAddr: string;
|
|
17
|
+
remoteUser: string;
|
|
18
|
+
timeLocal: string;
|
|
19
|
+
request: string;
|
|
20
|
+
method?: string;
|
|
21
|
+
path?: string;
|
|
22
|
+
protocol?: string;
|
|
23
|
+
status: number;
|
|
24
|
+
bodyBytesSent: number;
|
|
25
|
+
httpReferer: string;
|
|
26
|
+
httpUserAgent: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ApacheLogEntry extends BaseLogEntry {
|
|
29
|
+
format: 'apache';
|
|
30
|
+
remoteHost: string;
|
|
31
|
+
ident: string;
|
|
32
|
+
authUser: string;
|
|
33
|
+
timestamp: Date;
|
|
34
|
+
request: string;
|
|
35
|
+
method?: string;
|
|
36
|
+
path?: string;
|
|
37
|
+
statusCode: number;
|
|
38
|
+
responseSize: number;
|
|
39
|
+
}
|
|
40
|
+
export interface JsonLogEntry extends BaseLogEntry {
|
|
41
|
+
format: 'json';
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
export interface SyslogEntry extends BaseLogEntry {
|
|
45
|
+
format: 'syslog';
|
|
46
|
+
facility?: string;
|
|
47
|
+
severity?: string;
|
|
48
|
+
hostname?: string;
|
|
49
|
+
appName?: string;
|
|
50
|
+
procId?: string;
|
|
51
|
+
msgId?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface KubernetesLogEntry extends BaseLogEntry {
|
|
54
|
+
format: 'kubernetes';
|
|
55
|
+
namespace?: string;
|
|
56
|
+
pod?: string;
|
|
57
|
+
container?: string;
|
|
58
|
+
stream?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface DockerLogEntry extends BaseLogEntry {
|
|
61
|
+
format: 'docker';
|
|
62
|
+
stream?: 'stdout' | 'stderr';
|
|
63
|
+
containerId?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface GenericLogEntry extends BaseLogEntry {
|
|
66
|
+
format: 'generic';
|
|
67
|
+
fields: string[];
|
|
68
|
+
}
|
|
69
|
+
export type AnyLogEntry = NginxLogEntry | ApacheLogEntry | JsonLogEntry | SyslogEntry | KubernetesLogEntry | DockerLogEntry | GenericLogEntry;
|
|
70
|
+
//# sourceMappingURL=LogSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogSchema.d.ts","sourceRoot":"","sources":["../../../src/formats/schemas/LogSchema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,cAAc,GACd,YAAY,GACZ,WAAW,GACX,kBAAkB,GAClB,cAAc,GACd,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogSchema.js","sourceRoot":"","sources":["../../../src/formats/schemas/LogSchema.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CacheManager.ts
|
|
3
|
+
* LRU in-memory cache for loaded InvertedIndex objects.
|
|
4
|
+
* Prevents reloading the same index from disk repeatedly.
|
|
5
|
+
*/
|
|
6
|
+
import type { InvertedIndex } from '../types/IndexTypes';
|
|
7
|
+
export declare class CacheManager {
|
|
8
|
+
private cache;
|
|
9
|
+
private maxSize;
|
|
10
|
+
constructor(maxSize?: number);
|
|
11
|
+
/**
|
|
12
|
+
* Get a cached index by its index file path.
|
|
13
|
+
*/
|
|
14
|
+
get(indexPath: string): InvertedIndex | null;
|
|
15
|
+
/**
|
|
16
|
+
* Store an index in the cache.
|
|
17
|
+
* Evicts the least recently used entry if at capacity.
|
|
18
|
+
*/
|
|
19
|
+
set(indexPath: string, index: InvertedIndex): void;
|
|
20
|
+
/**
|
|
21
|
+
* Remove a specific index from the cache.
|
|
22
|
+
*/
|
|
23
|
+
evict(indexPath: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Clear all cached indexes.
|
|
26
|
+
*/
|
|
27
|
+
clear(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Check if an index is cached.
|
|
30
|
+
*/
|
|
31
|
+
has(indexPath: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get cache statistics.
|
|
34
|
+
*/
|
|
35
|
+
stats(): {
|
|
36
|
+
size: number;
|
|
37
|
+
maxSize: number;
|
|
38
|
+
entries: Array<{
|
|
39
|
+
indexPath: string;
|
|
40
|
+
accessCount: number;
|
|
41
|
+
loadedAt: string;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=CacheManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../src/index-store/CacheManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUzD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAW;IAIhC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAe5C;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAkBlD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B;;OAEG;IACH,KAAK,IAAI;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9E;CAWF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CacheManager.ts
|
|
4
|
+
* LRU in-memory cache for loaded InvertedIndex objects.
|
|
5
|
+
* Prevents reloading the same index from disk repeatedly.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.CacheManager = void 0;
|
|
9
|
+
class CacheManager {
|
|
10
|
+
cache = new Map();
|
|
11
|
+
maxSize;
|
|
12
|
+
constructor(maxSize = 10) {
|
|
13
|
+
this.maxSize = maxSize;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get a cached index by its index file path.
|
|
17
|
+
*/
|
|
18
|
+
get(indexPath) {
|
|
19
|
+
const entry = this.cache.get(indexPath);
|
|
20
|
+
if (!entry)
|
|
21
|
+
return null;
|
|
22
|
+
// Update LRU metadata
|
|
23
|
+
entry.accessCount++;
|
|
24
|
+
entry.lastAccessed = Date.now();
|
|
25
|
+
// Move to end (most recently used)
|
|
26
|
+
this.cache.delete(indexPath);
|
|
27
|
+
this.cache.set(indexPath, entry);
|
|
28
|
+
return entry.index;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Store an index in the cache.
|
|
32
|
+
* Evicts the least recently used entry if at capacity.
|
|
33
|
+
*/
|
|
34
|
+
set(indexPath, index) {
|
|
35
|
+
// Evict LRU if at capacity
|
|
36
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(indexPath)) {
|
|
37
|
+
const lruKey = this.cache.keys().next().value;
|
|
38
|
+
if (lruKey)
|
|
39
|
+
this.cache.delete(lruKey);
|
|
40
|
+
}
|
|
41
|
+
const entry = {
|
|
42
|
+
index,
|
|
43
|
+
indexPath,
|
|
44
|
+
loadedAt: Date.now(),
|
|
45
|
+
accessCount: 1,
|
|
46
|
+
lastAccessed: Date.now(),
|
|
47
|
+
};
|
|
48
|
+
this.cache.set(indexPath, entry);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Remove a specific index from the cache.
|
|
52
|
+
*/
|
|
53
|
+
evict(indexPath) {
|
|
54
|
+
return this.cache.delete(indexPath);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Clear all cached indexes.
|
|
58
|
+
*/
|
|
59
|
+
clear() {
|
|
60
|
+
this.cache.clear();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if an index is cached.
|
|
64
|
+
*/
|
|
65
|
+
has(indexPath) {
|
|
66
|
+
return this.cache.has(indexPath);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get cache statistics.
|
|
70
|
+
*/
|
|
71
|
+
stats() {
|
|
72
|
+
return {
|
|
73
|
+
size: this.cache.size,
|
|
74
|
+
maxSize: this.maxSize,
|
|
75
|
+
entries: [...this.cache.values()].map((e) => ({
|
|
76
|
+
indexPath: e.indexPath,
|
|
77
|
+
accessCount: e.accessCount,
|
|
78
|
+
loadedAt: new Date(e.loadedAt).toISOString(),
|
|
79
|
+
})),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.CacheManager = CacheManager;
|
|
84
|
+
//# sourceMappingURL=CacheManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../../src/index-store/CacheManager.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAYH,MAAa,YAAY;IACf,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC3C,OAAO,CAAS;IAExB,YAAY,UAAkB,EAAE;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,sBAAsB;QACtB,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEhC,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAoB;QACzC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC9C,IAAI,MAAM;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,KAAK,GAAe;YACxB,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;YACpB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK;QAKH,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;aAC7C,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF;AAvFD,oCAuFC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileWatcher.ts
|
|
3
|
+
* Watches a log file for changes and notifies when it grows.
|
|
4
|
+
* Uses chokidar (inotify/FSEvents) for efficient OS-level file watching.
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
export interface FileChangeEvent {
|
|
8
|
+
filePath: string;
|
|
9
|
+
previousSize: number;
|
|
10
|
+
currentSize: number;
|
|
11
|
+
addedBytes: number;
|
|
12
|
+
timestamp: Date;
|
|
13
|
+
}
|
|
14
|
+
export declare class FileWatcher extends EventEmitter {
|
|
15
|
+
private watcher;
|
|
16
|
+
private fileSizes;
|
|
17
|
+
/**
|
|
18
|
+
* Start watching a file (or glob pattern).
|
|
19
|
+
* Emits:
|
|
20
|
+
* - 'change' (event: FileChangeEvent) — when the file grows
|
|
21
|
+
* - 'add' (filePath: string) — when a new file is added
|
|
22
|
+
* - 'unlink' (filePath: string) — when a file is removed
|
|
23
|
+
* - 'error' (err: Error) — on watcher error
|
|
24
|
+
*/
|
|
25
|
+
watch(filePathOrGlob: string | string[]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Add more files to watch without restarting.
|
|
28
|
+
*/
|
|
29
|
+
add(filePath: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Stop watching.
|
|
32
|
+
*/
|
|
33
|
+
stop(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if currently watching.
|
|
36
|
+
*/
|
|
37
|
+
isWatching(): boolean;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=FileWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileWatcher.d.ts","sourceRoot":"","sources":["../../src/index-store/FileWatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAkC;IAEnD;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAiD9C;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB"}
|