@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.
- package/dist/client/__tests__/enhancedResponse.test.d.ts +1 -0
- package/dist/client/enhancedResponse.cjs +164 -0
- package/dist/client/enhancedResponse.cjs.map +1 -0
- package/dist/client/enhancedResponse.d.ts +120 -0
- package/dist/client/enhancedResponse.js +138 -0
- package/dist/client/enhancedResponse.js.map +1 -0
- package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +7 -0
- package/dist/controllers/__tests__/operations.processQueue.test.d.ts +1 -0
- package/dist/controllers/base.cjs +33 -0
- package/dist/controllers/base.cjs.map +1 -1
- package/dist/controllers/base.d.ts +10 -0
- package/dist/controllers/base.js +33 -0
- package/dist/controllers/base.js.map +1 -1
- package/dist/controllers/data.cjs +278 -159
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +34 -19
- package/dist/controllers/data.js +291 -162
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/operations.cjs +430 -0
- package/dist/controllers/operations.cjs.map +1 -0
- package/dist/controllers/operations.d.ts +229 -0
- package/dist/controllers/operations.js +406 -0
- package/dist/controllers/operations.js.map +1 -0
- package/dist/controllers/permissions.cjs +605 -213
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +141 -34
- package/dist/controllers/permissions.js +605 -213
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/controllers/schemas.cjs +81 -4
- package/dist/controllers/schemas.cjs.map +1 -1
- package/dist/controllers/schemas.d.ts +41 -0
- package/dist/controllers/schemas.js +81 -4
- package/dist/controllers/schemas.js.map +1 -1
- package/dist/controllers/server.cjs +251 -42
- package/dist/controllers/server.cjs.map +1 -1
- package/dist/controllers/server.d.ts +111 -14
- package/dist/controllers/server.js +251 -42
- package/dist/controllers/server.js.map +1 -1
- package/dist/core/__tests__/health.test.d.ts +1 -0
- package/dist/core/__tests__/inMemoryNonceManager.test.d.ts +1 -0
- package/dist/core/__tests__/nonceManager.test.d.ts +1 -0
- package/dist/core/__tests__/pollingManager.test.d.ts +4 -0
- package/dist/core/health.cjs +289 -0
- package/dist/core/health.cjs.map +1 -0
- package/dist/core/health.d.ts +143 -0
- package/dist/core/health.js +265 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/inMemoryNonceManager.cjs +138 -0
- package/dist/core/inMemoryNonceManager.cjs.map +1 -0
- package/dist/core/inMemoryNonceManager.d.ts +69 -0
- package/dist/core/inMemoryNonceManager.js +114 -0
- package/dist/core/inMemoryNonceManager.js.map +1 -0
- package/dist/core/nonceManager.cjs +304 -0
- package/dist/core/nonceManager.cjs.map +1 -0
- package/dist/core/nonceManager.d.ts +116 -0
- package/dist/core/nonceManager.js +280 -0
- package/dist/core/nonceManager.js.map +1 -0
- package/dist/core/pollingManager.cjs +292 -0
- package/dist/core/pollingManager.cjs.map +1 -0
- package/dist/core/pollingManager.d.ts +120 -0
- package/dist/core/pollingManager.js +268 -0
- package/dist/core/pollingManager.js.map +1 -0
- package/dist/core.cjs +55 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +54 -3
- package/dist/core.js +55 -1
- package/dist/core.js.map +1 -1
- package/dist/crypto/ecies/base.cjs +16 -3
- package/dist/crypto/ecies/base.cjs.map +1 -1
- package/dist/crypto/ecies/base.js +16 -3
- package/dist/crypto/ecies/base.js.map +1 -1
- package/dist/errors.cjs +29 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +64 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -1
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/DLPPerformanceImplementation.cjs +42 -0
- package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPPerformanceImplementation.d.ts +32 -0
- package/dist/generated/abi/DLPPerformanceImplementation.js +42 -0
- package/dist/generated/abi/DLPPerformanceImplementation.js.map +1 -1
- package/dist/generated/abi/DLPRegistryImplementation.cjs +5 -5
- package/dist/generated/abi/DLPRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPRegistryImplementation.d.ts +4 -4
- package/dist/generated/abi/DLPRegistryImplementation.js +5 -5
- package/dist/generated/abi/DLPRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +166 -2
- package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +129 -2
- package/dist/generated/abi/DLPRewardDeployerImplementation.js +166 -2
- package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +1 -1
- package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs +167 -19
- package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +127 -14
- package/dist/generated/abi/DataPortabilityGranteesImplementation.js +167 -19
- package/dist/generated/abi/DataPortabilityGranteesImplementation.js.map +1 -1
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs +0 -19
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +0 -14
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.js +0 -19
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.js.map +1 -1
- package/dist/generated/abi/DataPortabilityServersImplementation.cjs +0 -19
- package/dist/generated/abi/DataPortabilityServersImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +0 -14
- package/dist/generated/abi/DataPortabilityServersImplementation.js +0 -19
- package/dist/generated/abi/DataPortabilityServersImplementation.js.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.cjs +0 -13
- package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.d.ts +0 -10
- package/dist/generated/abi/DataRegistryImplementation.js +0 -13
- package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/SwapHelperImplementation.cjs +0 -43
- package/dist/generated/abi/SwapHelperImplementation.cjs.map +1 -1
- package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -35
- package/dist/generated/abi/SwapHelperImplementation.js +0 -43
- package/dist/generated/abi/SwapHelperImplementation.js.map +1 -1
- package/dist/generated/abi/VanaEpochImplementation.cjs +195 -0
- package/dist/generated/abi/VanaEpochImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaEpochImplementation.d.ts +151 -0
- package/dist/generated/abi/VanaEpochImplementation.js +195 -0
- package/dist/generated/abi/VanaEpochImplementation.js.map +1 -1
- package/dist/generated/abi/VanaPoolEntityImplementation.cjs +22 -65
- package/dist/generated/abi/VanaPoolEntityImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +17 -51
- package/dist/generated/abi/VanaPoolEntityImplementation.js +22 -65
- package/dist/generated/abi/VanaPoolEntityImplementation.js.map +1 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.cjs +113 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +85 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.js +113 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.js.map +1 -1
- package/dist/generated/abi/index.d.ts +546 -146
- package/dist/generated/event-types.cjs.map +1 -1
- package/dist/generated/event-types.d.ts +14 -8
- package/dist/generated/eventRegistry.cjs +42 -18
- package/dist/generated/eventRegistry.cjs.map +1 -1
- package/dist/generated/eventRegistry.js +42 -18
- package/dist/generated/eventRegistry.js.map +1 -1
- package/dist/generated/server/server-exports.cjs +22 -0
- package/dist/generated/server/server-exports.cjs.map +1 -1
- package/dist/generated/server/server-exports.d.ts +27 -10
- package/dist/generated/server/server-exports.js +17 -0
- package/dist/generated/server/server-exports.js.map +1 -1
- package/dist/generated/server/server.cjs.map +1 -1
- package/dist/generated/server/server.d.ts +771 -402
- package/dist/generated/subgraph.cjs +797 -32
- package/dist/generated/subgraph.cjs.map +1 -1
- package/dist/generated/subgraph.d.ts +135 -0
- package/dist/generated/subgraph.js +792 -32
- package/dist/generated/subgraph.js.map +1 -1
- package/dist/index.browser.d.ts +2 -0
- package/dist/index.browser.js +10 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.node.cjs +26 -0
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +49 -5
- package/dist/index.node.js +25 -1
- package/dist/index.node.js.map +1 -1
- package/dist/lib/__tests__/redisAtomicStore.test.d.ts +1 -0
- package/dist/lib/redisAtomicStore.cjs +201 -0
- package/dist/lib/redisAtomicStore.cjs.map +1 -0
- package/dist/lib/redisAtomicStore.d.ts +120 -0
- package/dist/lib/redisAtomicStore.js +177 -0
- package/dist/lib/redisAtomicStore.js.map +1 -0
- package/dist/server/relayerHandler.cjs +313 -75
- package/dist/server/relayerHandler.cjs.map +1 -1
- package/dist/server/relayerHandler.d.ts +35 -2
- package/dist/server/relayerHandler.js +313 -75
- package/dist/server/relayerHandler.js.map +1 -1
- package/dist/storage/index.cjs +3 -0
- package/dist/storage/index.cjs.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/providers/dropbox.cjs +237 -0
- package/dist/storage/providers/dropbox.cjs.map +1 -0
- package/dist/storage/providers/dropbox.d.ts +39 -0
- package/dist/storage/providers/dropbox.js +215 -0
- package/dist/storage/providers/dropbox.js.map +1 -0
- package/dist/storage/providers/dropbox.test.d.ts +1 -0
- package/dist/tests/data-upload-owner-validation.test.d.ts +1 -0
- package/dist/types/atomicStore.cjs +31 -0
- package/dist/types/atomicStore.cjs.map +1 -0
- package/dist/types/atomicStore.d.ts +236 -0
- package/dist/types/atomicStore.js +7 -0
- package/dist/types/atomicStore.js.map +1 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +32 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/controller-context.cjs.map +1 -1
- package/dist/types/controller-context.d.ts +4 -1
- package/dist/types/data.cjs.map +1 -1
- package/dist/types/data.d.ts +7 -4
- package/dist/types/generics.cjs.map +1 -1
- package/dist/types/generics.d.ts +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +6 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/operationStore.cjs +17 -0
- package/dist/types/operationStore.cjs.map +1 -0
- package/dist/types/operationStore.d.ts +171 -0
- package/dist/types/operationStore.js +1 -0
- package/dist/types/operationStore.js.map +1 -0
- package/dist/types/operations.cjs +3 -15
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +17 -42
- package/dist/types/operations.js +2 -13
- package/dist/types/operations.js.map +1 -1
- package/dist/types/options.cjs +17 -0
- package/dist/types/options.cjs.map +1 -0
- package/dist/types/options.d.ts +308 -0
- package/dist/types/options.js +1 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/permissions.cjs.map +1 -1
- package/dist/types/permissions.d.ts +4 -0
- package/dist/types/personal.cjs.map +1 -1
- package/dist/types/personal.d.ts +19 -0
- package/dist/types/relayer.cjs.map +1 -1
- package/dist/types/relayer.d.ts +53 -9
- package/dist/types/utils.cjs.map +1 -1
- package/dist/types/utils.d.ts +0 -49
- package/dist/utils/__tests__/chainQuery.test.d.ts +1 -0
- package/dist/utils/__tests__/subgraphConsistency.test.d.ts +4 -0
- package/dist/utils/__tests__/subgraphPagination.test.d.ts +4 -0
- package/dist/utils/chainQuery.cjs +107 -0
- package/dist/utils/chainQuery.cjs.map +1 -0
- package/dist/utils/chainQuery.d.ts +31 -0
- package/dist/utils/chainQuery.js +82 -0
- package/dist/utils/chainQuery.js.map +1 -0
- package/dist/utils/grantFiles.cjs +4 -1
- package/dist/utils/grantFiles.cjs.map +1 -1
- package/dist/utils/grantFiles.js +4 -1
- package/dist/utils/grantFiles.js.map +1 -1
- package/dist/utils/ipfs.cjs +2 -4
- package/dist/utils/ipfs.cjs.map +1 -1
- package/dist/utils/ipfs.d.ts +1 -1
- package/dist/utils/ipfs.js +2 -4
- package/dist/utils/ipfs.js.map +1 -1
- package/dist/utils/subgraphConsistency.cjs +184 -0
- package/dist/utils/subgraphConsistency.cjs.map +1 -0
- package/dist/utils/subgraphConsistency.d.ts +65 -0
- package/dist/utils/subgraphConsistency.js +155 -0
- package/dist/utils/subgraphConsistency.js.map +1 -0
- package/dist/utils/subgraphMetaCache.cjs +101 -0
- package/dist/utils/subgraphMetaCache.cjs.map +1 -0
- package/dist/utils/subgraphMetaCache.d.ts +56 -0
- package/dist/utils/subgraphMetaCache.js +76 -0
- package/dist/utils/subgraphMetaCache.js.map +1 -0
- package/dist/utils/subgraphPagination.cjs +104 -0
- package/dist/utils/subgraphPagination.cjs.map +1 -0
- package/dist/utils/subgraphPagination.d.ts +78 -0
- package/dist/utils/subgraphPagination.js +78 -0
- package/dist/utils/subgraphPagination.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
class SubgraphMetaCache {
|
|
2
|
+
cache = /* @__PURE__ */ new Map();
|
|
3
|
+
maxSize;
|
|
4
|
+
ttl;
|
|
5
|
+
/**
|
|
6
|
+
* Create a new metadata cache
|
|
7
|
+
*
|
|
8
|
+
* @param ttl - Time to live in milliseconds (default: 2000ms)
|
|
9
|
+
* @param maxSize - Maximum cache entries (default: 10)
|
|
10
|
+
*/
|
|
11
|
+
constructor(ttl = 2e3, maxSize = 10) {
|
|
12
|
+
this.ttl = ttl;
|
|
13
|
+
this.maxSize = maxSize;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get cached metadata if fresh
|
|
17
|
+
*
|
|
18
|
+
* @param url - Subgraph URL as cache key
|
|
19
|
+
* @returns Cached metadata or undefined if stale/missing
|
|
20
|
+
*/
|
|
21
|
+
get(url) {
|
|
22
|
+
const entry = this.cache.get(url);
|
|
23
|
+
if (!entry) {
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
if (Date.now() - entry.timestamp > this.ttl) {
|
|
27
|
+
this.cache.delete(url);
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
this.cache.delete(url);
|
|
31
|
+
this.cache.set(url, entry);
|
|
32
|
+
return entry.meta;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Store metadata in cache
|
|
36
|
+
*
|
|
37
|
+
* @param url - Subgraph URL as cache key
|
|
38
|
+
* @param meta - Metadata to cache
|
|
39
|
+
*/
|
|
40
|
+
set(url, meta) {
|
|
41
|
+
if (this.cache.size >= this.maxSize && !this.cache.has(url)) {
|
|
42
|
+
const firstKey = this.cache.keys().next().value;
|
|
43
|
+
if (firstKey) {
|
|
44
|
+
this.cache.delete(firstKey);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.cache.set(url, {
|
|
48
|
+
meta,
|
|
49
|
+
timestamp: Date.now()
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clear all cached entries
|
|
54
|
+
*/
|
|
55
|
+
clear() {
|
|
56
|
+
this.cache.clear();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get cache statistics
|
|
60
|
+
*
|
|
61
|
+
* @returns Cache size and TTL info
|
|
62
|
+
*/
|
|
63
|
+
stats() {
|
|
64
|
+
return {
|
|
65
|
+
size: this.cache.size,
|
|
66
|
+
ttl: this.ttl,
|
|
67
|
+
maxSize: this.maxSize
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const globalMetaCache = new SubgraphMetaCache();
|
|
72
|
+
export {
|
|
73
|
+
SubgraphMetaCache,
|
|
74
|
+
globalMetaCache
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=subgraphMetaCache.js.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":"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,104 @@
|
|
|
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 subgraphPagination_exports = {};
|
|
20
|
+
__export(subgraphPagination_exports, {
|
|
21
|
+
executePaginatedQuery: () => executePaginatedQuery,
|
|
22
|
+
mapOrderByToEnum: () => mapOrderByToEnum,
|
|
23
|
+
mapOrderDirection: () => mapOrderDirection
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(subgraphPagination_exports);
|
|
26
|
+
var import_graphql = require("graphql");
|
|
27
|
+
async function executePaginatedQuery(config) {
|
|
28
|
+
const {
|
|
29
|
+
endpoint,
|
|
30
|
+
document,
|
|
31
|
+
baseVariables,
|
|
32
|
+
options,
|
|
33
|
+
extractItems,
|
|
34
|
+
transformItem,
|
|
35
|
+
maxPerQuery = 1e3
|
|
36
|
+
} = config;
|
|
37
|
+
const limit = options?.fetchAll ? Number.MAX_SAFE_INTEGER : options?.limit ?? 100;
|
|
38
|
+
const offset = options?.offset ?? 0;
|
|
39
|
+
const orderBy = options?.orderBy;
|
|
40
|
+
const orderDirection = options?.orderDirection;
|
|
41
|
+
const allItems = [];
|
|
42
|
+
let currentOffset = offset;
|
|
43
|
+
const pageSize = Math.min(limit, maxPerQuery);
|
|
44
|
+
while (true) {
|
|
45
|
+
const currentLimit = options?.fetchAll ? pageSize : Math.min(pageSize, limit - allItems.length);
|
|
46
|
+
const variables = {
|
|
47
|
+
...baseVariables,
|
|
48
|
+
first: currentLimit,
|
|
49
|
+
skip: currentOffset,
|
|
50
|
+
...orderBy && { orderBy },
|
|
51
|
+
...orderDirection && { orderDirection }
|
|
52
|
+
};
|
|
53
|
+
const response = await fetch(endpoint, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: {
|
|
56
|
+
"Content-Type": "application/json"
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
query: (0, import_graphql.print)(document),
|
|
60
|
+
variables
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Subgraph request failed: ${response.status} ${response.statusText}`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
const result = await response.json();
|
|
69
|
+
if (result.errors) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Subgraph errors: ${result.errors.map((e) => e.message).join(", ")}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
const items = extractItems(result.data);
|
|
75
|
+
if (!items || items.length === 0) {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
const transformedItems = transformItem ? items.map(transformItem) : items;
|
|
79
|
+
allItems.push(...transformedItems);
|
|
80
|
+
if (!options?.fetchAll && allItems.length >= limit) {
|
|
81
|
+
return allItems.slice(0, limit);
|
|
82
|
+
}
|
|
83
|
+
if (items.length < currentLimit) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
currentOffset += items.length;
|
|
87
|
+
}
|
|
88
|
+
return allItems;
|
|
89
|
+
}
|
|
90
|
+
function mapOrderByToEnum(orderBy, enumMap, defaultValue) {
|
|
91
|
+
if (!orderBy) return defaultValue;
|
|
92
|
+
return enumMap[orderBy] ?? defaultValue;
|
|
93
|
+
}
|
|
94
|
+
function mapOrderDirection(direction, ascValue, descValue, defaultValue) {
|
|
95
|
+
if (!direction) return defaultValue ?? descValue;
|
|
96
|
+
return direction === "asc" ? ascValue : descValue;
|
|
97
|
+
}
|
|
98
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
99
|
+
0 && (module.exports = {
|
|
100
|
+
executePaginatedQuery,
|
|
101
|
+
mapOrderByToEnum,
|
|
102
|
+
mapOrderDirection
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=subgraphPagination.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/subgraphPagination.ts"],"sourcesContent":["/**\n * @file Utilities for handling paginated subgraph queries\n * @module vana-sdk/utils/subgraphPagination\n */\n\nimport { print, type DocumentNode } from \"graphql\";\nimport type { PaginationOptions } from \"../types/options\";\n\n/**\n * Generic subgraph response structure\n */\nexport interface SubgraphResponse<T> {\n data?: T;\n errors?: Array<{ message: string }>;\n}\n\n/**\n * Configuration for paginated subgraph queries\n */\nexport interface PaginatedQueryConfig<TData, TItem, TRawItem = any> {\n /** The GraphQL endpoint URL */\n endpoint: string;\n\n /** The GraphQL document to execute */\n document: DocumentNode;\n\n /** Base variables for the query (e.g., userId) */\n baseVariables: Record<string, any>;\n\n /** Pagination options from the user */\n options?: PaginationOptions;\n\n /** Function to extract items from the response */\n extractItems: (data: TData) => TRawItem[] | undefined;\n\n /** Function to transform items if needed */\n transformItem?: (item: TRawItem) => TItem;\n\n /** Maximum items per GraphQL query (default: 1000) */\n maxPerQuery?: number;\n}\n\n/**\n * Generic paginated query executor for subgraph queries\n *\n * @remarks\n * Handles pagination, fetchAll, and proper GraphQL query construction.\n * Abstracts the common pattern of paginated subgraph queries.\n *\n * @param config - Configuration for the paginated query\n * @returns Array of items from all pages\n *\n * @example\n * ```typescript\n * const files = await executePaginatedQuery({\n * endpoint: subgraphUrl,\n * document: GetUserFilesPaginatedDocument,\n * baseVariables: { userId: owner.toLowerCase() },\n * options: { limit: 50, orderBy: 'addedAtBlock' },\n * extractItems: (data) => data?.user?.files,\n * transformItem: (file) => ({\n * id: parseInt(file.id),\n * url: file.url,\n * // ... transform to UserFile\n * })\n * });\n * ```\n */\nexport async function executePaginatedQuery<TData, TItem, TRawItem = any>(\n config: PaginatedQueryConfig<TData, TItem, TRawItem>,\n): Promise<TItem[]> {\n const {\n endpoint,\n document,\n baseVariables,\n options,\n extractItems,\n transformItem,\n maxPerQuery = 1000,\n } = config;\n\n // Set pagination defaults\n const limit = options?.fetchAll\n ? Number.MAX_SAFE_INTEGER\n : (options?.limit ?? 100);\n const offset = options?.offset ?? 0;\n const orderBy = options?.orderBy;\n const orderDirection = options?.orderDirection;\n\n const allItems: TItem[] = [];\n let currentOffset = offset;\n const pageSize = Math.min(limit, maxPerQuery);\n\n // Handle fetchAll by making multiple queries if needed\n while (true) {\n const currentLimit = options?.fetchAll\n ? pageSize\n : Math.min(pageSize, limit - allItems.length);\n\n // Build query variables\n const variables = {\n ...baseVariables,\n first: currentLimit,\n skip: currentOffset,\n ...(orderBy && { orderBy }),\n ...(orderDirection && { orderDirection }),\n };\n\n // Execute query\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: print(document),\n variables,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as SubgraphResponse<TData>;\n\n if (result.errors) {\n throw new Error(\n `Subgraph errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n // Extract items from response\n const items = extractItems(result.data as TData);\n\n if (!items || items.length === 0) {\n // No more items\n break;\n }\n\n // Transform items if transformer provided\n const transformedItems: TItem[] = transformItem\n ? items.map(transformItem)\n : (items as unknown as TItem[]);\n\n allItems.push(...transformedItems);\n\n // Check if we have enough items or should continue\n if (!options?.fetchAll && allItems.length >= limit) {\n // We have enough items\n return allItems.slice(0, limit); // Trim to exact limit\n }\n\n if (items.length < currentLimit) {\n // No more items available\n break;\n }\n\n // Continue to next page\n currentOffset += items.length;\n }\n\n return allItems;\n}\n\n/**\n * Helper to map string orderBy values to GraphQL enums\n *\n * @param orderBy - String orderBy value from options\n * @param enumMap - Map of string values to GraphQL enum values\n * @returns The mapped enum value or undefined\n */\nexport function mapOrderByToEnum<T>(\n orderBy: string | undefined,\n enumMap: Record<string, T>,\n defaultValue?: T,\n): T | undefined {\n if (!orderBy) return defaultValue;\n return enumMap[orderBy] ?? defaultValue;\n}\n\n/**\n * Helper to map string orderDirection to GraphQL enum\n *\n * @param direction - Direction string ('asc' or 'desc')\n * @param ascValue - The GraphQL enum value for ascending\n * @param descValue - The GraphQL enum value for descending\n * @returns The mapped enum value\n */\nexport function mapOrderDirection<T>(\n direction: \"asc\" | \"desc\" | undefined,\n ascValue: T,\n descValue: T,\n defaultValue?: T,\n): T {\n if (!direction) return defaultValue ?? descValue;\n return direction === \"asc\" ? ascValue : descValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,qBAAyC;AA+DzC,eAAsB,sBACpB,QACkB;AAClB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,IAAI;AAGJ,QAAM,QAAQ,SAAS,WACnB,OAAO,mBACN,SAAS,SAAS;AACvB,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,UAAU,SAAS;AACzB,QAAM,iBAAiB,SAAS;AAEhC,QAAM,WAAoB,CAAC;AAC3B,MAAI,gBAAgB;AACpB,QAAM,WAAW,KAAK,IAAI,OAAO,WAAW;AAG5C,SAAO,MAAM;AACX,UAAM,eAAe,SAAS,WAC1B,WACA,KAAK,IAAI,UAAU,QAAQ,SAAS,MAAM;AAG9C,UAAM,YAAY;AAAA,MAChB,GAAG;AAAA,MACH,OAAO;AAAA,MACP,MAAM;AAAA,MACN,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC;AAGA,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,WAAO,sBAAM,QAAQ;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,4BAA4B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MACpE;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,SAAS,KAAK;AAEpC,QAAI,OAAO,QAAQ;AACjB,YAAM,IAAI;AAAA,QACR,oBAAoB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AAGA,UAAM,QAAQ,aAAa,OAAO,IAAa;AAE/C,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAEhC;AAAA,IACF;AAGA,UAAM,mBAA4B,gBAC9B,MAAM,IAAI,aAAa,IACtB;AAEL,aAAS,KAAK,GAAG,gBAAgB;AAGjC,QAAI,CAAC,SAAS,YAAY,SAAS,UAAU,OAAO;AAElD,aAAO,SAAS,MAAM,GAAG,KAAK;AAAA,IAChC;AAEA,QAAI,MAAM,SAAS,cAAc;AAE/B;AAAA,IACF;AAGA,qBAAiB,MAAM;AAAA,EACzB;AAEA,SAAO;AACT;AASO,SAAS,iBACd,SACA,SACA,cACe;AACf,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,OAAO,KAAK;AAC7B;AAUO,SAAS,kBACd,WACA,UACA,WACA,cACG;AACH,MAAI,CAAC,UAAW,QAAO,gBAAgB;AACvC,SAAO,cAAc,QAAQ,WAAW;AAC1C;","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Utilities for handling paginated subgraph queries
|
|
3
|
+
* @module vana-sdk/utils/subgraphPagination
|
|
4
|
+
*/
|
|
5
|
+
import { type DocumentNode } from "graphql";
|
|
6
|
+
import type { PaginationOptions } from "../types/options";
|
|
7
|
+
/**
|
|
8
|
+
* Generic subgraph response structure
|
|
9
|
+
*/
|
|
10
|
+
export interface SubgraphResponse<T> {
|
|
11
|
+
data?: T;
|
|
12
|
+
errors?: Array<{
|
|
13
|
+
message: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Configuration for paginated subgraph queries
|
|
18
|
+
*/
|
|
19
|
+
export interface PaginatedQueryConfig<TData, TItem, TRawItem = any> {
|
|
20
|
+
/** The GraphQL endpoint URL */
|
|
21
|
+
endpoint: string;
|
|
22
|
+
/** The GraphQL document to execute */
|
|
23
|
+
document: DocumentNode;
|
|
24
|
+
/** Base variables for the query (e.g., userId) */
|
|
25
|
+
baseVariables: Record<string, any>;
|
|
26
|
+
/** Pagination options from the user */
|
|
27
|
+
options?: PaginationOptions;
|
|
28
|
+
/** Function to extract items from the response */
|
|
29
|
+
extractItems: (data: TData) => TRawItem[] | undefined;
|
|
30
|
+
/** Function to transform items if needed */
|
|
31
|
+
transformItem?: (item: TRawItem) => TItem;
|
|
32
|
+
/** Maximum items per GraphQL query (default: 1000) */
|
|
33
|
+
maxPerQuery?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generic paginated query executor for subgraph queries
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* Handles pagination, fetchAll, and proper GraphQL query construction.
|
|
40
|
+
* Abstracts the common pattern of paginated subgraph queries.
|
|
41
|
+
*
|
|
42
|
+
* @param config - Configuration for the paginated query
|
|
43
|
+
* @returns Array of items from all pages
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const files = await executePaginatedQuery({
|
|
48
|
+
* endpoint: subgraphUrl,
|
|
49
|
+
* document: GetUserFilesPaginatedDocument,
|
|
50
|
+
* baseVariables: { userId: owner.toLowerCase() },
|
|
51
|
+
* options: { limit: 50, orderBy: 'addedAtBlock' },
|
|
52
|
+
* extractItems: (data) => data?.user?.files,
|
|
53
|
+
* transformItem: (file) => ({
|
|
54
|
+
* id: parseInt(file.id),
|
|
55
|
+
* url: file.url,
|
|
56
|
+
* // ... transform to UserFile
|
|
57
|
+
* })
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function executePaginatedQuery<TData, TItem, TRawItem = any>(config: PaginatedQueryConfig<TData, TItem, TRawItem>): Promise<TItem[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Helper to map string orderBy values to GraphQL enums
|
|
64
|
+
*
|
|
65
|
+
* @param orderBy - String orderBy value from options
|
|
66
|
+
* @param enumMap - Map of string values to GraphQL enum values
|
|
67
|
+
* @returns The mapped enum value or undefined
|
|
68
|
+
*/
|
|
69
|
+
export declare function mapOrderByToEnum<T>(orderBy: string | undefined, enumMap: Record<string, T>, defaultValue?: T): T | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Helper to map string orderDirection to GraphQL enum
|
|
72
|
+
*
|
|
73
|
+
* @param direction - Direction string ('asc' or 'desc')
|
|
74
|
+
* @param ascValue - The GraphQL enum value for ascending
|
|
75
|
+
* @param descValue - The GraphQL enum value for descending
|
|
76
|
+
* @returns The mapped enum value
|
|
77
|
+
*/
|
|
78
|
+
export declare function mapOrderDirection<T>(direction: "asc" | "desc" | undefined, ascValue: T, descValue: T, defaultValue?: T): T;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { print } from "graphql";
|
|
2
|
+
async function executePaginatedQuery(config) {
|
|
3
|
+
const {
|
|
4
|
+
endpoint,
|
|
5
|
+
document,
|
|
6
|
+
baseVariables,
|
|
7
|
+
options,
|
|
8
|
+
extractItems,
|
|
9
|
+
transformItem,
|
|
10
|
+
maxPerQuery = 1e3
|
|
11
|
+
} = config;
|
|
12
|
+
const limit = options?.fetchAll ? Number.MAX_SAFE_INTEGER : options?.limit ?? 100;
|
|
13
|
+
const offset = options?.offset ?? 0;
|
|
14
|
+
const orderBy = options?.orderBy;
|
|
15
|
+
const orderDirection = options?.orderDirection;
|
|
16
|
+
const allItems = [];
|
|
17
|
+
let currentOffset = offset;
|
|
18
|
+
const pageSize = Math.min(limit, maxPerQuery);
|
|
19
|
+
while (true) {
|
|
20
|
+
const currentLimit = options?.fetchAll ? pageSize : Math.min(pageSize, limit - allItems.length);
|
|
21
|
+
const variables = {
|
|
22
|
+
...baseVariables,
|
|
23
|
+
first: currentLimit,
|
|
24
|
+
skip: currentOffset,
|
|
25
|
+
...orderBy && { orderBy },
|
|
26
|
+
...orderDirection && { orderDirection }
|
|
27
|
+
};
|
|
28
|
+
const response = await fetch(endpoint, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: {
|
|
31
|
+
"Content-Type": "application/json"
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify({
|
|
34
|
+
query: print(document),
|
|
35
|
+
variables
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`Subgraph request failed: ${response.status} ${response.statusText}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
const result = await response.json();
|
|
44
|
+
if (result.errors) {
|
|
45
|
+
throw new Error(
|
|
46
|
+
`Subgraph errors: ${result.errors.map((e) => e.message).join(", ")}`
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
const items = extractItems(result.data);
|
|
50
|
+
if (!items || items.length === 0) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
const transformedItems = transformItem ? items.map(transformItem) : items;
|
|
54
|
+
allItems.push(...transformedItems);
|
|
55
|
+
if (!options?.fetchAll && allItems.length >= limit) {
|
|
56
|
+
return allItems.slice(0, limit);
|
|
57
|
+
}
|
|
58
|
+
if (items.length < currentLimit) {
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
currentOffset += items.length;
|
|
62
|
+
}
|
|
63
|
+
return allItems;
|
|
64
|
+
}
|
|
65
|
+
function mapOrderByToEnum(orderBy, enumMap, defaultValue) {
|
|
66
|
+
if (!orderBy) return defaultValue;
|
|
67
|
+
return enumMap[orderBy] ?? defaultValue;
|
|
68
|
+
}
|
|
69
|
+
function mapOrderDirection(direction, ascValue, descValue, defaultValue) {
|
|
70
|
+
if (!direction) return defaultValue ?? descValue;
|
|
71
|
+
return direction === "asc" ? ascValue : descValue;
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
executePaginatedQuery,
|
|
75
|
+
mapOrderByToEnum,
|
|
76
|
+
mapOrderDirection
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=subgraphPagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/subgraphPagination.ts"],"sourcesContent":["/**\n * @file Utilities for handling paginated subgraph queries\n * @module vana-sdk/utils/subgraphPagination\n */\n\nimport { print, type DocumentNode } from \"graphql\";\nimport type { PaginationOptions } from \"../types/options\";\n\n/**\n * Generic subgraph response structure\n */\nexport interface SubgraphResponse<T> {\n data?: T;\n errors?: Array<{ message: string }>;\n}\n\n/**\n * Configuration for paginated subgraph queries\n */\nexport interface PaginatedQueryConfig<TData, TItem, TRawItem = any> {\n /** The GraphQL endpoint URL */\n endpoint: string;\n\n /** The GraphQL document to execute */\n document: DocumentNode;\n\n /** Base variables for the query (e.g., userId) */\n baseVariables: Record<string, any>;\n\n /** Pagination options from the user */\n options?: PaginationOptions;\n\n /** Function to extract items from the response */\n extractItems: (data: TData) => TRawItem[] | undefined;\n\n /** Function to transform items if needed */\n transformItem?: (item: TRawItem) => TItem;\n\n /** Maximum items per GraphQL query (default: 1000) */\n maxPerQuery?: number;\n}\n\n/**\n * Generic paginated query executor for subgraph queries\n *\n * @remarks\n * Handles pagination, fetchAll, and proper GraphQL query construction.\n * Abstracts the common pattern of paginated subgraph queries.\n *\n * @param config - Configuration for the paginated query\n * @returns Array of items from all pages\n *\n * @example\n * ```typescript\n * const files = await executePaginatedQuery({\n * endpoint: subgraphUrl,\n * document: GetUserFilesPaginatedDocument,\n * baseVariables: { userId: owner.toLowerCase() },\n * options: { limit: 50, orderBy: 'addedAtBlock' },\n * extractItems: (data) => data?.user?.files,\n * transformItem: (file) => ({\n * id: parseInt(file.id),\n * url: file.url,\n * // ... transform to UserFile\n * })\n * });\n * ```\n */\nexport async function executePaginatedQuery<TData, TItem, TRawItem = any>(\n config: PaginatedQueryConfig<TData, TItem, TRawItem>,\n): Promise<TItem[]> {\n const {\n endpoint,\n document,\n baseVariables,\n options,\n extractItems,\n transformItem,\n maxPerQuery = 1000,\n } = config;\n\n // Set pagination defaults\n const limit = options?.fetchAll\n ? Number.MAX_SAFE_INTEGER\n : (options?.limit ?? 100);\n const offset = options?.offset ?? 0;\n const orderBy = options?.orderBy;\n const orderDirection = options?.orderDirection;\n\n const allItems: TItem[] = [];\n let currentOffset = offset;\n const pageSize = Math.min(limit, maxPerQuery);\n\n // Handle fetchAll by making multiple queries if needed\n while (true) {\n const currentLimit = options?.fetchAll\n ? pageSize\n : Math.min(pageSize, limit - allItems.length);\n\n // Build query variables\n const variables = {\n ...baseVariables,\n first: currentLimit,\n skip: currentOffset,\n ...(orderBy && { orderBy }),\n ...(orderDirection && { orderDirection }),\n };\n\n // Execute query\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: print(document),\n variables,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as SubgraphResponse<TData>;\n\n if (result.errors) {\n throw new Error(\n `Subgraph errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n // Extract items from response\n const items = extractItems(result.data as TData);\n\n if (!items || items.length === 0) {\n // No more items\n break;\n }\n\n // Transform items if transformer provided\n const transformedItems: TItem[] = transformItem\n ? items.map(transformItem)\n : (items as unknown as TItem[]);\n\n allItems.push(...transformedItems);\n\n // Check if we have enough items or should continue\n if (!options?.fetchAll && allItems.length >= limit) {\n // We have enough items\n return allItems.slice(0, limit); // Trim to exact limit\n }\n\n if (items.length < currentLimit) {\n // No more items available\n break;\n }\n\n // Continue to next page\n currentOffset += items.length;\n }\n\n return allItems;\n}\n\n/**\n * Helper to map string orderBy values to GraphQL enums\n *\n * @param orderBy - String orderBy value from options\n * @param enumMap - Map of string values to GraphQL enum values\n * @returns The mapped enum value or undefined\n */\nexport function mapOrderByToEnum<T>(\n orderBy: string | undefined,\n enumMap: Record<string, T>,\n defaultValue?: T,\n): T | undefined {\n if (!orderBy) return defaultValue;\n return enumMap[orderBy] ?? defaultValue;\n}\n\n/**\n * Helper to map string orderDirection to GraphQL enum\n *\n * @param direction - Direction string ('asc' or 'desc')\n * @param ascValue - The GraphQL enum value for ascending\n * @param descValue - The GraphQL enum value for descending\n * @returns The mapped enum value\n */\nexport function mapOrderDirection<T>(\n direction: \"asc\" | \"desc\" | undefined,\n ascValue: T,\n descValue: T,\n defaultValue?: T,\n): T {\n if (!direction) return defaultValue ?? descValue;\n return direction === \"asc\" ? ascValue : descValue;\n}\n"],"mappings":"AAKA,SAAS,aAAgC;AA+DzC,eAAsB,sBACpB,QACkB;AAClB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,IAAI;AAGJ,QAAM,QAAQ,SAAS,WACnB,OAAO,mBACN,SAAS,SAAS;AACvB,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,UAAU,SAAS;AACzB,QAAM,iBAAiB,SAAS;AAEhC,QAAM,WAAoB,CAAC;AAC3B,MAAI,gBAAgB;AACpB,QAAM,WAAW,KAAK,IAAI,OAAO,WAAW;AAG5C,SAAO,MAAM;AACX,UAAM,eAAe,SAAS,WAC1B,WACA,KAAK,IAAI,UAAU,QAAQ,SAAS,MAAM;AAG9C,UAAM,YAAY;AAAA,MAChB,GAAG;AAAA,MACH,OAAO;AAAA,MACP,MAAM;AAAA,MACN,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC;AAGA,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO,MAAM,QAAQ;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,4BAA4B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MACpE;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,SAAS,KAAK;AAEpC,QAAI,OAAO,QAAQ;AACjB,YAAM,IAAI;AAAA,QACR,oBAAoB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACpE;AAAA,IACF;AAGA,UAAM,QAAQ,aAAa,OAAO,IAAa;AAE/C,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAEhC;AAAA,IACF;AAGA,UAAM,mBAA4B,gBAC9B,MAAM,IAAI,aAAa,IACtB;AAEL,aAAS,KAAK,GAAG,gBAAgB;AAGjC,QAAI,CAAC,SAAS,YAAY,SAAS,UAAU,OAAO;AAElD,aAAO,SAAS,MAAM,GAAG,KAAK;AAAA,IAChC;AAEA,QAAI,MAAM,SAAS,cAAc;AAE/B;AAAA,IACF;AAGA,qBAAiB,MAAM;AAAA,EACzB;AAEA,SAAO;AACT;AASO,SAAS,iBACd,SACA,SACA,cACe;AACf,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,OAAO,KAAK;AAC7B;AAUO,SAAS,kBACd,WACA,UACA,WACA,cACG;AACH,MAAI,CAAC,UAAW,QAAO,gBAAgB;AACvC,SAAO,cAAc,QAAQ,WAAW;AAC1C;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendatalabs/vana-sdk",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.a78ce5c",
|
|
4
4
|
"description": "A TypeScript library for interacting with Vana Network smart contracts.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -122,6 +122,7 @@
|
|
|
122
122
|
"eccrypto-js": "^5.4.0",
|
|
123
123
|
"graphql": "^16.11.0",
|
|
124
124
|
"openpgp": "^6.1.1",
|
|
125
|
+
"uuid": "^13.0.0",
|
|
125
126
|
"viem": "^2.35.1"
|
|
126
127
|
},
|
|
127
128
|
"devDependencies": {
|
|
@@ -131,6 +132,7 @@
|
|
|
131
132
|
"@graphql-codegen/typescript-operations": "^4.6.1",
|
|
132
133
|
"@types/node": "^24.3.0",
|
|
133
134
|
"@types/secp256k1": "^4.0.6",
|
|
135
|
+
"@types/uuid": "^10.0.0",
|
|
134
136
|
"@typescript-eslint/eslint-plugin": "^8.41.0",
|
|
135
137
|
"@typescript-eslint/parser": "^8.41.0",
|
|
136
138
|
"@vitest/coverage-v8": "^3.2.4",
|