InversifyContainerFacade.ts 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import { Container, interfaces } from 'inversify';
  2. import { ServiceIdentifiers } from './ServiceIdentifiers';
  3. import { analyzersModule } from './modules/analyzers/AnalyzersModule';
  4. import { controlFlowTransformersModule } from './modules/node-transformers/ControlFlowTransformersModule';
  5. import { convertingTransformersModule } from './modules/node-transformers/ConvertingTransformersModule';
  6. import { customNodesModule } from './modules/custom-nodes/CustomNodesModule';
  7. import { generatorsModule } from './modules/generators/GeneratorsModule';
  8. import { nodeTransformersModule } from './modules/node-transformers/NodeTransformersModule';
  9. import { obfuscatingTransformersModule } from './modules/node-transformers/ObfuscatingTransformersModule';
  10. import { preparingTransformersModule } from './modules/node-transformers/PreparingTransformersModule';
  11. import { storagesModule } from './modules/storages/StoragesModule';
  12. import { utilsModule } from './modules/utils/UtilsModule';
  13. import { TInputOptions } from '../types/options/TInputOptions';
  14. import { IInversifyContainerFacade } from '../interfaces/container/IInversifyContainerFacade';
  15. import { IJavaScriptObfuscator } from '../interfaces/IJavaScriptObfsucator';
  16. import { ILogger } from '../interfaces/logger/ILogger';
  17. import { IObfuscationEventEmitter } from '../interfaces/event-emitters/IObfuscationEventEmitter';
  18. import { IObfuscationResult } from '../interfaces/IObfuscationResult';
  19. import { IOptions } from '../interfaces/options/IOptions';
  20. import { ISourceCode } from '../interfaces/ISourceCode';
  21. import { ISourceMapCorrector } from '../interfaces/source-map/ISourceMapCorrector';
  22. import { ITransformersRunner } from '../interfaces/node-transformers/ITransformersRunner';
  23. import { JavaScriptObfuscator } from '../JavaScriptObfuscator';
  24. import { Logger } from '../logger/Logger';
  25. import { ObfuscationEventEmitter } from '../event-emitters/ObfuscationEventEmitter';
  26. import { ObfuscationResult } from '../ObfuscationResult';
  27. import { Options } from "../options/Options";
  28. import { SourceCode } from '../SourceCode';
  29. import { SourceMapCorrector } from '../source-map/SourceMapCorrector';
  30. import { TransformersRunner } from '../node-transformers/TransformersRunner';
  31. export class InversifyContainerFacade implements IInversifyContainerFacade {
  32. /**
  33. * @type {interfaces.Container}
  34. */
  35. private readonly container: interfaces.Container;
  36. constructor () {
  37. this.container = new Container();
  38. }
  39. /**
  40. * @param {interfaces.ServiceIdentifier<U>} serviceIdentifier
  41. * @returns {U}
  42. */
  43. public static getFactory <T extends string, U> (
  44. serviceIdentifier: interfaces.ServiceIdentifier<U>
  45. ): (context: interfaces.Context) => (bindingName: T) => U {
  46. return (context: interfaces.Context): (bindingName: T) => U => {
  47. return (bindingName: T) => {
  48. return context.container.getNamed<U>(serviceIdentifier, bindingName);
  49. };
  50. };
  51. }
  52. /**
  53. * @param {interfaces.ServiceIdentifier<U>} serviceIdentifier
  54. * @returns {U}
  55. */
  56. public static getCacheFactory <T extends string, U> (
  57. serviceIdentifier: interfaces.ServiceIdentifier<U>
  58. ): (context: interfaces.Context) => (bindingName: T) => U {
  59. return (context: interfaces.Context): (bindingName: T) => U => {
  60. const cache: Map <T, U> = new Map();
  61. return (bindingName: T) => {
  62. if (cache.has(bindingName)) {
  63. return <U>cache.get(bindingName);
  64. }
  65. const object: U = context.container.getNamed<U>(serviceIdentifier, bindingName);
  66. cache.set(bindingName, object);
  67. return object;
  68. };
  69. };
  70. }
  71. /**
  72. * @param {interfaces.ServiceIdentifier<interfaces.Newable<U>>} serviceIdentifier
  73. * @param {any[]} dependencies
  74. * @returns {U}
  75. */
  76. public static getConstructorFactory <T extends string, U> (
  77. serviceIdentifier: interfaces.ServiceIdentifier<interfaces.Newable<U>>,
  78. ...dependencies: any[]
  79. ): (context: interfaces.Context) => (bindingName: T) => U {
  80. return (context: interfaces.Context): (bindingName: T) => U => {
  81. const cache: Map<T, interfaces.Newable<U>> = new Map();
  82. const cachedDependencies: any[] = [];
  83. return (bindingName: T) => {
  84. dependencies.forEach((dependency: any, index: number) => {
  85. if (!cachedDependencies[index]) {
  86. cachedDependencies[index] = context.container.get<any>(dependency);
  87. }
  88. });
  89. if (cache.has(bindingName)) {
  90. return new (<interfaces.Newable<U>>cache.get(bindingName))(...cachedDependencies);
  91. }
  92. const constructor: interfaces.Newable<U> = context.container
  93. .getNamed<interfaces.Newable<U>>(
  94. serviceIdentifier,
  95. bindingName
  96. );
  97. cache.set(bindingName, constructor);
  98. return new constructor(...cachedDependencies);
  99. };
  100. };
  101. }
  102. /**
  103. * @param {interfaces.ServiceIdentifier<T>} serviceIdentifier
  104. * @returns {T}
  105. */
  106. public get <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>): T {
  107. return this.container.get<T>(serviceIdentifier);
  108. }
  109. /**
  110. * @param {interfaces.ServiceIdentifier<T>} serviceIdentifier
  111. * @param {string | number | symbol} named
  112. * @returns {T}
  113. */
  114. public getNamed <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>, named: string | number | symbol): T {
  115. return this.container.getNamed<T>(serviceIdentifier, named);
  116. }
  117. /**
  118. * @param {string} sourceCode
  119. * @param {TInputOptions} options
  120. */
  121. public load (sourceCode: string, options: TInputOptions): void {
  122. this.container
  123. .bind<ISourceCode>(ServiceIdentifiers.ISourceCode)
  124. .toDynamicValue(() => new SourceCode(sourceCode))
  125. .inSingletonScope();
  126. this.container
  127. .bind<IOptions>(ServiceIdentifiers.IOptions)
  128. .toDynamicValue(() => new Options(options))
  129. .inSingletonScope();
  130. this.container
  131. .bind<ILogger>(ServiceIdentifiers.ILogger)
  132. .to(Logger)
  133. .inSingletonScope();
  134. this.container
  135. .bind<IJavaScriptObfuscator>(ServiceIdentifiers.IJavaScriptObfuscator)
  136. .to(JavaScriptObfuscator)
  137. .inSingletonScope();
  138. this.container
  139. .bind<ITransformersRunner>(ServiceIdentifiers.ITransformersRunner)
  140. .to(TransformersRunner)
  141. .inSingletonScope();
  142. this.container
  143. .bind<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult)
  144. .to(ObfuscationResult)
  145. .inSingletonScope();
  146. this.container
  147. .bind<IObfuscationResult>(ServiceIdentifiers.Factory__IObfuscationResult)
  148. .toFactory<IObfuscationResult>((context: interfaces.Context) => {
  149. return (obfuscatedCode: string, sourceMap: string) => {
  150. const obfuscationResult: IObfuscationResult = context.container
  151. .get<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult);
  152. obfuscationResult.initialize(obfuscatedCode, sourceMap);
  153. return obfuscationResult;
  154. };
  155. });
  156. this.container
  157. .bind<ISourceMapCorrector>(ServiceIdentifiers.ISourceMapCorrector)
  158. .to(SourceMapCorrector)
  159. .inSingletonScope();
  160. this.container
  161. .bind<IObfuscationEventEmitter>(ServiceIdentifiers.IObfuscationEventEmitter)
  162. .to(ObfuscationEventEmitter)
  163. .inSingletonScope();
  164. // modules
  165. this.container.load(analyzersModule);
  166. this.container.load(controlFlowTransformersModule);
  167. this.container.load(convertingTransformersModule);
  168. this.container.load(customNodesModule);
  169. this.container.load(generatorsModule);
  170. this.container.load(nodeTransformersModule);
  171. this.container.load(obfuscatingTransformersModule);
  172. this.container.load(preparingTransformersModule);
  173. this.container.load(storagesModule);
  174. this.container.load(utilsModule);
  175. }
  176. public unload (): void {
  177. this.container.unbindAll();
  178. }
  179. }