parse-domain
Version:
Splits a hostname into subdomains, domain and (effective) top-level domains
47 lines • 1.58 kB
JavaScript
import * as characters from "./characters.js";
import { createRootNode, createOrGetChild, NODE_TYPE_ROOT, } from "./nodes.js";
export const parseTrie = (serializedTrie) => {
const rootNode = createRootNode();
let domain = "";
let parentNode = rootNode;
// Type assertion necessary here due to a TypeScript unsoundness
// https://github.com/microsoft/TypeScript/issues/9998#issuecomment-235963457
let node = rootNode;
const addDomain = () => {
node = createOrGetChild(parentNode, domain);
domain = "";
};
for (let i = 0; i < serializedTrie.length; i++) {
const char = serializedTrie.charAt(i);
switch (char) {
case characters.SAME: {
addDomain();
continue;
}
case characters.DOWN: {
addDomain();
parentNode = node;
continue;
}
case characters.RESET: {
addDomain();
parentNode = rootNode;
continue;
}
case characters.UP: {
if (parentNode.type === NODE_TYPE_ROOT) {
throw new Error(`Error in serialized trie at position ${i}: Cannot go up, current parent node is already root`);
}
addDomain();
parentNode = parentNode.parent;
continue;
}
}
domain += char;
}
if (domain !== "") {
addDomain();
}
return rootNode;
};
//# sourceMappingURL=parse-trie.js.map