UNPKG

@rudderstack/analytics-js-cookies

Version:
146 lines (135 loc) 10.9 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.rsaCookies = {})); })(this, (function (exports) { 'use strict'; /** * A function to check given value is null or not * @param value input value * @returns boolean */var isNull=function isNull(value){return value===null;};/** * A function to check given value is undefined * @param value input value * @returns boolean */var isUndefined=function isUndefined(value){return typeof value==='undefined';};/** * A function to check given value is null or undefined * @param value input value * @returns boolean */var isNullOrUndefined=function isNullOrUndefined(value){return isNull(value)||isUndefined(value);}; // https://developer.mozilla.org/en-US/docs/Glossary/Base64#the_unicode_problem /** * Converts a base64 encoded string to bytes array * @param base64Str base64 encoded string * @returns bytes array */var base64ToBytes=function base64ToBytes(base64Str){var binString=globalThis.atob(base64Str);var bytes=binString.split('').map(function(char){return char.charCodeAt(0);});return new Uint8Array(bytes);};/** * Converts a bytes array to base64 encoded string * @param bytes bytes array to be converted to base64 * @returns base64 encoded string */var bytesToBase64=function bytesToBase64(bytes){var binString=Array.from(bytes,function(x){return String.fromCodePoint(x);}).join('');return globalThis.btoa(binString);};/** * Encodes a string to base64 even with unicode characters * @param value input string * @returns base64 encoded string */var toBase64=function toBase64(value){return bytesToBase64(new TextEncoder().encode(value));};/** * Decodes a base64 encoded string * @param value base64 encoded string * @returns decoded string */var fromBase64=function fromBase64(value){return new TextDecoder().decode(base64ToBytes(value));}; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var CIRCULAR_REFERENCE_PLACEHOLDER='[Circular Reference]';var getCircularReplacer=function getCircularReplacer(excludeNull,excludeKeys,logger){var ancestors=[];// Here we do not want to use arrow function to use "this" in function context // eslint-disable-next-line func-names return function(key,value){if(_typeof(value)!=='object'||isNull(value)){return value;}// `this` is the object that value is contained in, i.e., its direct parent. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore-next-line while(ancestors.length>0&&ancestors[ancestors.length-1]!==this){ancestors.pop();}if(ancestors.includes(value)){return CIRCULAR_REFERENCE_PLACEHOLDER;}ancestors.push(value);return value;};};/** * Utility method for JSON stringify object excluding null values & circular references * * @param {*} value input * @param {boolean} excludeNull if it should exclude nul or not * @param {function} logger optional logger methods for warning * @returns string */var stringifyWithoutCircular=function stringifyWithoutCircular(value,excludeNull,excludeKeys,logger){try{return JSON.stringify(value,getCircularReplacer(excludeNull,excludeKeys,logger));}catch(err){return null;}}; /** * Encode. */var encode=function encode(value,logger){try{return encodeURIComponent(value);}catch(err){return undefined;}};/** * Decode */var decode=function decode(value){try{return decodeURIComponent(value);}catch(err){// Do nothing as non-RS SDK cookies may not be URI encoded return undefined;}};/** * Parse cookie `str` */var parse=function parse(str){var obj={};var pairs=str.split(/\s*;\s*/);var pair;if(!pairs[0]){return obj;}// TODO: Decode only the cookies that are needed by the SDK pairs.forEach(function(pairItem){pair=pairItem.split('=');var keyName=pair[0]?decode(pair[0]):undefined;if(keyName){obj[keyName]=pair[1]?decode(pair[1]):undefined;}});return obj;};/** * Set cookie `name` to `value` */var set=function set(name,value,optionsConfig,logger){var options=_objectSpread2({},{});var cookieString="".concat(encode(name),"=").concat(encode(value));if(isNull(value)){options.maxage=-1;}if(options.maxage){options.expires=new Date(+new Date()+options.maxage);}if(options.path){cookieString+="; path=".concat(options.path);}if(options.domain){cookieString+="; domain=".concat(options.domain);}if(options.expires){cookieString+="; expires=".concat(options.expires.toUTCString());}if(options.samesite){cookieString+="; samesite=".concat(options.samesite);}if(options.secure){cookieString+="; secure";}globalThis.document.cookie=cookieString;};/** * Return all cookies */var all=function all(){var cookieStringValue=globalThis.document.cookie;return parse(cookieStringValue);};/** * Get cookie `name` */var get=function get(name){return all()[name];};/** * Set or get cookie `name` with `value` and `options` object */// eslint-disable-next-line func-names var cookie=function cookie(name,value,options,logger){switch(arguments.length){case 4:case 3:case 2:return set(name,value);case 1:if(name){return get(name);}return all();default:return all();}}; var userIdKey='rl_user_id';var userTraitsKey='rl_trait';var anonymousUserIdKey='rl_anonymous_id';var groupIdKey='rl_group_id';var groupTraitsKey='rl_group_trait';var pageInitialReferrerKey='rl_page_init_referrer';var pageInitialReferringDomainKey='rl_page_init_referring_domain';var sessionInfoKey='rl_session';var authTokenKey='rl_auth_token';var COOKIE_KEYS={userId:userIdKey,userTraits:userTraitsKey,anonymousId:anonymousUserIdKey,groupId:groupIdKey,groupTraits:groupTraitsKey,initialReferrer:pageInitialReferrerKey,initialReferringDomain:pageInitialReferringDomainKey,sessionInfo:sessionInfoKey,authToken:authTokenKey};var ENCRYPTION_PREFIX_V3='RS_ENC_v3_'; var getEncryptedValueInternal=function getEncryptedValueInternal(value,encryptFn,debug){var fallbackValue=null;try{var strValue=stringifyWithoutCircular(value,false);if(isNull(strValue)){return null;}return encryptFn(strValue);}catch(err){if(debug){console.error('Error occurred during encryption: ',err);}return fallbackValue;}};var getDecryptedValueInternal=function getDecryptedValueInternal(value,decryptFn,debug){var fallbackValue=null;try{var decryptedVal=decryptFn(value);if(isNullOrUndefined(decryptedVal)){return fallbackValue;}return JSON.parse(decryptedVal);}catch(err){if(debug){console.error('Error occurred during decryption: ',err);}return fallbackValue;}};var encryptBrowser=function encryptBrowser(value){return "".concat(ENCRYPTION_PREFIX_V3).concat(toBase64(value));};var decryptBrowser=function decryptBrowser(value){if(value!==null&&value!==void 0&&value.startsWith(ENCRYPTION_PREFIX_V3)){return fromBase64(value.substring(ENCRYPTION_PREFIX_V3.length));}return value;};var getEncryptedValueBrowser=function getEncryptedValueBrowser(value){var debug=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return getEncryptedValueInternal(value,encryptBrowser,debug);};var getDecryptedValueBrowser=function getDecryptedValueBrowser(value){var debug=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return getDecryptedValueInternal(value,decryptBrowser,debug);};var getDecryptedCookieBrowser=function getDecryptedCookieBrowser(cookieKey){var debug=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(Object.values(COOKIE_KEYS).includes(cookieKey)){return getDecryptedValueBrowser(cookie(cookieKey),debug);}return null;};var encrypt=function encrypt(value){return "".concat(ENCRYPTION_PREFIX_V3).concat(Buffer.from(value,'utf-8').toString('base64'));};var decrypt=function decrypt(value){if(value!==null&&value!==void 0&&value.startsWith(ENCRYPTION_PREFIX_V3)){return Buffer.from(value.substring(ENCRYPTION_PREFIX_V3.length),'base64').toString('utf-8');}return value;};var getDecryptedValue=function getDecryptedValue(value){var debug=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return getDecryptedValueInternal(value,decrypt,debug);};var getEncryptedValue=function getEncryptedValue(value){var debug=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return getEncryptedValueInternal(value,encrypt,debug);}; exports.anonymousUserIdKey = anonymousUserIdKey; exports.authTokenKey = authTokenKey; exports.getDecryptedCookieBrowser = getDecryptedCookieBrowser; exports.getDecryptedValue = getDecryptedValue; exports.getDecryptedValueBrowser = getDecryptedValueBrowser; exports.getEncryptedValue = getEncryptedValue; exports.getEncryptedValueBrowser = getEncryptedValueBrowser; exports.groupIdKey = groupIdKey; exports.groupTraitsKey = groupTraitsKey; exports.pageInitialReferrerKey = pageInitialReferrerKey; exports.pageInitialReferringDomainKey = pageInitialReferringDomainKey; exports.sessionInfoKey = sessionInfoKey; exports.userIdKey = userIdKey; exports.userTraitsKey = userTraitsKey; }));