@opendatalabs/vana-sdk 2.3.0 → 3.0.1-canary.b068ac6

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 (631) 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 +150 -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 +129 -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/ecies/node.cjs +6 -6
  48. package/dist/crypto/ecies/node.cjs.map +1 -1
  49. package/dist/crypto/ecies/node.js +1 -1
  50. package/dist/crypto/ecies/node.js.map +1 -1
  51. package/dist/crypto/envelope/openpgp.cjs +59 -0
  52. package/dist/crypto/envelope/openpgp.cjs.map +1 -0
  53. package/dist/crypto/envelope/openpgp.d.ts +28 -0
  54. package/dist/crypto/envelope/openpgp.js +24 -0
  55. package/dist/crypto/envelope/openpgp.js.map +1 -0
  56. package/dist/crypto/keys/derive.cjs +65 -0
  57. package/dist/crypto/keys/derive.cjs.map +1 -0
  58. package/dist/crypto/keys/derive.d.ts +45 -0
  59. package/dist/crypto/keys/derive.js +38 -0
  60. package/dist/crypto/keys/derive.js.map +1 -0
  61. package/dist/errors.cjs +10 -0
  62. package/dist/errors.cjs.map +1 -1
  63. package/dist/errors.js +10 -0
  64. package/dist/errors.js.map +1 -1
  65. package/dist/generated/abi/index.cjs +2 -37
  66. package/dist/generated/abi/index.cjs.map +1 -1
  67. package/dist/generated/abi/index.d.ts +2683 -9296
  68. package/dist/generated/abi/index.js +2 -29
  69. package/dist/generated/abi/index.js.map +1 -1
  70. package/dist/generated/addresses.cjs +5 -107
  71. package/dist/generated/addresses.cjs.map +1 -1
  72. package/dist/generated/addresses.d.ts +5 -99
  73. package/dist/generated/addresses.js +5 -105
  74. package/dist/generated/addresses.js.map +1 -1
  75. package/dist/index.browser.d.ts +24 -140
  76. package/dist/index.browser.js +32258 -114
  77. package/dist/index.browser.js.map +7 -1
  78. package/dist/index.node.cjs +32980 -160
  79. package/dist/index.node.cjs.map +7 -1
  80. package/dist/index.node.d.ts +23 -210
  81. package/dist/index.node.js +32884 -133
  82. package/dist/index.node.js.map +7 -1
  83. package/dist/platform/node.cjs +2 -2
  84. package/dist/platform/node.cjs.map +1 -1
  85. package/dist/platform/node.js +1 -1
  86. package/dist/platform/node.js.map +1 -1
  87. package/dist/protocol/data-file.cjs +56 -0
  88. package/dist/protocol/data-file.cjs.map +1 -0
  89. package/dist/protocol/data-file.d.ts +20 -0
  90. package/dist/protocol/data-file.js +30 -0
  91. package/dist/protocol/data-file.js.map +1 -0
  92. package/dist/protocol/eip712.cjs +123 -0
  93. package/dist/protocol/eip712.cjs.map +1 -0
  94. package/dist/protocol/eip712.d.ts +117 -0
  95. package/dist/protocol/eip712.js +90 -0
  96. package/dist/protocol/eip712.js.map +1 -0
  97. package/dist/protocol/gateway.cjs +226 -0
  98. package/dist/protocol/gateway.cjs.map +1 -0
  99. package/dist/protocol/gateway.d.ts +120 -0
  100. package/dist/protocol/gateway.js +202 -0
  101. package/dist/protocol/gateway.js.map +1 -0
  102. package/dist/protocol/grants.cjs +146 -0
  103. package/dist/protocol/grants.cjs.map +1 -0
  104. package/dist/protocol/grants.d.ts +31 -0
  105. package/dist/protocol/grants.js +123 -0
  106. package/dist/protocol/grants.js.map +1 -0
  107. package/dist/protocol/scopes.cjs +78 -0
  108. package/dist/protocol/scopes.cjs.map +1 -0
  109. package/dist/protocol/scopes.d.ts +13 -0
  110. package/dist/protocol/scopes.js +50 -0
  111. package/dist/protocol/scopes.js.map +1 -0
  112. package/dist/{types/atomicStore.cjs → storage/default.cjs} +9 -8
  113. package/dist/storage/default.cjs.map +1 -0
  114. package/dist/storage/default.d.ts +4 -0
  115. package/dist/storage/default.js +8 -0
  116. package/dist/storage/default.js.map +1 -0
  117. package/dist/storage/index.cjs +11 -2
  118. package/dist/storage/index.cjs.map +1 -1
  119. package/dist/storage/index.d.ts +9 -0
  120. package/dist/storage/index.js +7 -1
  121. package/dist/storage/index.js.map +1 -1
  122. package/dist/storage/providers/callback-storage.cjs +1 -0
  123. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  124. package/dist/storage/providers/callback-storage.js +1 -0
  125. package/dist/storage/providers/callback-storage.js.map +1 -1
  126. package/dist/storage/providers/dropbox.cjs +1 -0
  127. package/dist/storage/providers/dropbox.cjs.map +1 -1
  128. package/dist/storage/providers/dropbox.js +1 -0
  129. package/dist/storage/providers/dropbox.js.map +1 -1
  130. package/dist/storage/providers/google-drive.cjs +1 -0
  131. package/dist/storage/providers/google-drive.cjs.map +1 -1
  132. package/dist/storage/providers/google-drive.js +1 -0
  133. package/dist/storage/providers/google-drive.js.map +1 -1
  134. package/dist/storage/providers/ipfs.cjs +1 -0
  135. package/dist/storage/providers/ipfs.cjs.map +1 -1
  136. package/dist/storage/providers/ipfs.js +1 -0
  137. package/dist/storage/providers/ipfs.js.map +1 -1
  138. package/dist/storage/providers/pinata.cjs +1 -0
  139. package/dist/storage/providers/pinata.cjs.map +1 -1
  140. package/dist/storage/providers/pinata.js +1 -0
  141. package/dist/storage/providers/pinata.js.map +1 -1
  142. package/dist/storage/providers/r2.cjs +376 -0
  143. package/dist/storage/providers/r2.cjs.map +1 -0
  144. package/dist/storage/providers/r2.d.ts +91 -0
  145. package/dist/storage/providers/r2.js +354 -0
  146. package/dist/storage/providers/r2.js.map +1 -0
  147. package/dist/storage/providers/vana-storage.cjs +251 -0
  148. package/dist/storage/providers/vana-storage.cjs.map +1 -0
  149. package/dist/storage/providers/vana-storage.d.ts +100 -0
  150. package/dist/storage/providers/vana-storage.js +231 -0
  151. package/dist/storage/providers/vana-storage.js.map +1 -0
  152. package/dist/types/config.cjs +0 -34
  153. package/dist/types/config.cjs.map +1 -1
  154. package/dist/types/config.d.ts +1 -607
  155. package/dist/types/config.js +0 -22
  156. package/dist/types/config.js.map +1 -1
  157. package/dist/types/contracts.cjs.map +1 -1
  158. package/dist/types/contracts.d.ts +1 -1
  159. package/dist/types/index.cjs +2 -33
  160. package/dist/types/index.cjs.map +1 -1
  161. package/dist/types/index.d.ts +2 -33
  162. package/dist/types/index.js +1 -35
  163. package/dist/types/index.js.map +1 -1
  164. package/dist/types/ps-errors.cjs +91 -0
  165. package/dist/types/ps-errors.cjs.map +1 -0
  166. package/dist/types/ps-errors.d.ts +26 -0
  167. package/dist/types/ps-errors.js +66 -0
  168. package/dist/types/ps-errors.js.map +1 -0
  169. package/dist/types.cjs.map +1 -1
  170. package/dist/types.d.ts +0 -29
  171. package/dist/types.js.map +1 -1
  172. package/package.json +8 -25
  173. package/dist/client/enhancedResponse.cjs +0 -164
  174. package/dist/client/enhancedResponse.cjs.map +0 -1
  175. package/dist/client/enhancedResponse.d.ts +0 -120
  176. package/dist/client/enhancedResponse.js +0 -138
  177. package/dist/client/enhancedResponse.js.map +0 -1
  178. package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +0 -7
  179. package/dist/controllers/base.cjs +0 -116
  180. package/dist/controllers/base.cjs.map +0 -1
  181. package/dist/controllers/base.d.ts +0 -94
  182. package/dist/controllers/base.js +0 -92
  183. package/dist/controllers/base.js.map +0 -1
  184. package/dist/controllers/data.cjs +0 -2633
  185. package/dist/controllers/data.cjs.map +0 -1
  186. package/dist/controllers/data.d.ts +0 -1067
  187. package/dist/controllers/data.js +0 -2626
  188. package/dist/controllers/data.js.map +0 -1
  189. package/dist/controllers/operations.cjs +0 -430
  190. package/dist/controllers/operations.cjs.map +0 -1
  191. package/dist/controllers/operations.d.ts +0 -229
  192. package/dist/controllers/operations.js +0 -406
  193. package/dist/controllers/operations.js.map +0 -1
  194. package/dist/controllers/permissions.cjs +0 -4368
  195. package/dist/controllers/permissions.cjs.map +0 -1
  196. package/dist/controllers/permissions.d.ts +0 -1411
  197. package/dist/controllers/permissions.js +0 -4344
  198. package/dist/controllers/permissions.js.map +0 -1
  199. package/dist/controllers/protocol.cjs +0 -183
  200. package/dist/controllers/protocol.cjs.map +0 -1
  201. package/dist/controllers/protocol.d.ts +0 -138
  202. package/dist/controllers/protocol.js +0 -163
  203. package/dist/controllers/protocol.js.map +0 -1
  204. package/dist/controllers/schemas.cjs +0 -678
  205. package/dist/controllers/schemas.cjs.map +0 -1
  206. package/dist/controllers/schemas.d.ts +0 -293
  207. package/dist/controllers/schemas.js +0 -654
  208. package/dist/controllers/schemas.js.map +0 -1
  209. package/dist/controllers/server.cjs +0 -643
  210. package/dist/controllers/server.cjs.map +0 -1
  211. package/dist/controllers/server.d.ts +0 -322
  212. package/dist/controllers/server.js +0 -624
  213. package/dist/controllers/server.js.map +0 -1
  214. package/dist/controllers/staking.cjs +0 -626
  215. package/dist/controllers/staking.cjs.map +0 -1
  216. package/dist/controllers/staking.d.ts +0 -457
  217. package/dist/controllers/staking.js +0 -602
  218. package/dist/controllers/staking.js.map +0 -1
  219. package/dist/core/__tests__/pollingManager.test.d.ts +0 -4
  220. package/dist/core/apiClient.cjs +0 -378
  221. package/dist/core/apiClient.cjs.map +0 -1
  222. package/dist/core/apiClient.d.ts +0 -286
  223. package/dist/core/apiClient.js +0 -359
  224. package/dist/core/apiClient.js.map +0 -1
  225. package/dist/core/generics.cjs +0 -417
  226. package/dist/core/generics.cjs.map +0 -1
  227. package/dist/core/generics.d.ts +0 -205
  228. package/dist/core/generics.js +0 -386
  229. package/dist/core/generics.js.map +0 -1
  230. package/dist/core/health.cjs +0 -289
  231. package/dist/core/health.cjs.map +0 -1
  232. package/dist/core/health.d.ts +0 -143
  233. package/dist/core/health.js +0 -265
  234. package/dist/core/health.js.map +0 -1
  235. package/dist/core/inMemoryNonceManager.cjs +0 -138
  236. package/dist/core/inMemoryNonceManager.cjs.map +0 -1
  237. package/dist/core/inMemoryNonceManager.d.ts +0 -69
  238. package/dist/core/inMemoryNonceManager.js +0 -114
  239. package/dist/core/inMemoryNonceManager.js.map +0 -1
  240. package/dist/core/nonceManager.cjs +0 -304
  241. package/dist/core/nonceManager.cjs.map +0 -1
  242. package/dist/core/nonceManager.d.ts +0 -116
  243. package/dist/core/nonceManager.js +0 -280
  244. package/dist/core/nonceManager.js.map +0 -1
  245. package/dist/core/pollingManager.cjs +0 -292
  246. package/dist/core/pollingManager.cjs.map +0 -1
  247. package/dist/core/pollingManager.d.ts +0 -120
  248. package/dist/core/pollingManager.js +0 -268
  249. package/dist/core/pollingManager.js.map +0 -1
  250. package/dist/core.cjs +0 -781
  251. package/dist/core.cjs.map +0 -1
  252. package/dist/core.d.ts +0 -496
  253. package/dist/core.js +0 -756
  254. package/dist/core.js.map +0 -1
  255. package/dist/diagnostics.cjs +0 -37
  256. package/dist/diagnostics.cjs.map +0 -1
  257. package/dist/diagnostics.d.ts +0 -24
  258. package/dist/diagnostics.js +0 -13
  259. package/dist/diagnostics.js.map +0 -1
  260. package/dist/generated/abi/DLPPerformanceImplementation.cjs +0 -1202
  261. package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +0 -1
  262. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +0 -914
  263. package/dist/generated/abi/DLPPerformanceImplementation.js +0 -1178
  264. package/dist/generated/abi/DLPPerformanceImplementation.js.map +0 -1
  265. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +0 -1112
  266. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +0 -1
  267. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +0 -840
  268. package/dist/generated/abi/DLPRewardDeployerImplementation.js +0 -1088
  269. package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +0 -1
  270. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs +0 -612
  271. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs.map +0 -1
  272. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +0 -451
  273. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js +0 -588
  274. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js.map +0 -1
  275. package/dist/generated/abi/DLPRewardSwapImplementation.cjs +0 -939
  276. package/dist/generated/abi/DLPRewardSwapImplementation.cjs.map +0 -1
  277. package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +0 -705
  278. package/dist/generated/abi/DLPRewardSwapImplementation.js +0 -915
  279. package/dist/generated/abi/DLPRewardSwapImplementation.js.map +0 -1
  280. package/dist/generated/abi/DLPRootImplementation.cjs +0 -1644
  281. package/dist/generated/abi/DLPRootImplementation.cjs.map +0 -1
  282. package/dist/generated/abi/DLPRootImplementation.d.ts +0 -1246
  283. package/dist/generated/abi/DLPRootImplementation.js +0 -1620
  284. package/dist/generated/abi/DLPRootImplementation.js.map +0 -1
  285. package/dist/generated/abi/DataLiquidityPoolImplementation.cjs +0 -985
  286. package/dist/generated/abi/DataLiquidityPoolImplementation.cjs.map +0 -1
  287. package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +0 -735
  288. package/dist/generated/abi/DataLiquidityPoolImplementation.js +0 -961
  289. package/dist/generated/abi/DataLiquidityPoolImplementation.js.map +0 -1
  290. package/dist/generated/abi/SwapHelperImplementation.cjs +0 -976
  291. package/dist/generated/abi/SwapHelperImplementation.cjs.map +0 -1
  292. package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -728
  293. package/dist/generated/abi/SwapHelperImplementation.js +0 -952
  294. package/dist/generated/abi/SwapHelperImplementation.js.map +0 -1
  295. package/dist/generated/abi/TeePoolImplementation.cjs +0 -1313
  296. package/dist/generated/abi/TeePoolImplementation.cjs.map +0 -1
  297. package/dist/generated/abi/TeePoolImplementation.d.ts +0 -992
  298. package/dist/generated/abi/TeePoolImplementation.js +0 -1289
  299. package/dist/generated/abi/TeePoolImplementation.js.map +0 -1
  300. package/dist/generated/event-types.cjs +0 -17
  301. package/dist/generated/event-types.cjs.map +0 -1
  302. package/dist/generated/event-types.d.ts +0 -816
  303. package/dist/generated/event-types.js +0 -1
  304. package/dist/generated/event-types.js.map +0 -1
  305. package/dist/generated/eventRegistry.cjs +0 -4512
  306. package/dist/generated/eventRegistry.cjs.map +0 -1
  307. package/dist/generated/eventRegistry.d.ts +0 -14
  308. package/dist/generated/eventRegistry.js +0 -4487
  309. package/dist/generated/eventRegistry.js.map +0 -1
  310. package/dist/generated/server/server-exports.cjs +0 -45
  311. package/dist/generated/server/server-exports.cjs.map +0 -1
  312. package/dist/generated/server/server-exports.d.ts +0 -36
  313. package/dist/generated/server/server-exports.js +0 -19
  314. package/dist/generated/server/server-exports.js.map +0 -1
  315. package/dist/generated/server/server.cjs +0 -17
  316. package/dist/generated/server/server.cjs.map +0 -1
  317. package/dist/generated/server/server.d.ts +0 -907
  318. package/dist/generated/server/server.js +0 -1
  319. package/dist/generated/server/server.js.map +0 -1
  320. package/dist/generated/subgraph.cjs +0 -1440
  321. package/dist/generated/subgraph.cjs.map +0 -1
  322. package/dist/generated/subgraph.d.ts +0 -6113
  323. package/dist/generated/subgraph.js +0 -1404
  324. package/dist/generated/subgraph.js.map +0 -1
  325. package/dist/lib/__tests__/redisAtomicStore.test.d.ts +0 -1
  326. package/dist/lib/redisAtomicStore.cjs +0 -201
  327. package/dist/lib/redisAtomicStore.cjs.map +0 -1
  328. package/dist/lib/redisAtomicStore.d.ts +0 -120
  329. package/dist/lib/redisAtomicStore.js +0 -177
  330. package/dist/lib/redisAtomicStore.js.map +0 -1
  331. package/dist/server/relayerHandler.cjs +0 -452
  332. package/dist/server/relayerHandler.cjs.map +0 -1
  333. package/dist/server/relayerHandler.d.ts +0 -69
  334. package/dist/server/relayerHandler.js +0 -428
  335. package/dist/server/relayerHandler.js.map +0 -1
  336. package/dist/tests/abi.test.d.ts +0 -1
  337. package/dist/tests/chains-definitions.test.d.ts +0 -1
  338. package/dist/tests/core-encryption.test.d.ts +0 -1
  339. package/dist/tests/core-extended.test.d.ts +0 -1
  340. package/dist/tests/core-generics-coverage.test.d.ts +0 -1
  341. package/dist/tests/coverage-boost.test.d.ts +0 -1
  342. package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +0 -1
  343. package/dist/tests/data-addfile-permissions-schema.test.d.ts +0 -1
  344. package/dist/tests/data-additional-methods.test.d.ts +0 -1
  345. package/dist/tests/data-controller-edge-cases.test.d.ts +0 -1
  346. package/dist/tests/data-ipfs-gateways.test.d.ts +0 -1
  347. package/dist/tests/data-relayer.test.d.ts +0 -1
  348. package/dist/tests/data-schema-validation.test.d.ts +0 -1
  349. package/dist/tests/data-simple-methods.test.d.ts +0 -1
  350. package/dist/tests/data-upload-owner-validation.test.d.ts +0 -1
  351. package/dist/tests/data.test.d.ts +0 -1
  352. package/dist/tests/demo-integration.test.d.ts +0 -1
  353. package/dist/tests/demo-trusted-server-integration.test.d.ts +0 -1
  354. package/dist/tests/download-relayer.test.d.ts +0 -1
  355. package/dist/tests/dual-mode-permissions.test.d.ts +0 -1
  356. package/dist/tests/dual-mode-trusted-servers.test.d.ts +0 -1
  357. package/dist/tests/encryption-correct-implementation.test.d.ts +0 -1
  358. package/dist/tests/encryption-coverage.test.d.ts +0 -1
  359. package/dist/tests/encryption-edge-cases.test.d.ts +0 -1
  360. package/dist/tests/encryption-utils-updated.test.d.ts +0 -1
  361. package/dist/tests/errors-coverage.test.d.ts +0 -1
  362. package/dist/tests/factories/mockFactory.d.ts +0 -316
  363. package/dist/tests/fakes/FakeStorageManager.d.ts +0 -200
  364. package/dist/tests/fakes/FakeStorageManager.test.d.ts +0 -1
  365. package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +0 -170
  366. package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +0 -1
  367. package/dist/tests/fakes/fake-pgp-port.d.ts +0 -13
  368. package/dist/tests/grantValidation-edge-cases.test.d.ts +0 -1
  369. package/dist/tests/grantValidation-unreachable-branch.test.d.ts +0 -1
  370. package/dist/tests/helper-methods.test.d.ts +0 -1
  371. package/dist/tests/helpers/typedMocks.d.ts +0 -64
  372. package/dist/tests/index-browser.test.d.ts +0 -1
  373. package/dist/tests/index-node.test.d.ts +0 -1
  374. package/dist/tests/index.test.d.ts +0 -1
  375. package/dist/tests/mocks/platformAdapter.d.ts +0 -12
  376. package/dist/tests/new-permissions-methods.test.d.ts +0 -1
  377. package/dist/tests/no-buffer-browser.test.d.ts +0 -1
  378. package/dist/tests/permissions-grantee.test.d.ts +0 -1
  379. package/dist/tests/permissions-revoke-relayer.test.d.ts +0 -1
  380. package/dist/tests/permissions-schema-validation.test.d.ts +0 -1
  381. package/dist/tests/permissions-server-files.test.d.ts +0 -1
  382. package/dist/tests/permissions-transaction-options.test.d.ts +0 -1
  383. package/dist/tests/permissions-trust-servers.test.d.ts +0 -1
  384. package/dist/tests/permissions.test.d.ts +0 -1
  385. package/dist/tests/personal.test.d.ts +0 -1
  386. package/dist/tests/platform-browser.test.d.ts +0 -1
  387. package/dist/tests/platform-crypto-expanded.test.d.ts +0 -1
  388. package/dist/tests/platform-crypto.test.d.ts +0 -1
  389. package/dist/tests/platform-index.test.d.ts +0 -1
  390. package/dist/tests/platform-node.test.d.ts +0 -1
  391. package/dist/tests/platform-shared-utils.test.d.ts +0 -1
  392. package/dist/tests/platform-updated.test.d.ts +0 -1
  393. package/dist/tests/protocol-additional-methods.test.d.ts +0 -1
  394. package/dist/tests/protocol.test.d.ts +0 -1
  395. package/dist/tests/read-only-mode.test.d.ts +0 -1
  396. package/dist/tests/relayer-integration.test.d.ts +0 -1
  397. package/dist/tests/relayer-unified.test.d.ts +0 -1
  398. package/dist/tests/schemas.test.d.ts +0 -1
  399. package/dist/tests/server-relayer-handler.test.d.ts +0 -1
  400. package/dist/tests/signatureFormatter.test.d.ts +0 -1
  401. package/dist/tests/staking.test.d.ts +0 -1
  402. package/dist/tests/trusted-server-queries.test.d.ts +0 -1
  403. package/dist/tests/typedDataConverter.test.d.ts +0 -1
  404. package/dist/tests/types-contracts.test.d.ts +0 -1
  405. package/dist/tests/types-data.test.d.ts +0 -1
  406. package/dist/tests/types-external-apis.test.d.ts +0 -1
  407. package/dist/tests/types-generics.test.d.ts +0 -1
  408. package/dist/tests/types-permissions.test.d.ts +0 -1
  409. package/dist/tests/types-upload-params.test.d.ts +0 -1
  410. package/dist/tests/types.test.d.ts +0 -1
  411. package/dist/tests/utils-formatters.test.d.ts +0 -1
  412. package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +0 -1
  413. package/dist/tests/utils-grantFiles-validation.test.d.ts +0 -1
  414. package/dist/tests/utils-grantFiles.test.d.ts +0 -1
  415. package/dist/tests/utils-grantValidation-consolidated.test.d.ts +0 -1
  416. package/dist/tests/utils-grants.test.d.ts +0 -1
  417. package/dist/tests/utils-ipfs-additional.test.d.ts +0 -1
  418. package/dist/tests/utils-ipfs.test.d.ts +0 -4
  419. package/dist/tests/utils-schemaValidation.test.d.ts +0 -1
  420. package/dist/tests/vana.test.d.ts +0 -1
  421. package/dist/tests/wallet-crypto-compatibility.test.d.ts +0 -1
  422. package/dist/types/atomicStore.cjs.map +0 -1
  423. package/dist/types/atomicStore.d.ts +0 -236
  424. package/dist/types/atomicStore.js +0 -7
  425. package/dist/types/atomicStore.js.map +0 -1
  426. package/dist/types/blockchain.cjs +0 -17
  427. package/dist/types/blockchain.cjs.map +0 -1
  428. package/dist/types/blockchain.d.ts +0 -85
  429. package/dist/types/blockchain.js +0 -1
  430. package/dist/types/blockchain.js.map +0 -1
  431. package/dist/types/controller-context.cjs +0 -17
  432. package/dist/types/controller-context.cjs.map +0 -1
  433. package/dist/types/controller-context.d.ts +0 -68
  434. package/dist/types/controller-context.js +0 -1
  435. package/dist/types/controller-context.js.map +0 -1
  436. package/dist/types/data.cjs +0 -17
  437. package/dist/types/data.cjs.map +0 -1
  438. package/dist/types/data.d.ts +0 -763
  439. package/dist/types/data.js +0 -1
  440. package/dist/types/data.js.map +0 -1
  441. package/dist/types/external-apis.cjs +0 -61
  442. package/dist/types/external-apis.cjs.map +0 -1
  443. package/dist/types/external-apis.d.ts +0 -184
  444. package/dist/types/external-apis.js +0 -34
  445. package/dist/types/external-apis.js.map +0 -1
  446. package/dist/types/generics.cjs +0 -17
  447. package/dist/types/generics.cjs.map +0 -1
  448. package/dist/types/generics.d.ts +0 -518
  449. package/dist/types/generics.js +0 -1
  450. package/dist/types/generics.js.map +0 -1
  451. package/dist/types/operationStore.cjs +0 -17
  452. package/dist/types/operationStore.cjs.map +0 -1
  453. package/dist/types/operationStore.d.ts +0 -171
  454. package/dist/types/operationStore.js +0 -1
  455. package/dist/types/operationStore.js.map +0 -1
  456. package/dist/types/operations.cjs +0 -53
  457. package/dist/types/operations.cjs.map +0 -1
  458. package/dist/types/operations.d.ts +0 -204
  459. package/dist/types/operations.js +0 -26
  460. package/dist/types/operations.js.map +0 -1
  461. package/dist/types/options.cjs +0 -17
  462. package/dist/types/options.cjs.map +0 -1
  463. package/dist/types/options.d.ts +0 -308
  464. package/dist/types/options.js +0 -1
  465. package/dist/types/options.js.map +0 -1
  466. package/dist/types/permissions.cjs +0 -17
  467. package/dist/types/permissions.cjs.map +0 -1
  468. package/dist/types/permissions.d.ts +0 -955
  469. package/dist/types/permissions.js +0 -1
  470. package/dist/types/permissions.js.map +0 -1
  471. package/dist/types/personal.cjs +0 -17
  472. package/dist/types/personal.cjs.map +0 -1
  473. package/dist/types/personal.d.ts +0 -174
  474. package/dist/types/personal.js +0 -1
  475. package/dist/types/personal.js.map +0 -1
  476. package/dist/types/relayer.cjs +0 -17
  477. package/dist/types/relayer.cjs.map +0 -1
  478. package/dist/types/relayer.d.ts +0 -552
  479. package/dist/types/relayer.js +0 -1
  480. package/dist/types/relayer.js.map +0 -1
  481. package/dist/types/transactionResults.cjs +0 -17
  482. package/dist/types/transactionResults.cjs.map +0 -1
  483. package/dist/types/transactionResults.d.ts +0 -193
  484. package/dist/types/transactionResults.js +0 -1
  485. package/dist/types/transactionResults.js.map +0 -1
  486. package/dist/types/utils.cjs +0 -17
  487. package/dist/types/utils.cjs.map +0 -1
  488. package/dist/types/utils.d.ts +0 -771
  489. package/dist/types/utils.js +0 -1
  490. package/dist/types/utils.js.map +0 -1
  491. package/dist/utils/__tests__/chainQuery.test.d.ts +0 -1
  492. package/dist/utils/__tests__/parseTransaction.test.d.ts +0 -1
  493. package/dist/utils/__tests__/pojo-serialization.test.d.ts +0 -1
  494. package/dist/utils/__tests__/signatureCache.test.d.ts +0 -1
  495. package/dist/utils/__tests__/subgraphConsistency.test.d.ts +0 -4
  496. package/dist/utils/__tests__/subgraphPagination.test.d.ts +0 -4
  497. package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +0 -1
  498. package/dist/utils/__tests__/transactionHelpers.test.d.ts +0 -1
  499. package/dist/utils/__tests__/urlResolver.test.d.ts +0 -4
  500. package/dist/utils/blockchain/registry.cjs +0 -81
  501. package/dist/utils/blockchain/registry.cjs.map +0 -1
  502. package/dist/utils/blockchain/registry.d.ts +0 -32
  503. package/dist/utils/blockchain/registry.js +0 -56
  504. package/dist/utils/blockchain/registry.js.map +0 -1
  505. package/dist/utils/blockchain/registry.test.d.ts +0 -1
  506. package/dist/utils/chainQuery.cjs +0 -107
  507. package/dist/utils/chainQuery.cjs.map +0 -1
  508. package/dist/utils/chainQuery.d.ts +0 -31
  509. package/dist/utils/chainQuery.js +0 -82
  510. package/dist/utils/chainQuery.js.map +0 -1
  511. package/dist/utils/download.cjs +0 -69
  512. package/dist/utils/download.cjs.map +0 -1
  513. package/dist/utils/download.d.ts +0 -40
  514. package/dist/utils/download.js +0 -45
  515. package/dist/utils/download.js.map +0 -1
  516. package/dist/utils/encryption.cjs +0 -176
  517. package/dist/utils/encryption.cjs.map +0 -1
  518. package/dist/utils/encryption.d.ts +0 -271
  519. package/dist/utils/encryption.js +0 -142
  520. package/dist/utils/encryption.js.map +0 -1
  521. package/dist/utils/formatters.cjs +0 -55
  522. package/dist/utils/formatters.cjs.map +0 -1
  523. package/dist/utils/formatters.d.ts +0 -118
  524. package/dist/utils/formatters.js +0 -28
  525. package/dist/utils/formatters.js.map +0 -1
  526. package/dist/utils/grantFiles.cjs +0 -181
  527. package/dist/utils/grantFiles.cjs.map +0 -1
  528. package/dist/utils/grantFiles.d.ts +0 -172
  529. package/dist/utils/grantFiles.js +0 -143
  530. package/dist/utils/grantFiles.js.map +0 -1
  531. package/dist/utils/grantValidation.cjs +0 -243
  532. package/dist/utils/grantValidation.cjs.map +0 -1
  533. package/dist/utils/grantValidation.d.ts +0 -226
  534. package/dist/utils/grantValidation.js +0 -201
  535. package/dist/utils/grantValidation.js.map +0 -1
  536. package/dist/utils/grants.cjs +0 -108
  537. package/dist/utils/grants.cjs.map +0 -1
  538. package/dist/utils/grants.d.ts +0 -148
  539. package/dist/utils/grants.js +0 -82
  540. package/dist/utils/grants.js.map +0 -1
  541. package/dist/utils/ipfs.cjs +0 -128
  542. package/dist/utils/ipfs.cjs.map +0 -1
  543. package/dist/utils/ipfs.d.ts +0 -88
  544. package/dist/utils/ipfs.js +0 -97
  545. package/dist/utils/ipfs.js.map +0 -1
  546. package/dist/utils/multicall.cjs +0 -233
  547. package/dist/utils/multicall.cjs.map +0 -1
  548. package/dist/utils/multicall.d.ts +0 -126
  549. package/dist/utils/multicall.js +0 -208
  550. package/dist/utils/multicall.js.map +0 -1
  551. package/dist/utils/parseTransactionPojo.cjs +0 -87
  552. package/dist/utils/parseTransactionPojo.cjs.map +0 -1
  553. package/dist/utils/parseTransactionPojo.d.ts +0 -31
  554. package/dist/utils/parseTransactionPojo.js +0 -63
  555. package/dist/utils/parseTransactionPojo.js.map +0 -1
  556. package/dist/utils/schemaValidation.cjs +0 -258
  557. package/dist/utils/schemaValidation.cjs.map +0 -1
  558. package/dist/utils/schemaValidation.d.ts +0 -168
  559. package/dist/utils/schemaValidation.js +0 -219
  560. package/dist/utils/schemaValidation.js.map +0 -1
  561. package/dist/utils/signatureCache.cjs +0 -192
  562. package/dist/utils/signatureCache.cjs.map +0 -1
  563. package/dist/utils/signatureCache.d.ts +0 -172
  564. package/dist/utils/signatureCache.js +0 -167
  565. package/dist/utils/signatureCache.js.map +0 -1
  566. package/dist/utils/signatureFormatter.cjs +0 -42
  567. package/dist/utils/signatureFormatter.cjs.map +0 -1
  568. package/dist/utils/signatureFormatter.d.ts +0 -36
  569. package/dist/utils/signatureFormatter.js +0 -18
  570. package/dist/utils/signatureFormatter.js.map +0 -1
  571. package/dist/utils/subgraphConsistency.cjs +0 -184
  572. package/dist/utils/subgraphConsistency.cjs.map +0 -1
  573. package/dist/utils/subgraphConsistency.d.ts +0 -65
  574. package/dist/utils/subgraphConsistency.js +0 -155
  575. package/dist/utils/subgraphConsistency.js.map +0 -1
  576. package/dist/utils/subgraphMetaCache.cjs +0 -101
  577. package/dist/utils/subgraphMetaCache.cjs.map +0 -1
  578. package/dist/utils/subgraphMetaCache.d.ts +0 -56
  579. package/dist/utils/subgraphMetaCache.js +0 -76
  580. package/dist/utils/subgraphMetaCache.js.map +0 -1
  581. package/dist/utils/subgraphPagination.cjs +0 -104
  582. package/dist/utils/subgraphPagination.cjs.map +0 -1
  583. package/dist/utils/subgraphPagination.d.ts +0 -78
  584. package/dist/utils/subgraphPagination.js +0 -78
  585. package/dist/utils/subgraphPagination.js.map +0 -1
  586. package/dist/utils/tests/multicall.test.d.ts +0 -1
  587. package/dist/utils/transactionHelpers.cjs +0 -54
  588. package/dist/utils/transactionHelpers.cjs.map +0 -1
  589. package/dist/utils/transactionHelpers.d.ts +0 -80
  590. package/dist/utils/transactionHelpers.js +0 -29
  591. package/dist/utils/transactionHelpers.js.map +0 -1
  592. package/dist/utils/typeGuards.cjs +0 -109
  593. package/dist/utils/typeGuards.cjs.map +0 -1
  594. package/dist/utils/typeGuards.d.ts +0 -138
  595. package/dist/utils/typeGuards.js +0 -74
  596. package/dist/utils/typeGuards.js.map +0 -1
  597. package/dist/utils/typedDataConverter.cjs +0 -43
  598. package/dist/utils/typedDataConverter.cjs.map +0 -1
  599. package/dist/utils/typedDataConverter.d.ts +0 -46
  600. package/dist/utils/typedDataConverter.js +0 -19
  601. package/dist/utils/typedDataConverter.js.map +0 -1
  602. package/dist/utils/urlResolver.cjs +0 -62
  603. package/dist/utils/urlResolver.cjs.map +0 -1
  604. package/dist/utils/urlResolver.d.ts +0 -56
  605. package/dist/utils/urlResolver.js +0 -37
  606. package/dist/utils/urlResolver.js.map +0 -1
  607. package/dist/utils/wallet.cjs +0 -63
  608. package/dist/utils/wallet.cjs.map +0 -1
  609. package/dist/utils/wallet.d.ts +0 -94
  610. package/dist/utils/wallet.js +0 -37
  611. package/dist/utils/wallet.js.map +0 -1
  612. package/dist/utils/withEvents.cjs +0 -44
  613. package/dist/utils/withEvents.cjs.map +0 -1
  614. package/dist/utils/withEvents.d.ts +0 -56
  615. package/dist/utils/withEvents.js +0 -18
  616. package/dist/utils/withEvents.js.map +0 -1
  617. /package/dist/{__tests__/waitForTransactionEvents.test.d.ts → auth/pkce.test.d.ts} +0 -0
  618. /package/dist/{client/__tests__/enhancedResponse.test.d.ts → auth/token-store.test.d.ts} +0 -0
  619. /package/dist/{controllers/__tests__/operations.processQueue.test.d.ts → auth/web3-signed.test.d.ts} +0 -0
  620. /package/dist/{controllers/__tests__/schemas-edge-cases.test.d.ts → crypto/envelope/openpgp.test.d.ts} +0 -0
  621. /package/dist/{controllers/data-error-handling.test.d.ts → crypto/keys/derive.test.d.ts} +0 -0
  622. /package/dist/{tests/errors.test.d.ts → errors.test.d.ts} +0 -0
  623. /package/dist/{controllers/server-additional.test.d.ts → protocol/data-file.test.d.ts} +0 -0
  624. /package/dist/{core/__tests__/health.test.d.ts → protocol/eip712.test.d.ts} +0 -0
  625. /package/dist/{core/__tests__/inMemoryNonceManager.test.d.ts → protocol/gateway.test.d.ts} +0 -0
  626. /package/dist/{core/__tests__/nonceManager.test.d.ts → protocol/grants.test.d.ts} +0 -0
  627. /package/dist/{core/core.test.d.ts → protocol/scopes.test.d.ts} +0 -0
  628. /package/dist/{core/tests/apiClient.test.d.ts → storage/tests/defaultStorage.test.d.ts} +0 -0
  629. /package/dist/{core/tests/client.test.d.ts → storage/tests/r2Storage.test.d.ts} +0 -0
  630. /package/dist/{core/tests/generics.test.d.ts → storage/tests/vanaStorage.test.d.ts} +0 -0
  631. /package/dist/{diagnostics.test.d.ts → types/ps-errors.test.d.ts} +0 -0
@@ -0,0 +1,354 @@
1
+ import { hmac } from "@noble/hashes/hmac";
2
+ import { sha256 } from "@noble/hashes/sha2";
3
+ import {
4
+ StorageError
5
+ } from "../index";
6
+ const SERVICE = "s3";
7
+ const DEFAULT_REGION = "auto";
8
+ class R2Storage {
9
+ constructor(config) {
10
+ this.config = config;
11
+ if (!config.accessKeyId) {
12
+ throw new StorageError(
13
+ "R2 accessKeyId is required",
14
+ "MISSING_ACCESS_KEY",
15
+ "r2"
16
+ );
17
+ }
18
+ if (!config.secretAccessKey) {
19
+ throw new StorageError(
20
+ "R2 secretAccessKey is required",
21
+ "MISSING_SECRET_KEY",
22
+ "r2"
23
+ );
24
+ }
25
+ if (!config.bucket) {
26
+ throw new StorageError("R2 bucket is required", "MISSING_BUCKET", "r2");
27
+ }
28
+ if (!config.endpoint && !config.accountId) {
29
+ throw new StorageError(
30
+ "R2 endpoint or accountId is required",
31
+ "MISSING_ENDPOINT",
32
+ "r2"
33
+ );
34
+ }
35
+ if (!config.publicUrl && !config.accountId) {
36
+ throw new StorageError(
37
+ "R2 publicUrl is required when accountId is not provided",
38
+ "MISSING_PUBLIC_URL",
39
+ "r2"
40
+ );
41
+ }
42
+ this.bucket = config.bucket;
43
+ this.region = config.region ?? DEFAULT_REGION;
44
+ this.endpoint = (config.endpoint ?? `https://${config.accountId}.r2.cloudflarestorage.com`).replace(/\/$/, "");
45
+ this.publicUrl = (config.publicUrl ?? `https://${config.bucket}.${config.accountId}.r2.dev`).replace(/\/$/, "");
46
+ }
47
+ config;
48
+ endpoint;
49
+ publicUrl;
50
+ region;
51
+ bucket;
52
+ async upload(file, filename) {
53
+ const key = filename ?? `vana-${Date.now()}-${randomSuffix()}.dat`;
54
+ const body = new Uint8Array(await file.arrayBuffer());
55
+ const contentType = file.type !== "" ? file.type : "application/octet-stream";
56
+ try {
57
+ const signed = await this.signRequest({
58
+ method: "PUT",
59
+ path: `/${this.bucket}/${encodePath(key)}`,
60
+ body,
61
+ extraHeaders: { "content-type": contentType }
62
+ });
63
+ const response = await fetch(signed.url, {
64
+ method: "PUT",
65
+ headers: signed.headers,
66
+ body
67
+ });
68
+ if (!response.ok) {
69
+ throw new StorageError(
70
+ `R2 upload failed: ${response.status} ${response.statusText} - ${await safeText(response)}`,
71
+ "UPLOAD_FAILED",
72
+ "r2"
73
+ );
74
+ }
75
+ return {
76
+ url: `${this.publicUrl}/${encodePath(key)}`,
77
+ size: file.size,
78
+ contentType
79
+ };
80
+ } catch (error) {
81
+ throw wrapError(error, "UPLOAD_ERROR", "r2");
82
+ }
83
+ }
84
+ async download(url) {
85
+ const key = this.extractKey(url);
86
+ if (!key) {
87
+ throw new StorageError(
88
+ `Could not extract object key from URL: ${url}`,
89
+ "INVALID_URL",
90
+ "r2"
91
+ );
92
+ }
93
+ try {
94
+ const signed = await this.signRequest({
95
+ method: "GET",
96
+ path: `/${this.bucket}/${encodePath(key)}`
97
+ });
98
+ const response = await fetch(signed.url, {
99
+ method: "GET",
100
+ headers: signed.headers
101
+ });
102
+ if (!response.ok) {
103
+ throw new StorageError(
104
+ `R2 download failed: ${response.status} ${response.statusText}`,
105
+ "DOWNLOAD_FAILED",
106
+ "r2"
107
+ );
108
+ }
109
+ return await response.blob();
110
+ } catch (error) {
111
+ throw wrapError(error, "DOWNLOAD_ERROR", "r2");
112
+ }
113
+ }
114
+ async list(options) {
115
+ try {
116
+ const params = new URLSearchParams({ "list-type": "2" });
117
+ if (options?.namePattern) {
118
+ params.set("prefix", options.namePattern);
119
+ }
120
+ if (options?.limit !== void 0) {
121
+ params.set("max-keys", String(options.limit));
122
+ }
123
+ if (options?.offset !== void 0) {
124
+ params.set("continuation-token", String(options.offset));
125
+ }
126
+ const signed = await this.signRequest({
127
+ method: "GET",
128
+ path: `/${this.bucket}`,
129
+ query: params
130
+ });
131
+ const response = await fetch(signed.url, {
132
+ method: "GET",
133
+ headers: signed.headers
134
+ });
135
+ if (!response.ok) {
136
+ throw new StorageError(
137
+ `R2 list failed: ${response.status} ${response.statusText}`,
138
+ "LIST_FAILED",
139
+ "r2"
140
+ );
141
+ }
142
+ const xml = await response.text();
143
+ return parseListObjects(xml).map((obj) => ({
144
+ id: obj.key,
145
+ name: obj.key,
146
+ url: `${this.publicUrl}/${encodePath(obj.key)}`,
147
+ size: obj.size,
148
+ contentType: "application/octet-stream",
149
+ createdAt: obj.lastModified
150
+ }));
151
+ } catch (error) {
152
+ throw wrapError(error, "LIST_ERROR", "r2");
153
+ }
154
+ }
155
+ async delete(url) {
156
+ const key = this.extractKey(url);
157
+ if (!key) {
158
+ throw new StorageError(
159
+ `Could not extract object key from URL: ${url}`,
160
+ "INVALID_URL",
161
+ "r2"
162
+ );
163
+ }
164
+ try {
165
+ const signed = await this.signRequest({
166
+ method: "DELETE",
167
+ path: `/${this.bucket}/${encodePath(key)}`
168
+ });
169
+ const response = await fetch(signed.url, {
170
+ method: "DELETE",
171
+ headers: signed.headers
172
+ });
173
+ if (!response.ok && response.status !== 204) {
174
+ throw new StorageError(
175
+ `R2 delete failed: ${response.status} ${response.statusText}`,
176
+ "DELETE_FAILED",
177
+ "r2"
178
+ );
179
+ }
180
+ return true;
181
+ } catch (error) {
182
+ throw wrapError(error, "DELETE_ERROR", "r2");
183
+ }
184
+ }
185
+ getConfig() {
186
+ return {
187
+ name: "Cloudflare R2",
188
+ type: "r2",
189
+ requiresAuth: true,
190
+ features: {
191
+ upload: true,
192
+ download: true,
193
+ list: true,
194
+ delete: true
195
+ }
196
+ };
197
+ }
198
+ /**
199
+ * Extract the object key from a URL. Accepts public URLs minted by `upload()`
200
+ * as well as raw keys for callers that already track them out-of-band.
201
+ *
202
+ * @internal
203
+ */
204
+ extractKey(urlOrKey) {
205
+ if (urlOrKey.startsWith(this.publicUrl + "/")) {
206
+ return decodeURIComponent(urlOrKey.slice(this.publicUrl.length + 1));
207
+ }
208
+ if (urlOrKey.startsWith(this.endpoint + "/")) {
209
+ const rest = urlOrKey.slice(this.endpoint.length + 1);
210
+ const slash = rest.indexOf("/");
211
+ return slash === -1 ? null : decodeURIComponent(rest.slice(slash + 1));
212
+ }
213
+ if (!urlOrKey.includes("://")) {
214
+ return urlOrKey;
215
+ }
216
+ return null;
217
+ }
218
+ async signRequest(req) {
219
+ const { host } = new URL(this.endpoint);
220
+ const now = /* @__PURE__ */ new Date();
221
+ const amzDate = formatAmzDate(now);
222
+ const dateStamp = amzDate.slice(0, 8);
223
+ const payloadHash = req.body ? toHex(sha256(req.body)) : EMPTY_PAYLOAD_HASH;
224
+ const canonicalQuery = req.query ? canonicalizeQuery(req.query) : "";
225
+ const headers = {
226
+ host,
227
+ "x-amz-content-sha256": payloadHash,
228
+ "x-amz-date": amzDate,
229
+ ...req.extraHeaders ?? {}
230
+ };
231
+ const sortedHeaderNames = Object.keys(headers).map((h) => h.toLowerCase()).sort();
232
+ const canonicalHeaders = sortedHeaderNames.map((h) => `${h}:${headers[h].trim().replace(/\s+/g, " ")}`).join("\n") + "\n";
233
+ const signedHeaders = sortedHeaderNames.join(";");
234
+ const canonicalRequest = [
235
+ req.method,
236
+ req.path,
237
+ canonicalQuery,
238
+ canonicalHeaders,
239
+ signedHeaders,
240
+ payloadHash
241
+ ].join("\n");
242
+ const credentialScope = `${dateStamp}/${this.region}/${SERVICE}/aws4_request`;
243
+ const stringToSign = [
244
+ "AWS4-HMAC-SHA256",
245
+ amzDate,
246
+ credentialScope,
247
+ toHex(sha256(new TextEncoder().encode(canonicalRequest)))
248
+ ].join("\n");
249
+ const signingKey = deriveSigningKey(
250
+ this.config.secretAccessKey,
251
+ dateStamp,
252
+ this.region,
253
+ SERVICE
254
+ );
255
+ const signature = toHex(
256
+ hmac(sha256, signingKey, new TextEncoder().encode(stringToSign))
257
+ );
258
+ headers.authorization = `AWS4-HMAC-SHA256 Credential=${this.config.accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
259
+ const url = this.endpoint + req.path + (canonicalQuery !== "" ? `?${canonicalQuery}` : "");
260
+ return { url, headers };
261
+ }
262
+ }
263
+ const EMPTY_PAYLOAD_HASH = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
264
+ function deriveSigningKey(secret, dateStamp, region, service) {
265
+ const enc = new TextEncoder();
266
+ const kDate = hmac(
267
+ sha256,
268
+ enc.encode(`AWS4${secret}`),
269
+ enc.encode(dateStamp)
270
+ );
271
+ const kRegion = hmac(sha256, kDate, enc.encode(region));
272
+ const kService = hmac(sha256, kRegion, enc.encode(service));
273
+ return hmac(sha256, kService, enc.encode("aws4_request"));
274
+ }
275
+ function formatAmzDate(date) {
276
+ const iso = date.toISOString();
277
+ return iso.replace(/[-:]/g, "").replace(/\.\d+/, "");
278
+ }
279
+ function toHex(bytes) {
280
+ let s = "";
281
+ for (let i = 0; i < bytes.length; i++) {
282
+ s += bytes[i].toString(16).padStart(2, "0");
283
+ }
284
+ return s;
285
+ }
286
+ function rfc3986Encode(value) {
287
+ return encodeURIComponent(value).replace(
288
+ /[!'()*]/g,
289
+ (c) => "%" + c.charCodeAt(0).toString(16).toUpperCase()
290
+ );
291
+ }
292
+ function encodePath(key) {
293
+ return key.split("/").map(rfc3986Encode).join("/");
294
+ }
295
+ function canonicalizeQuery(params) {
296
+ const entries = [];
297
+ for (const [k, v] of params.entries()) {
298
+ entries.push([k, v]);
299
+ }
300
+ entries.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
301
+ return entries.map(([k, v]) => `${rfc3986Encode(k)}=${rfc3986Encode(v)}`).join("&");
302
+ }
303
+ function parseListObjects(xml) {
304
+ const out = [];
305
+ const contentsRe = /<Contents>([\s\S]*?)<\/Contents>/g;
306
+ let match;
307
+ while ((match = contentsRe.exec(xml)) !== null) {
308
+ const block = match[1];
309
+ const key = matchTag(block, "Key");
310
+ const size = matchTag(block, "Size");
311
+ const lastModified = matchTag(block, "LastModified");
312
+ if (key === null) {
313
+ continue;
314
+ }
315
+ out.push({
316
+ key: decodeXmlEntities(key),
317
+ size: size !== null ? parseInt(size, 10) || 0 : 0,
318
+ lastModified: lastModified !== null ? new Date(lastModified) : /* @__PURE__ */ new Date(0)
319
+ });
320
+ }
321
+ return out;
322
+ }
323
+ function matchTag(block, tag) {
324
+ const re = new RegExp(`<${tag}>([\\s\\S]*?)<\\/${tag}>`);
325
+ const m = re.exec(block);
326
+ return m === null ? null : m[1];
327
+ }
328
+ function decodeXmlEntities(s) {
329
+ return s.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&apos;/g, "'");
330
+ }
331
+ function randomSuffix() {
332
+ return Math.random().toString(36).slice(2, 10);
333
+ }
334
+ async function safeText(response) {
335
+ try {
336
+ return await response.text();
337
+ } catch {
338
+ return "";
339
+ }
340
+ }
341
+ function wrapError(error, code, provider) {
342
+ if (error instanceof StorageError) {
343
+ return error;
344
+ }
345
+ return new StorageError(
346
+ `R2 error: ${error instanceof Error ? error.message : "Unknown error"}`,
347
+ code,
348
+ provider
349
+ );
350
+ }
351
+ export {
352
+ R2Storage
353
+ };
354
+ //# sourceMappingURL=r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/storage/providers/r2.ts"],"sourcesContent":["import { hmac } from \"@noble/hashes/hmac\";\nimport { sha256 } from \"@noble/hashes/sha2\";\n\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../index\";\n\n/**\n * Configuration for {@link R2Storage}.\n *\n * @category Storage\n */\nexport interface R2Config {\n /** Cloudflare account ID. Used to derive the S3 endpoint when `endpoint` is not given. */\n accountId?: string;\n /**\n * Full S3 endpoint URL. Overrides `accountId`.\n *\n * Defaults to `https://{accountId}.r2.cloudflarestorage.com`.\n */\n endpoint?: string;\n /** R2 access key ID. */\n accessKeyId: string;\n /** R2 secret access key. */\n secretAccessKey: string;\n /** Bucket name. */\n bucket: string;\n /**\n * Public URL prefix used when constructing the URL returned by {@link R2Storage.upload}.\n *\n * If unset, defaults to `https://{bucket}.{accountId}.r2.dev` (R2's default public hostname).\n * Set this to a custom domain bound to the bucket if you have one.\n */\n publicUrl?: string;\n /**\n * S3 region. R2 expects `auto`; consumers can override for compatibility with other\n * S3-compatible stores reachable through the same code path.\n */\n region?: string;\n}\n\ninterface SignedRequest {\n url: string;\n headers: Record<string, string>;\n}\n\nconst SERVICE = \"s3\";\nconst DEFAULT_REGION = \"auto\";\n\n/**\n * Cloudflare R2 storage provider.\n *\n * @remarks\n * Uses R2's S3-compatible API with SigV4 signed `fetch` requests, so the same\n * implementation runs in browsers, Node.js, and Workers without pulling in\n * `@aws-sdk/client-s3`. Treats blobs as opaque - encryption, access control,\n * and per-tenant prefixing are out of scope and live in higher layers.\n *\n * The SDK exposes R2 as the recommended default backend. Other providers\n * (Pinata, IPFS, Google Drive, Dropbox, CallbackStorage) remain available for\n * teams that need IPFS semantics or user-owned storage.\n *\n * @category Storage\n *\n * @example\n * ```typescript\n * import { R2Storage, StorageManager } from \"@opendatalabs/vana-sdk/node\";\n *\n * const storage = new StorageManager();\n * storage.register(\n * \"r2\",\n * new R2Storage({\n * accountId: process.env.R2_ACCOUNT_ID!,\n * accessKeyId: process.env.R2_ACCESS_KEY_ID!,\n * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,\n * bucket: process.env.R2_BUCKET!,\n * publicUrl: \"https://files.example.com\",\n * }),\n * true,\n * );\n *\n * const result = await storage.upload(myBlob, \"report.json\");\n * console.log(result.url);\n * ```\n */\nexport class R2Storage implements StorageProvider {\n private readonly endpoint: string;\n private readonly publicUrl: string;\n private readonly region: string;\n private readonly bucket: string;\n\n constructor(private readonly config: R2Config) {\n if (!config.accessKeyId) {\n throw new StorageError(\n \"R2 accessKeyId is required\",\n \"MISSING_ACCESS_KEY\",\n \"r2\",\n );\n }\n if (!config.secretAccessKey) {\n throw new StorageError(\n \"R2 secretAccessKey is required\",\n \"MISSING_SECRET_KEY\",\n \"r2\",\n );\n }\n if (!config.bucket) {\n throw new StorageError(\"R2 bucket is required\", \"MISSING_BUCKET\", \"r2\");\n }\n if (!config.endpoint && !config.accountId) {\n throw new StorageError(\n \"R2 endpoint or accountId is required\",\n \"MISSING_ENDPOINT\",\n \"r2\",\n );\n }\n if (!config.publicUrl && !config.accountId) {\n throw new StorageError(\n \"R2 publicUrl is required when accountId is not provided\",\n \"MISSING_PUBLIC_URL\",\n \"r2\",\n );\n }\n\n this.bucket = config.bucket;\n this.region = config.region ?? DEFAULT_REGION;\n this.endpoint = (\n config.endpoint ?? `https://${config.accountId}.r2.cloudflarestorage.com`\n ).replace(/\\/$/, \"\");\n this.publicUrl = (\n config.publicUrl ?? `https://${config.bucket}.${config.accountId}.r2.dev`\n ).replace(/\\/$/, \"\");\n }\n\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n const key = filename ?? `vana-${Date.now()}-${randomSuffix()}.dat`;\n const body = new Uint8Array(await file.arrayBuffer());\n const contentType =\n file.type !== \"\" ? file.type : \"application/octet-stream\";\n\n try {\n const signed = await this.signRequest({\n method: \"PUT\",\n path: `/${this.bucket}/${encodePath(key)}`,\n body,\n extraHeaders: { \"content-type\": contentType },\n });\n\n const response = await fetch(signed.url, {\n method: \"PUT\",\n headers: signed.headers,\n body,\n });\n\n if (!response.ok) {\n throw new StorageError(\n `R2 upload failed: ${response.status} ${response.statusText} - ${await safeText(response)}`,\n \"UPLOAD_FAILED\",\n \"r2\",\n );\n }\n\n return {\n url: `${this.publicUrl}/${encodePath(key)}`,\n size: file.size,\n contentType,\n };\n } catch (error) {\n throw wrapError(error, \"UPLOAD_ERROR\", \"r2\");\n }\n }\n\n async download(url: string): Promise<Blob> {\n const key = this.extractKey(url);\n if (!key) {\n throw new StorageError(\n `Could not extract object key from URL: ${url}`,\n \"INVALID_URL\",\n \"r2\",\n );\n }\n\n try {\n const signed = await this.signRequest({\n method: \"GET\",\n path: `/${this.bucket}/${encodePath(key)}`,\n });\n\n const response = await fetch(signed.url, {\n method: \"GET\",\n headers: signed.headers,\n });\n\n if (!response.ok) {\n throw new StorageError(\n `R2 download failed: ${response.status} ${response.statusText}`,\n \"DOWNLOAD_FAILED\",\n \"r2\",\n );\n }\n\n return await response.blob();\n } catch (error) {\n throw wrapError(error, \"DOWNLOAD_ERROR\", \"r2\");\n }\n }\n\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n try {\n const params = new URLSearchParams({ \"list-type\": \"2\" });\n if (options?.namePattern) {\n params.set(\"prefix\", options.namePattern);\n }\n if (options?.limit !== undefined) {\n params.set(\"max-keys\", String(options.limit));\n }\n if (options?.offset !== undefined) {\n params.set(\"continuation-token\", String(options.offset));\n }\n\n const signed = await this.signRequest({\n method: \"GET\",\n path: `/${this.bucket}`,\n query: params,\n });\n\n const response = await fetch(signed.url, {\n method: \"GET\",\n headers: signed.headers,\n });\n\n if (!response.ok) {\n throw new StorageError(\n `R2 list failed: ${response.status} ${response.statusText}`,\n \"LIST_FAILED\",\n \"r2\",\n );\n }\n\n const xml = await response.text();\n return parseListObjects(xml).map((obj) => ({\n id: obj.key,\n name: obj.key,\n url: `${this.publicUrl}/${encodePath(obj.key)}`,\n size: obj.size,\n contentType: \"application/octet-stream\",\n createdAt: obj.lastModified,\n }));\n } catch (error) {\n throw wrapError(error, \"LIST_ERROR\", \"r2\");\n }\n }\n\n async delete(url: string): Promise<boolean> {\n const key = this.extractKey(url);\n if (!key) {\n throw new StorageError(\n `Could not extract object key from URL: ${url}`,\n \"INVALID_URL\",\n \"r2\",\n );\n }\n\n try {\n const signed = await this.signRequest({\n method: \"DELETE\",\n path: `/${this.bucket}/${encodePath(key)}`,\n });\n\n const response = await fetch(signed.url, {\n method: \"DELETE\",\n headers: signed.headers,\n });\n\n if (!response.ok && response.status !== 204) {\n throw new StorageError(\n `R2 delete failed: ${response.status} ${response.statusText}`,\n \"DELETE_FAILED\",\n \"r2\",\n );\n }\n\n return true;\n } catch (error) {\n throw wrapError(error, \"DELETE_ERROR\", \"r2\");\n }\n }\n\n getConfig(): StorageProviderConfig {\n return {\n name: \"Cloudflare R2\",\n type: \"r2\",\n requiresAuth: true,\n features: {\n upload: true,\n download: true,\n list: true,\n delete: true,\n },\n };\n }\n\n /**\n * Extract the object key from a URL. Accepts public URLs minted by `upload()`\n * as well as raw keys for callers that already track them out-of-band.\n *\n * @internal\n */\n private extractKey(urlOrKey: string): string | null {\n if (urlOrKey.startsWith(this.publicUrl + \"/\")) {\n return decodeURIComponent(urlOrKey.slice(this.publicUrl.length + 1));\n }\n if (urlOrKey.startsWith(this.endpoint + \"/\")) {\n const rest = urlOrKey.slice(this.endpoint.length + 1);\n const slash = rest.indexOf(\"/\");\n return slash === -1 ? null : decodeURIComponent(rest.slice(slash + 1));\n }\n if (!urlOrKey.includes(\"://\")) {\n return urlOrKey;\n }\n return null;\n }\n\n private async signRequest(req: {\n method: string;\n path: string;\n query?: URLSearchParams;\n body?: Uint8Array;\n extraHeaders?: Record<string, string>;\n }): Promise<SignedRequest> {\n // SigV4's host header must include the port for non-default ports\n // (e.g. localhost:9000 for S3-compatible test endpoints). URL.host keeps\n // the port; URL.hostname strips it.\n const { host } = new URL(this.endpoint);\n const now = new Date();\n const amzDate = formatAmzDate(now);\n const dateStamp = amzDate.slice(0, 8);\n\n const payloadHash = req.body ? toHex(sha256(req.body)) : EMPTY_PAYLOAD_HASH;\n\n const canonicalQuery = req.query ? canonicalizeQuery(req.query) : \"\";\n\n const headers: Record<string, string> = {\n host,\n \"x-amz-content-sha256\": payloadHash,\n \"x-amz-date\": amzDate,\n ...(req.extraHeaders ?? {}),\n };\n\n const sortedHeaderNames = Object.keys(headers)\n .map((h) => h.toLowerCase())\n .sort();\n const canonicalHeaders =\n sortedHeaderNames\n .map((h) => `${h}:${headers[h].trim().replace(/\\s+/g, \" \")}`)\n .join(\"\\n\") + \"\\n\";\n const signedHeaders = sortedHeaderNames.join(\";\");\n\n const canonicalRequest = [\n req.method,\n req.path,\n canonicalQuery,\n canonicalHeaders,\n signedHeaders,\n payloadHash,\n ].join(\"\\n\");\n\n const credentialScope = `${dateStamp}/${this.region}/${SERVICE}/aws4_request`;\n const stringToSign = [\n \"AWS4-HMAC-SHA256\",\n amzDate,\n credentialScope,\n toHex(sha256(new TextEncoder().encode(canonicalRequest))),\n ].join(\"\\n\");\n\n const signingKey = deriveSigningKey(\n this.config.secretAccessKey,\n dateStamp,\n this.region,\n SERVICE,\n );\n const signature = toHex(\n hmac(sha256, signingKey, new TextEncoder().encode(stringToSign)),\n );\n\n headers.authorization = `AWS4-HMAC-SHA256 Credential=${this.config.accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;\n\n const url =\n this.endpoint +\n req.path +\n (canonicalQuery !== \"\" ? `?${canonicalQuery}` : \"\");\n\n return { url, headers };\n }\n}\n\nconst EMPTY_PAYLOAD_HASH =\n \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n\nfunction deriveSigningKey(\n secret: string,\n dateStamp: string,\n region: string,\n service: string,\n): Uint8Array {\n const enc = new TextEncoder();\n const kDate = hmac(\n sha256,\n enc.encode(`AWS4${secret}`),\n enc.encode(dateStamp),\n );\n const kRegion = hmac(sha256, kDate, enc.encode(region));\n const kService = hmac(sha256, kRegion, enc.encode(service));\n return hmac(sha256, kService, enc.encode(\"aws4_request\"));\n}\n\nfunction formatAmzDate(date: Date): string {\n // YYYYMMDDTHHMMSSZ\n const iso = date.toISOString();\n return iso.replace(/[-:]/g, \"\").replace(/\\.\\d+/, \"\");\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let s = \"\";\n for (let i = 0; i < bytes.length; i++) {\n s += bytes[i].toString(16).padStart(2, \"0\");\n }\n return s;\n}\n\n/**\n * RFC 3986-compliant percent-encoding. `encodeURIComponent` leaves `! ' ( ) *`\n * unescaped, but AWS SigV4 (and RFC 3986 reserved sub-delims) require them\n * encoded. Used for both path segments and query keys/values.\n */\nfunction rfc3986Encode(value: string): string {\n return encodeURIComponent(value).replace(\n /[!'()*]/g,\n (c) => \"%\" + c.charCodeAt(0).toString(16).toUpperCase(),\n );\n}\n\n/**\n * Encode each path segment per AWS canonical-URI rules. Slashes between segments\n * are preserved; everything else (including `+`, `=`, etc.) is percent-encoded.\n */\nfunction encodePath(key: string): string {\n return key.split(\"/\").map(rfc3986Encode).join(\"/\");\n}\n\nfunction canonicalizeQuery(params: URLSearchParams): string {\n const entries: [string, string][] = [];\n for (const [k, v] of params.entries()) {\n entries.push([k, v]);\n }\n entries.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return entries\n .map(([k, v]) => `${rfc3986Encode(k)}=${rfc3986Encode(v)}`)\n .join(\"&\");\n}\n\ninterface ListObject {\n key: string;\n size: number;\n lastModified: Date;\n}\n\nfunction parseListObjects(xml: string): ListObject[] {\n const out: ListObject[] = [];\n const contentsRe = /<Contents>([\\s\\S]*?)<\\/Contents>/g;\n let match: RegExpExecArray | null;\n while ((match = contentsRe.exec(xml)) !== null) {\n const block = match[1];\n const key = matchTag(block, \"Key\");\n const size = matchTag(block, \"Size\");\n const lastModified = matchTag(block, \"LastModified\");\n if (key === null) {\n continue;\n }\n out.push({\n key: decodeXmlEntities(key),\n size: size !== null ? parseInt(size, 10) || 0 : 0,\n lastModified:\n lastModified !== null ? new Date(lastModified) : new Date(0),\n });\n }\n return out;\n}\n\nfunction matchTag(block: string, tag: string): string | null {\n const re = new RegExp(`<${tag}>([\\\\s\\\\S]*?)<\\\\/${tag}>`);\n const m = re.exec(block);\n return m === null ? null : m[1];\n}\n\nfunction decodeXmlEntities(s: string): string {\n return s\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n}\n\nfunction randomSuffix(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nasync function safeText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"\";\n }\n}\n\nfunction wrapError(error: unknown, code: string, provider: string): Error {\n if (error instanceof StorageError) {\n return error;\n }\n return new StorageError(\n `R2 error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n code,\n provider,\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,251 @@
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 vana_storage_exports = {};
20
+ __export(vana_storage_exports, {
21
+ VanaStorage: () => VanaStorage
22
+ });
23
+ module.exports = __toCommonJS(vana_storage_exports);
24
+ var import__ = require("../index");
25
+ var import_web3_signed_builder = require("../../auth/web3-signed-builder");
26
+ const DEFAULT_ENDPOINT = "https://storage.vana.com";
27
+ const BLOB_PATH_PREFIX = "/v1/blobs";
28
+ const DEFAULT_TOKEN_TTL_SECONDS = 300;
29
+ class VanaStorage {
30
+ endpoint;
31
+ signer;
32
+ ownerAddress;
33
+ fetchImpl;
34
+ constructor(config) {
35
+ if (!config?.signer?.address || !config?.signer?.signMessage) {
36
+ throw new import__.StorageError(
37
+ "VanaStorage requires a signer with address and signMessage",
38
+ "MISSING_SIGNER",
39
+ "vana-storage"
40
+ );
41
+ }
42
+ this.endpoint = (config.endpoint ?? DEFAULT_ENDPOINT).replace(/\/+$/, "");
43
+ this.signer = config.signer;
44
+ this.ownerAddress = (config.ownerAddress ?? config.signer.address).toLowerCase();
45
+ this.fetchImpl = config.fetchImpl ?? globalThis.fetch.bind(globalThis);
46
+ }
47
+ /**
48
+ * Upload an encrypted blob to vana-storage.
49
+ *
50
+ * @param file - The blob to upload.
51
+ * @param filename - Required relative key in the form `"{scope}/{collectedAt}"`.
52
+ * The owner address is prepended automatically.
53
+ */
54
+ async upload(file, filename) {
55
+ if (!filename) {
56
+ throw new import__.StorageError(
57
+ "VanaStorage.upload requires a filename of the form '{scope}/{collectedAt}'",
58
+ "MISSING_FILENAME",
59
+ "vana-storage"
60
+ );
61
+ }
62
+ const subpath = encodeRelativePath(filename);
63
+ const path = `${BLOB_PATH_PREFIX}/${this.ownerAddress}/${subpath}`;
64
+ const body = new Uint8Array(await file.arrayBuffer());
65
+ const contentType = file.type !== "" ? file.type : "application/octet-stream";
66
+ const header = await this.signRequest("PUT", path, body);
67
+ let response;
68
+ try {
69
+ response = await this.fetchImpl(`${this.endpoint}${path}`, {
70
+ method: "PUT",
71
+ headers: {
72
+ authorization: header,
73
+ "content-type": contentType
74
+ },
75
+ body
76
+ });
77
+ } catch (cause) {
78
+ throw new import__.StorageError(
79
+ `vana-storage upload network error: ${describe(cause)}`,
80
+ "UPLOAD_ERROR",
81
+ "vana-storage",
82
+ { cause: cause instanceof Error ? cause : void 0 }
83
+ );
84
+ }
85
+ if (!response.ok) {
86
+ throw new import__.StorageError(
87
+ `vana-storage upload failed: ${response.status} ${response.statusText} - ${await safeText(response)}`,
88
+ "UPLOAD_FAILED",
89
+ "vana-storage"
90
+ );
91
+ }
92
+ const result = await response.json();
93
+ return {
94
+ url: result.url,
95
+ size: result.size,
96
+ contentType,
97
+ metadata: { key: result.key, etag: result.etag }
98
+ };
99
+ }
100
+ /**
101
+ * Download a blob by URL. The URL must point at a path under this
102
+ * provider's endpoint.
103
+ */
104
+ async download(url) {
105
+ const path = this.pathFromUrl(url);
106
+ const header = await this.signRequest("GET", path);
107
+ let response;
108
+ try {
109
+ response = await this.fetchImpl(`${this.endpoint}${path}`, {
110
+ method: "GET",
111
+ headers: { authorization: header }
112
+ });
113
+ } catch (cause) {
114
+ throw new import__.StorageError(
115
+ `vana-storage download network error: ${describe(cause)}`,
116
+ "DOWNLOAD_ERROR",
117
+ "vana-storage",
118
+ { cause: cause instanceof Error ? cause : void 0 }
119
+ );
120
+ }
121
+ if (!response.ok) {
122
+ throw new import__.StorageError(
123
+ `vana-storage download failed: ${response.status} ${response.statusText}`,
124
+ "DOWNLOAD_FAILED",
125
+ "vana-storage"
126
+ );
127
+ }
128
+ return await response.blob();
129
+ }
130
+ /**
131
+ * Listing is not supported by vana-storage — file discovery is handled by
132
+ * the Gateway DataRegistry, not the storage layer.
133
+ */
134
+ async list(_options) {
135
+ throw new import__.StorageError(
136
+ "list is not supported by vana-storage; query the Gateway DataRegistry instead",
137
+ "NOT_IMPLEMENTED",
138
+ "vana-storage"
139
+ );
140
+ }
141
+ async delete(url) {
142
+ const path = this.pathFromUrl(url);
143
+ const header = await this.signRequest("DELETE", path);
144
+ let response;
145
+ try {
146
+ response = await this.fetchImpl(`${this.endpoint}${path}`, {
147
+ method: "DELETE",
148
+ headers: { authorization: header }
149
+ });
150
+ } catch (cause) {
151
+ throw new import__.StorageError(
152
+ `vana-storage delete network error: ${describe(cause)}`,
153
+ "DELETE_ERROR",
154
+ "vana-storage",
155
+ { cause: cause instanceof Error ? cause : void 0 }
156
+ );
157
+ }
158
+ if (response.status === 404) return false;
159
+ if (!response.ok) {
160
+ throw new import__.StorageError(
161
+ `vana-storage delete failed: ${response.status} ${response.statusText}`,
162
+ "DELETE_FAILED",
163
+ "vana-storage"
164
+ );
165
+ }
166
+ return true;
167
+ }
168
+ getConfig() {
169
+ return {
170
+ name: "vana-storage",
171
+ type: "vana-storage",
172
+ requiresAuth: true,
173
+ features: {
174
+ upload: true,
175
+ download: true,
176
+ list: false,
177
+ delete: true
178
+ }
179
+ };
180
+ }
181
+ async signRequest(method, path, body) {
182
+ const now = Math.floor(Date.now() / 1e3);
183
+ return (0, import_web3_signed_builder.buildWeb3SignedHeader)({
184
+ signMessage: this.signer.signMessage,
185
+ aud: this.endpoint,
186
+ method,
187
+ uri: path,
188
+ iat: now,
189
+ exp: now + DEFAULT_TOKEN_TTL_SECONDS,
190
+ ...body !== void 0 && body.length > 0 && { body }
191
+ });
192
+ }
193
+ pathFromUrl(url) {
194
+ let parsed;
195
+ try {
196
+ parsed = new URL(url);
197
+ } catch {
198
+ throw new import__.StorageError(
199
+ `Invalid URL: ${url}`,
200
+ "INVALID_URL",
201
+ "vana-storage"
202
+ );
203
+ }
204
+ const expectedHost = new URL(this.endpoint).host;
205
+ if (parsed.host !== expectedHost) {
206
+ throw new import__.StorageError(
207
+ `URL host '${parsed.host}' does not match storage endpoint '${expectedHost}'`,
208
+ "INVALID_URL",
209
+ "vana-storage"
210
+ );
211
+ }
212
+ const segments = parsed.pathname.split("/").filter((s) => s.length > 0);
213
+ const isTraversal = (s) => s === "." || s === "..";
214
+ const valid = segments.length === 5 && segments[0] === "v1" && segments[1] === "blobs" && segments[2]?.toLowerCase() === this.ownerAddress && segments[3] !== void 0 && !isTraversal(segments[3]) && segments[4] !== void 0 && !isTraversal(segments[4]);
215
+ if (!valid) {
216
+ throw new import__.StorageError(
217
+ `URL path '${parsed.pathname}' must be /v1/blobs/${this.ownerAddress}/{scope}/{collectedAt}`,
218
+ "INVALID_URL",
219
+ "vana-storage"
220
+ );
221
+ }
222
+ return parsed.pathname;
223
+ }
224
+ }
225
+ function encodeRelativePath(filename) {
226
+ const parts = filename.split("/");
227
+ if (parts.length !== 2 || parts.some((p) => p.length === 0 || p === "." || p === "..")) {
228
+ throw new import__.StorageError(
229
+ `filename must be exactly '{scope}/{collectedAt}' with non-empty segments, got '${filename}'`,
230
+ "INVALID_FILENAME",
231
+ "vana-storage"
232
+ );
233
+ }
234
+ return parts.map((p) => encodeURIComponent(p)).join("/");
235
+ }
236
+ function describe(value) {
237
+ if (value instanceof Error) return value.message;
238
+ return String(value);
239
+ }
240
+ async function safeText(response) {
241
+ try {
242
+ return await response.text();
243
+ } catch {
244
+ return "";
245
+ }
246
+ }
247
+ // Annotate the CommonJS export names for ESM import in node:
248
+ 0 && (module.exports = {
249
+ VanaStorage
250
+ });
251
+ //# sourceMappingURL=vana-storage.cjs.map