@opendatalabs/vana-sdk 0.1.0-alpha.276ea01 → 0.1.0-alpha.2b6935d
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/dist/__tests__/waitForTransactionEvents.test.d.ts +1 -0
- package/dist/browser.d.ts +4 -2
- package/dist/chains/definitions.cjs +9 -6
- package/dist/chains/definitions.cjs.map +1 -1
- package/dist/chains/definitions.d.ts +9 -11
- package/dist/chains/definitions.js +9 -6
- package/dist/chains/definitions.js.map +1 -1
- package/dist/chains/index.d.ts +5 -2
- package/dist/chains.browser.d.ts +8 -2
- package/dist/chains.d.ts +8 -2
- package/dist/chains.node.d.ts +8 -2
- package/dist/config/addresses.d.ts +8 -24
- package/dist/config/chains.d.ts +9 -13
- 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/config/features.d.ts +1 -3
- package/dist/config/tests/addresses.test.d.ts +1 -0
- package/dist/contracts/contractController.cjs +3 -3
- package/dist/contracts/contractController.cjs.map +1 -1
- package/dist/contracts/contractController.d.ts +11 -28
- package/dist/contracts/contractController.js +4 -7
- package/dist/contracts/contractController.js.map +1 -1
- package/dist/contracts/tests/contractController.test.d.ts +1 -0
- package/dist/controllers/__tests__/schemas-edge-cases.test.d.ts +1 -0
- package/dist/controllers/base.cjs +83 -0
- package/dist/controllers/base.cjs.map +1 -0
- package/dist/controllers/base.d.ts +84 -0
- package/dist/controllers/base.js +59 -0
- package/dist/controllers/base.js.map +1 -0
- package/dist/controllers/data-error-handling.test.d.ts +1 -0
- package/dist/controllers/data.cjs +444 -191
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +149 -76
- package/dist/controllers/data.js +444 -191
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/permissions.cjs +551 -395
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +1283 -25
- package/dist/controllers/permissions.js +551 -395
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/controllers/protocol.cjs +15 -11
- package/dist/controllers/protocol.cjs.map +1 -1
- package/dist/controllers/protocol.d.ts +7 -35
- package/dist/controllers/protocol.js +15 -14
- package/dist/controllers/protocol.js.map +1 -1
- package/dist/controllers/schemas.cjs +69 -54
- package/dist/controllers/schemas.cjs.map +1 -1
- package/dist/controllers/schemas.d.ts +9 -36
- package/dist/controllers/schemas.js +69 -54
- package/dist/controllers/schemas.js.map +1 -1
- package/dist/controllers/server-additional.test.d.ts +1 -0
- package/dist/controllers/server.cjs +15 -10
- package/dist/controllers/server.cjs.map +1 -1
- package/dist/controllers/server.d.ts +7 -33
- package/dist/controllers/server.js +15 -10
- package/dist/controllers/server.js.map +1 -1
- package/dist/core/apiClient.cjs +15 -12
- package/dist/core/apiClient.cjs.map +1 -1
- package/dist/core/apiClient.d.ts +5 -9
- package/dist/core/apiClient.js +19 -19
- package/dist/core/apiClient.js.map +1 -1
- package/dist/core/client.cjs +7 -7
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts +6 -9
- package/dist/core/client.js +7 -7
- package/dist/core/client.js.map +1 -1
- package/dist/core/core.test.d.ts +1 -0
- package/dist/core/generics.cjs +11 -9
- package/dist/core/generics.cjs.map +1 -1
- package/dist/core/generics.d.ts +9 -13
- package/dist/core/generics.js +22 -29
- package/dist/core/generics.js.map +1 -1
- package/dist/core/tests/apiClient.test.d.ts +1 -0
- package/dist/core/tests/client.test.d.ts +1 -0
- package/dist/core/tests/generics.test.d.ts +1 -0
- package/dist/core.cjs +143 -60
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +42 -66
- package/dist/core.js +155 -85
- package/dist/core.js.map +1 -1
- package/dist/crypto/ecies/__tests__/base.test.d.ts +4 -0
- package/dist/crypto/ecies/__tests__/compatibility.test.d.ts +8 -0
- package/dist/crypto/ecies/__tests__/constants.test.d.ts +4 -0
- package/dist/crypto/ecies/__tests__/native-parity.test.d.ts +7 -0
- package/dist/crypto/ecies/__tests__/normalization.test.d.ts +1 -0
- package/dist/crypto/ecies/__tests__/test-vectors.d.ts +2 -4
- package/dist/crypto/ecies/base.cjs +4 -3
- package/dist/crypto/ecies/base.cjs.map +1 -1
- package/dist/crypto/ecies/base.d.ts +2 -5
- package/dist/crypto/ecies/base.js +12 -15
- package/dist/crypto/ecies/base.js.map +1 -1
- package/dist/crypto/ecies/browser.cjs +2 -1
- package/dist/crypto/ecies/browser.cjs.map +1 -1
- package/dist/crypto/ecies/browser.d.ts +2 -7
- package/dist/crypto/ecies/browser.js +2 -1
- package/dist/crypto/ecies/browser.js.map +1 -1
- package/dist/crypto/ecies/constants.d.ts +7 -9
- package/dist/crypto/ecies/index.d.ts +8 -1
- package/dist/crypto/ecies/interface.cjs +4 -5
- package/dist/crypto/ecies/interface.cjs.map +1 -1
- package/dist/crypto/ecies/interface.d.ts +9 -11
- package/dist/crypto/ecies/interface.js +4 -5
- package/dist/crypto/ecies/interface.js.map +1 -1
- package/dist/crypto/ecies/node.cjs +3 -2
- package/dist/crypto/ecies/node.cjs.map +1 -1
- package/dist/crypto/ecies/node.d.ts +2 -7
- package/dist/crypto/ecies/node.js +11 -16
- package/dist/crypto/ecies/node.js.map +1 -1
- package/dist/crypto/ecies/utils.cjs +2 -41
- package/dist/crypto/ecies/utils.cjs.map +1 -1
- package/dist/crypto/ecies/utils.d.ts +3 -40
- package/dist/crypto/ecies/utils.js +1 -35
- package/dist/crypto/ecies/utils.js.map +1 -1
- package/dist/crypto/services/WalletKeyEncryptionService.cjs +2 -2
- package/dist/crypto/services/WalletKeyEncryptionService.cjs.map +1 -1
- package/dist/crypto/services/WalletKeyEncryptionService.d.ts +3 -7
- package/dist/crypto/services/WalletKeyEncryptionService.js +5 -9
- package/dist/crypto/services/WalletKeyEncryptionService.js.map +1 -1
- package/dist/crypto/services/WalletKeyEncryptionService.test.d.ts +1 -0
- package/dist/diagnostics.d.ts +1 -3
- package/dist/diagnostics.test.d.ts +1 -0
- package/dist/errors.cjs +16 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +53 -15
- package/dist/errors.js +18 -6
- package/dist/errors.js.map +1 -1
- package/dist/generated/abi/ComputeEngineImplementation.d.ts +2 -3
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DATFactoryImplementation.d.ts +2 -3
- package/dist/generated/abi/DATImplementation.d.ts +2 -3
- package/dist/generated/abi/DATPausableImplementation.d.ts +2 -3
- package/dist/generated/abi/DATVotesImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPPerformanceImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRootImplementation.d.ts +1 -3
- package/dist/generated/abi/DLPTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +1 -3
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +2 -3
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +2 -3
- package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +2 -3
- package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DataRegistryImplementation.cjs +13 -0
- package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.d.ts +12 -3
- package/dist/generated/abi/DataRegistryImplementation.js +13 -0
- package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/QueryEngineImplementation.d.ts +2 -3
- package/dist/generated/abi/SwapHelperImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaEpochImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/index.cjs +42 -0
- package/dist/generated/abi/index.cjs.map +1 -1
- package/dist/generated/abi/index.d.ts +47 -18
- package/dist/generated/abi/index.js +21 -0
- package/dist/generated/abi/index.js.map +1 -1
- package/dist/generated/event-types.cjs +17 -0
- package/dist/generated/event-types.cjs.map +1 -0
- package/dist/generated/event-types.d.ts +854 -0
- package/dist/generated/event-types.js +1 -0
- package/dist/generated/event-types.js.map +1 -0
- package/dist/generated/eventRegistry.cjs +3351 -0
- package/dist/generated/eventRegistry.cjs.map +1 -0
- package/dist/generated/eventRegistry.d.ts +14 -0
- package/dist/generated/eventRegistry.js +3326 -0
- package/dist/generated/eventRegistry.js.map +1 -0
- package/dist/generated/server/server-exports.d.ts +19 -21
- package/dist/generated/server/server.cjs.map +1 -1
- package/dist/generated/server/server.d.ts +113 -87
- package/dist/generated/subgraph.d.ts +329 -332
- package/dist/index.browser.d.ts +48 -73
- package/dist/index.browser.js +12 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +12 -0
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +183 -64
- package/dist/index.node.js +12 -0
- package/dist/index.node.js.map +1 -1
- package/dist/node.d.ts +4 -2
- package/dist/platform/browser-only.d.ts +5 -8
- package/dist/platform/browser-only.test.d.ts +1 -0
- package/dist/platform/browser-safe.d.ts +6 -9
- package/dist/platform/browser-safe.test.d.ts +1 -0
- package/dist/platform/browser.cjs +7 -6
- package/dist/platform/browser.cjs.map +1 -1
- package/dist/platform/browser.d.ts +3 -6
- package/dist/platform/browser.js +19 -27
- package/dist/platform/browser.js.map +1 -1
- package/dist/platform/browser.test.d.ts +1 -0
- package/dist/platform/index.d.ts +11 -5
- package/dist/platform/interface.d.ts +6 -8
- package/dist/platform/node.d.ts +3 -7
- package/dist/platform/node.js +12 -19
- package/dist/platform/node.js.map +1 -1
- package/dist/platform/ports/openpgp-port.cjs +74 -0
- package/dist/platform/ports/openpgp-port.cjs.map +1 -0
- package/dist/platform/ports/openpgp-port.d.ts +13 -0
- package/dist/platform/ports/openpgp-port.js +59 -0
- package/dist/platform/ports/openpgp-port.js.map +1 -0
- package/dist/platform/ports/pgp-port.cjs +17 -0
- package/dist/platform/ports/pgp-port.cjs.map +1 -0
- package/dist/platform/ports/pgp-port.d.ts +35 -0
- package/dist/platform/ports/pgp-port.js +1 -0
- package/dist/platform/ports/pgp-port.js.map +1 -0
- package/dist/platform/shared/error-utils.d.ts +2 -4
- package/dist/platform/shared/pgp-utils.cjs +2 -2
- package/dist/platform/shared/pgp-utils.cjs.map +1 -1
- package/dist/platform/shared/pgp-utils.d.ts +3 -5
- package/dist/platform/shared/pgp-utils.js +2 -2
- package/dist/platform/shared/pgp-utils.js.map +1 -1
- package/dist/platform/shared/stream-utils.d.ts +1 -3
- package/dist/platform/utils.d.ts +6 -10
- package/dist/platform/utils.test.d.ts +1 -0
- package/dist/platform.browser.d.ts +9 -4
- package/dist/platform.d.ts +11 -5
- package/dist/platform.node.d.ts +10 -5
- package/dist/server/handler.cjs +7 -5
- package/dist/server/handler.cjs.map +1 -1
- package/dist/server/handler.d.ts +17 -204
- package/dist/server/handler.js +7 -5
- package/dist/server/handler.js.map +1 -1
- package/dist/server/relayerHandler.cjs +220 -0
- package/dist/server/relayerHandler.cjs.map +1 -0
- package/dist/server/relayerHandler.d.ts +37 -0
- package/dist/server/relayerHandler.js +195 -0
- package/dist/server/relayerHandler.js.map +1 -0
- package/dist/storage/index.d.ts +56 -10
- package/dist/storage/manager.cjs +2 -2
- package/dist/storage/manager.cjs.map +1 -1
- package/dist/storage/manager.d.ts +2 -5
- package/dist/storage/manager.js +5 -12
- package/dist/storage/manager.js.map +1 -1
- package/dist/storage/providers/callback-storage.cjs +3 -3
- package/dist/storage/providers/callback-storage.cjs.map +1 -1
- package/dist/storage/providers/callback-storage.d.ts +3 -9
- package/dist/storage/providers/callback-storage.js +3 -3
- package/dist/storage/providers/callback-storage.js.map +1 -1
- package/dist/storage/providers/google-drive.cjs +2 -2
- package/dist/storage/providers/google-drive.cjs.map +1 -1
- package/dist/storage/providers/google-drive.d.ts +3 -7
- package/dist/storage/providers/google-drive.js +4 -7
- package/dist/storage/providers/google-drive.js.map +1 -1
- package/dist/storage/providers/google-drive.test.d.ts +1 -0
- package/dist/storage/providers/ipfs.cjs +5 -5
- package/dist/storage/providers/ipfs.cjs.map +1 -1
- package/dist/storage/providers/ipfs.d.ts +3 -6
- package/dist/storage/providers/ipfs.js +7 -10
- package/dist/storage/providers/ipfs.js.map +1 -1
- package/dist/storage/providers/pinata.cjs +6 -6
- package/dist/storage/providers/pinata.cjs.map +1 -1
- package/dist/storage/providers/pinata.d.ts +5 -8
- package/dist/storage/providers/pinata.js +8 -11
- package/dist/storage/providers/pinata.js.map +1 -1
- package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
- package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
- package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
- package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
- package/dist/storage/tests/storageManager.test.d.ts +1 -0
- package/dist/tests/abi.test.d.ts +1 -0
- package/dist/tests/chains-definitions.test.d.ts +1 -0
- package/dist/tests/core-encryption.test.d.ts +1 -0
- package/dist/tests/core-extended.test.d.ts +1 -0
- package/dist/tests/core-generics-coverage.test.d.ts +1 -0
- package/dist/tests/coverage-boost.test.d.ts +1 -0
- package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
- package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
- package/dist/tests/data-additional-methods.test.d.ts +1 -0
- package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
- package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
- package/dist/tests/data-relayer.test.d.ts +1 -0
- package/dist/tests/data-schema-validation.test.d.ts +1 -0
- package/dist/tests/data-simple-methods.test.d.ts +1 -0
- package/dist/tests/data.test.d.ts +1 -0
- package/dist/tests/demo-integration.test.d.ts +1 -0
- package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
- package/dist/tests/download-relayer.test.d.ts +1 -0
- package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
- package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
- package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
- package/dist/tests/encryption-coverage.test.d.ts +1 -0
- package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
- package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
- package/dist/tests/errors-coverage.test.d.ts +1 -0
- package/dist/tests/errors.test.d.ts +1 -0
- package/dist/tests/factories/mockFactory.d.ts +316 -0
- package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
- package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
- package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
- package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
- package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
- package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
- package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
- package/dist/tests/helper-methods.test.d.ts +1 -0
- package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
- package/dist/tests/helpers/typedMocks.d.ts +64 -0
- package/dist/tests/index-browser.test.d.ts +1 -0
- package/dist/tests/index-node.test.d.ts +1 -0
- package/dist/tests/index.test.d.ts +1 -0
- package/dist/tests/mocks/platformAdapter.d.ts +12 -0
- package/dist/tests/new-permissions-methods.test.d.ts +1 -0
- package/dist/tests/no-buffer-browser.test.d.ts +1 -0
- package/dist/tests/permissions-grantee.test.d.ts +1 -0
- package/dist/tests/permissions-revoke-relayer.test.d.ts +1 -0
- package/dist/tests/permissions-schema-validation.test.d.ts +1 -0
- package/dist/tests/permissions-server-files.test.d.ts +1 -0
- package/dist/tests/permissions-trust-servers.test.d.ts +1 -0
- package/dist/tests/permissions.test.d.ts +1 -0
- package/dist/tests/personal.test.d.ts +1 -0
- package/dist/tests/platform-browser.test.d.ts +1 -0
- package/dist/tests/platform-crypto-expanded.test.d.ts +1 -0
- package/dist/tests/platform-crypto.test.d.ts +1 -0
- package/dist/tests/platform-index.test.d.ts +1 -0
- package/dist/tests/platform-node.test.d.ts +1 -0
- package/dist/tests/platform-shared-utils.test.d.ts +1 -0
- package/dist/tests/platform-updated.test.d.ts +1 -0
- package/dist/tests/protocol-additional-methods.test.d.ts +1 -0
- package/dist/tests/protocol.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/schemas.test.d.ts +1 -0
- package/dist/tests/server-handler.test.d.ts +1 -0
- package/dist/tests/server-relayer-handler.test.d.ts +1 -0
- package/dist/tests/setup.d.ts +7 -0
- package/dist/tests/signatureFormatter.test.d.ts +1 -0
- package/dist/tests/trusted-server-queries.test.d.ts +1 -0
- package/dist/tests/typedDataConverter.test.d.ts +1 -0
- package/dist/tests/types-contracts.test.d.ts +1 -0
- package/dist/tests/types-data.test.d.ts +1 -0
- package/dist/tests/types-external-apis.test.d.ts +1 -0
- package/dist/tests/types-generics.test.d.ts +1 -0
- package/dist/tests/types-permissions.test.d.ts +1 -0
- package/dist/tests/types-upload-params.test.d.ts +1 -0
- package/dist/tests/types.test.d.ts +1 -0
- package/dist/tests/utils-formatters.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles.test.d.ts +1 -0
- package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
- package/dist/tests/utils-grants.test.d.ts +1 -0
- package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
- package/dist/tests/utils-ipfs.test.d.ts +4 -0
- package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
- package/dist/tests/vana.test.d.ts +1 -0
- package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
- package/dist/types/blockchain.cjs +17 -0
- package/dist/types/blockchain.cjs.map +1 -0
- package/dist/types/blockchain.d.ts +57 -0
- package/dist/types/blockchain.js +1 -0
- package/dist/types/blockchain.js.map +1 -0
- package/dist/types/chains-additional.test.d.ts +1 -0
- package/dist/types/chains.d.ts +6 -9
- package/dist/types/config.cjs +10 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +198 -238
- 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 +8 -11
- package/dist/types/controller-context.cjs +17 -0
- package/dist/types/controller-context.cjs.map +1 -0
- package/dist/types/controller-context.d.ts +65 -0
- package/dist/types/controller-context.js +1 -0
- package/dist/types/controller-context.js.map +1 -0
- package/dist/types/data.cjs.map +1 -1
- package/dist/types/data.d.ts +107 -39
- package/dist/types/external-apis.d.ts +10 -12
- package/dist/types/generics.d.ts +35 -38
- package/dist/types/index.cjs +5 -4
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +20 -34
- package/dist/types/index.js +9 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/operations.cjs +2 -2
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +32 -28
- package/dist/types/operations.js +2 -2
- package/dist/types/operations.js.map +1 -1
- package/dist/types/permissions.d.ts +55 -58
- package/dist/types/personal.cjs.map +1 -1
- package/dist/types/personal.d.ts +6 -8
- package/dist/types/relayer.cjs.map +1 -1
- package/dist/types/relayer.d.ts +186 -39
- package/dist/types/storage.d.ts +6 -8
- package/dist/types/storage.js +2 -5
- package/dist/types/storage.js.map +1 -1
- package/dist/types/transactionResults.cjs.map +1 -1
- package/dist/types/transactionResults.d.ts +193 -25
- package/dist/types/utils.d.ts +21 -24
- package/dist/types.d.ts +4 -40
- package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
- package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
- package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
- package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
- package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
- package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
- package/dist/utils/blockchain/registry.cjs +2 -2
- package/dist/utils/blockchain/registry.cjs.map +1 -1
- package/dist/utils/blockchain/registry.d.ts +6 -8
- package/dist/utils/blockchain/registry.js +2 -2
- package/dist/utils/blockchain/registry.js.map +1 -1
- package/dist/utils/blockchain/registry.test.d.ts +1 -0
- package/dist/utils/crypto-utils.cjs +0 -12
- package/dist/utils/crypto-utils.cjs.map +1 -1
- package/dist/utils/crypto-utils.d.ts +9 -27
- package/dist/utils/crypto-utils.js +0 -11
- package/dist/utils/crypto-utils.js.map +1 -1
- package/dist/utils/crypto-utils.test.d.ts +1 -0
- package/dist/utils/download.cjs +3 -3
- package/dist/utils/download.cjs.map +1 -1
- package/dist/utils/download.d.ts +13 -14
- package/dist/utils/download.js +2 -2
- package/dist/utils/download.js.map +1 -1
- package/dist/utils/encoding.cjs +1 -1
- package/dist/utils/encoding.cjs.map +1 -1
- package/dist/utils/encoding.d.ts +4 -6
- package/dist/utils/encoding.js +1 -1
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/encoding.test.d.ts +1 -0
- package/dist/utils/encryption.cjs +16 -10
- package/dist/utils/encryption.cjs.map +1 -1
- package/dist/utils/encryption.d.ts +13 -17
- package/dist/utils/encryption.js +16 -10
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/formatters.cjs +4 -2
- package/dist/utils/formatters.cjs.map +1 -1
- package/dist/utils/formatters.d.ts +4 -6
- package/dist/utils/formatters.js +4 -2
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/grantFiles.cjs +7 -4
- package/dist/utils/grantFiles.cjs.map +1 -1
- package/dist/utils/grantFiles.d.ts +6 -10
- package/dist/utils/grantFiles.js +7 -4
- package/dist/utils/grantFiles.js.map +1 -1
- package/dist/utils/grantValidation.cjs +1 -1
- package/dist/utils/grantValidation.cjs.map +1 -1
- package/dist/utils/grantValidation.d.ts +14 -17
- package/dist/utils/grantValidation.js +1 -1
- package/dist/utils/grantValidation.js.map +1 -1
- package/dist/utils/grants.cjs +1 -1
- package/dist/utils/grants.cjs.map +1 -1
- package/dist/utils/grants.d.ts +10 -13
- package/dist/utils/grants.js +1 -1
- package/dist/utils/grants.js.map +1 -1
- package/dist/utils/ipfs.d.ts +8 -10
- package/dist/utils/lazy-import.cjs +4 -6
- package/dist/utils/lazy-import.cjs.map +1 -1
- package/dist/utils/lazy-import.d.ts +1 -3
- package/dist/utils/lazy-import.js +4 -6
- package/dist/utils/lazy-import.js.map +1 -1
- package/dist/utils/multicall.cjs +4 -2
- package/dist/utils/multicall.cjs.map +1 -1
- package/dist/utils/multicall.d.ts +5 -8
- package/dist/utils/multicall.js +4 -2
- package/dist/utils/multicall.js.map +1 -1
- package/dist/utils/parseTransactionPojo.cjs +87 -0
- package/dist/utils/parseTransactionPojo.cjs.map +1 -0
- package/dist/utils/parseTransactionPojo.d.ts +31 -0
- package/dist/utils/parseTransactionPojo.js +63 -0
- package/dist/utils/parseTransactionPojo.js.map +1 -0
- package/dist/utils/schemaValidation.cjs +5 -5
- package/dist/utils/schemaValidation.cjs.map +1 -1
- package/dist/utils/schemaValidation.d.ts +8 -12
- package/dist/utils/schemaValidation.js +7 -10
- package/dist/utils/schemaValidation.js.map +1 -1
- package/dist/utils/signatureCache.cjs +1 -2
- package/dist/utils/signatureCache.cjs.map +1 -1
- package/dist/utils/signatureCache.d.ts +4 -7
- package/dist/utils/signatureCache.js +4 -8
- package/dist/utils/signatureCache.js.map +1 -1
- package/dist/utils/signatureFormatter.cjs +6 -9
- package/dist/utils/signatureFormatter.cjs.map +1 -1
- package/dist/utils/signatureFormatter.d.ts +2 -5
- package/dist/utils/signatureFormatter.js +6 -9
- package/dist/utils/signatureFormatter.js.map +1 -1
- package/dist/utils/tests/multicall.test.d.ts +1 -0
- package/dist/utils/transactionHelpers.cjs +54 -0
- package/dist/utils/transactionHelpers.cjs.map +1 -0
- package/dist/utils/transactionHelpers.d.ts +80 -0
- package/dist/utils/transactionHelpers.js +29 -0
- package/dist/utils/transactionHelpers.js.map +1 -0
- package/dist/utils/typeGuards.cjs +109 -0
- package/dist/utils/typeGuards.cjs.map +1 -0
- package/dist/utils/typeGuards.d.ts +138 -0
- package/dist/utils/typeGuards.js +74 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/typedDataConverter.d.ts +3 -6
- package/dist/utils/urlResolver.cjs +1 -1
- package/dist/utils/urlResolver.cjs.map +1 -1
- package/dist/utils/urlResolver.d.ts +2 -4
- package/dist/utils/urlResolver.js +2 -2
- 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 +32 -0
- package/dist/utils/wallet.js +37 -0
- package/dist/utils/wallet.js.map +1 -0
- package/dist/{chains.browser.cjs → utils/withEvents.cjs} +22 -15
- package/dist/utils/withEvents.cjs.map +1 -0
- package/dist/utils/withEvents.d.ts +56 -0
- package/dist/utils/withEvents.js +18 -0
- package/dist/utils/withEvents.js.map +1 -0
- package/package.json +23 -14
- package/dist/browser.d.cts +0 -2
- package/dist/chains/definitions.d.cts +0 -53
- package/dist/chains/index.d.cts +0 -2
- package/dist/chains.browser.cjs.map +0 -1
- package/dist/chains.browser.d.cts +0 -2
- package/dist/chains.d.cts +0 -2
- package/dist/chains.node.d.cts +0 -2
- package/dist/config/addresses.d.cts +0 -380
- package/dist/config/chains.d.cts +0 -85
- package/dist/config/eventMappings.cjs +0 -114
- package/dist/config/eventMappings.cjs.map +0 -1
- package/dist/config/eventMappings.d.cts +0 -108
- package/dist/config/eventMappings.d.ts +0 -108
- package/dist/config/eventMappings.js +0 -90
- package/dist/config/eventMappings.js.map +0 -1
- package/dist/config/features.d.cts +0 -64
- package/dist/contracts/contractController.d.cts +0 -96
- package/dist/controllers/data.d.cts +0 -941
- package/dist/controllers/permissions.d.cts +0 -25
- package/dist/controllers/protocol.d.cts +0 -167
- package/dist/controllers/schemas.d.cts +0 -272
- package/dist/controllers/server.d.cts +0 -243
- package/dist/core/apiClient.d.cts +0 -165
- package/dist/core/client.d.cts +0 -92
- package/dist/core/generics.d.cts +0 -120
- package/dist/core.d.cts +0 -466
- package/dist/crypto/ecies/__tests__/test-vectors.d.cts +0 -40
- package/dist/crypto/ecies/base.d.cts +0 -143
- package/dist/crypto/ecies/browser.d.cts +0 -48
- package/dist/crypto/ecies/constants.d.cts +0 -122
- package/dist/crypto/ecies/index.d.cts +0 -1
- package/dist/crypto/ecies/interface.d.cts +0 -176
- package/dist/crypto/ecies/node.d.cts +0 -50
- package/dist/crypto/ecies/test-vectors/eccrypto-vectors.d.cts +0 -76
- package/dist/crypto/ecies/test-vectors/eccrypto-vectors.d.ts +0 -76
- package/dist/crypto/ecies/utils.d.cts +0 -67
- package/dist/crypto/services/WalletKeyEncryptionService.d.cts +0 -92
- package/dist/diagnostics.d.cts +0 -26
- package/dist/errors.d.cts +0 -350
- package/dist/generated/abi/ComputeEngineImplementation.d.cts +0 -996
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.cts +0 -545
- package/dist/generated/abi/DATFactoryImplementation.d.cts +0 -661
- package/dist/generated/abi/DATImplementation.d.cts +0 -693
- package/dist/generated/abi/DATPausableImplementation.d.cts +0 -1145
- package/dist/generated/abi/DATVotesImplementation.d.cts +0 -1095
- package/dist/generated/abi/DLPPerformanceImplementation.d.cts +0 -883
- package/dist/generated/abi/DLPRegistryImplementation.d.cts +0 -1123
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.cts +0 -452
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.cts +0 -714
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.cts +0 -452
- package/dist/generated/abi/DLPRewardSwapImplementation.d.cts +0 -706
- package/dist/generated/abi/DLPRootImplementation.d.cts +0 -1248
- package/dist/generated/abi/DLPTreasuryImplementation.d.cts +0 -452
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.cts +0 -737
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.cts +0 -661
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.cts +0 -989
- package/dist/generated/abi/DataPortabilityServersImplementation.d.cts +0 -1086
- package/dist/generated/abi/DataRefinerRegistryImplementation.d.cts +0 -737
- package/dist/generated/abi/DataRegistryImplementation.d.cts +0 -1004
- package/dist/generated/abi/QueryEngineImplementation.d.cts +0 -1001
- package/dist/generated/abi/SwapHelperImplementation.d.cts +0 -764
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolImplementation.d.cts +0 -993
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolPhalaImplementation.d.cts +0 -993
- package/dist/generated/abi/VanaEpochImplementation.d.cts +0 -900
- package/dist/generated/abi/VanaPoolEntityImplementation.d.cts +0 -934
- package/dist/generated/abi/VanaPoolStakingImplementation.d.cts +0 -693
- package/dist/generated/abi/VanaPoolTreasuryImplementation.d.cts +0 -394
- package/dist/generated/abi/index.d.cts +0 -26516
- package/dist/generated/server/server-exports.d.cts +0 -21
- package/dist/generated/server/server.d.cts +0 -512
- package/dist/generated/subgraph.d.cts +0 -5981
- package/dist/index.browser.cjs +0 -151
- package/dist/index.browser.cjs.map +0 -1
- package/dist/index.browser.d.cts +0 -177
- package/dist/index.d.cts +0 -2
- package/dist/index.node.d.cts +0 -64
- package/dist/node.d.cts +0 -2
- package/dist/permissions-DNKPu_G0.d.cts +0 -1666
- package/dist/permissions-eo8YeLGf.d.ts +0 -1666
- package/dist/platform/browser-only.d.cts +0 -25
- package/dist/platform/browser-safe.d.cts +0 -32
- package/dist/platform/browser.d.cts +0 -74
- package/dist/platform/index.d.cts +0 -5
- package/dist/platform/interface.d.cts +0 -218
- package/dist/platform/node.d.cts +0 -27
- package/dist/platform/shared/error-utils.d.cts +0 -25
- package/dist/platform/shared/pgp-utils.d.cts +0 -61
- package/dist/platform/shared/stream-utils.d.cts +0 -16
- package/dist/platform/utils.d.cts +0 -53
- package/dist/platform.browser.cjs +0 -41
- package/dist/platform.browser.cjs.map +0 -1
- package/dist/platform.browser.d.cts +0 -4
- package/dist/platform.d.cts +0 -5
- package/dist/platform.node.d.cts +0 -5
- package/dist/schemas/dataSchema.schema.d.cts +0 -88
- package/dist/schemas/dataSchema.schema.d.ts +0 -88
- package/dist/schemas/grantFile.schema.d.cts +0 -57
- package/dist/schemas/grantFile.schema.d.ts +0 -57
- package/dist/server/handler.d.cts +0 -282
- package/dist/storage/index.d.cts +0 -10
- package/dist/storage/manager.d.cts +0 -150
- package/dist/storage/providers/callback-storage.d.cts +0 -100
- package/dist/storage/providers/google-drive.d.cts +0 -156
- package/dist/storage/providers/ipfs.d.cts +0 -163
- package/dist/storage/providers/pinata.d.cts +0 -173
- package/dist/types/chains.d.cts +0 -34
- package/dist/types/config.d.cts +0 -726
- package/dist/types/contracts.d.cts +0 -68
- package/dist/types/data.d.cts +0 -694
- package/dist/types/eccrypto-js.d.d.cts +0 -13
- package/dist/types/eccrypto-js.d.d.ts +0 -13
- package/dist/types/external-apis.d.cts +0 -186
- package/dist/types/generics.d.cts +0 -450
- package/dist/types/index.d.cts +0 -34
- package/dist/types/operations.d.cts +0 -108
- package/dist/types/permissions.d.cts +0 -957
- package/dist/types/personal.d.cts +0 -40
- package/dist/types/relayer.d.cts +0 -284
- package/dist/types/storage.d.cts +0 -131
- package/dist/types/transactionResults.d.cts +0 -25
- package/dist/types/utils.d.cts +0 -819
- package/dist/types.d.cts +0 -66
- package/dist/utils/blockchain/registry.d.cts +0 -34
- package/dist/utils/crypto-utils.d.cts +0 -118
- package/dist/utils/download.d.cts +0 -41
- package/dist/utils/encoding.d.cts +0 -54
- package/dist/utils/encryption.d.cts +0 -275
- package/dist/utils/eventParsing.cjs +0 -111
- package/dist/utils/eventParsing.cjs.map +0 -1
- package/dist/utils/eventParsing.d.cts +0 -60
- package/dist/utils/eventParsing.d.ts +0 -60
- package/dist/utils/eventParsing.js +0 -86
- package/dist/utils/eventParsing.js.map +0 -1
- package/dist/utils/formatters.d.cts +0 -120
- package/dist/utils/grantFiles.d.cts +0 -186
- package/dist/utils/grantValidation.d.cts +0 -150
- package/dist/utils/grants.d.cts +0 -70
- package/dist/utils/ipfs.d.cts +0 -90
- package/dist/utils/lazy-import.d.cts +0 -20
- package/dist/utils/multicall.d.cts +0 -129
- package/dist/utils/schemaValidation.d.cts +0 -172
- package/dist/utils/signatureCache.d.cts +0 -134
- package/dist/utils/signatureFormatter.d.cts +0 -39
- package/dist/utils/transactionParsing.cjs +0 -84
- package/dist/utils/transactionParsing.cjs.map +0 -1
- package/dist/utils/transactionParsing.d.cts +0 -25
- package/dist/utils/transactionParsing.d.ts +0 -25
- package/dist/utils/transactionParsing.js +0 -62
- package/dist/utils/transactionParsing.js.map +0 -1
- package/dist/utils/typedDataConverter.d.cts +0 -13
- package/dist/utils/urlResolver.d.cts +0 -40
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { SignatureError } from "../errors";
|
|
2
|
+
import { recoverTypedDataAddress, getAddress } from "viem";
|
|
3
|
+
async function handleRelayerOperation(sdk, request) {
|
|
4
|
+
if (request.type === "signed") {
|
|
5
|
+
return handleSignedOperation(sdk, request);
|
|
6
|
+
}
|
|
7
|
+
return handleDirectOperation(sdk, request);
|
|
8
|
+
}
|
|
9
|
+
async function handleSignedOperation(sdk, request) {
|
|
10
|
+
const { typedData, signature, expectedUserAddress } = request;
|
|
11
|
+
let recoveredAddress;
|
|
12
|
+
try {
|
|
13
|
+
recoveredAddress = await recoverTypedDataAddress({
|
|
14
|
+
domain: {
|
|
15
|
+
...typedData.domain,
|
|
16
|
+
chainId: typedData.domain.chainId ? BigInt(typedData.domain.chainId) : void 0
|
|
17
|
+
},
|
|
18
|
+
types: typedData.types,
|
|
19
|
+
primaryType: typedData.primaryType,
|
|
20
|
+
message: typedData.message,
|
|
21
|
+
signature
|
|
22
|
+
});
|
|
23
|
+
} catch (error) {
|
|
24
|
+
throw new SignatureError(
|
|
25
|
+
`Signature verification failed: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
if (expectedUserAddress) {
|
|
29
|
+
const normalizedExpected = getAddress(expectedUserAddress);
|
|
30
|
+
const normalizedSigner = getAddress(recoveredAddress);
|
|
31
|
+
if (normalizedSigner !== normalizedExpected) {
|
|
32
|
+
throw new SignatureError(
|
|
33
|
+
`Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected})`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const result = await routeSignedOperation(sdk, typedData, signature);
|
|
38
|
+
return {
|
|
39
|
+
type: "signed",
|
|
40
|
+
hash: result.hash
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function routeSignedOperation(sdk, typedData, signature) {
|
|
44
|
+
const primaryType = typedData.primaryType;
|
|
45
|
+
switch (primaryType) {
|
|
46
|
+
case "Permission":
|
|
47
|
+
return sdk.permissions.submitSignedGrant(
|
|
48
|
+
{
|
|
49
|
+
...typedData,
|
|
50
|
+
primaryType: "Permission"
|
|
51
|
+
},
|
|
52
|
+
signature
|
|
53
|
+
);
|
|
54
|
+
case "RevokePermission":
|
|
55
|
+
return sdk.permissions.submitSignedRevoke(
|
|
56
|
+
{
|
|
57
|
+
...typedData,
|
|
58
|
+
primaryType: "RevokePermission"
|
|
59
|
+
},
|
|
60
|
+
signature
|
|
61
|
+
);
|
|
62
|
+
case "TrustServer":
|
|
63
|
+
return sdk.permissions.submitSignedTrustServer(
|
|
64
|
+
{
|
|
65
|
+
...typedData,
|
|
66
|
+
primaryType: "TrustServer"
|
|
67
|
+
},
|
|
68
|
+
signature
|
|
69
|
+
);
|
|
70
|
+
case "AddServer":
|
|
71
|
+
return sdk.permissions.submitSignedAddAndTrustServer(
|
|
72
|
+
{
|
|
73
|
+
...typedData,
|
|
74
|
+
primaryType: "AddServer"
|
|
75
|
+
},
|
|
76
|
+
signature
|
|
77
|
+
);
|
|
78
|
+
case "UntrustServer":
|
|
79
|
+
return sdk.permissions.submitSignedUntrustServer(
|
|
80
|
+
{
|
|
81
|
+
...typedData,
|
|
82
|
+
primaryType: "UntrustServer"
|
|
83
|
+
},
|
|
84
|
+
signature
|
|
85
|
+
);
|
|
86
|
+
case "ServerFilesAndPermission":
|
|
87
|
+
return sdk.permissions.submitSignedAddServerFilesAndPermissions(
|
|
88
|
+
{
|
|
89
|
+
...typedData,
|
|
90
|
+
primaryType: "ServerFilesAndPermission"
|
|
91
|
+
},
|
|
92
|
+
signature
|
|
93
|
+
);
|
|
94
|
+
// RegisterGrantee is commented out as it's not supported by smart contracts yet
|
|
95
|
+
// case "RegisterGrantee":
|
|
96
|
+
// return sdk.permissions.submitSignedRegisterGrantee(...);
|
|
97
|
+
default:
|
|
98
|
+
throw new Error(`Unsupported operation type: ${typedData.primaryType}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function handleDirectOperation(sdk, request) {
|
|
102
|
+
switch (request.operation) {
|
|
103
|
+
case "submitFileAddition": {
|
|
104
|
+
const { url, userAddress } = request.params;
|
|
105
|
+
const result = await sdk.data.addFileWithPermissions(
|
|
106
|
+
url,
|
|
107
|
+
userAddress,
|
|
108
|
+
[]
|
|
109
|
+
// No permissions
|
|
110
|
+
);
|
|
111
|
+
const eventData = await sdk.waitForTransactionEvents(result);
|
|
112
|
+
const fileId = eventData.expectedEvents?.FileAdded?.fileId;
|
|
113
|
+
if (!fileId) {
|
|
114
|
+
throw new Error("Failed to get fileId from transaction events");
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
type: "direct",
|
|
118
|
+
result: {
|
|
119
|
+
fileId: Number(fileId),
|
|
120
|
+
transactionHash: result.hash
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
case "submitFileAdditionWithPermissions": {
|
|
125
|
+
const { url, userAddress, permissions } = request.params;
|
|
126
|
+
const result = await sdk.data.addFileWithPermissions(
|
|
127
|
+
url,
|
|
128
|
+
userAddress,
|
|
129
|
+
permissions
|
|
130
|
+
);
|
|
131
|
+
const eventData = await sdk.waitForTransactionEvents(result);
|
|
132
|
+
const fileId = eventData.expectedEvents?.FileAdded?.fileId;
|
|
133
|
+
if (!fileId) {
|
|
134
|
+
throw new Error("Failed to get fileId from transaction events");
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
type: "direct",
|
|
138
|
+
result: {
|
|
139
|
+
fileId: Number(fileId),
|
|
140
|
+
transactionHash: result.hash
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
case "submitFileAdditionComplete": {
|
|
145
|
+
const { url, userAddress, permissions, schemaId, ownerAddress } = request.params;
|
|
146
|
+
const sdkPermissions = permissions.map((p) => ({
|
|
147
|
+
account: p.account,
|
|
148
|
+
publicKey: p.key
|
|
149
|
+
// Map 'key' to 'publicKey'
|
|
150
|
+
}));
|
|
151
|
+
const result = await sdk.data.addFileWithPermissionsAndSchema(
|
|
152
|
+
url,
|
|
153
|
+
ownerAddress ?? userAddress,
|
|
154
|
+
sdkPermissions,
|
|
155
|
+
schemaId
|
|
156
|
+
);
|
|
157
|
+
const eventData = await sdk.waitForTransactionEvents(result);
|
|
158
|
+
const fileId = eventData.expectedEvents?.FileAdded?.fileId;
|
|
159
|
+
if (!fileId) {
|
|
160
|
+
throw new Error("Failed to get fileId from transaction events");
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
type: "direct",
|
|
164
|
+
result: {
|
|
165
|
+
fileId: Number(fileId),
|
|
166
|
+
transactionHash: result.hash
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
case "storeGrantFile": {
|
|
171
|
+
const grantFile = request.params;
|
|
172
|
+
const blob = new Blob([JSON.stringify(grantFile)], {
|
|
173
|
+
type: "application/json"
|
|
174
|
+
});
|
|
175
|
+
const result = await sdk.data.upload({
|
|
176
|
+
content: blob,
|
|
177
|
+
filename: `grant-${Date.now()}.json`
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
type: "direct",
|
|
181
|
+
result: { url: result.url }
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
default: {
|
|
185
|
+
const exhaustiveCheck = request;
|
|
186
|
+
return exhaustiveCheck;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
import { handleRelayerRequest } from "./handler";
|
|
191
|
+
export {
|
|
192
|
+
handleRelayerOperation,
|
|
193
|
+
handleRelayerRequest
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=relayerHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/server/relayerHandler.ts"],"sourcesContent":["import type { VanaInstance } from \"../index.node\";\nimport type {\n UnifiedRelayerRequest,\n UnifiedRelayerResponse,\n SignedRelayerRequest,\n DirectRelayerRequest,\n} from \"../types/relayer\";\nimport type {\n GenericTypedData,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n TrustServerTypedData,\n AddAndTrustServerTypedData,\n ServerFilesAndPermissionTypedData,\n TypedDataPrimaryType,\n} from \"../types/permissions\";\nimport { SignatureError } from \"../errors\";\nimport { recoverTypedDataAddress, getAddress, type Hash } from \"viem\";\n\n/**\n * Universal handler for all relayer operations.\n *\n * This function processes both EIP-712 signed operations and direct operations,\n * automatically routing to the appropriate SDK methods.\n *\n * @param sdk - Initialized Vana SDK instance\n * @param request - The unified relayer request\n * @returns Promise resolving to operation-specific response\n *\n * @category Server\n * @example\n * ```typescript\n * // In your server endpoint (Next.js example):\n * import { handleRelayerOperation } from '@opendatalabs/vana-sdk/node';\n *\n * export async function POST(request: NextRequest) {\n * try {\n * const body = await request.json();\n * const vana = getServerVanaInstance(); // Your server SDK instance\n *\n * const result = await handleRelayerOperation(vana, body);\n *\n * return NextResponse.json(result);\n * } catch (error) {\n * return NextResponse.json(\n * { error: error.message },\n * { status: 500 }\n * );\n * }\n * }\n * ```\n */\nexport async function handleRelayerOperation(\n sdk: VanaInstance,\n request: UnifiedRelayerRequest,\n): Promise<UnifiedRelayerResponse> {\n // Handle signed operations (EIP-712)\n if (request.type === \"signed\") {\n return handleSignedOperation(sdk, request);\n }\n\n // Handle direct operations (non-signed)\n return handleDirectOperation(sdk, request);\n}\n\n/**\n * Handle EIP-712 signed operations with full type safety\n */\nasync function handleSignedOperation(\n sdk: VanaInstance,\n request: SignedRelayerRequest,\n): Promise<UnifiedRelayerResponse> {\n const { typedData, signature, expectedUserAddress } = request;\n\n // Step 1: Verify the signature (security check)\n let recoveredAddress: `0x${string}`;\n try {\n recoveredAddress = await recoverTypedDataAddress({\n domain: {\n ...typedData.domain,\n chainId: typedData.domain.chainId\n ? BigInt(typedData.domain.chainId)\n : undefined,\n },\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n } catch (error) {\n // Handle signature verification errors\n throw new SignatureError(\n `Signature verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Optional security check: Verify the signer matches expected address\n if (expectedUserAddress) {\n const normalizedExpected = getAddress(expectedUserAddress);\n const normalizedSigner = getAddress(recoveredAddress);\n\n if (normalizedSigner !== normalizedExpected) {\n throw new SignatureError(\n `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected})`,\n );\n }\n }\n\n // Step 2: Route to appropriate SDK method based on primaryType\n // Using proper type narrowing instead of unsafe casts\n const result = await routeSignedOperation(sdk, typedData, signature);\n\n // Return the transaction hash with type\n return {\n type: \"signed\",\n hash: result.hash,\n };\n}\n\n/**\n * Route signed operations to the appropriate SDK method with type safety\n */\nasync function routeSignedOperation(\n sdk: VanaInstance,\n typedData: GenericTypedData,\n signature: Hash,\n) {\n const primaryType = typedData.primaryType as TypedDataPrimaryType;\n\n // Type-safe routing based on primaryType\n switch (primaryType) {\n case \"Permission\":\n // TypeScript knows this is a Permission operation\n return sdk.permissions.submitSignedGrant(\n {\n ...typedData,\n primaryType: \"Permission\",\n } as PermissionGrantTypedData,\n signature,\n );\n\n case \"RevokePermission\":\n return sdk.permissions.submitSignedRevoke(\n {\n ...typedData,\n primaryType: \"RevokePermission\",\n } as RevokePermissionTypedData,\n signature,\n );\n\n case \"TrustServer\":\n return sdk.permissions.submitSignedTrustServer(\n {\n ...typedData,\n primaryType: \"TrustServer\",\n } as TrustServerTypedData,\n signature,\n );\n\n case \"AddServer\":\n return sdk.permissions.submitSignedAddAndTrustServer(\n {\n ...typedData,\n primaryType: \"AddServer\",\n } as AddAndTrustServerTypedData,\n signature,\n );\n\n case \"UntrustServer\":\n return sdk.permissions.submitSignedUntrustServer(\n {\n ...typedData,\n primaryType: \"UntrustServer\",\n } as GenericTypedData,\n signature,\n );\n\n case \"ServerFilesAndPermission\":\n return sdk.permissions.submitSignedAddServerFilesAndPermissions(\n {\n ...typedData,\n primaryType: \"ServerFilesAndPermission\",\n } as ServerFilesAndPermissionTypedData,\n signature,\n );\n\n // RegisterGrantee is commented out as it's not supported by smart contracts yet\n // case \"RegisterGrantee\":\n // return sdk.permissions.submitSignedRegisterGrantee(...);\n\n default:\n throw new Error(`Unsupported operation type: ${typedData.primaryType}`);\n }\n}\n\n/**\n * Handle direct (non-signed) operations\n */\nasync function handleDirectOperation(\n sdk: VanaInstance,\n request: DirectRelayerRequest,\n): Promise<UnifiedRelayerResponse> {\n switch (request.operation) {\n case \"submitFileAddition\": {\n const { url, userAddress } = request.params;\n\n // Use SDK to add file with no permissions\n const result = await sdk.data.addFileWithPermissions(\n url,\n userAddress,\n [], // No permissions\n );\n\n // Wait for transaction events to get fileId\n const eventData = await sdk.waitForTransactionEvents(result);\n const fileId = eventData.expectedEvents?.FileAdded?.fileId;\n\n if (!fileId) {\n throw new Error(\"Failed to get fileId from transaction events\");\n }\n\n return {\n type: \"direct\",\n result: {\n fileId: Number(fileId),\n transactionHash: result.hash,\n },\n };\n }\n\n case \"submitFileAdditionWithPermissions\": {\n const { url, userAddress, permissions } = request.params;\n\n // Use SDK to add file with permissions\n const result = await sdk.data.addFileWithPermissions(\n url,\n userAddress,\n permissions,\n );\n\n // Wait for transaction events to get fileId\n const eventData = await sdk.waitForTransactionEvents(result);\n const fileId = eventData.expectedEvents?.FileAdded?.fileId;\n\n if (!fileId) {\n throw new Error(\"Failed to get fileId from transaction events\");\n }\n\n return {\n type: \"direct\",\n result: {\n fileId: Number(fileId),\n transactionHash: result.hash,\n },\n };\n }\n\n case \"submitFileAdditionComplete\": {\n const { url, userAddress, permissions, schemaId, ownerAddress } =\n request.params;\n\n // Map permissions from relayer format to SDK format\n const sdkPermissions = permissions.map((p) => ({\n account: p.account,\n publicKey: p.key, // Map 'key' to 'publicKey'\n }));\n\n // Use SDK to add file with permissions and schema\n const result = await sdk.data.addFileWithPermissionsAndSchema(\n url,\n ownerAddress ?? userAddress,\n sdkPermissions,\n schemaId,\n );\n\n // Wait for transaction events to get fileId\n const eventData = await sdk.waitForTransactionEvents(result);\n const fileId = eventData.expectedEvents?.FileAdded?.fileId;\n\n if (!fileId) {\n throw new Error(\"Failed to get fileId from transaction events\");\n }\n\n return {\n type: \"direct\",\n result: {\n fileId: Number(fileId),\n transactionHash: result.hash,\n },\n };\n }\n\n case \"storeGrantFile\": {\n const grantFile = request.params;\n\n // Store grant file using SDK's data controller\n // Convert grant file to blob for storage\n const blob = new Blob([JSON.stringify(grantFile)], {\n type: \"application/json\",\n });\n\n // Upload using the data controller\n const result = await sdk.data.upload({\n content: blob,\n filename: `grant-${Date.now()}.json`,\n });\n\n return {\n type: \"direct\",\n result: { url: result.url },\n };\n }\n\n default: {\n // TypeScript exhaustiveness check - ensures all cases are handled at compile time\n const exhaustiveCheck: never = request;\n // Return exhaustiveCheck to satisfy TypeScript while throwing an error\n // This should never be reached if all cases are handled\n return exhaustiveCheck;\n }\n }\n}\n\n// Legacy handler export - DEPRECATED\n// TODO: Remove in next major version\n// Migration guide: Use handleRelayerOperation instead\nexport { handleRelayerRequest } from \"./handler\";\n"],"mappings":"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","names":[]}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -1,10 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Storage API for Vana SDK
|
|
3
|
+
*
|
|
4
|
+
* Provides unified interface for different storage providers
|
|
5
|
+
* to upload, download, and manage user data files.
|
|
6
|
+
*
|
|
7
|
+
* ## Storage Provider Decision Tree
|
|
8
|
+
*
|
|
9
|
+
* Choose your storage provider based on your needs:
|
|
10
|
+
*
|
|
11
|
+
* **Need full CRUD operations and metadata?**
|
|
12
|
+
* - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata
|
|
13
|
+
*
|
|
14
|
+
* **Want to use your own IPFS infrastructure?**
|
|
15
|
+
* - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service
|
|
16
|
+
* - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node
|
|
17
|
+
* - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service
|
|
18
|
+
*
|
|
19
|
+
* **Want flexible callback-based storage?**
|
|
20
|
+
* - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)
|
|
21
|
+
*
|
|
22
|
+
* **Need Google Drive integration?**
|
|
23
|
+
* - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Managed IPFS with full features
|
|
28
|
+
* const pinata = new PinataStorage({ jwt: "your-jwt" });
|
|
29
|
+
*
|
|
30
|
+
* // Standard IPFS with Infura
|
|
31
|
+
* const ipfs = IpfsStorage.forInfura({ projectId: "...", projectSecret: "..." });
|
|
32
|
+
*
|
|
33
|
+
* // Callback-based storage (flexible)
|
|
34
|
+
* const storage = new CallbackStorage({
|
|
35
|
+
* async upload(blob, filename) {
|
|
36
|
+
* // Your custom upload logic
|
|
37
|
+
* const response = await fetch('/api/upload', { method: 'POST', body: blob });
|
|
38
|
+
* const data = await response.json();
|
|
39
|
+
* return { url: data.url, size: blob.size, contentType: blob.type };
|
|
40
|
+
* },
|
|
41
|
+
* async download(identifier) {
|
|
42
|
+
* // Your custom download logic
|
|
43
|
+
* const response = await fetch(`/api/download/${identifier}`);
|
|
44
|
+
* return response.blob();
|
|
45
|
+
* }
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export type { StorageProvider, StorageUploadResult, StorageFile, StorageListOptions, StorageProviderConfig, } from "../types/storage";
|
|
50
|
+
export { StorageError } from "../types/storage";
|
|
51
|
+
export { GoogleDriveStorage } from "./providers/google-drive";
|
|
52
|
+
export { IpfsStorage } from "./providers/ipfs";
|
|
53
|
+
export { PinataStorage } from "./providers/pinata";
|
|
54
|
+
export { CallbackStorage } from "./providers/callback-storage";
|
|
55
|
+
export { StorageManager } from "./manager";
|
|
56
|
+
export type { StorageCallbacks, StorageDownloadOptions, StorageListResult, } from "../types/config";
|
package/dist/storage/manager.cjs
CHANGED
|
@@ -57,7 +57,7 @@ class StorageManager {
|
|
|
57
57
|
* @returns Storage provider instance
|
|
58
58
|
*/
|
|
59
59
|
getProvider(name) {
|
|
60
|
-
const providerName = name
|
|
60
|
+
const providerName = name ?? this.defaultProvider;
|
|
61
61
|
if (!providerName) {
|
|
62
62
|
throw new import_storage.StorageError(
|
|
63
63
|
"No storage provider specified and no default provider set",
|
|
@@ -179,7 +179,7 @@ class StorageManager {
|
|
|
179
179
|
* @returns Default provider name or undefined
|
|
180
180
|
*/
|
|
181
181
|
getDefaultStorageProvider() {
|
|
182
|
-
return this.defaultProvider
|
|
182
|
+
return this.defaultProvider ?? void 0;
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/manager.ts"],"sourcesContent":["import {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n
|
|
1
|
+
{"version":3,"sources":["../../src/storage/manager.ts"],"sourcesContent":["import type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n} from \"../types/storage\";\nimport { StorageError } from \"../types/storage\";\n\n/**\n * Manages multiple storage providers with a unified interface for file operations.\n *\n * @remarks\n * The StorageManager provides a consistent API for uploading, downloading, and managing\n * files across different storage backends including IPFS, Pinata, Google Drive, and\n * server-managed storage. It handles provider registration, default provider selection,\n * and automatic fallback scenarios for robust file operations.\n *\n * Used internally by DataController for encrypted file storage, but can also be used\n * directly for custom storage workflows. Each provider implements the `StorageProvider`\n * interface to ensure consistent behavior across different storage backends.\n *\n * The manager supports provider-specific configurations and features while maintaining\n * a uniform API surface for applications.\n * @example\n * ```typescript\n * import { StorageManager, IPFSStorage, PinataStorage } from '@opendatalabs/vana-sdk';\n *\n * const storage = new StorageManager();\n *\n * // Register multiple providers\n * storage.register('ipfs', new IPFSStorage({\n * apiEndpoint: 'https://api.pinata.cloud/pinning/pinFileToIPFS'\n * }), true);\n * storage.register('pinata', new PinataStorage({\n * jwt: 'your-pinata-jwt-token'\n * }));\n *\n * // Upload to default provider\n * const result = await storage.upload(fileBlob, 'myfile.json');\n *\n * // Upload to specific provider\n * const result2 = await storage.upload(fileBlob, 'myfile.json', 'pinata');\n * ```\n * @category Storage\n * @see {@link https://docs.vana.com/developer/vana-sdk-documentation/core-modules/storage-providers | Storage Providers Guide} for configuration details\n */\nexport class StorageManager {\n private providers: Map<string, StorageProvider> = new Map();\n private defaultProvider: string | null = null;\n\n /**\n * Registers a storage provider with the manager.\n *\n * @remarks\n * This method adds a new storage provider to the manager's registry and optionally\n * sets it as the default provider for subsequent operations. If no default provider\n * is currently set, the first registered provider automatically becomes the default.\n * @param name - Unique identifier for the provider\n * @param provider - The storage provider instance implementing the `StorageProvider` interface\n * @param isDefault - Whether this provider should be set as the default (defaults to `false`)\n * @example\n * ```typescript\n * const pinata = new PinataStorage({ jwt: 'your-jwt-token' });\n * storage.register('pinata', pinata, true); // Set as default\n *\n * const ipfs = new IPFSStorage({ apiEndpoint: 'https://...' });\n * storage.register('ipfs', ipfs); // Not default\n * ```\n */\n register(name: string, provider: StorageProvider, isDefault = false): void {\n this.providers.set(name, provider);\n\n if (isDefault || this.defaultProvider === null) {\n this.defaultProvider = name;\n }\n }\n\n /**\n * Get a registered storage provider\n *\n * @param name - Provider identifier, uses default if not specified\n * @returns Storage provider instance\n */\n getProvider(name?: string): StorageProvider {\n const providerName = name ?? this.defaultProvider;\n\n if (!providerName) {\n throw new StorageError(\n \"No storage provider specified and no default provider set\",\n \"NO_PROVIDER\",\n \"manager\",\n );\n }\n\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new StorageError(\n `Storage provider '${providerName}' not found`,\n \"PROVIDER_NOT_FOUND\",\n \"manager\",\n );\n }\n\n return provider;\n }\n\n /**\n * List all registered providers\n *\n * @returns Array of provider names\n */\n listProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get the default provider name\n *\n * @returns Default provider name or null\n */\n getDefaultProvider(): string | null {\n return this.defaultProvider;\n }\n\n /**\n * Set the default provider\n *\n * @param name - Provider identifier\n */\n setDefaultProvider(name: string): void {\n if (!this.providers.has(name)) {\n throw new StorageError(\n `Cannot set default provider '${name}': provider not registered`,\n \"PROVIDER_NOT_FOUND\",\n \"manager\",\n );\n }\n this.defaultProvider = name;\n }\n\n /**\n * Uploads a file using the specified or default storage provider.\n *\n * @remarks\n * This method uploads a file to the specified provider or falls back to the default\n * provider if none is specified. The upload result includes the storage URL, file size,\n * content type, and provider-specific metadata that can be used for subsequent operations.\n * @param file - The file blob to upload\n * @param filename - Optional custom filename (defaults to auto-generated name)\n * @param providerName - Optional provider identifier (uses default if not specified)\n * @returns A Promise that resolves to the storage upload result with URL and metadata\n * @throws {StorageError} When no provider is available or upload fails\n * @example\n * ```typescript\n * // Upload to default provider\n * const result = await storage.upload(fileBlob, 'data.json');\n * console.log(`Uploaded to: ${result.url}`);\n *\n * // Upload to specific provider\n * const result2 = await storage.upload(fileBlob, 'data.json', 'pinata');\n * ```\n */\n async upload(\n file: Blob,\n filename?: string,\n providerName?: string,\n ): Promise<StorageUploadResult> {\n const provider = this.getProvider(providerName);\n return provider.upload(file, filename);\n }\n\n /**\n * Download a file using the specified or default provider\n *\n * @param url - The storage URL\n * @param providerName - Optional provider to use\n * @returns Promise with file blob\n */\n async download(url: string, providerName?: string): Promise<Blob> {\n const provider = this.getProvider(providerName);\n return provider.download(url);\n }\n\n /**\n * List files using the specified or default provider\n *\n * @param options - Optional filtering and pagination\n * @param providerName - Optional provider to use\n * @returns Promise with file list\n */\n async list(\n options?: StorageListOptions,\n providerName?: string,\n ): Promise<StorageFile[]> {\n const provider = this.getProvider(providerName);\n return provider.list(options);\n }\n\n /**\n * Delete a file using the specified or default provider\n *\n * @param url - The storage URL\n * @param providerName - Optional provider to use\n * @returns Promise with success status\n */\n async delete(url: string, providerName?: string): Promise<boolean> {\n const provider = this.getProvider(providerName);\n return provider.delete(url);\n }\n\n /**\n * Get list of registered storage provider names\n *\n * @returns Array of provider names\n */\n getStorageProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get the default storage provider name\n *\n * @returns Default provider name or undefined\n */\n getDefaultStorageProvider(): string | undefined {\n return this.defaultProvider ?? undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAA6B;AAwCtB,MAAM,eAAe;AAAA,EAClB,YAA0C,oBAAI,IAAI;AAAA,EAClD,kBAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBzC,SAAS,MAAc,UAA2B,YAAY,OAAa;AACzE,SAAK,UAAU,IAAI,MAAM,QAAQ;AAEjC,QAAI,aAAa,KAAK,oBAAoB,MAAM;AAC9C,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,MAAgC;AAC1C,UAAM,eAAe,QAAQ,KAAK;AAElC,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,YAAY;AAChD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,qBAAqB,YAAY;AAAA,QACjC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAA0B;AACxB,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,MAAoB;AACrC,QAAI,CAAC,KAAK,UAAU,IAAI,IAAI,GAAG;AAC7B,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,OACJ,MACA,UACA,cAC8B;AAC9B,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,OAAO,MAAM,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,KAAa,cAAsC;AAChE,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,SAAS,GAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KACJ,SACA,cACwB;AACxB,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,KAAK,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,KAAa,cAAyC;AACjE,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,OAAO,GAAG;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAgC;AAC9B,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,4BAAgD;AAC9C,WAAO,KAAK,mBAAmB;AAAA,EACjC;AACF;","names":[]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { StorageProvider, StorageUploadResult,
|
|
2
|
-
|
|
1
|
+
import type { StorageProvider, StorageUploadResult, StorageFile, StorageListOptions } from "../types/storage";
|
|
3
2
|
/**
|
|
4
3
|
* Manages multiple storage providers with a unified interface for file operations.
|
|
5
4
|
*
|
|
@@ -38,7 +37,7 @@ import { StorageProvider, StorageUploadResult, StorageListOptions, StorageFile }
|
|
|
38
37
|
* @category Storage
|
|
39
38
|
* @see {@link https://docs.vana.com/developer/vana-sdk-documentation/core-modules/storage-providers | Storage Providers Guide} for configuration details
|
|
40
39
|
*/
|
|
41
|
-
declare class StorageManager {
|
|
40
|
+
export declare class StorageManager {
|
|
42
41
|
private providers;
|
|
43
42
|
private defaultProvider;
|
|
44
43
|
/**
|
|
@@ -146,5 +145,3 @@ declare class StorageManager {
|
|
|
146
145
|
*/
|
|
147
146
|
getDefaultStorageProvider(): string | undefined;
|
|
148
147
|
}
|
|
149
|
-
|
|
150
|
-
export { StorageManager };
|
package/dist/storage/manager.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import {
|
|
5
|
-
StorageError
|
|
6
|
-
} from "../types/storage";
|
|
1
|
+
import { StorageError } from "../types/storage";
|
|
7
2
|
class StorageManager {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
__publicField(this, "defaultProvider", null);
|
|
11
|
-
}
|
|
3
|
+
providers = /* @__PURE__ */ new Map();
|
|
4
|
+
defaultProvider = null;
|
|
12
5
|
/**
|
|
13
6
|
* Registers a storage provider with the manager.
|
|
14
7
|
*
|
|
@@ -41,7 +34,7 @@ class StorageManager {
|
|
|
41
34
|
* @returns Storage provider instance
|
|
42
35
|
*/
|
|
43
36
|
getProvider(name) {
|
|
44
|
-
const providerName = name
|
|
37
|
+
const providerName = name ?? this.defaultProvider;
|
|
45
38
|
if (!providerName) {
|
|
46
39
|
throw new StorageError(
|
|
47
40
|
"No storage provider specified and no default provider set",
|
|
@@ -163,7 +156,7 @@ class StorageManager {
|
|
|
163
156
|
* @returns Default provider name or undefined
|
|
164
157
|
*/
|
|
165
158
|
getDefaultStorageProvider() {
|
|
166
|
-
return this.defaultProvider
|
|
159
|
+
return this.defaultProvider ?? void 0;
|
|
167
160
|
}
|
|
168
161
|
}
|
|
169
162
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/manager.ts"],"sourcesContent":["import {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n
|
|
1
|
+
{"version":3,"sources":["../../src/storage/manager.ts"],"sourcesContent":["import type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n} from \"../types/storage\";\nimport { StorageError } from \"../types/storage\";\n\n/**\n * Manages multiple storage providers with a unified interface for file operations.\n *\n * @remarks\n * The StorageManager provides a consistent API for uploading, downloading, and managing\n * files across different storage backends including IPFS, Pinata, Google Drive, and\n * server-managed storage. It handles provider registration, default provider selection,\n * and automatic fallback scenarios for robust file operations.\n *\n * Used internally by DataController for encrypted file storage, but can also be used\n * directly for custom storage workflows. Each provider implements the `StorageProvider`\n * interface to ensure consistent behavior across different storage backends.\n *\n * The manager supports provider-specific configurations and features while maintaining\n * a uniform API surface for applications.\n * @example\n * ```typescript\n * import { StorageManager, IPFSStorage, PinataStorage } from '@opendatalabs/vana-sdk';\n *\n * const storage = new StorageManager();\n *\n * // Register multiple providers\n * storage.register('ipfs', new IPFSStorage({\n * apiEndpoint: 'https://api.pinata.cloud/pinning/pinFileToIPFS'\n * }), true);\n * storage.register('pinata', new PinataStorage({\n * jwt: 'your-pinata-jwt-token'\n * }));\n *\n * // Upload to default provider\n * const result = await storage.upload(fileBlob, 'myfile.json');\n *\n * // Upload to specific provider\n * const result2 = await storage.upload(fileBlob, 'myfile.json', 'pinata');\n * ```\n * @category Storage\n * @see {@link https://docs.vana.com/developer/vana-sdk-documentation/core-modules/storage-providers | Storage Providers Guide} for configuration details\n */\nexport class StorageManager {\n private providers: Map<string, StorageProvider> = new Map();\n private defaultProvider: string | null = null;\n\n /**\n * Registers a storage provider with the manager.\n *\n * @remarks\n * This method adds a new storage provider to the manager's registry and optionally\n * sets it as the default provider for subsequent operations. If no default provider\n * is currently set, the first registered provider automatically becomes the default.\n * @param name - Unique identifier for the provider\n * @param provider - The storage provider instance implementing the `StorageProvider` interface\n * @param isDefault - Whether this provider should be set as the default (defaults to `false`)\n * @example\n * ```typescript\n * const pinata = new PinataStorage({ jwt: 'your-jwt-token' });\n * storage.register('pinata', pinata, true); // Set as default\n *\n * const ipfs = new IPFSStorage({ apiEndpoint: 'https://...' });\n * storage.register('ipfs', ipfs); // Not default\n * ```\n */\n register(name: string, provider: StorageProvider, isDefault = false): void {\n this.providers.set(name, provider);\n\n if (isDefault || this.defaultProvider === null) {\n this.defaultProvider = name;\n }\n }\n\n /**\n * Get a registered storage provider\n *\n * @param name - Provider identifier, uses default if not specified\n * @returns Storage provider instance\n */\n getProvider(name?: string): StorageProvider {\n const providerName = name ?? this.defaultProvider;\n\n if (!providerName) {\n throw new StorageError(\n \"No storage provider specified and no default provider set\",\n \"NO_PROVIDER\",\n \"manager\",\n );\n }\n\n const provider = this.providers.get(providerName);\n if (!provider) {\n throw new StorageError(\n `Storage provider '${providerName}' not found`,\n \"PROVIDER_NOT_FOUND\",\n \"manager\",\n );\n }\n\n return provider;\n }\n\n /**\n * List all registered providers\n *\n * @returns Array of provider names\n */\n listProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get the default provider name\n *\n * @returns Default provider name or null\n */\n getDefaultProvider(): string | null {\n return this.defaultProvider;\n }\n\n /**\n * Set the default provider\n *\n * @param name - Provider identifier\n */\n setDefaultProvider(name: string): void {\n if (!this.providers.has(name)) {\n throw new StorageError(\n `Cannot set default provider '${name}': provider not registered`,\n \"PROVIDER_NOT_FOUND\",\n \"manager\",\n );\n }\n this.defaultProvider = name;\n }\n\n /**\n * Uploads a file using the specified or default storage provider.\n *\n * @remarks\n * This method uploads a file to the specified provider or falls back to the default\n * provider if none is specified. The upload result includes the storage URL, file size,\n * content type, and provider-specific metadata that can be used for subsequent operations.\n * @param file - The file blob to upload\n * @param filename - Optional custom filename (defaults to auto-generated name)\n * @param providerName - Optional provider identifier (uses default if not specified)\n * @returns A Promise that resolves to the storage upload result with URL and metadata\n * @throws {StorageError} When no provider is available or upload fails\n * @example\n * ```typescript\n * // Upload to default provider\n * const result = await storage.upload(fileBlob, 'data.json');\n * console.log(`Uploaded to: ${result.url}`);\n *\n * // Upload to specific provider\n * const result2 = await storage.upload(fileBlob, 'data.json', 'pinata');\n * ```\n */\n async upload(\n file: Blob,\n filename?: string,\n providerName?: string,\n ): Promise<StorageUploadResult> {\n const provider = this.getProvider(providerName);\n return provider.upload(file, filename);\n }\n\n /**\n * Download a file using the specified or default provider\n *\n * @param url - The storage URL\n * @param providerName - Optional provider to use\n * @returns Promise with file blob\n */\n async download(url: string, providerName?: string): Promise<Blob> {\n const provider = this.getProvider(providerName);\n return provider.download(url);\n }\n\n /**\n * List files using the specified or default provider\n *\n * @param options - Optional filtering and pagination\n * @param providerName - Optional provider to use\n * @returns Promise with file list\n */\n async list(\n options?: StorageListOptions,\n providerName?: string,\n ): Promise<StorageFile[]> {\n const provider = this.getProvider(providerName);\n return provider.list(options);\n }\n\n /**\n * Delete a file using the specified or default provider\n *\n * @param url - The storage URL\n * @param providerName - Optional provider to use\n * @returns Promise with success status\n */\n async delete(url: string, providerName?: string): Promise<boolean> {\n const provider = this.getProvider(providerName);\n return provider.delete(url);\n }\n\n /**\n * Get list of registered storage provider names\n *\n * @returns Array of provider names\n */\n getStorageProviders(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get the default storage provider name\n *\n * @returns Default provider name or undefined\n */\n getDefaultStorageProvider(): string | undefined {\n return this.defaultProvider ?? undefined;\n }\n}\n"],"mappings":"AAMA,SAAS,oBAAoB;AAwCtB,MAAM,eAAe;AAAA,EAClB,YAA0C,oBAAI,IAAI;AAAA,EAClD,kBAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBzC,SAAS,MAAc,UAA2B,YAAY,OAAa;AACzE,SAAK,UAAU,IAAI,MAAM,QAAQ;AAEjC,QAAI,aAAa,KAAK,oBAAoB,MAAM;AAC9C,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,MAAgC;AAC1C,UAAM,eAAe,QAAQ,KAAK;AAElC,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,YAAY;AAChD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR,qBAAqB,YAAY;AAAA,QACjC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAA0B;AACxB,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,MAAoB;AACrC,QAAI,CAAC,KAAK,UAAU,IAAI,IAAI,GAAG;AAC7B,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,OACJ,MACA,UACA,cAC8B;AAC9B,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,OAAO,MAAM,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,KAAa,cAAsC;AAChE,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,SAAS,GAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KACJ,SACA,cACwB;AACxB,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,KAAK,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,KAAa,cAAyC;AACjE,UAAM,WAAW,KAAK,YAAY,YAAY;AAC9C,WAAO,SAAS,OAAO,GAAG;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAgC;AAC9B,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,4BAAgD;AAC9C,WAAO,KAAK,mBAAmB;AAAA,EACjC;AACF;","names":[]}
|
|
@@ -109,11 +109,11 @@ class CallbackStorage {
|
|
|
109
109
|
const result = await this.callbacks.list(options?.namePattern, options);
|
|
110
110
|
return result.items.map((item, index) => ({
|
|
111
111
|
id: item.identifier,
|
|
112
|
-
name: item.identifier.split("/").pop()
|
|
112
|
+
name: item.identifier.split("/").pop() ?? `file-${index}`,
|
|
113
113
|
url: item.identifier,
|
|
114
|
-
size: item.size
|
|
114
|
+
size: item.size ?? 0,
|
|
115
115
|
contentType: "application/octet-stream",
|
|
116
|
-
createdAt: item.lastModified
|
|
116
|
+
createdAt: item.lastModified ?? /* @__PURE__ */ new Date(),
|
|
117
117
|
metadata: item.metadata
|
|
118
118
|
}));
|
|
119
119
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["import type { StorageCallbacks } from \"../../types/config\";\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../../types/storage\";\n\n/**\n * Storage provider that delegates all operations to user-provided callbacks.\n *\n * This provider follows the same flexible pattern as relayer callbacks,\n * allowing users to implement storage operations in any way they choose\n * (HTTP, WebSocket, direct cloud APIs, local filesystem, etc.).\n *\n * @category Storage\n * @example\n * ```typescript\n * // HTTP-based implementation\n * const httpCallbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n *\n * const storage = new CallbackStorage(httpCallbacks);\n *\n * // Direct S3 implementation\n * const s3Callbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const url = await getPresignedUploadUrl(filename);\n * await fetch(url, { method: 'PUT', body: blob });\n * return {\n * url: `s3://my-bucket/${filename}`,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const url = await getPresignedDownloadUrl(identifier);\n * const response = await fetch(url);\n * return response.blob();\n * }\n * };\n * ```\n */\nexport class CallbackStorage implements StorageProvider {\n constructor(private readonly callbacks: StorageCallbacks) {\n if (!callbacks.upload || !callbacks.download) {\n throw new Error(\n \"CallbackStorage requires both upload and download callbacks\",\n );\n }\n }\n\n /**\n * Upload a file using the provided callback\n *\n * @param file - The blob to upload\n * @param filename - Optional filename for the upload\n * @returns The upload result with URL and metadata\n */\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const result = await this.callbacks.upload(file, filename);\n\n // Validate the result has required fields\n if (!result.url || result.url.trim() === \"\") {\n throw new StorageError(\n \"Upload callback returned invalid result: missing or empty url\",\n \"INVALID_UPLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return result;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Upload failed: ${error instanceof Error ? error.message : String(error)}`,\n \"UPLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Download a file using the provided callback\n *\n * @param url - The URL or identifier to download\n * @returns The downloaded blob\n */\n async download(url: string): Promise<Blob> {\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n const blob = await this.callbacks.download(identifier);\n\n if (!(blob instanceof Blob)) {\n throw new StorageError(\n \"Download callback returned invalid result: expected Blob\",\n \"INVALID_DOWNLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return blob;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Download failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DOWNLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * List files using the provided callback (if available)\n *\n * @param options - Optional list options including filters and pagination\n * @returns Array of storage files\n */\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.callbacks.list) {\n throw new StorageError(\n \"List operation not supported - no list callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n const result = await this.callbacks.list(options?.namePattern, options);\n\n // Convert list result to StorageFile format\n return result.items.map((item, index) => ({\n id: item.identifier,\n name: item.identifier.split(\"/\").pop() ?? `file-${index}`,\n url: item.identifier,\n size: item.size ?? 0,\n contentType: \"application/octet-stream\",\n createdAt: item.lastModified ?? new Date(),\n metadata: item.metadata,\n }));\n } catch (error) {\n throw new StorageError(\n `List failed: ${error instanceof Error ? error.message : String(error)}`,\n \"LIST_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Delete a file using the provided callback (if available)\n *\n * @param url - The URL or identifier to delete\n * @returns True if deletion succeeded\n */\n async delete(url: string): Promise<boolean> {\n if (!this.callbacks.delete) {\n throw new StorageError(\n \"Delete operation not supported - no delete callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n return await this.callbacks.delete(identifier);\n } catch (error) {\n throw new StorageError(\n `Delete failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DELETE_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Get provider configuration\n *\n * @returns Provider configuration metadata\n */\n getConfig(): StorageProviderConfig {\n return {\n name: \"callback-storage\",\n type: \"callback\",\n requiresAuth: false,\n features: {\n upload: true,\n download: true,\n list: !!this.callbacks.list,\n delete: !!this.callbacks.delete,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import 'viem';
|
|
4
|
-
import '../../types/chains.js';
|
|
5
|
-
import '../../types/permissions.js';
|
|
6
|
-
|
|
1
|
+
import type { StorageCallbacks } from "../../types/config";
|
|
2
|
+
import { type StorageProvider, type StorageUploadResult, type StorageFile, type StorageListOptions, type StorageProviderConfig } from "../../types/storage";
|
|
7
3
|
/**
|
|
8
4
|
* Storage provider that delegates all operations to user-provided callbacks.
|
|
9
5
|
*
|
|
@@ -57,7 +53,7 @@ import '../../types/permissions.js';
|
|
|
57
53
|
* };
|
|
58
54
|
* ```
|
|
59
55
|
*/
|
|
60
|
-
declare class CallbackStorage implements StorageProvider {
|
|
56
|
+
export declare class CallbackStorage implements StorageProvider {
|
|
61
57
|
private readonly callbacks;
|
|
62
58
|
constructor(callbacks: StorageCallbacks);
|
|
63
59
|
/**
|
|
@@ -96,5 +92,3 @@ declare class CallbackStorage implements StorageProvider {
|
|
|
96
92
|
*/
|
|
97
93
|
getConfig(): StorageProviderConfig;
|
|
98
94
|
}
|
|
99
|
-
|
|
100
|
-
export { CallbackStorage };
|
|
@@ -88,11 +88,11 @@ class CallbackStorage {
|
|
|
88
88
|
const result = await this.callbacks.list(options?.namePattern, options);
|
|
89
89
|
return result.items.map((item, index) => ({
|
|
90
90
|
id: item.identifier,
|
|
91
|
-
name: item.identifier.split("/").pop()
|
|
91
|
+
name: item.identifier.split("/").pop() ?? `file-${index}`,
|
|
92
92
|
url: item.identifier,
|
|
93
|
-
size: item.size
|
|
93
|
+
size: item.size ?? 0,
|
|
94
94
|
contentType: "application/octet-stream",
|
|
95
|
-
createdAt: item.lastModified
|
|
95
|
+
createdAt: item.lastModified ?? /* @__PURE__ */ new Date(),
|
|
96
96
|
metadata: item.metadata
|
|
97
97
|
}));
|
|
98
98
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["import type { StorageCallbacks } from \"../../types/config\";\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../../types/storage\";\n\n/**\n * Storage provider that delegates all operations to user-provided callbacks.\n *\n * This provider follows the same flexible pattern as relayer callbacks,\n * allowing users to implement storage operations in any way they choose\n * (HTTP, WebSocket, direct cloud APIs, local filesystem, etc.).\n *\n * @category Storage\n * @example\n * ```typescript\n * // HTTP-based implementation\n * const httpCallbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const formData = new FormData();\n * formData.append('file', blob, filename);\n * const response = await fetch('/api/storage/upload', {\n * method: 'POST',\n * body: formData\n * });\n * const data = await response.json();\n * return {\n * url: data.url,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const response = await fetch(`/api/storage/download/${identifier}`);\n * return response.blob();\n * }\n * };\n *\n * const storage = new CallbackStorage(httpCallbacks);\n *\n * // Direct S3 implementation\n * const s3Callbacks: StorageCallbacks = {\n * async upload(blob, filename) {\n * const url = await getPresignedUploadUrl(filename);\n * await fetch(url, { method: 'PUT', body: blob });\n * return {\n * url: `s3://my-bucket/${filename}`,\n * size: blob.size,\n * contentType: blob.type\n * };\n * },\n * async download(identifier) {\n * const url = await getPresignedDownloadUrl(identifier);\n * const response = await fetch(url);\n * return response.blob();\n * }\n * };\n * ```\n */\nexport class CallbackStorage implements StorageProvider {\n constructor(private readonly callbacks: StorageCallbacks) {\n if (!callbacks.upload || !callbacks.download) {\n throw new Error(\n \"CallbackStorage requires both upload and download callbacks\",\n );\n }\n }\n\n /**\n * Upload a file using the provided callback\n *\n * @param file - The blob to upload\n * @param filename - Optional filename for the upload\n * @returns The upload result with URL and metadata\n */\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const result = await this.callbacks.upload(file, filename);\n\n // Validate the result has required fields\n if (!result.url || result.url.trim() === \"\") {\n throw new StorageError(\n \"Upload callback returned invalid result: missing or empty url\",\n \"INVALID_UPLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return result;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Upload failed: ${error instanceof Error ? error.message : String(error)}`,\n \"UPLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Download a file using the provided callback\n *\n * @param url - The URL or identifier to download\n * @returns The downloaded blob\n */\n async download(url: string): Promise<Blob> {\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n const blob = await this.callbacks.download(identifier);\n\n if (!(blob instanceof Blob)) {\n throw new StorageError(\n \"Download callback returned invalid result: expected Blob\",\n \"INVALID_DOWNLOAD_RESULT\",\n \"callback-storage\",\n );\n }\n\n return blob;\n } catch (error) {\n if (error instanceof StorageError) {\n throw error;\n }\n throw new StorageError(\n `Download failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DOWNLOAD_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * List files using the provided callback (if available)\n *\n * @param options - Optional list options including filters and pagination\n * @returns Array of storage files\n */\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.callbacks.list) {\n throw new StorageError(\n \"List operation not supported - no list callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n const result = await this.callbacks.list(options?.namePattern, options);\n\n // Convert list result to StorageFile format\n return result.items.map((item, index) => ({\n id: item.identifier,\n name: item.identifier.split(\"/\").pop() ?? `file-${index}`,\n url: item.identifier,\n size: item.size ?? 0,\n contentType: \"application/octet-stream\",\n createdAt: item.lastModified ?? new Date(),\n metadata: item.metadata,\n }));\n } catch (error) {\n throw new StorageError(\n `List failed: ${error instanceof Error ? error.message : String(error)}`,\n \"LIST_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Delete a file using the provided callback (if available)\n *\n * @param url - The URL or identifier to delete\n * @returns True if deletion succeeded\n */\n async delete(url: string): Promise<boolean> {\n if (!this.callbacks.delete) {\n throw new StorageError(\n \"Delete operation not supported - no delete callback provided\",\n \"NOT_SUPPORTED\",\n \"callback-storage\",\n );\n }\n\n try {\n // Extract identifier if callback is provided, otherwise use URL as-is\n const identifier = this.callbacks.extractIdentifier\n ? this.callbacks.extractIdentifier(url)\n : url;\n\n return await this.callbacks.delete(identifier);\n } catch (error) {\n throw new StorageError(\n `Delete failed: ${error instanceof Error ? error.message : String(error)}`,\n \"DELETE_ERROR\",\n \"callback-storage\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /**\n * Get provider configuration\n *\n * @returns Provider configuration metadata\n */\n getConfig(): StorageProviderConfig {\n return {\n name: \"callback-storage\",\n type: \"callback\",\n requiresAuth: false,\n features: {\n upload: true,\n download: true,\n list: !!this.callbacks.list,\n delete: !!this.callbacks.delete,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|