Source: crm-env.mjs

/**
 * Class to define the parameters of the Efficy Enterprise server
 */
class CrmEnv {
	#name = "CrmEnv";
	#isNode = (typeof process !== "undefined" && process?.versions?.node ? true : false);

	/**
	 * Create a Crm Environment. Set null when executed from browser
	 * @param {Object} [env] - The definition object of the targeted CRM environment
	 * @param {string} [env.url=""] - The URL of Efficy Enterprise, e.g. https://mycompany.efficy.cloud/. Set null when executed from browser
	 * @param {string} [env.customer=""] - The optional customer profile name
	 * @param {boolean} [env.logOff=false] - if true, logoff the session after the next executeBatch();
	 * @param {string} [env.apiKey=""] - The API Key, if user and password are not used
	 * @param {string} [env.user=""] - The user credential
	 * @param {string} [env.pwd=""] - The password credential
	 * @param {array} [env.cookies=[]] - Optional cookie setting
	 * @example
	 * new CrmEnv({
	 *    "url": "https://mycompany.efficy.cloud/",
	 *    "apiKey": "86E353284C0C4A848F7ADEA13589C8B6"
	 * });
	 * @tutorial CRM Environment
	 */
	constructor(env) {
		if (typeof env === "object") {
			this.setEnv(env);
		} else {
			this.setEnv({
				url: window.location.origin
			});
		}
	}

	/**
	 * Update the Crm Environment set by the constructor
	 * @param {Object} env - The definition object of the targeted CRM environment
	 * @param {string} [env.url=""] - The URL of Efficy Enterprise, e.g. https://mycompany.efficy.cloud/. Leave empty when executed from browser
	 * @param {string} [env.customer=""] - The optional customer profile name
	 * @param {boolean} [env.logOff=false] - if true, logoff the session after the next executeBatch();
	 * @param {string} [env.apiKey=""] - The API Key, if user and password are not used
	 * @param {string} [env.user=""] - The user credential
	 * @param {string} [env.pwd=""] - The password credential
	 * @param {array} [env.cookies=[]] - Optional cookie setting
	 */
	setEnv(env) {
		this.url = env.url || ""; // e.g. "https://customer.efficy.com";
		this.customer = env.customer || "";
		this.logOff = typeof env.logOff === "boolean" ? env.logOff : false;

		// Sensitive properties
		this.apiKey = env.apiKey || "";
		this.user = env.user || "";
		this.pwd = env.pwd || "";
		this.cookies = env.cookies || [];

		// Replace last "/" with "";
		this.url = this.url.replace(/\/$/,"");
	}

	/**
	 * Returns true if this code runs in node.js
	 * @type {boolean}
	 */
	get isNode() {
		return this.#isNode;
	}

	/**
	 * Returns the request header "cookie", e.g. 'EfficySession=3B826396-22AE9698'
	 * @type {string}
	 */
	get cookieHeader() {
		if (Array.isArray(this.cookies)) {
			const header = this.cookies
				.filter(cookie => new Date() < new Date(cookie.expires))
				.map(cookie => [cookie.name, cookie.value].join("=")).join("; ");

			return header;
		}
		return "";
	}

	/**
	 * Returns the session ID, e.g. '3B826396-22AE9698'
	 * @type {string}
	 */
	get sessionId() {
		return Array.isArray(this.cookies) && this.cookies.length > 0 ? this.cookies[0].value: "";
	}

	/**
	 * Returns the first part of the session ID, e.g. '3B826396'
	 * @type {string}
	 */
	get shortSessionId() {
		return this.sessionId.split("-")[0];
	}
}

export default CrmEnv