import { INode } from "../../interfaces/nodes/INode"; import { TNodeWithBlockStatement } from "../../types/TNodeWithBlockStatement"; import { AppendState } from "../../enums/AppendState"; import { NO_CUSTOM_NODES_PRESET } from "../../preset-options/NoCustomNodesPreset"; import { SelfDefendingTemplate } from "../../templates/custom-nodes/self-defending-nodes/self-defending-unicode-node/SelfDefendingTemplate"; import { JavaScriptObfuscator } from "../../JavaScriptObfuscator"; import { Node } from '../Node'; import { NodeUtils } from "../../NodeUtils"; import { Utils } from "../../Utils"; export class SelfDefendingUnicodeNode extends Node { /** * @type {AppendState} */ protected appendState: AppendState = AppendState.AfterObfuscation; /** * @param blockScopeNode */ public appendNode (blockScopeNode: TNodeWithBlockStatement): void { let programBodyLength: number = blockScopeNode.body.length, randomIndex: number = 0; if (programBodyLength > 2) { randomIndex = Utils.getRandomGenerator().integer({ min: programBodyLength / 2, max: programBodyLength - 1 }); } NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), randomIndex); } /** * @returns {INode} */ protected getNodeStructure (): INode { return NodeUtils.convertCodeToStructure( JavaScriptObfuscator.obfuscate( SelfDefendingTemplate(), NO_CUSTOM_NODES_PRESET ).getObfuscatedCode() ); } }