All files / src/custom-nodes/string-array-nodes/factory StringArrayCustomNodeGroup.ts

100% Statements 33/33
100% Branches 6/6
100% Functions 1/1
100% Lines 32/32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 881x 1x                   1x 1x   1x   1x 1x 1x   1x 1x       1603x                             1603x   1603x               1603x 1074x     529x   529x 529x 529x   529x 529x   529x   529x 514x   15x     529x 529x 529x   529x         529x 514x     529x      
import { injectable, inject } from 'inversify';
import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
import { TCustomNodeFactory } from '../../../types/container/TCustomNodeFactory';
import { TObfuscationEvent } from '../../../types/event-emitters/TObfuscationEvent';
 
import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
import { IOptions } from '../../../interfaces/options/IOptions';
import { IStackTraceData } from '../../../interfaces/stack-trace-analyzer/IStackTraceData';
import { IStorage } from '../../../interfaces/storages/IStorage';
 
import { CustomNodes } from '../../../enums/container/CustomNodes';
import { ObfuscationEvents } from '../../../enums/ObfuscationEvents';
 
import { StringArrayNode } from '../StringArrayNode';
 
import { AbstractCustomNodesFactory } from '../../AbstractCustomNodesFactory';
import { StringArrayStorage } from '../../../storages/string-array/StringArrayStorage';
import { Utils } from '../../../Utils';
 
@injectable()
export class StringArrayCustomNodesFactory extends AbstractCustomNodesFactory {
    /**
     * @type {TObfuscationEvent}
     */
    protected appendEvent: TObfuscationEvent = ObfuscationEvents.AfterObfuscation;
 
    /**
     * @type {TCustomNodeFactory}
     */
    private readonly customNodeFactory: TCustomNodeFactory;
 
    /**
     * @param customNodeFactory
     * @param options
     */
    constructor (
        @inject(ServiceIdentifiers['Factory<ICustomNode>']) customNodeFactory: TCustomNodeFactory,
        @inject(ServiceIdentifiers.IOptions) options: IOptions
    ) {
        super(options);
 
        this.customNodeFactory = customNodeFactory;
    }
 
    /**
     * @param stackTraceData
     * @returns {Map<string, ICustomNode>}
     */
    public initializeCustomNodes (stackTraceData: IStackTraceData[]): Map <string, ICustomNode> | undefined {
        if (!this.options.stringArray) {
            return;
        }
 
        const stringArray: IStorage <string> = new StringArrayStorage();
 
        const stringArrayNode: ICustomNode = this.customNodeFactory(CustomNodes.StringArrayNode);
        const stringArrayCallsWrapper: ICustomNode = this.customNodeFactory(CustomNodes.StringArrayCallsWrapper);
        const stringArrayRotateFunctionNode: ICustomNode = this.customNodeFactory(CustomNodes.StringArrayRotateFunctionNode);
 
        const stringArrayName: string = Utils.getRandomVariableName(StringArrayNode.ARRAY_RANDOM_LENGTH);
        const stringArrayCallsWrapperName: string = Utils.getRandomVariableName(StringArrayNode.ARRAY_RANDOM_LENGTH);
 
        let stringArrayRotateValue: number;
 
        if (this.options.rotateStringArray) {
            stringArrayRotateValue = Utils.getRandomInteger(100, 500);
        } else {
            stringArrayRotateValue = 0;
        }
 
        stringArrayNode.initialize(stringArray, stringArrayName, stringArrayRotateValue);
        stringArrayCallsWrapper.initialize(stringArray, stringArrayName, stringArrayCallsWrapperName);
        stringArrayRotateFunctionNode.initialize(stringArray, stringArrayName, stringArrayRotateValue);
 
        const customNodes: Map <string, ICustomNode> = new Map <string, ICustomNode> ([
            ['stringArrayNode', stringArrayNode],
            ['stringArrayCallsWrapper', stringArrayCallsWrapper]
        ]);
 
        if (this.options.rotateStringArray) {
            customNodes.set('stringArrayRotateFunctionNode', stringArrayRotateFunctionNode);
        }
 
        return this.syncCustomNodesWithNodesFactory(customNodes);
    }
}