{"_id":"@autotelic/redux-token-api-middleware","_rev":"2-f4b6b0c2a188eda702cd52d96df35fc6","name":"@autotelic/redux-token-api-middleware","dist-tags":{"latest":"0.13.1"},"versions":{"0.13.0":{"name":"@autotelic/redux-token-api-middleware","version":"0.13.0","description":"Redux middleware for calling APIs with token-based auth","main":"lib/index.js","scripts":{"lint":"eslint src","build":"rimraf lib && babel src --out-dir lib","build:watch":"watch 'npm run build' ./src/","prepublish":"npm run build","test":"mocha --require @babel/register --require @babel/polyfill --recursive ./test"},"keywords":["javascript","redux","middleware","api","token","jwt"],"author":{"name":"Edward Stone","email":"ed@autotelic.com"},"repository":{"type":"git","url":"git+https://github.com/autotelic/redux-token-api-middleware.git"},"bugs":{"url":"https://github.com/autotelic/redux-token-api-middleware/issues"},"homepage":"https://github.com/autotelic/redux-token-api-middleware","license":"MIT","dependencies":{"@babel/runtime":"^7.2.0","cross-fetch":"^3.0.4","jwt-decode":"^2.2.0","lodash.curryright":"^4.1.1","lodash.get":"^4.4.2","lodash.identity":"^3.0.0","lodash.isarraylikeobject":"^4.2.0","lodash.isfunction":"^3.0.8","lodash.isundefined":"^3.0.1","lodash.map":"^4.6.0","lodash.omitby":"^4.6.0","lodash.startswith":"^4.2.1","moment":"^2.12.0","moment-timezone":"^0.5.2","redux":"^4.0.4"},"devDependencies":{"@babel/cli":"^7.2.0","@babel/core":"^7.2.0","@babel/plugin-transform-runtime":"^7.2.0","@babel/polyfill":"^7.0.0","@babel/preset-env":"^7.2.0","@babel/register":"^7.0.0","chai":"^4.2.0","jsonwebtoken":"^8.4.0","mocha":"^6.2.1","react":"^16.6.3","react-hot-loader":"^4.3.12","rimraf":"^3.0.0","sinon":"^7.2.0","watch":"^1.0.2"},"npmName":"redux-api-token-middleware","npmFileMap":[{"basePath":"/lib/","files":["*.js"]}],"gitHead":"b8baaee6e76b09e532969621e392b0a864a5bc68","_id":"@autotelic/redux-token-api-middleware@0.13.0","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ER7tnksBPapxcg7ModnWYdSpw54VX22nyC6Cd9M0FCrPUd4FgJI/ogBtY8Y3RxZW++SL0+2CPqhKTOrbT2nodw==","shasum":"5b3487bc2c5d54bf033471d24ba45ec4eadc93f9","tarball":"https://registry.npmjs.org/@autotelic/redux-token-api-middleware/-/redux-token-api-middleware-0.13.0.tgz","fileCount":10,"unpackedSize":40886,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdw1kSCRA9TVsSAnZWagAAnPcP/15cYo2h2Hlg/YPp2Ouw\nexy4h3pAKcRVRnhMkNphGufJCb9B8G9aQgWV/gnUkvhJlyDMbIib2VgD6QR4\nO174K3x9DhIl4/wKJ4Ol6HWlb0v2+bDmvn6aEOnpxfGQcGOz3N3d4y5IDx2w\nAnstSiijkLwE93mhBRq4KWOObqlK98ZNNQ0Li2eroDbhYa1AhUOEfm1m3Yaw\n3BppeK55q7CqjnngvOLk6GJAfsOkIz1AB9rSFoAM0BaNEuxeqd69U4xg6o/o\nSha8pCRjVwExxIGCUoP1yo8t+Xzm8FCVhiyQ2VsdcOMfqJV1omrVmmkOPxmM\n3P65qXqGJc1l6IJ6ZeyXKsQ9b1Nktc4AmrBT+FpmBRgHQpSjHivG0AMIP6zJ\nkZhKfHsSvb0Q5c1da01R7R39NNEoTPAuc6/sUviGeDeroVIpwQbnzLKom5xI\nZ8tV1RWi1W85rh9RGzbInFZZrDyln+9rPjbALK6NSrLcgzCB7uzGpfCBtDAQ\nRWiz0dDFooB4p85RVrCCfrlOOmhSdOJOvK1gg+OLN9wVjgMxkjkzmE8er4p+\nBmEwHLll3DdZq7xVQmmGjTVZlcGmO+uu6xnYg9g8YyYXhWQPMEdY322ylQL8\nQiz68JJTHz4PMmMT0g+5MGJBAbJFveTZqCS3aS7nDUCAib9Eq09jdHzgxnbm\n2z44\r\n=yOXt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1DGvLoZCn2FjfgFKonCcoue6CNeKAhMjxvfavoaIaGQIgW0fRjwRY7Su0dFdatxvQfqmvbU67GNKGCnZY7CigeKk="}]},"maintainers":[{"name":"autotelic","email":"info+npm@autotelic.com"}],"_npmUser":{"name":"autotelic","email":"info+npm@autotelic.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/redux-token-api-middleware_0.13.0_1573083410459_0.7241664501184057"},"_hasShrinkwrap":false},"0.13.1":{"name":"@autotelic/redux-token-api-middleware","version":"0.13.1","description":"Redux middleware for calling APIs with token-based auth","main":"lib/index.js","scripts":{"lint":"eslint src","build":"rimraf lib && babel src --out-dir lib","build:watch":"watch 'npm run build' ./src/","prepublish":"npm run build","test":"mocha --require @babel/register --require @babel/polyfill --recursive ./test"},"keywords":["javascript","redux","middleware","api","token","jwt"],"author":{"name":"Edward Stone","email":"ed@autotelic.com"},"repository":{"type":"git","url":"git+https://github.com/autotelic/redux-token-api-middleware.git"},"bugs":{"url":"https://github.com/autotelic/redux-token-api-middleware/issues"},"homepage":"https://github.com/autotelic/redux-token-api-middleware","license":"MIT","dependencies":{"@babel/runtime":"^7.2.0","cross-fetch":"^3.0.4","jwt-decode":"^2.2.0","lodash.curryright":"^4.1.1","lodash.get":"^4.4.2","lodash.identity":"^3.0.0","lodash.isarraylikeobject":"^4.2.0","lodash.isfunction":"^3.0.8","lodash.isundefined":"^3.0.1","lodash.map":"^4.6.0","lodash.omitby":"^4.6.0","lodash.startswith":"^4.2.1","moment":"^2.12.0","moment-timezone":"^0.5.2","redux":"^4.0.4"},"devDependencies":{"@babel/cli":"^7.2.0","@babel/core":"^7.2.0","@babel/plugin-transform-runtime":"^7.2.0","@babel/polyfill":"^7.0.0","@babel/preset-env":"^7.2.0","@babel/register":"^7.0.0","chai":"^4.2.0","jsonwebtoken":"^8.4.0","mocha":"^6.2.1","react":"^16.6.3","react-hot-loader":"^4.3.12","rimraf":"^3.0.0","sinon":"^7.2.0","watch":"^1.0.2"},"npmName":"redux-api-token-middleware","npmFileMap":[{"basePath":"/lib/","files":["*.js"]}],"gitHead":"acc386946fab28c9d2e656ad4f03022631aa2aaa","_id":"@autotelic/redux-token-api-middleware@0.13.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-kJBFaqN6YKu0rrAjX3bo9EKlggGfJq2TSMVaPwZ0FVjfHmaSV9vWTVH4MeESpMTse6WHrVMB96VI3Vww12Pmmw==","shasum":"16b8df5af81ac387f958a3bc79343df08580b249","tarball":"https://registry.npmjs.org/@autotelic/redux-token-api-middleware/-/redux-token-api-middleware-0.13.1.tgz","fileCount":10,"unpackedSize":40897,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdw1qxCRA9TVsSAnZWagAAHdMP/jr2SwGUIWJv42tvAmWI\nyLHEqkreuENLh/kMCGNgJ7o9eHm7UJIXsnz/EXz7L5fdi0xR+I7smHZvUpL8\nVbJyI5YHCm8DgEtVUyPBEHjmfuuVAnMTkM+NN2uMB+dUi+wYgq+Fmye7mOGq\nqXgHuSmc8j9lczqHY0s8eBQK5HNdu38ABQP/FxSOtC7drWxeJYv+0ErfKCYs\n+QxBYXfJ/pLZjLCNlPqkWPzs/0FFJWPyo0iSDzMH53GBe66K3gmaanEmlz/B\nhaZFdGPQiv/fLy4MN0PELETPWxPz+GVkNl1BMuUVrm1wBS5Ugh/CiwnyrC1m\nxXTd7DYDdSNU0ySftbCpNT6bcvHUgoMpqc+H7jtF27kd4Md6vce34Ypjz2tX\nVmng8alT7HAtoLfx35xwzFsDJcSipEcS0EHdmt0TwM1VdHDAI06D0Ii2PSco\n9x3F49uXbVXxcKURiokuRl6AQet8sXTsv2eK2qatlEkT5bGiTRLZ+/29pts8\nYcowmhTYXUcXTEjpEpd0pGc8RFcw/60EJJIzPPMLNTBOHtApY+LGucZgWYYQ\nFKhxvehhalGwLnlxRYyMTx0pZa+qdlfz84KH5N7t8FhN1cRIleamVS1GNN8p\n3kX/JX4DGb4PdQ6R/dbHthe1eh8d1h3JLRDN7m6k2JsIcLt5RXJnHgDpjj8r\n7V/1\r\n=qcnX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEagTIx+u65wzSfEBzySdYtFGoZfmdqA4j0bSU4e1HCUAiApmYTfldY3rDLuOUlHNAfBBgbgmdrtTrWaRIjFlV9Zyw=="}]},"maintainers":[{"name":"autotelic","email":"info+npm@autotelic.com"}],"_npmUser":{"name":"autotelic","email":"info+npm@autotelic.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/redux-token-api-middleware_0.13.1_1573083824431_0.8497850091712806"},"_hasShrinkwrap":false}},"time":{"created":"2019-11-06T23:36:50.178Z","0.13.0":"2019-11-06T23:36:50.598Z","modified":"2022-04-04T16:40:51.597Z","0.13.1":"2019-11-06T23:43:44.594Z"},"maintainers":[{"name":"autotelic","email":"info+npm@autotelic.com"}],"description":"Redux middleware for calling APIs with token-based auth","homepage":"https://github.com/autotelic/redux-token-api-middleware","keywords":["javascript","redux","middleware","api","token","jwt"],"repository":{"type":"git","url":"git+https://github.com/autotelic/redux-token-api-middleware.git"},"author":{"name":"Edward Stone","email":"ed@autotelic.com"},"bugs":{"url":"https://github.com/autotelic/redux-token-api-middleware/issues"},"license":"MIT","readme":"# redux-token-api-middleware\n\n**Alpha software - currently under heavy development**\n\nA redux middleware for making calls to APIs with token-based auth, automatically\nrequesting a new token if needed. Actions can be calls to single or multiple API\nendpoints.\n\n## Installation\n\n\t$ npm install @autotelic/redux-token-api-middleware\n\n## Usage\n\n### API actions\n\nActions that will be intercepted by the middleware are identified by the symbol\n`CALL_TOKEN_API`, and follow the [Flux Standard Action](https://github.com/acdlite/flux-standard-action) pattern, however they must have a payload and have at least an `endpoint` in the payload.\n\n#### Examples\n\n```javascript\n\nimport { CALL_TOKEN_API } from 'redux-token-api-middleware'\n\nexport const BASIC_GET_ACTION = 'BASIC_GET_ACTION'\nexport const BASIC_POST_ACTION = 'BASIC_POST_ACTION'\n\n// basic GET\n// method defaults to GET if not provided\nconst basicGetAction = () => ({\n  [CALL_TOKEN_API]: {\n    type: BASIC_GET_ACTION,\n    payload: {\n      endpoint: 'http://localhost/foo'\n    }\n  }\n})\n\n// basic POST\nconst basicPostAction = () => ({\n  [CALL_TOKEN_API]: {\n    type: BASIC_POST_ACTION,\n    payload: {\n      endpoint: 'http://localhost/bar',\n      method: 'POST'\n    }\n  }\n})\n```\n\n### Setup\n\n#### `main.js`\n\n```javascript\nimport { createTokenApiMiddleware } from 'redux-token-api-middleware'\nimport { createStore, applyMiddleware } from 'redux'\n\nimport reducer from './reducers'\n\n// example refresh token action\nconst refreshAction = (token) => ({\n  [CALL_TOKEN_API]: {\n    type: 'REFRESH_TOKEN',\n    endpoint: 'http://localhost/token',\n    method: 'POST',\n    body: JSON.stringify(token)\n  }\n})\n\nYou will need to provide a `retrieveRefreshToken` method to the config that will\nreturn the refresh token that is used to obtain a new access token.\n\nconst retrieveRefreshToken = (key = 'RefreshTokenStorageKey') => {\n  // This return value is passed to `refreshAction`\n  return localStorage.getItem(key);\n};\n\nconst config = {\n  refreshAction,\n  retrieveRefreshToken,\n};\n\nconst apiTokenMiddleware = createTokenApiMiddleware(config)\n\nconst store = createStore(\n  reducer,\n  applyMiddleware(apiTokenMiddleware)\n)\n```\n\n## API\n\n#### `createTokenApiMiddleware(config)`\n\nCreates a Redux middleware to handle API objects.\n\nIn the config, you must define at least a `refreshAction` method and a `retrieveRefreshToken`\nmethod, which is used by the middleware to attempt to get a fresh token. This should be an API\naction itself.\n\nOther methods can be passed in via config, but have defaults:\n\n```javascript\n// defaults shown\nconst config = {\n  defaultHeaders: { 'Content-Type': 'application/json' },\n  retrieveRefreshToken: () => {}; // To be implemented by the user for refreshing tokens.\n  tokenStorageKey: 'reduxMiddlewareAuthToken',\n  minTokenLifespan: 300, // seconds (min remaining lifespan to indicate new token should be requested)\n  storeToken: function storeToken(key, response) {\n    let token = response.token;\n    localStorage.setItem(key, JSON.stringify(token));\n    return token;\n  },\n  retrieveToken: function retrieveToken(key) {\n    let storedValue = localStorage.getItem(key);\n    if (!storedValue) {\n      return null;\n    }\n    try {\n      return JSON.parse(storedValue);\n    }\n    catch (e) {\n      if (e instanceof SyntaxError) {\n        return null;\n      }\n      throw e;\n    }\n  },\n  checkTokenFreshness: function checkTokenFreshness(token) {\n    let tokenPayload = jwt_decode(token);\n    let expiry = moment.unix(tokenPayload.exp);\n    return expiry.diff(moment(), 'seconds') > MIN_TOKEN_LIFESPAN;\n  },\n  shouldRequestNewToken: function shouldRequestNewToken() {\n    const token = retrieveToken();\n    return token\n      ? checkTokenFreshness(token)\n      : false;\n  },\n  addTokenToRequest: function defaultAddTokenToRequest(headers, endpoint, body, token) {\n    return {\n      headers: Object.assign({\n        Authorization: `JWT ${token}`\n      }, headers),\n      endpoint,\n      body\n    }\n  }\n}\n```\n\n_Note_: `retrieveRefreshToken`, `storeToken` and `retrieveToken` methods may also return\npromises that the middleware will resolve.\n","readmeFilename":"README.md"}