@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/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":"AAUA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA+CA,MAAM,iBAAiB;AAAA,EAC5B,YAA6B,SAA4B;AAA5B;AAAA,EAA6B;AAAA,EAE1D,IAAY,wBAAgC;AAC1C,QAAI,CAAC,KAAK,QAAQ,0BAA0B;AAC1C,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,MAAM,YACJ,SACiC;AACjC,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,KAAK,qBAAqB,qBAAqB,QAAQ,WAAW;AAAA,QACrE;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,MAAM,0CAAmC,QAAQ;AACzD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI;AAAA,UACR,sCAAsC,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS;AAAA,QAC7F;AAAA,MACF;AAEA,YAAM,iBAAkB,MAAM,SAAS,KAAK;AAE5C,aAAO;AAAA,QACL,MAAM,eAAe,gBAAgB;AAAA,QACrC,SAAS,eAAe,gBAAgB;AAAA,QACxC,YAAY,eAAe,gBAAgB;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,MAAM;AAAA,MACR;AAAA,IACF,SAAS,OAAO;AACd,UACE,iBAAiB,gBACjB,iBAAiB,qBACjB;AACA,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACrG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,MAAM,gBACJ,QACuB;AACvB,QAAI;AACF,YAAM,cAAc;AAAA,QAClB,eAAe,OAAO;AAAA,MACxB;AAEA,YAAM,cAAc,KAAK,UAAU,WAAW;AAE9C,YAAM,YAAY,MAAM,KAAK,gBAAgB,WAAW;AAExD,YAAM,cAAc;AAAA,QAClB,eAAe;AAAA,QACf,wBAAwB;AAAA,MAC1B;AAGA,cAAQ,MAAM,iDAA0C,WAAW;AACnE,YAAM,WAAW,MAAM,KAAK,YAAY,WAAW;AAEnD,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,QAAQ;AAAA,QACR,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAE1B,YACE,iBAAiB,gBACjB,iBAAiB,sBACjB,iBAAiB,kBACjB,iBAAiB,qBACjB;AACA,gBAAM;AAAA,QACR;AAEA,cAAM,IAAI;AAAA,UACR,8CAA8C,MAAM,OAAO;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,aAA0B,aAA4C;AAC1E,QAAI;AACF,cAAQ,MAAM,6BAA6B,WAAW;AAEtD,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,KAAK,qBAAqB,eAAe,WAAW;AAAA,QACvD;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,gBAAQ,MAAM,2BAA2B;AAAA,UACvC,QAAQ,SAAS;AAAA,UACjB,YAAY,SAAS;AAAA,UACrB,OAAO;AAAA,QACT,CAAC;AACD,cAAM,IAAI;AAAA,UACR,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS;AAAA,QACjF;AAAA,MACF;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,cAAQ,MAAM,6BAA6B,IAAI;AAE/C,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK,IAAI;AAAA,QACpB,WAAW,KAAK,IAAI;AAAA,QACpB,QAAQ,KAAK,WAAW,cAAe,KAAK,SAAe;AAAA,QAC3D,OAAO,KAAK,WAAW,WAAW,KAAK,UAAU,SAAY;AAAA,MAC/D;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,MAAM,iBACJ,QACA,SACuB;AACvB,UAAM,KAAK,OAAO,WAAW,WAAW,SAAS,OAAO;AACxD,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,UAAU,SAAS,WAAW;AACpC,UAAM,WAAW,SAAS,mBAAmB;AAE7C,WAAO,MAAM;AACX,YAAM,YAAY,MAAM,KAAK,aAAgB,EAAE;AAE/C,UAAI,UAAU,WAAW,aAAa;AACpC,eAAO;AAAA,MACT;AAEA,UAAI,UAAU,WAAW,UAAU;AACjC,cAAM,IAAI;AAAA,UACR,aAAa,UAAU,MAAM,KAAK,UAAU,SAAS,eAAe;AAAA,QACtE;AAAA,MACF;AAEA,UAAI,UAAU,WAAW,YAAY;AACnC,cAAM,IAAI,oBAAoB,wBAAwB;AAAA,MACxD;AAEA,UAAI,KAAK,IAAI,IAAI,YAAY,SAAS;AACpC,cAAM,IAAI,oBAAoB,6BAA6B,OAAO,IAAI;AAAA,MACxE;AAEA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8CA,MAAM,gBAAgB,aAAoC;AACxD,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,KAAK,qBAAqB,eAAe,WAAW;AAAA,QACvD;AAAA,UACE,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI;AAAA,UACR,+BAA+B,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS;AAAA,QACtF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,YACZ,aACkC;AAClC,QAAI;AACF,cAAQ,MAAM,4BAA4B;AAAA,QACxC,KAAK,GAAG,KAAK,qBAAqB;AAAA,QAClC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAED,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,qBAAqB,eAAe;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,WAAW;AAAA,MAClC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,gBAAQ,MAAM,mCAAmC;AAAA,UAC/C,QAAQ,SAAS;AAAA,UACjB,YAAY,SAAS;AAAA,UACrB,OAAO;AAAA,QACT,CAAC;AACD,cAAM,IAAI;AAAA,UACR,uCAAuC,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS;AAAA,QAC9F;AAAA,MACF;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,cAAQ,MAAM,qCAAqC,IAAI;AAEvD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,cAAc;AACjC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,+CAA+C,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,gBAAgB,aAAsC;AAClE,QAAI;AACF,cAAQ,MAAM,qCAA8B,WAAW;AAGvD,YAAM,SACJ,KAAK,QAAQ,qBAAqB,KAAK,QAAQ;AAGjD,YAAM,UAAU,OAAO;AACvB,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,eAAe,kCAAkC;AAAA,MAC7D;AAGA,UAAI,QAAQ,SAAS,SAAS;AAC5B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,MAAM,6CAAsC,OAAO;AAE3D,YAAM,YAAY,MAAM,QAAQ,YAAY;AAAA,QAC1C,SAAS;AAAA,MACX,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,eAAe,GAAG;AACrE,cAAM,IAAI,eAAe,qCAAqC;AAAA,MAChE;AACA,YAAM,IAAI;AAAA,QACR,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AACF;","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":[]}
@@ -29,20 +29,20 @@ class ApiClient {
29
29
  circuitBreaker;
30
30
  constructor(config = {}) {
31
31
  this.config = {
32
- baseUrl: config.baseUrl || "",
33
- headers: config.headers || {},
34
- timeout: config.timeout || 3e4,
35
- retry: config.retry || {
32
+ baseUrl: config.baseUrl ?? "",
33
+ headers: config.headers ?? {},
34
+ timeout: config.timeout ?? 3e4,
35
+ retry: config.retry ?? {
36
36
  maxAttempts: 3,
37
37
  baseDelay: 1e3,
38
38
  backoffMultiplier: 2,
39
39
  shouldRetry: (error) => error.message.includes("network")
40
40
  },
41
- rateLimit: config.rateLimit || {
41
+ rateLimit: config.rateLimit ?? {
42
42
  requestsPerWindow: 100,
43
43
  windowMs: 6e4
44
44
  },
45
- circuitBreaker: config.circuitBreaker || {
45
+ circuitBreaker: config.circuitBreaker ?? {
46
46
  failureThreshold: 5,
47
47
  recoveryTimeout: 6e4,
48
48
  halfOpenMaxAttempts: 3
@@ -112,7 +112,8 @@ class ApiClient {
112
112
  headers: {
113
113
  "Content-Type": "application/json",
114
114
  ...options.headers
115
- }
115
+ },
116
+ params: data
116
117
  });
117
118
  }
118
119
  /**
@@ -130,7 +131,8 @@ class ApiClient {
130
131
  headers: {
131
132
  "Content-Type": "application/json",
132
133
  ...options.headers
133
- }
134
+ },
135
+ params: data
134
136
  });
135
137
  }
136
138
  /**
@@ -158,7 +160,8 @@ class ApiClient {
158
160
  headers: {
159
161
  "Content-Type": "application/json",
160
162
  ...options.headers
161
- }
163
+ },
164
+ params: data
162
165
  });
163
166
  }
164
167
  /**
@@ -201,10 +204,10 @@ class ApiClient {
201
204
  const controller = new AbortController();
202
205
  const timeoutId = setTimeout(() => {
203
206
  controller.abort();
204
- }, options.timeout || this.config.timeout);
207
+ }, options.timeout ?? this.config.timeout);
205
208
  try {
206
209
  const response = await fetch(url, {
207
- method: options.method || "GET",
210
+ method: options.method ?? "GET",
208
211
  headers: {
209
212
  ...this.config.headers,
210
213
  ...options.headers
@@ -224,7 +227,7 @@ class ApiClient {
224
227
  success: false,
225
228
  error: {
226
229
  code: response.status.toString(),
227
- message: data.message || response.statusText,
230
+ message: data.message ?? response.statusText,
228
231
  details: data
229
232
  }
230
233
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/apiClient.ts"],"sourcesContent":["import type {\n GenericRequest,\n GenericResponse,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n} from \"../types/generics\";\nimport {\n RetryUtility,\n RateLimiter,\n MiddlewarePipeline,\n CircuitBreaker,\n} from \"./generics\";\n\n/**\n * Configuration for the generic API client\n */\nexport interface ApiClientConfig {\n /** Base URL for all requests */\n baseUrl?: string;\n /** Default headers */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Rate limiting configuration */\n rateLimit?: RateLimiterConfig;\n /** Circuit breaker configuration */\n circuitBreaker?: {\n failureThreshold: number;\n recoveryTimeout: number;\n halfOpenMaxAttempts?: number;\n };\n}\n\n/**\n * HTTP method types\n */\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n /** HTTP method */\n method?: HttpMethod;\n /** Request headers */\n headers?: Record<string, string>;\n /** Query parameters */\n params?: Record<string, unknown>;\n /** Request timeout */\n timeout?: number;\n /** Skip retry for this request */\n skipRetry?: boolean;\n /** Skip rate limiting for this request */\n skipRateLimit?: boolean;\n}\n\n/**\n * Generic API client with middleware, retry, rate limiting, and circuit breaker support\n */\nexport class ApiClient {\n private readonly config: Required<ApiClientConfig>;\n private readonly middleware: MiddlewarePipeline;\n private readonly rateLimiter?: RateLimiter;\n private readonly circuitBreaker?: CircuitBreaker;\n\n constructor(config: ApiClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || \"\",\n headers: config.headers || {},\n timeout: config.timeout || 30000,\n retry: config.retry || {\n maxAttempts: 3,\n baseDelay: 1000,\n backoffMultiplier: 2,\n shouldRetry: (error) => error.message.includes(\"network\"),\n },\n rateLimit: config.rateLimit || {\n requestsPerWindow: 100,\n windowMs: 60000,\n },\n circuitBreaker: config.circuitBreaker || {\n failureThreshold: 5,\n recoveryTimeout: 60000,\n halfOpenMaxAttempts: 3,\n },\n };\n\n this.middleware = new MiddlewarePipeline();\n this.rateLimiter = new RateLimiter(this.config.rateLimit);\n this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\n }\n\n /**\n * Add middleware to the request pipeline\n *\n * @param middleware - The middleware function to add to the pipeline\n */\n use(middleware: Middleware): void {\n this.middleware.use(middleware);\n }\n\n /**\n * Make a generic HTTP request\n *\n * @param url - The URL to make the request to\n * @param options - Request options including method, headers, body, etc.\n * @returns Promise resolving to the response data\n */\n async request<TData = unknown>(\n url: string,\n options: RequestOptions = {},\n ): Promise<GenericResponse<TData>> {\n const fullUrl = this.buildUrl(url);\n const requestOptions = this.buildRequestOptions(options);\n\n const request: GenericRequest<{\n url: string;\n options: RequestOptions;\n }> = {\n params: {\n url: fullUrl,\n options: requestOptions,\n },\n options: requestOptions,\n };\n\n // Apply rate limiting\n if (!options.skipRateLimit && this.rateLimiter) {\n await this.rateLimiter.waitForSlot();\n }\n\n // Execute with circuit breaker\n if (this.circuitBreaker) {\n return this.circuitBreaker.execute(() =>\n this.executeRequest<TData>(request),\n );\n }\n\n return this.executeRequest<TData>(request);\n }\n\n /**\n * Make a GET request\n *\n * @param url - The URL to make the GET request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async get<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"GET\" });\n }\n\n /**\n * Make a POST request\n *\n * @param url - The URL to make the POST request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async post<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n }\n\n /**\n * Make a PUT request\n *\n * @param url - The URL to make the PUT request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async put<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n }\n\n /**\n * Make a DELETE request\n *\n * @param url - The URL to make the DELETE request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async delete<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"DELETE\" });\n }\n\n /**\n * Make a PATCH request\n *\n * @param url - The URL to make the PATCH request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async patch<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n }\n\n /**\n * Execute the actual HTTP request with middleware and retry\n *\n * @param request - The generic request object containing URL and options\n * @returns Promise resolving to the generic response with data\n */\n private async executeRequest<TData>(\n request: GenericRequest<{ url: string; options: RequestOptions }>,\n ): Promise<GenericResponse<TData>> {\n const executeWithRetry = async (): Promise<GenericResponse<TData>> => {\n try {\n // Process request through middleware\n const processedRequest = await this.middleware.processRequest(request);\n\n // Make the actual HTTP request\n const response = await this.makeHttpRequest<TData>(\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.url,\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.options,\n );\n\n // Process response through middleware\n const processedResponse =\n await this.middleware.processResponse(response);\n\n return processedResponse;\n } catch (error) {\n // Try to handle error with middleware\n const handledResponse = await this.middleware.handleError<\n typeof request,\n GenericResponse<TData>\n >(error as Error, request);\n\n if (handledResponse) {\n return handledResponse;\n }\n\n throw error;\n }\n };\n\n // Apply retry logic if not skipped\n if (!request.params.options.skipRetry) {\n return RetryUtility.withRetry(executeWithRetry, this.config.retry);\n }\n\n return executeWithRetry();\n }\n\n /**\n * Make the actual HTTP request using fetch API\n *\n * @param url - The URL to make the request to\n * @param options - The request options including method, headers, body, etc.\n * @returns Promise resolving to the generic response with data\n */\n private async makeHttpRequest<TData>(\n url: string,\n options: RequestOptions,\n ): Promise<GenericResponse<TData>> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, options.timeout || this.config.timeout);\n\n try {\n const response = await fetch(url, {\n method: options.method || \"GET\",\n headers: {\n ...this.config.headers,\n ...options.headers,\n },\n signal: controller.signal,\n // Add body for POST/PUT/PATCH requests\n ...(options.method &&\n [\"POST\", \"PUT\", \"PATCH\"].includes(options.method) && {\n body: JSON.stringify(options.params),\n }),\n });\n\n clearTimeout(timeoutId);\n\n const responseData: unknown = await response.json();\n const data = responseData as { message?: string; [key: string]: unknown };\n\n if (!response.ok) {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: response.status.toString(),\n message: data.message || response.statusText,\n details: data,\n },\n };\n }\n\n return {\n data: responseData as TData,\n success: true,\n meta: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n },\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"TIMEOUT\",\n message: \"Request timeout\",\n details: error,\n },\n };\n }\n\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n },\n };\n }\n }\n\n /**\n * Build the full URL\n *\n * @param url - The URL or path to build the full URL from\n * @returns The complete URL string\n */\n private buildUrl(url: string): string {\n if (url.startsWith(\"http\")) {\n return url;\n }\n\n const baseUrl = this.config.baseUrl.endsWith(\"/\")\n ? this.config.baseUrl.slice(0, -1)\n : this.config.baseUrl;\n const path = url.startsWith(\"/\") ? url : `/${url}`;\n\n return `${baseUrl}${path}`;\n }\n\n /**\n * Build request options with defaults\n *\n * @param options - The request options to merge with defaults\n * @returns The merged request options with defaults applied\n */\n private buildRequestOptions(options: RequestOptions): RequestOptions {\n return {\n method: \"GET\",\n headers: {},\n timeout: this.config.timeout,\n ...options,\n };\n }\n\n /**\n * Get client statistics\n *\n * @returns Object containing client statistics and performance metrics\n */\n getStats() {\n return {\n rateLimiter: this.rateLimiter\n ? {\n remaining: this.rateLimiter.getRemainingRequests(),\n resetTime: this.rateLimiter.getResetTime(),\n }\n : null,\n circuitBreaker: this.circuitBreaker\n ? {\n state: this.circuitBreaker.getState(),\n failures: this.circuitBreaker.getFailures(),\n }\n : null,\n middleware: {\n count: this.middleware.getMiddleware().length,\n },\n };\n }\n\n /**\n * Reset client state\n */\n reset(): void {\n this.circuitBreaker?.reset();\n this.middleware.clear();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/core/apiClient.ts"],"sourcesContent":["import type {\n GenericRequest,\n GenericResponse,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n} from \"../types/generics\";\nimport {\n RetryUtility,\n RateLimiter,\n MiddlewarePipeline,\n CircuitBreaker,\n} from \"./generics\";\n\n/**\n * Configuration for the generic API client\n */\nexport interface ApiClientConfig {\n /** Base URL for all requests */\n baseUrl?: string;\n /** Default headers */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Rate limiting configuration */\n rateLimit?: RateLimiterConfig;\n /** Circuit breaker configuration */\n circuitBreaker?: {\n failureThreshold: number;\n recoveryTimeout: number;\n halfOpenMaxAttempts?: number;\n };\n}\n\n/**\n * HTTP method types\n */\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n /** HTTP method */\n method?: HttpMethod;\n /** Request headers */\n headers?: Record<string, string>;\n /** Query parameters */\n params?: Record<string, unknown>;\n /** Request timeout */\n timeout?: number;\n /** Skip retry for this request */\n skipRetry?: boolean;\n /** Skip rate limiting for this request */\n skipRateLimit?: boolean;\n}\n\n/**\n * Generic API client with middleware, retry, rate limiting, and circuit breaker support\n */\nexport class ApiClient {\n private readonly config: Required<ApiClientConfig>;\n private readonly middleware: MiddlewarePipeline;\n private readonly rateLimiter?: RateLimiter;\n private readonly circuitBreaker?: CircuitBreaker;\n\n constructor(config: ApiClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl ?? \"\",\n headers: config.headers ?? {},\n timeout: config.timeout ?? 30000,\n retry: config.retry ?? {\n maxAttempts: 3,\n baseDelay: 1000,\n backoffMultiplier: 2,\n shouldRetry: (error) => error.message.includes(\"network\"),\n },\n rateLimit: config.rateLimit ?? {\n requestsPerWindow: 100,\n windowMs: 60000,\n },\n circuitBreaker: config.circuitBreaker ?? {\n failureThreshold: 5,\n recoveryTimeout: 60000,\n halfOpenMaxAttempts: 3,\n },\n };\n\n this.middleware = new MiddlewarePipeline();\n this.rateLimiter = new RateLimiter(this.config.rateLimit);\n this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\n }\n\n /**\n * Add middleware to the request pipeline\n *\n * @param middleware - The middleware function to add to the pipeline\n */\n use(middleware: Middleware): void {\n this.middleware.use(middleware);\n }\n\n /**\n * Make a generic HTTP request\n *\n * @param url - The URL to make the request to\n * @param options - Request options including method, headers, body, etc.\n * @returns Promise resolving to the response data\n */\n async request<TData = unknown>(\n url: string,\n options: RequestOptions = {},\n ): Promise<GenericResponse<TData>> {\n const fullUrl = this.buildUrl(url);\n const requestOptions = this.buildRequestOptions(options);\n\n const request: GenericRequest<{\n url: string;\n options: RequestOptions;\n }> = {\n params: {\n url: fullUrl,\n options: requestOptions,\n },\n options: requestOptions,\n };\n\n // Apply rate limiting\n if (!options.skipRateLimit && this.rateLimiter) {\n await this.rateLimiter.waitForSlot();\n }\n\n // Execute with circuit breaker\n if (this.circuitBreaker) {\n return this.circuitBreaker.execute(() =>\n this.executeRequest<TData>(request),\n );\n }\n\n return this.executeRequest<TData>(request);\n }\n\n /**\n * Make a GET request\n *\n * @param url - The URL to make the GET request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async get<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"GET\" });\n }\n\n /**\n * Make a POST request\n *\n * @param url - The URL to make the POST request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async post<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n params: data as Record<string, unknown>,\n });\n }\n\n /**\n * Make a PUT request\n *\n * @param url - The URL to make the PUT request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async put<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n params: data as Record<string, unknown>,\n });\n }\n\n /**\n * Make a DELETE request\n *\n * @param url - The URL to make the DELETE request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async delete<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"DELETE\" });\n }\n\n /**\n * Make a PATCH request\n *\n * @param url - The URL to make the PATCH request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async patch<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n params: data as Record<string, unknown>,\n });\n }\n\n /**\n * Execute the actual HTTP request with middleware and retry\n *\n * @param request - The generic request object containing URL and options\n * @returns Promise resolving to the generic response with data\n */\n private async executeRequest<TData>(\n request: GenericRequest<{ url: string; options: RequestOptions }>,\n ): Promise<GenericResponse<TData>> {\n const executeWithRetry = async (): Promise<GenericResponse<TData>> => {\n try {\n // Process request through middleware\n const processedRequest = await this.middleware.processRequest(request);\n\n // Make the actual HTTP request\n const response = await this.makeHttpRequest<TData>(\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.url,\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.options,\n );\n\n // Process response through middleware\n const processedResponse =\n await this.middleware.processResponse(response);\n\n return processedResponse;\n } catch (error) {\n // Try to handle error with middleware\n const handledResponse = await this.middleware.handleError<\n typeof request,\n GenericResponse<TData>\n >(error as Error, request);\n\n if (handledResponse) {\n return handledResponse;\n }\n\n throw error;\n }\n };\n\n // Apply retry logic if not skipped\n if (!request.params.options.skipRetry) {\n return RetryUtility.withRetry(executeWithRetry, this.config.retry);\n }\n\n return executeWithRetry();\n }\n\n /**\n * Make the actual HTTP request using fetch API\n *\n * @param url - The URL to make the request to\n * @param options - The request options including method, headers, body, etc.\n * @returns Promise resolving to the generic response with data\n */\n private async makeHttpRequest<TData>(\n url: string,\n options: RequestOptions,\n ): Promise<GenericResponse<TData>> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, options.timeout ?? this.config.timeout);\n\n try {\n const response = await fetch(url, {\n method: options.method ?? \"GET\",\n headers: {\n ...this.config.headers,\n ...options.headers,\n },\n signal: controller.signal,\n // Add body for POST/PUT/PATCH requests\n ...(options.method &&\n [\"POST\", \"PUT\", \"PATCH\"].includes(options.method) && {\n body: JSON.stringify(options.params),\n }),\n });\n\n clearTimeout(timeoutId);\n\n const responseData: unknown = await response.json();\n const data = responseData as { message?: string; [key: string]: unknown };\n\n if (!response.ok) {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: response.status.toString(),\n message: data.message ?? response.statusText,\n details: data,\n },\n };\n }\n\n return {\n data: responseData as TData,\n success: true,\n meta: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n },\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"TIMEOUT\",\n message: \"Request timeout\",\n details: error,\n },\n };\n }\n\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n },\n };\n }\n }\n\n /**\n * Build the full URL\n *\n * @param url - The URL or path to build the full URL from\n * @returns The complete URL string\n */\n private buildUrl(url: string): string {\n if (url.startsWith(\"http\")) {\n return url;\n }\n\n const baseUrl = this.config.baseUrl.endsWith(\"/\")\n ? this.config.baseUrl.slice(0, -1)\n : this.config.baseUrl;\n const path = url.startsWith(\"/\") ? url : `/${url}`;\n\n return `${baseUrl}${path}`;\n }\n\n /**\n * Build request options with defaults\n *\n * @param options - The request options to merge with defaults\n * @returns The merged request options with defaults applied\n */\n private buildRequestOptions(options: RequestOptions): RequestOptions {\n return {\n method: \"GET\",\n headers: {},\n timeout: this.config.timeout,\n ...options,\n };\n }\n\n /**\n * Get client statistics\n *\n * @returns Object containing client statistics and performance metrics\n */\n getStats() {\n return {\n rateLimiter: this.rateLimiter\n ? {\n remaining: this.rateLimiter.getRemainingRequests(),\n resetTime: this.rateLimiter.getResetTime(),\n }\n : null,\n circuitBreaker: this.circuitBreaker\n ? {\n state: this.circuitBreaker.getState(),\n failures: this.circuitBreaker.getFailures(),\n }\n : null,\n middleware: {\n count: this.middleware.getMiddleware().length,\n },\n };\n }\n\n /**\n * Reset client state\n */\n reset(): void {\n this.circuitBreaker?.reset();\n this.middleware.clear();\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,8 @@
1
- import { RetryConfig, RateLimiterConfig, Middleware, GenericResponse } from '../types/generics.js';
2
- import 'viem';
3
-
1
+ import type { GenericResponse, RetryConfig, RateLimiterConfig, Middleware } from "../types/generics";
4
2
  /**
5
3
  * Configuration for the generic API client
6
4
  */
7
- interface ApiClientConfig {
5
+ export interface ApiClientConfig {
8
6
  /** Base URL for all requests */
9
7
  baseUrl?: string;
10
8
  /** Default headers */
@@ -25,11 +23,11 @@ interface ApiClientConfig {
25
23
  /**
26
24
  * HTTP method types
27
25
  */
28
- type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
26
+ export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
29
27
  /**
30
28
  * Request options for API calls
31
29
  */
32
- interface RequestOptions {
30
+ export interface RequestOptions {
33
31
  /** HTTP method */
34
32
  method?: HttpMethod;
35
33
  /** Request headers */
@@ -46,7 +44,7 @@ interface RequestOptions {
46
44
  /**
47
45
  * Generic API client with middleware, retry, rate limiting, and circuit breaker support
48
46
  */
49
- declare class ApiClient {
47
+ export declare class ApiClient {
50
48
  private readonly config;
51
49
  private readonly middleware;
52
50
  private readonly rateLimiter?;
@@ -161,5 +159,3 @@ declare class ApiClient {
161
159
  */
162
160
  reset(): void;
163
161
  }
164
-
165
- export { ApiClient, type ApiClientConfig, type HttpMethod, type RequestOptions };
@@ -1,6 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
1
  import {
5
2
  RetryUtility,
6
3
  RateLimiter,
@@ -8,26 +5,26 @@ import {
8
5
  CircuitBreaker
9
6
  } from "./generics";
10
7
  class ApiClient {
8
+ config;
9
+ middleware;
10
+ rateLimiter;
11
+ circuitBreaker;
11
12
  constructor(config = {}) {
12
- __publicField(this, "config");
13
- __publicField(this, "middleware");
14
- __publicField(this, "rateLimiter");
15
- __publicField(this, "circuitBreaker");
16
13
  this.config = {
17
- baseUrl: config.baseUrl || "",
18
- headers: config.headers || {},
19
- timeout: config.timeout || 3e4,
20
- retry: config.retry || {
14
+ baseUrl: config.baseUrl ?? "",
15
+ headers: config.headers ?? {},
16
+ timeout: config.timeout ?? 3e4,
17
+ retry: config.retry ?? {
21
18
  maxAttempts: 3,
22
19
  baseDelay: 1e3,
23
20
  backoffMultiplier: 2,
24
21
  shouldRetry: (error) => error.message.includes("network")
25
22
  },
26
- rateLimit: config.rateLimit || {
23
+ rateLimit: config.rateLimit ?? {
27
24
  requestsPerWindow: 100,
28
25
  windowMs: 6e4
29
26
  },
30
- circuitBreaker: config.circuitBreaker || {
27
+ circuitBreaker: config.circuitBreaker ?? {
31
28
  failureThreshold: 5,
32
29
  recoveryTimeout: 6e4,
33
30
  halfOpenMaxAttempts: 3
@@ -97,7 +94,8 @@ class ApiClient {
97
94
  headers: {
98
95
  "Content-Type": "application/json",
99
96
  ...options.headers
100
- }
97
+ },
98
+ params: data
101
99
  });
102
100
  }
103
101
  /**
@@ -115,7 +113,8 @@ class ApiClient {
115
113
  headers: {
116
114
  "Content-Type": "application/json",
117
115
  ...options.headers
118
- }
116
+ },
117
+ params: data
119
118
  });
120
119
  }
121
120
  /**
@@ -143,7 +142,8 @@ class ApiClient {
143
142
  headers: {
144
143
  "Content-Type": "application/json",
145
144
  ...options.headers
146
- }
145
+ },
146
+ params: data
147
147
  });
148
148
  }
149
149
  /**
@@ -186,10 +186,10 @@ class ApiClient {
186
186
  const controller = new AbortController();
187
187
  const timeoutId = setTimeout(() => {
188
188
  controller.abort();
189
- }, options.timeout || this.config.timeout);
189
+ }, options.timeout ?? this.config.timeout);
190
190
  try {
191
191
  const response = await fetch(url, {
192
- method: options.method || "GET",
192
+ method: options.method ?? "GET",
193
193
  headers: {
194
194
  ...this.config.headers,
195
195
  ...options.headers
@@ -209,7 +209,7 @@ class ApiClient {
209
209
  success: false,
210
210
  error: {
211
211
  code: response.status.toString(),
212
- message: data.message || response.statusText,
212
+ message: data.message ?? response.statusText,
213
213
  details: data
214
214
  }
215
215
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/apiClient.ts"],"sourcesContent":["import type {\n GenericRequest,\n GenericResponse,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n} from \"../types/generics\";\nimport {\n RetryUtility,\n RateLimiter,\n MiddlewarePipeline,\n CircuitBreaker,\n} from \"./generics\";\n\n/**\n * Configuration for the generic API client\n */\nexport interface ApiClientConfig {\n /** Base URL for all requests */\n baseUrl?: string;\n /** Default headers */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Rate limiting configuration */\n rateLimit?: RateLimiterConfig;\n /** Circuit breaker configuration */\n circuitBreaker?: {\n failureThreshold: number;\n recoveryTimeout: number;\n halfOpenMaxAttempts?: number;\n };\n}\n\n/**\n * HTTP method types\n */\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n /** HTTP method */\n method?: HttpMethod;\n /** Request headers */\n headers?: Record<string, string>;\n /** Query parameters */\n params?: Record<string, unknown>;\n /** Request timeout */\n timeout?: number;\n /** Skip retry for this request */\n skipRetry?: boolean;\n /** Skip rate limiting for this request */\n skipRateLimit?: boolean;\n}\n\n/**\n * Generic API client with middleware, retry, rate limiting, and circuit breaker support\n */\nexport class ApiClient {\n private readonly config: Required<ApiClientConfig>;\n private readonly middleware: MiddlewarePipeline;\n private readonly rateLimiter?: RateLimiter;\n private readonly circuitBreaker?: CircuitBreaker;\n\n constructor(config: ApiClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || \"\",\n headers: config.headers || {},\n timeout: config.timeout || 30000,\n retry: config.retry || {\n maxAttempts: 3,\n baseDelay: 1000,\n backoffMultiplier: 2,\n shouldRetry: (error) => error.message.includes(\"network\"),\n },\n rateLimit: config.rateLimit || {\n requestsPerWindow: 100,\n windowMs: 60000,\n },\n circuitBreaker: config.circuitBreaker || {\n failureThreshold: 5,\n recoveryTimeout: 60000,\n halfOpenMaxAttempts: 3,\n },\n };\n\n this.middleware = new MiddlewarePipeline();\n this.rateLimiter = new RateLimiter(this.config.rateLimit);\n this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\n }\n\n /**\n * Add middleware to the request pipeline\n *\n * @param middleware - The middleware function to add to the pipeline\n */\n use(middleware: Middleware): void {\n this.middleware.use(middleware);\n }\n\n /**\n * Make a generic HTTP request\n *\n * @param url - The URL to make the request to\n * @param options - Request options including method, headers, body, etc.\n * @returns Promise resolving to the response data\n */\n async request<TData = unknown>(\n url: string,\n options: RequestOptions = {},\n ): Promise<GenericResponse<TData>> {\n const fullUrl = this.buildUrl(url);\n const requestOptions = this.buildRequestOptions(options);\n\n const request: GenericRequest<{\n url: string;\n options: RequestOptions;\n }> = {\n params: {\n url: fullUrl,\n options: requestOptions,\n },\n options: requestOptions,\n };\n\n // Apply rate limiting\n if (!options.skipRateLimit && this.rateLimiter) {\n await this.rateLimiter.waitForSlot();\n }\n\n // Execute with circuit breaker\n if (this.circuitBreaker) {\n return this.circuitBreaker.execute(() =>\n this.executeRequest<TData>(request),\n );\n }\n\n return this.executeRequest<TData>(request);\n }\n\n /**\n * Make a GET request\n *\n * @param url - The URL to make the GET request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async get<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"GET\" });\n }\n\n /**\n * Make a POST request\n *\n * @param url - The URL to make the POST request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async post<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n }\n\n /**\n * Make a PUT request\n *\n * @param url - The URL to make the PUT request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async put<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n }\n\n /**\n * Make a DELETE request\n *\n * @param url - The URL to make the DELETE request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async delete<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"DELETE\" });\n }\n\n /**\n * Make a PATCH request\n *\n * @param url - The URL to make the PATCH request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async patch<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n }\n\n /**\n * Execute the actual HTTP request with middleware and retry\n *\n * @param request - The generic request object containing URL and options\n * @returns Promise resolving to the generic response with data\n */\n private async executeRequest<TData>(\n request: GenericRequest<{ url: string; options: RequestOptions }>,\n ): Promise<GenericResponse<TData>> {\n const executeWithRetry = async (): Promise<GenericResponse<TData>> => {\n try {\n // Process request through middleware\n const processedRequest = await this.middleware.processRequest(request);\n\n // Make the actual HTTP request\n const response = await this.makeHttpRequest<TData>(\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.url,\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.options,\n );\n\n // Process response through middleware\n const processedResponse =\n await this.middleware.processResponse(response);\n\n return processedResponse;\n } catch (error) {\n // Try to handle error with middleware\n const handledResponse = await this.middleware.handleError<\n typeof request,\n GenericResponse<TData>\n >(error as Error, request);\n\n if (handledResponse) {\n return handledResponse;\n }\n\n throw error;\n }\n };\n\n // Apply retry logic if not skipped\n if (!request.params.options.skipRetry) {\n return RetryUtility.withRetry(executeWithRetry, this.config.retry);\n }\n\n return executeWithRetry();\n }\n\n /**\n * Make the actual HTTP request using fetch API\n *\n * @param url - The URL to make the request to\n * @param options - The request options including method, headers, body, etc.\n * @returns Promise resolving to the generic response with data\n */\n private async makeHttpRequest<TData>(\n url: string,\n options: RequestOptions,\n ): Promise<GenericResponse<TData>> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, options.timeout || this.config.timeout);\n\n try {\n const response = await fetch(url, {\n method: options.method || \"GET\",\n headers: {\n ...this.config.headers,\n ...options.headers,\n },\n signal: controller.signal,\n // Add body for POST/PUT/PATCH requests\n ...(options.method &&\n [\"POST\", \"PUT\", \"PATCH\"].includes(options.method) && {\n body: JSON.stringify(options.params),\n }),\n });\n\n clearTimeout(timeoutId);\n\n const responseData: unknown = await response.json();\n const data = responseData as { message?: string; [key: string]: unknown };\n\n if (!response.ok) {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: response.status.toString(),\n message: data.message || response.statusText,\n details: data,\n },\n };\n }\n\n return {\n data: responseData as TData,\n success: true,\n meta: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n },\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"TIMEOUT\",\n message: \"Request timeout\",\n details: error,\n },\n };\n }\n\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n },\n };\n }\n }\n\n /**\n * Build the full URL\n *\n * @param url - The URL or path to build the full URL from\n * @returns The complete URL string\n */\n private buildUrl(url: string): string {\n if (url.startsWith(\"http\")) {\n return url;\n }\n\n const baseUrl = this.config.baseUrl.endsWith(\"/\")\n ? this.config.baseUrl.slice(0, -1)\n : this.config.baseUrl;\n const path = url.startsWith(\"/\") ? url : `/${url}`;\n\n return `${baseUrl}${path}`;\n }\n\n /**\n * Build request options with defaults\n *\n * @param options - The request options to merge with defaults\n * @returns The merged request options with defaults applied\n */\n private buildRequestOptions(options: RequestOptions): RequestOptions {\n return {\n method: \"GET\",\n headers: {},\n timeout: this.config.timeout,\n ...options,\n };\n }\n\n /**\n * Get client statistics\n *\n * @returns Object containing client statistics and performance metrics\n */\n getStats() {\n return {\n rateLimiter: this.rateLimiter\n ? {\n remaining: this.rateLimiter.getRemainingRequests(),\n resetTime: this.rateLimiter.getResetTime(),\n }\n : null,\n circuitBreaker: this.circuitBreaker\n ? {\n state: this.circuitBreaker.getState(),\n failures: this.circuitBreaker.getFailures(),\n }\n : null,\n middleware: {\n count: this.middleware.getMiddleware().length,\n },\n };\n }\n\n /**\n * Reset client state\n */\n reset(): void {\n this.circuitBreaker?.reset();\n this.middleware.clear();\n }\n}\n"],"mappings":";;;AAOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkDA,MAAM,UAAU;AAAA,EAMrB,YAAY,SAA0B,CAAC,GAAG;AAL1C,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AAGf,SAAK,SAAS;AAAA,MACZ,SAAS,OAAO,WAAW;AAAA,MAC3B,SAAS,OAAO,WAAW,CAAC;AAAA,MAC5B,SAAS,OAAO,WAAW;AAAA,MAC3B,OAAO,OAAO,SAAS;AAAA,QACrB,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,QACnB,aAAa,CAAC,UAAU,MAAM,QAAQ,SAAS,SAAS;AAAA,MAC1D;AAAA,MACA,WAAW,OAAO,aAAa;AAAA,QAC7B,mBAAmB;AAAA,QACnB,UAAU;AAAA,MACZ;AAAA,MACA,gBAAgB,OAAO,kBAAkB;AAAA,QACvC,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,qBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,aAAa,IAAI,mBAAmB;AACzC,SAAK,cAAc,IAAI,YAAY,KAAK,OAAO,SAAS;AACxD,SAAK,iBAAiB,IAAI,eAAe,KAAK,OAAO,cAAc;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,YAA8B;AAChC,SAAK,WAAW,IAAI,UAAU;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QACJ,KACA,UAA0B,CAAC,GACM;AACjC,UAAM,UAAU,KAAK,SAAS,GAAG;AACjC,UAAM,iBAAiB,KAAK,oBAAoB,OAAO;AAEvD,UAAM,UAGD;AAAA,MACH,QAAQ;AAAA,QACN,KAAK;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,IACX;AAGA,QAAI,CAAC,QAAQ,iBAAiB,KAAK,aAAa;AAC9C,YAAM,KAAK,YAAY,YAAY;AAAA,IACrC;AAGA,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,eAAe;AAAA,QAAQ,MACjC,KAAK,eAAsB,OAAO;AAAA,MACpC;AAAA,IACF;AAEA,WAAO,KAAK,eAAsB,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IACJ,KACA,UAA0C,CAAC,GACV;AACjC,WAAO,KAAK,QAAe,KAAK,EAAE,GAAG,SAAS,QAAQ,MAAM,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KACJ,KACA,MACA,UAA0C,CAAC,GACV;AACjC,WAAO,KAAK,QAAe,KAAK;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IACJ,KACA,MACA,UAA0C,CAAC,GACV;AACjC,WAAO,KAAK,QAAe,KAAK;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACJ,KACA,UAA0C,CAAC,GACV;AACjC,WAAO,KAAK,QAAe,KAAK,EAAE,GAAG,SAAS,QAAQ,SAAS,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MACJ,KACA,MACA,UAA0C,CAAC,GACV;AACjC,WAAO,KAAK,QAAe,KAAK;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,eACZ,SACiC;AACjC,UAAM,mBAAmB,YAA6C;AACpE,UAAI;AAEF,cAAM,mBAAmB,MAAM,KAAK,WAAW,eAAe,OAAO;AAGrE,cAAM,WAAW,MAAM,KAAK;AAAA,UAExB,iBAIA,OAAO;AAAA,UAEP,iBAIA,OAAO;AAAA,QACX;AAGA,cAAM,oBACJ,MAAM,KAAK,WAAW,gBAAgB,QAAQ;AAEhD,eAAO;AAAA,MACT,SAAS,OAAO;AAEd,cAAM,kBAAkB,MAAM,KAAK,WAAW,YAG5C,OAAgB,OAAO;AAEzB,YAAI,iBAAiB;AACnB,iBAAO;AAAA,QACT;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,OAAO,QAAQ,WAAW;AACrC,aAAO,aAAa,UAAU,kBAAkB,KAAK,OAAO,KAAK;AAAA,IACnE;AAEA,WAAO,iBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,gBACZ,KACA,SACiC;AACjC,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM;AACjC,iBAAW,MAAM;AAAA,IACnB,GAAG,QAAQ,WAAW,KAAK,OAAO,OAAO;AAEzC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ,QAAQ,UAAU;AAAA,QAC1B,SAAS;AAAA,UACP,GAAG,KAAK,OAAO;AAAA,UACf,GAAG,QAAQ;AAAA,QACb;AAAA,QACA,QAAQ,WAAW;AAAA;AAAA,QAEnB,GAAI,QAAQ,UACV,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,QAAQ,MAAM,KAAK;AAAA,UACnD,MAAM,KAAK,UAAU,QAAQ,MAAM;AAAA,QACrC;AAAA,MACJ,CAAC;AAED,mBAAa,SAAS;AAEtB,YAAM,eAAwB,MAAM,SAAS,KAAK;AAClD,YAAM,OAAO;AAEb,UAAI,CAAC,SAAS,IAAI;AAChB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OAAO;AAAA,YACL,MAAM,SAAS,OAAO,SAAS;AAAA,YAC/B,SAAS,KAAK,WAAW,SAAS;AAAA,YAClC,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,QAAQ,SAAS;AAAA,UACjB,YAAY,SAAS;AAAA,UACrB,SAAS,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,mBAAa,SAAS;AAEtB,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAClD,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAS,KAAqB;AACpC,QAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,OAAO,QAAQ,SAAS,GAAG,IAC5C,KAAK,OAAO,QAAQ,MAAM,GAAG,EAAE,IAC/B,KAAK,OAAO;AAChB,UAAM,OAAO,IAAI,WAAW,GAAG,IAAI,MAAM,IAAI,GAAG;AAEhD,WAAO,GAAG,OAAO,GAAG,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB,SAAyC;AACnE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,SAAS,KAAK,OAAO;AAAA,MACrB,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW;AACT,WAAO;AAAA,MACL,aAAa,KAAK,cACd;AAAA,QACE,WAAW,KAAK,YAAY,qBAAqB;AAAA,QACjD,WAAW,KAAK,YAAY,aAAa;AAAA,MAC3C,IACA;AAAA,MACJ,gBAAgB,KAAK,iBACjB;AAAA,QACE,OAAO,KAAK,eAAe,SAAS;AAAA,QACpC,UAAU,KAAK,eAAe,YAAY;AAAA,MAC5C,IACA;AAAA,MACJ,YAAY;AAAA,QACV,OAAO,KAAK,WAAW,cAAc,EAAE;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,gBAAgB,MAAM;AAC3B,SAAK,WAAW,MAAM;AAAA,EACxB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/core/apiClient.ts"],"sourcesContent":["import type {\n GenericRequest,\n GenericResponse,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n} from \"../types/generics\";\nimport {\n RetryUtility,\n RateLimiter,\n MiddlewarePipeline,\n CircuitBreaker,\n} from \"./generics\";\n\n/**\n * Configuration for the generic API client\n */\nexport interface ApiClientConfig {\n /** Base URL for all requests */\n baseUrl?: string;\n /** Default headers */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Rate limiting configuration */\n rateLimit?: RateLimiterConfig;\n /** Circuit breaker configuration */\n circuitBreaker?: {\n failureThreshold: number;\n recoveryTimeout: number;\n halfOpenMaxAttempts?: number;\n };\n}\n\n/**\n * HTTP method types\n */\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n /** HTTP method */\n method?: HttpMethod;\n /** Request headers */\n headers?: Record<string, string>;\n /** Query parameters */\n params?: Record<string, unknown>;\n /** Request timeout */\n timeout?: number;\n /** Skip retry for this request */\n skipRetry?: boolean;\n /** Skip rate limiting for this request */\n skipRateLimit?: boolean;\n}\n\n/**\n * Generic API client with middleware, retry, rate limiting, and circuit breaker support\n */\nexport class ApiClient {\n private readonly config: Required<ApiClientConfig>;\n private readonly middleware: MiddlewarePipeline;\n private readonly rateLimiter?: RateLimiter;\n private readonly circuitBreaker?: CircuitBreaker;\n\n constructor(config: ApiClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl ?? \"\",\n headers: config.headers ?? {},\n timeout: config.timeout ?? 30000,\n retry: config.retry ?? {\n maxAttempts: 3,\n baseDelay: 1000,\n backoffMultiplier: 2,\n shouldRetry: (error) => error.message.includes(\"network\"),\n },\n rateLimit: config.rateLimit ?? {\n requestsPerWindow: 100,\n windowMs: 60000,\n },\n circuitBreaker: config.circuitBreaker ?? {\n failureThreshold: 5,\n recoveryTimeout: 60000,\n halfOpenMaxAttempts: 3,\n },\n };\n\n this.middleware = new MiddlewarePipeline();\n this.rateLimiter = new RateLimiter(this.config.rateLimit);\n this.circuitBreaker = new CircuitBreaker(this.config.circuitBreaker);\n }\n\n /**\n * Add middleware to the request pipeline\n *\n * @param middleware - The middleware function to add to the pipeline\n */\n use(middleware: Middleware): void {\n this.middleware.use(middleware);\n }\n\n /**\n * Make a generic HTTP request\n *\n * @param url - The URL to make the request to\n * @param options - Request options including method, headers, body, etc.\n * @returns Promise resolving to the response data\n */\n async request<TData = unknown>(\n url: string,\n options: RequestOptions = {},\n ): Promise<GenericResponse<TData>> {\n const fullUrl = this.buildUrl(url);\n const requestOptions = this.buildRequestOptions(options);\n\n const request: GenericRequest<{\n url: string;\n options: RequestOptions;\n }> = {\n params: {\n url: fullUrl,\n options: requestOptions,\n },\n options: requestOptions,\n };\n\n // Apply rate limiting\n if (!options.skipRateLimit && this.rateLimiter) {\n await this.rateLimiter.waitForSlot();\n }\n\n // Execute with circuit breaker\n if (this.circuitBreaker) {\n return this.circuitBreaker.execute(() =>\n this.executeRequest<TData>(request),\n );\n }\n\n return this.executeRequest<TData>(request);\n }\n\n /**\n * Make a GET request\n *\n * @param url - The URL to make the GET request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async get<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"GET\" });\n }\n\n /**\n * Make a POST request\n *\n * @param url - The URL to make the POST request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async post<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n params: data as Record<string, unknown>,\n });\n }\n\n /**\n * Make a PUT request\n *\n * @param url - The URL to make the PUT request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async put<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n params: data as Record<string, unknown>,\n });\n }\n\n /**\n * Make a DELETE request\n *\n * @param url - The URL to make the DELETE request to\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async delete<TData = unknown>(\n url: string,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, { ...options, method: \"DELETE\" });\n }\n\n /**\n * Make a PATCH request\n *\n * @param url - The URL to make the PATCH request to\n * @param data - The data to send in the request body\n * @param options - Request options (excluding method)\n * @returns Promise resolving to the response data\n */\n async patch<TData = unknown>(\n url: string,\n data?: unknown,\n options: Omit<RequestOptions, \"method\"> = {},\n ): Promise<GenericResponse<TData>> {\n return this.request<TData>(url, {\n ...options,\n method: \"PATCH\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n params: data as Record<string, unknown>,\n });\n }\n\n /**\n * Execute the actual HTTP request with middleware and retry\n *\n * @param request - The generic request object containing URL and options\n * @returns Promise resolving to the generic response with data\n */\n private async executeRequest<TData>(\n request: GenericRequest<{ url: string; options: RequestOptions }>,\n ): Promise<GenericResponse<TData>> {\n const executeWithRetry = async (): Promise<GenericResponse<TData>> => {\n try {\n // Process request through middleware\n const processedRequest = await this.middleware.processRequest(request);\n\n // Make the actual HTTP request\n const response = await this.makeHttpRequest<TData>(\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.url,\n (\n processedRequest as GenericRequest<{\n url: string;\n options: RequestOptions;\n }>\n ).params.options,\n );\n\n // Process response through middleware\n const processedResponse =\n await this.middleware.processResponse(response);\n\n return processedResponse;\n } catch (error) {\n // Try to handle error with middleware\n const handledResponse = await this.middleware.handleError<\n typeof request,\n GenericResponse<TData>\n >(error as Error, request);\n\n if (handledResponse) {\n return handledResponse;\n }\n\n throw error;\n }\n };\n\n // Apply retry logic if not skipped\n if (!request.params.options.skipRetry) {\n return RetryUtility.withRetry(executeWithRetry, this.config.retry);\n }\n\n return executeWithRetry();\n }\n\n /**\n * Make the actual HTTP request using fetch API\n *\n * @param url - The URL to make the request to\n * @param options - The request options including method, headers, body, etc.\n * @returns Promise resolving to the generic response with data\n */\n private async makeHttpRequest<TData>(\n url: string,\n options: RequestOptions,\n ): Promise<GenericResponse<TData>> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, options.timeout ?? this.config.timeout);\n\n try {\n const response = await fetch(url, {\n method: options.method ?? \"GET\",\n headers: {\n ...this.config.headers,\n ...options.headers,\n },\n signal: controller.signal,\n // Add body for POST/PUT/PATCH requests\n ...(options.method &&\n [\"POST\", \"PUT\", \"PATCH\"].includes(options.method) && {\n body: JSON.stringify(options.params),\n }),\n });\n\n clearTimeout(timeoutId);\n\n const responseData: unknown = await response.json();\n const data = responseData as { message?: string; [key: string]: unknown };\n\n if (!response.ok) {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: response.status.toString(),\n message: data.message ?? response.statusText,\n details: data,\n },\n };\n }\n\n return {\n data: responseData as TData,\n success: true,\n meta: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n },\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === \"AbortError\") {\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"TIMEOUT\",\n message: \"Request timeout\",\n details: error,\n },\n };\n }\n\n return {\n data: null as unknown as TData,\n success: false,\n error: {\n code: \"NETWORK_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n },\n };\n }\n }\n\n /**\n * Build the full URL\n *\n * @param url - The URL or path to build the full URL from\n * @returns The complete URL string\n */\n private buildUrl(url: string): string {\n if (url.startsWith(\"http\")) {\n return url;\n }\n\n const baseUrl = this.config.baseUrl.endsWith(\"/\")\n ? this.config.baseUrl.slice(0, -1)\n : this.config.baseUrl;\n const path = url.startsWith(\"/\") ? url : `/${url}`;\n\n return `${baseUrl}${path}`;\n }\n\n /**\n * Build request options with defaults\n *\n * @param options - The request options to merge with defaults\n * @returns The merged request options with defaults applied\n */\n private buildRequestOptions(options: RequestOptions): RequestOptions {\n return {\n method: \"GET\",\n headers: {},\n timeout: this.config.timeout,\n ...options,\n };\n }\n\n /**\n * Get client statistics\n *\n * @returns Object containing client statistics and performance metrics\n */\n getStats() {\n return {\n rateLimiter: this.rateLimiter\n ? {\n remaining: this.rateLimiter.getRemainingRequests(),\n resetTime: this.rateLimiter.getResetTime(),\n }\n : null,\n circuitBreaker: this.circuitBreaker\n ? {\n state: this.circuitBreaker.getState(),\n failures: this.circuitBreaker.getFailures(),\n }\n : null,\n middleware: {\n count: this.middleware.getMiddleware().length,\n },\n };\n }\n\n /**\n * Reset client state\n */\n reset(): void {\n this.circuitBreaker?.reset();\n this.middleware.clear();\n }\n}\n"],"mappings":"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","names":[]}
@@ -27,27 +27,27 @@ module.exports = __toCommonJS(client_exports);
27
27
  var import_viem = require("viem");
28
28
  var import_chains = require("../config/chains");
29
29
  const defaultFromBlocks = {
30
- 14800: BigInt(732312),
30
+ 14800: 732312n,
31
31
  // Moksha Testnet - earliest contract deployment
32
- 1480: BigInt(758584)
32
+ 1480: 758584n
33
33
  // Vana Mainnet - earliest contract deployment
34
34
  };
35
35
  function getDefaultFromBlock(chainId) {
36
- return defaultFromBlocks[chainId] || BigInt(0);
36
+ return defaultFromBlocks[chainId] || 0n;
37
37
  }
38
- let _client;
38
+ let cachedClient;
39
39
  const createClient = (chainId = import_chains.mokshaTestnet.id) => {
40
- if (!_client || _client.chain?.id !== chainId) {
40
+ if (!cachedClient || cachedClient.chain?.id !== chainId) {
41
41
  const chain = import_chains.chains[chainId];
42
42
  if (!chain) {
43
43
  throw new Error(`Chain ${chainId} not found`);
44
44
  }
45
- _client = (0, import_viem.createPublicClient)({
45
+ cachedClient = (0, import_viem.createPublicClient)({
46
46
  chain,
47
47
  transport: (0, import_viem.http)()
48
48
  });
49
49
  }
50
- return _client;
50
+ return cachedClient;
51
51
  };
52
52
  const createWalletClient = (chainId = import_chains.mokshaTestnet.id, account) => {
53
53
  const chain = import_chains.chains[chainId];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/client.ts"],"sourcesContent":["import {\n Chain,\n createPublicClient,\n http,\n Account,\n createWalletClient as viemCreateWalletClient,\n PublicClient,\n WalletClient,\n} from \"viem\";\nimport { chains, mokshaTestnet } from \"../config/chains\";\n\n/**\n * Default starting block numbers for querying blockchain events and data per chain.\n *\n * @remarks\n * These block numbers represent the earliest deployment of Vana protocol contracts\n * on each network. Using these as starting points for event queries significantly\n * improves performance by avoiding unnecessary queries of blocks before the\n * protocol existed.\n *\n * - Moksha Testnet (14800): Block 732312 - DataRegistry deployment\n * - Vana Mainnet (1480): Block 758584 - DataRegistry deployment\n *\n * @category Blockchain\n */\nexport const defaultFromBlocks: Record<number, bigint> = {\n 14800: BigInt(732312), // Moksha Testnet - earliest contract deployment\n 1480: BigInt(758584), // Vana Mainnet - earliest contract deployment\n};\n\n/**\n * Gets the default starting block for a specific chain.\n *\n * @param chainId - The chain ID to get the default from block for\n * @returns The default starting block for the chain, or 0n if not configured\n * @category Blockchain\n */\nexport function getDefaultFromBlock(chainId: number): bigint {\n return defaultFromBlocks[chainId] || BigInt(0);\n}\n\n// Cache for clients\nlet _client: PublicClient & { chain: Chain };\n\n/**\n * Creates or retrieves a cached public client for blockchain read operations.\n *\n * @remarks\n * This function provides an optimized way to access blockchain data by maintaining\n * a cached client instance per chain. The client is used for reading contract state,\n * querying events, and other read-only blockchain operations. It automatically\n * handles HTTP transport configuration and chain switching.\n *\n * @param chainId - The chain ID to connect to (defaults to Moksha testnet)\n * @returns A public client configured for the specified chain with caching optimization\n * @throws {Error} When the specified chain ID is not supported by the SDK\n * @example\n * ```typescript\n * // Get client for default chain (Moksha testnet)\n * const client = createClient();\n *\n * // Get client for specific chain\n * const mainnetClient = createClient(14800);\n *\n * // Use client for blockchain reads\n * const blockNumber = await client.getBlockNumber();\n * ```\n * @category Blockchain\n */\nexport const createClient = (\n chainId: keyof typeof chains = mokshaTestnet.id,\n): PublicClient & { chain: Chain } => {\n if (!_client || _client.chain?.id !== chainId) {\n const chain = chains[chainId];\n if (!chain) {\n throw new Error(`Chain ${chainId} not found`);\n }\n\n _client = createPublicClient({\n chain,\n transport: http(),\n });\n }\n\n return _client;\n};\n\n/**\n * Creates a wallet client for blockchain transaction signing and submission.\n *\n * @remarks\n * This function creates a wallet client configured for transaction signing and\n * submission on the specified chain. Unlike the public client, wallet clients\n * are not cached and require an account for transaction signing. The client\n * handles HTTP transport configuration and provides access to wallet-specific\n * operations like signing transactions and messages.\n *\n * @param chainId - The chain ID to connect to (defaults to Moksha testnet)\n * @param account - Optional account for transaction signing (can be set later)\n * @returns A wallet client configured for the specified chain\n * @throws {Error} When the specified chain ID is not supported by the SDK\n * @example\n * ```typescript\n * import { privateKeyToAccount } from 'viem/accounts';\n *\n * // Create wallet client for default chain\n * const account = privateKeyToAccount('0x...');\n * const walletClient = createWalletClient(mokshaTestnet.id, account);\n *\n * // Use for transaction signing\n * const txHash = await walletClient.writeContract({\n * address: contractAddress,\n * abi: contractAbi,\n * functionName: 'someFunction',\n * args: []\n * });\n *\n * // Create without account (account can be set later)\n * const client = createWalletClient();\n * ```\n * @category Blockchain\n */\nexport const createWalletClient = (\n chainId: keyof typeof chains = mokshaTestnet.id,\n account?: Account,\n): WalletClient => {\n const chain = chains[chainId];\n if (!chain) {\n throw new Error(`Chain ${chainId} not found`);\n }\n\n return viemCreateWalletClient({\n chain,\n transport: http(),\n account,\n });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAQO;AACP,oBAAsC;AAgB/B,MAAM,oBAA4C;AAAA,EACvD,OAAO,OAAO,MAAM;AAAA;AAAA,EACpB,MAAM,OAAO,MAAM;AAAA;AACrB;AASO,SAAS,oBAAoB,SAAyB;AAC3D,SAAO,kBAAkB,OAAO,KAAK,OAAO,CAAC;AAC/C;AAGA,IAAI;AA2BG,MAAM,eAAe,CAC1B,UAA+B,4BAAc,OACT;AACpC,MAAI,CAAC,WAAW,QAAQ,OAAO,OAAO,SAAS;AAC7C,UAAM,QAAQ,qBAAO,OAAO;AAC5B,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,IAC9C;AAEA,kBAAU,gCAAmB;AAAA,MAC3B;AAAA,MACA,eAAW,kBAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAqCO,MAAM,qBAAqB,CAChC,UAA+B,4BAAc,IAC7C,YACiB;AACjB,QAAM,QAAQ,qBAAO,OAAO;AAC5B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,EAC9C;AAEA,aAAO,YAAAA,oBAAuB;AAAA,IAC5B;AAAA,IACA,eAAW,kBAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACH;","names":["viemCreateWalletClient"]}
1
+ {"version":3,"sources":["../../src/core/client.ts"],"sourcesContent":["import type { Chain, Account, PublicClient, WalletClient } from \"viem\";\nimport {\n createPublicClient,\n http,\n createWalletClient as viemCreateWalletClient,\n} from \"viem\";\nimport { chains, mokshaTestnet } from \"../config/chains\";\n\n/**\n * Default starting block numbers for querying blockchain events and data per chain.\n *\n * @remarks\n * These block numbers represent the earliest deployment of Vana protocol contracts\n * on each network. Using these as starting points for event queries significantly\n * improves performance by avoiding unnecessary queries of blocks before the\n * protocol existed.\n *\n * - Moksha Testnet (14800): Block 732312 - DataRegistry deployment\n * - Vana Mainnet (1480): Block 758584 - DataRegistry deployment\n *\n * @category Blockchain\n */\nexport const defaultFromBlocks: Record<number, bigint> = {\n 14800: 732312n, // Moksha Testnet - earliest contract deployment\n 1480: 758584n, // Vana Mainnet - earliest contract deployment\n};\n\n/**\n * Gets the default starting block for a specific chain.\n *\n * @param chainId - The chain ID to get the default from block for\n * @returns The default starting block for the chain, or 0n if not configured\n * @category Blockchain\n */\nexport function getDefaultFromBlock(chainId: number): bigint {\n return defaultFromBlocks[chainId] || 0n;\n}\n\n// Cache for clients\nlet cachedClient: PublicClient & { chain: Chain };\n\n/**\n * Creates or retrieves a cached public client for blockchain read operations.\n *\n * @remarks\n * This function provides an optimized way to access blockchain data by maintaining\n * a cached client instance per chain. The client is used for reading contract state,\n * querying events, and other read-only blockchain operations. It automatically\n * handles HTTP transport configuration and chain switching.\n *\n * @param chainId - The chain ID to connect to (defaults to Moksha testnet)\n * @returns A public client configured for the specified chain with caching optimization\n * @throws {Error} When the specified chain ID is not supported by the SDK\n * @example\n * ```typescript\n * // Get client for default chain (Moksha testnet)\n * const client = createClient();\n *\n * // Get client for specific chain\n * const mainnetClient = createClient(14800);\n *\n * // Use client for blockchain reads\n * const blockNumber = await client.getBlockNumber();\n * ```\n * @category Blockchain\n */\nexport const createClient = (\n chainId: keyof typeof chains = mokshaTestnet.id,\n): PublicClient & { chain: Chain } => {\n if (!cachedClient || cachedClient.chain?.id !== chainId) {\n const chain = chains[chainId];\n if (!chain) {\n throw new Error(`Chain ${chainId} not found`);\n }\n\n cachedClient = createPublicClient({\n chain,\n transport: http(),\n });\n }\n\n return cachedClient;\n};\n\n/**\n * Creates a wallet client for blockchain transaction signing and submission.\n *\n * @remarks\n * This function creates a wallet client configured for transaction signing and\n * submission on the specified chain. Unlike the public client, wallet clients\n * are not cached and require an account for transaction signing. The client\n * handles HTTP transport configuration and provides access to wallet-specific\n * operations like signing transactions and messages.\n *\n * @param chainId - The chain ID to connect to (defaults to Moksha testnet)\n * @param account - Optional account for transaction signing (can be set later)\n * @returns A wallet client configured for the specified chain\n * @throws {Error} When the specified chain ID is not supported by the SDK\n * @example\n * ```typescript\n * import { privateKeyToAccount } from 'viem/accounts';\n *\n * // Create wallet client for default chain\n * const account = privateKeyToAccount('0x...');\n * const walletClient = createWalletClient(mokshaTestnet.id, account);\n *\n * // Use for transaction signing\n * const txHash = await walletClient.writeContract({\n * address: contractAddress,\n * abi: contractAbi,\n * functionName: 'someFunction',\n * args: []\n * });\n *\n * // Create without account (account can be set later)\n * const client = createWalletClient();\n * ```\n * @category Blockchain\n */\nexport const createWalletClient = (\n chainId: keyof typeof chains = mokshaTestnet.id,\n account?: Account,\n): WalletClient => {\n const chain = chains[chainId];\n if (!chain) {\n throw new Error(`Chain ${chainId} not found`);\n }\n\n return viemCreateWalletClient({\n chain,\n transport: http(),\n account,\n });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAIO;AACP,oBAAsC;AAgB/B,MAAM,oBAA4C;AAAA,EACvD,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AACR;AASO,SAAS,oBAAoB,SAAyB;AAC3D,SAAO,kBAAkB,OAAO,KAAK;AACvC;AAGA,IAAI;AA2BG,MAAM,eAAe,CAC1B,UAA+B,4BAAc,OACT;AACpC,MAAI,CAAC,gBAAgB,aAAa,OAAO,OAAO,SAAS;AACvD,UAAM,QAAQ,qBAAO,OAAO;AAC5B,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,IAC9C;AAEA,uBAAe,gCAAmB;AAAA,MAChC;AAAA,MACA,eAAW,kBAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAqCO,MAAM,qBAAqB,CAChC,UAA+B,4BAAc,IAC7C,YACiB;AACjB,QAAM,QAAQ,qBAAO,OAAO;AAC5B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,EAC9C;AAEA,aAAO,YAAAA,oBAAuB;AAAA,IAC5B;AAAA,IACA,eAAW,kBAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACH;","names":["viemCreateWalletClient"]}
@@ -1,6 +1,5 @@
1
- import { PublicClient, Chain, Account, WalletClient } from 'viem';
2
- import { chains } from '../config/chains.js';
3
-
1
+ import type { Chain, Account, PublicClient, WalletClient } from "viem";
2
+ import { chains } from "../config/chains";
4
3
  /**
5
4
  * Default starting block numbers for querying blockchain events and data per chain.
6
5
  *
@@ -15,7 +14,7 @@ import { chains } from '../config/chains.js';
15
14
  *
16
15
  * @category Blockchain
17
16
  */
18
- declare const defaultFromBlocks: Record<number, bigint>;
17
+ export declare const defaultFromBlocks: Record<number, bigint>;
19
18
  /**
20
19
  * Gets the default starting block for a specific chain.
21
20
  *
@@ -23,7 +22,7 @@ declare const defaultFromBlocks: Record<number, bigint>;
23
22
  * @returns The default starting block for the chain, or 0n if not configured
24
23
  * @category Blockchain
25
24
  */
26
- declare function getDefaultFromBlock(chainId: number): bigint;
25
+ export declare function getDefaultFromBlock(chainId: number): bigint;
27
26
  /**
28
27
  * Creates or retrieves a cached public client for blockchain read operations.
29
28
  *
@@ -49,7 +48,7 @@ declare function getDefaultFromBlock(chainId: number): bigint;
49
48
  * ```
50
49
  * @category Blockchain
51
50
  */
52
- declare const createClient: (chainId?: keyof typeof chains) => PublicClient & {
51
+ export declare const createClient: (chainId?: keyof typeof chains) => PublicClient & {
53
52
  chain: Chain;
54
53
  };
55
54
  /**
@@ -87,6 +86,4 @@ declare const createClient: (chainId?: keyof typeof chains) => PublicClient & {
87
86
  * ```
88
87
  * @category Blockchain
89
88
  */
90
- declare const createWalletClient: (chainId?: keyof typeof chains, account?: Account) => WalletClient;
91
-
92
- export { createClient, createWalletClient, defaultFromBlocks, getDefaultFromBlock };
89
+ export declare const createWalletClient: (chainId?: keyof typeof chains, account?: Account) => WalletClient;