@opendatalabs/vana-sdk 2.2.3 → 3.0.0
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 +76 -92
- package/dist/auth/errors.cjs +54 -0
- package/dist/auth/errors.cjs.map +1 -0
- package/dist/auth/errors.d.ts +26 -0
- package/dist/auth/errors.js +28 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/pkce.cjs +100 -0
- package/dist/auth/pkce.cjs.map +1 -0
- package/dist/auth/pkce.d.ts +55 -0
- package/dist/auth/pkce.js +71 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/token-store.cjs +59 -0
- package/dist/auth/token-store.cjs.map +1 -0
- package/dist/auth/token-store.d.ts +61 -0
- package/dist/auth/token-store.js +35 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/web3-signed-builder.cjs +70 -0
- package/dist/auth/web3-signed-builder.cjs.map +1 -0
- package/dist/auth/web3-signed-builder.d.ts +47 -0
- package/dist/auth/web3-signed-builder.js +45 -0
- package/dist/auth/web3-signed-builder.js.map +1 -0
- package/dist/auth/web3-signed.cjs +125 -0
- package/dist/auth/web3-signed.cjs.map +1 -0
- package/dist/auth/web3-signed.d.ts +59 -0
- package/dist/auth/web3-signed.js +104 -0
- package/dist/auth/web3-signed.js.map +1 -0
- package/dist/chains/definitions.cjs +2 -6
- package/dist/chains/definitions.cjs.map +1 -1
- package/dist/chains/definitions.d.ts +1 -7
- package/dist/chains/definitions.js +2 -6
- package/dist/chains/definitions.js.map +1 -1
- package/dist/config/chains.d.ts +18 -0
- package/dist/config/contracts.config.cjs +7 -95
- package/dist/config/contracts.config.cjs.map +1 -1
- package/dist/config/contracts.config.d.ts +0 -54
- package/dist/config/contracts.config.js +6 -93
- package/dist/config/contracts.config.js.map +1 -1
- package/dist/config/default-services.cjs +0 -10
- package/dist/config/default-services.cjs.map +1 -1
- package/dist/config/default-services.d.ts +1 -20
- package/dist/config/default-services.js +0 -9
- package/dist/config/default-services.js.map +1 -1
- package/dist/crypto/ecies/interface.cjs +2 -0
- package/dist/crypto/ecies/interface.cjs.map +1 -1
- package/dist/crypto/ecies/interface.js +2 -0
- package/dist/crypto/ecies/interface.js.map +1 -1
- package/dist/crypto/envelope/openpgp.cjs +59 -0
- package/dist/crypto/envelope/openpgp.cjs.map +1 -0
- package/dist/crypto/envelope/openpgp.d.ts +28 -0
- package/dist/crypto/envelope/openpgp.js +24 -0
- package/dist/crypto/envelope/openpgp.js.map +1 -0
- package/dist/crypto/keys/derive.cjs +65 -0
- package/dist/crypto/keys/derive.cjs.map +1 -0
- package/dist/crypto/keys/derive.d.ts +45 -0
- package/dist/crypto/keys/derive.js +38 -0
- package/dist/crypto/keys/derive.js.map +1 -0
- package/dist/errors.cjs +10 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +10 -0
- package/dist/errors.js.map +1 -1
- package/dist/generated/abi/VanaPoolEntityImplementation.cjs +65 -0
- package/dist/generated/abi/VanaPoolEntityImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +51 -0
- package/dist/generated/abi/VanaPoolEntityImplementation.js +65 -0
- package/dist/generated/abi/VanaPoolEntityImplementation.js.map +1 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.cjs +187 -19
- package/dist/generated/abi/VanaPoolStakingImplementation.cjs.map +1 -1
- package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +144 -14
- package/dist/generated/abi/VanaPoolStakingImplementation.js +187 -19
- package/dist/generated/abi/VanaPoolStakingImplementation.js.map +1 -1
- package/dist/generated/abi/index.cjs +2 -37
- package/dist/generated/abi/index.cjs.map +1 -1
- package/dist/generated/abi/index.d.ts +2687 -9119
- package/dist/generated/abi/index.js +2 -29
- package/dist/generated/abi/index.js.map +1 -1
- package/dist/generated/addresses.cjs +5 -107
- package/dist/generated/addresses.cjs.map +1 -1
- package/dist/generated/addresses.d.ts +5 -99
- package/dist/generated/addresses.js +5 -105
- package/dist/generated/addresses.js.map +1 -1
- package/dist/index.browser.d.ts +23 -138
- package/dist/index.browser.js +32090 -112
- package/dist/index.browser.js.map +7 -1
- package/dist/index.node.cjs +32809 -157
- package/dist/index.node.cjs.map +7 -1
- package/dist/index.node.d.ts +22 -208
- package/dist/index.node.js +32716 -131
- package/dist/index.node.js.map +7 -1
- package/dist/protocol/data-file.cjs +56 -0
- package/dist/protocol/data-file.cjs.map +1 -0
- package/dist/protocol/data-file.d.ts +20 -0
- package/dist/protocol/data-file.js +30 -0
- package/dist/protocol/data-file.js.map +1 -0
- package/dist/protocol/eip712.cjs +123 -0
- package/dist/protocol/eip712.cjs.map +1 -0
- package/dist/protocol/eip712.d.ts +117 -0
- package/dist/protocol/eip712.js +90 -0
- package/dist/protocol/eip712.js.map +1 -0
- package/dist/protocol/gateway.cjs +226 -0
- package/dist/protocol/gateway.cjs.map +1 -0
- package/dist/protocol/gateway.d.ts +120 -0
- package/dist/protocol/gateway.js +202 -0
- package/dist/protocol/gateway.js.map +1 -0
- package/dist/protocol/scopes.cjs +78 -0
- package/dist/protocol/scopes.cjs.map +1 -0
- package/dist/protocol/scopes.d.ts +13 -0
- package/dist/protocol/scopes.js +50 -0
- package/dist/protocol/scopes.js.map +1 -0
- package/dist/{types/atomicStore.cjs → storage/default.cjs} +9 -8
- package/dist/storage/default.cjs.map +1 -0
- package/dist/storage/default.d.ts +4 -0
- package/dist/storage/default.js +8 -0
- package/dist/storage/default.js.map +1 -0
- package/dist/storage/index.cjs +11 -2
- package/dist/storage/index.cjs.map +1 -1
- package/dist/storage/index.d.ts +9 -0
- package/dist/storage/index.js +7 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/providers/callback-storage.cjs +1 -0
- package/dist/storage/providers/callback-storage.cjs.map +1 -1
- package/dist/storage/providers/callback-storage.js +1 -0
- package/dist/storage/providers/callback-storage.js.map +1 -1
- package/dist/storage/providers/dropbox.cjs +1 -0
- package/dist/storage/providers/dropbox.cjs.map +1 -1
- package/dist/storage/providers/dropbox.js +1 -0
- package/dist/storage/providers/dropbox.js.map +1 -1
- package/dist/storage/providers/google-drive.cjs +1 -0
- package/dist/storage/providers/google-drive.cjs.map +1 -1
- package/dist/storage/providers/google-drive.js +1 -0
- package/dist/storage/providers/google-drive.js.map +1 -1
- package/dist/storage/providers/ipfs.cjs +1 -0
- package/dist/storage/providers/ipfs.cjs.map +1 -1
- package/dist/storage/providers/ipfs.js +1 -0
- package/dist/storage/providers/ipfs.js.map +1 -1
- package/dist/storage/providers/pinata.cjs +1 -0
- package/dist/storage/providers/pinata.cjs.map +1 -1
- package/dist/storage/providers/pinata.js +1 -0
- package/dist/storage/providers/pinata.js.map +1 -1
- package/dist/storage/providers/r2.cjs +376 -0
- package/dist/storage/providers/r2.cjs.map +1 -0
- package/dist/storage/providers/r2.d.ts +91 -0
- package/dist/storage/providers/r2.js +354 -0
- package/dist/storage/providers/r2.js.map +1 -0
- package/dist/storage/providers/vana-storage.cjs +251 -0
- package/dist/storage/providers/vana-storage.cjs.map +1 -0
- package/dist/storage/providers/vana-storage.d.ts +100 -0
- package/dist/storage/providers/vana-storage.js +231 -0
- package/dist/storage/providers/vana-storage.js.map +1 -0
- package/dist/types/config.cjs +0 -34
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +1 -607
- package/dist/types/config.js +0 -22
- package/dist/types/config.js.map +1 -1
- package/dist/types/contracts.cjs.map +1 -1
- package/dist/types/contracts.d.ts +1 -1
- package/dist/types/index.cjs +2 -33
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +2 -33
- package/dist/types/index.js +1 -35
- package/dist/types/index.js.map +1 -1
- package/dist/types/ps-errors.cjs +66 -0
- package/dist/types/ps-errors.cjs.map +1 -0
- package/dist/types/ps-errors.d.ts +25 -0
- package/dist/types/ps-errors.js +41 -0
- package/dist/types/ps-errors.js.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +0 -29
- package/dist/types.js.map +1 -1
- package/package.json +7 -25
- package/dist/client/enhancedResponse.cjs +0 -164
- package/dist/client/enhancedResponse.cjs.map +0 -1
- package/dist/client/enhancedResponse.d.ts +0 -120
- package/dist/client/enhancedResponse.js +0 -138
- package/dist/client/enhancedResponse.js.map +0 -1
- package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +0 -7
- package/dist/controllers/base.cjs +0 -116
- package/dist/controllers/base.cjs.map +0 -1
- package/dist/controllers/base.d.ts +0 -94
- package/dist/controllers/base.js +0 -92
- package/dist/controllers/base.js.map +0 -1
- package/dist/controllers/data.cjs +0 -2633
- package/dist/controllers/data.cjs.map +0 -1
- package/dist/controllers/data.d.ts +0 -1067
- package/dist/controllers/data.js +0 -2626
- package/dist/controllers/data.js.map +0 -1
- package/dist/controllers/operations.cjs +0 -430
- package/dist/controllers/operations.cjs.map +0 -1
- package/dist/controllers/operations.d.ts +0 -229
- package/dist/controllers/operations.js +0 -406
- package/dist/controllers/operations.js.map +0 -1
- package/dist/controllers/permissions.cjs +0 -4368
- package/dist/controllers/permissions.cjs.map +0 -1
- package/dist/controllers/permissions.d.ts +0 -1411
- package/dist/controllers/permissions.js +0 -4344
- package/dist/controllers/permissions.js.map +0 -1
- package/dist/controllers/protocol.cjs +0 -183
- package/dist/controllers/protocol.cjs.map +0 -1
- package/dist/controllers/protocol.d.ts +0 -138
- package/dist/controllers/protocol.js +0 -163
- package/dist/controllers/protocol.js.map +0 -1
- package/dist/controllers/schemas.cjs +0 -678
- package/dist/controllers/schemas.cjs.map +0 -1
- package/dist/controllers/schemas.d.ts +0 -293
- package/dist/controllers/schemas.js +0 -654
- package/dist/controllers/schemas.js.map +0 -1
- package/dist/controllers/server.cjs +0 -643
- package/dist/controllers/server.cjs.map +0 -1
- package/dist/controllers/server.d.ts +0 -322
- package/dist/controllers/server.js +0 -624
- package/dist/controllers/server.js.map +0 -1
- package/dist/core/__tests__/pollingManager.test.d.ts +0 -4
- package/dist/core/apiClient.cjs +0 -378
- package/dist/core/apiClient.cjs.map +0 -1
- package/dist/core/apiClient.d.ts +0 -286
- package/dist/core/apiClient.js +0 -359
- package/dist/core/apiClient.js.map +0 -1
- package/dist/core/generics.cjs +0 -417
- package/dist/core/generics.cjs.map +0 -1
- package/dist/core/generics.d.ts +0 -205
- package/dist/core/generics.js +0 -386
- package/dist/core/generics.js.map +0 -1
- package/dist/core/health.cjs +0 -289
- package/dist/core/health.cjs.map +0 -1
- package/dist/core/health.d.ts +0 -143
- package/dist/core/health.js +0 -265
- package/dist/core/health.js.map +0 -1
- package/dist/core/inMemoryNonceManager.cjs +0 -138
- package/dist/core/inMemoryNonceManager.cjs.map +0 -1
- package/dist/core/inMemoryNonceManager.d.ts +0 -69
- package/dist/core/inMemoryNonceManager.js +0 -114
- package/dist/core/inMemoryNonceManager.js.map +0 -1
- package/dist/core/nonceManager.cjs +0 -304
- package/dist/core/nonceManager.cjs.map +0 -1
- package/dist/core/nonceManager.d.ts +0 -116
- package/dist/core/nonceManager.js +0 -280
- package/dist/core/nonceManager.js.map +0 -1
- package/dist/core/pollingManager.cjs +0 -292
- package/dist/core/pollingManager.cjs.map +0 -1
- package/dist/core/pollingManager.d.ts +0 -120
- package/dist/core/pollingManager.js +0 -268
- package/dist/core/pollingManager.js.map +0 -1
- package/dist/core.cjs +0 -777
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.ts +0 -493
- package/dist/core.js +0 -752
- package/dist/core.js.map +0 -1
- package/dist/diagnostics.cjs +0 -37
- package/dist/diagnostics.cjs.map +0 -1
- package/dist/diagnostics.d.ts +0 -24
- package/dist/diagnostics.js +0 -13
- package/dist/diagnostics.js.map +0 -1
- package/dist/diagnostics.test.d.ts +0 -1
- package/dist/generated/abi/DLPPerformanceImplementation.cjs +0 -1202
- package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +0 -1
- package/dist/generated/abi/DLPPerformanceImplementation.d.ts +0 -914
- package/dist/generated/abi/DLPPerformanceImplementation.js +0 -1178
- package/dist/generated/abi/DLPPerformanceImplementation.js.map +0 -1
- package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +0 -1112
- package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +0 -1
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +0 -840
- package/dist/generated/abi/DLPRewardDeployerImplementation.js +0 -1088
- package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +0 -1
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs +0 -612
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs.map +0 -1
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +0 -451
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js +0 -588
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js.map +0 -1
- package/dist/generated/abi/DLPRewardSwapImplementation.cjs +0 -939
- package/dist/generated/abi/DLPRewardSwapImplementation.cjs.map +0 -1
- package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +0 -705
- package/dist/generated/abi/DLPRewardSwapImplementation.js +0 -915
- package/dist/generated/abi/DLPRewardSwapImplementation.js.map +0 -1
- package/dist/generated/abi/DLPRootImplementation.cjs +0 -1644
- package/dist/generated/abi/DLPRootImplementation.cjs.map +0 -1
- package/dist/generated/abi/DLPRootImplementation.d.ts +0 -1246
- package/dist/generated/abi/DLPRootImplementation.js +0 -1620
- package/dist/generated/abi/DLPRootImplementation.js.map +0 -1
- package/dist/generated/abi/DataLiquidityPoolImplementation.cjs +0 -985
- package/dist/generated/abi/DataLiquidityPoolImplementation.cjs.map +0 -1
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +0 -735
- package/dist/generated/abi/DataLiquidityPoolImplementation.js +0 -961
- package/dist/generated/abi/DataLiquidityPoolImplementation.js.map +0 -1
- package/dist/generated/abi/SwapHelperImplementation.cjs +0 -976
- package/dist/generated/abi/SwapHelperImplementation.cjs.map +0 -1
- package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -728
- package/dist/generated/abi/SwapHelperImplementation.js +0 -952
- package/dist/generated/abi/SwapHelperImplementation.js.map +0 -1
- package/dist/generated/abi/TeePoolImplementation.cjs +0 -1313
- package/dist/generated/abi/TeePoolImplementation.cjs.map +0 -1
- package/dist/generated/abi/TeePoolImplementation.d.ts +0 -992
- package/dist/generated/abi/TeePoolImplementation.js +0 -1289
- package/dist/generated/abi/TeePoolImplementation.js.map +0 -1
- package/dist/generated/event-types.cjs +0 -17
- package/dist/generated/event-types.cjs.map +0 -1
- package/dist/generated/event-types.d.ts +0 -809
- package/dist/generated/event-types.js +0 -1
- package/dist/generated/event-types.js.map +0 -1
- package/dist/generated/eventRegistry.cjs +0 -4470
- package/dist/generated/eventRegistry.cjs.map +0 -1
- package/dist/generated/eventRegistry.d.ts +0 -14
- package/dist/generated/eventRegistry.js +0 -4445
- package/dist/generated/eventRegistry.js.map +0 -1
- package/dist/generated/server/server-exports.cjs +0 -45
- package/dist/generated/server/server-exports.cjs.map +0 -1
- package/dist/generated/server/server-exports.d.ts +0 -36
- package/dist/generated/server/server-exports.js +0 -19
- package/dist/generated/server/server-exports.js.map +0 -1
- package/dist/generated/server/server.cjs +0 -17
- package/dist/generated/server/server.cjs.map +0 -1
- package/dist/generated/server/server.d.ts +0 -907
- package/dist/generated/server/server.js +0 -1
- package/dist/generated/server/server.js.map +0 -1
- package/dist/generated/subgraph.cjs +0 -1440
- package/dist/generated/subgraph.cjs.map +0 -1
- package/dist/generated/subgraph.d.ts +0 -6113
- package/dist/generated/subgraph.js +0 -1404
- package/dist/generated/subgraph.js.map +0 -1
- package/dist/lib/__tests__/redisAtomicStore.test.d.ts +0 -1
- package/dist/lib/redisAtomicStore.cjs +0 -201
- package/dist/lib/redisAtomicStore.cjs.map +0 -1
- package/dist/lib/redisAtomicStore.d.ts +0 -120
- package/dist/lib/redisAtomicStore.js +0 -177
- package/dist/lib/redisAtomicStore.js.map +0 -1
- package/dist/server/relayerHandler.cjs +0 -452
- package/dist/server/relayerHandler.cjs.map +0 -1
- package/dist/server/relayerHandler.d.ts +0 -69
- package/dist/server/relayerHandler.js +0 -428
- package/dist/server/relayerHandler.js.map +0 -1
- package/dist/tests/abi.test.d.ts +0 -1
- package/dist/tests/chains-definitions.test.d.ts +0 -1
- package/dist/tests/core-encryption.test.d.ts +0 -1
- package/dist/tests/core-extended.test.d.ts +0 -1
- package/dist/tests/core-generics-coverage.test.d.ts +0 -1
- package/dist/tests/coverage-boost.test.d.ts +0 -1
- package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +0 -1
- package/dist/tests/data-addfile-permissions-schema.test.d.ts +0 -1
- package/dist/tests/data-additional-methods.test.d.ts +0 -1
- package/dist/tests/data-controller-edge-cases.test.d.ts +0 -1
- package/dist/tests/data-ipfs-gateways.test.d.ts +0 -1
- package/dist/tests/data-relayer.test.d.ts +0 -1
- package/dist/tests/data-schema-validation.test.d.ts +0 -1
- package/dist/tests/data-simple-methods.test.d.ts +0 -1
- package/dist/tests/data-upload-owner-validation.test.d.ts +0 -1
- package/dist/tests/data.test.d.ts +0 -1
- package/dist/tests/demo-integration.test.d.ts +0 -1
- package/dist/tests/demo-trusted-server-integration.test.d.ts +0 -1
- package/dist/tests/download-relayer.test.d.ts +0 -1
- package/dist/tests/dual-mode-permissions.test.d.ts +0 -1
- package/dist/tests/dual-mode-trusted-servers.test.d.ts +0 -1
- package/dist/tests/encryption-correct-implementation.test.d.ts +0 -1
- package/dist/tests/encryption-coverage.test.d.ts +0 -1
- package/dist/tests/encryption-edge-cases.test.d.ts +0 -1
- package/dist/tests/encryption-utils-updated.test.d.ts +0 -1
- package/dist/tests/errors-coverage.test.d.ts +0 -1
- package/dist/tests/factories/mockFactory.d.ts +0 -316
- package/dist/tests/fakes/FakeStorageManager.d.ts +0 -200
- package/dist/tests/fakes/FakeStorageManager.test.d.ts +0 -1
- package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +0 -170
- package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +0 -1
- package/dist/tests/fakes/fake-pgp-port.d.ts +0 -13
- package/dist/tests/grantValidation-edge-cases.test.d.ts +0 -1
- package/dist/tests/grantValidation-unreachable-branch.test.d.ts +0 -1
- package/dist/tests/helper-methods.test.d.ts +0 -1
- package/dist/tests/helpers/typedMocks.d.ts +0 -64
- package/dist/tests/index-browser.test.d.ts +0 -1
- package/dist/tests/index-node.test.d.ts +0 -1
- package/dist/tests/index.test.d.ts +0 -1
- package/dist/tests/mocks/platformAdapter.d.ts +0 -12
- package/dist/tests/new-permissions-methods.test.d.ts +0 -1
- package/dist/tests/no-buffer-browser.test.d.ts +0 -1
- package/dist/tests/permissions-grantee.test.d.ts +0 -1
- package/dist/tests/permissions-revoke-relayer.test.d.ts +0 -1
- package/dist/tests/permissions-schema-validation.test.d.ts +0 -1
- package/dist/tests/permissions-server-files.test.d.ts +0 -1
- package/dist/tests/permissions-transaction-options.test.d.ts +0 -1
- package/dist/tests/permissions-trust-servers.test.d.ts +0 -1
- package/dist/tests/permissions.test.d.ts +0 -1
- package/dist/tests/personal.test.d.ts +0 -1
- package/dist/tests/platform-browser.test.d.ts +0 -1
- package/dist/tests/platform-crypto-expanded.test.d.ts +0 -1
- package/dist/tests/platform-crypto.test.d.ts +0 -1
- package/dist/tests/platform-index.test.d.ts +0 -1
- package/dist/tests/platform-node.test.d.ts +0 -1
- package/dist/tests/platform-shared-utils.test.d.ts +0 -1
- package/dist/tests/platform-updated.test.d.ts +0 -1
- package/dist/tests/protocol-additional-methods.test.d.ts +0 -1
- package/dist/tests/protocol.test.d.ts +0 -1
- package/dist/tests/read-only-mode.test.d.ts +0 -1
- package/dist/tests/relayer-integration.test.d.ts +0 -1
- package/dist/tests/relayer-unified.test.d.ts +0 -1
- package/dist/tests/schemas.test.d.ts +0 -1
- package/dist/tests/server-relayer-handler.test.d.ts +0 -1
- package/dist/tests/signatureFormatter.test.d.ts +0 -1
- package/dist/tests/trusted-server-queries.test.d.ts +0 -1
- package/dist/tests/typedDataConverter.test.d.ts +0 -1
- package/dist/tests/types-contracts.test.d.ts +0 -1
- package/dist/tests/types-data.test.d.ts +0 -1
- package/dist/tests/types-external-apis.test.d.ts +0 -1
- package/dist/tests/types-generics.test.d.ts +0 -1
- package/dist/tests/types-permissions.test.d.ts +0 -1
- package/dist/tests/types-upload-params.test.d.ts +0 -1
- package/dist/tests/types.test.d.ts +0 -1
- package/dist/tests/utils-formatters.test.d.ts +0 -1
- package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +0 -1
- package/dist/tests/utils-grantFiles-validation.test.d.ts +0 -1
- package/dist/tests/utils-grantFiles.test.d.ts +0 -1
- package/dist/tests/utils-grantValidation-consolidated.test.d.ts +0 -1
- package/dist/tests/utils-grants.test.d.ts +0 -1
- package/dist/tests/utils-ipfs-additional.test.d.ts +0 -1
- package/dist/tests/utils-ipfs.test.d.ts +0 -4
- package/dist/tests/utils-schemaValidation.test.d.ts +0 -1
- package/dist/tests/vana.test.d.ts +0 -1
- package/dist/tests/wallet-crypto-compatibility.test.d.ts +0 -1
- package/dist/types/atomicStore.cjs.map +0 -1
- package/dist/types/atomicStore.d.ts +0 -236
- package/dist/types/atomicStore.js +0 -7
- package/dist/types/atomicStore.js.map +0 -1
- package/dist/types/blockchain.cjs +0 -17
- package/dist/types/blockchain.cjs.map +0 -1
- package/dist/types/blockchain.d.ts +0 -85
- package/dist/types/blockchain.js +0 -1
- package/dist/types/blockchain.js.map +0 -1
- package/dist/types/controller-context.cjs +0 -17
- package/dist/types/controller-context.cjs.map +0 -1
- package/dist/types/controller-context.d.ts +0 -68
- package/dist/types/controller-context.js +0 -1
- package/dist/types/controller-context.js.map +0 -1
- package/dist/types/data.cjs +0 -17
- package/dist/types/data.cjs.map +0 -1
- package/dist/types/data.d.ts +0 -763
- package/dist/types/data.js +0 -1
- package/dist/types/data.js.map +0 -1
- package/dist/types/external-apis.cjs +0 -61
- package/dist/types/external-apis.cjs.map +0 -1
- package/dist/types/external-apis.d.ts +0 -184
- package/dist/types/external-apis.js +0 -34
- package/dist/types/external-apis.js.map +0 -1
- package/dist/types/generics.cjs +0 -17
- package/dist/types/generics.cjs.map +0 -1
- package/dist/types/generics.d.ts +0 -518
- package/dist/types/generics.js +0 -1
- package/dist/types/generics.js.map +0 -1
- package/dist/types/operationStore.cjs +0 -17
- package/dist/types/operationStore.cjs.map +0 -1
- package/dist/types/operationStore.d.ts +0 -171
- package/dist/types/operationStore.js +0 -1
- package/dist/types/operationStore.js.map +0 -1
- package/dist/types/operations.cjs +0 -53
- package/dist/types/operations.cjs.map +0 -1
- package/dist/types/operations.d.ts +0 -204
- package/dist/types/operations.js +0 -26
- package/dist/types/operations.js.map +0 -1
- package/dist/types/options.cjs +0 -17
- package/dist/types/options.cjs.map +0 -1
- package/dist/types/options.d.ts +0 -308
- package/dist/types/options.js +0 -1
- package/dist/types/options.js.map +0 -1
- package/dist/types/permissions.cjs +0 -17
- package/dist/types/permissions.cjs.map +0 -1
- package/dist/types/permissions.d.ts +0 -955
- package/dist/types/permissions.js +0 -1
- package/dist/types/permissions.js.map +0 -1
- package/dist/types/personal.cjs +0 -17
- package/dist/types/personal.cjs.map +0 -1
- package/dist/types/personal.d.ts +0 -174
- package/dist/types/personal.js +0 -1
- package/dist/types/personal.js.map +0 -1
- package/dist/types/relayer.cjs +0 -17
- package/dist/types/relayer.cjs.map +0 -1
- package/dist/types/relayer.d.ts +0 -552
- package/dist/types/relayer.js +0 -1
- package/dist/types/relayer.js.map +0 -1
- package/dist/types/transactionResults.cjs +0 -17
- package/dist/types/transactionResults.cjs.map +0 -1
- package/dist/types/transactionResults.d.ts +0 -193
- package/dist/types/transactionResults.js +0 -1
- package/dist/types/transactionResults.js.map +0 -1
- package/dist/types/utils.cjs +0 -17
- package/dist/types/utils.cjs.map +0 -1
- package/dist/types/utils.d.ts +0 -771
- package/dist/types/utils.js +0 -1
- package/dist/types/utils.js.map +0 -1
- package/dist/utils/__tests__/chainQuery.test.d.ts +0 -1
- package/dist/utils/__tests__/parseTransaction.test.d.ts +0 -1
- package/dist/utils/__tests__/pojo-serialization.test.d.ts +0 -1
- package/dist/utils/__tests__/signatureCache.test.d.ts +0 -1
- package/dist/utils/__tests__/subgraphConsistency.test.d.ts +0 -4
- package/dist/utils/__tests__/subgraphPagination.test.d.ts +0 -4
- package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +0 -1
- package/dist/utils/__tests__/transactionHelpers.test.d.ts +0 -1
- package/dist/utils/__tests__/urlResolver.test.d.ts +0 -4
- package/dist/utils/blockchain/registry.cjs +0 -81
- package/dist/utils/blockchain/registry.cjs.map +0 -1
- package/dist/utils/blockchain/registry.d.ts +0 -32
- package/dist/utils/blockchain/registry.js +0 -56
- package/dist/utils/blockchain/registry.js.map +0 -1
- package/dist/utils/blockchain/registry.test.d.ts +0 -1
- package/dist/utils/chainQuery.cjs +0 -107
- package/dist/utils/chainQuery.cjs.map +0 -1
- package/dist/utils/chainQuery.d.ts +0 -31
- package/dist/utils/chainQuery.js +0 -82
- package/dist/utils/chainQuery.js.map +0 -1
- package/dist/utils/download.cjs +0 -69
- package/dist/utils/download.cjs.map +0 -1
- package/dist/utils/download.d.ts +0 -40
- package/dist/utils/download.js +0 -45
- package/dist/utils/download.js.map +0 -1
- package/dist/utils/encryption.cjs +0 -176
- package/dist/utils/encryption.cjs.map +0 -1
- package/dist/utils/encryption.d.ts +0 -271
- package/dist/utils/encryption.js +0 -142
- package/dist/utils/encryption.js.map +0 -1
- package/dist/utils/formatters.cjs +0 -55
- package/dist/utils/formatters.cjs.map +0 -1
- package/dist/utils/formatters.d.ts +0 -118
- package/dist/utils/formatters.js +0 -28
- package/dist/utils/formatters.js.map +0 -1
- package/dist/utils/grantFiles.cjs +0 -181
- package/dist/utils/grantFiles.cjs.map +0 -1
- package/dist/utils/grantFiles.d.ts +0 -172
- package/dist/utils/grantFiles.js +0 -143
- package/dist/utils/grantFiles.js.map +0 -1
- package/dist/utils/grantValidation.cjs +0 -243
- package/dist/utils/grantValidation.cjs.map +0 -1
- package/dist/utils/grantValidation.d.ts +0 -226
- package/dist/utils/grantValidation.js +0 -201
- package/dist/utils/grantValidation.js.map +0 -1
- package/dist/utils/grants.cjs +0 -108
- package/dist/utils/grants.cjs.map +0 -1
- package/dist/utils/grants.d.ts +0 -148
- package/dist/utils/grants.js +0 -82
- package/dist/utils/grants.js.map +0 -1
- package/dist/utils/ipfs.cjs +0 -128
- package/dist/utils/ipfs.cjs.map +0 -1
- package/dist/utils/ipfs.d.ts +0 -88
- package/dist/utils/ipfs.js +0 -97
- package/dist/utils/ipfs.js.map +0 -1
- package/dist/utils/multicall.cjs +0 -233
- package/dist/utils/multicall.cjs.map +0 -1
- package/dist/utils/multicall.d.ts +0 -126
- package/dist/utils/multicall.js +0 -208
- package/dist/utils/multicall.js.map +0 -1
- package/dist/utils/parseTransactionPojo.cjs +0 -87
- package/dist/utils/parseTransactionPojo.cjs.map +0 -1
- package/dist/utils/parseTransactionPojo.d.ts +0 -31
- package/dist/utils/parseTransactionPojo.js +0 -63
- package/dist/utils/parseTransactionPojo.js.map +0 -1
- package/dist/utils/schemaValidation.cjs +0 -258
- package/dist/utils/schemaValidation.cjs.map +0 -1
- package/dist/utils/schemaValidation.d.ts +0 -168
- package/dist/utils/schemaValidation.js +0 -219
- package/dist/utils/schemaValidation.js.map +0 -1
- package/dist/utils/signatureCache.cjs +0 -192
- package/dist/utils/signatureCache.cjs.map +0 -1
- package/dist/utils/signatureCache.d.ts +0 -172
- package/dist/utils/signatureCache.js +0 -167
- package/dist/utils/signatureCache.js.map +0 -1
- package/dist/utils/signatureFormatter.cjs +0 -42
- package/dist/utils/signatureFormatter.cjs.map +0 -1
- package/dist/utils/signatureFormatter.d.ts +0 -36
- package/dist/utils/signatureFormatter.js +0 -18
- package/dist/utils/signatureFormatter.js.map +0 -1
- package/dist/utils/subgraphConsistency.cjs +0 -184
- package/dist/utils/subgraphConsistency.cjs.map +0 -1
- package/dist/utils/subgraphConsistency.d.ts +0 -65
- package/dist/utils/subgraphConsistency.js +0 -155
- package/dist/utils/subgraphConsistency.js.map +0 -1
- package/dist/utils/subgraphMetaCache.cjs +0 -101
- package/dist/utils/subgraphMetaCache.cjs.map +0 -1
- package/dist/utils/subgraphMetaCache.d.ts +0 -56
- package/dist/utils/subgraphMetaCache.js +0 -76
- package/dist/utils/subgraphMetaCache.js.map +0 -1
- package/dist/utils/subgraphPagination.cjs +0 -104
- package/dist/utils/subgraphPagination.cjs.map +0 -1
- package/dist/utils/subgraphPagination.d.ts +0 -78
- package/dist/utils/subgraphPagination.js +0 -78
- package/dist/utils/subgraphPagination.js.map +0 -1
- package/dist/utils/tests/multicall.test.d.ts +0 -1
- package/dist/utils/transactionHelpers.cjs +0 -54
- package/dist/utils/transactionHelpers.cjs.map +0 -1
- package/dist/utils/transactionHelpers.d.ts +0 -80
- package/dist/utils/transactionHelpers.js +0 -29
- package/dist/utils/transactionHelpers.js.map +0 -1
- package/dist/utils/typeGuards.cjs +0 -109
- package/dist/utils/typeGuards.cjs.map +0 -1
- package/dist/utils/typeGuards.d.ts +0 -138
- package/dist/utils/typeGuards.js +0 -74
- package/dist/utils/typeGuards.js.map +0 -1
- package/dist/utils/typedDataConverter.cjs +0 -43
- package/dist/utils/typedDataConverter.cjs.map +0 -1
- package/dist/utils/typedDataConverter.d.ts +0 -46
- package/dist/utils/typedDataConverter.js +0 -19
- package/dist/utils/typedDataConverter.js.map +0 -1
- package/dist/utils/urlResolver.cjs +0 -62
- package/dist/utils/urlResolver.cjs.map +0 -1
- package/dist/utils/urlResolver.d.ts +0 -56
- package/dist/utils/urlResolver.js +0 -37
- package/dist/utils/urlResolver.js.map +0 -1
- package/dist/utils/wallet.cjs +0 -63
- package/dist/utils/wallet.cjs.map +0 -1
- package/dist/utils/wallet.d.ts +0 -94
- package/dist/utils/wallet.js +0 -37
- package/dist/utils/wallet.js.map +0 -1
- package/dist/utils/withEvents.cjs +0 -44
- package/dist/utils/withEvents.cjs.map +0 -1
- package/dist/utils/withEvents.d.ts +0 -56
- package/dist/utils/withEvents.js +0 -18
- package/dist/utils/withEvents.js.map +0 -1
- /package/dist/{__tests__/waitForTransactionEvents.test.d.ts → auth/pkce.test.d.ts} +0 -0
- /package/dist/{client/__tests__/enhancedResponse.test.d.ts → auth/token-store.test.d.ts} +0 -0
- /package/dist/{controllers/__tests__/operations.processQueue.test.d.ts → auth/web3-signed.test.d.ts} +0 -0
- /package/dist/{controllers/__tests__/schemas-edge-cases.test.d.ts → crypto/envelope/openpgp.test.d.ts} +0 -0
- /package/dist/{controllers/data-error-handling.test.d.ts → crypto/keys/derive.test.d.ts} +0 -0
- /package/dist/{tests/errors.test.d.ts → errors.test.d.ts} +0 -0
- /package/dist/{controllers/server-additional.test.d.ts → protocol/data-file.test.d.ts} +0 -0
- /package/dist/{core/__tests__/health.test.d.ts → protocol/eip712.test.d.ts} +0 -0
- /package/dist/{core/__tests__/inMemoryNonceManager.test.d.ts → protocol/gateway.test.d.ts} +0 -0
- /package/dist/{core/__tests__/nonceManager.test.d.ts → protocol/scopes.test.d.ts} +0 -0
- /package/dist/{core/core.test.d.ts → storage/tests/defaultStorage.test.d.ts} +0 -0
- /package/dist/{core/tests/apiClient.test.d.ts → storage/tests/r2Storage.test.d.ts} +0 -0
- /package/dist/{core/tests/client.test.d.ts → storage/tests/vanaStorage.test.d.ts} +0 -0
- /package/dist/{core/tests/generics.test.d.ts → types/ps-errors.test.d.ts} +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var scopes_exports = {};
|
|
20
|
+
__export(scopes_exports, {
|
|
21
|
+
ScopeSchema: () => ScopeSchema,
|
|
22
|
+
parseScope: () => parseScope,
|
|
23
|
+
scopeCoveredByGrant: () => scopeCoveredByGrant,
|
|
24
|
+
scopeMatchesPattern: () => scopeMatchesPattern,
|
|
25
|
+
scopeToPathSegments: () => scopeToPathSegments
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(scopes_exports);
|
|
28
|
+
var import_zod = require("zod");
|
|
29
|
+
const SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;
|
|
30
|
+
const ScopeSchema = import_zod.z.string().refine(
|
|
31
|
+
(scope) => {
|
|
32
|
+
const parts = scope.split(".");
|
|
33
|
+
return parts.length >= 2 && parts.length <= 3 && parts.every((part) => SEGMENT_RE.test(part));
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
message: "Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)"
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
function parseScope(scope) {
|
|
40
|
+
const validated = ScopeSchema.parse(scope);
|
|
41
|
+
const parts = validated.split(".");
|
|
42
|
+
return {
|
|
43
|
+
source: parts[0],
|
|
44
|
+
category: parts[1],
|
|
45
|
+
subcategory: parts[2],
|
|
46
|
+
raw: validated
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function scopeToPathSegments(scope) {
|
|
50
|
+
const parsed = parseScope(scope);
|
|
51
|
+
const segments = [parsed.source, parsed.category];
|
|
52
|
+
if (parsed.subcategory) {
|
|
53
|
+
segments.push(parsed.subcategory);
|
|
54
|
+
}
|
|
55
|
+
return segments;
|
|
56
|
+
}
|
|
57
|
+
function scopeMatchesPattern(requestedScope, grantPattern) {
|
|
58
|
+
if (grantPattern === "*") return true;
|
|
59
|
+
if (grantPattern.endsWith(".*")) {
|
|
60
|
+
const prefix = grantPattern.slice(0, -1);
|
|
61
|
+
return requestedScope.startsWith(prefix);
|
|
62
|
+
}
|
|
63
|
+
return requestedScope === grantPattern;
|
|
64
|
+
}
|
|
65
|
+
function scopeCoveredByGrant(requestedScope, grantedScopes) {
|
|
66
|
+
return grantedScopes.some(
|
|
67
|
+
(pattern) => scopeMatchesPattern(requestedScope, pattern)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
71
|
+
0 && (module.exports = {
|
|
72
|
+
ScopeSchema,
|
|
73
|
+
parseScope,
|
|
74
|
+
scopeCoveredByGrant,
|
|
75
|
+
scopeMatchesPattern,
|
|
76
|
+
scopeToPathSegments
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=scopes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/protocol/scopes.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;\n\nexport const ScopeSchema = z.string().refine(\n (scope) => {\n const parts = scope.split(\".\");\n return (\n parts.length >= 2 &&\n parts.length <= 3 &&\n parts.every((part) => SEGMENT_RE.test(part))\n );\n },\n {\n message:\n \"Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)\",\n },\n);\n\nexport type Scope = z.infer<typeof ScopeSchema>;\n\nexport interface ParsedScope {\n source: string;\n category: string;\n subcategory?: string;\n raw: string;\n}\n\nexport function parseScope(scope: string): ParsedScope {\n const validated = ScopeSchema.parse(scope);\n const parts = validated.split(\".\");\n return {\n source: parts[0],\n category: parts[1],\n subcategory: parts[2],\n raw: validated,\n };\n}\n\nexport function scopeToPathSegments(scope: string): string[] {\n const parsed = parseScope(scope);\n const segments = [parsed.source, parsed.category];\n if (parsed.subcategory) {\n segments.push(parsed.subcategory);\n }\n return segments;\n}\n\nexport function scopeMatchesPattern(\n requestedScope: string,\n grantPattern: string,\n): boolean {\n if (grantPattern === \"*\") return true;\n\n if (grantPattern.endsWith(\".*\")) {\n const prefix = grantPattern.slice(0, -1);\n return requestedScope.startsWith(prefix);\n }\n\n return requestedScope === grantPattern;\n}\n\nexport function scopeCoveredByGrant(\n requestedScope: string,\n grantedScopes: string[],\n): boolean {\n return grantedScopes.some((pattern) =>\n scopeMatchesPattern(requestedScope, pattern),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAElB,MAAM,aAAa;AAEZ,MAAM,cAAc,aAAE,OAAO,EAAE;AAAA,EACpC,CAAC,UAAU;AACT,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WACE,MAAM,UAAU,KAChB,MAAM,UAAU,KAChB,MAAM,MAAM,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC;AAAA,EAE/C;AAAA,EACA;AAAA,IACE,SACE;AAAA,EACJ;AACF;AAWO,SAAS,WAAW,OAA4B;AACrD,QAAM,YAAY,YAAY,MAAM,KAAK;AACzC,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,UAAU,MAAM,CAAC;AAAA,IACjB,aAAa,MAAM,CAAC;AAAA,IACpB,KAAK;AAAA,EACP;AACF;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ;AAChD,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,OAAO,WAAW;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,gBACA,cACS;AACT,MAAI,iBAAiB,IAAK,QAAO;AAEjC,MAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,UAAM,SAAS,aAAa,MAAM,GAAG,EAAE;AACvC,WAAO,eAAe,WAAW,MAAM;AAAA,EACzC;AAEA,SAAO,mBAAmB;AAC5B;AAEO,SAAS,oBACd,gBACA,eACS;AACT,SAAO,cAAc;AAAA,IAAK,CAAC,YACzB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7C;AACF;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ScopeSchema: z.ZodString;
|
|
3
|
+
export type Scope = z.infer<typeof ScopeSchema>;
|
|
4
|
+
export interface ParsedScope {
|
|
5
|
+
source: string;
|
|
6
|
+
category: string;
|
|
7
|
+
subcategory?: string;
|
|
8
|
+
raw: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseScope(scope: string): ParsedScope;
|
|
11
|
+
export declare function scopeToPathSegments(scope: string): string[];
|
|
12
|
+
export declare function scopeMatchesPattern(requestedScope: string, grantPattern: string): boolean;
|
|
13
|
+
export declare function scopeCoveredByGrant(requestedScope: string, grantedScopes: string[]): boolean;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;
|
|
3
|
+
const ScopeSchema = z.string().refine(
|
|
4
|
+
(scope) => {
|
|
5
|
+
const parts = scope.split(".");
|
|
6
|
+
return parts.length >= 2 && parts.length <= 3 && parts.every((part) => SEGMENT_RE.test(part));
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
message: "Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)"
|
|
10
|
+
}
|
|
11
|
+
);
|
|
12
|
+
function parseScope(scope) {
|
|
13
|
+
const validated = ScopeSchema.parse(scope);
|
|
14
|
+
const parts = validated.split(".");
|
|
15
|
+
return {
|
|
16
|
+
source: parts[0],
|
|
17
|
+
category: parts[1],
|
|
18
|
+
subcategory: parts[2],
|
|
19
|
+
raw: validated
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function scopeToPathSegments(scope) {
|
|
23
|
+
const parsed = parseScope(scope);
|
|
24
|
+
const segments = [parsed.source, parsed.category];
|
|
25
|
+
if (parsed.subcategory) {
|
|
26
|
+
segments.push(parsed.subcategory);
|
|
27
|
+
}
|
|
28
|
+
return segments;
|
|
29
|
+
}
|
|
30
|
+
function scopeMatchesPattern(requestedScope, grantPattern) {
|
|
31
|
+
if (grantPattern === "*") return true;
|
|
32
|
+
if (grantPattern.endsWith(".*")) {
|
|
33
|
+
const prefix = grantPattern.slice(0, -1);
|
|
34
|
+
return requestedScope.startsWith(prefix);
|
|
35
|
+
}
|
|
36
|
+
return requestedScope === grantPattern;
|
|
37
|
+
}
|
|
38
|
+
function scopeCoveredByGrant(requestedScope, grantedScopes) {
|
|
39
|
+
return grantedScopes.some(
|
|
40
|
+
(pattern) => scopeMatchesPattern(requestedScope, pattern)
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
ScopeSchema,
|
|
45
|
+
parseScope,
|
|
46
|
+
scopeCoveredByGrant,
|
|
47
|
+
scopeMatchesPattern,
|
|
48
|
+
scopeToPathSegments
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=scopes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/protocol/scopes.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;\n\nexport const ScopeSchema = z.string().refine(\n (scope) => {\n const parts = scope.split(\".\");\n return (\n parts.length >= 2 &&\n parts.length <= 3 &&\n parts.every((part) => SEGMENT_RE.test(part))\n );\n },\n {\n message:\n \"Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)\",\n },\n);\n\nexport type Scope = z.infer<typeof ScopeSchema>;\n\nexport interface ParsedScope {\n source: string;\n category: string;\n subcategory?: string;\n raw: string;\n}\n\nexport function parseScope(scope: string): ParsedScope {\n const validated = ScopeSchema.parse(scope);\n const parts = validated.split(\".\");\n return {\n source: parts[0],\n category: parts[1],\n subcategory: parts[2],\n raw: validated,\n };\n}\n\nexport function scopeToPathSegments(scope: string): string[] {\n const parsed = parseScope(scope);\n const segments = [parsed.source, parsed.category];\n if (parsed.subcategory) {\n segments.push(parsed.subcategory);\n }\n return segments;\n}\n\nexport function scopeMatchesPattern(\n requestedScope: string,\n grantPattern: string,\n): boolean {\n if (grantPattern === \"*\") return true;\n\n if (grantPattern.endsWith(\".*\")) {\n const prefix = grantPattern.slice(0, -1);\n return requestedScope.startsWith(prefix);\n }\n\n return requestedScope === grantPattern;\n}\n\nexport function scopeCoveredByGrant(\n requestedScope: string,\n grantedScopes: string[],\n): boolean {\n return grantedScopes.some((pattern) =>\n scopeMatchesPattern(requestedScope, pattern),\n );\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAElB,MAAM,aAAa;AAEZ,MAAM,cAAc,EAAE,OAAO,EAAE;AAAA,EACpC,CAAC,UAAU;AACT,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WACE,MAAM,UAAU,KAChB,MAAM,UAAU,KAChB,MAAM,MAAM,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC;AAAA,EAE/C;AAAA,EACA;AAAA,IACE,SACE;AAAA,EACJ;AACF;AAWO,SAAS,WAAW,OAA4B;AACrD,QAAM,YAAY,YAAY,MAAM,KAAK;AACzC,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,UAAU,MAAM,CAAC;AAAA,IACjB,aAAa,MAAM,CAAC;AAAA,IACpB,KAAK;AAAA,EACP;AACF;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ;AAChD,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,OAAO,WAAW;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,gBACA,cACS;AACT,MAAI,iBAAiB,IAAK,QAAO;AAEjC,MAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,UAAM,SAAS,aAAa,MAAM,GAAG,EAAE;AACvC,WAAO,eAAe,WAAW,MAAM;AAAA,EACzC;AAEA,SAAO,mBAAmB;AAC5B;AAEO,SAAS,oBACd,gBACA,eACS;AACT,SAAO,cAAc;AAAA,IAAK,CAAC,YACzB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7C;AACF;","names":[]}
|
|
@@ -16,16 +16,17 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
21
|
-
|
|
19
|
+
var default_exports = {};
|
|
20
|
+
__export(default_exports, {
|
|
21
|
+
createVanaStorageProvider: () => createVanaStorageProvider
|
|
22
22
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
module.exports = __toCommonJS(default_exports);
|
|
24
|
+
var import_vana_storage = require("./providers/vana-storage");
|
|
25
|
+
function createVanaStorageProvider(options) {
|
|
26
|
+
return new import_vana_storage.VanaStorage(options);
|
|
26
27
|
}
|
|
27
28
|
// Annotate the CommonJS export names for ESM import in node:
|
|
28
29
|
0 && (module.exports = {
|
|
29
|
-
|
|
30
|
+
createVanaStorageProvider
|
|
30
31
|
});
|
|
31
|
-
//# sourceMappingURL=
|
|
32
|
+
//# sourceMappingURL=default.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/storage/default.ts"],"sourcesContent":["import type { StorageProvider } from \"../types/storage\";\nimport { VanaStorage, type VanaStorageConfig } from \"./providers/vana-storage\";\n\nexport type VanaStorageProviderOptions = VanaStorageConfig;\n\nexport function createVanaStorageProvider(\n options: VanaStorageProviderOptions,\n): StorageProvider {\n return new VanaStorage(options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAAoD;AAI7C,SAAS,0BACd,SACiB;AACjB,SAAO,IAAI,gCAAY,OAAO;AAChC;","names":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { StorageProvider } from "../types/storage";
|
|
2
|
+
import { type VanaStorageConfig } from "./providers/vana-storage";
|
|
3
|
+
export type VanaStorageProviderOptions = VanaStorageConfig;
|
|
4
|
+
export declare function createVanaStorageProvider(options: VanaStorageProviderOptions): StorageProvider;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/storage/default.ts"],"sourcesContent":["import type { StorageProvider } from \"../types/storage\";\nimport { VanaStorage, type VanaStorageConfig } from \"./providers/vana-storage\";\n\nexport type VanaStorageProviderOptions = VanaStorageConfig;\n\nexport function createVanaStorageProvider(\n options: VanaStorageProviderOptions,\n): StorageProvider {\n return new VanaStorage(options);\n}\n"],"mappings":"AACA,SAAS,mBAA2C;AAI7C,SAAS,0BACd,SACiB;AACjB,SAAO,IAAI,YAAY,OAAO;AAChC;","names":[]}
|
package/dist/storage/index.cjs
CHANGED
|
@@ -23,11 +23,17 @@ __export(storage_exports, {
|
|
|
23
23
|
GoogleDriveStorage: () => import_google_drive.GoogleDriveStorage,
|
|
24
24
|
IpfsStorage: () => import_ipfs.IpfsStorage,
|
|
25
25
|
PinataStorage: () => import_pinata.PinataStorage,
|
|
26
|
+
R2Storage: () => import_r2.R2Storage,
|
|
26
27
|
StorageError: () => import_storage.StorageError,
|
|
27
|
-
StorageManager: () => import_manager.StorageManager
|
|
28
|
+
StorageManager: () => import_manager.StorageManager,
|
|
29
|
+
VanaStorage: () => import_vana_storage.VanaStorage,
|
|
30
|
+
createVanaStorageProvider: () => import_default.createVanaStorageProvider
|
|
28
31
|
});
|
|
29
32
|
module.exports = __toCommonJS(storage_exports);
|
|
30
33
|
var import_storage = require("../types/storage");
|
|
34
|
+
var import_default = require("./default");
|
|
35
|
+
var import_r2 = require("./providers/r2");
|
|
36
|
+
var import_vana_storage = require("./providers/vana-storage");
|
|
31
37
|
var import_google_drive = require("./providers/google-drive");
|
|
32
38
|
var import_dropbox = require("./providers/dropbox");
|
|
33
39
|
var import_ipfs = require("./providers/ipfs");
|
|
@@ -41,7 +47,10 @@ var import_manager = require("./manager");
|
|
|
41
47
|
GoogleDriveStorage,
|
|
42
48
|
IpfsStorage,
|
|
43
49
|
PinataStorage,
|
|
50
|
+
R2Storage,
|
|
44
51
|
StorageError,
|
|
45
|
-
StorageManager
|
|
52
|
+
StorageManager,
|
|
53
|
+
VanaStorage,
|
|
54
|
+
createVanaStorageProvider
|
|
46
55
|
});
|
|
47
56
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["/**\n * Storage API for Vana SDK\n *\n * Provides unified interface for different storage providers\n * to upload, download, and manage user data files.\n *\n * ## Storage Provider Decision Tree\n *\n * Choose your storage provider based on your needs:\n *\n * **Need full CRUD operations and metadata?**\n * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata\n *\n * **Want to use your own IPFS infrastructure?**\n * - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service\n * - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node\n * - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service\n *\n * **Want flexible callback-based storage?**\n * - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)\n *\n * **Need Google Drive integration?**\n * - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management\n *\n * @example\n * ```typescript\n * // Managed IPFS with full features\n * const pinata = new PinataStorage({ jwt: \"your-jwt\" });\n *\n * // Standard IPFS with Infura\n * const ipfs = IpfsStorage.forInfura({ projectId: \"...\", projectSecret: \"...\" });\n *\n * // Callback-based storage (flexible)\n * const storage = new CallbackStorage({\n * async upload(blob, filename) {\n * // Your custom upload logic\n * const response = await fetch('/api/upload', { method: 'POST', body: blob });\n * const data = await response.json();\n * return { url: data.url, size: blob.size, contentType: blob.type };\n * },\n * async download(identifier) {\n * // Your custom download logic\n * const response = await fetch(`/api/download/${identifier}`);\n * return response.blob();\n * }\n * });\n * ```\n */\n\n// Re-export storage types from types module to avoid circular dependencies\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"../types/storage\";\n\nexport { StorageError } from \"../types/storage\";\n\n// Export storage providers\nexport { GoogleDriveStorage } from \"./providers/google-drive\";\nexport { DropboxStorage } from \"./providers/dropbox\";\nexport { IpfsStorage } from \"./providers/ipfs\";\nexport { PinataStorage } from \"./providers/pinata\";\nexport { CallbackStorage } from \"./providers/callback-storage\";\n\n// Export storage manager\nexport { StorageManager } from \"./manager\";\n\n// Export storage callback types\nexport type {\n StorageCallbacks,\n StorageDownloadOptions,\n StorageListResult,\n} from \"../types/config\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["/**\n * Storage API for Vana SDK\n *\n * Provides unified interface for different storage providers\n * to upload, download, and manage user data files.\n *\n * ## Storage Provider Decision Tree\n *\n * Choose your storage provider based on your needs:\n *\n * **Default backend hosted by ODL?**\n * - ✅ Use `VanaStorage` - storage.vana.com with Web3Signed auth.\n *\n * **Need full CRUD operations and metadata?**\n * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata\n *\n * **Want to use your own IPFS infrastructure?**\n * - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service\n * - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node\n * - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service\n *\n * **Want flexible callback-based storage?**\n * - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)\n *\n * **Need Google Drive integration?**\n * - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management\n *\n * @example\n * ```typescript\n * // Managed IPFS with full features\n * const pinata = new PinataStorage({ jwt: \"your-jwt\" });\n *\n * // Standard IPFS with Infura\n * const ipfs = IpfsStorage.forInfura({ projectId: \"...\", projectSecret: \"...\" });\n *\n * // Callback-based storage (flexible)\n * const storage = new CallbackStorage({\n * async upload(blob, filename) {\n * // Your custom upload logic\n * const response = await fetch('/api/upload', { method: 'POST', body: blob });\n * const data = await response.json();\n * return { url: data.url, size: blob.size, contentType: blob.type };\n * },\n * async download(identifier) {\n * // Your custom download logic\n * const response = await fetch(`/api/download/${identifier}`);\n * return response.blob();\n * }\n * });\n * ```\n */\n\n// Re-export storage types from types module to avoid circular dependencies\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"../types/storage\";\n\nexport { StorageError } from \"../types/storage\";\n\n// Export default Vana storage factory\nexport { createVanaStorageProvider } from \"./default\";\nexport type { VanaStorageProviderOptions } from \"./default\";\n\n// Export storage providers\nexport { R2Storage } from \"./providers/r2\";\nexport type { R2Config } from \"./providers/r2\";\nexport { VanaStorage } from \"./providers/vana-storage\";\nexport type {\n VanaStorageConfig,\n VanaStorageSigner,\n} from \"./providers/vana-storage\";\nexport { GoogleDriveStorage } from \"./providers/google-drive\";\nexport { DropboxStorage } from \"./providers/dropbox\";\nexport { IpfsStorage } from \"./providers/ipfs\";\nexport { PinataStorage } from \"./providers/pinata\";\nexport { CallbackStorage } from \"./providers/callback-storage\";\n\n// Export storage manager\nexport { StorageManager } from \"./manager\";\n\n// Export storage callback types\nexport type {\n StorageCallbacks,\n StorageDownloadOptions,\n StorageListResult,\n} from \"../types/config\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6DA,qBAA6B;AAG7B,qBAA0C;AAI1C,gBAA0B;AAE1B,0BAA4B;AAK5B,0BAAmC;AACnC,qBAA+B;AAC/B,kBAA4B;AAC5B,oBAA8B;AAC9B,8BAAgC;AAGhC,qBAA+B;","names":[]}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Choose your storage provider based on your needs:
|
|
10
10
|
*
|
|
11
|
+
* **Default backend hosted by ODL?**
|
|
12
|
+
* - ✅ Use `VanaStorage` - storage.vana.com with Web3Signed auth.
|
|
13
|
+
*
|
|
11
14
|
* **Need full CRUD operations and metadata?**
|
|
12
15
|
* - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata
|
|
13
16
|
*
|
|
@@ -48,6 +51,12 @@
|
|
|
48
51
|
*/
|
|
49
52
|
export type { StorageProvider, StorageUploadResult, StorageFile, StorageListOptions, StorageProviderConfig, } from "../types/storage";
|
|
50
53
|
export { StorageError } from "../types/storage";
|
|
54
|
+
export { createVanaStorageProvider } from "./default";
|
|
55
|
+
export type { VanaStorageProviderOptions } from "./default";
|
|
56
|
+
export { R2Storage } from "./providers/r2";
|
|
57
|
+
export type { R2Config } from "./providers/r2";
|
|
58
|
+
export { VanaStorage } from "./providers/vana-storage";
|
|
59
|
+
export type { VanaStorageConfig, VanaStorageSigner, } from "./providers/vana-storage";
|
|
51
60
|
export { GoogleDriveStorage } from "./providers/google-drive";
|
|
52
61
|
export { DropboxStorage } from "./providers/dropbox";
|
|
53
62
|
export { IpfsStorage } from "./providers/ipfs";
|
package/dist/storage/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { StorageError } from "../types/storage";
|
|
2
|
+
import { createVanaStorageProvider } from "./default";
|
|
3
|
+
import { R2Storage } from "./providers/r2";
|
|
4
|
+
import { VanaStorage } from "./providers/vana-storage";
|
|
2
5
|
import { GoogleDriveStorage } from "./providers/google-drive";
|
|
3
6
|
import { DropboxStorage } from "./providers/dropbox";
|
|
4
7
|
import { IpfsStorage } from "./providers/ipfs";
|
|
@@ -11,7 +14,10 @@ export {
|
|
|
11
14
|
GoogleDriveStorage,
|
|
12
15
|
IpfsStorage,
|
|
13
16
|
PinataStorage,
|
|
17
|
+
R2Storage,
|
|
14
18
|
StorageError,
|
|
15
|
-
StorageManager
|
|
19
|
+
StorageManager,
|
|
20
|
+
VanaStorage,
|
|
21
|
+
createVanaStorageProvider
|
|
16
22
|
};
|
|
17
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["/**\n * Storage API for Vana SDK\n *\n * Provides unified interface for different storage providers\n * to upload, download, and manage user data files.\n *\n * ## Storage Provider Decision Tree\n *\n * Choose your storage provider based on your needs:\n *\n * **Need full CRUD operations and metadata?**\n * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata\n *\n * **Want to use your own IPFS infrastructure?**\n * - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service\n * - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node\n * - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service\n *\n * **Want flexible callback-based storage?**\n * - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)\n *\n * **Need Google Drive integration?**\n * - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management\n *\n * @example\n * ```typescript\n * // Managed IPFS with full features\n * const pinata = new PinataStorage({ jwt: \"your-jwt\" });\n *\n * // Standard IPFS with Infura\n * const ipfs = IpfsStorage.forInfura({ projectId: \"...\", projectSecret: \"...\" });\n *\n * // Callback-based storage (flexible)\n * const storage = new CallbackStorage({\n * async upload(blob, filename) {\n * // Your custom upload logic\n * const response = await fetch('/api/upload', { method: 'POST', body: blob });\n * const data = await response.json();\n * return { url: data.url, size: blob.size, contentType: blob.type };\n * },\n * async download(identifier) {\n * // Your custom download logic\n * const response = await fetch(`/api/download/${identifier}`);\n * return response.blob();\n * }\n * });\n * ```\n */\n\n// Re-export storage types from types module to avoid circular dependencies\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"../types/storage\";\n\nexport { StorageError } from \"../types/storage\";\n\n// Export storage providers\nexport { GoogleDriveStorage } from \"./providers/google-drive\";\nexport { DropboxStorage } from \"./providers/dropbox\";\nexport { IpfsStorage } from \"./providers/ipfs\";\nexport { PinataStorage } from \"./providers/pinata\";\nexport { CallbackStorage } from \"./providers/callback-storage\";\n\n// Export storage manager\nexport { StorageManager } from \"./manager\";\n\n// Export storage callback types\nexport type {\n StorageCallbacks,\n StorageDownloadOptions,\n StorageListResult,\n} from \"../types/config\";\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/storage/index.ts"],"sourcesContent":["/**\n * Storage API for Vana SDK\n *\n * Provides unified interface for different storage providers\n * to upload, download, and manage user data files.\n *\n * ## Storage Provider Decision Tree\n *\n * Choose your storage provider based on your needs:\n *\n * **Default backend hosted by ODL?**\n * - ✅ Use `VanaStorage` - storage.vana.com with Web3Signed auth.\n *\n * **Need full CRUD operations and metadata?**\n * - ✅ Use `PinataStorage` - Managed IPFS with listing, deletion, and rich metadata\n *\n * **Want to use your own IPFS infrastructure?**\n * - ✅ Use `IpfsStorage.forInfura()` - Connect to Infura IPFS service\n * - ✅ Use `IpfsStorage.forLocalNode()` - Connect to local IPFS node\n * - ✅ Use `new IpfsStorage()` - Connect to any IPFS-compatible service\n *\n * **Want flexible callback-based storage?**\n * - ✅ Use `CallbackStorage` - Implement storage via custom callbacks (HTTP, WebSocket, etc.)\n *\n * **Need Google Drive integration?**\n * - ✅ Use `GoogleDriveStorage` - Direct Google Drive API with folder management\n *\n * @example\n * ```typescript\n * // Managed IPFS with full features\n * const pinata = new PinataStorage({ jwt: \"your-jwt\" });\n *\n * // Standard IPFS with Infura\n * const ipfs = IpfsStorage.forInfura({ projectId: \"...\", projectSecret: \"...\" });\n *\n * // Callback-based storage (flexible)\n * const storage = new CallbackStorage({\n * async upload(blob, filename) {\n * // Your custom upload logic\n * const response = await fetch('/api/upload', { method: 'POST', body: blob });\n * const data = await response.json();\n * return { url: data.url, size: blob.size, contentType: blob.type };\n * },\n * async download(identifier) {\n * // Your custom download logic\n * const response = await fetch(`/api/download/${identifier}`);\n * return response.blob();\n * }\n * });\n * ```\n */\n\n// Re-export storage types from types module to avoid circular dependencies\nexport type {\n StorageProvider,\n StorageUploadResult,\n StorageFile,\n StorageListOptions,\n StorageProviderConfig,\n} from \"../types/storage\";\n\nexport { StorageError } from \"../types/storage\";\n\n// Export default Vana storage factory\nexport { createVanaStorageProvider } from \"./default\";\nexport type { VanaStorageProviderOptions } from \"./default\";\n\n// Export storage providers\nexport { R2Storage } from \"./providers/r2\";\nexport type { R2Config } from \"./providers/r2\";\nexport { VanaStorage } from \"./providers/vana-storage\";\nexport type {\n VanaStorageConfig,\n VanaStorageSigner,\n} from \"./providers/vana-storage\";\nexport { GoogleDriveStorage } from \"./providers/google-drive\";\nexport { DropboxStorage } from \"./providers/dropbox\";\nexport { IpfsStorage } from \"./providers/ipfs\";\nexport { PinataStorage } from \"./providers/pinata\";\nexport { CallbackStorage } from \"./providers/callback-storage\";\n\n// Export storage manager\nexport { StorageManager } from \"./manager\";\n\n// Export storage callback types\nexport type {\n StorageCallbacks,\n StorageDownloadOptions,\n StorageListResult,\n} from \"../types/config\";\n"],"mappings":"AA6DA,SAAS,oBAAoB;AAG7B,SAAS,iCAAiC;AAI1C,SAAS,iBAAiB;AAE1B,SAAS,mBAAmB;AAK5B,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAGhC,SAAS,sBAAsB;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport 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 * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\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 *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\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 * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\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 * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\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 * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\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 * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\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 * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\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
|
+
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport 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 * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\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 *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\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 * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\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 * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\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 * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\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 * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\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 * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport 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 * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\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 *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\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 * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\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 * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\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 * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\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 * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\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 * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\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
|
+
{"version":3,"sources":["../../../src/storage/providers/callback-storage.ts"],"sourcesContent":["/**\n * Provides user-defined storage operations through callback functions.\n *\n * @remarks\n * This module implements a flexible storage provider that delegates all\n * operations to user-provided callbacks. It enables custom storage\n * integrations without modifying the SDK, supporting any backend including\n * HTTP APIs, WebSocket servers, cloud storage services, or local filesystems.\n *\n * @category Storage\n * @module storage/providers/callback-storage\n */\n\nimport 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 * Delegates storage operations to user-provided callback functions.\n *\n * @remarks\n * This provider enables custom storage integrations by delegating all\n * operations to user-defined callbacks. It follows the same flexible\n * pattern as relayer callbacks, allowing implementations via HTTP,\n * WebSocket, direct cloud APIs, local filesystem, or any other backend.\n *\n * The provider validates callback results and wraps errors in consistent\n * `StorageError` types for uniform error handling across the SDK.\n *\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 *\n * @category Storage\n */\nexport class CallbackStorage implements StorageProvider {\n /**\n * Creates a new callback-based storage provider.\n *\n * @param callbacks - User-provided storage operation callbacks.\n * Must include at minimum `upload` and `download` functions.\n * @throws {Error} If required callbacks are missing\n */\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 * Uploads a file using the user-provided callback.\n *\n * @param file - The blob to upload.\n * Can be any Blob-compatible object including File.\n * @param filename - Optional filename for the upload.\n * If not provided, callback may generate a name.\n * @returns Upload result containing URL and metadata\n *\n * @throws {StorageError} With code 'INVALID_UPLOAD_RESULT' if callback returns invalid data\n * @throws {StorageError} With code 'UPLOAD_ERROR' if upload fails\n *\n * @example\n * ```typescript\n * const file = new File(['content'], 'data.json');\n * const result = await storage.upload(file);\n * console.log('Uploaded to:', result.url);\n * ```\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 * Downloads a file using the user-provided callback.\n *\n * @param url - The URL or identifier to download.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns The downloaded file as a Blob\n *\n * @throws {StorageError} With code 'INVALID_DOWNLOAD_RESULT' if callback returns non-Blob\n * @throws {StorageError} With code 'DOWNLOAD_ERROR' if download fails\n *\n * @example\n * ```typescript\n * const blob = await storage.download('https://storage.example.com/file123');\n * const text = await blob.text();\n * ```\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 * Lists files using the user-provided callback.\n *\n * @param options - Optional list options.\n * @param options.namePattern - Pattern to filter files by name.\n * Implementation depends on callback.\n * @param options.limit - Maximum number of files to return.\n * Implementation depends on callback.\n * @returns Array of storage file metadata\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if list callback not provided\n * @throws {StorageError} With code 'LIST_ERROR' if listing fails\n *\n * @remarks\n * This operation is optional and only available if a `list` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const files = await storage.list({ namePattern: '*.json' });\n * files.forEach(file => console.log(file.name, file.size));\n * ```\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 * Deletes a file using the user-provided callback.\n *\n * @param url - The URL or identifier to delete.\n * If `extractIdentifier` callback is provided, it will be used to extract the identifier.\n * @returns True if deletion succeeded, false otherwise\n *\n * @throws {StorageError} With code 'NOT_SUPPORTED' if delete callback not provided\n * @throws {StorageError} With code 'DELETE_ERROR' if deletion fails\n *\n * @remarks\n * This operation is optional and only available if a `delete` callback\n * is provided during construction.\n *\n * @example\n * ```typescript\n * const deleted = await storage.delete('https://storage.example.com/file123');\n * if (deleted) {\n * console.log('File deleted successfully');\n * }\n * ```\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 * Returns the provider's configuration and capabilities.\n *\n * @returns Configuration object indicating supported features\n *\n * @example\n * ```typescript\n * const config = storage.getConfig();\n * if (config.features.list) {\n * // List operation is supported\n * const files = await storage.list();\n * }\n * ```\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/storage/providers/dropbox.ts"],"sourcesContent":["/**\n * Dropbox Storage Provider for Vana SDK\n *\n * Implements the storage interface for Dropbox using its API.\n */\n\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../index\";\n\nexport interface DropboxConfig {\n /** OAuth2 access token */\n accessToken: string;\n /** Optional refresh token for token renewal */\n refreshToken?: string;\n /** OAuth2 client ID */\n clientId?: string;\n /** OAuth2 client secret */\n clientSecret?: string;\n /** Root path for uploads (defaults to '/Vana Data') */\n rootPath?: string;\n}\n\ninterface DropboxUploadResponse {\n name: string;\n path_lower: string;\n path_display: string;\n id: string;\n size: number;\n}\n\ninterface DropboxSharedLinkResponse {\n url: string;\n}\n\ninterface DropboxListResponse {\n entries: Array<{\n \".tag\": \"file\" | \"folder\";\n name: string;\n path_lower: string;\n id: string;\n server_modified: string;\n size: number;\n }>;\n has_more: boolean;\n cursor: string;\n}\n\n/**\n * Dropbox Storage Provider\n *\n * @remarks\n * Implements the storage interface for Dropbox. Requires OAuth2 authentication.\n *\n * @category Storage\n */\nexport class DropboxStorage implements StorageProvider {\n private readonly apiUrl = \"https://api.dropboxapi.com/2\";\n private readonly contentUrl = \"https://content.dropboxapi.com/2\";\n private readonly rootPath: string;\n\n constructor(private config: DropboxConfig) {\n if (!config.accessToken) {\n throw new StorageError(\n \"Dropbox access token is required\",\n \"MISSING_ACCESS_TOKEN\",\n \"dropbox\",\n );\n }\n this.rootPath = config.rootPath ?? \"/Vana Data\";\n }\n\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const fileName = filename ?? `vana-file-${Date.now()}.dat`;\n const path = `${this.rootPath}/${fileName}`;\n\n const response = await fetch(`${this.contentUrl}/files/upload`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/octet-stream\",\n \"Dropbox-API-Arg\": JSON.stringify({\n path,\n mode: \"add\",\n autorename: true,\n mute: false,\n }),\n },\n body: file,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new StorageError(\n `Failed to upload to Dropbox: ${error}`,\n \"UPLOAD_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxUploadResponse;\n const sharedLinkUrl = await this.createSharedLink(result.path_lower);\n\n // Convert the shareable URL to a direct download URL before returning.\n // This ensures the correct, raw-content URL is stored on-chain.\n const directDownloadUrl = sharedLinkUrl\n .replace(\"www.dropbox.com\", \"dl.dropboxusercontent.com\")\n .replace(\"?dl=1\", \"\");\n\n return {\n url: directDownloadUrl,\n size: file.size,\n contentType: file.type || \"application/octet-stream\",\n metadata: {\n id: result.id,\n path: result.path_display,\n },\n };\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox upload error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"UPLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async download(url: string): Promise<Blob> {\n // URL to force a direct download instead of showing the preview page.\n // This is done by changing the hostname from 'www.dropbox.com' to 'dl.dropboxusercontent.com'.\n const downloadUrl = url.replace(\n \"www.dropbox.com\",\n \"dl.dropboxusercontent.com\",\n );\n try {\n const response = await fetch(downloadUrl);\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to download from Dropbox: ${response.statusText}`,\n \"DOWNLOAD_FAILED\",\n \"dropbox\",\n );\n }\n return response.blob();\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox download error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DOWNLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.config.accessToken) {\n throw new StorageError(\n \"Access token not provided\",\n \"AUTH_ERROR\",\n \"dropbox\",\n );\n }\n\n try {\n const response = await fetch(`${this.apiUrl}/files/list_folder`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.rootPath,\n limit: options?.limit ?? 100,\n include_deleted: false,\n }),\n });\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to list Dropbox files: ${await response.text()}`,\n \"LIST_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxListResponse;\n\n return result.entries\n .filter((entry) => entry[\".tag\"] === \"file\")\n .map((file) => ({\n id: file.id,\n name: file.name,\n url: `dropbox://${file.path_lower}`, // Placeholder URL\n size: file.size,\n contentType: \"application/octet-stream\", // Dropbox API doesn't provide this in list\n createdAt: new Date(file.server_modified),\n }));\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox list error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"LIST_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async delete(url: string): Promise<boolean> {\n try {\n const path = new URL(url).pathname; // Assuming a direct URL format that includes the path\n const response = await fetch(`${this.apiUrl}/files/delete_v2`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ path }),\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n throw new StorageError(\n `Failed to delete from Dropbox: ${error}`,\n \"DELETE_FAILED\",\n \"dropbox\",\n );\n }\n\n return true;\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox delete error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DELETE_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n getConfig(): StorageProviderConfig {\n return {\n name: \"Dropbox\",\n type: \"dropbox\",\n requiresAuth: true,\n features: {\n upload: true,\n download: true,\n list: true,\n delete: true,\n },\n };\n }\n\n private async createSharedLink(path: string): Promise<string> {\n const response = await fetch(\n `${this.apiUrl}/sharing/create_shared_link_with_settings`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path,\n settings: {\n requested_visibility: \"public\",\n },\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n // If link already exists, Dropbox returns a 409 with the existing link\n if (\n response.status === 409 &&\n errorData.error?.shared_link_already_exists\n ) {\n return errorData.error.shared_link_already_exists.metadata.url;\n }\n throw new StorageError(\n `Failed to create shared link: ${JSON.stringify(errorData)}`,\n \"LINK_CREATION_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxSharedLinkResponse;\n // Modify URL for direct download\n return result.url.replace(\"?dl=0\", \"?dl=1\");\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/storage/providers/dropbox.ts"],"sourcesContent":["/**\n * Dropbox Storage Provider for Vana SDK\n *\n * Implements the storage interface for Dropbox using its API.\n */\n\nimport {\n StorageError,\n type StorageProvider,\n type StorageUploadResult,\n type StorageFile,\n type StorageListOptions,\n type StorageProviderConfig,\n} from \"../index\";\n\nexport interface DropboxConfig {\n /** OAuth2 access token */\n accessToken: string;\n /** Optional refresh token for token renewal */\n refreshToken?: string;\n /** OAuth2 client ID */\n clientId?: string;\n /** OAuth2 client secret */\n clientSecret?: string;\n /** Root path for uploads (defaults to '/Vana Data') */\n rootPath?: string;\n}\n\ninterface DropboxUploadResponse {\n name: string;\n path_lower: string;\n path_display: string;\n id: string;\n size: number;\n}\n\ninterface DropboxSharedLinkResponse {\n url: string;\n}\n\ninterface DropboxListResponse {\n entries: Array<{\n \".tag\": \"file\" | \"folder\";\n name: string;\n path_lower: string;\n id: string;\n server_modified: string;\n size: number;\n }>;\n has_more: boolean;\n cursor: string;\n}\n\n/**\n * Dropbox Storage Provider\n *\n * @remarks\n * Implements the storage interface for Dropbox. Requires OAuth2 authentication.\n *\n * @category Storage\n */\nexport class DropboxStorage implements StorageProvider {\n private readonly apiUrl = \"https://api.dropboxapi.com/2\";\n private readonly contentUrl = \"https://content.dropboxapi.com/2\";\n private readonly rootPath: string;\n\n constructor(private config: DropboxConfig) {\n if (!config.accessToken) {\n throw new StorageError(\n \"Dropbox access token is required\",\n \"MISSING_ACCESS_TOKEN\",\n \"dropbox\",\n );\n }\n this.rootPath = config.rootPath ?? \"/Vana Data\";\n }\n\n async upload(file: Blob, filename?: string): Promise<StorageUploadResult> {\n try {\n const fileName = filename ?? `vana-file-${Date.now()}.dat`;\n const path = `${this.rootPath}/${fileName}`;\n\n const response = await fetch(`${this.contentUrl}/files/upload`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/octet-stream\",\n \"Dropbox-API-Arg\": JSON.stringify({\n path,\n mode: \"add\",\n autorename: true,\n mute: false,\n }),\n },\n body: file,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new StorageError(\n `Failed to upload to Dropbox: ${error}`,\n \"UPLOAD_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxUploadResponse;\n const sharedLinkUrl = await this.createSharedLink(result.path_lower);\n\n // Convert the shareable URL to a direct download URL before returning.\n // This ensures the correct, raw-content URL is stored on-chain.\n const directDownloadUrl = sharedLinkUrl\n .replace(\"www.dropbox.com\", \"dl.dropboxusercontent.com\")\n .replace(\"?dl=1\", \"\");\n\n return {\n url: directDownloadUrl,\n size: file.size,\n contentType: file.type || \"application/octet-stream\",\n metadata: {\n id: result.id,\n path: result.path_display,\n },\n };\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox upload error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"UPLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async download(url: string): Promise<Blob> {\n // URL to force a direct download instead of showing the preview page.\n // This is done by changing the hostname from 'www.dropbox.com' to 'dl.dropboxusercontent.com'.\n const downloadUrl = url.replace(\n \"www.dropbox.com\",\n \"dl.dropboxusercontent.com\",\n );\n try {\n const response = await fetch(downloadUrl);\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to download from Dropbox: ${response.statusText}`,\n \"DOWNLOAD_FAILED\",\n \"dropbox\",\n );\n }\n return response.blob();\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox download error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DOWNLOAD_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async list(options?: StorageListOptions): Promise<StorageFile[]> {\n if (!this.config.accessToken) {\n throw new StorageError(\n \"Access token not provided\",\n \"AUTH_ERROR\",\n \"dropbox\",\n );\n }\n\n try {\n const response = await fetch(`${this.apiUrl}/files/list_folder`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.rootPath,\n limit: options?.limit ?? 100,\n include_deleted: false,\n }),\n });\n\n if (!response.ok) {\n throw new StorageError(\n `Failed to list Dropbox files: ${await response.text()}`,\n \"LIST_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxListResponse;\n\n return result.entries\n .filter((entry) => entry[\".tag\"] === \"file\")\n .map((file) => ({\n id: file.id,\n name: file.name,\n url: `dropbox://${file.path_lower}`, // Placeholder URL\n size: file.size,\n contentType: \"application/octet-stream\", // Dropbox API doesn't provide this in list\n createdAt: new Date(file.server_modified),\n }));\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox list error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"LIST_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n async delete(url: string): Promise<boolean> {\n try {\n const path = new URL(url).pathname; // Assuming a direct URL format that includes the path\n const response = await fetch(`${this.apiUrl}/files/delete_v2`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ path }),\n });\n\n if (!response.ok && response.status !== 404) {\n const error = await response.text();\n throw new StorageError(\n `Failed to delete from Dropbox: ${error}`,\n \"DELETE_FAILED\",\n \"dropbox\",\n );\n }\n\n return true;\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw new StorageError(\n `Dropbox delete error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n \"DELETE_ERROR\",\n \"dropbox\",\n );\n }\n }\n\n getConfig(): StorageProviderConfig {\n return {\n name: \"Dropbox\",\n type: \"dropbox\",\n requiresAuth: true,\n features: {\n upload: true,\n download: true,\n list: true,\n delete: true,\n },\n };\n }\n\n private async createSharedLink(path: string): Promise<string> {\n const response = await fetch(\n `${this.apiUrl}/sharing/create_shared_link_with_settings`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path,\n settings: {\n requested_visibility: \"public\",\n },\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n // If link already exists, Dropbox returns a 409 with the existing link\n if (\n response.status === 409 &&\n errorData.error?.shared_link_already_exists\n ) {\n return errorData.error.shared_link_already_exists.metadata.url;\n }\n throw new StorageError(\n `Failed to create shared link: ${JSON.stringify(errorData)}`,\n \"LINK_CREATION_FAILED\",\n \"dropbox\",\n );\n }\n\n const result = (await response.json()) as DropboxSharedLinkResponse;\n // Modify URL for direct download\n return result.url.replace(\"?dl=0\", \"?dl=1\");\n }\n}\n"],"mappings":"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","names":[]}
|