@comparaonline/mono-client

Soap and rest connector

Usage no npm install needed!

<script type="module">
  import comparaonlineMonoClient from 'https://cdn.skypack.dev/@comparaonline/mono-client';
</script>

README

mono-client

Table of Contents

Features

  • Wrapper for SOAP and REST requests
  • Easy retry and successful response validation
  • Callback interceptor
  • Metrics and starts date always available
  • Reuse configuration for business units and services
  • TypeScript Support
  • body parser

Installing

Using npm:

$ npm i @comparaonline/mono-client

Using yarn:

$ yarn add @comparaonline/mono-client

Example

SOAP

import { MonoClient } from '@comparaonline/mono-client';

async function sum() {
  const soapClient = new MonoClient({
    type: 'soap',
    wsdl: 'http://www.dneonline.com/calculator.asmx?WSDL'
  });

  const response = await soapClient.request({
    method: 'Add',
    body: {
     intA: 1,
     intB: 2
    }
  });

  console.log(response.body);
  console.log(response.headers);
  console.log(response.statusCode);
}

REST

import { MonoClient } from '@comparaonline/mono-client';

async function getUser() {
  const restClient = new MonoClient({
    type: 'rest',
    baseUrl: 'https://gorest.co.in'
  });

  const response = await restClient.request({
    path: '/public/v1/users/{userId}',
    pathParams: {
      userId: 2
    }
  });

  console.log(response.body);
  console.log(response.headers);
  console.log(response.statusCode);
}

Client advaced configuration

import { MonoClient, StatusCode, MonoClientGenerator } from '@comparaonline/mono-client';
import { randomUUID } from 'crypto';

async function testSoap() {
  const soapClient = new MonoClient({
    type: 'soap',
    wsdl: 'http://www.dneonline.com/calculator.asmx?WSDL',
    callback(request, response, info) {
      // Usefull for metrics
      console.log(request);
      console.log(response);
      console.log(info);
    },
    extra: {
      businessUnit: 'my-business-unit',
      requestId: randomUUID(),
      serviceId: 'my-service-id'
    },
    ssl: {
      // this overwrites default HttpsAgent
      type: 'ssl-security', // ssl-pfx-security | ssl-reject
      cert: Buffer.from(''),
      key: '/path',
      ca: '/path', // optional
      rejectUnauthorized: false // optional
    },
    isSuccessfulCallback(response) {
      // default validation is statusCode 200 or 201
      return response.body.Error == null; // custom validation inside client
    },
    retry: {
      maxRetry: 2,
      on: [StatusCode.S4XX], // Retry if error is 4XX
      notOn: [StatusCode.E400], // not retry if error is 400
      shouldRetryCallback(request, response) {
        // This will overwrite retry on and notOn
        return response.body.Error === 'server timeout';
      }
    },
    bodyParser<T>(body: any): T {
      //Allows you to parse any property inside the response body, and re-assign it
      return JSON.parse(body.clientData);
    }
  });
  const response = await soapClient.request({
    method: 'Add',
    body: {
      intA: 1,
      intB: 2
    },
    headers: {
      'my-header': 'test'
    },
    isSuccessfulCallback(response) {
      // overwrite client custom validation and 200/201 validation
      return response.body.Error == null && response.body.Success === 'yes'; // custom validation per request
    },
    overwriteWsdl: 'http://www.dneonline.com/calculator.asmx?WSDL', // Use a specific enpoint for a request but preserving client configuration
    requestTimeout: 3000, // default 120000 ms
    shouldRetryCallback(request, response) {
      // This will overwrite client shouldRetryCallback, retry on and retry notOn. maxAttempt must by set on client
      return (
        response.body.Error === 'server timeout' ||
        response.body.Error === 'server max attempts per minute'
      );
    }
  });
}

async function restTest() {
  const restClient = new MonoClient({
    type: 'rest',
    baseUrl: 'https://gorest.co.in',
    callback(request, response, info) {
      console.log(request);
      console.log(response);
      console.log(info);
    },
    extra: {
      businessUnit: 'my-business-unit',
      requestId: randomUUID(),
      serviceId: 'my-service-id'
    },
    ssl: {
      type: 'ssl-security', // ssl-pfx-security | ssl-reject
      cert: Buffer.from(''),
      key: '/path',
      ca: '/path', // optional
      rejectUnauthorized: false // optional
    },
    isSuccessfulCallback(response) {
      // default validation is statusCode 200 or 201
      return response.body.Error == null; // custom validation inside client
    },
    retry: {
      maxRetry: 2,
      on: [StatusCode.S4XX], // Retry if error is 4XX
      notOn: [StatusCode.E400], // not retry if error is 400
      shouldRetryCallback(request, response) {
        // This will overwrite retry on and notOn
        return response.body.Error === 'server timeout';
      }
    },
    bodyParser<T>(body: any): T {
      //Allows you to parse any property inside the response body, and re-assign it
      return JSON.parse(body.clientData);
    }
  });

  const response = await restClient.request({
    method: 'get', // Default
    path: '/public/v1/users/{userId}',
    pathParams: {
      userId: 2
    },
    body: {
      someParam: 1
    },
    headers: {
      'test-header': 'test'
    },
    queryParams: {
      page: 1,
      limit: 40
    },
    isSuccessfulCallback(response) {
      // overwrite client custom validation and 200/201 validation
      return response.body.Error == null && response.body.Success === 'yes'; // custom validation per request
    },
    overwriteBaseUrl: 'https://gorest.co.in', // Use a specific baseUrl for a request but preserving client configuration
    requestTimeout: 3000, // default 120000 ms
    shouldRetryCallback(request, response) {
      // This will overwrite client shouldRetryCallback, retry on and retry notOn. maxAttempt must by set on client
      return (
        response.body.Error === 'server timeout' ||
        response.body.Error === 'server max attempts per minute'
      );
    }
  });
}


async function generatorTest() {
  const generator = new MonoClientGenerator({
    businessUnit: 'my-business-unit', // Every client generated with this generator will have the same businessUnit
    callback(request, response, info) {
      // Every client generated with this generator will have the same callback
      console.log(request);
      console.log(response);
      console.log(info);
    },
    bodyParser<T>(body: any): T {
      //Allows you to parse any property inside the response body, and re-assign it
      return JSON.parse(body.clientData);
  });

  const restClient = generator.get({
    type: 'rest',
    baseUrl: 'https://gorest.co.in'
    // you can setup all the params for this client as any other REST client except for businessUnit and callback
  }, 'my-service-id-1', 'my-request-id-1');

  const soapClient = generator.get({
    type: 'soap'
    // you can setup all the params for this client as any other SOAP client except for businessUnit and callback
  }, 'my-service-id-2', 'my-request-id-2');
}

Mono Client API

TODO

Mono Client Generator API

TODO