@opendatalabs/vana-sdk 2.3.0 → 3.0.0

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 (618) hide show
  1. package/README.md +76 -92
  2. package/dist/auth/errors.cjs +54 -0
  3. package/dist/auth/errors.cjs.map +1 -0
  4. package/dist/auth/errors.d.ts +26 -0
  5. package/dist/auth/errors.js +28 -0
  6. package/dist/auth/errors.js.map +1 -0
  7. package/dist/auth/pkce.cjs +100 -0
  8. package/dist/auth/pkce.cjs.map +1 -0
  9. package/dist/auth/pkce.d.ts +55 -0
  10. package/dist/auth/pkce.js +71 -0
  11. package/dist/auth/pkce.js.map +1 -0
  12. package/dist/auth/token-store.cjs +59 -0
  13. package/dist/auth/token-store.cjs.map +1 -0
  14. package/dist/auth/token-store.d.ts +61 -0
  15. package/dist/auth/token-store.js +35 -0
  16. package/dist/auth/token-store.js.map +1 -0
  17. package/dist/auth/web3-signed-builder.cjs +70 -0
  18. package/dist/auth/web3-signed-builder.cjs.map +1 -0
  19. package/dist/auth/web3-signed-builder.d.ts +47 -0
  20. package/dist/auth/web3-signed-builder.js +45 -0
  21. package/dist/auth/web3-signed-builder.js.map +1 -0
  22. package/dist/auth/web3-signed.cjs +125 -0
  23. package/dist/auth/web3-signed.cjs.map +1 -0
  24. package/dist/auth/web3-signed.d.ts +59 -0
  25. package/dist/auth/web3-signed.js +104 -0
  26. package/dist/auth/web3-signed.js.map +1 -0
  27. package/dist/chains/definitions.cjs +2 -6
  28. package/dist/chains/definitions.cjs.map +1 -1
  29. package/dist/chains/definitions.d.ts +1 -7
  30. package/dist/chains/definitions.js +2 -6
  31. package/dist/chains/definitions.js.map +1 -1
  32. package/dist/config/chains.d.ts +18 -0
  33. package/dist/config/contracts.config.cjs +7 -95
  34. package/dist/config/contracts.config.cjs.map +1 -1
  35. package/dist/config/contracts.config.d.ts +0 -54
  36. package/dist/config/contracts.config.js +6 -93
  37. package/dist/config/contracts.config.js.map +1 -1
  38. package/dist/config/default-services.cjs +0 -10
  39. package/dist/config/default-services.cjs.map +1 -1
  40. package/dist/config/default-services.d.ts +1 -20
  41. package/dist/config/default-services.js +0 -9
  42. package/dist/config/default-services.js.map +1 -1
  43. package/dist/crypto/ecies/interface.cjs +2 -0
  44. package/dist/crypto/ecies/interface.cjs.map +1 -1
  45. package/dist/crypto/ecies/interface.js +2 -0
  46. package/dist/crypto/ecies/interface.js.map +1 -1
  47. package/dist/crypto/envelope/openpgp.cjs +59 -0
  48. package/dist/crypto/envelope/openpgp.cjs.map +1 -0
  49. package/dist/crypto/envelope/openpgp.d.ts +28 -0
  50. package/dist/crypto/envelope/openpgp.js +24 -0
  51. package/dist/crypto/envelope/openpgp.js.map +1 -0
  52. package/dist/crypto/keys/derive.cjs +65 -0
  53. package/dist/crypto/keys/derive.cjs.map +1 -0
  54. package/dist/crypto/keys/derive.d.ts +45 -0
  55. package/dist/crypto/keys/derive.js +38 -0
  56. package/dist/crypto/keys/derive.js.map +1 -0
  57. package/dist/errors.cjs +10 -0
  58. package/dist/errors.cjs.map +1 -1
  59. package/dist/errors.js +10 -0
  60. package/dist/errors.js.map +1 -1
  61. package/dist/generated/abi/index.cjs +2 -37
  62. package/dist/generated/abi/index.cjs.map +1 -1
  63. package/dist/generated/abi/index.d.ts +2683 -9296
  64. package/dist/generated/abi/index.js +2 -29
  65. package/dist/generated/abi/index.js.map +1 -1
  66. package/dist/generated/addresses.cjs +5 -107
  67. package/dist/generated/addresses.cjs.map +1 -1
  68. package/dist/generated/addresses.d.ts +5 -99
  69. package/dist/generated/addresses.js +5 -105
  70. package/dist/generated/addresses.js.map +1 -1
  71. package/dist/index.browser.d.ts +23 -140
  72. package/dist/index.browser.js +32090 -114
  73. package/dist/index.browser.js.map +7 -1
  74. package/dist/index.node.cjs +32809 -160
  75. package/dist/index.node.cjs.map +7 -1
  76. package/dist/index.node.d.ts +22 -210
  77. package/dist/index.node.js +32716 -133
  78. package/dist/index.node.js.map +7 -1
  79. package/dist/protocol/data-file.cjs +56 -0
  80. package/dist/protocol/data-file.cjs.map +1 -0
  81. package/dist/protocol/data-file.d.ts +20 -0
  82. package/dist/protocol/data-file.js +30 -0
  83. package/dist/protocol/data-file.js.map +1 -0
  84. package/dist/protocol/eip712.cjs +123 -0
  85. package/dist/protocol/eip712.cjs.map +1 -0
  86. package/dist/protocol/eip712.d.ts +117 -0
  87. package/dist/protocol/eip712.js +90 -0
  88. package/dist/protocol/eip712.js.map +1 -0
  89. package/dist/protocol/gateway.cjs +226 -0
  90. package/dist/protocol/gateway.cjs.map +1 -0
  91. package/dist/protocol/gateway.d.ts +120 -0
  92. package/dist/protocol/gateway.js +202 -0
  93. package/dist/protocol/gateway.js.map +1 -0
  94. package/dist/protocol/scopes.cjs +78 -0
  95. package/dist/protocol/scopes.cjs.map +1 -0
  96. package/dist/protocol/scopes.d.ts +13 -0
  97. package/dist/protocol/scopes.js +50 -0
  98. package/dist/protocol/scopes.js.map +1 -0
  99. package/dist/{types/atomicStore.cjs → storage/default.cjs} +9 -8
  100. package/dist/storage/default.cjs.map +1 -0
  101. package/dist/storage/default.d.ts +4 -0
  102. package/dist/storage/default.js +8 -0
  103. package/dist/storage/default.js.map +1 -0
  104. package/dist/storage/index.cjs +11 -2
  105. package/dist/storage/index.cjs.map +1 -1
  106. package/dist/storage/index.d.ts +9 -0
  107. package/dist/storage/index.js +7 -1
  108. package/dist/storage/index.js.map +1 -1
  109. package/dist/storage/providers/callback-storage.cjs +1 -0
  110. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  111. package/dist/storage/providers/callback-storage.js +1 -0
  112. package/dist/storage/providers/callback-storage.js.map +1 -1
  113. package/dist/storage/providers/dropbox.cjs +1 -0
  114. package/dist/storage/providers/dropbox.cjs.map +1 -1
  115. package/dist/storage/providers/dropbox.js +1 -0
  116. package/dist/storage/providers/dropbox.js.map +1 -1
  117. package/dist/storage/providers/google-drive.cjs +1 -0
  118. package/dist/storage/providers/google-drive.cjs.map +1 -1
  119. package/dist/storage/providers/google-drive.js +1 -0
  120. package/dist/storage/providers/google-drive.js.map +1 -1
  121. package/dist/storage/providers/ipfs.cjs +1 -0
  122. package/dist/storage/providers/ipfs.cjs.map +1 -1
  123. package/dist/storage/providers/ipfs.js +1 -0
  124. package/dist/storage/providers/ipfs.js.map +1 -1
  125. package/dist/storage/providers/pinata.cjs +1 -0
  126. package/dist/storage/providers/pinata.cjs.map +1 -1
  127. package/dist/storage/providers/pinata.js +1 -0
  128. package/dist/storage/providers/pinata.js.map +1 -1
  129. package/dist/storage/providers/r2.cjs +376 -0
  130. package/dist/storage/providers/r2.cjs.map +1 -0
  131. package/dist/storage/providers/r2.d.ts +91 -0
  132. package/dist/storage/providers/r2.js +354 -0
  133. package/dist/storage/providers/r2.js.map +1 -0
  134. package/dist/storage/providers/vana-storage.cjs +251 -0
  135. package/dist/storage/providers/vana-storage.cjs.map +1 -0
  136. package/dist/storage/providers/vana-storage.d.ts +100 -0
  137. package/dist/storage/providers/vana-storage.js +231 -0
  138. package/dist/storage/providers/vana-storage.js.map +1 -0
  139. package/dist/types/config.cjs +0 -34
  140. package/dist/types/config.cjs.map +1 -1
  141. package/dist/types/config.d.ts +1 -607
  142. package/dist/types/config.js +0 -22
  143. package/dist/types/config.js.map +1 -1
  144. package/dist/types/contracts.cjs.map +1 -1
  145. package/dist/types/contracts.d.ts +1 -1
  146. package/dist/types/index.cjs +2 -33
  147. package/dist/types/index.cjs.map +1 -1
  148. package/dist/types/index.d.ts +2 -33
  149. package/dist/types/index.js +1 -35
  150. package/dist/types/index.js.map +1 -1
  151. package/dist/types/ps-errors.cjs +66 -0
  152. package/dist/types/ps-errors.cjs.map +1 -0
  153. package/dist/types/ps-errors.d.ts +25 -0
  154. package/dist/types/ps-errors.js +41 -0
  155. package/dist/types/ps-errors.js.map +1 -0
  156. package/dist/types.cjs.map +1 -1
  157. package/dist/types.d.ts +0 -29
  158. package/dist/types.js.map +1 -1
  159. package/package.json +7 -25
  160. package/dist/client/enhancedResponse.cjs +0 -164
  161. package/dist/client/enhancedResponse.cjs.map +0 -1
  162. package/dist/client/enhancedResponse.d.ts +0 -120
  163. package/dist/client/enhancedResponse.js +0 -138
  164. package/dist/client/enhancedResponse.js.map +0 -1
  165. package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +0 -7
  166. package/dist/controllers/base.cjs +0 -116
  167. package/dist/controllers/base.cjs.map +0 -1
  168. package/dist/controllers/base.d.ts +0 -94
  169. package/dist/controllers/base.js +0 -92
  170. package/dist/controllers/base.js.map +0 -1
  171. package/dist/controllers/data.cjs +0 -2633
  172. package/dist/controllers/data.cjs.map +0 -1
  173. package/dist/controllers/data.d.ts +0 -1067
  174. package/dist/controllers/data.js +0 -2626
  175. package/dist/controllers/data.js.map +0 -1
  176. package/dist/controllers/operations.cjs +0 -430
  177. package/dist/controllers/operations.cjs.map +0 -1
  178. package/dist/controllers/operations.d.ts +0 -229
  179. package/dist/controllers/operations.js +0 -406
  180. package/dist/controllers/operations.js.map +0 -1
  181. package/dist/controllers/permissions.cjs +0 -4368
  182. package/dist/controllers/permissions.cjs.map +0 -1
  183. package/dist/controllers/permissions.d.ts +0 -1411
  184. package/dist/controllers/permissions.js +0 -4344
  185. package/dist/controllers/permissions.js.map +0 -1
  186. package/dist/controllers/protocol.cjs +0 -183
  187. package/dist/controllers/protocol.cjs.map +0 -1
  188. package/dist/controllers/protocol.d.ts +0 -138
  189. package/dist/controllers/protocol.js +0 -163
  190. package/dist/controllers/protocol.js.map +0 -1
  191. package/dist/controllers/schemas.cjs +0 -678
  192. package/dist/controllers/schemas.cjs.map +0 -1
  193. package/dist/controllers/schemas.d.ts +0 -293
  194. package/dist/controllers/schemas.js +0 -654
  195. package/dist/controllers/schemas.js.map +0 -1
  196. package/dist/controllers/server.cjs +0 -643
  197. package/dist/controllers/server.cjs.map +0 -1
  198. package/dist/controllers/server.d.ts +0 -322
  199. package/dist/controllers/server.js +0 -624
  200. package/dist/controllers/server.js.map +0 -1
  201. package/dist/controllers/staking.cjs +0 -626
  202. package/dist/controllers/staking.cjs.map +0 -1
  203. package/dist/controllers/staking.d.ts +0 -457
  204. package/dist/controllers/staking.js +0 -602
  205. package/dist/controllers/staking.js.map +0 -1
  206. package/dist/core/__tests__/pollingManager.test.d.ts +0 -4
  207. package/dist/core/apiClient.cjs +0 -378
  208. package/dist/core/apiClient.cjs.map +0 -1
  209. package/dist/core/apiClient.d.ts +0 -286
  210. package/dist/core/apiClient.js +0 -359
  211. package/dist/core/apiClient.js.map +0 -1
  212. package/dist/core/generics.cjs +0 -417
  213. package/dist/core/generics.cjs.map +0 -1
  214. package/dist/core/generics.d.ts +0 -205
  215. package/dist/core/generics.js +0 -386
  216. package/dist/core/generics.js.map +0 -1
  217. package/dist/core/health.cjs +0 -289
  218. package/dist/core/health.cjs.map +0 -1
  219. package/dist/core/health.d.ts +0 -143
  220. package/dist/core/health.js +0 -265
  221. package/dist/core/health.js.map +0 -1
  222. package/dist/core/inMemoryNonceManager.cjs +0 -138
  223. package/dist/core/inMemoryNonceManager.cjs.map +0 -1
  224. package/dist/core/inMemoryNonceManager.d.ts +0 -69
  225. package/dist/core/inMemoryNonceManager.js +0 -114
  226. package/dist/core/inMemoryNonceManager.js.map +0 -1
  227. package/dist/core/nonceManager.cjs +0 -304
  228. package/dist/core/nonceManager.cjs.map +0 -1
  229. package/dist/core/nonceManager.d.ts +0 -116
  230. package/dist/core/nonceManager.js +0 -280
  231. package/dist/core/nonceManager.js.map +0 -1
  232. package/dist/core/pollingManager.cjs +0 -292
  233. package/dist/core/pollingManager.cjs.map +0 -1
  234. package/dist/core/pollingManager.d.ts +0 -120
  235. package/dist/core/pollingManager.js +0 -268
  236. package/dist/core/pollingManager.js.map +0 -1
  237. package/dist/core.cjs +0 -781
  238. package/dist/core.cjs.map +0 -1
  239. package/dist/core.d.ts +0 -496
  240. package/dist/core.js +0 -756
  241. package/dist/core.js.map +0 -1
  242. package/dist/diagnostics.cjs +0 -37
  243. package/dist/diagnostics.cjs.map +0 -1
  244. package/dist/diagnostics.d.ts +0 -24
  245. package/dist/diagnostics.js +0 -13
  246. package/dist/diagnostics.js.map +0 -1
  247. package/dist/diagnostics.test.d.ts +0 -1
  248. package/dist/generated/abi/DLPPerformanceImplementation.cjs +0 -1202
  249. package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +0 -1
  250. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +0 -914
  251. package/dist/generated/abi/DLPPerformanceImplementation.js +0 -1178
  252. package/dist/generated/abi/DLPPerformanceImplementation.js.map +0 -1
  253. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +0 -1112
  254. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +0 -1
  255. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +0 -840
  256. package/dist/generated/abi/DLPRewardDeployerImplementation.js +0 -1088
  257. package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +0 -1
  258. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs +0 -612
  259. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs.map +0 -1
  260. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +0 -451
  261. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js +0 -588
  262. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js.map +0 -1
  263. package/dist/generated/abi/DLPRewardSwapImplementation.cjs +0 -939
  264. package/dist/generated/abi/DLPRewardSwapImplementation.cjs.map +0 -1
  265. package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +0 -705
  266. package/dist/generated/abi/DLPRewardSwapImplementation.js +0 -915
  267. package/dist/generated/abi/DLPRewardSwapImplementation.js.map +0 -1
  268. package/dist/generated/abi/DLPRootImplementation.cjs +0 -1644
  269. package/dist/generated/abi/DLPRootImplementation.cjs.map +0 -1
  270. package/dist/generated/abi/DLPRootImplementation.d.ts +0 -1246
  271. package/dist/generated/abi/DLPRootImplementation.js +0 -1620
  272. package/dist/generated/abi/DLPRootImplementation.js.map +0 -1
  273. package/dist/generated/abi/DataLiquidityPoolImplementation.cjs +0 -985
  274. package/dist/generated/abi/DataLiquidityPoolImplementation.cjs.map +0 -1
  275. package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +0 -735
  276. package/dist/generated/abi/DataLiquidityPoolImplementation.js +0 -961
  277. package/dist/generated/abi/DataLiquidityPoolImplementation.js.map +0 -1
  278. package/dist/generated/abi/SwapHelperImplementation.cjs +0 -976
  279. package/dist/generated/abi/SwapHelperImplementation.cjs.map +0 -1
  280. package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -728
  281. package/dist/generated/abi/SwapHelperImplementation.js +0 -952
  282. package/dist/generated/abi/SwapHelperImplementation.js.map +0 -1
  283. package/dist/generated/abi/TeePoolImplementation.cjs +0 -1313
  284. package/dist/generated/abi/TeePoolImplementation.cjs.map +0 -1
  285. package/dist/generated/abi/TeePoolImplementation.d.ts +0 -992
  286. package/dist/generated/abi/TeePoolImplementation.js +0 -1289
  287. package/dist/generated/abi/TeePoolImplementation.js.map +0 -1
  288. package/dist/generated/event-types.cjs +0 -17
  289. package/dist/generated/event-types.cjs.map +0 -1
  290. package/dist/generated/event-types.d.ts +0 -816
  291. package/dist/generated/event-types.js +0 -1
  292. package/dist/generated/event-types.js.map +0 -1
  293. package/dist/generated/eventRegistry.cjs +0 -4512
  294. package/dist/generated/eventRegistry.cjs.map +0 -1
  295. package/dist/generated/eventRegistry.d.ts +0 -14
  296. package/dist/generated/eventRegistry.js +0 -4487
  297. package/dist/generated/eventRegistry.js.map +0 -1
  298. package/dist/generated/server/server-exports.cjs +0 -45
  299. package/dist/generated/server/server-exports.cjs.map +0 -1
  300. package/dist/generated/server/server-exports.d.ts +0 -36
  301. package/dist/generated/server/server-exports.js +0 -19
  302. package/dist/generated/server/server-exports.js.map +0 -1
  303. package/dist/generated/server/server.cjs +0 -17
  304. package/dist/generated/server/server.cjs.map +0 -1
  305. package/dist/generated/server/server.d.ts +0 -907
  306. package/dist/generated/server/server.js +0 -1
  307. package/dist/generated/server/server.js.map +0 -1
  308. package/dist/generated/subgraph.cjs +0 -1440
  309. package/dist/generated/subgraph.cjs.map +0 -1
  310. package/dist/generated/subgraph.d.ts +0 -6113
  311. package/dist/generated/subgraph.js +0 -1404
  312. package/dist/generated/subgraph.js.map +0 -1
  313. package/dist/lib/__tests__/redisAtomicStore.test.d.ts +0 -1
  314. package/dist/lib/redisAtomicStore.cjs +0 -201
  315. package/dist/lib/redisAtomicStore.cjs.map +0 -1
  316. package/dist/lib/redisAtomicStore.d.ts +0 -120
  317. package/dist/lib/redisAtomicStore.js +0 -177
  318. package/dist/lib/redisAtomicStore.js.map +0 -1
  319. package/dist/server/relayerHandler.cjs +0 -452
  320. package/dist/server/relayerHandler.cjs.map +0 -1
  321. package/dist/server/relayerHandler.d.ts +0 -69
  322. package/dist/server/relayerHandler.js +0 -428
  323. package/dist/server/relayerHandler.js.map +0 -1
  324. package/dist/tests/abi.test.d.ts +0 -1
  325. package/dist/tests/chains-definitions.test.d.ts +0 -1
  326. package/dist/tests/core-encryption.test.d.ts +0 -1
  327. package/dist/tests/core-extended.test.d.ts +0 -1
  328. package/dist/tests/core-generics-coverage.test.d.ts +0 -1
  329. package/dist/tests/coverage-boost.test.d.ts +0 -1
  330. package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +0 -1
  331. package/dist/tests/data-addfile-permissions-schema.test.d.ts +0 -1
  332. package/dist/tests/data-additional-methods.test.d.ts +0 -1
  333. package/dist/tests/data-controller-edge-cases.test.d.ts +0 -1
  334. package/dist/tests/data-ipfs-gateways.test.d.ts +0 -1
  335. package/dist/tests/data-relayer.test.d.ts +0 -1
  336. package/dist/tests/data-schema-validation.test.d.ts +0 -1
  337. package/dist/tests/data-simple-methods.test.d.ts +0 -1
  338. package/dist/tests/data-upload-owner-validation.test.d.ts +0 -1
  339. package/dist/tests/data.test.d.ts +0 -1
  340. package/dist/tests/demo-integration.test.d.ts +0 -1
  341. package/dist/tests/demo-trusted-server-integration.test.d.ts +0 -1
  342. package/dist/tests/download-relayer.test.d.ts +0 -1
  343. package/dist/tests/dual-mode-permissions.test.d.ts +0 -1
  344. package/dist/tests/dual-mode-trusted-servers.test.d.ts +0 -1
  345. package/dist/tests/encryption-correct-implementation.test.d.ts +0 -1
  346. package/dist/tests/encryption-coverage.test.d.ts +0 -1
  347. package/dist/tests/encryption-edge-cases.test.d.ts +0 -1
  348. package/dist/tests/encryption-utils-updated.test.d.ts +0 -1
  349. package/dist/tests/errors-coverage.test.d.ts +0 -1
  350. package/dist/tests/factories/mockFactory.d.ts +0 -316
  351. package/dist/tests/fakes/FakeStorageManager.d.ts +0 -200
  352. package/dist/tests/fakes/FakeStorageManager.test.d.ts +0 -1
  353. package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +0 -170
  354. package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +0 -1
  355. package/dist/tests/fakes/fake-pgp-port.d.ts +0 -13
  356. package/dist/tests/grantValidation-edge-cases.test.d.ts +0 -1
  357. package/dist/tests/grantValidation-unreachable-branch.test.d.ts +0 -1
  358. package/dist/tests/helper-methods.test.d.ts +0 -1
  359. package/dist/tests/helpers/typedMocks.d.ts +0 -64
  360. package/dist/tests/index-browser.test.d.ts +0 -1
  361. package/dist/tests/index-node.test.d.ts +0 -1
  362. package/dist/tests/index.test.d.ts +0 -1
  363. package/dist/tests/mocks/platformAdapter.d.ts +0 -12
  364. package/dist/tests/new-permissions-methods.test.d.ts +0 -1
  365. package/dist/tests/no-buffer-browser.test.d.ts +0 -1
  366. package/dist/tests/permissions-grantee.test.d.ts +0 -1
  367. package/dist/tests/permissions-revoke-relayer.test.d.ts +0 -1
  368. package/dist/tests/permissions-schema-validation.test.d.ts +0 -1
  369. package/dist/tests/permissions-server-files.test.d.ts +0 -1
  370. package/dist/tests/permissions-transaction-options.test.d.ts +0 -1
  371. package/dist/tests/permissions-trust-servers.test.d.ts +0 -1
  372. package/dist/tests/permissions.test.d.ts +0 -1
  373. package/dist/tests/personal.test.d.ts +0 -1
  374. package/dist/tests/platform-browser.test.d.ts +0 -1
  375. package/dist/tests/platform-crypto-expanded.test.d.ts +0 -1
  376. package/dist/tests/platform-crypto.test.d.ts +0 -1
  377. package/dist/tests/platform-index.test.d.ts +0 -1
  378. package/dist/tests/platform-node.test.d.ts +0 -1
  379. package/dist/tests/platform-shared-utils.test.d.ts +0 -1
  380. package/dist/tests/platform-updated.test.d.ts +0 -1
  381. package/dist/tests/protocol-additional-methods.test.d.ts +0 -1
  382. package/dist/tests/protocol.test.d.ts +0 -1
  383. package/dist/tests/read-only-mode.test.d.ts +0 -1
  384. package/dist/tests/relayer-integration.test.d.ts +0 -1
  385. package/dist/tests/relayer-unified.test.d.ts +0 -1
  386. package/dist/tests/schemas.test.d.ts +0 -1
  387. package/dist/tests/server-relayer-handler.test.d.ts +0 -1
  388. package/dist/tests/signatureFormatter.test.d.ts +0 -1
  389. package/dist/tests/staking.test.d.ts +0 -1
  390. package/dist/tests/trusted-server-queries.test.d.ts +0 -1
  391. package/dist/tests/typedDataConverter.test.d.ts +0 -1
  392. package/dist/tests/types-contracts.test.d.ts +0 -1
  393. package/dist/tests/types-data.test.d.ts +0 -1
  394. package/dist/tests/types-external-apis.test.d.ts +0 -1
  395. package/dist/tests/types-generics.test.d.ts +0 -1
  396. package/dist/tests/types-permissions.test.d.ts +0 -1
  397. package/dist/tests/types-upload-params.test.d.ts +0 -1
  398. package/dist/tests/types.test.d.ts +0 -1
  399. package/dist/tests/utils-formatters.test.d.ts +0 -1
  400. package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +0 -1
  401. package/dist/tests/utils-grantFiles-validation.test.d.ts +0 -1
  402. package/dist/tests/utils-grantFiles.test.d.ts +0 -1
  403. package/dist/tests/utils-grantValidation-consolidated.test.d.ts +0 -1
  404. package/dist/tests/utils-grants.test.d.ts +0 -1
  405. package/dist/tests/utils-ipfs-additional.test.d.ts +0 -1
  406. package/dist/tests/utils-ipfs.test.d.ts +0 -4
  407. package/dist/tests/utils-schemaValidation.test.d.ts +0 -1
  408. package/dist/tests/vana.test.d.ts +0 -1
  409. package/dist/tests/wallet-crypto-compatibility.test.d.ts +0 -1
  410. package/dist/types/atomicStore.cjs.map +0 -1
  411. package/dist/types/atomicStore.d.ts +0 -236
  412. package/dist/types/atomicStore.js +0 -7
  413. package/dist/types/atomicStore.js.map +0 -1
  414. package/dist/types/blockchain.cjs +0 -17
  415. package/dist/types/blockchain.cjs.map +0 -1
  416. package/dist/types/blockchain.d.ts +0 -85
  417. package/dist/types/blockchain.js +0 -1
  418. package/dist/types/blockchain.js.map +0 -1
  419. package/dist/types/controller-context.cjs +0 -17
  420. package/dist/types/controller-context.cjs.map +0 -1
  421. package/dist/types/controller-context.d.ts +0 -68
  422. package/dist/types/controller-context.js +0 -1
  423. package/dist/types/controller-context.js.map +0 -1
  424. package/dist/types/data.cjs +0 -17
  425. package/dist/types/data.cjs.map +0 -1
  426. package/dist/types/data.d.ts +0 -763
  427. package/dist/types/data.js +0 -1
  428. package/dist/types/data.js.map +0 -1
  429. package/dist/types/external-apis.cjs +0 -61
  430. package/dist/types/external-apis.cjs.map +0 -1
  431. package/dist/types/external-apis.d.ts +0 -184
  432. package/dist/types/external-apis.js +0 -34
  433. package/dist/types/external-apis.js.map +0 -1
  434. package/dist/types/generics.cjs +0 -17
  435. package/dist/types/generics.cjs.map +0 -1
  436. package/dist/types/generics.d.ts +0 -518
  437. package/dist/types/generics.js +0 -1
  438. package/dist/types/generics.js.map +0 -1
  439. package/dist/types/operationStore.cjs +0 -17
  440. package/dist/types/operationStore.cjs.map +0 -1
  441. package/dist/types/operationStore.d.ts +0 -171
  442. package/dist/types/operationStore.js +0 -1
  443. package/dist/types/operationStore.js.map +0 -1
  444. package/dist/types/operations.cjs +0 -53
  445. package/dist/types/operations.cjs.map +0 -1
  446. package/dist/types/operations.d.ts +0 -204
  447. package/dist/types/operations.js +0 -26
  448. package/dist/types/operations.js.map +0 -1
  449. package/dist/types/options.cjs +0 -17
  450. package/dist/types/options.cjs.map +0 -1
  451. package/dist/types/options.d.ts +0 -308
  452. package/dist/types/options.js +0 -1
  453. package/dist/types/options.js.map +0 -1
  454. package/dist/types/permissions.cjs +0 -17
  455. package/dist/types/permissions.cjs.map +0 -1
  456. package/dist/types/permissions.d.ts +0 -955
  457. package/dist/types/permissions.js +0 -1
  458. package/dist/types/permissions.js.map +0 -1
  459. package/dist/types/personal.cjs +0 -17
  460. package/dist/types/personal.cjs.map +0 -1
  461. package/dist/types/personal.d.ts +0 -174
  462. package/dist/types/personal.js +0 -1
  463. package/dist/types/personal.js.map +0 -1
  464. package/dist/types/relayer.cjs +0 -17
  465. package/dist/types/relayer.cjs.map +0 -1
  466. package/dist/types/relayer.d.ts +0 -552
  467. package/dist/types/relayer.js +0 -1
  468. package/dist/types/relayer.js.map +0 -1
  469. package/dist/types/transactionResults.cjs +0 -17
  470. package/dist/types/transactionResults.cjs.map +0 -1
  471. package/dist/types/transactionResults.d.ts +0 -193
  472. package/dist/types/transactionResults.js +0 -1
  473. package/dist/types/transactionResults.js.map +0 -1
  474. package/dist/types/utils.cjs +0 -17
  475. package/dist/types/utils.cjs.map +0 -1
  476. package/dist/types/utils.d.ts +0 -771
  477. package/dist/types/utils.js +0 -1
  478. package/dist/types/utils.js.map +0 -1
  479. package/dist/utils/__tests__/chainQuery.test.d.ts +0 -1
  480. package/dist/utils/__tests__/parseTransaction.test.d.ts +0 -1
  481. package/dist/utils/__tests__/pojo-serialization.test.d.ts +0 -1
  482. package/dist/utils/__tests__/signatureCache.test.d.ts +0 -1
  483. package/dist/utils/__tests__/subgraphConsistency.test.d.ts +0 -4
  484. package/dist/utils/__tests__/subgraphPagination.test.d.ts +0 -4
  485. package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +0 -1
  486. package/dist/utils/__tests__/transactionHelpers.test.d.ts +0 -1
  487. package/dist/utils/__tests__/urlResolver.test.d.ts +0 -4
  488. package/dist/utils/blockchain/registry.cjs +0 -81
  489. package/dist/utils/blockchain/registry.cjs.map +0 -1
  490. package/dist/utils/blockchain/registry.d.ts +0 -32
  491. package/dist/utils/blockchain/registry.js +0 -56
  492. package/dist/utils/blockchain/registry.js.map +0 -1
  493. package/dist/utils/blockchain/registry.test.d.ts +0 -1
  494. package/dist/utils/chainQuery.cjs +0 -107
  495. package/dist/utils/chainQuery.cjs.map +0 -1
  496. package/dist/utils/chainQuery.d.ts +0 -31
  497. package/dist/utils/chainQuery.js +0 -82
  498. package/dist/utils/chainQuery.js.map +0 -1
  499. package/dist/utils/download.cjs +0 -69
  500. package/dist/utils/download.cjs.map +0 -1
  501. package/dist/utils/download.d.ts +0 -40
  502. package/dist/utils/download.js +0 -45
  503. package/dist/utils/download.js.map +0 -1
  504. package/dist/utils/encryption.cjs +0 -176
  505. package/dist/utils/encryption.cjs.map +0 -1
  506. package/dist/utils/encryption.d.ts +0 -271
  507. package/dist/utils/encryption.js +0 -142
  508. package/dist/utils/encryption.js.map +0 -1
  509. package/dist/utils/formatters.cjs +0 -55
  510. package/dist/utils/formatters.cjs.map +0 -1
  511. package/dist/utils/formatters.d.ts +0 -118
  512. package/dist/utils/formatters.js +0 -28
  513. package/dist/utils/formatters.js.map +0 -1
  514. package/dist/utils/grantFiles.cjs +0 -181
  515. package/dist/utils/grantFiles.cjs.map +0 -1
  516. package/dist/utils/grantFiles.d.ts +0 -172
  517. package/dist/utils/grantFiles.js +0 -143
  518. package/dist/utils/grantFiles.js.map +0 -1
  519. package/dist/utils/grantValidation.cjs +0 -243
  520. package/dist/utils/grantValidation.cjs.map +0 -1
  521. package/dist/utils/grantValidation.d.ts +0 -226
  522. package/dist/utils/grantValidation.js +0 -201
  523. package/dist/utils/grantValidation.js.map +0 -1
  524. package/dist/utils/grants.cjs +0 -108
  525. package/dist/utils/grants.cjs.map +0 -1
  526. package/dist/utils/grants.d.ts +0 -148
  527. package/dist/utils/grants.js +0 -82
  528. package/dist/utils/grants.js.map +0 -1
  529. package/dist/utils/ipfs.cjs +0 -128
  530. package/dist/utils/ipfs.cjs.map +0 -1
  531. package/dist/utils/ipfs.d.ts +0 -88
  532. package/dist/utils/ipfs.js +0 -97
  533. package/dist/utils/ipfs.js.map +0 -1
  534. package/dist/utils/multicall.cjs +0 -233
  535. package/dist/utils/multicall.cjs.map +0 -1
  536. package/dist/utils/multicall.d.ts +0 -126
  537. package/dist/utils/multicall.js +0 -208
  538. package/dist/utils/multicall.js.map +0 -1
  539. package/dist/utils/parseTransactionPojo.cjs +0 -87
  540. package/dist/utils/parseTransactionPojo.cjs.map +0 -1
  541. package/dist/utils/parseTransactionPojo.d.ts +0 -31
  542. package/dist/utils/parseTransactionPojo.js +0 -63
  543. package/dist/utils/parseTransactionPojo.js.map +0 -1
  544. package/dist/utils/schemaValidation.cjs +0 -258
  545. package/dist/utils/schemaValidation.cjs.map +0 -1
  546. package/dist/utils/schemaValidation.d.ts +0 -168
  547. package/dist/utils/schemaValidation.js +0 -219
  548. package/dist/utils/schemaValidation.js.map +0 -1
  549. package/dist/utils/signatureCache.cjs +0 -192
  550. package/dist/utils/signatureCache.cjs.map +0 -1
  551. package/dist/utils/signatureCache.d.ts +0 -172
  552. package/dist/utils/signatureCache.js +0 -167
  553. package/dist/utils/signatureCache.js.map +0 -1
  554. package/dist/utils/signatureFormatter.cjs +0 -42
  555. package/dist/utils/signatureFormatter.cjs.map +0 -1
  556. package/dist/utils/signatureFormatter.d.ts +0 -36
  557. package/dist/utils/signatureFormatter.js +0 -18
  558. package/dist/utils/signatureFormatter.js.map +0 -1
  559. package/dist/utils/subgraphConsistency.cjs +0 -184
  560. package/dist/utils/subgraphConsistency.cjs.map +0 -1
  561. package/dist/utils/subgraphConsistency.d.ts +0 -65
  562. package/dist/utils/subgraphConsistency.js +0 -155
  563. package/dist/utils/subgraphConsistency.js.map +0 -1
  564. package/dist/utils/subgraphMetaCache.cjs +0 -101
  565. package/dist/utils/subgraphMetaCache.cjs.map +0 -1
  566. package/dist/utils/subgraphMetaCache.d.ts +0 -56
  567. package/dist/utils/subgraphMetaCache.js +0 -76
  568. package/dist/utils/subgraphMetaCache.js.map +0 -1
  569. package/dist/utils/subgraphPagination.cjs +0 -104
  570. package/dist/utils/subgraphPagination.cjs.map +0 -1
  571. package/dist/utils/subgraphPagination.d.ts +0 -78
  572. package/dist/utils/subgraphPagination.js +0 -78
  573. package/dist/utils/subgraphPagination.js.map +0 -1
  574. package/dist/utils/tests/multicall.test.d.ts +0 -1
  575. package/dist/utils/transactionHelpers.cjs +0 -54
  576. package/dist/utils/transactionHelpers.cjs.map +0 -1
  577. package/dist/utils/transactionHelpers.d.ts +0 -80
  578. package/dist/utils/transactionHelpers.js +0 -29
  579. package/dist/utils/transactionHelpers.js.map +0 -1
  580. package/dist/utils/typeGuards.cjs +0 -109
  581. package/dist/utils/typeGuards.cjs.map +0 -1
  582. package/dist/utils/typeGuards.d.ts +0 -138
  583. package/dist/utils/typeGuards.js +0 -74
  584. package/dist/utils/typeGuards.js.map +0 -1
  585. package/dist/utils/typedDataConverter.cjs +0 -43
  586. package/dist/utils/typedDataConverter.cjs.map +0 -1
  587. package/dist/utils/typedDataConverter.d.ts +0 -46
  588. package/dist/utils/typedDataConverter.js +0 -19
  589. package/dist/utils/typedDataConverter.js.map +0 -1
  590. package/dist/utils/urlResolver.cjs +0 -62
  591. package/dist/utils/urlResolver.cjs.map +0 -1
  592. package/dist/utils/urlResolver.d.ts +0 -56
  593. package/dist/utils/urlResolver.js +0 -37
  594. package/dist/utils/urlResolver.js.map +0 -1
  595. package/dist/utils/wallet.cjs +0 -63
  596. package/dist/utils/wallet.cjs.map +0 -1
  597. package/dist/utils/wallet.d.ts +0 -94
  598. package/dist/utils/wallet.js +0 -37
  599. package/dist/utils/wallet.js.map +0 -1
  600. package/dist/utils/withEvents.cjs +0 -44
  601. package/dist/utils/withEvents.cjs.map +0 -1
  602. package/dist/utils/withEvents.d.ts +0 -56
  603. package/dist/utils/withEvents.js +0 -18
  604. package/dist/utils/withEvents.js.map +0 -1
  605. /package/dist/{__tests__/waitForTransactionEvents.test.d.ts → auth/pkce.test.d.ts} +0 -0
  606. /package/dist/{client/__tests__/enhancedResponse.test.d.ts → auth/token-store.test.d.ts} +0 -0
  607. /package/dist/{controllers/__tests__/operations.processQueue.test.d.ts → auth/web3-signed.test.d.ts} +0 -0
  608. /package/dist/{controllers/__tests__/schemas-edge-cases.test.d.ts → crypto/envelope/openpgp.test.d.ts} +0 -0
  609. /package/dist/{controllers/data-error-handling.test.d.ts → crypto/keys/derive.test.d.ts} +0 -0
  610. /package/dist/{tests/errors.test.d.ts → errors.test.d.ts} +0 -0
  611. /package/dist/{controllers/server-additional.test.d.ts → protocol/data-file.test.d.ts} +0 -0
  612. /package/dist/{core/__tests__/health.test.d.ts → protocol/eip712.test.d.ts} +0 -0
  613. /package/dist/{core/__tests__/inMemoryNonceManager.test.d.ts → protocol/gateway.test.d.ts} +0 -0
  614. /package/dist/{core/__tests__/nonceManager.test.d.ts → protocol/scopes.test.d.ts} +0 -0
  615. /package/dist/{core/core.test.d.ts → storage/tests/defaultStorage.test.d.ts} +0 -0
  616. /package/dist/{core/tests/apiClient.test.d.ts → storage/tests/r2Storage.test.d.ts} +0 -0
  617. /package/dist/{core/tests/client.test.d.ts → storage/tests/vanaStorage.test.d.ts} +0 -0
  618. /package/dist/{core/tests/generics.test.d.ts → types/ps-errors.test.d.ts} +0 -0
@@ -0,0 +1,78 @@
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 scopes_exports = {};
20
+ __export(scopes_exports, {
21
+ ScopeSchema: () => ScopeSchema,
22
+ parseScope: () => parseScope,
23
+ scopeCoveredByGrant: () => scopeCoveredByGrant,
24
+ scopeMatchesPattern: () => scopeMatchesPattern,
25
+ scopeToPathSegments: () => scopeToPathSegments
26
+ });
27
+ module.exports = __toCommonJS(scopes_exports);
28
+ var import_zod = require("zod");
29
+ const SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;
30
+ const ScopeSchema = import_zod.z.string().refine(
31
+ (scope) => {
32
+ const parts = scope.split(".");
33
+ return parts.length >= 2 && parts.length <= 3 && parts.every((part) => SEGMENT_RE.test(part));
34
+ },
35
+ {
36
+ message: "Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)"
37
+ }
38
+ );
39
+ function parseScope(scope) {
40
+ const validated = ScopeSchema.parse(scope);
41
+ const parts = validated.split(".");
42
+ return {
43
+ source: parts[0],
44
+ category: parts[1],
45
+ subcategory: parts[2],
46
+ raw: validated
47
+ };
48
+ }
49
+ function scopeToPathSegments(scope) {
50
+ const parsed = parseScope(scope);
51
+ const segments = [parsed.source, parsed.category];
52
+ if (parsed.subcategory) {
53
+ segments.push(parsed.subcategory);
54
+ }
55
+ return segments;
56
+ }
57
+ function scopeMatchesPattern(requestedScope, grantPattern) {
58
+ if (grantPattern === "*") return true;
59
+ if (grantPattern.endsWith(".*")) {
60
+ const prefix = grantPattern.slice(0, -1);
61
+ return requestedScope.startsWith(prefix);
62
+ }
63
+ return requestedScope === grantPattern;
64
+ }
65
+ function scopeCoveredByGrant(requestedScope, grantedScopes) {
66
+ return grantedScopes.some(
67
+ (pattern) => scopeMatchesPattern(requestedScope, pattern)
68
+ );
69
+ }
70
+ // Annotate the CommonJS export names for ESM import in node:
71
+ 0 && (module.exports = {
72
+ ScopeSchema,
73
+ parseScope,
74
+ scopeCoveredByGrant,
75
+ scopeMatchesPattern,
76
+ scopeToPathSegments
77
+ });
78
+ //# sourceMappingURL=scopes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/protocol/scopes.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;\n\nexport const ScopeSchema = z.string().refine(\n (scope) => {\n const parts = scope.split(\".\");\n return (\n parts.length >= 2 &&\n parts.length <= 3 &&\n parts.every((part) => SEGMENT_RE.test(part))\n );\n },\n {\n message:\n \"Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)\",\n },\n);\n\nexport type Scope = z.infer<typeof ScopeSchema>;\n\nexport interface ParsedScope {\n source: string;\n category: string;\n subcategory?: string;\n raw: string;\n}\n\nexport function parseScope(scope: string): ParsedScope {\n const validated = ScopeSchema.parse(scope);\n const parts = validated.split(\".\");\n return {\n source: parts[0],\n category: parts[1],\n subcategory: parts[2],\n raw: validated,\n };\n}\n\nexport function scopeToPathSegments(scope: string): string[] {\n const parsed = parseScope(scope);\n const segments = [parsed.source, parsed.category];\n if (parsed.subcategory) {\n segments.push(parsed.subcategory);\n }\n return segments;\n}\n\nexport function scopeMatchesPattern(\n requestedScope: string,\n grantPattern: string,\n): boolean {\n if (grantPattern === \"*\") return true;\n\n if (grantPattern.endsWith(\".*\")) {\n const prefix = grantPattern.slice(0, -1);\n return requestedScope.startsWith(prefix);\n }\n\n return requestedScope === grantPattern;\n}\n\nexport function scopeCoveredByGrant(\n requestedScope: string,\n grantedScopes: string[],\n): boolean {\n return grantedScopes.some((pattern) =>\n scopeMatchesPattern(requestedScope, pattern),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAElB,MAAM,aAAa;AAEZ,MAAM,cAAc,aAAE,OAAO,EAAE;AAAA,EACpC,CAAC,UAAU;AACT,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WACE,MAAM,UAAU,KAChB,MAAM,UAAU,KAChB,MAAM,MAAM,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC;AAAA,EAE/C;AAAA,EACA;AAAA,IACE,SACE;AAAA,EACJ;AACF;AAWO,SAAS,WAAW,OAA4B;AACrD,QAAM,YAAY,YAAY,MAAM,KAAK;AACzC,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,UAAU,MAAM,CAAC;AAAA,IACjB,aAAa,MAAM,CAAC;AAAA,IACpB,KAAK;AAAA,EACP;AACF;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ;AAChD,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,OAAO,WAAW;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,gBACA,cACS;AACT,MAAI,iBAAiB,IAAK,QAAO;AAEjC,MAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,UAAM,SAAS,aAAa,MAAM,GAAG,EAAE;AACvC,WAAO,eAAe,WAAW,MAAM;AAAA,EACzC;AAEA,SAAO,mBAAmB;AAC5B;AAEO,SAAS,oBACd,gBACA,eACS;AACT,SAAO,cAAc;AAAA,IAAK,CAAC,YACzB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7C;AACF;","names":[]}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ export declare const ScopeSchema: z.ZodString;
3
+ export type Scope = z.infer<typeof ScopeSchema>;
4
+ export interface ParsedScope {
5
+ source: string;
6
+ category: string;
7
+ subcategory?: string;
8
+ raw: string;
9
+ }
10
+ export declare function parseScope(scope: string): ParsedScope;
11
+ export declare function scopeToPathSegments(scope: string): string[];
12
+ export declare function scopeMatchesPattern(requestedScope: string, grantPattern: string): boolean;
13
+ export declare function scopeCoveredByGrant(requestedScope: string, grantedScopes: string[]): boolean;
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ const SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;
3
+ const ScopeSchema = z.string().refine(
4
+ (scope) => {
5
+ const parts = scope.split(".");
6
+ return parts.length >= 2 && parts.length <= 3 && parts.every((part) => SEGMENT_RE.test(part));
7
+ },
8
+ {
9
+ message: "Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)"
10
+ }
11
+ );
12
+ function parseScope(scope) {
13
+ const validated = ScopeSchema.parse(scope);
14
+ const parts = validated.split(".");
15
+ return {
16
+ source: parts[0],
17
+ category: parts[1],
18
+ subcategory: parts[2],
19
+ raw: validated
20
+ };
21
+ }
22
+ function scopeToPathSegments(scope) {
23
+ const parsed = parseScope(scope);
24
+ const segments = [parsed.source, parsed.category];
25
+ if (parsed.subcategory) {
26
+ segments.push(parsed.subcategory);
27
+ }
28
+ return segments;
29
+ }
30
+ function scopeMatchesPattern(requestedScope, grantPattern) {
31
+ if (grantPattern === "*") return true;
32
+ if (grantPattern.endsWith(".*")) {
33
+ const prefix = grantPattern.slice(0, -1);
34
+ return requestedScope.startsWith(prefix);
35
+ }
36
+ return requestedScope === grantPattern;
37
+ }
38
+ function scopeCoveredByGrant(requestedScope, grantedScopes) {
39
+ return grantedScopes.some(
40
+ (pattern) => scopeMatchesPattern(requestedScope, pattern)
41
+ );
42
+ }
43
+ export {
44
+ ScopeSchema,
45
+ parseScope,
46
+ scopeCoveredByGrant,
47
+ scopeMatchesPattern,
48
+ scopeToPathSegments
49
+ };
50
+ //# sourceMappingURL=scopes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/protocol/scopes.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;\n\nexport const ScopeSchema = z.string().refine(\n (scope) => {\n const parts = scope.split(\".\");\n return (\n parts.length >= 2 &&\n parts.length <= 3 &&\n parts.every((part) => SEGMENT_RE.test(part))\n );\n },\n {\n message:\n \"Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)\",\n },\n);\n\nexport type Scope = z.infer<typeof ScopeSchema>;\n\nexport interface ParsedScope {\n source: string;\n category: string;\n subcategory?: string;\n raw: string;\n}\n\nexport function parseScope(scope: string): ParsedScope {\n const validated = ScopeSchema.parse(scope);\n const parts = validated.split(\".\");\n return {\n source: parts[0],\n category: parts[1],\n subcategory: parts[2],\n raw: validated,\n };\n}\n\nexport function scopeToPathSegments(scope: string): string[] {\n const parsed = parseScope(scope);\n const segments = [parsed.source, parsed.category];\n if (parsed.subcategory) {\n segments.push(parsed.subcategory);\n }\n return segments;\n}\n\nexport function scopeMatchesPattern(\n requestedScope: string,\n grantPattern: string,\n): boolean {\n if (grantPattern === \"*\") return true;\n\n if (grantPattern.endsWith(\".*\")) {\n const prefix = grantPattern.slice(0, -1);\n return requestedScope.startsWith(prefix);\n }\n\n return requestedScope === grantPattern;\n}\n\nexport function scopeCoveredByGrant(\n requestedScope: string,\n grantedScopes: string[],\n): boolean {\n return grantedScopes.some((pattern) =>\n scopeMatchesPattern(requestedScope, pattern),\n );\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAElB,MAAM,aAAa;AAEZ,MAAM,cAAc,EAAE,OAAO,EAAE;AAAA,EACpC,CAAC,UAAU;AACT,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WACE,MAAM,UAAU,KAChB,MAAM,UAAU,KAChB,MAAM,MAAM,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC;AAAA,EAE/C;AAAA,EACA;AAAA,IACE,SACE;AAAA,EACJ;AACF;AAWO,SAAS,WAAW,OAA4B;AACrD,QAAM,YAAY,YAAY,MAAM,KAAK;AACzC,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,UAAU,MAAM,CAAC;AAAA,IACjB,aAAa,MAAM,CAAC;AAAA,IACpB,KAAK;AAAA,EACP;AACF;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ;AAChD,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,OAAO,WAAW;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,gBACA,cACS;AACT,MAAI,iBAAiB,IAAK,QAAO;AAEjC,MAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,UAAM,SAAS,aAAa,MAAM,GAAG,EAAE;AACvC,WAAO,eAAe,WAAW,MAAM;AAAA,EACzC;AAEA,SAAO,mBAAmB;AAC5B;AAEO,SAAS,oBACd,gBACA,eACS;AACT,SAAO,cAAc;AAAA,IAAK,CAAC,YACzB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7C;AACF;","names":[]}
@@ -16,16 +16,17 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var atomicStore_exports = {};
20
- __export(atomicStore_exports, {
21
- hasNonceSupport: () => hasNonceSupport
19
+ var default_exports = {};
20
+ __export(default_exports, {
21
+ createVanaStorageProvider: () => createVanaStorageProvider
22
22
  });
23
- module.exports = __toCommonJS(atomicStore_exports);
24
- function hasNonceSupport(store) {
25
- return "atomicAssignNonce" in store && typeof store.atomicAssignNonce === "function";
23
+ module.exports = __toCommonJS(default_exports);
24
+ var import_vana_storage = require("./providers/vana-storage");
25
+ function createVanaStorageProvider(options) {
26
+ return new import_vana_storage.VanaStorage(options);
26
27
  }
27
28
  // Annotate the CommonJS export names for ESM import in node:
28
29
  0 && (module.exports = {
29
- hasNonceSupport
30
+ createVanaStorageProvider
30
31
  });
31
- //# sourceMappingURL=atomicStore.cjs.map
32
+ //# sourceMappingURL=default.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/default.ts"],"sourcesContent":["import type { StorageProvider } from \"../types/storage\";\nimport { VanaStorage, type VanaStorageConfig } from \"./providers/vana-storage\";\n\nexport type VanaStorageProviderOptions = VanaStorageConfig;\n\nexport function createVanaStorageProvider(\n options: VanaStorageProviderOptions,\n): StorageProvider {\n return new VanaStorage(options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAoD;AAI7C,SAAS,0BACd,SACiB;AACjB,SAAO,IAAI,gCAAY,OAAO;AAChC;","names":[]}
@@ -0,0 +1,4 @@
1
+ import type { StorageProvider } from "../types/storage";
2
+ import { type VanaStorageConfig } from "./providers/vana-storage";
3
+ export type VanaStorageProviderOptions = VanaStorageConfig;
4
+ export declare function createVanaStorageProvider(options: VanaStorageProviderOptions): StorageProvider;
@@ -0,0 +1,8 @@
1
+ import { VanaStorage } from "./providers/vana-storage";
2
+ function createVanaStorageProvider(options) {
3
+ return new VanaStorage(options);
4
+ }
5
+ export {
6
+ createVanaStorageProvider
7
+ };
8
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/default.ts"],"sourcesContent":["import type { StorageProvider } from \"../types/storage\";\nimport { VanaStorage, type VanaStorageConfig } from \"./providers/vana-storage\";\n\nexport type VanaStorageProviderOptions = VanaStorageConfig;\n\nexport function createVanaStorageProvider(\n options: VanaStorageProviderOptions,\n): StorageProvider {\n return new VanaStorage(options);\n}\n"],"mappings":"AACA,SAAS,mBAA2C;AAI7C,SAAS,0BACd,SACiB;AACjB,SAAO,IAAI,YAAY,OAAO;AAChC;","names":[]}
@@ -23,11 +23,17 @@ __export(storage_exports, {
23
23
  GoogleDriveStorage: () => import_google_drive.GoogleDriveStorage,
24
24
  IpfsStorage: () => import_ipfs.IpfsStorage,
25
25
  PinataStorage: () => import_pinata.PinataStorage,
26
+ R2Storage: () => import_r2.R2Storage,
26
27
  StorageError: () => import_storage.StorageError,
27
- StorageManager: () => import_manager.StorageManager
28
+ StorageManager: () => import_manager.StorageManager,
29
+ VanaStorage: () => import_vana_storage.VanaStorage,
30
+ createVanaStorageProvider: () => import_default.createVanaStorageProvider
28
31
  });
29
32
  module.exports = __toCommonJS(storage_exports);
30
33
  var import_storage = require("../types/storage");
34
+ var import_default = require("./default");
35
+ var import_r2 = require("./providers/r2");
36
+ var import_vana_storage = require("./providers/vana-storage");
31
37
  var import_google_drive = require("./providers/google-drive");
32
38
  var import_dropbox = require("./providers/dropbox");
33
39
  var import_ipfs = require("./providers/ipfs");
@@ -41,7 +47,10 @@ var import_manager = require("./manager");
41
47
  GoogleDriveStorage,
42
48
  IpfsStorage,
43
49
  PinataStorage,
50
+ R2Storage,
44
51
  StorageError,
45
- StorageManager
52
+ StorageManager,
53
+ VanaStorage,
54
+ createVanaStorageProvider
46
55
  });
47
56
  //# sourceMappingURL=index.cjs.map
@@ -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 { 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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0DA,qBAA6B;AAG7B,0BAAmC;AACnC,qBAA+B;AAC/B,kBAA4B;AAC5B,oBAA8B;AAC9B,8BAAgC;AAGhC,qBAA+B;","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 * **Default backend hosted by ODL?**\n * - ✅ Use `VanaStorage` - storage.vana.com with Web3Signed auth.\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 default Vana storage factory\nexport { createVanaStorageProvider } from \"./default\";\nexport type { VanaStorageProviderOptions } from \"./default\";\n\n// Export storage providers\nexport { R2Storage } from \"./providers/r2\";\nexport type { R2Config } from \"./providers/r2\";\nexport { VanaStorage } from \"./providers/vana-storage\";\nexport type {\n VanaStorageConfig,\n VanaStorageSigner,\n} from \"./providers/vana-storage\";\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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6DA,qBAA6B;AAG7B,qBAA0C;AAI1C,gBAA0B;AAE1B,0BAA4B;AAK5B,0BAAmC;AACnC,qBAA+B;AAC/B,kBAA4B;AAC5B,oBAA8B;AAC9B,8BAAgC;AAGhC,qBAA+B;","names":[]}
@@ -8,6 +8,9 @@
8
8
  *
9
9
  * Choose your storage provider based on your needs:
10
10
  *
11
+ * **Default backend hosted by ODL?**
12
+ * - ✅ Use `VanaStorage` - storage.vana.com with Web3Signed auth.
13
+ *
11
14
  * **Need full CRUD operations and metadata?**
12
15
  * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata
13
16
  *
@@ -48,6 +51,12 @@
48
51
  */
49
52
  export type { StorageProvider, StorageUploadResult, StorageFile, StorageListOptions, StorageProviderConfig, } from "../types/storage";
50
53
  export { StorageError } from "../types/storage";
54
+ export { createVanaStorageProvider } from "./default";
55
+ export type { VanaStorageProviderOptions } from "./default";
56
+ export { R2Storage } from "./providers/r2";
57
+ export type { R2Config } from "./providers/r2";
58
+ export { VanaStorage } from "./providers/vana-storage";
59
+ export type { VanaStorageConfig, VanaStorageSigner, } from "./providers/vana-storage";
51
60
  export { GoogleDriveStorage } from "./providers/google-drive";
52
61
  export { DropboxStorage } from "./providers/dropbox";
53
62
  export { IpfsStorage } from "./providers/ipfs";
@@ -1,4 +1,7 @@
1
1
  import { StorageError } from "../types/storage";
2
+ import { createVanaStorageProvider } from "./default";
3
+ import { R2Storage } from "./providers/r2";
4
+ import { VanaStorage } from "./providers/vana-storage";
2
5
  import { GoogleDriveStorage } from "./providers/google-drive";
3
6
  import { DropboxStorage } from "./providers/dropbox";
4
7
  import { IpfsStorage } from "./providers/ipfs";
@@ -11,7 +14,10 @@ export {
11
14
  GoogleDriveStorage,
12
15
  IpfsStorage,
13
16
  PinataStorage,
17
+ R2Storage,
14
18
  StorageError,
15
- StorageManager
19
+ StorageManager,
20
+ VanaStorage,
21
+ createVanaStorageProvider
16
22
  };
17
23
  //# sourceMappingURL=index.js.map
@@ -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 { 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":[]}
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 * **Default backend hosted by ODL?**\n * - ✅ Use `VanaStorage` - storage.vana.com with Web3Signed auth.\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 default Vana storage factory\nexport { createVanaStorageProvider } from \"./default\";\nexport type { VanaStorageProviderOptions } from \"./default\";\n\n// Export storage providers\nexport { R2Storage } from \"./providers/r2\";\nexport type { R2Config } from \"./providers/r2\";\nexport { VanaStorage } from \"./providers/vana-storage\";\nexport type {\n VanaStorageConfig,\n VanaStorageSigner,\n} from \"./providers/vana-storage\";\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":"AA6DA,SAAS,oBAAoB;AAG7B,SAAS,iCAAiC;AAI1C,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAK5B,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAGhC,SAAS,sBAAsB;","names":[]}
@@ -38,6 +38,7 @@ class CallbackStorage {
38
38
  );
39
39
  }
40
40
  }
41
+ callbacks;
41
42
  /**
42
43
  * Uploads a file using the user-provided callback.
43
44
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport type { StorageCallbacks } from \"../../types/config\";\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../../types/storage\";\n\n/**\n * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\n * @example\n * ```typescript\n * // HTTP-based implementation\n * const httpCallbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n *\n * const storage = new CallbackStorage(httpCallbacks);\n *\n * // Direct S3 implementation\n * const s3Callbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const url = await getPresignedUploadUrl(filename);\n * await fetch(url, { method: 'PUT', body: blob });\n * return {\n * url: `s3://my-bucket/${filename}`,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const url = await getPresignedDownloadUrl(identifier);\n * const response = await fetch(url);\n * return response.blob();\n * }\n * };\n * ```\n *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\n constructor(private readonly callbacks: StorageCallbacks) {\n if (!callbacks.upload || !callbacks.download) {\n throw new Error(\n \"CallbackStorage requires both upload and download callbacks\",\n );\n }\n }\n\n /**\n * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\n */\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const result = await this.callbacks.upload(file, filename);\n\n // Validate the result has required fields\n if (!result.url || result.url.trim() === \"\") {\n throw new StorageError(\n \"Upload callback returned invalid result: missing or empty url\",\n \"INVALID_UPLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return result;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Upload failed: ${error instanceof Error ? error.message : String(error)}`,\n \"UPLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\n */\n async download(url: string): Promise<Blob> {\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n const blob = await this.callbacks.download(identifier);\n\n if (!(blob instanceof Blob)) {\n throw new StorageError(\n \"Download callback returned invalid result: expected Blob\",\n \"INVALID_DOWNLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return blob;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Download failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DOWNLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\n */\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.callbacks.list) {\n throw new StorageError(\n \"List operation not supported - no list callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n const result = await this.callbacks.list(options?.namePattern, options);\n\n // Convert list result to StorageFile format\n return result.items.map((item, index) => ({\n id: item.identifier,\n name: item.identifier.split(\"/\").pop() ?? `file-${index}`,\n url: item.identifier,\n size: item.size ?? 0,\n contentType: \"application/octet-stream\",\n createdAt: item.lastModified ?? new Date(),\n metadata: item.metadata,\n }));\n } catch (error) {\n throw new StorageError(\n `List failed: ${error instanceof Error ? error.message : String(error)}`,\n \"LIST_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\n */\n async delete(url: string): Promise<boolean> {\n if (!this.callbacks.delete) {\n throw new StorageError(\n \"Delete operation not supported - no delete callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n return await this.callbacks.delete(identifier);\n } catch (error) {\n throw new StorageError(\n `Delete failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DELETE_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\n */\n getConfig(): StorageProviderConfig {\n return {\n name: \"callback-storage\",\n type: \"callback\",\n requiresAuth: false,\n features: {\n upload: true,\n download: true,\n list: !!this.callbacks.list,\n delete: !!this.callbacks.delete,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport type { StorageCallbacks } from \"../../types/config\";\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../../types/storage\";\n\n/**\n * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\n * @example\n * ```typescript\n * // HTTP-based implementation\n * const httpCallbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n *\n * const storage = new CallbackStorage(httpCallbacks);\n *\n * // Direct S3 implementation\n * const s3Callbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const url = await getPresignedUploadUrl(filename);\n * await fetch(url, { method: 'PUT', body: blob });\n * return {\n * url: `s3://my-bucket/${filename}`,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const url = await getPresignedDownloadUrl(identifier);\n * const response = await fetch(url);\n * return response.blob();\n * }\n * };\n * ```\n *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\n constructor(private readonly callbacks: StorageCallbacks) {\n if (!callbacks.upload || !callbacks.download) {\n throw new Error(\n \"CallbackStorage requires both upload and download callbacks\",\n );\n }\n }\n\n /**\n * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\n */\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const result = await this.callbacks.upload(file, filename);\n\n // Validate the result has required fields\n if (!result.url || result.url.trim() === \"\") {\n throw new StorageError(\n \"Upload callback returned invalid result: missing or empty url\",\n \"INVALID_UPLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return result;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Upload failed: ${error instanceof Error ? error.message : String(error)}`,\n \"UPLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\n */\n async download(url: string): Promise<Blob> {\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n const blob = await this.callbacks.download(identifier);\n\n if (!(blob instanceof Blob)) {\n throw new StorageError(\n \"Download callback returned invalid result: expected Blob\",\n \"INVALID_DOWNLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return blob;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Download failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DOWNLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\n */\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.callbacks.list) {\n throw new StorageError(\n \"List operation not supported - no list callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n const result = await this.callbacks.list(options?.namePattern, options);\n\n // Convert list result to StorageFile format\n return result.items.map((item, index) => ({\n id: item.identifier,\n name: item.identifier.split(\"/\").pop() ?? `file-${index}`,\n url: item.identifier,\n size: item.size ?? 0,\n contentType: \"application/octet-stream\",\n createdAt: item.lastModified ?? new Date(),\n metadata: item.metadata,\n }));\n } catch (error) {\n throw new StorageError(\n `List failed: ${error instanceof Error ? error.message : String(error)}`,\n \"LIST_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\n */\n async delete(url: string): Promise<boolean> {\n if (!this.callbacks.delete) {\n throw new StorageError(\n \"Delete operation not supported - no delete callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n return await this.callbacks.delete(identifier);\n } catch (error) {\n throw new StorageError(\n `Delete failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DELETE_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\n */\n getConfig(): StorageProviderConfig {\n return {\n name: \"callback-storage\",\n type: \"callback\",\n requiresAuth: false,\n features: {\n upload: true,\n download: true,\n list: !!this.callbacks.list,\n delete: !!this.callbacks.delete,\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,qBAOO;AA6DA,MAAM,gBAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQtD,YAA6B,WAA6B;AAA7B;AAC3B,QAAI,CAAC,UAAU,UAAU,CAAC,UAAU,UAAU;AAC5C,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAN6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2B7B,MAAM,OAAO,MAAY,UAAiD;AACxE,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,OAAO,MAAM,QAAQ;AAGzD,UAAI,CAAC,OAAO,OAAO,OAAO,IAAI,KAAK,MAAM,IAAI;AAC3C,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,6BAAc;AACjC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxE;AAAA,QACA;AAAA,QACA,EAAE,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,SAAS,KAA4B;AACzC,QAAI;AAEF,YAAM,aAAa,KAAK,UAAU,oBAC9B,KAAK,UAAU,kBAAkB,GAAG,IACpC;AAEJ,YAAM,OAAO,MAAM,KAAK,UAAU,SAAS,UAAU;AAErD,UAAI,EAAE,gBAAgB,OAAO;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,6BAAc;AACjC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC1E;AAAA,QACA;AAAA,QACA,EAAE,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAM,KAAK,SAAsD;AAC/D,QAAI,CAAC,KAAK,UAAU,MAAM;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,UAAU,KAAK,SAAS,aAAa,OAAO;AAGtE,aAAO,OAAO,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,QACxC,IAAI,KAAK;AAAA,QACT,MAAM,KAAK,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK,QAAQ,KAAK;AAAA,QACvD,KAAK,KAAK;AAAA,QACV,MAAM,KAAK,QAAQ;AAAA,QACnB,aAAa;AAAA,QACb,WAAW,KAAK,gBAAgB,oBAAI,KAAK;AAAA,QACzC,UAAU,KAAK;AAAA,MACjB,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,gBAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACtE;AAAA,QACA;AAAA,QACA,EAAE,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,OAAO,KAA+B;AAC1C,QAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,aAAa,KAAK,UAAU,oBAC9B,KAAK,UAAU,kBAAkB,GAAG,IACpC;AAEJ,aAAO,MAAM,KAAK,UAAU,OAAO,UAAU;AAAA,IAC/C,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACxE;AAAA,QACA;AAAA,QACA,EAAE,OAAO,iBAAiB,QAAQ,QAAQ,OAAU;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,YAAmC;AACjC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,MAAM,CAAC,CAAC,KAAK,UAAU;AAAA,QACvB,QAAQ,CAAC,CAAC,KAAK,UAAU;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -17,6 +17,7 @@ class CallbackStorage {
17
17
  );
18
18
  }
19
19
  }
20
+ callbacks;
20
21
  /**
21
22
  * Uploads a file using the user-provided callback.
22
23
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport type { StorageCallbacks } from \"../../types/config\";\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../../types/storage\";\n\n/**\n * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\n * @example\n * ```typescript\n * // HTTP-based implementation\n * const httpCallbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n *\n * const storage = new CallbackStorage(httpCallbacks);\n *\n * // Direct S3 implementation\n * const s3Callbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const url = await getPresignedUploadUrl(filename);\n * await fetch(url, { method: 'PUT', body: blob });\n * return {\n * url: `s3://my-bucket/${filename}`,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const url = await getPresignedDownloadUrl(identifier);\n * const response = await fetch(url);\n * return response.blob();\n * }\n * };\n * ```\n *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\n constructor(private readonly callbacks: StorageCallbacks) {\n if (!callbacks.upload || !callbacks.download) {\n throw new Error(\n \"CallbackStorage requires both upload and download callbacks\",\n );\n }\n }\n\n /**\n * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\n */\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const result = await this.callbacks.upload(file, filename);\n\n // Validate the result has required fields\n if (!result.url || result.url.trim() === \"\") {\n throw new StorageError(\n \"Upload callback returned invalid result: missing or empty url\",\n \"INVALID_UPLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return result;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Upload failed: ${error instanceof Error ? error.message : String(error)}`,\n \"UPLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\n */\n async download(url: string): Promise<Blob> {\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n const blob = await this.callbacks.download(identifier);\n\n if (!(blob instanceof Blob)) {\n throw new StorageError(\n \"Download callback returned invalid result: expected Blob\",\n \"INVALID_DOWNLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return blob;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Download failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DOWNLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\n */\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.callbacks.list) {\n throw new StorageError(\n \"List operation not supported - no list callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n const result = await this.callbacks.list(options?.namePattern, options);\n\n // Convert list result to StorageFile format\n return result.items.map((item, index) => ({\n id: item.identifier,\n name: item.identifier.split(\"/\").pop() ?? `file-${index}`,\n url: item.identifier,\n size: item.size ?? 0,\n contentType: \"application/octet-stream\",\n createdAt: item.lastModified ?? new Date(),\n metadata: item.metadata,\n }));\n } catch (error) {\n throw new StorageError(\n `List failed: ${error instanceof Error ? error.message : String(error)}`,\n \"LIST_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\n */\n async delete(url: string): Promise<boolean> {\n if (!this.callbacks.delete) {\n throw new StorageError(\n \"Delete operation not supported - no delete callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n return await this.callbacks.delete(identifier);\n } catch (error) {\n throw new StorageError(\n `Delete failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DELETE_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\n */\n getConfig(): StorageProviderConfig {\n return {\n name: \"callback-storage\",\n type: \"callback\",\n requiresAuth: false,\n features: {\n upload: true,\n download: true,\n list: !!this.callbacks.list,\n delete: !!this.callbacks.delete,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport type { StorageCallbacks } from \"../../types/config\";\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../../types/storage\";\n\n/**\n * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\n * @example\n * ```typescript\n * // HTTP-based implementation\n * const httpCallbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n *\n * const storage = new CallbackStorage(httpCallbacks);\n *\n * // Direct S3 implementation\n * const s3Callbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const url = await getPresignedUploadUrl(filename);\n * await fetch(url, { method: 'PUT', body: blob });\n * return {\n * url: `s3://my-bucket/${filename}`,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const url = await getPresignedDownloadUrl(identifier);\n * const response = await fetch(url);\n * return response.blob();\n * }\n * };\n * ```\n *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\n constructor(private readonly callbacks: StorageCallbacks) {\n if (!callbacks.upload || !callbacks.download) {\n throw new Error(\n \"CallbackStorage requires both upload and download callbacks\",\n );\n }\n }\n\n /**\n * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\n */\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const result = await this.callbacks.upload(file, filename);\n\n // Validate the result has required fields\n if (!result.url || result.url.trim() === \"\") {\n throw new StorageError(\n \"Upload callback returned invalid result: missing or empty url\",\n \"INVALID_UPLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return result;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Upload failed: ${error instanceof Error ? error.message : String(error)}`,\n \"UPLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\n */\n async download(url: string): Promise<Blob> {\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n const blob = await this.callbacks.download(identifier);\n\n if (!(blob instanceof Blob)) {\n throw new StorageError(\n \"Download callback returned invalid result: expected Blob\",\n \"INVALID_DOWNLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return blob;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Download failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DOWNLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\n */\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.callbacks.list) {\n throw new StorageError(\n \"List operation not supported - no list callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n const result = await this.callbacks.list(options?.namePattern, options);\n\n // Convert list result to StorageFile format\n return result.items.map((item, index) => ({\n id: item.identifier,\n name: item.identifier.split(\"/\").pop() ?? `file-${index}`,\n url: item.identifier,\n size: item.size ?? 0,\n contentType: \"application/octet-stream\",\n createdAt: item.lastModified ?? new Date(),\n metadata: item.metadata,\n }));\n } catch (error) {\n throw new StorageError(\n `List failed: ${error instanceof Error ? error.message : String(error)}`,\n \"LIST_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\n */\n async delete(url: string): Promise<boolean> {\n if (!this.callbacks.delete) {\n throw new StorageError(\n \"Delete operation not supported - no delete callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n return await this.callbacks.delete(identifier);\n } catch (error) {\n throw new StorageError(\n `Delete failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DELETE_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\n */\n getConfig(): StorageProviderConfig {\n return {\n name: \"callback-storage\",\n type: \"callback\",\n requiresAuth: false,\n features: {\n upload: true,\n download: true,\n list: !!this.callbacks.list,\n delete: !!this.callbacks.delete,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -34,6 +34,7 @@ class DropboxStorage {
34
34
  }
35
35
  this.rootPath = config.rootPath ?? "/Vana Data";
36
36
  }
37
+ config;
37
38
  apiUrl = "https://api.dropboxapi.com/2";
38
39
  contentUrl = "https://content.dropboxapi.com/2";
39
40
  rootPath;
@@ -1 +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":[]}
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":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,eAOO;AAgDA,MAAM,eAA0C;AAAA,EAKrD,YAAoB,QAAuB;AAAvB;AAClB,QAAI,CAAC,OAAO,aAAa;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,WAAW,OAAO,YAAY;AAAA,EACrC;AAAA,EAToB;AAAA,EAJH,SAAS;AAAA,EACT,aAAa;AAAA,EACb;AAAA,EAajB,MAAM,OAAO,MAAY,UAAiD;AACxE,QAAI;AACF,YAAM,WAAW,YAAY,aAAa,KAAK,IAAI,CAAC;AACpD,YAAM,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ;AAEzC,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,UAAU,iBAAiB;AAAA,QAC9D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,OAAO,WAAW;AAAA,UAChD,gBAAgB;AAAA,UAChB,mBAAmB,KAAK,UAAU;AAAA,YAChC;AAAA,YACA,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,cAAM,IAAI;AAAA,UACR,gCAAgC,KAAK;AAAA,UACrC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAU,MAAM,SAAS,KAAK;AACpC,YAAM,gBAAgB,MAAM,KAAK,iBAAiB,OAAO,UAAU;AAInE,YAAM,oBAAoB,cACvB,QAAQ,mBAAmB,2BAA2B,EACtD,QAAQ,SAAS,EAAE;AAEtB,aAAO;AAAA,QACL,KAAK;AAAA,QACL,MAAM,KAAK;AAAA,QACX,aAAa,KAAK,QAAQ;AAAA,QAC1B,UAAU;AAAA,UACR,IAAI,OAAO;AAAA,UACX,MAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,sBAAc,OAAM;AACzC,YAAM,IAAI;AAAA,QACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACjF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,KAA4B;AAGzC,UAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AACA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,WAAW;AAExC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI;AAAA,UACR,oCAAoC,SAAS,UAAU;AAAA,UACvD;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO,SAAS,KAAK;AAAA,IACvB,SAAS,OAAO;AACd,UAAI,iBAAiB,sBAAc,OAAM;AACzC,YAAM,IAAI;AAAA,QACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACnF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAsD;AAC/D,QAAI,CAAC,KAAK,OAAO,aAAa;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,MAAM,sBAAsB;AAAA,QAC/D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,OAAO,WAAW;AAAA,UAChD,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM,KAAK;AAAA,UACX,OAAO,SAAS,SAAS;AAAA,UACzB,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI;AAAA,UACR,iCAAiC,MAAM,SAAS,KAAK,CAAC;AAAA,UACtD;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAU,MAAM,SAAS,KAAK;AAEpC,aAAO,OAAO,QACX,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM,MAAM,EAC1C,IAAI,CAAC,UAAU;AAAA,QACd,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,KAAK,aAAa,KAAK,UAAU;AAAA;AAAA,QACjC,MAAM,KAAK;AAAA,QACX,aAAa;AAAA;AAAA,QACb,WAAW,IAAI,KAAK,KAAK,eAAe;AAAA,MAC1C,EAAE;AAAA,IACN,SAAS,OAAO;AACd,UAAI,iBAAiB,sBAAc,OAAM;AACzC,YAAM,IAAI;AAAA,QACR,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC/E;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAA+B;AAC1C,QAAI;AACF,YAAM,OAAO,IAAI,IAAI,GAAG,EAAE;AAC1B,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,MAAM,oBAAoB;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,OAAO,WAAW;AAAA,UAChD,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,MAC/B,CAAC;AAED,UAAI,CAAC,SAAS,MAAM,SAAS,WAAW,KAAK;AAC3C,cAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,cAAM,IAAI;AAAA,UACR,kCAAkC,KAAK;AAAA,UACvC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,sBAAc,OAAM;AACzC,YAAM,IAAI;AAAA,QACR,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACjF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAmC;AACjC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,MAA+B;AAC5D,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,KAAK,MAAM;AAAA,MACd;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,OAAO,WAAW;AAAA,UAChD,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,UAAU;AAAA,YACR,sBAAsB;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AAEtC,UACE,SAAS,WAAW,OACpB,UAAU,OAAO,4BACjB;AACA,eAAO,UAAU,MAAM,2BAA2B,SAAS;AAAA,MAC7D;AACA,YAAM,IAAI;AAAA,QACR,iCAAiC,KAAK,UAAU,SAAS,CAAC;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAU,MAAM,SAAS,KAAK;AAEpC,WAAO,OAAO,IAAI,QAAQ,SAAS,OAAO;AAAA,EAC5C;AACF;","names":[]}
@@ -13,6 +13,7 @@ class DropboxStorage {
13
13
  }
14
14
  this.rootPath = config.rootPath ?? "/Vana Data";
15
15
  }
16
+ config;
16
17
  apiUrl = "https://api.dropboxapi.com/2";
17
18
  contentUrl = "https://content.dropboxapi.com/2";
18
19
  rootPath;