@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
package/src/langchain/index.ts
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LangChain Integration for Personal Data Wallet SDK
|
|
3
|
-
*
|
|
4
|
-
* Provides standard LangChain interfaces for PDW's decentralized storage,
|
|
5
|
-
* SEAL encryption, and Sui blockchain integration.
|
|
6
|
-
*
|
|
7
|
-
* @module langchain
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* import { PDWEmbeddings, PDWVectorStore } from 'personal-data-wallet-sdk/langchain';
|
|
12
|
-
*
|
|
13
|
-
* // Initialize embeddings
|
|
14
|
-
* const embeddings = new PDWEmbeddings({
|
|
15
|
-
* geminiApiKey: process.env.GEMINI_API_KEY!
|
|
16
|
-
* });
|
|
17
|
-
*
|
|
18
|
-
* // Initialize vector store
|
|
19
|
-
* const vectorStore = new PDWVectorStore(embeddings, {
|
|
20
|
-
* userAddress: '0x...',
|
|
21
|
-
* packageId: '0x...',
|
|
22
|
-
* walrusAggregator: 'https://...'
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* // Use with LangChain
|
|
26
|
-
* const results = await vectorStore.similaritySearch('query', 5);
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
// Embeddings
|
|
31
|
-
export { PDWEmbeddings } from './PDWEmbeddings';
|
|
32
|
-
export type { PDWEmbeddingsParams } from './PDWEmbeddings';
|
|
33
|
-
|
|
34
|
-
// VectorStore
|
|
35
|
-
export { PDWVectorStore } from './PDWVectorStore';
|
|
36
|
-
export type { PDWVectorStoreConfig, PDWAddDocumentOptions } from './PDWVectorStore';
|
|
37
|
-
|
|
38
|
-
// RAG Helpers
|
|
39
|
-
export {
|
|
40
|
-
createPDWRAG,
|
|
41
|
-
createPDWRAGWithSources,
|
|
42
|
-
createConversationalPDWRAG
|
|
43
|
-
} from './createPDWRAG';
|
|
44
|
-
export type {
|
|
45
|
-
PDWRAGConfig,
|
|
46
|
-
PDWRAGResult
|
|
47
|
-
} from './createPDWRAG';
|
|
1
|
+
/**
|
|
2
|
+
* LangChain Integration for Personal Data Wallet SDK
|
|
3
|
+
*
|
|
4
|
+
* Provides standard LangChain interfaces for PDW's decentralized storage,
|
|
5
|
+
* SEAL encryption, and Sui blockchain integration.
|
|
6
|
+
*
|
|
7
|
+
* @module langchain
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { PDWEmbeddings, PDWVectorStore } from 'personal-data-wallet-sdk/langchain';
|
|
12
|
+
*
|
|
13
|
+
* // Initialize embeddings
|
|
14
|
+
* const embeddings = new PDWEmbeddings({
|
|
15
|
+
* geminiApiKey: process.env.GEMINI_API_KEY!
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Initialize vector store
|
|
19
|
+
* const vectorStore = new PDWVectorStore(embeddings, {
|
|
20
|
+
* userAddress: '0x...',
|
|
21
|
+
* packageId: '0x...',
|
|
22
|
+
* walrusAggregator: 'https://...'
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Use with LangChain
|
|
26
|
+
* const results = await vectorStore.similaritySearch('query', 5);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
// Embeddings
|
|
31
|
+
export { PDWEmbeddings } from './PDWEmbeddings';
|
|
32
|
+
export type { PDWEmbeddingsParams } from './PDWEmbeddings';
|
|
33
|
+
|
|
34
|
+
// VectorStore
|
|
35
|
+
export { PDWVectorStore } from './PDWVectorStore';
|
|
36
|
+
export type { PDWVectorStoreConfig, PDWAddDocumentOptions } from './PDWVectorStore';
|
|
37
|
+
|
|
38
|
+
// RAG Helpers
|
|
39
|
+
export {
|
|
40
|
+
createPDWRAG,
|
|
41
|
+
createPDWRAGWithSources,
|
|
42
|
+
createConversationalPDWRAG
|
|
43
|
+
} from './createPDWRAG';
|
|
44
|
+
export type {
|
|
45
|
+
PDWRAGConfig,
|
|
46
|
+
PDWRAGResult
|
|
47
|
+
} from './createPDWRAG';
|
|
@@ -1,249 +1,249 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Browser-safe Consent Repository implementations
|
|
3
|
-
*
|
|
4
|
-
* This file contains only browser-compatible implementations.
|
|
5
|
-
* FileSystemConsentRepository is excluded as it requires Node.js fs/promises.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
ConsentRequestRecord,
|
|
10
|
-
ConsentStatus,
|
|
11
|
-
} from '../core/types/wallet.js';
|
|
12
|
-
import { normalizeSuiAddress } from '@mysten/sui/utils';
|
|
13
|
-
|
|
14
|
-
export interface ConsentRepository {
|
|
15
|
-
save(request: ConsentRequestRecord): Promise<void>;
|
|
16
|
-
updateStatus(requestId: string, status: ConsentStatus, updatedAt: number): Promise<void>;
|
|
17
|
-
getById(requestId: string): Promise<ConsentRequestRecord | null>;
|
|
18
|
-
listByTarget(targetWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]>;
|
|
19
|
-
listByRequester(requesterWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]>;
|
|
20
|
-
delete(requestId: string): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
interface StoredConsentRecord extends ConsentRequestRecord {}
|
|
24
|
-
|
|
25
|
-
function normalizeRecord(record: ConsentRequestRecord): StoredConsentRecord {
|
|
26
|
-
return {
|
|
27
|
-
...record,
|
|
28
|
-
requesterWallet: normalizeSuiAddress(record.requesterWallet),
|
|
29
|
-
targetWallet: normalizeSuiAddress(record.targetWallet),
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export class InMemoryConsentRepository implements ConsentRepository {
|
|
34
|
-
private store = new Map<string, StoredConsentRecord>();
|
|
35
|
-
|
|
36
|
-
async save(request: ConsentRequestRecord): Promise<void> {
|
|
37
|
-
const normalized = normalizeRecord(request);
|
|
38
|
-
this.store.set(normalized.requestId, normalized);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async updateStatus(requestId: string, status: ConsentStatus, updatedAt: number): Promise<void> {
|
|
42
|
-
const record = this.store.get(requestId);
|
|
43
|
-
if (!record) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
this.store.set(requestId, {
|
|
47
|
-
...record,
|
|
48
|
-
status,
|
|
49
|
-
updatedAt,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async getById(requestId: string): Promise<ConsentRequestRecord | null> {
|
|
54
|
-
const record = this.store.get(requestId);
|
|
55
|
-
return record ? { ...record } : null;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async listByTarget(targetWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
59
|
-
const normalizedTarget = normalizeSuiAddress(targetWallet);
|
|
60
|
-
return Array.from(this.store.values())
|
|
61
|
-
.filter((record) => record.targetWallet === normalizedTarget)
|
|
62
|
-
.filter((record) => (status ? record.status === status : true))
|
|
63
|
-
.map((record) => ({ ...record }));
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async listByRequester(requesterWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
67
|
-
const normalizedRequester = normalizeSuiAddress(requesterWallet);
|
|
68
|
-
return Array.from(this.store.values())
|
|
69
|
-
.filter((record) => record.requesterWallet === normalizedRequester)
|
|
70
|
-
.filter((record) => (status ? record.status === status : true))
|
|
71
|
-
.map((record) => ({ ...record }));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async delete(requestId: string): Promise<void> {
|
|
75
|
-
this.store.delete(requestId);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* IndexedDBConsentRepository - Browser-compatible implementation
|
|
81
|
-
* Uses IndexedDB for persistent storage in browser environments.
|
|
82
|
-
*/
|
|
83
|
-
export class IndexedDBConsentRepository implements ConsentRepository {
|
|
84
|
-
private dbName = 'pdw-consent-store';
|
|
85
|
-
private storeName = 'consent-requests';
|
|
86
|
-
private dbVersion = 1;
|
|
87
|
-
private db: IDBDatabase | null = null;
|
|
88
|
-
|
|
89
|
-
constructor(options?: { dbName?: string }) {
|
|
90
|
-
if (options?.dbName) {
|
|
91
|
-
this.dbName = options.dbName;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
private async getDB(): Promise<IDBDatabase> {
|
|
96
|
-
if (this.db) {
|
|
97
|
-
return this.db;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return new Promise((resolve, reject) => {
|
|
101
|
-
const request = indexedDB.open(this.dbName, this.dbVersion);
|
|
102
|
-
|
|
103
|
-
request.onerror = () => reject(request.error);
|
|
104
|
-
request.onsuccess = () => {
|
|
105
|
-
this.db = request.result;
|
|
106
|
-
resolve(request.result);
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
request.onupgradeneeded = (event) => {
|
|
110
|
-
const db = (event.target as IDBOpenDBRequest).result;
|
|
111
|
-
if (!db.objectStoreNames.contains(this.storeName)) {
|
|
112
|
-
const store = db.createObjectStore(this.storeName, { keyPath: 'requestId' });
|
|
113
|
-
store.createIndex('targetWallet', 'targetWallet', { unique: false });
|
|
114
|
-
store.createIndex('requesterWallet', 'requesterWallet', { unique: false });
|
|
115
|
-
store.createIndex('status', 'status', { unique: false });
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async save(request: ConsentRequestRecord): Promise<void> {
|
|
122
|
-
const db = await this.getDB();
|
|
123
|
-
const normalized = normalizeRecord(request);
|
|
124
|
-
|
|
125
|
-
return new Promise((resolve, reject) => {
|
|
126
|
-
const tx = db.transaction(this.storeName, 'readwrite');
|
|
127
|
-
const store = tx.objectStore(this.storeName);
|
|
128
|
-
const req = store.put(normalized);
|
|
129
|
-
|
|
130
|
-
req.onerror = () => reject(req.error);
|
|
131
|
-
req.onsuccess = () => resolve();
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async updateStatus(requestId: string, status: ConsentStatus, updatedAt: number): Promise<void> {
|
|
136
|
-
const record = await this.getById(requestId);
|
|
137
|
-
if (!record) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
await this.save({
|
|
142
|
-
...record,
|
|
143
|
-
status,
|
|
144
|
-
updatedAt,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
async getById(requestId: string): Promise<ConsentRequestRecord | null> {
|
|
149
|
-
const db = await this.getDB();
|
|
150
|
-
|
|
151
|
-
return new Promise((resolve, reject) => {
|
|
152
|
-
const tx = db.transaction(this.storeName, 'readonly');
|
|
153
|
-
const store = tx.objectStore(this.storeName);
|
|
154
|
-
const req = store.get(requestId);
|
|
155
|
-
|
|
156
|
-
req.onerror = () => reject(req.error);
|
|
157
|
-
req.onsuccess = () => {
|
|
158
|
-
const record = req.result as StoredConsentRecord | undefined;
|
|
159
|
-
resolve(record ? { ...record } : null);
|
|
160
|
-
};
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async listByTarget(targetWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
165
|
-
const normalizedTarget = normalizeSuiAddress(targetWallet);
|
|
166
|
-
const db = await this.getDB();
|
|
167
|
-
|
|
168
|
-
return new Promise((resolve, reject) => {
|
|
169
|
-
const tx = db.transaction(this.storeName, 'readonly');
|
|
170
|
-
const store = tx.objectStore(this.storeName);
|
|
171
|
-
const index = store.index('targetWallet');
|
|
172
|
-
const req = index.getAll(normalizedTarget);
|
|
173
|
-
|
|
174
|
-
req.onerror = () => reject(req.error);
|
|
175
|
-
req.onsuccess = () => {
|
|
176
|
-
let records = req.result as StoredConsentRecord[];
|
|
177
|
-
if (status) {
|
|
178
|
-
records = records.filter((r) => r.status === status);
|
|
179
|
-
}
|
|
180
|
-
resolve(records.map((r) => ({ ...r })));
|
|
181
|
-
};
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async listByRequester(requesterWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
186
|
-
const normalizedRequester = normalizeSuiAddress(requesterWallet);
|
|
187
|
-
const db = await this.getDB();
|
|
188
|
-
|
|
189
|
-
return new Promise((resolve, reject) => {
|
|
190
|
-
const tx = db.transaction(this.storeName, 'readonly');
|
|
191
|
-
const store = tx.objectStore(this.storeName);
|
|
192
|
-
const index = store.index('requesterWallet');
|
|
193
|
-
const req = index.getAll(normalizedRequester);
|
|
194
|
-
|
|
195
|
-
req.onerror = () => reject(req.error);
|
|
196
|
-
req.onsuccess = () => {
|
|
197
|
-
let records = req.result as StoredConsentRecord[];
|
|
198
|
-
if (status) {
|
|
199
|
-
records = records.filter((r) => r.status === status);
|
|
200
|
-
}
|
|
201
|
-
resolve(records.map((r) => ({ ...r })));
|
|
202
|
-
};
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async delete(requestId: string): Promise<void> {
|
|
207
|
-
const db = await this.getDB();
|
|
208
|
-
|
|
209
|
-
return new Promise((resolve, reject) => {
|
|
210
|
-
const tx = db.transaction(this.storeName, 'readwrite');
|
|
211
|
-
const store = tx.objectStore(this.storeName);
|
|
212
|
-
const req = store.delete(requestId);
|
|
213
|
-
|
|
214
|
-
req.onerror = () => reject(req.error);
|
|
215
|
-
req.onsuccess = () => resolve();
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Close the database connection
|
|
221
|
-
*/
|
|
222
|
-
close(): void {
|
|
223
|
-
if (this.db) {
|
|
224
|
-
this.db.close();
|
|
225
|
-
this.db = null;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Factory function to create the appropriate ConsentRepository for browser
|
|
232
|
-
*/
|
|
233
|
-
export function createBrowserConsentRepository(options?: {
|
|
234
|
-
dbName?: string;
|
|
235
|
-
forceInMemory?: boolean;
|
|
236
|
-
}): ConsentRepository {
|
|
237
|
-
// Force in-memory for testing
|
|
238
|
-
if (options?.forceInMemory) {
|
|
239
|
-
return new InMemoryConsentRepository();
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Browser environment - use IndexedDB
|
|
243
|
-
if (typeof window !== 'undefined' && typeof indexedDB !== 'undefined') {
|
|
244
|
-
return new IndexedDBConsentRepository({ dbName: options?.dbName });
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Fallback to in-memory
|
|
248
|
-
return new InMemoryConsentRepository();
|
|
249
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe Consent Repository implementations
|
|
3
|
+
*
|
|
4
|
+
* This file contains only browser-compatible implementations.
|
|
5
|
+
* FileSystemConsentRepository is excluded as it requires Node.js fs/promises.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
ConsentRequestRecord,
|
|
10
|
+
ConsentStatus,
|
|
11
|
+
} from '../core/types/wallet.js';
|
|
12
|
+
import { normalizeSuiAddress } from '@mysten/sui/utils';
|
|
13
|
+
|
|
14
|
+
export interface ConsentRepository {
|
|
15
|
+
save(request: ConsentRequestRecord): Promise<void>;
|
|
16
|
+
updateStatus(requestId: string, status: ConsentStatus, updatedAt: number): Promise<void>;
|
|
17
|
+
getById(requestId: string): Promise<ConsentRequestRecord | null>;
|
|
18
|
+
listByTarget(targetWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]>;
|
|
19
|
+
listByRequester(requesterWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]>;
|
|
20
|
+
delete(requestId: string): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface StoredConsentRecord extends ConsentRequestRecord {}
|
|
24
|
+
|
|
25
|
+
function normalizeRecord(record: ConsentRequestRecord): StoredConsentRecord {
|
|
26
|
+
return {
|
|
27
|
+
...record,
|
|
28
|
+
requesterWallet: normalizeSuiAddress(record.requesterWallet),
|
|
29
|
+
targetWallet: normalizeSuiAddress(record.targetWallet),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class InMemoryConsentRepository implements ConsentRepository {
|
|
34
|
+
private store = new Map<string, StoredConsentRecord>();
|
|
35
|
+
|
|
36
|
+
async save(request: ConsentRequestRecord): Promise<void> {
|
|
37
|
+
const normalized = normalizeRecord(request);
|
|
38
|
+
this.store.set(normalized.requestId, normalized);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async updateStatus(requestId: string, status: ConsentStatus, updatedAt: number): Promise<void> {
|
|
42
|
+
const record = this.store.get(requestId);
|
|
43
|
+
if (!record) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.store.set(requestId, {
|
|
47
|
+
...record,
|
|
48
|
+
status,
|
|
49
|
+
updatedAt,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async getById(requestId: string): Promise<ConsentRequestRecord | null> {
|
|
54
|
+
const record = this.store.get(requestId);
|
|
55
|
+
return record ? { ...record } : null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async listByTarget(targetWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
59
|
+
const normalizedTarget = normalizeSuiAddress(targetWallet);
|
|
60
|
+
return Array.from(this.store.values())
|
|
61
|
+
.filter((record) => record.targetWallet === normalizedTarget)
|
|
62
|
+
.filter((record) => (status ? record.status === status : true))
|
|
63
|
+
.map((record) => ({ ...record }));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async listByRequester(requesterWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
67
|
+
const normalizedRequester = normalizeSuiAddress(requesterWallet);
|
|
68
|
+
return Array.from(this.store.values())
|
|
69
|
+
.filter((record) => record.requesterWallet === normalizedRequester)
|
|
70
|
+
.filter((record) => (status ? record.status === status : true))
|
|
71
|
+
.map((record) => ({ ...record }));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async delete(requestId: string): Promise<void> {
|
|
75
|
+
this.store.delete(requestId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* IndexedDBConsentRepository - Browser-compatible implementation
|
|
81
|
+
* Uses IndexedDB for persistent storage in browser environments.
|
|
82
|
+
*/
|
|
83
|
+
export class IndexedDBConsentRepository implements ConsentRepository {
|
|
84
|
+
private dbName = 'pdw-consent-store';
|
|
85
|
+
private storeName = 'consent-requests';
|
|
86
|
+
private dbVersion = 1;
|
|
87
|
+
private db: IDBDatabase | null = null;
|
|
88
|
+
|
|
89
|
+
constructor(options?: { dbName?: string }) {
|
|
90
|
+
if (options?.dbName) {
|
|
91
|
+
this.dbName = options.dbName;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private async getDB(): Promise<IDBDatabase> {
|
|
96
|
+
if (this.db) {
|
|
97
|
+
return this.db;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
const request = indexedDB.open(this.dbName, this.dbVersion);
|
|
102
|
+
|
|
103
|
+
request.onerror = () => reject(request.error);
|
|
104
|
+
request.onsuccess = () => {
|
|
105
|
+
this.db = request.result;
|
|
106
|
+
resolve(request.result);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
request.onupgradeneeded = (event) => {
|
|
110
|
+
const db = (event.target as IDBOpenDBRequest).result;
|
|
111
|
+
if (!db.objectStoreNames.contains(this.storeName)) {
|
|
112
|
+
const store = db.createObjectStore(this.storeName, { keyPath: 'requestId' });
|
|
113
|
+
store.createIndex('targetWallet', 'targetWallet', { unique: false });
|
|
114
|
+
store.createIndex('requesterWallet', 'requesterWallet', { unique: false });
|
|
115
|
+
store.createIndex('status', 'status', { unique: false });
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async save(request: ConsentRequestRecord): Promise<void> {
|
|
122
|
+
const db = await this.getDB();
|
|
123
|
+
const normalized = normalizeRecord(request);
|
|
124
|
+
|
|
125
|
+
return new Promise((resolve, reject) => {
|
|
126
|
+
const tx = db.transaction(this.storeName, 'readwrite');
|
|
127
|
+
const store = tx.objectStore(this.storeName);
|
|
128
|
+
const req = store.put(normalized);
|
|
129
|
+
|
|
130
|
+
req.onerror = () => reject(req.error);
|
|
131
|
+
req.onsuccess = () => resolve();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async updateStatus(requestId: string, status: ConsentStatus, updatedAt: number): Promise<void> {
|
|
136
|
+
const record = await this.getById(requestId);
|
|
137
|
+
if (!record) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
await this.save({
|
|
142
|
+
...record,
|
|
143
|
+
status,
|
|
144
|
+
updatedAt,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async getById(requestId: string): Promise<ConsentRequestRecord | null> {
|
|
149
|
+
const db = await this.getDB();
|
|
150
|
+
|
|
151
|
+
return new Promise((resolve, reject) => {
|
|
152
|
+
const tx = db.transaction(this.storeName, 'readonly');
|
|
153
|
+
const store = tx.objectStore(this.storeName);
|
|
154
|
+
const req = store.get(requestId);
|
|
155
|
+
|
|
156
|
+
req.onerror = () => reject(req.error);
|
|
157
|
+
req.onsuccess = () => {
|
|
158
|
+
const record = req.result as StoredConsentRecord | undefined;
|
|
159
|
+
resolve(record ? { ...record } : null);
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async listByTarget(targetWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
165
|
+
const normalizedTarget = normalizeSuiAddress(targetWallet);
|
|
166
|
+
const db = await this.getDB();
|
|
167
|
+
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
const tx = db.transaction(this.storeName, 'readonly');
|
|
170
|
+
const store = tx.objectStore(this.storeName);
|
|
171
|
+
const index = store.index('targetWallet');
|
|
172
|
+
const req = index.getAll(normalizedTarget);
|
|
173
|
+
|
|
174
|
+
req.onerror = () => reject(req.error);
|
|
175
|
+
req.onsuccess = () => {
|
|
176
|
+
let records = req.result as StoredConsentRecord[];
|
|
177
|
+
if (status) {
|
|
178
|
+
records = records.filter((r) => r.status === status);
|
|
179
|
+
}
|
|
180
|
+
resolve(records.map((r) => ({ ...r })));
|
|
181
|
+
};
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
async listByRequester(requesterWallet: string, status?: ConsentStatus): Promise<ConsentRequestRecord[]> {
|
|
186
|
+
const normalizedRequester = normalizeSuiAddress(requesterWallet);
|
|
187
|
+
const db = await this.getDB();
|
|
188
|
+
|
|
189
|
+
return new Promise((resolve, reject) => {
|
|
190
|
+
const tx = db.transaction(this.storeName, 'readonly');
|
|
191
|
+
const store = tx.objectStore(this.storeName);
|
|
192
|
+
const index = store.index('requesterWallet');
|
|
193
|
+
const req = index.getAll(normalizedRequester);
|
|
194
|
+
|
|
195
|
+
req.onerror = () => reject(req.error);
|
|
196
|
+
req.onsuccess = () => {
|
|
197
|
+
let records = req.result as StoredConsentRecord[];
|
|
198
|
+
if (status) {
|
|
199
|
+
records = records.filter((r) => r.status === status);
|
|
200
|
+
}
|
|
201
|
+
resolve(records.map((r) => ({ ...r })));
|
|
202
|
+
};
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async delete(requestId: string): Promise<void> {
|
|
207
|
+
const db = await this.getDB();
|
|
208
|
+
|
|
209
|
+
return new Promise((resolve, reject) => {
|
|
210
|
+
const tx = db.transaction(this.storeName, 'readwrite');
|
|
211
|
+
const store = tx.objectStore(this.storeName);
|
|
212
|
+
const req = store.delete(requestId);
|
|
213
|
+
|
|
214
|
+
req.onerror = () => reject(req.error);
|
|
215
|
+
req.onsuccess = () => resolve();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Close the database connection
|
|
221
|
+
*/
|
|
222
|
+
close(): void {
|
|
223
|
+
if (this.db) {
|
|
224
|
+
this.db.close();
|
|
225
|
+
this.db = null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Factory function to create the appropriate ConsentRepository for browser
|
|
232
|
+
*/
|
|
233
|
+
export function createBrowserConsentRepository(options?: {
|
|
234
|
+
dbName?: string;
|
|
235
|
+
forceInMemory?: boolean;
|
|
236
|
+
}): ConsentRepository {
|
|
237
|
+
// Force in-memory for testing
|
|
238
|
+
if (options?.forceInMemory) {
|
|
239
|
+
return new InMemoryConsentRepository();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Browser environment - use IndexedDB
|
|
243
|
+
if (typeof window !== 'undefined' && typeof indexedDB !== 'undefined') {
|
|
244
|
+
return new IndexedDBConsentRepository({ dbName: options?.dbName });
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Fallback to in-memory
|
|
248
|
+
return new InMemoryConsentRepository();
|
|
249
|
+
}
|