{"version":3,"sources":["../../src/middleware.ts"],"sourcesContent":["import {\n  ClientIdentityStorageHeader,\n  UnsetClientIdentity,\n} from \"@mocky-balboa/shared-config\";\nimport { logger } from \"./logger.js\";\nimport { clientIdentityStorage } from \"./trace.js\";\n\n/**\n * Request like object\n */\nexport interface Request {\n  headers:\n    | Record<string, string | string[]>\n    | NodeJS.Dict<string | string[]>\n    | Headers;\n}\n\n/**\n * Middleware next function\n */\nexport type NextFunction = () => void | Promise<void>;\n\n/**\n * Context used by some frameworks such as Koa\n */\nexport type Context =\n  | {\n      req: Request;\n    }\n  | {\n      request: Request;\n    };\n\n/**\n * Server compatible middleware for Mocky Balboa compatible with major server frameworks including:\n * - Express\n * - Koa\n * - Fastify\n */\nconst mockyBalboaMiddleware = () => {\n  logger.info(\"Initializing server middleware\");\n  function middleware(\n    req: Request,\n    _res: any,\n    next: NextFunction,\n  ): void | Promise<void>;\n  function middleware(ctx: Context, next: NextFunction): void | Promise<void>;\n  function middleware(\n    requestOrContext: Request | Context,\n    resOrNext: any,\n    next?: NextFunction,\n  ) {\n    if (typeof requestOrContext !== \"object\") {\n      throw new Error(\"Invalid request or context\");\n    }\n\n    let req: Request;\n    if (\"req\" in requestOrContext) {\n      req = requestOrContext.req;\n    } else if (\"request\" in requestOrContext) {\n      req = requestOrContext.request;\n    } else {\n      req = requestOrContext;\n    }\n\n    let clientIdentity =\n      req.headers instanceof Headers\n        ? req.headers.get(ClientIdentityStorageHeader)\n        : req.headers[ClientIdentityStorageHeader];\n\n    if (typeof clientIdentity !== \"string\") {\n      clientIdentity = UnsetClientIdentity;\n    }\n\n    // Ensure client identity is stored in the context before calling the original handler\n    return clientIdentityStorage.run(clientIdentity, () => {\n      return typeof resOrNext === \"function\" ? resOrNext() : next?.();\n    });\n  }\n\n  return middleware;\n};\n\nexport default mockyBalboaMiddleware;\n"],"names":["mockyBalboaMiddleware","logger","info","middleware","requestOrContext","resOrNext","next","Error","req","request","clientIdentity","headers","Headers","get","ClientIdentityStorageHeader","UnsetClientIdentity","clientIdentityStorage","run"],"mappings":";;;;+BAmFA;;;eAAA;;;8BAhFO;wBACgB;uBACe;AA4BtC;;;;;CAKC,GACD,MAAMA,wBAAwB;IAC5BC,cAAM,CAACC,IAAI,CAAC;IAOZ,SAASC,WACPC,gBAAmC,EACnCC,SAAc,EACdC,IAAmB;QAEnB,IAAI,OAAOF,qBAAqB,UAAU;YACxC,MAAM,IAAIG,MAAM;QAClB;QAEA,IAAIC;QACJ,IAAI,SAASJ,kBAAkB;YAC7BI,MAAMJ,iBAAiBI,GAAG;QAC5B,OAAO,IAAI,aAAaJ,kBAAkB;YACxCI,MAAMJ,iBAAiBK,OAAO;QAChC,OAAO;YACLD,MAAMJ;QACR;QAEA,IAAIM,iBACFF,IAAIG,OAAO,YAAYC,UACnBJ,IAAIG,OAAO,CAACE,GAAG,CAACC,yCAA2B,IAC3CN,IAAIG,OAAO,CAACG,yCAA2B,CAAC;QAE9C,IAAI,OAAOJ,mBAAmB,UAAU;YACtCA,iBAAiBK,iCAAmB;QACtC;QAEA,sFAAsF;QACtF,OAAOC,4BAAqB,CAACC,GAAG,CAACP,gBAAgB;YAC/C,OAAO,OAAOL,cAAc,aAAaA,cAAcC;QACzD;IACF;IAEA,OAAOH;AACT;MAEA,WAAeH"}