Node js client
Install
npm install izanami-node
Import
const Izanami = require("izanami-node");
Usage
The node client expose convenient 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
});