2.0.0 • Published 4 years ago

rxjs-ajax-wrapper v2.0.0

Weekly downloads
329
License
-
Repository
-
Last release
4 years ago

rxjs-ajax-wrapper

Disclaimer: Uses RxJS v6, for RxJS v5 compatible wrapper, please check v0.1.38.

Version npm download

Simple to use and simple to setup wrapper for rxjs. Allows you to define your distant resources api and call them on the fly, while having set custom middlewares beforehand !

How to use

Step 1: Define your api routes.

const apiDefs = {
  getAllFilms: {
    url: 'https://ghibliapi.herokuapp.com/films',
    method: 'GET',
    responseType: 'json',
  },
  getSingleFilm: {
    url: 'https://ghibliapi.herokuapp.com/films/:filmID',
    method: 'GET',
    responseType: 'json',
  },
  postFilm: {
    url: 'https://ghibliapi.herokuapp.com/films',
    method: 'POST',
    responseType: 'json',
  },
};

You can check all the available request params here

Step 2: Initialize the wrapper

import { RxjsWrapper } from 'rxjs-ajax-wrapper';

const api = new RxjsWrapper(apiDefs);

Step 3: Call the routes

api.routes.getAllFilms(params)

Parameters

When calling a route, 3 different parameters can be added to the request:

params: Object -> Will replace the :someParam, in the request definition with the desired parameters. query: Object -> Will append some query parameters to the request. body: * -> The body of the request.

Example

api.routes.getSingleFilm({
  params: {
    filmID: 2,
  },
  body,
  query: {
    lim: 3,
  }  
})

Return value

Return an Observable. Checkout https://github.com/Reactive-Extensions/RxJS-DOM/blob/master/doc/operators/ajax.md for more details.

Library functions

CombineWrappers

FunctionExplanationArgumentsReturn ValueExample
CombineWrappers()Combine multiples wrappers.({wrapperKey: wrapper, ...})The combined wrappers, with each wrapper routes in the respective wrapper object.new CombineWrappers({auth: authWrapper, film: filmWrapper});

CombineWrappers will return an object like this:

{
  resources: {
    auth,
    film,
  }
  addErrorMiddlewares, // See Methods
  addRequestMiddlewares, // See Methods
}

It is then possible to add an error/request middleware after the creation of the Wrapper (ex: when having logged-in etc ...).

Example

Here is an example using redux-observable library. We're adding the token as middleware to our requests, as well as error middlewares for handling the token validity and unauthorized errors.

import { CombineWrappers } from 'rxjs-ajax-wrapper';

import exampleApi from 'exampleApi';
import anotherApi from 'anotherApi';

const appApi = new CombineWrappers({
  example: exampleApi;
  another: anotherApi;
});

appApi.addRequestMiddlewares([
  {
    name: 'token',
    handler: () => ({ headers: { Authorization: 'sometoken' } }),
  }
]);
api.addErrorMiddlewares([
  {
    name: 'tokenExpired',
    handler: (req, extras) => {
      if (req.status === 401 && checkObj(req, ['response', 'code']) === 'token_expired') {
        store.dispatch({ type: 'ADD_TO_REFRESH_QUEUE', values: extras });
        store.dispatch(
          refreshToken({
            values: {
              refresh_token: store.getState().auth.refreshToken,
              access_token: store.getState().auth.token
            }
           })
        );
      }
     }
  },
  {
    name: 'notAllowed',
    handler: (req, extras) => {
      if (req.status === 401 && checkObj(req, ['response', 'code']) === 'not_allowed') {
        browserHistory.push('/unauthorized');
        }
      }
    }
]);

...

const loginEpic = action$ =>
  action$.pipe(
    ofType('LOGIN_REQUEST'),
    mergeMap(action =>
      race(
        appApi.resources.login.login({body: JSON.stringify(action.payload)}).pipe(
          flatMap(response => {
            return of(loginFulfilled(response.response));
          }),
          catchError(error => of(loginRejected(error))),
        ),
        action$.pipe(
          ofType('LOGIN_REQUEST'),
          flatMap(() => of(loginCancelled(action.payload))),
          take(1),
        ),
      )),
  );

export default loginEpic;

RxjsWrapper methods

MethodExplanationArgumentsExample
addRequestMiddlewares()Define a function that returns arguments to append to the request header.([{name: middlewareName: handler: middlewareFunc}], middlewareFuncParams)api.addRequestMiddlewares([name: 'token', handler: (store) => ({Authorization: store.getState().token})], store);
addErrorMiddlewares()Define a function that returns functions to call when an error occurs.([{name: middlewareName: handler: middlewareFunc}], middlewareFuncParams)api.addErrorMiddlewares([name: '404Middleware', handler: (request) => { if (request.status === 404) dispatch(somtething()) }]);

Ignore middleware on specific route.

Simple, just an set an array ignoreMiddlewares containing the names of the middlewares you wish to ignore. Works for both errorMiddlewares and requestMiddlewares.

Example :

const apiDefs = {
  specialRoute: {
    url: 'https://ghibliapi.herokuapp.com/films',
    method: 'GET',
    responseType: 'json',
    ignoreMiddlewares: [
      '404',
      'tokenMiddleware',
    ]
  },
};
2.0.0

4 years ago

1.1.1

4 years ago

1.1.0

4 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago

0.1.38

6 years ago

0.1.37

6 years ago

0.1.36

6 years ago

0.1.35

6 years ago

0.1.34

6 years ago

0.1.33

6 years ago

0.1.32

6 years ago

0.1.31

6 years ago

0.1.30

6 years ago

0.1.29

6 years ago

0.1.28

6 years ago

0.1.26

6 years ago

0.1.25

6 years ago

0.1.24

6 years ago

0.1.23

6 years ago

0.1.22

6 years ago

0.1.21

6 years ago

0.1.20

6 years ago

0.1.19

6 years ago

0.1.18

6 years ago

0.1.17

6 years ago

0.1.16

6 years ago

0.1.15

6 years ago

0.1.14

6 years ago

0.1.13

6 years ago

0.1.12

6 years ago

0.1.11

6 years ago

0.1.10

6 years ago

0.1.9

6 years ago

0.1.8

6 years ago

0.1.6

6 years ago

0.1.5

6 years ago

0.1.4

6 years ago

0.1.3

6 years ago

0.1.2

6 years ago

0.1.1

6 years ago

0.1.0

6 years ago

0.0.12

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago