@opendatalabs/vana-sdk 0.1.0-alpha.d7fc764 → 0.1.0-alpha.dc68f39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/waitForTransactionEvents.test.d.ts +1 -0
- package/dist/browser.d.ts +4 -2
- package/dist/chains/definitions.cjs +9 -6
- package/dist/chains/definitions.cjs.map +1 -1
- package/dist/chains/definitions.d.ts +9 -11
- package/dist/chains/definitions.js +9 -6
- package/dist/chains/definitions.js.map +1 -1
- package/dist/chains/index.d.ts +5 -2
- package/dist/chains.browser.d.ts +8 -2
- package/dist/chains.d.ts +8 -2
- package/dist/chains.node.d.ts +8 -2
- package/dist/config/addresses.d.ts +8 -24
- package/dist/config/chains.d.ts +9 -13
- package/dist/config/default-services.cjs +60 -0
- package/dist/config/default-services.cjs.map +1 -0
- package/dist/config/default-services.d.ts +46 -0
- package/dist/config/default-services.js +33 -0
- package/dist/config/default-services.js.map +1 -0
- package/dist/config/default-services.test.d.ts +1 -0
- package/dist/config/features.d.ts +1 -3
- package/dist/config/tests/addresses.test.d.ts +1 -0
- package/dist/contracts/contractController.cjs +3 -3
- package/dist/contracts/contractController.cjs.map +1 -1
- package/dist/contracts/contractController.d.ts +11 -28
- package/dist/contracts/contractController.js +4 -7
- package/dist/contracts/contractController.js.map +1 -1
- package/dist/contracts/tests/contractController.test.d.ts +1 -0
- package/dist/controllers/__tests__/schemas-edge-cases.test.d.ts +1 -0
- package/dist/controllers/base.cjs +83 -0
- package/dist/controllers/base.cjs.map +1 -0
- package/dist/controllers/base.d.ts +84 -0
- package/dist/controllers/base.js +59 -0
- package/dist/controllers/base.js.map +1 -0
- package/dist/controllers/data-error-handling.test.d.ts +1 -0
- package/dist/controllers/data.cjs +415 -172
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +149 -76
- package/dist/controllers/data.js +415 -172
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/permissions.cjs +508 -257
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +1348 -25
- package/dist/controllers/permissions.js +508 -257
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/controllers/protocol.cjs +15 -11
- package/dist/controllers/protocol.cjs.map +1 -1
- package/dist/controllers/protocol.d.ts +7 -35
- package/dist/controllers/protocol.js +15 -14
- package/dist/controllers/protocol.js.map +1 -1
- package/dist/controllers/schemas.cjs +69 -54
- package/dist/controllers/schemas.cjs.map +1 -1
- package/dist/controllers/schemas.d.ts +9 -36
- package/dist/controllers/schemas.js +69 -54
- package/dist/controllers/schemas.js.map +1 -1
- package/dist/controllers/server-additional.test.d.ts +1 -0
- package/dist/controllers/server.cjs +15 -10
- package/dist/controllers/server.cjs.map +1 -1
- package/dist/controllers/server.d.ts +7 -33
- package/dist/controllers/server.js +15 -10
- package/dist/controllers/server.js.map +1 -1
- package/dist/core/apiClient.cjs +15 -12
- package/dist/core/apiClient.cjs.map +1 -1
- package/dist/core/apiClient.d.ts +5 -9
- package/dist/core/apiClient.js +19 -19
- package/dist/core/apiClient.js.map +1 -1
- package/dist/core/client.cjs +7 -7
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts +6 -9
- package/dist/core/client.js +7 -7
- package/dist/core/client.js.map +1 -1
- package/dist/core/core.test.d.ts +1 -0
- package/dist/core/generics.cjs +11 -9
- package/dist/core/generics.cjs.map +1 -1
- package/dist/core/generics.d.ts +9 -13
- package/dist/core/generics.js +22 -29
- package/dist/core/generics.js.map +1 -1
- package/dist/core/tests/apiClient.test.d.ts +1 -0
- package/dist/core/tests/client.test.d.ts +1 -0
- package/dist/core/tests/generics.test.d.ts +1 -0
- package/dist/core.cjs +114 -48
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +40 -65
- package/dist/core.js +127 -74
- package/dist/core.js.map +1 -1
- package/dist/crypto/ecies/__tests__/base.test.d.ts +4 -0
- package/dist/crypto/ecies/__tests__/compatibility.test.d.ts +8 -0
- package/dist/crypto/ecies/__tests__/constants.test.d.ts +4 -0
- package/dist/crypto/ecies/__tests__/native-parity.test.d.ts +7 -0
- package/dist/crypto/ecies/__tests__/normalization.test.d.ts +1 -0
- package/dist/crypto/ecies/__tests__/test-vectors.d.ts +2 -4
- package/dist/crypto/ecies/base.cjs +4 -3
- package/dist/crypto/ecies/base.cjs.map +1 -1
- package/dist/crypto/ecies/base.d.ts +2 -5
- package/dist/crypto/ecies/base.js +12 -15
- package/dist/crypto/ecies/base.js.map +1 -1
- package/dist/crypto/ecies/browser.cjs +2 -1
- package/dist/crypto/ecies/browser.cjs.map +1 -1
- package/dist/crypto/ecies/browser.d.ts +2 -7
- package/dist/crypto/ecies/browser.js +2 -1
- package/dist/crypto/ecies/browser.js.map +1 -1
- package/dist/crypto/ecies/constants.d.ts +7 -9
- package/dist/crypto/ecies/index.d.ts +8 -1
- package/dist/crypto/ecies/interface.cjs +4 -5
- package/dist/crypto/ecies/interface.cjs.map +1 -1
- package/dist/crypto/ecies/interface.d.ts +9 -11
- package/dist/crypto/ecies/interface.js +4 -5
- package/dist/crypto/ecies/interface.js.map +1 -1
- package/dist/crypto/ecies/node.cjs +3 -2
- package/dist/crypto/ecies/node.cjs.map +1 -1
- package/dist/crypto/ecies/node.d.ts +2 -7
- package/dist/crypto/ecies/node.js +11 -16
- package/dist/crypto/ecies/node.js.map +1 -1
- package/dist/crypto/ecies/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 +16 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +53 -15
- package/dist/errors.js +18 -6
- package/dist/errors.js.map +1 -1
- package/dist/generated/abi/ComputeEngineImplementation.d.ts +2 -3
- package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DATFactoryImplementation.d.ts +2 -3
- package/dist/generated/abi/DATImplementation.d.ts +2 -3
- package/dist/generated/abi/DATPausableImplementation.d.ts +2 -3
- package/dist/generated/abi/DATVotesImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPPerformanceImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +2 -3
- package/dist/generated/abi/DLPRootImplementation.d.ts +1 -3
- package/dist/generated/abi/DLPTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +1 -3
- package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +2 -3
- package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +2 -3
- package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +2 -3
- package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +2 -3
- package/dist/generated/abi/DataRegistryImplementation.cjs +13 -0
- package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
- package/dist/generated/abi/DataRegistryImplementation.d.ts +12 -3
- package/dist/generated/abi/DataRegistryImplementation.js +13 -0
- package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
- package/dist/generated/abi/QueryEngineImplementation.d.ts +2 -3
- package/dist/generated/abi/SwapHelperImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +2 -3
- package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaEpochImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +2 -3
- package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +2 -3
- package/dist/generated/abi/index.cjs +42 -0
- package/dist/generated/abi/index.cjs.map +1 -1
- package/dist/generated/abi/index.d.ts +47 -18
- package/dist/generated/abi/index.js +21 -0
- package/dist/generated/abi/index.js.map +1 -1
- package/dist/generated/event-types.cjs +17 -0
- package/dist/generated/event-types.cjs.map +1 -0
- package/dist/generated/event-types.d.ts +854 -0
- package/dist/generated/event-types.js +1 -0
- package/dist/generated/event-types.js.map +1 -0
- package/dist/generated/eventRegistry.cjs +3351 -0
- package/dist/generated/eventRegistry.cjs.map +1 -0
- package/dist/generated/eventRegistry.d.ts +14 -0
- package/dist/generated/eventRegistry.js +3326 -0
- package/dist/generated/eventRegistry.js.map +1 -0
- package/dist/generated/server/server-exports.d.ts +19 -21
- package/dist/generated/server/server.cjs.map +1 -1
- package/dist/generated/server/server.d.ts +113 -87
- package/dist/generated/subgraph.d.ts +329 -332
- package/dist/index.browser.d.ts +48 -73
- package/dist/index.browser.js +12 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +9 -0
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +181 -64
- package/dist/index.node.js +10 -0
- package/dist/index.node.js.map +1 -1
- package/dist/node.d.ts +4 -2
- package/dist/platform/browser-only.d.ts +5 -8
- package/dist/platform/browser-only.test.d.ts +1 -0
- package/dist/platform/browser-safe.d.ts +6 -9
- package/dist/platform/browser-safe.test.d.ts +1 -0
- package/dist/platform/browser.cjs +7 -6
- package/dist/platform/browser.cjs.map +1 -1
- package/dist/platform/browser.d.ts +3 -6
- package/dist/platform/browser.js +19 -27
- package/dist/platform/browser.js.map +1 -1
- package/dist/platform/browser.test.d.ts +1 -0
- package/dist/platform/index.d.ts +11 -5
- package/dist/platform/interface.d.ts +6 -8
- package/dist/platform/node.d.ts +3 -7
- package/dist/platform/node.js +12 -19
- package/dist/platform/node.js.map +1 -1
- package/dist/platform/ports/openpgp-port.cjs +74 -0
- package/dist/platform/ports/openpgp-port.cjs.map +1 -0
- package/dist/platform/ports/openpgp-port.d.ts +13 -0
- package/dist/platform/ports/openpgp-port.js +59 -0
- package/dist/platform/ports/openpgp-port.js.map +1 -0
- package/dist/platform/ports/pgp-port.cjs +17 -0
- package/dist/platform/ports/pgp-port.cjs.map +1 -0
- package/dist/platform/ports/pgp-port.d.ts +35 -0
- package/dist/platform/ports/pgp-port.js +1 -0
- package/dist/platform/ports/pgp-port.js.map +1 -0
- package/dist/platform/shared/error-utils.d.ts +2 -4
- package/dist/platform/shared/pgp-utils.cjs +2 -2
- package/dist/platform/shared/pgp-utils.cjs.map +1 -1
- package/dist/platform/shared/pgp-utils.d.ts +3 -5
- package/dist/platform/shared/pgp-utils.js +2 -2
- package/dist/platform/shared/pgp-utils.js.map +1 -1
- package/dist/platform/shared/stream-utils.d.ts +1 -3
- package/dist/platform/utils.d.ts +6 -10
- package/dist/platform/utils.test.d.ts +1 -0
- package/dist/platform.browser.d.ts +9 -4
- package/dist/platform.d.ts +11 -5
- package/dist/platform.node.d.ts +10 -5
- package/dist/schemas/dataSchema.schema.json +53 -0
- package/dist/schemas/grantFile.schema.json +43 -0
- package/dist/server/handler.cjs.map +1 -1
- package/dist/server/handler.d.ts +8 -203
- package/dist/server/handler.js.map +1 -1
- package/dist/storage/index.d.ts +56 -10
- package/dist/storage/manager.cjs +6 -6
- package/dist/storage/manager.cjs.map +1 -1
- package/dist/storage/manager.d.ts +2 -5
- package/dist/storage/manager.js +5 -12
- package/dist/storage/manager.js.map +1 -1
- package/dist/storage/providers/callback-storage.cjs +3 -3
- package/dist/storage/providers/callback-storage.cjs.map +1 -1
- package/dist/storage/providers/callback-storage.d.ts +3 -9
- package/dist/storage/providers/callback-storage.js +3 -3
- package/dist/storage/providers/callback-storage.js.map +1 -1
- package/dist/storage/providers/google-drive.cjs +2 -2
- package/dist/storage/providers/google-drive.cjs.map +1 -1
- package/dist/storage/providers/google-drive.d.ts +3 -7
- package/dist/storage/providers/google-drive.js +4 -7
- package/dist/storage/providers/google-drive.js.map +1 -1
- package/dist/storage/providers/google-drive.test.d.ts +1 -0
- package/dist/storage/providers/ipfs.cjs +5 -5
- package/dist/storage/providers/ipfs.cjs.map +1 -1
- package/dist/storage/providers/ipfs.d.ts +3 -6
- package/dist/storage/providers/ipfs.js +7 -10
- package/dist/storage/providers/ipfs.js.map +1 -1
- package/dist/storage/providers/pinata.cjs +6 -6
- package/dist/storage/providers/pinata.cjs.map +1 -1
- package/dist/storage/providers/pinata.d.ts +5 -8
- package/dist/storage/providers/pinata.js +8 -11
- package/dist/storage/providers/pinata.js.map +1 -1
- package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
- package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
- package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
- package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
- package/dist/storage/tests/storageManager.test.d.ts +1 -0
- package/dist/tests/abi.test.d.ts +1 -0
- package/dist/tests/chains-definitions.test.d.ts +1 -0
- package/dist/tests/core-encryption.test.d.ts +1 -0
- package/dist/tests/core-extended.test.d.ts +1 -0
- package/dist/tests/core-generics-coverage.test.d.ts +1 -0
- package/dist/tests/coverage-boost.test.d.ts +1 -0
- package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
- package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
- package/dist/tests/data-additional-methods.test.d.ts +1 -0
- package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
- package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
- package/dist/tests/data-relayer.test.d.ts +1 -0
- package/dist/tests/data-schema-validation.test.d.ts +1 -0
- package/dist/tests/data-simple-methods.test.d.ts +1 -0
- package/dist/tests/data.test.d.ts +1 -0
- package/dist/tests/demo-integration.test.d.ts +1 -0
- package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
- package/dist/tests/download-relayer.test.d.ts +1 -0
- package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
- package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
- package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
- package/dist/tests/encryption-coverage.test.d.ts +1 -0
- package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
- package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
- package/dist/tests/errors-coverage.test.d.ts +1 -0
- package/dist/tests/errors.test.d.ts +1 -0
- package/dist/tests/factories/mockFactory.d.ts +316 -0
- package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
- package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
- package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
- package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
- package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
- package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
- package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
- package/dist/tests/helper-methods.test.d.ts +1 -0
- package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
- package/dist/tests/helpers/typedMocks.d.ts +64 -0
- package/dist/tests/index-browser.test.d.ts +1 -0
- package/dist/tests/index-node.test.d.ts +1 -0
- package/dist/tests/index.test.d.ts +1 -0
- package/dist/tests/mocks/platformAdapter.d.ts +12 -0
- package/dist/tests/new-permissions-methods.test.d.ts +1 -0
- package/dist/tests/no-buffer-browser.test.d.ts +1 -0
- package/dist/tests/permissions-grantee.test.d.ts +1 -0
- package/dist/tests/permissions-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/schemas.test.d.ts +1 -0
- package/dist/tests/server-handler.test.d.ts +1 -0
- package/dist/tests/setup.d.ts +7 -0
- package/dist/tests/signatureFormatter.test.d.ts +1 -0
- package/dist/tests/trusted-server-queries.test.d.ts +1 -0
- package/dist/tests/typedDataConverter.test.d.ts +1 -0
- package/dist/tests/types-contracts.test.d.ts +1 -0
- package/dist/tests/types-data.test.d.ts +1 -0
- package/dist/tests/types-external-apis.test.d.ts +1 -0
- package/dist/tests/types-generics.test.d.ts +1 -0
- package/dist/tests/types-permissions.test.d.ts +1 -0
- package/dist/tests/types-upload-params.test.d.ts +1 -0
- package/dist/tests/types.test.d.ts +1 -0
- package/dist/tests/utils-formatters.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
- package/dist/tests/utils-grantFiles.test.d.ts +1 -0
- package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
- package/dist/tests/utils-grants.test.d.ts +1 -0
- package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
- package/dist/tests/utils-ipfs.test.d.ts +4 -0
- package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
- package/dist/tests/vana.test.d.ts +1 -0
- package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
- package/dist/types/blockchain.cjs +17 -0
- package/dist/types/blockchain.cjs.map +1 -0
- package/dist/types/blockchain.d.ts +57 -0
- package/dist/types/blockchain.js +1 -0
- package/dist/types/blockchain.js.map +1 -0
- package/dist/types/chains-additional.test.d.ts +1 -0
- package/dist/types/chains.d.ts +6 -9
- package/dist/types/config.cjs +10 -0
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +161 -54
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/contracts.cjs.map +1 -1
- package/dist/types/contracts.d.ts +8 -11
- package/dist/types/controller-context.cjs +17 -0
- package/dist/types/controller-context.cjs.map +1 -0
- package/dist/types/controller-context.d.ts +64 -0
- package/dist/types/controller-context.js +1 -0
- package/dist/types/controller-context.js.map +1 -0
- package/dist/types/data.cjs.map +1 -1
- package/dist/types/data.d.ts +107 -39
- package/dist/types/external-apis.d.ts +10 -12
- package/dist/types/generics.d.ts +35 -38
- package/dist/types/index.cjs +5 -4
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +20 -34
- package/dist/types/index.js +9 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/operations.cjs +2 -2
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +32 -28
- package/dist/types/operations.js +2 -2
- package/dist/types/operations.js.map +1 -1
- package/dist/types/permissions.d.ts +55 -58
- package/dist/types/personal.cjs.map +1 -1
- package/dist/types/personal.d.ts +6 -8
- package/dist/types/relayer.d.ts +15 -18
- package/dist/types/storage.d.ts +6 -8
- package/dist/types/storage.js +2 -5
- package/dist/types/storage.js.map +1 -1
- package/dist/types/transactionResults.cjs.map +1 -1
- package/dist/types/transactionResults.d.ts +193 -25
- package/dist/types/utils.cjs.map +1 -1
- package/dist/types/utils.d.ts +26 -25
- package/dist/types.d.ts +4 -40
- package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
- package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
- package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
- package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
- package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
- package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
- package/dist/utils/blockchain/registry.cjs +2 -2
- package/dist/utils/blockchain/registry.cjs.map +1 -1
- package/dist/utils/blockchain/registry.d.ts +6 -8
- package/dist/utils/blockchain/registry.js +2 -2
- package/dist/utils/blockchain/registry.js.map +1 -1
- package/dist/utils/blockchain/registry.test.d.ts +1 -0
- package/dist/utils/crypto-utils.cjs +0 -12
- package/dist/utils/crypto-utils.cjs.map +1 -1
- package/dist/utils/crypto-utils.d.ts +9 -27
- package/dist/utils/crypto-utils.js +0 -11
- package/dist/utils/crypto-utils.js.map +1 -1
- package/dist/utils/crypto-utils.test.d.ts +1 -0
- package/dist/utils/download.cjs +3 -3
- package/dist/utils/download.cjs.map +1 -1
- package/dist/utils/download.d.ts +13 -14
- package/dist/utils/download.js +2 -2
- package/dist/utils/download.js.map +1 -1
- package/dist/utils/encoding.cjs +1 -1
- package/dist/utils/encoding.cjs.map +1 -1
- package/dist/utils/encoding.d.ts +4 -6
- package/dist/utils/encoding.js +1 -1
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/encoding.test.d.ts +1 -0
- package/dist/utils/encryption.cjs +16 -10
- package/dist/utils/encryption.cjs.map +1 -1
- package/dist/utils/encryption.d.ts +13 -17
- package/dist/utils/encryption.js +16 -10
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/formatters.cjs +4 -2
- package/dist/utils/formatters.cjs.map +1 -1
- package/dist/utils/formatters.d.ts +4 -6
- package/dist/utils/formatters.js +4 -2
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/grantFiles.cjs +7 -4
- package/dist/utils/grantFiles.cjs.map +1 -1
- package/dist/utils/grantFiles.d.ts +6 -10
- package/dist/utils/grantFiles.js +7 -4
- package/dist/utils/grantFiles.js.map +1 -1
- package/dist/utils/grantValidation.cjs +1 -1
- package/dist/utils/grantValidation.cjs.map +1 -1
- package/dist/utils/grantValidation.d.ts +14 -17
- package/dist/utils/grantValidation.js +1 -1
- package/dist/utils/grantValidation.js.map +1 -1
- package/dist/utils/grants.cjs +1 -1
- package/dist/utils/grants.cjs.map +1 -1
- package/dist/utils/grants.d.ts +10 -13
- package/dist/utils/grants.js +1 -1
- package/dist/utils/grants.js.map +1 -1
- package/dist/utils/ipfs.d.ts +8 -10
- package/dist/utils/lazy-import.cjs +4 -6
- package/dist/utils/lazy-import.cjs.map +1 -1
- package/dist/utils/lazy-import.d.ts +1 -3
- package/dist/utils/lazy-import.js +4 -6
- package/dist/utils/lazy-import.js.map +1 -1
- package/dist/utils/multicall.cjs +4 -2
- package/dist/utils/multicall.cjs.map +1 -1
- package/dist/utils/multicall.d.ts +5 -8
- package/dist/utils/multicall.js +4 -2
- package/dist/utils/multicall.js.map +1 -1
- package/dist/utils/parseTransactionPojo.cjs +87 -0
- package/dist/utils/parseTransactionPojo.cjs.map +1 -0
- package/dist/utils/parseTransactionPojo.d.ts +31 -0
- package/dist/utils/parseTransactionPojo.js +63 -0
- package/dist/utils/parseTransactionPojo.js.map +1 -0
- package/dist/utils/schemaValidation.cjs +5 -5
- package/dist/utils/schemaValidation.cjs.map +1 -1
- package/dist/utils/schemaValidation.d.ts +8 -12
- package/dist/utils/schemaValidation.js +7 -10
- package/dist/utils/schemaValidation.js.map +1 -1
- package/dist/utils/signatureCache.cjs +1 -2
- package/dist/utils/signatureCache.cjs.map +1 -1
- package/dist/utils/signatureCache.d.ts +4 -7
- package/dist/utils/signatureCache.js +4 -8
- package/dist/utils/signatureCache.js.map +1 -1
- package/dist/utils/signatureFormatter.cjs +6 -9
- package/dist/utils/signatureFormatter.cjs.map +1 -1
- package/dist/utils/signatureFormatter.d.ts +2 -5
- package/dist/utils/signatureFormatter.js +6 -9
- package/dist/utils/signatureFormatter.js.map +1 -1
- package/dist/utils/tests/multicall.test.d.ts +1 -0
- package/dist/utils/transactionHelpers.cjs +54 -0
- package/dist/utils/transactionHelpers.cjs.map +1 -0
- package/dist/utils/transactionHelpers.d.ts +80 -0
- package/dist/utils/transactionHelpers.js +29 -0
- package/dist/utils/transactionHelpers.js.map +1 -0
- package/dist/utils/typeGuards.cjs +109 -0
- package/dist/utils/typeGuards.cjs.map +1 -0
- package/dist/utils/typeGuards.d.ts +138 -0
- package/dist/utils/typeGuards.js +74 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/typedDataConverter.d.ts +3 -6
- package/dist/utils/urlResolver.cjs +1 -1
- package/dist/utils/urlResolver.cjs.map +1 -1
- package/dist/utils/urlResolver.d.ts +2 -4
- package/dist/utils/urlResolver.js +2 -2
- package/dist/utils/urlResolver.js.map +1 -1
- package/dist/utils/wallet.cjs +62 -0
- package/dist/utils/wallet.cjs.map +1 -0
- package/dist/utils/wallet.d.ts +32 -0
- package/dist/utils/wallet.js +36 -0
- package/dist/utils/wallet.js.map +1 -0
- package/dist/{chains.browser.cjs → utils/withEvents.cjs} +22 -15
- package/dist/utils/withEvents.cjs.map +1 -0
- package/dist/utils/withEvents.d.ts +56 -0
- package/dist/utils/withEvents.js +18 -0
- package/dist/utils/withEvents.js.map +1 -0
- package/package.json +23 -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.d.cts +0 -282
- package/dist/storage/index.d.cts +0 -10
- package/dist/storage/manager.d.cts +0 -150
- package/dist/storage/providers/callback-storage.d.cts +0 -100
- package/dist/storage/providers/google-drive.d.cts +0 -156
- package/dist/storage/providers/ipfs.d.cts +0 -163
- package/dist/storage/providers/pinata.d.cts +0 -173
- package/dist/types/chains.d.cts +0 -34
- package/dist/types/config.d.cts +0 -726
- package/dist/types/contracts.d.cts +0 -68
- package/dist/types/data.d.cts +0 -694
- package/dist/types/eccrypto-js.d.d.cts +0 -13
- package/dist/types/eccrypto-js.d.d.ts +0 -13
- package/dist/types/external-apis.d.cts +0 -186
- package/dist/types/generics.d.cts +0 -450
- package/dist/types/index.d.cts +0 -34
- package/dist/types/operations.d.cts +0 -108
- package/dist/types/permissions.d.cts +0 -957
- package/dist/types/personal.d.cts +0 -40
- package/dist/types/relayer.d.cts +0 -284
- package/dist/types/storage.d.cts +0 -131
- package/dist/types/transactionResults.d.cts +0 -25
- package/dist/types/utils.d.cts +0 -819
- package/dist/types.d.cts +0 -66
- package/dist/utils/blockchain/registry.d.cts +0 -34
- package/dist/utils/crypto-utils.d.cts +0 -118
- package/dist/utils/download.d.cts +0 -41
- package/dist/utils/encoding.d.cts +0 -54
- package/dist/utils/encryption.d.cts +0 -275
- package/dist/utils/eventParsing.cjs +0 -111
- package/dist/utils/eventParsing.cjs.map +0 -1
- package/dist/utils/eventParsing.d.cts +0 -60
- package/dist/utils/eventParsing.d.ts +0 -60
- package/dist/utils/eventParsing.js +0 -86
- package/dist/utils/eventParsing.js.map +0 -1
- package/dist/utils/formatters.d.cts +0 -120
- package/dist/utils/grantFiles.d.cts +0 -186
- package/dist/utils/grantValidation.d.cts +0 -150
- package/dist/utils/grants.d.cts +0 -70
- package/dist/utils/ipfs.d.cts +0 -90
- package/dist/utils/lazy-import.d.cts +0 -20
- package/dist/utils/multicall.d.cts +0 -129
- package/dist/utils/schemaValidation.d.cts +0 -172
- package/dist/utils/signatureCache.d.cts +0 -134
- package/dist/utils/signatureFormatter.d.cts +0 -39
- package/dist/utils/transactionParsing.cjs +0 -84
- package/dist/utils/transactionParsing.cjs.map +0 -1
- package/dist/utils/transactionParsing.d.cts +0 -25
- package/dist/utils/transactionParsing.d.ts +0 -25
- package/dist/utils/transactionParsing.js +0 -62
- package/dist/utils/transactionParsing.js.map +0 -1
- package/dist/utils/typedDataConverter.d.cts +0 -13
- package/dist/utils/urlResolver.d.cts +0 -40
package/dist/core/client.js
CHANGED
|
@@ -5,27 +5,27 @@ import {
|
|
|
5
5
|
} from "viem";
|
|
6
6
|
import { chains, mokshaTestnet } from "../config/chains";
|
|
7
7
|
const defaultFromBlocks = {
|
|
8
|
-
14800:
|
|
8
|
+
14800: 732312n,
|
|
9
9
|
// Moksha Testnet - earliest contract deployment
|
|
10
|
-
1480:
|
|
10
|
+
1480: 758584n
|
|
11
11
|
// Vana Mainnet - earliest contract deployment
|
|
12
12
|
};
|
|
13
13
|
function getDefaultFromBlock(chainId) {
|
|
14
|
-
return defaultFromBlocks[chainId] ||
|
|
14
|
+
return defaultFromBlocks[chainId] || 0n;
|
|
15
15
|
}
|
|
16
|
-
let
|
|
16
|
+
let cachedClient;
|
|
17
17
|
const createClient = (chainId = mokshaTestnet.id) => {
|
|
18
|
-
if (!
|
|
18
|
+
if (!cachedClient || cachedClient.chain?.id !== chainId) {
|
|
19
19
|
const chain = chains[chainId];
|
|
20
20
|
if (!chain) {
|
|
21
21
|
throw new Error(`Chain ${chainId} not found`);
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
cachedClient = createPublicClient({
|
|
24
24
|
chain,
|
|
25
25
|
transport: http()
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
-
return
|
|
28
|
+
return cachedClient;
|
|
29
29
|
};
|
|
30
30
|
const createWalletClient = (chainId = mokshaTestnet.id, account) => {
|
|
31
31
|
const chain = chains[chainId];
|
package/dist/core/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/client.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/client.ts"],"sourcesContent":["import type { Chain, Account, PublicClient, WalletClient } from \"viem\";\nimport {\n createPublicClient,\n http,\n createWalletClient as viemCreateWalletClient,\n} from \"viem\";\nimport { chains, mokshaTestnet } from \"../config/chains\";\n\n/**\n * Default starting block numbers for querying blockchain events and data per chain.\n *\n * @remarks\n * These block numbers represent the earliest deployment of Vana protocol contracts\n * on each network. Using these as starting points for event queries significantly\n * improves performance by avoiding unnecessary queries of blocks before the\n * protocol existed.\n *\n * - Moksha Testnet (14800): Block 732312 - DataRegistry deployment\n * - Vana Mainnet (1480): Block 758584 - DataRegistry deployment\n *\n * @category Blockchain\n */\nexport const defaultFromBlocks: Record<number, bigint> = {\n 14800: 732312n, // Moksha Testnet - earliest contract deployment\n 1480: 758584n, // Vana Mainnet - earliest contract deployment\n};\n\n/**\n * Gets the default starting block for a specific chain.\n *\n * @param chainId - The chain ID to get the default from block for\n * @returns The default starting block for the chain, or 0n if not configured\n * @category Blockchain\n */\nexport function getDefaultFromBlock(chainId: number): bigint {\n return defaultFromBlocks[chainId] || 0n;\n}\n\n// Cache for clients\nlet cachedClient: PublicClient & { chain: Chain };\n\n/**\n * Creates or retrieves a cached public client for blockchain read operations.\n *\n * @remarks\n * This function provides an optimized way to access blockchain data by maintaining\n * a cached client instance per chain. The client is used for reading contract state,\n * querying events, and other read-only blockchain operations. It automatically\n * handles HTTP transport configuration and chain switching.\n *\n * @param chainId - The chain ID to connect to (defaults to Moksha testnet)\n * @returns A public client configured for the specified chain with caching optimization\n * @throws {Error} When the specified chain ID is not supported by the SDK\n * @example\n * ```typescript\n * // Get client for default chain (Moksha testnet)\n * const client = createClient();\n *\n * // Get client for specific chain\n * const mainnetClient = createClient(14800);\n *\n * // Use client for blockchain reads\n * const blockNumber = await client.getBlockNumber();\n * ```\n * @category Blockchain\n */\nexport const createClient = (\n chainId: keyof typeof chains = mokshaTestnet.id,\n): PublicClient & { chain: Chain } => {\n if (!cachedClient || cachedClient.chain?.id !== chainId) {\n const chain = chains[chainId];\n if (!chain) {\n throw new Error(`Chain ${chainId} not found`);\n }\n\n cachedClient = createPublicClient({\n chain,\n transport: http(),\n });\n }\n\n return cachedClient;\n};\n\n/**\n * Creates a wallet client for blockchain transaction signing and submission.\n *\n * @remarks\n * This function creates a wallet client configured for transaction signing and\n * submission on the specified chain. Unlike the public client, wallet clients\n * are not cached and require an account for transaction signing. The client\n * handles HTTP transport configuration and provides access to wallet-specific\n * operations like signing transactions and messages.\n *\n * @param chainId - The chain ID to connect to (defaults to Moksha testnet)\n * @param account - Optional account for transaction signing (can be set later)\n * @returns A wallet client configured for the specified chain\n * @throws {Error} When the specified chain ID is not supported by the SDK\n * @example\n * ```typescript\n * import { privateKeyToAccount } from 'viem/accounts';\n *\n * // Create wallet client for default chain\n * const account = privateKeyToAccount('0x...');\n * const walletClient = createWalletClient(mokshaTestnet.id, account);\n *\n * // Use for transaction signing\n * const txHash = await walletClient.writeContract({\n * address: contractAddress,\n * abi: contractAbi,\n * functionName: 'someFunction',\n * args: []\n * });\n *\n * // Create without account (account can be set later)\n * const client = createWalletClient();\n * ```\n * @category Blockchain\n */\nexport const createWalletClient = (\n chainId: keyof typeof chains = mokshaTestnet.id,\n account?: Account,\n): WalletClient => {\n const chain = chains[chainId];\n if (!chain) {\n throw new Error(`Chain ${chainId} not found`);\n }\n\n return viemCreateWalletClient({\n chain,\n transport: http(),\n account,\n });\n};\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,OACjB;AACP,SAAS,QAAQ,qBAAqB;AAgB/B,MAAM,oBAA4C;AAAA,EACvD,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AACR;AASO,SAAS,oBAAoB,SAAyB;AAC3D,SAAO,kBAAkB,OAAO,KAAK;AACvC;AAGA,IAAI;AA2BG,MAAM,eAAe,CAC1B,UAA+B,cAAc,OACT;AACpC,MAAI,CAAC,gBAAgB,aAAa,OAAO,OAAO,SAAS;AACvD,UAAM,QAAQ,OAAO,OAAO;AAC5B,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,IAC9C;AAEA,mBAAe,mBAAmB;AAAA,MAChC;AAAA,MACA,WAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAqCO,MAAM,qBAAqB,CAChC,UAA+B,cAAc,IAC7C,YACiB;AACjB,QAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,SAAS,OAAO,YAAY;AAAA,EAC9C;AAEA,SAAO,uBAAuB;AAAA,IAC5B;AAAA,IACA,WAAW,KAAK;AAAA,IAChB;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/core/generics.cjs
CHANGED
|
@@ -74,6 +74,9 @@ class BaseController {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
return {
|
|
77
|
+
// TODO(TYPES): undefined coerced to TResponse for error case.
|
|
78
|
+
// Future improvement: Use discriminated union with success: false
|
|
79
|
+
// to properly type data as undefined when error occurs.
|
|
77
80
|
data: void 0,
|
|
78
81
|
success: false,
|
|
79
82
|
error: {
|
|
@@ -114,9 +117,9 @@ class RetryUtility {
|
|
|
114
117
|
if (attempt === config.maxAttempts) {
|
|
115
118
|
break;
|
|
116
119
|
}
|
|
117
|
-
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier
|
|
118
|
-
const maxDelay = config.maxDelay
|
|
119
|
-
const jitter = config.jitter
|
|
120
|
+
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier ?? 2, attempt - 1);
|
|
121
|
+
const maxDelay = config.maxDelay ?? 3e4;
|
|
122
|
+
const jitter = config.jitter ?? 0;
|
|
120
123
|
let delay = Math.min(baseDelay, maxDelay);
|
|
121
124
|
if (jitter > 0) {
|
|
122
125
|
delay += Math.random() * jitter * delay;
|
|
@@ -124,7 +127,7 @@ class RetryUtility {
|
|
|
124
127
|
await this.delay(delay);
|
|
125
128
|
}
|
|
126
129
|
}
|
|
127
|
-
throw lastError
|
|
130
|
+
throw lastError ?? new Error("Operation failed after retries");
|
|
128
131
|
}
|
|
129
132
|
}
|
|
130
133
|
class RateLimiter {
|
|
@@ -200,7 +203,9 @@ class EventEmitter {
|
|
|
200
203
|
observers = [];
|
|
201
204
|
subscribe(observer) {
|
|
202
205
|
this.observers.push(observer);
|
|
203
|
-
return () =>
|
|
206
|
+
return () => {
|
|
207
|
+
this.unsubscribe(observer);
|
|
208
|
+
};
|
|
204
209
|
}
|
|
205
210
|
unsubscribe(observer) {
|
|
206
211
|
const index = this.observers.indexOf(observer);
|
|
@@ -230,9 +235,7 @@ class EventEmitter {
|
|
|
230
235
|
}
|
|
231
236
|
}
|
|
232
237
|
class MiddlewarePipeline {
|
|
233
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
234
238
|
middleware = [];
|
|
235
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
236
239
|
use(middleware) {
|
|
237
240
|
this.middleware.push(middleware);
|
|
238
241
|
}
|
|
@@ -264,7 +267,6 @@ class MiddlewarePipeline {
|
|
|
264
267
|
}
|
|
265
268
|
}
|
|
266
269
|
}
|
|
267
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
270
|
getMiddleware() {
|
|
269
271
|
return [...this.middleware];
|
|
270
272
|
}
|
|
@@ -349,7 +351,7 @@ class CircuitBreaker {
|
|
|
349
351
|
this.failures = 0;
|
|
350
352
|
if (this.state === "half-open") {
|
|
351
353
|
this.successes++;
|
|
352
|
-
if (this.successes >= (this.config.halfOpenMaxAttempts
|
|
354
|
+
if (this.successes >= (this.config.halfOpenMaxAttempts ?? 1)) {
|
|
353
355
|
this.state = "closed";
|
|
354
356
|
}
|
|
355
357
|
}
|
|
@@ -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":"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","names":[]}
|
|
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 // 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 * 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 () => {\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,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import 'viem';
|
|
3
|
-
|
|
1
|
+
import type { Controller, ControllerContext, GenericRequest, GenericResponse, RetryConfig, RateLimiterConfig, Middleware, Cache, Observer, Observable } from "../types/generics";
|
|
4
2
|
/**
|
|
5
3
|
* Base controller class with common functionality
|
|
6
4
|
*/
|
|
7
|
-
declare abstract class BaseController<TContext extends ControllerContext = ControllerContext> implements Controller<TContext> {
|
|
5
|
+
export declare abstract class BaseController<TContext extends ControllerContext = ControllerContext> implements Controller<TContext> {
|
|
8
6
|
readonly context: TContext;
|
|
9
7
|
constructor(context: TContext);
|
|
10
8
|
/**
|
|
@@ -28,14 +26,14 @@ declare abstract class BaseController<TContext extends ControllerContext = Contr
|
|
|
28
26
|
/**
|
|
29
27
|
* Generic retry utility with exponential backoff
|
|
30
28
|
*/
|
|
31
|
-
declare class RetryUtility {
|
|
29
|
+
export declare class RetryUtility {
|
|
32
30
|
private static delay;
|
|
33
31
|
static withRetry<T>(operation: () => Promise<T>, config: RetryConfig): Promise<T>;
|
|
34
32
|
}
|
|
35
33
|
/**
|
|
36
34
|
* Generic rate limiter
|
|
37
35
|
*/
|
|
38
|
-
declare class RateLimiter {
|
|
36
|
+
export declare class RateLimiter {
|
|
39
37
|
private config;
|
|
40
38
|
private requests;
|
|
41
39
|
constructor(config: RateLimiterConfig);
|
|
@@ -47,7 +45,7 @@ declare class RateLimiter {
|
|
|
47
45
|
/**
|
|
48
46
|
* Generic in-memory cache implementation
|
|
49
47
|
*/
|
|
50
|
-
declare class MemoryCache<TKey = string, TValue = unknown> implements Cache<TKey, TValue> {
|
|
48
|
+
export declare class MemoryCache<TKey = string, TValue = unknown> implements Cache<TKey, TValue> {
|
|
51
49
|
private cache;
|
|
52
50
|
get(key: TKey): Promise<TValue | undefined>;
|
|
53
51
|
set(key: TKey, value: TValue, ttl?: number): Promise<void>;
|
|
@@ -60,7 +58,7 @@ declare class MemoryCache<TKey = string, TValue = unknown> implements Cache<TKey
|
|
|
60
58
|
/**
|
|
61
59
|
* Generic event emitter implementation
|
|
62
60
|
*/
|
|
63
|
-
declare class EventEmitter<TEvent = unknown> implements Observable<TEvent> {
|
|
61
|
+
export declare class EventEmitter<TEvent = unknown> implements Observable<TEvent> {
|
|
64
62
|
private observers;
|
|
65
63
|
subscribe(observer: Observer<TEvent>): () => void;
|
|
66
64
|
unsubscribe(observer: Observer<TEvent>): void;
|
|
@@ -71,7 +69,7 @@ declare class EventEmitter<TEvent = unknown> implements Observable<TEvent> {
|
|
|
71
69
|
/**
|
|
72
70
|
* Generic middleware pipeline
|
|
73
71
|
*/
|
|
74
|
-
declare class MiddlewarePipeline {
|
|
72
|
+
export declare class MiddlewarePipeline {
|
|
75
73
|
private middleware;
|
|
76
74
|
use(middleware: Middleware<any, any>): void;
|
|
77
75
|
processRequest<TRequest>(request: TRequest): Promise<TRequest>;
|
|
@@ -83,7 +81,7 @@ declare class MiddlewarePipeline {
|
|
|
83
81
|
/**
|
|
84
82
|
* Generic async queue for managing concurrent operations
|
|
85
83
|
*/
|
|
86
|
-
declare class AsyncQueue<T = unknown> {
|
|
84
|
+
export declare class AsyncQueue<T = unknown> {
|
|
87
85
|
private concurrency;
|
|
88
86
|
private queue;
|
|
89
87
|
private running;
|
|
@@ -98,7 +96,7 @@ declare class AsyncQueue<T = unknown> {
|
|
|
98
96
|
/**
|
|
99
97
|
* Generic circuit breaker pattern
|
|
100
98
|
*/
|
|
101
|
-
declare class CircuitBreaker {
|
|
99
|
+
export declare class CircuitBreaker {
|
|
102
100
|
private config;
|
|
103
101
|
private state;
|
|
104
102
|
private failures;
|
|
@@ -116,5 +114,3 @@ declare class CircuitBreaker {
|
|
|
116
114
|
getFailures(): number;
|
|
117
115
|
reset(): void;
|
|
118
116
|
}
|
|
119
|
-
|
|
120
|
-
export { AsyncQueue, BaseController, CircuitBreaker, EventEmitter, MemoryCache, MiddlewarePipeline, RateLimiter, RetryUtility };
|
package/dist/core/generics.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
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
|
/**
|
|
@@ -47,6 +44,9 @@ class BaseController {
|
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
return {
|
|
47
|
+
// TODO(TYPES): undefined coerced to TResponse for error case.
|
|
48
|
+
// Future improvement: Use discriminated union with success: false
|
|
49
|
+
// to properly type data as undefined when error occurs.
|
|
50
50
|
data: void 0,
|
|
51
51
|
success: false,
|
|
52
52
|
error: {
|
|
@@ -87,9 +87,9 @@ class RetryUtility {
|
|
|
87
87
|
if (attempt === config.maxAttempts) {
|
|
88
88
|
break;
|
|
89
89
|
}
|
|
90
|
-
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier
|
|
91
|
-
const maxDelay = config.maxDelay
|
|
92
|
-
const jitter = config.jitter
|
|
90
|
+
const baseDelay = config.baseDelay * Math.pow(config.backoffMultiplier ?? 2, attempt - 1);
|
|
91
|
+
const maxDelay = config.maxDelay ?? 3e4;
|
|
92
|
+
const jitter = config.jitter ?? 0;
|
|
93
93
|
let delay = Math.min(baseDelay, maxDelay);
|
|
94
94
|
if (jitter > 0) {
|
|
95
95
|
delay += Math.random() * jitter * delay;
|
|
@@ -97,14 +97,14 @@ class RetryUtility {
|
|
|
97
97
|
await this.delay(delay);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
throw lastError
|
|
100
|
+
throw lastError ?? new Error("Operation failed after retries");
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
class RateLimiter {
|
|
104
104
|
constructor(config) {
|
|
105
105
|
this.config = config;
|
|
106
|
-
__publicField(this, "requests", []);
|
|
107
106
|
}
|
|
107
|
+
requests = [];
|
|
108
108
|
async checkLimit() {
|
|
109
109
|
const now = Date.now();
|
|
110
110
|
const windowStart = now - this.config.windowMs;
|
|
@@ -132,9 +132,7 @@ class RateLimiter {
|
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
class MemoryCache {
|
|
135
|
-
|
|
136
|
-
__publicField(this, "cache", /* @__PURE__ */ new Map());
|
|
137
|
-
}
|
|
135
|
+
cache = /* @__PURE__ */ new Map();
|
|
138
136
|
async get(key) {
|
|
139
137
|
const item = this.cache.get(key);
|
|
140
138
|
if (!item) return void 0;
|
|
@@ -172,12 +170,12 @@ class MemoryCache {
|
|
|
172
170
|
}
|
|
173
171
|
}
|
|
174
172
|
class EventEmitter {
|
|
175
|
-
|
|
176
|
-
__publicField(this, "observers", []);
|
|
177
|
-
}
|
|
173
|
+
observers = [];
|
|
178
174
|
subscribe(observer) {
|
|
179
175
|
this.observers.push(observer);
|
|
180
|
-
return () =>
|
|
176
|
+
return () => {
|
|
177
|
+
this.unsubscribe(observer);
|
|
178
|
+
};
|
|
181
179
|
}
|
|
182
180
|
unsubscribe(observer) {
|
|
183
181
|
const index = this.observers.indexOf(observer);
|
|
@@ -207,11 +205,7 @@ class EventEmitter {
|
|
|
207
205
|
}
|
|
208
206
|
}
|
|
209
207
|
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
|
|
208
|
+
middleware = [];
|
|
215
209
|
use(middleware) {
|
|
216
210
|
this.middleware.push(middleware);
|
|
217
211
|
}
|
|
@@ -243,7 +237,6 @@ class MiddlewarePipeline {
|
|
|
243
237
|
}
|
|
244
238
|
}
|
|
245
239
|
}
|
|
246
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
247
240
|
getMiddleware() {
|
|
248
241
|
return [...this.middleware];
|
|
249
242
|
}
|
|
@@ -254,9 +247,9 @@ class MiddlewarePipeline {
|
|
|
254
247
|
class AsyncQueue {
|
|
255
248
|
constructor(concurrency = 1) {
|
|
256
249
|
this.concurrency = concurrency;
|
|
257
|
-
__publicField(this, "queue", []);
|
|
258
|
-
__publicField(this, "running", 0);
|
|
259
250
|
}
|
|
251
|
+
queue = [];
|
|
252
|
+
running = 0;
|
|
260
253
|
async add(operation) {
|
|
261
254
|
return new Promise((resolve, reject) => {
|
|
262
255
|
this.queue.push(async () => {
|
|
@@ -301,11 +294,11 @@ class AsyncQueue {
|
|
|
301
294
|
class CircuitBreaker {
|
|
302
295
|
constructor(config) {
|
|
303
296
|
this.config = config;
|
|
304
|
-
__publicField(this, "state", "closed");
|
|
305
|
-
__publicField(this, "failures", 0);
|
|
306
|
-
__publicField(this, "lastFailureTime", 0);
|
|
307
|
-
__publicField(this, "successes", 0);
|
|
308
297
|
}
|
|
298
|
+
state = "closed";
|
|
299
|
+
failures = 0;
|
|
300
|
+
lastFailureTime = 0;
|
|
301
|
+
successes = 0;
|
|
309
302
|
async execute(operation) {
|
|
310
303
|
if (this.state === "open") {
|
|
311
304
|
if (Date.now() - this.lastFailureTime > this.config.recoveryTimeout) {
|
|
@@ -328,7 +321,7 @@ class CircuitBreaker {
|
|
|
328
321
|
this.failures = 0;
|
|
329
322
|
if (this.state === "half-open") {
|
|
330
323
|
this.successes++;
|
|
331
|
-
if (this.successes >= (this.config.halfOpenMaxAttempts
|
|
324
|
+
if (this.successes >= (this.config.halfOpenMaxAttempts ?? 1)) {
|
|
332
325
|
this.state = "closed";
|
|
333
326
|
}
|
|
334
327
|
}
|
|
@@ -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":"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","names":[]}
|
|
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 // 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 * 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 () => {\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":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|