@clerk/express
Version:
Clerk server SDK for usage with Express
1 lines • 5.93 kB
Source Map (JSON)
{"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"}