@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["/**\n * Storage API for Vana SDK\n *\n * Provides unified interface for different storage providers\n * to upload, download, and manage user data files.\n *\n * ## Storage Provider Decision Tree\n *\n * Choose your storage provider based on your needs:\n *\n * **Need full CRUD operations and metadata?**\n * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata\n *\n * **Want to use your own IPFS infrastructure?**\n * - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service\n * - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node\n * - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service\n *\n * **Want flexible callback-based storage?**\n * - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)\n *\n * **Need Google Drive integration?**\n * - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management\n *\n * @example\n * ```typescript\n * // Managed IPFS with full features\n * const pinata = new PinataStorage({ jwt: \"your-jwt\" });\n *\n * // Standard IPFS with Infura\n * const ipfs = IpfsStorage.forInfura({ projectId: \"...\", projectSecret: \"...\" });\n *\n * // Callback-based storage (flexible)\n * const storage = new CallbackStorage({\n * async upload(blob, filename) {\n * // Your custom upload logic\n * const response = await fetch('/api/upload', { method: 'POST', body: blob });\n * const data = await response.json();\n * return { url: data.url, size: blob.size, contentType: blob.type };\n * },\n * async download(identifier) {\n * // Your custom download logic\n * const response = await fetch(`/api/download/${identifier}`);\n * return response.blob();\n * }\n * });\n * ```\n */\n\n// Re-export storage types from types module to avoid circular dependencies\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"../types/storage\";\n\nexport { StorageError } from \"../types/storage\";\n\n// Export storage providers\nexport { GoogleDriveStorage } from \"./providers/google-drive\";\nexport { IpfsStorage } from \"./providers/ipfs\";\nexport { PinataStorage } from \"./providers/pinata\";\nexport { CallbackStorage } from \"./providers/callback-storage\";\n\n// Export storage manager\nexport { StorageManager } from \"./manager\";\n\n// Export storage callback types\nexport type {\n StorageCallbacks,\n StorageDownloadOptions,\n StorageListResult,\n} from \"../types/config\";\n"],"mappings":"AA0DA,SAAS,oBAAoB;AAG7B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAGhC,SAAS,sBAAsB;","names":[]}
1
+ {"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["/**\n * Storage API for Vana SDK\n *\n * Provides unified interface for different storage providers\n * to upload, download, and manage user data files.\n *\n * ## Storage Provider Decision Tree\n *\n * Choose your storage provider based on your needs:\n *\n * **Need full CRUD operations and metadata?**\n * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata\n *\n * **Want to use your own IPFS infrastructure?**\n * - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service\n * - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node\n * - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service\n *\n * **Want flexible callback-based storage?**\n * - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)\n *\n * **Need Google Drive integration?**\n * - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management\n *\n * @example\n * ```typescript\n * // Managed IPFS with full features\n * const pinata = new PinataStorage({ jwt: \"your-jwt\" });\n *\n * // Standard IPFS with Infura\n * const ipfs = IpfsStorage.forInfura({ projectId: \"...\", projectSecret: \"...\" });\n *\n * // Callback-based storage (flexible)\n * const storage = new CallbackStorage({\n * async upload(blob, filename) {\n * // Your custom upload logic\n * const response = await fetch('/api/upload', { method: 'POST', body: blob });\n * const data = await response.json();\n * return { url: data.url, size: blob.size, contentType: blob.type };\n * },\n * async download(identifier) {\n * // Your custom download logic\n * const response = await fetch(`/api/download/${identifier}`);\n * return response.blob();\n * }\n * });\n * ```\n */\n\n// Re-export storage types from types module to avoid circular dependencies\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"../types/storage\";\n\nexport { StorageError } from \"../types/storage\";\n\n// Export storage providers\nexport { GoogleDriveStorage } from \"./providers/google-drive\";\nexport { DropboxStorage } from \"./providers/dropbox\";\nexport { IpfsStorage } from \"./providers/ipfs\";\nexport { PinataStorage } from \"./providers/pinata\";\nexport { CallbackStorage } from \"./providers/callback-storage\";\n\n// Export storage manager\nexport { StorageManager } from \"./manager\";\n\n// Export storage callback types\nexport type {\n StorageCallbacks,\n StorageDownloadOptions,\n StorageListResult,\n} from \"../types/config\";\n"],"mappings":"AA0DA,SAAS,oBAAoB;AAG7B,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAGhC,SAAS,sBAAsB;","names":[]}
@@ -0,0 +1,237 @@
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 dropbox_exports = {};
20
+ __export(dropbox_exports, {
21
+ DropboxStorage: () => DropboxStorage
22
+ });
23
+ module.exports = __toCommonJS(dropbox_exports);
24
+ var import__ = require("../index");
25
+ class DropboxStorage {
26
+ constructor(config) {
27
+ this.config = config;
28
+ if (!config.accessToken) {
29
+ throw new import__.StorageError(
30
+ "Dropbox access token is required",
31
+ "MISSING_ACCESS_TOKEN",
32
+ "dropbox"
33
+ );
34
+ }
35
+ this.rootPath = config.rootPath ?? "/Vana Data";
36
+ }
37
+ apiUrl = "https://api.dropboxapi.com/2";
38
+ contentUrl = "https://content.dropboxapi.com/2";
39
+ rootPath;
40
+ async upload(file, filename) {
41
+ try {
42
+ const fileName = filename ?? `vana-file-${Date.now()}.dat`;
43
+ const path = `${this.rootPath}/${fileName}`;
44
+ const response = await fetch(`${this.contentUrl}/files/upload`, {
45
+ method: "POST",
46
+ headers: {
47
+ Authorization: `Bearer ${this.config.accessToken}`,
48
+ "Content-Type": "application/octet-stream",
49
+ "Dropbox-API-Arg": JSON.stringify({
50
+ path,
51
+ mode: "add",
52
+ autorename: true,
53
+ mute: false
54
+ })
55
+ },
56
+ body: file
57
+ });
58
+ if (!response.ok) {
59
+ const error = await response.text();
60
+ throw new import__.StorageError(
61
+ `Failed to upload to Dropbox: ${error}`,
62
+ "UPLOAD_FAILED",
63
+ "dropbox"
64
+ );
65
+ }
66
+ const result = await response.json();
67
+ const sharedLinkUrl = await this.createSharedLink(result.path_lower);
68
+ const directDownloadUrl = sharedLinkUrl.replace("www.dropbox.com", "dl.dropboxusercontent.com").replace("?dl=1", "");
69
+ return {
70
+ url: directDownloadUrl,
71
+ size: file.size,
72
+ contentType: file.type || "application/octet-stream",
73
+ metadata: {
74
+ id: result.id,
75
+ path: result.path_display
76
+ }
77
+ };
78
+ } catch (error) {
79
+ if (error instanceof import__.StorageError) throw error;
80
+ throw new import__.StorageError(
81
+ `Dropbox upload error: ${error instanceof Error ? error.message : "Unknown error"}`,
82
+ "UPLOAD_ERROR",
83
+ "dropbox"
84
+ );
85
+ }
86
+ }
87
+ async download(url) {
88
+ const downloadUrl = url.replace(
89
+ "www.dropbox.com",
90
+ "dl.dropboxusercontent.com"
91
+ );
92
+ try {
93
+ const response = await fetch(downloadUrl);
94
+ if (!response.ok) {
95
+ throw new import__.StorageError(
96
+ `Failed to download from Dropbox: ${response.statusText}`,
97
+ "DOWNLOAD_FAILED",
98
+ "dropbox"
99
+ );
100
+ }
101
+ return response.blob();
102
+ } catch (error) {
103
+ if (error instanceof import__.StorageError) throw error;
104
+ throw new import__.StorageError(
105
+ `Dropbox download error: ${error instanceof Error ? error.message : "Unknown error"}`,
106
+ "DOWNLOAD_ERROR",
107
+ "dropbox"
108
+ );
109
+ }
110
+ }
111
+ async list(options) {
112
+ if (!this.config.accessToken) {
113
+ throw new import__.StorageError(
114
+ "Access token not provided",
115
+ "AUTH_ERROR",
116
+ "dropbox"
117
+ );
118
+ }
119
+ try {
120
+ const response = await fetch(`${this.apiUrl}/files/list_folder`, {
121
+ method: "POST",
122
+ headers: {
123
+ Authorization: `Bearer ${this.config.accessToken}`,
124
+ "Content-Type": "application/json"
125
+ },
126
+ body: JSON.stringify({
127
+ path: this.rootPath,
128
+ limit: options?.limit ?? 100,
129
+ include_deleted: false
130
+ })
131
+ });
132
+ if (!response.ok) {
133
+ throw new import__.StorageError(
134
+ `Failed to list Dropbox files: ${await response.text()}`,
135
+ "LIST_FAILED",
136
+ "dropbox"
137
+ );
138
+ }
139
+ const result = await response.json();
140
+ return result.entries.filter((entry) => entry[".tag"] === "file").map((file) => ({
141
+ id: file.id,
142
+ name: file.name,
143
+ url: `dropbox://${file.path_lower}`,
144
+ // Placeholder URL
145
+ size: file.size,
146
+ contentType: "application/octet-stream",
147
+ // Dropbox API doesn't provide this in list
148
+ createdAt: new Date(file.server_modified)
149
+ }));
150
+ } catch (error) {
151
+ if (error instanceof import__.StorageError) throw error;
152
+ throw new import__.StorageError(
153
+ `Dropbox list error: ${error instanceof Error ? error.message : "Unknown error"}`,
154
+ "LIST_ERROR",
155
+ "dropbox"
156
+ );
157
+ }
158
+ }
159
+ async delete(url) {
160
+ try {
161
+ const path = new URL(url).pathname;
162
+ const response = await fetch(`${this.apiUrl}/files/delete_v2`, {
163
+ method: "POST",
164
+ headers: {
165
+ Authorization: `Bearer ${this.config.accessToken}`,
166
+ "Content-Type": "application/json"
167
+ },
168
+ body: JSON.stringify({ path })
169
+ });
170
+ if (!response.ok && response.status !== 404) {
171
+ const error = await response.text();
172
+ throw new import__.StorageError(
173
+ `Failed to delete from Dropbox: ${error}`,
174
+ "DELETE_FAILED",
175
+ "dropbox"
176
+ );
177
+ }
178
+ return true;
179
+ } catch (error) {
180
+ if (error instanceof import__.StorageError) throw error;
181
+ throw new import__.StorageError(
182
+ `Dropbox delete error: ${error instanceof Error ? error.message : "Unknown error"}`,
183
+ "DELETE_ERROR",
184
+ "dropbox"
185
+ );
186
+ }
187
+ }
188
+ getConfig() {
189
+ return {
190
+ name: "Dropbox",
191
+ type: "dropbox",
192
+ requiresAuth: true,
193
+ features: {
194
+ upload: true,
195
+ download: true,
196
+ list: true,
197
+ delete: true
198
+ }
199
+ };
200
+ }
201
+ async createSharedLink(path) {
202
+ const response = await fetch(
203
+ `${this.apiUrl}/sharing/create_shared_link_with_settings`,
204
+ {
205
+ method: "POST",
206
+ headers: {
207
+ Authorization: `Bearer ${this.config.accessToken}`,
208
+ "Content-Type": "application/json"
209
+ },
210
+ body: JSON.stringify({
211
+ path,
212
+ settings: {
213
+ requested_visibility: "public"
214
+ }
215
+ })
216
+ }
217
+ );
218
+ if (!response.ok) {
219
+ const errorData = await response.json();
220
+ if (response.status === 409 && errorData.error?.shared_link_already_exists) {
221
+ return errorData.error.shared_link_already_exists.metadata.url;
222
+ }
223
+ throw new import__.StorageError(
224
+ `Failed to create shared link: ${JSON.stringify(errorData)}`,
225
+ "LINK_CREATION_FAILED",
226
+ "dropbox"
227
+ );
228
+ }
229
+ const result = await response.json();
230
+ return result.url.replace("?dl=0", "?dl=1");
231
+ }
232
+ }
233
+ // Annotate the CommonJS export names for ESM import in node:
234
+ 0 && (module.exports = {
235
+ DropboxStorage
236
+ });
237
+ //# sourceMappingURL=dropbox.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/storage/providers/dropbox.ts"],"sourcesContent":["/**\n * Dropbox Storage Provider for Vana SDK\n *\n * Implements the storage interface for Dropbox using its API.\n */\n\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../index\";\n\nexport interface DropboxConfig {\n /** OAuth2 access token */\n accessToken: string;\n /** Optional refresh token for token renewal */\n refreshToken?: string;\n /** OAuth2 client ID */\n clientId?: string;\n /** OAuth2 client secret */\n clientSecret?: string;\n /** Root path for uploads (defaults to '/Vana Data') */\n rootPath?: string;\n}\n\ninterface DropboxUploadResponse {\n name: string;\n path_lower: string;\n path_display: string;\n id: string;\n size: number;\n}\n\ninterface DropboxSharedLinkResponse {\n url: string;\n}\n\ninterface DropboxListResponse {\n entries: Array<{\n \".tag\": \"file\" | \"folder\";\n name: string;\n path_lower: string;\n id: string;\n server_modified: string;\n size: number;\n }>;\n has_more: boolean;\n cursor: string;\n}\n\n/**\n * Dropbox Storage Provider\n *\n * @remarks\n * Implements the storage interface for Dropbox. Requires OAuth2 authentication.\n *\n * @category Storage\n */\nexport class DropboxStorage implements StorageProvider {\n private readonly apiUrl = \"https://api.dropboxapi.com/2\";\n private readonly contentUrl = \"https://content.dropboxapi.com/2\";\n private readonly rootPath: string;\n\n constructor(private config: DropboxConfig) {\n if (!config.accessToken) {\n throw new StorageError(\n \"Dropbox access token is required\",\n \"MISSING_ACCESS_TOKEN\",\n \"dropbox\",\n );\n }\n this.rootPath = config.rootPath ?? \"/Vana Data\";\n }\n\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const fileName = filename ?? `vana-file-${Date.now()}.dat`;\n const path = `${this.rootPath}/${fileName}`;\n\n const response = await fetch(`${this.contentUrl}/files/upload`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/octet-stream\",\n \"Dropbox-API-Arg\": JSON.stringify({\n path,\n mode: \"add\",\n autorename: true,\n mute: false,\n }),\n },\n body: file,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new StorageError(\n `Failed to upload to Dropbox: ${error}`,\n \"UPLOAD_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxUploadResponse;\n const sharedLinkUrl = await this.createSharedLink(result.path_lower);\n\n // Convert the shareable URL to a direct download URL before returning.\n // This ensures the correct, raw-content URL is stored on-chain.\n const directDownloadUrl = sharedLinkUrl\n .replace(\"www.dropbox.com\", \"dl.dropboxusercontent.com\")\n .replace(\"?dl=1\", \"\");\n\n return {\n url: directDownloadUrl,\n size: file.size,\n contentType: file.type || \"application/octet-stream\",\n metadata: {\n id: result.id,\n path: result.path_display,\n },\n };\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox upload error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"UPLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async download(url: string): Promise<Blob> {\n // URL to force a direct download instead of showing the preview page.\n // This is done by changing the hostname from 'www.dropbox.com' to 'dl.dropboxusercontent.com'.\n const downloadUrl = url.replace(\n \"www.dropbox.com\",\n \"dl.dropboxusercontent.com\",\n );\n try {\n const response = await fetch(downloadUrl);\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to download from Dropbox: ${response.statusText}`,\n \"DOWNLOAD_FAILED\",\n \"dropbox\",\n );\n }\n return response.blob();\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox download error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DOWNLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.config.accessToken) {\n throw new StorageError(\n \"Access token not provided\",\n \"AUTH_ERROR\",\n \"dropbox\",\n );\n }\n\n try {\n const response = await fetch(`${this.apiUrl}/files/list_folder`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.rootPath,\n limit: options?.limit ?? 100,\n include_deleted: false,\n }),\n });\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to list Dropbox files: ${await response.text()}`,\n \"LIST_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxListResponse;\n\n return result.entries\n .filter((entry) => entry[\".tag\"] === \"file\")\n .map((file) => ({\n id: file.id,\n name: file.name,\n url: `dropbox://${file.path_lower}`, // Placeholder URL\n size: file.size,\n contentType: \"application/octet-stream\", // Dropbox API doesn't provide this in list\n createdAt: new Date(file.server_modified),\n }));\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox list error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"LIST_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async delete(url: string): Promise<boolean> {\n try {\n const path = new URL(url).pathname; // Assuming a direct URL format that includes the path\n const response = await fetch(`${this.apiUrl}/files/delete_v2`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ path }),\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n throw new StorageError(\n `Failed to delete from Dropbox: ${error}`,\n \"DELETE_FAILED\",\n \"dropbox\",\n );\n }\n\n return true;\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox delete error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DELETE_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n getConfig(): StorageProviderConfig {\n return {\n name: \"Dropbox\",\n type: \"dropbox\",\n requiresAuth: true,\n features: {\n upload: true,\n download: true,\n list: true,\n delete: true,\n },\n };\n }\n\n private async createSharedLink(path: string): Promise<string> {\n const response = await fetch(\n `${this.apiUrl}/sharing/create_shared_link_with_settings`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path,\n settings: {\n requested_visibility: \"public\",\n },\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n // If link already exists, Dropbox returns a 409 with the existing link\n if (\n response.status === 409 &&\n errorData.error?.shared_link_already_exists\n ) {\n return errorData.error.shared_link_already_exists.metadata.url;\n }\n throw new StorageError(\n `Failed to create shared link: ${JSON.stringify(errorData)}`,\n \"LINK_CREATION_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxSharedLinkResponse;\n // Modify URL for direct download\n return result.url.replace(\"?dl=0\", \"?dl=1\");\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Dropbox Storage Provider for Vana SDK
3
+ *
4
+ * Implements the storage interface for Dropbox using its API.
5
+ */
6
+ import { type StorageProvider, type StorageUploadResult, type StorageFile, type StorageListOptions, type StorageProviderConfig } from "../index";
7
+ export interface DropboxConfig {
8
+ /** OAuth2 access token */
9
+ accessToken: string;
10
+ /** Optional refresh token for token renewal */
11
+ refreshToken?: string;
12
+ /** OAuth2 client ID */
13
+ clientId?: string;
14
+ /** OAuth2 client secret */
15
+ clientSecret?: string;
16
+ /** Root path for uploads (defaults to '/Vana Data') */
17
+ rootPath?: string;
18
+ }
19
+ /**
20
+ * Dropbox Storage Provider
21
+ *
22
+ * @remarks
23
+ * Implements the storage interface for Dropbox. Requires OAuth2 authentication.
24
+ *
25
+ * @category Storage
26
+ */
27
+ export declare class DropboxStorage implements StorageProvider {
28
+ private config;
29
+ private readonly apiUrl;
30
+ private readonly contentUrl;
31
+ private readonly rootPath;
32
+ constructor(config: DropboxConfig);
33
+ upload(file: Blob, filename?: string): Promise<StorageUploadResult>;
34
+ download(url: string): Promise<Blob>;
35
+ list(options?: StorageListOptions): Promise<StorageFile[]>;
36
+ delete(url: string): Promise<boolean>;
37
+ getConfig(): StorageProviderConfig;
38
+ private createSharedLink;
39
+ }
@@ -0,0 +1,215 @@
1
+ import {
2
+ StorageError
3
+ } from "../index";
4
+ class DropboxStorage {
5
+ constructor(config) {
6
+ this.config = config;
7
+ if (!config.accessToken) {
8
+ throw new StorageError(
9
+ "Dropbox access token is required",
10
+ "MISSING_ACCESS_TOKEN",
11
+ "dropbox"
12
+ );
13
+ }
14
+ this.rootPath = config.rootPath ?? "/Vana Data";
15
+ }
16
+ apiUrl = "https://api.dropboxapi.com/2";
17
+ contentUrl = "https://content.dropboxapi.com/2";
18
+ rootPath;
19
+ async upload(file, filename) {
20
+ try {
21
+ const fileName = filename ?? `vana-file-${Date.now()}.dat`;
22
+ const path = `${this.rootPath}/${fileName}`;
23
+ const response = await fetch(`${this.contentUrl}/files/upload`, {
24
+ method: "POST",
25
+ headers: {
26
+ Authorization: `Bearer ${this.config.accessToken}`,
27
+ "Content-Type": "application/octet-stream",
28
+ "Dropbox-API-Arg": JSON.stringify({
29
+ path,
30
+ mode: "add",
31
+ autorename: true,
32
+ mute: false
33
+ })
34
+ },
35
+ body: file
36
+ });
37
+ if (!response.ok) {
38
+ const error = await response.text();
39
+ throw new StorageError(
40
+ `Failed to upload to Dropbox: ${error}`,
41
+ "UPLOAD_FAILED",
42
+ "dropbox"
43
+ );
44
+ }
45
+ const result = await response.json();
46
+ const sharedLinkUrl = await this.createSharedLink(result.path_lower);
47
+ const directDownloadUrl = sharedLinkUrl.replace("www.dropbox.com", "dl.dropboxusercontent.com").replace("?dl=1", "");
48
+ return {
49
+ url: directDownloadUrl,
50
+ size: file.size,
51
+ contentType: file.type || "application/octet-stream",
52
+ metadata: {
53
+ id: result.id,
54
+ path: result.path_display
55
+ }
56
+ };
57
+ } catch (error) {
58
+ if (error instanceof StorageError) throw error;
59
+ throw new StorageError(
60
+ `Dropbox upload error: ${error instanceof Error ? error.message : "Unknown error"}`,
61
+ "UPLOAD_ERROR",
62
+ "dropbox"
63
+ );
64
+ }
65
+ }
66
+ async download(url) {
67
+ const downloadUrl = url.replace(
68
+ "www.dropbox.com",
69
+ "dl.dropboxusercontent.com"
70
+ );
71
+ try {
72
+ const response = await fetch(downloadUrl);
73
+ if (!response.ok) {
74
+ throw new StorageError(
75
+ `Failed to download from Dropbox: ${response.statusText}`,
76
+ "DOWNLOAD_FAILED",
77
+ "dropbox"
78
+ );
79
+ }
80
+ return response.blob();
81
+ } catch (error) {
82
+ if (error instanceof StorageError) throw error;
83
+ throw new StorageError(
84
+ `Dropbox download error: ${error instanceof Error ? error.message : "Unknown error"}`,
85
+ "DOWNLOAD_ERROR",
86
+ "dropbox"
87
+ );
88
+ }
89
+ }
90
+ async list(options) {
91
+ if (!this.config.accessToken) {
92
+ throw new StorageError(
93
+ "Access token not provided",
94
+ "AUTH_ERROR",
95
+ "dropbox"
96
+ );
97
+ }
98
+ try {
99
+ const response = await fetch(`${this.apiUrl}/files/list_folder`, {
100
+ method: "POST",
101
+ headers: {
102
+ Authorization: `Bearer ${this.config.accessToken}`,
103
+ "Content-Type": "application/json"
104
+ },
105
+ body: JSON.stringify({
106
+ path: this.rootPath,
107
+ limit: options?.limit ?? 100,
108
+ include_deleted: false
109
+ })
110
+ });
111
+ if (!response.ok) {
112
+ throw new StorageError(
113
+ `Failed to list Dropbox files: ${await response.text()}`,
114
+ "LIST_FAILED",
115
+ "dropbox"
116
+ );
117
+ }
118
+ const result = await response.json();
119
+ return result.entries.filter((entry) => entry[".tag"] === "file").map((file) => ({
120
+ id: file.id,
121
+ name: file.name,
122
+ url: `dropbox://${file.path_lower}`,
123
+ // Placeholder URL
124
+ size: file.size,
125
+ contentType: "application/octet-stream",
126
+ // Dropbox API doesn't provide this in list
127
+ createdAt: new Date(file.server_modified)
128
+ }));
129
+ } catch (error) {
130
+ if (error instanceof StorageError) throw error;
131
+ throw new StorageError(
132
+ `Dropbox list error: ${error instanceof Error ? error.message : "Unknown error"}`,
133
+ "LIST_ERROR",
134
+ "dropbox"
135
+ );
136
+ }
137
+ }
138
+ async delete(url) {
139
+ try {
140
+ const path = new URL(url).pathname;
141
+ const response = await fetch(`${this.apiUrl}/files/delete_v2`, {
142
+ method: "POST",
143
+ headers: {
144
+ Authorization: `Bearer ${this.config.accessToken}`,
145
+ "Content-Type": "application/json"
146
+ },
147
+ body: JSON.stringify({ path })
148
+ });
149
+ if (!response.ok && response.status !== 404) {
150
+ const error = await response.text();
151
+ throw new StorageError(
152
+ `Failed to delete from Dropbox: ${error}`,
153
+ "DELETE_FAILED",
154
+ "dropbox"
155
+ );
156
+ }
157
+ return true;
158
+ } catch (error) {
159
+ if (error instanceof StorageError) throw error;
160
+ throw new StorageError(
161
+ `Dropbox delete error: ${error instanceof Error ? error.message : "Unknown error"}`,
162
+ "DELETE_ERROR",
163
+ "dropbox"
164
+ );
165
+ }
166
+ }
167
+ getConfig() {
168
+ return {
169
+ name: "Dropbox",
170
+ type: "dropbox",
171
+ requiresAuth: true,
172
+ features: {
173
+ upload: true,
174
+ download: true,
175
+ list: true,
176
+ delete: true
177
+ }
178
+ };
179
+ }
180
+ async createSharedLink(path) {
181
+ const response = await fetch(
182
+ `${this.apiUrl}/sharing/create_shared_link_with_settings`,
183
+ {
184
+ method: "POST",
185
+ headers: {
186
+ Authorization: `Bearer ${this.config.accessToken}`,
187
+ "Content-Type": "application/json"
188
+ },
189
+ body: JSON.stringify({
190
+ path,
191
+ settings: {
192
+ requested_visibility: "public"
193
+ }
194
+ })
195
+ }
196
+ );
197
+ if (!response.ok) {
198
+ const errorData = await response.json();
199
+ if (response.status === 409 && errorData.error?.shared_link_already_exists) {
200
+ return errorData.error.shared_link_already_exists.metadata.url;
201
+ }
202
+ throw new StorageError(
203
+ `Failed to create shared link: ${JSON.stringify(errorData)}`,
204
+ "LINK_CREATION_FAILED",
205
+ "dropbox"
206
+ );
207
+ }
208
+ const result = await response.json();
209
+ return result.url.replace("?dl=0", "?dl=1");
210
+ }
211
+ }
212
+ export {
213
+ DropboxStorage
214
+ };
215
+ //# sourceMappingURL=dropbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/storage/providers/dropbox.ts"],"sourcesContent":["/**\n * Dropbox Storage Provider for Vana SDK\n *\n * Implements the storage interface for Dropbox using its API.\n */\n\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../index\";\n\nexport interface DropboxConfig {\n /** OAuth2 access token */\n accessToken: string;\n /** Optional refresh token for token renewal */\n refreshToken?: string;\n /** OAuth2 client ID */\n clientId?: string;\n /** OAuth2 client secret */\n clientSecret?: string;\n /** Root path for uploads (defaults to '/Vana Data') */\n rootPath?: string;\n}\n\ninterface DropboxUploadResponse {\n name: string;\n path_lower: string;\n path_display: string;\n id: string;\n size: number;\n}\n\ninterface DropboxSharedLinkResponse {\n url: string;\n}\n\ninterface DropboxListResponse {\n entries: Array<{\n \".tag\": \"file\" | \"folder\";\n name: string;\n path_lower: string;\n id: string;\n server_modified: string;\n size: number;\n }>;\n has_more: boolean;\n cursor: string;\n}\n\n/**\n * Dropbox Storage Provider\n *\n * @remarks\n * Implements the storage interface for Dropbox. Requires OAuth2 authentication.\n *\n * @category Storage\n */\nexport class DropboxStorage implements StorageProvider {\n private readonly apiUrl = \"https://api.dropboxapi.com/2\";\n private readonly contentUrl = \"https://content.dropboxapi.com/2\";\n private readonly rootPath: string;\n\n constructor(private config: DropboxConfig) {\n if (!config.accessToken) {\n throw new StorageError(\n \"Dropbox access token is required\",\n \"MISSING_ACCESS_TOKEN\",\n \"dropbox\",\n );\n }\n this.rootPath = config.rootPath ?? \"/Vana Data\";\n }\n\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const fileName = filename ?? `vana-file-${Date.now()}.dat`;\n const path = `${this.rootPath}/${fileName}`;\n\n const response = await fetch(`${this.contentUrl}/files/upload`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/octet-stream\",\n \"Dropbox-API-Arg\": JSON.stringify({\n path,\n mode: \"add\",\n autorename: true,\n mute: false,\n }),\n },\n body: file,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new StorageError(\n `Failed to upload to Dropbox: ${error}`,\n \"UPLOAD_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxUploadResponse;\n const sharedLinkUrl = await this.createSharedLink(result.path_lower);\n\n // Convert the shareable URL to a direct download URL before returning.\n // This ensures the correct, raw-content URL is stored on-chain.\n const directDownloadUrl = sharedLinkUrl\n .replace(\"www.dropbox.com\", \"dl.dropboxusercontent.com\")\n .replace(\"?dl=1\", \"\");\n\n return {\n url: directDownloadUrl,\n size: file.size,\n contentType: file.type || \"application/octet-stream\",\n metadata: {\n id: result.id,\n path: result.path_display,\n },\n };\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox upload error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"UPLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async download(url: string): Promise<Blob> {\n // URL to force a direct download instead of showing the preview page.\n // This is done by changing the hostname from 'www.dropbox.com' to 'dl.dropboxusercontent.com'.\n const downloadUrl = url.replace(\n \"www.dropbox.com\",\n \"dl.dropboxusercontent.com\",\n );\n try {\n const response = await fetch(downloadUrl);\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to download from Dropbox: ${response.statusText}`,\n \"DOWNLOAD_FAILED\",\n \"dropbox\",\n );\n }\n return response.blob();\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox download error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DOWNLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.config.accessToken) {\n throw new StorageError(\n \"Access token not provided\",\n \"AUTH_ERROR\",\n \"dropbox\",\n );\n }\n\n try {\n const response = await fetch(`${this.apiUrl}/files/list_folder`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.rootPath,\n limit: options?.limit ?? 100,\n include_deleted: false,\n }),\n });\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to list Dropbox files: ${await response.text()}`,\n \"LIST_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxListResponse;\n\n return result.entries\n .filter((entry) => entry[\".tag\"] === \"file\")\n .map((file) => ({\n id: file.id,\n name: file.name,\n url: `dropbox://${file.path_lower}`, // Placeholder URL\n size: file.size,\n contentType: \"application/octet-stream\", // Dropbox API doesn't provide this in list\n createdAt: new Date(file.server_modified),\n }));\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox list error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"LIST_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async delete(url: string): Promise<boolean> {\n try {\n const path = new URL(url).pathname; // Assuming a direct URL format that includes the path\n const response = await fetch(`${this.apiUrl}/files/delete_v2`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ path }),\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n throw new StorageError(\n `Failed to delete from Dropbox: ${error}`,\n \"DELETE_FAILED\",\n \"dropbox\",\n );\n }\n\n return true;\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox delete error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DELETE_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n getConfig(): StorageProviderConfig {\n return {\n name: \"Dropbox\",\n type: \"dropbox\",\n requiresAuth: true,\n features: {\n upload: true,\n download: true,\n list: true,\n delete: true,\n },\n };\n }\n\n private async createSharedLink(path: string): Promise<string> {\n const response = await fetch(\n `${this.apiUrl}/sharing/create_shared_link_with_settings`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path,\n settings: {\n requested_visibility: \"public\",\n },\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n // If link already exists, Dropbox returns a 409 with the existing link\n if (\n response.status === 409 &&\n errorData.error?.shared_link_already_exists\n ) {\n return errorData.error.shared_link_already_exists.metadata.url;\n }\n throw new StorageError(\n `Failed to create shared link: ${JSON.stringify(errorData)}`,\n \"LINK_CREATION_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxSharedLinkResponse;\n // Modify URL for direct download\n return result.url.replace(\"?dl=0\", \"?dl=1\");\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
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 atomicStore_exports = {};
20
+ __export(atomicStore_exports, {
21
+ hasNonceSupport: () => hasNonceSupport
22
+ });
23
+ module.exports = __toCommonJS(atomicStore_exports);
24
+ function hasNonceSupport(store) {
25
+ return "atomicAssignNonce" in store && typeof store.atomicAssignNonce === "function";
26
+ }
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ hasNonceSupport
30
+ });
31
+ //# sourceMappingURL=atomicStore.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/atomicStore.ts"],"sourcesContent":["/**\n * Atomic storage primitives for distributed state management.\n *\n * @module\n */\n\n/**\n * Interface for atomic storage operations required by the SDK's distributed components.\n *\n * @remarks\n * Implementations of this interface MUST guarantee atomicity for all operations.\n * These primitives are used by the SDK's internal components to coordinate\n * distributed state in multi-instance deployments (e.g., serverless functions).\n *\n * The SDK provides a reference Redis implementation, but you can implement\n * this interface using any storage backend that supports atomic operations:\n * - PostgreSQL with advisory locks\n * - DynamoDB with conditional writes\n * - MongoDB with findAndModify\n * - Zookeeper or etcd for coordination\n *\n * @example\n * ```typescript\n * // Using the Redis reference implementation\n * import { RedisAtomicStore } from './lib/redisAtomicStore';\n *\n * const atomicStore = new RedisAtomicStore({\n * redis: process.env.REDIS_URL\n * });\n *\n * const vana = Vana({\n * privateKey: process.env.RELAYER_PRIVATE_KEY,\n * atomicStore\n * });\n * ```\n *\n * @category Storage\n */\nexport interface IAtomicStore {\n /**\n * Atomically increments a counter and returns the new value.\n *\n * @remarks\n * This operation MUST be atomic. If the key doesn't exist, it should be\n * initialized to 0 before incrementing. The operation must return the\n * value after incrementing.\n *\n * This is used primarily for nonce assignment where atomicity is critical\n * to prevent conflicts under concurrent load.\n *\n * @param key - The key to increment\n * @returns The new value after incrementing\n *\n * @example\n * ```typescript\n * // First call returns 1\n * const nonce1 = await store.incr('nonce:0x123:1480');\n * // Second call returns 2\n * const nonce2 = await store.incr('nonce:0x123:1480');\n * ```\n */\n incr(key: string): Promise<number>;\n\n /**\n * Attempts to acquire a distributed lock with automatic expiration.\n *\n * @remarks\n * This operation MUST be atomic and follow the \"SET NX EX\" semantics:\n * - Only succeeds if the lock doesn't exist (NX - \"Not eXists\")\n * - Automatically expires after the specified TTL (EX - \"EXpire\")\n * - Returns a unique lock ID on success for safe release\n *\n * The lock ID should be a unique value (e.g., UUID or timestamp+random)\n * that prevents accidental release by other processes.\n *\n * @param key - The lock key\n * @param ttlSeconds - Time-to-live in seconds (automatic expiration)\n * @returns A unique lock ID if acquired, null if lock is already held\n *\n * @example\n * ```typescript\n * const lockId = await store.acquireLock('nonce:lock:0x123', 5);\n * if (lockId) {\n * try {\n * // Critical section - only one process can be here\n * await performCriticalOperation();\n * } finally {\n * await store.releaseLock('nonce:lock:0x123', lockId);\n * }\n * }\n * ```\n */\n acquireLock(key: string, ttlSeconds: number): Promise<string | null>;\n\n /**\n * Releases a previously acquired lock.\n *\n * @remarks\n * This operation MUST be atomic and safe. It should only succeed if the\n * provided lockId matches the current lock value. This prevents accidental\n * release of locks acquired by other processes.\n *\n * Implementations should use compare-and-delete semantics or a Lua script\n * (in Redis) to ensure atomicity.\n *\n * @param key - The lock key\n * @param lockId - The unique ID returned by acquireLock\n *\n * @example\n * ```typescript\n * const lockId = await store.acquireLock('lock:key', 5);\n * if (lockId) {\n * // ... do work ...\n * await store.releaseLock('lock:key', lockId);\n * }\n * ```\n */\n releaseLock(key: string, lockId: string): Promise<void>;\n\n /**\n * Gets the value associated with a key.\n *\n * @remarks\n * This is a simple read operation. It should return null if the key\n * doesn't exist.\n *\n * @param key - The key to retrieve\n * @returns The stored value, or null if not found\n *\n * @example\n * ```typescript\n * const lastUsedNonce = await store.get('lastNonce:0x123:1480');\n * ```\n */\n get(key: string): Promise<string | null>;\n\n /**\n * Sets a key-value pair.\n *\n * @remarks\n * This is a simple write operation. It should overwrite any existing value.\n *\n * @param key - The key to set\n * @param value - The value to store\n *\n * @example\n * ```typescript\n * await store.set('lastNonce:0x123:1480', '42');\n * ```\n */\n set(key: string, value: string): Promise<void>;\n\n /**\n * Sets a key-value pair with expiration.\n *\n * @remarks\n * This operation sets a value with automatic expiration after the specified TTL.\n * Useful for temporary state that should be automatically cleaned up.\n *\n * @param key - The key to set\n * @param value - The value to store\n * @param ttlSeconds - Time-to-live in seconds\n *\n * @example\n * ```typescript\n * // Store operation state for 24 hours\n * await store.setWithTTL('operation:123', JSON.stringify(state), 86400);\n * ```\n */\n setWithTTL?(key: string, value: string, ttlSeconds: number): Promise<void>;\n\n /**\n * Deletes a key.\n *\n * @remarks\n * This operation removes a key from storage. Should be idempotent\n * (no error if key doesn't exist).\n *\n * @param key - The key to delete\n *\n * @example\n * ```typescript\n * await store.delete('temp:data:123');\n * ```\n */\n delete?(key: string): Promise<void>;\n\n /**\n * Executes an atomic script (e.g., Lua in Redis, stored procedure in SQL).\n *\n * @remarks\n * This is an optional method that allows execution of atomic scripts\n * for complex operations that require multiple steps to be atomic.\n * Not all stores support this - simple stores may omit it.\n *\n * For Redis: executes a Lua script\n * For PostgreSQL: executes a stored procedure or CTE\n * For DynamoDB: might use TransactWrite\n *\n * @param script - The script to execute\n * @param keys - Array of keys the script will operate on\n * @param args - Array of arguments to pass to the script\n * @returns The script's return value\n *\n * @example\n * ```typescript\n * const result = await store.eval(\n * 'return redis.call(\"INCR\", KEYS[1])',\n * ['counter:users'],\n * []\n * );\n * ```\n */\n eval?(script: string, keys: string[], args: string[]): Promise<any>;\n}\n\n/**\n * Extended atomic store interface with nonce support.\n *\n * @remarks\n * Some atomic stores (like Redis) provide optimized atomic nonce assignment\n * through native scripting capabilities. This interface extends the base\n * IAtomicStore with this optional optimization.\n *\n * @internal\n */\nexport interface IAtomicStoreWithNonceSupport extends IAtomicStore {\n /**\n * Atomically assigns a nonce with gap prevention.\n *\n * @param key - The storage key for the last used nonce\n * @param pendingCount - The current pending transaction count from blockchain\n * @returns The assigned nonce\n */\n atomicAssignNonce(key: string, pendingCount: number): Promise<number>;\n}\n\n/**\n * Type guard to check if an atomic store supports optimized nonce assignment.\n *\n * @param store - The atomic store to check\n * @returns True if the store supports atomicAssignNonce\n *\n * @internal\n */\nexport function hasNonceSupport(\n store: IAtomicStore,\n): store is IAtomicStoreWithNonceSupport {\n return (\n \"atomicAssignNonce\" in store &&\n typeof (store as IAtomicStoreWithNonceSupport).atomicAssignNonce ===\n \"function\"\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqPO,SAAS,gBACd,OACuC;AACvC,SACE,uBAAuB,SACvB,OAAQ,MAAuC,sBAC7C;AAEN;","names":[]}