@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.
Files changed (295) hide show
  1. package/LICENSE +31 -0
  2. package/README.md +253 -0
  3. package/dist/analytics/index.d.ts +7 -0
  4. package/dist/analytics/index.d.ts.map +1 -0
  5. package/dist/analytics/index.js +6 -0
  6. package/dist/analytics/tracker.d.ts +128 -0
  7. package/dist/analytics/tracker.d.ts.map +1 -0
  8. package/dist/analytics/tracker.js +203 -0
  9. package/dist/blockchain/BlockchainService.d.ts +100 -0
  10. package/dist/blockchain/BlockchainService.d.ts.map +1 -0
  11. package/dist/blockchain/BlockchainService.js +188 -0
  12. package/dist/blockchain/NFTLicensingService.d.ts +69 -0
  13. package/dist/blockchain/NFTLicensingService.d.ts.map +1 -0
  14. package/dist/blockchain/NFTLicensingService.js +136 -0
  15. package/dist/blockchain/RevenueSplitService.d.ts +71 -0
  16. package/dist/blockchain/RevenueSplitService.d.ts.map +1 -0
  17. package/dist/blockchain/RevenueSplitService.js +111 -0
  18. package/dist/blockchain/index.d.ts +48 -0
  19. package/dist/blockchain/index.d.ts.map +1 -0
  20. package/dist/blockchain/index.js +46 -0
  21. package/dist/blockchain/types.d.ts +63 -0
  22. package/dist/blockchain/types.d.ts.map +1 -0
  23. package/dist/blockchain/types.js +6 -0
  24. package/dist/chains/arbitrum.d.ts +89 -0
  25. package/dist/chains/arbitrum.d.ts.map +1 -0
  26. package/dist/chains/arbitrum.js +134 -0
  27. package/dist/chains/base.d.ts +84 -0
  28. package/dist/chains/base.d.ts.map +1 -0
  29. package/dist/chains/base.js +131 -0
  30. package/dist/chains/index.d.ts +36 -0
  31. package/dist/chains/index.d.ts.map +1 -0
  32. package/dist/chains/index.js +32 -0
  33. package/dist/chains/registry.d.ts +113 -0
  34. package/dist/chains/registry.d.ts.map +1 -0
  35. package/dist/chains/registry.js +201 -0
  36. package/dist/chains/varityL3.d.ts +81 -0
  37. package/dist/chains/varityL3.d.ts.map +1 -0
  38. package/dist/chains/varityL3.js +125 -0
  39. package/dist/cli/commands/clone.d.ts +8 -0
  40. package/dist/cli/commands/clone.d.ts.map +1 -0
  41. package/dist/cli/commands/clone.js +391 -0
  42. package/dist/cli/commands/dev.d.ts +8 -0
  43. package/dist/cli/commands/dev.d.ts.map +1 -0
  44. package/dist/cli/commands/dev.js +40 -0
  45. package/dist/cli/commands/generate.d.ts +8 -0
  46. package/dist/cli/commands/generate.d.ts.map +1 -0
  47. package/dist/cli/commands/generate.js +303 -0
  48. package/dist/cli/commands/init.d.ts +8 -0
  49. package/dist/cli/commands/init.d.ts.map +1 -0
  50. package/dist/cli/commands/init.js +317 -0
  51. package/dist/cli/commands/validate.d.ts +8 -0
  52. package/dist/cli/commands/validate.d.ts.map +1 -0
  53. package/dist/cli/commands/validate.js +69 -0
  54. package/dist/cli/index.d.ts +8 -0
  55. package/dist/cli/index.d.ts.map +1 -0
  56. package/dist/cli/index.js +33 -0
  57. package/dist/cli/utils/logger.d.ts +17 -0
  58. package/dist/cli/utils/logger.d.ts.map +1 -0
  59. package/dist/cli/utils/logger.js +35 -0
  60. package/dist/cli/utils/prompts.d.ts +21 -0
  61. package/dist/cli/utils/prompts.d.ts.map +1 -0
  62. package/dist/cli/utils/prompts.js +103 -0
  63. package/dist/contracts/abis/iso/AccessControlRegistry.json +1468 -0
  64. package/dist/contracts/abis/iso/DataProofRegistry.json +797 -0
  65. package/dist/contracts/abis/iso/MerchantRegistry.json +1237 -0
  66. package/dist/contracts/abis/iso/RepPerformance.json +1351 -0
  67. package/dist/contracts/abis/iso/ResidualCalculator.json +1118 -0
  68. package/dist/contracts/abis/iso/TransactionVault.json +1588 -0
  69. package/dist/contracts/abis/iso/VarityWalletFactory.json +475 -0
  70. package/dist/contracts/addresses.d.ts +88 -0
  71. package/dist/contracts/addresses.d.ts.map +1 -0
  72. package/dist/contracts/addresses.js +94 -0
  73. package/dist/contracts/index.d.ts +7 -0
  74. package/dist/contracts/index.d.ts.map +1 -0
  75. package/dist/contracts/index.js +6 -0
  76. package/dist/core/VaritySDK.d.ts +177 -0
  77. package/dist/core/VaritySDK.d.ts.map +1 -0
  78. package/dist/core/VaritySDK.js +325 -0
  79. package/dist/core/config.d.ts +120 -0
  80. package/dist/core/config.d.ts.map +1 -0
  81. package/dist/core/config.js +187 -0
  82. package/dist/core/credentials-proxy.d.ts +157 -0
  83. package/dist/core/credentials-proxy.d.ts.map +1 -0
  84. package/dist/core/credentials-proxy.js +345 -0
  85. package/dist/core/credentials.d.ts +219 -0
  86. package/dist/core/credentials.d.ts.map +1 -0
  87. package/dist/core/credentials.js +345 -0
  88. package/dist/core/template-loader.d.ts +15 -0
  89. package/dist/core/template-loader.d.ts.map +1 -0
  90. package/dist/core/template-loader.js +380 -0
  91. package/dist/core/template.d.ts +321 -0
  92. package/dist/core/template.d.ts.map +1 -0
  93. package/dist/core/template.js +189 -0
  94. package/dist/core/types.d.ts +572 -0
  95. package/dist/core/types.d.ts.map +1 -0
  96. package/dist/core/types.js +52 -0
  97. package/dist/dev/dev-server.d.ts +16 -0
  98. package/dist/dev/dev-server.d.ts.map +1 -0
  99. package/dist/dev/dev-server.js +119 -0
  100. package/dist/generators/contracts/generator.d.ts +21 -0
  101. package/dist/generators/contracts/generator.d.ts.map +1 -0
  102. package/dist/generators/contracts/generator.js +252 -0
  103. package/dist/generators/tests/generator.d.ts +20 -0
  104. package/dist/generators/tests/generator.d.ts.map +1 -0
  105. package/dist/generators/tests/generator.js +375 -0
  106. package/dist/generators/types/generator.d.ts +19 -0
  107. package/dist/generators/types/generator.d.ts.map +1 -0
  108. package/dist/generators/types/generator.js +165 -0
  109. package/dist/generators/ui/component-generator.d.ts +20 -0
  110. package/dist/generators/ui/component-generator.d.ts.map +1 -0
  111. package/dist/generators/ui/component-generator.js +749 -0
  112. package/dist/generators/ui/dashboard-generator.d.ts +20 -0
  113. package/dist/generators/ui/dashboard-generator.d.ts.map +1 -0
  114. package/dist/generators/ui/dashboard-generator.js +349 -0
  115. package/dist/index.d.ts +61 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +74 -0
  118. package/dist/modules/analytics/AnalyticsModule.d.ts +349 -0
  119. package/dist/modules/analytics/AnalyticsModule.d.ts.map +1 -0
  120. package/dist/modules/analytics/AnalyticsModule.js +274 -0
  121. package/dist/modules/analytics/index.d.ts +3 -0
  122. package/dist/modules/analytics/index.d.ts.map +1 -0
  123. package/dist/modules/analytics/index.js +1 -0
  124. package/dist/modules/auth/AccessKeyModule.d.ts +189 -0
  125. package/dist/modules/auth/AccessKeyModule.d.ts.map +1 -0
  126. package/dist/modules/auth/AccessKeyModule.js +322 -0
  127. package/dist/modules/auth/AuthModule.d.ts +133 -0
  128. package/dist/modules/auth/AuthModule.d.ts.map +1 -0
  129. package/dist/modules/auth/AuthModule.js +214 -0
  130. package/dist/modules/auth/index.d.ts +8 -0
  131. package/dist/modules/auth/index.d.ts.map +1 -0
  132. package/dist/modules/auth/index.js +6 -0
  133. package/dist/modules/cache/CacheModule.d.ts +279 -0
  134. package/dist/modules/cache/CacheModule.d.ts.map +1 -0
  135. package/dist/modules/cache/CacheModule.js +493 -0
  136. package/dist/modules/cache/index.d.ts +3 -0
  137. package/dist/modules/cache/index.d.ts.map +1 -0
  138. package/dist/modules/cache/index.js +1 -0
  139. package/dist/modules/compute/ComputeModule.d.ts +226 -0
  140. package/dist/modules/compute/ComputeModule.d.ts.map +1 -0
  141. package/dist/modules/compute/ComputeModule.js +379 -0
  142. package/dist/modules/compute/index.d.ts +6 -0
  143. package/dist/modules/compute/index.d.ts.map +1 -0
  144. package/dist/modules/compute/index.js +4 -0
  145. package/dist/modules/contracts/ContractsModule.d.ts +164 -0
  146. package/dist/modules/contracts/ContractsModule.d.ts.map +1 -0
  147. package/dist/modules/contracts/ContractsModule.js +242 -0
  148. package/dist/modules/contracts/index.d.ts +6 -0
  149. package/dist/modules/contracts/index.d.ts.map +1 -0
  150. package/dist/modules/contracts/index.js +4 -0
  151. package/dist/modules/export/ExportModule.d.ts +346 -0
  152. package/dist/modules/export/ExportModule.d.ts.map +1 -0
  153. package/dist/modules/export/ExportModule.js +432 -0
  154. package/dist/modules/export/index.d.ts +3 -0
  155. package/dist/modules/export/index.d.ts.map +1 -0
  156. package/dist/modules/export/index.js +1 -0
  157. package/dist/modules/forecasting/ForecastingModule.d.ts +579 -0
  158. package/dist/modules/forecasting/ForecastingModule.d.ts.map +1 -0
  159. package/dist/modules/forecasting/ForecastingModule.js +310 -0
  160. package/dist/modules/forecasting/index.d.ts +3 -0
  161. package/dist/modules/forecasting/index.d.ts.map +1 -0
  162. package/dist/modules/forecasting/index.js +1 -0
  163. package/dist/modules/monitoring/MonitoringModule.d.ts +359 -0
  164. package/dist/modules/monitoring/MonitoringModule.d.ts.map +1 -0
  165. package/dist/modules/monitoring/MonitoringModule.js +483 -0
  166. package/dist/modules/monitoring/index.d.ts +3 -0
  167. package/dist/modules/monitoring/index.d.ts.map +1 -0
  168. package/dist/modules/monitoring/index.js +1 -0
  169. package/dist/modules/notifications/NotificationsModule.d.ts +336 -0
  170. package/dist/modules/notifications/NotificationsModule.d.ts.map +1 -0
  171. package/dist/modules/notifications/NotificationsModule.js +418 -0
  172. package/dist/modules/notifications/index.d.ts +3 -0
  173. package/dist/modules/notifications/index.d.ts.map +1 -0
  174. package/dist/modules/notifications/index.js +1 -0
  175. package/dist/modules/oracle/OracleModule.d.ts +110 -0
  176. package/dist/modules/oracle/OracleModule.d.ts.map +1 -0
  177. package/dist/modules/oracle/OracleModule.js +151 -0
  178. package/dist/modules/oracle/index.d.ts +6 -0
  179. package/dist/modules/oracle/index.d.ts.map +1 -0
  180. package/dist/modules/oracle/index.js +4 -0
  181. package/dist/modules/storage/S3Module.d.ts +377 -0
  182. package/dist/modules/storage/S3Module.d.ts.map +1 -0
  183. package/dist/modules/storage/S3Module.js +680 -0
  184. package/dist/modules/storage/StorageModule.d.ts +157 -0
  185. package/dist/modules/storage/StorageModule.d.ts.map +1 -0
  186. package/dist/modules/storage/StorageModule.js +302 -0
  187. package/dist/modules/storage/adapters/AdapterFactory.d.ts +100 -0
  188. package/dist/modules/storage/adapters/AdapterFactory.d.ts.map +1 -0
  189. package/dist/modules/storage/adapters/AdapterFactory.js +209 -0
  190. package/dist/modules/storage/adapters/FilecoinAdapter.d.ts +94 -0
  191. package/dist/modules/storage/adapters/FilecoinAdapter.d.ts.map +1 -0
  192. package/dist/modules/storage/adapters/FilecoinAdapter.js +263 -0
  193. package/dist/modules/storage/adapters/IStorageAdapter.d.ts +287 -0
  194. package/dist/modules/storage/adapters/IStorageAdapter.d.ts.map +1 -0
  195. package/dist/modules/storage/adapters/IStorageAdapter.js +81 -0
  196. package/dist/modules/storage/adapters/MultiTierAdapter.d.ts +187 -0
  197. package/dist/modules/storage/adapters/MultiTierAdapter.d.ts.map +1 -0
  198. package/dist/modules/storage/adapters/MultiTierAdapter.js +430 -0
  199. package/dist/modules/storage/adapters/index.d.ts +12 -0
  200. package/dist/modules/storage/adapters/index.d.ts.map +1 -0
  201. package/dist/modules/storage/adapters/index.js +12 -0
  202. package/dist/modules/storage/index.d.ts +16 -0
  203. package/dist/modules/storage/index.d.ts.map +1 -0
  204. package/dist/modules/storage/index.js +15 -0
  205. package/dist/modules/storage/tiering/AccessAnalyzer.d.ts +227 -0
  206. package/dist/modules/storage/tiering/AccessAnalyzer.d.ts.map +1 -0
  207. package/dist/modules/storage/tiering/AccessAnalyzer.js +367 -0
  208. package/dist/modules/storage/tiering/CostOptimizer.d.ts +248 -0
  209. package/dist/modules/storage/tiering/CostOptimizer.d.ts.map +1 -0
  210. package/dist/modules/storage/tiering/CostOptimizer.js +356 -0
  211. package/dist/modules/storage/tiering/MetadataStore.d.ts +287 -0
  212. package/dist/modules/storage/tiering/MetadataStore.d.ts.map +1 -0
  213. package/dist/modules/storage/tiering/MetadataStore.js +535 -0
  214. package/dist/modules/storage/tiering/TieringEngine.d.ts +237 -0
  215. package/dist/modules/storage/tiering/TieringEngine.d.ts.map +1 -0
  216. package/dist/modules/storage/tiering/TieringEngine.js +419 -0
  217. package/dist/modules/storage/tiering/example.d.ts +8 -0
  218. package/dist/modules/storage/tiering/example.d.ts.map +1 -0
  219. package/dist/modules/storage/tiering/example.js +250 -0
  220. package/dist/modules/storage/tiering/index.d.ts +17 -0
  221. package/dist/modules/storage/tiering/index.d.ts.map +1 -0
  222. package/dist/modules/storage/tiering/index.js +13 -0
  223. package/dist/modules/webhooks/WebhooksModule.d.ts +476 -0
  224. package/dist/modules/webhooks/WebhooksModule.d.ts.map +1 -0
  225. package/dist/modules/webhooks/WebhooksModule.js +359 -0
  226. package/dist/modules/webhooks/index.d.ts +3 -0
  227. package/dist/modules/webhooks/index.d.ts.map +1 -0
  228. package/dist/modules/webhooks/index.js +1 -0
  229. package/dist/modules/zk/ZKModule.d.ts +153 -0
  230. package/dist/modules/zk/ZKModule.d.ts.map +1 -0
  231. package/dist/modules/zk/ZKModule.js +262 -0
  232. package/dist/modules/zk/index.d.ts +7 -0
  233. package/dist/modules/zk/index.d.ts.map +1 -0
  234. package/dist/modules/zk/index.js +4 -0
  235. package/dist/thirdweb/BridgeClient.d.ts +228 -0
  236. package/dist/thirdweb/BridgeClient.d.ts.map +1 -0
  237. package/dist/thirdweb/BridgeClient.js +160 -0
  238. package/dist/thirdweb/EngineClient.d.ts +396 -0
  239. package/dist/thirdweb/EngineClient.d.ts.map +1 -0
  240. package/dist/thirdweb/EngineClient.js +386 -0
  241. package/dist/thirdweb/GatewayClient.d.ts +190 -0
  242. package/dist/thirdweb/GatewayClient.d.ts.map +1 -0
  243. package/dist/thirdweb/GatewayClient.js +257 -0
  244. package/dist/thirdweb/NebulaClient.d.ts +292 -0
  245. package/dist/thirdweb/NebulaClient.d.ts.map +1 -0
  246. package/dist/thirdweb/NebulaClient.js +180 -0
  247. package/dist/thirdweb/StorageClient.d.ts +445 -0
  248. package/dist/thirdweb/StorageClient.d.ts.map +1 -0
  249. package/dist/thirdweb/StorageClient.js +405 -0
  250. package/dist/thirdweb/ThirdwebWrapper.d.ts +236 -0
  251. package/dist/thirdweb/ThirdwebWrapper.d.ts.map +1 -0
  252. package/dist/thirdweb/ThirdwebWrapper.js +332 -0
  253. package/dist/thirdweb/index.d.ts +21 -0
  254. package/dist/thirdweb/index.d.ts.map +1 -0
  255. package/dist/thirdweb/index.js +28 -0
  256. package/dist/thirdweb/varity-chain.d.ts +48 -0
  257. package/dist/thirdweb/varity-chain.d.ts.map +1 -0
  258. package/dist/thirdweb/varity-chain.js +64 -0
  259. package/dist/thirdweb/x402Client.d.ts +319 -0
  260. package/dist/thirdweb/x402Client.d.ts.map +1 -0
  261. package/dist/thirdweb/x402Client.js +223 -0
  262. package/dist/tracking/gasTracker.d.ts +158 -0
  263. package/dist/tracking/gasTracker.d.ts.map +1 -0
  264. package/dist/tracking/gasTracker.js +227 -0
  265. package/dist/tracking/index.d.ts +10 -0
  266. package/dist/tracking/index.d.ts.map +1 -0
  267. package/dist/tracking/index.js +8 -0
  268. package/dist/tracking/types.d.ts +327 -0
  269. package/dist/tracking/types.d.ts.map +1 -0
  270. package/dist/tracking/types.js +8 -0
  271. package/dist/ui/components/ChartWidget.d.ts +36 -0
  272. package/dist/ui/components/ChartWidget.d.ts.map +1 -0
  273. package/dist/ui/components/ChartWidget.js +82 -0
  274. package/dist/ui/components/DashboardLayout.d.ts +41 -0
  275. package/dist/ui/components/DashboardLayout.d.ts.map +1 -0
  276. package/dist/ui/components/DashboardLayout.js +102 -0
  277. package/dist/ui/components/DataTable.d.ts +49 -0
  278. package/dist/ui/components/DataTable.d.ts.map +1 -0
  279. package/dist/ui/components/DataTable.js +96 -0
  280. package/dist/ui/components/EntityForm.d.ts +60 -0
  281. package/dist/ui/components/EntityForm.d.ts.map +1 -0
  282. package/dist/ui/components/EntityForm.js +182 -0
  283. package/dist/ui/components/KPICard.d.ts +29 -0
  284. package/dist/ui/components/KPICard.d.ts.map +1 -0
  285. package/dist/ui/components/KPICard.js +61 -0
  286. package/dist/ui/components/Modal.d.ts +34 -0
  287. package/dist/ui/components/Modal.d.ts.map +1 -0
  288. package/dist/ui/components/Modal.js +30 -0
  289. package/dist/ui/components/index.d.ts +18 -0
  290. package/dist/ui/components/index.d.ts.map +1 -0
  291. package/dist/ui/components/index.js +11 -0
  292. package/dist/validation/template-validator.d.ts +25 -0
  293. package/dist/validation/template-validator.d.ts.map +1 -0
  294. package/dist/validation/template-validator.js +305 -0
  295. 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
+ }