import * as cdk from '@aws-cdk/core'; import { createContainer, AwilixContainer, asValue, asFunction } from 'awilix'; // @ts-ignore import { partial, pick } from 'ramda'; // @ts-ignore import * as Discovery from '@peak-ai/ais-service-discovery'; import toLambda, {Usecase} from "./transpositions/to-lambda"; type Lambda = (args: {}, tenant: string, email: string) => {}; enum ServiceTypes { QUEUE = 'queue', FUNCTION = 'function', TABLE = 'table', EVENT = 'event', REGISTRY = 'registry', } export class Container { private container: AwilixContainer; constructor(parentContainer: AwilixContainer) { this.container = parentContainer; } registerValue(key: string, value: string | number | boolean | {}) { this.container.register(key, asValue(value)); } registerService(name: string, type: ServiceTypes, addr: string) { this.container.register(name, asValue(partial(Discovery[type], [addr]))); } registerUsecase(name: string, usecase: Usecase) { this.container.register(name, asFunction(usecase)); } resolve(name: string) { return this.container.resolve(name); } resolveAsLambda(name: string, fields: string[], parameters: string[]) { const usecase = this.resolve(name) as Usecase; return toLambda(usecase, fields, parameters); } } export default new Container(createContainer());