{"version":3,"file":"utils-DtX1zZA7.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { isTruthy } from '@clerk/shared/underscore';\nimport type { Request as ExpressRequest } from 'express';\nimport { Readable } from 'stream';\n\nimport type { ExpressRequestWithAuth } from './types';\n\n/**\n * Brand attached to the `req.auth` handler installed by Clerk middleware.\n * `req.auth` is a property name shared with other auth libraries (express-jwt,\n * passport, express-openid-connect), so its mere presence proves nothing about\n * whether Clerk authenticated the request. `Symbol.for` registers the brand\n * globally so it stays stable across multiple copies of this package loaded in\n * the same process.\n */\nconst clerkAuthBrand = Symbol.for('@clerk/express.auth');\n\nexport const brandRequestAuth = <T extends (...args: never[]) => unknown>(authHandler: T): T =>\n  Object.assign(authHandler, { [clerkAuthBrand]: true });\n\nexport const requestHasAuthObject = (req: ExpressRequest): req is ExpressRequestWithAuth => {\n  const auth = (req as Partial<ExpressRequestWithAuth>).auth;\n  return typeof auth === 'function' && (auth as unknown as Record<symbol, unknown>)[clerkAuthBrand] === true;\n};\n\nexport const loadClientEnv = () => {\n  return {\n    publishableKey: process.env.CLERK_PUBLISHABLE_KEY || '',\n    __internal_clerkJSUrl: process.env.CLERK_JS || process.env.CLERK_JS_URL || '',\n    __internal_clerkJSVersion: process.env.CLERK_JS_VERSION || '',\n    __internal_clerkUIUrl: process.env.CLERK_UI_URL || '',\n    __internal_clerkUIVersion: process.env.CLERK_UI_VERSION || '',\n    prefetchUI: process.env.CLERK_PREFETCH_UI === 'false' ? false : undefined,\n  };\n};\n\nexport const loadApiEnv = () => {\n  return {\n    secretKey: process.env.CLERK_SECRET_KEY || '',\n    machineSecretKey: process.env.CLERK_MACHINE_SECRET_KEY || '',\n    apiUrl: process.env.CLERK_API_URL || 'https://api.clerk.com',\n    apiVersion: process.env.CLERK_API_VERSION || 'v1',\n    domain: process.env.CLERK_DOMAIN || '',\n    proxyUrl: process.env.CLERK_PROXY_URL || '',\n    signInUrl: process.env.CLERK_SIGN_IN_URL || '',\n    isSatellite: isTruthy(process.env.CLERK_IS_SATELLITE),\n    jwtKey: process.env.CLERK_JWT_KEY || '',\n    sdkMetadata: {\n      name: PACKAGE_NAME,\n      version: PACKAGE_VERSION,\n      environment: process.env.NODE_ENV,\n    },\n    telemetry: {\n      disabled: isTruthy(process.env.CLERK_TELEMETRY_DISABLED),\n      debug: isTruthy(process.env.CLERK_TELEMETRY_DEBUG),\n    },\n  };\n};\n\nexport const incomingMessageToRequest = (req: ExpressRequest): Request => {\n  const headers = Object.keys(req.headers).reduce((acc, key) => Object.assign(acc, { [key]: req?.headers[key] }), {});\n  // @ts-ignore Optimistic attempt to get the protocol in case\n  // req extends IncomingMessage in a useful way. No guarantee\n  // it'll work.\n  const protocol = req.connection?.encrypted ? 'https' : 'http';\n  const dummyOriginReqUrl = new URL(req.originalUrl || req.url || '', `${protocol}://clerk-dummy`);\n  return new Request(dummyOriginReqUrl, {\n    method: req.method,\n    headers: new Headers(headers),\n  });\n};\n\n/**\n * Converts an Express request to a Fetch API Request with body streaming support.\n * This is used for proxying requests where the body needs to be forwarded.\n */\nexport const requestToProxyRequest = (req: ExpressRequest): Request => {\n  const headers = new Headers();\n  Object.entries(req.headers).forEach(([key, value]) => {\n    if (value) {\n      headers.set(key, Array.isArray(value) ? value.join(', ') : value);\n    }\n  });\n\n  const protocol = req.protocol || (req.secure ? 'https' : 'http');\n  const host = req.get('host') || 'localhost';\n  const url = new URL(req.originalUrl || req.url, `${protocol}://${host}`);\n\n  const hasBody = ['POST', 'PUT', 'PATCH'].includes(req.method);\n\n  return new Request(url.toString(), {\n    method: req.method,\n    headers,\n    body: hasBody ? (Readable.toWeb(req) as ReadableStream) : undefined,\n    // @ts-expect-error - duplex required for streaming bodies but not in all TS definitions\n    duplex: hasBody ? 'half' : undefined,\n  });\n};\n"],"mappings":";;;;;;;;;;;;AAcA,MAAM,iBAAiB,OAAO,IAAI,qBAAqB;AAEvD,MAAa,oBAA6D,gBACxE,OAAO,OAAO,aAAa,GAAG,iBAAiB,KAAK,CAAC;AAEvD,MAAa,wBAAwB,QAAuD;CAC1F,MAAM,OAAQ,IAAwC;CACtD,OAAO,OAAO,SAAS,cAAe,KAA4C,oBAAoB;AACxG;AAEA,MAAa,sBAAsB;CACjC,OAAO;EACL,gBAAgB,QAAQ,IAAI,yBAAyB;EACrD,uBAAuB,QAAQ,IAAI,YAAY,QAAQ,IAAI,gBAAgB;EAC3E,2BAA2B,QAAQ,IAAI,oBAAoB;EAC3D,uBAAuB,QAAQ,IAAI,gBAAgB;EACnD,2BAA2B,QAAQ,IAAI,oBAAoB;EAC3D,YAAY,QAAQ,IAAI,sBAAsB,UAAU,QAAQ;CAClE;AACF;AAEA,MAAa,mBAAmB;CAC9B,OAAO;EACL,WAAW,QAAQ,IAAI,oBAAoB;EAC3C,kBAAkB,QAAQ,IAAI,4BAA4B;EAC1D,QAAQ,QAAQ,IAAI,iBAAiB;EACrC,YAAY,QAAQ,IAAI,qBAAqB;EAC7C,QAAQ,QAAQ,IAAI,gBAAgB;EACpC,UAAU,QAAQ,IAAI,mBAAmB;EACzC,WAAW,QAAQ,IAAI,qBAAqB;EAC5C,aAAa,SAAS,QAAQ,IAAI,kBAAkB;EACpD,QAAQ,QAAQ,IAAI,iBAAiB;EACrC,aAAa;GACX;GACA;GACA,aAAa,QAAQ,IAAI;EAC3B;EACA,WAAW;GACT,UAAU,SAAS,QAAQ,IAAI,wBAAwB;GACvD,OAAO,SAAS,QAAQ,IAAI,qBAAqB;EACnD;CACF;AACF;AAEA,MAAa,4BAA4B,QAAiC;CACxE,MAAM,UAAU,OAAO,KAAK,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,OAAO,OAAO,KAAK,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC;CAIlH,MAAM,WAAW,IAAI,YAAY,YAAY,UAAU;CACvD,MAAM,oBAAoB,IAAI,IAAI,IAAI,eAAe,IAAI,OAAO,IAAI,GAAG,SAAS,eAAe;CAC/F,OAAO,IAAI,QAAQ,mBAAmB;EACpC,QAAQ,IAAI;EACZ,SAAS,IAAI,QAAQ,OAAO;CAC9B,CAAC;AACH;;;;;AAMA,MAAa,yBAAyB,QAAiC;CACrE,MAAM,UAAU,IAAI,QAAQ;CAC5B,OAAO,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,WAAW;EACpD,IAAI,OACF,QAAQ,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK;CAEpE,CAAC;CAED,MAAM,WAAW,IAAI,aAAa,IAAI,SAAS,UAAU;CACzD,MAAM,OAAO,IAAI,IAAI,MAAM,KAAK;CAChC,MAAM,MAAM,IAAI,IAAI,IAAI,eAAe,IAAI,KAAK,GAAG,SAAS,KAAK,MAAM;CAEvE,MAAM,UAAU;EAAC;EAAQ;EAAO;CAAO,CAAC,CAAC,SAAS,IAAI,MAAM;CAE5D,OAAO,IAAI,QAAQ,IAAI,SAAS,GAAG;EACjC,QAAQ,IAAI;EACZ;EACA,MAAM,UAAW,SAAS,MAAM,GAAG,IAAuB;EAE1D,QAAQ,UAAU,SAAS;CAC7B,CAAC;AACH"}