@segment/analytics-next
Version:
Analytics Next (aka Analytics 2.0) is the latest version of Segment’s JavaScript SDK - enabling you to send your data to any tool without having to learn, test, or use a new API every time.
66 lines (55 loc) • 1.34 kB
text/typescript
import cookie from 'js-cookie'
/**
* Levels returns all levels of the given url.
*
* @param {string} url
* @return {Array}
* @api public
*/
function levels(url: URL): string[] {
const host = url.hostname
const parts = host.split('.')
const last = parts[parts.length - 1]
const levels: string[] = []
// Ip address.
if (parts.length === 4 && parseInt(last, 10) > 0) {
return levels
}
// Localhost.
if (parts.length <= 1) {
return levels
}
// Create levels.
for (let i = parts.length - 2; i >= 0; --i) {
levels.push(parts.slice(i).join('.'))
}
return levels
}
function parseUrl(url: string): URL | undefined {
try {
return new URL(url)
} catch {
return
}
}
export function tld(url: string): string | undefined {
const parsedUrl = parseUrl(url)
if (!parsedUrl) return
const lvls = levels(parsedUrl)
// Lookup the real top level one.
for (let i = 0; i < lvls.length; ++i) {
const cname = '__tld__'
const domain = lvls[i]
const opts = { domain: '.' + domain }
try {
// cookie access throw an error if the library is ran inside a sandboxed environment (e.g. sandboxed iframe)
cookie.set(cname, '1', opts)
if (cookie.get(cname)) {
cookie.remove(cname, opts)
return domain
}
} catch (_) {
return
}
}
}