@cisco_open/linting-orchestrator 1.0.0-rc.4
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 +201 -0
- package/NOTICE +5 -0
- package/README.md +43 -0
- package/build/cli/api-client.d.ts +170 -0
- package/build/cli/api-client.d.ts.map +1 -0
- package/build/cli/api-client.js +284 -0
- package/build/cli/api-client.js.map +1 -0
- package/build/cli/commands/agents.d.ts +7 -0
- package/build/cli/commands/agents.d.ts.map +1 -0
- package/build/cli/commands/agents.js +694 -0
- package/build/cli/commands/agents.js.map +1 -0
- package/build/cli/commands/completion.d.ts +9 -0
- package/build/cli/commands/completion.d.ts.map +1 -0
- package/build/cli/commands/completion.js +177 -0
- package/build/cli/commands/completion.js.map +1 -0
- package/build/cli/commands/config.d.ts +10 -0
- package/build/cli/commands/config.d.ts.map +1 -0
- package/build/cli/commands/config.js +284 -0
- package/build/cli/commands/config.js.map +1 -0
- package/build/cli/commands/health.d.ts +11 -0
- package/build/cli/commands/health.d.ts.map +1 -0
- package/build/cli/commands/health.js +38 -0
- package/build/cli/commands/health.js.map +1 -0
- package/build/cli/commands/help.d.ts +6 -0
- package/build/cli/commands/help.d.ts.map +1 -0
- package/build/cli/commands/help.js +20 -0
- package/build/cli/commands/help.js.map +1 -0
- package/build/cli/commands/history.d.ts +11 -0
- package/build/cli/commands/history.d.ts.map +1 -0
- package/build/cli/commands/history.js +50 -0
- package/build/cli/commands/history.js.map +1 -0
- package/build/cli/commands/jobs.d.ts +12 -0
- package/build/cli/commands/jobs.d.ts.map +1 -0
- package/build/cli/commands/jobs.js +84 -0
- package/build/cli/commands/jobs.js.map +1 -0
- package/build/cli/commands/lint.d.ts +15 -0
- package/build/cli/commands/lint.d.ts.map +1 -0
- package/build/cli/commands/lint.js +384 -0
- package/build/cli/commands/lint.js.map +1 -0
- package/build/cli/commands/ps.d.ts +8 -0
- package/build/cli/commands/ps.d.ts.map +1 -0
- package/build/cli/commands/ps.js +74 -0
- package/build/cli/commands/ps.js.map +1 -0
- package/build/cli/commands/reproduce.d.ts +9 -0
- package/build/cli/commands/reproduce.d.ts.map +1 -0
- package/build/cli/commands/reproduce.js +31 -0
- package/build/cli/commands/reproduce.js.map +1 -0
- package/build/cli/commands/reset.d.ts +5 -0
- package/build/cli/commands/reset.d.ts.map +1 -0
- package/build/cli/commands/reset.js +13 -0
- package/build/cli/commands/reset.js.map +1 -0
- package/build/cli/commands/results.d.ts +13 -0
- package/build/cli/commands/results.d.ts.map +1 -0
- package/build/cli/commands/results.js +129 -0
- package/build/cli/commands/results.js.map +1 -0
- package/build/cli/commands/rulesets/check.d.ts +12 -0
- package/build/cli/commands/rulesets/check.d.ts.map +1 -0
- package/build/cli/commands/rulesets/check.js +226 -0
- package/build/cli/commands/rulesets/check.js.map +1 -0
- package/build/cli/commands/rulesets/index.d.ts +5 -0
- package/build/cli/commands/rulesets/index.d.ts.map +1 -0
- package/build/cli/commands/rulesets/index.js +6 -0
- package/build/cli/commands/rulesets/index.js.map +1 -0
- package/build/cli/commands/rulesets/view.d.ts +16 -0
- package/build/cli/commands/rulesets/view.d.ts.map +1 -0
- package/build/cli/commands/rulesets/view.js +100 -0
- package/build/cli/commands/rulesets/view.js.map +1 -0
- package/build/cli/commands/start.d.ts +16 -0
- package/build/cli/commands/start.d.ts.map +1 -0
- package/build/cli/commands/start.js +167 -0
- package/build/cli/commands/start.js.map +1 -0
- package/build/cli/commands/status.d.ts +9 -0
- package/build/cli/commands/status.d.ts.map +1 -0
- package/build/cli/commands/status.js +46 -0
- package/build/cli/commands/status.js.map +1 -0
- package/build/cli/commands/stop.d.ts +11 -0
- package/build/cli/commands/stop.d.ts.map +1 -0
- package/build/cli/commands/stop.js +78 -0
- package/build/cli/commands/stop.js.map +1 -0
- package/build/cli/config-manager.d.ts +134 -0
- package/build/cli/config-manager.d.ts.map +1 -0
- package/build/cli/config-manager.js +288 -0
- package/build/cli/config-manager.js.map +1 -0
- package/build/cli/formatters.d.ts +62 -0
- package/build/cli/formatters.d.ts.map +1 -0
- package/build/cli/formatters.js +715 -0
- package/build/cli/formatters.js.map +1 -0
- package/build/cli/history-manager.d.ts +97 -0
- package/build/cli/history-manager.d.ts.map +1 -0
- package/build/cli/history-manager.js +201 -0
- package/build/cli/history-manager.js.map +1 -0
- package/build/cli/index.d.ts +16 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +335 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/list-rulesets.d.ts +15 -0
- package/build/cli/list-rulesets.d.ts.map +1 -0
- package/build/cli/list-rulesets.js +193 -0
- package/build/cli/list-rulesets.js.map +1 -0
- package/build/cli/utils/connection-error.d.ts +9 -0
- package/build/cli/utils/connection-error.d.ts.map +1 -0
- package/build/cli/utils/connection-error.js +30 -0
- package/build/cli/utils/connection-error.js.map +1 -0
- package/build/cli/utils/embedded-server.d.ts +21 -0
- package/build/cli/utils/embedded-server.d.ts.map +1 -0
- package/build/cli/utils/embedded-server.js +61 -0
- package/build/cli/utils/embedded-server.js.map +1 -0
- package/build/cli/utils/mode-validator.d.ts +13 -0
- package/build/cli/utils/mode-validator.d.ts.map +1 -0
- package/build/cli/utils/mode-validator.js +31 -0
- package/build/cli/utils/mode-validator.js.map +1 -0
- package/build/cli/utils/port-checker.d.ts +20 -0
- package/build/cli/utils/port-checker.d.ts.map +1 -0
- package/build/cli/utils/port-checker.js +49 -0
- package/build/cli/utils/port-checker.js.map +1 -0
- package/build/config.d.ts +57 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +527 -0
- package/build/config.js.map +1 -0
- package/build/document-accessor.d.ts +79 -0
- package/build/document-accessor.d.ts.map +1 -0
- package/build/document-accessor.js +148 -0
- package/build/document-accessor.js.map +1 -0
- package/build/formatters/reproduce-markdown.d.ts +14 -0
- package/build/formatters/reproduce-markdown.d.ts.map +1 -0
- package/build/formatters/reproduce-markdown.js +182 -0
- package/build/formatters/reproduce-markdown.js.map +1 -0
- package/build/formatters/sarif-builder.d.ts +86 -0
- package/build/formatters/sarif-builder.d.ts.map +1 -0
- package/build/formatters/sarif-builder.js +276 -0
- package/build/formatters/sarif-builder.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +174 -0
- package/build/index.js.map +1 -0
- package/build/logger.d.ts +38 -0
- package/build/logger.d.ts.map +1 -0
- package/build/logger.js +105 -0
- package/build/logger.js.map +1 -0
- package/build/mock-server.d.ts +2 -0
- package/build/mock-server.d.ts.map +1 -0
- package/build/mock-server.js +290 -0
- package/build/mock-server.js.map +1 -0
- package/build/orchestrator.d.ts +149 -0
- package/build/orchestrator.d.ts.map +1 -0
- package/build/orchestrator.js +874 -0
- package/build/orchestrator.js.map +1 -0
- package/build/ruleset-loader.d.ts +79 -0
- package/build/ruleset-loader.d.ts.map +1 -0
- package/build/ruleset-loader.js +514 -0
- package/build/ruleset-loader.js.map +1 -0
- package/build/schemas.d.ts +2568 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +674 -0
- package/build/schemas.js.map +1 -0
- package/build/server.d.ts +39 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +834 -0
- package/build/server.js.map +1 -0
- package/build/storage/memory-storage.d.ts +190 -0
- package/build/storage/memory-storage.d.ts.map +1 -0
- package/build/storage/memory-storage.js +629 -0
- package/build/storage/memory-storage.js.map +1 -0
- package/build/storage/redis-storage.d.ts +134 -0
- package/build/storage/redis-storage.d.ts.map +1 -0
- package/build/storage/redis-storage.js +236 -0
- package/build/storage/redis-storage.js.map +1 -0
- package/build/storage/storage-adapter.d.ts +189 -0
- package/build/storage/storage-adapter.d.ts.map +1 -0
- package/build/storage/storage-adapter.js +36 -0
- package/build/storage/storage-adapter.js.map +1 -0
- package/build/types.d.ts +981 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/utils/version.d.ts +40 -0
- package/build/utils/version.d.ts.map +1 -0
- package/build/utils/version.js +94 -0
- package/build/utils/version.js.map +1 -0
- package/build/validation.d.ts +95 -0
- package/build/validation.d.ts.map +1 -0
- package/build/validation.js +150 -0
- package/build/validation.js.map +1 -0
- package/build/worker-pool.d.ts +137 -0
- package/build/worker-pool.d.ts.map +1 -0
- package/build/worker-pool.js +549 -0
- package/build/worker-pool.js.map +1 -0
- package/build/worker.d.ts +2 -0
- package/build/worker.d.ts.map +1 -0
- package/build/worker.js +427 -0
- package/build/worker.js.map +1 -0
- package/package.json +110 -0
- package/rulesets/CHANGELOG.md +25 -0
- package/rulesets/config/rulesets.yaml +96 -0
- package/rulesets/sources/README.md +47 -0
- package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
- package/rulesets/sources/example/oas-recommended/v2.0.0/ruleset.yaml +14 -0
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Storage Implementation for OpenAPI Lint Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Fast, local storage implementation using JavaScript Maps.
|
|
5
|
+
* Suitable for development, testing, and single-instance deployments.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Optional TTL (time-to-live) support with automatic expiration
|
|
9
|
+
* - Fast O(1) lookups by job ID
|
|
10
|
+
* - Efficient indexing by document ID for invalidation
|
|
11
|
+
* - Memory-efficient storage with periodic cleanup
|
|
12
|
+
*
|
|
13
|
+
* Limitations:
|
|
14
|
+
* - Data lost on process restart
|
|
15
|
+
* - Not shared across multiple instances
|
|
16
|
+
* - Memory usage grows with stored jobs
|
|
17
|
+
*
|
|
18
|
+
* @module storage/memory-storage
|
|
19
|
+
*/
|
|
20
|
+
import { makeCompositeKey } from './storage-adapter.js';
|
|
21
|
+
/**
|
|
22
|
+
* In-memory storage implementation
|
|
23
|
+
*
|
|
24
|
+
* Uses JavaScript Maps for fast lookups and indexing.
|
|
25
|
+
*/
|
|
26
|
+
export class MemoryLintStorage {
|
|
27
|
+
/**
|
|
28
|
+
* Main storage: jobId -> StorageEntry
|
|
29
|
+
*/
|
|
30
|
+
jobResults = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Index: documentId -> Set of jobIds
|
|
33
|
+
* Used for efficient invalidation of all jobs for a document
|
|
34
|
+
*/
|
|
35
|
+
documentIndex = new Map();
|
|
36
|
+
/**
|
|
37
|
+
* Index: composite key -> jobId
|
|
38
|
+
* Used for retrieving results by document + ruleset
|
|
39
|
+
*/
|
|
40
|
+
compositeIndex = new Map();
|
|
41
|
+
/**
|
|
42
|
+
* Index: status -> Set of jobIds
|
|
43
|
+
* Used for efficient filtering by job status
|
|
44
|
+
*/
|
|
45
|
+
statusIndex = new Map();
|
|
46
|
+
/**
|
|
47
|
+
* Index: rulesetName -> Set of jobIds
|
|
48
|
+
* Used for efficient filtering by ruleset
|
|
49
|
+
*/
|
|
50
|
+
rulesetIndex = new Map();
|
|
51
|
+
/**
|
|
52
|
+
* Index: timestamp -> jobId (sorted)
|
|
53
|
+
* Used for efficient time-based filtering and sorting
|
|
54
|
+
*/
|
|
55
|
+
timestampIndex = [];
|
|
56
|
+
/**
|
|
57
|
+
* TTL in milliseconds (if enabled)
|
|
58
|
+
*/
|
|
59
|
+
ttlMs;
|
|
60
|
+
/**
|
|
61
|
+
* Cleanup interval timer
|
|
62
|
+
*/
|
|
63
|
+
cleanupInterval;
|
|
64
|
+
/**
|
|
65
|
+
* Statistics
|
|
66
|
+
*/
|
|
67
|
+
stats = {
|
|
68
|
+
totalStored: 0,
|
|
69
|
+
totalExpired: 0,
|
|
70
|
+
totalInvalidated: 0
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Initialize storage with optional configuration
|
|
74
|
+
*
|
|
75
|
+
* @param options - Storage options including TTL
|
|
76
|
+
*/
|
|
77
|
+
async initialize(options) {
|
|
78
|
+
if (options?.ttl) {
|
|
79
|
+
this.ttlMs = options.ttl * 1000; // Convert seconds to milliseconds
|
|
80
|
+
// Start periodic cleanup every minute
|
|
81
|
+
// Use unref() to allow process to exit if this is the only active timer
|
|
82
|
+
this.cleanupInterval = setInterval(() => {
|
|
83
|
+
this.cleanupExpired();
|
|
84
|
+
}, 60000);
|
|
85
|
+
this.cleanupInterval.unref();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Store complete job result
|
|
90
|
+
*
|
|
91
|
+
* @param result - The lint job result
|
|
92
|
+
*/
|
|
93
|
+
async storeJob(result) {
|
|
94
|
+
const entry = {
|
|
95
|
+
result,
|
|
96
|
+
storedAt: new Date(),
|
|
97
|
+
expiresAt: this.ttlMs ? new Date(Date.now() + this.ttlMs) : undefined
|
|
98
|
+
};
|
|
99
|
+
// Store by job ID
|
|
100
|
+
this.jobResults.set(result.jobId, entry);
|
|
101
|
+
// Index by document ID
|
|
102
|
+
if (!this.documentIndex.has(result.documentId)) {
|
|
103
|
+
this.documentIndex.set(result.documentId, new Set());
|
|
104
|
+
}
|
|
105
|
+
this.documentIndex.get(result.documentId).add(result.jobId);
|
|
106
|
+
// Index by composite key (document + ruleset + version)
|
|
107
|
+
const compositeKey = makeCompositeKey(result.documentId, result.rulesetName, result.rulesetVersion);
|
|
108
|
+
this.compositeIndex.set(compositeKey, result.jobId);
|
|
109
|
+
// Index by status
|
|
110
|
+
if (!this.statusIndex.has(result.status)) {
|
|
111
|
+
this.statusIndex.set(result.status, new Set());
|
|
112
|
+
}
|
|
113
|
+
this.statusIndex.get(result.status).add(result.jobId);
|
|
114
|
+
// Index by ruleset
|
|
115
|
+
if (!this.rulesetIndex.has(result.rulesetName)) {
|
|
116
|
+
this.rulesetIndex.set(result.rulesetName, new Set());
|
|
117
|
+
}
|
|
118
|
+
this.rulesetIndex.get(result.rulesetName).add(result.jobId);
|
|
119
|
+
// Index by timestamp (maintain sorted order)
|
|
120
|
+
const timestamp = result.timestamp.getTime();
|
|
121
|
+
this.timestampIndex.push({ timestamp, jobId: result.jobId });
|
|
122
|
+
// Keep sorted by timestamp (descending - newest first)
|
|
123
|
+
this.timestampIndex.sort((a, b) => b.timestamp - a.timestamp);
|
|
124
|
+
this.stats.totalStored++;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Retrieve job result by job ID
|
|
128
|
+
*
|
|
129
|
+
* @param jobId - The job identifier
|
|
130
|
+
* @returns The job result, or null if not found or expired
|
|
131
|
+
*/
|
|
132
|
+
async retrieveJobById(jobId) {
|
|
133
|
+
const entry = this.jobResults.get(jobId);
|
|
134
|
+
if (!entry) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// Check if expired
|
|
138
|
+
if (this.isExpired(entry)) {
|
|
139
|
+
await this.removeEntry(jobId);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
return entry.result;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Retrieve job result by document + ruleset
|
|
146
|
+
*
|
|
147
|
+
* @param documentId - The document identifier
|
|
148
|
+
* @param rulesetName - The ruleset name
|
|
149
|
+
* @param rulesetVersion - The ruleset version
|
|
150
|
+
* @returns The job result, or null if not found or expired
|
|
151
|
+
*/
|
|
152
|
+
async retrieveJob(documentId, rulesetName, rulesetVersion) {
|
|
153
|
+
const compositeKey = makeCompositeKey(documentId, rulesetName, rulesetVersion);
|
|
154
|
+
const jobId = this.compositeIndex.get(compositeKey);
|
|
155
|
+
if (!jobId) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
return this.retrieveJobById(jobId);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if cached results exist
|
|
162
|
+
*
|
|
163
|
+
* @param documentId - The document identifier
|
|
164
|
+
* @param rulesetName - The ruleset name
|
|
165
|
+
* @param rulesetVersion - The ruleset version
|
|
166
|
+
* @returns True if results exist and haven't expired
|
|
167
|
+
*/
|
|
168
|
+
async exists(documentId, rulesetName, rulesetVersion) {
|
|
169
|
+
const result = await this.retrieveJob(documentId, rulesetName, rulesetVersion);
|
|
170
|
+
return result !== null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Invalidate all results for a document
|
|
174
|
+
*
|
|
175
|
+
* @param documentId - The document identifier
|
|
176
|
+
* @returns Number of invalidated jobs
|
|
177
|
+
*/
|
|
178
|
+
async invalidate(documentId) {
|
|
179
|
+
const jobIds = this.documentIndex.get(documentId);
|
|
180
|
+
if (!jobIds || jobIds.size === 0) {
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
183
|
+
let count = 0;
|
|
184
|
+
for (const jobId of jobIds) {
|
|
185
|
+
await this.removeEntry(jobId);
|
|
186
|
+
count++;
|
|
187
|
+
}
|
|
188
|
+
this.documentIndex.delete(documentId);
|
|
189
|
+
this.stats.totalInvalidated += count;
|
|
190
|
+
return count;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get storage statistics
|
|
194
|
+
*
|
|
195
|
+
* @returns Storage statistics
|
|
196
|
+
*/
|
|
197
|
+
async getStats() {
|
|
198
|
+
// Calculate total results and failure stats
|
|
199
|
+
let totalResults = 0;
|
|
200
|
+
let storageSize = 0;
|
|
201
|
+
let totalFailed = 0;
|
|
202
|
+
let totalTimeout = 0;
|
|
203
|
+
let totalCompleted = 0;
|
|
204
|
+
for (const entry of this.jobResults.values()) {
|
|
205
|
+
totalResults += entry.result.results.length;
|
|
206
|
+
// Rough estimate of storage size
|
|
207
|
+
storageSize += JSON.stringify(entry.result).length;
|
|
208
|
+
// Track failure statistics
|
|
209
|
+
if (entry.result.status === 'failed') {
|
|
210
|
+
totalFailed++;
|
|
211
|
+
}
|
|
212
|
+
else if (entry.result.status === 'timeout') {
|
|
213
|
+
totalTimeout++;
|
|
214
|
+
}
|
|
215
|
+
else if (entry.result.status === 'completed' || entry.result.status === 'completed_with_errors') {
|
|
216
|
+
totalCompleted++;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const totalJobs = this.jobResults.size;
|
|
220
|
+
const failureRate = totalJobs > 0 ? (totalFailed + totalTimeout) / totalJobs : 0;
|
|
221
|
+
return {
|
|
222
|
+
totalJobs,
|
|
223
|
+
totalResults,
|
|
224
|
+
storageSize,
|
|
225
|
+
expiredEntries: this.stats.totalExpired,
|
|
226
|
+
failureStats: {
|
|
227
|
+
totalFailed,
|
|
228
|
+
totalTimeout,
|
|
229
|
+
totalCompleted,
|
|
230
|
+
failureRate
|
|
231
|
+
},
|
|
232
|
+
totalStored: this.stats.totalStored,
|
|
233
|
+
totalInvalidated: this.stats.totalInvalidated,
|
|
234
|
+
activeJobs: this.jobResults.size,
|
|
235
|
+
indexedDocuments: this.documentIndex.size,
|
|
236
|
+
compositeKeys: this.compositeIndex.size
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Clear all stored data
|
|
241
|
+
*
|
|
242
|
+
* @returns Number of jobs cleared
|
|
243
|
+
*/
|
|
244
|
+
async clear() {
|
|
245
|
+
const count = this.jobResults.size;
|
|
246
|
+
this.jobResults.clear();
|
|
247
|
+
this.documentIndex.clear();
|
|
248
|
+
this.compositeIndex.clear();
|
|
249
|
+
this.statusIndex.clear();
|
|
250
|
+
this.rulesetIndex.clear();
|
|
251
|
+
this.timestampIndex = [];
|
|
252
|
+
return count;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Close storage and cleanup resources
|
|
256
|
+
*/
|
|
257
|
+
async close() {
|
|
258
|
+
if (this.cleanupInterval) {
|
|
259
|
+
clearInterval(this.cleanupInterval);
|
|
260
|
+
this.cleanupInterval = undefined;
|
|
261
|
+
}
|
|
262
|
+
// Final cleanup
|
|
263
|
+
await this.clear();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Check if entry has expired
|
|
267
|
+
*
|
|
268
|
+
* @param entry - Storage entry
|
|
269
|
+
* @returns True if expired
|
|
270
|
+
*/
|
|
271
|
+
isExpired(entry) {
|
|
272
|
+
if (!entry.expiresAt) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
return Date.now() > entry.expiresAt.getTime();
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Remove a single entry and update indexes
|
|
279
|
+
*
|
|
280
|
+
* @param jobId - Job identifier
|
|
281
|
+
*/
|
|
282
|
+
async removeEntry(jobId) {
|
|
283
|
+
const entry = this.jobResults.get(jobId);
|
|
284
|
+
if (!entry) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const result = entry.result;
|
|
288
|
+
// Remove from main storage
|
|
289
|
+
this.jobResults.delete(jobId);
|
|
290
|
+
// Remove from document index
|
|
291
|
+
const documentJobs = this.documentIndex.get(result.documentId);
|
|
292
|
+
if (documentJobs) {
|
|
293
|
+
documentJobs.delete(jobId);
|
|
294
|
+
if (documentJobs.size === 0) {
|
|
295
|
+
this.documentIndex.delete(result.documentId);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Remove from composite index
|
|
299
|
+
const compositeKey = makeCompositeKey(result.documentId, result.rulesetName, result.rulesetVersion);
|
|
300
|
+
// Only remove if this job is the current entry for this composite key
|
|
301
|
+
if (this.compositeIndex.get(compositeKey) === jobId) {
|
|
302
|
+
this.compositeIndex.delete(compositeKey);
|
|
303
|
+
}
|
|
304
|
+
// Remove from status index
|
|
305
|
+
const statusJobs = this.statusIndex.get(result.status);
|
|
306
|
+
if (statusJobs) {
|
|
307
|
+
statusJobs.delete(jobId);
|
|
308
|
+
if (statusJobs.size === 0) {
|
|
309
|
+
this.statusIndex.delete(result.status);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Remove from ruleset index
|
|
313
|
+
const rulesetJobs = this.rulesetIndex.get(result.rulesetName);
|
|
314
|
+
if (rulesetJobs) {
|
|
315
|
+
rulesetJobs.delete(jobId);
|
|
316
|
+
if (rulesetJobs.size === 0) {
|
|
317
|
+
this.rulesetIndex.delete(result.rulesetName);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Remove from timestamp index
|
|
321
|
+
const timestampIdx = this.timestampIndex.findIndex(item => item.jobId === jobId);
|
|
322
|
+
if (timestampIdx !== -1) {
|
|
323
|
+
this.timestampIndex.splice(timestampIdx, 1);
|
|
324
|
+
}
|
|
325
|
+
if (this.isExpired(entry)) {
|
|
326
|
+
this.stats.totalExpired++;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Clean up expired entries
|
|
331
|
+
*
|
|
332
|
+
* Called periodically when TTL is enabled.
|
|
333
|
+
*
|
|
334
|
+
* @returns Number of entries cleaned up
|
|
335
|
+
*/
|
|
336
|
+
cleanupExpired() {
|
|
337
|
+
if (!this.ttlMs) {
|
|
338
|
+
return 0;
|
|
339
|
+
}
|
|
340
|
+
let count = 0;
|
|
341
|
+
const jobsToRemove = [];
|
|
342
|
+
// Find expired entries
|
|
343
|
+
for (const [jobId, entry] of this.jobResults.entries()) {
|
|
344
|
+
if (this.isExpired(entry)) {
|
|
345
|
+
jobsToRemove.push(jobId);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Remove them
|
|
349
|
+
for (const jobId of jobsToRemove) {
|
|
350
|
+
this.removeEntry(jobId);
|
|
351
|
+
count++;
|
|
352
|
+
}
|
|
353
|
+
return count;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* List jobs with filtering and pagination
|
|
357
|
+
*
|
|
358
|
+
* @param options - Filter and pagination options
|
|
359
|
+
* @returns Array of job summaries (lightweight, documentId only)
|
|
360
|
+
*/
|
|
361
|
+
async listJobs(options = {}) {
|
|
362
|
+
const { status, documentId, rulesetName, startDate, endDate,
|
|
363
|
+
// sessionId, // Future: filter by runtime session ID
|
|
364
|
+
limit = 50, offset = 0, sortBy = 'timestamp', sortOrder = 'desc' } = options;
|
|
365
|
+
// Start with all job IDs
|
|
366
|
+
let candidateJobIds = new Set(this.jobResults.keys());
|
|
367
|
+
// Apply filters using indexes for efficiency
|
|
368
|
+
if (status) {
|
|
369
|
+
const statusArray = Array.isArray(status) ? status : [status];
|
|
370
|
+
const statusMatches = new Set();
|
|
371
|
+
for (const s of statusArray) {
|
|
372
|
+
const jobIds = this.statusIndex.get(s);
|
|
373
|
+
if (jobIds) {
|
|
374
|
+
jobIds.forEach(id => statusMatches.add(id));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
candidateJobIds = new Set([...candidateJobIds].filter(id => statusMatches.has(id)));
|
|
378
|
+
}
|
|
379
|
+
if (documentId) {
|
|
380
|
+
const docJobs = this.documentIndex.get(documentId) || new Set();
|
|
381
|
+
candidateJobIds = new Set([...candidateJobIds].filter(id => docJobs.has(id)));
|
|
382
|
+
}
|
|
383
|
+
if (rulesetName) {
|
|
384
|
+
const rulesetJobs = this.rulesetIndex.get(rulesetName) || new Set();
|
|
385
|
+
candidateJobIds = new Set([...candidateJobIds].filter(id => rulesetJobs.has(id)));
|
|
386
|
+
}
|
|
387
|
+
// Filter by date range and sessionId (requires full scan of candidates)
|
|
388
|
+
const filteredResults = [];
|
|
389
|
+
for (const jobId of candidateJobIds) {
|
|
390
|
+
const entry = this.jobResults.get(jobId);
|
|
391
|
+
if (!entry || this.isExpired(entry)) {
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
const result = entry.result;
|
|
395
|
+
// Date range filter
|
|
396
|
+
if (startDate && result.timestamp < startDate)
|
|
397
|
+
continue;
|
|
398
|
+
if (endDate && result.timestamp > endDate)
|
|
399
|
+
continue;
|
|
400
|
+
// Session ID filter (if provided)
|
|
401
|
+
// Note: sessionId would need to be added to LintJobResult in future
|
|
402
|
+
// For now, we skip this filter
|
|
403
|
+
// if (sessionId && result.sessionId !== sessionId) continue;
|
|
404
|
+
filteredResults.push(result);
|
|
405
|
+
}
|
|
406
|
+
// Sort results
|
|
407
|
+
filteredResults.sort((a, b) => {
|
|
408
|
+
let comparison = 0;
|
|
409
|
+
switch (sortBy) {
|
|
410
|
+
case 'timestamp':
|
|
411
|
+
comparison = a.timestamp.getTime() - b.timestamp.getTime();
|
|
412
|
+
break;
|
|
413
|
+
case 'status':
|
|
414
|
+
comparison = a.status.localeCompare(b.status);
|
|
415
|
+
break;
|
|
416
|
+
case 'documentId':
|
|
417
|
+
comparison = a.documentId.localeCompare(b.documentId);
|
|
418
|
+
break;
|
|
419
|
+
case 'rulesetName':
|
|
420
|
+
comparison = a.rulesetName.localeCompare(b.rulesetName);
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
return sortOrder === 'desc' ? -comparison : comparison;
|
|
424
|
+
});
|
|
425
|
+
// Apply pagination
|
|
426
|
+
const paginatedResults = filteredResults.slice(offset, offset + limit);
|
|
427
|
+
// Convert to JobSummary (lightweight, documentId only)
|
|
428
|
+
return paginatedResults.map(result => ({
|
|
429
|
+
jobId: result.jobId,
|
|
430
|
+
documentId: result.documentId, // ID only, no metadata
|
|
431
|
+
rulesetName: result.rulesetName,
|
|
432
|
+
rulesetVersion: result.rulesetVersion,
|
|
433
|
+
status: result.status,
|
|
434
|
+
timestamp: result.timestamp,
|
|
435
|
+
totalExecutionTime: result.totalExecutionTime,
|
|
436
|
+
summary: result.summary
|
|
437
|
+
}));
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Get lint activity for a specific document
|
|
441
|
+
*
|
|
442
|
+
* @param documentId - The document identifier
|
|
443
|
+
* @returns Document lint activity summary
|
|
444
|
+
*/
|
|
445
|
+
async getDocumentLintActivity(documentId) {
|
|
446
|
+
const jobIds = this.documentIndex.get(documentId);
|
|
447
|
+
if (!jobIds || jobIds.size === 0) {
|
|
448
|
+
return null;
|
|
449
|
+
}
|
|
450
|
+
const jobsByStatus = {};
|
|
451
|
+
const jobsByRuleset = {};
|
|
452
|
+
let lastLintedAt;
|
|
453
|
+
let totalJobs = 0;
|
|
454
|
+
for (const jobId of jobIds) {
|
|
455
|
+
const entry = this.jobResults.get(jobId);
|
|
456
|
+
if (!entry || this.isExpired(entry)) {
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
const result = entry.result;
|
|
460
|
+
totalJobs++;
|
|
461
|
+
// Track by status
|
|
462
|
+
jobsByStatus[result.status] = (jobsByStatus[result.status] || 0) + 1;
|
|
463
|
+
// Track by ruleset
|
|
464
|
+
jobsByRuleset[result.rulesetName] = (jobsByRuleset[result.rulesetName] || 0) + 1;
|
|
465
|
+
// Track most recent lint
|
|
466
|
+
if (!lastLintedAt || result.timestamp > lastLintedAt) {
|
|
467
|
+
lastLintedAt = result.timestamp;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
documentId,
|
|
472
|
+
totalJobs,
|
|
473
|
+
lastLintedAt,
|
|
474
|
+
jobsByStatus: jobsByStatus,
|
|
475
|
+
jobsByRuleset
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Get all job IDs for a document (for testing/debugging)
|
|
480
|
+
*
|
|
481
|
+
* @param documentId - Document identifier
|
|
482
|
+
* @returns Set of job IDs
|
|
483
|
+
*/
|
|
484
|
+
getJobsForDocument(documentId) {
|
|
485
|
+
return this.documentIndex.get(documentId) || new Set();
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Get all stored job IDs (for testing/debugging)
|
|
489
|
+
*
|
|
490
|
+
* @returns Array of job IDs
|
|
491
|
+
*/
|
|
492
|
+
getAllJobIds() {
|
|
493
|
+
return Array.from(this.jobResults.keys());
|
|
494
|
+
}
|
|
495
|
+
// ============================================
|
|
496
|
+
// Paginated Result Queries
|
|
497
|
+
// ============================================
|
|
498
|
+
/**
|
|
499
|
+
* Filter issues based on query options
|
|
500
|
+
*/
|
|
501
|
+
filterIssues(issues, options) {
|
|
502
|
+
let filtered = issues;
|
|
503
|
+
if (options.severity !== undefined) {
|
|
504
|
+
filtered = filtered.filter(i => i.severity === options.severity);
|
|
505
|
+
}
|
|
506
|
+
if (options.rule) {
|
|
507
|
+
filtered = filtered.filter(i => i.ruleId === options.rule || i.code === options.rule);
|
|
508
|
+
}
|
|
509
|
+
if (options.pathPrefix) {
|
|
510
|
+
const prefix = options.pathPrefix;
|
|
511
|
+
filtered = filtered.filter(i => {
|
|
512
|
+
const pathStr = i.path.join('.');
|
|
513
|
+
return pathStr.startsWith(prefix);
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
return filtered;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Retrieve job results with pagination and filtering
|
|
520
|
+
*/
|
|
521
|
+
async queryJobResults(jobId, options) {
|
|
522
|
+
const entry = this.jobResults.get(jobId);
|
|
523
|
+
if (!entry)
|
|
524
|
+
return null;
|
|
525
|
+
if (this.isExpired(entry)) {
|
|
526
|
+
await this.removeEntry(jobId);
|
|
527
|
+
return null;
|
|
528
|
+
}
|
|
529
|
+
const result = entry.result;
|
|
530
|
+
const hasFilters = options.severity !== undefined || options.rule !== undefined || options.pathPrefix !== undefined;
|
|
531
|
+
const hasPagination = options.offset !== undefined || options.limit !== undefined;
|
|
532
|
+
// Apply filters
|
|
533
|
+
const filtered = hasFilters ? this.filterIssues(result.results, options) : result.results;
|
|
534
|
+
const totalMatching = filtered.length;
|
|
535
|
+
// Apply pagination
|
|
536
|
+
const offset = options.offset ?? 0;
|
|
537
|
+
const limit = options.limit ?? filtered.length;
|
|
538
|
+
const paginated = filtered.slice(offset, offset + limit);
|
|
539
|
+
const response = {
|
|
540
|
+
jobId: result.jobId,
|
|
541
|
+
documentId: result.documentId,
|
|
542
|
+
rulesetName: result.rulesetName,
|
|
543
|
+
rulesetVersion: result.rulesetVersion,
|
|
544
|
+
status: result.status,
|
|
545
|
+
timestamp: result.timestamp,
|
|
546
|
+
totalExecutionTime: result.totalExecutionTime,
|
|
547
|
+
summary: result.summary,
|
|
548
|
+
results: paginated,
|
|
549
|
+
};
|
|
550
|
+
if (hasPagination) {
|
|
551
|
+
response.pagination = {
|
|
552
|
+
offset,
|
|
553
|
+
limit,
|
|
554
|
+
returned: paginated.length,
|
|
555
|
+
totalMatching,
|
|
556
|
+
hasMore: offset + paginated.length < totalMatching,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
if (hasFilters) {
|
|
560
|
+
response.filters = {
|
|
561
|
+
severity: options.severity ?? null,
|
|
562
|
+
rule: options.rule ?? null,
|
|
563
|
+
pathPrefix: options.pathPrefix ?? null,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
if (result.truncated) {
|
|
567
|
+
response.truncated = result.truncated;
|
|
568
|
+
response.truncationInfo = result.truncationInfo;
|
|
569
|
+
}
|
|
570
|
+
return response;
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Get aggregated statistics for a job's lint results
|
|
574
|
+
*/
|
|
575
|
+
async getJobStats(jobId) {
|
|
576
|
+
const entry = this.jobResults.get(jobId);
|
|
577
|
+
if (!entry)
|
|
578
|
+
return null;
|
|
579
|
+
if (this.isExpired(entry)) {
|
|
580
|
+
await this.removeEntry(jobId);
|
|
581
|
+
return null;
|
|
582
|
+
}
|
|
583
|
+
const result = entry.result;
|
|
584
|
+
const issues = result.results;
|
|
585
|
+
// Build rule breakdown: count issues per rule, track severity
|
|
586
|
+
const ruleMap = new Map();
|
|
587
|
+
for (const issue of issues) {
|
|
588
|
+
const rule = issue.ruleId || issue.code;
|
|
589
|
+
const existing = ruleMap.get(rule);
|
|
590
|
+
if (existing) {
|
|
591
|
+
existing.count++;
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
ruleMap.set(rule, { count: 1, severity: issue.severity });
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
const ruleBreakdown = Array.from(ruleMap.entries())
|
|
598
|
+
.map(([rule, data]) => ({ rule, count: data.count, severity: data.severity }))
|
|
599
|
+
.sort((a, b) => b.count - a.count);
|
|
600
|
+
// Build top paths: group by first 2 path segments (e.g., "paths./pets")
|
|
601
|
+
const pathMap = new Map();
|
|
602
|
+
for (const issue of issues) {
|
|
603
|
+
if (issue.path.length >= 2) {
|
|
604
|
+
const prefix = issue.path.slice(0, 2).join('.');
|
|
605
|
+
pathMap.set(prefix, (pathMap.get(prefix) || 0) + 1);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
const topPaths = Array.from(pathMap.entries())
|
|
609
|
+
.map(([pathPrefix, count]) => ({ pathPrefix, count }))
|
|
610
|
+
.sort((a, b) => b.count - a.count)
|
|
611
|
+
.slice(0, 20); // Top 20 paths
|
|
612
|
+
const stats = {
|
|
613
|
+
jobId: result.jobId,
|
|
614
|
+
documentId: result.documentId,
|
|
615
|
+
rulesetName: result.rulesetName,
|
|
616
|
+
rulesetVersion: result.rulesetVersion,
|
|
617
|
+
status: result.status,
|
|
618
|
+
summary: result.summary,
|
|
619
|
+
ruleBreakdown,
|
|
620
|
+
topPaths,
|
|
621
|
+
};
|
|
622
|
+
if (result.truncated) {
|
|
623
|
+
stats.truncated = result.truncated;
|
|
624
|
+
stats.truncationInfo = result.truncationInfo;
|
|
625
|
+
}
|
|
626
|
+
return stats;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
//# sourceMappingURL=memory-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../src/storage/memory-storage.ts"],"names":[],"mappings":"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"}
|