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.
Files changed (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/bin/log-search.js +45 -0
  4. package/dist/cli/commands/clear.d.ts +9 -0
  5. package/dist/cli/commands/clear.d.ts.map +1 -0
  6. package/dist/cli/commands/clear.js +116 -0
  7. package/dist/cli/commands/clear.js.map +1 -0
  8. package/dist/cli/commands/index.d.ts +8 -0
  9. package/dist/cli/commands/index.d.ts.map +1 -0
  10. package/dist/cli/commands/index.js +118 -0
  11. package/dist/cli/commands/index.js.map +1 -0
  12. package/dist/cli/commands/info.d.ts +8 -0
  13. package/dist/cli/commands/info.d.ts.map +1 -0
  14. package/dist/cli/commands/info.js +96 -0
  15. package/dist/cli/commands/info.js.map +1 -0
  16. package/dist/cli/commands/search.d.ts +9 -0
  17. package/dist/cli/commands/search.d.ts.map +1 -0
  18. package/dist/cli/commands/search.js +178 -0
  19. package/dist/cli/commands/search.js.map +1 -0
  20. package/dist/cli/commands/watch.d.ts +8 -0
  21. package/dist/cli/commands/watch.d.ts.map +1 -0
  22. package/dist/cli/commands/watch.js +141 -0
  23. package/dist/cli/commands/watch.js.map +1 -0
  24. package/dist/cli/main.d.ts +6 -0
  25. package/dist/cli/main.d.ts.map +1 -0
  26. package/dist/cli/main.js +57 -0
  27. package/dist/cli/main.js.map +1 -0
  28. package/dist/cli/output/colorizer.d.ts +36 -0
  29. package/dist/cli/output/colorizer.d.ts.map +1 -0
  30. package/dist/cli/output/colorizer.js +101 -0
  31. package/dist/cli/output/colorizer.js.map +1 -0
  32. package/dist/cli/output/formatter.d.ts +31 -0
  33. package/dist/cli/output/formatter.d.ts.map +1 -0
  34. package/dist/cli/output/formatter.js +146 -0
  35. package/dist/cli/output/formatter.js.map +1 -0
  36. package/dist/cli/output/table.d.ts +12 -0
  37. package/dist/cli/output/table.d.ts.map +1 -0
  38. package/dist/cli/output/table.js +48 -0
  39. package/dist/cli/output/table.js.map +1 -0
  40. package/dist/core/indexer/ChunkProcessor.d.ts +21 -0
  41. package/dist/core/indexer/ChunkProcessor.d.ts.map +1 -0
  42. package/dist/core/indexer/ChunkProcessor.js +105 -0
  43. package/dist/core/indexer/ChunkProcessor.js.map +1 -0
  44. package/dist/core/indexer/IndexBuilder.d.ts +47 -0
  45. package/dist/core/indexer/IndexBuilder.d.ts.map +1 -0
  46. package/dist/core/indexer/IndexBuilder.js +274 -0
  47. package/dist/core/indexer/IndexBuilder.js.map +1 -0
  48. package/dist/core/indexer/IndexSerializer.d.ts +30 -0
  49. package/dist/core/indexer/IndexSerializer.d.ts.map +1 -0
  50. package/dist/core/indexer/IndexSerializer.js +142 -0
  51. package/dist/core/indexer/IndexSerializer.js.map +1 -0
  52. package/dist/core/indexer/OffsetMapper.d.ts +55 -0
  53. package/dist/core/indexer/OffsetMapper.d.ts.map +1 -0
  54. package/dist/core/indexer/OffsetMapper.js +94 -0
  55. package/dist/core/indexer/OffsetMapper.js.map +1 -0
  56. package/dist/core/indexer/TokenExtractor.d.ts +27 -0
  57. package/dist/core/indexer/TokenExtractor.d.ts.map +1 -0
  58. package/dist/core/indexer/TokenExtractor.js +92 -0
  59. package/dist/core/indexer/TokenExtractor.js.map +1 -0
  60. package/dist/core/searcher/IndexSearcher.d.ts +37 -0
  61. package/dist/core/searcher/IndexSearcher.d.ts.map +1 -0
  62. package/dist/core/searcher/IndexSearcher.js +360 -0
  63. package/dist/core/searcher/IndexSearcher.js.map +1 -0
  64. package/dist/core/searcher/RankEngine.d.ts +29 -0
  65. package/dist/core/searcher/RankEngine.d.ts.map +1 -0
  66. package/dist/core/searcher/RankEngine.js +90 -0
  67. package/dist/core/searcher/RankEngine.js.map +1 -0
  68. package/dist/core/searcher/ResultFetcher.d.ts +37 -0
  69. package/dist/core/searcher/ResultFetcher.d.ts.map +1 -0
  70. package/dist/core/searcher/ResultFetcher.js +118 -0
  71. package/dist/core/searcher/ResultFetcher.js.map +1 -0
  72. package/dist/core/streaming/ChunkSplitter.d.ts +25 -0
  73. package/dist/core/streaming/ChunkSplitter.d.ts.map +1 -0
  74. package/dist/core/streaming/ChunkSplitter.js +71 -0
  75. package/dist/core/streaming/ChunkSplitter.js.map +1 -0
  76. package/dist/core/streaming/FileStreamer.d.ts +39 -0
  77. package/dist/core/streaming/FileStreamer.d.ts.map +1 -0
  78. package/dist/core/streaming/FileStreamer.js +138 -0
  79. package/dist/core/streaming/FileStreamer.js.map +1 -0
  80. package/dist/core/streaming/LineBuffer.d.ts +26 -0
  81. package/dist/core/streaming/LineBuffer.d.ts.map +1 -0
  82. package/dist/core/streaming/LineBuffer.js +52 -0
  83. package/dist/core/streaming/LineBuffer.js.map +1 -0
  84. package/dist/core/workers/IndexWorker.d.ts +8 -0
  85. package/dist/core/workers/IndexWorker.d.ts.map +1 -0
  86. package/dist/core/workers/IndexWorker.js +41 -0
  87. package/dist/core/workers/IndexWorker.js.map +1 -0
  88. package/dist/core/workers/SearchWorker.d.ts +7 -0
  89. package/dist/core/workers/SearchWorker.d.ts.map +1 -0
  90. package/dist/core/workers/SearchWorker.js +63 -0
  91. package/dist/core/workers/SearchWorker.js.map +1 -0
  92. package/dist/core/workers/WorkerPool.d.ts +30 -0
  93. package/dist/core/workers/WorkerPool.d.ts.map +1 -0
  94. package/dist/core/workers/WorkerPool.js +132 -0
  95. package/dist/core/workers/WorkerPool.js.map +1 -0
  96. package/dist/formats/LogFormatDetector.d.ts +22 -0
  97. package/dist/formats/LogFormatDetector.d.ts.map +1 -0
  98. package/dist/formats/LogFormatDetector.js +123 -0
  99. package/dist/formats/LogFormatDetector.js.map +1 -0
  100. package/dist/formats/parsers/ApacheParser.d.ts +10 -0
  101. package/dist/formats/parsers/ApacheParser.d.ts.map +1 -0
  102. package/dist/formats/parsers/ApacheParser.js +54 -0
  103. package/dist/formats/parsers/ApacheParser.js.map +1 -0
  104. package/dist/formats/parsers/GenericParser.d.ts +11 -0
  105. package/dist/formats/parsers/GenericParser.d.ts.map +1 -0
  106. package/dist/formats/parsers/GenericParser.js +61 -0
  107. package/dist/formats/parsers/GenericParser.js.map +1 -0
  108. package/dist/formats/parsers/JsonParser.d.ts +12 -0
  109. package/dist/formats/parsers/JsonParser.d.ts.map +1 -0
  110. package/dist/formats/parsers/JsonParser.js +92 -0
  111. package/dist/formats/parsers/JsonParser.js.map +1 -0
  112. package/dist/formats/parsers/NginxParser.d.ts +15 -0
  113. package/dist/formats/parsers/NginxParser.d.ts.map +1 -0
  114. package/dist/formats/parsers/NginxParser.js +78 -0
  115. package/dist/formats/parsers/NginxParser.js.map +1 -0
  116. package/dist/formats/parsers/SyslogParser.d.ts +10 -0
  117. package/dist/formats/parsers/SyslogParser.d.ts.map +1 -0
  118. package/dist/formats/parsers/SyslogParser.js +73 -0
  119. package/dist/formats/parsers/SyslogParser.js.map +1 -0
  120. package/dist/formats/schemas/LogSchema.d.ts +70 -0
  121. package/dist/formats/schemas/LogSchema.d.ts.map +1 -0
  122. package/dist/formats/schemas/LogSchema.js +7 -0
  123. package/dist/formats/schemas/LogSchema.js.map +1 -0
  124. package/dist/index-store/CacheManager.d.ts +45 -0
  125. package/dist/index-store/CacheManager.d.ts.map +1 -0
  126. package/dist/index-store/CacheManager.js +84 -0
  127. package/dist/index-store/CacheManager.js.map +1 -0
  128. package/dist/index-store/FileWatcher.d.ts +39 -0
  129. package/dist/index-store/FileWatcher.d.ts.map +1 -0
  130. package/dist/index-store/FileWatcher.js +121 -0
  131. package/dist/index-store/FileWatcher.js.map +1 -0
  132. package/dist/index-store/IncrementalUpdater.d.ts +19 -0
  133. package/dist/index-store/IncrementalUpdater.d.ts.map +1 -0
  134. package/dist/index-store/IncrementalUpdater.js +62 -0
  135. package/dist/index-store/IncrementalUpdater.js.map +1 -0
  136. package/dist/index-store/IndexStore.d.ts +66 -0
  137. package/dist/index-store/IndexStore.d.ts.map +1 -0
  138. package/dist/index-store/IndexStore.js +183 -0
  139. package/dist/index-store/IndexStore.js.map +1 -0
  140. package/dist/index.d.ts +47 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +99 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/pro/alerts/AlertEngine.d.ts +35 -0
  145. package/dist/pro/alerts/AlertEngine.d.ts.map +1 -0
  146. package/dist/pro/alerts/AlertEngine.js +162 -0
  147. package/dist/pro/alerts/AlertEngine.js.map +1 -0
  148. package/dist/pro/alerts/Notifier.d.ts +23 -0
  149. package/dist/pro/alerts/Notifier.d.ts.map +1 -0
  150. package/dist/pro/alerts/Notifier.js +173 -0
  151. package/dist/pro/alerts/Notifier.js.map +1 -0
  152. package/dist/pro/alerts/RuleParser.d.ts +32 -0
  153. package/dist/pro/alerts/RuleParser.d.ts.map +1 -0
  154. package/dist/pro/alerts/RuleParser.js +86 -0
  155. package/dist/pro/alerts/RuleParser.js.map +1 -0
  156. package/dist/pro/auth/LicenseValidator.d.ts +29 -0
  157. package/dist/pro/auth/LicenseValidator.d.ts.map +1 -0
  158. package/dist/pro/auth/LicenseValidator.js +122 -0
  159. package/dist/pro/auth/LicenseValidator.js.map +1 -0
  160. package/dist/pro/auth/TokenManager.d.ts +27 -0
  161. package/dist/pro/auth/TokenManager.d.ts.map +1 -0
  162. package/dist/pro/auth/TokenManager.js +98 -0
  163. package/dist/pro/auth/TokenManager.js.map +1 -0
  164. package/dist/pro/webui/UIServer.d.ts +34 -0
  165. package/dist/pro/webui/UIServer.d.ts.map +1 -0
  166. package/dist/pro/webui/UIServer.js +353 -0
  167. package/dist/pro/webui/UIServer.js.map +1 -0
  168. package/dist/query/QueryEngine.d.ts +34 -0
  169. package/dist/query/QueryEngine.d.ts.map +1 -0
  170. package/dist/query/QueryEngine.js +187 -0
  171. package/dist/query/QueryEngine.js.map +1 -0
  172. package/dist/query/operators/AndOperator.d.ts +18 -0
  173. package/dist/query/operators/AndOperator.d.ts.map +1 -0
  174. package/dist/query/operators/AndOperator.js +55 -0
  175. package/dist/query/operators/AndOperator.js.map +1 -0
  176. package/dist/query/operators/NotOperator.d.ts +19 -0
  177. package/dist/query/operators/NotOperator.d.ts.map +1 -0
  178. package/dist/query/operators/NotOperator.js +43 -0
  179. package/dist/query/operators/NotOperator.js.map +1 -0
  180. package/dist/query/operators/OrOperator.d.ts +17 -0
  181. package/dist/query/operators/OrOperator.d.ts.map +1 -0
  182. package/dist/query/operators/OrOperator.js +54 -0
  183. package/dist/query/operators/OrOperator.js.map +1 -0
  184. package/dist/query/operators/RangeOperator.d.ts +23 -0
  185. package/dist/query/operators/RangeOperator.d.ts.map +1 -0
  186. package/dist/query/operators/RangeOperator.js +63 -0
  187. package/dist/query/operators/RangeOperator.js.map +1 -0
  188. package/dist/query/regex/FuzzyMatcher.d.ts +29 -0
  189. package/dist/query/regex/FuzzyMatcher.d.ts.map +1 -0
  190. package/dist/query/regex/FuzzyMatcher.js +89 -0
  191. package/dist/query/regex/FuzzyMatcher.js.map +1 -0
  192. package/dist/query/regex/RegexMatcher.d.ts +31 -0
  193. package/dist/query/regex/RegexMatcher.d.ts.map +1 -0
  194. package/dist/query/regex/RegexMatcher.js +73 -0
  195. package/dist/query/regex/RegexMatcher.js.map +1 -0
  196. package/dist/types/ConfigTypes.d.ts +78 -0
  197. package/dist/types/ConfigTypes.d.ts.map +1 -0
  198. package/dist/types/ConfigTypes.js +7 -0
  199. package/dist/types/ConfigTypes.js.map +1 -0
  200. package/dist/types/IndexTypes.d.ts +86 -0
  201. package/dist/types/IndexTypes.d.ts.map +1 -0
  202. package/dist/types/IndexTypes.js +7 -0
  203. package/dist/types/IndexTypes.js.map +1 -0
  204. package/dist/types/SearchTypes.d.ts +102 -0
  205. package/dist/types/SearchTypes.d.ts.map +1 -0
  206. package/dist/types/SearchTypes.js +7 -0
  207. package/dist/types/SearchTypes.js.map +1 -0
  208. package/dist/types/index.d.ts +8 -0
  209. package/dist/types/index.d.ts.map +1 -0
  210. package/dist/types/index.js +24 -0
  211. package/dist/types/index.js.map +1 -0
  212. package/dist/utils/fs-helpers.d.ts +9 -0
  213. package/dist/utils/fs-helpers.d.ts.map +1 -0
  214. package/dist/utils/fs-helpers.js +76 -0
  215. package/dist/utils/fs-helpers.js.map +1 -0
  216. package/dist/utils/hash.d.ts +7 -0
  217. package/dist/utils/hash.d.ts.map +1 -0
  218. package/dist/utils/hash.js +49 -0
  219. package/dist/utils/hash.js.map +1 -0
  220. package/dist/utils/logger.d.ts +19 -0
  221. package/dist/utils/logger.d.ts.map +1 -0
  222. package/dist/utils/logger.js +41 -0
  223. package/dist/utils/logger.js.map +1 -0
  224. package/dist/utils/performance.d.ts +14 -0
  225. package/dist/utils/performance.d.ts.map +1 -0
  226. package/dist/utils/performance.js +32 -0
  227. package/dist/utils/performance.js.map +1 -0
  228. package/dist/utils/progress.d.ts +7 -0
  229. package/dist/utils/progress.d.ts.map +1 -0
  230. package/dist/utils/progress.js +22 -0
  231. package/dist/utils/progress.js.map +1 -0
  232. package/package.json +105 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * SearchWorker.ts
4
+ * Worker thread for parallel regex/fuzzy search over file chunks.
5
+ * Used for fallback searches that bypass the index (e.g., pure regex).
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const worker_threads_1 = require("worker_threads");
9
+ const fs_1 = require("fs");
10
+ async function run() {
11
+ if (!worker_threads_1.parentPort)
12
+ process.exit(1);
13
+ const data = worker_threads_1.workerData;
14
+ const matches = [];
15
+ try {
16
+ const flags = data.ignoreCase ? 'gi' : 'g';
17
+ const regex = data.isRegex
18
+ ? new RegExp(data.pattern, flags)
19
+ : new RegExp(data.pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), flags);
20
+ let buffer = '';
21
+ let currentOffset = data.startByte;
22
+ await new Promise((resolve, reject) => {
23
+ const stream = (0, fs_1.createReadStream)(data.filePath, {
24
+ start: data.startByte,
25
+ end: data.endByte,
26
+ encoding: 'utf8',
27
+ highWaterMark: 256 * 1024,
28
+ });
29
+ stream.on('data', (chunk) => {
30
+ buffer += chunk;
31
+ const lines = buffer.split('\n');
32
+ buffer = lines.pop() ?? '';
33
+ for (const line of lines) {
34
+ const lineBytes = Buffer.byteLength(line, 'utf8') + 1;
35
+ if (regex.test(line)) {
36
+ matches.push({ offset: currentOffset, content: line });
37
+ }
38
+ regex.lastIndex = 0;
39
+ currentOffset += lineBytes;
40
+ }
41
+ });
42
+ stream.on('end', () => {
43
+ if (buffer.length > 0 && regex.test(buffer)) {
44
+ matches.push({ offset: currentOffset, content: buffer });
45
+ }
46
+ resolve();
47
+ });
48
+ stream.on('error', reject);
49
+ });
50
+ const result = { chunkId: data.chunkId, matches };
51
+ worker_threads_1.parentPort.postMessage(result);
52
+ }
53
+ catch (err) {
54
+ const result = {
55
+ chunkId: data.chunkId,
56
+ matches: [],
57
+ error: err instanceof Error ? err.message : String(err),
58
+ };
59
+ worker_threads_1.parentPort.postMessage(result);
60
+ }
61
+ }
62
+ run();
63
+ //# sourceMappingURL=SearchWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchWorker.js","sourceRoot":"","sources":["../../../src/core/workers/SearchWorker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * WorkerPool.ts
3
+ * Manages a pool of worker threads for parallel chunk processing.
4
+ * Distributes tasks to available workers and collects results.
5
+ */
6
+ import type { WorkerTask, ChunkResult } from '../../types/IndexTypes';
7
+ export declare class WorkerPool {
8
+ private maxWorkers;
9
+ private workerScript;
10
+ private activeWorkers;
11
+ private queue;
12
+ constructor(maxWorkers: number);
13
+ /**
14
+ * Run a task on an available worker, or queue it if all are busy.
15
+ */
16
+ run(task: WorkerTask): Promise<ChunkResult>;
17
+ /**
18
+ * Spawn a new worker thread for the given task.
19
+ */
20
+ private spawnWorker;
21
+ /**
22
+ * Wait for all active workers to finish and drain the queue.
23
+ */
24
+ drain(): Promise<void>;
25
+ /**
26
+ * Terminate all active workers immediately.
27
+ */
28
+ terminate(): Promise<void>;
29
+ }
30
+ //# sourceMappingURL=WorkerPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerPool.d.ts","sourceRoot":"","sources":["../../../src/core/workers/WorkerPool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAQtE,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,KAAK,CAAqB;gBAEtB,UAAU,EAAE,MAAM;IAM9B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAW3C;;OAEG;IACH,OAAO,CAAC,WAAW;IAyCnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAMjC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * WorkerPool.ts
4
+ * Manages a pool of worker threads for parallel chunk processing.
5
+ * Distributes tasks to available workers and collects results.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.WorkerPool = void 0;
42
+ const worker_threads_1 = require("worker_threads");
43
+ const path = __importStar(require("path"));
44
+ class WorkerPool {
45
+ maxWorkers;
46
+ workerScript;
47
+ activeWorkers = new Set();
48
+ queue = [];
49
+ constructor(maxWorkers) {
50
+ this.maxWorkers = Math.max(1, maxWorkers);
51
+ // Points to the compiled JS version of IndexWorker
52
+ this.workerScript = path.join(__dirname, 'IndexWorker.js');
53
+ }
54
+ /**
55
+ * Run a task on an available worker, or queue it if all are busy.
56
+ */
57
+ run(task) {
58
+ return new Promise((resolve, reject) => {
59
+ const pending = { task, resolve, reject };
60
+ if (this.activeWorkers.size < this.maxWorkers) {
61
+ this.spawnWorker(pending);
62
+ }
63
+ else {
64
+ this.queue.push(pending);
65
+ }
66
+ });
67
+ }
68
+ /**
69
+ * Spawn a new worker thread for the given task.
70
+ */
71
+ spawnWorker(pending) {
72
+ const worker = new worker_threads_1.Worker(this.workerScript, {
73
+ workerData: pending.task,
74
+ });
75
+ this.activeWorkers.add(worker);
76
+ worker.on('message', (message) => {
77
+ this.activeWorkers.delete(worker);
78
+ if (message.error) {
79
+ pending.reject(new Error(`Worker error in chunk ${message.chunkId}: ${message.error}`));
80
+ }
81
+ else {
82
+ pending.resolve(message.result);
83
+ }
84
+ // Process next item in queue
85
+ if (this.queue.length > 0) {
86
+ const next = this.queue.shift();
87
+ this.spawnWorker(next);
88
+ }
89
+ });
90
+ worker.on('error', (err) => {
91
+ this.activeWorkers.delete(worker);
92
+ pending.reject(err);
93
+ if (this.queue.length > 0) {
94
+ const next = this.queue.shift();
95
+ this.spawnWorker(next);
96
+ }
97
+ });
98
+ worker.on('exit', (code) => {
99
+ if (code !== 0 && this.activeWorkers.has(worker)) {
100
+ this.activeWorkers.delete(worker);
101
+ pending.reject(new Error(`Worker exited with code ${code}`));
102
+ }
103
+ });
104
+ }
105
+ /**
106
+ * Wait for all active workers to finish and drain the queue.
107
+ */
108
+ async drain() {
109
+ return new Promise((resolve) => {
110
+ const check = () => {
111
+ if (this.activeWorkers.size === 0 && this.queue.length === 0) {
112
+ resolve();
113
+ }
114
+ else {
115
+ setTimeout(check, 50);
116
+ }
117
+ };
118
+ check();
119
+ });
120
+ }
121
+ /**
122
+ * Terminate all active workers immediately.
123
+ */
124
+ async terminate() {
125
+ const terminations = [...this.activeWorkers].map((w) => w.terminate());
126
+ await Promise.all(terminations);
127
+ this.activeWorkers.clear();
128
+ this.queue.length = 0;
129
+ }
130
+ }
131
+ exports.WorkerPool = WorkerPool;
132
+ //# sourceMappingURL=WorkerPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerPool.js","sourceRoot":"","sources":["../../../src/core/workers/WorkerPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * LogFormatDetector.ts
3
+ * Automatically detects the format of a log file by sampling the first N lines.
4
+ * Scores each format based on pattern matching frequency.
5
+ */
6
+ import type { LogFormat } from '../types/ConfigTypes';
7
+ export declare class LogFormatDetector {
8
+ private sampleSize;
9
+ constructor(sampleSize?: number);
10
+ /**
11
+ * Detect the format of a log file.
12
+ * @param filePath Path to the log file
13
+ * @returns Detected LogFormat string
14
+ */
15
+ detect(filePath: string): Promise<LogFormat>;
16
+ /**
17
+ * Detect format from a string sample (for testing / streaming use).
18
+ */
19
+ detectFromLines(lines: string[]): LogFormat;
20
+ private readSampleLines;
21
+ }
22
+ //# sourceMappingURL=LogFormatDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogFormatDetector.d.ts","sourceRoot":"","sources":["../../src/formats/LogFormatDetector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAqBtD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAAY;IAIpC;;;;OAIG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA4BlD;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS;IAqB3C,OAAO,CAAC,eAAe;CAwCxB"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /**
3
+ * LogFormatDetector.ts
4
+ * Automatically detects the format of a log file by sampling the first N lines.
5
+ * Scores each format based on pattern matching frequency.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.LogFormatDetector = void 0;
9
+ const fs_1 = require("fs");
10
+ const NginxParser_1 = require("./parsers/NginxParser");
11
+ const ApacheParser_1 = require("./parsers/ApacheParser");
12
+ const JsonParser_1 = require("./parsers/JsonParser");
13
+ const SyslogParser_1 = require("./parsers/SyslogParser");
14
+ // Ordered list of format testers (most specific first)
15
+ const FORMAT_TESTERS = [
16
+ { format: 'json', test: JsonParser_1.JsonParser.test },
17
+ { format: 'nginx', test: NginxParser_1.NginxParser.test },
18
+ { format: 'apache', test: ApacheParser_1.ApacheParser.test },
19
+ { format: 'kubernetes', test: (line) => /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z\s+\w+/.test(line) },
20
+ { format: 'docker', test: (line) => /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z/.test(line) },
21
+ { format: 'syslog', test: SyslogParser_1.SyslogParser.test },
22
+ ];
23
+ class LogFormatDetector {
24
+ sampleSize;
25
+ constructor(sampleSize = 200) {
26
+ this.sampleSize = sampleSize;
27
+ }
28
+ /**
29
+ * Detect the format of a log file.
30
+ * @param filePath Path to the log file
31
+ * @returns Detected LogFormat string
32
+ */
33
+ async detect(filePath) {
34
+ const sample = await this.readSampleLines(filePath);
35
+ if (sample.length === 0)
36
+ return 'generic';
37
+ const scores = {};
38
+ for (const { format } of FORMAT_TESTERS)
39
+ scores[format] = 0;
40
+ for (const line of sample) {
41
+ if (!line.trim())
42
+ continue;
43
+ for (const { format, test } of FORMAT_TESTERS) {
44
+ if (test(line))
45
+ scores[format]++;
46
+ }
47
+ }
48
+ // Find the format with the highest score
49
+ const total = sample.filter((l) => l.trim().length > 0).length;
50
+ const threshold = total * 0.3; // 30% of lines must match
51
+ let best = { format: 'generic', score: 0 };
52
+ for (const { format } of FORMAT_TESTERS) {
53
+ if (scores[format] > best.score && scores[format] >= threshold) {
54
+ best = { format, score: scores[format] };
55
+ }
56
+ }
57
+ return best.format;
58
+ }
59
+ /**
60
+ * Detect format from a string sample (for testing / streaming use).
61
+ */
62
+ detectFromLines(lines) {
63
+ const scores = {};
64
+ for (const { format } of FORMAT_TESTERS)
65
+ scores[format] = 0;
66
+ for (const line of lines) {
67
+ if (!line.trim())
68
+ continue;
69
+ for (const { format, test } of FORMAT_TESTERS) {
70
+ if (test(line))
71
+ scores[format]++;
72
+ }
73
+ }
74
+ const total = lines.filter((l) => l.trim().length > 0).length;
75
+ const threshold = Math.max(1, total * 0.25);
76
+ for (const { format } of FORMAT_TESTERS) {
77
+ if (scores[format] >= threshold)
78
+ return format;
79
+ }
80
+ return 'generic';
81
+ }
82
+ readSampleLines(filePath) {
83
+ return new Promise((resolve, reject) => {
84
+ const lines = [];
85
+ let buffer = '';
86
+ let done = false;
87
+ const stream = (0, fs_1.createReadStream)(filePath, {
88
+ encoding: 'utf8',
89
+ highWaterMark: 64 * 1024,
90
+ });
91
+ stream.on('data', (chunk) => {
92
+ if (done)
93
+ return;
94
+ buffer += chunk;
95
+ const parts = buffer.split('\n');
96
+ buffer = parts.pop() ?? '';
97
+ for (const line of parts) {
98
+ lines.push(line);
99
+ if (lines.length >= this.sampleSize) {
100
+ done = true;
101
+ stream.destroy();
102
+ resolve(lines);
103
+ break;
104
+ }
105
+ }
106
+ });
107
+ stream.on('end', () => {
108
+ if (!done) {
109
+ if (buffer.length > 0)
110
+ lines.push(buffer);
111
+ resolve(lines);
112
+ }
113
+ });
114
+ stream.on('error', reject);
115
+ stream.on('close', () => {
116
+ if (!done)
117
+ resolve(lines);
118
+ });
119
+ });
120
+ }
121
+ }
122
+ exports.LogFormatDetector = LogFormatDetector;
123
+ //# sourceMappingURL=LogFormatDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogFormatDetector.js","sourceRoot":"","sources":["../../src/formats/LogFormatDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ApacheParser.ts
3
+ * Parses Apache Common Log Format (CLF) and Combined Log Format.
4
+ */
5
+ import type { ApacheLogEntry } from '../schemas/LogSchema';
6
+ export declare class ApacheParser {
7
+ parse(line: string, lineNumber?: number, byteOffset?: number): ApacheLogEntry | null;
8
+ static test(line: string): boolean;
9
+ }
10
+ //# sourceMappingURL=ApacheParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApacheParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/ApacheParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,qBAAa,YAAY;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IA2CpF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGnC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * ApacheParser.ts
4
+ * Parses Apache Common Log Format (CLF) and Combined Log Format.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ApacheParser = void 0;
8
+ const APACHE_PATTERN = /^(\S+)\s+(\S+)\s+(\S+)\s+\[([^\]]+)\]\s+"([^"]*?)"\s+(\d+)\s+(\S+)(?:\s+"([^"]*?)"\s+"([^"]*?)")?/;
9
+ class ApacheParser {
10
+ parse(line, lineNumber, byteOffset) {
11
+ const match = line.match(APACHE_PATTERN);
12
+ if (!match)
13
+ return null;
14
+ const [, remoteHost, ident, authUser, timeStr, request, statusCode, responseSize] = match;
15
+ let timestamp;
16
+ try {
17
+ timestamp = new Date(timeStr
18
+ .replace(/(\d+)\/(\w+)\/(\d+):(\d+:\d+:\d+)\s([+-]\d{4})/, '$2 $1, $3 $4 $5'));
19
+ if (isNaN(timestamp.getTime()))
20
+ throw new Error();
21
+ }
22
+ catch {
23
+ timestamp = new Date();
24
+ }
25
+ let method;
26
+ let path;
27
+ const reqParts = request.split(' ');
28
+ if (reqParts.length >= 2)
29
+ [method, path] = reqParts;
30
+ const status = parseInt(statusCode, 10);
31
+ return {
32
+ raw: line,
33
+ lineNumber,
34
+ byteOffset,
35
+ format: 'apache',
36
+ timestamp,
37
+ remoteHost,
38
+ ident: ident === '-' ? '' : ident,
39
+ authUser: authUser === '-' ? '' : authUser,
40
+ request,
41
+ method,
42
+ path,
43
+ statusCode: status,
44
+ responseSize: responseSize === '-' ? 0 : parseInt(responseSize, 10),
45
+ level: status >= 500 ? 'ERROR' : status >= 400 ? 'WARN' : 'INFO',
46
+ message: `${method} ${path} ${status}`,
47
+ };
48
+ }
49
+ static test(line) {
50
+ return APACHE_PATTERN.test(line);
51
+ }
52
+ }
53
+ exports.ApacheParser = ApacheParser;
54
+ //# sourceMappingURL=ApacheParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApacheParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/ApacheParser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAM,cAAc,GAClB,mGAAmG,CAAC;AAEtG,MAAa,YAAY;IACvB,KAAK,CAAC,IAAY,EAAE,UAAmB,EAAE,UAAmB;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;QAE1F,IAAI,SAAe,CAAC;QACpB,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,IAAI,CAClB,OAAO;iBACJ,OAAO,CAAC,gDAAgD,EAAE,iBAAiB,CAAC,CAChF,CAAC;YACF,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,MAA0B,CAAC;QAC/B,IAAI,IAAwB,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;YAAE,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC;QAEpD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAExC,OAAO;YACL,GAAG,EAAE,IAAI;YACT,UAAU;YACV,UAAU;YACV,MAAM,EAAE,QAAQ;YAChB,SAAS;YACT,UAAU;YACV,KAAK,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;YACjC,QAAQ,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YAC1C,OAAO;YACP,MAAM;YACN,IAAI;YACJ,UAAU,EAAE,MAAM;YAClB,YAAY,EAAE,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC;YACnE,KAAK,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAChE,OAAO,EAAE,GAAG,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAY;QACtB,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AA/CD,oCA+CC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * GenericParser.ts
3
+ * Fallback parser for unrecognized log formats.
4
+ * Attempts to extract timestamps and log levels heuristically.
5
+ */
6
+ import type { GenericLogEntry } from '../schemas/LogSchema';
7
+ export declare class GenericParser {
8
+ parse(line: string, lineNumber?: number, byteOffset?: number): GenericLogEntry;
9
+ static test(_line: string): boolean;
10
+ }
11
+ //# sourceMappingURL=GenericParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenericParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/GenericParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW5D,qBAAa,aAAa;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe;IAuC9E,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * GenericParser.ts
4
+ * Fallback parser for unrecognized log formats.
5
+ * Attempts to extract timestamps and log levels heuristically.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.GenericParser = void 0;
9
+ // Common log level patterns
10
+ const LEVEL_RE = /\b(TRACE|DEBUG|INFO|WARN|WARNING|ERROR|ERR|FATAL|CRITICAL|SEVERE)\b/i;
11
+ // Common timestamp patterns
12
+ const TS_PATTERNS = [
13
+ /\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?/,
14
+ /\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2}/,
15
+ /\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}/,
16
+ ];
17
+ class GenericParser {
18
+ parse(line, lineNumber, byteOffset) {
19
+ // Try to extract timestamp
20
+ let timestamp;
21
+ for (const re of TS_PATTERNS) {
22
+ const match = line.match(re);
23
+ if (match) {
24
+ const d = new Date(match[0]);
25
+ if (!isNaN(d.getTime())) {
26
+ timestamp = d;
27
+ break;
28
+ }
29
+ }
30
+ }
31
+ // Try to extract level
32
+ let level;
33
+ const levelMatch = line.match(LEVEL_RE);
34
+ if (levelMatch) {
35
+ level = levelMatch[1].toUpperCase();
36
+ if (level === 'WARNING')
37
+ level = 'WARN';
38
+ if (level === 'ERR')
39
+ level = 'ERROR';
40
+ if (level === 'SEVERE')
41
+ level = 'ERROR';
42
+ }
43
+ // Split into whitespace-delimited fields
44
+ const fields = line.split(/\s+/).filter(Boolean);
45
+ return {
46
+ raw: line,
47
+ lineNumber,
48
+ byteOffset,
49
+ format: 'generic',
50
+ timestamp,
51
+ level,
52
+ message: line,
53
+ fields,
54
+ };
55
+ }
56
+ static test(_line) {
57
+ return true; // Always matches
58
+ }
59
+ }
60
+ exports.GenericParser = GenericParser;
61
+ //# sourceMappingURL=GenericParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenericParser.js","sourceRoot":"","sources":["../../../src/formats/parsers/GenericParser.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAIH,4BAA4B;AAC5B,MAAM,QAAQ,GAAG,sEAAsE,CAAC;AACxF,4BAA4B;AAC5B,MAAM,WAAW,GAAG;IAClB,yEAAyE;IACzE,uCAAuC;IACvC,qCAAqC;CACtC,CAAC;AAEF,MAAa,aAAa;IACxB,KAAK,CAAC,IAAY,EAAE,UAAmB,EAAE,UAAmB;QAC1D,2BAA2B;QAC3B,IAAI,SAA2B,CAAC;QAChC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBACxB,SAAS,GAAG,CAAC,CAAC;oBACd,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,KAAyB,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,KAAK,KAAK,SAAS;gBAAE,KAAK,GAAG,MAAM,CAAC;YACxC,IAAI,KAAK,KAAK,KAAK;gBAAE,KAAK,GAAG,OAAO,CAAC;YACrC,IAAI,KAAK,KAAK,QAAQ;gBAAE,KAAK,GAAG,OAAO,CAAC;QAC1C,CAAC;QAED,yCAAyC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO;YACL,GAAG,EAAE,IAAI;YACT,UAAU;YACV,UAAU;YACV,MAAM,EAAE,SAAS;YACjB,SAAS;YACT,KAAK;YACL,OAAO,EAAE,IAAI;YACb,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,CAAC,iBAAiB;IAChC,CAAC;CACF;AA3CD,sCA2CC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * JsonParser.ts
3
+ * Parses JSON-structured log lines (e.g., Bunyan, Pino, Winston JSON format).
4
+ * Extracts common fields: timestamp, level, message, and all other fields.
5
+ */
6
+ import type { JsonLogEntry } from '../schemas/LogSchema';
7
+ export declare class JsonParser {
8
+ parse(line: string, lineNumber?: number, byteOffset?: number): JsonLogEntry | null;
9
+ private bunyanLevelToString;
10
+ static test(line: string): boolean;
11
+ }
12
+ //# sourceMappingURL=JsonParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonParser.d.ts","sourceRoot":"","sources":["../../../src/formats/parsers/JsonParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AASzD,qBAAa,UAAU;IACrB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IA4DlF,OAAO,CAAC,mBAAmB;IAS3B,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAInC"}