@opendatalabs/vana-sdk 0.1.0-alpha.eebb656 → 0.1.0-alpha.ef15099
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.
- package/README.md +67 -351
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +33 -1
- package/dist/browser.js.map +1 -1
- package/dist/chains/definitions.cjs +9 -6
- package/dist/chains/definitions.cjs.map +1 -1
- package/dist/chains/definitions.d.ts +2 -0
- package/dist/chains/definitions.js +9 -6
- package/dist/chains/definitions.js.map +1 -1
- package/dist/chains/index.cjs.map +1 -1
- package/dist/chains/index.d.ts +30 -1
- package/dist/chains/index.js.map +1 -1
- package/dist/client/enhancedResponse.cjs +164 -0
- package/dist/client/enhancedResponse.cjs.map +1 -0
- package/dist/client/enhancedResponse.d.ts +120 -0
- package/dist/client/enhancedResponse.js +138 -0
- package/dist/client/enhancedResponse.js.map +1 -0
- package/dist/config/chains.cjs.map +1 -1
- package/dist/config/chains.d.ts +99 -0
- package/dist/config/chains.js.map +1 -1
- package/dist/config/contracts.config.cjs +400 -0
- package/dist/config/contracts.config.cjs.map +1 -0
- package/dist/config/contracts.config.d.ts +84 -0
- package/dist/config/contracts.config.js +375 -0
- package/dist/config/contracts.config.js.map +1 -0
- package/dist/config/default-services.cjs +60 -0
- package/dist/config/default-services.cjs.map +1 -0
- package/dist/config/default-services.d.ts +46 -0
- package/dist/config/default-services.js +33 -0
- package/dist/config/default-services.js.map +1 -0
- package/dist/config/default-services.test.d.ts +1 -0
- package/dist/contracts/contractController.cjs +1 -1
- package/dist/contracts/contractController.cjs.map +1 -1
- package/dist/contracts/contractController.d.ts +66 -10
- package/dist/contracts/contractController.js +1 -1
- package/dist/contracts/contractController.js.map +1 -1
- package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +7 -0
- package/dist/controllers/__tests__/operations.processQueue.test.d.ts +1 -0
- package/dist/controllers/accessSettlement.cjs +289 -0
- package/dist/controllers/accessSettlement.cjs.map +1 -0
- package/dist/controllers/accessSettlement.d.ts +157 -0
- package/dist/controllers/accessSettlement.js +265 -0
- package/dist/controllers/accessSettlement.js.map +1 -0
- package/dist/controllers/accessSettlement.test.d.ts +1 -0
- package/dist/controllers/base.cjs +116 -0
- package/dist/controllers/base.cjs.map +1 -0
- package/dist/controllers/base.d.ts +94 -0
- package/dist/controllers/base.js +92 -0
- package/dist/controllers/base.js.map +1 -0
- package/dist/controllers/data.cjs +634 -352
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +348 -213
- package/dist/controllers/data.js +647 -355
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/operations.cjs +430 -0
- package/dist/controllers/operations.cjs.map +1 -0
- package/dist/controllers/operations.d.ts +229 -0
- package/dist/controllers/operations.js +406 -0
- package/dist/controllers/operations.js.map +1 -0
- package/dist/controllers/permissions.cjs +943 -443
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +201 -120
- package/dist/controllers/permissions.js +943 -443
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/controllers/protocol.cjs +14 -10
- package/dist/controllers/protocol.cjs.map +1 -1
- package/dist/controllers/protocol.d.ts +30 -31
- package/dist/controllers/protocol.js +14 -10
- package/dist/controllers/protocol.js.map +1 -1
- package/dist/controllers/runtimePermissions.cjs +272 -0
- package/dist/controllers/runtimePermissions.cjs.map +1 -0
- package/dist/controllers/runtimePermissions.d.ts +152 -0
- package/dist/controllers/runtimePermissions.js +251 -0
- package/dist/controllers/runtimePermissions.js.map +1 -0
- package/dist/controllers/runtimePermissions.test.d.ts +1 -0
- package/dist/controllers/schemas.cjs +113 -43
- package/dist/controllers/schemas.cjs.map +1 -1
- package/dist/controllers/schemas.d.ts +90 -43
- package/dist/controllers/schemas.js +113 -43
- package/dist/controllers/schemas.js.map +1 -1
- package/dist/controllers/server.cjs +276 -60
- package/dist/controllers/server.cjs.map +1 -1
- package/dist/controllers/server.d.ts +159 -54
- package/dist/controllers/server.js +276 -60
- package/dist/controllers/server.js.map +1 -1
- package/dist/core/__tests__/health.test.d.ts +1 -0
- package/dist/core/__tests__/inMemoryNonceManager.test.d.ts +1 -0
- package/dist/core/__tests__/nonceManager.test.d.ts +1 -0
- package/dist/core/__tests__/pollingManager.test.d.ts +4 -0
- package/dist/core/apiClient.cjs +53 -3
- package/dist/core/apiClient.cjs.map +1 -1
- package/dist/core/apiClient.d.ts +132 -7
- package/dist/core/apiClient.js +53 -3
- package/dist/core/apiClient.js.map +1 -1
- package/dist/core/generics.cjs +30 -3
- package/dist/core/generics.cjs.map +1 -1
- package/dist/core/generics.d.ts +95 -6
- package/dist/core/generics.js +30 -3
- package/dist/core/generics.js.map +1 -1
- package/dist/core/health.cjs +289 -0
- package/dist/core/health.cjs.map +1 -0
- package/dist/core/health.d.ts +143 -0
- package/dist/core/health.js +265 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/inMemoryNonceManager.cjs +138 -0
- package/dist/core/inMemoryNonceManager.cjs.map +1 -0
- package/dist/core/inMemoryNonceManager.d.ts +69 -0
- package/dist/core/inMemoryNonceManager.js +114 -0
- package/dist/core/inMemoryNonceManager.js.map +1 -0
- package/dist/core/nonceManager.cjs +304 -0
- package/dist/core/nonceManager.cjs.map +1 -0
- package/dist/core/nonceManager.d.ts +116 -0
- package/dist/core/nonceManager.js +280 -0
- package/dist/core/nonceManager.js.map +1 -0
- package/dist/core/pollingManager.cjs +292 -0
- package/dist/core/pollingManager.cjs.map +1 -0
- package/dist/core/pollingManager.d.ts +120 -0
- package/dist/core/pollingManager.js +268 -0
- package/dist/core/pollingManager.js.map +1 -0
- package/dist/core.cjs +164 -36
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +69 -10
- package/dist/core.js +167 -37
- package/dist/core.js.map +1 -1
- package/dist/crypto/ecies/__tests__/constants.test.d.ts +1 -1
- package/dist/crypto/ecies/__tests__/interface.test.d.ts +1 -0
- package/dist/crypto/ecies/__tests__/serialization.test.d.ts +8 -0
- package/dist/crypto/ecies/__tests__/utils.test.d.ts +1 -0
- package/dist/crypto/ecies/base.cjs +59 -23
- package/dist/crypto/ecies/base.cjs.map +1 -1
- package/dist/crypto/ecies/base.js +59 -23
- package/dist/crypto/ecies/base.js.map +1 -1
- package/dist/crypto/ecies/constants.cjs +2 -10
- package/dist/crypto/ecies/constants.cjs.map +1 -1
- package/dist/crypto/ecies/constants.d.ts +0 -9
- package/dist/crypto/ecies/constants.js +1 -8
- package/dist/crypto/ecies/constants.js.map +1 -1
- package/dist/crypto/ecies/interface.cjs +19 -2
- package/dist/crypto/ecies/interface.cjs.map +1 -1
- package/dist/crypto/ecies/interface.js +19 -2
- package/dist/crypto/ecies/interface.js.map +1 -1
- package/dist/errors.cjs +45 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +104 -0
- package/dist/errors.js +43 -0
- package/dist/errors.js.map +1 -1
- package/dist/generated/abi/AccessSettlementImplementation.cjs +635 -0
- package/dist/generated/abi/AccessSettlementImplementation.cjs.map +1 -0
- package/dist/generated/abi/AccessSettlementImplementation.d.ts +468 -0
- package/dist/generated/abi/AccessSettlementImplementation.js +611 -0
- package/dist/generated/abi/AccessSettlementImplementation.js.map +1 -0
- package/dist/generated/abi/AttestationPolicyImplementation.cjs +614 -0
- package/dist/generated/abi/AttestationPolicyImplementation.cjs.map +1 -0
- package/dist/generated/abi/AttestationPolicyImplementation.d.ts +449 -0
- package/dist/generated/abi/AttestationPolicyImplementation.js +590 -0
- package/dist/generated/abi/AttestationPolicyImplementation.js.map +1 -0
- package/dist/generated/abi/ComputeEngineImplementation.cjs.map +1 -1
- package/dist/generated/abi/ComputeEngineImplementation.js.map +1 -1
- package/dist/generated/abi/{DLPTreasuryImplementation.cjs → ComputeEngineTreasuryImplementation.cjs} +16 -92
- package/dist/generated/abi/ComputeEngineTreasuryImplementation.cjs.map +1 -0
- package/dist/generated/abi/{DLPTreasuryImplementation.d.ts → ComputeEngineTreasuryImplementation.d.ts} +9 -67
- package/dist/generated/abi/{DLPTreasuryImplementation.js → ComputeEngineTreasuryImplementation.js} +12 -88
- package/dist/generated/abi/ComputeEngineTreasuryImplementation.js.map +1 -0
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/DATFactoryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DATFactoryImplementation.js.map +1 -1
- package/dist/generated/abi/DATImplementation.cjs.map +1 -1
- package/dist/generated/abi/DATImplementation.js.map +1 -1
- package/dist/generated/abi/DATPausableImplementation.cjs.map +1 -1
- package/dist/generated/abi/DATPausableImplementation.js.map +1 -1
- package/dist/generated/abi/DATVotesImplementation.cjs.map +1 -1
- package/dist/generated/abi/DATVotesImplementation.js.map +1 -1
- package/dist/generated/abi/DLPPerformanceImplementation.cjs +42 -0
- package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPPerformanceImplementation.d.ts +32 -0
- package/dist/generated/abi/DLPPerformanceImplementation.js +42 -0
- package/dist/generated/abi/DLPPerformanceImplementation.js.map +1 -1
- package/dist/generated/abi/DLPRegistryImplementation.cjs +5 -5
- package/dist/generated/abi/DLPRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPRegistryImplementation.d.ts +4 -4
- package/dist/generated/abi/DLPRegistryImplementation.js +5 -5
- package/dist/generated/abi/DLPRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.js.map +1 -1
- package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +166 -2
- package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +129 -2
- package/dist/generated/abi/DLPRewardDeployerImplementation.js +166 -2
- package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +1 -1
- package/dist/generated/abi/DLPRewardSwapImplementation.cjs.map +1 -1
- package/dist/generated/abi/DLPRewardSwapImplementation.js.map +1 -1
- package/dist/generated/abi/DataLiquidityPoolImplementation.cjs +282 -100
- package/dist/generated/abi/DataLiquidityPoolImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +218 -79
- package/dist/generated/abi/DataLiquidityPoolImplementation.js +281 -99
- package/dist/generated/abi/DataLiquidityPoolImplementation.js.map +1 -1
- package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs +167 -19
- package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +127 -14
- package/dist/generated/abi/DataPortabilityGranteesImplementation.js +167 -19
- package/dist/generated/abi/DataPortabilityGranteesImplementation.js.map +1 -1
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs +0 -19
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +0 -14
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.js +0 -19
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.js.map +1 -1
- package/dist/generated/abi/DataPortabilityServersImplementation.cjs +0 -19
- package/dist/generated/abi/DataPortabilityServersImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +0 -14
- package/dist/generated/abi/DataPortabilityServersImplementation.js +0 -19
- package/dist/generated/abi/DataPortabilityServersImplementation.js.map +1 -1
- package/dist/generated/abi/DataRefinerRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataRefinerRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.cjs +0 -13
- package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.d.ts +0 -10
- package/dist/generated/abi/DataRegistryImplementation.js +0 -13
- package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/DatasetRegistryImplementation.cjs +751 -0
- package/dist/generated/abi/DatasetRegistryImplementation.cjs.map +1 -0
- package/dist/generated/abi/DatasetRegistryImplementation.d.ts +557 -0
- package/dist/generated/abi/DatasetRegistryImplementation.js +727 -0
- package/dist/generated/abi/DatasetRegistryImplementation.js.map +1 -0
- package/dist/generated/abi/ProtocolConfigImplementation.cjs +578 -0
- package/dist/generated/abi/ProtocolConfigImplementation.cjs.map +1 -0
- package/dist/generated/abi/ProtocolConfigImplementation.d.ts +423 -0
- package/dist/generated/abi/ProtocolConfigImplementation.js +554 -0
- package/dist/generated/abi/ProtocolConfigImplementation.js.map +1 -0
- package/dist/generated/abi/QueryEngineImplementation.cjs.map +1 -1
- package/dist/generated/abi/QueryEngineImplementation.js.map +1 -1
- package/dist/generated/abi/SwapHelperImplementation.cjs +0 -43
- package/dist/generated/abi/SwapHelperImplementation.cjs.map +1 -1
- package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -35
- package/dist/generated/abi/SwapHelperImplementation.js +0 -43
- package/dist/generated/abi/SwapHelperImplementation.js.map +1 -1
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.cjs.map +1 -1
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.js.map +1 -1
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.cjs.map +1 -1
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.js.map +1 -1
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.cjs.map +1 -1
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.js.map +1 -1
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.cjs.map +1 -1
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.js.map +1 -1
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.cjs.map +1 -1
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.js.map +1 -1
- package/dist/generated/abi/TeePoolPhalaImplementation.cjs.map +1 -1
- package/dist/generated/abi/TeePoolPhalaImplementation.js.map +1 -1
- package/dist/generated/abi/UniswapV3NonfungiblePositionManagerImplementation.cjs +1251 -0
- package/dist/generated/abi/UniswapV3NonfungiblePositionManagerImplementation.cjs.map +1 -0
- package/dist/generated/abi/UniswapV3NonfungiblePositionManagerImplementation.d.ts +948 -0
- package/dist/generated/abi/UniswapV3NonfungiblePositionManagerImplementation.js +1227 -0
- package/dist/generated/abi/UniswapV3NonfungiblePositionManagerImplementation.js.map +1 -0
- package/dist/generated/abi/UniswapV3QuoterV2Implementation.cjs +297 -0
- package/dist/generated/abi/UniswapV3QuoterV2Implementation.cjs.map +1 -0
- package/dist/generated/abi/UniswapV3QuoterV2Implementation.d.ts +206 -0
- package/dist/generated/abi/UniswapV3QuoterV2Implementation.js +273 -0
- package/dist/generated/abi/UniswapV3QuoterV2Implementation.js.map +1 -0
- package/dist/generated/abi/VanaEpochImplementation.cjs +195 -0
- package/dist/generated/abi/VanaEpochImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaEpochImplementation.d.ts +151 -0
- package/dist/generated/abi/VanaEpochImplementation.js +195 -0
- package/dist/generated/abi/VanaEpochImplementation.js.map +1 -1
- package/dist/generated/abi/VanaPoolEntityImplementation.cjs +22 -65
- package/dist/generated/abi/VanaPoolEntityImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +17 -51
- package/dist/generated/abi/VanaPoolEntityImplementation.js +22 -65
- package/dist/generated/abi/VanaPoolEntityImplementation.js.map +1 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.cjs +113 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +85 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.js +113 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.js.map +1 -1
- package/dist/generated/abi/VanaPoolTreasuryImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolTreasuryImplementation.js.map +1 -1
- package/dist/generated/abi/VanaRuntimePermissionsImplementation.cjs +759 -0
- package/dist/generated/abi/VanaRuntimePermissionsImplementation.cjs.map +1 -0
- package/dist/generated/abi/VanaRuntimePermissionsImplementation.d.ts +563 -0
- package/dist/generated/abi/VanaRuntimePermissionsImplementation.js +735 -0
- package/dist/generated/abi/VanaRuntimePermissionsImplementation.js.map +1 -0
- package/dist/generated/abi/VanaRuntimeServersImplementation.cjs +820 -0
- package/dist/generated/abi/VanaRuntimeServersImplementation.cjs.map +1 -0
- package/dist/generated/abi/VanaRuntimeServersImplementation.d.ts +609 -0
- package/dist/generated/abi/VanaRuntimeServersImplementation.js +796 -0
- package/dist/generated/abi/VanaRuntimeServersImplementation.js.map +1 -0
- package/dist/generated/abi/VanaTreasuryImplementation.cjs +536 -0
- package/dist/generated/abi/VanaTreasuryImplementation.cjs.map +1 -0
- package/dist/generated/abi/VanaTreasuryImplementation.d.ts +393 -0
- package/dist/generated/abi/VanaTreasuryImplementation.js +512 -0
- package/dist/generated/abi/VanaTreasuryImplementation.js.map +1 -0
- package/dist/generated/abi/WVANAImplementation.cjs +339 -0
- package/dist/generated/abi/WVANAImplementation.cjs.map +1 -0
- package/dist/generated/abi/WVANAImplementation.d.ts +244 -0
- package/dist/generated/abi/WVANAImplementation.js +315 -0
- package/dist/generated/abi/WVANAImplementation.js.map +1 -0
- package/dist/generated/abi/index.cjs +79 -47
- package/dist/generated/abi/index.cjs.map +1 -1
- package/dist/generated/abi/index.d.ts +15783 -10449
- package/dist/generated/abi/index.js +65 -43
- package/dist/generated/abi/index.js.map +1 -1
- package/dist/{config → generated}/addresses.cjs +174 -75
- package/dist/generated/addresses.cjs.map +1 -0
- package/dist/{config → generated}/addresses.d.ts +174 -165
- package/dist/{config → generated}/addresses.js +174 -75
- package/dist/generated/addresses.js.map +1 -0
- package/dist/generated/event-types.cjs.map +1 -1
- package/dist/generated/event-types.d.ts +482 -399
- package/dist/generated/eventRegistry.cjs +2601 -724
- package/dist/generated/eventRegistry.cjs.map +1 -1
- package/dist/generated/eventRegistry.d.ts +2 -2
- package/dist/generated/eventRegistry.js +2601 -724
- package/dist/generated/eventRegistry.js.map +1 -1
- package/dist/generated/server/server-exports.cjs +22 -0
- package/dist/generated/server/server-exports.cjs.map +1 -1
- package/dist/generated/server/server-exports.d.ts +31 -11
- package/dist/generated/server/server-exports.js +17 -0
- package/dist/generated/server/server-exports.js.map +1 -1
- package/dist/generated/server/server.cjs.map +1 -1
- package/dist/generated/server/server.d.ts +771 -402
- package/dist/generated/subgraph.cjs +797 -32
- package/dist/generated/subgraph.cjs.map +1 -1
- package/dist/generated/subgraph.d.ts +135 -0
- package/dist/generated/subgraph.js +792 -32
- package/dist/generated/subgraph.js.map +1 -1
- package/dist/index.browser.d.ts +6 -1
- package/dist/index.browser.js +26 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +47 -4
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +60 -14
- package/dist/index.node.js +42 -3
- package/dist/index.node.js.map +1 -1
- package/dist/lib/__tests__/redisAtomicStore.test.d.ts +1 -0
- package/dist/lib/redisAtomicStore.cjs +201 -0
- package/dist/lib/redisAtomicStore.cjs.map +1 -0
- package/dist/lib/redisAtomicStore.d.ts +120 -0
- package/dist/lib/redisAtomicStore.js +177 -0
- package/dist/lib/redisAtomicStore.js.map +1 -0
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +39 -1
- package/dist/node.js.map +1 -1
- package/dist/platform/browser.cjs +160 -2
- package/dist/platform/browser.cjs.map +1 -1
- package/dist/platform/browser.d.ts +232 -12
- package/dist/platform/browser.js +160 -2
- package/dist/platform/browser.js.map +1 -1
- package/dist/platform/interface.cjs.map +1 -1
- package/dist/platform/interface.d.ts +283 -90
- package/dist/platform/node.cjs +163 -2
- package/dist/platform/node.cjs.map +1 -1
- package/dist/platform/node.d.ts +69 -6
- package/dist/platform/node.js +163 -2
- package/dist/platform/node.js.map +1 -1
- package/dist/server/relayerHandler.cjs +452 -0
- package/dist/server/relayerHandler.cjs.map +1 -0
- package/dist/server/relayerHandler.d.ts +69 -0
- package/dist/server/relayerHandler.js +428 -0
- package/dist/server/relayerHandler.js.map +1 -0
- package/dist/storage/index.cjs +3 -0
- package/dist/storage/index.cjs.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/manager.cjs +108 -25
- package/dist/storage/manager.cjs.map +1 -1
- package/dist/storage/manager.d.ts +119 -25
- package/dist/storage/manager.js +108 -25
- package/dist/storage/manager.js.map +1 -1
- package/dist/storage/providers/callback-storage.cjs +86 -15
- package/dist/storage/providers/callback-storage.cjs.map +1 -1
- package/dist/storage/providers/callback-storage.d.ts +109 -20
- package/dist/storage/providers/callback-storage.js +86 -15
- package/dist/storage/providers/callback-storage.js.map +1 -1
- package/dist/storage/providers/dropbox.cjs +237 -0
- package/dist/storage/providers/dropbox.cjs.map +1 -0
- package/dist/storage/providers/dropbox.d.ts +39 -0
- package/dist/storage/providers/dropbox.js +215 -0
- package/dist/storage/providers/dropbox.js.map +1 -0
- package/dist/storage/providers/dropbox.test.d.ts +1 -0
- package/dist/storage/providers/pinata.cjs.map +1 -1
- package/dist/storage/providers/pinata.d.ts +12 -14
- package/dist/storage/providers/pinata.js.map +1 -1
- package/dist/tests/data-upload-owner-validation.test.d.ts +1 -0
- package/dist/tests/factories/mockFactory.d.ts +6 -6
- package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +2 -2
- package/dist/tests/permissions-revoke-relayer.test.d.ts +1 -0
- package/dist/tests/permissions-transaction-options.test.d.ts +1 -0
- package/dist/tests/read-only-mode.test.d.ts +1 -0
- package/dist/tests/relayer-integration.test.d.ts +1 -0
- package/dist/tests/relayer-unified.test.d.ts +1 -0
- package/dist/tests/server-relayer-handler.test.d.ts +1 -0
- package/dist/types/accessSettlement.cjs +17 -0
- package/dist/types/accessSettlement.cjs.map +1 -0
- package/dist/types/accessSettlement.d.ts +66 -0
- package/dist/types/accessSettlement.js +1 -0
- package/dist/types/accessSettlement.js.map +1 -0
- package/dist/types/atomicStore.cjs +31 -0
- package/dist/types/atomicStore.cjs.map +1 -0
- package/dist/types/atomicStore.d.ts +236 -0
- package/dist/types/atomicStore.js +7 -0
- package/dist/types/atomicStore.js.map +1 -0
- package/dist/types/blockchain.cjs.map +1 -1
- package/dist/types/blockchain.d.ts +39 -11
- package/dist/types/chains.cjs.map +1 -1
- package/dist/types/chains.d.ts +74 -7
- package/dist/types/chains.js.map +1 -1
- package/dist/types/config.cjs +10 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +217 -220
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/contracts.cjs.map +1 -1
- package/dist/types/contracts.d.ts +71 -7
- package/dist/types/controller-context.cjs.map +1 -1
- package/dist/types/controller-context.d.ts +12 -6
- package/dist/types/data.cjs.map +1 -1
- package/dist/types/data.d.ts +82 -10
- package/dist/types/generics.cjs.map +1 -1
- package/dist/types/generics.d.ts +81 -10
- package/dist/types/index.cjs +4 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +36 -6
- package/dist/types/index.js +9 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/operationStore.cjs +17 -0
- package/dist/types/operationStore.cjs.map +1 -0
- package/dist/types/operationStore.d.ts +171 -0
- package/dist/types/operationStore.js +1 -0
- package/dist/types/operationStore.js.map +1 -0
- package/dist/types/operations.cjs +3 -15
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +131 -39
- package/dist/types/operations.js +2 -13
- package/dist/types/operations.js.map +1 -1
- package/dist/types/options.cjs +17 -0
- package/dist/types/options.cjs.map +1 -0
- package/dist/types/options.d.ts +308 -0
- package/dist/types/options.js +1 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/permissions.cjs.map +1 -1
- package/dist/types/permissions.d.ts +19 -20
- package/dist/types/personal.cjs.map +1 -1
- package/dist/types/personal.d.ts +150 -14
- package/dist/types/relayer.cjs.map +1 -1
- package/dist/types/relayer.d.ts +307 -35
- package/dist/types/runtimePermissions.cjs +17 -0
- package/dist/types/runtimePermissions.cjs.map +1 -0
- package/dist/types/runtimePermissions.d.ts +122 -0
- package/dist/types/runtimePermissions.js +1 -0
- package/dist/types/runtimePermissions.js.map +1 -0
- package/dist/types/storage.cjs.map +1 -1
- package/dist/types/storage.d.ts +9 -21
- package/dist/types/storage.js.map +1 -1
- package/dist/types/utils.cjs.map +1 -1
- package/dist/types/utils.d.ts +0 -45
- package/dist/utils/__tests__/chainQuery.test.d.ts +1 -0
- package/dist/utils/__tests__/subgraphConsistency.test.d.ts +4 -0
- package/dist/utils/__tests__/subgraphPagination.test.d.ts +4 -0
- package/dist/utils/blockchain/registry.cjs +3 -3
- package/dist/utils/blockchain/registry.cjs.map +1 -1
- package/dist/utils/blockchain/registry.d.ts +1 -1
- package/dist/utils/blockchain/registry.js +3 -3
- package/dist/utils/blockchain/registry.js.map +1 -1
- package/dist/utils/chainQuery.cjs +107 -0
- package/dist/utils/chainQuery.cjs.map +1 -0
- package/dist/utils/chainQuery.d.ts +31 -0
- package/dist/utils/chainQuery.js +82 -0
- package/dist/utils/chainQuery.js.map +1 -0
- package/dist/utils/grantFiles.cjs +4 -1
- package/dist/utils/grantFiles.cjs.map +1 -1
- package/dist/utils/grantFiles.d.ts +10 -20
- package/dist/utils/grantFiles.js +4 -1
- package/dist/utils/grantFiles.js.map +1 -1
- package/dist/utils/grantValidation.cjs.map +1 -1
- package/dist/utils/grantValidation.d.ts +95 -16
- package/dist/utils/grantValidation.js.map +1 -1
- package/dist/utils/grants.cjs.map +1 -1
- package/dist/utils/grants.d.ts +93 -12
- package/dist/utils/grants.js.map +1 -1
- package/dist/utils/ipfs.cjs +2 -4
- package/dist/utils/ipfs.cjs.map +1 -1
- package/dist/utils/ipfs.d.ts +1 -1
- package/dist/utils/ipfs.js +2 -4
- package/dist/utils/ipfs.js.map +1 -1
- package/dist/utils/lazy-import.cjs.map +1 -1
- package/dist/utils/lazy-import.d.ts +32 -7
- package/dist/utils/lazy-import.js.map +1 -1
- package/dist/utils/multicall.cjs +1 -1
- package/dist/utils/multicall.cjs.map +1 -1
- package/dist/utils/multicall.js +1 -1
- package/dist/utils/multicall.js.map +1 -1
- package/dist/utils/runtimeGrantFiles.cjs +84 -0
- package/dist/utils/runtimeGrantFiles.cjs.map +1 -0
- package/dist/utils/runtimeGrantFiles.d.ts +66 -0
- package/dist/utils/runtimeGrantFiles.js +58 -0
- package/dist/utils/runtimeGrantFiles.js.map +1 -0
- package/dist/utils/signatureCache.cjs +8 -2
- package/dist/utils/signatureCache.cjs.map +1 -1
- package/dist/utils/signatureCache.d.ts +49 -8
- package/dist/utils/signatureCache.js +8 -2
- package/dist/utils/signatureCache.js.map +1 -1
- package/dist/utils/subgraphConsistency.cjs +184 -0
- package/dist/utils/subgraphConsistency.cjs.map +1 -0
- package/dist/utils/subgraphConsistency.d.ts +65 -0
- package/dist/utils/subgraphConsistency.js +155 -0
- package/dist/utils/subgraphConsistency.js.map +1 -0
- package/dist/utils/subgraphMetaCache.cjs +101 -0
- package/dist/utils/subgraphMetaCache.cjs.map +1 -0
- package/dist/utils/subgraphMetaCache.d.ts +56 -0
- package/dist/utils/subgraphMetaCache.js +76 -0
- package/dist/utils/subgraphMetaCache.js.map +1 -0
- package/dist/utils/subgraphPagination.cjs +104 -0
- package/dist/utils/subgraphPagination.cjs.map +1 -0
- package/dist/utils/subgraphPagination.d.ts +78 -0
- package/dist/utils/subgraphPagination.js +78 -0
- package/dist/utils/subgraphPagination.js.map +1 -0
- package/dist/utils/transactionHelpers.cjs.map +1 -1
- package/dist/utils/transactionHelpers.d.ts +12 -12
- package/dist/utils/transactionHelpers.js.map +1 -1
- package/dist/utils/typedDataConverter.cjs.map +1 -1
- package/dist/utils/typedDataConverter.d.ts +39 -3
- package/dist/utils/typedDataConverter.js.map +1 -1
- package/dist/utils/urlResolver.cjs +7 -0
- package/dist/utils/urlResolver.cjs.map +1 -1
- package/dist/utils/urlResolver.d.ts +22 -4
- package/dist/utils/urlResolver.js +7 -0
- package/dist/utils/urlResolver.js.map +1 -1
- package/dist/utils/wallet.cjs +63 -0
- package/dist/utils/wallet.cjs.map +1 -0
- package/dist/utils/wallet.d.ts +94 -0
- package/dist/utils/wallet.js +37 -0
- package/dist/utils/wallet.js.map +1 -0
- package/package.json +7 -2
- package/dist/config/addresses.cjs.map +0 -1
- package/dist/config/addresses.js.map +0 -1
- package/dist/generated/abi/DLPTreasuryImplementation.cjs.map +0 -1
- package/dist/generated/abi/DLPTreasuryImplementation.js.map +0 -1
- package/dist/server/handler.cjs +0 -101
- package/dist/server/handler.cjs.map +0 -1
- package/dist/server/handler.d.ts +0 -87
- package/dist/server/handler.js +0 -77
- package/dist/server/handler.js.map +0 -1
- /package/dist/{tests/server-handler.test.d.ts → client/__tests__/enhancedResponse.test.d.ts} +0 -0
|
@@ -21,10 +21,13 @@ __export(server_exports, {
|
|
|
21
21
|
ServerController: () => ServerController
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(server_exports);
|
|
24
|
+
var import_server_exports = require("../generated/server/server-exports");
|
|
24
25
|
var import_errors = require("../errors");
|
|
25
|
-
|
|
26
|
+
var import_base = require("./base");
|
|
27
|
+
var import_signatureCache = require("../utils/signatureCache");
|
|
28
|
+
class ServerController extends import_base.BaseController {
|
|
26
29
|
constructor(context) {
|
|
27
|
-
|
|
30
|
+
super(context);
|
|
28
31
|
}
|
|
29
32
|
get personalServerBaseUrl() {
|
|
30
33
|
if (!this.context.defaultPersonalServerUrl) {
|
|
@@ -32,26 +35,32 @@ class ServerController {
|
|
|
32
35
|
"Personal server URL is required for server operations. Please configure defaultPersonalServerUrl in your VanaConfig."
|
|
33
36
|
);
|
|
34
37
|
}
|
|
35
|
-
|
|
38
|
+
let url = this.context.defaultPersonalServerUrl;
|
|
39
|
+
if (url.endsWith("/api/v1")) {
|
|
40
|
+
url = url.slice(0, -7);
|
|
41
|
+
}
|
|
42
|
+
return url;
|
|
36
43
|
}
|
|
37
44
|
/**
|
|
38
|
-
* Retrieves
|
|
45
|
+
* Retrieves cryptographic identity for a personal server.
|
|
39
46
|
*
|
|
40
47
|
* @remarks
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* @
|
|
49
|
-
*
|
|
50
|
-
* @throws {NetworkError}
|
|
51
|
-
*
|
|
48
|
+
* Fetches public key and metadata required for data encryption.
|
|
49
|
+
* Identity cached by infrastructure for offline retrieval.
|
|
50
|
+
* Each user address maps to deterministic server identity.
|
|
51
|
+
*
|
|
52
|
+
* @param request - Identity request parameters
|
|
53
|
+
* @param request.userAddress - Wallet address of server owner
|
|
54
|
+
*
|
|
55
|
+
* @returns Server identity with public key and metadata
|
|
56
|
+
*
|
|
57
|
+
* @throws {NetworkError} Identity service unavailable.
|
|
58
|
+
* Check network connection and server URL configuration.
|
|
59
|
+
* @throws {PersonalServerError} Identity retrieval failed.
|
|
60
|
+
* Verify user address and server registration.
|
|
61
|
+
*
|
|
52
62
|
* @example
|
|
53
63
|
* ```typescript
|
|
54
|
-
* // Get server identity for data encryption
|
|
55
64
|
* const identity = await vana.server.getIdentity({
|
|
56
65
|
* userAddress: "0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36"
|
|
57
66
|
* });
|
|
@@ -60,9 +69,9 @@ class ServerController {
|
|
|
60
69
|
* console.log(`Address: ${identity.address}`);
|
|
61
70
|
* console.log(`Public Key: ${identity.publicKey}`);
|
|
62
71
|
*
|
|
63
|
-
* // Use
|
|
64
|
-
* const
|
|
65
|
-
*
|
|
72
|
+
* // Use for encryption before data sharing
|
|
73
|
+
* const encrypted = await encryptWithPublicKey(
|
|
74
|
+
* data,
|
|
66
75
|
* identity.publicKey
|
|
67
76
|
* );
|
|
68
77
|
* ```
|
|
@@ -70,7 +79,7 @@ class ServerController {
|
|
|
70
79
|
async getIdentity(request) {
|
|
71
80
|
try {
|
|
72
81
|
const response = await fetch(
|
|
73
|
-
`${this.personalServerBaseUrl}
|
|
82
|
+
`${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.getIdentityApiV1IdentityGet}?address=${request.userAddress}`,
|
|
74
83
|
{
|
|
75
84
|
method: "GET",
|
|
76
85
|
headers: {
|
|
@@ -103,32 +112,33 @@ class ServerController {
|
|
|
103
112
|
}
|
|
104
113
|
}
|
|
105
114
|
/**
|
|
106
|
-
* Creates a server operation and returns its details
|
|
115
|
+
* Creates a server operation and returns its details from the OpenAPI schema.
|
|
107
116
|
*
|
|
108
117
|
* @remarks
|
|
109
118
|
* This method submits a computation request to the personal server and returns
|
|
110
|
-
*
|
|
111
|
-
*
|
|
119
|
+
* the server's CreateOperationResponse. The response contains the operation ID
|
|
120
|
+
* which can be used with `waitForOperation()` to poll for completion.
|
|
112
121
|
*
|
|
113
122
|
* @param params - The operation request parameters
|
|
114
123
|
* @param params.permissionId - The permission ID authorizing this operation.
|
|
115
124
|
* Obtain via `vana.permissions.getUserPermissionGrantsOnChain()`.
|
|
116
|
-
* @returns
|
|
125
|
+
* @returns Server response with operation ID
|
|
117
126
|
* @throws {PersonalServerError} When the server request fails or parameters are invalid
|
|
118
127
|
* @throws {NetworkError} When personal server API communication fails
|
|
119
128
|
* @example
|
|
120
129
|
* ```typescript
|
|
121
|
-
* const
|
|
130
|
+
* const response = await vana.server.createOperation({
|
|
122
131
|
* permissionId: 123
|
|
123
132
|
* });
|
|
124
|
-
* console.log(`Operation ID: ${
|
|
133
|
+
* console.log(`Operation ID: ${response.id}`);
|
|
125
134
|
*
|
|
126
135
|
* // Wait for completion
|
|
127
|
-
* const result = await vana.server.waitForOperation(
|
|
136
|
+
* const result = await vana.server.waitForOperation(response.id);
|
|
128
137
|
* console.log("Result:", result.result);
|
|
129
138
|
* ```
|
|
130
139
|
*/
|
|
131
140
|
async createOperation(params) {
|
|
141
|
+
this.assertWallet();
|
|
132
142
|
try {
|
|
133
143
|
const requestData = {
|
|
134
144
|
permission_id: params.permissionId
|
|
@@ -141,11 +151,7 @@ class ServerController {
|
|
|
141
151
|
};
|
|
142
152
|
console.debug("\u{1F50D} Debug - createOperation requestBody", requestBody);
|
|
143
153
|
const response = await this.makeRequest(requestBody);
|
|
144
|
-
return
|
|
145
|
-
id: response.id,
|
|
146
|
-
status: "starting",
|
|
147
|
-
createdAt: Date.now()
|
|
148
|
-
};
|
|
154
|
+
return response;
|
|
149
155
|
} catch (error) {
|
|
150
156
|
if (error instanceof Error) {
|
|
151
157
|
if (error instanceof import_errors.NetworkError || error instanceof import_errors.SerializationError || error instanceof import_errors.SignatureError || error instanceof import_errors.PersonalServerError) {
|
|
@@ -165,17 +171,20 @@ class ServerController {
|
|
|
165
171
|
* Retrieves the current status and result of a server operation.
|
|
166
172
|
*
|
|
167
173
|
* @remarks
|
|
168
|
-
* Common status values: `starting`, `
|
|
174
|
+
* Common status values: `starting`, `processing`, `succeeded`, `failed`, `canceled`.
|
|
169
175
|
* When status is `succeeded`, the result field contains the operation output.
|
|
176
|
+
* Returns the server response directly from the OpenAPI schema.
|
|
170
177
|
*
|
|
171
178
|
* @param operationId - The ID of the operation to query
|
|
172
|
-
* @returns The operation
|
|
179
|
+
* @returns The operation status response from the server
|
|
173
180
|
* @throws {NetworkError} When the API request fails or returns invalid data
|
|
174
181
|
* @example
|
|
175
182
|
* ```typescript
|
|
176
183
|
* const operation = await vana.server.getOperation(operationId);
|
|
177
184
|
* if (operation.status === 'succeeded') {
|
|
178
185
|
* console.log('Result:', operation.result);
|
|
186
|
+
* console.log('Started at:', operation.started_at);
|
|
187
|
+
* console.log('Finished at:', operation.finished_at);
|
|
179
188
|
* }
|
|
180
189
|
* ```
|
|
181
190
|
*/
|
|
@@ -183,7 +192,7 @@ class ServerController {
|
|
|
183
192
|
try {
|
|
184
193
|
console.debug("Polling Operation Status:", operationId);
|
|
185
194
|
const response = await fetch(
|
|
186
|
-
`${this.personalServerBaseUrl}
|
|
195
|
+
`${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.getOperationApiV1Operations_OperationId_Get(operationId)}`,
|
|
187
196
|
{
|
|
188
197
|
method: "GET",
|
|
189
198
|
headers: {
|
|
@@ -204,14 +213,7 @@ class ServerController {
|
|
|
204
213
|
}
|
|
205
214
|
const data = await response.json();
|
|
206
215
|
console.debug("Polling Success Response:", data);
|
|
207
|
-
return
|
|
208
|
-
id: data.id,
|
|
209
|
-
status: data.status,
|
|
210
|
-
createdAt: Date.now(),
|
|
211
|
-
updatedAt: Date.now(),
|
|
212
|
-
result: data.status === "succeeded" ? data.result : void 0,
|
|
213
|
-
error: data.status === "failed" ? data.result ?? void 0 : void 0
|
|
214
|
-
};
|
|
216
|
+
return data;
|
|
215
217
|
} catch (error) {
|
|
216
218
|
if (error instanceof import_errors.NetworkError) {
|
|
217
219
|
throw error;
|
|
@@ -228,10 +230,11 @@ class ServerController {
|
|
|
228
230
|
* This method polls the operation status at regular intervals until it
|
|
229
231
|
* reaches a terminal state (succeeded, failed, or canceled). Supports
|
|
230
232
|
* ergonomic overloads to accept either an Operation object or just the ID.
|
|
233
|
+
* Returns the server response directly from the OpenAPI schema.
|
|
231
234
|
*
|
|
232
235
|
* @param opOrId - Either an Operation object or operation ID string
|
|
233
236
|
* @param options - Optional polling configuration
|
|
234
|
-
* @returns The completed operation with result
|
|
237
|
+
* @returns The completed operation with result and timestamp data
|
|
235
238
|
* @throws {PersonalServerError} When the operation fails or times out
|
|
236
239
|
* @example
|
|
237
240
|
* ```typescript
|
|
@@ -247,6 +250,10 @@ class ServerController {
|
|
|
247
250
|
* timeout: 60000,
|
|
248
251
|
* pollingInterval: 1000
|
|
249
252
|
* });
|
|
253
|
+
*
|
|
254
|
+
* // Access server-provided timestamps
|
|
255
|
+
* console.log('Started:', completed.started_at);
|
|
256
|
+
* console.log('Finished:', completed.finished_at);
|
|
250
257
|
* ```
|
|
251
258
|
*/
|
|
252
259
|
async waitForOperation(opOrId, options) {
|
|
@@ -260,8 +267,13 @@ class ServerController {
|
|
|
260
267
|
return operation;
|
|
261
268
|
}
|
|
262
269
|
if (operation.status === "failed") {
|
|
270
|
+
let errorMessage = "Unknown error";
|
|
271
|
+
if (operation.result) {
|
|
272
|
+
const resultObj = operation.result;
|
|
273
|
+
errorMessage = typeof resultObj.error === "string" ? resultObj.error : typeof resultObj.detail === "string" ? resultObj.detail : JSON.stringify(operation.result);
|
|
274
|
+
}
|
|
263
275
|
throw new import_errors.PersonalServerError(
|
|
264
|
-
`Operation ${operation.status}: ${
|
|
276
|
+
`Operation ${operation.status}: ${errorMessage}`
|
|
265
277
|
);
|
|
266
278
|
}
|
|
267
279
|
if (operation.status === "canceled") {
|
|
@@ -273,6 +285,191 @@ class ServerController {
|
|
|
273
285
|
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
274
286
|
}
|
|
275
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* Downloads an artifact generated by a server operation.
|
|
290
|
+
*
|
|
291
|
+
* @remarks
|
|
292
|
+
* Artifacts are files generated during operations like Gemini agent analysis.
|
|
293
|
+
* The download requires authentication using the application's signature.
|
|
294
|
+
* This method returns the artifact as a Blob that can be saved or processed.
|
|
295
|
+
*
|
|
296
|
+
* **Simplified Signature Scheme:**
|
|
297
|
+
* The signature is generated over the operation ID only, allowing a single signature
|
|
298
|
+
* to be reused for listing and downloading multiple artifacts from the same operation.
|
|
299
|
+
* This simplifies client implementation while maintaining security - access to the
|
|
300
|
+
* operation ID grants access to all artifacts.
|
|
301
|
+
*
|
|
302
|
+
* @param params - The download parameters
|
|
303
|
+
* @param params.operationId - The operation ID that generated the artifact
|
|
304
|
+
* @param params.artifactPath - The path to the artifact file to download
|
|
305
|
+
* @returns A Blob containing the artifact data
|
|
306
|
+
* @throws {PersonalServerError} When the artifact cannot be downloaded or doesn't exist
|
|
307
|
+
* @throws {NetworkError} When unable to reach the personal server API
|
|
308
|
+
* @throws {SignatureError} When unable to create the required signature
|
|
309
|
+
* @example
|
|
310
|
+
* ```typescript
|
|
311
|
+
* // Download an artifact after a Gemini operation
|
|
312
|
+
* const blob = await vana.server.downloadArtifact({
|
|
313
|
+
* operationId: 'op_123',
|
|
314
|
+
* artifactPath: 'analysis_report.pdf'
|
|
315
|
+
* });
|
|
316
|
+
*
|
|
317
|
+
* // Save to file in Node.js
|
|
318
|
+
* const buffer = await blob.arrayBuffer();
|
|
319
|
+
* fs.writeFileSync('report.pdf', Buffer.from(buffer));
|
|
320
|
+
*
|
|
321
|
+
* // Or create download link in browser
|
|
322
|
+
* const url = URL.createObjectURL(blob);
|
|
323
|
+
* const a = document.createElement('a');
|
|
324
|
+
* a.href = url;
|
|
325
|
+
* a.download = 'report.pdf';
|
|
326
|
+
* a.click();
|
|
327
|
+
* ```
|
|
328
|
+
*/
|
|
329
|
+
async downloadArtifact(params) {
|
|
330
|
+
this.assertWallet();
|
|
331
|
+
try {
|
|
332
|
+
const signatureData = {
|
|
333
|
+
operation_id: params.operationId
|
|
334
|
+
};
|
|
335
|
+
const requestJson = JSON.stringify(signatureData);
|
|
336
|
+
const messageHash = import_signatureCache.SignatureCache.hashMessage(signatureData);
|
|
337
|
+
let signature = import_signatureCache.SignatureCache.get(
|
|
338
|
+
this.context.platform.cache,
|
|
339
|
+
this.getAccountAddress(),
|
|
340
|
+
messageHash
|
|
341
|
+
);
|
|
342
|
+
if (!signature) {
|
|
343
|
+
signature = await this.createSignature(requestJson);
|
|
344
|
+
import_signatureCache.SignatureCache.set(
|
|
345
|
+
this.context.platform.cache,
|
|
346
|
+
this.getAccountAddress(),
|
|
347
|
+
messageHash,
|
|
348
|
+
signature,
|
|
349
|
+
24
|
|
350
|
+
// Cache for 24 hours since operation_id doesn't change
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
const requestBody = {
|
|
354
|
+
operation_id: params.operationId,
|
|
355
|
+
artifact_path: params.artifactPath,
|
|
356
|
+
signature
|
|
357
|
+
};
|
|
358
|
+
const response = await fetch(
|
|
359
|
+
`${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.downloadArtifactApiV1ArtifactsDownloadPost}`,
|
|
360
|
+
{
|
|
361
|
+
method: "POST",
|
|
362
|
+
headers: {
|
|
363
|
+
"Content-Type": "application/json"
|
|
364
|
+
},
|
|
365
|
+
body: JSON.stringify(requestBody)
|
|
366
|
+
}
|
|
367
|
+
);
|
|
368
|
+
if (!response.ok) {
|
|
369
|
+
const errorText = await response.text();
|
|
370
|
+
throw new import_errors.PersonalServerError(
|
|
371
|
+
`Artifact download failed: ${response.status} ${response.statusText} - ${errorText}`
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
return await response.blob();
|
|
375
|
+
} catch (error) {
|
|
376
|
+
if (error instanceof import_errors.NetworkError || error instanceof import_errors.PersonalServerError || error instanceof import_errors.SignatureError) {
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
throw new import_errors.PersonalServerError(
|
|
380
|
+
`Failed to download artifact: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Lists all artifacts generated by a server operation.
|
|
386
|
+
*
|
|
387
|
+
* @remarks
|
|
388
|
+
* Retrieves metadata for all artifact files produced by an operation,
|
|
389
|
+
* including file paths, sizes, and content types. This provides visibility
|
|
390
|
+
* into available outputs without downloading them.
|
|
391
|
+
*
|
|
392
|
+
* **Simplified Signature Scheme:**
|
|
393
|
+
* Uses the same signature as downloadArtifact - signs only operation_id.
|
|
394
|
+
* This allows reusing the same signature for listing and downloading.
|
|
395
|
+
*
|
|
396
|
+
* @param operationId - The operation ID that generated the artifacts
|
|
397
|
+
* @returns Promise resolving to array of artifact metadata objects
|
|
398
|
+
* @throws {PersonalServerError} When artifacts cannot be listed
|
|
399
|
+
* @throws {NetworkError} When unable to reach the personal server API
|
|
400
|
+
* @throws {SignatureError} When unable to create the required signature
|
|
401
|
+
* @example
|
|
402
|
+
* ```typescript
|
|
403
|
+
* // List artifacts from a Gemini operation
|
|
404
|
+
* const artifacts = await vana.server.listArtifacts('op_123');
|
|
405
|
+
*
|
|
406
|
+
* console.log(`Found ${artifacts.length} artifacts:`);
|
|
407
|
+
* artifacts.forEach(artifact => {
|
|
408
|
+
* console.log(`- ${artifact.path} (${artifact.size} bytes)`);
|
|
409
|
+
* });
|
|
410
|
+
*
|
|
411
|
+
* // Download a specific artifact
|
|
412
|
+
* const blob = await vana.server.downloadArtifact({
|
|
413
|
+
* operationId: 'op_123',
|
|
414
|
+
* artifactPath: artifacts[0].path
|
|
415
|
+
* });
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
418
|
+
async listArtifacts(operationId) {
|
|
419
|
+
this.assertWallet();
|
|
420
|
+
try {
|
|
421
|
+
const signatureData = {
|
|
422
|
+
operation_id: operationId
|
|
423
|
+
};
|
|
424
|
+
const requestJson = JSON.stringify(signatureData);
|
|
425
|
+
const messageHash = import_signatureCache.SignatureCache.hashMessage(signatureData);
|
|
426
|
+
let signature = import_signatureCache.SignatureCache.get(
|
|
427
|
+
this.context.platform.cache,
|
|
428
|
+
this.getAccountAddress(),
|
|
429
|
+
messageHash
|
|
430
|
+
);
|
|
431
|
+
if (!signature) {
|
|
432
|
+
signature = await this.createSignature(requestJson);
|
|
433
|
+
import_signatureCache.SignatureCache.set(
|
|
434
|
+
this.context.platform.cache,
|
|
435
|
+
this.getAccountAddress(),
|
|
436
|
+
messageHash,
|
|
437
|
+
signature,
|
|
438
|
+
24
|
|
439
|
+
// Cache for 24 hours since operation_id doesn't change
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
const requestBody = {
|
|
443
|
+
operation_id: operationId,
|
|
444
|
+
signature
|
|
445
|
+
};
|
|
446
|
+
const response = await fetch(
|
|
447
|
+
`${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.listArtifactsApiV1Artifacts_OperationId_ListPost(operationId)}`,
|
|
448
|
+
{
|
|
449
|
+
method: "POST",
|
|
450
|
+
headers: {
|
|
451
|
+
"Content-Type": "application/json"
|
|
452
|
+
},
|
|
453
|
+
body: JSON.stringify(requestBody)
|
|
454
|
+
}
|
|
455
|
+
);
|
|
456
|
+
if (!response.ok) {
|
|
457
|
+
const errorText = await response.text();
|
|
458
|
+
throw new import_errors.PersonalServerError(
|
|
459
|
+
`Failed to list artifacts: ${response.status} ${response.statusText} - ${errorText}`
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
const data = await response.json();
|
|
463
|
+
return data.artifacts ?? [];
|
|
464
|
+
} catch (error) {
|
|
465
|
+
if (error instanceof import_errors.NetworkError || error instanceof import_errors.PersonalServerError || error instanceof import_errors.SignatureError) {
|
|
466
|
+
throw error;
|
|
467
|
+
}
|
|
468
|
+
throw new import_errors.PersonalServerError(
|
|
469
|
+
`Failed to list artifacts: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
276
473
|
/**
|
|
277
474
|
* Cancels a running operation on the personal server.
|
|
278
475
|
*
|
|
@@ -320,7 +517,7 @@ class ServerController {
|
|
|
320
517
|
async cancelOperation(operationId) {
|
|
321
518
|
try {
|
|
322
519
|
const response = await fetch(
|
|
323
|
-
`${this.personalServerBaseUrl}
|
|
520
|
+
`${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.cancelOperationApiV1Operations_OperationId_CancelPost(operationId)}`,
|
|
324
521
|
{
|
|
325
522
|
method: "POST"
|
|
326
523
|
}
|
|
@@ -349,20 +546,23 @@ class ServerController {
|
|
|
349
546
|
async makeRequest(requestBody) {
|
|
350
547
|
try {
|
|
351
548
|
console.debug("Personal Server Request:", {
|
|
352
|
-
url: `${this.personalServerBaseUrl}
|
|
549
|
+
url: `${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.createOperationApiV1OperationsPost}`,
|
|
353
550
|
method: "POST",
|
|
354
551
|
headers: {
|
|
355
552
|
"Content-Type": "application/json"
|
|
356
553
|
},
|
|
357
554
|
body: requestBody
|
|
358
555
|
});
|
|
359
|
-
const response = await fetch(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
556
|
+
const response = await fetch(
|
|
557
|
+
`${this.personalServerBaseUrl}${import_server_exports.SERVER_PATHS.createOperationApiV1OperationsPost}`,
|
|
558
|
+
{
|
|
559
|
+
method: "POST",
|
|
560
|
+
headers: {
|
|
561
|
+
"Content-Type": "application/json"
|
|
562
|
+
},
|
|
563
|
+
body: JSON.stringify(requestBody)
|
|
564
|
+
}
|
|
565
|
+
);
|
|
366
566
|
if (!response.ok) {
|
|
367
567
|
const errorText = await response.text();
|
|
368
568
|
console.debug("Personal Server Error Response:", {
|
|
@@ -386,6 +586,23 @@ class ServerController {
|
|
|
386
586
|
);
|
|
387
587
|
}
|
|
388
588
|
}
|
|
589
|
+
/**
|
|
590
|
+
* Gets the account address from the wallet client.
|
|
591
|
+
*
|
|
592
|
+
* @returns The account address
|
|
593
|
+
* @throws {Error} When no account is available
|
|
594
|
+
*/
|
|
595
|
+
getAccountAddress() {
|
|
596
|
+
const client = this.context.applicationClient ?? this.context.walletClient;
|
|
597
|
+
if (!client) {
|
|
598
|
+
throw new Error("No client available for getting account address");
|
|
599
|
+
}
|
|
600
|
+
const { account } = client;
|
|
601
|
+
if (!account) {
|
|
602
|
+
throw new Error("No account available");
|
|
603
|
+
}
|
|
604
|
+
return typeof account === "string" ? account : account.address;
|
|
605
|
+
}
|
|
389
606
|
/**
|
|
390
607
|
* Creates a signature for the request JSON.
|
|
391
608
|
*
|
|
@@ -396,17 +613,16 @@ class ServerController {
|
|
|
396
613
|
try {
|
|
397
614
|
console.debug("\u{1F50D} Debug - createSignature", requestJson);
|
|
398
615
|
const client = this.context.applicationClient ?? this.context.walletClient;
|
|
616
|
+
if (!client) {
|
|
617
|
+
throw new import_errors.SignatureError("No client available for signing");
|
|
618
|
+
}
|
|
399
619
|
const { account } = client;
|
|
400
620
|
if (!account) {
|
|
401
621
|
throw new import_errors.SignatureError("No account available for signing");
|
|
402
622
|
}
|
|
403
|
-
if (account.type !== "local") {
|
|
404
|
-
throw new import_errors.SignatureError(
|
|
405
|
-
"Only local accounts are supported for signing"
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
623
|
console.debug("\u{1F50D} Debug - createSignature account", account);
|
|
409
|
-
const signature = await
|
|
624
|
+
const signature = await client.signMessage({
|
|
625
|
+
account,
|
|
410
626
|
message: requestJson
|
|
411
627
|
});
|
|
412
628
|
return signature;
|
|
@@ -1 +1 @@
|
|
|
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\";\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.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 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 // Get the account from the wallet client\n const { account } = client;\n if (!account) {\n throw new SignatureError(\"No account available for signing\");\n }\n\n // Only allow local accounts for signing\n if (account.type !== \"local\") {\n throw new SignatureError(\n \"Only local accounts are supported for signing\",\n );\n }\n\n console.debug(\"🔍 Debug - createSignature account\", account);\n // Sign locally using the account's signMessage method\n const signature = await account.signMessage({\n message: requestJson,\n });\n\n return signature;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"User rejected\")) {\n throw new SignatureError(\"User rejected the signature request\");\n }\n throw new SignatureError(\n `Failed to create signature: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/controllers/server.ts"],"sourcesContent":["import type {\n CreateOperationParams,\n InitPersonalServerParams,\n PersonalServerIdentity,\n DownloadArtifactParams,\n} from \"../types\";\nimport type {\n CreateOperationResponse,\n GetOperationResponse,\n IdentityResponseModel,\n} from \"../generated/server/server-exports\";\nimport { SERVER_PATHS } 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\";\nimport { SignatureCache } from \"../utils/signatureCache\";\n\n// Server types are now auto-imported from the generated exports\n\n/**\n * Manages personal server interactions for secure data processing.\n *\n * @remarks\n * Handles communication with personal servers for computation requests\n * and identity retrieval. Personal servers process user data with\n * cryptographic verification, ensuring privacy and permission compliance.\n *\n * **Architecture:**\n * Servers use deterministic key derivation from user addresses.\n * Identity cached for offline retrieval. Operations authenticated\n * via wallet signatures and permission verification.\n *\n * **Method Selection:**\n * - `getIdentity()` - Retrieve server public key for encryption\n * - `createOperation()` - Submit computation with permission ID\n * - `getOperation()` - Check status and retrieve results\n * - `waitForOperation()` - Poll until completion or timeout\n * - `cancelOperation()` - Stop running operations\n *\n * **Typical Workflow:**\n * 1. Get server identity for encryption key\n * 2. Create operation with permission ID\n * 3. Poll for completion\n * 4. Retrieve results\n *\n * @example\n * ```typescript\n * // Get server identity for encryption\n * const identity = await vana.server.getIdentity({\n * userAddress: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\"\n * });\n * console.log(`Server key: ${identity.publicKey}`);\n *\n * // Submit computation request\n * const operation = await vana.server.createOperation({\n * permissionId: 123\n * });\n *\n * // Wait for results\n * const result = await vana.server.waitForOperation(operation.id);\n * console.log(\"Processing complete:\", result.result);\n * ```\n *\n * @category Server Management\n * @see For conceptual overview, visit {@link https://docs.vana.org/docs/personal-servers}\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\n // Normalize the URL by removing /api/v1 suffix if present\n // This ensures backward compatibility with old configurations\n let url = this.context.defaultPersonalServerUrl;\n if (url.endsWith(\"/api/v1\")) {\n url = url.slice(0, -7); // Remove '/api/v1'\n }\n return url;\n }\n\n /**\n * Retrieves cryptographic identity for a personal server.\n *\n * @remarks\n * Fetches public key and metadata required for data encryption.\n * Identity cached by infrastructure for offline retrieval.\n * Each user address maps to deterministic server identity.\n *\n * @param request - Identity request parameters\n * @param request.userAddress - Wallet address of server owner\n *\n * @returns Server identity with public key and metadata\n *\n * @throws {NetworkError} Identity service unavailable.\n * Check network connection and server URL configuration.\n * @throws {PersonalServerError} Identity retrieval failed.\n * Verify user address and server registration.\n *\n * @example\n * ```typescript\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 for encryption before data sharing\n * const encrypted = await encryptWithPublicKey(\n * data,\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}${SERVER_PATHS.getIdentityApiV1IdentityGet}?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 from the OpenAPI schema.\n *\n * @remarks\n * This method submits a computation request to the personal server and returns\n * the server's CreateOperationResponse. The response contains the operation ID\n * which can be used with `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 Server response with operation ID\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 response = await vana.server.createOperation({\n * permissionId: 123\n * });\n * console.log(`Operation ID: ${response.id}`);\n *\n * // Wait for completion\n * const result = await vana.server.waitForOperation(response.id);\n * console.log(\"Result:\", result.result);\n * ```\n */\n async createOperation(\n params: CreateOperationParams,\n ): Promise<CreateOperationResponse> {\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 response;\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`, `processing`, `succeeded`, `failed`, `canceled`.\n * When status is `succeeded`, the result field contains the operation output.\n * Returns the server response directly from the OpenAPI schema.\n *\n * @param operationId - The ID of the operation to query\n * @returns The operation status response from the server\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 * console.log('Started at:', operation.started_at);\n * console.log('Finished at:', operation.finished_at);\n * }\n * ```\n */\n async getOperation(operationId: string): Promise<Operation> {\n try {\n console.debug(\"Polling Operation Status:\", operationId);\n\n const response = await fetch(\n `${this.personalServerBaseUrl}${SERVER_PATHS.getOperationApiV1Operations_OperationId_Get(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 data;\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 * Returns the server response directly from the OpenAPI schema.\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 and timestamp data\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 * // Access server-provided timestamps\n * console.log('Started:', completed.started_at);\n * console.log('Finished:', completed.finished_at);\n * ```\n */\n async waitForOperation(\n opOrId: Operation | string,\n options?: PollingOptions,\n ): Promise<Operation> {\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(id);\n\n if (operation.status === \"succeeded\") {\n return operation;\n }\n\n if (operation.status === \"failed\") {\n // Extract error message from result object when failed\n let errorMessage = \"Unknown error\";\n if (operation.result) {\n const resultObj = operation.result as Record<string, unknown>;\n errorMessage =\n typeof resultObj.error === \"string\"\n ? resultObj.error\n : typeof resultObj.detail === \"string\"\n ? resultObj.detail\n : JSON.stringify(operation.result);\n }\n\n throw new PersonalServerError(\n `Operation ${operation.status}: ${errorMessage}`,\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 * Downloads an artifact generated by a server operation.\n *\n * @remarks\n * Artifacts are files generated during operations like Gemini agent analysis.\n * The download requires authentication using the application's signature.\n * This method returns the artifact as a Blob that can be saved or processed.\n *\n * **Simplified Signature Scheme:**\n * The signature is generated over the operation ID only, allowing a single signature\n * to be reused for listing and downloading multiple artifacts from the same operation.\n * This simplifies client implementation while maintaining security - access to the\n * operation ID grants access to all artifacts.\n *\n * @param params - The download parameters\n * @param params.operationId - The operation ID that generated the artifact\n * @param params.artifactPath - The path to the artifact file to download\n * @returns A Blob containing the artifact data\n * @throws {PersonalServerError} When the artifact cannot be downloaded or doesn't exist\n * @throws {NetworkError} When unable to reach the personal server API\n * @throws {SignatureError} When unable to create the required signature\n * @example\n * ```typescript\n * // Download an artifact after a Gemini operation\n * const blob = await vana.server.downloadArtifact({\n * operationId: 'op_123',\n * artifactPath: 'analysis_report.pdf'\n * });\n *\n * // Save to file in Node.js\n * const buffer = await blob.arrayBuffer();\n * fs.writeFileSync('report.pdf', Buffer.from(buffer));\n *\n * // Or create download link in browser\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'report.pdf';\n * a.click();\n * ```\n */\n async downloadArtifact(params: DownloadArtifactParams): Promise<Blob> {\n this.assertWallet();\n\n try {\n // Simplified signature scheme: sign only operation_id\n // This allows the same signature to be reused for all artifacts via caching\n const signatureData = {\n operation_id: params.operationId,\n };\n\n const requestJson = JSON.stringify(signatureData);\n\n // Use signature cache to avoid repeated wallet prompts for same operation\n const messageHash = SignatureCache.hashMessage(signatureData);\n let signature = SignatureCache.get(\n this.context.platform.cache,\n this.getAccountAddress(),\n messageHash,\n );\n\n if (!signature) {\n signature = await this.createSignature(requestJson);\n SignatureCache.set(\n this.context.platform.cache,\n this.getAccountAddress(),\n messageHash,\n signature,\n 24, // Cache for 24 hours since operation_id doesn't change\n );\n }\n\n // Request body still includes artifact_path for the API\n const requestBody = {\n operation_id: params.operationId,\n artifact_path: params.artifactPath,\n signature,\n };\n\n const response = await fetch(\n `${this.personalServerBaseUrl}${SERVER_PATHS.downloadArtifactApiV1ArtifactsDownloadPost}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new PersonalServerError(\n `Artifact download failed: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n return await response.blob();\n } catch (error) {\n if (\n error instanceof NetworkError ||\n error instanceof PersonalServerError ||\n error instanceof SignatureError\n ) {\n throw error;\n }\n throw new PersonalServerError(\n `Failed to download artifact: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Lists all artifacts generated by a server operation.\n *\n * @remarks\n * Retrieves metadata for all artifact files produced by an operation,\n * including file paths, sizes, and content types. This provides visibility\n * into available outputs without downloading them.\n *\n * **Simplified Signature Scheme:**\n * Uses the same signature as downloadArtifact - signs only operation_id.\n * This allows reusing the same signature for listing and downloading.\n *\n * @param operationId - The operation ID that generated the artifacts\n * @returns Promise resolving to array of artifact metadata objects\n * @throws {PersonalServerError} When artifacts cannot be listed\n * @throws {NetworkError} When unable to reach the personal server API\n * @throws {SignatureError} When unable to create the required signature\n * @example\n * ```typescript\n * // List artifacts from a Gemini operation\n * const artifacts = await vana.server.listArtifacts('op_123');\n *\n * console.log(`Found ${artifacts.length} artifacts:`);\n * artifacts.forEach(artifact => {\n * console.log(`- ${artifact.path} (${artifact.size} bytes)`);\n * });\n *\n * // Download a specific artifact\n * const blob = await vana.server.downloadArtifact({\n * operationId: 'op_123',\n * artifactPath: artifacts[0].path\n * });\n * ```\n */\n async listArtifacts(operationId: string): Promise<\n Array<{\n path: string;\n size: number;\n content_type: string;\n }>\n > {\n this.assertWallet();\n\n try {\n // Simplified signature scheme: sign only operation_id\n // This allows the same signature to be reused for all artifacts via caching\n const signatureData = {\n operation_id: operationId,\n };\n\n const requestJson = JSON.stringify(signatureData);\n\n // Use signature cache to avoid repeated wallet prompts for same operation\n const messageHash = SignatureCache.hashMessage(signatureData);\n let signature = SignatureCache.get(\n this.context.platform.cache,\n this.getAccountAddress(),\n messageHash,\n );\n\n if (!signature) {\n signature = await this.createSignature(requestJson);\n SignatureCache.set(\n this.context.platform.cache,\n this.getAccountAddress(),\n messageHash,\n signature,\n 24, // Cache for 24 hours since operation_id doesn't change\n );\n }\n\n const requestBody = {\n operation_id: operationId,\n signature,\n };\n\n const response = await fetch(\n `${this.personalServerBaseUrl}${SERVER_PATHS.listArtifactsApiV1Artifacts_OperationId_ListPost(operationId)}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n },\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new PersonalServerError(\n `Failed to list artifacts: ${response.status} ${response.statusText} - ${errorText}`,\n );\n }\n\n const data = await response.json();\n return data.artifacts ?? [];\n } catch (error) {\n if (\n error instanceof NetworkError ||\n error instanceof PersonalServerError ||\n error instanceof SignatureError\n ) {\n throw error;\n }\n throw new PersonalServerError(\n `Failed to list artifacts: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\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}${SERVER_PATHS.cancelOperationApiV1Operations_OperationId_CancelPost(operationId)}`,\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}${SERVER_PATHS.createOperationApiV1OperationsPost}`,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: requestBody,\n });\n\n const response = await fetch(\n `${this.personalServerBaseUrl}${SERVER_PATHS.createOperationApiV1OperationsPost}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n },\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 * Gets the account address from the wallet client.\n *\n * @returns The account address\n * @throws {Error} When no account is available\n */\n private getAccountAddress(): `0x${string}` {\n const client = this.context.applicationClient ?? this.context.walletClient;\n if (!client) {\n throw new Error(\"No client available for getting account address\");\n }\n\n const { account } = client;\n if (!account) {\n throw new Error(\"No account available\");\n }\n\n // Account can be either a string address or an object with an address property\n return typeof account === \"string\" ? account : account.address;\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<`0x${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 console.debug(\"🔍 Debug - createSignature account\", account);\n // Sign message using the wallet client's signMessage method\n // This works with both local accounts (private key) and JSON-RPC accounts (MetaMask, WalletConnect)\n const signature = await client.signMessage({\n account,\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":[]}
|