@danielsimonjr/memoryjs 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 +22 -0
- package/README.md +266 -0
- package/dist/core/EntityManager.d.ts +268 -0
- package/dist/core/EntityManager.d.ts.map +1 -0
- package/dist/core/EntityManager.js +512 -0
- package/dist/core/EntityManager.js.map +1 -0
- package/dist/core/GraphEventEmitter.d.ts +202 -0
- package/dist/core/GraphEventEmitter.d.ts.map +1 -0
- package/dist/core/GraphEventEmitter.js +347 -0
- package/dist/core/GraphEventEmitter.js.map +1 -0
- package/dist/core/GraphStorage.d.ts +395 -0
- package/dist/core/GraphStorage.d.ts.map +1 -0
- package/dist/core/GraphStorage.js +786 -0
- package/dist/core/GraphStorage.js.map +1 -0
- package/dist/core/GraphTraversal.d.ts +141 -0
- package/dist/core/GraphTraversal.d.ts.map +1 -0
- package/dist/core/GraphTraversal.js +574 -0
- package/dist/core/GraphTraversal.js.map +1 -0
- package/dist/core/HierarchyManager.d.ts +111 -0
- package/dist/core/HierarchyManager.d.ts.map +1 -0
- package/dist/core/HierarchyManager.js +225 -0
- package/dist/core/HierarchyManager.js.map +1 -0
- package/dist/core/ManagerContext.d.ts +76 -0
- package/dist/core/ManagerContext.d.ts.map +1 -0
- package/dist/core/ManagerContext.js +129 -0
- package/dist/core/ManagerContext.js.map +1 -0
- package/dist/core/ObservationManager.d.ts +85 -0
- package/dist/core/ObservationManager.d.ts.map +1 -0
- package/dist/core/ObservationManager.js +124 -0
- package/dist/core/ObservationManager.js.map +1 -0
- package/dist/core/RelationManager.d.ts +131 -0
- package/dist/core/RelationManager.d.ts.map +1 -0
- package/dist/core/RelationManager.js +212 -0
- package/dist/core/RelationManager.js.map +1 -0
- package/dist/core/SQLiteStorage.d.ts +354 -0
- package/dist/core/SQLiteStorage.d.ts.map +1 -0
- package/dist/core/SQLiteStorage.js +919 -0
- package/dist/core/SQLiteStorage.js.map +1 -0
- package/dist/core/StorageFactory.d.ts +45 -0
- package/dist/core/StorageFactory.d.ts.map +1 -0
- package/dist/core/StorageFactory.js +65 -0
- package/dist/core/StorageFactory.js.map +1 -0
- package/dist/core/TransactionManager.d.ts +464 -0
- package/dist/core/TransactionManager.d.ts.map +1 -0
- package/dist/core/TransactionManager.js +869 -0
- package/dist/core/TransactionManager.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/features/AnalyticsManager.d.ts +44 -0
- package/dist/features/AnalyticsManager.d.ts.map +1 -0
- package/dist/features/AnalyticsManager.js +224 -0
- package/dist/features/AnalyticsManager.js.map +1 -0
- package/dist/features/ArchiveManager.d.ts +133 -0
- package/dist/features/ArchiveManager.d.ts.map +1 -0
- package/dist/features/ArchiveManager.js +282 -0
- package/dist/features/ArchiveManager.js.map +1 -0
- package/dist/features/CompressionManager.d.ts +119 -0
- package/dist/features/CompressionManager.d.ts.map +1 -0
- package/dist/features/CompressionManager.js +470 -0
- package/dist/features/CompressionManager.js.map +1 -0
- package/dist/features/IOManager.d.ts +225 -0
- package/dist/features/IOManager.d.ts.map +1 -0
- package/dist/features/IOManager.js +1093 -0
- package/dist/features/IOManager.js.map +1 -0
- package/dist/features/KeywordExtractor.d.ts +61 -0
- package/dist/features/KeywordExtractor.d.ts.map +1 -0
- package/dist/features/KeywordExtractor.js +127 -0
- package/dist/features/KeywordExtractor.js.map +1 -0
- package/dist/features/ObservationNormalizer.d.ts +90 -0
- package/dist/features/ObservationNormalizer.d.ts.map +1 -0
- package/dist/features/ObservationNormalizer.js +194 -0
- package/dist/features/ObservationNormalizer.js.map +1 -0
- package/dist/features/StreamingExporter.d.ts +128 -0
- package/dist/features/StreamingExporter.d.ts.map +1 -0
- package/dist/features/StreamingExporter.js +212 -0
- package/dist/features/StreamingExporter.js.map +1 -0
- package/dist/features/TagManager.d.ts +147 -0
- package/dist/features/TagManager.d.ts.map +1 -0
- package/dist/features/TagManager.js +211 -0
- package/dist/features/TagManager.js.map +1 -0
- package/dist/features/index.d.ts +14 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +15 -0
- package/dist/features/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/search/BM25Search.d.ts +148 -0
- package/dist/search/BM25Search.d.ts.map +1 -0
- package/dist/search/BM25Search.js +340 -0
- package/dist/search/BM25Search.js.map +1 -0
- package/dist/search/BasicSearch.d.ts +51 -0
- package/dist/search/BasicSearch.d.ts.map +1 -0
- package/dist/search/BasicSearch.js +138 -0
- package/dist/search/BasicSearch.js.map +1 -0
- package/dist/search/BooleanSearch.d.ts +98 -0
- package/dist/search/BooleanSearch.d.ts.map +1 -0
- package/dist/search/BooleanSearch.js +431 -0
- package/dist/search/BooleanSearch.js.map +1 -0
- package/dist/search/EarlyTerminationManager.d.ts +140 -0
- package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
- package/dist/search/EarlyTerminationManager.js +280 -0
- package/dist/search/EarlyTerminationManager.js.map +1 -0
- package/dist/search/EmbeddingCache.d.ts +175 -0
- package/dist/search/EmbeddingCache.d.ts.map +1 -0
- package/dist/search/EmbeddingCache.js +247 -0
- package/dist/search/EmbeddingCache.js.map +1 -0
- package/dist/search/EmbeddingService.d.ts +277 -0
- package/dist/search/EmbeddingService.d.ts.map +1 -0
- package/dist/search/EmbeddingService.js +531 -0
- package/dist/search/EmbeddingService.js.map +1 -0
- package/dist/search/FuzzySearch.d.ts +118 -0
- package/dist/search/FuzzySearch.d.ts.map +1 -0
- package/dist/search/FuzzySearch.js +313 -0
- package/dist/search/FuzzySearch.js.map +1 -0
- package/dist/search/HybridScorer.d.ts +181 -0
- package/dist/search/HybridScorer.d.ts.map +1 -0
- package/dist/search/HybridScorer.js +258 -0
- package/dist/search/HybridScorer.js.map +1 -0
- package/dist/search/HybridSearchManager.d.ts +80 -0
- package/dist/search/HybridSearchManager.d.ts.map +1 -0
- package/dist/search/HybridSearchManager.js +188 -0
- package/dist/search/HybridSearchManager.js.map +1 -0
- package/dist/search/IncrementalIndexer.d.ts +201 -0
- package/dist/search/IncrementalIndexer.d.ts.map +1 -0
- package/dist/search/IncrementalIndexer.js +343 -0
- package/dist/search/IncrementalIndexer.js.map +1 -0
- package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
- package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
- package/dist/search/OptimizedInvertedIndex.js +359 -0
- package/dist/search/OptimizedInvertedIndex.js.map +1 -0
- package/dist/search/ParallelSearchExecutor.d.ts +172 -0
- package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
- package/dist/search/ParallelSearchExecutor.js +310 -0
- package/dist/search/ParallelSearchExecutor.js.map +1 -0
- package/dist/search/QuantizedVectorStore.d.ts +171 -0
- package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
- package/dist/search/QuantizedVectorStore.js +308 -0
- package/dist/search/QuantizedVectorStore.js.map +1 -0
- package/dist/search/QueryAnalyzer.d.ts +76 -0
- package/dist/search/QueryAnalyzer.d.ts.map +1 -0
- package/dist/search/QueryAnalyzer.js +228 -0
- package/dist/search/QueryAnalyzer.js.map +1 -0
- package/dist/search/QueryCostEstimator.d.ts +244 -0
- package/dist/search/QueryCostEstimator.d.ts.map +1 -0
- package/dist/search/QueryCostEstimator.js +653 -0
- package/dist/search/QueryCostEstimator.js.map +1 -0
- package/dist/search/QueryPlanCache.d.ts +220 -0
- package/dist/search/QueryPlanCache.d.ts.map +1 -0
- package/dist/search/QueryPlanCache.js +380 -0
- package/dist/search/QueryPlanCache.js.map +1 -0
- package/dist/search/QueryPlanner.d.ts +58 -0
- package/dist/search/QueryPlanner.d.ts.map +1 -0
- package/dist/search/QueryPlanner.js +138 -0
- package/dist/search/QueryPlanner.js.map +1 -0
- package/dist/search/RankedSearch.d.ts +71 -0
- package/dist/search/RankedSearch.d.ts.map +1 -0
- package/dist/search/RankedSearch.js +239 -0
- package/dist/search/RankedSearch.js.map +1 -0
- package/dist/search/ReflectionManager.d.ts +120 -0
- package/dist/search/ReflectionManager.d.ts.map +1 -0
- package/dist/search/ReflectionManager.js +232 -0
- package/dist/search/ReflectionManager.js.map +1 -0
- package/dist/search/SavedSearchManager.d.ts +79 -0
- package/dist/search/SavedSearchManager.d.ts.map +1 -0
- package/dist/search/SavedSearchManager.js +147 -0
- package/dist/search/SavedSearchManager.js.map +1 -0
- package/dist/search/SearchFilterChain.d.ts +120 -0
- package/dist/search/SearchFilterChain.d.ts.map +1 -0
- package/dist/search/SearchFilterChain.js +186 -0
- package/dist/search/SearchFilterChain.js.map +1 -0
- package/dist/search/SearchManager.d.ts +326 -0
- package/dist/search/SearchManager.d.ts.map +1 -0
- package/dist/search/SearchManager.js +454 -0
- package/dist/search/SearchManager.js.map +1 -0
- package/dist/search/SearchSuggestions.d.ts +27 -0
- package/dist/search/SearchSuggestions.d.ts.map +1 -0
- package/dist/search/SearchSuggestions.js +58 -0
- package/dist/search/SearchSuggestions.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +149 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +324 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/search/SymbolicSearch.d.ts +61 -0
- package/dist/search/SymbolicSearch.d.ts.map +1 -0
- package/dist/search/SymbolicSearch.js +164 -0
- package/dist/search/SymbolicSearch.js.map +1 -0
- package/dist/search/TFIDFEventSync.d.ts +85 -0
- package/dist/search/TFIDFEventSync.d.ts.map +1 -0
- package/dist/search/TFIDFEventSync.js +134 -0
- package/dist/search/TFIDFEventSync.js.map +1 -0
- package/dist/search/TFIDFIndexManager.d.ts +151 -0
- package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
- package/dist/search/TFIDFIndexManager.js +433 -0
- package/dist/search/TFIDFIndexManager.js.map +1 -0
- package/dist/search/VectorStore.d.ts +235 -0
- package/dist/search/VectorStore.d.ts.map +1 -0
- package/dist/search/VectorStore.js +312 -0
- package/dist/search/VectorStore.js.map +1 -0
- package/dist/search/index.d.ts +35 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +53 -0
- package/dist/search/index.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/types.d.ts +1811 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +10 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/BatchProcessor.d.ts +271 -0
- package/dist/utils/BatchProcessor.d.ts.map +1 -0
- package/dist/utils/BatchProcessor.js +377 -0
- package/dist/utils/BatchProcessor.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +176 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +306 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/dist/utils/WorkerPoolManager.d.ts +233 -0
- package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
- package/dist/utils/WorkerPoolManager.js +421 -0
- package/dist/utils/WorkerPoolManager.js.map +1 -0
- package/dist/utils/compressedCache.d.ts +221 -0
- package/dist/utils/compressedCache.d.ts.map +1 -0
- package/dist/utils/compressedCache.js +349 -0
- package/dist/utils/compressedCache.js.map +1 -0
- package/dist/utils/compressionUtil.d.ts +214 -0
- package/dist/utils/compressionUtil.d.ts.map +1 -0
- package/dist/utils/compressionUtil.js +248 -0
- package/dist/utils/compressionUtil.js.map +1 -0
- package/dist/utils/constants.d.ts +245 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +253 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/entityUtils.d.ts +379 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +649 -0
- package/dist/utils/entityUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +95 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +146 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatters.d.ts +145 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +133 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/index.d.ts +26 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +88 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/indexes.d.ts +270 -0
- package/dist/utils/indexes.d.ts.map +1 -0
- package/dist/utils/indexes.js +527 -0
- package/dist/utils/indexes.js.map +1 -0
- package/dist/utils/logger.d.ts +31 -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/operationUtils.d.ts +124 -0
- package/dist/utils/operationUtils.d.ts.map +1 -0
- package/dist/utils/operationUtils.js +176 -0
- package/dist/utils/operationUtils.js.map +1 -0
- package/dist/utils/parallelUtils.d.ts +76 -0
- package/dist/utils/parallelUtils.d.ts.map +1 -0
- package/dist/utils/parallelUtils.js +192 -0
- package/dist/utils/parallelUtils.js.map +1 -0
- package/dist/utils/schemas.d.ts +556 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +485 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/searchAlgorithms.d.ts +99 -0
- package/dist/utils/searchAlgorithms.d.ts.map +1 -0
- package/dist/utils/searchAlgorithms.js +168 -0
- package/dist/utils/searchAlgorithms.js.map +1 -0
- package/dist/utils/searchCache.d.ts +108 -0
- package/dist/utils/searchCache.d.ts.map +1 -0
- package/dist/utils/searchCache.js +210 -0
- package/dist/utils/searchCache.js.map +1 -0
- package/dist/utils/taskScheduler.d.ts +294 -0
- package/dist/utils/taskScheduler.d.ts.map +1 -0
- package/dist/utils/taskScheduler.js +487 -0
- package/dist/utils/taskScheduler.js.map +1 -0
- package/dist/workers/index.d.ts +12 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +10 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/levenshteinWorker.d.ts +60 -0
- package/dist/workers/levenshteinWorker.d.ts.map +1 -0
- package/dist/workers/levenshteinWorker.js +99 -0
- package/dist/workers/levenshteinWorker.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Processor
|
|
3
|
+
*
|
|
4
|
+
* Phase 12 Sprint 2: Generic batch processing utility with parallel execution,
|
|
5
|
+
* retry logic, progress callbacks, and error collection.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/BatchProcessor
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default options for batch processing.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_OPTIONS = {
|
|
13
|
+
concurrency: 4,
|
|
14
|
+
batchSize: 4,
|
|
15
|
+
maxRetries: 0,
|
|
16
|
+
retryDelayMs: 1000,
|
|
17
|
+
retryBackoffMultiplier: 2,
|
|
18
|
+
maxRetryDelayMs: 30000,
|
|
19
|
+
continueOnError: true,
|
|
20
|
+
itemTimeoutMs: 0,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* BatchProcessor - Generic batch processing with parallel execution
|
|
24
|
+
*
|
|
25
|
+
* Provides a flexible utility for processing arrays of items with:
|
|
26
|
+
* - Configurable concurrency
|
|
27
|
+
* - Automatic retry with exponential backoff
|
|
28
|
+
* - Progress callbacks for monitoring
|
|
29
|
+
* - Error collection without failing the entire batch
|
|
30
|
+
* - Cancellation support via AbortSignal
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const processor = new BatchProcessor<string, number>({
|
|
35
|
+
* concurrency: 4,
|
|
36
|
+
* maxRetries: 3,
|
|
37
|
+
* onProgress: (p) => console.log(`${p.percentage.toFixed(1)}% complete`),
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* const result = await processor.process(
|
|
41
|
+
* ['item1', 'item2', 'item3'],
|
|
42
|
+
* async (item) => {
|
|
43
|
+
* const response = await fetchData(item);
|
|
44
|
+
* return response.value;
|
|
45
|
+
* }
|
|
46
|
+
* );
|
|
47
|
+
*
|
|
48
|
+
* console.log(`Succeeded: ${result.succeeded}, Failed: ${result.failed}`);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export class BatchProcessor {
|
|
52
|
+
options;
|
|
53
|
+
constructor(options = {}) {
|
|
54
|
+
this.options = {
|
|
55
|
+
...DEFAULT_OPTIONS,
|
|
56
|
+
...options,
|
|
57
|
+
batchSize: options.batchSize ?? options.concurrency ?? DEFAULT_OPTIONS.concurrency,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Process all items in batches with the specified processor function.
|
|
62
|
+
*
|
|
63
|
+
* @param items - Array of items to process
|
|
64
|
+
* @param processor - Async function to process each item
|
|
65
|
+
* @returns Batch processing result with all item results and statistics
|
|
66
|
+
*/
|
|
67
|
+
async process(items, processor) {
|
|
68
|
+
const startTime = Date.now();
|
|
69
|
+
const results = new Array(items.length);
|
|
70
|
+
const errors = new Map();
|
|
71
|
+
let succeeded = 0;
|
|
72
|
+
let failed = 0;
|
|
73
|
+
const totalBatches = Math.ceil(items.length / this.options.batchSize);
|
|
74
|
+
// Process items in batches
|
|
75
|
+
for (let batchIndex = 0; batchIndex < items.length; batchIndex += this.options.batchSize) {
|
|
76
|
+
// Check for cancellation
|
|
77
|
+
if (this.options.signal?.aborted) {
|
|
78
|
+
throw new Error('Batch processing cancelled');
|
|
79
|
+
}
|
|
80
|
+
const batchItems = items.slice(batchIndex, batchIndex + this.options.batchSize);
|
|
81
|
+
const batchStartIndex = batchIndex;
|
|
82
|
+
const currentBatchIndex = Math.floor(batchIndex / this.options.batchSize);
|
|
83
|
+
// Process batch concurrently
|
|
84
|
+
const batchPromises = batchItems.map((item, localIndex) => this.processItem(item, batchStartIndex + localIndex, processor));
|
|
85
|
+
const batchResults = await Promise.all(batchPromises);
|
|
86
|
+
// Collect results
|
|
87
|
+
for (let i = 0; i < batchResults.length; i++) {
|
|
88
|
+
const itemResult = batchResults[i];
|
|
89
|
+
const globalIndex = batchStartIndex + i;
|
|
90
|
+
results[globalIndex] = itemResult;
|
|
91
|
+
if (itemResult.success) {
|
|
92
|
+
succeeded++;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
failed++;
|
|
96
|
+
if (itemResult.error) {
|
|
97
|
+
errors.set(globalIndex, itemResult.error);
|
|
98
|
+
}
|
|
99
|
+
// Stop if continueOnError is false
|
|
100
|
+
if (!this.options.continueOnError) {
|
|
101
|
+
return {
|
|
102
|
+
results,
|
|
103
|
+
succeeded,
|
|
104
|
+
failed,
|
|
105
|
+
totalTimeMs: Date.now() - startTime,
|
|
106
|
+
allSucceeded: false,
|
|
107
|
+
errors,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Report progress
|
|
113
|
+
if (this.options.onProgress) {
|
|
114
|
+
const completed = Math.min(batchIndex + batchItems.length, items.length);
|
|
115
|
+
this.options.onProgress({
|
|
116
|
+
completed,
|
|
117
|
+
total: items.length,
|
|
118
|
+
percentage: (completed / items.length) * 100,
|
|
119
|
+
succeeded,
|
|
120
|
+
failed,
|
|
121
|
+
batchIndex: currentBatchIndex,
|
|
122
|
+
totalBatches,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
results,
|
|
128
|
+
succeeded,
|
|
129
|
+
failed,
|
|
130
|
+
totalTimeMs: Date.now() - startTime,
|
|
131
|
+
allSucceeded: failed === 0,
|
|
132
|
+
errors,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Process a single item with retry logic.
|
|
137
|
+
*/
|
|
138
|
+
async processItem(item, index, processor) {
|
|
139
|
+
const startTime = Date.now();
|
|
140
|
+
let lastError;
|
|
141
|
+
let attempts = 0;
|
|
142
|
+
for (let attempt = 0; attempt <= this.options.maxRetries; attempt++) {
|
|
143
|
+
attempts = attempt + 1;
|
|
144
|
+
// Check for cancellation before each attempt
|
|
145
|
+
if (this.options.signal?.aborted) {
|
|
146
|
+
return {
|
|
147
|
+
index,
|
|
148
|
+
success: false,
|
|
149
|
+
error: new Error('Processing cancelled'),
|
|
150
|
+
attempts,
|
|
151
|
+
durationMs: Date.now() - startTime,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
let result;
|
|
156
|
+
if (this.options.itemTimeoutMs > 0) {
|
|
157
|
+
// Process with timeout
|
|
158
|
+
result = await Promise.race([
|
|
159
|
+
processor(item, index),
|
|
160
|
+
this.createTimeout(this.options.itemTimeoutMs),
|
|
161
|
+
]);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
result = await processor(item, index);
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
index,
|
|
168
|
+
success: true,
|
|
169
|
+
result,
|
|
170
|
+
attempts,
|
|
171
|
+
durationMs: Date.now() - startTime,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
176
|
+
// Don't retry on last attempt
|
|
177
|
+
if (attempt < this.options.maxRetries) {
|
|
178
|
+
const delay = this.calculateRetryDelay(attempt);
|
|
179
|
+
await this.sleep(delay);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
index,
|
|
185
|
+
success: false,
|
|
186
|
+
error: lastError,
|
|
187
|
+
attempts,
|
|
188
|
+
durationMs: Date.now() - startTime,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Calculate delay for retry with exponential backoff.
|
|
193
|
+
*/
|
|
194
|
+
calculateRetryDelay(attempt) {
|
|
195
|
+
const delay = this.options.retryDelayMs * Math.pow(this.options.retryBackoffMultiplier, attempt);
|
|
196
|
+
return Math.min(delay, this.options.maxRetryDelayMs);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Create a timeout promise.
|
|
200
|
+
*/
|
|
201
|
+
createTimeout(ms) {
|
|
202
|
+
return new Promise((_, reject) => {
|
|
203
|
+
setTimeout(() => reject(new Error('Item processing timeout')), ms);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Sleep for the specified duration.
|
|
208
|
+
*/
|
|
209
|
+
sleep(ms) {
|
|
210
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get the configured options.
|
|
214
|
+
*/
|
|
215
|
+
getOptions() {
|
|
216
|
+
return { ...this.options };
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Process items in parallel batches (convenience function).
|
|
221
|
+
*
|
|
222
|
+
* @template TInput - Input item type
|
|
223
|
+
* @template TOutput - Output result type
|
|
224
|
+
* @param items - Array of items to process
|
|
225
|
+
* @param processor - Async function to process each item
|
|
226
|
+
* @param options - Batch processing options
|
|
227
|
+
* @returns Batch processing result
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* const result = await processBatch(
|
|
232
|
+
* urls,
|
|
233
|
+
* async (url) => fetch(url).then(r => r.json()),
|
|
234
|
+
* { concurrency: 5, maxRetries: 2 }
|
|
235
|
+
* );
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
export async function processBatch(items, processor, options = {}) {
|
|
239
|
+
const batchProcessor = new BatchProcessor(options);
|
|
240
|
+
return batchProcessor.process(items, processor);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Process items with automatic retry on failure (convenience function).
|
|
244
|
+
*
|
|
245
|
+
* @template TInput - Input item type
|
|
246
|
+
* @template TOutput - Output result type
|
|
247
|
+
* @param items - Array of items to process
|
|
248
|
+
* @param processor - Async function to process each item
|
|
249
|
+
* @param maxRetries - Maximum retry attempts (default: 3)
|
|
250
|
+
* @param onProgress - Optional progress callback
|
|
251
|
+
* @returns Batch processing result
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* ```typescript
|
|
255
|
+
* const result = await processWithRetry(
|
|
256
|
+
* items,
|
|
257
|
+
* async (item) => unreliableOperation(item),
|
|
258
|
+
* 3,
|
|
259
|
+
* (p) => console.log(`${p.percentage}%`)
|
|
260
|
+
* );
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
export async function processWithRetry(items, processor, maxRetries = 3, onProgress) {
|
|
264
|
+
return processBatch(items, processor, { maxRetries, onProgress });
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Chunk an array into smaller arrays of specified size.
|
|
268
|
+
*
|
|
269
|
+
* @template T - Item type
|
|
270
|
+
* @param array - Array to chunk
|
|
271
|
+
* @param size - Size of each chunk
|
|
272
|
+
* @returns Array of chunks
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* const chunks = chunkArray([1, 2, 3, 4, 5], 2);
|
|
277
|
+
* // [[1, 2], [3, 4], [5]]
|
|
278
|
+
* ```
|
|
279
|
+
*/
|
|
280
|
+
export function chunkArray(array, size) {
|
|
281
|
+
if (size <= 0) {
|
|
282
|
+
throw new Error('Chunk size must be greater than 0');
|
|
283
|
+
}
|
|
284
|
+
const chunks = [];
|
|
285
|
+
for (let i = 0; i < array.length; i += size) {
|
|
286
|
+
chunks.push(array.slice(i, i + size));
|
|
287
|
+
}
|
|
288
|
+
return chunks;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Execute async functions in parallel with a concurrency limit.
|
|
292
|
+
*
|
|
293
|
+
* @template T - Result type
|
|
294
|
+
* @param tasks - Array of async functions to execute
|
|
295
|
+
* @param concurrency - Maximum concurrent executions
|
|
296
|
+
* @returns Array of results (successful results or errors)
|
|
297
|
+
*
|
|
298
|
+
* @example
|
|
299
|
+
* ```typescript
|
|
300
|
+
* const tasks = urls.map(url => () => fetch(url));
|
|
301
|
+
* const results = await parallelLimit(tasks, 5);
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
export async function parallelLimit(tasks, concurrency) {
|
|
305
|
+
const results = [];
|
|
306
|
+
for (let i = 0; i < tasks.length; i += concurrency) {
|
|
307
|
+
const batch = tasks.slice(i, i + concurrency);
|
|
308
|
+
const batchResults = await Promise.all(batch.map(async (task) => {
|
|
309
|
+
try {
|
|
310
|
+
const value = await task();
|
|
311
|
+
return { success: true, value };
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
return {
|
|
315
|
+
success: false,
|
|
316
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}));
|
|
320
|
+
results.push(...batchResults);
|
|
321
|
+
}
|
|
322
|
+
return results;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Map over items in parallel with a concurrency limit.
|
|
326
|
+
*
|
|
327
|
+
* @template TInput - Input item type
|
|
328
|
+
* @template TOutput - Output result type
|
|
329
|
+
* @param items - Array of items to map
|
|
330
|
+
* @param mapper - Async mapping function
|
|
331
|
+
* @param concurrency - Maximum concurrent operations (default: 4)
|
|
332
|
+
* @returns Array of results (in order)
|
|
333
|
+
*
|
|
334
|
+
* @example
|
|
335
|
+
* ```typescript
|
|
336
|
+
* const results = await mapParallel(
|
|
337
|
+
* ids,
|
|
338
|
+
* async (id) => fetchUser(id),
|
|
339
|
+
* 10
|
|
340
|
+
* );
|
|
341
|
+
* ```
|
|
342
|
+
*/
|
|
343
|
+
export async function mapParallel(items, mapper, concurrency = 4) {
|
|
344
|
+
const results = new Array(items.length);
|
|
345
|
+
for (let i = 0; i < items.length; i += concurrency) {
|
|
346
|
+
const batch = items.slice(i, i + concurrency);
|
|
347
|
+
const startIndex = i;
|
|
348
|
+
const batchResults = await Promise.all(batch.map((item, localIndex) => mapper(item, startIndex + localIndex)));
|
|
349
|
+
for (let j = 0; j < batchResults.length; j++) {
|
|
350
|
+
results[startIndex + j] = batchResults[j];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return results;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Filter items in parallel with a concurrency limit.
|
|
357
|
+
*
|
|
358
|
+
* @template T - Item type
|
|
359
|
+
* @param items - Array of items to filter
|
|
360
|
+
* @param predicate - Async predicate function
|
|
361
|
+
* @param concurrency - Maximum concurrent operations (default: 4)
|
|
362
|
+
* @returns Filtered array (in order)
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
* ```typescript
|
|
366
|
+
* const validItems = await filterParallel(
|
|
367
|
+
* items,
|
|
368
|
+
* async (item) => validateItem(item),
|
|
369
|
+
* 10
|
|
370
|
+
* );
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
export async function filterParallel(items, predicate, concurrency = 4) {
|
|
374
|
+
const includeFlags = await mapParallel(items, predicate, concurrency);
|
|
375
|
+
return items.filter((_, index) => includeFlags[index]);
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=BatchProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchProcessor.js","sourceRoot":"","sources":["../../src/utils/BatchProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Usage Monitor
|
|
3
|
+
*
|
|
4
|
+
* Phase 12 Sprint 6: Track memory usage across all components
|
|
5
|
+
* with human-readable formatting.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/MemoryMonitor
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Memory usage for a single component.
|
|
11
|
+
*/
|
|
12
|
+
export interface ComponentMemoryUsage {
|
|
13
|
+
/** Component name */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Estimated memory usage in bytes */
|
|
16
|
+
bytes: number;
|
|
17
|
+
/** Item count (if applicable) */
|
|
18
|
+
itemCount?: number;
|
|
19
|
+
/** Average bytes per item */
|
|
20
|
+
bytesPerItem?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Aggregate memory usage statistics.
|
|
24
|
+
*/
|
|
25
|
+
export interface MemoryUsageStats {
|
|
26
|
+
/** Total memory usage in bytes */
|
|
27
|
+
totalBytes: number;
|
|
28
|
+
/** Formatted total memory */
|
|
29
|
+
totalFormatted: string;
|
|
30
|
+
/** Per-component breakdown */
|
|
31
|
+
components: ComponentMemoryUsage[];
|
|
32
|
+
/** Timestamp of measurement */
|
|
33
|
+
timestamp: Date;
|
|
34
|
+
/** Node.js heap stats (if available) */
|
|
35
|
+
heapStats?: {
|
|
36
|
+
heapUsed: number;
|
|
37
|
+
heapTotal: number;
|
|
38
|
+
external: number;
|
|
39
|
+
rss: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Memory threshold configuration.
|
|
44
|
+
*/
|
|
45
|
+
export interface MemoryThresholds {
|
|
46
|
+
/** Warning threshold in bytes */
|
|
47
|
+
warning: number;
|
|
48
|
+
/** Critical threshold in bytes */
|
|
49
|
+
critical: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Memory alert.
|
|
53
|
+
*/
|
|
54
|
+
export interface MemoryAlert {
|
|
55
|
+
/** Alert level */
|
|
56
|
+
level: 'warning' | 'critical';
|
|
57
|
+
/** Component that triggered the alert */
|
|
58
|
+
component: string;
|
|
59
|
+
/** Current usage */
|
|
60
|
+
currentBytes: number;
|
|
61
|
+
/** Threshold exceeded */
|
|
62
|
+
threshold: number;
|
|
63
|
+
/** Message */
|
|
64
|
+
message: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Callback for memory change events.
|
|
68
|
+
*/
|
|
69
|
+
export type MemoryChangeCallback = (usage: MemoryUsageStats) => void;
|
|
70
|
+
/**
|
|
71
|
+
* Memory Monitor for tracking usage across components.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* const monitor = new MemoryMonitor();
|
|
76
|
+
*
|
|
77
|
+
* // Register components
|
|
78
|
+
* monitor.registerComponent('entities', () => entities.length * 500);
|
|
79
|
+
* monitor.registerComponent('vectors', () => vectors.size * dimension * 4);
|
|
80
|
+
*
|
|
81
|
+
* // Get usage stats
|
|
82
|
+
* const stats = monitor.getUsage();
|
|
83
|
+
* console.log(`Total memory: ${stats.totalFormatted}`);
|
|
84
|
+
*
|
|
85
|
+
* // Check for alerts
|
|
86
|
+
* const alerts = monitor.checkThresholds();
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export declare class MemoryMonitor {
|
|
90
|
+
private componentEstimators;
|
|
91
|
+
private itemCounters;
|
|
92
|
+
private thresholds;
|
|
93
|
+
private listeners;
|
|
94
|
+
private lastUsage;
|
|
95
|
+
constructor(thresholds?: Partial<MemoryThresholds>);
|
|
96
|
+
/**
|
|
97
|
+
* Register a component for memory tracking.
|
|
98
|
+
*
|
|
99
|
+
* @param name - Component name
|
|
100
|
+
* @param estimator - Function that returns estimated bytes
|
|
101
|
+
* @param itemCounter - Optional function that returns item count
|
|
102
|
+
*/
|
|
103
|
+
registerComponent(name: string, estimator: () => number, itemCounter?: () => number): void;
|
|
104
|
+
/**
|
|
105
|
+
* Unregister a component.
|
|
106
|
+
*
|
|
107
|
+
* @param name - Component name
|
|
108
|
+
*/
|
|
109
|
+
unregisterComponent(name: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Get current memory usage statistics.
|
|
112
|
+
*/
|
|
113
|
+
getUsage(): MemoryUsageStats;
|
|
114
|
+
/**
|
|
115
|
+
* Get memory usage for a specific component.
|
|
116
|
+
*
|
|
117
|
+
* @param name - Component name
|
|
118
|
+
*/
|
|
119
|
+
getComponentUsage(name: string): ComponentMemoryUsage | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* Check memory thresholds and return alerts.
|
|
122
|
+
*/
|
|
123
|
+
checkThresholds(): MemoryAlert[];
|
|
124
|
+
/**
|
|
125
|
+
* Set memory thresholds.
|
|
126
|
+
*
|
|
127
|
+
* @param thresholds - New threshold values
|
|
128
|
+
*/
|
|
129
|
+
setThresholds(thresholds: Partial<MemoryThresholds>): void;
|
|
130
|
+
/**
|
|
131
|
+
* Get current thresholds.
|
|
132
|
+
*/
|
|
133
|
+
getThresholds(): MemoryThresholds;
|
|
134
|
+
/**
|
|
135
|
+
* Add a listener for memory changes.
|
|
136
|
+
*
|
|
137
|
+
* @param callback - Callback to invoke on memory changes
|
|
138
|
+
*/
|
|
139
|
+
addListener(callback: MemoryChangeCallback): void;
|
|
140
|
+
/**
|
|
141
|
+
* Remove a listener.
|
|
142
|
+
*
|
|
143
|
+
* @param callback - Callback to remove
|
|
144
|
+
*/
|
|
145
|
+
removeListener(callback: MemoryChangeCallback): void;
|
|
146
|
+
/**
|
|
147
|
+
* Get a human-readable summary of memory usage.
|
|
148
|
+
*/
|
|
149
|
+
getSummary(): string;
|
|
150
|
+
/**
|
|
151
|
+
* Get the last recorded usage without triggering a new measurement.
|
|
152
|
+
*/
|
|
153
|
+
getLastUsage(): MemoryUsageStats | null;
|
|
154
|
+
/**
|
|
155
|
+
* Format bytes as human-readable string.
|
|
156
|
+
*
|
|
157
|
+
* @param bytes - Number of bytes
|
|
158
|
+
*/
|
|
159
|
+
formatBytes(bytes: number): string;
|
|
160
|
+
/**
|
|
161
|
+
* Parse a formatted byte string back to number.
|
|
162
|
+
*
|
|
163
|
+
* @param formatted - Formatted string like "10 MB"
|
|
164
|
+
*/
|
|
165
|
+
parseBytes(formatted: string): number;
|
|
166
|
+
/**
|
|
167
|
+
* Clear all registered components.
|
|
168
|
+
*/
|
|
169
|
+
clear(): void;
|
|
170
|
+
private notifyListeners;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Singleton instance for global memory monitoring.
|
|
174
|
+
*/
|
|
175
|
+
export declare const globalMemoryMonitor: MemoryMonitor;
|
|
176
|
+
//# sourceMappingURL=MemoryMonitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryMonitor.d.ts","sourceRoot":"","sources":["../../src/utils/MemoryMonitor.ts"],"names":[],"mappings":"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"}
|