@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
package/README.md
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
> **Attention**
|
|
2
|
+
>
|
|
3
|
+
> If you are using the v1 or v2 of the SDK, please refer to this [doc](https://github.com/featbit/featbit-js-client-sdk/tree/v2)
|
|
4
|
+
|
|
5
|
+
# FeatBit Client SDK for JavaScript
|
|
2
6
|
|
|
3
7
|
## Introduction
|
|
4
8
|
|
|
5
|
-
This is the
|
|
9
|
+
This is the Client-Side SDK for the 100% open-source feature flags management platform [FeatBit](https://github.com/featbit/featbit).
|
|
6
10
|
|
|
7
11
|
Be aware, this is a client side SDK, it is intended for use in a single-user context, which can be mobile, desktop or embedded applications. This SDK can only be ran in a browser environment, it is not suitable for NodeJs applications.
|
|
8
12
|
|
|
@@ -11,127 +15,137 @@ Be aware, this is a client side SDK, it is intended for use in a single-user con
|
|
|
11
15
|
### Installation
|
|
12
16
|
|
|
13
17
|
```bash
|
|
14
|
-
npm install @featbit/js-client-sdk
|
|
18
|
+
npm install --save @featbit/js-client-sdk
|
|
15
19
|
```
|
|
16
|
-
|
|
17
20
|
### Prerequisite
|
|
18
21
|
|
|
19
|
-
Before using the SDK, you need to obtain the environment secret and SDK URLs.
|
|
22
|
+
Before using the SDK, you need to obtain the environment secret (the sdkKey) and SDK URLs.
|
|
20
23
|
|
|
21
24
|
Follow the documentation below to retrieve these values
|
|
22
|
-
|
|
23
|
-
- [How to get
|
|
24
|
-
- [How to get the SDK URLs](https://docs.featbit.co/sdk/faq#how-to-get-the-sdk-urls)
|
|
25
|
+
- [How to get environment secret](https://docs.featbit.co/sdk/faq#how-to-get-the-environment-secret)
|
|
26
|
+
- [How to get SDK URLs](https://docs.featbit.co/sdk/faq#how-to-get-the-sdk-urls)
|
|
25
27
|
|
|
26
28
|
### Quick Start
|
|
27
29
|
|
|
28
|
-
The following code demonstrates
|
|
29
|
-
1. Initialize the SDK
|
|
30
|
-
2. Evaluate flag
|
|
31
|
-
3. Subscribe to flag change
|
|
30
|
+
The following code demonstrates the basic usage of `@featbit/js-client-sdk`.
|
|
32
31
|
|
|
33
32
|
```javascript
|
|
34
|
-
import
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
import { FbClientBuilder, UserBuilder } from "@featbit/js-client-sdk";
|
|
34
|
+
|
|
35
|
+
const bob = new UserBuilder('a-unique-key-of-user')
|
|
36
|
+
.name('bob')
|
|
37
|
+
.custom('age', '18')
|
|
38
|
+
.custom('country', 'FR')
|
|
39
|
+
.build();
|
|
40
|
+
|
|
41
|
+
// setup SDK client with websocket streaming
|
|
42
|
+
const fbClient = new FbClientBuilder()
|
|
43
|
+
.sdkKey("your_sdk_key")
|
|
44
|
+
.streamingUri('ws://localhost:5100')
|
|
45
|
+
.eventsUri("http://localhost:5100")
|
|
46
|
+
.user(bob)
|
|
47
|
+
.build();
|
|
48
|
+
|
|
49
|
+
(async () => {
|
|
50
|
+
// wait for the SDK to be initialized
|
|
51
|
+
try {
|
|
52
|
+
await fbClient.waitForInitialization();
|
|
53
|
+
} catch(err) {
|
|
54
|
+
// failed to initialize the SDK
|
|
55
|
+
console.log(err);
|
|
48
56
|
}
|
|
49
|
-
};
|
|
50
57
|
|
|
51
|
-
//
|
|
52
|
-
|
|
58
|
+
// flag to be evaluated
|
|
59
|
+
const flagKey = "game-runner";
|
|
53
60
|
|
|
54
|
-
//
|
|
55
|
-
const
|
|
61
|
+
// evaluate a feature flag for a given user
|
|
62
|
+
const boolVariation = await fbClient.boolVariation(flagKey, false);
|
|
56
63
|
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
// switch user
|
|
65
|
+
const alice = new UserBuilder('another-unique-key-of-user')
|
|
66
|
+
.name('alice')
|
|
67
|
+
.custom('country', 'UK')
|
|
68
|
+
.custom('age', 36)
|
|
69
|
+
.build();
|
|
70
|
+
|
|
71
|
+
await fbClient.identify(alice);
|
|
72
|
+
})();
|
|
65
73
|
```
|
|
66
74
|
|
|
67
75
|
## Examples
|
|
68
|
-
|
|
69
|
-
- [Vue](https://github.com/featbit/featbit-samples/tree/main/samples/dino-game/interactive-demo-vue)
|
|
76
|
+
- [web App](./examples/console-app)
|
|
70
77
|
- For how to use FeatBit with React, please refer to the [react-client-sdk](https://github.com/featbit/featbit-react-client-sdk)
|
|
71
78
|
|
|
72
79
|
## SDK
|
|
73
80
|
|
|
74
|
-
###
|
|
81
|
+
### FbClient
|
|
75
82
|
|
|
76
|
-
|
|
83
|
+
The `FbClient` is the heart of the SDK which provides access to FeatBit server. Applications should instantiate a single instance for the lifetime of the application.
|
|
77
84
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
streamingUri:"ws://localhost:5100",
|
|
82
|
-
eventsUri:"http://localhost:5100",
|
|
83
|
-
user: {
|
|
84
|
-
name: "Bot",
|
|
85
|
-
keyId: "bot-id",
|
|
86
|
-
customizedProperties: [
|
|
87
|
-
{
|
|
88
|
-
"name": "level",
|
|
89
|
-
"value": "high"
|
|
90
|
-
}
|
|
91
|
-
]
|
|
92
|
-
}
|
|
93
|
-
};
|
|
85
|
+
`FbClientBuilder` is used to construct a `FbClient` instance. The builder exposes methods to configure the SDK, and finally to create the `FbClient` instance.
|
|
86
|
+
|
|
87
|
+
#### FbClient Using Streaming
|
|
94
88
|
|
|
95
|
-
|
|
89
|
+
```javascript
|
|
90
|
+
import { FbClientBuilder, UserBuilder } from "@featbit/js-client-sdk";
|
|
91
|
+
|
|
92
|
+
const user = new UserBuilder('a-unique-key-of-user')
|
|
93
|
+
.name('bob')
|
|
94
|
+
.build();
|
|
95
|
+
|
|
96
|
+
const fbClient = new FbClientBuilder()
|
|
97
|
+
.sdkKey("your_sdk_key")
|
|
98
|
+
.streamingUri('ws://localhost:5100')
|
|
99
|
+
.eventsUri("http://localhost:5100")
|
|
100
|
+
.user(user)
|
|
101
|
+
.build();
|
|
96
102
|
```
|
|
103
|
+
#### FbClient Using Polling
|
|
97
104
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
```javascript
|
|
106
|
+
import { FbClientBuilder, UserBuilder, DataSyncMode } from "@featbit/browser-server-sdk";
|
|
107
|
+
|
|
108
|
+
const user = new UserBuilder('a-unique-key-of-user')
|
|
109
|
+
.name('bob')
|
|
110
|
+
.build();
|
|
111
|
+
|
|
112
|
+
const fbClient = new FbClientBuilder()
|
|
113
|
+
.sdkKey("your_sdk_key")
|
|
114
|
+
.dataSyncMode(DataSyncMode.POLLING)
|
|
115
|
+
.pollingUri('http://localhost:5100')
|
|
116
|
+
.eventsUri("http://localhost:5100")
|
|
117
|
+
.pollingInterval(10000)
|
|
118
|
+
.build();
|
|
111
119
|
```
|
|
112
120
|
|
|
113
|
-
|
|
121
|
+
#### IUser
|
|
122
|
+
|
|
123
|
+
`IUser` defines the attributes of a user for whom you are evaluating feature flags. IUser has two built-in attributes: key and name. The only mandatory attribute of a IUser is the key, which must uniquely identify each user.
|
|
124
|
+
|
|
125
|
+
Besides these built-in properties, you can define any additional attributes associated with the user using `custom(string key, string value)` method on UserBuilder. Both built-in attributes and custom attributes can be referenced in targeting rules, and are included in analytics data.
|
|
126
|
+
|
|
127
|
+
`UserBuilder` is used to construct a `IUser` instance. The builder exposes methods to configure the IUser, and finally to create the IUser instance.
|
|
114
128
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
| appType | `javascript` | The app type. |
|
|
129
|
+
```javascript
|
|
130
|
+
import { UserBuilder } from "@featbit/js-client-sdk";
|
|
131
|
+
|
|
132
|
+
const bob = new UserBuilder("unique_key_for_bob")
|
|
133
|
+
.name("Bob")
|
|
134
|
+
.custom('age', 18)
|
|
135
|
+
.custom('country', 'FR')
|
|
136
|
+
.build();
|
|
137
|
+
```
|
|
125
138
|
|
|
126
139
|
### Bootstrap
|
|
127
|
-
If you already have the feature flags available,
|
|
128
|
-
|
|
140
|
+
If you already have the feature flags available, you can pass them to the SDK instead of requesting from the remote.
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
> **_NOTE:_** The bootstrapped flags will be overridden by the remote flags if they are available.
|
|
129
144
|
|
|
130
145
|
```javascript
|
|
131
146
|
// define the option with the bootstrap parameter
|
|
132
|
-
const
|
|
147
|
+
const options = {
|
|
133
148
|
...
|
|
134
|
-
// the array should contain all your feature flags
|
|
135
149
|
bootstrap = [{
|
|
136
150
|
// feature flag key name
|
|
137
151
|
id: string,
|
|
@@ -139,41 +153,57 @@ const option = {
|
|
|
139
153
|
variation: string,
|
|
140
154
|
// variation data type, string will be used if not specified
|
|
141
155
|
variationType: VariationDataType
|
|
142
|
-
}]
|
|
143
|
-
...
|
|
156
|
+
}]
|
|
144
157
|
}
|
|
145
158
|
|
|
146
|
-
fbClient.
|
|
159
|
+
const fbClient = new FbClientBuilder(options).build();
|
|
160
|
+
// or
|
|
161
|
+
const fbClient = new FbClientBuilder()
|
|
162
|
+
//... other options
|
|
163
|
+
.bootstrap(options.bootstrap)
|
|
164
|
+
.build();
|
|
147
165
|
```
|
|
148
166
|
|
|
149
|
-
|
|
167
|
+
### Evaluation
|
|
168
|
+
|
|
169
|
+
After initialization, the SDK has all the feature flags locally, and it does not need to request the remote server for any feature flag evaluation. All evaluation is done locally and synchronously, the average evaluation time is less than 1 ms.
|
|
170
|
+
|
|
171
|
+
There is a `variation` method that returns a flag value, and a `variationDetail` method that returns an object
|
|
172
|
+
describing how the value was determined for each type.
|
|
173
|
+
|
|
174
|
+
- boolVariation/boolVariationDetail
|
|
175
|
+
- stringVariation/stringVariationDetail
|
|
176
|
+
- numberVariation/numberVariationDetail
|
|
177
|
+
- jsonVariation/jsonVariationDetail
|
|
178
|
+
|
|
179
|
+
Variation calls take the feature flag key and a default value. If any error makes it impossible to
|
|
180
|
+
evaluate the flag (for instance, the feature flag key does not match any existing flag), default value is returned.
|
|
150
181
|
|
|
151
182
|
```javascript
|
|
152
|
-
//
|
|
153
|
-
const
|
|
154
|
-
// feature flag key name
|
|
155
|
-
id: string,
|
|
156
|
-
// variation value
|
|
157
|
-
variation: string,
|
|
158
|
-
// variation data type, string will used if not specified
|
|
159
|
-
variationType: VariationDataType
|
|
160
|
-
}]
|
|
161
|
-
|
|
162
|
-
fbClient.bootstrap(featureflags);
|
|
163
|
-
```
|
|
183
|
+
// flag to be evaluated
|
|
184
|
+
const flagKey = "game-runner";
|
|
164
185
|
|
|
165
|
-
|
|
186
|
+
// evaluate a feature flag for a given user
|
|
187
|
+
const boolVariation = await fbClient.boolVariation(flagKey, false);
|
|
166
188
|
|
|
167
|
-
|
|
189
|
+
// evaluate a boolean flag for a given user with evaluation detail
|
|
190
|
+
const boolVariationDetail = await fbClient.boolVariationDetail(flagKey, false);
|
|
191
|
+
```
|
|
168
192
|
|
|
169
|
-
|
|
193
|
+
### Offline Mode
|
|
170
194
|
|
|
195
|
+
In some situations, you might want to stop making remote calls to FeatBit. Here is how:
|
|
171
196
|
```javascript
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
197
|
+
import { FbClientBuilder } from "@featbit/browser-server-sdk";
|
|
198
|
+
|
|
199
|
+
const fbClient = new FbClientBuilder()
|
|
200
|
+
//... other options
|
|
201
|
+
.offline(true)
|
|
202
|
+
.build();
|
|
203
|
+
|
|
176
204
|
```
|
|
205
|
+
When Offline mode is enabled, you should provide the flags with the [bootstrap](#bootstrap) option,
|
|
206
|
+
otherwise, the SDK would return the defaul value you passed to the `variation` method.
|
|
177
207
|
|
|
178
208
|
### Events
|
|
179
209
|
|
|
@@ -184,27 +214,25 @@ To find out when the client is ready, you can use one of two mechanisms: events
|
|
|
184
214
|
The client object can emit JavaScript events. It emits a ready event when it receives initial flag values from the server. You can listen for this event to determine when the client is ready to evaluate flags.
|
|
185
215
|
|
|
186
216
|
```javascript
|
|
187
|
-
fbClient.on('ready', (
|
|
188
|
-
// data has the following structure [ {id: 'featureFlagKey', variation: variationValue} ]
|
|
189
|
-
// variationValue has the type as defined on remote
|
|
217
|
+
fbClient.on('ready', () => {
|
|
190
218
|
var flagValue = fbClient.variation("YOUR_FEATURE_KEY", defaultValue);
|
|
191
219
|
});
|
|
192
220
|
```
|
|
193
221
|
|
|
194
|
-
Or, you can use a promise instead of an event. The SDK has a method that
|
|
222
|
+
Or, you can use a promise instead of an event. The SDK has a method that returns a promise for initialization: **waitForInitialization()**. The behavior of waitUntilReady() is equivalent to the ready event. The promise resolves when the client receives its initial flag data. As with all promises, you can either use .then() to provide a callback, or use await if you are writing asynchronous code.
|
|
195
223
|
|
|
196
224
|
```javascript
|
|
197
|
-
fbClient.
|
|
225
|
+
fbClient.waitForInitialization().then((data) => {
|
|
198
226
|
// data has the following structure [ {id: 'featureFlagKey', variation: variationValue } ]
|
|
199
227
|
// variationValue has the type as defined on remote
|
|
200
228
|
// initialization succeeded, flag values are now available
|
|
201
229
|
});
|
|
202
230
|
// or, with await:
|
|
203
|
-
const featureFlags = await fbClient.
|
|
231
|
+
const featureFlags = await fbClient.waitForInitialization();
|
|
204
232
|
// initialization succeeded, flag values are now available
|
|
205
233
|
```
|
|
206
234
|
|
|
207
|
-
The SDK only decides initialization has failed if it receives an error response indicating that the environment ID is invalid. If it has trouble connecting to
|
|
235
|
+
The SDK only decides initialization has failed if it receives an error response indicating that the environment ID is invalid. If it has trouble connecting to FeatBit, it will keep retrying until it succeeds.
|
|
208
236
|
|
|
209
237
|
#### Subscribe to flag(s) changes
|
|
210
238
|
|
|
@@ -212,10 +240,7 @@ To get notified when a feature flag is changed, we offer two methods
|
|
|
212
240
|
- subscribe to the changes of any feature flag(s)
|
|
213
241
|
|
|
214
242
|
```javascript
|
|
215
|
-
fbClient.on('
|
|
216
|
-
// changes has this structure [{id: 'the feature_flag_key', oldValue: theOldValue, newValue: theNewValue }]
|
|
217
|
-
// the type of theOldValue and theNewValue is defined on FeatBit
|
|
218
|
-
|
|
243
|
+
fbClient.on('update', (keys: string[]) => {
|
|
219
244
|
// do something when any feature flag changes
|
|
220
245
|
});
|
|
221
246
|
|
|
@@ -224,66 +249,53 @@ fbClient.on('ff_update', (changes) => {
|
|
|
224
249
|
|
|
225
250
|
```javascript
|
|
226
251
|
// replace feature_flag_key with your feature flag key
|
|
227
|
-
fbClient.on('
|
|
228
|
-
// change has this structure {id: 'the feature_flag_key', oldValue: theOldValue, newValue: theNewValue }
|
|
229
|
-
// the type of theOldValue and theNewValue is defined on FeatBit
|
|
230
|
-
|
|
231
|
-
// defaultValue should have the same type as theOldValue and theNewValue
|
|
232
|
-
// this is the prefered way than calling change.newValue as each time you call fbClient.variation,
|
|
233
|
-
// the insight data is sent to server automatically
|
|
252
|
+
fbClient.on('update:feature_flag_key', (key) => {
|
|
234
253
|
const myFeature = fbClient.variation('feature_flag_key', defaultValue);
|
|
235
254
|
});
|
|
236
255
|
|
|
237
256
|
```
|
|
238
257
|
|
|
239
258
|
### Switch user after initialization
|
|
240
|
-
If the user
|
|
259
|
+
If the user changed after some process, login for example, the following method can be used to set the user after initialization.
|
|
241
260
|
|
|
242
261
|
```javascript
|
|
243
262
|
await fbClient.identify(user);
|
|
244
263
|
```
|
|
245
264
|
|
|
246
|
-
We can manually call the method logout, which will switch the current user back to anonymous user if exists already or create a new anonymous user.
|
|
247
|
-
|
|
248
|
-
```javascript
|
|
249
|
-
fbClient.logout(user);
|
|
250
|
-
```
|
|
251
265
|
|
|
252
266
|
### Data synchronization
|
|
253
267
|
|
|
254
|
-
We use
|
|
268
|
+
We use **WebSocket** or **Polling** to make the local data synchronized with the server, and then store them in localStorage by default. Whenever there is any change to a feature flag or its related data, this change will be pushed to the SDK, the average synchronization time is less than **100ms** if WebSocket is configured. Be aware the WebSocket/Polling connection may be interrupted due to internet outage, but it will be resumed automatically once the problem is gone.
|
|
255
269
|
|
|
256
270
|
### Network failure handling
|
|
257
271
|
|
|
258
272
|
As all data is stored locally in the localStorage, in the following situations, the SDK would still work when there is temporarily no internet connection:
|
|
259
273
|
- it has already received the data from previous connections
|
|
260
|
-
- the fbClient.bootstrap(featureFlags) method is called with all necessary feature flags
|
|
274
|
+
- the `fbClient.bootstrap(featureFlags)` method is called with all necessary feature flags
|
|
261
275
|
|
|
262
276
|
In the meantime, the SDK would try to reconnect to the server by an incremental interval, this makes sure that the websocket would be restored when the internet connection is back.
|
|
263
277
|
|
|
264
|
-
|
|
265
278
|
### Experiments (A/B/n Testing)
|
|
266
279
|
|
|
267
|
-
We support automatic experiments for
|
|
280
|
+
We support automatic experiments for pageviews and clicks, you just need to set your experiment on our SaaS platform,
|
|
281
|
+
then you should be able to see the result in near real time after the experiment is started.
|
|
268
282
|
|
|
269
283
|
In case you need more control over the experiment data sent to our server, we offer a method to send custom event.
|
|
270
284
|
|
|
271
285
|
```javascript
|
|
272
|
-
fbClient.
|
|
273
|
-
eventName: 'your event name',
|
|
274
|
-
numericValue: 1
|
|
275
|
-
}])
|
|
286
|
+
fbClient.track(eventName, numericValue);
|
|
276
287
|
```
|
|
277
288
|
|
|
278
|
-
**numericValue** is not mandatory, the default value is **1**.
|
|
289
|
+
**numericValue** is not mandatory, the default value is **1.0**.
|
|
279
290
|
|
|
280
|
-
Make sure
|
|
291
|
+
Make sure `track` is called after the related feature flag is called, otherwise the custom event won't be included
|
|
292
|
+
into the experiment result.
|
|
281
293
|
|
|
282
294
|
## Getting support
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
- If you encounter a bug or would like to request a
|
|
295
|
+
- If you have a specific question about using this sdk, we encourage you
|
|
296
|
+
to [ask it in our slack](https://join.slack.com/t/featbit/shared_invite/zt-1ew5e2vbb-x6Apan1xZOaYMnFzqZkGNQ).
|
|
297
|
+
- If you encounter a bug or would like to request a
|
|
298
|
+
feature, [submit an issue](https://github.com/featbit/dotnet-server-sdk/issues/new).
|
|
286
299
|
|
|
287
300
|
## See Also
|
|
288
|
-
|
|
289
|
-
- [Connect To JavaScript Sdk](https://docs.featbit.co/getting-started/connect-an-sdk#javascript)
|
|
301
|
+
- [Connect To JavaScript Sdk](https://docs.featbit.co/getting-started/connect-an-sdk#javascript)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { IOptions } from "./options/IOptions";
|
|
2
|
+
import { ILogger } from "./logging/ILogger";
|
|
3
|
+
import { IValidatedOptions } from "./options/IValidatedOptions";
|
|
4
|
+
import { IStore } from "./platform/IStore";
|
|
5
|
+
import { IClientContext } from "./options/IClientContext";
|
|
6
|
+
import { IDataSynchronizer } from "./data-sync/IDataSynchronizer";
|
|
7
|
+
import { IDataSourceUpdates } from "./store/IDataSourceUpdates";
|
|
8
|
+
import { VoidFunction } from "./utils/VoidFunction";
|
|
9
|
+
import { IBootstrapProvider } from "./bootstrap/IBootstrapProvider";
|
|
10
|
+
import { DataSyncModeEnum } from "./data-sync/DataSyncMode";
|
|
11
|
+
import { IUser } from "./options/IUser";
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare const defaultValues: IValidatedOptions;
|
|
16
|
+
export default class Configuration {
|
|
17
|
+
readonly startWaitTime: number;
|
|
18
|
+
readonly sdkKey: string;
|
|
19
|
+
readonly streamingUri: string;
|
|
20
|
+
readonly pollingUri: string;
|
|
21
|
+
readonly eventsUri: string;
|
|
22
|
+
readonly webSocketPingInterval: number;
|
|
23
|
+
readonly logger?: ILogger;
|
|
24
|
+
readonly flushInterval: number;
|
|
25
|
+
readonly maxEventsInQueue: number;
|
|
26
|
+
readonly pollingInterval: number;
|
|
27
|
+
readonly offline: boolean;
|
|
28
|
+
readonly dataSyncMode: DataSyncModeEnum;
|
|
29
|
+
readonly bootstrapProvider: IBootstrapProvider;
|
|
30
|
+
readonly user: IUser;
|
|
31
|
+
readonly storeFactory: (clientContext: IClientContext) => IStore;
|
|
32
|
+
readonly dataSynchronizerFactory?: (clientContext: IClientContext, store: IStore, dataSourceUpdates: IDataSourceUpdates, initSuccessHandler: VoidFunction, errorHandler?: (e: Error) => void) => IDataSynchronizer;
|
|
33
|
+
constructor(options?: IOptions);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=Configuration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Configuration.d.ts","sourceRoot":"","sources":["../../src/Configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAgCxC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,iBAgB3B,CAAC;AAiEF,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,SAAgB,YAAY,EAAE,MAAM,CAAC;IAErC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,SAAgB,qBAAqB,EAAE,MAAM,CAAC;IAE9C,SAAgB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjC,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IAEzC,SAAgB,eAAe,EAAE,MAAM,CAAC;IAExC,SAAgB,OAAO,EAAE,OAAO,CAAC;IAEjC,SAAgB,YAAY,EAAE,gBAAgB,CAAC;IAE/C,SAAgB,iBAAiB,EAAE,kBAAkB,CAA+B;IAEpF,SAAgB,IAAI,EAAE,KAAK,CAAC;IAE5B,SAAgB,YAAY,EAAE,CAAC,aAAa,EAAE,cAAc,KAAK,MAAM,CAAC;IAExE,SAAgB,uBAAuB,CAAC,EAAE,CACxC,aAAa,EAAE,cAAc,EAC7B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,kBAAkB,EACrC,kBAAkB,EAAE,YAAY,EAChC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,KAC9B,iBAAiB,CAAC;gBAEX,OAAO,GAAE,QAAa;CA6DnC"}
|