npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

switcher-client

v4.1.1

Published

Client JS SDK for working with Switcher-API

Downloads

258

Readme


Master CI Quality Gate Status npm version install size Known Vulnerabilities License: MIT Slack: Switcher-HQ


Switcher API: JavaScript Client: Cloud-based Feature Flag API

About

JavaScript SDK for working with Switcher-API. https://github.com/switcherapi/switcher-api

  • Flexible and robust functions that will keep your code clean and maintainable.
  • Able to work locally using a snapshot file downloaded from your remote Switcher-API Domain.
  • Silent mode is a hybrid configuration that automatically enables a contingent sub-process in case of any connectivity issue.
  • Built-in mock implementation for clear and easy implementation of automated testing.
  • Easy to setup. Switcher Context is responsible to manage all the complexity between your application and API.

Usage

Install

npm install switcher-client

Module initialization

The context properties stores all information regarding connectivity.

import { Client } from 'switcher-client';

const apiKey = '[API_KEY]';
const environment = 'default';
const domain = 'My Domain';
const component = 'MyApp';
const url = 'https://switcherapi.com/api';
  • domain: Domain name.
  • url: (optional) Swither-API endpoint.
  • apiKey: (optional) Switcher-API key generated to your component.
  • component: (optional) Application name.
  • environment: (optional) Environment name. Production environment is named as 'default'.

Options

You can also activate features such as local and silent mode:

const local = true;
const logger = true;
const snapshotLocation = './snapshot/';
const snapshotAutoUpdateInterval = 3;
const silentMode = '5m';
const certPath = './certs/ca.pem';

Client.buildContext({ url, apiKey, domain, component, environment }, {
    local, logger, snapshotLocation, snapshotAutoUpdateInterval, silentMode, certPath
});

let switcher = Client.getSwitcher();
  • local: If activated, the client will only fetch the configuration inside your snapshot file. The default value is 'false'
  • logger: If activated, it is possible to retrieve the last results from a given Switcher key using Client.getLogger('KEY')
  • snapshotLocation: Location of snapshot files. The default value is './snapshot/'
  • snapshotAutoUpdateInterval: Enable Snapshot Auto Update given an interval in seconds (default: 0 disabled).
  • silentMode: Enable contigency given the time for the client to retry - e.g. 5s (s: seconds - m: minutes - h: hours)
  • regexSafe: Enable REGEX Safe mode - Prevent agaist reDOS attack (default: true).
  • regexMaxBlackList: Number of entries cached when REGEX Strategy fails to perform (reDOS safe) - default: 50
  • regexMaxTimeLimit: Time limit (ms) used by REGEX workers (reDOS safe) - default - 3000ms
  • certPath: Path to the certificate file used to establish a secure connection with the API.

(*) regexSafe is a feature that prevents your application from being exposed to a reDOS attack. It is recommended to keep this feature enabled.

Executing

There are a few different ways to call the API using the JavaScript module. Here are some examples:

  1. No parameters Invoking the API can be done by instantiating the switcher and calling isItOn passing its key as a parameter.
const switcher = Client.getSwitcher();
await switcher.isItOn('FEATURE01');
// or
const { result, reason, metadata } = await switcher.detail().isItOn('FEATURE01');
  1. Promise Most functions were implemented using async operations. Here it is a differnet way to execute the criteria:
switcher.isItOn('KEY')
    .then(result => console.log('Result:', result))
    .catch(error => console.log(error));
  1. Strategy validation - preparing input Loading information into the switcher can be made by using prepare, in case you want to include input from a different place of your code. Otherwise, it is also possible to include everything in the same call.
switcher.checkValue('USER_1').prepare('FEATURE01');
switcher.isItOn();
  1. Strategy validation - all-in-one execution All-in-one method is fast and include everything you need to execute a complex call to the API.
await switcher
    .checkValue('User 1')
    .checkNetwork('192.168.0.1')
    .isItOn('FEATURE01');
  1. Throttle Throttling is useful when placing Feature Flags at critical code blocks require zero-latency without having to switch to local. API calls will happen asynchronously and the result returned is based on the last API response.
const switcher = Client.getSwitcher();
await switcher
    .throttle(1000)
    .isItOn('FEATURE01');

In order to capture issues that may occur during the process, it is possible to log the error by subscribing to the error events.

Client.subscribeNotifyError((error) => {
    console.log(error);
});
  1. Hybrid mode Forcing Switchers to resolve remotely can help you define exclusive features that cannot be resolved locally. This feature is ideal if you want to run the SDK in local mode but still want to resolve a specific switcher remotely.
const switcher = Client.getSwitcher();
await switcher.remote().isItOn('FEATURE01');

Built-in mock feature

You can also bypass your switcher configuration by invoking 'Client.assume'. This is perfect for your test code where you want to test both scenarios when the switcher is true and false.

Client.assume('FEATURE01').true();
switcher.isItOn('FEATURE01'); // true

Client.forget('FEATURE01');
switcher.isItOn('FEATURE01'); // Now, it's going to return the result retrieved from the API or the Snaopshot file

Client.assume('FEATURE01').false().withMetadata({ message: 'Feature is disabled' }); // Include metadata to emulate Relay response
const response = await switcher.detail().isItOn('FEATURE01'); // false
console.log(response.metadata.message); // Feature is disabled

Enabling Test Mode You may want to enable this feature while using Switcher Client with automated testing. It prevents the Switcher Client from locking snapshot files even after the test execution.

To enable this feature, it is recommended to place the following on your test setup files:

Client.testMode();

Smoke Test Validate Switcher Keys on your testing pipelines before deploying a change. Switcher Keys may not be configured correctly and can cause your code to have undesired results.

This feature will validate using the context provided to check if everything is up and running. In case something is missing, this operation will throw an exception pointing out which Switcher Keys are not configured.

Client.checkSwitchers(['FEATURE01', 'FEATURE02'])

Loading Snapshot from the API

This step is optional if you want to load a copy of the configuration that can be used to eliminate latency when local mode is activated. Activate watchSnapshot optionally passing true in the arguments. Auto load Snapshot from API passing true as second argument.

Client.loadSnapshot();

Watch for Snapshot file changes

Activate and monitor snapshot changes using this feature. Optionally, you can implement any action based on the callback response.

Client.watchSnapshot({
    success: () => console.log('In-memory snapshot updated'),
    reject: (err) => console.log(err)
});

Snapshot version check

For convenience, an implementation of a domain version checker is available if you have external processes that manage snapshot files.

Client.checkSnapshot();

Snapshot Update Scheduler

You can also schedule a snapshot update using the method below. It allows you to run the Client SDK in local mode (zero latency) and still have the snapshot updated automatically.

Client.scheduleSnapshotAutoUpdate(3000, {
    success: (updated) => console.log('Snapshot updated', updated),
    reject: (err) => console.log(err)
});