Source: server/util/identityCookie/readChunkedCookie.js

import debugLib from 'debug';
import msUrlTokenDecode from '../msUrlTokenDecode';

const CHUNKS_PREFIX = 'chunks-';

const debug = debugLib('SlimmingWorld:readChunkedCookie');

/**
 * Reads a cookie stored by ASP.NET core ChunkingCookieManager
 * @param cookieStore {Object} an object containing all cookies
 * @param cookieName {string} the name of the cookie to read
 *
 * @returns {Buffer|null} A buffer containing the cookie payload if set, null otherwise
 */
function readChunkedCookie(cookieStore, cookieName) {
  if (!cookieStore || !cookieStore[cookieName]) {
    return null;
  }

  let payload = cookieStore[cookieName];
  if (payload.slice(0, CHUNKS_PREFIX.length) === CHUNKS_PREFIX) {
    const numChunksMatch = payload.match(/^chunks-(\d+)/);
    if (!numChunksMatch) {
      debug('Warning: Cannot extract number of chunks from cookie');
      return null;
    }
    const numChunks = parseInt(numChunksMatch[1], 10);
    payload = '';

    for (let i = 1; i <= numChunks; i++) {
      const chunkCookiePayload = cookieStore[`${cookieName}C${i}`];

      if (!chunkCookiePayload) {
        debug(`Warning: could not find cookie chunk #${i}`);
        return null;
      }

      payload += chunkCookiePayload;
    }
  }

  return msUrlTokenDecode(payload);
}

export default readChunkedCookie;