| import { IPublicSuffix, ISuffixLookupOptions } from './interface'; | |
| export default function ( | |
| hostname: string, | |
| options: ISuffixLookupOptions, | |
| out: IPublicSuffix, | |
| ): boolean { | |
| // Fast path for very popular suffixes; this allows to by-pass lookup | |
| // completely as well as any extra allocation or string manipulation. | |
| if (!options.allowPrivateDomains && hostname.length > 3) { | |
| const last: number = hostname.length - 1; | |
| const c3: number = hostname.charCodeAt(last); | |
| const c2: number = hostname.charCodeAt(last - 1); | |
| const c1: number = hostname.charCodeAt(last - 2); | |
| const c0: number = hostname.charCodeAt(last - 3); | |
| if ( | |
| c3 === 109 /* 'm' */ && | |
| c2 === 111 /* 'o' */ && | |
| c1 === 99 /* 'c' */ && | |
| c0 === 46 /* '.' */ | |
| ) { | |
| out.isIcann = true; | |
| out.isPrivate = false; | |
| out.publicSuffix = 'com'; | |
| return true; | |
| } else if ( | |
| c3 === 103 /* 'g' */ && | |
| c2 === 114 /* 'r' */ && | |
| c1 === 111 /* 'o' */ && | |
| c0 === 46 /* '.' */ | |
| ) { | |
| out.isIcann = true; | |
| out.isPrivate = false; | |
| out.publicSuffix = 'org'; | |
| return true; | |
| } else if ( | |
| c3 === 117 /* 'u' */ && | |
| c2 === 100 /* 'd' */ && | |
| c1 === 101 /* 'e' */ && | |
| c0 === 46 /* '.' */ | |
| ) { | |
| out.isIcann = true; | |
| out.isPrivate = false; | |
| out.publicSuffix = 'edu'; | |
| return true; | |
| } else if ( | |
| c3 === 118 /* 'v' */ && | |
| c2 === 111 /* 'o' */ && | |
| c1 === 103 /* 'g' */ && | |
| c0 === 46 /* '.' */ | |
| ) { | |
| out.isIcann = true; | |
| out.isPrivate = false; | |
| out.publicSuffix = 'gov'; | |
| return true; | |
| } else if ( | |
| c3 === 116 /* 't' */ && | |
| c2 === 101 /* 'e' */ && | |
| c1 === 110 /* 'n' */ && | |
| c0 === 46 /* '.' */ | |
| ) { | |
| out.isIcann = true; | |
| out.isPrivate = false; | |
| out.publicSuffix = 'net'; | |
| return true; | |
| } else if ( | |
| c3 === 101 /* 'e' */ && | |
| c2 === 100 /* 'd' */ && | |
| c1 === 46 /* '.' */ | |
| ) { | |
| out.isIcann = true; | |
| out.isPrivate = false; | |
| out.publicSuffix = 'de'; | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |