@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,430 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Varity SDK - Multi-Tier Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements intelligent hot/cold storage tiering with automatic promotion/demotion
|
|
5
|
+
* based on access patterns. Optimizes costs while maintaining performance.
|
|
6
|
+
*/
|
|
7
|
+
import { StorageBackend, StorageLayer, StorageTier } from '@varity-labs/types';
|
|
8
|
+
import { BaseStorageAdapter } from './IStorageAdapter';
|
|
9
|
+
import { FilecoinAdapter } from './FilecoinAdapter';
|
|
10
|
+
/**
|
|
11
|
+
* Multi-tier storage adapter with automatic cost optimization
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - Hot/Cold tier management
|
|
15
|
+
* - Automatic tier transitions based on access patterns
|
|
16
|
+
* - Access tracking and analytics
|
|
17
|
+
* - Cost optimization through intelligent tiering
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const config: MultiTierStorageConfig = {
|
|
22
|
+
* hotTier: { backend: StorageBackend.FILECOIN_IPFS, replication: 3 },
|
|
23
|
+
* coldTier: { backend: StorageBackend.FILECOIN_IPFS, replication: 2 },
|
|
24
|
+
* autoTiering: {
|
|
25
|
+
* enabled: true,
|
|
26
|
+
* policy: TieringPolicy.ACCESS_BASED,
|
|
27
|
+
* checkInterval: 24
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* const adapter = new MultiTierAdapter(sdk, config)
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class MultiTierAdapter extends BaseStorageAdapter {
|
|
34
|
+
constructor(sdk, config) {
|
|
35
|
+
super(StorageBackend.MULTI_TIER);
|
|
36
|
+
this.autoTieringInterval = null;
|
|
37
|
+
this.sdk = sdk;
|
|
38
|
+
this.config = config;
|
|
39
|
+
this.hotTierAdapter = new FilecoinAdapter(sdk);
|
|
40
|
+
this.coldTierAdapter = new FilecoinAdapter(sdk);
|
|
41
|
+
this.tieringMetadata = new Map();
|
|
42
|
+
// Start auto-tiering background process if enabled
|
|
43
|
+
if (this.config.autoTiering.enabled) {
|
|
44
|
+
this.startAutoTiering();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Upload to appropriate tier based on options or auto-tiering rules
|
|
49
|
+
*
|
|
50
|
+
* @param data - Data to upload
|
|
51
|
+
* @param options - Upload options
|
|
52
|
+
* @returns Storage result with tier information
|
|
53
|
+
*/
|
|
54
|
+
async upload(data, options) {
|
|
55
|
+
const targetTier = options.tier || this.determineInitialTier(data, options);
|
|
56
|
+
const adapter = this.getAdapterForTier(targetTier);
|
|
57
|
+
const result = await adapter.upload(data, {
|
|
58
|
+
...options,
|
|
59
|
+
tier: targetTier
|
|
60
|
+
});
|
|
61
|
+
// Store tiering metadata
|
|
62
|
+
this.tieringMetadata.set(result.identifier, {
|
|
63
|
+
tier: targetTier,
|
|
64
|
+
lastAccessed: new Date(),
|
|
65
|
+
accessCount: 1,
|
|
66
|
+
createdAt: new Date(),
|
|
67
|
+
size: result.size,
|
|
68
|
+
layer: options.layer
|
|
69
|
+
});
|
|
70
|
+
// Persist metadata to storage (optional, for cross-instance consistency)
|
|
71
|
+
await this.persistMetadata(result.identifier);
|
|
72
|
+
return {
|
|
73
|
+
...result,
|
|
74
|
+
tier: targetTier
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Download from appropriate tier, update access metadata
|
|
79
|
+
*
|
|
80
|
+
* @param identifier - Storage identifier
|
|
81
|
+
* @returns Downloaded data
|
|
82
|
+
*/
|
|
83
|
+
async download(identifier) {
|
|
84
|
+
const metadata = await this.loadMetadata(identifier);
|
|
85
|
+
const currentTier = metadata?.tier || StorageTier.COLD;
|
|
86
|
+
const adapter = this.getAdapterForTier(currentTier);
|
|
87
|
+
const data = await adapter.download(identifier);
|
|
88
|
+
// Update access metadata
|
|
89
|
+
if (metadata) {
|
|
90
|
+
metadata.lastAccessed = new Date();
|
|
91
|
+
metadata.accessCount++;
|
|
92
|
+
// Consider promoting to hot tier if access threshold exceeded
|
|
93
|
+
if (this.config.autoTiering.enabled &&
|
|
94
|
+
currentTier === StorageTier.COLD &&
|
|
95
|
+
this.shouldPromote(metadata)) {
|
|
96
|
+
// Schedule promotion (don't block download)
|
|
97
|
+
this.schedulePromotion(identifier, StorageTier.HOT);
|
|
98
|
+
}
|
|
99
|
+
await this.persistMetadata(identifier);
|
|
100
|
+
}
|
|
101
|
+
return data;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Delete from all tiers
|
|
105
|
+
*
|
|
106
|
+
* @param identifier - Storage identifier
|
|
107
|
+
*/
|
|
108
|
+
async delete(identifier) {
|
|
109
|
+
const metadata = await this.loadMetadata(identifier);
|
|
110
|
+
const currentTier = metadata?.tier || StorageTier.COLD;
|
|
111
|
+
const adapter = this.getAdapterForTier(currentTier);
|
|
112
|
+
await adapter.delete(identifier);
|
|
113
|
+
// Clean up metadata
|
|
114
|
+
this.tieringMetadata.delete(identifier);
|
|
115
|
+
await this.deleteMetadata(identifier);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if object exists in any tier
|
|
119
|
+
*
|
|
120
|
+
* @param identifier - Storage identifier
|
|
121
|
+
* @returns True if exists
|
|
122
|
+
*/
|
|
123
|
+
async exists(identifier) {
|
|
124
|
+
// Check hot tier first (faster)
|
|
125
|
+
const hotExists = await this.hotTierAdapter.exists(identifier);
|
|
126
|
+
if (hotExists)
|
|
127
|
+
return true;
|
|
128
|
+
// Check cold tier
|
|
129
|
+
return await this.coldTierAdapter.exists(identifier);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* List objects across all tiers
|
|
133
|
+
*
|
|
134
|
+
* @param options - List options
|
|
135
|
+
* @returns Array of storage items
|
|
136
|
+
*/
|
|
137
|
+
async list(options) {
|
|
138
|
+
// Combine results from all tiers
|
|
139
|
+
const [hotItems, coldItems] = await Promise.all([
|
|
140
|
+
this.hotTierAdapter.list(options),
|
|
141
|
+
this.coldTierAdapter.list(options)
|
|
142
|
+
]);
|
|
143
|
+
// Deduplicate and merge
|
|
144
|
+
const itemMap = new Map();
|
|
145
|
+
for (const item of [...hotItems, ...coldItems]) {
|
|
146
|
+
if (!itemMap.has(item.key)) {
|
|
147
|
+
itemMap.set(item.key, item);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return Array.from(itemMap.values());
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get metadata for an object
|
|
154
|
+
*
|
|
155
|
+
* @param identifier - Storage identifier
|
|
156
|
+
* @returns Storage metadata
|
|
157
|
+
*/
|
|
158
|
+
async getMetadata(identifier) {
|
|
159
|
+
const metadata = await this.loadMetadata(identifier);
|
|
160
|
+
const currentTier = metadata?.tier || StorageTier.COLD;
|
|
161
|
+
const adapter = this.getAdapterForTier(currentTier);
|
|
162
|
+
const storageMetadata = await adapter.getMetadata(identifier);
|
|
163
|
+
return {
|
|
164
|
+
...storageMetadata,
|
|
165
|
+
tier: currentTier,
|
|
166
|
+
accessCount: metadata?.accessCount,
|
|
167
|
+
lastAccessed: metadata?.lastAccessed
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Promote object to a hotter tier
|
|
172
|
+
*
|
|
173
|
+
* @param identifier - Storage identifier
|
|
174
|
+
* @param targetTier - Target tier
|
|
175
|
+
*/
|
|
176
|
+
async promoteTier(identifier, targetTier) {
|
|
177
|
+
const metadata = await this.loadMetadata(identifier);
|
|
178
|
+
if (!metadata || metadata.tier === targetTier)
|
|
179
|
+
return;
|
|
180
|
+
// Download from current tier
|
|
181
|
+
const data = await this.download(identifier);
|
|
182
|
+
// Upload to target tier
|
|
183
|
+
const targetAdapter = this.getAdapterForTier(targetTier);
|
|
184
|
+
await targetAdapter.upload(data, {
|
|
185
|
+
layer: metadata.layer,
|
|
186
|
+
tier: targetTier
|
|
187
|
+
});
|
|
188
|
+
// Delete from old tier
|
|
189
|
+
const oldAdapter = this.getAdapterForTier(metadata.tier);
|
|
190
|
+
await oldAdapter.delete(identifier);
|
|
191
|
+
// Update metadata
|
|
192
|
+
metadata.tier = targetTier;
|
|
193
|
+
this.tieringMetadata.set(identifier, metadata);
|
|
194
|
+
await this.persistMetadata(identifier);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Demote object to a colder tier (for cost optimization)
|
|
198
|
+
*
|
|
199
|
+
* @param identifier - Storage identifier
|
|
200
|
+
* @param targetTier - Target tier
|
|
201
|
+
*/
|
|
202
|
+
async demoteTier(identifier, targetTier) {
|
|
203
|
+
await this.promoteTier(identifier, targetTier); // Same logic
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get access URL for an object
|
|
207
|
+
*
|
|
208
|
+
* @param identifier - Storage identifier
|
|
209
|
+
* @param expiresIn - Expiration time in seconds
|
|
210
|
+
* @returns Gateway URL
|
|
211
|
+
*/
|
|
212
|
+
async getAccessUrl(identifier, expiresIn) {
|
|
213
|
+
const metadata = await this.loadMetadata(identifier);
|
|
214
|
+
const currentTier = metadata?.tier || StorageTier.COLD;
|
|
215
|
+
const adapter = this.getAdapterForTier(currentTier);
|
|
216
|
+
return adapter.getAccessUrl(identifier, expiresIn);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Health check for multi-tier backend
|
|
220
|
+
*
|
|
221
|
+
* @returns Combined health status
|
|
222
|
+
*/
|
|
223
|
+
async healthCheck() {
|
|
224
|
+
const startTime = Date.now();
|
|
225
|
+
try {
|
|
226
|
+
const [hotHealth, coldHealth] = await Promise.all([
|
|
227
|
+
this.hotTierAdapter.healthCheck(),
|
|
228
|
+
this.coldTierAdapter.healthCheck()
|
|
229
|
+
]);
|
|
230
|
+
const healthy = hotHealth.healthy && coldHealth.healthy;
|
|
231
|
+
const latencyMs = Date.now() - startTime;
|
|
232
|
+
return {
|
|
233
|
+
healthy,
|
|
234
|
+
latencyMs,
|
|
235
|
+
error: !healthy
|
|
236
|
+
? `Hot tier: ${hotHealth.error || 'OK'}, Cold tier: ${coldHealth.error || 'OK'}`
|
|
237
|
+
: undefined
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
return {
|
|
242
|
+
healthy: false,
|
|
243
|
+
latencyMs: Date.now() - startTime,
|
|
244
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Determine initial tier based on data size and options
|
|
250
|
+
*
|
|
251
|
+
* @param data - Data to upload
|
|
252
|
+
* @param options - Upload options
|
|
253
|
+
* @returns Recommended tier
|
|
254
|
+
*/
|
|
255
|
+
determineInitialTier(data, options) {
|
|
256
|
+
let size = 0;
|
|
257
|
+
if (data instanceof Buffer) {
|
|
258
|
+
size = data.length;
|
|
259
|
+
}
|
|
260
|
+
else if (data instanceof Blob) {
|
|
261
|
+
size = data.size;
|
|
262
|
+
}
|
|
263
|
+
else if (typeof data === 'string') {
|
|
264
|
+
size = Buffer.from(data).length;
|
|
265
|
+
}
|
|
266
|
+
// Small files go to hot tier by default
|
|
267
|
+
const sizeThresholdMB = 1; // 1MB threshold
|
|
268
|
+
if (size < sizeThresholdMB * 1024 * 1024) {
|
|
269
|
+
return StorageTier.HOT;
|
|
270
|
+
}
|
|
271
|
+
// Large files go to cold tier
|
|
272
|
+
return StorageTier.COLD;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get adapter for a specific tier
|
|
276
|
+
*
|
|
277
|
+
* @param tier - Storage tier
|
|
278
|
+
* @returns Adapter instance
|
|
279
|
+
*/
|
|
280
|
+
getAdapterForTier(tier) {
|
|
281
|
+
return tier === StorageTier.HOT ? this.hotTierAdapter : this.coldTierAdapter;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Check if object should be promoted to hot tier
|
|
285
|
+
*
|
|
286
|
+
* @param metadata - Tiering metadata
|
|
287
|
+
* @returns True if should promote
|
|
288
|
+
*/
|
|
289
|
+
shouldPromote(metadata) {
|
|
290
|
+
const accessThreshold = 5; // Configurable threshold
|
|
291
|
+
return metadata.accessCount >= accessThreshold;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Check if object should be demoted to cold tier
|
|
295
|
+
*
|
|
296
|
+
* @param metadata - Tiering metadata
|
|
297
|
+
* @returns True if should demote
|
|
298
|
+
*/
|
|
299
|
+
shouldDemote(metadata) {
|
|
300
|
+
const daysSinceAccess = (Date.now() - metadata.lastAccessed.getTime()) / (24 * 60 * 60 * 1000);
|
|
301
|
+
const threshold = 30; // 30 days without access
|
|
302
|
+
return daysSinceAccess >= threshold;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Schedule promotion for an object
|
|
306
|
+
*
|
|
307
|
+
* @param identifier - Storage identifier
|
|
308
|
+
* @param targetTier - Target tier
|
|
309
|
+
*/
|
|
310
|
+
async schedulePromotion(identifier, targetTier) {
|
|
311
|
+
// In a production system, this would use a job queue
|
|
312
|
+
// For now, we'll do it synchronously in the background
|
|
313
|
+
setTimeout(async () => {
|
|
314
|
+
try {
|
|
315
|
+
await this.promoteTier(identifier, targetTier);
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
console.error(`Failed to promote ${identifier} to ${targetTier}:`, error);
|
|
319
|
+
}
|
|
320
|
+
}, 0);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Start auto-tiering background process
|
|
324
|
+
*/
|
|
325
|
+
startAutoTiering() {
|
|
326
|
+
const checkIntervalHours = this.config.autoTiering.checkInterval || 24;
|
|
327
|
+
const intervalMs = checkIntervalHours * 60 * 60 * 1000;
|
|
328
|
+
this.autoTieringInterval = setInterval(() => {
|
|
329
|
+
this.runAutoTiering();
|
|
330
|
+
}, intervalMs);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Stop auto-tiering background process
|
|
334
|
+
*/
|
|
335
|
+
stopAutoTiering() {
|
|
336
|
+
if (this.autoTieringInterval) {
|
|
337
|
+
clearInterval(this.autoTieringInterval);
|
|
338
|
+
this.autoTieringInterval = null;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Run auto-tiering checks for all objects
|
|
343
|
+
*/
|
|
344
|
+
async runAutoTiering() {
|
|
345
|
+
for (const [identifier, metadata] of this.tieringMetadata.entries()) {
|
|
346
|
+
try {
|
|
347
|
+
// Check for demotion (hot -> cold)
|
|
348
|
+
if (metadata.tier === StorageTier.HOT && this.shouldDemote(metadata)) {
|
|
349
|
+
await this.demoteTier(identifier, StorageTier.COLD);
|
|
350
|
+
}
|
|
351
|
+
// Promotion is handled on-demand during download
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
console.error(`Auto-tiering failed for ${identifier}:`, error);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Persist metadata to storage
|
|
360
|
+
*
|
|
361
|
+
* @param identifier - Storage identifier
|
|
362
|
+
*/
|
|
363
|
+
async persistMetadata(identifier) {
|
|
364
|
+
const metadata = this.tieringMetadata.get(identifier);
|
|
365
|
+
if (!metadata)
|
|
366
|
+
return;
|
|
367
|
+
// Store metadata in a special metadata layer
|
|
368
|
+
const metadataKey = `metadata:${identifier}`;
|
|
369
|
+
try {
|
|
370
|
+
await this.hotTierAdapter.upload(Buffer.from(JSON.stringify(metadata)), {
|
|
371
|
+
layer: StorageLayer.VARITY_INTERNAL,
|
|
372
|
+
tier: StorageTier.HOT,
|
|
373
|
+
metadata: { type: 'tiering-metadata' }
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
console.error(`Failed to persist metadata for ${identifier}:`, error);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Load metadata from storage
|
|
382
|
+
*
|
|
383
|
+
* @param identifier - Storage identifier
|
|
384
|
+
* @returns Tiering metadata or null
|
|
385
|
+
*/
|
|
386
|
+
async loadMetadata(identifier) {
|
|
387
|
+
// Check in-memory cache first
|
|
388
|
+
let metadata = this.tieringMetadata.get(identifier);
|
|
389
|
+
if (metadata)
|
|
390
|
+
return metadata;
|
|
391
|
+
// Load from storage
|
|
392
|
+
const metadataKey = `metadata:${identifier}`;
|
|
393
|
+
try {
|
|
394
|
+
const data = await this.hotTierAdapter.download(metadataKey);
|
|
395
|
+
metadata = JSON.parse(data.toString());
|
|
396
|
+
if (metadata) {
|
|
397
|
+
// Convert date strings back to Date objects
|
|
398
|
+
metadata.lastAccessed = new Date(metadata.lastAccessed);
|
|
399
|
+
metadata.createdAt = new Date(metadata.createdAt);
|
|
400
|
+
this.tieringMetadata.set(identifier, metadata);
|
|
401
|
+
return metadata;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
// Metadata not found, object might be in cold tier
|
|
406
|
+
}
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Delete metadata from storage
|
|
411
|
+
*
|
|
412
|
+
* @param identifier - Storage identifier
|
|
413
|
+
*/
|
|
414
|
+
async deleteMetadata(identifier) {
|
|
415
|
+
const metadataKey = `metadata:${identifier}`;
|
|
416
|
+
try {
|
|
417
|
+
await this.hotTierAdapter.delete(metadataKey);
|
|
418
|
+
}
|
|
419
|
+
catch (error) {
|
|
420
|
+
// Ignore errors
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Clean up resources
|
|
425
|
+
*/
|
|
426
|
+
destroy() {
|
|
427
|
+
this.stopAutoTiering();
|
|
428
|
+
this.tieringMetadata.clear();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Varity SDK - Storage Adapters
|
|
3
|
+
*
|
|
4
|
+
* Export all storage adapter interfaces and implementations
|
|
5
|
+
*/
|
|
6
|
+
export { IStorageAdapter, UnsupportedOperationError, BaseStorageAdapter } from './IStorageAdapter';
|
|
7
|
+
export type { IStorageAdapter as StorageAdapter } from './IStorageAdapter';
|
|
8
|
+
export { FilecoinAdapter } from './FilecoinAdapter';
|
|
9
|
+
export { MultiTierAdapter } from './MultiTierAdapter';
|
|
10
|
+
export { AdapterFactory } from './AdapterFactory';
|
|
11
|
+
export type { AdapterFactoryConfig } from './AdapterFactory';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/storage/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EACV,eAAe,IAAI,cAAc,EAClC,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Varity SDK - Storage Adapters
|
|
3
|
+
*
|
|
4
|
+
* Export all storage adapter interfaces and implementations
|
|
5
|
+
*/
|
|
6
|
+
// Base interfaces and classes
|
|
7
|
+
export { UnsupportedOperationError, BaseStorageAdapter } from './IStorageAdapter';
|
|
8
|
+
// Adapter implementations
|
|
9
|
+
export { FilecoinAdapter } from './FilecoinAdapter';
|
|
10
|
+
export { MultiTierAdapter } from './MultiTierAdapter';
|
|
11
|
+
// Factory for creating adapters
|
|
12
|
+
export { AdapterFactory } from './AdapterFactory';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Module - Exports
|
|
3
|
+
*
|
|
4
|
+
* Exports both the main StorageModule and the new adapter architecture
|
|
5
|
+
* for advanced use cases and multi-backend support.
|
|
6
|
+
*/
|
|
7
|
+
export { StorageModule } from './StorageModule';
|
|
8
|
+
export type { UploadResult, DataPointer, Pin, PinFilters, CelestiaReceipt } from './StorageModule';
|
|
9
|
+
export { S3Module } from './S3Module';
|
|
10
|
+
export type { S3PutObjectParams, S3GetObjectParams, S3GetObjectResponse, S3DeleteObjectParams, S3ListObjectsParams, S3HeadObjectParams, S3HeadObjectResponse } from './S3Module';
|
|
11
|
+
export { IStorageAdapter, BaseStorageAdapter, UnsupportedOperationError } from './adapters/IStorageAdapter';
|
|
12
|
+
export { FilecoinAdapter } from './adapters/FilecoinAdapter';
|
|
13
|
+
export { MultiTierAdapter } from './adapters/MultiTierAdapter';
|
|
14
|
+
export { AdapterFactory } from './adapters/AdapterFactory';
|
|
15
|
+
export type { AdapterFactoryConfig } from './adapters/AdapterFactory';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EACV,YAAY,EACZ,WAAW,EACX,GAAG,EACH,UAAU,EACV,eAAe,EAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Module - Exports
|
|
3
|
+
*
|
|
4
|
+
* Exports both the main StorageModule and the new adapter architecture
|
|
5
|
+
* for advanced use cases and multi-backend support.
|
|
6
|
+
*/
|
|
7
|
+
// Main storage module (backward compatible)
|
|
8
|
+
export { StorageModule } from './StorageModule';
|
|
9
|
+
// S3-compatible storage module
|
|
10
|
+
export { S3Module } from './S3Module';
|
|
11
|
+
// NEW: Storage adapters for advanced multi-backend support
|
|
12
|
+
export { BaseStorageAdapter, UnsupportedOperationError } from './adapters/IStorageAdapter';
|
|
13
|
+
export { FilecoinAdapter } from './adapters/FilecoinAdapter';
|
|
14
|
+
export { MultiTierAdapter } from './adapters/MultiTierAdapter';
|
|
15
|
+
export { AdapterFactory } from './adapters/AdapterFactory';
|