UNPKG

@ezbot-ai/javascript-sdk

Version:

The easiest way to interact with ezbot via JS (node and browser)

56 lines 4.76 kB
/** * Checks if a link is a cross-domain link that should be tracked. * * @param linkElement - The anchor element to check * @param allowedDomains - List of allowed domains for cross-domain tracking * @returns boolean indicating if this is a cross-domain link to an allowed domain */ export function isCrossDomainLink(linkElement, allowedDomains) { // Get the current location's hostname and port const currentHostname = window.location.hostname; const currentPort = window.location.port; // Create a URL object from the link's href try { const linkUrl = new URL(linkElement.href); // 1. Check if hostname and port on linkElement and location are a match const isSameDomain = linkUrl.hostname === currentHostname && linkUrl.port === currentPort; if (isSameDomain) { // 2. If they are a match, return false (no cross-domain linking needed) return false; } // 3. Check if the linkElement hostname is in the allowed list // 4 & 5. Check if the link's hostname is in the allowed domains list return allowedDomains.some((domain) => { // Remove protocol if present in the domain const cleanDomain = domain.replace(/^https?:\/\//, ''); // Create a combined hostname:port string from the link URL for comparison const linkHostWithPort = linkUrl.port ? linkUrl.hostname + ':' + linkUrl.port : linkUrl.hostname; // Check if the link matches domain in various ways const exactMatch = linkHostWithPort === cleanDomain; const hostnameOnlyMatch = linkUrl.hostname === cleanDomain; const subdomainMatch = linkUrl.hostname.endsWith('.' + cleanDomain) || (cleanDomain.includes(':') && linkHostWithPort.endsWith('.' + cleanDomain.split(':')[0] + ':' + cleanDomain.split(':')[1])); return exactMatch || hostnameOnlyMatch || subdomainMatch; }); } catch (e) { // If the href is invalid, return false return false; } } /** * Creates a cross-domain link checker function that only requires the linkElement parameter. * The allowed domains are captured in the closure. * * @param allowedDomains - List of allowed domains for cross-domain tracking * @returns A function that takes only a linkElement and checks if it's a cross-domain link */ export function createCrossDomainLinkChecker(allowedDomains) { return (linkElement) => { return isCrossDomainLink(linkElement, allowedDomains); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NEb21haW5MaW5rZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzL2Nyb3NzRG9tYWluTGlua2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsV0FBMEQsRUFDMUQsY0FBaUM7SUFFakMsK0NBQStDO0lBQy9DLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBRXpDLDJDQUEyQztJQUMzQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsd0VBQXdFO1FBQ3hFLE1BQU0sWUFBWSxHQUNoQixPQUFPLENBQUMsUUFBUSxLQUFLLGVBQWUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztRQUV2RSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLHdFQUF3RTtZQUN4RSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCw4REFBOEQ7UUFDOUQscUVBQXFFO1FBQ3JFLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3BDLDJDQUEyQztZQUMzQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV2RCwwRUFBMEU7WUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSTtnQkFDbkMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJO2dCQUN2QyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUVyQixtREFBbUQ7WUFDbkQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEtBQUssV0FBVyxDQUFDO1lBQ3BELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUM7WUFDM0QsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7Z0JBQzVDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7b0JBQ3hCLGdCQUFnQixDQUFDLFFBQVEsQ0FDdkIsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xFLENBQUMsQ0FBQztZQUVQLE9BQU8sVUFBVSxJQUFJLGlCQUFpQixJQUFJLGNBQWMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsdUNBQXVDO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLGNBQWlDO0lBRWpDLE9BQU8sQ0FDTCxXQUEwRCxFQUNqRCxFQUFFO1FBQ1gsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9