InversifyContainerFacade.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { Container, interfaces } from 'inversify';
  2. import { ServiceIdentifiers } from './ServiceIdentifiers';
  3. import { controlFlowTransformersModule } from './modules/node-transformers/ControlFlowTransformersModule';
  4. import { customNodesModule } from './modules/custom-nodes/CustomNodesModule';
  5. import { obfuscatingTransformersModule } from './modules/node-transformers/ObfuscatingTransformersModule';
  6. import { nodeTransformersModule } from './modules/node-transformers/NodeTransformersModule';
  7. import { stackTraceAnalyzerModule } from './modules/stack-trace-analyzer/StackTraceAnalyzerModule';
  8. import { storagesModule } from './modules/storages/StoragesModule';
  9. import { TInputOptions } from '../types/options/TInputOptions';
  10. import { IInversifyContainerFacade } from '../interfaces/container/IInversifyContainerFacade';
  11. import { IJavaScriptObfuscator } from '../interfaces/IJavaScriptObfsucator';
  12. import { IObfuscationEventEmitter } from '../interfaces/event-emitters/IObfuscationEventEmitter';
  13. import { IObfuscationResult } from '../interfaces/IObfuscationResult';
  14. import { IObfuscator } from '../interfaces/IObfuscator';
  15. import { IOptions } from '../interfaces/options/IOptions';
  16. import { ISourceMapCorrector } from '../interfaces/ISourceMapCorrector';
  17. import { JavaScriptObfuscatorInternal } from '../JavaScriptObfuscatorInternal';
  18. import { ObfuscationEventEmitter } from '../event-emitters/ObfuscationEventEmitter';
  19. import { ObfuscationResult } from '../ObfuscationResult';
  20. import { Obfuscator } from '../Obfuscator';
  21. import { Options } from "../options/Options";
  22. import { SourceMapCorrector } from '../SourceMapCorrector';
  23. export class InversifyContainerFacade implements IInversifyContainerFacade {
  24. /**
  25. * @type {interfaces.Container}
  26. */
  27. private readonly container: interfaces.Container;
  28. /**
  29. * @param options
  30. */
  31. constructor (options: TInputOptions) {
  32. this.container = new Container();
  33. this.container
  34. .bind<IOptions>(ServiceIdentifiers.IOptions)
  35. .toDynamicValue(() => {
  36. return new Options(options);
  37. })
  38. .inSingletonScope();
  39. this.container
  40. .bind<IJavaScriptObfuscator>(ServiceIdentifiers.IJavaScriptObfuscator)
  41. .to(JavaScriptObfuscatorInternal)
  42. .inSingletonScope();
  43. this.container
  44. .bind<IObfuscator>(ServiceIdentifiers.IObfuscator)
  45. .to(Obfuscator)
  46. .inSingletonScope();
  47. this.container
  48. .bind<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult)
  49. .to(ObfuscationResult)
  50. .inSingletonScope();
  51. this.container
  52. .bind<IObfuscationResult>(ServiceIdentifiers.Factory__IObfuscationResult)
  53. .toFactory<IObfuscationResult>((context: interfaces.Context) => {
  54. return (obfuscatedCode: string, sourceMap: string) => {
  55. const obfuscationResult: IObfuscationResult = context.container
  56. .get<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult);
  57. obfuscationResult.initialize(obfuscatedCode, sourceMap);
  58. return obfuscationResult;
  59. };
  60. });
  61. this.container
  62. .bind<ISourceMapCorrector>(ServiceIdentifiers.ISourceMapCorrector)
  63. .to(SourceMapCorrector)
  64. .inSingletonScope();
  65. this.container
  66. .bind<IObfuscationEventEmitter>(ServiceIdentifiers.IObfuscationEventEmitter)
  67. .to(ObfuscationEventEmitter)
  68. .inSingletonScope();
  69. // modules
  70. this.container.load(storagesModule);
  71. this.container.load(stackTraceAnalyzerModule);
  72. this.container.load(customNodesModule);
  73. this.container.load(nodeTransformersModule);
  74. this.container.load(controlFlowTransformersModule);
  75. this.container.load(obfuscatingTransformersModule);
  76. }
  77. /**
  78. * @param serviceIdentifier
  79. * @return {(context:interfaces.Context)=>(bindingName:T)=>U}
  80. */
  81. public static getFactory <T extends number, U> (
  82. serviceIdentifier: interfaces.ServiceIdentifier<U>
  83. ): (context: interfaces.Context) => (bindingName: T) => U {
  84. return (context: interfaces.Context): (bindingName: T) => U => {
  85. return (bindingName: T) => {
  86. return context.container.getNamed<U>(serviceIdentifier, bindingName);
  87. };
  88. };
  89. }
  90. /**
  91. * @param serviceIdentifier
  92. * @return {(context:interfaces.Context)=>(bindingName:T)=>U}
  93. */
  94. public static getCacheFactory <T extends number, U> (
  95. serviceIdentifier: interfaces.ServiceIdentifier<U>
  96. ): (context: interfaces.Context) => (bindingName: T) => U {
  97. return (context: interfaces.Context): (bindingName: T) => U => {
  98. const cache: Map <T, U> = new Map();
  99. return (bindingName: T) => {
  100. if (cache.has(bindingName)) {
  101. return <U>cache.get(bindingName);
  102. }
  103. const object: U = context.container.getNamed<U>(serviceIdentifier, bindingName);
  104. cache.set(bindingName, object);
  105. return object;
  106. };
  107. };
  108. }
  109. /**
  110. * @param serviceIdentifier
  111. * @returns {T}
  112. */
  113. public get <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>): T {
  114. return this.container.get<T>(serviceIdentifier);
  115. }
  116. /**
  117. * @param serviceIdentifier
  118. * @param named
  119. * @returns {T}
  120. */
  121. public getNamed <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>, named: string | number | symbol): T {
  122. return this.container.getNamed<T>(serviceIdentifier, named);
  123. }
  124. }