ngx-preboot
Version:
Record server view events and play back to Angular client view
36 lines • 4.69 kB
JavaScript
/**
* Attempt to generate key from node position in the DOM
*/
export function getNodeKeyForPreboot(nodeContext) {
const ancestors = [];
const root = nodeContext.root;
const node = nodeContext.node;
let temp = node;
// walk up the tree from the target node up to the root
while (temp && temp !== root.serverNode && temp !== root.clientNode) {
ancestors.push(temp);
temp = temp.parentNode;
}
// note: if temp doesn't exist here it means root node wasn't found
if (temp) {
ancestors.push(temp);
}
// now go backwards starting from the root, appending the appName to unique
// identify the node later..
const name = node.nodeName || 'unknown';
let key = name;
const len = ancestors.length;
for (let i = len - 1; i >= 0; i--) {
temp = ancestors[i];
if (temp.childNodes && i > 0) {
for (let j = 0; j < temp.childNodes.length; j++) {
if (temp.childNodes[j] === ancestors[i - 1]) {
key += '_s' + (j + 1);
break;
}
}
}
}
return key;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LW5vZGUta2V5LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21tb24vZ2V0LW5vZGUta2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQXdCO0lBQzNELE1BQU0sU0FBUyxHQUFjLEVBQUUsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQW1CLElBQUksQ0FBQztJQUVoQyx1REFBdUQ7SUFDdkQsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDbkUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQXFCLENBQUM7S0FDbkM7SUFFRCxtRUFBbUU7SUFDbkUsSUFBSSxJQUFJLEVBQUU7UUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3RCO0lBRUQsMkVBQTJFO0lBQzNFLDRCQUE0QjtJQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztJQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDZixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBRTdCLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2pDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDM0MsR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEIsTUFBTTtpQkFDUDthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgTm9kZUNvbnRleHQgfSBmcm9tICcuL3ByZWJvb3QuaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogQXR0ZW1wdCB0byBnZW5lcmF0ZSBrZXkgZnJvbSBub2RlIHBvc2l0aW9uIGluIHRoZSBET01cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVLZXlGb3JQcmVib290KG5vZGVDb250ZXh0OiBOb2RlQ29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IGFuY2VzdG9yczogRWxlbWVudFtdID0gW107XG4gIGNvbnN0IHJvb3QgPSBub2RlQ29udGV4dC5yb290O1xuICBjb25zdCBub2RlID0gbm9kZUNvbnRleHQubm9kZTtcbiAgbGV0IHRlbXA6IEVsZW1lbnQgfCBudWxsID0gbm9kZTtcblxuICAvLyB3YWxrIHVwIHRoZSB0cmVlIGZyb20gdGhlIHRhcmdldCBub2RlIHVwIHRvIHRoZSByb290XG4gIHdoaWxlICh0ZW1wICYmIHRlbXAgIT09IHJvb3Quc2VydmVyTm9kZSAmJiB0ZW1wICE9PSByb290LmNsaWVudE5vZGUpIHtcbiAgICBhbmNlc3RvcnMucHVzaCh0ZW1wKTtcbiAgICB0ZW1wID0gdGVtcC5wYXJlbnROb2RlIGFzIEVsZW1lbnQ7XG4gIH1cblxuICAvLyBub3RlOiBpZiB0ZW1wIGRvZXNuJ3QgZXhpc3QgaGVyZSBpdCBtZWFucyByb290IG5vZGUgd2Fzbid0IGZvdW5kXG4gIGlmICh0ZW1wKSB7XG4gICAgYW5jZXN0b3JzLnB1c2godGVtcCk7XG4gIH1cblxuICAvLyBub3cgZ28gYmFja3dhcmRzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QsIGFwcGVuZGluZyB0aGUgYXBwTmFtZSB0byB1bmlxdWVcbiAgLy8gaWRlbnRpZnkgdGhlIG5vZGUgbGF0ZXIuLlxuICBjb25zdCBuYW1lID0gbm9kZS5ub2RlTmFtZSB8fCAndW5rbm93bic7XG4gIGxldCBrZXkgPSBuYW1lO1xuICBjb25zdCBsZW4gPSBhbmNlc3RvcnMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgIHRlbXAgPSBhbmNlc3RvcnNbaV07XG5cbiAgICBpZiAodGVtcC5jaGlsZE5vZGVzICYmIGkgPiAwKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRlbXAuY2hpbGROb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodGVtcC5jaGlsZE5vZGVzW2pdID09PSBhbmNlc3RvcnNbaSAtIDFdKSB7XG4gICAgICAgICAga2V5ICs9ICdfcycgKyAoaiArIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtleTtcbn1cbiJdfQ==