UNPKG

cookie-api-handler

Version:
82 lines (66 loc) 1.93 kB
'use strict'; 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;