Node js client

Install

npm install izanami-node

Import

const Izanami = require("izanami-node");

Usage

The node client expose conveniant methods to call Izanami.

Configure the client:

const izanamiConfig = Object.assign({}, Izanami.defaultConfig, {
  host: "http://localhost:9000",
  clientId: process.env.CLIENT_ID || "xxxx",
  clientSecret: process.env.CLIENT_SECRET || "xxxx",
});

// Get a configs client
const configClient = Izanami.configClient(izanamiConfig);
// Get a feature client
const featureClient = Izanami.featureClient(izanamiConfig);
// Get a experiments client
const experimentsClient = Izanami.experimentsClient(izanamiConfig);

Configs

Get a config

configClient.config("my.config.id").then((config) => {
  console.log("The config is ", config);
  tree.should.be.deep.equal({
    value: "test",
  });
});

Get the configs tree

configClient.configs("my.config.*").then((tree) => {
  tree.should.be.deep.equal({
    my: {
      config: {
        id: {
          value: "test",
        },
        id2: {
          another: {
            value: "a value",
          },
        },
      },
    },
  });
});

Features

Check a feature

featureClient.checkFeature("my.feature.id").then((active) => {
  console.log("The feature is ", active);
});

Or with a context:

featureClient
  .checkFeature("my.feature.id", { client: "ragnard.lodbrock@gmail.com" })
  .then((active) => {
    console.log("The feature is ", active);
  });

Get the features tree

featureClient.features("my.feature.*").then((tree) => {
  tree.should.be.deep.equal({
    my: {
      feature: {
        id: {
          active: true,
        },
        id2: {
          active: false,
        },
      },
    },
  });
});

Or with a context:

featureClient
  .features("my.feature.*", { client: "ragnard.lodbrock@gmail.com" })
  .then((tree) => {
    tree.should.be.deep.equal({
      my: {
        feature: {
          id: {
            active: true,
          },
          id2: {
            active: false,
          },
        },
      },
    });
  });

Experiments

Get an experiment

experimentsClient.experiment("my.experiment.id").then((experiment) => {
  //Empty json if the experiment doesn't exists
  console.log("The experiment is ", experiment);
});

Get experiments as tree

experimentsClient
  .experiments("my.experiment.*", "ragnard.lodbrock@gmail.com")
  .then((tree) => {
    //Empty json if the experiment doesn't exists
    console.log("The experiment is ", experiment);
    tree.should.be.deep.equal({
      my: {
        experiment: {
          id: {
            variant: "A",
          },
          id2: {
            variant: "B",
          },
        },
      },
    });
  });

Get a variant

experimentsClient
  .variantFor("my.experiment.id", "ragnard.lodbrock@gmail.com")
  .then((variant) => {
    //Empty json if the variant doesn't exists
    console.log("The variant is ", variant);
  });

Mark variant displayed

experimentsClient
  .displayed("my.experiment.id", "ragnard.lodbrock@gmail.com")
  .then((__) => {
    console.log("The variant is marked displayed");
  });

Mark variant won

experimentsClient
  .won("my.experiment.id", "ragnard.lodbrock@gmail.com")
  .then((__) => {
    console.log("The variant is marked won");
  });

Express proxy

You use express as a proxy to expose Izanami to the client side. You can customize the api endpoints with the sessionPath, experimentsDisplayedPath and experimentsWonPath config options.

Context (optional) and clientId (require) are extracted from the request, and forward respectively at the feature and experiments api; you can customize extraction by using your own methods with featureContextFromRequest and experimentsClientIdFromRequest.

const app = express();

Izanami.expressProxy({
  sessionPath: "/api/izanami", // default '/api/me'
  experimentsDisplayedPath, // default: '/api/experiments/displayed'
  experimentsWonPath, // default: '/api/experiments/won'
  featureClient, // Optional
  featureContextFromRequest, //default: (req) => ({id: req.user_email})
  experimentsClient, // Optional
  experimentsClientIdFromRequest, //default: (req) => (req.user_email)
  configClient, // Optional
  app, // Express app
  path: "my.namespace.*", // The pattern to filter experiments, configs and features
});
The source code for this page can be found here.