@opendatalabs/vana-sdk 0.1.0-alpha.d7fc764 → 0.1.0-alpha.dc68f39

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 (667) hide show
  1. package/dist/__tests__/waitForTransactionEvents.test.d.ts +1 -0
  2. package/dist/browser.d.ts +4 -2
  3. package/dist/chains/definitions.cjs +9 -6
  4. package/dist/chains/definitions.cjs.map +1 -1
  5. package/dist/chains/definitions.d.ts +9 -11
  6. package/dist/chains/definitions.js +9 -6
  7. package/dist/chains/definitions.js.map +1 -1
  8. package/dist/chains/index.d.ts +5 -2
  9. package/dist/chains.browser.d.ts +8 -2
  10. package/dist/chains.d.ts +8 -2
  11. package/dist/chains.node.d.ts +8 -2
  12. package/dist/config/addresses.d.ts +8 -24
  13. package/dist/config/chains.d.ts +9 -13
  14. package/dist/config/default-services.cjs +60 -0
  15. package/dist/config/default-services.cjs.map +1 -0
  16. package/dist/config/default-services.d.ts +46 -0
  17. package/dist/config/default-services.js +33 -0
  18. package/dist/config/default-services.js.map +1 -0
  19. package/dist/config/default-services.test.d.ts +1 -0
  20. package/dist/config/features.d.ts +1 -3
  21. package/dist/config/tests/addresses.test.d.ts +1 -0
  22. package/dist/contracts/contractController.cjs +3 -3
  23. package/dist/contracts/contractController.cjs.map +1 -1
  24. package/dist/contracts/contractController.d.ts +11 -28
  25. package/dist/contracts/contractController.js +4 -7
  26. package/dist/contracts/contractController.js.map +1 -1
  27. package/dist/contracts/tests/contractController.test.d.ts +1 -0
  28. package/dist/controllers/__tests__/schemas-edge-cases.test.d.ts +1 -0
  29. package/dist/controllers/base.cjs +83 -0
  30. package/dist/controllers/base.cjs.map +1 -0
  31. package/dist/controllers/base.d.ts +84 -0
  32. package/dist/controllers/base.js +59 -0
  33. package/dist/controllers/base.js.map +1 -0
  34. package/dist/controllers/data-error-handling.test.d.ts +1 -0
  35. package/dist/controllers/data.cjs +415 -172
  36. package/dist/controllers/data.cjs.map +1 -1
  37. package/dist/controllers/data.d.ts +149 -76
  38. package/dist/controllers/data.js +415 -172
  39. package/dist/controllers/data.js.map +1 -1
  40. package/dist/controllers/permissions.cjs +508 -257
  41. package/dist/controllers/permissions.cjs.map +1 -1
  42. package/dist/controllers/permissions.d.ts +1348 -25
  43. package/dist/controllers/permissions.js +508 -257
  44. package/dist/controllers/permissions.js.map +1 -1
  45. package/dist/controllers/protocol.cjs +15 -11
  46. package/dist/controllers/protocol.cjs.map +1 -1
  47. package/dist/controllers/protocol.d.ts +7 -35
  48. package/dist/controllers/protocol.js +15 -14
  49. package/dist/controllers/protocol.js.map +1 -1
  50. package/dist/controllers/schemas.cjs +69 -54
  51. package/dist/controllers/schemas.cjs.map +1 -1
  52. package/dist/controllers/schemas.d.ts +9 -36
  53. package/dist/controllers/schemas.js +69 -54
  54. package/dist/controllers/schemas.js.map +1 -1
  55. package/dist/controllers/server-additional.test.d.ts +1 -0
  56. package/dist/controllers/server.cjs +15 -10
  57. package/dist/controllers/server.cjs.map +1 -1
  58. package/dist/controllers/server.d.ts +7 -33
  59. package/dist/controllers/server.js +15 -10
  60. package/dist/controllers/server.js.map +1 -1
  61. package/dist/core/apiClient.cjs +15 -12
  62. package/dist/core/apiClient.cjs.map +1 -1
  63. package/dist/core/apiClient.d.ts +5 -9
  64. package/dist/core/apiClient.js +19 -19
  65. package/dist/core/apiClient.js.map +1 -1
  66. package/dist/core/client.cjs +7 -7
  67. package/dist/core/client.cjs.map +1 -1
  68. package/dist/core/client.d.ts +6 -9
  69. package/dist/core/client.js +7 -7
  70. package/dist/core/client.js.map +1 -1
  71. package/dist/core/core.test.d.ts +1 -0
  72. package/dist/core/generics.cjs +11 -9
  73. package/dist/core/generics.cjs.map +1 -1
  74. package/dist/core/generics.d.ts +9 -13
  75. package/dist/core/generics.js +22 -29
  76. package/dist/core/generics.js.map +1 -1
  77. package/dist/core/tests/apiClient.test.d.ts +1 -0
  78. package/dist/core/tests/client.test.d.ts +1 -0
  79. package/dist/core/tests/generics.test.d.ts +1 -0
  80. package/dist/core.cjs +114 -48
  81. package/dist/core.cjs.map +1 -1
  82. package/dist/core.d.ts +40 -65
  83. package/dist/core.js +127 -74
  84. package/dist/core.js.map +1 -1
  85. package/dist/crypto/ecies/__tests__/base.test.d.ts +4 -0
  86. package/dist/crypto/ecies/__tests__/compatibility.test.d.ts +8 -0
  87. package/dist/crypto/ecies/__tests__/constants.test.d.ts +4 -0
  88. package/dist/crypto/ecies/__tests__/native-parity.test.d.ts +7 -0
  89. package/dist/crypto/ecies/__tests__/normalization.test.d.ts +1 -0
  90. package/dist/crypto/ecies/__tests__/test-vectors.d.ts +2 -4
  91. package/dist/crypto/ecies/base.cjs +4 -3
  92. package/dist/crypto/ecies/base.cjs.map +1 -1
  93. package/dist/crypto/ecies/base.d.ts +2 -5
  94. package/dist/crypto/ecies/base.js +12 -15
  95. package/dist/crypto/ecies/base.js.map +1 -1
  96. package/dist/crypto/ecies/browser.cjs +2 -1
  97. package/dist/crypto/ecies/browser.cjs.map +1 -1
  98. package/dist/crypto/ecies/browser.d.ts +2 -7
  99. package/dist/crypto/ecies/browser.js +2 -1
  100. package/dist/crypto/ecies/browser.js.map +1 -1
  101. package/dist/crypto/ecies/constants.d.ts +7 -9
  102. package/dist/crypto/ecies/index.d.ts +8 -1
  103. package/dist/crypto/ecies/interface.cjs +4 -5
  104. package/dist/crypto/ecies/interface.cjs.map +1 -1
  105. package/dist/crypto/ecies/interface.d.ts +9 -11
  106. package/dist/crypto/ecies/interface.js +4 -5
  107. package/dist/crypto/ecies/interface.js.map +1 -1
  108. package/dist/crypto/ecies/node.cjs +3 -2
  109. package/dist/crypto/ecies/node.cjs.map +1 -1
  110. package/dist/crypto/ecies/node.d.ts +2 -7
  111. package/dist/crypto/ecies/node.js +11 -16
  112. package/dist/crypto/ecies/node.js.map +1 -1
  113. package/dist/crypto/ecies/test-vectors/eccrypto-vectors.json +72 -0
  114. package/dist/crypto/ecies/utils.cjs +2 -41
  115. package/dist/crypto/ecies/utils.cjs.map +1 -1
  116. package/dist/crypto/ecies/utils.d.ts +3 -40
  117. package/dist/crypto/ecies/utils.js +1 -35
  118. package/dist/crypto/ecies/utils.js.map +1 -1
  119. package/dist/crypto/services/WalletKeyEncryptionService.cjs +2 -2
  120. package/dist/crypto/services/WalletKeyEncryptionService.cjs.map +1 -1
  121. package/dist/crypto/services/WalletKeyEncryptionService.d.ts +3 -7
  122. package/dist/crypto/services/WalletKeyEncryptionService.js +5 -9
  123. package/dist/crypto/services/WalletKeyEncryptionService.js.map +1 -1
  124. package/dist/crypto/services/WalletKeyEncryptionService.test.d.ts +1 -0
  125. package/dist/diagnostics.d.ts +1 -3
  126. package/dist/diagnostics.test.d.ts +1 -0
  127. package/dist/errors.cjs +16 -0
  128. package/dist/errors.cjs.map +1 -1
  129. package/dist/errors.d.ts +53 -15
  130. package/dist/errors.js +18 -6
  131. package/dist/errors.js.map +1 -1
  132. package/dist/generated/abi/ComputeEngineImplementation.d.ts +2 -3
  133. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +2 -3
  134. package/dist/generated/abi/DATFactoryImplementation.d.ts +2 -3
  135. package/dist/generated/abi/DATImplementation.d.ts +2 -3
  136. package/dist/generated/abi/DATPausableImplementation.d.ts +2 -3
  137. package/dist/generated/abi/DATVotesImplementation.d.ts +2 -3
  138. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +2 -3
  139. package/dist/generated/abi/DLPRegistryImplementation.d.ts +2 -3
  140. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +2 -3
  141. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +2 -3
  142. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +2 -3
  143. package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +2 -3
  144. package/dist/generated/abi/DLPRootImplementation.d.ts +1 -3
  145. package/dist/generated/abi/DLPTreasuryImplementation.d.ts +2 -3
  146. package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +1 -3
  147. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +2 -3
  148. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +2 -3
  149. package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +2 -3
  150. package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +2 -3
  151. package/dist/generated/abi/DataRegistryImplementation.cjs +13 -0
  152. package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
  153. package/dist/generated/abi/DataRegistryImplementation.d.ts +12 -3
  154. package/dist/generated/abi/DataRegistryImplementation.js +13 -0
  155. package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
  156. package/dist/generated/abi/QueryEngineImplementation.d.ts +2 -3
  157. package/dist/generated/abi/SwapHelperImplementation.d.ts +2 -3
  158. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +2 -3
  159. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +2 -3
  160. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +2 -3
  161. package/dist/generated/abi/TeePoolImplementation.d.ts +2 -3
  162. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +2 -3
  163. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +2 -3
  164. package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +2 -3
  165. package/dist/generated/abi/VanaEpochImplementation.d.ts +2 -3
  166. package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +2 -3
  167. package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +2 -3
  168. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +2 -3
  169. package/dist/generated/abi/index.cjs +42 -0
  170. package/dist/generated/abi/index.cjs.map +1 -1
  171. package/dist/generated/abi/index.d.ts +47 -18
  172. package/dist/generated/abi/index.js +21 -0
  173. package/dist/generated/abi/index.js.map +1 -1
  174. package/dist/generated/event-types.cjs +17 -0
  175. package/dist/generated/event-types.cjs.map +1 -0
  176. package/dist/generated/event-types.d.ts +854 -0
  177. package/dist/generated/event-types.js +1 -0
  178. package/dist/generated/event-types.js.map +1 -0
  179. package/dist/generated/eventRegistry.cjs +3351 -0
  180. package/dist/generated/eventRegistry.cjs.map +1 -0
  181. package/dist/generated/eventRegistry.d.ts +14 -0
  182. package/dist/generated/eventRegistry.js +3326 -0
  183. package/dist/generated/eventRegistry.js.map +1 -0
  184. package/dist/generated/server/server-exports.d.ts +19 -21
  185. package/dist/generated/server/server.cjs.map +1 -1
  186. package/dist/generated/server/server.d.ts +113 -87
  187. package/dist/generated/subgraph.d.ts +329 -332
  188. package/dist/index.browser.d.ts +48 -73
  189. package/dist/index.browser.js +12 -0
  190. package/dist/index.browser.js.map +1 -1
  191. package/dist/index.cjs +3 -1
  192. package/dist/index.cjs.map +1 -1
  193. package/dist/index.d.ts +0 -2
  194. package/dist/index.js +3 -1
  195. package/dist/index.js.map +1 -1
  196. package/dist/index.node.cjs +9 -0
  197. package/dist/index.node.cjs.map +1 -1
  198. package/dist/index.node.d.ts +181 -64
  199. package/dist/index.node.js +10 -0
  200. package/dist/index.node.js.map +1 -1
  201. package/dist/node.d.ts +4 -2
  202. package/dist/platform/browser-only.d.ts +5 -8
  203. package/dist/platform/browser-only.test.d.ts +1 -0
  204. package/dist/platform/browser-safe.d.ts +6 -9
  205. package/dist/platform/browser-safe.test.d.ts +1 -0
  206. package/dist/platform/browser.cjs +7 -6
  207. package/dist/platform/browser.cjs.map +1 -1
  208. package/dist/platform/browser.d.ts +3 -6
  209. package/dist/platform/browser.js +19 -27
  210. package/dist/platform/browser.js.map +1 -1
  211. package/dist/platform/browser.test.d.ts +1 -0
  212. package/dist/platform/index.d.ts +11 -5
  213. package/dist/platform/interface.d.ts +6 -8
  214. package/dist/platform/node.d.ts +3 -7
  215. package/dist/platform/node.js +12 -19
  216. package/dist/platform/node.js.map +1 -1
  217. package/dist/platform/ports/openpgp-port.cjs +74 -0
  218. package/dist/platform/ports/openpgp-port.cjs.map +1 -0
  219. package/dist/platform/ports/openpgp-port.d.ts +13 -0
  220. package/dist/platform/ports/openpgp-port.js +59 -0
  221. package/dist/platform/ports/openpgp-port.js.map +1 -0
  222. package/dist/platform/ports/pgp-port.cjs +17 -0
  223. package/dist/platform/ports/pgp-port.cjs.map +1 -0
  224. package/dist/platform/ports/pgp-port.d.ts +35 -0
  225. package/dist/platform/ports/pgp-port.js +1 -0
  226. package/dist/platform/ports/pgp-port.js.map +1 -0
  227. package/dist/platform/shared/error-utils.d.ts +2 -4
  228. package/dist/platform/shared/pgp-utils.cjs +2 -2
  229. package/dist/platform/shared/pgp-utils.cjs.map +1 -1
  230. package/dist/platform/shared/pgp-utils.d.ts +3 -5
  231. package/dist/platform/shared/pgp-utils.js +2 -2
  232. package/dist/platform/shared/pgp-utils.js.map +1 -1
  233. package/dist/platform/shared/stream-utils.d.ts +1 -3
  234. package/dist/platform/utils.d.ts +6 -10
  235. package/dist/platform/utils.test.d.ts +1 -0
  236. package/dist/platform.browser.d.ts +9 -4
  237. package/dist/platform.d.ts +11 -5
  238. package/dist/platform.node.d.ts +10 -5
  239. package/dist/schemas/dataSchema.schema.json +53 -0
  240. package/dist/schemas/grantFile.schema.json +43 -0
  241. package/dist/server/handler.cjs.map +1 -1
  242. package/dist/server/handler.d.ts +8 -203
  243. package/dist/server/handler.js.map +1 -1
  244. package/dist/storage/index.d.ts +56 -10
  245. package/dist/storage/manager.cjs +6 -6
  246. package/dist/storage/manager.cjs.map +1 -1
  247. package/dist/storage/manager.d.ts +2 -5
  248. package/dist/storage/manager.js +5 -12
  249. package/dist/storage/manager.js.map +1 -1
  250. package/dist/storage/providers/callback-storage.cjs +3 -3
  251. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  252. package/dist/storage/providers/callback-storage.d.ts +3 -9
  253. package/dist/storage/providers/callback-storage.js +3 -3
  254. package/dist/storage/providers/callback-storage.js.map +1 -1
  255. package/dist/storage/providers/google-drive.cjs +2 -2
  256. package/dist/storage/providers/google-drive.cjs.map +1 -1
  257. package/dist/storage/providers/google-drive.d.ts +3 -7
  258. package/dist/storage/providers/google-drive.js +4 -7
  259. package/dist/storage/providers/google-drive.js.map +1 -1
  260. package/dist/storage/providers/google-drive.test.d.ts +1 -0
  261. package/dist/storage/providers/ipfs.cjs +5 -5
  262. package/dist/storage/providers/ipfs.cjs.map +1 -1
  263. package/dist/storage/providers/ipfs.d.ts +3 -6
  264. package/dist/storage/providers/ipfs.js +7 -10
  265. package/dist/storage/providers/ipfs.js.map +1 -1
  266. package/dist/storage/providers/pinata.cjs +6 -6
  267. package/dist/storage/providers/pinata.cjs.map +1 -1
  268. package/dist/storage/providers/pinata.d.ts +5 -8
  269. package/dist/storage/providers/pinata.js +8 -11
  270. package/dist/storage/providers/pinata.js.map +1 -1
  271. package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
  272. package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
  273. package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
  274. package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
  275. package/dist/storage/tests/storageManager.test.d.ts +1 -0
  276. package/dist/tests/abi.test.d.ts +1 -0
  277. package/dist/tests/chains-definitions.test.d.ts +1 -0
  278. package/dist/tests/core-encryption.test.d.ts +1 -0
  279. package/dist/tests/core-extended.test.d.ts +1 -0
  280. package/dist/tests/core-generics-coverage.test.d.ts +1 -0
  281. package/dist/tests/coverage-boost.test.d.ts +1 -0
  282. package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
  283. package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
  284. package/dist/tests/data-additional-methods.test.d.ts +1 -0
  285. package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
  286. package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
  287. package/dist/tests/data-relayer.test.d.ts +1 -0
  288. package/dist/tests/data-schema-validation.test.d.ts +1 -0
  289. package/dist/tests/data-simple-methods.test.d.ts +1 -0
  290. package/dist/tests/data.test.d.ts +1 -0
  291. package/dist/tests/demo-integration.test.d.ts +1 -0
  292. package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
  293. package/dist/tests/download-relayer.test.d.ts +1 -0
  294. package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
  295. package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
  296. package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
  297. package/dist/tests/encryption-coverage.test.d.ts +1 -0
  298. package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
  299. package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
  300. package/dist/tests/errors-coverage.test.d.ts +1 -0
  301. package/dist/tests/errors.test.d.ts +1 -0
  302. package/dist/tests/factories/mockFactory.d.ts +316 -0
  303. package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
  304. package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
  305. package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
  306. package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
  307. package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
  308. package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
  309. package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
  310. package/dist/tests/helper-methods.test.d.ts +1 -0
  311. package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
  312. package/dist/tests/helpers/typedMocks.d.ts +64 -0
  313. package/dist/tests/index-browser.test.d.ts +1 -0
  314. package/dist/tests/index-node.test.d.ts +1 -0
  315. package/dist/tests/index.test.d.ts +1 -0
  316. package/dist/tests/mocks/platformAdapter.d.ts +12 -0
  317. package/dist/tests/new-permissions-methods.test.d.ts +1 -0
  318. package/dist/tests/no-buffer-browser.test.d.ts +1 -0
  319. package/dist/tests/permissions-grantee.test.d.ts +1 -0
  320. package/dist/tests/permissions-schema-validation.test.d.ts +1 -0
  321. package/dist/tests/permissions-server-files.test.d.ts +1 -0
  322. package/dist/tests/permissions-transaction-options.test.d.ts +1 -0
  323. package/dist/tests/permissions-trust-servers.test.d.ts +1 -0
  324. package/dist/tests/permissions.test.d.ts +1 -0
  325. package/dist/tests/personal.test.d.ts +1 -0
  326. package/dist/tests/platform-browser.test.d.ts +1 -0
  327. package/dist/tests/platform-crypto-expanded.test.d.ts +1 -0
  328. package/dist/tests/platform-crypto.test.d.ts +1 -0
  329. package/dist/tests/platform-index.test.d.ts +1 -0
  330. package/dist/tests/platform-node.test.d.ts +1 -0
  331. package/dist/tests/platform-shared-utils.test.d.ts +1 -0
  332. package/dist/tests/platform-updated.test.d.ts +1 -0
  333. package/dist/tests/protocol-additional-methods.test.d.ts +1 -0
  334. package/dist/tests/protocol.test.d.ts +1 -0
  335. package/dist/tests/read-only-mode.test.d.ts +1 -0
  336. package/dist/tests/schemas.test.d.ts +1 -0
  337. package/dist/tests/server-handler.test.d.ts +1 -0
  338. package/dist/tests/setup.d.ts +7 -0
  339. package/dist/tests/signatureFormatter.test.d.ts +1 -0
  340. package/dist/tests/trusted-server-queries.test.d.ts +1 -0
  341. package/dist/tests/typedDataConverter.test.d.ts +1 -0
  342. package/dist/tests/types-contracts.test.d.ts +1 -0
  343. package/dist/tests/types-data.test.d.ts +1 -0
  344. package/dist/tests/types-external-apis.test.d.ts +1 -0
  345. package/dist/tests/types-generics.test.d.ts +1 -0
  346. package/dist/tests/types-permissions.test.d.ts +1 -0
  347. package/dist/tests/types-upload-params.test.d.ts +1 -0
  348. package/dist/tests/types.test.d.ts +1 -0
  349. package/dist/tests/utils-formatters.test.d.ts +1 -0
  350. package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
  351. package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
  352. package/dist/tests/utils-grantFiles.test.d.ts +1 -0
  353. package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
  354. package/dist/tests/utils-grants.test.d.ts +1 -0
  355. package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
  356. package/dist/tests/utils-ipfs.test.d.ts +4 -0
  357. package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
  358. package/dist/tests/vana.test.d.ts +1 -0
  359. package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
  360. package/dist/types/blockchain.cjs +17 -0
  361. package/dist/types/blockchain.cjs.map +1 -0
  362. package/dist/types/blockchain.d.ts +57 -0
  363. package/dist/types/blockchain.js +1 -0
  364. package/dist/types/blockchain.js.map +1 -0
  365. package/dist/types/chains-additional.test.d.ts +1 -0
  366. package/dist/types/chains.d.ts +6 -9
  367. package/dist/types/config.cjs +10 -0
  368. package/dist/types/config.cjs.map +1 -1
  369. package/dist/types/config.d.ts +161 -54
  370. package/dist/types/config.js +8 -0
  371. package/dist/types/config.js.map +1 -1
  372. package/dist/types/contracts.cjs.map +1 -1
  373. package/dist/types/contracts.d.ts +8 -11
  374. package/dist/types/controller-context.cjs +17 -0
  375. package/dist/types/controller-context.cjs.map +1 -0
  376. package/dist/types/controller-context.d.ts +64 -0
  377. package/dist/types/controller-context.js +1 -0
  378. package/dist/types/controller-context.js.map +1 -0
  379. package/dist/types/data.cjs.map +1 -1
  380. package/dist/types/data.d.ts +107 -39
  381. package/dist/types/external-apis.d.ts +10 -12
  382. package/dist/types/generics.d.ts +35 -38
  383. package/dist/types/index.cjs +5 -4
  384. package/dist/types/index.cjs.map +1 -1
  385. package/dist/types/index.d.ts +20 -34
  386. package/dist/types/index.js +9 -2
  387. package/dist/types/index.js.map +1 -1
  388. package/dist/types/operations.cjs +2 -2
  389. package/dist/types/operations.cjs.map +1 -1
  390. package/dist/types/operations.d.ts +32 -28
  391. package/dist/types/operations.js +2 -2
  392. package/dist/types/operations.js.map +1 -1
  393. package/dist/types/permissions.d.ts +55 -58
  394. package/dist/types/personal.cjs.map +1 -1
  395. package/dist/types/personal.d.ts +6 -8
  396. package/dist/types/relayer.d.ts +15 -18
  397. package/dist/types/storage.d.ts +6 -8
  398. package/dist/types/storage.js +2 -5
  399. package/dist/types/storage.js.map +1 -1
  400. package/dist/types/transactionResults.cjs.map +1 -1
  401. package/dist/types/transactionResults.d.ts +193 -25
  402. package/dist/types/utils.cjs.map +1 -1
  403. package/dist/types/utils.d.ts +26 -25
  404. package/dist/types.d.ts +4 -40
  405. package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
  406. package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
  407. package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
  408. package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
  409. package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
  410. package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
  411. package/dist/utils/blockchain/registry.cjs +2 -2
  412. package/dist/utils/blockchain/registry.cjs.map +1 -1
  413. package/dist/utils/blockchain/registry.d.ts +6 -8
  414. package/dist/utils/blockchain/registry.js +2 -2
  415. package/dist/utils/blockchain/registry.js.map +1 -1
  416. package/dist/utils/blockchain/registry.test.d.ts +1 -0
  417. package/dist/utils/crypto-utils.cjs +0 -12
  418. package/dist/utils/crypto-utils.cjs.map +1 -1
  419. package/dist/utils/crypto-utils.d.ts +9 -27
  420. package/dist/utils/crypto-utils.js +0 -11
  421. package/dist/utils/crypto-utils.js.map +1 -1
  422. package/dist/utils/crypto-utils.test.d.ts +1 -0
  423. package/dist/utils/download.cjs +3 -3
  424. package/dist/utils/download.cjs.map +1 -1
  425. package/dist/utils/download.d.ts +13 -14
  426. package/dist/utils/download.js +2 -2
  427. package/dist/utils/download.js.map +1 -1
  428. package/dist/utils/encoding.cjs +1 -1
  429. package/dist/utils/encoding.cjs.map +1 -1
  430. package/dist/utils/encoding.d.ts +4 -6
  431. package/dist/utils/encoding.js +1 -1
  432. package/dist/utils/encoding.js.map +1 -1
  433. package/dist/utils/encoding.test.d.ts +1 -0
  434. package/dist/utils/encryption.cjs +16 -10
  435. package/dist/utils/encryption.cjs.map +1 -1
  436. package/dist/utils/encryption.d.ts +13 -17
  437. package/dist/utils/encryption.js +16 -10
  438. package/dist/utils/encryption.js.map +1 -1
  439. package/dist/utils/formatters.cjs +4 -2
  440. package/dist/utils/formatters.cjs.map +1 -1
  441. package/dist/utils/formatters.d.ts +4 -6
  442. package/dist/utils/formatters.js +4 -2
  443. package/dist/utils/formatters.js.map +1 -1
  444. package/dist/utils/grantFiles.cjs +7 -4
  445. package/dist/utils/grantFiles.cjs.map +1 -1
  446. package/dist/utils/grantFiles.d.ts +6 -10
  447. package/dist/utils/grantFiles.js +7 -4
  448. package/dist/utils/grantFiles.js.map +1 -1
  449. package/dist/utils/grantValidation.cjs +1 -1
  450. package/dist/utils/grantValidation.cjs.map +1 -1
  451. package/dist/utils/grantValidation.d.ts +14 -17
  452. package/dist/utils/grantValidation.js +1 -1
  453. package/dist/utils/grantValidation.js.map +1 -1
  454. package/dist/utils/grants.cjs +1 -1
  455. package/dist/utils/grants.cjs.map +1 -1
  456. package/dist/utils/grants.d.ts +10 -13
  457. package/dist/utils/grants.js +1 -1
  458. package/dist/utils/grants.js.map +1 -1
  459. package/dist/utils/ipfs.d.ts +8 -10
  460. package/dist/utils/lazy-import.cjs +4 -6
  461. package/dist/utils/lazy-import.cjs.map +1 -1
  462. package/dist/utils/lazy-import.d.ts +1 -3
  463. package/dist/utils/lazy-import.js +4 -6
  464. package/dist/utils/lazy-import.js.map +1 -1
  465. package/dist/utils/multicall.cjs +4 -2
  466. package/dist/utils/multicall.cjs.map +1 -1
  467. package/dist/utils/multicall.d.ts +5 -8
  468. package/dist/utils/multicall.js +4 -2
  469. package/dist/utils/multicall.js.map +1 -1
  470. package/dist/utils/parseTransactionPojo.cjs +87 -0
  471. package/dist/utils/parseTransactionPojo.cjs.map +1 -0
  472. package/dist/utils/parseTransactionPojo.d.ts +31 -0
  473. package/dist/utils/parseTransactionPojo.js +63 -0
  474. package/dist/utils/parseTransactionPojo.js.map +1 -0
  475. package/dist/utils/schemaValidation.cjs +5 -5
  476. package/dist/utils/schemaValidation.cjs.map +1 -1
  477. package/dist/utils/schemaValidation.d.ts +8 -12
  478. package/dist/utils/schemaValidation.js +7 -10
  479. package/dist/utils/schemaValidation.js.map +1 -1
  480. package/dist/utils/signatureCache.cjs +1 -2
  481. package/dist/utils/signatureCache.cjs.map +1 -1
  482. package/dist/utils/signatureCache.d.ts +4 -7
  483. package/dist/utils/signatureCache.js +4 -8
  484. package/dist/utils/signatureCache.js.map +1 -1
  485. package/dist/utils/signatureFormatter.cjs +6 -9
  486. package/dist/utils/signatureFormatter.cjs.map +1 -1
  487. package/dist/utils/signatureFormatter.d.ts +2 -5
  488. package/dist/utils/signatureFormatter.js +6 -9
  489. package/dist/utils/signatureFormatter.js.map +1 -1
  490. package/dist/utils/tests/multicall.test.d.ts +1 -0
  491. package/dist/utils/transactionHelpers.cjs +54 -0
  492. package/dist/utils/transactionHelpers.cjs.map +1 -0
  493. package/dist/utils/transactionHelpers.d.ts +80 -0
  494. package/dist/utils/transactionHelpers.js +29 -0
  495. package/dist/utils/transactionHelpers.js.map +1 -0
  496. package/dist/utils/typeGuards.cjs +109 -0
  497. package/dist/utils/typeGuards.cjs.map +1 -0
  498. package/dist/utils/typeGuards.d.ts +138 -0
  499. package/dist/utils/typeGuards.js +74 -0
  500. package/dist/utils/typeGuards.js.map +1 -0
  501. package/dist/utils/typedDataConverter.d.ts +3 -6
  502. package/dist/utils/urlResolver.cjs +1 -1
  503. package/dist/utils/urlResolver.cjs.map +1 -1
  504. package/dist/utils/urlResolver.d.ts +2 -4
  505. package/dist/utils/urlResolver.js +2 -2
  506. package/dist/utils/urlResolver.js.map +1 -1
  507. package/dist/utils/wallet.cjs +62 -0
  508. package/dist/utils/wallet.cjs.map +1 -0
  509. package/dist/utils/wallet.d.ts +32 -0
  510. package/dist/utils/wallet.js +36 -0
  511. package/dist/utils/wallet.js.map +1 -0
  512. package/dist/{chains.browser.cjs → utils/withEvents.cjs} +22 -15
  513. package/dist/utils/withEvents.cjs.map +1 -0
  514. package/dist/utils/withEvents.d.ts +56 -0
  515. package/dist/utils/withEvents.js +18 -0
  516. package/dist/utils/withEvents.js.map +1 -0
  517. package/package.json +23 -13
  518. package/dist/browser.d.cts +0 -2
  519. package/dist/chains/definitions.d.cts +0 -53
  520. package/dist/chains/index.d.cts +0 -2
  521. package/dist/chains.browser.cjs.map +0 -1
  522. package/dist/chains.browser.d.cts +0 -2
  523. package/dist/chains.d.cts +0 -2
  524. package/dist/chains.node.d.cts +0 -2
  525. package/dist/config/addresses.d.cts +0 -380
  526. package/dist/config/chains.d.cts +0 -85
  527. package/dist/config/eventMappings.cjs +0 -114
  528. package/dist/config/eventMappings.cjs.map +0 -1
  529. package/dist/config/eventMappings.d.cts +0 -108
  530. package/dist/config/eventMappings.d.ts +0 -108
  531. package/dist/config/eventMappings.js +0 -90
  532. package/dist/config/eventMappings.js.map +0 -1
  533. package/dist/config/features.d.cts +0 -64
  534. package/dist/contracts/contractController.d.cts +0 -96
  535. package/dist/controllers/data.d.cts +0 -941
  536. package/dist/controllers/permissions.d.cts +0 -25
  537. package/dist/controllers/protocol.d.cts +0 -167
  538. package/dist/controllers/schemas.d.cts +0 -272
  539. package/dist/controllers/server.d.cts +0 -243
  540. package/dist/core/apiClient.d.cts +0 -165
  541. package/dist/core/client.d.cts +0 -92
  542. package/dist/core/generics.d.cts +0 -120
  543. package/dist/core.d.cts +0 -466
  544. package/dist/crypto/ecies/__tests__/test-vectors.d.cts +0 -40
  545. package/dist/crypto/ecies/base.d.cts +0 -143
  546. package/dist/crypto/ecies/browser.d.cts +0 -48
  547. package/dist/crypto/ecies/constants.d.cts +0 -122
  548. package/dist/crypto/ecies/index.d.cts +0 -1
  549. package/dist/crypto/ecies/interface.d.cts +0 -176
  550. package/dist/crypto/ecies/node.d.cts +0 -50
  551. package/dist/crypto/ecies/utils.d.cts +0 -67
  552. package/dist/crypto/services/WalletKeyEncryptionService.d.cts +0 -92
  553. package/dist/diagnostics.d.cts +0 -26
  554. package/dist/errors.d.cts +0 -350
  555. package/dist/generated/abi/ComputeEngineImplementation.d.cts +0 -996
  556. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.cts +0 -545
  557. package/dist/generated/abi/DATFactoryImplementation.d.cts +0 -661
  558. package/dist/generated/abi/DATImplementation.d.cts +0 -693
  559. package/dist/generated/abi/DATPausableImplementation.d.cts +0 -1145
  560. package/dist/generated/abi/DATVotesImplementation.d.cts +0 -1095
  561. package/dist/generated/abi/DLPPerformanceImplementation.d.cts +0 -883
  562. package/dist/generated/abi/DLPRegistryImplementation.d.cts +0 -1123
  563. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.cts +0 -452
  564. package/dist/generated/abi/DLPRewardDeployerImplementation.d.cts +0 -714
  565. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.cts +0 -452
  566. package/dist/generated/abi/DLPRewardSwapImplementation.d.cts +0 -706
  567. package/dist/generated/abi/DLPRootImplementation.d.cts +0 -1248
  568. package/dist/generated/abi/DLPTreasuryImplementation.d.cts +0 -452
  569. package/dist/generated/abi/DataLiquidityPoolImplementation.d.cts +0 -737
  570. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.cts +0 -661
  571. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.cts +0 -989
  572. package/dist/generated/abi/DataPortabilityServersImplementation.d.cts +0 -1086
  573. package/dist/generated/abi/DataRefinerRegistryImplementation.d.cts +0 -737
  574. package/dist/generated/abi/DataRegistryImplementation.d.cts +0 -1004
  575. package/dist/generated/abi/QueryEngineImplementation.d.cts +0 -1001
  576. package/dist/generated/abi/SwapHelperImplementation.d.cts +0 -764
  577. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.cts +0 -701
  578. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.cts +0 -701
  579. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.cts +0 -701
  580. package/dist/generated/abi/TeePoolImplementation.d.cts +0 -993
  581. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.cts +0 -701
  582. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.cts +0 -701
  583. package/dist/generated/abi/TeePoolPhalaImplementation.d.cts +0 -993
  584. package/dist/generated/abi/VanaEpochImplementation.d.cts +0 -900
  585. package/dist/generated/abi/VanaPoolEntityImplementation.d.cts +0 -934
  586. package/dist/generated/abi/VanaPoolStakingImplementation.d.cts +0 -693
  587. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.cts +0 -394
  588. package/dist/generated/abi/index.d.cts +0 -26516
  589. package/dist/generated/server/server-exports.d.cts +0 -21
  590. package/dist/generated/server/server.d.cts +0 -512
  591. package/dist/generated/subgraph.d.cts +0 -5981
  592. package/dist/index.browser.cjs +0 -151
  593. package/dist/index.browser.cjs.map +0 -1
  594. package/dist/index.browser.d.cts +0 -177
  595. package/dist/index.d.cts +0 -2
  596. package/dist/index.node.d.cts +0 -64
  597. package/dist/node.d.cts +0 -2
  598. package/dist/permissions-DNKPu_G0.d.cts +0 -1666
  599. package/dist/permissions-eo8YeLGf.d.ts +0 -1666
  600. package/dist/platform/browser-only.d.cts +0 -25
  601. package/dist/platform/browser-safe.d.cts +0 -32
  602. package/dist/platform/browser.d.cts +0 -74
  603. package/dist/platform/index.d.cts +0 -5
  604. package/dist/platform/interface.d.cts +0 -218
  605. package/dist/platform/node.d.cts +0 -27
  606. package/dist/platform/shared/error-utils.d.cts +0 -25
  607. package/dist/platform/shared/pgp-utils.d.cts +0 -61
  608. package/dist/platform/shared/stream-utils.d.cts +0 -16
  609. package/dist/platform/utils.d.cts +0 -53
  610. package/dist/platform.browser.cjs +0 -41
  611. package/dist/platform.browser.cjs.map +0 -1
  612. package/dist/platform.browser.d.cts +0 -4
  613. package/dist/platform.d.cts +0 -5
  614. package/dist/platform.node.d.cts +0 -5
  615. package/dist/server/handler.d.cts +0 -282
  616. package/dist/storage/index.d.cts +0 -10
  617. package/dist/storage/manager.d.cts +0 -150
  618. package/dist/storage/providers/callback-storage.d.cts +0 -100
  619. package/dist/storage/providers/google-drive.d.cts +0 -156
  620. package/dist/storage/providers/ipfs.d.cts +0 -163
  621. package/dist/storage/providers/pinata.d.cts +0 -173
  622. package/dist/types/chains.d.cts +0 -34
  623. package/dist/types/config.d.cts +0 -726
  624. package/dist/types/contracts.d.cts +0 -68
  625. package/dist/types/data.d.cts +0 -694
  626. package/dist/types/eccrypto-js.d.d.cts +0 -13
  627. package/dist/types/eccrypto-js.d.d.ts +0 -13
  628. package/dist/types/external-apis.d.cts +0 -186
  629. package/dist/types/generics.d.cts +0 -450
  630. package/dist/types/index.d.cts +0 -34
  631. package/dist/types/operations.d.cts +0 -108
  632. package/dist/types/permissions.d.cts +0 -957
  633. package/dist/types/personal.d.cts +0 -40
  634. package/dist/types/relayer.d.cts +0 -284
  635. package/dist/types/storage.d.cts +0 -131
  636. package/dist/types/transactionResults.d.cts +0 -25
  637. package/dist/types/utils.d.cts +0 -819
  638. package/dist/types.d.cts +0 -66
  639. package/dist/utils/blockchain/registry.d.cts +0 -34
  640. package/dist/utils/crypto-utils.d.cts +0 -118
  641. package/dist/utils/download.d.cts +0 -41
  642. package/dist/utils/encoding.d.cts +0 -54
  643. package/dist/utils/encryption.d.cts +0 -275
  644. package/dist/utils/eventParsing.cjs +0 -111
  645. package/dist/utils/eventParsing.cjs.map +0 -1
  646. package/dist/utils/eventParsing.d.cts +0 -60
  647. package/dist/utils/eventParsing.d.ts +0 -60
  648. package/dist/utils/eventParsing.js +0 -86
  649. package/dist/utils/eventParsing.js.map +0 -1
  650. package/dist/utils/formatters.d.cts +0 -120
  651. package/dist/utils/grantFiles.d.cts +0 -186
  652. package/dist/utils/grantValidation.d.cts +0 -150
  653. package/dist/utils/grants.d.cts +0 -70
  654. package/dist/utils/ipfs.d.cts +0 -90
  655. package/dist/utils/lazy-import.d.cts +0 -20
  656. package/dist/utils/multicall.d.cts +0 -129
  657. package/dist/utils/schemaValidation.d.cts +0 -172
  658. package/dist/utils/signatureCache.d.cts +0 -134
  659. package/dist/utils/signatureFormatter.d.cts +0 -39
  660. package/dist/utils/transactionParsing.cjs +0 -84
  661. package/dist/utils/transactionParsing.cjs.map +0 -1
  662. package/dist/utils/transactionParsing.d.cts +0 -25
  663. package/dist/utils/transactionParsing.d.ts +0 -25
  664. package/dist/utils/transactionParsing.js +0 -62
  665. package/dist/utils/transactionParsing.js.map +0 -1
  666. package/dist/utils/typedDataConverter.d.cts +0 -13
  667. package/dist/utils/urlResolver.d.cts +0 -40
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controllers/schemas.ts"],"sourcesContent":["import { Address } from \"viem\";\nimport {\n Schema,\n SchemaMetadata,\n CompleteSchema,\n AddSchemaParams,\n AddSchemaResult,\n} from \"../types/index\";\nimport { ControllerContext } from \"./permissions\";\nimport { getContractAddress } from \"../config/addresses\";\nimport { getAbi } from \"../generated/abi\";\nimport { gasAwareMulticall } from \"../utils/multicall\";\nimport {\n validateDataSchemaAgainstMetaSchema,\n SchemaValidationError,\n type DataSchema,\n} from \"../utils/schemaValidation\";\nimport {\n fetchSchemaFromChain,\n fetchSchemaCountFromChain,\n} from \"../utils/blockchain/registry\";\nimport {\n GetSchemaDocument,\n ListSchemasDocument,\n CountSchemasDocument,\n type GetSchemaQuery,\n type ListSchemasQuery,\n type CountSchemasQuery,\n} from \"../generated/subgraph\";\nimport { print } from \"graphql\";\nimport { fetchFromUrl, UrlResolutionError } from \"../utils/urlResolver\";\n\n/**\n * Parameters for creating a new schema with automatic IPFS upload.\n *\n * @remarks\n * This interface is used with the high-level `schemas.create()` method which\n * automatically uploads the schema definition to IPFS and registers it on-chain.\n * @category Schema Management\n */\nexport interface CreateSchemaParams {\n /** The name of the schema */\n name: string;\n /** The dialect of the schema (e.g., 'json' or 'sqlite') */\n dialect: \"json\" | \"sqlite\";\n /** The schema definition object or JSON string */\n schema: object | string;\n}\n\n/**\n * Result of creating a new schema.\n *\n * @remarks\n * Returned by the `schemas.create()` method after successful upload and registration.\n * @category Schema Management\n */\nexport interface CreateSchemaResult {\n /** The schema ID assigned by the contract */\n schemaId: number;\n /** The IPFS URL where the schema definition is stored */\n definitionUrl: string;\n /** The transaction hash of the schema registration */\n transactionHash: string;\n}\n\n/**\n * Manages data schemas and refiners on the Vana network.\n *\n * @remarks\n * This controller handles the complete lifecycle of data schemas including creation,\n * validation, IPFS upload, and blockchain registration. It provides methods for managing\n * both schemas (data structure definitions) and refiners (data processing definitions).\n *\n * **Schema Storage:**\n * Schemas are stored unencrypted on IPFS for public access and reusability across the network.\n * Schema definitions use JSON Schema format for data validation and structure definition.\n *\n * **Method Selection:**\n * - `create()` validates, uploads to IPFS, and registers new schemas on blockchain\n * - `get()` retrieves existing schema metadata by ID from blockchain contracts\n * - `count()` returns total number of registered schemas for pagination\n * - `list()` provides paginated access to all schemas with optional filtering\n * - `addSchema()` provides lower-level schema registration with pre-uploaded URLs\n *\n * **Storage Requirements:**\n * Methods requiring storage configuration: `create()`\n * Methods working without storage: `get()`, `count()`, `list()`, `addSchema()`\n *\n * @example\n * ```typescript\n * // Create a new schema with automatic IPFS upload\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * },\n * required: [\"name\"]\n * }\n * });\n *\n * // Get an existing schema\n * const schema = await vana.schemas.get(1);\n *\n * // List all schemas\n * const count = await vana.schemas.count();\n * ```\n * @category Schema Management\n */\nexport class SchemaController {\n constructor(private readonly context: ControllerContext) {}\n\n /**\n * Creates a new schema with automatic validation and IPFS upload.\n *\n * @remarks\n * This is the primary method for creating schemas on the Vana network. It handles\n * the complete workflow including schema validation, IPFS upload, and blockchain\n * registration. The schema definition is stored unencrypted on IPFS to enable\n * public access and reusability.\n *\n * The method automatically:\n * - Validates the schema definition against the Vana metaschema\n * - Uploads the definition to IPFS to generate a permanent URL\n * - Registers the schema on the blockchain with the generated URL\n *\n * @param params - Schema creation parameters including name, dialect, and definition\n * @returns Promise resolving to creation results with schema ID and transaction hash\n * @throws {SchemaValidationError} When the schema definition is invalid\n * @throws {Error} When IPFS upload or blockchain registration fails\n * @example\n * ```typescript\n * // Create a JSON schema for user profiles\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\", minimum: 0 }\n * },\n * required: [\"name\"]\n * }\n * });\n *\n * console.log(`Schema created with ID: ${result.schemaId}`);\n * ```\n */\n async create(params: CreateSchemaParams): Promise<CreateSchemaResult> {\n const { name, dialect, schema } = params;\n\n try {\n // Step 1: Normalize and validate the schema definition\n let schemaDefinition: object;\n if (typeof schema === \"string\") {\n try {\n schemaDefinition = JSON.parse(schema);\n } catch {\n throw new SchemaValidationError(\n \"Invalid JSON in schema definition\",\n [],\n );\n }\n } else {\n schemaDefinition = schema;\n }\n\n // Step 2: Validate against metaschema\n const dataSchema: DataSchema = {\n name,\n version: \"1.0.0\",\n dialect,\n schema: schemaDefinition,\n };\n\n validateDataSchemaAgainstMetaSchema(dataSchema);\n\n // Step 3: Upload to IPFS (unencrypted for public access)\n if (!this.context.storageManager) {\n // Use centralized validation if available, otherwise fall back to old behavior\n if (this.context.validateStorageRequired) {\n this.context.validateStorageRequired();\n // The validateStorageRequired method throws, so this line should never be reached\n // but TypeScript doesn't know that, so we need this fallback\n throw new Error(\"Storage validation failed\");\n } else {\n throw new Error(\n \"Storage manager not configured. Please provide storage providers in VanaConfig.\",\n );\n }\n }\n\n const schemaBlob = new Blob([JSON.stringify(dataSchema)], {\n type: \"application/json\",\n });\n\n const uploadResult = await this.context.storageManager.upload(\n schemaBlob,\n `${name.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`,\n \"ipfs\", // Use IPFS for public schema storage\n );\n\n // Step 4: Register on blockchain\n const chainId = this.context.walletClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const userAddress = await this.getUserAddress();\n\n const txHash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [name, dialect, uploadResult.url],\n account: this.context.walletClient.account || userAddress,\n chain: this.context.walletClient.chain || null,\n });\n\n // Wait for transaction confirmation and parse events\n const receipt = await this.context.publicClient.waitForTransactionReceipt(\n {\n hash: txHash,\n confirmations: 1,\n },\n );\n\n // Parse the SchemaAdded event to get the schema ID\n const { parseSchemaAddedEvent } = await import(\"../utils/eventParsing\");\n const eventData = parseSchemaAddedEvent(receipt);\n\n return {\n schemaId: Number(eventData.schemaId),\n definitionUrl: uploadResult.url,\n transactionHash: txHash,\n };\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw new Error(\n `Schema creation failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves a complete schema by its ID with definition fetched and flattened.\n *\n * @param schemaId - The ID of the schema to retrieve\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the complete schema object with all fields populated\n * @throws {Error} When the schema is not found, definition cannot be fetched, or chain is unavailable\n * @example\n * ```typescript\n * const schema = await vana.schemas.get(1);\n * console.log(`Schema: ${schema.name} (${schema.dialect})`);\n * console.log(`Version: ${schema.version}`);\n * console.log(`Description: ${schema.description}`);\n * console.log('Schema:', schema.schema);\n *\n * // Use directly with validator (schema has all required fields)\n * validator.validateDataAgainstSchema(data, schema);\n * ```\n */\n async get(\n schemaId: number,\n options: { subgraphUrl?: string } = {},\n ): Promise<CompleteSchema> {\n const subgraphUrl = options.subgraphUrl || this.context.subgraphUrl;\n\n let metadata: SchemaMetadata;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n metadata = await this._getSchemaViaSubgraph({ schemaId, subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (rpcError) {\n throw new Error(\n `Failed to get schema: ${rpcError instanceof Error ? rpcError.message : \"Unknown error\"}`,\n );\n }\n }\n } else {\n // Use RPC directly\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (error) {\n throw new Error(\n `Failed to get schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n // Fetch the definition (should be a complete DataSchema)\n const definition = await fetchFromUrl(\n metadata.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (!definition || typeof definition !== \"object\") {\n throw new Error(\n `Invalid schema definition format for schema ${schemaId}`,\n );\n }\n\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Verify on-chain and off-chain data match\n if (dataSchema.name !== metadata.name) {\n throw new Error(\n `Schema name mismatch: on-chain=\"${metadata.name}\" off-chain=\"${dataSchema.name}\"`,\n );\n }\n if (dataSchema.dialect !== metadata.dialect) {\n throw new Error(\n `Schema dialect mismatch: on-chain=\"${metadata.dialect}\" off-chain=\"${dataSchema.dialect}\"`,\n );\n }\n\n // Return using on-chain values as authoritative source\n return {\n ...metadata,\n version: dataSchema.version,\n description: dataSchema.description,\n schema: dataSchema.schema,\n };\n }\n\n /**\n * Gets the total number of schemas registered on the network.\n *\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the total schema count\n * @throws {Error} When the count cannot be retrieved\n * @example\n * ```typescript\n * const count = await vana.schemas.count();\n * console.log(`Total schemas: ${count}`);\n *\n * // With custom subgraph\n * const count = await vana.schemas.count({\n * subgraphUrl: 'https://custom-subgraph.com/graphql'\n * });\n * ```\n */\n async count(options: { subgraphUrl?: string } = {}): Promise<number> {\n const subgraphUrl = options.subgraphUrl || this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._countSchemasViaSubgraph({ subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n // Use RPC (as fallback or primary method)\n try {\n return await fetchSchemaCountFromChain(this.context);\n } catch (error) {\n throw new Error(\n `Failed to get schemas count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Lists all schemas with pagination.\n *\n * @param options - Optional parameters for listing schemas\n * @param options.limit - Maximum number of schemas to return\n * @param options.offset - Number of schemas to skip\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @param options.includeDefinitions - Whether to fetch and include schema definitions (default: false for performance)\n * @returns Promise resolving to an array of schemas\n * @example\n * ```typescript\n * // Get all schemas (without definitions for performance)\n * const schemas = await vana.schemas.list();\n *\n * // Get schemas with definitions\n * const schemas = await vana.schemas.list({ includeDefinitions: true });\n *\n * // Get schemas with pagination\n * const schemas = await vana.schemas.list({ limit: 10, offset: 0 });\n * ```\n */\n async list(\n options: {\n limit?: number;\n offset?: number;\n subgraphUrl?: string;\n includeDefinitions?: boolean;\n } = {},\n ): Promise<Schema[]> {\n const { limit = 100, offset = 0, includeDefinitions = false } = options;\n const subgraphUrl = options.subgraphUrl || this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._listSchemasViaSubgraph({\n limit,\n offset,\n subgraphUrl,\n });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n try {\n const totalCount = await this.count();\n const start = offset;\n const end = Math.min(start + limit, totalCount);\n\n if (end <= start) {\n return [];\n }\n\n // Get contract address and ABI\n const chainId = this.context.walletClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n // Build multicall batch for fetching schemas\n const schemaCalls = [];\n for (let i = start; i < end; i++) {\n schemaCalls.push({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"schemas\",\n args: [BigInt(i + 1)], // Schema IDs are 1-based\n } as const);\n }\n\n // Fetch all schemas in batches using gasAwareMulticall\n const schemaResults = await gasAwareMulticall<\n typeof schemaCalls,\n true // Allow failures for individual schema lookups\n >(this.context.publicClient, {\n contracts: schemaCalls,\n allowFailure: true,\n });\n\n // Process results\n const schemas: Schema[] = [];\n schemaResults.forEach((result, index) => {\n if (result.status === \"success\" && result.result) {\n const schemaId = start + index + 1; // Schema IDs are 1-based\n const schemaData = result.result as {\n name: string;\n dialect: string;\n definitionUrl: string;\n };\n\n if (\n schemaData.name &&\n schemaData.dialect &&\n schemaData.definitionUrl\n ) {\n schemas.push({\n id: schemaId,\n name: schemaData.name,\n dialect: schemaData.dialect as \"json\" | \"sqlite\",\n definitionUrl: schemaData.definitionUrl,\n });\n } else {\n console.warn(`Incomplete schema data for ID ${schemaId}`);\n }\n } else {\n // Skip schemas that can't be retrieved\n console.warn(`Failed to retrieve schema ${start + index + 1}`);\n }\n });\n\n // Optionally fetch definitions for all schemas\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n } catch (error) {\n throw new Error(\n `Failed to list schemas: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Adds a schema using the legacy method (low-level API).\n *\n * @deprecated Use create() instead for the high-level API with automatic IPFS upload\n * @param params - Schema parameters including pre-generated definition URL\n * @returns Promise resolving to the add schema result\n */\n async addSchema(params: AddSchemaParams): Promise<AddSchemaResult> {\n try {\n const chainId = this.context.walletClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const userAddress = await this.getUserAddress();\n\n const txHash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [params.name, params.dialect, params.definitionUrl],\n account: this.context.walletClient.account || userAddress,\n chain: this.context.walletClient.chain || null,\n });\n\n // Wait for transaction confirmation and parse events\n const receipt = await this.context.publicClient.waitForTransactionReceipt(\n {\n hash: txHash,\n confirmations: 1,\n },\n );\n\n // Parse the SchemaAdded event to get the schema ID\n const { parseSchemaAddedEvent } = await import(\"../utils/eventParsing\");\n const eventData = parseSchemaAddedEvent(receipt);\n\n return {\n schemaId: Number(eventData.schemaId),\n transactionHash: txHash,\n };\n } catch (error) {\n throw new Error(\n `Failed to add schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Internal method: Query schema via subgraph\n *\n * @param params - Query parameters\n * @param params.schemaId - The ID of the schema to retrieve\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the schema object\n * @private\n */\n private async _getSchemaViaSubgraph(params: {\n schemaId: number;\n subgraphUrl: string;\n }): Promise<SchemaMetadata> {\n const { schemaId, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(GetSchemaDocument),\n variables: { id: schemaId.toString() },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: GetSchemaQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schema) {\n throw new Error(`Schema ${schemaId} not found in subgraph`);\n }\n\n // Map subgraph schema to SDK schema type\n const subgraphSchema = result.data.schema;\n return {\n id: parseInt(subgraphSchema.id),\n name: subgraphSchema.name,\n dialect: subgraphSchema.dialect as \"json\" | \"sqlite\",\n definitionUrl: subgraphSchema.definitionUrl,\n };\n }\n\n /**\n * Internal method: List schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.limit - Maximum number of schemas to return\n * @param params.offset - Number of schemas to skip\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to an array of schemas\n * @private\n */\n private async _listSchemasViaSubgraph(params: {\n limit: number;\n offset: number;\n subgraphUrl: string;\n }): Promise<Schema[]> {\n const { limit, offset, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(ListSchemasDocument),\n variables: { first: limit, skip: offset },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: ListSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schemas) {\n return [];\n }\n\n // Map subgraph schemas to SDK schema type\n const schemas = result.data.schemas.map((schema) => ({\n id: parseInt(schema.id),\n name: schema.name,\n dialect: schema.dialect as \"json\" | \"sqlite\",\n definitionUrl: schema.definitionUrl,\n }));\n\n // Optionally fetch definitions if requested\n const includeDefinitions = (params as { includeDefinitions?: boolean })\n .includeDefinitions;\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n }\n\n /**\n * Internal method: Count schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the total schema count\n * @private\n */\n private async _countSchemasViaSubgraph(params: {\n subgraphUrl: string;\n }): Promise<number> {\n const { subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(CountSchemasDocument),\n variables: {},\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: CountSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n return result.data?.schemas?.length || 0;\n }\n\n /**\n * Gets the user's wallet address.\n *\n * @private\n * @returns Promise resolving to the user's address\n */\n private async getUserAddress(): Promise<Address> {\n if (!this.context.walletClient.account) {\n throw new Error(\"No wallet account connected\");\n }\n\n // Return the account address directly if available\n if (typeof this.context.walletClient.account === \"string\") {\n return this.context.walletClient.account as Address;\n }\n\n // If account is an object, get the address property\n if (\n typeof this.context.walletClient.account === \"object\" &&\n this.context.walletClient.account.address\n ) {\n return this.context.walletClient.account.address;\n }\n\n throw new Error(\"Unable to determine wallet address\");\n }\n\n /**\n * Fetches and attaches definitions to an array of schemas.\n *\n * @param schemas - Array of schemas to fetch definitions for\n * @private\n */\n private async _fetchDefinitionsForSchemas(schemas: Schema[]): Promise<void> {\n // Fetch definitions concurrently for performance\n await Promise.all(\n schemas.map(async (schema) => {\n if (!schema.definitionUrl) return;\n\n try {\n const definition = await fetchFromUrl(\n schema.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (definition && typeof definition === \"object\") {\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Populate flat fields\n schema.version = dataSchema.version;\n schema.description = dataSchema.description;\n schema.schema = dataSchema.schema;\n }\n } catch (error) {\n // Don't fail the entire list operation if one definition fails\n console.error(\n `Failed to fetch/validate definition for schema ${schema.id}:`,\n error instanceof UrlResolutionError ||\n error instanceof SchemaValidationError\n ? error.message\n : error,\n );\n }\n }),\n );\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/controllers/schemas.ts"],"sourcesContent":["import type {\n Schema,\n SchemaMetadata,\n CompleteSchema,\n AddSchemaParams,\n} from \"../types/index\";\n// import type { TransactionResult } from \"../types/operations\";\nimport type { SchemaAddedResult } from \"../types/transactionResults\";\nimport type { ControllerContext } from \"./permissions\";\nimport { BaseController } from \"./base\";\nimport { getContractAddress } from \"../config/addresses\";\nimport { getAbi } from \"../generated/abi\";\nimport { gasAwareMulticall } from \"../utils/multicall\";\nimport {\n validateDataSchemaAgainstMetaSchema,\n SchemaValidationError,\n type DataSchema,\n} from \"../utils/schemaValidation\";\nimport {\n fetchSchemaFromChain,\n fetchSchemaCountFromChain,\n} from \"../utils/blockchain/registry\";\nimport {\n GetSchemaDocument,\n ListSchemasDocument,\n CountSchemasDocument,\n type GetSchemaQuery,\n type ListSchemasQuery,\n type CountSchemasQuery,\n} from \"../generated/subgraph\";\nimport { print } from \"graphql\";\nimport { fetchFromUrl, UrlResolutionError } from \"../utils/urlResolver\";\n\n/**\n * Parameters for creating a new schema with automatic IPFS upload.\n *\n * @remarks\n * This interface is used with the high-level `schemas.create()` method which\n * automatically uploads the schema definition to IPFS and registers it on-chain.\n * @category Schema Management\n */\nexport interface CreateSchemaParams {\n /** The name of the schema */\n name: string;\n /** The dialect of the schema (e.g., 'json' or 'sqlite') */\n dialect: \"json\" | \"sqlite\";\n /** The schema definition object or JSON string */\n schema: object | string;\n}\n\n/**\n * Result of creating a new schema.\n *\n * @remarks\n * Returned by the `schemas.create()` method after successful upload and registration.\n * @category Schema Management\n */\nexport interface CreateSchemaResult {\n /** The schema ID assigned by the contract */\n schemaId: bigint;\n /** The IPFS URL where the schema definition is stored */\n definitionUrl: string;\n /** The transaction hash of the schema registration */\n transactionHash: string;\n}\n\n/**\n * Manages data schemas and refiners on the Vana network.\n *\n * @remarks\n * This controller handles the complete lifecycle of data schemas including creation,\n * validation, IPFS upload, and blockchain registration. It provides methods for managing\n * both schemas (data structure definitions) and refiners (data processing definitions).\n *\n * **Schema Storage:**\n * Schemas are stored unencrypted on IPFS for public access and reusability across the network.\n * Schema definitions use JSON Schema format for data validation and structure definition.\n *\n * **Method Selection:**\n * - `create()` validates, uploads to IPFS, and registers new schemas on blockchain\n * - `get()` retrieves existing schema metadata by ID from blockchain contracts\n * - `count()` returns total number of registered schemas for pagination\n * - `list()` provides paginated access to all schemas with optional filtering\n * - `addSchema()` provides lower-level schema registration with pre-uploaded URLs\n *\n * **Storage Requirements:**\n * Methods requiring storage configuration: `create()`\n * Methods working without storage: `get()`, `count()`, `list()`, `addSchema()`\n *\n * @example\n * ```typescript\n * // Create a new schema with automatic IPFS upload\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * },\n * required: [\"name\"]\n * }\n * });\n *\n * // Get an existing schema\n * const schema = await vana.schemas.get(1);\n *\n * // List all schemas\n * const count = await vana.schemas.count();\n * ```\n * @category Schema Management\n */\nexport class SchemaController extends BaseController {\n constructor(context: ControllerContext) {\n super(context);\n }\n\n /**\n * Creates a new schema with automatic validation and IPFS upload.\n *\n * @remarks\n * This is the primary method for creating schemas on the Vana network. It handles\n * the complete workflow including schema validation, IPFS upload, and blockchain\n * registration. The schema definition is stored unencrypted on IPFS to enable\n * public access and reusability.\n *\n * The method automatically:\n * - Validates the schema definition against the Vana metaschema\n * - Uploads the definition to IPFS to generate a permanent URL\n * - Registers the schema on the blockchain with the generated URL\n *\n * @param params - Schema creation parameters including name, dialect, and definition\n * @returns Promise resolving to creation results with schema ID and transaction hash\n * @throws {SchemaValidationError} When the schema definition is invalid\n * @throws {Error} When IPFS upload or blockchain registration fails\n * @example\n * ```typescript\n * // Create a JSON schema for user profiles\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\", minimum: 0 }\n * },\n * required: [\"name\"]\n * }\n * });\n *\n * console.log(`Schema created with ID: ${result.schemaId}`);\n * ```\n */\n async create(params: CreateSchemaParams): Promise<CreateSchemaResult> {\n this.assertWallet();\n const { name, dialect, schema } = params;\n\n try {\n // Step 1: Normalize and validate the schema definition\n let schemaDefinition: object;\n if (typeof schema === \"string\") {\n try {\n schemaDefinition = JSON.parse(schema);\n } catch {\n throw new SchemaValidationError(\n \"Invalid JSON in schema definition\",\n [],\n );\n }\n } else {\n schemaDefinition = schema;\n }\n\n // Step 2: Validate against metaschema\n const dataSchema: DataSchema = {\n name,\n version: \"1.0.0\",\n dialect,\n schema: schemaDefinition,\n };\n\n validateDataSchemaAgainstMetaSchema(dataSchema);\n\n // Step 3: Upload to IPFS (unencrypted for public access)\n if (!this.context.storageManager) {\n // Use centralized validation if available, otherwise fall back to old behavior\n if (this.context.validateStorageRequired) {\n this.context.validateStorageRequired();\n // The validateStorageRequired method throws, so this line should never be reached\n // but TypeScript doesn't know that, so we need this fallback\n throw new Error(\"Storage validation failed\");\n } else {\n throw new Error(\n \"Storage manager not configured. Please provide storage providers in VanaConfig.\",\n );\n }\n }\n\n const schemaBlob = new Blob([JSON.stringify(dataSchema)], {\n type: \"application/json\",\n });\n\n const uploadResult = await this.context.storageManager.upload(\n schemaBlob,\n `${name.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`,\n \"ipfs\", // Use IPFS for public schema storage\n );\n\n // Step 4: Register on blockchain\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const account = this.context.walletClient.account;\n const from = typeof account === \"string\" ? account : account?.address;\n\n const hash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [name, dialect, uploadResult.url],\n account: account ?? null,\n chain: this.context.walletClient.chain ?? null,\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash,\n from: from!,\n contract: \"DataRefinerRegistry\",\n fn: \"addSchema\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new Error(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.SchemaAdded;\n if (!event) {\n throw new Error(\"SchemaAdded event not found in transaction\");\n }\n\n return {\n schemaId: event.schemaId,\n definitionUrl: uploadResult.url,\n transactionHash: hash,\n };\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw new Error(\n `Schema creation failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves a complete schema by its ID with definition fetched and flattened.\n *\n * @param schemaId - The ID of the schema to retrieve\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the complete schema object with all fields populated\n * @throws {Error} When the schema is not found, definition cannot be fetched, or chain is unavailable\n * @example\n * ```typescript\n * const schema = await vana.schemas.get(1);\n * console.log(`Schema: ${schema.name} (${schema.dialect})`);\n * console.log(`Version: ${schema.version}`);\n * console.log(`Description: ${schema.description}`);\n * console.log('Schema:', schema.schema);\n *\n * // Use directly with validator (schema has all required fields)\n * validator.validateDataAgainstSchema(data, schema);\n * ```\n */\n async get(\n schemaId: number,\n options: { subgraphUrl?: string } = {},\n ): Promise<CompleteSchema> {\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n let metadata: SchemaMetadata;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n metadata = await this._getSchemaViaSubgraph({ schemaId, subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (rpcError) {\n throw new Error(\n `Failed to get schema: ${rpcError instanceof Error ? rpcError.message : \"Unknown error\"}`,\n );\n }\n }\n } else {\n // Use RPC directly\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (error) {\n throw new Error(\n `Failed to get schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n // Fetch the definition (should be a complete DataSchema)\n const definition = await fetchFromUrl(\n metadata.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (!definition || typeof definition !== \"object\") {\n throw new Error(\n `Invalid schema definition format for schema ${schemaId}`,\n );\n }\n\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Verify on-chain and off-chain data match\n if (dataSchema.name !== metadata.name) {\n console.warn(\n `Schema name mismatch for ID ${schemaId}: on-chain=\"${metadata.name}\" off-chain=\"${dataSchema.name}\" (using on-chain value)`,\n );\n }\n if (dataSchema.dialect !== metadata.dialect) {\n console.warn(\n `Schema dialect mismatch for ID ${schemaId}: on-chain=\"${metadata.dialect}\" off-chain=\"${dataSchema.dialect}\" (using on-chain value)`,\n );\n }\n\n // Return using on-chain values as authoritative source\n return {\n ...metadata,\n version: dataSchema.version,\n description: dataSchema.description,\n schema: dataSchema.schema,\n };\n }\n\n /**\n * Gets the total number of schemas registered on the network.\n *\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the total schema count\n * @throws {Error} When the count cannot be retrieved\n * @example\n * ```typescript\n * const count = await vana.schemas.count();\n * console.log(`Total schemas: ${count}`);\n *\n * // With custom subgraph\n * const count = await vana.schemas.count({\n * subgraphUrl: 'https://custom-subgraph.com/graphql'\n * });\n * ```\n */\n async count(options: { subgraphUrl?: string } = {}): Promise<number> {\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._countSchemasViaSubgraph({ subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n // Use RPC (as fallback or primary method)\n try {\n return await fetchSchemaCountFromChain(this.context);\n } catch (error) {\n throw new Error(\n `Failed to get schemas count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Lists all schemas with pagination.\n *\n * @param options - Optional parameters for listing schemas\n * @param options.limit - Maximum number of schemas to return\n * @param options.offset - Number of schemas to skip\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @param options.includeDefinitions - Whether to fetch and include schema definitions (default: false for performance)\n * @returns Promise resolving to an array of schemas\n * @example\n * ```typescript\n * // Get all schemas (without definitions for performance)\n * const schemas = await vana.schemas.list();\n *\n * // Get schemas with definitions\n * const schemas = await vana.schemas.list({ includeDefinitions: true });\n *\n * // Get schemas with pagination\n * const schemas = await vana.schemas.list({ limit: 10, offset: 0 });\n * ```\n */\n async list(\n options: {\n limit?: number;\n offset?: number;\n subgraphUrl?: string;\n includeDefinitions?: boolean;\n } = {},\n ): Promise<Schema[]> {\n const { limit = 100, offset = 0, includeDefinitions = false } = options;\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._listSchemasViaSubgraph({\n limit,\n offset,\n subgraphUrl,\n });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n try {\n const totalCount = await this.count();\n const start = offset;\n const end = Math.min(start + limit, totalCount);\n\n if (end <= start) {\n return [];\n }\n\n // Get contract address and ABI\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n // Build multicall batch for fetching schemas\n const schemaCalls = [];\n for (let i = start; i < end; i++) {\n schemaCalls.push({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"schemas\",\n args: [BigInt(i + 1)], // Schema IDs are 1-based\n } as const);\n }\n\n // Fetch all schemas in batches using gasAwareMulticall\n const schemaResults = await gasAwareMulticall<\n typeof schemaCalls,\n true // Allow failures for individual schema lookups\n >(this.context.publicClient, {\n contracts: schemaCalls,\n allowFailure: true,\n });\n\n // Process results\n const schemas: Schema[] = [];\n schemaResults.forEach((result, index) => {\n if (result.status === \"success\" && result.result) {\n const schemaId = start + index + 1; // Schema IDs are 1-based\n const schemaData = result.result as {\n name: string;\n dialect: string;\n definitionUrl: string;\n };\n\n if (\n schemaData.name &&\n schemaData.dialect &&\n schemaData.definitionUrl\n ) {\n schemas.push({\n id: schemaId,\n name: schemaData.name,\n dialect: schemaData.dialect as \"json\" | \"sqlite\",\n definitionUrl: schemaData.definitionUrl,\n });\n } else {\n console.warn(`Incomplete schema data for ID ${schemaId}`);\n }\n } else {\n // Skip schemas that can't be retrieved\n console.warn(`Failed to retrieve schema ${start + index + 1}`);\n }\n });\n\n // Optionally fetch definitions for all schemas\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n } catch (error) {\n throw new Error(\n `Failed to list schemas: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Adds a schema using the legacy method (low-level API).\n *\n * @deprecated Use create() instead for the high-level API with automatic IPFS upload\n * @param params - Schema parameters including pre-generated definition URL\n * @returns Promise resolving to the add schema result\n */\n async addSchema(params: AddSchemaParams): Promise<SchemaAddedResult> {\n this.assertWallet();\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const account = this.context.walletClient.account;\n const from = typeof account === \"string\" ? account : account?.address;\n\n const hash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [params.name, params.dialect, params.definitionUrl],\n account: account ?? null,\n chain: this.context.walletClient.chain ?? null,\n });\n\n // Create TransactionResult POJO\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash,\n from: from!,\n contract: \"DataRefinerRegistry\",\n fn: \"addSchema\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new Error(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.SchemaAdded;\n if (!event) {\n throw new Error(\"SchemaAdded event not found in transaction\");\n }\n\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash,\n });\n\n return {\n transactionHash: hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n schemaId: event.schemaId,\n name: event.name,\n dialect: event.dialect,\n definitionUrl: event.definitionUrl,\n };\n } catch (error) {\n throw new Error(\n `Failed to add schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Internal method: Query schema via subgraph\n *\n * @param params - Query parameters\n * @param params.schemaId - The ID of the schema to retrieve\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the schema object\n * @private\n */\n private async _getSchemaViaSubgraph(params: {\n schemaId: number;\n subgraphUrl: string;\n }): Promise<SchemaMetadata> {\n const { schemaId, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(GetSchemaDocument),\n variables: { id: schemaId.toString() },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: GetSchemaQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schema) {\n throw new Error(`Schema ${schemaId} not found in subgraph`);\n }\n\n // Map subgraph schema to SDK schema type\n const subgraphSchema = result.data.schema;\n return {\n id: parseInt(subgraphSchema.id),\n name: subgraphSchema.name,\n dialect: subgraphSchema.dialect as \"json\" | \"sqlite\",\n definitionUrl: subgraphSchema.definitionUrl,\n };\n }\n\n /**\n * Internal method: List schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.limit - Maximum number of schemas to return\n * @param params.offset - Number of schemas to skip\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to an array of schemas\n * @private\n */\n private async _listSchemasViaSubgraph(params: {\n limit: number;\n offset: number;\n subgraphUrl: string;\n }): Promise<Schema[]> {\n const { limit, offset, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(ListSchemasDocument),\n variables: { first: limit, skip: offset },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: ListSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schemas) {\n return [];\n }\n\n // Map subgraph schemas to SDK schema type\n const schemas = result.data.schemas.map((schema) => ({\n id: parseInt(schema.id),\n name: schema.name,\n dialect: schema.dialect as \"json\" | \"sqlite\",\n definitionUrl: schema.definitionUrl,\n }));\n\n // Optionally fetch definitions if requested\n const { includeDefinitions } = params as { includeDefinitions?: boolean };\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n }\n\n /**\n * Internal method: Count schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the total schema count\n * @private\n */\n private async _countSchemasViaSubgraph(params: {\n subgraphUrl: string;\n }): Promise<number> {\n const { subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(CountSchemasDocument),\n variables: {},\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: CountSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n return result.data?.schemas?.length ?? 0;\n }\n\n /**\n * Gets the user's wallet address.\n *\n * @private\n * @returns Promise resolving to the user's address\n */\n\n /**\n * Fetches and attaches definitions to an array of schemas.\n *\n * @param schemas - Array of schemas to fetch definitions for\n * @private\n */\n private async _fetchDefinitionsForSchemas(schemas: Schema[]): Promise<void> {\n // Fetch definitions concurrently for performance\n await Promise.all(\n schemas.map(async (schema) => {\n if (!schema.definitionUrl) return;\n\n try {\n const definition = await fetchFromUrl(\n schema.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (definition && typeof definition === \"object\") {\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Populate flat fields\n schema.version = dataSchema.version;\n schema.description = dataSchema.description;\n schema.schema = dataSchema.schema;\n }\n } catch (error) {\n // Don't fail the entire list operation if one definition fails\n console.error(\n `Failed to fetch/validate definition for schema ${schema.id}:`,\n error instanceof UrlResolutionError ||\n error instanceof SchemaValidationError\n ? error.message\n : error,\n );\n }\n }),\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -22,9 +22,10 @@ __export(server_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(server_exports);
24
24
  var import_errors = require("../errors");
25
- class ServerController {
25
+ var import_base = require("./base");
26
+ class ServerController extends import_base.BaseController {
26
27
  constructor(context) {
27
- this.context = context;
28
+ super(context);
28
29
  }
29
30
  get personalServerBaseUrl() {
30
31
  if (!this.context.defaultPersonalServerUrl) {
@@ -58,12 +59,12 @@ class ServerController {
58
59
  *
59
60
  * console.log(`Server: ${identity.name}`);
60
61
  * console.log(`Address: ${identity.address}`);
61
- * console.log(`Public Key: ${identity.public_key}`);
62
+ * console.log(`Public Key: ${identity.publicKey}`);
62
63
  *
63
64
  * // Use the public key for encrypting data to share with this server
64
65
  * const encryptedData = await encryptWithWalletPublicKey(
65
66
  * userData,
66
- * identity.public_key
67
+ * identity.publicKey
67
68
  * );
68
69
  * ```
69
70
  */
@@ -89,8 +90,8 @@ class ServerController {
89
90
  return {
90
91
  kind: serverResponse.personal_server.kind,
91
92
  address: serverResponse.personal_server.address,
92
- public_key: serverResponse.personal_server.public_key,
93
- base_url: this.personalServerBaseUrl,
93
+ publicKey: serverResponse.personal_server.public_key,
94
+ baseUrl: this.personalServerBaseUrl,
94
95
  name: "Hosted Vana Server"
95
96
  };
96
97
  } catch (error) {
@@ -129,6 +130,7 @@ class ServerController {
129
130
  * ```
130
131
  */
131
132
  async createOperation(params) {
133
+ this.assertWallet();
132
134
  try {
133
135
  const requestData = {
134
136
  permission_id: params.permissionId
@@ -210,7 +212,7 @@ class ServerController {
210
212
  createdAt: Date.now(),
211
213
  updatedAt: Date.now(),
212
214
  result: data.status === "succeeded" ? data.result : void 0,
213
- error: data.status === "failed" ? data.result || void 0 : void 0
215
+ error: data.status === "failed" ? data.result ?? void 0 : void 0
214
216
  };
215
217
  } catch (error) {
216
218
  if (error instanceof import_errors.NetworkError) {
@@ -261,7 +263,7 @@ class ServerController {
261
263
  }
262
264
  if (operation.status === "failed") {
263
265
  throw new import_errors.PersonalServerError(
264
- `Operation ${operation.status}: ${operation.error || "Unknown error"}`
266
+ `Operation ${operation.status}: ${operation.error ?? "Unknown error"}`
265
267
  );
266
268
  }
267
269
  if (operation.status === "canceled") {
@@ -395,8 +397,11 @@ class ServerController {
395
397
  async createSignature(requestJson) {
396
398
  try {
397
399
  console.debug("\u{1F50D} Debug - createSignature", requestJson);
398
- const client = this.context.applicationClient || this.context.walletClient;
399
- const account = client.account;
400
+ const client = this.context.applicationClient ?? this.context.walletClient;
401
+ if (!client) {
402
+ throw new import_errors.SignatureError("No client available for signing");
403
+ }
404
+ const { account } = client;
400
405
  if (!account) {
401
406
  throw new import_errors.SignatureError("No account available for signing");
402
407
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controllers/server.ts"],"sourcesContent":["import {\n CreateOperationParams,\n InitPersonalServerParams,\n PersonalServerIdentity,\n} from \"../types\";\nimport {\n CreateOperationResponse,\n GetOperationResponse,\n IdentityResponseModel,\n} from \"../generated/server/server-exports\";\nimport {\n NetworkError,\n SerializationError,\n SignatureError,\n PersonalServerError,\n} from \"../errors\";\nimport { ControllerContext } from \"./permissions\";\nimport type { Operation, PollingOptions } from \"../types/operations\";\n\n// Server types are now auto-imported from the generated exports\n\n/**\n * Manages interactions with Vana personal servers and identity infrastructure.\n *\n * @remarks\n * This controller handles communication with personal servers for data processing\n * and identity servers for public key derivation. It provides methods for posting\n * computation requests to personal servers, polling for results, and retrieving\n * cryptographic keys for secure data sharing. All server interactions use the\n * Replicate API infrastructure with proper authentication and error handling.\n *\n * **Server Identity System:**\n * Personal servers use deterministic key derivation: each user address maps to a specific server identity.\n * This enables secure communication without requiring servers to be online during key retrieval.\n *\n * **Method Selection:**\n * - `getIdentity()` retrieves server public keys and addresses for encryption setup\n * - `createOperation()` submits computation requests with signed permission verification\n * - `getOperation()` polls operation status and retrieves results when complete\n * - `cancelOperation()` stops running operations when cancellation is supported\n *\n * **Workflow Pattern:**\n * Typical flow: Get identity → Create operation → Poll status → Retrieve results\n *\n * @example\n * ```typescript\n * // Get a server's identity including public key for encryption\n * const identity = await vana.server.getIdentity({\n * userAddress: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\"\n * });\n *\n * // Create an operation using a granted permission\n * const response = await vana.server.createOperation({\n * permissionId: 123,\n * });\n *\n * // Poll for computation results\n * const result = await vana.server.getOperation(response.id);\n * ```\n * @category Server Management\n * @see {@link https://docs.vana.com/developer/personal-servers | Vana Personal Servers} for conceptual overview\n */\nexport class ServerController {\n constructor(private readonly context: ControllerContext) {}\n\n private get personalServerBaseUrl(): string {\n if (!this.context.defaultPersonalServerUrl) {\n throw new PersonalServerError(\n \"Personal server URL is required for server operations. \" +\n \"Please configure defaultPersonalServerUrl in your VanaConfig.\",\n );\n }\n return this.context.defaultPersonalServerUrl;\n }\n\n /**\n * Retrieves the cryptographic identity of a personal server.\n *\n * @remarks\n * This method fetches the public key and metadata for a personal server,\n * which is required for encrypting data before sharing with the server.\n * The identity includes the server's public key, address, and operational\n * details needed for secure communication. This information is cached\n * by identity servers to enable offline key retrieval.\n *\n * @param request - Parameters containing the user address\n * @param request.userAddress - The wallet address associated with the personal server\n * @returns Promise resolving to the server's identity information\n * @throws {NetworkError} When the identity service is unavailable or returns invalid data\n * @throws {PersonalServerError} When server identity cannot be retrieved\n * @example\n * ```typescript\n * // Get server identity for data encryption\n * const identity = await vana.server.getIdentity({\n * userAddress: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\"\n * });\n *\n * console.log(`Server: ${identity.name}`);\n * console.log(`Address: ${identity.address}`);\n * console.log(`Public Key: ${identity.public_key}`);\n *\n * // Use the public key for encrypting data to share with this server\n * const encryptedData = await encryptWithWalletPublicKey(\n * userData,\n * identity.public_key\n * );\n * ```\n */\n async getIdentity(\n request: InitPersonalServerParams,\n ): Promise<PersonalServerIdentity> {\n try {\n const response = await fetch(\n `${this.personalServerBaseUrl}/identity?address=${request.userAddress}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n console.debug(\"🔍 Debug - getIdentity response\", response);\n if (!response.ok) {\n const errorText = await response.text();\n throw new NetworkError(\n `Local identity API request failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const serverResponse = (await response.json()) as IdentityResponseModel;\n\n return {\n kind: serverResponse.personal_server.kind,\n address: serverResponse.personal_server.address,\n public_key: serverResponse.personal_server.public_key,\n base_url: this.personalServerBaseUrl,\n name: \"Hosted Vana Server\",\n };\n } catch (error) {\n if (\n error instanceof NetworkError ||\n error instanceof PersonalServerError\n ) {\n throw error;\n }\n throw new PersonalServerError(\n `Failed to get personal server identity: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Creates a server operation and returns its details as a plain object.\n *\n * @remarks\n * This method submits a computation request to the personal server and returns\n * an Operation object that can be serialized and passed across API boundaries.\n * Use `waitForOperation()` to poll for completion.\n *\n * @param params - The operation request parameters\n * @param params.permissionId - The permission ID authorizing this operation.\n * Obtain via `vana.permissions.getUserPermissionGrantsOnChain()`.\n * @returns An Operation object containing the operation ID and status\n * @throws {PersonalServerError} When the server request fails or parameters are invalid\n * @throws {NetworkError} When personal server API communication fails\n * @example\n * ```typescript\n * const operation = await vana.server.createOperation({\n * permissionId: 123\n * });\n * console.log(`Operation ID: ${operation.id}`);\n *\n * // Wait for completion\n * const result = await vana.server.waitForOperation(operation.id);\n * console.log(\"Result:\", result.result);\n * ```\n */\n async createOperation<T = unknown>(\n params: CreateOperationParams,\n ): Promise<Operation<T>> {\n try {\n const requestData = {\n permission_id: params.permissionId,\n };\n\n const requestJson = JSON.stringify(requestData);\n\n const signature = await this.createSignature(requestJson);\n\n const requestBody = {\n app_signature: signature,\n operation_request_json: requestJson,\n };\n\n // Step 5: Make request to personal server API\n console.debug(\"🔍 Debug - createOperation requestBody\", requestBody);\n const response = await this.makeRequest(requestBody);\n\n return {\n id: response.id,\n status: \"starting\",\n createdAt: Date.now(),\n } as Operation<T>;\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof NetworkError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof PersonalServerError\n ) {\n throw error;\n }\n // Wrap unknown errors\n throw new PersonalServerError(\n `Personal server operation creation failed: ${error.message}`,\n error,\n );\n }\n throw new PersonalServerError(\n \"Personal server operation creation failed with unknown error\",\n );\n }\n }\n\n /**\n * Retrieves the current status and result of a server operation.\n *\n * @remarks\n * Common status values: `starting`, `running`, `succeeded`, `failed`, `canceled`.\n * When status is `succeeded`, the result field contains the operation output.\n *\n * @param operationId - The ID of the operation to query\n * @returns The operation as a plain object containing status, result, and metadata\n * @throws {NetworkError} When the API request fails or returns invalid data\n * @example\n * ```typescript\n * const operation = await vana.server.getOperation(operationId);\n * if (operation.status === 'succeeded') {\n * console.log('Result:', operation.result);\n * }\n * ```\n */\n async getOperation<T = unknown>(operationId: string): Promise<Operation<T>> {\n try {\n console.debug(\"Polling Operation Status:\", operationId);\n\n const response = await fetch(\n `${this.personalServerBaseUrl}/operations/${operationId}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n console.debug(\"Polling Error Response:\", {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n });\n throw new NetworkError(\n `Status polling failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as GetOperationResponse;\n\n console.debug(\"Polling Success Response:\", data);\n\n return {\n id: data.id,\n status: data.status as Operation[\"status\"],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n result: data.status === \"succeeded\" ? (data.result as T) : undefined,\n error: data.status === \"failed\" ? data.result || undefined : undefined,\n };\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error;\n }\n throw new NetworkError(\n `Failed to poll status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Waits for an operation to complete and returns the final result.\n *\n * @remarks\n * This method polls the operation status at regular intervals until it\n * reaches a terminal state (succeeded, failed, or canceled). Supports\n * ergonomic overloads to accept either an Operation object or just the ID.\n *\n * @param opOrId - Either an Operation object or operation ID string\n * @param options - Optional polling configuration\n * @returns The completed operation with result or error\n * @throws {PersonalServerError} When the operation fails or times out\n * @example\n * ```typescript\n * // Using operation object\n * const operation = await vana.server.createOperation({ permissionId: 123 });\n * const completed = await vana.server.waitForOperation(operation);\n *\n * // Using just the ID\n * const completed = await vana.server.waitForOperation(\"op_abc123\");\n *\n * // With custom timeout\n * const completed = await vana.server.waitForOperation(operation, {\n * timeout: 60000,\n * pollingInterval: 1000\n * });\n * ```\n */\n async waitForOperation<T = unknown>(\n opOrId: Operation<T> | string,\n options?: PollingOptions,\n ): Promise<Operation<T>> {\n const id = typeof opOrId === \"string\" ? opOrId : opOrId.id;\n const startTime = Date.now();\n const timeout = options?.timeout ?? 30000;\n const interval = options?.pollingInterval ?? 500;\n\n while (true) {\n const operation = await this.getOperation<T>(id);\n\n if (operation.status === \"succeeded\") {\n return operation;\n }\n\n if (operation.status === \"failed\") {\n throw new PersonalServerError(\n `Operation ${operation.status}: ${operation.error || \"Unknown error\"}`,\n );\n }\n\n if (operation.status === \"canceled\") {\n throw new PersonalServerError(`Operation was canceled`);\n }\n\n if (Date.now() - startTime > timeout) {\n throw new PersonalServerError(`Operation timed out after ${timeout}ms`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n /**\n * Cancels a running operation on the personal server.\n *\n * @remarks\n * This method attempts to cancel an operation that is currently processing\n * on the personal server. The operation must be in a cancellable state\n * (typically `starting` or `processing`). Not all operations support\n * cancellation, and cancellation may not be immediate. The server will\n * attempt to stop the operation and update its status to `canceled`.\n *\n * **Cancellation Behavior:**\n * - Operations in `succeeded` or `failed` states cannot be canceled\n * - Some long-running operations may take time to respond to cancellation\n * - Always verify cancellation by polling the operation status afterward\n *\n * @param operationId - The unique identifier of the operation to cancel,\n * obtained from `createOperation()` response\n * @returns Promise that resolves when the cancellation request is accepted\n * @throws {PersonalServerError} When the operation cannot be canceled or doesn't exist.\n * Check operation status - it may already be completed or failed.\n * @throws {NetworkError} When unable to reach the personal server API.\n * Verify server URL and network connectivity.\n * @example\n * ```typescript\n * // Start a long-running operation\n * const operation = await vana.server.createOperation({\n * permissionId: 123\n * });\n *\n * // Cancel if needed\n * try {\n * await vana.server.cancelOperation(operation.id);\n * console.log(\"Cancellation requested\");\n *\n * // Verify cancellation\n * const status = await vana.server.getOperation(operation.id);\n * if (status.status === \"canceled\") {\n * console.log(\"Operation successfully canceled\");\n * }\n * } catch (error) {\n * console.error(\"Failed to cancel:\", error);\n * }\n * ```\n */\n async cancelOperation(operationId: string): Promise<void> {\n try {\n const response = await fetch(\n `${this.personalServerBaseUrl}/operations/${operationId}/cancel`,\n {\n method: \"POST\",\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new PersonalServerError(\n `Failed to cancel operation: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error;\n }\n throw new NetworkError(\n `Failed to cancel operation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Makes the request to the personal server API.\n *\n * @param requestBody - The post request parameters to serialize\n * @returns JSON string representation of the request data\n */\n private async makeRequest(\n requestBody: Record<string, unknown>,\n ): Promise<CreateOperationResponse> {\n try {\n console.debug(\"Personal Server Request:\", {\n url: `${this.personalServerBaseUrl}/operations`,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: requestBody,\n });\n\n const response = await fetch(`${this.personalServerBaseUrl}/operations`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.debug(\"Personal Server Error Response:\", {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n });\n throw new NetworkError(\n `Personal server API request failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as CreateOperationResponse;\n\n console.debug(\"Personal Server Success Response:\", data);\n\n return data;\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error;\n }\n throw new NetworkError(\n `Failed to make personal server API request: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Creates a signature for the request JSON.\n *\n * @param requestJson - The JSON string to sign\n * @returns Promise resolving to the cryptographic signature\n */\n private async createSignature(requestJson: string): Promise<string> {\n try {\n console.debug(\"🔍 Debug - createSignature\", requestJson);\n\n // Use applicationClient if available, fallback to walletClient\n const client =\n this.context.applicationClient || this.context.walletClient;\n\n // Get the account from the wallet client\n const account = client.account;\n if (!account) {\n throw new SignatureError(\"No account available for signing\");\n }\n\n // Only allow local accounts for signing\n if (account.type !== \"local\") {\n throw new SignatureError(\n \"Only local accounts are supported for signing\",\n );\n }\n\n console.debug(\"🔍 Debug - createSignature account\", account);\n // Sign locally using the account's signMessage method\n const signature = await account.signMessage({\n message: requestJson,\n });\n\n return signature;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"User rejected\")) {\n throw new SignatureError(\"User rejected the signature request\");\n }\n throw new SignatureError(\n `Failed to create signature: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/controllers/server.ts"],"sourcesContent":["import type {\n CreateOperationParams,\n InitPersonalServerParams,\n PersonalServerIdentity,\n} from \"../types\";\nimport type {\n CreateOperationResponse,\n GetOperationResponse,\n IdentityResponseModel,\n} from \"../generated/server/server-exports\";\nimport {\n NetworkError,\n SerializationError,\n SignatureError,\n PersonalServerError,\n} from \"../errors\";\nimport type { ControllerContext } from \"./permissions\";\nimport type { Operation, PollingOptions } from \"../types/operations\";\nimport { BaseController } from \"./base\";\n\n// Server types are now auto-imported from the generated exports\n\n/**\n * Manages interactions with Vana personal servers and identity infrastructure.\n *\n * @remarks\n * This controller handles communication with personal servers for data processing\n * and identity servers for public key derivation. It provides methods for posting\n * computation requests to personal servers, polling for results, and retrieving\n * cryptographic keys for secure data sharing. All server interactions use the\n * Replicate API infrastructure with proper authentication and error handling.\n *\n * **Server Identity System:**\n * Personal servers use deterministic key derivation: each user address maps to a specific server identity.\n * This enables secure communication without requiring servers to be online during key retrieval.\n *\n * **Method Selection:**\n * - `getIdentity()` retrieves server public keys and addresses for encryption setup\n * - `createOperation()` submits computation requests with signed permission verification\n * - `getOperation()` polls operation status and retrieves results when complete\n * - `cancelOperation()` stops running operations when cancellation is supported\n *\n * **Workflow Pattern:**\n * Typical flow: Get identity → Create operation → Poll status → Retrieve results\n *\n * @example\n * ```typescript\n * // Get a server's identity including public key for encryption\n * const identity = await vana.server.getIdentity({\n * userAddress: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\"\n * });\n *\n * // Create an operation using a granted permission\n * const response = await vana.server.createOperation({\n * permissionId: 123,\n * });\n *\n * // Poll for computation results\n * const result = await vana.server.getOperation(response.id);\n * ```\n * @category Server Management\n * @see {@link https://docs.vana.com/developer/personal-servers | Vana Personal Servers} for conceptual overview\n */\nexport class ServerController extends BaseController {\n constructor(context: ControllerContext) {\n super(context);\n }\n\n private get personalServerBaseUrl(): string {\n if (!this.context.defaultPersonalServerUrl) {\n throw new PersonalServerError(\n \"Personal server URL is required for server operations. \" +\n \"Please configure defaultPersonalServerUrl in your VanaConfig.\",\n );\n }\n return this.context.defaultPersonalServerUrl;\n }\n\n /**\n * Retrieves the cryptographic identity of a personal server.\n *\n * @remarks\n * This method fetches the public key and metadata for a personal server,\n * which is required for encrypting data before sharing with the server.\n * The identity includes the server's public key, address, and operational\n * details needed for secure communication. This information is cached\n * by identity servers to enable offline key retrieval.\n *\n * @param request - Parameters containing the user address\n * @param request.userAddress - The wallet address associated with the personal server\n * @returns Promise resolving to the server's identity information\n * @throws {NetworkError} When the identity service is unavailable or returns invalid data\n * @throws {PersonalServerError} When server identity cannot be retrieved\n * @example\n * ```typescript\n * // Get server identity for data encryption\n * const identity = await vana.server.getIdentity({\n * userAddress: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\"\n * });\n *\n * console.log(`Server: ${identity.name}`);\n * console.log(`Address: ${identity.address}`);\n * console.log(`Public Key: ${identity.publicKey}`);\n *\n * // Use the public key for encrypting data to share with this server\n * const encryptedData = await encryptWithWalletPublicKey(\n * userData,\n * identity.publicKey\n * );\n * ```\n */\n async getIdentity(\n request: InitPersonalServerParams,\n ): Promise<PersonalServerIdentity> {\n try {\n const response = await fetch(\n `${this.personalServerBaseUrl}/identity?address=${request.userAddress}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n console.debug(\"🔍 Debug - getIdentity response\", response);\n if (!response.ok) {\n const errorText = await response.text();\n throw new NetworkError(\n `Local identity API request failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const serverResponse = (await response.json()) as IdentityResponseModel;\n\n return {\n kind: serverResponse.personal_server.kind,\n address: serverResponse.personal_server.address,\n publicKey: serverResponse.personal_server.public_key,\n baseUrl: this.personalServerBaseUrl,\n name: \"Hosted Vana Server\",\n };\n } catch (error) {\n if (\n error instanceof NetworkError ||\n error instanceof PersonalServerError\n ) {\n throw error;\n }\n throw new PersonalServerError(\n `Failed to get personal server identity: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Creates a server operation and returns its details as a plain object.\n *\n * @remarks\n * This method submits a computation request to the personal server and returns\n * an Operation object that can be serialized and passed across API boundaries.\n * Use `waitForOperation()` to poll for completion.\n *\n * @param params - The operation request parameters\n * @param params.permissionId - The permission ID authorizing this operation.\n * Obtain via `vana.permissions.getUserPermissionGrantsOnChain()`.\n * @returns An Operation object containing the operation ID and status\n * @throws {PersonalServerError} When the server request fails or parameters are invalid\n * @throws {NetworkError} When personal server API communication fails\n * @example\n * ```typescript\n * const operation = await vana.server.createOperation({\n * permissionId: 123\n * });\n * console.log(`Operation ID: ${operation.id}`);\n *\n * // Wait for completion\n * const result = await vana.server.waitForOperation(operation.id);\n * console.log(\"Result:\", result.result);\n * ```\n */\n async createOperation<T = unknown>(\n params: CreateOperationParams,\n ): Promise<Operation<T>> {\n this.assertWallet();\n\n try {\n const requestData = {\n permission_id: params.permissionId,\n };\n\n const requestJson = JSON.stringify(requestData);\n\n const signature = await this.createSignature(requestJson);\n\n const requestBody = {\n app_signature: signature,\n operation_request_json: requestJson,\n };\n\n // Step 5: Make request to personal server API\n console.debug(\"🔍 Debug - createOperation requestBody\", requestBody);\n const response = await this.makeRequest(requestBody);\n\n return {\n id: response.id,\n status: \"starting\",\n createdAt: Date.now(),\n } as Operation<T>;\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof NetworkError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof PersonalServerError\n ) {\n throw error;\n }\n // Wrap unknown errors\n throw new PersonalServerError(\n `Personal server operation creation failed: ${error.message}`,\n error,\n );\n }\n throw new PersonalServerError(\n \"Personal server operation creation failed with unknown error\",\n );\n }\n }\n\n /**\n * Retrieves the current status and result of a server operation.\n *\n * @remarks\n * Common status values: `starting`, `running`, `succeeded`, `failed`, `canceled`.\n * When status is `succeeded`, the result field contains the operation output.\n *\n * @param operationId - The ID of the operation to query\n * @returns The operation as a plain object containing status, result, and metadata\n * @throws {NetworkError} When the API request fails or returns invalid data\n * @example\n * ```typescript\n * const operation = await vana.server.getOperation(operationId);\n * if (operation.status === 'succeeded') {\n * console.log('Result:', operation.result);\n * }\n * ```\n */\n async getOperation<T = unknown>(operationId: string): Promise<Operation<T>> {\n try {\n console.debug(\"Polling Operation Status:\", operationId);\n\n const response = await fetch(\n `${this.personalServerBaseUrl}/operations/${operationId}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n console.debug(\"Polling Error Response:\", {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n });\n throw new NetworkError(\n `Status polling failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as GetOperationResponse;\n\n console.debug(\"Polling Success Response:\", data);\n\n return {\n id: data.id,\n status: data.status as Operation[\"status\"],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n result: data.status === \"succeeded\" ? (data.result as T) : undefined,\n error:\n data.status === \"failed\" ? (data.result ?? undefined) : undefined,\n };\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error;\n }\n throw new NetworkError(\n `Failed to poll status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Waits for an operation to complete and returns the final result.\n *\n * @remarks\n * This method polls the operation status at regular intervals until it\n * reaches a terminal state (succeeded, failed, or canceled). Supports\n * ergonomic overloads to accept either an Operation object or just the ID.\n *\n * @param opOrId - Either an Operation object or operation ID string\n * @param options - Optional polling configuration\n * @returns The completed operation with result or error\n * @throws {PersonalServerError} When the operation fails or times out\n * @example\n * ```typescript\n * // Using operation object\n * const operation = await vana.server.createOperation({ permissionId: 123 });\n * const completed = await vana.server.waitForOperation(operation);\n *\n * // Using just the ID\n * const completed = await vana.server.waitForOperation(\"op_abc123\");\n *\n * // With custom timeout\n * const completed = await vana.server.waitForOperation(operation, {\n * timeout: 60000,\n * pollingInterval: 1000\n * });\n * ```\n */\n async waitForOperation<T = unknown>(\n opOrId: Operation<T> | string,\n options?: PollingOptions,\n ): Promise<Operation<T>> {\n const id = typeof opOrId === \"string\" ? opOrId : opOrId.id;\n const startTime = Date.now();\n const timeout = options?.timeout ?? 30000;\n const interval = options?.pollingInterval ?? 500;\n\n while (true) {\n const operation = await this.getOperation<T>(id);\n\n if (operation.status === \"succeeded\") {\n return operation;\n }\n\n if (operation.status === \"failed\") {\n throw new PersonalServerError(\n `Operation ${operation.status}: ${operation.error ?? \"Unknown error\"}`,\n );\n }\n\n if (operation.status === \"canceled\") {\n throw new PersonalServerError(`Operation was canceled`);\n }\n\n if (Date.now() - startTime > timeout) {\n throw new PersonalServerError(`Operation timed out after ${timeout}ms`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n /**\n * Cancels a running operation on the personal server.\n *\n * @remarks\n * This method attempts to cancel an operation that is currently processing\n * on the personal server. The operation must be in a cancellable state\n * (typically `starting` or `processing`). Not all operations support\n * cancellation, and cancellation may not be immediate. The server will\n * attempt to stop the operation and update its status to `canceled`.\n *\n * **Cancellation Behavior:**\n * - Operations in `succeeded` or `failed` states cannot be canceled\n * - Some long-running operations may take time to respond to cancellation\n * - Always verify cancellation by polling the operation status afterward\n *\n * @param operationId - The unique identifier of the operation to cancel,\n * obtained from `createOperation()` response\n * @returns Promise that resolves when the cancellation request is accepted\n * @throws {PersonalServerError} When the operation cannot be canceled or doesn't exist.\n * Check operation status - it may already be completed or failed.\n * @throws {NetworkError} When unable to reach the personal server API.\n * Verify server URL and network connectivity.\n * @example\n * ```typescript\n * // Start a long-running operation\n * const operation = await vana.server.createOperation({\n * permissionId: 123\n * });\n *\n * // Cancel if needed\n * try {\n * await vana.server.cancelOperation(operation.id);\n * console.log(\"Cancellation requested\");\n *\n * // Verify cancellation\n * const status = await vana.server.getOperation(operation.id);\n * if (status.status === \"canceled\") {\n * console.log(\"Operation successfully canceled\");\n * }\n * } catch (error) {\n * console.error(\"Failed to cancel:\", error);\n * }\n * ```\n */\n async cancelOperation(operationId: string): Promise<void> {\n try {\n const response = await fetch(\n `${this.personalServerBaseUrl}/operations/${operationId}/cancel`,\n {\n method: \"POST\",\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new PersonalServerError(\n `Failed to cancel operation: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error;\n }\n throw new NetworkError(\n `Failed to cancel operation: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Makes the request to the personal server API.\n *\n * @param requestBody - The post request parameters to serialize\n * @returns JSON string representation of the request data\n */\n private async makeRequest(\n requestBody: Record<string, unknown>,\n ): Promise<CreateOperationResponse> {\n try {\n console.debug(\"Personal Server Request:\", {\n url: `${this.personalServerBaseUrl}/operations`,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: requestBody,\n });\n\n const response = await fetch(`${this.personalServerBaseUrl}/operations`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.debug(\"Personal Server Error Response:\", {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n });\n throw new NetworkError(\n `Personal server API request failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as CreateOperationResponse;\n\n console.debug(\"Personal Server Success Response:\", data);\n\n return data;\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error;\n }\n throw new NetworkError(\n `Failed to make personal server API request: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Creates a signature for the request JSON.\n *\n * @param requestJson - The JSON string to sign\n * @returns Promise resolving to the cryptographic signature\n */\n private async createSignature(requestJson: string): Promise<string> {\n try {\n console.debug(\"🔍 Debug - createSignature\", requestJson);\n\n // Use applicationClient if available, fallback to walletClient\n const client =\n this.context.applicationClient ?? this.context.walletClient;\n\n if (!client) {\n throw new SignatureError(\"No client available for signing\");\n }\n\n // Get the account from the wallet client\n const { account } = client;\n if (!account) {\n throw new SignatureError(\"No account available for signing\");\n }\n\n // Only allow local accounts for signing\n if (account.type !== \"local\") {\n throw new SignatureError(\n \"Only local accounts are supported for signing\",\n );\n }\n\n console.debug(\"🔍 Debug - createSignature account\", account);\n // Sign locally using the account's signMessage method\n const signature = await account.signMessage({\n message: requestJson,\n });\n\n return signature;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"User rejected\")) {\n throw new SignatureError(\"User rejected the signature request\");\n }\n throw new SignatureError(\n `Failed to create signature: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,30 +1,7 @@
1
- import { C as ControllerContext } from '../permissions-eo8YeLGf.js';
2
- import { InitPersonalServerParams, PersonalServerIdentity, CreateOperationParams } from '../types/personal.js';
3
- import { Operation, PollingOptions } from '../types/operations.js';
4
- import 'viem';
5
- import '../types/config.js';
6
- import '../types/chains.js';
7
- import '../types/storage.js';
8
- import '../types/permissions.js';
9
- import '../config/eventMappings.js';
10
- import '../generated/abi/index.js';
11
- import '../generated/abi/DataPortabilityPermissionsImplementation.js';
12
- import '../generated/abi/DataPortabilityServersImplementation.js';
13
- import '../generated/abi/DataPortabilityGranteesImplementation.js';
14
- import '../generated/abi/VanaEpochImplementation.js';
15
- import '../generated/abi/DLPRegistryImplementation.js';
16
- import '../generated/abi/DLPTreasuryImplementation.js';
17
- import '../generated/abi/DLPRewardDeployerTreasuryImplementation.js';
18
- import '../generated/abi/DLPPerformanceImplementation.js';
19
- import '../generated/abi/DLPRewardDeployerImplementation.js';
20
- import '../generated/abi/DLPRootImplementation.js';
21
- import '../generated/abi/DataLiquidityPoolImplementation.js';
22
- import '../generated/abi/DLPRegistryTreasuryImplementation.js';
23
- import '../storage/manager.js';
24
- import '../platform/interface.js';
25
- import '../generated/server/server-exports.js';
26
- import '../generated/server/server.js';
27
-
1
+ import type { CreateOperationParams, InitPersonalServerParams, PersonalServerIdentity } from "../types";
2
+ import type { ControllerContext } from "./permissions";
3
+ import type { Operation, PollingOptions } from "../types/operations";
4
+ import { BaseController } from "./base";
28
5
  /**
29
6
  * Manages interactions with Vana personal servers and identity infrastructure.
30
7
  *
@@ -66,8 +43,7 @@ import '../generated/server/server.js';
66
43
  * @category Server Management
67
44
  * @see {@link https://docs.vana.com/developer/personal-servers | Vana Personal Servers} for conceptual overview
68
45
  */
69
- declare class ServerController {
70
- private readonly context;
46
+ export declare class ServerController extends BaseController {
71
47
  constructor(context: ControllerContext);
72
48
  private get personalServerBaseUrl();
73
49
  /**
@@ -94,12 +70,12 @@ declare class ServerController {
94
70
  *
95
71
  * console.log(`Server: ${identity.name}`);
96
72
  * console.log(`Address: ${identity.address}`);
97
- * console.log(`Public Key: ${identity.public_key}`);
73
+ * console.log(`Public Key: ${identity.publicKey}`);
98
74
  *
99
75
  * // Use the public key for encrypting data to share with this server
100
76
  * const encryptedData = await encryptWithWalletPublicKey(
101
77
  * userData,
102
- * identity.public_key
78
+ * identity.publicKey
103
79
  * );
104
80
  * ```
105
81
  */
@@ -239,5 +215,3 @@ declare class ServerController {
239
215
  */
240
216
  private createSignature;
241
217
  }
242
-
243
- export { ServerController };
@@ -4,9 +4,10 @@ import {
4
4
  SignatureError,
5
5
  PersonalServerError
6
6
  } from "../errors";
7
- class ServerController {
7
+ import { BaseController } from "./base";
8
+ class ServerController extends BaseController {
8
9
  constructor(context) {
9
- this.context = context;
10
+ super(context);
10
11
  }
11
12
  get personalServerBaseUrl() {
12
13
  if (!this.context.defaultPersonalServerUrl) {
@@ -40,12 +41,12 @@ class ServerController {
40
41
  *
41
42
  * console.log(`Server: ${identity.name}`);
42
43
  * console.log(`Address: ${identity.address}`);
43
- * console.log(`Public Key: ${identity.public_key}`);
44
+ * console.log(`Public Key: ${identity.publicKey}`);
44
45
  *
45
46
  * // Use the public key for encrypting data to share with this server
46
47
  * const encryptedData = await encryptWithWalletPublicKey(
47
48
  * userData,
48
- * identity.public_key
49
+ * identity.publicKey
49
50
  * );
50
51
  * ```
51
52
  */
@@ -71,8 +72,8 @@ class ServerController {
71
72
  return {
72
73
  kind: serverResponse.personal_server.kind,
73
74
  address: serverResponse.personal_server.address,
74
- public_key: serverResponse.personal_server.public_key,
75
- base_url: this.personalServerBaseUrl,
75
+ publicKey: serverResponse.personal_server.public_key,
76
+ baseUrl: this.personalServerBaseUrl,
76
77
  name: "Hosted Vana Server"
77
78
  };
78
79
  } catch (error) {
@@ -111,6 +112,7 @@ class ServerController {
111
112
  * ```
112
113
  */
113
114
  async createOperation(params) {
115
+ this.assertWallet();
114
116
  try {
115
117
  const requestData = {
116
118
  permission_id: params.permissionId
@@ -192,7 +194,7 @@ class ServerController {
192
194
  createdAt: Date.now(),
193
195
  updatedAt: Date.now(),
194
196
  result: data.status === "succeeded" ? data.result : void 0,
195
- error: data.status === "failed" ? data.result || void 0 : void 0
197
+ error: data.status === "failed" ? data.result ?? void 0 : void 0
196
198
  };
197
199
  } catch (error) {
198
200
  if (error instanceof NetworkError) {
@@ -243,7 +245,7 @@ class ServerController {
243
245
  }
244
246
  if (operation.status === "failed") {
245
247
  throw new PersonalServerError(
246
- `Operation ${operation.status}: ${operation.error || "Unknown error"}`
248
+ `Operation ${operation.status}: ${operation.error ?? "Unknown error"}`
247
249
  );
248
250
  }
249
251
  if (operation.status === "canceled") {
@@ -377,8 +379,11 @@ class ServerController {
377
379
  async createSignature(requestJson) {
378
380
  try {
379
381
  console.debug("\u{1F50D} Debug - createSignature", requestJson);
380
- const client = this.context.applicationClient || this.context.walletClient;
381
- const account = client.account;
382
+ const client = this.context.applicationClient ?? this.context.walletClient;
383
+ if (!client) {
384
+ throw new SignatureError("No client available for signing");
385
+ }
386
+ const { account } = client;
382
387
  if (!account) {
383
388
  throw new SignatureError("No account available for signing");
384
389
  }