@cmdoss/memwal-sdk 0.6.2 → 0.8.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/ARCHITECTURE.md +547 -547
- package/BENCHMARKS.md +238 -238
- package/README.md +310 -181
- package/dist/ai-sdk/tools.d.ts +2 -2
- package/dist/ai-sdk/tools.js +2 -2
- package/dist/client/ClientMemoryManager.js +2 -2
- package/dist/client/ClientMemoryManager.js.map +1 -1
- package/dist/client/PersonalDataWallet.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.d.ts +29 -1
- package/dist/client/SimplePDWClient.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.js +45 -13
- package/dist/client/SimplePDWClient.js.map +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
- package/dist/client/namespaces/MemoryNamespace.d.ts +31 -0
- package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/MemoryNamespace.js +272 -39
- package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
- package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts +12 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js +62 -4
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts +67 -2
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.js +549 -16
- package/dist/client/namespaces/consolidated/StorageNamespace.js.map +1 -1
- package/dist/config/ConfigurationHelper.js +61 -61
- package/dist/config/defaults.js +2 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/graph/GraphService.js +21 -21
- package/dist/graph/GraphService.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
- package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.js +37 -15
- package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
- package/dist/infrastructure/seal/SealService.d.ts +13 -5
- package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
- package/dist/infrastructure/seal/SealService.js +36 -34
- package/dist/infrastructure/seal/SealService.js.map +1 -1
- package/dist/langchain/createPDWRAG.js +30 -30
- package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
- package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.js +44 -4
- package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
- package/dist/services/CapabilityService.d.ts.map +1 -1
- package/dist/services/CapabilityService.js +30 -14
- package/dist/services/CapabilityService.js.map +1 -1
- package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
- package/dist/services/CrossContextPermissionService.js +9 -7
- package/dist/services/CrossContextPermissionService.js.map +1 -1
- package/dist/services/EmbeddingService.d.ts +28 -1
- package/dist/services/EmbeddingService.d.ts.map +1 -1
- package/dist/services/EmbeddingService.js +54 -0
- package/dist/services/EmbeddingService.js.map +1 -1
- package/dist/services/EncryptionService.d.ts.map +1 -1
- package/dist/services/EncryptionService.js +6 -5
- package/dist/services/EncryptionService.js.map +1 -1
- package/dist/services/GeminiAIService.js +309 -309
- package/dist/services/IndexManager.d.ts +5 -1
- package/dist/services/IndexManager.d.ts.map +1 -1
- package/dist/services/IndexManager.js +17 -40
- package/dist/services/IndexManager.js.map +1 -1
- package/dist/services/QueryService.js +1 -1
- package/dist/services/QueryService.js.map +1 -1
- package/dist/services/StorageService.d.ts +11 -0
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.js +73 -10
- package/dist/services/StorageService.js.map +1 -1
- package/dist/services/TransactionService.d.ts +20 -0
- package/dist/services/TransactionService.d.ts.map +1 -1
- package/dist/services/TransactionService.js +43 -0
- package/dist/services/TransactionService.js.map +1 -1
- package/dist/services/ViewService.js +2 -2
- package/dist/services/ViewService.js.map +1 -1
- package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
- package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
- package/dist/services/storage/QuiltBatchManager.js +410 -20
- package/dist/services/storage/QuiltBatchManager.js.map +1 -1
- package/dist/services/storage/index.d.ts +1 -1
- package/dist/services/storage/index.d.ts.map +1 -1
- package/dist/services/storage/index.js.map +1 -1
- package/dist/utils/LRUCache.d.ts +106 -0
- package/dist/utils/LRUCache.d.ts.map +1 -0
- package/dist/utils/LRUCache.js +281 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/memoryIndexOnChain.d.ts +212 -0
- package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
- package/dist/utils/memoryIndexOnChain.js +312 -0
- package/dist/utils/memoryIndexOnChain.js.map +1 -0
- package/dist/utils/rebuildIndexNode.d.ts +29 -0
- package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
- package/dist/utils/rebuildIndexNode.js +366 -98
- package/dist/utils/rebuildIndexNode.js.map +1 -1
- package/dist/vector/HnswWasmService.d.ts +20 -5
- package/dist/vector/HnswWasmService.d.ts.map +1 -1
- package/dist/vector/HnswWasmService.js +73 -40
- package/dist/vector/HnswWasmService.js.map +1 -1
- package/dist/vector/IHnswService.d.ts +10 -1
- package/dist/vector/IHnswService.d.ts.map +1 -1
- package/dist/vector/IHnswService.js.map +1 -1
- package/dist/vector/NodeHnswService.d.ts +16 -0
- package/dist/vector/NodeHnswService.d.ts.map +1 -1
- package/dist/vector/NodeHnswService.js +84 -5
- package/dist/vector/NodeHnswService.js.map +1 -1
- package/dist/vector/createHnswService.d.ts +1 -1
- package/dist/vector/createHnswService.js +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.js +1 -1
- package/package.json +157 -157
- package/src/access/PermissionService.ts +635 -635
- package/src/aggregation/AggregationService.ts +389 -389
- package/src/ai-sdk/PDWVectorStore.ts +715 -715
- package/src/ai-sdk/index.ts +65 -65
- package/src/ai-sdk/tools.ts +460 -460
- package/src/ai-sdk/types.ts +404 -404
- package/src/batch/BatchManager.ts +597 -597
- package/src/batch/BatchingService.ts +429 -429
- package/src/batch/MemoryProcessingCache.ts +492 -492
- package/src/batch/index.ts +30 -30
- package/src/browser.ts +200 -200
- package/src/client/ClientMemoryManager.ts +987 -987
- package/src/client/PersonalDataWallet.ts +345 -345
- package/src/client/SimplePDWClient.ts +1289 -1222
- package/src/client/factory.ts +154 -154
- package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
- package/src/client/namespaces/BatchNamespace.ts +356 -356
- package/src/client/namespaces/CacheNamespace.ts +123 -123
- package/src/client/namespaces/CapabilityNamespace.ts +217 -217
- package/src/client/namespaces/ClassifyNamespace.ts +169 -169
- package/src/client/namespaces/ContextNamespace.ts +297 -297
- package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
- package/src/client/namespaces/EncryptionNamespace.ts +221 -221
- package/src/client/namespaces/GraphNamespace.ts +468 -468
- package/src/client/namespaces/IndexNamespace.ts +361 -361
- package/src/client/namespaces/MemoryNamespace.ts +1422 -1135
- package/src/client/namespaces/PermissionsNamespace.ts +254 -254
- package/src/client/namespaces/PipelineNamespace.ts +220 -220
- package/src/client/namespaces/SearchNamespace.ts +1049 -1049
- package/src/client/namespaces/StorageNamespace.ts +458 -458
- package/src/client/namespaces/TxNamespace.ts +260 -260
- package/src/client/namespaces/WalletNamespace.ts +243 -243
- package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
- package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -546
- package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
- package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
- package/src/client/namespaces/consolidated/index.ts +39 -39
- package/src/client/signers/KeypairSigner.ts +108 -108
- package/src/client/signers/UnifiedSigner.ts +110 -110
- package/src/client/signers/WalletAdapterSigner.ts +159 -159
- package/src/client/signers/index.ts +26 -26
- package/src/config/ConfigurationHelper.ts +412 -412
- package/src/config/defaults.ts +51 -51
- package/src/config/index.ts +8 -8
- package/src/config/validation.ts +70 -70
- package/src/core/index.ts +14 -14
- package/src/core/interfaces/IService.ts +307 -307
- package/src/core/interfaces/index.ts +8 -8
- package/src/core/types/capability.ts +297 -297
- package/src/core/types/index.ts +870 -870
- package/src/core/types/wallet.ts +270 -270
- package/src/core/types.ts +9 -9
- package/src/core/wallet.ts +222 -222
- package/src/embedding/index.ts +19 -19
- package/src/embedding/types.ts +357 -357
- package/src/errors/index.ts +602 -602
- package/src/errors/recovery.ts +461 -461
- package/src/errors/validation.ts +567 -567
- package/src/generated/pdw/capability.ts +319 -319
- package/src/graph/GraphService.ts +887 -887
- package/src/graph/KnowledgeGraphManager.ts +728 -728
- package/src/graph/index.ts +25 -25
- package/src/index.ts +498 -474
- package/src/infrastructure/index.ts +22 -22
- package/src/infrastructure/seal/EncryptionService.ts +628 -603
- package/src/infrastructure/seal/SealService.ts +613 -615
- package/src/infrastructure/seal/index.ts +9 -9
- package/src/infrastructure/sui/BlockchainManager.ts +627 -627
- package/src/infrastructure/sui/SuiService.ts +888 -888
- package/src/infrastructure/sui/index.ts +9 -9
- package/src/infrastructure/walrus/StorageManager.ts +604 -604
- package/src/infrastructure/walrus/WalrusStorageService.ts +612 -612
- package/src/infrastructure/walrus/index.ts +9 -9
- package/src/langchain/PDWEmbeddings.ts +145 -145
- package/src/langchain/PDWVectorStore.ts +456 -456
- package/src/langchain/createPDWRAG.ts +303 -303
- package/src/langchain/index.ts +47 -47
- package/src/permissions/ConsentRepository.browser.ts +249 -249
- package/src/permissions/ConsentRepository.ts +364 -364
- package/src/pipeline/MemoryPipeline.ts +862 -862
- package/src/pipeline/PipelineManager.ts +683 -683
- package/src/pipeline/index.ts +26 -26
- package/src/retrieval/AdvancedSearchService.ts +629 -629
- package/src/retrieval/MemoryAnalyticsService.ts +711 -711
- package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
- package/src/retrieval/MemoryRetrievalService.ts +904 -830
- package/src/retrieval/index.ts +42 -42
- package/src/services/BatchService.ts +352 -352
- package/src/services/CapabilityService.ts +464 -448
- package/src/services/ClassifierService.ts +465 -465
- package/src/services/CrossContextPermissionService.ts +486 -484
- package/src/services/EmbeddingService.ts +771 -706
- package/src/services/EncryptionService.ts +712 -711
- package/src/services/GeminiAIService.ts +753 -753
- package/src/services/IndexManager.ts +977 -1004
- package/src/services/MemoryIndexService.ts +1003 -1003
- package/src/services/MemoryService.ts +369 -369
- package/src/services/QueryService.ts +890 -890
- package/src/services/StorageService.ts +1182 -1111
- package/src/services/TransactionService.ts +838 -790
- package/src/services/VectorService.ts +462 -462
- package/src/services/ViewService.ts +484 -484
- package/src/services/index.ts +25 -25
- package/src/services/storage/BlobAttributesManager.ts +333 -333
- package/src/services/storage/KnowledgeGraphManager.ts +425 -425
- package/src/services/storage/MemorySearchManager.ts +387 -387
- package/src/services/storage/QuiltBatchManager.ts +1130 -660
- package/src/services/storage/WalrusMetadataManager.ts +268 -268
- package/src/services/storage/WalrusStorageManager.ts +287 -287
- package/src/services/storage/index.ts +57 -52
- package/src/types/index.ts +13 -13
- package/src/utils/LRUCache.ts +378 -0
- package/src/utils/index.ts +76 -68
- package/src/utils/memoryIndexOnChain.ts +507 -0
- package/src/utils/rebuildIndex.ts +290 -290
- package/src/utils/rebuildIndexNode.ts +771 -424
- package/src/vector/BrowserHnswIndexService.ts +758 -758
- package/src/vector/HnswWasmService.ts +731 -679
- package/src/vector/IHnswService.ts +233 -224
- package/src/vector/NodeHnswService.ts +833 -735
- package/src/vector/VectorManager.ts +478 -478
- package/src/vector/createHnswService.ts +135 -135
- package/src/vector/index.ts +56 -56
- package/src/wallet/ContextWalletService.ts +656 -656
- package/src/wallet/MainWalletService.ts +317 -317
|
@@ -1,353 +1,353 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BatchService - Unified Batch Processing & Caching
|
|
3
|
-
*
|
|
4
|
-
* Consolidated service combining intelligent batch processing, caching,
|
|
5
|
-
* and coordination for all PDW SDK operations.
|
|
6
|
-
*
|
|
7
|
-
* Replaces: BatchingService + BatchManager
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import EventEmitter from 'eventemitter3';
|
|
11
|
-
import type { BatchConfig, BatchStats } from '../core';
|
|
12
|
-
|
|
13
|
-
export interface BatchItem<T = any> {
|
|
14
|
-
id: string;
|
|
15
|
-
data: T;
|
|
16
|
-
timestamp: Date;
|
|
17
|
-
priority?: number;
|
|
18
|
-
metadata?: any;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface BatchProcessor<T = any> {
|
|
22
|
-
process(items: BatchItem<T>[]): Promise<void>;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface CacheConfig {
|
|
26
|
-
maxSize?: number;
|
|
27
|
-
ttlMs?: number;
|
|
28
|
-
cleanupIntervalMs?: number;
|
|
29
|
-
enableMetrics?: boolean;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface CacheItem<T = any> {
|
|
33
|
-
key: string;
|
|
34
|
-
value: T;
|
|
35
|
-
timestamp: Date;
|
|
36
|
-
expiresAt?: Date;
|
|
37
|
-
accessCount: number;
|
|
38
|
-
lastAccessed: Date;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface BatchServiceConfig {
|
|
42
|
-
embedding?: {
|
|
43
|
-
batchSize?: number;
|
|
44
|
-
delayMs?: number;
|
|
45
|
-
};
|
|
46
|
-
indexing?: {
|
|
47
|
-
batchSize?: number;
|
|
48
|
-
delayMs?: number;
|
|
49
|
-
};
|
|
50
|
-
storage?: {
|
|
51
|
-
batchSize?: number;
|
|
52
|
-
delayMs?: number;
|
|
53
|
-
};
|
|
54
|
-
cache?: CacheConfig;
|
|
55
|
-
enableMetrics?: boolean;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* BatchService provides unified batch processing including:
|
|
60
|
-
* - Intelligent batching with configurable delays and sizes
|
|
61
|
-
* - LRU cache with TTL support
|
|
62
|
-
* - Event-driven batch coordination
|
|
63
|
-
* - Performance metrics and monitoring
|
|
64
|
-
*/
|
|
65
|
-
export class BatchService extends EventEmitter {
|
|
66
|
-
private queues: Map<string, BatchItem[]> = new Map();
|
|
67
|
-
private processors: Map<string, BatchProcessor> = new Map();
|
|
68
|
-
private timers: Map<string, NodeJS.Timeout> = new Map();
|
|
69
|
-
private cache: Map<string, CacheItem> = new Map();
|
|
70
|
-
private stats: Map<string, BatchStats> = new Map();
|
|
71
|
-
|
|
72
|
-
constructor(private config: BatchServiceConfig = {}) {
|
|
73
|
-
super();
|
|
74
|
-
this.setupCleanupTimer();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Register a batch processor for a specific operation type
|
|
79
|
-
*/
|
|
80
|
-
registerProcessor<T>(type: string, processor: BatchProcessor<T>): void {
|
|
81
|
-
this.processors.set(type, processor);
|
|
82
|
-
this.queues.set(type, []);
|
|
83
|
-
this.stats.set(type, {
|
|
84
|
-
totalBatches: 0,
|
|
85
|
-
totalItems: 0,
|
|
86
|
-
averageBatchSize: 0,
|
|
87
|
-
totalProcessingTime: 0,
|
|
88
|
-
averageProcessingTime: 0,
|
|
89
|
-
successCount: 0,
|
|
90
|
-
errorCount: 0,
|
|
91
|
-
lastProcessed: new Date(),
|
|
92
|
-
pendingBatches: 0,
|
|
93
|
-
processedToday: 0
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Add item to batch queue
|
|
99
|
-
*/
|
|
100
|
-
async addToBatch<T>(type: string, item: BatchItem<T>): Promise<void> {
|
|
101
|
-
const queue = this.queues.get(type);
|
|
102
|
-
const processor = this.processors.get(type);
|
|
103
|
-
|
|
104
|
-
if (!queue || !processor) {
|
|
105
|
-
throw new Error(`No processor registered for type: ${type}`);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
queue.push(item);
|
|
109
|
-
this.emit('itemAdded', { type, item, queueSize: queue.length });
|
|
110
|
-
|
|
111
|
-
// Check if we should process immediately
|
|
112
|
-
const config = this.getBatchConfig(type);
|
|
113
|
-
if (queue.length >= config.batchSize) {
|
|
114
|
-
await this.processBatch(type);
|
|
115
|
-
} else {
|
|
116
|
-
this.scheduleProcessing(type, config.delayMs);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Process batch immediately
|
|
122
|
-
*/
|
|
123
|
-
async processBatch(type: string): Promise<void> {
|
|
124
|
-
const queue = this.queues.get(type);
|
|
125
|
-
const processor = this.processors.get(type);
|
|
126
|
-
const stats = this.stats.get(type);
|
|
127
|
-
|
|
128
|
-
if (!queue || !processor || !stats || queue.length === 0) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Clear any pending timer
|
|
133
|
-
const timer = this.timers.get(type);
|
|
134
|
-
if (timer) {
|
|
135
|
-
clearTimeout(timer);
|
|
136
|
-
this.timers.delete(type);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Take items from queue
|
|
140
|
-
const items = queue.splice(0);
|
|
141
|
-
const startTime = Date.now();
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
await processor.process(items);
|
|
145
|
-
|
|
146
|
-
// Update stats
|
|
147
|
-
stats.totalBatches++;
|
|
148
|
-
stats.totalItems += items.length;
|
|
149
|
-
stats.successCount += items.length;
|
|
150
|
-
stats.averageBatchSize = stats.totalItems / stats.totalBatches;
|
|
151
|
-
|
|
152
|
-
const processingTime = Date.now() - startTime;
|
|
153
|
-
stats.totalProcessingTime += processingTime;
|
|
154
|
-
stats.averageProcessingTime = stats.totalProcessingTime / stats.totalBatches;
|
|
155
|
-
stats.lastProcessed = new Date();
|
|
156
|
-
|
|
157
|
-
this.emit('batchProcessed', {
|
|
158
|
-
type,
|
|
159
|
-
itemCount: items.length,
|
|
160
|
-
processingTime,
|
|
161
|
-
success: true
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
} catch (error) {
|
|
165
|
-
// Update error stats
|
|
166
|
-
stats.errorCount += items.length;
|
|
167
|
-
|
|
168
|
-
this.emit('batchError', {
|
|
169
|
-
type,
|
|
170
|
-
itemCount: items.length,
|
|
171
|
-
error,
|
|
172
|
-
success: false
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
throw error;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Cache operations
|
|
181
|
-
*/
|
|
182
|
-
setCache<T>(key: string, value: T, ttlMs?: number): void {
|
|
183
|
-
const now = new Date();
|
|
184
|
-
const item: CacheItem<T> = {
|
|
185
|
-
key,
|
|
186
|
-
value,
|
|
187
|
-
timestamp: now,
|
|
188
|
-
expiresAt: ttlMs ? new Date(now.getTime() + ttlMs) : undefined,
|
|
189
|
-
accessCount: 0,
|
|
190
|
-
lastAccessed: now
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
this.cache.set(key, item);
|
|
194
|
-
this.enforceMaxCacheSize();
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
getCache<T>(key: string): T | null {
|
|
198
|
-
const item = this.cache.get(key) as CacheItem<T> | undefined;
|
|
199
|
-
|
|
200
|
-
if (!item) {
|
|
201
|
-
return null;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Check expiration
|
|
205
|
-
if (item.expiresAt && item.expiresAt < new Date()) {
|
|
206
|
-
this.cache.delete(key);
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Update access stats
|
|
211
|
-
item.accessCount++;
|
|
212
|
-
item.lastAccessed = new Date();
|
|
213
|
-
|
|
214
|
-
return item.value;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
hasCache(key: string): boolean {
|
|
218
|
-
return this.getCache(key) !== null;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
deleteCache(key: string): boolean {
|
|
222
|
-
return this.cache.delete(key);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
clearCache(): void {
|
|
226
|
-
this.cache.clear();
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Get batch statistics
|
|
231
|
-
*/
|
|
232
|
-
getStats(type?: string): BatchStats | Map<string, BatchStats> {
|
|
233
|
-
if (type) {
|
|
234
|
-
return this.stats.get(type) || {
|
|
235
|
-
totalBatches: 0,
|
|
236
|
-
totalItems: 0,
|
|
237
|
-
averageBatchSize: 0,
|
|
238
|
-
totalProcessingTime: 0,
|
|
239
|
-
averageProcessingTime: 0,
|
|
240
|
-
successCount: 0,
|
|
241
|
-
errorCount: 0,
|
|
242
|
-
lastProcessed: new Date(),
|
|
243
|
-
pendingBatches: 0,
|
|
244
|
-
processedToday: 0
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
return new Map(this.stats);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Get cache statistics
|
|
252
|
-
*/
|
|
253
|
-
getCacheStats(): {
|
|
254
|
-
size: number;
|
|
255
|
-
totalAccess: number;
|
|
256
|
-
hitRate: number;
|
|
257
|
-
oldestItem?: Date;
|
|
258
|
-
newestItem?: Date;
|
|
259
|
-
} {
|
|
260
|
-
const items = Array.from(this.cache.values());
|
|
261
|
-
const totalAccess = items.reduce((sum, item) => sum + item.accessCount, 0);
|
|
262
|
-
|
|
263
|
-
return {
|
|
264
|
-
size: this.cache.size,
|
|
265
|
-
totalAccess,
|
|
266
|
-
hitRate: totalAccess > 0 ? totalAccess / (totalAccess + 1) : 0, // Simplified calculation
|
|
267
|
-
oldestItem: items.length > 0 ? new Date(Math.min(...items.map(i => i.timestamp.getTime()))) : undefined,
|
|
268
|
-
newestItem: items.length > 0 ? new Date(Math.max(...items.map(i => i.timestamp.getTime()))) : undefined
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Clean up resources
|
|
274
|
-
*/
|
|
275
|
-
async cleanup(): Promise<void> {
|
|
276
|
-
// Process remaining items
|
|
277
|
-
for (const type of this.queues.keys()) {
|
|
278
|
-
await this.processBatch(type);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Clear timers
|
|
282
|
-
for (const timer of this.timers.values()) {
|
|
283
|
-
clearTimeout(timer);
|
|
284
|
-
}
|
|
285
|
-
this.timers.clear();
|
|
286
|
-
|
|
287
|
-
// Clear cache
|
|
288
|
-
this.clearCache();
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Private helper methods
|
|
292
|
-
private getBatchConfig(type: string) {
|
|
293
|
-
const defaults = { batchSize: 10, delayMs: 1000 };
|
|
294
|
-
|
|
295
|
-
switch (type) {
|
|
296
|
-
case 'embedding':
|
|
297
|
-
return { ...defaults, ...this.config.embedding };
|
|
298
|
-
case 'indexing':
|
|
299
|
-
return { ...defaults, ...this.config.indexing };
|
|
300
|
-
case 'storage':
|
|
301
|
-
return { ...defaults, ...this.config.storage };
|
|
302
|
-
default:
|
|
303
|
-
return defaults;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
private scheduleProcessing(type: string, delayMs: number): void {
|
|
308
|
-
// Clear existing timer
|
|
309
|
-
const existingTimer = this.timers.get(type);
|
|
310
|
-
if (existingTimer) {
|
|
311
|
-
clearTimeout(existingTimer);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// Schedule new processing
|
|
315
|
-
const timer = setTimeout(() => {
|
|
316
|
-
this.processBatch(type).catch(error => {
|
|
317
|
-
this.emit('error', error);
|
|
318
|
-
});
|
|
319
|
-
}, delayMs);
|
|
320
|
-
|
|
321
|
-
this.timers.set(type, timer);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
private enforceMaxCacheSize(): void {
|
|
325
|
-
const maxSize = this.config.cache?.maxSize || 1000;
|
|
326
|
-
|
|
327
|
-
if (this.cache.size <= maxSize) {
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Remove oldest items (LRU)
|
|
332
|
-
const items = Array.from(this.cache.entries())
|
|
333
|
-
.sort(([, a], [, b]) => a.lastAccessed.getTime() - b.lastAccessed.getTime());
|
|
334
|
-
|
|
335
|
-
const itemsToRemove = items.slice(0, this.cache.size - maxSize);
|
|
336
|
-
for (const [key] of itemsToRemove) {
|
|
337
|
-
this.cache.delete(key);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
private setupCleanupTimer(): void {
|
|
342
|
-
const cleanupInterval = this.config.cache?.cleanupIntervalMs || 60000; // 1 minute
|
|
343
|
-
|
|
344
|
-
setInterval(() => {
|
|
345
|
-
const now = new Date();
|
|
346
|
-
for (const [key, item] of this.cache.entries()) {
|
|
347
|
-
if (item.expiresAt && item.expiresAt < now) {
|
|
348
|
-
this.cache.delete(key);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}, cleanupInterval);
|
|
352
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* BatchService - Unified Batch Processing & Caching
|
|
3
|
+
*
|
|
4
|
+
* Consolidated service combining intelligent batch processing, caching,
|
|
5
|
+
* and coordination for all PDW SDK operations.
|
|
6
|
+
*
|
|
7
|
+
* Replaces: BatchingService + BatchManager
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import EventEmitter from 'eventemitter3';
|
|
11
|
+
import type { BatchConfig, BatchStats } from '../core';
|
|
12
|
+
|
|
13
|
+
export interface BatchItem<T = any> {
|
|
14
|
+
id: string;
|
|
15
|
+
data: T;
|
|
16
|
+
timestamp: Date;
|
|
17
|
+
priority?: number;
|
|
18
|
+
metadata?: any;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface BatchProcessor<T = any> {
|
|
22
|
+
process(items: BatchItem<T>[]): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface CacheConfig {
|
|
26
|
+
maxSize?: number;
|
|
27
|
+
ttlMs?: number;
|
|
28
|
+
cleanupIntervalMs?: number;
|
|
29
|
+
enableMetrics?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface CacheItem<T = any> {
|
|
33
|
+
key: string;
|
|
34
|
+
value: T;
|
|
35
|
+
timestamp: Date;
|
|
36
|
+
expiresAt?: Date;
|
|
37
|
+
accessCount: number;
|
|
38
|
+
lastAccessed: Date;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface BatchServiceConfig {
|
|
42
|
+
embedding?: {
|
|
43
|
+
batchSize?: number;
|
|
44
|
+
delayMs?: number;
|
|
45
|
+
};
|
|
46
|
+
indexing?: {
|
|
47
|
+
batchSize?: number;
|
|
48
|
+
delayMs?: number;
|
|
49
|
+
};
|
|
50
|
+
storage?: {
|
|
51
|
+
batchSize?: number;
|
|
52
|
+
delayMs?: number;
|
|
53
|
+
};
|
|
54
|
+
cache?: CacheConfig;
|
|
55
|
+
enableMetrics?: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* BatchService provides unified batch processing including:
|
|
60
|
+
* - Intelligent batching with configurable delays and sizes
|
|
61
|
+
* - LRU cache with TTL support
|
|
62
|
+
* - Event-driven batch coordination
|
|
63
|
+
* - Performance metrics and monitoring
|
|
64
|
+
*/
|
|
65
|
+
export class BatchService extends EventEmitter {
|
|
66
|
+
private queues: Map<string, BatchItem[]> = new Map();
|
|
67
|
+
private processors: Map<string, BatchProcessor> = new Map();
|
|
68
|
+
private timers: Map<string, NodeJS.Timeout> = new Map();
|
|
69
|
+
private cache: Map<string, CacheItem> = new Map();
|
|
70
|
+
private stats: Map<string, BatchStats> = new Map();
|
|
71
|
+
|
|
72
|
+
constructor(private config: BatchServiceConfig = {}) {
|
|
73
|
+
super();
|
|
74
|
+
this.setupCleanupTimer();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Register a batch processor for a specific operation type
|
|
79
|
+
*/
|
|
80
|
+
registerProcessor<T>(type: string, processor: BatchProcessor<T>): void {
|
|
81
|
+
this.processors.set(type, processor);
|
|
82
|
+
this.queues.set(type, []);
|
|
83
|
+
this.stats.set(type, {
|
|
84
|
+
totalBatches: 0,
|
|
85
|
+
totalItems: 0,
|
|
86
|
+
averageBatchSize: 0,
|
|
87
|
+
totalProcessingTime: 0,
|
|
88
|
+
averageProcessingTime: 0,
|
|
89
|
+
successCount: 0,
|
|
90
|
+
errorCount: 0,
|
|
91
|
+
lastProcessed: new Date(),
|
|
92
|
+
pendingBatches: 0,
|
|
93
|
+
processedToday: 0
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Add item to batch queue
|
|
99
|
+
*/
|
|
100
|
+
async addToBatch<T>(type: string, item: BatchItem<T>): Promise<void> {
|
|
101
|
+
const queue = this.queues.get(type);
|
|
102
|
+
const processor = this.processors.get(type);
|
|
103
|
+
|
|
104
|
+
if (!queue || !processor) {
|
|
105
|
+
throw new Error(`No processor registered for type: ${type}`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
queue.push(item);
|
|
109
|
+
this.emit('itemAdded', { type, item, queueSize: queue.length });
|
|
110
|
+
|
|
111
|
+
// Check if we should process immediately
|
|
112
|
+
const config = this.getBatchConfig(type);
|
|
113
|
+
if (queue.length >= config.batchSize) {
|
|
114
|
+
await this.processBatch(type);
|
|
115
|
+
} else {
|
|
116
|
+
this.scheduleProcessing(type, config.delayMs);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Process batch immediately
|
|
122
|
+
*/
|
|
123
|
+
async processBatch(type: string): Promise<void> {
|
|
124
|
+
const queue = this.queues.get(type);
|
|
125
|
+
const processor = this.processors.get(type);
|
|
126
|
+
const stats = this.stats.get(type);
|
|
127
|
+
|
|
128
|
+
if (!queue || !processor || !stats || queue.length === 0) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Clear any pending timer
|
|
133
|
+
const timer = this.timers.get(type);
|
|
134
|
+
if (timer) {
|
|
135
|
+
clearTimeout(timer);
|
|
136
|
+
this.timers.delete(type);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Take items from queue
|
|
140
|
+
const items = queue.splice(0);
|
|
141
|
+
const startTime = Date.now();
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
await processor.process(items);
|
|
145
|
+
|
|
146
|
+
// Update stats
|
|
147
|
+
stats.totalBatches++;
|
|
148
|
+
stats.totalItems += items.length;
|
|
149
|
+
stats.successCount += items.length;
|
|
150
|
+
stats.averageBatchSize = stats.totalItems / stats.totalBatches;
|
|
151
|
+
|
|
152
|
+
const processingTime = Date.now() - startTime;
|
|
153
|
+
stats.totalProcessingTime += processingTime;
|
|
154
|
+
stats.averageProcessingTime = stats.totalProcessingTime / stats.totalBatches;
|
|
155
|
+
stats.lastProcessed = new Date();
|
|
156
|
+
|
|
157
|
+
this.emit('batchProcessed', {
|
|
158
|
+
type,
|
|
159
|
+
itemCount: items.length,
|
|
160
|
+
processingTime,
|
|
161
|
+
success: true
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
} catch (error) {
|
|
165
|
+
// Update error stats
|
|
166
|
+
stats.errorCount += items.length;
|
|
167
|
+
|
|
168
|
+
this.emit('batchError', {
|
|
169
|
+
type,
|
|
170
|
+
itemCount: items.length,
|
|
171
|
+
error,
|
|
172
|
+
success: false
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Cache operations
|
|
181
|
+
*/
|
|
182
|
+
setCache<T>(key: string, value: T, ttlMs?: number): void {
|
|
183
|
+
const now = new Date();
|
|
184
|
+
const item: CacheItem<T> = {
|
|
185
|
+
key,
|
|
186
|
+
value,
|
|
187
|
+
timestamp: now,
|
|
188
|
+
expiresAt: ttlMs ? new Date(now.getTime() + ttlMs) : undefined,
|
|
189
|
+
accessCount: 0,
|
|
190
|
+
lastAccessed: now
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
this.cache.set(key, item);
|
|
194
|
+
this.enforceMaxCacheSize();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
getCache<T>(key: string): T | null {
|
|
198
|
+
const item = this.cache.get(key) as CacheItem<T> | undefined;
|
|
199
|
+
|
|
200
|
+
if (!item) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Check expiration
|
|
205
|
+
if (item.expiresAt && item.expiresAt < new Date()) {
|
|
206
|
+
this.cache.delete(key);
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Update access stats
|
|
211
|
+
item.accessCount++;
|
|
212
|
+
item.lastAccessed = new Date();
|
|
213
|
+
|
|
214
|
+
return item.value;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
hasCache(key: string): boolean {
|
|
218
|
+
return this.getCache(key) !== null;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
deleteCache(key: string): boolean {
|
|
222
|
+
return this.cache.delete(key);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
clearCache(): void {
|
|
226
|
+
this.cache.clear();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Get batch statistics
|
|
231
|
+
*/
|
|
232
|
+
getStats(type?: string): BatchStats | Map<string, BatchStats> {
|
|
233
|
+
if (type) {
|
|
234
|
+
return this.stats.get(type) || {
|
|
235
|
+
totalBatches: 0,
|
|
236
|
+
totalItems: 0,
|
|
237
|
+
averageBatchSize: 0,
|
|
238
|
+
totalProcessingTime: 0,
|
|
239
|
+
averageProcessingTime: 0,
|
|
240
|
+
successCount: 0,
|
|
241
|
+
errorCount: 0,
|
|
242
|
+
lastProcessed: new Date(),
|
|
243
|
+
pendingBatches: 0,
|
|
244
|
+
processedToday: 0
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return new Map(this.stats);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get cache statistics
|
|
252
|
+
*/
|
|
253
|
+
getCacheStats(): {
|
|
254
|
+
size: number;
|
|
255
|
+
totalAccess: number;
|
|
256
|
+
hitRate: number;
|
|
257
|
+
oldestItem?: Date;
|
|
258
|
+
newestItem?: Date;
|
|
259
|
+
} {
|
|
260
|
+
const items = Array.from(this.cache.values());
|
|
261
|
+
const totalAccess = items.reduce((sum, item) => sum + item.accessCount, 0);
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
size: this.cache.size,
|
|
265
|
+
totalAccess,
|
|
266
|
+
hitRate: totalAccess > 0 ? totalAccess / (totalAccess + 1) : 0, // Simplified calculation
|
|
267
|
+
oldestItem: items.length > 0 ? new Date(Math.min(...items.map(i => i.timestamp.getTime()))) : undefined,
|
|
268
|
+
newestItem: items.length > 0 ? new Date(Math.max(...items.map(i => i.timestamp.getTime()))) : undefined
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Clean up resources
|
|
274
|
+
*/
|
|
275
|
+
async cleanup(): Promise<void> {
|
|
276
|
+
// Process remaining items
|
|
277
|
+
for (const type of this.queues.keys()) {
|
|
278
|
+
await this.processBatch(type);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Clear timers
|
|
282
|
+
for (const timer of this.timers.values()) {
|
|
283
|
+
clearTimeout(timer);
|
|
284
|
+
}
|
|
285
|
+
this.timers.clear();
|
|
286
|
+
|
|
287
|
+
// Clear cache
|
|
288
|
+
this.clearCache();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Private helper methods
|
|
292
|
+
private getBatchConfig(type: string) {
|
|
293
|
+
const defaults = { batchSize: 10, delayMs: 1000 };
|
|
294
|
+
|
|
295
|
+
switch (type) {
|
|
296
|
+
case 'embedding':
|
|
297
|
+
return { ...defaults, ...this.config.embedding };
|
|
298
|
+
case 'indexing':
|
|
299
|
+
return { ...defaults, ...this.config.indexing };
|
|
300
|
+
case 'storage':
|
|
301
|
+
return { ...defaults, ...this.config.storage };
|
|
302
|
+
default:
|
|
303
|
+
return defaults;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
private scheduleProcessing(type: string, delayMs: number): void {
|
|
308
|
+
// Clear existing timer
|
|
309
|
+
const existingTimer = this.timers.get(type);
|
|
310
|
+
if (existingTimer) {
|
|
311
|
+
clearTimeout(existingTimer);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Schedule new processing
|
|
315
|
+
const timer = setTimeout(() => {
|
|
316
|
+
this.processBatch(type).catch(error => {
|
|
317
|
+
this.emit('error', error);
|
|
318
|
+
});
|
|
319
|
+
}, delayMs);
|
|
320
|
+
|
|
321
|
+
this.timers.set(type, timer);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private enforceMaxCacheSize(): void {
|
|
325
|
+
const maxSize = this.config.cache?.maxSize || 1000;
|
|
326
|
+
|
|
327
|
+
if (this.cache.size <= maxSize) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Remove oldest items (LRU)
|
|
332
|
+
const items = Array.from(this.cache.entries())
|
|
333
|
+
.sort(([, a], [, b]) => a.lastAccessed.getTime() - b.lastAccessed.getTime());
|
|
334
|
+
|
|
335
|
+
const itemsToRemove = items.slice(0, this.cache.size - maxSize);
|
|
336
|
+
for (const [key] of itemsToRemove) {
|
|
337
|
+
this.cache.delete(key);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
private setupCleanupTimer(): void {
|
|
342
|
+
const cleanupInterval = this.config.cache?.cleanupIntervalMs || 60000; // 1 minute
|
|
343
|
+
|
|
344
|
+
setInterval(() => {
|
|
345
|
+
const now = new Date();
|
|
346
|
+
for (const [key, item] of this.cache.entries()) {
|
|
347
|
+
if (item.expiresAt && item.expiresAt < now) {
|
|
348
|
+
this.cache.delete(key);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}, cleanupInterval);
|
|
352
|
+
}
|
|
353
353
|
}
|