@featbit/js-client-sdk 2.0.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -201
- package/README.md +162 -150
- package/dist/esm/Configuration.d.ts +35 -0
- package/dist/esm/Configuration.d.ts.map +1 -0
- package/dist/esm/Configuration.js +179 -0
- package/dist/esm/Configuration.js.map +1 -0
- package/dist/esm/Context.d.ts +23 -0
- package/dist/esm/Context.d.ts.map +1 -0
- package/dist/esm/Context.js +49 -0
- package/dist/esm/Context.js.map +1 -0
- package/dist/esm/FbClientBuilder.d.ts +90 -0
- package/dist/esm/FbClientBuilder.d.ts.map +1 -0
- package/dist/esm/FbClientBuilder.js +133 -0
- package/dist/esm/FbClientBuilder.js.map +1 -0
- package/dist/esm/FbClientCore.d.ts +56 -0
- package/dist/esm/FbClientCore.d.ts.map +1 -0
- package/dist/esm/FbClientCore.js +283 -0
- package/dist/esm/FbClientCore.js.map +1 -0
- package/dist/esm/IContextProperty.d.ts +5 -0
- package/dist/esm/IContextProperty.d.ts.map +1 -0
- package/dist/esm/IContextProperty.js +3 -0
- package/dist/esm/IContextProperty.js.map +1 -0
- package/dist/esm/IDataKind.d.ts +12 -0
- package/dist/esm/IDataKind.d.ts.map +1 -0
- package/dist/esm/IDataKind.js +3 -0
- package/dist/esm/IDataKind.js.map +1 -0
- package/dist/esm/IFbClient.d.ts +30 -0
- package/dist/esm/IFbClient.d.ts.map +1 -0
- package/dist/esm/IFbClient.js +3 -0
- package/dist/esm/IFbClient.js.map +1 -0
- package/dist/esm/IFbClientCore.d.ts +240 -0
- package/dist/esm/IFbClientCore.d.ts.map +1 -0
- package/dist/esm/IFbClientCore.js +3 -0
- package/dist/esm/IFbClientCore.js.map +1 -0
- package/dist/esm/IVersionedData.d.ts +18 -0
- package/dist/esm/IVersionedData.d.ts.map +1 -0
- package/dist/esm/IVersionedData.js +3 -0
- package/dist/esm/IVersionedData.js.map +1 -0
- package/dist/esm/bootstrap/IBootstrapProvider.d.ts +5 -0
- package/dist/esm/bootstrap/IBootstrapProvider.d.ts.map +1 -0
- package/dist/esm/bootstrap/IBootstrapProvider.js +3 -0
- package/dist/esm/bootstrap/IBootstrapProvider.js.map +1 -0
- package/dist/esm/bootstrap/JsonBootstrapProvider.d.ts +9 -0
- package/dist/esm/bootstrap/JsonBootstrapProvider.d.ts.map +1 -0
- package/dist/esm/bootstrap/JsonBootstrapProvider.js +29 -0
- package/dist/esm/bootstrap/JsonBootstrapProvider.js.map +1 -0
- package/dist/esm/bootstrap/NullBootstrapProvider.d.ts +8 -0
- package/dist/esm/bootstrap/NullBootstrapProvider.d.ts.map +1 -0
- package/dist/esm/bootstrap/NullBootstrapProvider.js +19 -0
- package/dist/esm/bootstrap/NullBootstrapProvider.js.map +1 -0
- package/dist/esm/bootstrap/index.d.ts +4 -0
- package/dist/esm/bootstrap/index.d.ts.map +1 -0
- package/dist/esm/bootstrap/index.js +20 -0
- package/dist/esm/bootstrap/index.js.map +1 -0
- package/dist/esm/constants.d.ts +3 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +6 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/data-sources/DataSourceUpdates.d.ts +17 -0
- package/dist/esm/data-sources/DataSourceUpdates.d.ts.map +1 -0
- package/dist/esm/data-sources/DataSourceUpdates.js +84 -0
- package/dist/esm/data-sources/DataSourceUpdates.js.map +1 -0
- package/dist/esm/data-sources/createStreamListeners.d.ts +19 -0
- package/dist/esm/data-sources/createStreamListeners.d.ts.map +1 -0
- package/dist/esm/data-sources/createStreamListeners.js +49 -0
- package/dist/esm/data-sources/createStreamListeners.js.map +1 -0
- package/dist/esm/data-sources/index.d.ts +3 -0
- package/dist/esm/data-sources/index.d.ts.map +1 -0
- package/dist/esm/data-sources/index.js +19 -0
- package/dist/esm/data-sources/index.js.map +1 -0
- package/dist/esm/data-sync/DataSyncMode.d.ts +5 -0
- package/dist/esm/data-sync/DataSyncMode.d.ts.map +1 -0
- package/dist/esm/data-sync/DataSyncMode.js +9 -0
- package/dist/esm/data-sync/DataSyncMode.js.map +1 -0
- package/dist/esm/data-sync/IDataSynchronizer.d.ts +15 -0
- package/dist/esm/data-sync/IDataSynchronizer.d.ts.map +1 -0
- package/dist/esm/data-sync/IDataSynchronizer.js +3 -0
- package/dist/esm/data-sync/IDataSynchronizer.js.map +1 -0
- package/dist/esm/data-sync/IRequestor.d.ts +11 -0
- package/dist/esm/data-sync/IRequestor.d.ts.map +1 -0
- package/dist/esm/data-sync/IRequestor.js +3 -0
- package/dist/esm/data-sync/IRequestor.js.map +1 -0
- package/dist/esm/data-sync/NullDataSynchronizer.d.ts +8 -0
- package/dist/esm/data-sync/NullDataSynchronizer.d.ts.map +1 -0
- package/dist/esm/data-sync/NullDataSynchronizer.js +15 -0
- package/dist/esm/data-sync/NullDataSynchronizer.js.map +1 -0
- package/dist/esm/data-sync/PollingDataSynchronizer.d.ts +23 -0
- package/dist/esm/data-sync/PollingDataSynchronizer.d.ts.map +1 -0
- package/dist/esm/data-sync/PollingDataSynchronizer.js +87 -0
- package/dist/esm/data-sync/PollingDataSynchronizer.js.map +1 -0
- package/dist/esm/data-sync/Requestor.d.ts +20 -0
- package/dist/esm/data-sync/Requestor.d.ts.map +1 -0
- package/dist/esm/data-sync/Requestor.js +56 -0
- package/dist/esm/data-sync/Requestor.js.map +1 -0
- package/dist/esm/data-sync/WebSocketDataSynchronizer.d.ts +20 -0
- package/dist/esm/data-sync/WebSocketDataSynchronizer.d.ts.map +1 -0
- package/dist/esm/data-sync/WebSocketDataSynchronizer.js +55 -0
- package/dist/esm/data-sync/WebSocketDataSynchronizer.js.map +1 -0
- package/dist/esm/data-sync/index.d.ts +10 -0
- package/dist/esm/data-sync/index.d.ts.map +1 -0
- package/dist/esm/data-sync/index.js +26 -0
- package/dist/esm/data-sync/index.js.map +1 -0
- package/dist/esm/data-sync/types.d.ts +17 -0
- package/dist/esm/data-sync/types.d.ts.map +1 -0
- package/dist/esm/data-sync/types.js +9 -0
- package/dist/esm/data-sync/types.js.map +1 -0
- package/dist/esm/data-sync/utils.d.ts +3 -0
- package/dist/esm/data-sync/utils.d.ts.map +1 -0
- package/dist/esm/data-sync/utils.js +33 -0
- package/dist/esm/data-sync/utils.js.map +1 -0
- package/dist/esm/errors.d.ts +16 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +41 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/evaluation/EvalResult.d.ts +20 -0
- package/dist/esm/evaluation/EvalResult.d.ts.map +1 -0
- package/dist/esm/evaluation/EvalResult.js +33 -0
- package/dist/esm/evaluation/EvalResult.js.map +1 -0
- package/dist/esm/evaluation/Evaluator.d.ts +15 -0
- package/dist/esm/evaluation/Evaluator.d.ts.map +1 -0
- package/dist/esm/evaluation/Evaluator.js +28 -0
- package/dist/esm/evaluation/Evaluator.js.map +1 -0
- package/dist/esm/evaluation/IEvalDetail.d.ts +21 -0
- package/dist/esm/evaluation/IEvalDetail.d.ts.map +1 -0
- package/dist/esm/evaluation/IEvalDetail.js +3 -0
- package/dist/esm/evaluation/IEvalDetail.js.map +1 -0
- package/dist/esm/evaluation/ReasonKinds.d.ts +11 -0
- package/dist/esm/evaluation/ReasonKinds.d.ts.map +1 -0
- package/dist/esm/evaluation/ReasonKinds.js +15 -0
- package/dist/esm/evaluation/ReasonKinds.js.map +1 -0
- package/dist/esm/evaluation/data/IFlag.d.ts +26 -0
- package/dist/esm/evaluation/data/IFlag.d.ts.map +1 -0
- package/dist/esm/evaluation/data/IFlag.js +12 -0
- package/dist/esm/evaluation/data/IFlag.js.map +1 -0
- package/dist/esm/evaluation/data/index.d.ts +2 -0
- package/dist/esm/evaluation/data/index.d.ts.map +1 -0
- package/dist/esm/evaluation/data/index.js +18 -0
- package/dist/esm/evaluation/data/index.js.map +1 -0
- package/dist/esm/evaluation/index.d.ts +6 -0
- package/dist/esm/evaluation/index.d.ts.map +1 -0
- package/dist/esm/evaluation/index.js +22 -0
- package/dist/esm/evaluation/index.js.map +1 -0
- package/dist/esm/events/DefaultEventProcessor.d.ts +16 -0
- package/dist/esm/events/DefaultEventProcessor.d.ts.map +1 -0
- package/dist/esm/events/DefaultEventProcessor.js +79 -0
- package/dist/esm/events/DefaultEventProcessor.js.map +1 -0
- package/dist/esm/events/DefaultEventQueue.d.ts +18 -0
- package/dist/esm/events/DefaultEventQueue.d.ts.map +1 -0
- package/dist/esm/events/DefaultEventQueue.js +42 -0
- package/dist/esm/events/DefaultEventQueue.js.map +1 -0
- package/dist/esm/events/DefaultEventSender.d.ts +10 -0
- package/dist/esm/events/DefaultEventSender.d.ts.map +1 -0
- package/dist/esm/events/DefaultEventSender.js +67 -0
- package/dist/esm/events/DefaultEventSender.js.map +1 -0
- package/dist/esm/events/DefaultEventSerializer.d.ts +6 -0
- package/dist/esm/events/DefaultEventSerializer.d.ts.map +1 -0
- package/dist/esm/events/DefaultEventSerializer.js +14 -0
- package/dist/esm/events/DefaultEventSerializer.js.map +1 -0
- package/dist/esm/events/EventDispatcher.d.ts +17 -0
- package/dist/esm/events/EventDispatcher.d.ts.map +1 -0
- package/dist/esm/events/EventDispatcher.js +127 -0
- package/dist/esm/events/EventDispatcher.js.map +1 -0
- package/dist/esm/events/EventSerializer.d.ts +5 -0
- package/dist/esm/events/EventSerializer.d.ts.map +1 -0
- package/dist/esm/events/EventSerializer.js +3 -0
- package/dist/esm/events/EventSerializer.js.map +1 -0
- package/dist/esm/events/IEventProcessor.d.ts +7 -0
- package/dist/esm/events/IEventProcessor.d.ts.map +1 -0
- package/dist/esm/events/IEventProcessor.js +3 -0
- package/dist/esm/events/IEventProcessor.js.map +1 -0
- package/dist/esm/events/IEventQueue.d.ts +11 -0
- package/dist/esm/events/IEventQueue.d.ts.map +1 -0
- package/dist/esm/events/IEventQueue.js +3 -0
- package/dist/esm/events/IEventQueue.js.map +1 -0
- package/dist/esm/events/IEventSender.d.ts +13 -0
- package/dist/esm/events/IEventSender.d.ts.map +1 -0
- package/dist/esm/events/IEventSender.js +10 -0
- package/dist/esm/events/IEventSender.js.map +1 -0
- package/dist/esm/events/NullEventProcessor.d.ts +8 -0
- package/dist/esm/events/NullEventProcessor.d.ts.map +1 -0
- package/dist/esm/events/NullEventProcessor.js +16 -0
- package/dist/esm/events/NullEventProcessor.js.map +1 -0
- package/dist/esm/events/event.d.ts +44 -0
- package/dist/esm/events/event.d.ts.map +1 -0
- package/dist/esm/events/event.js +115 -0
- package/dist/esm/events/event.js.map +1 -0
- package/dist/esm/events/index.d.ts +12 -0
- package/dist/esm/events/index.d.ts.map +1 -0
- package/dist/esm/events/index.js +28 -0
- package/dist/esm/events/index.js.map +1 -0
- package/dist/esm/index.d.ts +20 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +36 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/integrations/TestLogger.d.ts +10 -0
- package/dist/esm/integrations/TestLogger.d.ts.map +1 -0
- package/dist/esm/integrations/TestLogger.js +25 -0
- package/dist/esm/integrations/TestLogger.js.map +1 -0
- package/dist/esm/integrations/index.d.ts +3 -0
- package/dist/esm/integrations/index.d.ts.map +1 -0
- package/dist/esm/integrations/index.js +21 -0
- package/dist/esm/integrations/index.js.map +1 -0
- package/dist/esm/integrations/test_data/FlagBuilder.d.ts +19 -0
- package/dist/esm/integrations/test_data/FlagBuilder.d.ts.map +1 -0
- package/dist/esm/integrations/test_data/FlagBuilder.js +56 -0
- package/dist/esm/integrations/test_data/FlagBuilder.js.map +1 -0
- package/dist/esm/integrations/test_data/TestData.d.ts +18 -0
- package/dist/esm/integrations/test_data/TestData.d.ts.map +1 -0
- package/dist/esm/integrations/test_data/TestData.js +38 -0
- package/dist/esm/integrations/test_data/TestData.js.map +1 -0
- package/dist/esm/integrations/test_data/TestDataSynchronizer.d.ts +21 -0
- package/dist/esm/integrations/test_data/TestDataSynchronizer.d.ts.map +1 -0
- package/dist/esm/integrations/test_data/TestDataSynchronizer.js +50 -0
- package/dist/esm/integrations/test_data/TestDataSynchronizer.js.map +1 -0
- package/dist/esm/integrations/test_data/index.d.ts +5 -0
- package/dist/esm/integrations/test_data/index.d.ts.map +1 -0
- package/dist/esm/integrations/test_data/index.js +13 -0
- package/dist/esm/integrations/test_data/index.js.map +1 -0
- package/dist/esm/logging/BasicLogger.d.ts +34 -0
- package/dist/esm/logging/BasicLogger.d.ts.map +1 -0
- package/dist/esm/logging/BasicLogger.js +101 -0
- package/dist/esm/logging/BasicLogger.js.map +1 -0
- package/dist/esm/logging/IBasicLoggerOptions.d.ts +43 -0
- package/dist/esm/logging/IBasicLoggerOptions.d.ts.map +1 -0
- package/dist/esm/logging/IBasicLoggerOptions.js +3 -0
- package/dist/esm/logging/IBasicLoggerOptions.js.map +1 -0
- package/dist/esm/logging/ILogger.d.ts +47 -0
- package/dist/esm/logging/ILogger.d.ts.map +1 -0
- package/dist/esm/logging/ILogger.js +3 -0
- package/dist/esm/logging/ILogger.js.map +1 -0
- package/dist/esm/logging/LogLevel.d.ts +10 -0
- package/dist/esm/logging/LogLevel.d.ts.map +1 -0
- package/dist/esm/logging/LogLevel.js +3 -0
- package/dist/esm/logging/LogLevel.js.map +1 -0
- package/dist/esm/logging/SafeLogger.d.ts +28 -0
- package/dist/esm/logging/SafeLogger.d.ts.map +1 -0
- package/dist/esm/logging/SafeLogger.js +63 -0
- package/dist/esm/logging/SafeLogger.js.map +1 -0
- package/dist/esm/logging/format.d.ts +12 -0
- package/dist/esm/logging/format.d.ts.map +1 -0
- package/dist/esm/logging/format.js +156 -0
- package/dist/esm/logging/format.js.map +1 -0
- package/dist/esm/logging/index.d.ts +7 -0
- package/dist/esm/logging/index.d.ts.map +1 -0
- package/dist/esm/logging/index.js +23 -0
- package/dist/esm/logging/index.js.map +1 -0
- package/dist/esm/options/ClientContext.d.ts +28 -0
- package/dist/esm/options/ClientContext.d.ts.map +1 -0
- package/dist/esm/options/ClientContext.js +21 -0
- package/dist/esm/options/ClientContext.js.map +1 -0
- package/dist/esm/options/IClientContext.d.ts +45 -0
- package/dist/esm/options/IClientContext.d.ts.map +1 -0
- package/dist/esm/options/IClientContext.js +3 -0
- package/dist/esm/options/IClientContext.js.map +1 -0
- package/dist/esm/options/IOptions.d.ts +101 -0
- package/dist/esm/options/IOptions.d.ts.map +1 -0
- package/dist/esm/options/IOptions.js +3 -0
- package/dist/esm/options/IOptions.js.map +1 -0
- package/dist/esm/options/IUser.d.ts +7 -0
- package/dist/esm/options/IUser.d.ts.map +1 -0
- package/dist/esm/options/IUser.js +3 -0
- package/dist/esm/options/IUser.js.map +1 -0
- package/dist/esm/options/IValidatedOptions.d.ts +27 -0
- package/dist/esm/options/IValidatedOptions.d.ts.map +1 -0
- package/dist/esm/options/IValidatedOptions.js +3 -0
- package/dist/esm/options/IValidatedOptions.js.map +1 -0
- package/dist/esm/options/OptionMessages.d.ts +14 -0
- package/dist/esm/options/OptionMessages.d.ts.map +1 -0
- package/dist/esm/options/OptionMessages.js +33 -0
- package/dist/esm/options/OptionMessages.js.map +1 -0
- package/dist/esm/options/UserBuilder.d.ts +17 -0
- package/dist/esm/options/UserBuilder.d.ts.map +1 -0
- package/dist/esm/options/UserBuilder.js +35 -0
- package/dist/esm/options/UserBuilder.js.map +1 -0
- package/dist/esm/options/Validators.d.ts +111 -0
- package/dist/esm/options/Validators.d.ts.map +1 -0
- package/dist/esm/options/Validators.js +247 -0
- package/dist/esm/options/Validators.js.map +1 -0
- package/dist/esm/options/index.d.ts +9 -0
- package/dist/esm/options/index.d.ts.map +1 -0
- package/dist/esm/options/index.js +25 -0
- package/dist/esm/options/index.js.map +1 -0
- package/dist/esm/platform/IInfo.d.ts +73 -0
- package/dist/esm/platform/IInfo.d.ts.map +1 -0
- package/dist/esm/platform/IInfo.js +3 -0
- package/dist/esm/platform/IInfo.js.map +1 -0
- package/dist/esm/platform/IPlatform.d.ts +19 -0
- package/dist/esm/platform/IPlatform.d.ts.map +1 -0
- package/dist/esm/platform/IPlatform.js +3 -0
- package/dist/esm/platform/IPlatform.js.map +1 -0
- package/dist/esm/platform/IStore.d.ts +110 -0
- package/dist/esm/platform/IStore.d.ts.map +1 -0
- package/dist/esm/platform/IStore.js +3 -0
- package/dist/esm/platform/IStore.js.map +1 -0
- package/dist/esm/platform/IWebSocket.d.ts +21 -0
- package/dist/esm/platform/IWebSocket.d.ts.map +1 -0
- package/dist/esm/platform/IWebSocket.js +3 -0
- package/dist/esm/platform/IWebSocket.js.map +1 -0
- package/dist/esm/platform/browser/BrowserInfo.d.ts +7 -0
- package/dist/esm/platform/browser/BrowserInfo.d.ts.map +1 -0
- package/dist/esm/platform/browser/BrowserInfo.js +24 -0
- package/dist/esm/platform/browser/BrowserInfo.js.map +1 -0
- package/dist/esm/platform/browser/BrowserPlatform.d.ts +12 -0
- package/dist/esm/platform/browser/BrowserPlatform.d.ts.map +1 -0
- package/dist/esm/platform/browser/BrowserPlatform.js +17 -0
- package/dist/esm/platform/browser/BrowserPlatform.js.map +1 -0
- package/dist/esm/platform/browser/BrowserRequests.d.ts +5 -0
- package/dist/esm/platform/browser/BrowserRequests.d.ts.map +1 -0
- package/dist/esm/platform/browser/BrowserRequests.js +9 -0
- package/dist/esm/platform/browser/BrowserRequests.js.map +1 -0
- package/dist/esm/platform/browser/BrowserWebSocket.d.ts +38 -0
- package/dist/esm/platform/browser/BrowserWebSocket.d.ts.map +1 -0
- package/dist/esm/platform/browser/BrowserWebSocket.js +129 -0
- package/dist/esm/platform/browser/BrowserWebSocket.js.map +1 -0
- package/dist/esm/platform/browser/FbClient.d.ts +30 -0
- package/dist/esm/platform/browser/FbClient.d.ts.map +1 -0
- package/dist/esm/platform/browser/FbClient.js +47 -0
- package/dist/esm/platform/browser/FbClient.js.map +1 -0
- package/dist/esm/platform/browser/LocalStorageStore.d.ts +26 -0
- package/dist/esm/platform/browser/LocalStorageStore.d.ts.map +1 -0
- package/dist/esm/platform/browser/LocalStorageStore.js +122 -0
- package/dist/esm/platform/browser/LocalStorageStore.js.map +1 -0
- package/dist/esm/platform/index.d.ts +5 -0
- package/dist/esm/platform/index.d.ts.map +1 -0
- package/dist/esm/platform/index.js +21 -0
- package/dist/esm/platform/index.js.map +1 -0
- package/dist/esm/platform/requests.d.ts +64 -0
- package/dist/esm/platform/requests.d.ts.map +1 -0
- package/dist/esm/platform/requests.js +7 -0
- package/dist/esm/platform/requests.js.map +1 -0
- package/dist/esm/store/DataKinds.d.ts +5 -0
- package/dist/esm/store/DataKinds.d.ts.map +1 -0
- package/dist/esm/store/DataKinds.js +9 -0
- package/dist/esm/store/DataKinds.js.map +1 -0
- package/dist/esm/store/IDataSourceUpdates.d.ts +48 -0
- package/dist/esm/store/IDataSourceUpdates.d.ts.map +1 -0
- package/dist/esm/store/IDataSourceUpdates.js +3 -0
- package/dist/esm/store/IDataSourceUpdates.js.map +1 -0
- package/dist/esm/store/InMemoryStore.d.ts +24 -0
- package/dist/esm/store/InMemoryStore.d.ts.map +1 -0
- package/dist/esm/store/InMemoryStore.js +96 -0
- package/dist/esm/store/InMemoryStore.js.map +1 -0
- package/dist/esm/store/index.d.ts +6 -0
- package/dist/esm/store/index.d.ts.map +1 -0
- package/dist/esm/store/index.js +22 -0
- package/dist/esm/store/index.js.map +1 -0
- package/dist/esm/store/serialization.d.ts +23 -0
- package/dist/esm/store/serialization.d.ts.map +1 -0
- package/dist/esm/store/serialization.js +37 -0
- package/dist/esm/store/serialization.js.map +1 -0
- package/dist/esm/store/store.d.ts +30 -0
- package/dist/esm/store/store.d.ts.map +1 -0
- package/dist/esm/store/store.js +6 -0
- package/dist/esm/store/store.js.map +1 -0
- package/dist/esm/utils/Emits.d.ts +30 -0
- package/dist/esm/utils/Emits.d.ts.map +1 -0
- package/dist/esm/utils/Emits.js +64 -0
- package/dist/esm/utils/Emits.js.map +1 -0
- package/dist/esm/utils/EventEmitter.d.ts +22 -0
- package/dist/esm/utils/EventEmitter.d.ts.map +1 -0
- package/dist/esm/utils/EventEmitter.js +108 -0
- package/dist/esm/utils/EventEmitter.js.map +1 -0
- package/dist/esm/utils/IEventEmitter.d.ts +16 -0
- package/dist/esm/utils/IEventEmitter.d.ts.map +1 -0
- package/dist/esm/utils/IEventEmitter.js +3 -0
- package/dist/esm/utils/IEventEmitter.js.map +1 -0
- package/dist/esm/utils/Regex.d.ts +7 -0
- package/dist/esm/utils/Regex.d.ts.map +1 -0
- package/dist/esm/utils/Regex.js +22 -0
- package/dist/esm/utils/Regex.js.map +1 -0
- package/dist/esm/utils/ValueConverters.d.ts +13 -0
- package/dist/esm/utils/ValueConverters.d.ts.map +1 -0
- package/dist/esm/utils/ValueConverters.js +46 -0
- package/dist/esm/utils/ValueConverters.js.map +1 -0
- package/dist/esm/utils/VoidFunction.d.ts +2 -0
- package/dist/esm/utils/VoidFunction.d.ts.map +1 -0
- package/dist/esm/utils/VoidFunction.js +3 -0
- package/dist/esm/utils/VoidFunction.js.map +1 -0
- package/dist/esm/utils/canonicalizeUri.d.ts +2 -0
- package/dist/esm/utils/canonicalizeUri.d.ts.map +1 -0
- package/dist/esm/utils/canonicalizeUri.js +9 -0
- package/dist/esm/utils/canonicalizeUri.js.map +1 -0
- package/dist/esm/utils/http.d.ts +12 -0
- package/dist/esm/utils/http.d.ts.map +1 -0
- package/dist/esm/utils/http.js +26 -0
- package/dist/esm/utils/http.js.map +1 -0
- package/dist/esm/utils/index.d.ts +5 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +21 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/isNullOrUndefined.d.ts +2 -0
- package/dist/esm/utils/isNullOrUndefined.d.ts.map +1 -0
- package/dist/esm/utils/isNullOrUndefined.js +8 -0
- package/dist/esm/utils/isNullOrUndefined.js.map +1 -0
- package/dist/esm/utils/serializeUser.d.ts +3 -0
- package/dist/esm/utils/serializeUser.d.ts.map +1 -0
- package/dist/esm/utils/serializeUser.js +24 -0
- package/dist/esm/utils/serializeUser.js.map +1 -0
- package/dist/esm/utils/sleep.d.ts +3 -0
- package/dist/esm/utils/sleep.d.ts.map +1 -0
- package/dist/esm/utils/sleep.js +18 -0
- package/dist/esm/utils/sleep.js.map +1 -0
- package/dist/esm/version.d.ts +3 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +6 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/umd/featbit-js-client-sdk-3.0.0.js +2 -0
- package/dist/umd/featbit-js-client-sdk-3.0.0.js.map +1 -0
- package/dist/umd/featbit-js-client-sdk.js +2 -0
- package/dist/umd/featbit-js-client-sdk.js.map +1 -0
- package/package.json +22 -24
- package/src/Configuration.ts +234 -0
- package/src/Context.ts +62 -0
- package/src/FbClientBuilder.ts +161 -0
- package/src/FbClientCore.ts +389 -0
- package/src/IContextProperty.ts +4 -0
- package/src/IDataKind.ts +11 -0
- package/src/IFbClient.ts +30 -0
- package/src/IFbClientCore.ts +291 -0
- package/src/IVersionedData.ts +18 -0
- package/src/bootstrap/IBootstrapProvider.ts +5 -0
- package/src/bootstrap/JsonBootstrapProvider.ts +35 -0
- package/src/bootstrap/NullBootstrapProvider.ts +21 -0
- package/src/bootstrap/index.ts +3 -0
- package/src/constants.ts +2 -6
- package/src/data-sources/DataSourceUpdates.ts +93 -0
- package/src/data-sources/createStreamListeners.ts +66 -0
- package/src/data-sources/index.ts +2 -0
- package/src/data-sync/DataSyncMode.ts +4 -0
- package/src/data-sync/IDataSynchronizer.ts +15 -0
- package/src/data-sync/IRequestor.ts +10 -0
- package/src/data-sync/NullDataSynchronizer.ts +15 -0
- package/src/data-sync/PollingDataSynchronizer.ts +111 -0
- package/src/data-sync/Requestor.ts +61 -0
- package/src/data-sync/WebSocketDataSynchronizer.ts +74 -0
- package/src/data-sync/index.ts +9 -0
- package/src/data-sync/types.ts +20 -0
- package/src/data-sync/utils.ts +32 -0
- package/src/errors.ts +41 -0
- package/src/evaluation/EvalResult.ts +36 -0
- package/src/evaluation/Evaluator.ts +27 -0
- package/src/evaluation/IEvalDetail.ts +24 -0
- package/src/evaluation/ReasonKinds.ts +10 -0
- package/src/evaluation/data/IFlag.ts +29 -0
- package/src/evaluation/data/index.ts +1 -0
- package/src/evaluation/index.ts +5 -0
- package/src/events/DefaultEventProcessor.ts +84 -0
- package/src/events/DefaultEventQueue.ts +50 -0
- package/src/events/DefaultEventSender.ts +75 -0
- package/src/events/DefaultEventSerializer.ts +12 -0
- package/src/events/EventDispatcher.ts +128 -0
- package/src/events/EventSerializer.ts +5 -0
- package/src/events/IEventProcessor.ts +9 -0
- package/src/events/IEventQueue.ts +17 -0
- package/src/events/IEventSender.ts +14 -0
- package/src/events/NullEventProcessor.ts +16 -0
- package/src/events/event.ts +130 -0
- package/src/events/index.ts +11 -0
- package/src/index.ts +19 -4
- package/src/integrations/TestLogger.ts +25 -0
- package/src/integrations/index.ts +2 -0
- package/src/integrations/test_data/FlagBuilder.ts +60 -0
- package/src/integrations/test_data/TestData.ts +58 -0
- package/src/integrations/test_data/TestDataSynchronizer.ts +50 -0
- package/src/integrations/test_data/index.ts +5 -0
- package/src/logging/BasicLogger.ts +108 -0
- package/src/logging/IBasicLoggerOptions.ts +46 -0
- package/src/logging/ILogger.ts +49 -0
- package/src/logging/LogLevel.ts +9 -0
- package/src/logging/SafeLogger.ts +70 -0
- package/src/logging/format.ts +154 -0
- package/src/logging/index.ts +6 -0
- package/src/options/ClientContext.ts +40 -0
- package/src/options/IClientContext.ts +54 -0
- package/src/options/IOptions.ts +124 -0
- package/src/options/IUser.ts +7 -0
- package/src/options/IValidatedOptions.ts +30 -0
- package/src/options/OptionMessages.ts +36 -0
- package/src/options/UserBuilder.ts +36 -0
- package/src/options/Validators.ts +301 -0
- package/src/options/index.ts +8 -0
- package/src/platform/IInfo.ts +82 -0
- package/src/platform/IPlatform.ts +21 -0
- package/src/platform/IStore.ts +119 -0
- package/src/platform/IWebSocket.ts +23 -0
- package/src/platform/browser/BrowserInfo.ts +25 -0
- package/src/platform/browser/BrowserPlatform.ts +20 -0
- package/src/platform/browser/BrowserRequests.ts +7 -0
- package/src/platform/browser/BrowserWebSocket.ts +143 -0
- package/src/platform/browser/FbClient.ts +59 -0
- package/src/platform/browser/LocalStorageStore.ts +153 -0
- package/src/platform/index.ts +4 -0
- package/src/platform/requests.ts +77 -0
- package/src/store/DataKinds.ts +7 -0
- package/src/store/IDataSourceUpdates.ts +49 -0
- package/src/store/InMemoryStore.ts +115 -0
- package/src/store/index.ts +5 -0
- package/src/store/serialization.ts +52 -0
- package/src/store/store.ts +38 -0
- package/src/utils/Emits.ts +76 -0
- package/src/utils/EventEmitter.ts +129 -0
- package/src/utils/IEventEmitter.ts +15 -0
- package/src/utils/Regex.ts +22 -0
- package/src/utils/ValueConverters.ts +56 -0
- package/src/utils/VoidFunction.ts +1 -0
- package/src/utils/canonicalizeUri.ts +4 -0
- package/src/utils/http.ts +40 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/isNullOrUndefined.ts +3 -0
- package/src/utils/serializeUser.ts +28 -0
- package/src/utils/sleep.ts +6 -0
- package/src/version.ts +1 -0
- package/esm/constants.d.ts +0 -6
- package/esm/constants.js +0 -7
- package/esm/constants.js.map +0 -1
- package/esm/events.d.ts +0 -14
- package/esm/events.js +0 -27
- package/esm/events.js.map +0 -1
- package/esm/featbit.d.ts +0 -34
- package/esm/featbit.js +0 -382
- package/esm/featbit.js.map +0 -1
- package/esm/index.d.ts +0 -4
- package/esm/index.js +0 -5
- package/esm/index.js.map +0 -1
- package/esm/logger.d.ts +0 -4
- package/esm/logger.js +0 -20
- package/esm/logger.js.map +0 -1
- package/esm/network.service.d.ts +0 -27
- package/esm/network.service.js +0 -288
- package/esm/network.service.js.map +0 -1
- package/esm/optionMessages.d.ts +0 -5
- package/esm/optionMessages.js +0 -16
- package/esm/optionMessages.js.map +0 -1
- package/esm/queue.d.ts +0 -8
- package/esm/queue.js +0 -35
- package/esm/queue.js.map +0 -1
- package/esm/store.d.ts +0 -20
- package/esm/store.js +0 -143
- package/esm/store.js.map +0 -1
- package/esm/throttleutil.d.ts +0 -9
- package/esm/throttleutil.js +0 -133
- package/esm/throttleutil.js.map +0 -1
- package/esm/types.d.ts +0 -94
- package/esm/types.js +0 -24
- package/esm/types.js.map +0 -1
- package/esm/umd.d.ts +0 -2
- package/esm/utils.d.ts +0 -11
- package/esm/utils.js +0 -142
- package/esm/utils.js.map +0 -1
- package/src/events.ts +0 -29
- package/src/featbit.ts +0 -343
- package/src/logger.ts +0 -13
- package/src/network.service.ts +0 -223
- package/src/optionMessages.ts +0 -13
- package/src/queue.ts +0 -23
- package/src/store.ts +0 -169
- package/src/throttleutil.ts +0 -72
- package/src/types.ts +0 -113
- package/src/umd.ts +0 -15
- package/src/utils.ts +0 -173
- package/umd/featbit-js-client-sdk-2.0.1.js +0 -2
- package/umd/featbit-js-client-sdk-2.0.1.js.map +0 -1
- package/umd/featbit-js-client-sdk.js +0 -2
- package/umd/featbit-js-client-sdk.js.map +0 -1
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { IFbClientCore } from "./IFbClientCore";
|
|
2
|
+
import { IPlatform } from "./platform/IPlatform";
|
|
3
|
+
import Configuration from "./Configuration";
|
|
4
|
+
import { ILogger } from "./logging/ILogger";
|
|
5
|
+
import ClientContext from "./options/ClientContext";
|
|
6
|
+
import DataSourceUpdates from "./data-sources/DataSourceUpdates";
|
|
7
|
+
import { createStreamListeners } from "./data-sources/createStreamListeners";
|
|
8
|
+
import { IEvalDetail } from "./evaluation/IEvalDetail";
|
|
9
|
+
import WebSocketDataSynchronizer from "./data-sync/WebSocketDataSynchronizer";
|
|
10
|
+
import PollingDataSynchronizer from "./data-sync/PollingDataSynchronizer";
|
|
11
|
+
import Requestor from "./data-sync/Requestor";
|
|
12
|
+
import { IDataSynchronizer } from "./data-sync/IDataSynchronizer";
|
|
13
|
+
import DataKinds from "./store/DataKinds";
|
|
14
|
+
import Evaluator from "./evaluation/Evaluator";
|
|
15
|
+
import { ReasonKinds } from "./evaluation/ReasonKinds";
|
|
16
|
+
import { ClientError } from "./errors";
|
|
17
|
+
import Context from "./Context";
|
|
18
|
+
import { IConvertResult, ValueConverters } from "./utils/ValueConverters";
|
|
19
|
+
import { NullDataSynchronizer } from "./data-sync/NullDataSynchronizer";
|
|
20
|
+
import { IEventProcessor } from "./events/IEventProcessor";
|
|
21
|
+
import { NullEventProcessor } from "./events/NullEventProcessor";
|
|
22
|
+
import { DefaultEventProcessor } from "./events/DefaultEventProcessor";
|
|
23
|
+
import { IStore } from "./platform/IStore";
|
|
24
|
+
import { IOptions } from "./options/IOptions";
|
|
25
|
+
import { MetricEvent } from "./events/event";
|
|
26
|
+
import { DataSyncModeEnum } from "./data-sync/DataSyncMode";
|
|
27
|
+
import { IUser } from "./options/IUser";
|
|
28
|
+
import { UserValidator } from "./options/Validators";
|
|
29
|
+
|
|
30
|
+
enum ClientState {
|
|
31
|
+
Initializing,
|
|
32
|
+
Initialized,
|
|
33
|
+
Failed,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface IClientCallbacks {
|
|
37
|
+
onError: (err: Error) => void;
|
|
38
|
+
onFailed: (err: Error) => void;
|
|
39
|
+
onReady: () => void;
|
|
40
|
+
// Called whenever flags change, if there are listeners.
|
|
41
|
+
onUpdate: (keys: string[]) => void;
|
|
42
|
+
// Method to check if event listeners have been registered.
|
|
43
|
+
// If none are registered, then onUpdate will never be called.
|
|
44
|
+
hasEventListeners: () => boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export class FbClientCore implements IFbClientCore {
|
|
48
|
+
private state: ClientState = ClientState.Initializing;
|
|
49
|
+
|
|
50
|
+
private store?: IStore;
|
|
51
|
+
|
|
52
|
+
private dataSynchronizer?: IDataSynchronizer;
|
|
53
|
+
|
|
54
|
+
private eventProcessor?: IEventProcessor;
|
|
55
|
+
|
|
56
|
+
private evaluator?: Evaluator;
|
|
57
|
+
|
|
58
|
+
private initResolve?: (value: IFbClientCore | PromiseLike<IFbClientCore>) => void;
|
|
59
|
+
|
|
60
|
+
private initReject?: (err: Error) => void;
|
|
61
|
+
|
|
62
|
+
private rejectionReason: Error | undefined;
|
|
63
|
+
|
|
64
|
+
private initializedPromise?: Promise<IFbClientCore>;
|
|
65
|
+
|
|
66
|
+
private logger?: ILogger;
|
|
67
|
+
|
|
68
|
+
private config: Configuration;
|
|
69
|
+
|
|
70
|
+
private dataSourceUpdates?: DataSourceUpdates;
|
|
71
|
+
|
|
72
|
+
private onError: (err: Error) => void;
|
|
73
|
+
|
|
74
|
+
private onFailed: (err: Error) => void;
|
|
75
|
+
|
|
76
|
+
private onReady: () => void;
|
|
77
|
+
|
|
78
|
+
constructor(
|
|
79
|
+
private options: IOptions,
|
|
80
|
+
private platform: IPlatform,
|
|
81
|
+
callbacks: IClientCallbacks
|
|
82
|
+
) {
|
|
83
|
+
this.onError = callbacks.onError;
|
|
84
|
+
this.onFailed = callbacks.onFailed;
|
|
85
|
+
this.onReady = callbacks.onReady;
|
|
86
|
+
|
|
87
|
+
const {onUpdate, hasEventListeners} = callbacks;
|
|
88
|
+
const config = new Configuration(options);
|
|
89
|
+
|
|
90
|
+
if (!config.sdkKey && !config.offline) {
|
|
91
|
+
throw new Error('You must configure the client with an SDK key');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!config.user) {
|
|
95
|
+
throw new Error('You must configure the client with a user');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.config = config;
|
|
99
|
+
this.logger = config.logger;
|
|
100
|
+
|
|
101
|
+
this.init(platform, onUpdate, hasEventListeners);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private async init(platform: IPlatform, onUpdate: (keys: string[]) => void, hasEventListeners: () => boolean) {
|
|
105
|
+
const clientContext = new ClientContext(this.config.sdkKey, this.config, platform);
|
|
106
|
+
this.store = this.config.storeFactory(clientContext);
|
|
107
|
+
this.store.identify(this.config.user);
|
|
108
|
+
this.dataSourceUpdates = new DataSourceUpdates(this.store, hasEventListeners, onUpdate);
|
|
109
|
+
this.evaluator = new Evaluator(this.store);
|
|
110
|
+
|
|
111
|
+
// use bootstrap provider to populate store
|
|
112
|
+
await this.config.bootstrapProvider.populate(this.config.user.keyId, this.dataSourceUpdates);
|
|
113
|
+
|
|
114
|
+
if (this.config.offline) {
|
|
115
|
+
this.eventProcessor = new NullEventProcessor();
|
|
116
|
+
this.dataSynchronizer = new NullDataSynchronizer();
|
|
117
|
+
|
|
118
|
+
this.initSuccess();
|
|
119
|
+
} else {
|
|
120
|
+
this.eventProcessor = new DefaultEventProcessor(clientContext);
|
|
121
|
+
|
|
122
|
+
const listeners = createStreamListeners(this.dataSourceUpdates, this.logger, {
|
|
123
|
+
put: () => this.initSuccess(),
|
|
124
|
+
patch: () => this.initSuccess()
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const dataSynchronizer = this.config.dataSyncMode === DataSyncModeEnum.STREAMING
|
|
128
|
+
? new WebSocketDataSynchronizer(
|
|
129
|
+
this.config.sdkKey,
|
|
130
|
+
this.config.user,
|
|
131
|
+
clientContext,
|
|
132
|
+
platform.webSocket,
|
|
133
|
+
() => this.store!.version,
|
|
134
|
+
listeners,
|
|
135
|
+
this.config.webSocketPingInterval
|
|
136
|
+
)
|
|
137
|
+
: new PollingDataSynchronizer(
|
|
138
|
+
this.config,
|
|
139
|
+
new Requestor(this.config.sdkKey, this.config, this.platform.info, this.platform.requests),
|
|
140
|
+
() => this.store!.version,
|
|
141
|
+
listeners,
|
|
142
|
+
(e) => this.dataSourceErrorHandler(e),
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
this.dataSynchronizer = this.config.dataSynchronizerFactory?.(
|
|
146
|
+
clientContext,
|
|
147
|
+
this.store,
|
|
148
|
+
this.dataSourceUpdates,
|
|
149
|
+
() => this.initSuccess(),
|
|
150
|
+
(e) => this.dataSourceErrorHandler(e),
|
|
151
|
+
) ?? dataSynchronizer;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
this.start();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async identify(user: IUser) {
|
|
158
|
+
const validator = new UserValidator();
|
|
159
|
+
if (!validator.is(user)) {
|
|
160
|
+
validator.messages.forEach((error: string) => {
|
|
161
|
+
this.logger?.warn(error);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
this.store!.identify(user);
|
|
168
|
+
this.dataSynchronizer!.identify(user);
|
|
169
|
+
const [ flags ] = this.store!.all(DataKinds.Flags);
|
|
170
|
+
if (Object.keys(flags).length === 0) {
|
|
171
|
+
await this.config.bootstrapProvider.populate(user.keyId, this.dataSourceUpdates!);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private start() {
|
|
176
|
+
if (this.config.offline) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this.dataSynchronizer!.start();
|
|
181
|
+
setTimeout(() => {
|
|
182
|
+
if (!this.initialized()) {
|
|
183
|
+
const msg = `FbClient failed to start successfully within ${ this.config.startWaitTime } milliseconds. ` +
|
|
184
|
+
'This error usually indicates a connection issue with FeatBit or an invalid sdkKey.' +
|
|
185
|
+
'Please double-check your sdkKey and streamingUri/pollingUri configuration. ' +
|
|
186
|
+
'We will continue to initialize the FbClient, it still have a chance to get to work ' +
|
|
187
|
+
'if it\'s a temporary network issue';
|
|
188
|
+
|
|
189
|
+
const error = new Error(msg);
|
|
190
|
+
this.state = ClientState.Failed;
|
|
191
|
+
this.rejectionReason = error;
|
|
192
|
+
this.initReject?.(error);
|
|
193
|
+
|
|
194
|
+
return this.logger?.warn(msg);
|
|
195
|
+
}
|
|
196
|
+
}, this.config.startWaitTime);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
initialized(): boolean {
|
|
200
|
+
return this.state === ClientState.Initialized;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
waitForInitialization(): Promise<IFbClientCore> {
|
|
204
|
+
// An initialization promise is only created if someone is going to use that promise.
|
|
205
|
+
// If we always created an initialization promise, and there was no call waitForInitialization
|
|
206
|
+
// by the time the promise was rejected, then that would result in an unhandled promise
|
|
207
|
+
// rejection.
|
|
208
|
+
|
|
209
|
+
// Initialization promise was created by a previous call to waitForInitialization.
|
|
210
|
+
if (this.initializedPromise) {
|
|
211
|
+
return this.initializedPromise;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Initialization completed before waitForInitialization was called, so we have completed
|
|
215
|
+
// and there was no promise. So we make a resolved promise and return it.
|
|
216
|
+
if (this.state === ClientState.Initialized) {
|
|
217
|
+
this.initializedPromise = Promise.resolve(this);
|
|
218
|
+
return this.initializedPromise;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Initialization failed before waitForInitialization was called, so we have completed
|
|
222
|
+
// and there was no promise. So we make a rejected promise and return it.
|
|
223
|
+
if (this.state === ClientState.Failed) {
|
|
224
|
+
this.initializedPromise = Promise.reject(this.rejectionReason);
|
|
225
|
+
return this.initializedPromise;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (!this.initializedPromise) {
|
|
229
|
+
this.initializedPromise = new Promise((resolve, reject) => {
|
|
230
|
+
this.initResolve = resolve;
|
|
231
|
+
this.initReject = reject;
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return this.initializedPromise;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
boolVariation(
|
|
238
|
+
key: string,
|
|
239
|
+
defaultValue: boolean
|
|
240
|
+
): boolean {
|
|
241
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.bool).value!;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
boolVariationDetail(
|
|
245
|
+
key: string,
|
|
246
|
+
defaultValue: boolean
|
|
247
|
+
): IEvalDetail<boolean> {
|
|
248
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.bool);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
jsonVariation(key: string, defaultValue: any): any {
|
|
252
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.json).value!;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
jsonVariationDetail(key: string, defaultValue: any): IEvalDetail<any> {
|
|
256
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.json);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
numberVariation(key: string, defaultValue: number): number {
|
|
260
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.number).value!;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
numberVariationDetail(key: string, defaultValue: number): IEvalDetail<number> {
|
|
264
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.number);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
stringVariation(key: string, defaultValue: string): string {
|
|
268
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.string).value!;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
stringVariationDetail(key: string, defaultValue: string): IEvalDetail<string> {
|
|
272
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.string);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
variation(key: string, defaultValue: string): string {
|
|
276
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.string).value!;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
variationDetail(key: string, defaultValue: string): IEvalDetail<string> {
|
|
280
|
+
return this.evaluateCore(key, defaultValue, ValueConverters.string);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
getAllVariations(): Promise<IEvalDetail<string>[]> {
|
|
284
|
+
const context = Context.fromUser(this.config.user);
|
|
285
|
+
if (!context.valid) {
|
|
286
|
+
const error = new ClientError(
|
|
287
|
+
`${ context.message ?? 'User not valid;' } returning default value.`,
|
|
288
|
+
);
|
|
289
|
+
this.onError(error);
|
|
290
|
+
|
|
291
|
+
return Promise.resolve([]);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const [flags, _] = this.store!.all(DataKinds.Flags);
|
|
295
|
+
const result = Object.keys(flags).map(flagKey => {
|
|
296
|
+
const evalResult = this.evaluator!.evaluate(flagKey);
|
|
297
|
+
return {flagKey, kind: evalResult.kind, reason: evalResult.reason, value: evalResult.value?.variation};
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
return Promise.resolve(result);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
async close(): Promise<void> {
|
|
304
|
+
await this.eventProcessor!.close();
|
|
305
|
+
this.dataSynchronizer?.close();
|
|
306
|
+
this.store!.close();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
track(eventName: string, metricValue?: number | undefined): void {
|
|
310
|
+
const metricEvent = new MetricEvent(this.config.user, eventName, this.platform.info.appType, metricValue ?? 1);
|
|
311
|
+
this.eventProcessor!.record(metricEvent);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
async flush(callback?: (res: boolean) => void): Promise<boolean> {
|
|
316
|
+
try {
|
|
317
|
+
await this.eventProcessor!.flush();
|
|
318
|
+
callback?.(true);
|
|
319
|
+
return true;
|
|
320
|
+
} catch (err) {
|
|
321
|
+
callback?.(false);
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
evaluateCore<TValue>(
|
|
327
|
+
flagKey: string,
|
|
328
|
+
defaultValue: TValue,
|
|
329
|
+
typeConverter: (value: string) => IConvertResult<TValue>
|
|
330
|
+
): IEvalDetail<TValue> {
|
|
331
|
+
const context = Context.fromUser(this.config.user);
|
|
332
|
+
if (!context.valid) {
|
|
333
|
+
const error = new ClientError(
|
|
334
|
+
`${ context.message ?? 'User not valid;' } returning default value.`,
|
|
335
|
+
);
|
|
336
|
+
this.onError(error);
|
|
337
|
+
|
|
338
|
+
return {flagKey, kind: ReasonKinds.Error, reason: error.message, value: defaultValue};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
const evalResult = this.evaluator!.evaluate(flagKey);
|
|
342
|
+
|
|
343
|
+
if (evalResult.kind === ReasonKinds.FlagNotFound) {
|
|
344
|
+
// flag not found, return default value
|
|
345
|
+
const error = new ClientError(evalResult.reason!);
|
|
346
|
+
this.onError(error);
|
|
347
|
+
|
|
348
|
+
return {flagKey, kind: evalResult.kind, reason: evalResult.reason, value: defaultValue};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (!this.initialized()) {
|
|
352
|
+
this.logger?.warn(
|
|
353
|
+
'Variation called before FeatBit client initialization completed (did you wait for the' +
|
|
354
|
+
"'ready' event?)",
|
|
355
|
+
);
|
|
356
|
+
} else {
|
|
357
|
+
// send event
|
|
358
|
+
this.eventProcessor!.record(evalResult.toEvalEvent(this.config.user));
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const {isSucceeded, value} = typeConverter(evalResult.value?.variation!);
|
|
362
|
+
return isSucceeded
|
|
363
|
+
? {flagKey, kind: evalResult.kind, reason: evalResult.reason, value}
|
|
364
|
+
: {flagKey, kind: ReasonKinds.WrongType, reason: 'type mismatch', value: defaultValue};
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private dataSourceErrorHandler(e: any) {
|
|
368
|
+
const error =
|
|
369
|
+
e.code === 401 ? new Error('Authentication failed. Double check your SDK key.') : e;
|
|
370
|
+
|
|
371
|
+
this.onError(error);
|
|
372
|
+
this.onFailed(error);
|
|
373
|
+
|
|
374
|
+
if (!this.initialized()) {
|
|
375
|
+
this.state = ClientState.Failed;
|
|
376
|
+
this.rejectionReason = error;
|
|
377
|
+
this.initReject?.(error);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
private initSuccess() {
|
|
382
|
+
if (!this.initialized()) {
|
|
383
|
+
this.state = ClientState.Initialized;
|
|
384
|
+
this.logger?.info('FbClient started successfully.');
|
|
385
|
+
this.initResolve?.(this);
|
|
386
|
+
this.onReady();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
package/src/IDataKind.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Used internally to describe the type of data being queried or updated, such as feature flags or
|
|
3
|
+
* user segments.
|
|
4
|
+
*/
|
|
5
|
+
export interface IDataKind {
|
|
6
|
+
/**
|
|
7
|
+
* A string such as `"flags"` or `"segments"` which can be used in keys to distinguish this
|
|
8
|
+
* kind of data from other kinds.
|
|
9
|
+
*/
|
|
10
|
+
namespace: string;
|
|
11
|
+
}
|
package/src/IFbClient.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { IFbClientCore } from "./IFbClientCore";
|
|
2
|
+
import { IEventEmitter } from "./utils/IEventEmitter";
|
|
3
|
+
|
|
4
|
+
export interface IFbClient extends IFbClientCore, IEventEmitter {
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* Registers an event listener that will be called when the client triggers some type of event.
|
|
8
|
+
*
|
|
9
|
+
* This is the standard `on` method inherited from Node's `EventEmitter`; see the
|
|
10
|
+
* {@link https://nodejs.org/api/events.html#events_class_eventemitter|Node API docs} for more
|
|
11
|
+
* details on how to manage event listeners. Here is a description of the event types defined
|
|
12
|
+
* by `FbClient`.
|
|
13
|
+
*
|
|
14
|
+
* - `"ready"`: Sent only once, when the client has successfully connected to FeatBit.
|
|
15
|
+
* Alternately, you can detect this with [[waitForInitialization]].
|
|
16
|
+
* - `"failed"`: Sent only once, if the client has permanently failed to connect to FeatBit.
|
|
17
|
+
* Alternately, you can detect this with [[waitForInitialization]].
|
|
18
|
+
* - `"error"`: Contains an error object describing some abnormal condition that the client has detected
|
|
19
|
+
* (such as a network error).
|
|
20
|
+
* - `"update"`: The client has received a change to a feature flag. The event parameter is an object
|
|
21
|
+
* containing a single property, `key`, the flag key. Note that this does not necessarily mean the flag's
|
|
22
|
+
* value has changed for any particular context, only that some part of the flag configuration was changed.
|
|
23
|
+
* - `"update:KEY"`: The client has received a change to the feature flag whose key is KEY. This is the
|
|
24
|
+
* same as `"update"` but allows you to listen for a specific flag.
|
|
25
|
+
*
|
|
26
|
+
* @param event the name of the event to listen for
|
|
27
|
+
* @param listener the function to call when the event happens
|
|
28
|
+
*/
|
|
29
|
+
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
30
|
+
}
|