@opendatalabs/vana-sdk 0.1.0-alpha.d7fc764 → 0.1.0-alpha.dba79a3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/waitForTransactionEvents.test.d.ts +1 -0
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +36 -2
- package/dist/browser.js.map +1 -1
- package/dist/chains/definitions.cjs +9 -6
- package/dist/chains/definitions.cjs.map +1 -1
- package/dist/chains/definitions.d.ts +9 -11
- package/dist/chains/definitions.js +9 -6
- package/dist/chains/definitions.js.map +1 -1
- package/dist/chains/index.cjs.map +1 -1
- package/dist/chains/index.d.ts +34 -2
- package/dist/chains/index.js.map +1 -1
- package/dist/chains.browser.d.ts +8 -2
- package/dist/chains.d.ts +8 -2
- package/dist/chains.node.d.ts +8 -2
- package/dist/config/addresses.d.ts +8 -24
- package/dist/config/chains.cjs.map +1 -1
- package/dist/config/chains.d.ts +108 -13
- package/dist/config/chains.js.map +1 -1
- package/dist/config/default-services.cjs +60 -0
- package/dist/config/default-services.cjs.map +1 -0
- package/dist/config/default-services.d.ts +46 -0
- package/dist/config/default-services.js +33 -0
- package/dist/config/default-services.js.map +1 -0
- package/dist/config/default-services.test.d.ts +1 -0
- package/dist/config/features.d.ts +1 -3
- package/dist/config/tests/addresses.test.d.ts +1 -0
- package/dist/contracts/contractController.cjs +3 -3
- package/dist/contracts/contractController.cjs.map +1 -1
- package/dist/contracts/contractController.d.ts +77 -38
- package/dist/contracts/contractController.js +4 -7
- package/dist/contracts/contractController.js.map +1 -1
- package/dist/contracts/tests/contractController.test.d.ts +1 -0
- package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +7 -0
- package/dist/controllers/__tests__/operations.processQueue.test.d.ts +1 -0
- package/dist/controllers/__tests__/schemas-edge-cases.test.d.ts +1 -0
- package/dist/controllers/base.cjs +116 -0
- package/dist/controllers/base.cjs.map +1 -0
- package/dist/controllers/base.d.ts +94 -0
- package/dist/controllers/base.js +92 -0
- package/dist/controllers/base.js.map +1 -0
- package/dist/controllers/data-error-handling.test.d.ts +1 -0
- package/dist/controllers/data.cjs +827 -439
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +373 -254
- package/dist/controllers/data.js +840 -442
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/operations.cjs +430 -0
- package/dist/controllers/operations.cjs.map +1 -0
- package/dist/controllers/operations.d.ts +229 -0
- package/dist/controllers/operations.js +406 -0
- package/dist/controllers/operations.js.map +1 -0
- package/dist/controllers/permissions.cjs +929 -483
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +1318 -25
- package/dist/controllers/permissions.js +929 -483
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/controllers/protocol.cjs +15 -11
- package/dist/controllers/protocol.cjs.map +1 -1
- package/dist/controllers/protocol.d.ts +34 -63
- package/dist/controllers/protocol.js +15 -14
- package/dist/controllers/protocol.js.map +1 -1
- package/dist/controllers/schemas.cjs +100 -75
- package/dist/controllers/schemas.cjs.map +1 -1
- package/dist/controllers/schemas.d.ts +56 -74
- package/dist/controllers/schemas.js +100 -75
- package/dist/controllers/schemas.js.map +1 -1
- package/dist/controllers/server-additional.test.d.ts +1 -0
- package/dist/controllers/server.cjs +32 -25
- package/dist/controllers/server.cjs.map +1 -1
- package/dist/controllers/server.d.ts +53 -71
- package/dist/controllers/server.js +32 -25
- package/dist/controllers/server.js.map +1 -1
- package/dist/core/__tests__/health.test.d.ts +1 -0
- package/dist/core/__tests__/inMemoryNonceManager.test.d.ts +1 -0
- package/dist/core/__tests__/nonceManager.test.d.ts +1 -0
- package/dist/core/__tests__/pollingManager.test.d.ts +4 -0
- package/dist/core/apiClient.cjs +68 -15
- package/dist/core/apiClient.cjs.map +1 -1
- package/dist/core/apiClient.d.ts +137 -16
- package/dist/core/apiClient.js +72 -22
- package/dist/core/apiClient.js.map +1 -1
- package/dist/core/client.cjs +7 -7
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts +6 -9
- package/dist/core/client.js +7 -7
- package/dist/core/client.js.map +1 -1
- package/dist/core/core.test.d.ts +1 -0
- package/dist/core/generics.cjs +41 -12
- package/dist/core/generics.cjs.map +1 -1
- package/dist/core/generics.d.ts +104 -19
- package/dist/core/generics.js +52 -32
- package/dist/core/generics.js.map +1 -1
- package/dist/core/health.cjs +289 -0
- package/dist/core/health.cjs.map +1 -0
- package/dist/core/health.d.ts +143 -0
- package/dist/core/health.js +265 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/inMemoryNonceManager.cjs +138 -0
- package/dist/core/inMemoryNonceManager.cjs.map +1 -0
- package/dist/core/inMemoryNonceManager.d.ts +69 -0
- package/dist/core/inMemoryNonceManager.js +114 -0
- package/dist/core/inMemoryNonceManager.js.map +1 -0
- package/dist/core/nonceManager.cjs +304 -0
- package/dist/core/nonceManager.cjs.map +1 -0
- package/dist/core/nonceManager.d.ts +116 -0
- package/dist/core/nonceManager.js +280 -0
- package/dist/core/nonceManager.js.map +1 -0
- package/dist/core/pollingManager.cjs +292 -0
- package/dist/core/pollingManager.cjs.map +1 -0
- package/dist/core/pollingManager.d.ts +120 -0
- package/dist/core/pollingManager.js +268 -0
- package/dist/core/pollingManager.js.map +1 -0
- package/dist/core/tests/apiClient.test.d.ts +1 -0
- package/dist/core/tests/client.test.d.ts +1 -0
- package/dist/core/tests/generics.test.d.ts +1 -0
- package/dist/core.cjs +152 -61
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +50 -67
- package/dist/core.js +164 -86
- package/dist/core.js.map +1 -1
- package/dist/crypto/ecies/__tests__/base.test.d.ts +4 -0
- package/dist/crypto/ecies/__tests__/compatibility.test.d.ts +8 -0
- package/dist/crypto/ecies/__tests__/constants.test.d.ts +4 -0
- package/dist/crypto/ecies/__tests__/native-parity.test.d.ts +7 -0
- package/dist/crypto/ecies/__tests__/normalization.test.d.ts +1 -0
- package/dist/crypto/ecies/__tests__/test-vectors.d.ts +2 -4
- package/dist/crypto/ecies/base.cjs +20 -6
- package/dist/crypto/ecies/base.cjs.map +1 -1
- package/dist/crypto/ecies/base.d.ts +2 -5
- package/dist/crypto/ecies/base.js +28 -18
- package/dist/crypto/ecies/base.js.map +1 -1
- package/dist/crypto/ecies/browser.cjs +2 -1
- package/dist/crypto/ecies/browser.cjs.map +1 -1
- package/dist/crypto/ecies/browser.d.ts +2 -7
- package/dist/crypto/ecies/browser.js +2 -1
- package/dist/crypto/ecies/browser.js.map +1 -1
- package/dist/crypto/ecies/constants.d.ts +7 -9
- package/dist/crypto/ecies/index.d.ts +8 -1
- package/dist/crypto/ecies/interface.cjs +4 -5
- package/dist/crypto/ecies/interface.cjs.map +1 -1
- package/dist/crypto/ecies/interface.d.ts +9 -11
- package/dist/crypto/ecies/interface.js +4 -5
- package/dist/crypto/ecies/interface.js.map +1 -1
- package/dist/crypto/ecies/node.cjs +3 -2
- package/dist/crypto/ecies/node.cjs.map +1 -1
- package/dist/crypto/ecies/node.d.ts +2 -7
- package/dist/crypto/ecies/node.js +11 -16
- package/dist/crypto/ecies/node.js.map +1 -1
- package/dist/crypto/ecies/test-vectors/eccrypto-vectors.json +72 -0
- package/dist/crypto/ecies/utils.cjs +2 -41
- package/dist/crypto/ecies/utils.cjs.map +1 -1
- package/dist/crypto/ecies/utils.d.ts +3 -40
- package/dist/crypto/ecies/utils.js +1 -35
- package/dist/crypto/ecies/utils.js.map +1 -1
- package/dist/crypto/services/WalletKeyEncryptionService.cjs +2 -2
- package/dist/crypto/services/WalletKeyEncryptionService.cjs.map +1 -1
- package/dist/crypto/services/WalletKeyEncryptionService.d.ts +3 -7
- package/dist/crypto/services/WalletKeyEncryptionService.js +5 -9
- package/dist/crypto/services/WalletKeyEncryptionService.js.map +1 -1
- package/dist/crypto/services/WalletKeyEncryptionService.test.d.ts +1 -0
- package/dist/diagnostics.d.ts +1 -3
- package/dist/diagnostics.test.d.ts +1 -0
- package/dist/errors.cjs +45 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +117 -15
- package/dist/errors.js +46 -6
- package/dist/errors.js.map +1 -1
- package/dist/generated/abi/ComputeEngineImplementation.d.ts +2 -3
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DATFactoryImplementation.d.ts +2 -3
- package/dist/generated/abi/DATImplementation.d.ts +2 -3
- package/dist/generated/abi/DATPausableImplementation.d.ts +2 -3
- package/dist/generated/abi/DATVotesImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPPerformanceImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRootImplementation.d.ts +1 -3
- package/dist/generated/abi/DLPTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +1 -3
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +2 -3
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +2 -3
- package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +2 -3
- package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DataRegistryImplementation.cjs +13 -0
- package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.d.ts +12 -3
- package/dist/generated/abi/DataRegistryImplementation.js +13 -0
- package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/QueryEngineImplementation.d.ts +2 -3
- package/dist/generated/abi/SwapHelperImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaEpochImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/index.cjs +42 -0
- package/dist/generated/abi/index.cjs.map +1 -1
- package/dist/generated/abi/index.d.ts +47 -18
- package/dist/generated/abi/index.js +21 -0
- package/dist/generated/abi/index.js.map +1 -1
- package/dist/generated/event-types.cjs +17 -0
- package/dist/generated/event-types.cjs.map +1 -0
- package/dist/generated/event-types.d.ts +854 -0
- package/dist/generated/event-types.js +1 -0
- package/dist/generated/event-types.js.map +1 -0
- package/dist/generated/eventRegistry.cjs +3351 -0
- package/dist/generated/eventRegistry.cjs.map +1 -0
- package/dist/generated/eventRegistry.d.ts +14 -0
- package/dist/generated/eventRegistry.js +3326 -0
- package/dist/generated/eventRegistry.js.map +1 -0
- package/dist/generated/server/server-exports.d.ts +19 -21
- package/dist/generated/server/server.cjs.map +1 -1
- package/dist/generated/server/server.d.ts +113 -87
- package/dist/generated/subgraph.cjs +797 -32
- package/dist/generated/subgraph.cjs.map +1 -1
- package/dist/generated/subgraph.d.ts +464 -332
- package/dist/generated/subgraph.js +792 -32
- package/dist/generated/subgraph.js.map +1 -1
- package/dist/index.browser.d.ts +49 -73
- package/dist/index.browser.js +14 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +31 -3
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +223 -64
- package/dist/index.node.js +28 -2
- package/dist/index.node.js.map +1 -1
- package/dist/lib/__tests__/redisAtomicStore.test.d.ts +1 -0
- package/dist/lib/redisAtomicStore.cjs +201 -0
- package/dist/lib/redisAtomicStore.cjs.map +1 -0
- package/dist/lib/redisAtomicStore.d.ts +120 -0
- package/dist/lib/redisAtomicStore.js +177 -0
- package/dist/lib/redisAtomicStore.js.map +1 -0
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +42 -2
- package/dist/node.js.map +1 -1
- package/dist/platform/browser-only.d.ts +5 -8
- package/dist/platform/browser-only.test.d.ts +1 -0
- package/dist/platform/browser-safe.d.ts +6 -9
- package/dist/platform/browser-safe.test.d.ts +1 -0
- package/dist/platform/browser.cjs +167 -8
- package/dist/platform/browser.cjs.map +1 -1
- package/dist/platform/browser.d.ts +235 -18
- package/dist/platform/browser.js +179 -29
- package/dist/platform/browser.js.map +1 -1
- package/dist/platform/browser.test.d.ts +1 -0
- package/dist/platform/index.d.ts +11 -5
- package/dist/platform/interface.cjs.map +1 -1
- package/dist/platform/interface.d.ts +289 -98
- package/dist/platform/node.cjs +163 -2
- package/dist/platform/node.cjs.map +1 -1
- package/dist/platform/node.d.ts +72 -13
- package/dist/platform/node.js +175 -21
- package/dist/platform/node.js.map +1 -1
- package/dist/platform/ports/openpgp-port.cjs +74 -0
- package/dist/platform/ports/openpgp-port.cjs.map +1 -0
- package/dist/platform/ports/openpgp-port.d.ts +13 -0
- package/dist/platform/ports/openpgp-port.js +59 -0
- package/dist/platform/ports/openpgp-port.js.map +1 -0
- package/dist/platform/ports/pgp-port.cjs +17 -0
- package/dist/platform/ports/pgp-port.cjs.map +1 -0
- package/dist/platform/ports/pgp-port.d.ts +35 -0
- package/dist/platform/ports/pgp-port.js +1 -0
- package/dist/platform/ports/pgp-port.js.map +1 -0
- package/dist/platform/shared/error-utils.d.ts +2 -4
- package/dist/platform/shared/pgp-utils.cjs +2 -2
- package/dist/platform/shared/pgp-utils.cjs.map +1 -1
- package/dist/platform/shared/pgp-utils.d.ts +3 -5
- package/dist/platform/shared/pgp-utils.js +2 -2
- package/dist/platform/shared/pgp-utils.js.map +1 -1
- package/dist/platform/shared/stream-utils.d.ts +1 -3
- package/dist/platform/utils.d.ts +6 -10
- package/dist/platform/utils.test.d.ts +1 -0
- package/dist/platform.browser.d.ts +9 -4
- package/dist/platform.d.ts +11 -5
- package/dist/platform.node.d.ts +10 -5
- package/dist/schemas/dataSchema.schema.json +53 -0
- package/dist/schemas/grantFile.schema.json +43 -0
- package/dist/server/relayerHandler.cjs +420 -0
- package/dist/server/relayerHandler.cjs.map +1 -0
- package/dist/server/relayerHandler.d.ts +69 -0
- package/dist/server/relayerHandler.js +396 -0
- package/dist/server/relayerHandler.js.map +1 -0
- package/dist/storage/index.d.ts +56 -10
- package/dist/storage/manager.cjs +114 -31
- package/dist/storage/manager.cjs.map +1 -1
- package/dist/storage/manager.d.ts +121 -30
- package/dist/storage/manager.js +113 -37
- package/dist/storage/manager.js.map +1 -1
- package/dist/storage/providers/callback-storage.cjs +89 -18
- package/dist/storage/providers/callback-storage.cjs.map +1 -1
- package/dist/storage/providers/callback-storage.d.ts +111 -28
- package/dist/storage/providers/callback-storage.js +89 -18
- package/dist/storage/providers/callback-storage.js.map +1 -1
- package/dist/storage/providers/google-drive.cjs +2 -2
- package/dist/storage/providers/google-drive.cjs.map +1 -1
- package/dist/storage/providers/google-drive.d.ts +3 -7
- package/dist/storage/providers/google-drive.js +4 -7
- package/dist/storage/providers/google-drive.js.map +1 -1
- package/dist/storage/providers/google-drive.test.d.ts +1 -0
- package/dist/storage/providers/ipfs.cjs +5 -5
- package/dist/storage/providers/ipfs.cjs.map +1 -1
- package/dist/storage/providers/ipfs.d.ts +3 -6
- package/dist/storage/providers/ipfs.js +7 -10
- package/dist/storage/providers/ipfs.js.map +1 -1
- package/dist/storage/providers/pinata.cjs +6 -6
- package/dist/storage/providers/pinata.cjs.map +1 -1
- package/dist/storage/providers/pinata.d.ts +17 -22
- package/dist/storage/providers/pinata.js +8 -11
- package/dist/storage/providers/pinata.js.map +1 -1
- package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
- package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
- package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
- package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
- package/dist/storage/tests/storageManager.test.d.ts +1 -0
- package/dist/tests/abi.test.d.ts +1 -0
- package/dist/tests/chains-definitions.test.d.ts +1 -0
- package/dist/tests/core-encryption.test.d.ts +1 -0
- package/dist/tests/core-extended.test.d.ts +1 -0
- package/dist/tests/core-generics-coverage.test.d.ts +1 -0
- package/dist/tests/coverage-boost.test.d.ts +1 -0
- package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
- package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
- package/dist/tests/data-additional-methods.test.d.ts +1 -0
- package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
- package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
- package/dist/tests/data-relayer.test.d.ts +1 -0
- package/dist/tests/data-schema-validation.test.d.ts +1 -0
- package/dist/tests/data-simple-methods.test.d.ts +1 -0
- package/dist/tests/data.test.d.ts +1 -0
- package/dist/tests/demo-integration.test.d.ts +1 -0
- package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
- package/dist/tests/download-relayer.test.d.ts +1 -0
- package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
- package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
- package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
- package/dist/tests/encryption-coverage.test.d.ts +1 -0
- package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
- package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
- package/dist/tests/errors-coverage.test.d.ts +1 -0
- package/dist/tests/errors.test.d.ts +1 -0
- package/dist/tests/factories/mockFactory.d.ts +316 -0
- package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
- package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
- package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
- package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
- package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
- package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
- package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
- package/dist/tests/helper-methods.test.d.ts +1 -0
- package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
- package/dist/tests/helpers/typedMocks.d.ts +64 -0
- package/dist/tests/index-browser.test.d.ts +1 -0
- package/dist/tests/index-node.test.d.ts +1 -0
- package/dist/tests/index.test.d.ts +1 -0
- package/dist/tests/mocks/platformAdapter.d.ts +12 -0
- package/dist/tests/new-permissions-methods.test.d.ts +1 -0
- package/dist/tests/no-buffer-browser.test.d.ts +1 -0
- package/dist/tests/permissions-grantee.test.d.ts +1 -0
- package/dist/tests/permissions-revoke-relayer.test.d.ts +1 -0
- package/dist/tests/permissions-schema-validation.test.d.ts +1 -0
- package/dist/tests/permissions-server-files.test.d.ts +1 -0
- package/dist/tests/permissions-transaction-options.test.d.ts +1 -0
- package/dist/tests/permissions-trust-servers.test.d.ts +1 -0
- package/dist/tests/permissions.test.d.ts +1 -0
- package/dist/tests/personal.test.d.ts +1 -0
- package/dist/tests/platform-browser.test.d.ts +1 -0
- package/dist/tests/platform-crypto-expanded.test.d.ts +1 -0
- package/dist/tests/platform-crypto.test.d.ts +1 -0
- package/dist/tests/platform-index.test.d.ts +1 -0
- package/dist/tests/platform-node.test.d.ts +1 -0
- package/dist/tests/platform-shared-utils.test.d.ts +1 -0
- package/dist/tests/platform-updated.test.d.ts +1 -0
- package/dist/tests/protocol-additional-methods.test.d.ts +1 -0
- package/dist/tests/protocol.test.d.ts +1 -0
- package/dist/tests/read-only-mode.test.d.ts +1 -0
- package/dist/tests/relayer-integration.test.d.ts +1 -0
- package/dist/tests/relayer-unified.test.d.ts +1 -0
- package/dist/tests/schemas.test.d.ts +1 -0
- package/dist/tests/server-relayer-handler.test.d.ts +1 -0
- package/dist/tests/setup.d.ts +7 -0
- package/dist/tests/signatureFormatter.test.d.ts +1 -0
- package/dist/tests/trusted-server-queries.test.d.ts +1 -0
- package/dist/tests/typedDataConverter.test.d.ts +1 -0
- package/dist/tests/types-contracts.test.d.ts +1 -0
- package/dist/tests/types-data.test.d.ts +1 -0
- package/dist/tests/types-external-apis.test.d.ts +1 -0
- package/dist/tests/types-generics.test.d.ts +1 -0
- package/dist/tests/types-permissions.test.d.ts +1 -0
- package/dist/tests/types-upload-params.test.d.ts +1 -0
- package/dist/tests/types.test.d.ts +1 -0
- package/dist/tests/utils-formatters.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles.test.d.ts +1 -0
- package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
- package/dist/tests/utils-grants.test.d.ts +1 -0
- package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
- package/dist/tests/utils-ipfs.test.d.ts +4 -0
- package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
- package/dist/tests/vana.test.d.ts +1 -0
- package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
- package/dist/{chains.browser.cjs → types/atomicStore.cjs} +9 -15
- package/dist/types/atomicStore.cjs.map +1 -0
- package/dist/types/atomicStore.d.ts +236 -0
- package/dist/types/atomicStore.js +7 -0
- package/dist/types/atomicStore.js.map +1 -0
- package/dist/types/blockchain.cjs +17 -0
- package/dist/types/blockchain.cjs.map +1 -0
- package/dist/types/blockchain.d.ts +85 -0
- package/dist/types/blockchain.js +1 -0
- package/dist/types/blockchain.js.map +1 -0
- package/dist/types/chains-additional.test.d.ts +1 -0
- package/dist/types/chains.cjs.map +1 -1
- package/dist/types/chains.d.ts +80 -16
- package/dist/types/chains.js.map +1 -1
- package/dist/types/config.cjs +10 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +236 -242
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/contracts.cjs.map +1 -1
- package/dist/types/contracts.d.ts +79 -18
- package/dist/types/controller-context.cjs +17 -0
- package/dist/types/controller-context.cjs.map +1 -0
- package/dist/types/controller-context.d.ts +68 -0
- package/dist/types/controller-context.js +1 -0
- package/dist/types/controller-context.js.map +1 -0
- package/dist/types/data.cjs.map +1 -1
- package/dist/types/data.d.ts +118 -49
- package/dist/types/external-apis.d.ts +10 -12
- package/dist/types/generics.cjs.map +1 -1
- package/dist/types/generics.d.ts +116 -48
- package/dist/types/index.cjs +5 -4
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +48 -34
- package/dist/types/index.js +9 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/operationStore.cjs +17 -0
- package/dist/types/operationStore.cjs.map +1 -0
- package/dist/types/operationStore.d.ts +171 -0
- package/dist/types/operationStore.js +1 -0
- package/dist/types/operationStore.js.map +1 -0
- package/dist/types/operations.cjs +2 -2
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +164 -42
- package/dist/types/operations.js +2 -2
- package/dist/types/operations.js.map +1 -1
- package/dist/types/options.cjs +17 -0
- package/dist/types/options.cjs.map +1 -0
- package/dist/types/options.d.ts +308 -0
- package/dist/types/options.js +1 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/permissions.cjs.map +1 -1
- package/dist/types/permissions.d.ts +72 -78
- package/dist/types/personal.cjs.map +1 -1
- package/dist/types/personal.d.ts +137 -22
- package/dist/types/relayer.cjs.map +1 -1
- package/dist/types/relayer.d.ts +293 -50
- package/dist/types/storage.cjs.map +1 -1
- package/dist/types/storage.d.ts +15 -29
- package/dist/types/storage.js +2 -5
- package/dist/types/storage.js.map +1 -1
- package/dist/types/transactionResults.cjs.map +1 -1
- package/dist/types/transactionResults.d.ts +193 -25
- package/dist/types/utils.cjs.map +1 -1
- package/dist/types/utils.d.ts +20 -68
- package/dist/types.d.ts +4 -40
- package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
- package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
- package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
- package/dist/utils/__tests__/subgraphConsistency.test.d.ts +4 -0
- package/dist/utils/__tests__/subgraphPagination.test.d.ts +4 -0
- package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
- package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
- package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
- package/dist/utils/blockchain/registry.cjs +2 -2
- package/dist/utils/blockchain/registry.cjs.map +1 -1
- package/dist/utils/blockchain/registry.d.ts +6 -8
- package/dist/utils/blockchain/registry.js +2 -2
- package/dist/utils/blockchain/registry.js.map +1 -1
- package/dist/utils/blockchain/registry.test.d.ts +1 -0
- package/dist/utils/chainQuery.cjs +107 -0
- package/dist/utils/chainQuery.cjs.map +1 -0
- package/dist/utils/chainQuery.d.ts +31 -0
- package/dist/utils/chainQuery.js +82 -0
- package/dist/utils/chainQuery.js.map +1 -0
- package/dist/utils/crypto-utils.cjs +0 -12
- package/dist/utils/crypto-utils.cjs.map +1 -1
- package/dist/utils/crypto-utils.d.ts +9 -27
- package/dist/utils/crypto-utils.js +0 -11
- package/dist/utils/crypto-utils.js.map +1 -1
- package/dist/utils/crypto-utils.test.d.ts +1 -0
- package/dist/utils/download.cjs +3 -3
- package/dist/utils/download.cjs.map +1 -1
- package/dist/utils/download.d.ts +13 -14
- package/dist/utils/download.js +2 -2
- package/dist/utils/download.js.map +1 -1
- package/dist/utils/encoding.cjs +1 -1
- package/dist/utils/encoding.cjs.map +1 -1
- package/dist/utils/encoding.d.ts +4 -6
- package/dist/utils/encoding.js +1 -1
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/encoding.test.d.ts +1 -0
- package/dist/utils/encryption.cjs +16 -10
- package/dist/utils/encryption.cjs.map +1 -1
- package/dist/utils/encryption.d.ts +13 -17
- package/dist/utils/encryption.js +16 -10
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/formatters.cjs +4 -2
- package/dist/utils/formatters.cjs.map +1 -1
- package/dist/utils/formatters.d.ts +4 -6
- package/dist/utils/formatters.js +4 -2
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/grantFiles.cjs +7 -4
- package/dist/utils/grantFiles.cjs.map +1 -1
- package/dist/utils/grantFiles.d.ts +16 -30
- package/dist/utils/grantFiles.js +7 -4
- package/dist/utils/grantFiles.js.map +1 -1
- package/dist/utils/grantValidation.cjs +1 -1
- package/dist/utils/grantValidation.cjs.map +1 -1
- package/dist/utils/grantValidation.d.ts +109 -33
- package/dist/utils/grantValidation.js +1 -1
- package/dist/utils/grantValidation.js.map +1 -1
- package/dist/utils/grants.cjs +1 -1
- package/dist/utils/grants.cjs.map +1 -1
- package/dist/utils/grants.d.ts +101 -23
- package/dist/utils/grants.js +1 -1
- package/dist/utils/grants.js.map +1 -1
- package/dist/utils/ipfs.cjs +2 -4
- package/dist/utils/ipfs.cjs.map +1 -1
- package/dist/utils/ipfs.d.ts +8 -10
- package/dist/utils/ipfs.js +2 -4
- package/dist/utils/ipfs.js.map +1 -1
- package/dist/utils/lazy-import.cjs +4 -6
- package/dist/utils/lazy-import.cjs.map +1 -1
- package/dist/utils/lazy-import.d.ts +33 -10
- package/dist/utils/lazy-import.js +4 -6
- package/dist/utils/lazy-import.js.map +1 -1
- package/dist/utils/multicall.cjs +4 -2
- package/dist/utils/multicall.cjs.map +1 -1
- package/dist/utils/multicall.d.ts +5 -8
- package/dist/utils/multicall.js +4 -2
- package/dist/utils/multicall.js.map +1 -1
- package/dist/utils/parseTransactionPojo.cjs +87 -0
- package/dist/utils/parseTransactionPojo.cjs.map +1 -0
- package/dist/utils/parseTransactionPojo.d.ts +31 -0
- package/dist/utils/parseTransactionPojo.js +63 -0
- package/dist/utils/parseTransactionPojo.js.map +1 -0
- package/dist/utils/schemaValidation.cjs +5 -5
- package/dist/utils/schemaValidation.cjs.map +1 -1
- package/dist/utils/schemaValidation.d.ts +8 -12
- package/dist/utils/schemaValidation.js +7 -10
- package/dist/utils/schemaValidation.js.map +1 -1
- package/dist/utils/signatureCache.cjs +9 -4
- package/dist/utils/signatureCache.cjs.map +1 -1
- package/dist/utils/signatureCache.d.ts +53 -15
- package/dist/utils/signatureCache.js +12 -10
- package/dist/utils/signatureCache.js.map +1 -1
- package/dist/utils/signatureFormatter.cjs +6 -9
- package/dist/utils/signatureFormatter.cjs.map +1 -1
- package/dist/utils/signatureFormatter.d.ts +2 -5
- package/dist/utils/signatureFormatter.js +6 -9
- package/dist/utils/signatureFormatter.js.map +1 -1
- package/dist/utils/subgraphConsistency.cjs +184 -0
- package/dist/utils/subgraphConsistency.cjs.map +1 -0
- package/dist/utils/subgraphConsistency.d.ts +65 -0
- package/dist/utils/subgraphConsistency.js +155 -0
- package/dist/utils/subgraphConsistency.js.map +1 -0
- package/dist/utils/subgraphMetaCache.cjs +101 -0
- package/dist/utils/subgraphMetaCache.cjs.map +1 -0
- package/dist/utils/subgraphMetaCache.d.ts +56 -0
- package/dist/utils/subgraphMetaCache.js +76 -0
- package/dist/utils/subgraphMetaCache.js.map +1 -0
- package/dist/utils/subgraphPagination.cjs +104 -0
- package/dist/utils/subgraphPagination.cjs.map +1 -0
- package/dist/utils/subgraphPagination.d.ts +78 -0
- package/dist/utils/subgraphPagination.js +78 -0
- package/dist/utils/subgraphPagination.js.map +1 -0
- package/dist/utils/tests/multicall.test.d.ts +1 -0
- package/dist/utils/transactionHelpers.cjs +54 -0
- package/dist/utils/transactionHelpers.cjs.map +1 -0
- package/dist/utils/transactionHelpers.d.ts +80 -0
- package/dist/utils/transactionHelpers.js +29 -0
- package/dist/utils/transactionHelpers.js.map +1 -0
- package/dist/utils/typeGuards.cjs +109 -0
- package/dist/utils/typeGuards.cjs.map +1 -0
- package/dist/utils/typeGuards.d.ts +138 -0
- package/dist/utils/typeGuards.js +74 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/typedDataConverter.cjs.map +1 -1
- package/dist/utils/typedDataConverter.d.ts +42 -9
- package/dist/utils/typedDataConverter.js.map +1 -1
- package/dist/utils/urlResolver.cjs +8 -1
- package/dist/utils/urlResolver.cjs.map +1 -1
- package/dist/utils/urlResolver.d.ts +24 -8
- package/dist/utils/urlResolver.js +9 -2
- package/dist/utils/urlResolver.js.map +1 -1
- package/dist/utils/wallet.cjs +63 -0
- package/dist/utils/wallet.cjs.map +1 -0
- package/dist/utils/wallet.d.ts +94 -0
- package/dist/utils/wallet.js +37 -0
- package/dist/utils/wallet.js.map +1 -0
- package/dist/utils/withEvents.cjs +44 -0
- package/dist/utils/withEvents.cjs.map +1 -0
- package/dist/utils/withEvents.d.ts +56 -0
- package/dist/utils/withEvents.js +18 -0
- package/dist/utils/withEvents.js.map +1 -0
- package/package.json +25 -13
- package/dist/browser.d.cts +0 -2
- package/dist/chains/definitions.d.cts +0 -53
- package/dist/chains/index.d.cts +0 -2
- package/dist/chains.browser.cjs.map +0 -1
- package/dist/chains.browser.d.cts +0 -2
- package/dist/chains.d.cts +0 -2
- package/dist/chains.node.d.cts +0 -2
- package/dist/config/addresses.d.cts +0 -380
- package/dist/config/chains.d.cts +0 -85
- package/dist/config/eventMappings.cjs +0 -114
- package/dist/config/eventMappings.cjs.map +0 -1
- package/dist/config/eventMappings.d.cts +0 -108
- package/dist/config/eventMappings.d.ts +0 -108
- package/dist/config/eventMappings.js +0 -90
- package/dist/config/eventMappings.js.map +0 -1
- package/dist/config/features.d.cts +0 -64
- package/dist/contracts/contractController.d.cts +0 -96
- package/dist/controllers/data.d.cts +0 -941
- package/dist/controllers/permissions.d.cts +0 -25
- package/dist/controllers/protocol.d.cts +0 -167
- package/dist/controllers/schemas.d.cts +0 -272
- package/dist/controllers/server.d.cts +0 -243
- package/dist/core/apiClient.d.cts +0 -165
- package/dist/core/client.d.cts +0 -92
- package/dist/core/generics.d.cts +0 -120
- package/dist/core.d.cts +0 -466
- package/dist/crypto/ecies/__tests__/test-vectors.d.cts +0 -40
- package/dist/crypto/ecies/base.d.cts +0 -143
- package/dist/crypto/ecies/browser.d.cts +0 -48
- package/dist/crypto/ecies/constants.d.cts +0 -122
- package/dist/crypto/ecies/index.d.cts +0 -1
- package/dist/crypto/ecies/interface.d.cts +0 -176
- package/dist/crypto/ecies/node.d.cts +0 -50
- package/dist/crypto/ecies/utils.d.cts +0 -67
- package/dist/crypto/services/WalletKeyEncryptionService.d.cts +0 -92
- package/dist/diagnostics.d.cts +0 -26
- package/dist/errors.d.cts +0 -350
- package/dist/generated/abi/ComputeEngineImplementation.d.cts +0 -996
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.cts +0 -545
- package/dist/generated/abi/DATFactoryImplementation.d.cts +0 -661
- package/dist/generated/abi/DATImplementation.d.cts +0 -693
- package/dist/generated/abi/DATPausableImplementation.d.cts +0 -1145
- package/dist/generated/abi/DATVotesImplementation.d.cts +0 -1095
- package/dist/generated/abi/DLPPerformanceImplementation.d.cts +0 -883
- package/dist/generated/abi/DLPRegistryImplementation.d.cts +0 -1123
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.cts +0 -452
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.cts +0 -714
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.cts +0 -452
- package/dist/generated/abi/DLPRewardSwapImplementation.d.cts +0 -706
- package/dist/generated/abi/DLPRootImplementation.d.cts +0 -1248
- package/dist/generated/abi/DLPTreasuryImplementation.d.cts +0 -452
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.cts +0 -737
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.cts +0 -661
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.cts +0 -989
- package/dist/generated/abi/DataPortabilityServersImplementation.d.cts +0 -1086
- package/dist/generated/abi/DataRefinerRegistryImplementation.d.cts +0 -737
- package/dist/generated/abi/DataRegistryImplementation.d.cts +0 -1004
- package/dist/generated/abi/QueryEngineImplementation.d.cts +0 -1001
- package/dist/generated/abi/SwapHelperImplementation.d.cts +0 -764
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolImplementation.d.cts +0 -993
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.cts +0 -701
- package/dist/generated/abi/TeePoolPhalaImplementation.d.cts +0 -993
- package/dist/generated/abi/VanaEpochImplementation.d.cts +0 -900
- package/dist/generated/abi/VanaPoolEntityImplementation.d.cts +0 -934
- package/dist/generated/abi/VanaPoolStakingImplementation.d.cts +0 -693
- package/dist/generated/abi/VanaPoolTreasuryImplementation.d.cts +0 -394
- package/dist/generated/abi/index.d.cts +0 -26516
- package/dist/generated/server/server-exports.d.cts +0 -21
- package/dist/generated/server/server.d.cts +0 -512
- package/dist/generated/subgraph.d.cts +0 -5981
- package/dist/index.browser.cjs +0 -151
- package/dist/index.browser.cjs.map +0 -1
- package/dist/index.browser.d.cts +0 -177
- package/dist/index.d.cts +0 -2
- package/dist/index.node.d.cts +0 -64
- package/dist/node.d.cts +0 -2
- package/dist/permissions-DNKPu_G0.d.cts +0 -1666
- package/dist/permissions-eo8YeLGf.d.ts +0 -1666
- package/dist/platform/browser-only.d.cts +0 -25
- package/dist/platform/browser-safe.d.cts +0 -32
- package/dist/platform/browser.d.cts +0 -74
- package/dist/platform/index.d.cts +0 -5
- package/dist/platform/interface.d.cts +0 -218
- package/dist/platform/node.d.cts +0 -27
- package/dist/platform/shared/error-utils.d.cts +0 -25
- package/dist/platform/shared/pgp-utils.d.cts +0 -61
- package/dist/platform/shared/stream-utils.d.cts +0 -16
- package/dist/platform/utils.d.cts +0 -53
- package/dist/platform.browser.cjs +0 -41
- package/dist/platform.browser.cjs.map +0 -1
- package/dist/platform.browser.d.cts +0 -4
- package/dist/platform.d.cts +0 -5
- package/dist/platform.node.d.cts +0 -5
- package/dist/server/handler.cjs +0 -101
- package/dist/server/handler.cjs.map +0 -1
- package/dist/server/handler.d.cts +0 -282
- package/dist/server/handler.d.ts +0 -282
- package/dist/server/handler.js +0 -77
- package/dist/server/handler.js.map +0 -1
- package/dist/storage/index.d.cts +0 -10
- package/dist/storage/manager.d.cts +0 -150
- package/dist/storage/providers/callback-storage.d.cts +0 -100
- package/dist/storage/providers/google-drive.d.cts +0 -156
- package/dist/storage/providers/ipfs.d.cts +0 -163
- package/dist/storage/providers/pinata.d.cts +0 -173
- package/dist/types/chains.d.cts +0 -34
- package/dist/types/config.d.cts +0 -726
- package/dist/types/contracts.d.cts +0 -68
- package/dist/types/data.d.cts +0 -694
- package/dist/types/eccrypto-js.d.d.cts +0 -13
- package/dist/types/eccrypto-js.d.d.ts +0 -13
- package/dist/types/external-apis.d.cts +0 -186
- package/dist/types/generics.d.cts +0 -450
- package/dist/types/index.d.cts +0 -34
- package/dist/types/operations.d.cts +0 -108
- package/dist/types/permissions.d.cts +0 -957
- package/dist/types/personal.d.cts +0 -40
- package/dist/types/relayer.d.cts +0 -284
- package/dist/types/storage.d.cts +0 -131
- package/dist/types/transactionResults.d.cts +0 -25
- package/dist/types/utils.d.cts +0 -819
- package/dist/types.d.cts +0 -66
- package/dist/utils/blockchain/registry.d.cts +0 -34
- package/dist/utils/crypto-utils.d.cts +0 -118
- package/dist/utils/download.d.cts +0 -41
- package/dist/utils/encoding.d.cts +0 -54
- package/dist/utils/encryption.d.cts +0 -275
- package/dist/utils/eventParsing.cjs +0 -111
- package/dist/utils/eventParsing.cjs.map +0 -1
- package/dist/utils/eventParsing.d.cts +0 -60
- package/dist/utils/eventParsing.d.ts +0 -60
- package/dist/utils/eventParsing.js +0 -86
- package/dist/utils/eventParsing.js.map +0 -1
- package/dist/utils/formatters.d.cts +0 -120
- package/dist/utils/grantFiles.d.cts +0 -186
- package/dist/utils/grantValidation.d.cts +0 -150
- package/dist/utils/grants.d.cts +0 -70
- package/dist/utils/ipfs.d.cts +0 -90
- package/dist/utils/lazy-import.d.cts +0 -20
- package/dist/utils/multicall.d.cts +0 -129
- package/dist/utils/schemaValidation.d.cts +0 -172
- package/dist/utils/signatureCache.d.cts +0 -134
- package/dist/utils/signatureFormatter.d.cts +0 -39
- package/dist/utils/transactionParsing.cjs +0 -84
- package/dist/utils/transactionParsing.cjs.map +0 -1
- package/dist/utils/transactionParsing.d.cts +0 -25
- package/dist/utils/transactionParsing.d.ts +0 -25
- package/dist/utils/transactionParsing.js +0 -62
- package/dist/utils/transactionParsing.js.map +0 -1
- package/dist/utils/typedDataConverter.d.cts +0 -13
- package/dist/utils/urlResolver.d.cts +0 -40
package/dist/core/generics.cjs
CHANGED
|
@@ -34,12 +34,26 @@ class BaseController {
|
|
|
34
34
|
this.context = context;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Executes a request with optional middleware pipeline.
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* Processes request through middleware chain, executes handler, and applies
|
|
41
|
+
* response middleware in reverse order. Handles errors through error middleware
|
|
42
|
+
* before failing the request.
|
|
38
43
|
*
|
|
39
44
|
* @param request - The generic request object containing parameters and metadata
|
|
40
45
|
* @param handler - The function that processes the request parameters
|
|
41
46
|
* @param middleware - Optional array of middleware functions to apply
|
|
42
47
|
* @returns Promise resolving to a generic response object
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const response = await this.executeRequest(
|
|
52
|
+
* { params: { id: 123 }, options: {} },
|
|
53
|
+
* async (params) => await fetchData(params.id),
|
|
54
|
+
* [loggingMiddleware, cachingMiddleware]
|
|
55
|
+
* );
|
|
56
|
+
* ```
|
|
43
57
|
*/
|
|
44
58
|
async executeRequest(request, handler, middleware = []) {
|
|
45
59
|
try {
|
|
@@ -74,6 +88,9 @@ class BaseController {
|
|
|
74
88
|
}
|
|
75
89
|
}
|
|
76
90
|
return {
|
|
91
|
+
// TODO(TYPES): undefined coerced to TResponse for error case.
|
|
92
|
+
// Future improvement: Use discriminated union with success: false
|
|
93
|
+
// to properly type data as undefined when error occurs.
|
|
77
94
|
data: void 0,
|
|
78
95
|
success: false,
|
|
79
96
|
error: {
|
|
@@ -85,11 +102,24 @@ class BaseController {
|
|
|
85
102
|
}
|
|
86
103
|
}
|
|
87
104
|
/**
|
|
88
|
-
*
|
|
105
|
+
* Validates parameters with optional custom validator.
|
|
106
|
+
*
|
|
107
|
+
* @remarks
|
|
108
|
+
* Type guard that validates and asserts parameter types at runtime.
|
|
109
|
+
* Use for input validation in public API methods.
|
|
89
110
|
*
|
|
90
111
|
* @param params - The parameters to validate
|
|
91
112
|
* @param validator - Optional function to validate parameter types
|
|
92
|
-
* @throws Error
|
|
113
|
+
* @throws {Error} When validation fails.
|
|
114
|
+
* Provide valid parameters matching expected type.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* this.validateParams<MyParams>(params, (p): p is MyParams => {
|
|
119
|
+
* return typeof p === 'object' && 'id' in p;
|
|
120
|
+
* });
|
|
121
|
+
* // TypeScript now knows params is MyParams
|
|
122
|
+
* ```
|
|
93
123
|
*/
|
|
94
124
|
validateParams(params, validator) {
|
|
95
125
|
if (validator && !validator(params)) {
|
|
@@ -114,9 +144,9 @@ class RetryUtility {
|
|
|
114
144
|
if (attempt === config.maxAttempts) {
|
|
115
145
|
break;
|
|
116
146
|
}
|
|
117
|
-
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier
|
|
118
|
-
const maxDelay = config.maxDelay
|
|
119
|
-
const jitter = config.jitter
|
|
147
|
+
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier ?? 2, attempt - 1);
|
|
148
|
+
const maxDelay = config.maxDelay ?? 3e4;
|
|
149
|
+
const jitter = config.jitter ?? 0;
|
|
120
150
|
let delay = Math.min(baseDelay, maxDelay);
|
|
121
151
|
if (jitter > 0) {
|
|
122
152
|
delay += Math.random() * jitter * delay;
|
|
@@ -124,7 +154,7 @@ class RetryUtility {
|
|
|
124
154
|
await this.delay(delay);
|
|
125
155
|
}
|
|
126
156
|
}
|
|
127
|
-
throw lastError
|
|
157
|
+
throw lastError ?? new Error("Operation failed after retries");
|
|
128
158
|
}
|
|
129
159
|
}
|
|
130
160
|
class RateLimiter {
|
|
@@ -200,7 +230,9 @@ class EventEmitter {
|
|
|
200
230
|
observers = [];
|
|
201
231
|
subscribe(observer) {
|
|
202
232
|
this.observers.push(observer);
|
|
203
|
-
return () =>
|
|
233
|
+
return () => {
|
|
234
|
+
this.unsubscribe(observer);
|
|
235
|
+
};
|
|
204
236
|
}
|
|
205
237
|
unsubscribe(observer) {
|
|
206
238
|
const index = this.observers.indexOf(observer);
|
|
@@ -230,9 +262,7 @@ class EventEmitter {
|
|
|
230
262
|
}
|
|
231
263
|
}
|
|
232
264
|
class MiddlewarePipeline {
|
|
233
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
234
265
|
middleware = [];
|
|
235
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
236
266
|
use(middleware) {
|
|
237
267
|
this.middleware.push(middleware);
|
|
238
268
|
}
|
|
@@ -264,7 +294,6 @@ class MiddlewarePipeline {
|
|
|
264
294
|
}
|
|
265
295
|
}
|
|
266
296
|
}
|
|
267
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
297
|
getMiddleware() {
|
|
269
298
|
return [...this.middleware];
|
|
270
299
|
}
|
|
@@ -349,7 +378,7 @@ class CircuitBreaker {
|
|
|
349
378
|
this.failures = 0;
|
|
350
379
|
if (this.state === "half-open") {
|
|
351
380
|
this.successes++;
|
|
352
|
-
if (this.successes >= (this.config.halfOpenMaxAttempts
|
|
381
|
+
if (this.successes >= (this.config.halfOpenMaxAttempts ?? 1)) {
|
|
353
382
|
this.state = "closed";
|
|
354
383
|
}
|
|
355
384
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/generics.ts"],"sourcesContent":["import type {\n Controller,\n ControllerContext,\n GenericRequest,\n GenericResponse,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n Cache,\n Observer,\n Observable,\n} from \"../types/generics\";\n\n/**\n * Base controller class with common functionality\n */\nexport abstract class BaseController<\n TContext extends ControllerContext = ControllerContext,\n> implements Controller<TContext>\n{\n public readonly context: TContext;\n\n constructor(context: TContext) {\n this.context = context;\n }\n\n /**\n * Execute a request with optional middleware pipeline\n *\n * @param request - The generic request object containing parameters and metadata\n * @param handler - The function that processes the request parameters\n * @param middleware - Optional array of middleware functions to apply\n * @returns Promise resolving to a generic response object\n */\n protected async executeRequest<TParams, TResponse>(\n request: GenericRequest<TParams>,\n handler: (params: TParams) => Promise<TResponse>,\n middleware: Middleware[] = [],\n ): Promise<GenericResponse<TResponse>> {\n try {\n // Apply request middleware\n let processedRequest = request;\n for (const mw of middleware) {\n if (mw.request) {\n processedRequest = (await mw.request(\n processedRequest,\n )) as GenericRequest<TParams>;\n }\n }\n\n // Execute handler\n let response = await handler(processedRequest.params);\n\n // Apply response middleware\n for (const mw of middleware.reverse()) {\n if (mw.response) {\n response = (await mw.response(response)) as Awaited<TResponse>;\n }\n }\n\n return {\n data: response,\n success: true,\n };\n } catch (error) {\n // Handle errors with middleware\n for (const mw of middleware) {\n if (mw.error) {\n const handled = await mw.error(error as Error, request);\n if (handled) {\n return {\n data: handled as TResponse,\n success: true,\n };\n }\n }\n }\n\n return {\n data: undefined as unknown as TResponse,\n success: false,\n error: {\n code: \"EXECUTION_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n },\n };\n }\n }\n\n /**\n * Validate parameters with optional custom validator\n *\n * @param params - The parameters to validate\n * @param validator - Optional function to validate parameter types\n * @throws Error if validation fails, asserts type if successful\n */\n protected validateParams<T>(\n params: unknown,\n validator?: (params: unknown) => params is T,\n ): asserts params is T {\n if (validator && !validator(params)) {\n throw new Error(\"Invalid parameters\");\n }\n }\n}\n\n/**\n * Generic retry utility with exponential backoff\n */\nexport class RetryUtility {\n private static async delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n static async withRetry<T>(\n operation: () => Promise<T>,\n config: RetryConfig,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n if (config.shouldRetry && !config.shouldRetry(lastError, attempt)) {\n throw lastError;\n }\n\n // Don't delay on the last attempt\n if (attempt === config.maxAttempts) {\n break;\n }\n\n // Calculate delay with exponential backoff and jitter\n const baseDelay =\n config.baseDelay *\n Math.pow(config.backoffMultiplier || 2, attempt - 1);\n const maxDelay = config.maxDelay || 30000;\n const jitter = config.jitter || 0;\n\n let delay = Math.min(baseDelay, maxDelay);\n\n if (jitter > 0) {\n delay += Math.random() * jitter * delay;\n }\n\n await this.delay(delay);\n }\n }\n\n throw lastError || new Error(\"Operation failed after retries\");\n }\n}\n\n/**\n * Generic rate limiter\n */\nexport class RateLimiter {\n private requests: number[] = [];\n\n constructor(private config: RateLimiterConfig) {}\n\n async checkLimit(): Promise<boolean> {\n const now = Date.now();\n const windowStart = now - this.config.windowMs;\n\n // Remove requests outside the window\n this.requests = this.requests.filter((time) => time > windowStart);\n\n // Check if we can make a request\n if (this.requests.length < this.config.requestsPerWindow) {\n this.requests.push(now);\n return true;\n }\n\n return false;\n }\n\n async waitForSlot(): Promise<void> {\n while (!(await this.checkLimit())) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n getRemainingRequests(): number {\n const now = Date.now();\n const windowStart = now - this.config.windowMs;\n const activeRequests = this.requests.filter((time) => time > windowStart);\n return Math.max(0, this.config.requestsPerWindow - activeRequests.length);\n }\n\n getResetTime(): number {\n if (this.requests.length === 0) return 0;\n return Math.max(0, this.requests[0] + this.config.windowMs - Date.now());\n }\n}\n\n/**\n * Generic in-memory cache implementation\n */\nexport class MemoryCache<TKey = string, TValue = unknown>\n implements Cache<TKey, TValue>\n{\n private cache = new Map<TKey, { value: TValue; expiry?: number }>();\n\n async get(key: TKey): Promise<TValue | undefined> {\n const item = this.cache.get(key);\n\n if (!item) return undefined;\n\n // Check if expired\n if (item.expiry && Date.now() > item.expiry) {\n this.cache.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n async set(key: TKey, value: TValue, ttl?: number): Promise<void> {\n const expiry = ttl ? Date.now() + ttl : undefined;\n this.cache.set(key, { value, expiry });\n }\n\n async delete(key: TKey): Promise<boolean> {\n return this.cache.delete(key);\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n }\n\n async has(key: TKey): Promise<boolean> {\n const exists = this.cache.has(key);\n if (!exists) return false;\n\n // Check expiry\n const item = this.cache.get(key);\n if (item?.expiry && Date.now() > item.expiry) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n size(): number {\n return this.cache.size;\n }\n\n keys(): TKey[] {\n return Array.from(this.cache.keys());\n }\n}\n\n/**\n * Generic event emitter implementation\n */\nexport class EventEmitter<TEvent = unknown> implements Observable<TEvent> {\n private observers: Observer<TEvent>[] = [];\n\n subscribe(observer: Observer<TEvent>): () => void {\n this.observers.push(observer);\n\n return () => this.unsubscribe(observer);\n }\n\n unsubscribe(observer: Observer<TEvent>): void {\n const index = this.observers.indexOf(observer);\n if (index > -1) {\n this.observers.splice(index, 1);\n }\n }\n\n emit(event: TEvent): void {\n for (const observer of this.observers) {\n try {\n const result = observer.notify(event);\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(\"Observer error:\", error);\n });\n }\n } catch (error) {\n console.error(\"Observer error:\", error);\n }\n }\n }\n\n getObserverCount(): number {\n return this.observers.length;\n }\n\n removeAllObservers(): void {\n this.observers = [];\n }\n}\n\n/**\n * Generic middleware pipeline\n */\nexport class MiddlewarePipeline {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private middleware: Middleware<any, any>[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n use(middleware: Middleware<any, any>): void {\n this.middleware.push(middleware);\n }\n\n async processRequest<TRequest>(request: TRequest): Promise<TRequest> {\n let processed = request;\n\n for (const mw of this.middleware) {\n if (mw.request) {\n processed = await mw.request(processed);\n }\n }\n\n return processed;\n }\n\n async processResponse<TResponse>(response: TResponse): Promise<TResponse> {\n let processed = response;\n\n // Process in reverse order\n for (const mw of this.middleware.slice().reverse()) {\n if (mw.response) {\n processed = await mw.response(processed);\n }\n }\n\n return processed;\n }\n\n async handleError<TRequest, TResponse>(\n error: Error,\n request: TRequest,\n ): Promise<TResponse | void> {\n for (const mw of this.middleware) {\n if (mw.error) {\n const result = await mw.error(error, request);\n if (result) {\n return result;\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getMiddleware(): Middleware<any, any>[] {\n return [...this.middleware];\n }\n\n clear(): void {\n this.middleware = [];\n }\n}\n\n/**\n * Generic async queue for managing concurrent operations\n */\nexport class AsyncQueue<T = unknown> {\n private queue: Array<() => Promise<T>> = [];\n private running = 0;\n\n constructor(private concurrency = 1) {}\n\n async add<R>(operation: () => Promise<R>): Promise<R> {\n return new Promise((resolve, reject) => {\n this.queue.push(async () => {\n try {\n const result = await operation();\n resolve(result as unknown as R);\n return result as unknown as T;\n } catch (error) {\n reject(error);\n throw error;\n } finally {\n this.running--;\n this.processQueue();\n }\n });\n\n this.processQueue();\n });\n }\n\n private processQueue(): void {\n while (this.running < this.concurrency && this.queue.length > 0) {\n const operation = this.queue.shift();\n if (operation) {\n this.running++;\n operation().catch(() => {\n // Error already handled in add method\n });\n }\n }\n }\n\n get pending(): number {\n return this.queue.length;\n }\n\n get active(): number {\n return this.running;\n }\n\n get size(): number {\n return this.queue.length + this.running;\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * Generic circuit breaker pattern\n */\nexport class CircuitBreaker {\n private state: \"closed\" | \"open\" | \"half-open\" = \"closed\";\n private failures = 0;\n private lastFailureTime = 0;\n private successes = 0;\n\n constructor(\n private config: {\n failureThreshold: number;\n recoveryTimeout: number;\n halfOpenMaxAttempts?: number;\n },\n ) {}\n\n async execute<TResult>(operation: () => Promise<TResult>): Promise<TResult> {\n if (this.state === \"open\") {\n if (Date.now() - this.lastFailureTime > this.config.recoveryTimeout) {\n this.state = \"half-open\";\n this.successes = 0;\n } else {\n throw new Error(\"Circuit breaker is open\");\n }\n }\n\n try {\n const result = await operation();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.failures = 0;\n\n if (this.state === \"half-open\") {\n this.successes++;\n if (this.successes >= (this.config.halfOpenMaxAttempts || 1)) {\n this.state = \"closed\";\n }\n }\n }\n\n private onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.failures >= this.config.failureThreshold) {\n this.state = \"open\";\n }\n }\n\n getState(): string {\n return this.state;\n }\n\n getFailures(): number {\n return this.failures;\n }\n\n reset(): void {\n this.state = \"closed\";\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = 0;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,MAAe,eAGtB;AAAA,EACkB;AAAA,EAEhB,YAAY,SAAmB;AAC7B,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAgB,eACd,SACA,SACA,aAA2B,CAAC,GACS;AACrC,QAAI;AAEF,UAAI,mBAAmB;AACvB,iBAAW,MAAM,YAAY;AAC3B,YAAI,GAAG,SAAS;AACd,6BAAoB,MAAM,GAAG;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,WAAW,MAAM,QAAQ,iBAAiB,MAAM;AAGpD,iBAAW,MAAM,WAAW,QAAQ,GAAG;AACrC,YAAI,GAAG,UAAU;AACf,qBAAY,MAAM,GAAG,SAAS,QAAQ;AAAA,QACxC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,SAAS,OAAO;AAEd,iBAAW,MAAM,YAAY;AAC3B,YAAI,GAAG,OAAO;AACZ,gBAAM,UAAU,MAAM,GAAG,MAAM,OAAgB,OAAO;AACtD,cAAI,SAAS;AACX,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAClD,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,eACR,QACA,WACqB;AACrB,QAAI,aAAa,CAAC,UAAU,MAAM,GAAG;AACnC,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAAA,EACF;AACF;AAKO,MAAM,aAAa;AAAA,EACxB,aAAqB,MAAM,IAA2B;AACpD,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AAAA,EAEA,aAAa,UACX,WACA,QACY;AACZ,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,OAAO,aAAa,WAAW;AAC9D,UAAI;AACF,eAAO,MAAM,UAAU;AAAA,MACzB,SAAS,OAAO;AACd,oBAAY;AAGZ,YAAI,OAAO,eAAe,CAAC,OAAO,YAAY,WAAW,OAAO,GAAG;AACjE,gBAAM;AAAA,QACR;AAGA,YAAI,YAAY,OAAO,aAAa;AAClC;AAAA,QACF;AAGA,cAAM,YACJ,OAAO,YACP,KAAK,IAAI,OAAO,qBAAqB,GAAG,UAAU,CAAC;AACrD,cAAM,WAAW,OAAO,YAAY;AACpC,cAAM,SAAS,OAAO,UAAU;AAEhC,YAAI,QAAQ,KAAK,IAAI,WAAW,QAAQ;AAExC,YAAI,SAAS,GAAG;AACd,mBAAS,KAAK,OAAO,IAAI,SAAS;AAAA,QACpC;AAEA,cAAM,KAAK,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,MAAM,gCAAgC;AAAA,EAC/D;AACF;AAKO,MAAM,YAAY;AAAA,EAGvB,YAAoB,QAA2B;AAA3B;AAAA,EAA4B;AAAA,EAFxC,WAAqB,CAAC;AAAA,EAI9B,MAAM,aAA+B;AACnC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,cAAc,MAAM,KAAK,OAAO;AAGtC,SAAK,WAAW,KAAK,SAAS,OAAO,CAAC,SAAS,OAAO,WAAW;AAGjE,QAAI,KAAK,SAAS,SAAS,KAAK,OAAO,mBAAmB;AACxD,WAAK,SAAS,KAAK,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAA6B;AACjC,WAAO,CAAE,MAAM,KAAK,WAAW,GAAI;AACjC,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,uBAA+B;AAC7B,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,cAAc,MAAM,KAAK,OAAO;AACtC,UAAM,iBAAiB,KAAK,SAAS,OAAO,CAAC,SAAS,OAAO,WAAW;AACxE,WAAO,KAAK,IAAI,GAAG,KAAK,OAAO,oBAAoB,eAAe,MAAM;AAAA,EAC1E;AAAA,EAEA,eAAuB;AACrB,QAAI,KAAK,SAAS,WAAW,EAAG,QAAO;AACvC,WAAO,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAAI,KAAK,OAAO,WAAW,KAAK,IAAI,CAAC;AAAA,EACzE;AACF;AAKO,MAAM,YAEb;AAAA,EACU,QAAQ,oBAAI,IAA8C;AAAA,EAElE,MAAM,IAAI,KAAwC;AAChD,UAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAE/B,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,KAAK,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;AAC3C,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,IAAI,KAAW,OAAe,KAA6B;AAC/D,UAAM,SAAS,MAAM,KAAK,IAAI,IAAI,MAAM;AACxC,SAAK,MAAM,IAAI,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,KAA6B;AACxC,WAAO,KAAK,MAAM,OAAO,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,IAAI,KAA6B;AACrC,UAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AACjC,QAAI,CAAC,OAAQ,QAAO;AAGpB,UAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,QAAI,MAAM,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;AAC5C,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,OAAe;AACb,WAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,EACrC;AACF;AAKO,MAAM,aAA6D;AAAA,EAChE,YAAgC,CAAC;AAAA,EAEzC,UAAU,UAAwC;AAChD,SAAK,UAAU,KAAK,QAAQ;AAE5B,WAAO,MAAM,KAAK,YAAY,QAAQ;AAAA,EACxC;AAAA,EAEA,YAAY,UAAkC;AAC5C,UAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ;AAC7C,QAAI,QAAQ,IAAI;AACd,WAAK,UAAU,OAAO,OAAO,CAAC;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,KAAK,OAAqB;AACxB,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,cAAM,SAAS,SAAS,OAAO,KAAK;AACpC,YAAI,kBAAkB,SAAS;AAC7B,iBAAO,MAAM,CAAC,UAAU;AACtB,oBAAQ,MAAM,mBAAmB,KAAK;AAAA,UACxC,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mBAAmB,KAAK;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAA2B;AACzB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,qBAA2B;AACzB,SAAK,YAAY,CAAC;AAAA,EACpB;AACF;AAKO,MAAM,mBAAmB;AAAA;AAAA,EAEtB,aAAqC,CAAC;AAAA;AAAA,EAG9C,IAAI,YAAwC;AAC1C,SAAK,WAAW,KAAK,UAAU;AAAA,EACjC;AAAA,EAEA,MAAM,eAAyB,SAAsC;AACnE,QAAI,YAAY;AAEhB,eAAW,MAAM,KAAK,YAAY;AAChC,UAAI,GAAG,SAAS;AACd,oBAAY,MAAM,GAAG,QAAQ,SAAS;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAA2B,UAAyC;AACxE,QAAI,YAAY;AAGhB,eAAW,MAAM,KAAK,WAAW,MAAM,EAAE,QAAQ,GAAG;AAClD,UAAI,GAAG,UAAU;AACf,oBAAY,MAAM,GAAG,SAAS,SAAS;AAAA,MACzC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YACJ,OACA,SAC2B;AAC3B,eAAW,MAAM,KAAK,YAAY;AAChC,UAAI,GAAG,OAAO;AACZ,cAAM,SAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AAC5C,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,gBAAwC;AACtC,WAAO,CAAC,GAAG,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEA,QAAc;AACZ,SAAK,aAAa,CAAC;AAAA,EACrB;AACF;AAKO,MAAM,WAAwB;AAAA,EAInC,YAAoB,cAAc,GAAG;AAAjB;AAAA,EAAkB;AAAA,EAH9B,QAAiC,CAAC;AAAA,EAClC,UAAU;AAAA,EAIlB,MAAM,IAAO,WAAyC;AACpD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,MAAM,KAAK,YAAY;AAC1B,YAAI;AACF,gBAAM,SAAS,MAAM,UAAU;AAC/B,kBAAQ,MAAsB;AAC9B,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,iBAAO,KAAK;AACZ,gBAAM;AAAA,QACR,UAAE;AACA,eAAK;AACL,eAAK,aAAa;AAAA,QACpB;AAAA,MACF,CAAC;AAED,WAAK,aAAa;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,eAAqB;AAC3B,WAAO,KAAK,UAAU,KAAK,eAAe,KAAK,MAAM,SAAS,GAAG;AAC/D,YAAM,YAAY,KAAK,MAAM,MAAM;AACnC,UAAI,WAAW;AACb,aAAK;AACL,kBAAU,EAAE,MAAM,MAAM;AAAA,QAExB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM,SAAS,KAAK;AAAA,EAClC;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,CAAC;AAAA,EAChB;AACF;AAKO,MAAM,eAAe;AAAA,EAM1B,YACU,QAKR;AALQ;AAAA,EAKP;AAAA,EAXK,QAAyC;AAAA,EACzC,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,YAAY;AAAA,EAUpB,MAAM,QAAiB,WAAqD;AAC1E,QAAI,KAAK,UAAU,QAAQ;AACzB,UAAI,KAAK,IAAI,IAAI,KAAK,kBAAkB,KAAK,OAAO,iBAAiB;AACnE,aAAK,QAAQ;AACb,aAAK,YAAY;AAAA,MACnB,OAAO;AACL,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,UAAU;AAC/B,WAAK,UAAU;AACf,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,UAAU;AACf,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,SAAK,WAAW;AAEhB,QAAI,KAAK,UAAU,aAAa;AAC9B,WAAK;AACL,UAAI,KAAK,cAAc,KAAK,OAAO,uBAAuB,IAAI;AAC5D,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,SAAK;AACL,SAAK,kBAAkB,KAAK,IAAI;AAEhC,QAAI,KAAK,YAAY,KAAK,OAAO,kBAAkB;AACjD,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,kBAAkB;AAAA,EACzB;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/generics.ts"],"sourcesContent":["/**\n * Provides generic utilities for resilient SDK operations.\n *\n * @remarks\n * This module contains reusable patterns for building robust SDK features including\n * retry logic, rate limiting, circuit breakers, caching, and middleware pipelines.\n * These utilities follow enterprise patterns for fault tolerance and scalability.\n *\n * @category Infrastructure\n * @module generics\n */\n\nimport type {\n Controller,\n ControllerContext,\n GenericRequest,\n GenericResponse,\n RetryConfig,\n RateLimiterConfig,\n Middleware,\n Cache,\n Observer,\n Observable,\n} from \"../types/generics\";\n\n/**\n * Provides base controller functionality with middleware support.\n *\n * @remarks\n * Abstract base class for SDK controllers that provides request execution\n * with middleware pipeline, parameter validation, and error handling.\n * All SDK controllers extend this base for consistent behavior.\n *\n * @category Infrastructure\n */\nexport abstract class BaseController<\n TContext extends ControllerContext = ControllerContext,\n> implements Controller<TContext>\n{\n public readonly context: TContext;\n\n constructor(context: TContext) {\n this.context = context;\n }\n\n /**\n * Executes a request with optional middleware pipeline.\n *\n * @remarks\n * Processes request through middleware chain, executes handler, and applies\n * response middleware in reverse order. Handles errors through error middleware\n * before failing the request.\n *\n * @param request - The generic request object containing parameters and metadata\n * @param handler - The function that processes the request parameters\n * @param middleware - Optional array of middleware functions to apply\n * @returns Promise resolving to a generic response object\n *\n * @example\n * ```typescript\n * const response = await this.executeRequest(\n * { params: { id: 123 }, options: {} },\n * async (params) => await fetchData(params.id),\n * [loggingMiddleware, cachingMiddleware]\n * );\n * ```\n */\n protected async executeRequest<TParams, TResponse>(\n request: GenericRequest<TParams>,\n handler: (params: TParams) => Promise<TResponse>,\n middleware: Middleware[] = [],\n ): Promise<GenericResponse<TResponse>> {\n try {\n // Apply request middleware\n let processedRequest = request;\n for (const mw of middleware) {\n if (mw.request) {\n processedRequest = (await mw.request(\n processedRequest,\n )) as GenericRequest<TParams>;\n }\n }\n\n // Execute handler\n let response = await handler(processedRequest.params);\n\n // Apply response middleware\n for (const mw of middleware.reverse()) {\n if (mw.response) {\n response = (await mw.response(response)) as Awaited<TResponse>;\n }\n }\n\n return {\n data: response,\n success: true,\n };\n } catch (error) {\n // Handle errors with middleware\n for (const mw of middleware) {\n if (mw.error) {\n const handled = await mw.error(error as Error, request);\n if (handled) {\n return {\n data: handled as TResponse,\n success: true,\n };\n }\n }\n }\n\n return {\n // TODO(TYPES): undefined coerced to TResponse for error case.\n // Future improvement: Use discriminated union with success: false\n // to properly type data as undefined when error occurs.\n data: undefined as unknown as TResponse,\n success: false,\n error: {\n code: \"EXECUTION_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n },\n };\n }\n }\n\n /**\n * Validates parameters with optional custom validator.\n *\n * @remarks\n * Type guard that validates and asserts parameter types at runtime.\n * Use for input validation in public API methods.\n *\n * @param params - The parameters to validate\n * @param validator - Optional function to validate parameter types\n * @throws {Error} When validation fails.\n * Provide valid parameters matching expected type.\n *\n * @example\n * ```typescript\n * this.validateParams<MyParams>(params, (p): p is MyParams => {\n * return typeof p === 'object' && 'id' in p;\n * });\n * // TypeScript now knows params is MyParams\n * ```\n */\n protected validateParams<T>(\n params: unknown,\n validator?: (params: unknown) => params is T,\n ): asserts params is T {\n if (validator && !validator(params)) {\n throw new Error(\"Invalid parameters\");\n }\n }\n}\n\n/**\n * Implements retry logic with exponential backoff and jitter.\n *\n * @remarks\n * Provides configurable retry behavior for transient failures with\n * exponential backoff, maximum delay caps, and optional jitter to\n * prevent thundering herd problems.\n *\n * @example\n * ```typescript\n * const result = await RetryUtility.withRetry(\n * async () => await unreliableOperation(),\n * {\n * maxAttempts: 5,\n * baseDelay: 1000,\n * backoffMultiplier: 2,\n * maxDelay: 30000,\n * shouldRetry: (error) => error.code === 'NETWORK_ERROR'\n * }\n * );\n * ```\n *\n * @category Infrastructure\n */\nexport class RetryUtility {\n private static async delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n static async withRetry<T>(\n operation: () => Promise<T>,\n config: RetryConfig,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n if (config.shouldRetry && !config.shouldRetry(lastError, attempt)) {\n throw lastError;\n }\n\n // Don't delay on the last attempt\n if (attempt === config.maxAttempts) {\n break;\n }\n\n // Calculate delay with exponential backoff and jitter\n const baseDelay =\n config.baseDelay *\n Math.pow(config.backoffMultiplier ?? 2, attempt - 1);\n const maxDelay = config.maxDelay ?? 30000;\n const jitter = config.jitter ?? 0;\n\n let delay = Math.min(baseDelay, maxDelay);\n\n if (jitter > 0) {\n delay += Math.random() * jitter * delay;\n }\n\n await this.delay(delay);\n }\n }\n\n throw lastError ?? new Error(\"Operation failed after retries\");\n }\n}\n\n/**\n * Implements token bucket rate limiting for API calls.\n *\n * @remarks\n * Prevents API throttling by limiting requests per time window.\n * Uses sliding window algorithm for smooth rate limiting without\n * burst spikes at window boundaries.\n *\n * @example\n * ```typescript\n * const limiter = new RateLimiter({\n * requestsPerWindow: 100,\n * windowMs: 60000 // 100 requests per minute\n * });\n *\n * // Check before making request\n * if (await limiter.checkLimit()) {\n * await makeApiCall();\n * } else {\n * await limiter.waitForSlot();\n * await makeApiCall();\n * }\n * ```\n *\n * @category Infrastructure\n */\nexport class RateLimiter {\n private requests: number[] = [];\n\n constructor(private config: RateLimiterConfig) {}\n\n async checkLimit(): Promise<boolean> {\n const now = Date.now();\n const windowStart = now - this.config.windowMs;\n\n // Remove requests outside the window\n this.requests = this.requests.filter((time) => time > windowStart);\n\n // Check if we can make a request\n if (this.requests.length < this.config.requestsPerWindow) {\n this.requests.push(now);\n return true;\n }\n\n return false;\n }\n\n async waitForSlot(): Promise<void> {\n while (!(await this.checkLimit())) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n getRemainingRequests(): number {\n const now = Date.now();\n const windowStart = now - this.config.windowMs;\n const activeRequests = this.requests.filter((time) => time > windowStart);\n return Math.max(0, this.config.requestsPerWindow - activeRequests.length);\n }\n\n getResetTime(): number {\n if (this.requests.length === 0) return 0;\n return Math.max(0, this.requests[0] + this.config.windowMs - Date.now());\n }\n}\n\n/**\n * Generic in-memory cache implementation\n */\nexport class MemoryCache<TKey = string, TValue = unknown>\n implements Cache<TKey, TValue>\n{\n private cache = new Map<TKey, { value: TValue; expiry?: number }>();\n\n async get(key: TKey): Promise<TValue | undefined> {\n const item = this.cache.get(key);\n\n if (!item) return undefined;\n\n // Check if expired\n if (item.expiry && Date.now() > item.expiry) {\n this.cache.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n async set(key: TKey, value: TValue, ttl?: number): Promise<void> {\n const expiry = ttl ? Date.now() + ttl : undefined;\n this.cache.set(key, { value, expiry });\n }\n\n async delete(key: TKey): Promise<boolean> {\n return this.cache.delete(key);\n }\n\n async clear(): Promise<void> {\n this.cache.clear();\n }\n\n async has(key: TKey): Promise<boolean> {\n const exists = this.cache.has(key);\n if (!exists) return false;\n\n // Check expiry\n const item = this.cache.get(key);\n if (item?.expiry && Date.now() > item.expiry) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n size(): number {\n return this.cache.size;\n }\n\n keys(): TKey[] {\n return Array.from(this.cache.keys());\n }\n}\n\n/**\n * Generic event emitter implementation\n */\nexport class EventEmitter<TEvent = unknown> implements Observable<TEvent> {\n private observers: Observer<TEvent>[] = [];\n\n subscribe(observer: Observer<TEvent>): () => void {\n this.observers.push(observer);\n\n return () => {\n this.unsubscribe(observer);\n };\n }\n\n unsubscribe(observer: Observer<TEvent>): void {\n const index = this.observers.indexOf(observer);\n if (index > -1) {\n this.observers.splice(index, 1);\n }\n }\n\n emit(event: TEvent): void {\n for (const observer of this.observers) {\n try {\n const result = observer.notify(event);\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(\"Observer error:\", error);\n });\n }\n } catch (error) {\n console.error(\"Observer error:\", error);\n }\n }\n }\n\n getObserverCount(): number {\n return this.observers.length;\n }\n\n removeAllObservers(): void {\n this.observers = [];\n }\n}\n\n/**\n * Generic middleware pipeline\n */\nexport class MiddlewarePipeline {\n private middleware: Middleware<any, any>[] = [];\n\n use(middleware: Middleware<any, any>): void {\n this.middleware.push(middleware);\n }\n\n async processRequest<TRequest>(request: TRequest): Promise<TRequest> {\n let processed = request;\n\n for (const mw of this.middleware) {\n if (mw.request) {\n processed = await mw.request(processed);\n }\n }\n\n return processed;\n }\n\n async processResponse<TResponse>(response: TResponse): Promise<TResponse> {\n let processed = response;\n\n // Process in reverse order\n for (const mw of this.middleware.slice().reverse()) {\n if (mw.response) {\n processed = await mw.response(processed);\n }\n }\n\n return processed;\n }\n\n async handleError<TRequest, TResponse>(\n error: Error,\n request: TRequest,\n ): Promise<TResponse | void> {\n for (const mw of this.middleware) {\n if (mw.error) {\n const result = await mw.error(error, request);\n if (result) {\n return result;\n }\n }\n }\n }\n\n getMiddleware(): Middleware<any, any>[] {\n return [...this.middleware];\n }\n\n clear(): void {\n this.middleware = [];\n }\n}\n\n/**\n * Generic async queue for managing concurrent operations\n */\nexport class AsyncQueue<T = unknown> {\n private queue: Array<() => Promise<T>> = [];\n private running = 0;\n\n constructor(private concurrency = 1) {}\n\n async add<R>(operation: () => Promise<R>): Promise<R> {\n return new Promise((resolve, reject) => {\n this.queue.push(async () => {\n try {\n const result = await operation();\n resolve(result as unknown as R);\n return result as unknown as T;\n } catch (error) {\n reject(error);\n throw error;\n } finally {\n this.running--;\n this.processQueue();\n }\n });\n\n this.processQueue();\n });\n }\n\n private processQueue(): void {\n while (this.running < this.concurrency && this.queue.length > 0) {\n const operation = this.queue.shift();\n if (operation) {\n this.running++;\n operation().catch(() => {\n // Error already handled in add method\n });\n }\n }\n }\n\n get pending(): number {\n return this.queue.length;\n }\n\n get active(): number {\n return this.running;\n }\n\n get size(): number {\n return this.queue.length + this.running;\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\n/**\n * Generic circuit breaker pattern\n */\nexport class CircuitBreaker {\n private state: \"closed\" | \"open\" | \"half-open\" = \"closed\";\n private failures = 0;\n private lastFailureTime = 0;\n private successes = 0;\n\n constructor(\n private config: {\n failureThreshold: number;\n recoveryTimeout: number;\n halfOpenMaxAttempts?: number;\n },\n ) {}\n\n async execute<TResult>(operation: () => Promise<TResult>): Promise<TResult> {\n if (this.state === \"open\") {\n if (Date.now() - this.lastFailureTime > this.config.recoveryTimeout) {\n this.state = \"half-open\";\n this.successes = 0;\n } else {\n throw new Error(\"Circuit breaker is open\");\n }\n }\n\n try {\n const result = await operation();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.failures = 0;\n\n if (this.state === \"half-open\") {\n this.successes++;\n if (this.successes >= (this.config.halfOpenMaxAttempts ?? 1)) {\n this.state = \"closed\";\n }\n }\n }\n\n private onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.failures >= this.config.failureThreshold) {\n this.state = \"open\";\n }\n }\n\n getState(): string {\n return this.state;\n }\n\n getFailures(): number {\n return this.failures;\n }\n\n reset(): void {\n this.state = \"closed\";\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = 0;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/core/generics.d.ts
CHANGED
|
@@ -1,41 +1,128 @@
|
|
|
1
|
-
import { ControllerContext, Controller, GenericRequest, Middleware, GenericResponse, RetryConfig, RateLimiterConfig, Cache, Observable, Observer } from '../types/generics.js';
|
|
2
|
-
import 'viem';
|
|
3
|
-
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
2
|
+
* Provides generic utilities for resilient SDK operations.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* This module contains reusable patterns for building robust SDK features including
|
|
6
|
+
* retry logic, rate limiting, circuit breakers, caching, and middleware pipelines.
|
|
7
|
+
* These utilities follow enterprise patterns for fault tolerance and scalability.
|
|
8
|
+
*
|
|
9
|
+
* @category Infrastructure
|
|
10
|
+
* @module generics
|
|
6
11
|
*/
|
|
7
|
-
|
|
12
|
+
import type { Controller, ControllerContext, GenericRequest, GenericResponse, RetryConfig, RateLimiterConfig, Middleware, Cache, Observer, Observable } from "../types/generics";
|
|
13
|
+
/**
|
|
14
|
+
* Provides base controller functionality with middleware support.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* Abstract base class for SDK controllers that provides request execution
|
|
18
|
+
* with middleware pipeline, parameter validation, and error handling.
|
|
19
|
+
* All SDK controllers extend this base for consistent behavior.
|
|
20
|
+
*
|
|
21
|
+
* @category Infrastructure
|
|
22
|
+
*/
|
|
23
|
+
export declare abstract class BaseController<TContext extends ControllerContext = ControllerContext> implements Controller<TContext> {
|
|
8
24
|
readonly context: TContext;
|
|
9
25
|
constructor(context: TContext);
|
|
10
26
|
/**
|
|
11
|
-
*
|
|
27
|
+
* Executes a request with optional middleware pipeline.
|
|
28
|
+
*
|
|
29
|
+
* @remarks
|
|
30
|
+
* Processes request through middleware chain, executes handler, and applies
|
|
31
|
+
* response middleware in reverse order. Handles errors through error middleware
|
|
32
|
+
* before failing the request.
|
|
12
33
|
*
|
|
13
34
|
* @param request - The generic request object containing parameters and metadata
|
|
14
35
|
* @param handler - The function that processes the request parameters
|
|
15
36
|
* @param middleware - Optional array of middleware functions to apply
|
|
16
37
|
* @returns Promise resolving to a generic response object
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const response = await this.executeRequest(
|
|
42
|
+
* { params: { id: 123 }, options: {} },
|
|
43
|
+
* async (params) => await fetchData(params.id),
|
|
44
|
+
* [loggingMiddleware, cachingMiddleware]
|
|
45
|
+
* );
|
|
46
|
+
* ```
|
|
17
47
|
*/
|
|
18
48
|
protected executeRequest<TParams, TResponse>(request: GenericRequest<TParams>, handler: (params: TParams) => Promise<TResponse>, middleware?: Middleware[]): Promise<GenericResponse<TResponse>>;
|
|
19
49
|
/**
|
|
20
|
-
*
|
|
50
|
+
* Validates parameters with optional custom validator.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* Type guard that validates and asserts parameter types at runtime.
|
|
54
|
+
* Use for input validation in public API methods.
|
|
21
55
|
*
|
|
22
56
|
* @param params - The parameters to validate
|
|
23
57
|
* @param validator - Optional function to validate parameter types
|
|
24
|
-
* @throws Error
|
|
58
|
+
* @throws {Error} When validation fails.
|
|
59
|
+
* Provide valid parameters matching expected type.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* this.validateParams<MyParams>(params, (p): p is MyParams => {
|
|
64
|
+
* return typeof p === 'object' && 'id' in p;
|
|
65
|
+
* });
|
|
66
|
+
* // TypeScript now knows params is MyParams
|
|
67
|
+
* ```
|
|
25
68
|
*/
|
|
26
69
|
protected validateParams<T>(params: unknown, validator?: (params: unknown) => params is T): asserts params is T;
|
|
27
70
|
}
|
|
28
71
|
/**
|
|
29
|
-
*
|
|
72
|
+
* Implements retry logic with exponential backoff and jitter.
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* Provides configurable retry behavior for transient failures with
|
|
76
|
+
* exponential backoff, maximum delay caps, and optional jitter to
|
|
77
|
+
* prevent thundering herd problems.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const result = await RetryUtility.withRetry(
|
|
82
|
+
* async () => await unreliableOperation(),
|
|
83
|
+
* {
|
|
84
|
+
* maxAttempts: 5,
|
|
85
|
+
* baseDelay: 1000,
|
|
86
|
+
* backoffMultiplier: 2,
|
|
87
|
+
* maxDelay: 30000,
|
|
88
|
+
* shouldRetry: (error) => error.code === 'NETWORK_ERROR'
|
|
89
|
+
* }
|
|
90
|
+
* );
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
* @category Infrastructure
|
|
30
94
|
*/
|
|
31
|
-
declare class RetryUtility {
|
|
95
|
+
export declare class RetryUtility {
|
|
32
96
|
private static delay;
|
|
33
97
|
static withRetry<T>(operation: () => Promise<T>, config: RetryConfig): Promise<T>;
|
|
34
98
|
}
|
|
35
99
|
/**
|
|
36
|
-
*
|
|
100
|
+
* Implements token bucket rate limiting for API calls.
|
|
101
|
+
*
|
|
102
|
+
* @remarks
|
|
103
|
+
* Prevents API throttling by limiting requests per time window.
|
|
104
|
+
* Uses sliding window algorithm for smooth rate limiting without
|
|
105
|
+
* burst spikes at window boundaries.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const limiter = new RateLimiter({
|
|
110
|
+
* requestsPerWindow: 100,
|
|
111
|
+
* windowMs: 60000 // 100 requests per minute
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* // Check before making request
|
|
115
|
+
* if (await limiter.checkLimit()) {
|
|
116
|
+
* await makeApiCall();
|
|
117
|
+
* } else {
|
|
118
|
+
* await limiter.waitForSlot();
|
|
119
|
+
* await makeApiCall();
|
|
120
|
+
* }
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* @category Infrastructure
|
|
37
124
|
*/
|
|
38
|
-
declare class RateLimiter {
|
|
125
|
+
export declare class RateLimiter {
|
|
39
126
|
private config;
|
|
40
127
|
private requests;
|
|
41
128
|
constructor(config: RateLimiterConfig);
|
|
@@ -47,7 +134,7 @@ declare class RateLimiter {
|
|
|
47
134
|
/**
|
|
48
135
|
* Generic in-memory cache implementation
|
|
49
136
|
*/
|
|
50
|
-
declare class MemoryCache<TKey = string, TValue = unknown> implements Cache<TKey, TValue> {
|
|
137
|
+
export declare class MemoryCache<TKey = string, TValue = unknown> implements Cache<TKey, TValue> {
|
|
51
138
|
private cache;
|
|
52
139
|
get(key: TKey): Promise<TValue | undefined>;
|
|
53
140
|
set(key: TKey, value: TValue, ttl?: number): Promise<void>;
|
|
@@ -60,7 +147,7 @@ declare class MemoryCache<TKey = string, TValue = unknown> implements Cache<TKey
|
|
|
60
147
|
/**
|
|
61
148
|
* Generic event emitter implementation
|
|
62
149
|
*/
|
|
63
|
-
declare class EventEmitter<TEvent = unknown> implements Observable<TEvent> {
|
|
150
|
+
export declare class EventEmitter<TEvent = unknown> implements Observable<TEvent> {
|
|
64
151
|
private observers;
|
|
65
152
|
subscribe(observer: Observer<TEvent>): () => void;
|
|
66
153
|
unsubscribe(observer: Observer<TEvent>): void;
|
|
@@ -71,7 +158,7 @@ declare class EventEmitter<TEvent = unknown> implements Observable<TEvent> {
|
|
|
71
158
|
/**
|
|
72
159
|
* Generic middleware pipeline
|
|
73
160
|
*/
|
|
74
|
-
declare class MiddlewarePipeline {
|
|
161
|
+
export declare class MiddlewarePipeline {
|
|
75
162
|
private middleware;
|
|
76
163
|
use(middleware: Middleware<any, any>): void;
|
|
77
164
|
processRequest<TRequest>(request: TRequest): Promise<TRequest>;
|
|
@@ -83,7 +170,7 @@ declare class MiddlewarePipeline {
|
|
|
83
170
|
/**
|
|
84
171
|
* Generic async queue for managing concurrent operations
|
|
85
172
|
*/
|
|
86
|
-
declare class AsyncQueue<T = unknown> {
|
|
173
|
+
export declare class AsyncQueue<T = unknown> {
|
|
87
174
|
private concurrency;
|
|
88
175
|
private queue;
|
|
89
176
|
private running;
|
|
@@ -98,7 +185,7 @@ declare class AsyncQueue<T = unknown> {
|
|
|
98
185
|
/**
|
|
99
186
|
* Generic circuit breaker pattern
|
|
100
187
|
*/
|
|
101
|
-
declare class CircuitBreaker {
|
|
188
|
+
export declare class CircuitBreaker {
|
|
102
189
|
private config;
|
|
103
190
|
private state;
|
|
104
191
|
private failures;
|
|
@@ -116,5 +203,3 @@ declare class CircuitBreaker {
|
|
|
116
203
|
getFailures(): number;
|
|
117
204
|
reset(): void;
|
|
118
205
|
}
|
|
119
|
-
|
|
120
|
-
export { AsyncQueue, BaseController, CircuitBreaker, EventEmitter, MemoryCache, MiddlewarePipeline, RateLimiter, RetryUtility };
|
package/dist/core/generics.js
CHANGED
|
@@ -1,18 +1,29 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
1
|
class BaseController {
|
|
2
|
+
context;
|
|
5
3
|
constructor(context) {
|
|
6
|
-
__publicField(this, "context");
|
|
7
4
|
this.context = context;
|
|
8
5
|
}
|
|
9
6
|
/**
|
|
10
|
-
*
|
|
7
|
+
* Executes a request with optional middleware pipeline.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* Processes request through middleware chain, executes handler, and applies
|
|
11
|
+
* response middleware in reverse order. Handles errors through error middleware
|
|
12
|
+
* before failing the request.
|
|
11
13
|
*
|
|
12
14
|
* @param request - The generic request object containing parameters and metadata
|
|
13
15
|
* @param handler - The function that processes the request parameters
|
|
14
16
|
* @param middleware - Optional array of middleware functions to apply
|
|
15
17
|
* @returns Promise resolving to a generic response object
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const response = await this.executeRequest(
|
|
22
|
+
* { params: { id: 123 }, options: {} },
|
|
23
|
+
* async (params) => await fetchData(params.id),
|
|
24
|
+
* [loggingMiddleware, cachingMiddleware]
|
|
25
|
+
* );
|
|
26
|
+
* ```
|
|
16
27
|
*/
|
|
17
28
|
async executeRequest(request, handler, middleware = []) {
|
|
18
29
|
try {
|
|
@@ -47,6 +58,9 @@ class BaseController {
|
|
|
47
58
|
}
|
|
48
59
|
}
|
|
49
60
|
return {
|
|
61
|
+
// TODO(TYPES): undefined coerced to TResponse for error case.
|
|
62
|
+
// Future improvement: Use discriminated union with success: false
|
|
63
|
+
// to properly type data as undefined when error occurs.
|
|
50
64
|
data: void 0,
|
|
51
65
|
success: false,
|
|
52
66
|
error: {
|
|
@@ -58,11 +72,24 @@ class BaseController {
|
|
|
58
72
|
}
|
|
59
73
|
}
|
|
60
74
|
/**
|
|
61
|
-
*
|
|
75
|
+
* Validates parameters with optional custom validator.
|
|
76
|
+
*
|
|
77
|
+
* @remarks
|
|
78
|
+
* Type guard that validates and asserts parameter types at runtime.
|
|
79
|
+
* Use for input validation in public API methods.
|
|
62
80
|
*
|
|
63
81
|
* @param params - The parameters to validate
|
|
64
82
|
* @param validator - Optional function to validate parameter types
|
|
65
|
-
* @throws Error
|
|
83
|
+
* @throws {Error} When validation fails.
|
|
84
|
+
* Provide valid parameters matching expected type.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* this.validateParams<MyParams>(params, (p): p is MyParams => {
|
|
89
|
+
* return typeof p === 'object' && 'id' in p;
|
|
90
|
+
* });
|
|
91
|
+
* // TypeScript now knows params is MyParams
|
|
92
|
+
* ```
|
|
66
93
|
*/
|
|
67
94
|
validateParams(params, validator) {
|
|
68
95
|
if (validator && !validator(params)) {
|
|
@@ -87,9 +114,9 @@ class RetryUtility {
|
|
|
87
114
|
if (attempt === config.maxAttempts) {
|
|
88
115
|
break;
|
|
89
116
|
}
|
|
90
|
-
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier
|
|
91
|
-
const maxDelay = config.maxDelay
|
|
92
|
-
const jitter = config.jitter
|
|
117
|
+
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier ?? 2, attempt - 1);
|
|
118
|
+
const maxDelay = config.maxDelay ?? 3e4;
|
|
119
|
+
const jitter = config.jitter ?? 0;
|
|
93
120
|
let delay = Math.min(baseDelay, maxDelay);
|
|
94
121
|
if (jitter > 0) {
|
|
95
122
|
delay += Math.random() * jitter * delay;
|
|
@@ -97,14 +124,14 @@ class RetryUtility {
|
|
|
97
124
|
await this.delay(delay);
|
|
98
125
|
}
|
|
99
126
|
}
|
|
100
|
-
throw lastError
|
|
127
|
+
throw lastError ?? new Error("Operation failed after retries");
|
|
101
128
|
}
|
|
102
129
|
}
|
|
103
130
|
class RateLimiter {
|
|
104
131
|
constructor(config) {
|
|
105
132
|
this.config = config;
|
|
106
|
-
__publicField(this, "requests", []);
|
|
107
133
|
}
|
|
134
|
+
requests = [];
|
|
108
135
|
async checkLimit() {
|
|
109
136
|
const now = Date.now();
|
|
110
137
|
const windowStart = now - this.config.windowMs;
|
|
@@ -132,9 +159,7 @@ class RateLimiter {
|
|
|
132
159
|
}
|
|
133
160
|
}
|
|
134
161
|
class MemoryCache {
|
|
135
|
-
|
|
136
|
-
__publicField(this, "cache", /* @__PURE__ */ new Map());
|
|
137
|
-
}
|
|
162
|
+
cache = /* @__PURE__ */ new Map();
|
|
138
163
|
async get(key) {
|
|
139
164
|
const item = this.cache.get(key);
|
|
140
165
|
if (!item) return void 0;
|
|
@@ -172,12 +197,12 @@ class MemoryCache {
|
|
|
172
197
|
}
|
|
173
198
|
}
|
|
174
199
|
class EventEmitter {
|
|
175
|
-
|
|
176
|
-
__publicField(this, "observers", []);
|
|
177
|
-
}
|
|
200
|
+
observers = [];
|
|
178
201
|
subscribe(observer) {
|
|
179
202
|
this.observers.push(observer);
|
|
180
|
-
return () =>
|
|
203
|
+
return () => {
|
|
204
|
+
this.unsubscribe(observer);
|
|
205
|
+
};
|
|
181
206
|
}
|
|
182
207
|
unsubscribe(observer) {
|
|
183
208
|
const index = this.observers.indexOf(observer);
|
|
@@ -207,11 +232,7 @@ class EventEmitter {
|
|
|
207
232
|
}
|
|
208
233
|
}
|
|
209
234
|
class MiddlewarePipeline {
|
|
210
|
-
|
|
211
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
212
|
-
__publicField(this, "middleware", []);
|
|
213
|
-
}
|
|
214
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
235
|
+
middleware = [];
|
|
215
236
|
use(middleware) {
|
|
216
237
|
this.middleware.push(middleware);
|
|
217
238
|
}
|
|
@@ -243,7 +264,6 @@ class MiddlewarePipeline {
|
|
|
243
264
|
}
|
|
244
265
|
}
|
|
245
266
|
}
|
|
246
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
247
267
|
getMiddleware() {
|
|
248
268
|
return [...this.middleware];
|
|
249
269
|
}
|
|
@@ -254,9 +274,9 @@ class MiddlewarePipeline {
|
|
|
254
274
|
class AsyncQueue {
|
|
255
275
|
constructor(concurrency = 1) {
|
|
256
276
|
this.concurrency = concurrency;
|
|
257
|
-
__publicField(this, "queue", []);
|
|
258
|
-
__publicField(this, "running", 0);
|
|
259
277
|
}
|
|
278
|
+
queue = [];
|
|
279
|
+
running = 0;
|
|
260
280
|
async add(operation) {
|
|
261
281
|
return new Promise((resolve, reject) => {
|
|
262
282
|
this.queue.push(async () => {
|
|
@@ -301,11 +321,11 @@ class AsyncQueue {
|
|
|
301
321
|
class CircuitBreaker {
|
|
302
322
|
constructor(config) {
|
|
303
323
|
this.config = config;
|
|
304
|
-
__publicField(this, "state", "closed");
|
|
305
|
-
__publicField(this, "failures", 0);
|
|
306
|
-
__publicField(this, "lastFailureTime", 0);
|
|
307
|
-
__publicField(this, "successes", 0);
|
|
308
324
|
}
|
|
325
|
+
state = "closed";
|
|
326
|
+
failures = 0;
|
|
327
|
+
lastFailureTime = 0;
|
|
328
|
+
successes = 0;
|
|
309
329
|
async execute(operation) {
|
|
310
330
|
if (this.state === "open") {
|
|
311
331
|
if (Date.now() - this.lastFailureTime > this.config.recoveryTimeout) {
|
|
@@ -328,7 +348,7 @@ class CircuitBreaker {
|
|
|
328
348
|
this.failures = 0;
|
|
329
349
|
if (this.state === "half-open") {
|
|
330
350
|
this.successes++;
|
|
331
|
-
if (this.successes >= (this.config.halfOpenMaxAttempts
|
|
351
|
+
if (this.successes >= (this.config.halfOpenMaxAttempts ?? 1)) {
|
|
332
352
|
this.state = "closed";
|
|
333
353
|
}
|
|
334
354
|
}
|