# 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);
        }
    }