cookie-api-handler
Version:
Handler for cookie APIs
82 lines (66 loc) • 1.93 kB
JavaScript
var cookie = require('cookie');
var restApiHandler = require('rest-api-handler');
// eslint-disable-next-line filenames/match-exported
class CookieApi extends restApiHandler.Api {
constructor(...args) {
super(...args);
this.fetchRequest = async request => {
const response = await super.fetchRequest.call(this, request);
const setCookieHeader = response.headers.get('set-cookie'); // if set cookies headers are not set, just continue
if (!setCookieHeader) {
return response;
}
let cookies = {}; // parse multiple set-cookie headers
setCookieHeader.split(';').map(item => {
return !item.includes('expires') ? item.replace(',', '\n') : item;
}).join(';').split('\n').map(item => {
return cookie.parse(item.split(';')[0]);
}).forEach(item => {
cookies = { ...cookies,
...item
};
});
this.addCookies(cookies);
return response;
};
}
/**
* Serialize Object of cookies to single string.
*
* @param cookies - Object with cookies
* @returns serialized cookies string
*/
static serializeCookies(cookies) {
return Object.keys(cookies).map(name => {
return cookie.serialize(name, cookies[name]);
}).join(';');
}
/**
* Process response headers, parse cookies and save them to object.
*
* @param request - Fetch request
* @returns Response
*/
/**
* Get cookies as human readable object.
*/
getCookies() {
const cookies = this.getDefaultHeaders().cookie;
if (typeof cookies !== 'string') {
return null;
}
return cookie.parse(cookies);
}
/**
* Add object of cookies.
*
* @param cookies - Object of cookies
*/
addCookies(cookies) {
this.setDefaultHeader('cookie', CookieApi.serializeCookies({ ...this.getCookies(),
...cookies
}));
}
}
module.exports = CookieApi;
;