@varity-labs/sdk 2.0.0-alpha.1
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 +31 -0
- package/README.md +253 -0
- package/dist/analytics/index.d.ts +7 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +6 -0
- package/dist/analytics/tracker.d.ts +128 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +203 -0
- package/dist/blockchain/BlockchainService.d.ts +100 -0
- package/dist/blockchain/BlockchainService.d.ts.map +1 -0
- package/dist/blockchain/BlockchainService.js +188 -0
- package/dist/blockchain/NFTLicensingService.d.ts +69 -0
- package/dist/blockchain/NFTLicensingService.d.ts.map +1 -0
- package/dist/blockchain/NFTLicensingService.js +136 -0
- package/dist/blockchain/RevenueSplitService.d.ts +71 -0
- package/dist/blockchain/RevenueSplitService.d.ts.map +1 -0
- package/dist/blockchain/RevenueSplitService.js +111 -0
- package/dist/blockchain/index.d.ts +48 -0
- package/dist/blockchain/index.d.ts.map +1 -0
- package/dist/blockchain/index.js +46 -0
- package/dist/blockchain/types.d.ts +63 -0
- package/dist/blockchain/types.d.ts.map +1 -0
- package/dist/blockchain/types.js +6 -0
- package/dist/chains/arbitrum.d.ts +89 -0
- package/dist/chains/arbitrum.d.ts.map +1 -0
- package/dist/chains/arbitrum.js +134 -0
- package/dist/chains/base.d.ts +84 -0
- package/dist/chains/base.d.ts.map +1 -0
- package/dist/chains/base.js +131 -0
- package/dist/chains/index.d.ts +36 -0
- package/dist/chains/index.d.ts.map +1 -0
- package/dist/chains/index.js +32 -0
- package/dist/chains/registry.d.ts +113 -0
- package/dist/chains/registry.d.ts.map +1 -0
- package/dist/chains/registry.js +201 -0
- package/dist/chains/varityL3.d.ts +81 -0
- package/dist/chains/varityL3.d.ts.map +1 -0
- package/dist/chains/varityL3.js +125 -0
- package/dist/cli/commands/clone.d.ts +8 -0
- package/dist/cli/commands/clone.d.ts.map +1 -0
- package/dist/cli/commands/clone.js +391 -0
- package/dist/cli/commands/dev.d.ts +8 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +40 -0
- package/dist/cli/commands/generate.d.ts +8 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +303 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +317 -0
- package/dist/cli/commands/validate.d.ts +8 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +69 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/utils/logger.d.ts +17 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +35 -0
- package/dist/cli/utils/prompts.d.ts +21 -0
- package/dist/cli/utils/prompts.d.ts.map +1 -0
- package/dist/cli/utils/prompts.js +103 -0
- package/dist/contracts/abis/iso/AccessControlRegistry.json +1468 -0
- package/dist/contracts/abis/iso/DataProofRegistry.json +797 -0
- package/dist/contracts/abis/iso/MerchantRegistry.json +1237 -0
- package/dist/contracts/abis/iso/RepPerformance.json +1351 -0
- package/dist/contracts/abis/iso/ResidualCalculator.json +1118 -0
- package/dist/contracts/abis/iso/TransactionVault.json +1588 -0
- package/dist/contracts/abis/iso/VarityWalletFactory.json +475 -0
- package/dist/contracts/addresses.d.ts +88 -0
- package/dist/contracts/addresses.d.ts.map +1 -0
- package/dist/contracts/addresses.js +94 -0
- package/dist/contracts/index.d.ts +7 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +6 -0
- package/dist/core/VaritySDK.d.ts +177 -0
- package/dist/core/VaritySDK.d.ts.map +1 -0
- package/dist/core/VaritySDK.js +325 -0
- package/dist/core/config.d.ts +120 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +187 -0
- package/dist/core/credentials-proxy.d.ts +157 -0
- package/dist/core/credentials-proxy.d.ts.map +1 -0
- package/dist/core/credentials-proxy.js +345 -0
- package/dist/core/credentials.d.ts +219 -0
- package/dist/core/credentials.d.ts.map +1 -0
- package/dist/core/credentials.js +345 -0
- package/dist/core/template-loader.d.ts +15 -0
- package/dist/core/template-loader.d.ts.map +1 -0
- package/dist/core/template-loader.js +380 -0
- package/dist/core/template.d.ts +321 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +189 -0
- package/dist/core/types.d.ts +572 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +52 -0
- package/dist/dev/dev-server.d.ts +16 -0
- package/dist/dev/dev-server.d.ts.map +1 -0
- package/dist/dev/dev-server.js +119 -0
- package/dist/generators/contracts/generator.d.ts +21 -0
- package/dist/generators/contracts/generator.d.ts.map +1 -0
- package/dist/generators/contracts/generator.js +252 -0
- package/dist/generators/tests/generator.d.ts +20 -0
- package/dist/generators/tests/generator.d.ts.map +1 -0
- package/dist/generators/tests/generator.js +375 -0
- package/dist/generators/types/generator.d.ts +19 -0
- package/dist/generators/types/generator.d.ts.map +1 -0
- package/dist/generators/types/generator.js +165 -0
- package/dist/generators/ui/component-generator.d.ts +20 -0
- package/dist/generators/ui/component-generator.d.ts.map +1 -0
- package/dist/generators/ui/component-generator.js +749 -0
- package/dist/generators/ui/dashboard-generator.d.ts +20 -0
- package/dist/generators/ui/dashboard-generator.d.ts.map +1 -0
- package/dist/generators/ui/dashboard-generator.js +349 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/modules/analytics/AnalyticsModule.d.ts +349 -0
- package/dist/modules/analytics/AnalyticsModule.d.ts.map +1 -0
- package/dist/modules/analytics/AnalyticsModule.js +274 -0
- package/dist/modules/analytics/index.d.ts +3 -0
- package/dist/modules/analytics/index.d.ts.map +1 -0
- package/dist/modules/analytics/index.js +1 -0
- package/dist/modules/auth/AccessKeyModule.d.ts +189 -0
- package/dist/modules/auth/AccessKeyModule.d.ts.map +1 -0
- package/dist/modules/auth/AccessKeyModule.js +322 -0
- package/dist/modules/auth/AuthModule.d.ts +133 -0
- package/dist/modules/auth/AuthModule.d.ts.map +1 -0
- package/dist/modules/auth/AuthModule.js +214 -0
- package/dist/modules/auth/index.d.ts +8 -0
- package/dist/modules/auth/index.d.ts.map +1 -0
- package/dist/modules/auth/index.js +6 -0
- package/dist/modules/cache/CacheModule.d.ts +279 -0
- package/dist/modules/cache/CacheModule.d.ts.map +1 -0
- package/dist/modules/cache/CacheModule.js +493 -0
- package/dist/modules/cache/index.d.ts +3 -0
- package/dist/modules/cache/index.d.ts.map +1 -0
- package/dist/modules/cache/index.js +1 -0
- package/dist/modules/compute/ComputeModule.d.ts +226 -0
- package/dist/modules/compute/ComputeModule.d.ts.map +1 -0
- package/dist/modules/compute/ComputeModule.js +379 -0
- package/dist/modules/compute/index.d.ts +6 -0
- package/dist/modules/compute/index.d.ts.map +1 -0
- package/dist/modules/compute/index.js +4 -0
- package/dist/modules/contracts/ContractsModule.d.ts +164 -0
- package/dist/modules/contracts/ContractsModule.d.ts.map +1 -0
- package/dist/modules/contracts/ContractsModule.js +242 -0
- package/dist/modules/contracts/index.d.ts +6 -0
- package/dist/modules/contracts/index.d.ts.map +1 -0
- package/dist/modules/contracts/index.js +4 -0
- package/dist/modules/export/ExportModule.d.ts +346 -0
- package/dist/modules/export/ExportModule.d.ts.map +1 -0
- package/dist/modules/export/ExportModule.js +432 -0
- package/dist/modules/export/index.d.ts +3 -0
- package/dist/modules/export/index.d.ts.map +1 -0
- package/dist/modules/export/index.js +1 -0
- package/dist/modules/forecasting/ForecastingModule.d.ts +579 -0
- package/dist/modules/forecasting/ForecastingModule.d.ts.map +1 -0
- package/dist/modules/forecasting/ForecastingModule.js +310 -0
- package/dist/modules/forecasting/index.d.ts +3 -0
- package/dist/modules/forecasting/index.d.ts.map +1 -0
- package/dist/modules/forecasting/index.js +1 -0
- package/dist/modules/monitoring/MonitoringModule.d.ts +359 -0
- package/dist/modules/monitoring/MonitoringModule.d.ts.map +1 -0
- package/dist/modules/monitoring/MonitoringModule.js +483 -0
- package/dist/modules/monitoring/index.d.ts +3 -0
- package/dist/modules/monitoring/index.d.ts.map +1 -0
- package/dist/modules/monitoring/index.js +1 -0
- package/dist/modules/notifications/NotificationsModule.d.ts +336 -0
- package/dist/modules/notifications/NotificationsModule.d.ts.map +1 -0
- package/dist/modules/notifications/NotificationsModule.js +418 -0
- package/dist/modules/notifications/index.d.ts +3 -0
- package/dist/modules/notifications/index.d.ts.map +1 -0
- package/dist/modules/notifications/index.js +1 -0
- package/dist/modules/oracle/OracleModule.d.ts +110 -0
- package/dist/modules/oracle/OracleModule.d.ts.map +1 -0
- package/dist/modules/oracle/OracleModule.js +151 -0
- package/dist/modules/oracle/index.d.ts +6 -0
- package/dist/modules/oracle/index.d.ts.map +1 -0
- package/dist/modules/oracle/index.js +4 -0
- package/dist/modules/storage/S3Module.d.ts +377 -0
- package/dist/modules/storage/S3Module.d.ts.map +1 -0
- package/dist/modules/storage/S3Module.js +680 -0
- package/dist/modules/storage/StorageModule.d.ts +157 -0
- package/dist/modules/storage/StorageModule.d.ts.map +1 -0
- package/dist/modules/storage/StorageModule.js +302 -0
- package/dist/modules/storage/adapters/AdapterFactory.d.ts +100 -0
- package/dist/modules/storage/adapters/AdapterFactory.d.ts.map +1 -0
- package/dist/modules/storage/adapters/AdapterFactory.js +209 -0
- package/dist/modules/storage/adapters/FilecoinAdapter.d.ts +94 -0
- package/dist/modules/storage/adapters/FilecoinAdapter.d.ts.map +1 -0
- package/dist/modules/storage/adapters/FilecoinAdapter.js +263 -0
- package/dist/modules/storage/adapters/IStorageAdapter.d.ts +287 -0
- package/dist/modules/storage/adapters/IStorageAdapter.d.ts.map +1 -0
- package/dist/modules/storage/adapters/IStorageAdapter.js +81 -0
- package/dist/modules/storage/adapters/MultiTierAdapter.d.ts +187 -0
- package/dist/modules/storage/adapters/MultiTierAdapter.d.ts.map +1 -0
- package/dist/modules/storage/adapters/MultiTierAdapter.js +430 -0
- package/dist/modules/storage/adapters/index.d.ts +12 -0
- package/dist/modules/storage/adapters/index.d.ts.map +1 -0
- package/dist/modules/storage/adapters/index.js +12 -0
- package/dist/modules/storage/index.d.ts +16 -0
- package/dist/modules/storage/index.d.ts.map +1 -0
- package/dist/modules/storage/index.js +15 -0
- package/dist/modules/storage/tiering/AccessAnalyzer.d.ts +227 -0
- package/dist/modules/storage/tiering/AccessAnalyzer.d.ts.map +1 -0
- package/dist/modules/storage/tiering/AccessAnalyzer.js +367 -0
- package/dist/modules/storage/tiering/CostOptimizer.d.ts +248 -0
- package/dist/modules/storage/tiering/CostOptimizer.d.ts.map +1 -0
- package/dist/modules/storage/tiering/CostOptimizer.js +356 -0
- package/dist/modules/storage/tiering/MetadataStore.d.ts +287 -0
- package/dist/modules/storage/tiering/MetadataStore.d.ts.map +1 -0
- package/dist/modules/storage/tiering/MetadataStore.js +535 -0
- package/dist/modules/storage/tiering/TieringEngine.d.ts +237 -0
- package/dist/modules/storage/tiering/TieringEngine.d.ts.map +1 -0
- package/dist/modules/storage/tiering/TieringEngine.js +419 -0
- package/dist/modules/storage/tiering/example.d.ts +8 -0
- package/dist/modules/storage/tiering/example.d.ts.map +1 -0
- package/dist/modules/storage/tiering/example.js +250 -0
- package/dist/modules/storage/tiering/index.d.ts +17 -0
- package/dist/modules/storage/tiering/index.d.ts.map +1 -0
- package/dist/modules/storage/tiering/index.js +13 -0
- package/dist/modules/webhooks/WebhooksModule.d.ts +476 -0
- package/dist/modules/webhooks/WebhooksModule.d.ts.map +1 -0
- package/dist/modules/webhooks/WebhooksModule.js +359 -0
- package/dist/modules/webhooks/index.d.ts +3 -0
- package/dist/modules/webhooks/index.d.ts.map +1 -0
- package/dist/modules/webhooks/index.js +1 -0
- package/dist/modules/zk/ZKModule.d.ts +153 -0
- package/dist/modules/zk/ZKModule.d.ts.map +1 -0
- package/dist/modules/zk/ZKModule.js +262 -0
- package/dist/modules/zk/index.d.ts +7 -0
- package/dist/modules/zk/index.d.ts.map +1 -0
- package/dist/modules/zk/index.js +4 -0
- package/dist/thirdweb/BridgeClient.d.ts +228 -0
- package/dist/thirdweb/BridgeClient.d.ts.map +1 -0
- package/dist/thirdweb/BridgeClient.js +160 -0
- package/dist/thirdweb/EngineClient.d.ts +396 -0
- package/dist/thirdweb/EngineClient.d.ts.map +1 -0
- package/dist/thirdweb/EngineClient.js +386 -0
- package/dist/thirdweb/GatewayClient.d.ts +190 -0
- package/dist/thirdweb/GatewayClient.d.ts.map +1 -0
- package/dist/thirdweb/GatewayClient.js +257 -0
- package/dist/thirdweb/NebulaClient.d.ts +292 -0
- package/dist/thirdweb/NebulaClient.d.ts.map +1 -0
- package/dist/thirdweb/NebulaClient.js +180 -0
- package/dist/thirdweb/StorageClient.d.ts +445 -0
- package/dist/thirdweb/StorageClient.d.ts.map +1 -0
- package/dist/thirdweb/StorageClient.js +405 -0
- package/dist/thirdweb/ThirdwebWrapper.d.ts +236 -0
- package/dist/thirdweb/ThirdwebWrapper.d.ts.map +1 -0
- package/dist/thirdweb/ThirdwebWrapper.js +332 -0
- package/dist/thirdweb/index.d.ts +21 -0
- package/dist/thirdweb/index.d.ts.map +1 -0
- package/dist/thirdweb/index.js +28 -0
- package/dist/thirdweb/varity-chain.d.ts +48 -0
- package/dist/thirdweb/varity-chain.d.ts.map +1 -0
- package/dist/thirdweb/varity-chain.js +64 -0
- package/dist/thirdweb/x402Client.d.ts +319 -0
- package/dist/thirdweb/x402Client.d.ts.map +1 -0
- package/dist/thirdweb/x402Client.js +223 -0
- package/dist/tracking/gasTracker.d.ts +158 -0
- package/dist/tracking/gasTracker.d.ts.map +1 -0
- package/dist/tracking/gasTracker.js +227 -0
- package/dist/tracking/index.d.ts +10 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +8 -0
- package/dist/tracking/types.d.ts +327 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +8 -0
- package/dist/ui/components/ChartWidget.d.ts +36 -0
- package/dist/ui/components/ChartWidget.d.ts.map +1 -0
- package/dist/ui/components/ChartWidget.js +82 -0
- package/dist/ui/components/DashboardLayout.d.ts +41 -0
- package/dist/ui/components/DashboardLayout.d.ts.map +1 -0
- package/dist/ui/components/DashboardLayout.js +102 -0
- package/dist/ui/components/DataTable.d.ts +49 -0
- package/dist/ui/components/DataTable.d.ts.map +1 -0
- package/dist/ui/components/DataTable.js +96 -0
- package/dist/ui/components/EntityForm.d.ts +60 -0
- package/dist/ui/components/EntityForm.d.ts.map +1 -0
- package/dist/ui/components/EntityForm.js +182 -0
- package/dist/ui/components/KPICard.d.ts +29 -0
- package/dist/ui/components/KPICard.d.ts.map +1 -0
- package/dist/ui/components/KPICard.js +61 -0
- package/dist/ui/components/Modal.d.ts +34 -0
- package/dist/ui/components/Modal.d.ts.map +1 -0
- package/dist/ui/components/Modal.js +30 -0
- package/dist/ui/components/index.d.ts +18 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +11 -0
- package/dist/validation/template-validator.d.ts +25 -0
- package/dist/validation/template-validator.d.ts.map +1 -0
- package/dist/validation/template-validator.js +305 -0
- package/package.json +102 -0
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Varity SDK - Metadata Store
|
|
3
|
+
*
|
|
4
|
+
* Persistent storage for tiering metadata with support for multiple backends.
|
|
5
|
+
* Enables cross-instance consistency and historical tracking of tier transitions.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Multiple storage backends (in-memory, file, IPFS, SQL)
|
|
9
|
+
* - Atomic updates
|
|
10
|
+
* - Batch operations
|
|
11
|
+
* - Historical tracking
|
|
12
|
+
* - Efficient querying
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import { StorageLayer, StorageTier } from '@varity-labs/types';
|
|
17
|
+
/**
|
|
18
|
+
* Storage backend type
|
|
19
|
+
*/
|
|
20
|
+
export var MetadataBackend;
|
|
21
|
+
(function (MetadataBackend) {
|
|
22
|
+
/** In-memory storage (not persistent) */
|
|
23
|
+
MetadataBackend["MEMORY"] = "memory";
|
|
24
|
+
/** File-based storage (JSON) */
|
|
25
|
+
MetadataBackend["FILE"] = "file";
|
|
26
|
+
/** IPFS/Filecoin storage */
|
|
27
|
+
MetadataBackend["IPFS"] = "ipfs";
|
|
28
|
+
/** SQL database (SQLite, PostgreSQL, etc.) */
|
|
29
|
+
MetadataBackend["SQL"] = "sql";
|
|
30
|
+
})(MetadataBackend || (MetadataBackend = {}));
|
|
31
|
+
/**
|
|
32
|
+
* Persistent metadata store for tiering system
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const store = new MetadataStore({
|
|
37
|
+
* backend: MetadataBackend.FILE,
|
|
38
|
+
* backendOptions: {
|
|
39
|
+
* filePath: './tiering-metadata.json'
|
|
40
|
+
* },
|
|
41
|
+
* enableBackups: true
|
|
42
|
+
* })
|
|
43
|
+
*
|
|
44
|
+
* await store.initialize()
|
|
45
|
+
*
|
|
46
|
+
* // Save metadata
|
|
47
|
+
* await store.save('obj-123', {
|
|
48
|
+
* identifier: 'obj-123',
|
|
49
|
+
* tier: StorageTier.HOT,
|
|
50
|
+
* layer: StorageLayer.CUSTOMER_DATA,
|
|
51
|
+
* size: 1024 * 1024,
|
|
52
|
+
* createdAt: new Date(),
|
|
53
|
+
* lastAccessed: new Date(),
|
|
54
|
+
* accessCount: 1
|
|
55
|
+
* })
|
|
56
|
+
*
|
|
57
|
+
* // Load metadata
|
|
58
|
+
* const metadata = await store.load('obj-123')
|
|
59
|
+
* console.log(`Tier: ${metadata?.tier}`)
|
|
60
|
+
*
|
|
61
|
+
* // Query metadata
|
|
62
|
+
* const hotObjects = await store.query({
|
|
63
|
+
* tier: StorageTier.HOT,
|
|
64
|
+
* limit: 10
|
|
65
|
+
* })
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export class MetadataStore {
|
|
69
|
+
constructor(config) {
|
|
70
|
+
this.initialized = false;
|
|
71
|
+
this.backupInterval = null;
|
|
72
|
+
this.config = {
|
|
73
|
+
backend: config.backend,
|
|
74
|
+
backendOptions: config.backendOptions || {},
|
|
75
|
+
enableBackups: config.enableBackups ?? false,
|
|
76
|
+
backupIntervalMinutes: config.backupIntervalMinutes ?? 60,
|
|
77
|
+
enableCompression: config.enableCompression ?? false,
|
|
78
|
+
cacheTTL: config.cacheTTL ?? 5 * 60 * 1000 // 5 minutes
|
|
79
|
+
};
|
|
80
|
+
this.cache = new Map();
|
|
81
|
+
this.memoryStore = new Map();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Initialize the metadata store
|
|
85
|
+
*/
|
|
86
|
+
async initialize() {
|
|
87
|
+
if (this.initialized)
|
|
88
|
+
return;
|
|
89
|
+
switch (this.config.backend) {
|
|
90
|
+
case MetadataBackend.MEMORY:
|
|
91
|
+
// No initialization needed for memory backend
|
|
92
|
+
break;
|
|
93
|
+
case MetadataBackend.FILE:
|
|
94
|
+
await this.initializeFileBackend();
|
|
95
|
+
break;
|
|
96
|
+
case MetadataBackend.IPFS:
|
|
97
|
+
await this.initializeIPFSBackend();
|
|
98
|
+
break;
|
|
99
|
+
case MetadataBackend.SQL:
|
|
100
|
+
await this.initializeSQLBackend();
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
// Start backup process if enabled
|
|
104
|
+
if (this.config.enableBackups) {
|
|
105
|
+
this.startBackupProcess();
|
|
106
|
+
}
|
|
107
|
+
this.initialized = true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Save metadata for an object
|
|
111
|
+
*
|
|
112
|
+
* @param identifier - Object identifier
|
|
113
|
+
* @param metadata - Tiering metadata
|
|
114
|
+
*/
|
|
115
|
+
async save(identifier, metadata) {
|
|
116
|
+
if (!this.initialized) {
|
|
117
|
+
throw new Error('MetadataStore not initialized. Call initialize() first.');
|
|
118
|
+
}
|
|
119
|
+
// Update memory store
|
|
120
|
+
this.memoryStore.set(identifier, metadata);
|
|
121
|
+
// Invalidate cache
|
|
122
|
+
this.cache.delete(identifier);
|
|
123
|
+
// Persist to backend
|
|
124
|
+
await this.persistToBackend(identifier, metadata);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Load metadata for an object
|
|
128
|
+
*
|
|
129
|
+
* @param identifier - Object identifier
|
|
130
|
+
* @returns Tiering metadata or null if not found
|
|
131
|
+
*/
|
|
132
|
+
async load(identifier) {
|
|
133
|
+
if (!this.initialized) {
|
|
134
|
+
throw new Error('MetadataStore not initialized. Call initialize() first.');
|
|
135
|
+
}
|
|
136
|
+
// Check cache first
|
|
137
|
+
const cached = this.cache.get(identifier);
|
|
138
|
+
if (cached && Date.now() - cached.timestamp < this.config.cacheTTL) {
|
|
139
|
+
return cached.metadata;
|
|
140
|
+
}
|
|
141
|
+
// Check memory store
|
|
142
|
+
let metadata = this.memoryStore.get(identifier) || null;
|
|
143
|
+
// Load from backend if not in memory
|
|
144
|
+
if (!metadata) {
|
|
145
|
+
metadata = await this.loadFromBackend(identifier);
|
|
146
|
+
if (metadata) {
|
|
147
|
+
this.memoryStore.set(identifier, metadata);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Update cache
|
|
151
|
+
if (metadata) {
|
|
152
|
+
this.cache.set(identifier, {
|
|
153
|
+
metadata,
|
|
154
|
+
timestamp: Date.now()
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return metadata;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Delete metadata for an object
|
|
161
|
+
*
|
|
162
|
+
* @param identifier - Object identifier
|
|
163
|
+
*/
|
|
164
|
+
async delete(identifier) {
|
|
165
|
+
if (!this.initialized) {
|
|
166
|
+
throw new Error('MetadataStore not initialized. Call initialize() first.');
|
|
167
|
+
}
|
|
168
|
+
// Remove from memory and cache
|
|
169
|
+
this.memoryStore.delete(identifier);
|
|
170
|
+
this.cache.delete(identifier);
|
|
171
|
+
// Delete from backend
|
|
172
|
+
await this.deleteFromBackend(identifier);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* List all metadata entries
|
|
176
|
+
*
|
|
177
|
+
* @returns Map of all metadata
|
|
178
|
+
*/
|
|
179
|
+
async listAll() {
|
|
180
|
+
if (!this.initialized) {
|
|
181
|
+
throw new Error('MetadataStore not initialized. Call initialize() first.');
|
|
182
|
+
}
|
|
183
|
+
// Return memory store for now
|
|
184
|
+
// In production, this would load from backend
|
|
185
|
+
return new Map(this.memoryStore);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Query metadata with filters
|
|
189
|
+
*
|
|
190
|
+
* @param options - Query options
|
|
191
|
+
* @returns Filtered metadata entries
|
|
192
|
+
*/
|
|
193
|
+
async query(options = {}) {
|
|
194
|
+
const allMetadata = await this.listAll();
|
|
195
|
+
let results = Array.from(allMetadata.values());
|
|
196
|
+
// Apply filters
|
|
197
|
+
if (options.tier !== undefined) {
|
|
198
|
+
results = results.filter(m => m.tier === options.tier);
|
|
199
|
+
}
|
|
200
|
+
if (options.layer !== undefined) {
|
|
201
|
+
results = results.filter(m => m.layer === options.layer);
|
|
202
|
+
}
|
|
203
|
+
if (options.tags) {
|
|
204
|
+
results = results.filter(m => {
|
|
205
|
+
if (!m.tags)
|
|
206
|
+
return false;
|
|
207
|
+
return Object.entries(options.tags).every(([key, value]) => m.tags[key] === value);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
if (options.minSize !== undefined) {
|
|
211
|
+
results = results.filter(m => m.size >= options.minSize);
|
|
212
|
+
}
|
|
213
|
+
if (options.maxSize !== undefined) {
|
|
214
|
+
results = results.filter(m => m.size <= options.maxSize);
|
|
215
|
+
}
|
|
216
|
+
if (options.createdAfter) {
|
|
217
|
+
results = results.filter(m => m.createdAt >= options.createdAfter);
|
|
218
|
+
}
|
|
219
|
+
if (options.createdBefore) {
|
|
220
|
+
results = results.filter(m => m.createdAt <= options.createdBefore);
|
|
221
|
+
}
|
|
222
|
+
if (options.accessedAfter) {
|
|
223
|
+
results = results.filter(m => m.lastAccessed >= options.accessedAfter);
|
|
224
|
+
}
|
|
225
|
+
if (options.accessedBefore) {
|
|
226
|
+
results = results.filter(m => m.lastAccessed <= options.accessedBefore);
|
|
227
|
+
}
|
|
228
|
+
// Sort results
|
|
229
|
+
if (options.sortBy) {
|
|
230
|
+
results.sort((a, b) => {
|
|
231
|
+
let aVal;
|
|
232
|
+
let bVal;
|
|
233
|
+
switch (options.sortBy) {
|
|
234
|
+
case 'createdAt':
|
|
235
|
+
aVal = a.createdAt.getTime();
|
|
236
|
+
bVal = b.createdAt.getTime();
|
|
237
|
+
break;
|
|
238
|
+
case 'lastAccessed':
|
|
239
|
+
aVal = a.lastAccessed.getTime();
|
|
240
|
+
bVal = b.lastAccessed.getTime();
|
|
241
|
+
break;
|
|
242
|
+
case 'size':
|
|
243
|
+
aVal = a.size;
|
|
244
|
+
bVal = b.size;
|
|
245
|
+
break;
|
|
246
|
+
case 'accessCount':
|
|
247
|
+
aVal = a.accessCount;
|
|
248
|
+
bVal = b.accessCount;
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
return 0;
|
|
252
|
+
}
|
|
253
|
+
const order = options.sortOrder === 'desc' ? -1 : 1;
|
|
254
|
+
return aVal < bVal ? -order : aVal > bVal ? order : 0;
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
// Apply pagination
|
|
258
|
+
const offset = options.offset || 0;
|
|
259
|
+
const limit = options.limit || results.length;
|
|
260
|
+
results = results.slice(offset, offset + limit);
|
|
261
|
+
return results;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Batch save metadata
|
|
265
|
+
*
|
|
266
|
+
* @param entries - Array of metadata entries
|
|
267
|
+
*/
|
|
268
|
+
async batchSave(entries) {
|
|
269
|
+
if (!this.initialized) {
|
|
270
|
+
throw new Error('MetadataStore not initialized. Call initialize() first.');
|
|
271
|
+
}
|
|
272
|
+
for (const metadata of entries) {
|
|
273
|
+
this.memoryStore.set(metadata.identifier, metadata);
|
|
274
|
+
this.cache.delete(metadata.identifier);
|
|
275
|
+
}
|
|
276
|
+
await this.batchPersistToBackend(entries);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Batch update metadata
|
|
280
|
+
*
|
|
281
|
+
* @param updates - Array of batch updates
|
|
282
|
+
*/
|
|
283
|
+
async batchUpdate(updates) {
|
|
284
|
+
for (const update of updates) {
|
|
285
|
+
const existing = await this.load(update.identifier);
|
|
286
|
+
if (existing) {
|
|
287
|
+
const updated = { ...existing, ...update.updates };
|
|
288
|
+
await this.save(update.identifier, updated);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Record a tier transition
|
|
294
|
+
*
|
|
295
|
+
* @param identifier - Object identifier
|
|
296
|
+
* @param fromTier - Source tier
|
|
297
|
+
* @param toTier - Destination tier
|
|
298
|
+
* @param reason - Reason for transition
|
|
299
|
+
* @param costImpact - Cost impact of transition
|
|
300
|
+
*/
|
|
301
|
+
async recordTierTransition(identifier, fromTier, toTier, reason, costImpact = 0) {
|
|
302
|
+
const metadata = await this.load(identifier);
|
|
303
|
+
if (!metadata)
|
|
304
|
+
return;
|
|
305
|
+
const transition = {
|
|
306
|
+
timestamp: new Date(),
|
|
307
|
+
fromTier,
|
|
308
|
+
toTier,
|
|
309
|
+
reason,
|
|
310
|
+
costImpact
|
|
311
|
+
};
|
|
312
|
+
metadata.tier = toTier;
|
|
313
|
+
metadata.lastTierChange = transition.timestamp;
|
|
314
|
+
if (!metadata.tierHistory) {
|
|
315
|
+
metadata.tierHistory = [];
|
|
316
|
+
}
|
|
317
|
+
metadata.tierHistory.push(transition);
|
|
318
|
+
// Keep only last 10 transitions
|
|
319
|
+
if (metadata.tierHistory.length > 10) {
|
|
320
|
+
metadata.tierHistory = metadata.tierHistory.slice(-10);
|
|
321
|
+
}
|
|
322
|
+
await this.save(identifier, metadata);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Get statistics about stored metadata
|
|
326
|
+
*
|
|
327
|
+
* @returns Metadata store statistics
|
|
328
|
+
*/
|
|
329
|
+
async getStats() {
|
|
330
|
+
const allMetadata = await this.listAll();
|
|
331
|
+
const byTier = {
|
|
332
|
+
[StorageTier.HOT]: 0,
|
|
333
|
+
[StorageTier.WARM]: 0,
|
|
334
|
+
[StorageTier.COLD]: 0,
|
|
335
|
+
[StorageTier.GLACIER]: 0
|
|
336
|
+
};
|
|
337
|
+
const byLayer = {
|
|
338
|
+
[StorageLayer.VARITY_INTERNAL]: 0,
|
|
339
|
+
[StorageLayer.INDUSTRY_RAG]: 0,
|
|
340
|
+
[StorageLayer.CUSTOMER_DATA]: 0
|
|
341
|
+
};
|
|
342
|
+
let totalSize = 0;
|
|
343
|
+
for (const metadata of allMetadata.values()) {
|
|
344
|
+
byTier[metadata.tier]++;
|
|
345
|
+
byLayer[metadata.layer]++;
|
|
346
|
+
totalSize += metadata.size;
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
totalEntries: allMetadata.size,
|
|
350
|
+
byTier,
|
|
351
|
+
byLayer,
|
|
352
|
+
totalSize,
|
|
353
|
+
lastUpdate: new Date(),
|
|
354
|
+
backend: this.config.backend
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Export metadata to JSON
|
|
359
|
+
*
|
|
360
|
+
* @returns JSON string
|
|
361
|
+
*/
|
|
362
|
+
async exportToJSON() {
|
|
363
|
+
const allMetadata = await this.listAll();
|
|
364
|
+
const data = {};
|
|
365
|
+
for (const [identifier, metadata] of allMetadata.entries()) {
|
|
366
|
+
data[identifier] = metadata;
|
|
367
|
+
}
|
|
368
|
+
return JSON.stringify(data, null, 2);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Import metadata from JSON
|
|
372
|
+
*
|
|
373
|
+
* @param json - JSON string
|
|
374
|
+
*/
|
|
375
|
+
async importFromJSON(json) {
|
|
376
|
+
const data = JSON.parse(json);
|
|
377
|
+
const entries = [];
|
|
378
|
+
for (const [identifier, metadata] of Object.entries(data)) {
|
|
379
|
+
// Convert date strings back to Date objects
|
|
380
|
+
entries.push({
|
|
381
|
+
...metadata,
|
|
382
|
+
createdAt: new Date(metadata.createdAt),
|
|
383
|
+
lastAccessed: new Date(metadata.lastAccessed),
|
|
384
|
+
lastTierChange: metadata.lastTierChange
|
|
385
|
+
? new Date(metadata.lastTierChange)
|
|
386
|
+
: undefined,
|
|
387
|
+
tierHistory: metadata.tierHistory?.map(t => ({
|
|
388
|
+
...t,
|
|
389
|
+
timestamp: new Date(t.timestamp)
|
|
390
|
+
}))
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
await this.batchSave(entries);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Clear all metadata
|
|
397
|
+
*/
|
|
398
|
+
async clear() {
|
|
399
|
+
this.memoryStore.clear();
|
|
400
|
+
this.cache.clear();
|
|
401
|
+
// Clear backend storage
|
|
402
|
+
await this.clearBackend();
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Destroy the metadata store and clean up resources
|
|
406
|
+
*/
|
|
407
|
+
destroy() {
|
|
408
|
+
if (this.backupInterval) {
|
|
409
|
+
clearInterval(this.backupInterval);
|
|
410
|
+
this.backupInterval = null;
|
|
411
|
+
}
|
|
412
|
+
this.memoryStore.clear();
|
|
413
|
+
this.cache.clear();
|
|
414
|
+
this.initialized = false;
|
|
415
|
+
}
|
|
416
|
+
// ========================================================================
|
|
417
|
+
// Backend-specific methods
|
|
418
|
+
// ========================================================================
|
|
419
|
+
async initializeFileBackend() {
|
|
420
|
+
const filePath = this.config.backendOptions.filePath || './tiering-metadata.json';
|
|
421
|
+
// Try to load existing file
|
|
422
|
+
try {
|
|
423
|
+
const fs = await import('fs/promises');
|
|
424
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
425
|
+
await this.importFromJSON(data);
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
// File doesn't exist or is invalid, start fresh
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
async initializeIPFSBackend() {
|
|
432
|
+
// IPFS backend initialization would go here
|
|
433
|
+
// For now, fall back to memory
|
|
434
|
+
console.warn('IPFS backend not yet implemented, using memory backend');
|
|
435
|
+
}
|
|
436
|
+
async initializeSQLBackend() {
|
|
437
|
+
// SQL backend initialization would go here
|
|
438
|
+
// For now, fall back to memory
|
|
439
|
+
console.warn('SQL backend not yet implemented, using memory backend');
|
|
440
|
+
}
|
|
441
|
+
async persistToBackend(identifier, metadata) {
|
|
442
|
+
switch (this.config.backend) {
|
|
443
|
+
case MetadataBackend.FILE:
|
|
444
|
+
await this.persistToFile();
|
|
445
|
+
break;
|
|
446
|
+
case MetadataBackend.IPFS:
|
|
447
|
+
// IPFS persistence
|
|
448
|
+
break;
|
|
449
|
+
case MetadataBackend.SQL:
|
|
450
|
+
// SQL persistence
|
|
451
|
+
break;
|
|
452
|
+
default:
|
|
453
|
+
// Memory backend - no persistence needed
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
async loadFromBackend(identifier) {
|
|
458
|
+
// Already loaded in memory during initialization
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
461
|
+
async deleteFromBackend(identifier) {
|
|
462
|
+
switch (this.config.backend) {
|
|
463
|
+
case MetadataBackend.FILE:
|
|
464
|
+
await this.persistToFile();
|
|
465
|
+
break;
|
|
466
|
+
default:
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
async batchPersistToBackend(entries) {
|
|
471
|
+
switch (this.config.backend) {
|
|
472
|
+
case MetadataBackend.FILE:
|
|
473
|
+
await this.persistToFile();
|
|
474
|
+
break;
|
|
475
|
+
default:
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
async clearBackend() {
|
|
480
|
+
switch (this.config.backend) {
|
|
481
|
+
case MetadataBackend.FILE:
|
|
482
|
+
await this.persistToFile();
|
|
483
|
+
break;
|
|
484
|
+
default:
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
async persistToFile() {
|
|
489
|
+
const filePath = this.config.backendOptions.filePath || './tiering-metadata.json';
|
|
490
|
+
try {
|
|
491
|
+
const fs = await import('fs/promises');
|
|
492
|
+
const json = await this.exportToJSON();
|
|
493
|
+
await fs.writeFile(filePath, json, 'utf-8');
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
console.error('Failed to persist to file:', error);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
startBackupProcess() {
|
|
500
|
+
const intervalMs = this.config.backupIntervalMinutes * 60 * 1000;
|
|
501
|
+
this.backupInterval = setInterval(async () => {
|
|
502
|
+
try {
|
|
503
|
+
await this.createBackup();
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
console.error('Backup failed:', error);
|
|
507
|
+
}
|
|
508
|
+
}, intervalMs);
|
|
509
|
+
}
|
|
510
|
+
async createBackup() {
|
|
511
|
+
if (this.config.backend === MetadataBackend.FILE) {
|
|
512
|
+
const filePath = this.config.backendOptions.filePath || './tiering-metadata.json';
|
|
513
|
+
const backupPath = `${filePath}.backup.${Date.now()}`;
|
|
514
|
+
try {
|
|
515
|
+
const fs = await import('fs/promises');
|
|
516
|
+
const json = await this.exportToJSON();
|
|
517
|
+
await fs.writeFile(backupPath, json, 'utf-8');
|
|
518
|
+
// Clean up old backups (keep last 5)
|
|
519
|
+
const dir = filePath.substring(0, filePath.lastIndexOf('/') || 0) || '.';
|
|
520
|
+
const files = await fs.readdir(dir);
|
|
521
|
+
const backups = files
|
|
522
|
+
.filter(f => f.startsWith('tiering-metadata.json.backup'))
|
|
523
|
+
.sort();
|
|
524
|
+
if (backups.length > 5) {
|
|
525
|
+
for (const backup of backups.slice(0, backups.length - 5)) {
|
|
526
|
+
await fs.unlink(`${dir}/${backup}`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
console.error('Backup creation failed:', error);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|