import { isomorphicGlobal } from './check-environment'; export class DependencyInjector { private dup: any; private register: Def; constructor(private name: string) { const symbol = Symbol.for('@@DependencyInjector/' + name); if (!isomorphicGlobal[symbol]) { isomorphicGlobal[symbol] = {}; } this.register = isomorphicGlobal[symbol]; this.dup = {}; } get(name: Key, def?: Def[Key]): Def[Key] { if (!this.has(name)) { if (arguments.length === 2) { return def; } throw new Error(`not found dependency for: ${name}@${this.name}`); } return this.register[name]; } has(name: Key): boolean { return this.register.hasOwnProperty(name); } keys() { return Object.keys(this.register); } overwrite(name: Key, value: Def[Key]) { this.register[name] = value; this.dup[name] = (new Error('')).stack; } set(name: Key, value: Def[Key]) { if (this.register[name]) { console.error(`last set:\n%s`, limitStack(this.dup[name])); console.error(`this set:\n%s`, limitStack((new Error('')).stack)); throw new Error(`duplicate dependency: ${name}@${this.name}`); } this.register[name] = value; this.dup[name] = (new Error('')).stack; } values() { return Object.values(this.register); } } function limitStack(stack: string) { const arr = stack.split(/\n/); arr.shift(); // Error: xxx arr.shift(); // this file arr.length = 4; return arr.map(item => '\t' + item.trim()).join('\n'); } export default new DependencyInjector('default'); // DDN: default dependencies name export enum DDNames { sessionHandler = 'sessionHandler', cookieHandler = 'cookieHandler', cookieSignKey = 'cookieSignKey', multerStorage = 'multerStorage', multerCreator = 'multerCreator', multerDefaults = 'multerDefaults', defaultUserHandler = 'defaultUserHandler', defaultJsonHandler = 'defaultJsonHandler', defaultUrlencodeHandler = 'defaultUrlencodeHandler', isDebugMode = 'isDebugMode', serverRequestKey = 'serverRequestKey', proxyRequest = 'proxyRequest', mongodbSchemaHook = 'mongodbSchemaHook', redisLockServer = 'redisLockServer', webListenPort = 'webListenPort', } export interface DefaultDependency { cookieHandler: any; cookieSignKey: any; databaseConnection: any; defaultJsonHandler: any; defaultUrlencodeHandler: any; defaultUserHandler: any; isDebugMode: boolean; mongodbSchemaHook: any; multerCreator: any; multerDefaults: any; multerStorage: any; proxyRequest: any; redisLockServer: any; serverRequestKey: any; sessionHandler: any; webListenPort: number; }