equipped 5.3.0-alpha.0 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/server/adapters/express/index.cjs +312 -4
  3. package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
  4. package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
  5. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
  6. package/dist/cjs/server/adapters/fastify/index.cjs +315 -4
  7. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
  8. package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
  9. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
  10. package/dist/cjs/server/index.cjs +261 -4
  11. package/dist/cjs/server/index.cjs.map +1 -1
  12. package/dist/cjs/server/index.min.cjs +7 -7
  13. package/dist/cjs/server/index.min.cjs.map +1 -1
  14. package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
  15. package/dist/esm/cache/adapters/in-memory/index.mjs +2 -2
  16. package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
  17. package/dist/esm/cache/adapters/redis/index.mjs +3 -3
  18. package/dist/esm/cache/index.min.mjs +1 -1
  19. package/dist/esm/cache/index.mjs +2 -2
  20. package/dist/esm/{chunk-AUKXL4EA.min.mjs → chunk-2GGMLKRP.min.mjs} +2 -2
  21. package/dist/esm/{chunk-TWKHVLLT.mjs → chunk-3TP7NINX.mjs} +2 -2
  22. package/dist/esm/{chunk-RIRBNBTC.mjs → chunk-5PZACGPI.mjs} +3 -3
  23. package/dist/esm/{chunk-OXI6IKAM.min.mjs → chunk-676VIABN.min.mjs} +2 -2
  24. package/dist/esm/{chunk-I4BB436E.mjs → chunk-7CP7ZE2O.mjs} +2 -2
  25. package/dist/esm/{chunk-YTM6ZURZ.min.mjs → chunk-7NF7PV6S.min.mjs} +2 -2
  26. package/dist/esm/{chunk-WHIWTP2Z.min.mjs → chunk-7SQ5JQYR.min.mjs} +2 -2
  27. package/dist/esm/{chunk-2TCFNKRZ.mjs → chunk-A4P7P6BU.mjs} +262 -5
  28. package/dist/esm/chunk-A4P7P6BU.mjs.map +1 -0
  29. package/dist/esm/{chunk-KW3PBDFD.mjs → chunk-BWUFPMVG.mjs} +2 -2
  30. package/dist/esm/{chunk-YTHRK2PO.mjs → chunk-HXFNN6RI.mjs} +3 -3
  31. package/dist/esm/chunk-IN5YKIJ7.min.mjs +32 -0
  32. package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +1 -0
  33. package/dist/esm/{chunk-ECBJ3NT3.min.mjs → chunk-IRYCN6PI.min.mjs} +2 -2
  34. package/dist/esm/{chunk-IEBC3OWN.mjs → chunk-LKS5ZE45.mjs} +2 -2
  35. package/dist/esm/{chunk-6DW4GW3R.min.mjs → chunk-MQXTTWPS.min.mjs} +2 -2
  36. package/dist/esm/{chunk-MYGAF2AC.min.mjs → chunk-P4PRHHIY.min.mjs} +2 -2
  37. package/dist/esm/{chunk-6SB5M4XH.mjs → chunk-TSVHZZE4.mjs} +3 -3
  38. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
  39. package/dist/esm/dbs/adapters/mongodb/index.mjs +3 -3
  40. package/dist/esm/dbs/index.min.mjs +1 -1
  41. package/dist/esm/dbs/index.mjs +3 -3
  42. package/dist/esm/errors/index.min.mjs +1 -1
  43. package/dist/esm/errors/index.mjs +1 -1
  44. package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
  45. package/dist/esm/events/adapters/kafka/index.mjs +2 -2
  46. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
  47. package/dist/esm/events/adapters/rabbitmq/index.mjs +1 -1
  48. package/dist/esm/index.min.mjs +1 -1
  49. package/dist/esm/index.mjs +1 -1
  50. package/dist/esm/instance/index.min.mjs +1 -1
  51. package/dist/esm/instance/index.mjs +1 -1
  52. package/dist/esm/introspection-THKMXV5V.min.mjs +2 -0
  53. package/dist/esm/{introspection-Y7EXSYPD.mjs → introspection-YJF3QAUK.mjs} +3 -3
  54. package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
  55. package/dist/esm/jobs/adapters/redis/index.mjs +3 -3
  56. package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
  57. package/dist/esm/orm/adapters/in-memory/index.mjs +3 -3
  58. package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
  59. package/dist/esm/orm/adapters/json/index.mjs +3 -3
  60. package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
  61. package/dist/esm/orm/adapters/mongodb/index.mjs +2 -2
  62. package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
  63. package/dist/esm/orm/adapters/postgresql/index.mjs +3 -3
  64. package/dist/esm/orm/index.min.mjs +1 -1
  65. package/dist/esm/orm/index.mjs +3 -3
  66. package/dist/esm/server/adapters/express/index.min.mjs +1 -1
  67. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
  68. package/dist/esm/server/adapters/express/index.mjs +52 -1
  69. package/dist/esm/server/adapters/express/index.mjs.map +1 -1
  70. package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
  71. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
  72. package/dist/esm/server/adapters/fastify/index.mjs +55 -1
  73. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
  74. package/dist/esm/server/index.min.mjs +1 -1
  75. package/dist/esm/server/index.mjs +1 -1
  76. package/dist/esm/utilities/index.min.mjs +1 -1
  77. package/dist/esm/utilities/index.mjs +1 -1
  78. package/dist/esm/validations/index.min.mjs +1 -1
  79. package/dist/esm/validations/index.mjs +1 -1
  80. package/dist/types/{base-3PpBAx1K.d.ts → base-BDTBLZ9a.d.ts} +26 -2
  81. package/dist/types/cache/adapters/in-memory/index.js +2 -2
  82. package/dist/types/cache/adapters/redis/index.js +3 -3
  83. package/dist/types/cache/index.js +2 -2
  84. package/dist/types/{chunk-H6JBLKX5.js → chunk-4DH3POYM.js} +2 -2
  85. package/dist/types/{chunk-XOU2A2Y6.js → chunk-55CTVK7R.js} +1 -1
  86. package/dist/types/{chunk-A2MRYMCA.js → chunk-5Z26ZURE.js} +1 -1
  87. package/dist/types/{chunk-JZ2JTENY.js → chunk-IZDJDGOV.js} +2 -2
  88. package/dist/types/{chunk-IAHTILKJ.js → chunk-J3TGB5YQ.js} +1 -1
  89. package/dist/types/{chunk-LWUMIHL4.js → chunk-LPB5LS7A.js} +1 -1
  90. package/dist/types/{chunk-32DMHN3G.js → chunk-TT5EORDK.js} +261 -4
  91. package/dist/types/{chunk-4LRJJSGG.js → chunk-YLJNBL6J.js} +2 -2
  92. package/dist/types/dbs/adapters/mongodb/index.js +3 -3
  93. package/dist/types/dbs/index.js +3 -3
  94. package/dist/types/errors/index.js +1 -1
  95. package/dist/types/events/adapters/kafka/index.js +2 -2
  96. package/dist/types/events/adapters/rabbitmq/index.js +1 -1
  97. package/dist/types/index.js +1 -1
  98. package/dist/types/instance/index.js +1 -1
  99. package/dist/types/{introspection-ZQCAW254.js → introspection-EHGM4RMO.js} +2 -2
  100. package/dist/types/jobs/adapters/redis/index.js +3 -3
  101. package/dist/types/orm/adapters/in-memory/index.js +3 -3
  102. package/dist/types/orm/adapters/json/index.js +3 -3
  103. package/dist/types/orm/adapters/mongodb/index.js +2 -2
  104. package/dist/types/orm/adapters/postgresql/index.js +3 -3
  105. package/dist/types/orm/index.js +3 -3
  106. package/dist/types/server/adapters/express/index.d.ts +3 -1
  107. package/dist/types/server/adapters/express/index.js +52 -1
  108. package/dist/types/server/adapters/fastify/index.d.ts +3 -1
  109. package/dist/types/server/adapters/fastify/index.js +55 -1
  110. package/dist/types/server/index.d.ts +2 -2
  111. package/dist/types/server/index.js +1 -1
  112. package/dist/types/utilities/index.js +1 -1
  113. package/dist/types/validations/index.js +1 -1
  114. package/package.json +2 -4
  115. package/dist/esm/chunk-2TCFNKRZ.mjs.map +0 -1
  116. package/dist/esm/chunk-LTDVZJYJ.min.mjs +0 -32
  117. package/dist/esm/chunk-LTDVZJYJ.min.mjs.map +0 -1
  118. package/dist/esm/introspection-GP3G26B6.min.mjs +0 -2
  119. /package/dist/esm/{chunk-AUKXL4EA.min.mjs.map → chunk-2GGMLKRP.min.mjs.map} +0 -0
  120. /package/dist/esm/{chunk-TWKHVLLT.mjs.map → chunk-3TP7NINX.mjs.map} +0 -0
  121. /package/dist/esm/{chunk-RIRBNBTC.mjs.map → chunk-5PZACGPI.mjs.map} +0 -0
  122. /package/dist/esm/{chunk-OXI6IKAM.min.mjs.map → chunk-676VIABN.min.mjs.map} +0 -0
  123. /package/dist/esm/{chunk-I4BB436E.mjs.map → chunk-7CP7ZE2O.mjs.map} +0 -0
  124. /package/dist/esm/{chunk-YTM6ZURZ.min.mjs.map → chunk-7NF7PV6S.min.mjs.map} +0 -0
  125. /package/dist/esm/{chunk-WHIWTP2Z.min.mjs.map → chunk-7SQ5JQYR.min.mjs.map} +0 -0
  126. /package/dist/esm/{chunk-KW3PBDFD.mjs.map → chunk-BWUFPMVG.mjs.map} +0 -0
  127. /package/dist/esm/{chunk-YTHRK2PO.mjs.map → chunk-HXFNN6RI.mjs.map} +0 -0
  128. /package/dist/esm/{chunk-ECBJ3NT3.min.mjs.map → chunk-IRYCN6PI.min.mjs.map} +0 -0
  129. /package/dist/esm/{chunk-IEBC3OWN.mjs.map → chunk-LKS5ZE45.mjs.map} +0 -0
  130. /package/dist/esm/{chunk-6DW4GW3R.min.mjs.map → chunk-MQXTTWPS.min.mjs.map} +0 -0
  131. /package/dist/esm/{chunk-MYGAF2AC.min.mjs.map → chunk-P4PRHHIY.min.mjs.map} +0 -0
  132. /package/dist/esm/{chunk-6SB5M4XH.mjs.map → chunk-TSVHZZE4.mjs.map} +0 -0
  133. /package/dist/esm/{introspection-GP3G26B6.min.mjs.map → introspection-THKMXV5V.min.mjs.map} +0 -0
  134. /package/dist/esm/{introspection-Y7EXSYPD.mjs.map → introspection-YJF3QAUK.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"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/utilities/authProviders.ts","../../src/utilities/configurable.ts","../../src/utilities/hash.ts","../../src/utilities/json.ts","../../src/utilities/media.ts","../../src/utilities/random.ts","../../src/utilities/retry.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/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 type http 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 { type 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 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\n\tprotected abstract parseRequest(req: any): Promise<Request<any>>\n\tprotected abstract handleResponse(res: any, response: Response<any>): Promise<void>\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\ttest(): TestAgent {\n\t\treturn supertest(this.#httpServer)\n\t}\n\n\tasync start(): Promise<boolean> {\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) => {\n\t\t\tconst request = await this.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\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\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\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","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\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 axios from 'axios'\nimport jwt from 'jsonwebtoken'\nimport jwksClient from 'jwks-rsa'\n\nimport { EquippedError } from '../errors'\n\nexport const signinWithGoogle = async (idToken: string) => {\n\tconst authUrl = `https://oauth2.googleapis.com/tokeninfo?id_token=${idToken}`\n\tconst { data } = await axios.get(authUrl).catch((err) => {\n\t\tthrow new EquippedError('Failed to sign in with google', { idToken }, err)\n\t})\n\tdata.first_name = data.given_name\n\tdata.last_name = data.family_name\n\treturn data as {\n\t\temail: string\n\t\temail_verified: 'true' | 'false'\n\t\tfirst_name: string\n\t\tlast_name: string\n\t\tpicture: string\n\t\tsub: string\n\t} & Record<string, any>\n}\n\nexport const signinWithApple = async (idToken: string) => {\n\ttry {\n\t\tconst APPLE_BASE = 'https://appleid.apple.com'\n\t\tconst json = jwt.decode(idToken, { complete: true })\n\t\tif (!json?.header) throw new EquippedError('Missing JWT header', { idToken, json })\n\t\tconst { kid, alg } = json.header\n\t\tconst publicKey = await jwksClient({ jwksUri: `${APPLE_BASE}/auth/keys`, cache: true })\n\t\t\t.getSigningKey(kid)\n\t\t\t.then((key) => key.getPublicKey())\n\t\t\t.catch(() => null)\n\t\tif (!publicKey) throw new EquippedError('no publicKey', { idToken, publicKey, json })\n\t\tconst data = jwt.verify(idToken, publicKey, { algorithms: [alg as any] }) as Record<string, any>\n\t\tif (!data) throw new EquippedError('no data', { idToken, data })\n\t\tif (data.iss !== APPLE_BASE) throw new EquippedError('iss doesnt match', { idToken, data })\n\t\tif (data.exp * 1000 < Date.now()) throw new EquippedError('expired idToken', { idToken, data })\n\t\t// TODO: Find out how to get profile data from api\n\t\treturn data as {\n\t\t\temail?: string\n\t\t\tsub: string\n\t\t\temail_verified?: 'true' | 'false'\n\t\t\tis_private_email?: 'true' | 'false'\n\t\t} & Record<string, any>\n\t} catch (err) {\n\t\tthrow new EquippedError('Failed to sign in with apple', { idToken }, err)\n\t}\n}\n\nexport const signinWithFacebook = async (accessToken: string, fields = [] as string[]) => {\n\tfields = [...new Set([...fields, 'name', 'picture', 'email'])]\n\tconst { data } = await axios\n\t\t.request({\n\t\t\tmethod: 'get',\n\t\t\turl: 'https://graph.facebook.com/v15.0/me',\n\t\t\tparams: {\n\t\t\t\tfields: fields.join(','),\n\t\t\t\taccess_token: accessToken,\n\t\t\t},\n\t\t})\n\t\t.catch((err) => {\n\t\t\tthrow new EquippedError('Failed to sign in with facebook', { accessToken, fields }, err)\n\t\t})\n\tconst isValidData = fields.every((key) => key in data)\n\tif (!isValidData) throw new EquippedError('Incomplete scope for access token', { accessToken, fields, data })\n\tdata.email_verified = 'true'\n\treturn data as {\n\t\tid: string\n\t\temail: string\n\t\temail_verified: 'true' | 'false'\n\t\tname: string\n\t\tpicture: {\n\t\t\tdata: { height: number; is_silhouette: boolean; url: string; width: number }\n\t\t}\n\t} & Record<string, any>\n}\n","import { v, type ConditionalObjectKeys, type Pipe, type PipeInput, type PipeOutput } from 'valleyed'\n\ntype CtorParams<T> = ConstructorParameters<T & (abstract new (...args: any[]) => any)>\ntype BaseCtorParams<T> = T extends abstract new (...args: infer A) => any ? A : never\n\nexport function configurable<P extends Pipe<any, any>, Base extends abstract new (...args: any[]) => any>(pipeFn: () => P, base: Base) {\n\tconst pipe = pipeFn()\n\tv.compile(pipe)\n\n\tabstract class Configurable extends (base as unknown as new (...args: any[]) => any) {\n\t\tdeclare static readonly Config: PipeOutput<P>\n\n\t\tprotected constructor (protected readonly config: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) {\n\t\t\t// eslint-disable-next-line constructor-super\n\t\t\tsuper(...baseArgs)\n\t\t}\n\n\t\tstatic create<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype'] {\n\t\t\tconst r = v.validate(pipe, input)\n\t\t\tif (!r.valid) throw r.error\n\t\t\treturn new (this as any)(r.value, ...args) as This['prototype']\n\t\t}\n\t}\n\n\treturn Configurable as unknown as (abstract new (validated: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) => InstanceType<Base> & { readonly config: PipeOutput<P> }) & {\n\t\treadonly Config: PipeOutput<P>\n\t\tcreate<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype']\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf } = import.meta.vitest\n\tconst { v } = await import('valleyed')\n\n\tconst testPipe = () =>\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.number(),\n\t\t})\n\n\ttype TestConfig = PipeOutput<ReturnType<typeof testPipe>>\n\n\tclass TestBase {\n\t\tbaseValue: string\n\t\tconstructor() {\n\t\t\tthis.baseValue = 'base'\n\t\t}\n\t}\n\n\tclass TestBaseWithArgs {\n\t\tlabel: string\n\t\tconstructor(label: string) {\n\t\t\tthis.label = label\n\t\t}\n\t}\n\n\tdescribe('configurable', () => {\n\t\ttest('validation runs in static create before constructor body executes', () => {\n\t\t\tlet constructorRan = false\n\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tconstructorRan = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpect(() => MyClass.create({ host: 123, port: 'bad' } as any)).toThrow()\n\t\t\texpect(constructorRan).toBe(false)\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(constructorRan).toBe(true)\n\t\t})\n\n\t\ttest('constructor receives validated value', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tlet receivedConfig: unknown\n\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\treceivedConfig = this.config\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\n\t\t\texpect(receivedConfig).toEqual({ host: 'localhost', port: 3000 })\n\t\t})\n\n\t\ttest('external new is a compile error', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new MyClass({ host: 'localhost', port: 3000 }))\n\t\t})\n\n\t\ttest('static Config resolves to PipeOutput<P> at the type level', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpectTypeOf<typeof MyClass.Config>().toEqualTypeOf<TestConfig>()\n\t\t\texpect(MyClass.create).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\textra: number\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, extra: number) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tthis.extra = extra\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 42)\n\n\t\t\texpect(instance.extra).toBe(42)\n\t\t\texpectTypeOf(instance).toHaveProperty('extra')\n\t\t\texpectTypeOf(instance.extra).toEqualTypeOf<number>()\n\n\t\t\t// @ts-expect-error — wrong extra type\n\t\t\tvoid (() => MyClass.create({ host: 'localhost', port: 3000 }, 'not-a-number'))\n\t\t})\n\n\t\ttest('base-args forwarding works for non-zero-arg bases', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBaseWithArgs)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, label: string) {\n\t\t\t\t\tsuper(config, label)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 'test-label')\n\n\t\t\texpect(instance.label).toBe('test-label')\n\t\t})\n\n\t\ttest('config is accessible as protected readonly on instances', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\n\t\t\t\tgetHost() {\n\t\t\t\t\treturn this.config.host\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.getHost()).toBe('localhost')\n\t\t})\n\n\t\ttest('accepts an abstract base class', () => {\n\t\t\tabstract class AbstractBase {\n\t\t\t\tabstract greet(): string\n\t\t\t}\n\n\t\t\tconst Wrapped = configurable(testPipe, AbstractBase)\n\t\t\tclass Concrete extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof Concrete.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t\tgreet() {\n\t\t\t\t\treturn `hello from ${this.config.host}`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = Concrete.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.greet()).toBe('hello from localhost')\n\t\t\texpectTypeOf(instance).toHaveProperty('config')\n\t\t})\n\t})\n}\n","import * as bcrypt from 'bcryptjs'\n\nimport { Instance } from '../instance'\n\nexport const hash = async (password: string) => {\n\tpassword = password.trim()\n\tif (!password) return ''\n\treturn await bcrypt.hash(password, Instance.get().settings.utils.hashSaltRounds)\n}\n\nexport const compare = async (plainPassword: string, hashed: string) => {\n\tplainPassword = plainPassword.trim()\n\tif (!plainPassword && plainPassword === hashed) return true\n\treturn await bcrypt.compare(plainPassword, hashed)\n}\n","export const parseJSONValue = (data: any) => {\n\ttry {\n\t\tif (data?.constructor?.name !== 'String') return data\n\t\treturn JSON.parse(data)\n\t} catch {\n\t\treturn data\n\t}\n}\n\nexport function parseJSONObject<T extends object>(data: T) {\n\treturn Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)])) as T\n}\n","import { parseBuffer } from 'music-metadata'\n\nexport const getMediaDuration = async (buffer: Buffer) => {\n\ttry {\n\t\tconst meta = await parseBuffer(buffer)\n\t\treturn meta.format.duration ?? 0\n\t} catch {\n\t\treturn 0\n\t}\n}\n","import crypto from 'crypto'\n\nexport function string(length = 20) {\n\treturn crypto.randomBytes(length).toString('hex').slice(0, length)\n}\n\nexport function number(min = 0, max = 2 ** 48 - 1) {\n\treturn crypto.randomInt(min, max)\n}\n","import { EquippedError } from '../errors'\n\nexport const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const retry = async <T>(cb: () => Promise<{ done: true; value: T } | { done: false }>, tries: number, waitTimeInMs: number) => {\n\tif (tries <= 0) throw new EquippedError('out of tries', { tries, waitTimeInMs })\n\tconst result = await cb()\n\tif (result.done === true) return result.value\n\tawait sleep(waitTimeInMs)\n\treturn await retry(cb, tries - 1, waitTimeInMs)\n}\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 { DefaultCookies, DefaultHeaders, IncomingFile, MethodsEnum, RouteDef, RouteDefToReqRes } from './types'\nimport type { AuthUser } from '../types'\nimport { parseJSONObject } from '../utilities'\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\tthis.query = parseJSONObject(query)\n\t\tthis.body = <any>Object.assign(parseJSONObject(body), files)\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","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 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":["valleyed_exports","__export","incomingFile","incomingFiles","requestLocalStorage","responseLocalStorage","withRequest","withResponse","AsyncLocalStorage","PipeError","v","pino","ulid","v","EquippedError","message","context","cause","RequestError","EquippedError","message","serializedErrors","cause","SocketServer","supertest","PipeError","v","convert","capitalize","v","Methods","StatusCodes","makeMiddlewareHandler","cb","onSetup","makeMiddleware","args","makeResponseMiddleware","makeErrorMiddleware","mergeSchemas","schemas","k","merge","acc","cur","v","key","s","groupRoutes","config","routes","route","Router","#config","#routes","#children","#wrap","method","path","handler","Methods","routers","router","child","openapi","config","instance","Instance","app","baseOpenapiDoc","url","registeredTags","registeredTagGroups","flattenForParameters","node","allOf","oneOf","anyOf","schema","n","visit","id","rest","res","key","value","buildTag","groups","parsed","g","name","displayName","description","groupName","group","addRouteToOpenApiDoc","path","method","def","methodObj","resp","convert","parameters","addParams","location","flat","html","jsonPath","capitalize","cleanPath","cleaned","register","route","tag","cleanedPath","operationId","router","Router","req","authProviders_exports","__export","signinWithApple","signinWithFacebook","signinWithGoogle","axios","jwt","jwksClient","signinWithGoogle","idToken","authUrl","data","axios","err","EquippedError","signinWithApple","APPLE_BASE","json","jwt","kid","alg","publicKey","jwksClient","key","signinWithFacebook","accessToken","fields","v","configurable","pipeFn","base","pipe","Configurable","config","baseArgs","input","args","r","hash_exports","__export","compare","hash","bcrypt","hash","password","Instance","compare","plainPassword","hashed","parseJSONValue","data","parseJSONObject","key","value","parseBuffer","getMediaDuration","buffer","random_exports","__export","number","string","crypto","length","min","max","sleep","ms","resolve","retry","cb","tries","waitTimeInMs","EquippedError","result","Request","ip","body","cookies","params","query","method","path","headers","files","parseJSONObject","stream","opts","Response","status","piped","contentType","key","val","values","BaseRequestAuthMethod","methods","headers","error","method","err","RequestError","BadRequestError","BaseApiKeyRequestAuthMethod","BaseRequestAuthMethod","headerName","headers","headerValue","NotAuthenticatedError","cookie","jwt","BaseJwtRequestAuthMethod","BaseRequestAuthMethod","options","#getKey","userId","payload","token","jwt","headers","user","NotAuthenticatedError","cachedToken","TokenExpired","err","BaseJwtHeaderRequestAuthMethod","value","BaseJwtCookieRequestAuthMethod","cookie","Match","EmitterEvent","defaultTo","SocketEmitter","socket","config","#setupSocketConnection","Instance","stream","#publish","data","#connectionCallbacks","#routes","channels","to","#emit","after","before","type","toArray","channelMap","c","channel","callbacks","onJoin","#getConfig","matcher","key","Match","matchedChannel","match","socketId","user","BaseRequestAuthMethod","callback","StatusCodes","route","newChannel","serverConfigPipe","v","Methods","EventBus","BaseRequestAuthMethod","errorsSchemas","StatusCodes","value","key","Server","#httpServer","#oai","#serverConfig","#queue","#routesByKey","httpServer","config","_","cb","m","openapi","socketInstance","SocketServer","SocketEmitter","routers","router","routes","route","method","path","schema","onError","middlewares","responseMiddlewares","EquippedError","validateRequest","validateResponse","jsonSchema","#resolveSchema","req","res","request","middleware","rawRes","response","Response","error","rawResponse","supertest","instance","Instance","app","NotFoundError","RequestError","started","defaultStatusCode","defaultContentType","status","contentType","requestPipeDefs","responsePipeDefs","def","pipe","pipeRecords","input","p","rec","PipeError","r","record","requestPipe","responsePipe","validity","requestLocalStorage","pipeErrorToValidationError","responseLocalStorage","val","requireAuthUser","methods","makeMiddleware","request","BaseRequestAuthMethod","NotAuthenticatedError","route","method","schemeName","BadRequestError","RequestError","StatusCodes","message","cause","NotAuthenticatedError","RequestError","StatusCodes","message","cause","NotAuthorizedError","RequestError","StatusCodes","message","cause","NotFoundError","RequestError","StatusCodes","message","cause","TokenExpired","RequestError","StatusCodes","message","cause","ValidationError","RequestError","StatusCodes","errors","cause","field","messages","message","registerHook","hooks","record","dep","h","depName","ownerName","tentative","detectCycle","classToAfter","existing","visited","stack","visit","cls","path","cycleStart","names","c","resolveHookDAG","invert","classToHooks","anonymous","list","classes","inDegree","graph","from","to","edges","layers","queue","layer","next","neighbor","d","anonWithDeps","anonWithoutDeps","maxLayer","depLayer","l","r","insertAt","runHooks","onError","error","v","instanceSettingsPipe","Instance","_Instance","#id","#instance","#hooks","settings","pino","#registerOnExitHandler","id","EquippedError","name","key","runHooks","error","envsPipe","envValidity","v","settingsValidity","instanceSettingsPipe","event","cb","options","record","registerHook","signal","code","value","opts","ulid","filePipe","err","v","input","Instance","PipeError","incomingFile","files","incomingFiles","requestLocalStorage","AsyncLocalStorage","responseLocalStorage","withRequest","fn","req","validated","withResponse","res","v","pipeErrorToValidationError","error","errorsObject","acc","path","message","ValidationError","validate","pipe","value","validity","v"]}
@@ -1,2 +0,0 @@
1
- import{a}from "./chunk-OXI6IKAM.min.mjs";import"./chunk-LTDVZJYJ.min.mjs";import"./chunk-DSUJ5FUL.min.mjs";import"./chunk-AQY7QVYI.min.mjs";export{a as OrmIntrospectionError};
2
- //# sourceMappingURL=introspection-GP3G26B6.min.mjs.map