{"version":3,"sources":["../../src/validations/index.ts","../../src/validations/valleyed.ts","../../src/instance/index.ts","../../src/errors/equippedError.ts","../../src/errors/requestError.ts","../../src/server/adapters/base.ts","../../src/server/openapi.ts","../../src/server/routes.ts","../../src/server/types.ts","../../src/server/requests.ts","../../src/server/requests-auth-methods/base.ts","../../src/server/requests-auth-methods/apiKeys.ts","../../src/server/requests-auth-methods/jwt.ts","../../src/server/sockets.ts","../../src/server/middlewares/requireAuthUser.ts","../../src/errors/types/badRequestError.ts","../../src/errors/types/notAuthenticatedError.ts","../../src/errors/types/notAuthorizedError.ts","../../src/errors/types/notFoundError.ts","../../src/errors/types/preconditionRequiredError.ts","../../src/errors/types/tokenExpired.ts","../../src/errors/types/validationError.ts","../../src/instance/hooks.ts","../../src/instance/settings.ts"],"sourcesContent":["export * from 'valleyed'\nexport * as ve from './valleyed'\nimport { type Pipe, PipeError, type PipeOutput, v } from 'valleyed'\n\nimport { ValidationError } from '../errors'\n\nexport function pipeErrorToValidationError(error: PipeError) {\n\tconst errorsObject = error.messages.reduce<Record<string, { field: string; messages: string[] }>>((acc, { path = '', message }) => {\n\t\tif (acc[path]) acc[path].messages.push(message)\n\t\telse acc[path] = { field: path, messages: [message] }\n\t\treturn acc\n\t}, {})\n\n\treturn new ValidationError(Object.values(errorsObject))\n}\n\nexport function validate<T extends Pipe<unknown, unknown>>(pipe: T, value: unknown): PipeOutput<T> {\n\tconst validity = v.validate(pipe, value)\n\tif (validity.valid) return validity.value\n\tthrow pipeErrorToValidationError(validity.error)\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { type Pipe, PipeError, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nimport { Instance } from '../instance'\nimport type { IncomingFile, Request, Response, RouteDef, RouteDefToReqRes } from '../server'\n\nconst filePipe = (err?: string) =>\n\tv.array(\n\t\tv.file<IncomingFile>(err).pipe((input) => {\n\t\t\tconst err = `is larger than allowed limit of ${Instance.get().settings.utils.maxFileUploadSizeInMb}mb`\n\t\t\tconst valid = input ? !input.isTruncated : true\n\t\t\tif (valid) return input\n\t\t\tthrow PipeError.root(err, input)\n\t\t}),\n\t)\n\nexport const incomingFile = (err?: string) =>\n\tv.define<unknown, IncomingFile>(\n\t\tv.compile(\n\t\t\tfilePipe(err)\n\t\t\t\t.pipe(v.min(1, 'no file provided'))\n\t\t\t\t.pipe((files) => files[0]),\n\t\t),\n\t\t{ schema: () => ({ type: 'string', format: 'binary' }) },\n\t)\n\nexport const incomingFiles = (err?: string) =>\n\tv.define<unknown, IncomingFile[]>(v.compile(filePipe(err)), {\n\t\tschema: () => ({ type: 'string', format: 'binary' }),\n\t})\n\nexport const requestLocalStorage = new AsyncLocalStorage<Request<RouteDefToReqRes<RouteDef>>>()\nexport const responseLocalStorage = new AsyncLocalStorage<Response<RouteDefToReqRes<RouteDef>>>()\n\nexport const withRequest = <T extends Pipe<any, any>>(fn: (req: Request<RouteDefToReqRes<RouteDef>>) => T) =>\n\tv.define<PipeInput<T>, PipeOutput<T>>((input) => {\n\t\tconst req = requestLocalStorage.getStore()\n\t\tif (!req) throw new Error('Request not found in context')\n\t\tconst validated = v.validate(fn(req), input)\n\t\treturn validated.valid ? validated.value : validated.error\n\t})\n\nexport const withResponse = <T extends Pipe<any, any>>(fn: (req: Response<RouteDefToReqRes<RouteDef>>) => T) =>\n\tv.define<PipeInput<T>, PipeOutput<T>>((input) => {\n\t\tconst res = responseLocalStorage.getStore()\n\t\tif (!res) throw new Error('Response not found in context')\n\t\tconst validated = v.validate(fn(res), input)\n\t\treturn validated.valid ? validated.value : validated.error\n\t})\n","import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type Pipe, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type ClassRef, type HookCb, type HookEvent, type HookOptions, type HookRecord, registerHook, runHooks } from './hooks'\nimport { instanceSettingsPipe, type Settings, type SettingsInput } from './settings'\n\nexport type { ClassRef, HookCb, HookEvent, HookOptions }\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance | undefined\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic maybeGet() {\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, options?: HookOptions) {\n\t\tInstance.#hooks[event] ??= []\n\t\tconst record: HookRecord = { cb, class: options?.class, after: options?.after ?? [] }\n\t\tregisterHook(Instance.#hooks[event], record)\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {}, true)\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n","export class EquippedError extends Error {\n\tconstructor(\n\t\tpublic readonly message: string,\n\t\tpublic readonly context: Record<string, unknown>,\n\t\tpublic readonly cause?: unknown,\n\t) {\n\t\tsuper(message, { cause })\n\t}\n}\n","import type { StatusCodesEnum } from '../server'\nimport { EquippedError } from './equippedError'\n\nexport abstract class RequestError extends EquippedError {\n\tabstract readonly statusCode: StatusCodesEnum\n\n\tprotected constructor(\n\t\tpublic readonly message: string,\n\t\tpublic readonly serializedErrors: { message: string; field?: string }[],\n\t\tcause?: unknown,\n\t) {\n\t\tsuper(message, { serializedErrors }, cause)\n\t}\n}\n","import http, { type IncomingMessage, type ServerResponse } from 'node:http'\n\nimport { type FastifyCorsOptions } from '@fastify/cors'\nimport { type CorsOptions } from 'cors'\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport type TestAgent from 'supertest/lib/agent'\nimport { type Pipe, PipeError, v, type PipeOutput } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { EventBus } from '../../events'\nimport { Instance } from '../../instance'\nimport type { AuthUser } from '../../types'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { openapi, type OpenApiSchemaDef } from '../openapi'\nimport { Request, Response } from '../requests'\nimport { BaseRequestAuthMethod } from '../requests-auth-methods'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type Route, type RouteDef, StatusCodes } from '../types'\n\nexport const serverConfigPipe = () =>\n\tv.object({\n\t\tport: v.number(),\n\t\tcors: v.optional(\n\t\t\tv.object({\n\t\t\t\torigin: v.optional(v.or([v.array(v.string()), v.is(true as const)])),\n\t\t\t\tmethods: v.optional(v.array(v.in(Object.values(Methods)))),\n\t\t\t\tcredentials: v.optional(v.boolean()),\n\t\t\t}),\n\t\t),\n\t\teventBus: v.optional(v.instanceOf(EventBus)),\n\t\tpublicPath: v.optional(v.string()),\n\t\thealthPath: v.optional(v.string()),\n\t\topenapi: v.defaults(\n\t\t\tv.object({\n\t\t\t\tdocsVersion: v.defaults(v.string(), '1.0.0'),\n\t\t\t\tdocsBaseUrl: v.defaults(v.array(v.string()), ['/']),\n\t\t\t\tdocsPath: v.defaults(v.string(), '/__docs'),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t\trequests: v.defaults(\n\t\t\tv.object({\n\t\t\t\tlog: v.defaults(v.boolean(), true),\n\t\t\t\trateLimit: v.defaults(\n\t\t\t\t\tv.object({\n\t\t\t\t\t\tenabled: v.defaults(v.boolean(), false),\n\t\t\t\t\t\tperiodInMs: v.defaults(v.number(), 60 * 60 * 1000),\n\t\t\t\t\t\tlimit: v.defaults(v.number(), 5000),\n\t\t\t\t\t}),\n\t\t\t\t\t{},\n\t\t\t\t),\n\t\t\t\tslowdown: v.defaults(\n\t\t\t\t\tv.object({\n\t\t\t\t\t\tenabled: v.defaults(v.boolean(), false),\n\t\t\t\t\t\tperiodInMs: v.defaults(v.number(), 10 * 60 * 1000),\n\t\t\t\t\t\tdelayAfter: v.defaults(v.number(), 2000),\n\t\t\t\t\t\tdelayInMs: v.defaults(v.number(), 500),\n\t\t\t\t\t}),\n\t\t\t\t\t{},\n\t\t\t\t),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t\tsocketsAuthMethods: v.defaults(v.array(v.instanceOf(BaseRequestAuthMethod<AuthUser>)), []),\n\t})\n\nexport type ServerConfig = PipeOutput<ReturnType<typeof serverConfigPipe>>\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst rawResponseHandledSymbol: unique symbol = Symbol('rawResponseHandled')\nexport type RawResponseHandled = { readonly [rawResponseHandledSymbol]: true }\nexport type RawResponseHandler = (request: IncomingMessage, response: ServerResponse) => unknown | Promise<unknown>\nexport type RawResponder = (handler: RawResponseHandler) => Promise<RawResponseHandled>\nexport type ServerBeforeListenContext = { httpServer: http.Server; port: number }\nexport type ServerBeforeListenHandler = (context: ServerBeforeListenContext) => void | Promise<void>\nexport type ServerNotFoundContext = { request: Request<any>; respondWithRaw: RawResponder }\nexport type ServerNotFoundHandler = (\n\tcontext: ServerNotFoundContext,\n) => Response<any> | RawResponseHandled | Promise<Response<any> | RawResponseHandled>\n\nconst rawResponseHandled: RawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true })\nconst rawResponseNotStartedMessage = 'Raw not-found handler did not start or complete a response'\n\nfunction isRawResponseHandled(input: unknown): input is RawResponseHandled {\n\treturn Boolean(input && typeof input === 'object' && rawResponseHandledSymbol in input)\n}\n\nfunction hasRawResponseStarted(response: ServerResponse): boolean {\n\treturn response.headersSent || response.writableEnded\n}\n\nfunction writeRawHandlerError(response: ServerResponse, error: unknown) {\n\tif (hasRawResponseStarted(response)) return\n\tresponse.statusCode = StatusCodes.BadRequest\n\tresponse.setHeader('Content-Type', 'application/json')\n\tconst message = error instanceof Error ? error.message : `${error}`\n\tresponse.end(JSON.stringify([{ message }]))\n}\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server {\n\tsocket!: SocketEmitter\n\tcors!: CorsOptions & FastifyCorsOptions\n\t#httpServer!: http.Server\n\t#oai!: ReturnType<typeof openapi>\n\t#serverConfig!: ServerConfig\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Set<string>()\n\t#started = false\n\t#beforeListenHandlers: ServerBeforeListenHandler[] = []\n\t#notFoundHandler: ServerNotFoundHandler | null = null\n\n\tprotected abstract parseRequest(req: any): Promise<Request<any>>\n\tprotected abstract handleResponse(res: any, response: Response<any>): Promise<void>\n\tprotected abstract createRawResponder(req: any, res: any): RawResponder\n\tprotected abstract registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>): void\n\tprotected abstract registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>): void\n\tprotected abstract registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>): void\n\tprotected abstract startServer(port: number): Promise<boolean>\n\n\tprotected setup(httpServer: http.Server, config: ServerConfig) {\n\t\tthis.#httpServer = httpServer\n\t\tthis.#serverConfig = config\n\t\tthis.cors = {\n\t\t\torigin: config.cors?.origin ? (_, cb) => cb(null, true) : config.cors?.origin,\n\t\t\tmethods: (config.cors?.methods ?? Object.values(Methods)).filter((m) => m !== Methods.options).map((m) => m.toUpperCase()),\n\t\t\tcredentials: config.cors?.credentials,\n\t\t}\n\t\tthis.#oai = openapi(config)\n\t\tconst socketInstance = new SocketServer(httpServer, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#oai.router)\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [], responseMiddlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#oai.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.has(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\t\t\t\tresponseMiddlewares.forEach((m) => m.onSetup?.(route as any))\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.add(key)\n\t\t\t\tawait this.#oai.register(route, jsonSchema)\n\t\t\t\tthis.registerRoute(method, this.#oai.cleanPath(path), async (req, res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request)\n\t\t\t\t\t\tconst rawRes = await route.handler(request)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\tfor (const middleware of responseMiddlewares) await middleware.cb(request, response)\n\t\t\t\t\t\treturn await this.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\tsetNotFoundHandler(handler: ServerNotFoundHandler): this {\n\t\tif (this.#started) throw new EquippedError('Cannot set not-found handler after server has started', {})\n\t\tthis.#notFoundHandler = handler\n\t\treturn this\n\t}\n\n\tonBeforeListen(handler: ServerBeforeListenHandler): this {\n\t\tif (this.#started) throw new EquippedError('Cannot add before-listen handler after server has started', {})\n\t\tthis.#beforeListenHandlers.push(handler)\n\t\treturn this\n\t}\n\n\ttest(): TestAgent {\n\t\treturn supertest(this.#httpServer)\n\t}\n\n\tasync start(): Promise<boolean> {\n\t\tthis.#started = true\n\t\tconst config = this.#serverConfig\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\n\t\tthis.registerNotFoundHandler(async (req, res) => await this.#handleNotFound(req, res))\n\t\tthis.registerErrorHandler(async (error, _, res) => {\n\t\t\tif (!(error instanceof EquippedError)) Instance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: error instanceof EquippedError\n\t\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\t\tbody: [{ message: error.message }],\n\t\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t\t})\n\t\t\treturn await this.handleResponse(res, response)\n\t\t})\n\n\t\tfor (const handler of this.#beforeListenHandlers) await handler({ httpServer: this.#httpServer, port: config.port })\n\n\t\tconst started = await this.startServer(config.port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`)\n\t\treturn started\n\t}\n\n\tprotected createNodeRawResponder(input: {\n\t\trequest: IncomingMessage\n\t\tresponse: ServerResponse\n\t\tbeforeHandle?: () => void\n\t}): RawResponder {\n\t\treturn async (handler) => {\n\t\t\tinput.beforeHandle?.()\n\t\t\ttry {\n\t\t\t\tawait handler(input.request, input.response)\n\t\t\t} catch (error) {\n\t\t\t\tif (!hasRawResponseStarted(input.response)) {\n\t\t\t\t\twriteRawHandlerError(input.response, error)\n\t\t\t\t\treturn rawResponseHandled\n\t\t\t\t}\n\t\t\t\tthrow error\n\t\t\t}\n\t\t\tif (!hasRawResponseStarted(input.response))\n\t\t\t\twriteRawHandlerError(input.response, new EquippedError(rawResponseNotStartedMessage, {}))\n\t\t\treturn rawResponseHandled\n\t\t}\n\t}\n\n\tasync #handleNotFound(req: any, res: any) {\n\t\tconst request = await this.parseRequest(req)\n\t\tif (!this.#notFoundHandler) throw new NotFoundError(`Route ${request.path} not found`)\n\t\tconst result = await this.#notFoundHandler({ request, respondWithRaw: this.createRawResponder(req, res) })\n\t\tif (isRawResponseHandled(result)) return\n\t\tif (result instanceof Response) return await this.handleResponse(res, result)\n\t\tthrow new EquippedError('Not-found handler must return a Response or respondWithRaw(...)', {})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((rec) => rec.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\tconst r = v.validate(p, input)\n\t\t\t\t\tif (!r.valid) throw r.error\n\t\t\t\t\treturn r.value\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value] as const)),\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\tconst chunks: string[] = []\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\theaders: {} as Record<string, string>,\n\t\t\tsetHeader(key: string, value: string) {\n\t\t\t\tthis.headers[key] = value\n\t\t\t},\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tif (chunk !== undefined) chunks.push(Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk))\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t\tbody() {\n\t\t\t\treturn chunks.join('')\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestServer extends Server {\n\t\thandledResponse: Response<any> | null = null\n\t\tstartedPorts: number[] = []\n\t\tprivate notFoundHandler: ((req: any, res: any) => Promise<void>) | null = null\n\n\t\tconstructor() {\n\t\t\tsuper()\n\t\t\tthis.setup(http.createServer(), {\n\t\t\t\tport: 0,\n\t\t\t\tcors: undefined,\n\t\t\t\teventBus: undefined,\n\t\t\t\tpublicPath: undefined,\n\t\t\t\thealthPath: undefined,\n\t\t\t\topenapi: { docsVersion: '1.0.0', docsBaseUrl: ['/'], docsPath: '/__docs' },\n\t\t\t\trequests: {\n\t\t\t\t\tlog: false,\n\t\t\t\t\trateLimit: { enabled: false, periodInMs: 1, limit: 1 },\n\t\t\t\t\tslowdown: { enabled: false, periodInMs: 1, delayAfter: 1, delayInMs: 1 },\n\t\t\t\t},\n\t\t\t\tsocketsAuthMethods: [],\n\t\t\t})\n\t\t}\n\n\t\tprotected async parseRequest(req: any) {\n\t\t\treturn new Request<any>({\n\t\t\t\tip: '127.0.0.1',\n\t\t\t\tbody: {},\n\t\t\t\tcookies: {},\n\t\t\t\tparams: {},\n\t\t\t\tquery: {},\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: req.path,\n\t\t\t\theaders: {},\n\t\t\t\tfiles: {},\n\t\t\t})\n\t\t}\n\n\t\tprotected async handleResponse(_: any, response: Response<any>) {\n\t\t\tthis.handledResponse = response\n\t\t}\n\n\t\tprotected createRawResponder(req: any, res: any): RawResponder {\n\t\t\treturn this.createNodeRawResponder({ request: req.rawRequest, response: res.rawResponse })\n\t\t}\n\n\t\tprotected registerRoute() {}\n\t\tprotected registerErrorHandler() {}\n\n\t\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\t\tthis.notFoundHandler = cb\n\t\t}\n\n\t\tprotected async startServer(port: number) {\n\t\t\tthis.startedPorts.push(port)\n\t\t\treturn true\n\t\t}\n\n\t\tasync dispatchNotFound(\n\t\t\tpath: string,\n\t\t): Promise<{ handledResponse: Response<any> | null; rawResponse: ReturnType<typeof createRawResponse> }> {\n\t\t\tif (!this.notFoundHandler) throw new Error('not-found handler was not registered')\n\t\t\tthis.handledResponse = null\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tawait this.notFoundHandler({ path, rawRequest: {} }, { rawResponse })\n\t\t\treturn { handledResponse: this.handledResponse, rawResponse }\n\t\t}\n\t}\n\n\tdescribe('Server before-listen handlers', () => {\n\t\ttest('runs before-listen handlers before adapter listen in registration order', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tconst calls: string[] = []\n\t\t\tlet receivedServer: http.Server | null = null\n\n\t\t\tserver\n\t\t\t\t.onBeforeListen(({ httpServer, port }) => {\n\t\t\t\t\tcalls.push(`first:${port}`)\n\t\t\t\t\treceivedServer = httpServer\n\t\t\t\t\texpect(server.startedPorts).toEqual([])\n\t\t\t\t})\n\t\t\t\t.onBeforeListen(({ httpServer, port }) => {\n\t\t\t\t\tcalls.push(`second:${port}`)\n\t\t\t\t\texpect(httpServer).toBe(receivedServer)\n\t\t\t\t\texpect(server.startedPorts).toEqual([])\n\t\t\t\t})\n\n\t\t\tawait server.start()\n\n\t\t\texpect(calls).toEqual(['first:0', 'second:0'])\n\t\t\texpect(receivedServer).toBeInstanceOf(http.Server)\n\t\t\texpect(server.startedPorts).toEqual([0])\n\t\t})\n\n\t\ttest('rejects startup when a before-listen handler fails before adapter listen', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tserver.onBeforeListen(async () => {\n\t\t\t\tthrow new Error('before-listen failed')\n\t\t\t})\n\n\t\t\tawait expect(server.start()).rejects.toThrow('before-listen failed')\n\t\t\texpect(server.startedPorts).toEqual([])\n\t\t})\n\n\t\ttest('rejects adding before-listen handlers after server startup', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tawait server.start()\n\n\t\t\texpect(() => server.onBeforeListen(() => {})).toThrow('Cannot add before-listen handler after server has started')\n\t\t})\n\t})\n\n\tdescribe('Server not-found handler', () => {\n\t\ttest('throws the default Equipped not-found error when no custom handler is set', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tawait server.start()\n\n\t\t\tawait expect(server.dispatchNotFound('/missing')).rejects.toBeInstanceOf(NotFoundError)\n\t\t})\n\n\t\ttest('allows a custom not-found handler to return an Equipped response', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tserver.setNotFoundHandler(\n\t\t\t\t({ request }) =>\n\t\t\t\t\tnew Response<any>({\n\t\t\t\t\t\tbody: [{ message: `No route for ${request.path}` }],\n\t\t\t\t\t\tstatus: StatusCodes.NotFound,\n\t\t\t\t\t\theaders: {},\n\t\t\t\t\t\tcookies: {},\n\t\t\t\t\t\tcontentType: 'application/json',\n\t\t\t\t\t}),\n\t\t\t)\n\t\t\tawait server.start()\n\n\t\t\tconst result = await server.dispatchNotFound('/custom')\n\n\t\t\texpect(result.handledResponse?.status).toBe(StatusCodes.NotFound)\n\t\t\texpect(result.handledResponse?.body).toEqual([{ message: 'No route for /custom' }])\n\t\t})\n\n\t\ttest('allows a custom not-found handler to complete the response through a raw Node listener', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tserver.setNotFoundHandler(({ respondWithRaw }) =>\n\t\t\t\trespondWithRaw((_, response) => {\n\t\t\t\t\tresponse.statusCode = 203\n\t\t\t\t\tresponse.end('raw fallback')\n\t\t\t\t}),\n\t\t\t)\n\t\t\tawait server.start()\n\n\t\t\tconst result = await server.dispatchNotFound('/page')\n\n\t\t\texpect(result.handledResponse).toBeNull()\n\t\t\texpect(result.rawResponse.statusCode).toBe(203)\n\t\t\texpect(result.rawResponse.body()).toBe('raw fallback')\n\t\t})\n\n\t\ttest('writes a clear raw error when a raw not-found handler does not start a response', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tserver.setNotFoundHandler(({ respondWithRaw }) => respondWithRaw(() => {}))\n\t\t\tawait server.start()\n\n\t\t\tconst result = await server.dispatchNotFound('/page')\n\n\t\t\texpect(result.handledResponse).toBeNull()\n\t\t\texpect(result.rawResponse.statusCode).toBe(StatusCodes.BadRequest)\n\t\t\texpect(result.rawResponse.body()).toContain(rawResponseNotStartedMessage)\n\t\t})\n\n\t\ttest('rejects a custom not-found handler result that is neither an Equipped response nor raw completion', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tserver.setNotFoundHandler((() => undefined) as unknown as ServerNotFoundHandler)\n\t\t\tawait server.start()\n\n\t\t\tawait expect(server.dispatchNotFound('/bad')).rejects.toThrow('Not-found handler must return a Response or respondWithRaw(...)')\n\t\t})\n\n\t\ttest('rejects setting the custom not-found handler after server startup', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = new TestServer()\n\t\t\tawait server.start()\n\n\t\t\texpect(() =>\n\t\t\t\tserver.setNotFoundHandler(\n\t\t\t\t\t() =>\n\t\t\t\t\t\tnew Response<any>({\n\t\t\t\t\t\t\tbody: null,\n\t\t\t\t\t\t\tstatus: StatusCodes.NotFound,\n\t\t\t\t\t\t\theaders: {},\n\t\t\t\t\t\t\tcookies: {},\n\t\t\t\t\t\t\tcontentType: 'application/json',\n\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t).toThrow('Cannot set not-found handler after server has started')\n\t\t})\n\t})\n}\n","import { convert } from '@openapi-contrib/json-schema-to-openapi-schema'\nimport type { OpenAPIV3_1 } from 'openapi-types'\nimport { capitalize, type JsonSchema } from 'valleyed'\n\nimport { Instance } from '../instance'\nimport type { ServerConfig } from './adapters/base'\nimport { Router } from './routes'\nimport type { Route } from './types'\n\ndeclare module 'openapi-types' {\n\tnamespace OpenAPIV3 {\n\t\tinterface Document {\n\t\t\t'x-tagGroups': { name: string; tags: string[] }[]\n\t\t}\n\t\tinterface TagObject {\n\t\t\t'x-displayName': string\n\t\t}\n\t}\n}\n\nexport type OpenApiSchemaDef = {\n\trequest: Partial<Record<'body' | 'query' | 'params' | 'headers' | 'response', JsonSchema>>\n\tresponse: Partial<Record<'response' | 'responseHeaders', { status: number; schema: JsonSchema; contentType: string }[]>>\n}\n\nexport const openapi = (config: ServerConfig) => {\n\tconst instance = Instance.get()\n\tconst { app } = instance.settings\n\tconst baseOpenapiDoc: OpenAPIV3_1.Document = {\n\t\topenapi: '3.0.0',\n\t\tinfo: {\n\t\t\ttitle: `${app.name} ${instance.id}`,\n\t\t\tversion: config.openapi.docsVersion ?? '',\n\t\t},\n\t\tservers: config.openapi.docsBaseUrl?.map((url) => ({ url })),\n\t\tpaths: {},\n\t\tcomponents: {\n\t\t\tschemas: {},\n\t\t\tsecuritySchemes: {\n\t\t\t\tAuthorization: {\n\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\tname: 'authorization',\n\t\t\t\t\tin: 'header',\n\t\t\t\t},\n\t\t\t\tRefreshToken: {\n\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\tname: 'x-refresh-token',\n\t\t\t\t\tin: 'header',\n\t\t\t\t},\n\t\t\t\tApiKey: {\n\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\tname: 'x-api-key',\n\t\t\t\t\tin: 'header',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\ttags: [],\n\t\t'x-tagGroups': [],\n\t}\n\n\tconst registeredTags: Record<string, boolean> = {}\n\tconst registeredTagGroups: Record<string, { name: string; tags: string[] }> = {}\n\n\tconst flattenForParameters = (node: JsonSchema): JsonSchema[] => {\n\t\tconst { allOf, oneOf, anyOf, ...schema } = node\n\t\tif (allOf) return allOf.flatMap((n) => flattenForParameters(n))\n\t\treturn [schema]\n\t}\n\n\tconst visit = (node: JsonSchema) => {\n\t\tif (!node || typeof node !== 'object') return node\n\t\tif (typeof node.$refId === 'string') {\n\t\t\tconst { $refId: id, ...rest } = node\n\t\t\tconst res = visit(rest)\n\t\t\tif (baseOpenapiDoc.components?.schemas) {\n\t\t\t\tbaseOpenapiDoc.components.schemas[id] = res\n\t\t\t\treturn { $ref: `#/components/schemas/${id}` }\n\t\t\t} else return res\n\t\t}\n\n\t\tif (Array.isArray(node)) return node.map((n) => visit(n)) as any\n\t\treturn Object.fromEntries(Object.entries(node).map(([key, value]) => [key, visit(value as any)]))\n\t}\n\n\tconst buildTag = (groups: NonNullable<Route<any>['groups']>) => {\n\t\tif (!groups.length) return undefined\n\t\tconst parsed = groups.map((g) => (typeof g === 'string' ? { name: g } : g))\n\t\tconst name = parsed.map((g) => g.name).join(' > ')\n\t\tconst displayName = parsed.at(-1)?.name ?? ''\n\t\tconst description = parsed\n\t\t\t.map((g) => g.description?.trim() ?? '')\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n\\n\\n\\n')\n\n\t\tif (!registeredTags[name]) {\n\t\t\tregisteredTags[name] = true\n\t\t\tbaseOpenapiDoc.tags!.push({ name, 'x-displayName': displayName, description })\n\n\t\t\tconst tagGroups = parsed.slice(0, -1)\n\t\t\tconst groupName = tagGroups.map((g) => g.name).join(' > ') || 'default'\n\t\t\tif (!registeredTagGroups[groupName]) {\n\t\t\t\tconst group = { name: groupName, tags: [] }\n\t\t\t\tbaseOpenapiDoc['x-tagGroups'].push(group)\n\t\t\t\tregisteredTagGroups[groupName] = group\n\t\t\t}\n\t\t\tregisteredTagGroups[groupName].tags = [...new Set([...registeredTagGroups[groupName].tags, name])]\n\t\t}\n\n\t\treturn name\n\t}\n\n\tconst addRouteToOpenApiDoc = async (path: string, method: string, def: OpenApiSchemaDef, methodObj: OpenAPIV3_1.OperationObject) => {\n\t\tif (def.response.response?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.response) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.content![resp.contentType] = { schema: await convert(visit(resp.schema)) }\n\t\t\t}\n\t\t}\n\n\t\tif (def.response.responseHeaders?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.responseHeaders) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tmethodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.headers = { schema: (await convert(visit(resp.schema))) as any }\n\t\t\t}\n\t\t}\n\n\t\tif (def.request.body)\n\t\t\tmethodObj.requestBody = {\n\t\t\t\trequired: true,\n\t\t\t\tcontent: {\n\t\t\t\t\t'application/json': { schema: await convert(visit(def.request.body)) },\n\t\t\t\t},\n\t\t\t}\n\n\t\tconst parameters: OpenAPIV3_1.ParameterObject[] = []\n\n\t\tconst addParams = async (location: 'query' | 'path' | 'header', schema: JsonSchema | undefined) => {\n\t\t\tif (!schema) return\n\t\t\tconst flat = flattenForParameters(schema)\n\t\t\tfor (const schema of flat) {\n\t\t\t\tif (!schema.properties) continue\n\t\t\t\tfor (const [name, value] of Object.entries(schema.properties))\n\t\t\t\t\tparameters.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tin: location,\n\t\t\t\t\t\tschema: await convert(visit(value)),\n\t\t\t\t\t\trequired: (schema.required || []).includes(name),\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tawait Promise.all([\n\t\t\taddParams('query', def.request.query),\n\t\t\taddParams('path', def.request.params),\n\t\t\taddParams('header', def.request.headers),\n\t\t])\n\t\tif (parameters.length) methodObj.parameters = parameters\n\n\t\tif (!baseOpenapiDoc.paths) baseOpenapiDoc.paths = {}\n\t\tif (!baseOpenapiDoc.paths[path]) baseOpenapiDoc.paths[path] = {}\n\t\tbaseOpenapiDoc.paths[path]![method] = methodObj\n\t}\n\n\tconst html = (jsonPath: string) => {\n\t\tconst title = capitalize(`${app.name} ${instance.id}`)\n\t\treturn `\n<!doctype html>\n<html>\n  <head>\n    <title>${title}</title>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<style>\n      .darklight-reference {\n        display: none;\n      }\n    </style>\n  </head>\n  <body>\n    <script id=\"api-reference\" data-url=\"${jsonPath}\"></script>\n    <script>\n      const configuration = { theme: 'purple' };\n      document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);\n    </script>\n    <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.38.0\"></script>\n  </body>\n</html>\n`\n\t}\n\n\tconst cleanPath = (path: string) => {\n\t\tlet cleaned = path.replace(/(\\/\\s*)+/g, '/')\n\t\tif (!cleaned.startsWith('/')) cleaned = `/${cleaned}`\n\t\tif (cleaned !== '/' && cleaned.endsWith('/')) cleaned = cleaned.slice(0, -1)\n\t\treturn cleaned\n\t}\n\n\tconst register = async (route: Route<any>, def: OpenApiSchemaDef) => {\n\t\tif (route.hide) return\n\n\t\tconst tag = buildTag(route.groups ?? [])\n\n\t\tconst cleanedPath = cleanPath(route.path)\n\t\tconst operationId = `(${route.method.toUpperCase()}) ${cleanedPath}`\n\t\tawait addRouteToOpenApiDoc(cleanedPath, route.method.toLowerCase(), def, {\n\t\t\toperationId,\n\t\t\tsummary: route.title ?? cleanedPath,\n\t\t\tdescription: route.descriptions?.join('\\n\\n'),\n\t\t\ttags: tag ? [tag] : undefined,\n\t\t\tsecurity: route.security,\n\t\t})\n\t}\n\n\tconst jsonPath = '/openapi.json'\n\tconst router = new Router({ path: config.openapi.docsPath ?? '/', hide: true })\n\trouter.get('/index.html')((req) => req.res({ body: html(`.${jsonPath}`), contentType: 'text/html' }))\n\trouter.get(jsonPath)((req) => req.res({ body: baseOpenapiDoc }))\n\n\treturn {\n\t\trouter,\n\t\tregister,\n\t\tcleanPath,\n\t}\n}\n","import { v } from 'valleyed'\n\nimport {\n\tMethods,\n\ttype MergeRouteDefs,\n\ttype MethodsEnum,\n\ttype Route,\n\ttype RouteConfig,\n\ttype RouteDef,\n\ttype RouteDefHandler,\n\ttype RouterConfig,\n} from './types'\n\nfunction mergeSchemas(...schemas: RouteDef[]) {\n\ttype Keys = Record<keyof RouteDef, string>\n\tconst k: Keys = {\n\t\tparams: '',\n\t\theaders: '',\n\t\tquery: '',\n\t\tbody: '',\n\t\tcookies: '',\n\t\tresponse: '',\n\t\tresponseHeaders: '',\n\t\tresponseCookies: '',\n\t\tdefaultStatusCode: '',\n\t\tdefaultContentType: '',\n\t}\n\tfunction merge<T extends RouteDef[keyof Keys]>(acc: T | null, cur: T) {\n\t\tif (!acc) return cur\n\t\tif (!cur) return acc\n\t\tif (typeof acc === 'number') return cur\n\t\tif (typeof acc === 'string') return cur\n\t\tif (typeof acc === 'function') return cur\n\t\treturn v.merge(acc, cur as any)\n\t}\n\treturn Object.fromEntries(\n\t\tObject.keys(k).map((key) => [\n\t\t\tkey,\n\t\t\tschemas.map((s) => s[key] as RouteDef[keyof Keys]).reduce<RouteDef[keyof Keys] | null>(merge, null),\n\t\t]),\n\t) as RouteDef\n}\n\nconst groupRoutes = <T extends RouteDef, R extends RouteDef>(config: RouterConfig<T>, routes: Route<R>[]) =>\n\troutes.map((route) => ({\n\t\t...config,\n\t\t...route,\n\t\tpath: `${config.path}/${route.path}`,\n\t\tgroups: [...(config.groups ?? []), ...(route.groups ?? [])],\n\t\tmiddlewares: [...(config.middlewares ?? []), ...(route.middlewares ?? [])],\n\t\tresponseMiddlewares: [...(config.responseMiddlewares ?? []), ...(route.responseMiddlewares ?? [])],\n\t\tschema: mergeSchemas(config.schema ?? {}, route.schema ?? {}),\n\t\tsecurity: [...(config.security ?? []), ...(route.security ?? [])],\n\t})) as Route<MergeRouteDefs<T, R>>[]\n\nexport class Router<T extends RouteDef> {\n\t#config: RouterConfig<T> = { path: '' }\n\t#routes: Route<any>[] = []\n\t#children: Router<any>[] = []\n\n\tconstructor(config: RouterConfig<T> = { path: '' }) {\n\t\tthis.#config = config\n\t}\n\n\t#wrap(method: MethodsEnum) {\n\t\treturn <R extends RouteDef>(path: string, config: RouteConfig<R> = {}) =>\n\t\t\t(handler: RouteDefHandler<MergeRouteDefs<T, R>>) => {\n\t\t\t\tconst route = groupRoutes(this.#config, [{ ...config, path, method, handler: handler as any }])[0]\n\t\t\t\tthis.#routes.push(route)\n\t\t\t\treturn route\n\t\t\t}\n\t}\n\n\thead = this.#wrap(Methods.head)\n\tget = this.#wrap(Methods.get)\n\tpost = this.#wrap(Methods.post)\n\tput = this.#wrap(Methods.put)\n\tpatch = this.#wrap(Methods.patch)\n\tdelete = this.#wrap(Methods.delete)\n\toptions = this.#wrap(Methods.options)\n\n\tnest(...routers: Router<any>[]) {\n\t\trouters.forEach((router) => this.#children.push(router))\n\t}\n\n\tget routes() {\n\t\treturn [...this.#routes].concat(this.#children.flatMap((child) => groupRoutes(this.#config, child.routes)))\n\t}\n}\n","import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { Request, Response } from './requests'\n\nexport const Methods = {\n\thead: 'head',\n\tget: 'get',\n\tpost: 'post',\n\tput: 'put',\n\tpatch: 'patch',\n\tdelete: 'delete',\n\toptions: 'options',\n} as const\n\nexport const StatusCodes = {\n\tOk: 200,\n\tFound: 302,\n\tBadRequest: 400,\n\tNotAuthenticated: 401,\n\tNotAuthorized: 403,\n\tNotFound: 404,\n\tValidationError: 422,\n\tPreconditionRequired: 428,\n\tTooManyRequests: 429,\n\tTokenExpired: 461,\n} as const\n\nexport type MethodsEnum = Enum<typeof Methods>\nexport type StatusCodesEnum = Enum<typeof StatusCodes>\n\nexport type DefaultHeaders = Record<string, ArrayOrValue<string>>\nexport type DefaultCookies = Record<string, string | undefined>\n\ntype ArrayOrValue<T> = T | T[] | undefined\n\nexport type IncomingFile = {\n\tname: string\n\ttype: string\n\tsize: number\n\tisTruncated: boolean\n\tdata: Buffer\n\tduration: number\n}\n\nexport type RouteDef = {\n\tparams?: Pipe<Record<string, ArrayOrValue<string>>, Record<string, ArrayOrValue<string>>>\n\tquery?: Pipe<Record<string, ArrayOrValue<unknown>>, Record<string, ArrayOrValue<unknown>>>\n\theaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tcookies?: Pipe<DefaultCookies, DefaultCookies>\n\tbody?: Pipe<Record<string, unknown>, Record<string, unknown>>\n\tresponse?: Pipe<unknown, unknown>\n\tresponseHeaders?: Pipe<DefaultHeaders, DefaultHeaders>\n\tresponseCookies?: Pipe<DefaultCookies, DefaultCookies>\n\tdefaultStatusCode?: StatusCodesEnum\n\tdefaultContentType?: string\n}\n\ntype RouteGroup = { name: string; description?: string }\ntype HandlerSetup<T extends RouteDef> = (route: Route<T>) => void\n\nexport type RouteConfig<T extends RouteDef> = {\n\tmiddlewares?: ReturnType<typeof makeMiddleware<RouteDef>>[]\n\tresponseMiddlewares?: ReturnType<typeof makeResponseMiddleware<RouteDef>>[]\n\tonError?: ReturnType<typeof makeErrorMiddleware<RouteDef>>\n\tgroups?: (RouteGroup | RouteGroup['name'])[]\n\ttitle?: string\n\tdescriptions?: string[]\n\tsecurity?: Record<string, string[]>[]\n\tschema?: T\n\thide?: boolean\n}\n\nexport type RouterConfig<T extends RouteDef> = RouteConfig<T> & { path: string }\nexport type Route<T extends RouteDef> = RouteConfig<T> & {\n\tpath: string\n\tmethod: MethodsEnum\n\thandler: RouteDefHandler<T>\n}\n\ntype GetApiPart<T extends RouteDef, K extends keyof RouteDef> = NonNullable<IsInTypeList<T[K], [unknown]> extends true ? RouteDef[K] : T[K]>\n\ntype ArePipes<A, B> = A extends Pipe<any, any> ? (B extends Pipe<any, any> ? true : false) : false\ntype Compare<K extends keyof RouteDef, A, B> =\n\tIsInTypeList<B, [unknown]> extends true\n\t\t? A\n\t\t: IsInTypeList<A, [unknown]> extends true\n\t\t\t? B\n\t\t\t: K extends `default${string}` | 'context'\n\t\t\t\t? B\n\t\t\t\t: ArePipes<A, B> extends true\n\t\t\t\t\t? Pipe<PipeInput<A> & PipeInput<B>, PipeOutput<A> & PipeOutput<B>>\n\t\t\t\t\t: B\n\nexport type MergeRouteDefs<A extends RouteDef, B extends RouteDef> = {\n\t[K in keyof RouteDef]: Compare<K, A[K], B[K]>\n}\n\nexport type RouteDefToReqRes<T extends RouteDef> = Prettify<{\n\tbody: PipeOutput<GetApiPart<T, 'body'>>\n\tparams: PipeOutput<GetApiPart<T, 'params'>>\n\trequestHeaders: PipeOutput<GetApiPart<T, 'headers'>>\n\trequestCookies: PipeOutput<GetApiPart<T, 'cookies'>>\n\tquery: PipeOutput<GetApiPart<T, 'query'>>\n\tresponse: PipeOutput<GetApiPart<T, 'response'>>\n\tresponseHeaders: PipeOutput<GetApiPart<T, 'responseHeaders'>>\n\tresponseCookies: PipeOutput<GetApiPart<T, 'responseCookies'>>\n\tstatusCode: GetApiPart<T, 'defaultStatusCode'>\n\tcontentType: GetApiPart<T, 'defaultContentType'>\n}>\n\ntype Awaitable<T> = Promise<T> | T\ntype Res<T extends RouteDefToReqRes<any>> = Awaitable<\n\tIsInTypeList<T['statusCode'], [StatusCodesEnum, 200]> extends true\n\t\t? IsInTypeList<T['responseHeaders'], [DefaultHeaders]> extends true\n\t\t\t? IsInTypeList<T['responseCookies'], [DefaultCookies]> extends true\n\t\t\t\t? Response<T> | T['response']\n\t\t\t\t: Response<T>\n\t\t\t: Response<T>\n\t\t: Response<T>\n>\nexport type RouteDefHandler<Def extends RouteDef> = (req: Request<RouteDefToReqRes<Def>>) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>) => Awaitable<void>\ntype RouteResponseMiddlewareHandler<_Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<RouteDef>>,\n\tres: Response<RouteDefToReqRes<RouteDef>>,\n) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\terr: Error,\n) => Res<\n\tOmit<RouteDefToReqRes<Def>, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies'> & {\n\t\tresponse: RequestError['serializedErrors']\n\t\tstatusCode: RequestError['statusCode']\n\t\tresponseHeaders: DefaultHeaders\n\t\tresponseCookies: DefaultCookies\n\t}\n>\n\nfunction makeMiddlewareHandler<Cb extends Function, T extends RouteDef>(cb: Cb, onSetup?: HandlerSetup<T>) {\n\treturn { cb, onSetup }\n}\n\nexport const makeMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<RouteMiddlewareHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\nexport const makeResponseMiddleware = <Def extends RouteDef>(\n\t...args: Parameters<typeof makeMiddlewareHandler<RouteResponseMiddlewareHandler<Def>, Def>>\n) => makeMiddlewareHandler(...args)\nexport const makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n","import type { IncomingHttpHeaders } from 'node:http2'\nimport type { Readable } from 'node:stream'\n\nimport type { SerializeOptions } from '@fastify/cookie'\nimport type { DistributiveOmit, IsInTypeList } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { AuthUser } from '../types'\nimport type { DefaultCookies, DefaultHeaders, IncomingFile, MethodsEnum, RouteDef, RouteDefToReqRes } from './types'\n\nexport type CookieVal<C extends DefaultCookies> = {\n\t[K in keyof C]: SerializeOptions & { value: C[K] }\n}\n\nexport class Request<Def extends RouteDefToReqRes<any>> {\n\treadonly ip: string | undefined\n\treadonly method: MethodsEnum\n\treadonly path: string\n\tbody: Def['body']\n\tparams: Def['params']\n\tquery: Def['query']\n\theaders: IncomingHttpHeaders & Def['requestHeaders']\n\tcookies: Record<string, string | undefined> & Def['requestCookies']\n\tauthUser: AuthUser | null = null\n\n\tconstructor({\n\t\tip,\n\t\tbody,\n\t\tcookies,\n\t\tparams,\n\t\tquery,\n\t\tmethod,\n\t\tpath,\n\t\theaders,\n\t\tfiles,\n\t}: {\n\t\tip: string | undefined\n\t\tbody: Def['body']\n\t\tparams: Def['params']\n\t\tquery: Def['query']\n\t\tcookies: Record<string, string | undefined> & Def['requestCookies']\n\t\theaders: IncomingHttpHeaders\n\t\tfiles: Record<string, IncomingFile[]>\n\t\tmethod: MethodsEnum\n\t\tpath: string\n\t\t}) {\n\t\tthis.ip = ip\n\t\tthis.method = method\n\t\tthis.path = path\n\t\tthis.params = params\n\t\tthis.cookies = cookies\n\t\tthis.headers = headers\n\t\tconst hasFiles = Object.keys(files).length > 0\n\t\tconst bodyFields = body && typeof body === 'object' && !Array.isArray(body) ? body : {}\n\t\tthis.query = query\n\t\tthis.body = <any>(hasFiles ? Object.assign({}, bodyFields, files) : body)\n\t}\n\n\tpipe(stream: Readable, opts: { headers?: Def['responseHeaders']; cookies?: Def['responseCookies']; status?: Def['statusCode'] } = {}) {\n\t\treturn new Response<Omit<Def, 'response'> & { response: Readable }>(<any>{ ...opts, piped: true, body: stream })\n\t}\n\n\tres(params: DistributiveOmit<RequestParams<Def>, 'piped'>) {\n\t\treturn new Response<Def>(<any>{ ...params, piped: false })\n\t}\n\n\terror<\n\t\tT extends Omit<Def, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies' | 'contentType'> & {\n\t\t\tresponse: RequestError['serializedErrors']\n\t\t\tstatusCode: RequestError['statusCode']\n\t\t\tresponseHeaders: DefaultHeaders\n\t\t\tresponseCookies: DefaultCookies\n\t\t\tcontentType: 'application/json'\n\t\t},\n\t>(params: DistributiveOmit<RequestParams<T>, 'piped'>) {\n\t\treturn new Response<T>(<any>{ ...params, piped: false })\n\t}\n}\n\ntype RequestParams<Def extends RouteDefToReqRes<any>, T = Def['response']> = { body: T; piped?: boolean } & (IsInTypeList<\n\tDef['statusCode'],\n\t[NonNullable<RouteDef['defaultStatusCode']>, 200]\n> extends true\n\t? { status?: Def['statusCode'] }\n\t: { status: Def['statusCode'] }) &\n\t(IsInTypeList<Def['contentType'], [NonNullable<RouteDef['defaultContentType']>, 'application/json']> extends true\n\t\t? { contentType?: Def['contentType'] }\n\t\t: { contentType: Def['contentType'] }) &\n\t(IsInTypeList<Def['responseHeaders'], [DefaultHeaders]> extends true\n\t\t? { headers?: Def['responseHeaders'] }\n\t\t: { headers: Def['responseHeaders'] }) &\n\t(IsInTypeList<Def['responseCookies'], [DefaultCookies]> extends true\n\t\t? { cookies?: CookieVal<Def['responseCookies']> }\n\t\t: { cookies: CookieVal<Def['responseCookies']> })\n\nexport class Response<Def extends RouteDefToReqRes<any>> {\n\tbody: Def['response'] | undefined\n\theaders: Def['responseHeaders']\n\tcookies: CookieVal<Def['responseCookies']>\n\treadonly status: Def['statusCode']\n\treadonly contentType: Def['contentType']\n\treadonly piped: boolean\n\n\tconstructor({\n\t\tbody,\n\t\tstatus = <any>200,\n\t\theaders = <any>{},\n\t\tcookies = <any>{},\n\t\tpiped = false,\n\t\tcontentType = <any>'application/json',\n\t}: RequestParams<Def>) {\n\t\tthis.body = body\n\t\tthis.status = status\n\t\tthis.contentType = contentType\n\t\tthis.headers = headers\n\t\tthis.cookies = cookies\n\t\tthis.piped = piped\n\n\t\tif (!this.piped) {\n\t\t\t// @ts-expect-error indexing on generic\n\t\t\tthis.headers['Content-Type'] = contentType\n\t\t}\n\t}\n\n\tget cookieValues() {\n\t\treturn Object.fromEntries(Object.entries(this.cookies).map(([key, val]) => [key, val] as const))\n\t}\n\n\tset cookieValues(values: DefaultCookies) {\n\t\tObject.entries(values).forEach(([key, val]) => {\n\t\t\t// @ts-expect-error indexing on generic\n\t\t\tif (this.cookies[key]) this.cookies[key].value = val\n\t\t})\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test } = import.meta.vitest\n\n\tdescribe('Request', () => {\n\t\ttest('preserves adapter-provided query and body values without JSON normalization', () => {\n\t\t\tconst query = {\n\t\t\t\tcount: '10',\n\t\t\t\tactive: 'true',\n\t\t\t\tfilter: '{\"name\":\"test\"}',\n\t\t\t\tquoted: '\"value\"',\n\t\t\t}\n\t\t\tconst body = {\n\t\t\t\tcount: '10',\n\t\t\t\tactive: 'false',\n\t\t\t\tpayload: '{\"nested\":true}',\n\t\t\t\tquoted: '\"value\"',\n\t\t\t}\n\n\t\t\tconst request = new Request<any>({\n\t\t\t\tip: undefined,\n\t\t\t\tbody,\n\t\t\t\tcookies: {},\n\t\t\t\tparams: {},\n\t\t\t\tquery,\n\t\t\t\tmethod: 'post',\n\t\t\t\tpath: '/items',\n\t\t\t\theaders: {},\n\t\t\t\tfiles: {},\n\t\t\t})\n\n\t\t\texpect(request.query).toEqual(query)\n\t\t\texpect(request.body).toEqual(body)\n\t\t})\n\n\t\ttest('continues merging uploaded files into body fields without parsing string fields', () => {\n\t\t\tconst file: IncomingFile = {\n\t\t\t\tname: 'avatar.png',\n\t\t\t\ttype: 'image/png',\n\t\t\t\tsize: 4,\n\t\t\t\tisTruncated: false,\n\t\t\t\tdata: Buffer.from('file'),\n\t\t\t\tduration: 0,\n\t\t\t}\n\t\t\tconst body = { metadata: '{\"alt\":\"avatar\"}' }\n\n\t\t\tconst request = new Request<any>({\n\t\t\t\tip: undefined,\n\t\t\t\tbody,\n\t\t\t\tcookies: {},\n\t\t\t\tparams: {},\n\t\t\t\tquery: {},\n\t\t\t\tmethod: 'post',\n\t\t\t\tpath: '/upload',\n\t\t\t\theaders: {},\n\t\t\t\tfiles: { avatar: [file] },\n\t\t\t})\n\n\t\t\texpect(request.body).toEqual({ metadata: '{\"alt\":\"avatar\"}', avatar: [file] })\n\t\t})\n\n\t\ttest('does not spread non-object body values when uploaded files are present', () => {\n\t\t\tconst file: IncomingFile = {\n\t\t\t\tname: 'avatar.png',\n\t\t\t\ttype: 'image/png',\n\t\t\t\tsize: 4,\n\t\t\t\tisTruncated: false,\n\t\t\t\tdata: Buffer.from('file'),\n\t\t\t\tduration: 0,\n\t\t\t}\n\n\t\t\tconst request = new Request<any>({\n\t\t\t\tip: undefined,\n\t\t\t\tbody: 'raw text body',\n\t\t\t\tcookies: {},\n\t\t\t\tparams: {},\n\t\t\t\tquery: {},\n\t\t\t\tmethod: 'post',\n\t\t\t\tpath: '/upload',\n\t\t\t\theaders: {},\n\t\t\t\tfiles: { avatar: [file] },\n\t\t\t})\n\n\t\t\texpect(request.body).toEqual({ avatar: [file] })\n\t\t})\n\t})\n}\n","import { type IncomingHttpHeaders } from 'node:http2'\n\nimport { BadRequestError, RequestError } from '../../errors'\n\nexport abstract class BaseRequestAuthMethod<T extends { id: string }> {\n\tpublic abstract parse(headers: IncomingHttpHeaders): Promise<T>\n\tpublic abstract routeSecuritySchemeName(): string | null\n\n\tstatic async process<T extends { id: string }>(methods: BaseRequestAuthMethod<T>[], headers: IncomingHttpHeaders) {\n\t\tif (methods.length === 0) return null\n\t\tlet error: Error | undefined\n\t\tfor (const method of methods) {\n\t\t\ttry {\n\t\t\t\treturn await method.parse(headers)\n\t\t\t} catch (err) {\n\t\t\t\terror = err as Error\n\t\t\t}\n\t\t}\n\t\tthrow error instanceof RequestError ? error : new BadRequestError('failed to parse auth user', error)\n\t}\n}\n","import type { IncomingHttpHeaders } from 'node:http2'\n\nimport { BaseRequestAuthMethod } from './base'\nimport { NotAuthenticatedError } from '../../errors'\n\nexport abstract class BaseApiKeyRequestAuthMethod<T extends { id: string }> extends BaseRequestAuthMethod<T> {\n\tprotected readonly headerName: string\n\tprotected abstract verify(apiKey: string): Promise<T>\n\n\tconstructor(headerName: string) {\n\t\tsuper()\n\t\tthis.headerName = headerName\n\t}\n\n\tasync parse(headers: IncomingHttpHeaders) {\n\t\tconst headerValue = headers[this.headerName]\n\t\tif (!headerValue || typeof headerValue !== 'string') throw new NotAuthenticatedError()\n\t\treturn this.verify(headerValue)\n\t}\n\n\trouteSecuritySchemeName() {\n\t\treturn this.headerName\n\t}\n}\n","import type { IncomingHttpHeaders } from 'node:http2'\n\nimport cookie from '@fastify/cookie'\nimport jwt from 'jsonwebtoken'\n\nimport { BaseRequestAuthMethod } from './base'\nimport { NotAuthenticatedError, TokenExpired } from '../../errors'\n\nexport interface BaseJwtRequestAuthMethodOptions {\n\tsigningKey: string\n\tstorageTTL: number\n\tstoragePrefix?: string\n\tenforceSingleSession?: boolean\n}\n\nexport abstract class BaseJwtRequestAuthMethod<T extends { id: string }> extends BaseRequestAuthMethod<T> {\n\tprotected readonly options: BaseJwtRequestAuthMethodOptions\n\tprotected abstract parseHeader(headers: IncomingHttpHeaders): Promise<string>\n\tprotected abstract store(key: string, token: string, ttl: number): Promise<void>\n\tprotected abstract retrieve(key: string): Promise<string | null>\n\tprotected abstract delete(key: string): Promise<void>\n\n\tconstructor(options: BaseJwtRequestAuthMethodOptions) {\n\t\tsuper()\n\t\tthis.options = options\n\t}\n\n\t#getKey(userId: string) {\n\t\treturn `${this.options.storagePrefix ?? ''}${userId}`\n\t}\n\n\tasync createToken(payload: T) {\n\t\tconst token = jwt.sign(payload, this.options.signingKey, { expiresIn: this.options.storageTTL })\n\t\tawait this.store(this.#getKey(payload.id), token, this.options.storageTTL)\n\t\treturn token\n\t}\n\n\tasync parse(headers: IncomingHttpHeaders) {\n\t\ttry {\n\t\t\tconst token = await this.parseHeader(headers)\n\t\t\tconst user = jwt.verify(token, this.options.signingKey) as T\n\t\t\tif (!user) throw new NotAuthenticatedError()\n\n\t\t\tif (this.options.enforceSingleSession) {\n\t\t\t\tconst cachedToken = await this.retrieve(this.#getKey(user.id))\n\t\t\t\tif (token && token !== cachedToken) throw new TokenExpired()\n\t\t\t}\n\n\t\t\treturn user\n\t\t} catch (err) {\n\t\t\tif (err instanceof TokenExpired) throw err\n\t\t\tif (err instanceof jwt.TokenExpiredError) throw new TokenExpired(undefined, err)\n\t\t\telse throw new NotAuthenticatedError(undefined, err)\n\t\t}\n\t}\n\n\tasync retrieveFor(userId: string) {\n\t\treturn this.retrieve(this.#getKey(userId))\n\t}\n\n\tasync deleteFor(userId: string) {\n\t\tawait this.delete(this.#getKey(userId))\n\t}\n}\n\ninterface BaseJwtHeaderRequestAuthMethodOptions<T extends string> extends BaseJwtRequestAuthMethodOptions {\n\theaderName: T\n}\n\nexport abstract class BaseJwtHeaderRequestAuthMethod<T extends { id: string }, Name extends string = string> extends BaseJwtRequestAuthMethod<T> {\n\tprotected readonly options: BaseJwtHeaderRequestAuthMethodOptions<Name>\n\n\tconstructor(options: BaseJwtHeaderRequestAuthMethodOptions<Name>) {\n\t\tsuper(options)\n\t\tthis.options = options\n\t}\n\n\tasync parseHeader(headers: IncomingHttpHeaders) {\n\t\tconst value = headers[this.options.headerName]\n\t\tif (!value || typeof value !== 'string') throw new NotAuthenticatedError()\n\t\treturn value.startsWith('Bearer ') ? value.slice(7) : value\n\t}\n\n\trouteSecuritySchemeName() {\n\t\treturn this.options.headerName\n\t}\n}\n\ninterface BaseJwtCookieRequestAuthMethodOptions<T extends string> extends BaseJwtRequestAuthMethodOptions {\n\tcookieName: T\n}\n\nexport abstract class BaseJwtCookieRequestAuthMethod<T extends { id: string }, Name extends string = string> extends BaseJwtRequestAuthMethod<T> {\n\tprotected readonly options: BaseJwtCookieRequestAuthMethodOptions<Name>\n\n\tconstructor(options: BaseJwtCookieRequestAuthMethodOptions<Name>) {\n\t\tsuper(options)\n\t\tthis.options = options\n\t}\n\n\tasync parseHeader(headers: IncomingHttpHeaders) {\n\t\tconst cookies = cookie.parse(headers.cookie || '') ?? {}\n\t\tconst value = cookies[this.options.cookieName]\n\t\tif (!value || typeof value !== 'string') throw new NotAuthenticatedError()\n\t\treturn value\n\t}\n\n\trouteSecuritySchemeName() {\n\t\treturn `cookie:${this.options.cookieName}`\n\t}\n}\n","import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/adapters/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './adapters/base'\nimport { BaseRequestAuthMethod } from './requests-auth-methods'\nimport { StatusCodes, type StatusCodesEnum } from './types'\n\nenum EmitTypes {\n\tcreated = 'created',\n\tupdated = 'updated',\n\tdeleted = 'deleted',\n}\n\nconst EmitterEvent = '__listener_emitter'\ntype EmitData = { channel: string; type: EmitTypes; after: any; before: any }\ntype LeaveRoomParams = { channel: string }\ntype JoinRoomParams = { channel: string; token?: string; query: Record<string, any> }\ntype Callback = (params: { code: StatusCodesEnum; message: string; channel: string }) => void\nexport type OnJoinFn = (\n\tdata: { channel: string; user: AuthUser | null },\n\tparams: Record<string, any>,\n\tquery: Record<string, any>,\n) => Promise<string | null>\nexport type SocketCallbacks = {\n\tonConnect: (userId: string, socketId: string) => Promise<void>\n\tonDisconnect: (userId: string, socketId: string) => Promise<void>\n}\n\nconst defaultTo = '*'\n\nexport class SocketEmitter {\n\treadonly socketInstance: Server\n\t#connectionCallbacks: SocketCallbacks = { onConnect: async () => {}, onDisconnect: async () => {} }\n\t#routes = {} as Record<string, OnJoinFn>\n\t#publish: (data: EmitData) => Promise<void> = async () => {}\n\n\tconstructor(\n\t\tsocket: Server,\n\t\tprivate config: ServerConfig,\n\t) {\n\t\tthis.socketInstance = socket\n\t\tthis.#setupSocketConnection()\n\t\tInstance.on('setup', () => {\n\t\t\tconst stream = config.eventBus?.stream(EmitterEvent as never, { fanout: true })\n\t\t\tthis.#publish = stream\n\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t}\n\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t})\n\t\t})\n\t}\n\n\tasync created<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.created, { after: data.toJSON(), before: null }, to)\n\t}\n\n\tasync updated<T extends Entity>(channels: string[], { after, before }: { after: T; before: T }, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.updated, { after: after.toJSON(), before: before.toJSON() }, to)\n\t}\n\n\tasync deleted<T extends Entity>(channels: string[], data: T, to: string | string[] | null) {\n\t\tawait this.#emit(channels, EmitTypes.deleted, { before: data.toJSON(), after: null }, to)\n\t}\n\n\tasync #emit(channels: string[], type: EmitTypes, { before, after }: { after: any; before: any }, to: string | string[] | null) {\n\t\tconst toArray = Array.isArray(to) ? to : [to ?? defaultTo]\n\t\tconst channelMap = channels.flatMap((c) => toArray.map((to) => `${to}:${c}`))\n\t\tawait Promise.all(channelMap.map(async (channel) => this.#publish({ channel, type, before, after })))\n\t}\n\n\tset connectionCallbacks(callbacks: SocketCallbacks) {\n\t\tthis.#connectionCallbacks = callbacks\n\t\tthis.#setupSocketConnection()\n\t}\n\n\tregister(channel: string, onJoin: OnJoinFn) {\n\t\tthis.#routes[channel] = onJoin\n\t\tthis.#routes[channel + '/:id'] = onJoin\n\t\treturn this\n\t}\n\n\t#getConfig(channel: string) {\n\t\tconst matcher = (key: string) => Match(key)(channel)\n\t\tconst matchedChannel = Object.keys(this.#routes).find(matcher) ?? null\n\t\tif (!matchedChannel) return null\n\t\tconst match = matcher(matchedChannel)\n\t\tif (!match) return null\n\t\treturn {\n\t\t\tconfig: this.#routes[matchedChannel],\n\t\t\tparams: match.params,\n\t\t}\n\t}\n\n\t#setupSocketConnection = () => {\n\t\tthis.socketInstance.removeAllListeners('connection')\n\t\tthis.socketInstance.on('connection', async (socket) => {\n\t\t\tconst socketId = socket.id\n\t\t\tconst user = await BaseRequestAuthMethod.process(this.config.socketsAuthMethods, socket.handshake.headers).catch(() => null)\n\t\t\tsocket.on('leave', async (data: LeaveRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tsocket.leave(data.channel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: data.channel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tsocket.on('join', async (data: JoinRoomParams, callback: Callback) => {\n\t\t\t\tif (!data.channel)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.ValidationError,\n\t\t\t\t\t\t\tmessage: 'channel is required',\n\t\t\t\t\t\t\tchannel: '',\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst channel = data.channel\n\t\t\t\tconst route = this.#getConfig(channel) ?? null\n\t\t\t\tif (!route)\n\t\t\t\t\treturn (\n\t\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\t\tcallback({\n\t\t\t\t\t\t\tcode: StatusCodes.BadRequest,\n\t\t\t\t\t\t\tmessage: 'unknown channel',\n\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\tconst to = await route.config({ channel, user }, route.params, data.query ?? {})\n\t\t\t\tconst newChannel = `${to ?? defaultTo}:${channel}`\n\t\t\t\tsocket.join(newChannel)\n\t\t\t\treturn (\n\t\t\t\t\ttypeof callback === 'function' &&\n\t\t\t\t\tcallback({\n\t\t\t\t\t\tcode: StatusCodes.Ok,\n\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\tchannel: newChannel,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t})\n\t\t\tif (user) await this.#connectionCallbacks.onConnect(user.id, socketId)\n\t\t\tsocket.on('disconnect', async () => {\n\t\t\t\tif (user) await this.#connectionCallbacks.onDisconnect(user.id, socketId)\n\t\t\t})\n\t\t})\n\t}\n}\n","import { NotAuthenticatedError } from '../../errors'\nimport type { AuthUser } from '../../types'\nimport { BaseRequestAuthMethod } from '../requests-auth-methods'\nimport { makeMiddleware } from '../types'\n\nexport const requireAuthUser = (methods: BaseRequestAuthMethod<AuthUser>[]) =>\n\tmakeMiddleware(\n\t\tasync (request) => {\n\t\t\trequest.authUser = await BaseRequestAuthMethod.process(methods, request.headers)\n\t\t\tif (!request.authUser) throw new NotAuthenticatedError()\n\t\t},\n\t\t(route) => {\n\t\t\troute.security ??= []\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst schemeName = method.routeSecuritySchemeName()\n\t\t\t\tif (schemeName) route.security.push({ [schemeName]: [] })\n\t\t\t}\n\n\t\t\troute.descriptions ??= []\n\t\t\troute.descriptions.push('Requires a valid means of authentication.')\n\t\t},\n\t)\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class BadRequestError extends RequestError {\n\tstatusCode = StatusCodes.BadRequest\n\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class NotAuthenticatedError extends RequestError {\n\tstatusCode = StatusCodes.NotAuthenticated\n\n\tconstructor(message = 'Not authenticated', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class NotAuthorizedError extends RequestError {\n\tstatusCode = StatusCodes.NotAuthorized\n\n\tconstructor(message = 'Not authorized', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class NotFoundError extends RequestError {\n\tstatusCode = StatusCodes.NotFound\n\n\tconstructor(message = 'Not found', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class PreconditionRequiredError extends RequestError {\n\tstatusCode = StatusCodes.PreconditionRequired\n\n\tconstructor(message = 'Precondition required', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\nexport class TokenExpired extends RequestError {\n\tstatusCode = StatusCodes.TokenExpired\n\n\tconstructor(message = 'Token expired', cause?: unknown) {\n\t\tsuper(message, [{ message }], cause)\n\t}\n}\n","import { StatusCodes } from '../../server'\nimport { RequestError } from '../requestError'\n\ntype ValidError = {\n\tmessages: string[]\n\tfield: string\n}\n\nexport class ValidationError extends RequestError {\n\tstatusCode = StatusCodes.ValidationError\n\n\tconstructor(errors: ValidError[], cause?: unknown) {\n\t\tsuper(\n\t\t\t'Unprocessable Entity',\n\t\t\terrors.flatMap(({ field, messages }) => messages.map((message) => ({ message, field }))),\n\t\t\tcause,\n\t\t)\n\t}\n}\n","export type HookEvent = 'setup' | 'start' | 'close'\nexport type HookCb = Promise<unknown | void> | (() => void | unknown | Promise<void | unknown>)\n\nexport type ClassRef = Function & { prototype: unknown; name: string }\nexport type HookOptions = {\n\tclass?: ClassRef\n\tafter?: ClassRef[]\n}\nexport type HookRecord = { cb: HookCb; class?: ClassRef; after: ClassRef[] }\n\nexport function registerHook(hooks: HookRecord[], record: HookRecord): void {\n\tfor (const dep of record.after) {\n\t\tif (!hooks.some((h) => h.class === dep)) {\n\t\t\tconst depName = dep.name || 'unknown'\n\t\t\tconst ownerName = record.class?.name || 'anonymous'\n\t\t\tthrow new Error(`Missing dependency: ${ownerName} declares after: [${depName}], but ${depName} is not registered`)\n\t\t}\n\t}\n\n\tif (record.class) {\n\t\tconst tentative = [...hooks, record]\n\t\tdetectCycle(tentative)\n\t}\n\n\thooks.push(record)\n}\n\nfunction detectCycle(hooks: HookRecord[]): void {\n\tconst classToAfter = new Map<ClassRef, ClassRef[]>()\n\tfor (const h of hooks) {\n\t\tif (!h.class) continue\n\t\tconst existing = classToAfter.get(h.class)\n\t\tif (existing) {\n\t\t\tfor (const dep of h.after) {\n\t\t\t\tif (!existing.includes(dep)) existing.push(dep)\n\t\t\t}\n\t\t} else {\n\t\t\tclassToAfter.set(h.class, [...h.after])\n\t\t}\n\t}\n\n\tconst visited = new Set<ClassRef>()\n\tconst stack = new Set<ClassRef>()\n\n\tfunction visit(cls: ClassRef, path: ClassRef[]): void {\n\t\tif (stack.has(cls)) {\n\t\t\tconst cycleStart = path.indexOf(cls)\n\t\t\tconst cycle = [...path.slice(cycleStart), cls]\n\t\t\tconst names = cycle.map((c) => c.name || 'unknown')\n\t\t\tthrow new Error(`Cycle detected: ${names.join(' → ')}`)\n\t\t}\n\t\tif (visited.has(cls)) return\n\t\tstack.add(cls)\n\t\tpath.push(cls)\n\t\tfor (const dep of classToAfter.get(cls) ?? []) {\n\t\t\tvisit(dep, path)\n\t\t}\n\t\tpath.pop()\n\t\tstack.delete(cls)\n\t\tvisited.add(cls)\n\t}\n\n\tfor (const cls of classToAfter.keys()) {\n\t\tvisit(cls, [])\n\t}\n}\n\nexport type HookLayer = HookRecord[]\n\nexport function resolveHookDAG(hooks: HookRecord[], invert: boolean = false): HookLayer[] {\n\tif (hooks.length === 0) return []\n\n\tconst classToHooks = new Map<ClassRef, HookRecord[]>()\n\tconst anonymous: HookRecord[] = []\n\n\tfor (const h of hooks) {\n\t\tif (h.class) {\n\t\t\tconst list = classToHooks.get(h.class)\n\t\t\tif (list) list.push(h)\n\t\t\telse classToHooks.set(h.class, [h])\n\t\t} else {\n\t\t\tanonymous.push(h)\n\t\t}\n\t}\n\n\tconst classes = [...classToHooks.keys()]\n\n\tconst inDegree = new Map<ClassRef, number>()\n\tconst graph = new Map<ClassRef, ClassRef[]>()\n\n\tfor (const cls of classes) {\n\t\tinDegree.set(cls, 0)\n\t\tgraph.set(cls, [])\n\t}\n\n\tfor (const h of hooks) {\n\t\tif (!h.class) continue\n\t\tfor (const dep of h.after) {\n\t\t\tconst [from, to] = invert ? [h.class, dep] : [dep, h.class]\n\t\t\tconst edges = graph.get(from)!\n\t\t\tif (!edges.includes(to)) {\n\t\t\t\tedges.push(to)\n\t\t\t\tinDegree.set(to, inDegree.get(to)! + 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst layers: HookLayer[] = []\n\tlet queue = classes.filter((c) => inDegree.get(c) === 0)\n\n\twhile (queue.length > 0) {\n\t\tconst layer: HookRecord[] = []\n\t\tconst next: ClassRef[] = []\n\n\t\tfor (const cls of queue) {\n\t\t\tlayer.push(...(classToHooks.get(cls) ?? []))\n\t\t}\n\t\tlayers.push(layer)\n\n\t\tfor (const cls of queue) {\n\t\t\tfor (const neighbor of graph.get(cls) ?? []) {\n\t\t\t\tconst d = inDegree.get(neighbor)! - 1\n\t\t\t\tinDegree.set(neighbor, d)\n\t\t\t\tif (d === 0) next.push(neighbor)\n\t\t\t}\n\t\t}\n\n\t\tqueue = next\n\t}\n\n\tif (anonymous.length > 0) {\n\t\tconst anonWithDeps = anonymous.filter((h) => h.after.length > 0)\n\t\tconst anonWithoutDeps = anonymous.filter((h) => h.after.length === 0)\n\n\t\tif (anonWithDeps.length > 0) {\n\t\t\tlet maxLayer = -1\n\t\t\tfor (const h of anonWithDeps) {\n\t\t\t\tfor (const dep of h.after) {\n\t\t\t\t\tconst depLayer = layers.findIndex((l) => l.some((r) => r.class === dep))\n\t\t\t\t\tif (depLayer > maxLayer) maxLayer = depLayer\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst insertAt = maxLayer + 1\n\t\t\tif (insertAt < layers.length) {\n\t\t\t\tlayers[insertAt].push(...anonWithDeps)\n\t\t\t} else {\n\t\t\t\tlayers.push(anonWithDeps)\n\t\t\t}\n\t\t}\n\n\t\tif (anonWithoutDeps.length > 0) {\n\t\t\tif (layers.length > 0) {\n\t\t\t\tlayers[layers.length - 1].push(...anonWithoutDeps)\n\t\t\t} else {\n\t\t\t\tlayers.push(anonWithoutDeps)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn layers\n}\n\nexport async function runHooks(\n\thooks: HookRecord[],\n\tonError: (error: Error) => void = (error) => {\n\t\tthrow error\n\t},\n\tinvert: boolean = false,\n) {\n\tconst layers = resolveHookDAG(hooks, invert)\n\tfor (const layer of layers)\n\t\tawait Promise.all(\n\t\t\tlayer.map(async (h) => {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof h.cb === 'function') return await h.cb()\n\t\t\t\t\treturn await h.cb\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn onError(error instanceof Error ? error : new Error(`${error}`))\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect } = import.meta.vitest\n\n\tclass A {}\n\tclass B {}\n\tclass C {}\n\tclass D {}\n\n\tconst noop = () => {}\n\n\tdescribe('registerHook', () => {\n\t\ttest('registers a hook with no dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\texpect(hooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('throws on missing dependency', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: B, after: [A] })).toThrow(/Missing dependency.*B.*A/)\n\t\t})\n\n\t\ttest('throws on cycle: A→B→A', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, class: B, after: [A] })\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: A, after: [B] })).toThrow(/Cycle detected/)\n\t\t})\n\n\t\ttest('throws on transitive cycle: A→B→C→A', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, class: B, after: [A] })\n\t\t\tregisterHook(hooks, { cb: noop, class: C, after: [B] })\n\t\t\texpect(() => registerHook(hooks, { cb: noop, class: A, after: [C] })).toThrow(/Cycle detected/)\n\t\t})\n\n\t\ttest('allows anonymous hooks with dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\tregisterHook(hooks, { cb: noop, class: A, after: [] })\n\t\t\tregisterHook(hooks, { cb: noop, after: [A] })\n\t\t\texpect(hooks).toHaveLength(2)\n\t\t})\n\n\t\ttest('anonymous hook throws on missing dependency', () => {\n\t\t\tconst hooks: HookRecord[] = []\n\t\t\texpect(() => registerHook(hooks, { cb: noop, after: [A] })).toThrow(/Missing dependency.*anonymous.*A/)\n\t\t})\n\t})\n\n\tdescribe('resolveHookDAG', () => {\n\t\ttest('linear chain: A → B → C', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t\texpect(layers[1].every((h) => h.class === B)).toBe(true)\n\t\t\texpect(layers[2].every((h) => h.class === C)).toBe(true)\n\t\t})\n\n\t\ttest('fan-out: A → B, A → C (B and C are parallel)', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t\tconst secondClasses = layers[1].map((h) => h.class)\n\t\t\texpect(secondClasses).toContain(B)\n\t\t\texpect(secondClasses).toContain(C)\n\t\t})\n\n\t\ttest('fan-in: B → D, C → D', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: B, after: [] },\n\t\t\t\t{ cb: noop, class: C, after: [] },\n\t\t\t\t{ cb: noop, class: D, after: [B, C] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst firstClasses = layers[0].map((h) => h.class)\n\t\t\texpect(firstClasses).toContain(B)\n\t\t\texpect(firstClasses).toContain(C)\n\t\t\texpect(layers[1].every((h) => h.class === D)).toBe(true)\n\t\t})\n\n\t\ttest('diamond: A → B, A → C, B → D, C → D', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t\t{ cb: noop, class: D, after: [B, C] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0][0].class).toBe(A)\n\t\t\tconst midClasses = layers[1].map((h) => h.class)\n\t\t\texpect(midClasses).toContain(B)\n\t\t\texpect(midClasses).toContain(C)\n\t\t\texpect(layers[2][0].class).toBe(D)\n\t\t})\n\n\t\ttest('close-event inversion reverses the graph', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks, true)\n\t\t\texpect(layers).toHaveLength(3)\n\t\t\texpect(layers[0].every((h) => h.class === C)).toBe(true)\n\t\t\texpect(layers[1].every((h) => h.class === B)).toBe(true)\n\t\t\texpect(layers[2].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('close inversion: fan-out becomes fan-in', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks, true)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst firstClasses = layers[0].map((h) => h.class)\n\t\t\texpect(firstClasses).toContain(B)\n\t\t\texpect(firstClasses).toContain(C)\n\t\t\texpect(layers[1].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('multiple hooks per class are all in the same layer', () => {\n\t\t\tconst cb1 = () => {}\n\t\t\tconst cb2 = () => {}\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: cb1, class: A, after: [] },\n\t\t\t\t{ cb: cb2, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\texpect(layers[0]).toHaveLength(2)\n\t\t\texpect(layers[0].every((h) => h.class === A)).toBe(true)\n\t\t})\n\n\t\ttest('anonymous hooks without deps run at deepest level', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, after: [] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\texpect(layers).toHaveLength(2)\n\t\t\tconst lastLayer = layers[layers.length - 1]\n\t\t\texpect(lastLayer.some((h) => h.class === undefined)).toBe(true)\n\t\t})\n\n\t\ttest('anonymous hooks with deps run after their dependencies', () => {\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: noop, class: A, after: [] },\n\t\t\t\t{ cb: noop, class: B, after: [A] },\n\t\t\t\t{ cb: noop, class: C, after: [B] },\n\t\t\t\t{ cb: noop, after: [A] },\n\t\t\t]\n\t\t\tconst layers = resolveHookDAG(hooks)\n\t\t\tconst anonLayer = layers.findIndex((l) => l.some((h) => h.class === undefined))\n\t\t\tconst aLayer = layers.findIndex((l) => l.some((h) => h.class === A))\n\t\t\texpect(anonLayer).toBeGreaterThan(aLayer)\n\t\t})\n\n\t\ttest('empty hooks returns empty layers', () => {\n\t\t\texpect(resolveHookDAG([])).toEqual([])\n\t\t})\n\t})\n\n\tdescribe('runHooks', () => {\n\t\ttest('same-depth siblings observably overlap', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('B-start')\n\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 20))\n\t\t\t\t\t\tlog.push('B-end')\n\t\t\t\t\t},\n\t\t\t\t\tclass: B,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('C-start')\n\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 20))\n\t\t\t\t\t\tlog.push('C-end')\n\t\t\t\t\t},\n\t\t\t\t\tclass: C,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log[0]).toBe('B-start')\n\t\t\texpect(log[1]).toBe('C-start')\n\t\t})\n\n\t\ttest('different depths run sequentially', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('A')\n\t\t\t\t\t},\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tcb: async () => {\n\t\t\t\t\t\tlog.push('B')\n\t\t\t\t\t},\n\t\t\t\t\tclass: B,\n\t\t\t\t\tafter: [A],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log).toEqual(['A', 'B'])\n\t\t})\n\n\t\ttest('close inversion runs hooks in reverse dependency order', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{ cb: async () => log.push('A'), class: A, after: [] },\n\t\t\t\t{ cb: async () => log.push('B'), class: B, after: [A] },\n\t\t\t\t{ cb: async () => log.push('C'), class: C, after: [B] },\n\t\t\t]\n\t\t\tawait runHooks(hooks, undefined, true)\n\t\t\texpect(log).toEqual(['C', 'B', 'A'])\n\t\t})\n\n\t\ttest('errors are routed to onError handler', async () => {\n\t\t\tconst errors: Error[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: () => {\n\t\t\t\t\t\tthrow new Error('boom')\n\t\t\t\t\t},\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks, (e) => {\n\t\t\t\terrors.push(e)\n\t\t\t})\n\t\t\texpect(errors).toHaveLength(1)\n\t\t\texpect(errors[0].message).toBe('boom')\n\t\t})\n\n\t\ttest('raw promise callbacks are awaited', async () => {\n\t\t\tconst log: string[] = []\n\t\t\tconst hooks: HookRecord[] = [\n\t\t\t\t{\n\t\t\t\t\tcb: Promise.resolve().then(() => log.push('resolved')),\n\t\t\t\t\tclass: A,\n\t\t\t\t\tafter: [],\n\t\t\t\t},\n\t\t\t]\n\t\t\tawait runHooks(hooks)\n\t\t\texpect(log).toContain('resolved')\n\t\t})\n\t})\n}\n","import { type ConditionalObjectKeys, type PipeInput, type PipeOutput, v } from 'valleyed'\n\nexport const instanceSettingsPipe = () =>\n\tv.object({\n\t\tapp: v.object({\n\t\t\tname: v.string(),\n\t\t}),\n\t\tlog: v.defaults(\n\t\t\tv.object({\n\t\t\t\tlevel: v.defaults(v.in(['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'] as const), 'info'),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t\tutils: v.defaults(\n\t\t\tv.object({\n\t\t\t\thashSaltRounds: v.defaults(v.number(), 10),\n\t\t\t\tpaginationDefaultLimit: v.defaults(v.number(), 100),\n\t\t\t\tmaxFileUploadSizeInMb: v.defaults(v.number(), 500),\n\t\t\t}),\n\t\t\t{},\n\t\t),\n\t})\n\nexport type Settings = PipeOutput<ReturnType<typeof instanceSettingsPipe>>\nexport type SettingsInput = ConditionalObjectKeys<PipeInput<ReturnType<typeof instanceSettingsPipe>>>\n"],"mappings":"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","names":["PipeError","v","v","v","schema","jsonPath","to","v","ensureTestInstance","createRawResponse","Request","v","v","v","err","PipeError","v","v"]}