@opendatalabs/vana-sdk 0.1.0-alpha.a6b60fc → 0.1.0-alpha.a78ce5c

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 (256) hide show
  1. package/dist/client/__tests__/enhancedResponse.test.d.ts +1 -0
  2. package/dist/client/enhancedResponse.cjs +164 -0
  3. package/dist/client/enhancedResponse.cjs.map +1 -0
  4. package/dist/client/enhancedResponse.d.ts +120 -0
  5. package/dist/client/enhancedResponse.js +138 -0
  6. package/dist/client/enhancedResponse.js.map +1 -0
  7. package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +7 -0
  8. package/dist/controllers/__tests__/operations.processQueue.test.d.ts +1 -0
  9. package/dist/controllers/base.cjs +33 -0
  10. package/dist/controllers/base.cjs.map +1 -1
  11. package/dist/controllers/base.d.ts +10 -0
  12. package/dist/controllers/base.js +33 -0
  13. package/dist/controllers/base.js.map +1 -1
  14. package/dist/controllers/data.cjs +278 -159
  15. package/dist/controllers/data.cjs.map +1 -1
  16. package/dist/controllers/data.d.ts +34 -19
  17. package/dist/controllers/data.js +291 -162
  18. package/dist/controllers/data.js.map +1 -1
  19. package/dist/controllers/operations.cjs +430 -0
  20. package/dist/controllers/operations.cjs.map +1 -0
  21. package/dist/controllers/operations.d.ts +229 -0
  22. package/dist/controllers/operations.js +406 -0
  23. package/dist/controllers/operations.js.map +1 -0
  24. package/dist/controllers/permissions.cjs +605 -213
  25. package/dist/controllers/permissions.cjs.map +1 -1
  26. package/dist/controllers/permissions.d.ts +141 -34
  27. package/dist/controllers/permissions.js +605 -213
  28. package/dist/controllers/permissions.js.map +1 -1
  29. package/dist/controllers/schemas.cjs +81 -4
  30. package/dist/controllers/schemas.cjs.map +1 -1
  31. package/dist/controllers/schemas.d.ts +41 -0
  32. package/dist/controllers/schemas.js +81 -4
  33. package/dist/controllers/schemas.js.map +1 -1
  34. package/dist/controllers/server.cjs +251 -42
  35. package/dist/controllers/server.cjs.map +1 -1
  36. package/dist/controllers/server.d.ts +111 -14
  37. package/dist/controllers/server.js +251 -42
  38. package/dist/controllers/server.js.map +1 -1
  39. package/dist/core/__tests__/health.test.d.ts +1 -0
  40. package/dist/core/__tests__/inMemoryNonceManager.test.d.ts +1 -0
  41. package/dist/core/__tests__/nonceManager.test.d.ts +1 -0
  42. package/dist/core/__tests__/pollingManager.test.d.ts +4 -0
  43. package/dist/core/health.cjs +289 -0
  44. package/dist/core/health.cjs.map +1 -0
  45. package/dist/core/health.d.ts +143 -0
  46. package/dist/core/health.js +265 -0
  47. package/dist/core/health.js.map +1 -0
  48. package/dist/core/inMemoryNonceManager.cjs +138 -0
  49. package/dist/core/inMemoryNonceManager.cjs.map +1 -0
  50. package/dist/core/inMemoryNonceManager.d.ts +69 -0
  51. package/dist/core/inMemoryNonceManager.js +114 -0
  52. package/dist/core/inMemoryNonceManager.js.map +1 -0
  53. package/dist/core/nonceManager.cjs +304 -0
  54. package/dist/core/nonceManager.cjs.map +1 -0
  55. package/dist/core/nonceManager.d.ts +116 -0
  56. package/dist/core/nonceManager.js +280 -0
  57. package/dist/core/nonceManager.js.map +1 -0
  58. package/dist/core/pollingManager.cjs +292 -0
  59. package/dist/core/pollingManager.cjs.map +1 -0
  60. package/dist/core/pollingManager.d.ts +120 -0
  61. package/dist/core/pollingManager.js +268 -0
  62. package/dist/core/pollingManager.js.map +1 -0
  63. package/dist/core.cjs +55 -1
  64. package/dist/core.cjs.map +1 -1
  65. package/dist/core.d.ts +54 -3
  66. package/dist/core.js +55 -1
  67. package/dist/core.js.map +1 -1
  68. package/dist/crypto/ecies/base.cjs +16 -3
  69. package/dist/crypto/ecies/base.cjs.map +1 -1
  70. package/dist/crypto/ecies/base.js +16 -3
  71. package/dist/crypto/ecies/base.js.map +1 -1
  72. package/dist/errors.cjs +29 -0
  73. package/dist/errors.cjs.map +1 -1
  74. package/dist/errors.d.ts +64 -0
  75. package/dist/errors.js +28 -0
  76. package/dist/errors.js.map +1 -1
  77. package/dist/generated/abi/ComputeInstructionRegistryImplementation.cjs.map +1 -1
  78. package/dist/generated/abi/ComputeInstructionRegistryImplementation.js.map +1 -1
  79. package/dist/generated/abi/DLPPerformanceImplementation.cjs +42 -0
  80. package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +1 -1
  81. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +32 -0
  82. package/dist/generated/abi/DLPPerformanceImplementation.js +42 -0
  83. package/dist/generated/abi/DLPPerformanceImplementation.js.map +1 -1
  84. package/dist/generated/abi/DLPRegistryImplementation.cjs +5 -5
  85. package/dist/generated/abi/DLPRegistryImplementation.cjs.map +1 -1
  86. package/dist/generated/abi/DLPRegistryImplementation.d.ts +4 -4
  87. package/dist/generated/abi/DLPRegistryImplementation.js +5 -5
  88. package/dist/generated/abi/DLPRegistryImplementation.js.map +1 -1
  89. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +166 -2
  90. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +1 -1
  91. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +129 -2
  92. package/dist/generated/abi/DLPRewardDeployerImplementation.js +166 -2
  93. package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +1 -1
  94. package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs +167 -19
  95. package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs.map +1 -1
  96. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +127 -14
  97. package/dist/generated/abi/DataPortabilityGranteesImplementation.js +167 -19
  98. package/dist/generated/abi/DataPortabilityGranteesImplementation.js.map +1 -1
  99. package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs +0 -19
  100. package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs.map +1 -1
  101. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +0 -14
  102. package/dist/generated/abi/DataPortabilityPermissionsImplementation.js +0 -19
  103. package/dist/generated/abi/DataPortabilityPermissionsImplementation.js.map +1 -1
  104. package/dist/generated/abi/DataPortabilityServersImplementation.cjs +0 -19
  105. package/dist/generated/abi/DataPortabilityServersImplementation.cjs.map +1 -1
  106. package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +0 -14
  107. package/dist/generated/abi/DataPortabilityServersImplementation.js +0 -19
  108. package/dist/generated/abi/DataPortabilityServersImplementation.js.map +1 -1
  109. package/dist/generated/abi/DataRegistryImplementation.cjs +0 -13
  110. package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
  111. package/dist/generated/abi/DataRegistryImplementation.d.ts +0 -10
  112. package/dist/generated/abi/DataRegistryImplementation.js +0 -13
  113. package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
  114. package/dist/generated/abi/SwapHelperImplementation.cjs +0 -43
  115. package/dist/generated/abi/SwapHelperImplementation.cjs.map +1 -1
  116. package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -35
  117. package/dist/generated/abi/SwapHelperImplementation.js +0 -43
  118. package/dist/generated/abi/SwapHelperImplementation.js.map +1 -1
  119. package/dist/generated/abi/VanaEpochImplementation.cjs +195 -0
  120. package/dist/generated/abi/VanaEpochImplementation.cjs.map +1 -1
  121. package/dist/generated/abi/VanaEpochImplementation.d.ts +151 -0
  122. package/dist/generated/abi/VanaEpochImplementation.js +195 -0
  123. package/dist/generated/abi/VanaEpochImplementation.js.map +1 -1
  124. package/dist/generated/abi/VanaPoolEntityImplementation.cjs +22 -65
  125. package/dist/generated/abi/VanaPoolEntityImplementation.cjs.map +1 -1
  126. package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +17 -51
  127. package/dist/generated/abi/VanaPoolEntityImplementation.js +22 -65
  128. package/dist/generated/abi/VanaPoolEntityImplementation.js.map +1 -1
  129. package/dist/generated/abi/VanaPoolStakingImplementation.cjs +113 -1
  130. package/dist/generated/abi/VanaPoolStakingImplementation.cjs.map +1 -1
  131. package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +85 -1
  132. package/dist/generated/abi/VanaPoolStakingImplementation.js +113 -1
  133. package/dist/generated/abi/VanaPoolStakingImplementation.js.map +1 -1
  134. package/dist/generated/abi/index.d.ts +546 -146
  135. package/dist/generated/event-types.cjs.map +1 -1
  136. package/dist/generated/event-types.d.ts +14 -8
  137. package/dist/generated/eventRegistry.cjs +42 -18
  138. package/dist/generated/eventRegistry.cjs.map +1 -1
  139. package/dist/generated/eventRegistry.js +42 -18
  140. package/dist/generated/eventRegistry.js.map +1 -1
  141. package/dist/generated/server/server-exports.cjs +22 -0
  142. package/dist/generated/server/server-exports.cjs.map +1 -1
  143. package/dist/generated/server/server-exports.d.ts +27 -10
  144. package/dist/generated/server/server-exports.js +17 -0
  145. package/dist/generated/server/server-exports.js.map +1 -1
  146. package/dist/generated/server/server.cjs.map +1 -1
  147. package/dist/generated/server/server.d.ts +771 -402
  148. package/dist/generated/subgraph.cjs +797 -32
  149. package/dist/generated/subgraph.cjs.map +1 -1
  150. package/dist/generated/subgraph.d.ts +135 -0
  151. package/dist/generated/subgraph.js +792 -32
  152. package/dist/generated/subgraph.js.map +1 -1
  153. package/dist/index.browser.d.ts +2 -0
  154. package/dist/index.browser.js +10 -0
  155. package/dist/index.browser.js.map +1 -1
  156. package/dist/index.node.cjs +26 -0
  157. package/dist/index.node.cjs.map +1 -1
  158. package/dist/index.node.d.ts +49 -5
  159. package/dist/index.node.js +25 -1
  160. package/dist/index.node.js.map +1 -1
  161. package/dist/lib/__tests__/redisAtomicStore.test.d.ts +1 -0
  162. package/dist/lib/redisAtomicStore.cjs +201 -0
  163. package/dist/lib/redisAtomicStore.cjs.map +1 -0
  164. package/dist/lib/redisAtomicStore.d.ts +120 -0
  165. package/dist/lib/redisAtomicStore.js +177 -0
  166. package/dist/lib/redisAtomicStore.js.map +1 -0
  167. package/dist/server/relayerHandler.cjs +313 -75
  168. package/dist/server/relayerHandler.cjs.map +1 -1
  169. package/dist/server/relayerHandler.d.ts +35 -2
  170. package/dist/server/relayerHandler.js +313 -75
  171. package/dist/server/relayerHandler.js.map +1 -1
  172. package/dist/storage/index.cjs +3 -0
  173. package/dist/storage/index.cjs.map +1 -1
  174. package/dist/storage/index.d.ts +1 -0
  175. package/dist/storage/index.js +2 -0
  176. package/dist/storage/index.js.map +1 -1
  177. package/dist/storage/providers/dropbox.cjs +237 -0
  178. package/dist/storage/providers/dropbox.cjs.map +1 -0
  179. package/dist/storage/providers/dropbox.d.ts +39 -0
  180. package/dist/storage/providers/dropbox.js +215 -0
  181. package/dist/storage/providers/dropbox.js.map +1 -0
  182. package/dist/storage/providers/dropbox.test.d.ts +1 -0
  183. package/dist/tests/data-upload-owner-validation.test.d.ts +1 -0
  184. package/dist/types/atomicStore.cjs +31 -0
  185. package/dist/types/atomicStore.cjs.map +1 -0
  186. package/dist/types/atomicStore.d.ts +236 -0
  187. package/dist/types/atomicStore.js +7 -0
  188. package/dist/types/atomicStore.js.map +1 -0
  189. package/dist/types/config.cjs.map +1 -1
  190. package/dist/types/config.d.ts +32 -0
  191. package/dist/types/config.js.map +1 -1
  192. package/dist/types/controller-context.cjs.map +1 -1
  193. package/dist/types/controller-context.d.ts +4 -1
  194. package/dist/types/data.cjs.map +1 -1
  195. package/dist/types/data.d.ts +7 -4
  196. package/dist/types/generics.cjs.map +1 -1
  197. package/dist/types/generics.d.ts +1 -1
  198. package/dist/types/index.cjs.map +1 -1
  199. package/dist/types/index.d.ts +6 -3
  200. package/dist/types/index.js.map +1 -1
  201. package/dist/types/operationStore.cjs +17 -0
  202. package/dist/types/operationStore.cjs.map +1 -0
  203. package/dist/types/operationStore.d.ts +171 -0
  204. package/dist/types/operationStore.js +1 -0
  205. package/dist/types/operationStore.js.map +1 -0
  206. package/dist/types/operations.cjs +3 -15
  207. package/dist/types/operations.cjs.map +1 -1
  208. package/dist/types/operations.d.ts +17 -42
  209. package/dist/types/operations.js +2 -13
  210. package/dist/types/operations.js.map +1 -1
  211. package/dist/types/options.cjs +17 -0
  212. package/dist/types/options.cjs.map +1 -0
  213. package/dist/types/options.d.ts +308 -0
  214. package/dist/types/options.js +1 -0
  215. package/dist/types/options.js.map +1 -0
  216. package/dist/types/permissions.cjs.map +1 -1
  217. package/dist/types/permissions.d.ts +4 -0
  218. package/dist/types/personal.cjs.map +1 -1
  219. package/dist/types/personal.d.ts +19 -0
  220. package/dist/types/relayer.cjs.map +1 -1
  221. package/dist/types/relayer.d.ts +53 -9
  222. package/dist/types/utils.cjs.map +1 -1
  223. package/dist/types/utils.d.ts +0 -49
  224. package/dist/utils/__tests__/chainQuery.test.d.ts +1 -0
  225. package/dist/utils/__tests__/subgraphConsistency.test.d.ts +4 -0
  226. package/dist/utils/__tests__/subgraphPagination.test.d.ts +4 -0
  227. package/dist/utils/chainQuery.cjs +107 -0
  228. package/dist/utils/chainQuery.cjs.map +1 -0
  229. package/dist/utils/chainQuery.d.ts +31 -0
  230. package/dist/utils/chainQuery.js +82 -0
  231. package/dist/utils/chainQuery.js.map +1 -0
  232. package/dist/utils/grantFiles.cjs +4 -1
  233. package/dist/utils/grantFiles.cjs.map +1 -1
  234. package/dist/utils/grantFiles.js +4 -1
  235. package/dist/utils/grantFiles.js.map +1 -1
  236. package/dist/utils/ipfs.cjs +2 -4
  237. package/dist/utils/ipfs.cjs.map +1 -1
  238. package/dist/utils/ipfs.d.ts +1 -1
  239. package/dist/utils/ipfs.js +2 -4
  240. package/dist/utils/ipfs.js.map +1 -1
  241. package/dist/utils/subgraphConsistency.cjs +184 -0
  242. package/dist/utils/subgraphConsistency.cjs.map +1 -0
  243. package/dist/utils/subgraphConsistency.d.ts +65 -0
  244. package/dist/utils/subgraphConsistency.js +155 -0
  245. package/dist/utils/subgraphConsistency.js.map +1 -0
  246. package/dist/utils/subgraphMetaCache.cjs +101 -0
  247. package/dist/utils/subgraphMetaCache.cjs.map +1 -0
  248. package/dist/utils/subgraphMetaCache.d.ts +56 -0
  249. package/dist/utils/subgraphMetaCache.js +76 -0
  250. package/dist/utils/subgraphMetaCache.js.map +1 -0
  251. package/dist/utils/subgraphPagination.cjs +104 -0
  252. package/dist/utils/subgraphPagination.cjs.map +1 -0
  253. package/dist/utils/subgraphPagination.d.ts +78 -0
  254. package/dist/utils/subgraphPagination.js +78 -0
  255. package/dist/utils/subgraphPagination.js.map +1 -0
  256. package/package.json +3 -1
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var subgraphConsistency_exports = {};
20
+ __export(subgraphConsistency_exports, {
21
+ StaleDataError: () => StaleDataError,
22
+ addMetaToQuery: () => addMetaToQuery,
23
+ calculateStaleness: () => calculateStaleness,
24
+ checkSubgraphConsistency: () => checkSubgraphConsistency,
25
+ fetchSubgraphMeta: () => fetchSubgraphMeta,
26
+ waitForSubgraphSync: () => waitForSubgraphSync
27
+ });
28
+ module.exports = __toCommonJS(subgraphConsistency_exports);
29
+ var import_graphql = require("graphql");
30
+ var import_subgraph = require("../generated/subgraph");
31
+ var import_subgraphMetaCache = require("./subgraphMetaCache");
32
+ class StaleDataError extends Error {
33
+ constructor(requiredBlock, currentBlock, message) {
34
+ super(
35
+ message ?? `Subgraph data is stale. Required block: ${requiredBlock}, Current block: ${currentBlock}`
36
+ );
37
+ this.requiredBlock = requiredBlock;
38
+ this.currentBlock = currentBlock;
39
+ this.name = "StaleDataError";
40
+ }
41
+ }
42
+ async function fetchSubgraphMeta(subgraphUrl, useCache = true) {
43
+ if (useCache) {
44
+ const cached = import_subgraphMetaCache.globalMetaCache.get(subgraphUrl);
45
+ if (cached) {
46
+ return cached;
47
+ }
48
+ }
49
+ const response = await fetch(subgraphUrl, {
50
+ method: "POST",
51
+ headers: {
52
+ "Content-Type": "application/json"
53
+ },
54
+ body: JSON.stringify({
55
+ query: (0, import_graphql.print)(import_subgraph.GetSubgraphMetaDocument)
56
+ })
57
+ });
58
+ if (!response.ok) {
59
+ throw new Error(
60
+ `Failed to fetch subgraph metadata: ${response.status} ${response.statusText}`
61
+ );
62
+ }
63
+ const result = await response.json();
64
+ if (result.errors) {
65
+ throw new Error(
66
+ `Subgraph query errors: ${result.errors.map((e) => e.message).join(", ")}`
67
+ );
68
+ }
69
+ if (!result.data?._meta) {
70
+ throw new Error("No metadata returned from subgraph");
71
+ }
72
+ const meta = result.data._meta;
73
+ const subgraphMeta = {
74
+ blockNumber: meta.block.number,
75
+ blockTimestamp: meta.block.timestamp ?? void 0,
76
+ blockHash: meta.block.hash ?? void 0,
77
+ deployment: meta.deployment,
78
+ hasIndexingErrors: meta.hasIndexingErrors
79
+ };
80
+ if (useCache) {
81
+ import_subgraphMetaCache.globalMetaCache.set(subgraphUrl, subgraphMeta);
82
+ }
83
+ return subgraphMeta;
84
+ }
85
+ async function checkSubgraphConsistency(subgraphUrl, options) {
86
+ if (options?.signal?.aborted) {
87
+ throw new Error("Operation aborted");
88
+ }
89
+ if (!options?.minBlock) {
90
+ return fetchSubgraphMeta(subgraphUrl);
91
+ }
92
+ const meta = await fetchSubgraphMeta(subgraphUrl);
93
+ if (meta.blockNumber < options.minBlock) {
94
+ if (options.waitForSync && options.waitForSync > 0) {
95
+ return waitForSubgraphSync(
96
+ subgraphUrl,
97
+ options.minBlock,
98
+ options.waitForSync,
99
+ 2e3,
100
+ // pollInterval
101
+ options.signal
102
+ );
103
+ }
104
+ throw new StaleDataError(options.minBlock, meta.blockNumber);
105
+ }
106
+ return meta;
107
+ }
108
+ async function waitForSubgraphSync(subgraphUrl, targetBlock, maxWait, pollInterval = 2e3, signal) {
109
+ const startTime = Date.now();
110
+ if (signal?.aborted) {
111
+ throw new Error("Operation aborted");
112
+ }
113
+ const checkAbort = () => {
114
+ if (signal?.aborted) {
115
+ throw new Error("Operation aborted");
116
+ }
117
+ };
118
+ while (Date.now() - startTime < maxWait) {
119
+ checkAbort();
120
+ const meta = await fetchSubgraphMeta(subgraphUrl);
121
+ if (meta.blockNumber >= targetBlock) {
122
+ return meta;
123
+ }
124
+ await new Promise((resolve, reject) => {
125
+ const timer = setTimeout(resolve, pollInterval);
126
+ if (signal) {
127
+ const abortHandler = () => {
128
+ clearTimeout(timer);
129
+ reject(new Error("Operation aborted"));
130
+ };
131
+ if (signal.aborted) {
132
+ abortHandler();
133
+ } else {
134
+ signal.addEventListener("abort", abortHandler, { once: true });
135
+ }
136
+ }
137
+ });
138
+ }
139
+ checkAbort();
140
+ const finalMeta = await fetchSubgraphMeta(subgraphUrl);
141
+ if (finalMeta.blockNumber >= targetBlock) {
142
+ return finalMeta;
143
+ }
144
+ throw new StaleDataError(
145
+ targetBlock,
146
+ finalMeta.blockNumber,
147
+ `Subgraph did not sync to block ${targetBlock} within ${maxWait}ms. Current block: ${finalMeta.blockNumber}`
148
+ );
149
+ }
150
+ function calculateStaleness(meta, currentTimestamp) {
151
+ if (!meta.blockTimestamp) {
152
+ return void 0;
153
+ }
154
+ return Math.max(0, currentTimestamp - meta.blockTimestamp);
155
+ }
156
+ function addMetaToQuery(baseQuery) {
157
+ if (baseQuery.includes("_meta")) {
158
+ return baseQuery;
159
+ }
160
+ const queryMatch = baseQuery.match(/query\s+\w+[^{]*\{/);
161
+ if (!queryMatch) {
162
+ return baseQuery;
163
+ }
164
+ const insertPoint = queryMatch.index + queryMatch[0].length;
165
+ return baseQuery.slice(0, insertPoint) + `
166
+ _meta {
167
+ block {
168
+ number
169
+ timestamp
170
+ }
171
+ hasIndexingErrors
172
+ }
173
+ ` + baseQuery.slice(insertPoint);
174
+ }
175
+ // Annotate the CommonJS export names for ESM import in node:
176
+ 0 && (module.exports = {
177
+ StaleDataError,
178
+ addMetaToQuery,
179
+ calculateStaleness,
180
+ checkSubgraphConsistency,
181
+ fetchSubgraphMeta,
182
+ waitForSubgraphSync
183
+ });
184
+ //# sourceMappingURL=subgraphConsistency.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/subgraphConsistency.ts"],"sourcesContent":["/**\n * @file Utilities for handling subgraph data consistency\n * @module vana-sdk/utils/subgraphConsistency\n */\n\nimport { print } from \"graphql\";\nimport type { ConsistencyOptions } from \"../types/options\";\nimport type { GetSubgraphMetaQuery } from \"../generated/subgraph\";\nimport { GetSubgraphMetaDocument } from \"../generated/subgraph\";\nimport { globalMetaCache } from \"./subgraphMetaCache\";\n\n/**\n * Error thrown when subgraph data is stale relative to consistency requirements\n */\nexport class StaleDataError extends Error {\n constructor(\n public readonly requiredBlock: number,\n public readonly currentBlock: number,\n message?: string,\n ) {\n super(\n message ??\n `Subgraph data is stale. Required block: ${requiredBlock}, Current block: ${currentBlock}`,\n );\n this.name = \"StaleDataError\";\n }\n}\n\n/**\n * Subgraph metadata response structure\n */\nexport interface SubgraphMeta {\n blockNumber: number;\n blockTimestamp?: number;\n blockHash?: string;\n deployment: string;\n hasIndexingErrors: boolean;\n}\n\n/**\n * Response structure from subgraph queries\n */\ninterface SubgraphResponse<T> {\n data?: T;\n errors?: Array<{ message: string }>;\n}\n\n/**\n * Fetches the current metadata from a subgraph\n *\n * @param subgraphUrl - The GraphQL endpoint URL\n * @returns Current block information and indexing status\n */\nexport async function fetchSubgraphMeta(\n subgraphUrl: string,\n useCache = true,\n): Promise<SubgraphMeta> {\n // Check cache first\n if (useCache) {\n const cached = globalMetaCache.get(subgraphUrl);\n if (cached) {\n return cached;\n }\n }\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: print(GetSubgraphMetaDocument),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch subgraph metadata: ${response.status} ${response.statusText}`,\n );\n }\n\n const result =\n (await response.json()) as SubgraphResponse<GetSubgraphMetaQuery>;\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?._meta) {\n throw new Error(\"No metadata returned from subgraph\");\n }\n\n const meta = result.data._meta;\n const subgraphMeta: SubgraphMeta = {\n blockNumber: meta.block.number,\n blockTimestamp: meta.block.timestamp ?? undefined,\n blockHash: meta.block.hash ?? undefined,\n deployment: meta.deployment,\n hasIndexingErrors: meta.hasIndexingErrors,\n };\n\n // Cache the result\n if (useCache) {\n globalMetaCache.set(subgraphUrl, subgraphMeta);\n }\n\n return subgraphMeta;\n}\n\n/**\n * Checks if subgraph meets consistency requirements\n *\n * @param subgraphUrl - The GraphQL endpoint URL\n * @param options - Consistency requirements\n * @returns The subgraph metadata if requirements are met\n * @throws {StaleDataError} If subgraph is behind required block\n */\nexport async function checkSubgraphConsistency(\n subgraphUrl: string,\n options?: ConsistencyOptions,\n): Promise<SubgraphMeta> {\n // Check if already aborted\n if (options?.signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n // If no consistency requirements, just return current metadata\n if (!options?.minBlock) {\n return fetchSubgraphMeta(subgraphUrl);\n }\n\n const meta = await fetchSubgraphMeta(subgraphUrl);\n\n // Check if subgraph has reached required block\n if (meta.blockNumber < options.minBlock) {\n // If waitForSync is specified, poll until caught up\n if (options.waitForSync && options.waitForSync > 0) {\n return waitForSubgraphSync(\n subgraphUrl,\n options.minBlock,\n options.waitForSync,\n 2000, // pollInterval\n options.signal,\n );\n }\n\n // Otherwise throw immediately\n throw new StaleDataError(options.minBlock, meta.blockNumber);\n }\n\n return meta;\n}\n\n/**\n * Waits for subgraph to sync to a specific block\n *\n * @param subgraphUrl - The GraphQL endpoint URL\n * @param targetBlock - Block number to wait for\n * @param maxWait - Maximum milliseconds to wait\n * @param pollInterval - How often to check (default: 2000ms)\n * @returns The subgraph metadata when target is reached\n * @throws {StaleDataError} If timeout is reached before sync\n */\nexport async function waitForSubgraphSync(\n subgraphUrl: string,\n targetBlock: number,\n maxWait: number,\n pollInterval = 2000,\n signal?: AbortSignal,\n): Promise<SubgraphMeta> {\n const startTime = Date.now();\n\n // Check if already aborted\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n // Set up abort handling\n const checkAbort = () => {\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n };\n\n while (Date.now() - startTime < maxWait) {\n checkAbort();\n const meta = await fetchSubgraphMeta(subgraphUrl);\n\n // Check if we've reached the target\n if (meta.blockNumber >= targetBlock) {\n return meta;\n }\n\n // Wait before next check with abort support\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, pollInterval);\n\n if (signal) {\n const abortHandler = () => {\n clearTimeout(timer);\n reject(new Error(\"Operation aborted\"));\n };\n\n if (signal.aborted) {\n abortHandler();\n } else {\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n }\n });\n }\n\n // Timeout reached, check one more time\n checkAbort();\n const finalMeta = await fetchSubgraphMeta(subgraphUrl);\n if (finalMeta.blockNumber >= targetBlock) {\n return finalMeta;\n }\n\n throw new StaleDataError(\n targetBlock,\n finalMeta.blockNumber,\n `Subgraph did not sync to block ${targetBlock} within ${maxWait}ms. Current block: ${finalMeta.blockNumber}`,\n );\n}\n\n/**\n * Calculates staleness in seconds based on block timestamps\n *\n * @param meta - Subgraph metadata\n * @param currentTimestamp - Current chain timestamp\n * @returns Seconds behind the chain, or undefined if timestamps unavailable\n */\nexport function calculateStaleness(\n meta: SubgraphMeta,\n currentTimestamp: number,\n): number | undefined {\n if (!meta.blockTimestamp) {\n return undefined;\n }\n\n return Math.max(0, currentTimestamp - meta.blockTimestamp);\n}\n\n/**\n * Builds a GraphQL query with _meta field included\n *\n * @param baseQuery - The original query string\n * @returns Query with _meta field added\n */\nexport function addMetaToQuery(baseQuery: string): string {\n // Simple approach: inject _meta at the root level\n // This is a basic implementation - could be enhanced with proper AST manipulation\n if (baseQuery.includes(\"_meta\")) {\n return baseQuery; // Already has meta\n }\n\n // Find the first { after query name and inject _meta\n const queryMatch = baseQuery.match(/query\\s+\\w+[^{]*\\{/);\n if (!queryMatch) {\n return baseQuery; // Can't parse, return as-is\n }\n\n const insertPoint = queryMatch.index! + queryMatch[0].length;\n return (\n baseQuery.slice(0, insertPoint) +\n `\n _meta {\n block {\n number\n timestamp\n }\n hasIndexingErrors\n }\n ` +\n baseQuery.slice(insertPoint)\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @file Utilities for handling subgraph data consistency
3
+ * @module vana-sdk/utils/subgraphConsistency
4
+ */
5
+ import type { ConsistencyOptions } from "../types/options";
6
+ /**
7
+ * Error thrown when subgraph data is stale relative to consistency requirements
8
+ */
9
+ export declare class StaleDataError extends Error {
10
+ readonly requiredBlock: number;
11
+ readonly currentBlock: number;
12
+ constructor(requiredBlock: number, currentBlock: number, message?: string);
13
+ }
14
+ /**
15
+ * Subgraph metadata response structure
16
+ */
17
+ export interface SubgraphMeta {
18
+ blockNumber: number;
19
+ blockTimestamp?: number;
20
+ blockHash?: string;
21
+ deployment: string;
22
+ hasIndexingErrors: boolean;
23
+ }
24
+ /**
25
+ * Fetches the current metadata from a subgraph
26
+ *
27
+ * @param subgraphUrl - The GraphQL endpoint URL
28
+ * @returns Current block information and indexing status
29
+ */
30
+ export declare function fetchSubgraphMeta(subgraphUrl: string, useCache?: boolean): Promise<SubgraphMeta>;
31
+ /**
32
+ * Checks if subgraph meets consistency requirements
33
+ *
34
+ * @param subgraphUrl - The GraphQL endpoint URL
35
+ * @param options - Consistency requirements
36
+ * @returns The subgraph metadata if requirements are met
37
+ * @throws {StaleDataError} If subgraph is behind required block
38
+ */
39
+ export declare function checkSubgraphConsistency(subgraphUrl: string, options?: ConsistencyOptions): Promise<SubgraphMeta>;
40
+ /**
41
+ * Waits for subgraph to sync to a specific block
42
+ *
43
+ * @param subgraphUrl - The GraphQL endpoint URL
44
+ * @param targetBlock - Block number to wait for
45
+ * @param maxWait - Maximum milliseconds to wait
46
+ * @param pollInterval - How often to check (default: 2000ms)
47
+ * @returns The subgraph metadata when target is reached
48
+ * @throws {StaleDataError} If timeout is reached before sync
49
+ */
50
+ export declare function waitForSubgraphSync(subgraphUrl: string, targetBlock: number, maxWait: number, pollInterval?: number, signal?: AbortSignal): Promise<SubgraphMeta>;
51
+ /**
52
+ * Calculates staleness in seconds based on block timestamps
53
+ *
54
+ * @param meta - Subgraph metadata
55
+ * @param currentTimestamp - Current chain timestamp
56
+ * @returns Seconds behind the chain, or undefined if timestamps unavailable
57
+ */
58
+ export declare function calculateStaleness(meta: SubgraphMeta, currentTimestamp: number): number | undefined;
59
+ /**
60
+ * Builds a GraphQL query with _meta field included
61
+ *
62
+ * @param baseQuery - The original query string
63
+ * @returns Query with _meta field added
64
+ */
65
+ export declare function addMetaToQuery(baseQuery: string): string;
@@ -0,0 +1,155 @@
1
+ import { print } from "graphql";
2
+ import { GetSubgraphMetaDocument } from "../generated/subgraph";
3
+ import { globalMetaCache } from "./subgraphMetaCache";
4
+ class StaleDataError extends Error {
5
+ constructor(requiredBlock, currentBlock, message) {
6
+ super(
7
+ message ?? `Subgraph data is stale. Required block: ${requiredBlock}, Current block: ${currentBlock}`
8
+ );
9
+ this.requiredBlock = requiredBlock;
10
+ this.currentBlock = currentBlock;
11
+ this.name = "StaleDataError";
12
+ }
13
+ }
14
+ async function fetchSubgraphMeta(subgraphUrl, useCache = true) {
15
+ if (useCache) {
16
+ const cached = globalMetaCache.get(subgraphUrl);
17
+ if (cached) {
18
+ return cached;
19
+ }
20
+ }
21
+ const response = await fetch(subgraphUrl, {
22
+ method: "POST",
23
+ headers: {
24
+ "Content-Type": "application/json"
25
+ },
26
+ body: JSON.stringify({
27
+ query: print(GetSubgraphMetaDocument)
28
+ })
29
+ });
30
+ if (!response.ok) {
31
+ throw new Error(
32
+ `Failed to fetch subgraph metadata: ${response.status} ${response.statusText}`
33
+ );
34
+ }
35
+ const result = await response.json();
36
+ if (result.errors) {
37
+ throw new Error(
38
+ `Subgraph query errors: ${result.errors.map((e) => e.message).join(", ")}`
39
+ );
40
+ }
41
+ if (!result.data?._meta) {
42
+ throw new Error("No metadata returned from subgraph");
43
+ }
44
+ const meta = result.data._meta;
45
+ const subgraphMeta = {
46
+ blockNumber: meta.block.number,
47
+ blockTimestamp: meta.block.timestamp ?? void 0,
48
+ blockHash: meta.block.hash ?? void 0,
49
+ deployment: meta.deployment,
50
+ hasIndexingErrors: meta.hasIndexingErrors
51
+ };
52
+ if (useCache) {
53
+ globalMetaCache.set(subgraphUrl, subgraphMeta);
54
+ }
55
+ return subgraphMeta;
56
+ }
57
+ async function checkSubgraphConsistency(subgraphUrl, options) {
58
+ if (options?.signal?.aborted) {
59
+ throw new Error("Operation aborted");
60
+ }
61
+ if (!options?.minBlock) {
62
+ return fetchSubgraphMeta(subgraphUrl);
63
+ }
64
+ const meta = await fetchSubgraphMeta(subgraphUrl);
65
+ if (meta.blockNumber < options.minBlock) {
66
+ if (options.waitForSync && options.waitForSync > 0) {
67
+ return waitForSubgraphSync(
68
+ subgraphUrl,
69
+ options.minBlock,
70
+ options.waitForSync,
71
+ 2e3,
72
+ // pollInterval
73
+ options.signal
74
+ );
75
+ }
76
+ throw new StaleDataError(options.minBlock, meta.blockNumber);
77
+ }
78
+ return meta;
79
+ }
80
+ async function waitForSubgraphSync(subgraphUrl, targetBlock, maxWait, pollInterval = 2e3, signal) {
81
+ const startTime = Date.now();
82
+ if (signal?.aborted) {
83
+ throw new Error("Operation aborted");
84
+ }
85
+ const checkAbort = () => {
86
+ if (signal?.aborted) {
87
+ throw new Error("Operation aborted");
88
+ }
89
+ };
90
+ while (Date.now() - startTime < maxWait) {
91
+ checkAbort();
92
+ const meta = await fetchSubgraphMeta(subgraphUrl);
93
+ if (meta.blockNumber >= targetBlock) {
94
+ return meta;
95
+ }
96
+ await new Promise((resolve, reject) => {
97
+ const timer = setTimeout(resolve, pollInterval);
98
+ if (signal) {
99
+ const abortHandler = () => {
100
+ clearTimeout(timer);
101
+ reject(new Error("Operation aborted"));
102
+ };
103
+ if (signal.aborted) {
104
+ abortHandler();
105
+ } else {
106
+ signal.addEventListener("abort", abortHandler, { once: true });
107
+ }
108
+ }
109
+ });
110
+ }
111
+ checkAbort();
112
+ const finalMeta = await fetchSubgraphMeta(subgraphUrl);
113
+ if (finalMeta.blockNumber >= targetBlock) {
114
+ return finalMeta;
115
+ }
116
+ throw new StaleDataError(
117
+ targetBlock,
118
+ finalMeta.blockNumber,
119
+ `Subgraph did not sync to block ${targetBlock} within ${maxWait}ms. Current block: ${finalMeta.blockNumber}`
120
+ );
121
+ }
122
+ function calculateStaleness(meta, currentTimestamp) {
123
+ if (!meta.blockTimestamp) {
124
+ return void 0;
125
+ }
126
+ return Math.max(0, currentTimestamp - meta.blockTimestamp);
127
+ }
128
+ function addMetaToQuery(baseQuery) {
129
+ if (baseQuery.includes("_meta")) {
130
+ return baseQuery;
131
+ }
132
+ const queryMatch = baseQuery.match(/query\s+\w+[^{]*\{/);
133
+ if (!queryMatch) {
134
+ return baseQuery;
135
+ }
136
+ const insertPoint = queryMatch.index + queryMatch[0].length;
137
+ return baseQuery.slice(0, insertPoint) + `
138
+ _meta {
139
+ block {
140
+ number
141
+ timestamp
142
+ }
143
+ hasIndexingErrors
144
+ }
145
+ ` + baseQuery.slice(insertPoint);
146
+ }
147
+ export {
148
+ StaleDataError,
149
+ addMetaToQuery,
150
+ calculateStaleness,
151
+ checkSubgraphConsistency,
152
+ fetchSubgraphMeta,
153
+ waitForSubgraphSync
154
+ };
155
+ //# sourceMappingURL=subgraphConsistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/subgraphConsistency.ts"],"sourcesContent":["/**\n * @file Utilities for handling subgraph data consistency\n * @module vana-sdk/utils/subgraphConsistency\n */\n\nimport { print } from \"graphql\";\nimport type { ConsistencyOptions } from \"../types/options\";\nimport type { GetSubgraphMetaQuery } from \"../generated/subgraph\";\nimport { GetSubgraphMetaDocument } from \"../generated/subgraph\";\nimport { globalMetaCache } from \"./subgraphMetaCache\";\n\n/**\n * Error thrown when subgraph data is stale relative to consistency requirements\n */\nexport class StaleDataError extends Error {\n constructor(\n public readonly requiredBlock: number,\n public readonly currentBlock: number,\n message?: string,\n ) {\n super(\n message ??\n `Subgraph data is stale. Required block: ${requiredBlock}, Current block: ${currentBlock}`,\n );\n this.name = \"StaleDataError\";\n }\n}\n\n/**\n * Subgraph metadata response structure\n */\nexport interface SubgraphMeta {\n blockNumber: number;\n blockTimestamp?: number;\n blockHash?: string;\n deployment: string;\n hasIndexingErrors: boolean;\n}\n\n/**\n * Response structure from subgraph queries\n */\ninterface SubgraphResponse<T> {\n data?: T;\n errors?: Array<{ message: string }>;\n}\n\n/**\n * Fetches the current metadata from a subgraph\n *\n * @param subgraphUrl - The GraphQL endpoint URL\n * @returns Current block information and indexing status\n */\nexport async function fetchSubgraphMeta(\n subgraphUrl: string,\n useCache = true,\n): Promise<SubgraphMeta> {\n // Check cache first\n if (useCache) {\n const cached = globalMetaCache.get(subgraphUrl);\n if (cached) {\n return cached;\n }\n }\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: print(GetSubgraphMetaDocument),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch subgraph metadata: ${response.status} ${response.statusText}`,\n );\n }\n\n const result =\n (await response.json()) as SubgraphResponse<GetSubgraphMetaQuery>;\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?._meta) {\n throw new Error(\"No metadata returned from subgraph\");\n }\n\n const meta = result.data._meta;\n const subgraphMeta: SubgraphMeta = {\n blockNumber: meta.block.number,\n blockTimestamp: meta.block.timestamp ?? undefined,\n blockHash: meta.block.hash ?? undefined,\n deployment: meta.deployment,\n hasIndexingErrors: meta.hasIndexingErrors,\n };\n\n // Cache the result\n if (useCache) {\n globalMetaCache.set(subgraphUrl, subgraphMeta);\n }\n\n return subgraphMeta;\n}\n\n/**\n * Checks if subgraph meets consistency requirements\n *\n * @param subgraphUrl - The GraphQL endpoint URL\n * @param options - Consistency requirements\n * @returns The subgraph metadata if requirements are met\n * @throws {StaleDataError} If subgraph is behind required block\n */\nexport async function checkSubgraphConsistency(\n subgraphUrl: string,\n options?: ConsistencyOptions,\n): Promise<SubgraphMeta> {\n // Check if already aborted\n if (options?.signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n // If no consistency requirements, just return current metadata\n if (!options?.minBlock) {\n return fetchSubgraphMeta(subgraphUrl);\n }\n\n const meta = await fetchSubgraphMeta(subgraphUrl);\n\n // Check if subgraph has reached required block\n if (meta.blockNumber < options.minBlock) {\n // If waitForSync is specified, poll until caught up\n if (options.waitForSync && options.waitForSync > 0) {\n return waitForSubgraphSync(\n subgraphUrl,\n options.minBlock,\n options.waitForSync,\n 2000, // pollInterval\n options.signal,\n );\n }\n\n // Otherwise throw immediately\n throw new StaleDataError(options.minBlock, meta.blockNumber);\n }\n\n return meta;\n}\n\n/**\n * Waits for subgraph to sync to a specific block\n *\n * @param subgraphUrl - The GraphQL endpoint URL\n * @param targetBlock - Block number to wait for\n * @param maxWait - Maximum milliseconds to wait\n * @param pollInterval - How often to check (default: 2000ms)\n * @returns The subgraph metadata when target is reached\n * @throws {StaleDataError} If timeout is reached before sync\n */\nexport async function waitForSubgraphSync(\n subgraphUrl: string,\n targetBlock: number,\n maxWait: number,\n pollInterval = 2000,\n signal?: AbortSignal,\n): Promise<SubgraphMeta> {\n const startTime = Date.now();\n\n // Check if already aborted\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n // Set up abort handling\n const checkAbort = () => {\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n };\n\n while (Date.now() - startTime < maxWait) {\n checkAbort();\n const meta = await fetchSubgraphMeta(subgraphUrl);\n\n // Check if we've reached the target\n if (meta.blockNumber >= targetBlock) {\n return meta;\n }\n\n // Wait before next check with abort support\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, pollInterval);\n\n if (signal) {\n const abortHandler = () => {\n clearTimeout(timer);\n reject(new Error(\"Operation aborted\"));\n };\n\n if (signal.aborted) {\n abortHandler();\n } else {\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n }\n });\n }\n\n // Timeout reached, check one more time\n checkAbort();\n const finalMeta = await fetchSubgraphMeta(subgraphUrl);\n if (finalMeta.blockNumber >= targetBlock) {\n return finalMeta;\n }\n\n throw new StaleDataError(\n targetBlock,\n finalMeta.blockNumber,\n `Subgraph did not sync to block ${targetBlock} within ${maxWait}ms. Current block: ${finalMeta.blockNumber}`,\n );\n}\n\n/**\n * Calculates staleness in seconds based on block timestamps\n *\n * @param meta - Subgraph metadata\n * @param currentTimestamp - Current chain timestamp\n * @returns Seconds behind the chain, or undefined if timestamps unavailable\n */\nexport function calculateStaleness(\n meta: SubgraphMeta,\n currentTimestamp: number,\n): number | undefined {\n if (!meta.blockTimestamp) {\n return undefined;\n }\n\n return Math.max(0, currentTimestamp - meta.blockTimestamp);\n}\n\n/**\n * Builds a GraphQL query with _meta field included\n *\n * @param baseQuery - The original query string\n * @returns Query with _meta field added\n */\nexport function addMetaToQuery(baseQuery: string): string {\n // Simple approach: inject _meta at the root level\n // This is a basic implementation - could be enhanced with proper AST manipulation\n if (baseQuery.includes(\"_meta\")) {\n return baseQuery; // Already has meta\n }\n\n // Find the first { after query name and inject _meta\n const queryMatch = baseQuery.match(/query\\s+\\w+[^{]*\\{/);\n if (!queryMatch) {\n return baseQuery; // Can't parse, return as-is\n }\n\n const insertPoint = queryMatch.index! + queryMatch[0].length;\n return (\n baseQuery.slice(0, insertPoint) +\n `\n _meta {\n block {\n number\n timestamp\n }\n hasIndexingErrors\n }\n ` +\n baseQuery.slice(insertPoint)\n );\n}\n"],"mappings":"AAKA,SAAS,aAAa;AAGtB,SAAS,+BAA+B;AACxC,SAAS,uBAAuB;AAKzB,MAAM,uBAAuB,MAAM;AAAA,EACxC,YACkB,eACA,cAChB,SACA;AACA;AAAA,MACE,WACE,2CAA2C,aAAa,oBAAoB,YAAY;AAAA,IAC5F;AAPgB;AACA;AAOhB,SAAK,OAAO;AAAA,EACd;AACF;AA2BA,eAAsB,kBACpB,aACA,WAAW,MACY;AAEvB,MAAI,UAAU;AACZ,UAAM,SAAS,gBAAgB,IAAI,WAAW;AAC9C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,aAAa;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO,MAAM,uBAAuB;AAAA,IACtC,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,sCAAsC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM,SACH,MAAM,SAAS,KAAK;AAEvB,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI;AAAA,MACR,0BAA0B,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,MAAM,OAAO;AACvB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,eAA6B;AAAA,IACjC,aAAa,KAAK,MAAM;AAAA,IACxB,gBAAgB,KAAK,MAAM,aAAa;AAAA,IACxC,WAAW,KAAK,MAAM,QAAQ;AAAA,IAC9B,YAAY,KAAK;AAAA,IACjB,mBAAmB,KAAK;AAAA,EAC1B;AAGA,MAAI,UAAU;AACZ,oBAAgB,IAAI,aAAa,YAAY;AAAA,EAC/C;AAEA,SAAO;AACT;AAUA,eAAsB,yBACpB,aACA,SACuB;AAEvB,MAAI,SAAS,QAAQ,SAAS;AAC5B,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAGA,MAAI,CAAC,SAAS,UAAU;AACtB,WAAO,kBAAkB,WAAW;AAAA,EACtC;AAEA,QAAM,OAAO,MAAM,kBAAkB,WAAW;AAGhD,MAAI,KAAK,cAAc,QAAQ,UAAU;AAEvC,QAAI,QAAQ,eAAe,QAAQ,cAAc,GAAG;AAClD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,UAAM,IAAI,eAAe,QAAQ,UAAU,KAAK,WAAW;AAAA,EAC7D;AAEA,SAAO;AACT;AAYA,eAAsB,oBACpB,aACA,aACA,SACA,eAAe,KACf,QACuB;AACvB,QAAM,YAAY,KAAK,IAAI;AAG3B,MAAI,QAAQ,SAAS;AACnB,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAGA,QAAM,aAAa,MAAM;AACvB,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,KAAK,IAAI,IAAI,YAAY,SAAS;AACvC,eAAW;AACX,UAAM,OAAO,MAAM,kBAAkB,WAAW;AAGhD,QAAI,KAAK,eAAe,aAAa;AACnC,aAAO;AAAA,IACT;AAGA,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,QAAQ,WAAW,SAAS,YAAY;AAE9C,UAAI,QAAQ;AACV,cAAM,eAAe,MAAM;AACzB,uBAAa,KAAK;AAClB,iBAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,QACvC;AAEA,YAAI,OAAO,SAAS;AAClB,uBAAa;AAAA,QACf,OAAO;AACL,iBAAO,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,aAAW;AACX,QAAM,YAAY,MAAM,kBAAkB,WAAW;AACrD,MAAI,UAAU,eAAe,aAAa;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,UAAU;AAAA,IACV,kCAAkC,WAAW,WAAW,OAAO,sBAAsB,UAAU,WAAW;AAAA,EAC5G;AACF;AASO,SAAS,mBACd,MACA,kBACoB;AACpB,MAAI,CAAC,KAAK,gBAAgB;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,mBAAmB,KAAK,cAAc;AAC3D;AAQO,SAAS,eAAe,WAA2B;AAGxD,MAAI,UAAU,SAAS,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,UAAU,MAAM,oBAAoB;AACvD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,WAAW,QAAS,WAAW,CAAC,EAAE;AACtD,SACE,UAAU,MAAM,GAAG,WAAW,IAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,UAAU,MAAM,WAAW;AAE/B;","names":[]}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var subgraphMetaCache_exports = {};
20
+ __export(subgraphMetaCache_exports, {
21
+ SubgraphMetaCache: () => SubgraphMetaCache,
22
+ globalMetaCache: () => globalMetaCache
23
+ });
24
+ module.exports = __toCommonJS(subgraphMetaCache_exports);
25
+ class SubgraphMetaCache {
26
+ cache = /* @__PURE__ */ new Map();
27
+ maxSize;
28
+ ttl;
29
+ /**
30
+ * Create a new metadata cache
31
+ *
32
+ * @param ttl - Time to live in milliseconds (default: 2000ms)
33
+ * @param maxSize - Maximum cache entries (default: 10)
34
+ */
35
+ constructor(ttl = 2e3, maxSize = 10) {
36
+ this.ttl = ttl;
37
+ this.maxSize = maxSize;
38
+ }
39
+ /**
40
+ * Get cached metadata if fresh
41
+ *
42
+ * @param url - Subgraph URL as cache key
43
+ * @returns Cached metadata or undefined if stale/missing
44
+ */
45
+ get(url) {
46
+ const entry = this.cache.get(url);
47
+ if (!entry) {
48
+ return void 0;
49
+ }
50
+ if (Date.now() - entry.timestamp > this.ttl) {
51
+ this.cache.delete(url);
52
+ return void 0;
53
+ }
54
+ this.cache.delete(url);
55
+ this.cache.set(url, entry);
56
+ return entry.meta;
57
+ }
58
+ /**
59
+ * Store metadata in cache
60
+ *
61
+ * @param url - Subgraph URL as cache key
62
+ * @param meta - Metadata to cache
63
+ */
64
+ set(url, meta) {
65
+ if (this.cache.size >= this.maxSize && !this.cache.has(url)) {
66
+ const firstKey = this.cache.keys().next().value;
67
+ if (firstKey) {
68
+ this.cache.delete(firstKey);
69
+ }
70
+ }
71
+ this.cache.set(url, {
72
+ meta,
73
+ timestamp: Date.now()
74
+ });
75
+ }
76
+ /**
77
+ * Clear all cached entries
78
+ */
79
+ clear() {
80
+ this.cache.clear();
81
+ }
82
+ /**
83
+ * Get cache statistics
84
+ *
85
+ * @returns Cache size and TTL info
86
+ */
87
+ stats() {
88
+ return {
89
+ size: this.cache.size,
90
+ ttl: this.ttl,
91
+ maxSize: this.maxSize
92
+ };
93
+ }
94
+ }
95
+ const globalMetaCache = new SubgraphMetaCache();
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ SubgraphMetaCache,
99
+ globalMetaCache
100
+ });
101
+ //# sourceMappingURL=subgraphMetaCache.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/subgraphMetaCache.ts"],"sourcesContent":["/**\n * @file Simple cache for subgraph metadata to reduce redundant queries\n * @module vana-sdk/utils/subgraphMetaCache\n */\n\nimport type { SubgraphMeta } from \"./subgraphConsistency\";\n\ninterface CacheEntry {\n meta: SubgraphMeta;\n timestamp: number;\n}\n\n/**\n * Simple LRU cache for subgraph metadata\n *\n * @remarks\n * Reduces redundant _meta queries when multiple SDK methods are called\n * in quick succession. Uses a very short TTL to avoid masking staleness.\n */\nexport class SubgraphMetaCache {\n private cache = new Map<string, CacheEntry>();\n private readonly maxSize: number;\n private readonly ttl: number;\n\n /**\n * Create a new metadata cache\n *\n * @param ttl - Time to live in milliseconds (default: 2000ms)\n * @param maxSize - Maximum cache entries (default: 10)\n */\n constructor(ttl = 2000, maxSize = 10) {\n this.ttl = ttl;\n this.maxSize = maxSize;\n }\n\n /**\n * Get cached metadata if fresh\n *\n * @param url - Subgraph URL as cache key\n * @returns Cached metadata or undefined if stale/missing\n */\n get(url: string): SubgraphMeta | undefined {\n const entry = this.cache.get(url);\n\n if (!entry) {\n return undefined;\n }\n\n // Check if still fresh\n if (Date.now() - entry.timestamp > this.ttl) {\n // Expired, remove it\n this.cache.delete(url);\n return undefined;\n }\n\n // Move to end (LRU)\n this.cache.delete(url);\n this.cache.set(url, entry);\n\n return entry.meta;\n }\n\n /**\n * Store metadata in cache\n *\n * @param url - Subgraph URL as cache key\n * @param meta - Metadata to cache\n */\n set(url: string, meta: SubgraphMeta): void {\n // Remove oldest if at capacity\n if (this.cache.size >= this.maxSize && !this.cache.has(url)) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(url, {\n meta,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n *\n * @returns Cache size and TTL info\n */\n stats(): { size: number; ttl: number; maxSize: number } {\n return {\n size: this.cache.size,\n ttl: this.ttl,\n maxSize: this.maxSize,\n };\n }\n}\n\n/**\n * Global cache instance (optional, can be configured per SDK instance)\n */\nexport const globalMetaCache = new SubgraphMetaCache();\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBO,MAAM,kBAAkB;AAAA,EACrB,QAAQ,oBAAI,IAAwB;AAAA,EAC3B;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,MAAM,KAAM,UAAU,IAAI;AACpC,SAAK,MAAM;AACX,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KAAuC;AACzC,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAEhC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY,KAAK,KAAK;AAE3C,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAGA,SAAK,MAAM,OAAO,GAAG;AACrB,SAAK,MAAM,IAAI,KAAK,KAAK;AAEzB,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KAAa,MAA0B;AAEzC,QAAI,KAAK,MAAM,QAAQ,KAAK,WAAW,CAAC,KAAK,MAAM,IAAI,GAAG,GAAG;AAC3D,YAAM,WAAW,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC1C,UAAI,UAAU;AACZ,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAwD;AACtD,WAAO;AAAA,MACL,MAAM,KAAK,MAAM;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACF;AAKO,MAAM,kBAAkB,IAAI,kBAAkB;","names":[]}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @file Simple cache for subgraph metadata to reduce redundant queries
3
+ * @module vana-sdk/utils/subgraphMetaCache
4
+ */
5
+ import type { SubgraphMeta } from "./subgraphConsistency";
6
+ /**
7
+ * Simple LRU cache for subgraph metadata
8
+ *
9
+ * @remarks
10
+ * Reduces redundant _meta queries when multiple SDK methods are called
11
+ * in quick succession. Uses a very short TTL to avoid masking staleness.
12
+ */
13
+ export declare class SubgraphMetaCache {
14
+ private cache;
15
+ private readonly maxSize;
16
+ private readonly ttl;
17
+ /**
18
+ * Create a new metadata cache
19
+ *
20
+ * @param ttl - Time to live in milliseconds (default: 2000ms)
21
+ * @param maxSize - Maximum cache entries (default: 10)
22
+ */
23
+ constructor(ttl?: number, maxSize?: number);
24
+ /**
25
+ * Get cached metadata if fresh
26
+ *
27
+ * @param url - Subgraph URL as cache key
28
+ * @returns Cached metadata or undefined if stale/missing
29
+ */
30
+ get(url: string): SubgraphMeta | undefined;
31
+ /**
32
+ * Store metadata in cache
33
+ *
34
+ * @param url - Subgraph URL as cache key
35
+ * @param meta - Metadata to cache
36
+ */
37
+ set(url: string, meta: SubgraphMeta): void;
38
+ /**
39
+ * Clear all cached entries
40
+ */
41
+ clear(): void;
42
+ /**
43
+ * Get cache statistics
44
+ *
45
+ * @returns Cache size and TTL info
46
+ */
47
+ stats(): {
48
+ size: number;
49
+ ttl: number;
50
+ maxSize: number;
51
+ };
52
+ }
53
+ /**
54
+ * Global cache instance (optional, can be configured per SDK instance)
55
+ */
56
+ export declare const globalMetaCache: SubgraphMetaCache;