{"version":3,"file":"to-auth-endpoints.mjs","names":[],"sources":["../../src/api/to-auth-endpoints.ts"],"sourcesContent":["import type { AuthContext, HookEndpointContext } from \"@better-auth/core\";\nimport type { AuthMiddleware } from \"@better-auth/core/api\";\nimport {\n\thasRequestState,\n\trunWithEndpointContext,\n\trunWithRequestState,\n} from \"@better-auth/core/context\";\nimport { shouldPublishLog } from \"@better-auth/core/env\";\nimport { APIError } from \"@better-auth/core/error\";\nimport {\n\tATTR_CONTEXT,\n\tATTR_HOOK_TYPE,\n\tATTR_HTTP_ROUTE,\n\tATTR_OPERATION_ID,\n\twithSpan,\n} from \"@better-auth/core/instrumentation\";\nimport type {\n\tEndpoint,\n\tEndpointContext,\n\tEndpointOptions,\n\tInputContext,\n} from \"better-call\";\nimport { kAPIErrorHeaderSymbol, toResponse } from \"better-call\";\nimport { createDefu } from \"defu\";\nimport { isAPIError } from \"../utils/is-api-error\";\n\ntype InternalContext = Partial<\n\tInputContext<string, any> &\n\t\tEndpointContext<\n\t\t\tstring,\n\t\t\tany,\n\t\t\tAuthContext & {\n\t\t\t\treturned?: unknown | undefined;\n\t\t\t\tresponseHeaders?: Headers | undefined;\n\t\t\t}\n\t\t>\n> & {\n\tpath: string;\n\tasResponse?: boolean | undefined;\n\tcontext: AuthContext & {\n\t\tlogger: AuthContext[\"logger\"];\n\t\treturned?: unknown | undefined;\n\t\tresponseHeaders?: Headers | undefined;\n\t};\n};\n\nconst defuReplaceArrays = createDefu((obj, key, value) => {\n\tif (Array.isArray(obj[key]) && Array.isArray(value)) {\n\t\tobj[key] = value;\n\t\treturn true;\n\t}\n});\n\ntype Hook = {\n\tmatcher: (context: HookEndpointContext) => boolean;\n\thandler: AuthMiddleware;\n};\n\nconst hooksSourceWeakMap = new WeakMap<\n\tAuthMiddleware,\n\t`user` | `plugin:${string}`\n>();\n\nfunction getOperationId(endpoint: Endpoint | undefined, key: string): string {\n\tif (!endpoint?.options) return key;\n\tconst opts = endpoint.options as {\n\t\toperationId?: string;\n\t\tmetadata?: { openapi?: { operationId?: string } };\n\t};\n\treturn opts.operationId ?? opts.metadata?.openapi?.operationId ?? key;\n}\n\ntype UserInputContext = Partial<\n\tInputContext<string, any> & EndpointContext<string, any, any>\n>;\n\nexport function toAuthEndpoints<const E extends Record<string, Endpoint>>(\n\tendpoints: E,\n\tctx: AuthContext | Promise<AuthContext>,\n): E {\n\tconst api: Record<\n\t\tstring,\n\t\t((\n\t\t\tcontext: EndpointContext<string, any, any> & InputContext<string, any>,\n\t\t) => Promise<any>) & {\n\t\t\tpath?: string | undefined;\n\t\t\toptions?: EndpointOptions | undefined;\n\t\t}\n\t> = {};\n\n\tfor (const [key, endpoint] of Object.entries(endpoints)) {\n\t\tapi[key] = async (context?: UserInputContext) => {\n\t\t\tconst operationId = getOperationId(endpoint, key);\n\t\t\tconst endpointMethod = endpoint?.options?.method;\n\t\t\tconst defaultMethod = Array.isArray(endpointMethod)\n\t\t\t\t? endpointMethod[0]\n\t\t\t\t: endpointMethod;\n\n\t\t\tconst run = async () => {\n\t\t\t\tconst authContext = await ctx;\n\t\t\t\tconst methodName =\n\t\t\t\t\tcontext?.method ?? context?.request?.method ?? defaultMethod ?? \"?\";\n\t\t\t\tconst pathName = context?.path ?? endpoint.path ?? \"/:virtual\";\n\n\t\t\t\tlet internalContext: InternalContext = {\n\t\t\t\t\t...context,\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\t...authContext,\n\t\t\t\t\t\treturned: undefined,\n\t\t\t\t\t\tresponseHeaders: undefined,\n\t\t\t\t\t\tsession: null,\n\t\t\t\t\t},\n\t\t\t\t\tpath: endpoint.path,\n\t\t\t\t\theaders: context?.headers ? new Headers(context?.headers) : undefined,\n\t\t\t\t};\n\t\t\t\treturn withSpan(\n\t\t\t\t\t`${methodName} ${pathName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HTTP_ROUTE]: pathName,\n\t\t\t\t\t\t[ATTR_OPERATION_ID]: operationId,\n\t\t\t\t\t},\n\t\t\t\t\tasync () =>\n\t\t\t\t\t\trunWithEndpointContext(internalContext, async () => {\n\t\t\t\t\t\t\tconst { beforeHooks, afterHooks } = getHooks(authContext);\n\t\t\t\t\t\t\tconst before = await runBeforeHooks(\n\t\t\t\t\t\t\t\tinternalContext,\n\t\t\t\t\t\t\t\tbeforeHooks,\n\t\t\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * If `before.context` is returned, it should\n\t\t\t\t\t\t\t * get merged with the original context\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\"context\" in before &&\n\t\t\t\t\t\t\t\tbefore.context &&\n\t\t\t\t\t\t\t\ttypeof before.context === \"object\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconst { headers, ...rest } = before.context as {\n\t\t\t\t\t\t\t\t\theaders: Headers;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Headers should be merged differently\n\t\t\t\t\t\t\t\t * so the hook doesn't override the whole\n\t\t\t\t\t\t\t\t * header\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tif (headers) {\n\t\t\t\t\t\t\t\t\theaders.forEach((value, key) => {\n\t\t\t\t\t\t\t\t\t\t(internalContext.headers as Headers).set(key, value);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tinternalContext = defuReplaceArrays(rest, internalContext);\n\t\t\t\t\t\t\t} else if (before) {\n\t\t\t\t\t\t\t\t/* Return before hook response if it's anything other than a context return */\n\t\t\t\t\t\t\t\treturn context?.asResponse\n\t\t\t\t\t\t\t\t\t? toResponse(before, {\n\t\t\t\t\t\t\t\t\t\t\theaders: context?.headers,\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t: context?.returnHeaders\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\theaders: context?.headers,\n\t\t\t\t\t\t\t\t\t\t\t\tresponse: before,\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: before;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tinternalContext.asResponse = false;\n\t\t\t\t\t\t\tinternalContext.returnHeaders = true;\n\t\t\t\t\t\t\tinternalContext.returnStatus = true;\n\t\t\t\t\t\t\tconst result = (await runWithEndpointContext(\n\t\t\t\t\t\t\t\tinternalContext,\n\t\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t\twithSpan(\n\t\t\t\t\t\t\t\t\t\t`handler ${pathName}`,\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t[ATTR_HTTP_ROUTE]: pathName,\n\t\t\t\t\t\t\t\t\t\t\t[ATTR_OPERATION_ID]: operationId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t() => (endpoint as any)(internalContext as any),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t).catch((e: any) => {\n\t\t\t\t\t\t\t\tif (isAPIError(e)) {\n\t\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t\t * API Errors from response are caught\n\t\t\t\t\t\t\t\t\t * and returned to hooks\n\t\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tresponse: e,\n\t\t\t\t\t\t\t\t\t\tstatus: e.statusCode,\n\t\t\t\t\t\t\t\t\t\theaders: e.headers ? new Headers(e.headers) : null,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t\t})) as {\n\t\t\t\t\t\t\t\theaders: Headers;\n\t\t\t\t\t\t\t\tresponse: any;\n\t\t\t\t\t\t\t\tstatus: number;\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t//if response object is returned we skip after hooks and post processing\n\t\t\t\t\t\t\tif (result && result instanceof Response) {\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tinternalContext.context.returned = result.response;\n\t\t\t\t\t\t\tinternalContext.context.responseHeaders = result.headers;\n\n\t\t\t\t\t\t\tconst after = await runAfterHooks(\n\t\t\t\t\t\t\t\tinternalContext,\n\t\t\t\t\t\t\t\tafterHooks,\n\t\t\t\t\t\t\t\tendpoint,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (after.response) {\n\t\t\t\t\t\t\t\tresult.response = after.response;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tisAPIError(result.response) &&\n\t\t\t\t\t\t\t\tshouldPublishLog(authContext.logger.level, \"debug\")\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// inherit stack from errorStack if debug mode is enabled\n\t\t\t\t\t\t\t\tresult.response.stack = result.response.errorStack;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (isAPIError(result.response) && !context?.asResponse) {\n\t\t\t\t\t\t\t\tthrow result.response;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst response = context?.asResponse\n\t\t\t\t\t\t\t\t? toResponse(result.response, {\n\t\t\t\t\t\t\t\t\t\theaders: result.headers,\n\t\t\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: context?.returnHeaders\n\t\t\t\t\t\t\t\t\t? context?.returnStatus\n\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\theaders: result.headers,\n\t\t\t\t\t\t\t\t\t\t\t\tresponse: result.response,\n\t\t\t\t\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t\theaders: result.headers,\n\t\t\t\t\t\t\t\t\t\t\t\tresponse: result.response,\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: context?.returnStatus\n\t\t\t\t\t\t\t\t\t\t? { response: result.response, status: result.status }\n\t\t\t\t\t\t\t\t\t\t: result.response;\n\t\t\t\t\t\t\treturn response;\n\t\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t};\n\t\t\tif (await hasRequestState()) {\n\t\t\t\treturn run();\n\t\t\t} else {\n\t\t\t\tconst store = new WeakMap();\n\t\t\t\treturn runWithRequestState(store, run);\n\t\t\t}\n\t\t};\n\t\tapi[key].path = endpoint.path;\n\t\tapi[key].options = endpoint.options;\n\t}\n\treturn api as unknown as E;\n}\n\nasync function runBeforeHooks(\n\tcontext: InternalContext,\n\thooks: Hook[],\n\tendpoint: Endpoint,\n\toperationId: string,\n) {\n\tlet modifiedContext: Partial<InternalContext> = {};\n\n\tfor (const hook of hooks) {\n\t\tlet matched = false;\n\t\ttry {\n\t\t\tmatched = hook.matcher(context);\n\t\t} catch (error) {\n\t\t\t// manually handle unexpected errors during hook matcher execution to prevent accidental exposure of internal details\n\t\t\t// Also provides debug information about which plugin the hook failed and error info\n\t\t\tconst hookSource = hooksSourceWeakMap.get(hook.handler) ?? \"unknown\";\n\t\t\tcontext.context.logger.error(\n\t\t\t\t`An error occurred during ${hookSource} hook matcher execution:`,\n\t\t\t\terror,\n\t\t\t);\n\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\tmessage: `An error occurred during hook matcher execution. Check the logs for more details.`,\n\t\t\t});\n\t\t}\n\t\tif (matched) {\n\t\t\tconst hookSource = hooksSourceWeakMap.get(hook.handler) ?? \"unknown\";\n\t\t\tconst path = context.path ?? endpoint?.path ?? \"/:virtual\";\n\t\t\tconst result = await withSpan(\n\t\t\t\t`hook before ${path} ${hookSource}`,\n\t\t\t\t{\n\t\t\t\t\t[ATTR_HOOK_TYPE]: \"before\",\n\t\t\t\t\t[ATTR_HTTP_ROUTE]: path,\n\t\t\t\t\t[ATTR_CONTEXT]: hookSource,\n\t\t\t\t\t[ATTR_OPERATION_ID]: operationId,\n\t\t\t\t},\n\t\t\t\t() =>\n\t\t\t\t\thook.handler({\n\t\t\t\t\t\t...context,\n\t\t\t\t\t\treturnHeaders: false,\n\t\t\t\t\t}),\n\t\t\t).catch((e: unknown) => {\n\t\t\t\tif (\n\t\t\t\t\tisAPIError(e) &&\n\t\t\t\t\tshouldPublishLog(context.context.logger.level, \"debug\")\n\t\t\t\t) {\n\t\t\t\t\t// inherit stack from errorStack if debug mode is enabled\n\t\t\t\t\te.stack = e.errorStack;\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t});\n\t\t\tif (result && typeof result === \"object\") {\n\t\t\t\tif (\"context\" in result && typeof result.context === \"object\") {\n\t\t\t\t\tconst { headers, ...rest } =\n\t\t\t\t\t\tresult.context as Partial<InternalContext>;\n\t\t\t\t\tif (headers instanceof Headers) {\n\t\t\t\t\t\tif (modifiedContext.headers) {\n\t\t\t\t\t\t\theaders.forEach((value, key) => {\n\t\t\t\t\t\t\t\tmodifiedContext.headers?.set(key, value);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmodifiedContext.headers = headers;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tmodifiedContext = defuReplaceArrays(rest, modifiedContext);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\treturn { context: modifiedContext };\n}\n\nasync function runAfterHooks(\n\tcontext: InternalContext,\n\thooks: Hook[],\n\tendpoint: Endpoint,\n\toperationId: string,\n) {\n\tfor (const hook of hooks) {\n\t\tif (hook.matcher(context)) {\n\t\t\tconst hookSource = hooksSourceWeakMap.get(hook.handler) ?? \"unknown\";\n\t\t\tconst path = context.path ?? endpoint?.path ?? \"/:virtual\";\n\t\t\tconst result = (await withSpan(\n\t\t\t\t`hook after ${path} ${hookSource}`,\n\t\t\t\t{\n\t\t\t\t\t[ATTR_HOOK_TYPE]: \"after\",\n\t\t\t\t\t[ATTR_HTTP_ROUTE]: path,\n\t\t\t\t\t[ATTR_CONTEXT]: hookSource,\n\t\t\t\t\t[ATTR_OPERATION_ID]: operationId,\n\t\t\t\t},\n\t\t\t\t() => hook.handler(context),\n\t\t\t).catch((e) => {\n\t\t\t\tif (isAPIError(e)) {\n\t\t\t\t\tconst headers = (e as any)[kAPIErrorHeaderSymbol] as\n\t\t\t\t\t\t| Headers\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (shouldPublishLog(context.context.logger.level, \"debug\")) {\n\t\t\t\t\t\t// inherit stack from errorStack if debug mode is enabled\n\t\t\t\t\t\te.stack = e.errorStack;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresponse: e,\n\t\t\t\t\t\theaders: headers\n\t\t\t\t\t\t\t? headers\n\t\t\t\t\t\t\t: e.headers\n\t\t\t\t\t\t\t\t? new Headers(e.headers)\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t})) as {\n\t\t\t\tresponse: any;\n\t\t\t\theaders: Headers;\n\t\t\t};\n\t\t\tif (result.headers) {\n\t\t\t\tresult.headers.forEach((value, key) => {\n\t\t\t\t\tif (!context.context.responseHeaders) {\n\t\t\t\t\t\tcontext.context.responseHeaders = new Headers({\n\t\t\t\t\t\t\t[key]: value,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (key.toLowerCase() === \"set-cookie\") {\n\t\t\t\t\t\t\tcontext.context.responseHeaders.append(key, value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.context.responseHeaders.set(key, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (result.response) {\n\t\t\t\tcontext.context.returned = result.response;\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tresponse: context.context.returned,\n\t\theaders: context.context.responseHeaders,\n\t};\n}\n\nfunction getHooks(authContext: AuthContext) {\n\tconst plugins = authContext.options.plugins || [];\n\tconst beforeHooks: Hook[] = [];\n\tconst afterHooks: Hook[] = [];\n\tconst beforeHookHandler = authContext.options.hooks?.before;\n\tif (beforeHookHandler) {\n\t\thooksSourceWeakMap.set(beforeHookHandler, \"user\");\n\t\tbeforeHooks.push({\n\t\t\tmatcher: () => true,\n\t\t\thandler: beforeHookHandler,\n\t\t});\n\t}\n\tconst afterHookHandler = authContext.options.hooks?.after;\n\tif (afterHookHandler) {\n\t\thooksSourceWeakMap.set(afterHookHandler, \"user\");\n\t\tafterHooks.push({\n\t\t\tmatcher: () => true,\n\t\t\thandler: afterHookHandler,\n\t\t});\n\t}\n\tconst pluginBeforeHooks = plugins.flatMap((plugin) =>\n\t\t(plugin.hooks?.before ?? []).map((h) => {\n\t\t\thooksSourceWeakMap.set(h.handler, `plugin:${plugin.id}`);\n\t\t\treturn h;\n\t\t}),\n\t);\n\tconst pluginAfterHooks = plugins.flatMap((plugin) =>\n\t\t(plugin.hooks?.after ?? []).map((h) => {\n\t\t\thooksSourceWeakMap.set(h.handler, `plugin:${plugin.id}`);\n\t\t\treturn h;\n\t\t}),\n\t);\n\n\t/**\n\t * Add plugin added hooks at last\n\t */\n\tif (pluginBeforeHooks.length) beforeHooks.push(...pluginBeforeHooks);\n\tif (pluginAfterHooks.length) afterHooks.push(...pluginAfterHooks);\n\n\treturn {\n\t\tbeforeHooks,\n\t\tafterHooks,\n\t};\n}\n"],"mappings":"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"}