{"version":3,"file":"ProjectGroupResolver.cjs","sources":["../../../../../packages/engine-http/src/projectGroup/ProjectGroupResolver.ts"],"sourcesContent":["import { CryptoWrapper } from '../utils/CryptoWrapper'\nimport { ProjectGroupContainer } from './ProjectGroupContainer'\nimport { IncomingMessage } from 'node:http'\nimport { ProjectGroupContainerResolver } from './ProjectGroupContainerResolver'\nimport { HttpErrorResponse } from '../common'\n\nexport class ProjectGroupResolver {\n\tprivate groupRegex\n\tprivate projectGroupConfigHeader\n\n\tconstructor(\n\t\tprivate projectGroupDomainMapping: string | undefined,\n\t\tprojectGroupConfigHeader: string | undefined,\n\t\tprivate projectGroupConfigCrypto: CryptoWrapper | undefined,\n\t\tprivate projectGroupContainerResolver: ProjectGroupContainerResolver,\n\t) {\n\t\tthis.projectGroupConfigHeader = projectGroupConfigHeader?.toLowerCase()\n\t\tthis.groupRegex = (\n\t\t\tthis.projectGroupDomainMapping\n\t\t\t\t? new RegExp(\n\t\t\t\t\tthis.projectGroupDomainMapping.includes('{group}')\n\t\t\t\t\t\t? regexpQuote(this.projectGroupDomainMapping).replace(regexpQuote('{group}'), '([^.]+)')\n\t\t\t\t\t\t: this.projectGroupDomainMapping,\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t)\n\t}\n\n\tasync resolveContainer({ request }: { request: IncomingMessage }): Promise<ProjectGroupContainer> {\n\t\tlet group: string | undefined = undefined\n\t\tlet config = {}\n\t\tif (this.groupRegex) {\n\t\t\tconst host = request.headers.host\n\t\t\tconst match = host?.match(this.groupRegex)\n\t\t\tif (!match) {\n\t\t\t\tthrow new HttpErrorResponse(404, 'Project group not found')\n\t\t\t}\n\t\t\tgroup = match[1]\n\t\t\tif (this.projectGroupConfigHeader) {\n\t\t\t\tconst configHeader = request.headers[this.projectGroupConfigHeader.toLowerCase()]\n\t\t\t\tif (typeof configHeader !== 'string' || configHeader === '') {\n\t\t\t\t\tthrow new HttpErrorResponse(400, `${this.projectGroupConfigHeader} header is missing`)\n\t\t\t\t}\n\t\t\t\tconst configValue = Buffer.from(configHeader, 'base64')\n\t\t\t\tconst decryptedValue = this.projectGroupConfigCrypto\n\t\t\t\t\t? (await this.projectGroupConfigCrypto?.decrypt(configValue, CryptoWrapper.cryptoVersion)).value\n\t\t\t\t\t: configValue\n\t\t\t\ttry {\n\t\t\t\t\tconfig = JSON.parse(decryptedValue.toString())\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\tthrow new HttpErrorResponse(400, `Cannot parse config: ${e.message}`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn await this.projectGroupContainerResolver.getProjectGroupContainer(group, config)\n\t}\n}\n\nconst regexpQuote = (regexp: string) => regexp.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n"],"names":["HttpErrorResponse","CryptoWrapper"],"mappings":";;;;;;;AAMO,MAAM,qBAAqB;AAAA,EAIjC,YACS,2BACR,0BACQ,0BACA,+BACP;AAJO,SAAA,4BAAA;AAEA,SAAA,2BAAA;AACA,SAAA,gCAAA;AAPD,kBAAA,MAAA,YAAA;AACA,kBAAA,MAAA,0BAAA;AAQF,SAAA,2BAA2B,0BAA0B,YAAY;AACjE,SAAA,aACJ,KAAK,4BACF,IAAI;AAAA,MACL,KAAK,0BAA0B,SAAS,SAAS,IAC9C,YAAY,KAAK,yBAAyB,EAAE,QAAQ,YAAY,SAAS,GAAG,SAAS,IACrF,KAAK;AAAA,IAEP,IAAA;AAAA,EAAA;AAAA,EAIL,MAAM,iBAAiB,EAAE,WAAyE;AACjG,QAAI,QAA4B;AAChC,QAAI,SAAS,CAAC;AACd,QAAI,KAAK,YAAY;AACd,YAAA,OAAO,QAAQ,QAAQ;AAC7B,YAAM,QAAQ,MAAM,MAAM,KAAK,UAAU;AACzC,UAAI,CAAC,OAAO;AACL,cAAA,IAAIA,aAAAA,kBAAkB,KAAK,yBAAyB;AAAA,MAAA;AAE3D,cAAQ,MAAM,CAAC;AACf,UAAI,KAAK,0BAA0B;AAClC,cAAM,eAAe,QAAQ,QAAQ,KAAK,yBAAyB,aAAa;AAChF,YAAI,OAAO,iBAAiB,YAAY,iBAAiB,IAAI;AAC5D,gBAAM,IAAIA,aAAkB,kBAAA,KAAK,GAAG,KAAK,wBAAwB,oBAAoB;AAAA,QAAA;AAEtF,cAAM,cAAc,OAAO,KAAK,cAAc,QAAQ;AAChD,cAAA,iBAAiB,KAAK,4BACxB,MAAM,KAAK,0BAA0B,QAAQ,aAAaC,cAAA,cAAc,aAAa,GAAG,QACzF;AACC,YAAA;AACH,mBAAS,KAAK,MAAM,eAAe,SAAA,CAAU;AAAA,iBACrC,GAAQ;AAChB,gBAAM,IAAID,aAAkB,kBAAA,KAAK,wBAAwB,EAAE,OAAO,EAAE;AAAA,QAAA;AAAA,MACrE;AAAA,IACD;AAED,WAAO,MAAM,KAAK,8BAA8B,yBAAyB,OAAO,MAAM;AAAA,EAAA;AAExF;AAEA,MAAM,cAAc,CAAC,WAAmB,OAAO,QAAQ,uBAAuB,MAAM;;"}