{"version":3,"file":"ProjectGroupContainerResolver.cjs","sources":["../../../../../packages/engine-http/src/projectGroup/ProjectGroupContainerResolver.ts"],"sourcesContent":["import { PromiseMap, EventEmitter, EventManager } from '@contember/engine-common'\nimport { isDeepStrictEqual } from 'node:util'\nimport { ProjectGroupContainer, ProjectGroupContainerFactory } from './ProjectGroupContainer'\nimport { TenantConfigResolver } from '../config/tenantConfigResolver'\n\ninterface ContainerWithMeta {\n\tcontainer: ProjectGroupContainer\n\tcleanups: (() => void)[]\n\tinputConfig: any\n}\nexport type ProjectGroupContainerResolverEvents = {\n\tcreate: (args: ({ container: ProjectGroupContainer; slug: string | undefined})) => void | (() => void)\n}\n\n\nexport class ProjectGroupContainerResolver implements EventEmitter<ProjectGroupContainerResolverEvents> {\n\tprivate containers = new PromiseMap<string | undefined, ContainerWithMeta>()\n\tprivate eventManager = new EventManager< ProjectGroupContainerResolverEvents>()\n\n\tpublic readonly on = this.eventManager.on.bind(this.eventManager)\n\n\tconstructor(\n\t\tprivate readonly configResolver: TenantConfigResolver,\n\t\tprivate readonly containerFactory: ProjectGroupContainerFactory,\n\t) {}\n\n\tpublic async getProjectGroupContainer(slug: string | undefined, config: any = {}): Promise<ProjectGroupContainer> {\n\t\tconst existing = this.containers.get(slug)\n\t\tif (existing) {\n\t\t\tconst existingAwaited = await existing\n\t\t\tif (isDeepStrictEqual(config, existingAwaited.inputConfig)) {\n\t\t\t\treturn existingAwaited.container\n\t\t\t}\n\t\t\texistingAwaited.cleanups.forEach(it => it())\n\t\t\tthis.containers.delete(slug)\n\t\t}\n\t\treturn (await this.containers.fetch(slug, async slug => {\n\t\t\tconst container = this.containerFactory.create({\n\t\t\t\tconfig: this.configResolver(slug, config),\n\t\t\t\tslug,\n\t\t\t})\n\t\t\tconst cleanups = this.eventManager.fire('create', { container, slug }).map(it => it ?? (() => null))\n\n\t\t\tcontainer.projectContainerResolver.on('create', ({ container: projectContainer }) => {\n\t\t\t\tcleanups.push(() => container.projectContainerResolver.destroyContainer(projectContainer.project.slug))\n\t\t\t})\n\n\t\t\tawait container.tenantContainer.migrationsRunner.run(container.logger.child())\n\t\t\treturn { container, inputConfig: config, cleanups }\n\t\t})).container\n\t}\n}\n"],"names":["PromiseMap","EventManager","isDeepStrictEqual","slug"],"mappings":";;;;;;;AAeO,MAAM,8BAA2F;AAAA,EAMvG,YACkB,gBACA,kBAChB;AAFgB,SAAA,iBAAA;AACA,SAAA,mBAAA;AAPV,kBAAA,MAAA,cAAa,IAAIA,aAAkD,WAAA,CAAA;AACnE,kBAAA,MAAA,gBAAe,IAAIC,aAAmD,aAAA,CAAA;AAE9E,kBAAA,MAAgB,MAAK,KAAK,aAAa,GAAG,KAAK,KAAK,YAAY,CAAA;AAAA,EAAA;AAAA,EAOhE,MAAa,yBAAyB,MAA0B,SAAc,IAAoC;AACjH,UAAM,WAAW,KAAK,WAAW,IAAI,IAAI;AACzC,QAAI,UAAU;AACb,YAAM,kBAAkB,MAAM;AAC9B,UAAIC,4BAAkB,QAAQ,gBAAgB,WAAW,GAAG;AAC3D,eAAO,gBAAgB;AAAA,MAAA;AAExB,sBAAgB,SAAS,QAAQ,CAAM,OAAA,GAAA,CAAI;AACtC,WAAA,WAAW,OAAO,IAAI;AAAA,IAAA;AAE5B,YAAQ,MAAM,KAAK,WAAW,MAAM,MAAM,OAAMC,UAAQ;AACjD,YAAA,YAAY,KAAK,iBAAiB,OAAO;AAAA,QAC9C,QAAQ,KAAK,eAAeA,OAAM,MAAM;AAAA,QACxC,MAAAA;AAAAA,MAAA,CACA;AACD,YAAM,WAAW,KAAK,aAAa,KAAK,UAAU,EAAE,WAAW,MAAAA,MAAM,CAAA,EAAE,IAAI,CAAM,OAAA,OAAO,MAAM,KAAK;AAEnG,gBAAU,yBAAyB,GAAG,UAAU,CAAC,EAAE,WAAW,uBAAuB;AAC3E,iBAAA,KAAK,MAAM,UAAU,yBAAyB,iBAAiB,iBAAiB,QAAQ,IAAI,CAAC;AAAA,MAAA,CACtG;AAED,YAAM,UAAU,gBAAgB,iBAAiB,IAAI,UAAU,OAAO,OAAO;AAC7E,aAAO,EAAE,WAAW,aAAa,QAAQ,SAAS;AAAA,IAClD,CAAA,GAAG;AAAA,EAAA;AAEN;;"}