@metamask-previews/perps-controller 0.0.0-preview-e4aa1532 → 0.0.0-preview-6dfa4aeba
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/CHANGELOG.md +1 -11
- package/dist/PerpsController.cjs +66 -2224
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts +79 -933
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts +79 -933
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +64 -2221
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/index.cjs +1 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -19
- package/dist/__mocks__/hyperliquidMock.cjs +0 -68
- package/dist/__mocks__/hyperliquidMock.cjs.map +0 -1
- package/dist/__mocks__/hyperliquidMock.d.cts +0 -15
- package/dist/__mocks__/hyperliquidMock.d.cts.map +0 -1
- package/dist/__mocks__/hyperliquidMock.d.mts +0 -15
- package/dist/__mocks__/hyperliquidMock.d.mts.map +0 -1
- package/dist/__mocks__/hyperliquidMock.mjs +0 -65
- package/dist/__mocks__/hyperliquidMock.mjs.map +0 -1
- package/dist/__mocks__/providerMocks.cjs +0 -144
- package/dist/__mocks__/providerMocks.cjs.map +0 -1
- package/dist/__mocks__/providerMocks.d.cts +0 -44
- package/dist/__mocks__/providerMocks.d.cts.map +0 -1
- package/dist/__mocks__/providerMocks.d.mts +0 -44
- package/dist/__mocks__/providerMocks.d.mts.map +0 -1
- package/dist/__mocks__/providerMocks.mjs +0 -136
- package/dist/__mocks__/providerMocks.mjs.map +0 -1
- package/dist/__mocks__/serviceMocks.cjs +0 -187
- package/dist/__mocks__/serviceMocks.cjs.map +0 -1
- package/dist/__mocks__/serviceMocks.d.cts +0 -58
- package/dist/__mocks__/serviceMocks.d.cts.map +0 -1
- package/dist/__mocks__/serviceMocks.d.mts +0 -58
- package/dist/__mocks__/serviceMocks.d.mts.map +0 -1
- package/dist/__mocks__/serviceMocks.mjs +0 -180
- package/dist/__mocks__/serviceMocks.mjs.map +0 -1
- package/dist/aggregation/SubscriptionMultiplexer.cjs +0 -459
- package/dist/aggregation/SubscriptionMultiplexer.cjs.map +0 -1
- package/dist/aggregation/SubscriptionMultiplexer.d.cts +0 -222
- package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +0 -1
- package/dist/aggregation/SubscriptionMultiplexer.d.mts +0 -222
- package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +0 -1
- package/dist/aggregation/SubscriptionMultiplexer.mjs +0 -455
- package/dist/aggregation/SubscriptionMultiplexer.mjs.map +0 -1
- package/dist/aggregation/index.cjs +0 -9
- package/dist/aggregation/index.cjs.map +0 -1
- package/dist/aggregation/index.d.cts +0 -6
- package/dist/aggregation/index.d.cts.map +0 -1
- package/dist/aggregation/index.d.mts +0 -6
- package/dist/aggregation/index.d.mts.map +0 -1
- package/dist/aggregation/index.mjs +0 -5
- package/dist/aggregation/index.mjs.map +0 -1
- package/dist/constants/eventNames.cjs +0 -117
- package/dist/constants/eventNames.cjs.map +0 -1
- package/dist/constants/eventNames.d.cts +0 -106
- package/dist/constants/eventNames.d.cts.map +0 -1
- package/dist/constants/eventNames.d.mts +0 -106
- package/dist/constants/eventNames.d.mts.map +0 -1
- package/dist/constants/eventNames.mjs +0 -114
- package/dist/constants/eventNames.mjs.map +0 -1
- package/dist/constants/hyperLiquidConfig.cjs +0 -366
- package/dist/constants/hyperLiquidConfig.cjs.map +0 -1
- package/dist/constants/hyperLiquidConfig.d.cts +0 -276
- package/dist/constants/hyperLiquidConfig.d.cts.map +0 -1
- package/dist/constants/hyperLiquidConfig.d.mts +0 -276
- package/dist/constants/hyperLiquidConfig.d.mts.map +0 -1
- package/dist/constants/hyperLiquidConfig.mjs +0 -357
- package/dist/constants/hyperLiquidConfig.mjs.map +0 -1
- package/dist/constants/index.cjs +0 -23
- package/dist/constants/index.cjs.map +0 -1
- package/dist/constants/index.d.cts +0 -7
- package/dist/constants/index.d.cts.map +0 -1
- package/dist/constants/index.d.mts +0 -7
- package/dist/constants/index.d.mts.map +0 -1
- package/dist/constants/index.mjs +0 -7
- package/dist/constants/index.mjs.map +0 -1
- package/dist/constants/orderTypes.cjs +0 -31
- package/dist/constants/orderTypes.cjs.map +0 -1
- package/dist/constants/orderTypes.d.cts +0 -19
- package/dist/constants/orderTypes.d.cts.map +0 -1
- package/dist/constants/orderTypes.d.mts +0 -19
- package/dist/constants/orderTypes.d.mts.map +0 -1
- package/dist/constants/orderTypes.mjs +0 -27
- package/dist/constants/orderTypes.mjs.map +0 -1
- package/dist/constants/performanceMetrics.cjs +0 -61
- package/dist/constants/performanceMetrics.cjs.map +0 -1
- package/dist/constants/performanceMetrics.d.cts +0 -44
- package/dist/constants/performanceMetrics.d.cts.map +0 -1
- package/dist/constants/performanceMetrics.d.mts +0 -44
- package/dist/constants/performanceMetrics.d.mts.map +0 -1
- package/dist/constants/performanceMetrics.mjs +0 -58
- package/dist/constants/performanceMetrics.mjs.map +0 -1
- package/dist/constants/perpsConfig.cjs +0 -461
- package/dist/constants/perpsConfig.cjs.map +0 -1
- package/dist/constants/perpsConfig.d.cts +0 -343
- package/dist/constants/perpsConfig.d.cts.map +0 -1
- package/dist/constants/perpsConfig.d.mts +0 -343
- package/dist/constants/perpsConfig.d.mts.map +0 -1
- package/dist/constants/perpsConfig.mjs +0 -458
- package/dist/constants/perpsConfig.mjs.map +0 -1
- package/dist/constants/perpsErrorCodes.cjs +0 -79
- package/dist/constants/perpsErrorCodes.cjs.map +0 -1
- package/dist/constants/perpsErrorCodes.d.cts +0 -64
- package/dist/constants/perpsErrorCodes.d.cts.map +0 -1
- package/dist/constants/perpsErrorCodes.d.mts +0 -64
- package/dist/constants/perpsErrorCodes.d.mts.map +0 -1
- package/dist/constants/perpsErrorCodes.mjs +0 -76
- package/dist/constants/perpsErrorCodes.mjs.map +0 -1
- package/dist/platform-services/HyperLiquidClientService.cjs +0 -857
- package/dist/platform-services/HyperLiquidClientService.cjs.map +0 -1
- package/dist/platform-services/HyperLiquidClientService.d.cts +0 -263
- package/dist/platform-services/HyperLiquidClientService.d.cts.map +0 -1
- package/dist/platform-services/HyperLiquidClientService.d.mts +0 -263
- package/dist/platform-services/HyperLiquidClientService.d.mts.map +0 -1
- package/dist/platform-services/HyperLiquidClientService.mjs +0 -853
- package/dist/platform-services/HyperLiquidClientService.mjs.map +0 -1
- package/dist/platform-services/HyperLiquidSubscriptionService.cjs +0 -2170
- package/dist/platform-services/HyperLiquidSubscriptionService.cjs.map +0 -1
- package/dist/platform-services/HyperLiquidSubscriptionService.d.cts +0 -424
- package/dist/platform-services/HyperLiquidSubscriptionService.d.cts.map +0 -1
- package/dist/platform-services/HyperLiquidSubscriptionService.d.mts +0 -424
- package/dist/platform-services/HyperLiquidSubscriptionService.d.mts.map +0 -1
- package/dist/platform-services/HyperLiquidSubscriptionService.mjs +0 -2166
- package/dist/platform-services/HyperLiquidSubscriptionService.mjs.map +0 -1
- package/dist/platform-services/HyperLiquidWalletService.cjs +0 -140
- package/dist/platform-services/HyperLiquidWalletService.cjs.map +0 -1
- package/dist/platform-services/HyperLiquidWalletService.d.cts +0 -78
- package/dist/platform-services/HyperLiquidWalletService.d.cts.map +0 -1
- package/dist/platform-services/HyperLiquidWalletService.d.mts +0 -78
- package/dist/platform-services/HyperLiquidWalletService.d.mts.map +0 -1
- package/dist/platform-services/HyperLiquidWalletService.mjs +0 -136
- package/dist/platform-services/HyperLiquidWalletService.mjs.map +0 -1
- package/dist/providers/AggregatedPerpsProvider.cjs +0 -777
- package/dist/providers/AggregatedPerpsProvider.cjs.map +0 -1
- package/dist/providers/AggregatedPerpsProvider.d.cts +0 -466
- package/dist/providers/AggregatedPerpsProvider.d.cts.map +0 -1
- package/dist/providers/AggregatedPerpsProvider.d.mts +0 -466
- package/dist/providers/AggregatedPerpsProvider.d.mts.map +0 -1
- package/dist/providers/AggregatedPerpsProvider.mjs +0 -773
- package/dist/providers/AggregatedPerpsProvider.mjs.map +0 -1
- package/dist/providers/HyperLiquidProvider.cjs +0 -5172
- package/dist/providers/HyperLiquidProvider.cjs.map +0 -1
- package/dist/providers/HyperLiquidProvider.d.cts +0 -881
- package/dist/providers/HyperLiquidProvider.d.cts.map +0 -1
- package/dist/providers/HyperLiquidProvider.d.mts +0 -881
- package/dist/providers/HyperLiquidProvider.d.mts.map +0 -1
- package/dist/providers/HyperLiquidProvider.mjs +0 -5168
- package/dist/providers/HyperLiquidProvider.mjs.map +0 -1
- package/dist/providers/index.cjs +0 -11
- package/dist/providers/index.cjs.map +0 -1
- package/dist/providers/index.d.cts +0 -6
- package/dist/providers/index.d.cts.map +0 -1
- package/dist/providers/index.d.mts +0 -6
- package/dist/providers/index.d.mts.map +0 -1
- package/dist/providers/index.mjs +0 -6
- package/dist/providers/index.mjs.map +0 -1
- package/dist/routing/ProviderRouter.cjs +0 -148
- package/dist/routing/ProviderRouter.cjs.map +0 -1
- package/dist/routing/ProviderRouter.d.cts +0 -124
- package/dist/routing/ProviderRouter.d.cts.map +0 -1
- package/dist/routing/ProviderRouter.d.mts +0 -124
- package/dist/routing/ProviderRouter.d.mts.map +0 -1
- package/dist/routing/ProviderRouter.mjs +0 -144
- package/dist/routing/ProviderRouter.mjs.map +0 -1
- package/dist/routing/index.cjs +0 -9
- package/dist/routing/index.cjs.map +0 -1
- package/dist/routing/index.d.cts +0 -6
- package/dist/routing/index.d.cts.map +0 -1
- package/dist/routing/index.d.mts +0 -6
- package/dist/routing/index.d.mts.map +0 -1
- package/dist/routing/index.mjs +0 -5
- package/dist/routing/index.mjs.map +0 -1
- package/dist/selectors.cjs +0 -161
- package/dist/selectors.cjs.map +0 -1
- package/dist/selectors.d.cts +0 -345
- package/dist/selectors.d.cts.map +0 -1
- package/dist/selectors.d.mts +0 -345
- package/dist/selectors.d.mts.map +0 -1
- package/dist/selectors.mjs +0 -153
- package/dist/selectors.mjs.map +0 -1
- package/dist/services/AccountService.cjs +0 -313
- package/dist/services/AccountService.cjs.map +0 -1
- package/dist/services/AccountService.d.cts +0 -53
- package/dist/services/AccountService.d.cts.map +0 -1
- package/dist/services/AccountService.d.mts +0 -53
- package/dist/services/AccountService.d.mts.map +0 -1
- package/dist/services/AccountService.mjs +0 -309
- package/dist/services/AccountService.mjs.map +0 -1
- package/dist/services/DataLakeService.cjs +0 -219
- package/dist/services/DataLakeService.cjs.map +0 -1
- package/dist/services/DataLakeService.d.cts +0 -49
- package/dist/services/DataLakeService.d.cts.map +0 -1
- package/dist/services/DataLakeService.d.mts +0 -49
- package/dist/services/DataLakeService.d.mts.map +0 -1
- package/dist/services/DataLakeService.mjs +0 -215
- package/dist/services/DataLakeService.mjs.map +0 -1
- package/dist/services/DepositService.cjs +0 -96
- package/dist/services/DepositService.cjs.map +0 -1
- package/dist/services/DepositService.d.cts +0 -37
- package/dist/services/DepositService.d.cts.map +0 -1
- package/dist/services/DepositService.d.mts +0 -37
- package/dist/services/DepositService.d.mts.map +0 -1
- package/dist/services/DepositService.mjs +0 -92
- package/dist/services/DepositService.mjs.map +0 -1
- package/dist/services/EligibilityService.cjs +0 -156
- package/dist/services/EligibilityService.cjs.map +0 -1
- package/dist/services/EligibilityService.d.cts +0 -48
- package/dist/services/EligibilityService.d.cts.map +0 -1
- package/dist/services/EligibilityService.d.mts +0 -48
- package/dist/services/EligibilityService.d.mts.map +0 -1
- package/dist/services/EligibilityService.mjs +0 -152
- package/dist/services/EligibilityService.mjs.map +0 -1
- package/dist/services/FeatureFlagConfigurationService.cjs +0 -258
- package/dist/services/FeatureFlagConfigurationService.cjs.map +0 -1
- package/dist/services/FeatureFlagConfigurationService.d.cts +0 -100
- package/dist/services/FeatureFlagConfigurationService.d.cts.map +0 -1
- package/dist/services/FeatureFlagConfigurationService.d.mts +0 -100
- package/dist/services/FeatureFlagConfigurationService.d.mts.map +0 -1
- package/dist/services/FeatureFlagConfigurationService.mjs +0 -254
- package/dist/services/FeatureFlagConfigurationService.mjs.map +0 -1
- package/dist/services/MarketDataService.cjs +0 -875
- package/dist/services/MarketDataService.cjs.map +0 -1
- package/dist/services/MarketDataService.d.cts +0 -289
- package/dist/services/MarketDataService.d.cts.map +0 -1
- package/dist/services/MarketDataService.d.mts +0 -289
- package/dist/services/MarketDataService.d.mts.map +0 -1
- package/dist/services/MarketDataService.mjs +0 -871
- package/dist/services/MarketDataService.mjs.map +0 -1
- package/dist/services/RewardsIntegrationService.cjs +0 -94
- package/dist/services/RewardsIntegrationService.cjs.map +0 -1
- package/dist/services/RewardsIntegrationService.d.cts +0 -30
- package/dist/services/RewardsIntegrationService.d.cts.map +0 -1
- package/dist/services/RewardsIntegrationService.d.mts +0 -30
- package/dist/services/RewardsIntegrationService.d.mts.map +0 -1
- package/dist/services/RewardsIntegrationService.mjs +0 -90
- package/dist/services/RewardsIntegrationService.mjs.map +0 -1
- package/dist/services/ServiceContext.cjs +0 -3
- package/dist/services/ServiceContext.cjs.map +0 -1
- package/dist/services/ServiceContext.d.cts +0 -110
- package/dist/services/ServiceContext.d.cts.map +0 -1
- package/dist/services/ServiceContext.d.mts +0 -110
- package/dist/services/ServiceContext.d.mts.map +0 -1
- package/dist/services/ServiceContext.mjs +0 -2
- package/dist/services/ServiceContext.mjs.map +0 -1
- package/dist/services/TradingService.cjs +0 -1481
- package/dist/services/TradingService.cjs.map +0 -1
- package/dist/services/TradingService.d.cts +0 -308
- package/dist/services/TradingService.d.cts.map +0 -1
- package/dist/services/TradingService.d.mts +0 -308
- package/dist/services/TradingService.d.mts.map +0 -1
- package/dist/services/TradingService.mjs +0 -1477
- package/dist/services/TradingService.mjs.map +0 -1
- package/dist/services/index.cjs +0 -26
- package/dist/services/index.cjs.map +0 -1
- package/dist/services/index.d.cts +0 -11
- package/dist/services/index.d.cts.map +0 -1
- package/dist/services/index.d.mts +0 -11
- package/dist/services/index.d.mts.map +0 -1
- package/dist/services/index.mjs +0 -10
- package/dist/services/index.mjs.map +0 -1
- package/dist/services/utils.cjs +0 -16
- package/dist/services/utils.cjs.map +0 -1
- package/dist/services/utils.d.cts +0 -8
- package/dist/services/utils.d.cts.map +0 -1
- package/dist/services/utils.d.mts +0 -8
- package/dist/services/utils.d.mts.map +0 -1
- package/dist/services/utils.mjs +0 -12
- package/dist/services/utils.mjs.map +0 -1
- package/dist/types/chart.cjs +0 -42
- package/dist/types/chart.cjs.map +0 -1
- package/dist/types/chart.d.cts +0 -62
- package/dist/types/chart.d.cts.map +0 -1
- package/dist/types/chart.d.mts +0 -62
- package/dist/types/chart.d.mts.map +0 -1
- package/dist/types/chart.mjs +0 -39
- package/dist/types/chart.mjs.map +0 -1
- package/dist/types/hyperliquid-types.cjs +0 -3
- package/dist/types/hyperliquid-types.cjs.map +0 -1
- package/dist/types/hyperliquid-types.d.cts +0 -52
- package/dist/types/hyperliquid-types.d.cts.map +0 -1
- package/dist/types/hyperliquid-types.d.mts +0 -52
- package/dist/types/hyperliquid-types.d.mts.map +0 -1
- package/dist/types/hyperliquid-types.mjs +0 -2
- package/dist/types/hyperliquid-types.mjs.map +0 -1
- package/dist/types/index.cjs +0 -96
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.d.cts +0 -1153
- package/dist/types/index.d.cts.map +0 -1
- package/dist/types/index.d.mts +0 -1153
- package/dist/types/index.d.mts.map +0 -1
- package/dist/types/index.mjs +0 -79
- package/dist/types/index.mjs.map +0 -1
- package/dist/types/transactionTypes.cjs +0 -28
- package/dist/types/transactionTypes.cjs.map +0 -1
- package/dist/types/transactionTypes.d.cts +0 -64
- package/dist/types/transactionTypes.d.cts.map +0 -1
- package/dist/types/transactionTypes.d.mts +0 -64
- package/dist/types/transactionTypes.d.mts.map +0 -1
- package/dist/types/transactionTypes.mjs +0 -23
- package/dist/types/transactionTypes.mjs.map +0 -1
- package/dist/utils/accountUtils.cjs +0 -65
- package/dist/utils/accountUtils.cjs.map +0 -1
- package/dist/utils/accountUtils.d.cts +0 -26
- package/dist/utils/accountUtils.d.cts.map +0 -1
- package/dist/utils/accountUtils.d.mts +0 -26
- package/dist/utils/accountUtils.d.mts.map +0 -1
- package/dist/utils/accountUtils.mjs +0 -61
- package/dist/utils/accountUtils.mjs.map +0 -1
- package/dist/utils/amountConversion.cjs +0 -61
- package/dist/utils/amountConversion.cjs.map +0 -1
- package/dist/utils/amountConversion.d.cts +0 -16
- package/dist/utils/amountConversion.d.cts.map +0 -1
- package/dist/utils/amountConversion.d.mts +0 -16
- package/dist/utils/amountConversion.d.mts.map +0 -1
- package/dist/utils/amountConversion.mjs +0 -54
- package/dist/utils/amountConversion.mjs.map +0 -1
- package/dist/utils/chartUtils.cjs +0 -98
- package/dist/utils/chartUtils.cjs.map +0 -1
- package/dist/utils/chartUtils.d.cts +0 -14
- package/dist/utils/chartUtils.d.cts.map +0 -1
- package/dist/utils/chartUtils.d.mts +0 -14
- package/dist/utils/chartUtils.d.mts.map +0 -1
- package/dist/utils/chartUtils.mjs +0 -94
- package/dist/utils/chartUtils.mjs.map +0 -1
- package/dist/utils/errorUtils.cjs +0 -22
- package/dist/utils/errorUtils.cjs.map +0 -1
- package/dist/utils/errorUtils.d.cts +0 -13
- package/dist/utils/errorUtils.d.cts.map +0 -1
- package/dist/utils/errorUtils.d.mts +0 -13
- package/dist/utils/errorUtils.d.mts.map +0 -1
- package/dist/utils/errorUtils.mjs +0 -18
- package/dist/utils/errorUtils.mjs.map +0 -1
- package/dist/utils/formatUtils.cjs +0 -987
- package/dist/utils/formatUtils.cjs.map +0 -1
- package/dist/utils/formatUtils.d.cts +0 -387
- package/dist/utils/formatUtils.d.cts.map +0 -1
- package/dist/utils/formatUtils.d.mts +0 -387
- package/dist/utils/formatUtils.d.mts.map +0 -1
- package/dist/utils/formatUtils.mjs +0 -966
- package/dist/utils/formatUtils.mjs.map +0 -1
- package/dist/utils/hyperLiquidAdapter.cjs +0 -454
- package/dist/utils/hyperLiquidAdapter.cjs.map +0 -1
- package/dist/utils/hyperLiquidAdapter.d.cts +0 -158
- package/dist/utils/hyperLiquidAdapter.d.cts.map +0 -1
- package/dist/utils/hyperLiquidAdapter.d.mts +0 -158
- package/dist/utils/hyperLiquidAdapter.d.mts.map +0 -1
- package/dist/utils/hyperLiquidAdapter.mjs +0 -439
- package/dist/utils/hyperLiquidAdapter.mjs.map +0 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs +0 -89
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +0 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +0 -58
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +0 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +0 -58
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +0 -1
- package/dist/utils/hyperLiquidOrderBookProcessor.mjs +0 -84
- package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +0 -1
- package/dist/utils/hyperLiquidValidation.cjs +0 -426
- package/dist/utils/hyperLiquidValidation.cjs.map +0 -1
- package/dist/utils/hyperLiquidValidation.d.cts +0 -143
- package/dist/utils/hyperLiquidValidation.d.cts.map +0 -1
- package/dist/utils/hyperLiquidValidation.d.mts +0 -143
- package/dist/utils/hyperLiquidValidation.d.mts.map +0 -1
- package/dist/utils/hyperLiquidValidation.mjs +0 -413
- package/dist/utils/hyperLiquidValidation.mjs.map +0 -1
- package/dist/utils/idUtils.cjs +0 -50
- package/dist/utils/idUtils.cjs.map +0 -1
- package/dist/utils/idUtils.d.cts +0 -38
- package/dist/utils/idUtils.d.cts.map +0 -1
- package/dist/utils/idUtils.d.mts +0 -38
- package/dist/utils/idUtils.d.mts.map +0 -1
- package/dist/utils/idUtils.mjs +0 -42
- package/dist/utils/idUtils.mjs.map +0 -1
- package/dist/utils/marginUtils.cjs +0 -137
- package/dist/utils/marginUtils.cjs.map +0 -1
- package/dist/utils/marginUtils.d.cts +0 -64
- package/dist/utils/marginUtils.d.cts.map +0 -1
- package/dist/utils/marginUtils.d.mts +0 -64
- package/dist/utils/marginUtils.d.mts.map +0 -1
- package/dist/utils/marginUtils.mjs +0 -131
- package/dist/utils/marginUtils.mjs.map +0 -1
- package/dist/utils/marketDataTransform.cjs +0 -227
- package/dist/utils/marketDataTransform.cjs.map +0 -1
- package/dist/utils/marketDataTransform.d.cts +0 -45
- package/dist/utils/marketDataTransform.d.cts.map +0 -1
- package/dist/utils/marketDataTransform.d.mts +0 -45
- package/dist/utils/marketDataTransform.d.mts.map +0 -1
- package/dist/utils/marketDataTransform.mjs +0 -220
- package/dist/utils/marketDataTransform.mjs.map +0 -1
- package/dist/utils/marketUtils.cjs +0 -420
- package/dist/utils/marketUtils.cjs.map +0 -1
- package/dist/utils/marketUtils.d.cts +0 -227
- package/dist/utils/marketUtils.d.cts.map +0 -1
- package/dist/utils/marketUtils.d.mts +0 -227
- package/dist/utils/marketUtils.d.mts.map +0 -1
- package/dist/utils/marketUtils.mjs +0 -404
- package/dist/utils/marketUtils.mjs.map +0 -1
- package/dist/utils/orderBookGrouping.cjs +0 -151
- package/dist/utils/orderBookGrouping.cjs.map +0 -1
- package/dist/utils/orderBookGrouping.d.cts +0 -76
- package/dist/utils/orderBookGrouping.d.cts.map +0 -1
- package/dist/utils/orderBookGrouping.d.mts +0 -76
- package/dist/utils/orderBookGrouping.d.mts.map +0 -1
- package/dist/utils/orderBookGrouping.mjs +0 -143
- package/dist/utils/orderBookGrouping.mjs.map +0 -1
- package/dist/utils/orderCalculations.cjs +0 -283
- package/dist/utils/orderCalculations.cjs.map +0 -1
- package/dist/utils/orderCalculations.d.cts +0 -107
- package/dist/utils/orderCalculations.d.cts.map +0 -1
- package/dist/utils/orderCalculations.d.mts +0 -107
- package/dist/utils/orderCalculations.d.mts.map +0 -1
- package/dist/utils/orderCalculations.mjs +0 -274
- package/dist/utils/orderCalculations.mjs.map +0 -1
- package/dist/utils/orderUtils.cjs +0 -159
- package/dist/utils/orderUtils.cjs.map +0 -1
- package/dist/utils/orderUtils.d.cts +0 -66
- package/dist/utils/orderUtils.d.cts.map +0 -1
- package/dist/utils/orderUtils.d.mts +0 -66
- package/dist/utils/orderUtils.d.mts.map +0 -1
- package/dist/utils/orderUtils.mjs +0 -151
- package/dist/utils/orderUtils.mjs.map +0 -1
- package/dist/utils/pnlCalculations.cjs +0 -107
- package/dist/utils/pnlCalculations.cjs.map +0 -1
- package/dist/utils/pnlCalculations.d.cts +0 -79
- package/dist/utils/pnlCalculations.d.cts.map +0 -1
- package/dist/utils/pnlCalculations.d.mts +0 -79
- package/dist/utils/pnlCalculations.d.mts.map +0 -1
- package/dist/utils/pnlCalculations.mjs +0 -97
- package/dist/utils/pnlCalculations.mjs.map +0 -1
- package/dist/utils/positionCalculations.cjs +0 -176
- package/dist/utils/positionCalculations.cjs.map +0 -1
- package/dist/utils/positionCalculations.d.cts +0 -85
- package/dist/utils/positionCalculations.d.cts.map +0 -1
- package/dist/utils/positionCalculations.d.mts +0 -85
- package/dist/utils/positionCalculations.d.mts.map +0 -1
- package/dist/utils/positionCalculations.mjs +0 -165
- package/dist/utils/positionCalculations.mjs.map +0 -1
- package/dist/utils/sortMarkets.cjs +0 -88
- package/dist/utils/sortMarkets.cjs.map +0 -1
- package/dist/utils/sortMarkets.d.cts +0 -21
- package/dist/utils/sortMarkets.d.cts.map +0 -1
- package/dist/utils/sortMarkets.d.mts +0 -21
- package/dist/utils/sortMarkets.d.mts.map +0 -1
- package/dist/utils/sortMarkets.mjs +0 -84
- package/dist/utils/sortMarkets.mjs.map +0 -1
- package/dist/utils/standaloneInfoClient.cjs +0 -34
- package/dist/utils/standaloneInfoClient.cjs.map +0 -1
- package/dist/utils/standaloneInfoClient.d.cts +0 -31
- package/dist/utils/standaloneInfoClient.d.cts.map +0 -1
- package/dist/utils/standaloneInfoClient.d.mts +0 -31
- package/dist/utils/standaloneInfoClient.d.mts.map +0 -1
- package/dist/utils/standaloneInfoClient.mjs +0 -30
- package/dist/utils/standaloneInfoClient.mjs.map +0 -1
- package/dist/utils/stringParseUtils.cjs +0 -49
- package/dist/utils/stringParseUtils.cjs.map +0 -1
- package/dist/utils/stringParseUtils.d.cts +0 -35
- package/dist/utils/stringParseUtils.d.cts.map +0 -1
- package/dist/utils/stringParseUtils.d.mts +0 -35
- package/dist/utils/stringParseUtils.d.mts.map +0 -1
- package/dist/utils/stringParseUtils.mjs +0 -44
- package/dist/utils/stringParseUtils.mjs.map +0 -1
- package/dist/utils/time.cjs +0 -37
- package/dist/utils/time.cjs.map +0 -1
- package/dist/utils/time.d.cts +0 -17
- package/dist/utils/time.d.cts.map +0 -1
- package/dist/utils/time.d.mts +0 -17
- package/dist/utils/time.d.mts.map +0 -1
- package/dist/utils/time.mjs +0 -33
- package/dist/utils/time.mjs.map +0 -1
- package/dist/utils/tpslValidation.cjs +0 -505
- package/dist/utils/tpslValidation.cjs.map +0 -1
- package/dist/utils/tpslValidation.d.cts +0 -182
- package/dist/utils/tpslValidation.d.cts.map +0 -1
- package/dist/utils/tpslValidation.d.mts +0 -182
- package/dist/utils/tpslValidation.d.mts.map +0 -1
- package/dist/utils/tpslValidation.mjs +0 -482
- package/dist/utils/tpslValidation.mjs.map +0 -1
- package/dist/utils/transactionUtils.cjs +0 -36
- package/dist/utils/transactionUtils.cjs.map +0 -1
- package/dist/utils/transactionUtils.d.cts +0 -17
- package/dist/utils/transactionUtils.d.cts.map +0 -1
- package/dist/utils/transactionUtils.d.mts +0 -17
- package/dist/utils/transactionUtils.d.mts.map +0 -1
- package/dist/utils/transactionUtils.mjs +0 -32
- package/dist/utils/transactionUtils.mjs.map +0 -1
- package/dist/utils/wait.cjs +0 -12
- package/dist/utils/wait.cjs.map +0 -1
- package/dist/utils/wait.d.cts +0 -8
- package/dist/utils/wait.d.cts.map +0 -1
- package/dist/utils/wait.d.mts +0 -8
- package/dist/utils/wait.d.mts.map +0 -1
- package/dist/utils/wait.mjs +0 -8
- package/dist/utils/wait.mjs.map +0 -1
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FeatureFlagConfigurationService = void 0;
|
|
4
|
-
/* eslint-disable id-denylist, no-restricted-syntax, no-negated-condition */
|
|
5
|
-
// TODO: Fix ESLint errors in this file - tracked for Phase 5 cleanup
|
|
6
|
-
const utils_1 = require("@metamask/utils");
|
|
7
|
-
const stringParseUtils_1 = require("../utils/stringParseUtils.cjs");
|
|
8
|
-
/**
|
|
9
|
-
* Check if a value is a valid version gated feature flag.
|
|
10
|
-
*
|
|
11
|
-
* @param flag - The value to check
|
|
12
|
-
* @returns True if the value has a boolean 'value' property
|
|
13
|
-
*/
|
|
14
|
-
function isVersionGatedFeatureFlag(flag) {
|
|
15
|
-
return (typeof flag === 'object' &&
|
|
16
|
-
flag !== null &&
|
|
17
|
-
'value' in flag &&
|
|
18
|
-
typeof flag.value === 'boolean');
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Extract the boolean value from a version gated feature flag.
|
|
22
|
-
*
|
|
23
|
-
* @param flag - The version gated feature flag
|
|
24
|
-
* @returns The boolean value or undefined if invalid
|
|
25
|
-
*/
|
|
26
|
-
function validatedVersionGatedFeatureFlag(flag) {
|
|
27
|
-
return flag.value;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* FeatureFlagConfigurationService
|
|
31
|
-
*
|
|
32
|
-
* Handles HIP-3 configuration and geo-blocking configuration from remote feature flags.
|
|
33
|
-
* Implements "sticky remote" pattern: once remote config is loaded, never downgrade to fallback.
|
|
34
|
-
* Orchestrates validation, change detection, and version management for feature flag updates.
|
|
35
|
-
*
|
|
36
|
-
* Responsibilities:
|
|
37
|
-
* - Remote feature flag validation and parsing
|
|
38
|
-
* - HIP-3 configuration management (equity, allowlist, blocklist)
|
|
39
|
-
* - Geo-blocking configuration from remote flags
|
|
40
|
-
* - Change detection and version management
|
|
41
|
-
* - "Sticky remote" pattern enforcement (never downgrade)
|
|
42
|
-
*
|
|
43
|
-
* Instance-based service with constructor injection of platform dependencies.
|
|
44
|
-
*/
|
|
45
|
-
class FeatureFlagConfigurationService {
|
|
46
|
-
/**
|
|
47
|
-
* Create a new FeatureFlagConfigurationService instance.
|
|
48
|
-
*
|
|
49
|
-
* @param deps - Platform dependencies for logging, metrics, etc.
|
|
50
|
-
*/
|
|
51
|
-
constructor(deps) {
|
|
52
|
-
this.deps = deps;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Validate and parse market list from remote feature flags.
|
|
56
|
-
* Handles both string (comma-separated) and array formats from LaunchDarkly.
|
|
57
|
-
*
|
|
58
|
-
* @param remoteValue - The raw value from remote feature flags
|
|
59
|
-
* @param fieldName - The name of the field for logging
|
|
60
|
-
* @param currentValue - The current value to use as fallback
|
|
61
|
-
* @returns The validated market list or undefined if validation fails
|
|
62
|
-
*/
|
|
63
|
-
validateMarketList(remoteValue, fieldName, currentValue) {
|
|
64
|
-
this.deps.debugLogger.log(`PerpsController: HIP-3 ${fieldName} validation`, {
|
|
65
|
-
remoteValue,
|
|
66
|
-
type: typeof remoteValue,
|
|
67
|
-
isArray: Array.isArray(remoteValue),
|
|
68
|
-
});
|
|
69
|
-
// LaunchDarkly returns comma-separated strings for list values
|
|
70
|
-
// Values may have literal quotes (e.g., '"xyz"') due to JSON encoding quirks
|
|
71
|
-
if (typeof remoteValue === 'string') {
|
|
72
|
-
const parsed = (0, stringParseUtils_1.parseCommaSeparatedString)(remoteValue).map(stringParseUtils_1.stripQuotes);
|
|
73
|
-
if (parsed.length > 0) {
|
|
74
|
-
this.deps.debugLogger.log(`PerpsController: HIP-3 ${fieldName} validated from string`, { validatedMarkets: parsed });
|
|
75
|
-
return parsed;
|
|
76
|
-
}
|
|
77
|
-
this.deps.debugLogger.log(`PerpsController: HIP-3 ${fieldName} string was empty after parsing`, { fallbackValue: currentValue });
|
|
78
|
-
return undefined;
|
|
79
|
-
}
|
|
80
|
-
// Fallback: Validate array of non-empty strings
|
|
81
|
-
if (Array.isArray(remoteValue) &&
|
|
82
|
-
remoteValue.every((item) => typeof item === 'string' && item.length > 0)) {
|
|
83
|
-
const validatedMarkets = remoteValue
|
|
84
|
-
.map((market) => (0, stringParseUtils_1.stripQuotes)(market.trim()))
|
|
85
|
-
.filter((market) => market.length > 0);
|
|
86
|
-
this.deps.debugLogger.log(`PerpsController: HIP-3 ${fieldName} validated from array`, { validatedMarkets });
|
|
87
|
-
return validatedMarkets;
|
|
88
|
-
}
|
|
89
|
-
this.deps.debugLogger.log(`PerpsController: HIP-3 ${fieldName} validation FAILED - falling back to local config`, {
|
|
90
|
-
reason: Array.isArray(remoteValue)
|
|
91
|
-
? 'Array contains non-string or empty values'
|
|
92
|
-
: 'Invalid type (expected string or array)',
|
|
93
|
-
fallbackValue: currentValue,
|
|
94
|
-
});
|
|
95
|
-
return undefined;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Check if arrays have different values (order-independent comparison).
|
|
99
|
-
*
|
|
100
|
-
* @param a - First array
|
|
101
|
-
* @param b - Second array
|
|
102
|
-
* @returns True if arrays have different values
|
|
103
|
-
*/
|
|
104
|
-
arraysHaveDifferentValues(a, b) {
|
|
105
|
-
return (JSON.stringify([...a].sort((itemA, itemB) => itemA.localeCompare(itemB))) !==
|
|
106
|
-
JSON.stringify([...b].sort((itemA, itemB) => itemA.localeCompare(itemB))));
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Refresh HIP-3 configuration when remote feature flags change.
|
|
110
|
-
* This method extracts HIP-3 settings from remote flags, validates them,
|
|
111
|
-
* and updates internal state if they differ from current values.
|
|
112
|
-
* When config changes, increments hip3ConfigVersion to trigger ConnectionManager reconnection.
|
|
113
|
-
*
|
|
114
|
-
* Follows the "sticky remote" pattern: once remote config is loaded, never downgrade to fallback.
|
|
115
|
-
*
|
|
116
|
-
* @param options - Configuration object
|
|
117
|
-
* @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController
|
|
118
|
-
* @param options.context - ServiceContext providing state access callbacks
|
|
119
|
-
*/
|
|
120
|
-
refreshHip3Config(options) {
|
|
121
|
-
const { remoteFeatureFlagControllerState, context } = options;
|
|
122
|
-
if (!context.getHip3Config ||
|
|
123
|
-
!context.setHip3Config ||
|
|
124
|
-
!context.incrementHip3ConfigVersion) {
|
|
125
|
-
throw new Error('Required HIP-3 callbacks not available in ServiceContext');
|
|
126
|
-
}
|
|
127
|
-
const remoteFlags = remoteFeatureFlagControllerState.remoteFeatureFlags;
|
|
128
|
-
const currentConfig = context.getHip3Config();
|
|
129
|
-
// Extract and validate remote HIP-3 equity enabled flag
|
|
130
|
-
const equityFlag = remoteFlags?.perpsHip3Enabled;
|
|
131
|
-
// Use type guard to validate before calling - validatedVersionGatedFeatureFlag also
|
|
132
|
-
// handles invalid flags internally, but proper typing requires the guard
|
|
133
|
-
const validatedEquity = isVersionGatedFeatureFlag(equityFlag)
|
|
134
|
-
? validatedVersionGatedFeatureFlag(equityFlag)
|
|
135
|
-
: undefined;
|
|
136
|
-
this.deps.debugLogger.log('PerpsController: HIP-3 equity flag validation', {
|
|
137
|
-
equityFlag,
|
|
138
|
-
validatedEquity,
|
|
139
|
-
willUse: validatedEquity !== undefined ? 'remote' : 'fallback',
|
|
140
|
-
});
|
|
141
|
-
// Extract and validate remote HIP-3 market lists
|
|
142
|
-
const validatedAllowlistMarkets = (0, utils_1.hasProperty)(remoteFlags, 'perpsHip3AllowlistMarkets')
|
|
143
|
-
? this.validateMarketList(remoteFlags.perpsHip3AllowlistMarkets, 'allowlistMarkets', currentConfig.allowlistMarkets)
|
|
144
|
-
: undefined;
|
|
145
|
-
const validatedBlocklistMarkets = (0, utils_1.hasProperty)(remoteFlags, 'perpsHip3BlocklistMarkets')
|
|
146
|
-
? this.validateMarketList(remoteFlags.perpsHip3BlocklistMarkets, 'blocklistMarkets', currentConfig.blocklistMarkets)
|
|
147
|
-
: undefined;
|
|
148
|
-
// Detect changes (only if we have valid remote values)
|
|
149
|
-
const equityChanged = validatedEquity !== undefined &&
|
|
150
|
-
validatedEquity !== currentConfig.enabled;
|
|
151
|
-
const allowlistMarketsChanged = validatedAllowlistMarkets !== undefined &&
|
|
152
|
-
this.arraysHaveDifferentValues(validatedAllowlistMarkets, currentConfig.allowlistMarkets);
|
|
153
|
-
const blocklistMarketsChanged = validatedBlocklistMarkets !== undefined &&
|
|
154
|
-
this.arraysHaveDifferentValues(validatedBlocklistMarkets, currentConfig.blocklistMarkets);
|
|
155
|
-
if (equityChanged || allowlistMarketsChanged || blocklistMarketsChanged) {
|
|
156
|
-
this.deps.debugLogger.log('PerpsController: HIP-3 config changed via remote feature flags', {
|
|
157
|
-
equityChanged,
|
|
158
|
-
allowlistMarketsChanged,
|
|
159
|
-
blocklistMarketsChanged,
|
|
160
|
-
oldEquity: currentConfig.enabled,
|
|
161
|
-
newEquity: validatedEquity,
|
|
162
|
-
oldAllowlistMarkets: currentConfig.allowlistMarkets,
|
|
163
|
-
newAllowlistMarkets: validatedAllowlistMarkets,
|
|
164
|
-
oldBlocklistMarkets: currentConfig.blocklistMarkets,
|
|
165
|
-
newBlocklistMarkets: validatedBlocklistMarkets,
|
|
166
|
-
source: 'remote',
|
|
167
|
-
});
|
|
168
|
-
// Update internal state (sticky remote - never downgrade)
|
|
169
|
-
context.setHip3Config({
|
|
170
|
-
enabled: validatedEquity,
|
|
171
|
-
allowlistMarkets: validatedAllowlistMarkets
|
|
172
|
-
? [...validatedAllowlistMarkets]
|
|
173
|
-
: undefined,
|
|
174
|
-
blocklistMarkets: validatedBlocklistMarkets
|
|
175
|
-
? [...validatedBlocklistMarkets]
|
|
176
|
-
: undefined,
|
|
177
|
-
source: 'remote',
|
|
178
|
-
});
|
|
179
|
-
// Increment version to trigger ConnectionManager reconnection and cache clearing
|
|
180
|
-
const newVersion = context.incrementHip3ConfigVersion();
|
|
181
|
-
this.deps.debugLogger.log('PerpsController: Incremented hip3ConfigVersion to trigger reconnection', {
|
|
182
|
-
newVersion,
|
|
183
|
-
newHip3Enabled: validatedEquity ?? currentConfig.enabled,
|
|
184
|
-
newHip3AllowlistMarkets: validatedAllowlistMarkets ?? currentConfig.allowlistMarkets,
|
|
185
|
-
newHip3BlocklistMarkets: validatedBlocklistMarkets ?? currentConfig.blocklistMarkets,
|
|
186
|
-
});
|
|
187
|
-
// Note: ConnectionManager will handle:
|
|
188
|
-
// 1. Detecting hip3ConfigVersion change via Redux monitoring
|
|
189
|
-
// 2. Clearing all StreamManager caches
|
|
190
|
-
// 3. Calling reconnectWithNewContext() -> initializeProviders()
|
|
191
|
-
// 4. Provider reinitialization will read the new HIP-3 config below
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Respond to RemoteFeatureFlagController state changes.
|
|
196
|
-
* Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.
|
|
197
|
-
* Uses fallback configuration when remote feature flag is undefined.
|
|
198
|
-
* Note: Initial eligibility is set in the constructor if fallback regions are provided.
|
|
199
|
-
*
|
|
200
|
-
* @param options - Configuration object
|
|
201
|
-
* @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController
|
|
202
|
-
* @param options.context - ServiceContext providing callbacks
|
|
203
|
-
*/
|
|
204
|
-
refreshEligibility(options) {
|
|
205
|
-
const { remoteFeatureFlagControllerState, context } = options;
|
|
206
|
-
const perpsGeoBlockedRegionsFeatureFlag =
|
|
207
|
-
// NOTE: Do not use perpsPerpTradingGeoBlockedCountries as it is deprecated.
|
|
208
|
-
remoteFeatureFlagControllerState.remoteFeatureFlags
|
|
209
|
-
?.perpsPerpTradingGeoBlockedCountriesV2;
|
|
210
|
-
const remoteBlockedRegions = perpsGeoBlockedRegionsFeatureFlag?.blockedRegions;
|
|
211
|
-
if (Array.isArray(remoteBlockedRegions)) {
|
|
212
|
-
this.setBlockedRegions({
|
|
213
|
-
list: remoteBlockedRegions,
|
|
214
|
-
source: 'remote',
|
|
215
|
-
context,
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
// Also check for HIP-3 config changes
|
|
219
|
-
this.refreshHip3Config({ remoteFeatureFlagControllerState, context });
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Set blocked region list with "never downgrade" pattern enforcement.
|
|
223
|
-
* Updates the blocked region list and triggers eligibility refresh.
|
|
224
|
-
* Implements "sticky remote": once remote regions are set, never downgrade to fallback.
|
|
225
|
-
*
|
|
226
|
-
* @param options - Configuration object
|
|
227
|
-
* @param options.list - Array of blocked region codes
|
|
228
|
-
* @param options.source - Source of the list ('remote' or 'fallback')
|
|
229
|
-
* @param options.context - ServiceContext providing callbacks
|
|
230
|
-
*/
|
|
231
|
-
setBlockedRegions(options) {
|
|
232
|
-
const { list, source, context } = options;
|
|
233
|
-
if (!context.getBlockedRegionList ||
|
|
234
|
-
!context.setBlockedRegionList ||
|
|
235
|
-
!context.refreshEligibility) {
|
|
236
|
-
throw new Error('Required blocked region callbacks not available in ServiceContext');
|
|
237
|
-
}
|
|
238
|
-
const currentList = context.getBlockedRegionList();
|
|
239
|
-
// Never downgrade from remote to fallback
|
|
240
|
-
if (source === 'fallback' && currentList.source === 'remote') {
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
if (Array.isArray(list)) {
|
|
244
|
-
context.setBlockedRegionList(list, source);
|
|
245
|
-
}
|
|
246
|
-
context.refreshEligibility().catch((err) => {
|
|
247
|
-
const error = err instanceof Error ? err : new Error(String(err));
|
|
248
|
-
this.deps.logger.error(error, {
|
|
249
|
-
context: {
|
|
250
|
-
name: 'FeatureFlagConfigurationService.setBlockedRegions',
|
|
251
|
-
data: { source },
|
|
252
|
-
},
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
exports.FeatureFlagConfigurationService = FeatureFlagConfigurationService;
|
|
258
|
-
//# sourceMappingURL=FeatureFlagConfigurationService.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFlagConfigurationService.cjs","sourceRoot":"","sources":["../../src/services/FeatureFlagConfigurationService.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable id-denylist, no-restricted-syntax, no-negated-condition */\n// TODO: Fix ESLint errors in this file - tracked for Phase 5 cleanup\nimport { hasProperty } from '@metamask/utils';\n\nimport type { ServiceContext } from './ServiceContext';\nimport type { PerpsPlatformDependencies } from '../types';\nimport {\n parseCommaSeparatedString,\n stripQuotes,\n} from '../utils/stringParseUtils';\n\n/**\n * Remote feature flags state shape for perps-related flags.\n * This is a minimal type definition to avoid direct dependency on\n * RemoteFeatureFlagController which can cause build issues.\n */\ntype RemoteFeatureFlagState = {\n remoteFeatureFlags: Record<string, unknown>;\n};\n\n/**\n * Version gated feature flag structure for validating remote flags.\n */\ntype VersionGatedFeatureFlag = {\n value?: boolean;\n};\n\n/**\n * Check if a value is a valid version gated feature flag.\n *\n * @param flag - The value to check\n * @returns True if the value has a boolean 'value' property\n */\nfunction isVersionGatedFeatureFlag(\n flag: unknown,\n): flag is VersionGatedFeatureFlag {\n return (\n typeof flag === 'object' &&\n flag !== null &&\n 'value' in flag &&\n typeof (flag as VersionGatedFeatureFlag).value === 'boolean'\n );\n}\n\n/**\n * Extract the boolean value from a version gated feature flag.\n *\n * @param flag - The version gated feature flag\n * @returns The boolean value or undefined if invalid\n */\nfunction validatedVersionGatedFeatureFlag(\n flag: VersionGatedFeatureFlag,\n): boolean | undefined {\n return flag.value;\n}\n\n/**\n * FeatureFlagConfigurationService\n *\n * Handles HIP-3 configuration and geo-blocking configuration from remote feature flags.\n * Implements \"sticky remote\" pattern: once remote config is loaded, never downgrade to fallback.\n * Orchestrates validation, change detection, and version management for feature flag updates.\n *\n * Responsibilities:\n * - Remote feature flag validation and parsing\n * - HIP-3 configuration management (equity, allowlist, blocklist)\n * - Geo-blocking configuration from remote flags\n * - Change detection and version management\n * - \"Sticky remote\" pattern enforcement (never downgrade)\n *\n * Instance-based service with constructor injection of platform dependencies.\n */\nexport class FeatureFlagConfigurationService {\n private readonly deps: PerpsPlatformDependencies;\n\n /**\n * Create a new FeatureFlagConfigurationService instance.\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n */\n constructor(deps: PerpsPlatformDependencies) {\n this.deps = deps;\n }\n\n /**\n * Validate and parse market list from remote feature flags.\n * Handles both string (comma-separated) and array formats from LaunchDarkly.\n *\n * @param remoteValue - The raw value from remote feature flags\n * @param fieldName - The name of the field for logging\n * @param currentValue - The current value to use as fallback\n * @returns The validated market list or undefined if validation fails\n */\n private validateMarketList(\n remoteValue: unknown,\n fieldName: string,\n currentValue: string[],\n ): string[] | undefined {\n this.deps.debugLogger.log(\n `PerpsController: HIP-3 ${fieldName} validation`,\n {\n remoteValue,\n type: typeof remoteValue,\n isArray: Array.isArray(remoteValue),\n },\n );\n\n // LaunchDarkly returns comma-separated strings for list values\n // Values may have literal quotes (e.g., '\"xyz\"') due to JSON encoding quirks\n if (typeof remoteValue === 'string') {\n const parsed = parseCommaSeparatedString(remoteValue).map(stripQuotes);\n\n if (parsed.length > 0) {\n this.deps.debugLogger.log(\n `PerpsController: HIP-3 ${fieldName} validated from string`,\n { validatedMarkets: parsed },\n );\n return parsed;\n }\n\n this.deps.debugLogger.log(\n `PerpsController: HIP-3 ${fieldName} string was empty after parsing`,\n { fallbackValue: currentValue },\n );\n return undefined;\n }\n\n // Fallback: Validate array of non-empty strings\n if (\n Array.isArray(remoteValue) &&\n remoteValue.every((item) => typeof item === 'string' && item.length > 0)\n ) {\n const validatedMarkets = (remoteValue as string[])\n .map((market) => stripQuotes(market.trim()))\n .filter((market) => market.length > 0);\n\n this.deps.debugLogger.log(\n `PerpsController: HIP-3 ${fieldName} validated from array`,\n { validatedMarkets },\n );\n return validatedMarkets;\n }\n\n this.deps.debugLogger.log(\n `PerpsController: HIP-3 ${fieldName} validation FAILED - falling back to local config`,\n {\n reason: Array.isArray(remoteValue)\n ? 'Array contains non-string or empty values'\n : 'Invalid type (expected string or array)',\n fallbackValue: currentValue,\n },\n );\n return undefined;\n }\n\n /**\n * Check if arrays have different values (order-independent comparison).\n *\n * @param a - First array\n * @param b - Second array\n * @returns True if arrays have different values\n */\n private arraysHaveDifferentValues(a: string[], b: string[]): boolean {\n return (\n JSON.stringify(\n [...a].sort((itemA, itemB) => itemA.localeCompare(itemB)),\n ) !==\n JSON.stringify([...b].sort((itemA, itemB) => itemA.localeCompare(itemB)))\n );\n }\n\n /**\n * Refresh HIP-3 configuration when remote feature flags change.\n * This method extracts HIP-3 settings from remote flags, validates them,\n * and updates internal state if they differ from current values.\n * When config changes, increments hip3ConfigVersion to trigger ConnectionManager reconnection.\n *\n * Follows the \"sticky remote\" pattern: once remote config is loaded, never downgrade to fallback.\n *\n * @param options - Configuration object\n * @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController\n * @param options.context - ServiceContext providing state access callbacks\n */\n refreshHip3Config(options: {\n remoteFeatureFlagControllerState: RemoteFeatureFlagState;\n context: ServiceContext;\n }): void {\n const { remoteFeatureFlagControllerState, context } = options;\n\n if (\n !context.getHip3Config ||\n !context.setHip3Config ||\n !context.incrementHip3ConfigVersion\n ) {\n throw new Error(\n 'Required HIP-3 callbacks not available in ServiceContext',\n );\n }\n\n const remoteFlags = remoteFeatureFlagControllerState.remoteFeatureFlags;\n const currentConfig = context.getHip3Config();\n\n // Extract and validate remote HIP-3 equity enabled flag\n const equityFlag = remoteFlags?.perpsHip3Enabled;\n // Use type guard to validate before calling - validatedVersionGatedFeatureFlag also\n // handles invalid flags internally, but proper typing requires the guard\n const validatedEquity = isVersionGatedFeatureFlag(equityFlag)\n ? validatedVersionGatedFeatureFlag(equityFlag)\n : undefined;\n\n this.deps.debugLogger.log('PerpsController: HIP-3 equity flag validation', {\n equityFlag,\n validatedEquity,\n willUse: validatedEquity !== undefined ? 'remote' : 'fallback',\n });\n\n // Extract and validate remote HIP-3 market lists\n const validatedAllowlistMarkets = hasProperty(\n remoteFlags,\n 'perpsHip3AllowlistMarkets',\n )\n ? this.validateMarketList(\n remoteFlags.perpsHip3AllowlistMarkets,\n 'allowlistMarkets',\n currentConfig.allowlistMarkets,\n )\n : undefined;\n\n const validatedBlocklistMarkets = hasProperty(\n remoteFlags,\n 'perpsHip3BlocklistMarkets',\n )\n ? this.validateMarketList(\n remoteFlags.perpsHip3BlocklistMarkets,\n 'blocklistMarkets',\n currentConfig.blocklistMarkets,\n )\n : undefined;\n\n // Detect changes (only if we have valid remote values)\n const equityChanged =\n validatedEquity !== undefined &&\n validatedEquity !== currentConfig.enabled;\n const allowlistMarketsChanged =\n validatedAllowlistMarkets !== undefined &&\n this.arraysHaveDifferentValues(\n validatedAllowlistMarkets,\n currentConfig.allowlistMarkets,\n );\n const blocklistMarketsChanged =\n validatedBlocklistMarkets !== undefined &&\n this.arraysHaveDifferentValues(\n validatedBlocklistMarkets,\n currentConfig.blocklistMarkets,\n );\n\n if (equityChanged || allowlistMarketsChanged || blocklistMarketsChanged) {\n this.deps.debugLogger.log(\n 'PerpsController: HIP-3 config changed via remote feature flags',\n {\n equityChanged,\n allowlistMarketsChanged,\n blocklistMarketsChanged,\n oldEquity: currentConfig.enabled,\n newEquity: validatedEquity,\n oldAllowlistMarkets: currentConfig.allowlistMarkets,\n newAllowlistMarkets: validatedAllowlistMarkets,\n oldBlocklistMarkets: currentConfig.blocklistMarkets,\n newBlocklistMarkets: validatedBlocklistMarkets,\n source: 'remote',\n },\n );\n\n // Update internal state (sticky remote - never downgrade)\n context.setHip3Config({\n enabled: validatedEquity,\n allowlistMarkets: validatedAllowlistMarkets\n ? [...validatedAllowlistMarkets]\n : undefined,\n blocklistMarkets: validatedBlocklistMarkets\n ? [...validatedBlocklistMarkets]\n : undefined,\n source: 'remote',\n });\n\n // Increment version to trigger ConnectionManager reconnection and cache clearing\n const newVersion = context.incrementHip3ConfigVersion();\n\n this.deps.debugLogger.log(\n 'PerpsController: Incremented hip3ConfigVersion to trigger reconnection',\n {\n newVersion,\n newHip3Enabled: validatedEquity ?? currentConfig.enabled,\n newHip3AllowlistMarkets:\n validatedAllowlistMarkets ?? currentConfig.allowlistMarkets,\n newHip3BlocklistMarkets:\n validatedBlocklistMarkets ?? currentConfig.blocklistMarkets,\n },\n );\n\n // Note: ConnectionManager will handle:\n // 1. Detecting hip3ConfigVersion change via Redux monitoring\n // 2. Clearing all StreamManager caches\n // 3. Calling reconnectWithNewContext() -> initializeProviders()\n // 4. Provider reinitialization will read the new HIP-3 config below\n }\n }\n\n /**\n * Respond to RemoteFeatureFlagController state changes.\n * Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.\n * Uses fallback configuration when remote feature flag is undefined.\n * Note: Initial eligibility is set in the constructor if fallback regions are provided.\n *\n * @param options - Configuration object\n * @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController\n * @param options.context - ServiceContext providing callbacks\n */\n refreshEligibility(options: {\n remoteFeatureFlagControllerState: RemoteFeatureFlagState;\n context: ServiceContext;\n }): void {\n const { remoteFeatureFlagControllerState, context } = options;\n\n const perpsGeoBlockedRegionsFeatureFlag =\n // NOTE: Do not use perpsPerpTradingGeoBlockedCountries as it is deprecated.\n remoteFeatureFlagControllerState.remoteFeatureFlags\n ?.perpsPerpTradingGeoBlockedCountriesV2;\n\n const remoteBlockedRegions = (\n perpsGeoBlockedRegionsFeatureFlag as { blockedRegions?: string[] }\n )?.blockedRegions;\n\n if (Array.isArray(remoteBlockedRegions)) {\n this.setBlockedRegions({\n list: remoteBlockedRegions,\n source: 'remote',\n context,\n });\n }\n\n // Also check for HIP-3 config changes\n this.refreshHip3Config({ remoteFeatureFlagControllerState, context });\n }\n\n /**\n * Set blocked region list with \"never downgrade\" pattern enforcement.\n * Updates the blocked region list and triggers eligibility refresh.\n * Implements \"sticky remote\": once remote regions are set, never downgrade to fallback.\n *\n * @param options - Configuration object\n * @param options.list - Array of blocked region codes\n * @param options.source - Source of the list ('remote' or 'fallback')\n * @param options.context - ServiceContext providing callbacks\n */\n setBlockedRegions(options: {\n list: string[];\n source: 'remote' | 'fallback';\n context: ServiceContext;\n }): void {\n const { list, source, context } = options;\n\n if (\n !context.getBlockedRegionList ||\n !context.setBlockedRegionList ||\n !context.refreshEligibility\n ) {\n throw new Error(\n 'Required blocked region callbacks not available in ServiceContext',\n );\n }\n\n const currentList = context.getBlockedRegionList();\n\n // Never downgrade from remote to fallback\n if (source === 'fallback' && currentList.source === 'remote') {\n return;\n }\n\n if (Array.isArray(list)) {\n context.setBlockedRegionList(list, source);\n }\n\n context.refreshEligibility().catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n this.deps.logger.error(error, {\n context: {\n name: 'FeatureFlagConfigurationService.setBlockedRegions',\n data: { source },\n },\n });\n });\n }\n}\n"]}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { ServiceContext } from "./ServiceContext.cjs";
|
|
2
|
-
import type { PerpsPlatformDependencies } from "../types/index.cjs";
|
|
3
|
-
/**
|
|
4
|
-
* Remote feature flags state shape for perps-related flags.
|
|
5
|
-
* This is a minimal type definition to avoid direct dependency on
|
|
6
|
-
* RemoteFeatureFlagController which can cause build issues.
|
|
7
|
-
*/
|
|
8
|
-
type RemoteFeatureFlagState = {
|
|
9
|
-
remoteFeatureFlags: Record<string, unknown>;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* FeatureFlagConfigurationService
|
|
13
|
-
*
|
|
14
|
-
* Handles HIP-3 configuration and geo-blocking configuration from remote feature flags.
|
|
15
|
-
* Implements "sticky remote" pattern: once remote config is loaded, never downgrade to fallback.
|
|
16
|
-
* Orchestrates validation, change detection, and version management for feature flag updates.
|
|
17
|
-
*
|
|
18
|
-
* Responsibilities:
|
|
19
|
-
* - Remote feature flag validation and parsing
|
|
20
|
-
* - HIP-3 configuration management (equity, allowlist, blocklist)
|
|
21
|
-
* - Geo-blocking configuration from remote flags
|
|
22
|
-
* - Change detection and version management
|
|
23
|
-
* - "Sticky remote" pattern enforcement (never downgrade)
|
|
24
|
-
*
|
|
25
|
-
* Instance-based service with constructor injection of platform dependencies.
|
|
26
|
-
*/
|
|
27
|
-
export declare class FeatureFlagConfigurationService {
|
|
28
|
-
private readonly deps;
|
|
29
|
-
/**
|
|
30
|
-
* Create a new FeatureFlagConfigurationService instance.
|
|
31
|
-
*
|
|
32
|
-
* @param deps - Platform dependencies for logging, metrics, etc.
|
|
33
|
-
*/
|
|
34
|
-
constructor(deps: PerpsPlatformDependencies);
|
|
35
|
-
/**
|
|
36
|
-
* Validate and parse market list from remote feature flags.
|
|
37
|
-
* Handles both string (comma-separated) and array formats from LaunchDarkly.
|
|
38
|
-
*
|
|
39
|
-
* @param remoteValue - The raw value from remote feature flags
|
|
40
|
-
* @param fieldName - The name of the field for logging
|
|
41
|
-
* @param currentValue - The current value to use as fallback
|
|
42
|
-
* @returns The validated market list or undefined if validation fails
|
|
43
|
-
*/
|
|
44
|
-
private validateMarketList;
|
|
45
|
-
/**
|
|
46
|
-
* Check if arrays have different values (order-independent comparison).
|
|
47
|
-
*
|
|
48
|
-
* @param a - First array
|
|
49
|
-
* @param b - Second array
|
|
50
|
-
* @returns True if arrays have different values
|
|
51
|
-
*/
|
|
52
|
-
private arraysHaveDifferentValues;
|
|
53
|
-
/**
|
|
54
|
-
* Refresh HIP-3 configuration when remote feature flags change.
|
|
55
|
-
* This method extracts HIP-3 settings from remote flags, validates them,
|
|
56
|
-
* and updates internal state if they differ from current values.
|
|
57
|
-
* When config changes, increments hip3ConfigVersion to trigger ConnectionManager reconnection.
|
|
58
|
-
*
|
|
59
|
-
* Follows the "sticky remote" pattern: once remote config is loaded, never downgrade to fallback.
|
|
60
|
-
*
|
|
61
|
-
* @param options - Configuration object
|
|
62
|
-
* @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController
|
|
63
|
-
* @param options.context - ServiceContext providing state access callbacks
|
|
64
|
-
*/
|
|
65
|
-
refreshHip3Config(options: {
|
|
66
|
-
remoteFeatureFlagControllerState: RemoteFeatureFlagState;
|
|
67
|
-
context: ServiceContext;
|
|
68
|
-
}): void;
|
|
69
|
-
/**
|
|
70
|
-
* Respond to RemoteFeatureFlagController state changes.
|
|
71
|
-
* Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.
|
|
72
|
-
* Uses fallback configuration when remote feature flag is undefined.
|
|
73
|
-
* Note: Initial eligibility is set in the constructor if fallback regions are provided.
|
|
74
|
-
*
|
|
75
|
-
* @param options - Configuration object
|
|
76
|
-
* @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController
|
|
77
|
-
* @param options.context - ServiceContext providing callbacks
|
|
78
|
-
*/
|
|
79
|
-
refreshEligibility(options: {
|
|
80
|
-
remoteFeatureFlagControllerState: RemoteFeatureFlagState;
|
|
81
|
-
context: ServiceContext;
|
|
82
|
-
}): void;
|
|
83
|
-
/**
|
|
84
|
-
* Set blocked region list with "never downgrade" pattern enforcement.
|
|
85
|
-
* Updates the blocked region list and triggers eligibility refresh.
|
|
86
|
-
* Implements "sticky remote": once remote regions are set, never downgrade to fallback.
|
|
87
|
-
*
|
|
88
|
-
* @param options - Configuration object
|
|
89
|
-
* @param options.list - Array of blocked region codes
|
|
90
|
-
* @param options.source - Source of the list ('remote' or 'fallback')
|
|
91
|
-
* @param options.context - ServiceContext providing callbacks
|
|
92
|
-
*/
|
|
93
|
-
setBlockedRegions(options: {
|
|
94
|
-
list: string[];
|
|
95
|
-
source: 'remote' | 'fallback';
|
|
96
|
-
context: ServiceContext;
|
|
97
|
-
}): void;
|
|
98
|
-
}
|
|
99
|
-
export {};
|
|
100
|
-
//# sourceMappingURL=FeatureFlagConfigurationService.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFlagConfigurationService.d.cts","sourceRoot":"","sources":["../../src/services/FeatureFlagConfigurationService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,6BAAyB;AACvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,2BAAiB;AAM1D;;;;GAIG;AACH,KAAK,sBAAsB,GAAG;IAC5B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC;AAsCF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IAEjD;;;;OAIG;gBACS,IAAI,EAAE,yBAAyB;IAI3C;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA8D1B;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IASjC;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,OAAO,EAAE;QACzB,gCAAgC,EAAE,sBAAsB,CAAC;QACzD,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG,IAAI;IA0HR;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE;QAC1B,gCAAgC,EAAE,sBAAsB,CAAC;QACzD,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG,IAAI;IAwBR;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE;QACzB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;QAC9B,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG,IAAI;CAkCT"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { ServiceContext } from "./ServiceContext.mjs";
|
|
2
|
-
import type { PerpsPlatformDependencies } from "../types/index.mjs";
|
|
3
|
-
/**
|
|
4
|
-
* Remote feature flags state shape for perps-related flags.
|
|
5
|
-
* This is a minimal type definition to avoid direct dependency on
|
|
6
|
-
* RemoteFeatureFlagController which can cause build issues.
|
|
7
|
-
*/
|
|
8
|
-
type RemoteFeatureFlagState = {
|
|
9
|
-
remoteFeatureFlags: Record<string, unknown>;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* FeatureFlagConfigurationService
|
|
13
|
-
*
|
|
14
|
-
* Handles HIP-3 configuration and geo-blocking configuration from remote feature flags.
|
|
15
|
-
* Implements "sticky remote" pattern: once remote config is loaded, never downgrade to fallback.
|
|
16
|
-
* Orchestrates validation, change detection, and version management for feature flag updates.
|
|
17
|
-
*
|
|
18
|
-
* Responsibilities:
|
|
19
|
-
* - Remote feature flag validation and parsing
|
|
20
|
-
* - HIP-3 configuration management (equity, allowlist, blocklist)
|
|
21
|
-
* - Geo-blocking configuration from remote flags
|
|
22
|
-
* - Change detection and version management
|
|
23
|
-
* - "Sticky remote" pattern enforcement (never downgrade)
|
|
24
|
-
*
|
|
25
|
-
* Instance-based service with constructor injection of platform dependencies.
|
|
26
|
-
*/
|
|
27
|
-
export declare class FeatureFlagConfigurationService {
|
|
28
|
-
private readonly deps;
|
|
29
|
-
/**
|
|
30
|
-
* Create a new FeatureFlagConfigurationService instance.
|
|
31
|
-
*
|
|
32
|
-
* @param deps - Platform dependencies for logging, metrics, etc.
|
|
33
|
-
*/
|
|
34
|
-
constructor(deps: PerpsPlatformDependencies);
|
|
35
|
-
/**
|
|
36
|
-
* Validate and parse market list from remote feature flags.
|
|
37
|
-
* Handles both string (comma-separated) and array formats from LaunchDarkly.
|
|
38
|
-
*
|
|
39
|
-
* @param remoteValue - The raw value from remote feature flags
|
|
40
|
-
* @param fieldName - The name of the field for logging
|
|
41
|
-
* @param currentValue - The current value to use as fallback
|
|
42
|
-
* @returns The validated market list or undefined if validation fails
|
|
43
|
-
*/
|
|
44
|
-
private validateMarketList;
|
|
45
|
-
/**
|
|
46
|
-
* Check if arrays have different values (order-independent comparison).
|
|
47
|
-
*
|
|
48
|
-
* @param a - First array
|
|
49
|
-
* @param b - Second array
|
|
50
|
-
* @returns True if arrays have different values
|
|
51
|
-
*/
|
|
52
|
-
private arraysHaveDifferentValues;
|
|
53
|
-
/**
|
|
54
|
-
* Refresh HIP-3 configuration when remote feature flags change.
|
|
55
|
-
* This method extracts HIP-3 settings from remote flags, validates them,
|
|
56
|
-
* and updates internal state if they differ from current values.
|
|
57
|
-
* When config changes, increments hip3ConfigVersion to trigger ConnectionManager reconnection.
|
|
58
|
-
*
|
|
59
|
-
* Follows the "sticky remote" pattern: once remote config is loaded, never downgrade to fallback.
|
|
60
|
-
*
|
|
61
|
-
* @param options - Configuration object
|
|
62
|
-
* @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController
|
|
63
|
-
* @param options.context - ServiceContext providing state access callbacks
|
|
64
|
-
*/
|
|
65
|
-
refreshHip3Config(options: {
|
|
66
|
-
remoteFeatureFlagControllerState: RemoteFeatureFlagState;
|
|
67
|
-
context: ServiceContext;
|
|
68
|
-
}): void;
|
|
69
|
-
/**
|
|
70
|
-
* Respond to RemoteFeatureFlagController state changes.
|
|
71
|
-
* Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.
|
|
72
|
-
* Uses fallback configuration when remote feature flag is undefined.
|
|
73
|
-
* Note: Initial eligibility is set in the constructor if fallback regions are provided.
|
|
74
|
-
*
|
|
75
|
-
* @param options - Configuration object
|
|
76
|
-
* @param options.remoteFeatureFlagControllerState - State from RemoteFeatureFlagController
|
|
77
|
-
* @param options.context - ServiceContext providing callbacks
|
|
78
|
-
*/
|
|
79
|
-
refreshEligibility(options: {
|
|
80
|
-
remoteFeatureFlagControllerState: RemoteFeatureFlagState;
|
|
81
|
-
context: ServiceContext;
|
|
82
|
-
}): void;
|
|
83
|
-
/**
|
|
84
|
-
* Set blocked region list with "never downgrade" pattern enforcement.
|
|
85
|
-
* Updates the blocked region list and triggers eligibility refresh.
|
|
86
|
-
* Implements "sticky remote": once remote regions are set, never downgrade to fallback.
|
|
87
|
-
*
|
|
88
|
-
* @param options - Configuration object
|
|
89
|
-
* @param options.list - Array of blocked region codes
|
|
90
|
-
* @param options.source - Source of the list ('remote' or 'fallback')
|
|
91
|
-
* @param options.context - ServiceContext providing callbacks
|
|
92
|
-
*/
|
|
93
|
-
setBlockedRegions(options: {
|
|
94
|
-
list: string[];
|
|
95
|
-
source: 'remote' | 'fallback';
|
|
96
|
-
context: ServiceContext;
|
|
97
|
-
}): void;
|
|
98
|
-
}
|
|
99
|
-
export {};
|
|
100
|
-
//# sourceMappingURL=FeatureFlagConfigurationService.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFlagConfigurationService.d.mts","sourceRoot":"","sources":["../../src/services/FeatureFlagConfigurationService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,6BAAyB;AACvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,2BAAiB;AAM1D;;;;GAIG;AACH,KAAK,sBAAsB,GAAG;IAC5B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC;AAsCF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IAEjD;;;;OAIG;gBACS,IAAI,EAAE,yBAAyB;IAI3C;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA8D1B;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IASjC;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,OAAO,EAAE;QACzB,gCAAgC,EAAE,sBAAsB,CAAC;QACzD,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG,IAAI;IA0HR;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE;QAC1B,gCAAgC,EAAE,sBAAsB,CAAC;QACzD,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG,IAAI;IAwBR;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE;QACzB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;QAC9B,OAAO,EAAE,cAAc,CAAC;KACzB,GAAG,IAAI;CAkCT"}
|