# Client Specification 1.0 This document attempts to guide developers in implementing a Unleash Client SDK. ## System Overview Unleash is comprised of three parts: - **Unleash API** - The service holding all feature toggles and their configurations. Configurations declare which activation strategies to use and which parameters they should get. - **Unleash UI** - The dashboard used to manage feature toggles, define new strategies, look at metrics, etc. - **Unleash SDK** - Used by clients to check if a feature is enabled or disabled. The SDK also collects metrics and sends them to the Unleash API. Activation Strategies are also implemented in the SDK. Unleash currently provides official SDKs for Java and Node.js ![system_overview](https://raw.githubusercontent.com/Unleash/unleash/master/docs/assets/unleash-diagram.png "System Overview") In order to be super fast, the client SDK caches all feature toggles and their current configuration in memory. The activation strategies are also implemented in the SDK. This makes it really fast to check if a toggle is on or off because it is just a simple function operating on local state, without the need to poll data from the database. ## The Basics All client implementations should strive to have a simple and consistent user API. It should be a simple method, called isEnabled, to check if a feature toggle is enabled or not. The method should return a `boolean` value, true or false. ```javascript unleash.isEnabled("myAwesomeToggle") ``` The basic `isEnabled` method should also accept a default value. This should be used if the client does not know anything about that that toggle name. If the user does not specify a default value, false should be returned for unknown feature toggles. **Calling unleash with default value:** ```javascript boolean value = unleash.isEnabled("unknownFeatureToggle", false); //value==false because default value was used. ``` ### Implementation of isEnabled A feature toggle is defined as: ```json { "name": "Feature.B", "description": "lorem ipsum", "enabled": true, "strategies": [ { "name": "ActiveForUserWithId", "parameters": { "userIdList": "123,221,998" } }, { "name": "GradualRolloutRandom", "parameters": { "percentage": "10" } } ], "strategy": "ActiveForUserWithId", "parameters": { "userIdList": "123,221,998" } } ``` A simple demo of the isEnable function in JavaScript-style (most implementation will probably be more functional): ```javascript function isEnabled(name, unleashContext = {}, defaultValue = false) { const toggle = toggleRepository.get(name); let enabled = false; if ( !toggle ) { return defaultValue; } else if ( ! toggle.isEnabled) { return false; } else { for(let i=0;i