/toxiproxy-node-client

Node Client for Toxiproxy

Primary LanguageTypeScript

Toxiproxy Node Client

Build Status NPM version

Toxiproxy makes it easy and trivial to test network conditions, for example low-bandwidth and high-latency situations. toxiproxy-node-client includes everything needed to get started with configuring Toxiproxy upstream connection and listen endpoints.

Installing via NPM

The recommended way to install toxiproxy-node-client is through NPM.

Once that is installed and you have added toxiproxy-node-client to your package.json configuration, you can require the package and start using the library.

JavaScript (ES6) Usage

Here is an example for creating a proxy that limits a Redis connection to 1000KB/s.

// index.js
"use strict";
const toxiproxyClient = require("toxiproxy-node-client");

const getToxic = (type, attributes) => {
  const toxiproxy = new toxiproxyClient.Toxiproxy("http://localhost:8474");
  const proxyBody = {
    listen: "localhost:0",
    name: "ihsw_test_redis_master",
    upstream: "localhost:6379"
  };
  return toxiproxy.createProxy(proxyBody)
    .then((proxy) => {
      const toxicBody = {
        attributes: attributes,
        type: type
      };
      return proxy.addToxic(new toxiproxyClient.Toxic(proxy, toxicBody));
    });
  });

// { attributes: { rate: 1000 },
//   name: 'bandwidth_downstream',
//   stream: 'downstream',
//   toxicity: 1,
//   type: 'bandwidth' }
getToxic("bandwidth", { rate: 1000 })
  .then((toxic) => console.log(toxic.toJson()))
  .catch(console.error);

TypeScript Usage

Here is an example for creating a proxy that limits a Redis connection to 1000KB/s.

// index.ts
import {
    Toxiproxy,
    ICreateProxyBody,
    Toxic, ICreateToxicBody, Bandwidth
} from "toxiproxy-node-client";

const getToxic = async <T>(type: string, attributes: T): Promise<Toxic<T>> => {
  const toxiproxy = new Toxiproxy("http://localhost:8474");
  const proxyBody = <ICreateProxyBody>{
    listen: "localhost:0",
    name: "ihsw_test_redis_master",
    upstream: "localhost:6379"
  };
  const proxy = await toxiproxy.createProxy(proxyBody);

  const toxicBody = <ICreateToxicBody<T>>{
      attributes: attributes,
      type: type
  };
  return await proxy.addToxic(new Toxic(proxy, toxicBody));
};

// { attributes: { rate: 1000 },
//   name: 'bandwidth_downstream',
//   stream: 'downstream',
//   toxicity: 1,
//   type: 'bandwidth' }
getToxic("bandwidth", <Bandwidth>{ rate: 1000 })
  .then((toxic) => console.log(toxic.toJson()))
  .catch(console.error);

Documentation

Additional examples can be found in the examples directory for expected usage.

Docker setup for development and testing

A Toxiproxy instance is needed to run the tests. The easiest way to get one is to use the official Docker image which will make it available on port 8474. The URL (http://localhost:8474) is hard-coded in the tests.

docker run --rm -p 8474:8474 ghcr.io/shopify/toxiproxy:latest