equipped 5.1.11 → 5.2.0

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 (212) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/errors/index.cjs +1 -2
  3. package/dist/cjs/errors/index.cjs.map +1 -1
  4. package/dist/cjs/errors/index.min.cjs +1 -1
  5. package/dist/cjs/errors/index.min.cjs.map +1 -1
  6. package/dist/cjs/errors/types/tokenExpired.cjs +12 -0
  7. package/dist/cjs/errors/types/tokenExpired.cjs.map +1 -0
  8. package/dist/cjs/errors/types/{refreshTokenMisusedError.min.cjs → tokenExpired.min.cjs} +2 -2
  9. package/dist/cjs/errors/types/tokenExpired.min.cjs.map +1 -0
  10. package/dist/cjs/instance/index.cjs.map +1 -1
  11. package/dist/cjs/instance/index.min.cjs.map +1 -1
  12. package/dist/cjs/server/impls/base.cjs +17 -17
  13. package/dist/cjs/server/impls/base.cjs.map +1 -1
  14. package/dist/cjs/server/impls/base.min.cjs +1 -1
  15. package/dist/cjs/server/impls/base.min.cjs.map +1 -1
  16. package/dist/cjs/server/impls/express.cjs +2 -13
  17. package/dist/cjs/server/impls/express.cjs.map +1 -1
  18. package/dist/cjs/server/impls/express.min.cjs +1 -1
  19. package/dist/cjs/server/impls/express.min.cjs.map +1 -1
  20. package/dist/cjs/server/impls/fastify.cjs +3 -14
  21. package/dist/cjs/server/impls/fastify.cjs.map +1 -1
  22. package/dist/cjs/server/impls/fastify.min.cjs +1 -1
  23. package/dist/cjs/server/impls/fastify.min.cjs.map +1 -1
  24. package/dist/cjs/server/index.cjs +1 -1
  25. package/dist/cjs/server/index.cjs.map +1 -1
  26. package/dist/cjs/server/index.min.cjs +1 -1
  27. package/dist/cjs/server/index.min.cjs.map +1 -1
  28. package/dist/cjs/server/middlewares/requireAuthUser.cjs +9 -52
  29. package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +1 -1
  30. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +1 -1
  31. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +1 -1
  32. package/dist/cjs/server/pipes.cjs +23 -8
  33. package/dist/cjs/server/pipes.cjs.map +1 -1
  34. package/dist/cjs/server/pipes.min.cjs +1 -1
  35. package/dist/cjs/server/pipes.min.cjs.map +1 -1
  36. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +21 -0
  37. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +1 -0
  38. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +2 -0
  39. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +1 -0
  40. package/dist/cjs/server/requests-auth-methods/base.cjs +20 -0
  41. package/dist/cjs/server/requests-auth-methods/base.cjs.map +1 -0
  42. package/dist/cjs/server/requests-auth-methods/base.min.cjs +2 -0
  43. package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +1 -0
  44. package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.cjs +2 -1
  45. package/dist/cjs/server/requests-auth-methods/index.cjs.map +1 -0
  46. package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.min.cjs +1 -1
  47. package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +1 -0
  48. package/dist/cjs/server/requests-auth-methods/jwt.cjs +78 -0
  49. package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +1 -0
  50. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +2 -0
  51. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +1 -0
  52. package/dist/cjs/server/requests.cjs +1 -9
  53. package/dist/cjs/server/requests.cjs.map +1 -1
  54. package/dist/cjs/server/requests.min.cjs +1 -1
  55. package/dist/cjs/server/requests.min.cjs.map +1 -1
  56. package/dist/cjs/server/routes.cjs +1 -2
  57. package/dist/cjs/server/routes.cjs.map +1 -1
  58. package/dist/cjs/server/routes.min.cjs +1 -1
  59. package/dist/cjs/server/routes.min.cjs.map +1 -1
  60. package/dist/cjs/server/sockets.cjs +2 -4
  61. package/dist/cjs/server/sockets.cjs.map +1 -1
  62. package/dist/cjs/server/sockets.min.cjs +1 -1
  63. package/dist/cjs/server/sockets.min.cjs.map +1 -1
  64. package/dist/cjs/server/types.cjs +1 -1
  65. package/dist/cjs/server/types.cjs.map +1 -1
  66. package/dist/cjs/server/types.min.cjs +1 -1
  67. package/dist/cjs/server/types.min.cjs.map +1 -1
  68. package/dist/esm/errors/index.min.mjs +1 -1
  69. package/dist/esm/errors/index.min.mjs.map +1 -1
  70. package/dist/esm/errors/index.mjs +1 -2
  71. package/dist/esm/errors/index.mjs.map +1 -1
  72. package/dist/esm/errors/types/tokenExpired.min.mjs +2 -0
  73. package/dist/esm/errors/types/tokenExpired.min.mjs.map +1 -0
  74. package/dist/esm/errors/types/tokenExpired.mjs +12 -0
  75. package/dist/esm/errors/types/tokenExpired.mjs.map +1 -0
  76. package/dist/esm/instance/index.min.mjs +1 -1
  77. package/dist/esm/instance/index.min.mjs.map +1 -1
  78. package/dist/esm/instance/index.mjs.map +1 -1
  79. package/dist/esm/server/impls/base.min.mjs +1 -1
  80. package/dist/esm/server/impls/base.min.mjs.map +1 -1
  81. package/dist/esm/server/impls/base.mjs +9 -9
  82. package/dist/esm/server/impls/base.mjs.map +1 -1
  83. package/dist/esm/server/impls/express.min.mjs +1 -1
  84. package/dist/esm/server/impls/express.min.mjs.map +1 -1
  85. package/dist/esm/server/impls/express.mjs +2 -13
  86. package/dist/esm/server/impls/express.mjs.map +1 -1
  87. package/dist/esm/server/impls/fastify.min.mjs +1 -1
  88. package/dist/esm/server/impls/fastify.min.mjs.map +1 -1
  89. package/dist/esm/server/impls/fastify.mjs +2 -13
  90. package/dist/esm/server/impls/fastify.mjs.map +1 -1
  91. package/dist/esm/server/index.min.mjs +1 -1
  92. package/dist/esm/server/index.min.mjs.map +1 -1
  93. package/dist/esm/server/index.mjs +1 -1
  94. package/dist/esm/server/index.mjs.map +1 -1
  95. package/dist/esm/server/middlewares/requireAuthUser.min.mjs +1 -1
  96. package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +1 -1
  97. package/dist/esm/server/middlewares/requireAuthUser.mjs +9 -52
  98. package/dist/esm/server/middlewares/requireAuthUser.mjs.map +1 -1
  99. package/dist/esm/server/pipes.min.mjs +1 -1
  100. package/dist/esm/server/pipes.min.mjs.map +1 -1
  101. package/dist/esm/server/pipes.mjs +23 -8
  102. package/dist/esm/server/pipes.mjs.map +1 -1
  103. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +2 -0
  104. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +1 -0
  105. package/dist/esm/server/requests-auth-methods/apiKeys.mjs +21 -0
  106. package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +1 -0
  107. package/dist/esm/server/requests-auth-methods/base.min.mjs +2 -0
  108. package/dist/esm/server/requests-auth-methods/base.min.mjs.map +1 -0
  109. package/dist/esm/server/requests-auth-methods/base.mjs +20 -0
  110. package/dist/esm/server/requests-auth-methods/base.mjs.map +1 -0
  111. package/dist/esm/server/requests-auth-methods/index.min.mjs +2 -0
  112. package/dist/esm/server/requests-auth-methods/index.min.mjs.map +1 -0
  113. package/dist/esm/server/requests-auth-methods/index.mjs +4 -0
  114. package/dist/esm/server/requests-auth-methods/index.mjs.map +1 -0
  115. package/dist/esm/server/requests-auth-methods/jwt.min.mjs +2 -0
  116. package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +1 -0
  117. package/dist/esm/server/requests-auth-methods/jwt.mjs +78 -0
  118. package/dist/esm/server/requests-auth-methods/jwt.mjs.map +1 -0
  119. package/dist/esm/server/requests.min.mjs +1 -1
  120. package/dist/esm/server/requests.min.mjs.map +1 -1
  121. package/dist/esm/server/requests.mjs +1 -9
  122. package/dist/esm/server/requests.mjs.map +1 -1
  123. package/dist/esm/server/routes.min.mjs +1 -1
  124. package/dist/esm/server/routes.min.mjs.map +1 -1
  125. package/dist/esm/server/routes.mjs +1 -2
  126. package/dist/esm/server/routes.mjs.map +1 -1
  127. package/dist/esm/server/sockets.min.mjs +1 -1
  128. package/dist/esm/server/sockets.min.mjs.map +1 -1
  129. package/dist/esm/server/sockets.mjs +2 -4
  130. package/dist/esm/server/sockets.mjs.map +1 -1
  131. package/dist/esm/server/types.min.mjs +1 -1
  132. package/dist/esm/server/types.min.mjs.map +1 -1
  133. package/dist/esm/server/types.mjs +1 -1
  134. package/dist/esm/server/types.mjs.map +1 -1
  135. package/dist/types/cache/index.d.ts +7 -1
  136. package/dist/types/errors/index.d.ts +7 -12
  137. package/dist/types/errors/index.js +1 -2
  138. package/dist/types/errors/types/tokenExpired.js +11 -0
  139. package/dist/types/{fastify-CDJ2WuLy.d.ts → fastify-B6FUtYe9.d.ts} +5 -4
  140. package/dist/types/index.d.ts +4 -4
  141. package/dist/types/instance/index.d.ts +63 -16
  142. package/dist/types/{requestError-DqkM5BfW.d.ts → requestError-7N-ngghg.d.ts} +97 -80
  143. package/dist/types/server/impls/base.js +9 -9
  144. package/dist/types/server/impls/express.js +2 -13
  145. package/dist/types/server/impls/fastify.js +2 -13
  146. package/dist/types/server/index.d.ts +62 -20
  147. package/dist/types/server/index.js +1 -1
  148. package/dist/types/server/middlewares/requireAuthUser.js +9 -52
  149. package/dist/types/server/pipes.js +23 -8
  150. package/dist/types/server/requests-auth-methods/apiKeys.js +20 -0
  151. package/dist/types/server/requests-auth-methods/base.js +19 -0
  152. package/dist/types/server/requests-auth-methods/index.js +3 -0
  153. package/dist/types/server/requests-auth-methods/jwt.js +77 -0
  154. package/dist/types/server/requests.js +1 -9
  155. package/dist/types/server/routes.js +1 -2
  156. package/dist/types/server/sockets.js +2 -4
  157. package/dist/types/server/types.js +1 -1
  158. package/dist/types/{validationError-BMKfV51p.d.ts → validationError-BB4cfdZa.d.ts} +1 -1
  159. package/dist/types/validations/index.d.ts +3 -9
  160. package/package.json +13 -12
  161. package/dist/cjs/errors/types/authorizationExpired.cjs +0 -12
  162. package/dist/cjs/errors/types/authorizationExpired.cjs.map +0 -1
  163. package/dist/cjs/errors/types/authorizationExpired.min.cjs +0 -2
  164. package/dist/cjs/errors/types/authorizationExpired.min.cjs.map +0 -1
  165. package/dist/cjs/errors/types/refreshTokenMisusedError.cjs +0 -12
  166. package/dist/cjs/errors/types/refreshTokenMisusedError.cjs.map +0 -1
  167. package/dist/cjs/errors/types/refreshTokenMisusedError.min.cjs.map +0 -1
  168. package/dist/cjs/server/middlewares/parseAuthUser.cjs +0 -21
  169. package/dist/cjs/server/middlewares/parseAuthUser.cjs.map +0 -1
  170. package/dist/cjs/server/middlewares/parseAuthUser.min.cjs +0 -2
  171. package/dist/cjs/server/middlewares/parseAuthUser.min.cjs.map +0 -1
  172. package/dist/cjs/server/requests-auth/apiKeys.cjs +0 -6
  173. package/dist/cjs/server/requests-auth/apiKeys.cjs.map +0 -1
  174. package/dist/cjs/server/requests-auth/apiKeys.min.cjs +0 -2
  175. package/dist/cjs/server/requests-auth/apiKeys.min.cjs.map +0 -1
  176. package/dist/cjs/server/requests-auth/index.cjs.map +0 -1
  177. package/dist/cjs/server/requests-auth/index.min.cjs.map +0 -1
  178. package/dist/cjs/server/requests-auth/tokens.cjs +0 -92
  179. package/dist/cjs/server/requests-auth/tokens.cjs.map +0 -1
  180. package/dist/cjs/server/requests-auth/tokens.min.cjs +0 -2
  181. package/dist/cjs/server/requests-auth/tokens.min.cjs.map +0 -1
  182. package/dist/esm/errors/types/authorizationExpired.min.mjs +0 -2
  183. package/dist/esm/errors/types/authorizationExpired.min.mjs.map +0 -1
  184. package/dist/esm/errors/types/authorizationExpired.mjs +0 -12
  185. package/dist/esm/errors/types/authorizationExpired.mjs.map +0 -1
  186. package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs +0 -2
  187. package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs.map +0 -1
  188. package/dist/esm/errors/types/refreshTokenMisusedError.mjs +0 -12
  189. package/dist/esm/errors/types/refreshTokenMisusedError.mjs.map +0 -1
  190. package/dist/esm/server/middlewares/parseAuthUser.min.mjs +0 -2
  191. package/dist/esm/server/middlewares/parseAuthUser.min.mjs.map +0 -1
  192. package/dist/esm/server/middlewares/parseAuthUser.mjs +0 -21
  193. package/dist/esm/server/middlewares/parseAuthUser.mjs.map +0 -1
  194. package/dist/esm/server/requests-auth/apiKeys.min.mjs +0 -2
  195. package/dist/esm/server/requests-auth/apiKeys.min.mjs.map +0 -1
  196. package/dist/esm/server/requests-auth/apiKeys.mjs +0 -6
  197. package/dist/esm/server/requests-auth/apiKeys.mjs.map +0 -1
  198. package/dist/esm/server/requests-auth/index.min.mjs +0 -2
  199. package/dist/esm/server/requests-auth/index.min.mjs.map +0 -1
  200. package/dist/esm/server/requests-auth/index.mjs +0 -3
  201. package/dist/esm/server/requests-auth/index.mjs.map +0 -1
  202. package/dist/esm/server/requests-auth/tokens.min.mjs +0 -2
  203. package/dist/esm/server/requests-auth/tokens.min.mjs.map +0 -1
  204. package/dist/esm/server/requests-auth/tokens.mjs +0 -92
  205. package/dist/esm/server/requests-auth/tokens.mjs.map +0 -1
  206. package/dist/types/base-8yVXb67P.d.ts +0 -8
  207. package/dist/types/errors/types/authorizationExpired.js +0 -11
  208. package/dist/types/errors/types/refreshTokenMisusedError.js +0 -11
  209. package/dist/types/server/middlewares/parseAuthUser.js +0 -20
  210. package/dist/types/server/requests-auth/apiKeys.js +0 -5
  211. package/dist/types/server/requests-auth/index.js +0 -2
  212. package/dist/types/server/requests-auth/tokens.js +0 -91
@@ -1,2 +1,2 @@
1
- import{parseJSONObject as a}from "../utilities/index.min.mjs";class D{ip;method;path;body;params;query;headers;context;cookies;users={access:{},refresh:{},apiKey:{}};authUser;constructor({ip:e,body:s,cookies:t,params:r,query:n,method:o,path:d,context:f,headers:u,files:y}){this.ip=e,this.method=o,this.path=d,this.params=r,this.cookies=t,this.headers=u,this.query=a(n),this.body=Object.assign(a(s),y),this.context=f}pipe(e,s={}){return new i({...s,piped:!0,body:e})}res(e){return new i({...e,piped:!1})}error(e){return new i({...e,piped:!1})}}class i{body;headers;cookies;status;contentType;piped;constructor({body:e,status:s=200,headers:t={},cookies:r={},piped:n=!1,contentType:o="application/json"}){this.body=e,this.status=s,this.contentType=o,this.headers=t,this.cookies=r,this.piped=n,this.piped||(this.headers["Content-Type"]=o)}get cookieValues(){return Object.fromEntries(Object.entries(this.cookies).map(([e,s])=>[e,s]))}set cookieValues(e){Object.entries(e).forEach(([s,t])=>{this.cookies[s]&&(this.cookies[s].value=t)})}}export{D as Request,i as Response};
1
+ import{parseJSONObject as a}from "../utilities/index.min.mjs";class D{ip;method;path;body;params;query;headers;cookies;authUser=null;constructor({ip:e,body:s,cookies:t,params:r,query:n,method:o,path:d,headers:u,files:f}){this.ip=e,this.method=o,this.path=d,this.params=r,this.cookies=t,this.headers=u,this.query=a(n),this.body=Object.assign(a(s),f)}pipe(e,s={}){return new i({...s,piped:!0,body:e})}res(e){return new i({...e,piped:!1})}error(e){return new i({...e,piped:!1})}}class i{body;headers;cookies;status;contentType;piped;constructor({body:e,status:s=200,headers:t={},cookies:r={},piped:n=!1,contentType:o="application/json"}){this.body=e,this.status=s,this.contentType=o,this.headers=t,this.cookies=r,this.piped=n,this.piped||(this.headers["Content-Type"]=o)}get cookieValues(){return Object.fromEntries(Object.entries(this.cookies).map(([e,s])=>[e,s]))}set cookieValues(e){Object.entries(e).forEach(([s,t])=>{this.cookies[s]&&(this.cookies[s].value=t)})}}export{D as Request,i as Response};
2
2
  //# sourceMappingURL=requests.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/requests.ts"],"sourcesContent":["import 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, RefreshUser } from '../types'\nimport { parseJSONObject } from '../utilities'\n\ntype HeaderKeys = 'Authorization' | 'RefreshToken' | 'ApiKey' | 'Referer' | 'ContentType' | 'UserAgent'\ntype ReqUser<T> = { error?: RequestError; value?: T }\ntype FallbackHeadersType = Record<string, string | string[] | undefined>\n\ntype 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: Record<HeaderKeys, string | undefined> & Def['requestHeaders'] & FallbackHeadersType\n\tcontext: Def['context']\n\tcookies: Record<string, string | undefined> & Def['requestCookies']\n\tusers: {\n\t\taccess: ReqUser<AuthUser>\n\t\trefresh: ReqUser<RefreshUser>\n\t\tapiKey: ReqUser<AuthUser>\n\t} = {\n\t\taccess: {},\n\t\trefresh: {},\n\t\tapiKey: {},\n\t}\n\tauthUser?: AuthUser\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\tcontext,\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: Record<HeaderKeys, string | undefined> & Def['requestHeaders'] & FallbackHeadersType\n\t\tfiles: Record<string, IncomingFile[]>\n\t\tmethod: MethodsEnum\n\t\tpath: string\n\t\tcontext: Def['context']\n\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\tthis.context = context\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"],"mappings":"AAQA,OAAS,mBAAAA,MAAuB,eAUzB,MAAMC,CAA2C,CAC9C,GACA,OACA,KACT,KACA,OACA,MACA,QACA,QACA,QACA,MAII,CACH,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,OAAQ,CAAC,CACV,EACA,SAEA,YAAY,CACX,GAAAC,EACA,KAAAC,EACA,QAAAC,EACA,OAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EACA,QAAAC,EACA,QAAAC,EACA,MAAAC,CACD,EAWG,CACF,KAAK,GAAKT,EACV,KAAK,OAASK,EACd,KAAK,KAAOC,EACZ,KAAK,OAASH,EACd,KAAK,QAAUD,EACf,KAAK,QAAUM,EACf,KAAK,MAAQV,EAAgBM,CAAK,EAClC,KAAK,KAAY,OAAO,OAAON,EAAgBG,CAAI,EAAGQ,CAAK,EAC3D,KAAK,QAAUF,CAChB,CAEA,KAAKG,EAAkBC,EAA2G,CAAC,EAAG,CACrI,OAAO,IAAIC,EAA8D,CAAE,GAAGD,EAAM,MAAO,GAAM,KAAMD,CAAO,CAAC,CAChH,CAEA,IAAIP,EAAuD,CAC1D,OAAO,IAAIS,EAAmB,CAAE,GAAGT,EAAQ,MAAO,EAAM,CAAC,CAC1D,CAEA,MAQEA,EAAqD,CACtD,OAAO,IAAIS,EAAiB,CAAE,GAAGT,EAAQ,MAAO,EAAM,CAAC,CACxD,CACD,CAkBO,MAAMS,CAA4C,CACxD,KACA,QACA,QACS,OACA,YACA,MAET,YAAY,CACX,KAAAX,EACA,OAAAY,EAAc,IACd,QAAAL,EAAe,CAAC,EAChB,QAAAN,EAAe,CAAC,EAChB,MAAAY,EAAQ,GACR,YAAAC,EAAmB,kBACpB,EAAuB,CACtB,KAAK,KAAOd,EACZ,KAAK,OAASY,EACd,KAAK,YAAcE,EACnB,KAAK,QAAUP,EACf,KAAK,QAAUN,EACf,KAAK,MAAQY,EAER,KAAK,QAET,KAAK,QAAQ,cAAc,EAAIC,EAEjC,CAEA,IAAI,cAAe,CAClB,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAG,IAAM,CAACD,EAAKC,CAAG,CAAU,CAAC,CAChG,CAEA,IAAI,aAAaC,EAAwB,CACxC,OAAO,QAAQA,CAAM,EAAE,QAAQ,CAAC,CAACF,EAAKC,CAAG,IAAM,CAE1C,KAAK,QAAQD,CAAG,IAAG,KAAK,QAAQA,CAAG,EAAE,MAAQC,EAClD,CAAC,CACF,CACD","names":["parseJSONObject","Request","ip","body","cookies","params","query","method","path","context","headers","files","stream","opts","Response","status","piped","contentType","key","val","values"]}
1
+ {"version":3,"sources":["../../../src/server/requests.ts"],"sourcesContent":["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"],"mappings":"AASA,OAAS,mBAAAA,MAAuB,eAMzB,MAAMC,CAA2C,CAC9C,GACA,OACA,KACT,KACA,OACA,MACA,QACA,QACA,SAA4B,KAE5B,YAAY,CACX,GAAAC,EACA,KAAAC,EACA,QAAAC,EACA,OAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EACA,QAAAC,EACA,MAAAC,CACD,EAUI,CACH,KAAK,GAAKR,EACV,KAAK,OAASK,EACd,KAAK,KAAOC,EACZ,KAAK,OAASH,EACd,KAAK,QAAUD,EACf,KAAK,QAAUK,EACf,KAAK,MAAQT,EAAgBM,CAAK,EAClC,KAAK,KAAY,OAAO,OAAON,EAAgBG,CAAI,EAAGO,CAAK,CAC5D,CAEA,KAAKC,EAAkBC,EAA2G,CAAC,EAAG,CACrI,OAAO,IAAIC,EAA8D,CAAE,GAAGD,EAAM,MAAO,GAAM,KAAMD,CAAO,CAAC,CAChH,CAEA,IAAIN,EAAuD,CAC1D,OAAO,IAAIQ,EAAmB,CAAE,GAAGR,EAAQ,MAAO,EAAM,CAAC,CAC1D,CAEA,MAQEA,EAAqD,CACtD,OAAO,IAAIQ,EAAiB,CAAE,GAAGR,EAAQ,MAAO,EAAM,CAAC,CACxD,CACD,CAkBO,MAAMQ,CAA4C,CACxD,KACA,QACA,QACS,OACA,YACA,MAET,YAAY,CACX,KAAAV,EACA,OAAAW,EAAc,IACd,QAAAL,EAAe,CAAC,EAChB,QAAAL,EAAe,CAAC,EAChB,MAAAW,EAAQ,GACR,YAAAC,EAAmB,kBACpB,EAAuB,CACtB,KAAK,KAAOb,EACZ,KAAK,OAASW,EACd,KAAK,YAAcE,EACnB,KAAK,QAAUP,EACf,KAAK,QAAUL,EACf,KAAK,MAAQW,EAER,KAAK,QAET,KAAK,QAAQ,cAAc,EAAIC,EAEjC,CAEA,IAAI,cAAe,CAClB,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAG,IAAM,CAACD,EAAKC,CAAG,CAAU,CAAC,CAChG,CAEA,IAAI,aAAaC,EAAwB,CACxC,OAAO,QAAQA,CAAM,EAAE,QAAQ,CAAC,CAACF,EAAKC,CAAG,IAAM,CAE1C,KAAK,QAAQD,CAAG,IAAG,KAAK,QAAQA,CAAG,EAAE,MAAQC,EAClD,CAAC,CACF,CACD","names":["parseJSONObject","Request","ip","body","cookies","params","query","method","path","headers","files","stream","opts","Response","status","piped","contentType","key","val","values"]}
@@ -7,14 +7,8 @@ class Request {
7
7
  params;
8
8
  query;
9
9
  headers;
10
- context;
11
10
  cookies;
12
- users = {
13
- access: {},
14
- refresh: {},
15
- apiKey: {}
16
- };
17
- authUser;
11
+ authUser = null;
18
12
  constructor({
19
13
  ip,
20
14
  body,
@@ -23,7 +17,6 @@ class Request {
23
17
  query,
24
18
  method,
25
19
  path,
26
- context,
27
20
  headers,
28
21
  files
29
22
  }) {
@@ -35,7 +28,6 @@ class Request {
35
28
  this.headers = headers;
36
29
  this.query = parseJSONObject(query);
37
30
  this.body = Object.assign(parseJSONObject(body), files);
38
- this.context = context;
39
31
  }
40
32
  pipe(stream, opts = {}) {
41
33
  return new Response({ ...opts, piped: true, body: stream });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/requests.ts"],"sourcesContent":["import 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, RefreshUser } from '../types'\nimport { parseJSONObject } from '../utilities'\n\ntype HeaderKeys = 'Authorization' | 'RefreshToken' | 'ApiKey' | 'Referer' | 'ContentType' | 'UserAgent'\ntype ReqUser<T> = { error?: RequestError; value?: T }\ntype FallbackHeadersType = Record<string, string | string[] | undefined>\n\ntype 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: Record<HeaderKeys, string | undefined> & Def['requestHeaders'] & FallbackHeadersType\n\tcontext: Def['context']\n\tcookies: Record<string, string | undefined> & Def['requestCookies']\n\tusers: {\n\t\taccess: ReqUser<AuthUser>\n\t\trefresh: ReqUser<RefreshUser>\n\t\tapiKey: ReqUser<AuthUser>\n\t} = {\n\t\taccess: {},\n\t\trefresh: {},\n\t\tapiKey: {},\n\t}\n\tauthUser?: AuthUser\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\tcontext,\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: Record<HeaderKeys, string | undefined> & Def['requestHeaders'] & FallbackHeadersType\n\t\tfiles: Record<string, IncomingFile[]>\n\t\tmethod: MethodsEnum\n\t\tpath: string\n\t\tcontext: Def['context']\n\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\tthis.context = context\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"],"mappings":"AAQA,SAAS,uBAAuB;AAUzB,MAAM,QAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAII;AAAA,IACH,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,EACV;AAAA,EACA;AAAA,EAEA,YAAY;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,GAWG;AACF,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ,gBAAgB,KAAK;AAClC,SAAK,OAAY,OAAO,OAAO,gBAAgB,IAAI,GAAG,KAAK;AAC3D,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,KAAK,QAAkB,OAA2G,CAAC,GAAG;AACrI,WAAO,IAAI,SAA8D,EAAE,GAAG,MAAM,OAAO,MAAM,MAAM,OAAO,CAAC;AAAA,EAChH;AAAA,EAEA,IAAI,QAAuD;AAC1D,WAAO,IAAI,SAAmB,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC;AAAA,EAC1D;AAAA,EAEA,MAQE,QAAqD;AACtD,WAAO,IAAI,SAAiB,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC;AAAA,EACxD;AACD;AAkBO,MAAM,SAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACX;AAAA,IACA,SAAc;AAAA,IACd,UAAe,CAAC;AAAA,IAChB,UAAe,CAAC;AAAA,IAChB,QAAQ;AAAA,IACR,cAAmB;AAAA,EACpB,GAAuB;AACtB,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ;AAEb,QAAI,CAAC,KAAK,OAAO;AAEhB,WAAK,QAAQ,cAAc,IAAI;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,IAAI,eAAe;AAClB,WAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,CAAU,CAAC;AAAA,EAChG;AAAA,EAEA,IAAI,aAAa,QAAwB;AACxC,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAE9C,UAAI,KAAK,QAAQ,GAAG,EAAG,MAAK,QAAQ,GAAG,EAAE,QAAQ;AAAA,IAClD,CAAC;AAAA,EACF;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/requests.ts"],"sourcesContent":["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"],"mappings":"AASA,SAAS,uBAAuB;AAMzB,MAAM,QAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAA4B;AAAA,EAE5B,YAAY;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,GAUI;AACH,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ,gBAAgB,KAAK;AAClC,SAAK,OAAY,OAAO,OAAO,gBAAgB,IAAI,GAAG,KAAK;AAAA,EAC5D;AAAA,EAEA,KAAK,QAAkB,OAA2G,CAAC,GAAG;AACrI,WAAO,IAAI,SAA8D,EAAE,GAAG,MAAM,OAAO,MAAM,MAAM,OAAO,CAAC;AAAA,EAChH;AAAA,EAEA,IAAI,QAAuD;AAC1D,WAAO,IAAI,SAAmB,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC;AAAA,EAC1D;AAAA,EAEA,MAQE,QAAqD;AACtD,WAAO,IAAI,SAAiB,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC;AAAA,EACxD;AACD;AAkBO,MAAM,SAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACX;AAAA,IACA,SAAc;AAAA,IACd,UAAe,CAAC;AAAA,IAChB,UAAe,CAAC;AAAA,IAChB,QAAQ;AAAA,IACR,cAAmB;AAAA,EACpB,GAAuB;AACtB,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ;AAEb,QAAI,CAAC,KAAK,OAAO;AAEhB,WAAK,QAAQ,cAAc,IAAI;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,IAAI,eAAe;AAClB,WAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,CAAU,CAAC;AAAA,EAChG;AAAA,EAEA,IAAI,aAAa,QAAwB;AACxC,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAE9C,UAAI,KAAK,QAAQ,GAAG,EAAG,MAAK,QAAQ,GAAG,EAAE,QAAQ;AAAA,IAClD,CAAC;AAAA,EACF;AACD;","names":[]}
@@ -1,2 +1,2 @@
1
- import{v as i}from"valleyed";import{Methods as u}from "./types.min.mjs";function a(...r){const t={params:"",headers:"",query:"",body:"",cookies:"",response:"",responseHeaders:"",responseCookies:"",defaultStatusCode:"",defaultContentType:"",context:""};function e(s,o){return s?o?typeof s=="number"||typeof s=="string"||typeof s=="function"?o:i.merge(s,o):s:o}return Object.fromEntries(Object.keys(t).map(s=>[s,r.map(o=>o[s]).reduce(e,null)]))}const p=(r,t)=>t.map(e=>({...r,...e,path:`${r.path}/${e.path}`,groups:[...r.groups??[],...e.groups??[]],middlewares:[...r.middlewares??[],...e.middlewares??[]],schema:a(r.schema??{},e.schema??{}),security:[...r.security??[],...e.security??[]]}));class h{#t={path:""};#s=[];#o=[];constructor(t={path:""}){this.#t=t}#e(t){return(e,s={})=>o=>{const n=p(this.#t,[{...s,path:e,method:t,handler:o}])[0];return this.#s.push(n),n}}head=this.#e(u.head);get=this.#e(u.get);post=this.#e(u.post);put=this.#e(u.put);patch=this.#e(u.patch);delete=this.#e(u.delete);options=this.#e(u.options);nest(...t){t.forEach(e=>this.#o.push(e))}get routes(){return[...this.#s].concat(this.#o.flatMap(t=>p(this.#t,t.routes)))}}export{h as Router};
1
+ import{v as i}from"valleyed";import{Methods as u}from "./types.min.mjs";function a(...r){const t={params:"",headers:"",query:"",body:"",cookies:"",response:"",responseHeaders:"",responseCookies:"",defaultStatusCode:"",defaultContentType:""};function e(s,o){return s?o?typeof s=="number"||typeof s=="string"||typeof s=="function"?o:i.merge(s,o):s:o}return Object.fromEntries(Object.keys(t).map(s=>[s,r.map(o=>o[s]).reduce(e,null)]))}const p=(r,t)=>t.map(e=>({...r,...e,path:`${r.path}/${e.path}`,groups:[...r.groups??[],...e.groups??[]],middlewares:[...r.middlewares??[],...e.middlewares??[]],schema:a(r.schema??{},e.schema??{}),security:[...r.security??[],...e.security??[]]}));class h{#t={path:""};#s=[];#o=[];constructor(t={path:""}){this.#t=t}#e(t){return(e,s={})=>o=>{const n=p(this.#t,[{...s,path:e,method:t,handler:o}])[0];return this.#s.push(n),n}}head=this.#e(u.head);get=this.#e(u.get);post=this.#e(u.post);put=this.#e(u.put);patch=this.#e(u.patch);delete=this.#e(u.delete);options=this.#e(u.options);nest(...t){t.forEach(e=>this.#o.push(e))}get routes(){return[...this.#s].concat(this.#o.flatMap(t=>p(this.#t,t.routes)))}}export{h as Router};
2
2
  //# sourceMappingURL=routes.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/routes.ts"],"sourcesContent":["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\tcontext: '',\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\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"],"mappings":"AAAA,OAAS,KAAAA,MAAS,WAElB,OACC,WAAAC,MAQM,UAEP,SAASC,KAAgBC,EAAqB,CAE7C,MAAMC,EAAU,CACf,OAAQ,GACR,QAAS,GACT,MAAO,GACP,KAAM,GACN,QAAS,GACT,SAAU,GACV,gBAAiB,GACjB,gBAAiB,GACjB,kBAAmB,GACnB,mBAAoB,GACpB,QAAS,EACV,EACA,SAASC,EAAsCC,EAAeC,EAAQ,CACrE,OAAKD,EACAC,EACD,OAAOD,GAAQ,UACf,OAAOA,GAAQ,UACf,OAAOA,GAAQ,WAAmBC,EAC/BP,EAAE,MAAMM,EAAKC,CAAU,EAJbD,EADAC,CAMlB,CACA,OAAO,OAAO,YACb,OAAO,KAAKH,CAAC,EAAE,IAAKI,GAAQ,CAC3BA,EACAL,EAAQ,IAAKM,GAAMA,EAAED,CAAG,CAAyB,EAAE,OAAoCH,EAAO,IAAI,CACnG,CAAC,CACF,CACD,CAEA,MAAMK,EAAc,CAAyCC,EAAyBC,IACrFA,EAAO,IAAKC,IAAW,CACtB,GAAGF,EACH,GAAGE,EACH,KAAM,GAAGF,EAAO,IAAI,IAAIE,EAAM,IAAI,GAClC,OAAQ,CAAC,GAAIF,EAAO,QAAU,CAAC,EAAI,GAAIE,EAAM,QAAU,CAAC,CAAE,EAC1D,YAAa,CAAC,GAAIF,EAAO,aAAe,CAAC,EAAI,GAAIE,EAAM,aAAe,CAAC,CAAE,EACzE,OAAQX,EAAaS,EAAO,QAAU,CAAC,EAAGE,EAAM,QAAU,CAAC,CAAC,EAC5D,SAAU,CAAC,GAAIF,EAAO,UAAY,CAAC,EAAI,GAAIE,EAAM,UAAY,CAAC,CAAE,CACjE,EAAE,EAEI,MAAMC,CAA2B,CACvCC,GAA2B,CAAE,KAAM,EAAG,EACtCC,GAAwB,CAAC,EACzBC,GAA2B,CAAC,EAE5B,YAAYN,EAA0B,CAAE,KAAM,EAAG,EAAG,CACnD,KAAKI,GAAUJ,CAChB,CAEAO,GAAMC,EAAqB,CAC1B,MAAO,CAAqBC,EAAcT,EAAyB,CAAC,IAClEU,GAAmD,CACnD,MAAMR,EAAQH,EAAY,KAAKK,GAAS,CAAC,CAAE,GAAGJ,EAAQ,KAAAS,EAAM,OAAAD,EAAQ,QAASE,CAAe,CAAC,CAAC,EAAE,CAAC,EACjG,YAAKL,GAAQ,KAAKH,CAAK,EAChBA,CACR,CACF,CAEA,KAAO,KAAKK,GAAMjB,EAAQ,IAAI,EAC9B,IAAM,KAAKiB,GAAMjB,EAAQ,GAAG,EAC5B,KAAO,KAAKiB,GAAMjB,EAAQ,IAAI,EAC9B,IAAM,KAAKiB,GAAMjB,EAAQ,GAAG,EAC5B,MAAQ,KAAKiB,GAAMjB,EAAQ,KAAK,EAChC,OAAS,KAAKiB,GAAMjB,EAAQ,MAAM,EAClC,QAAU,KAAKiB,GAAMjB,EAAQ,OAAO,EAEpC,QAAQqB,EAAwB,CAC/BA,EAAQ,QAASC,GAAW,KAAKN,GAAU,KAAKM,CAAM,CAAC,CACxD,CAEA,IAAI,QAAS,CACZ,MAAO,CAAC,GAAG,KAAKP,EAAO,EAAE,OAAO,KAAKC,GAAU,QAASO,GAAUd,EAAY,KAAKK,GAASS,EAAM,MAAM,CAAC,CAAC,CAC3G,CACD","names":["v","Methods","mergeSchemas","schemas","k","merge","acc","cur","key","s","groupRoutes","config","routes","route","Router","#config","#routes","#children","#wrap","method","path","handler","routers","router","child"]}
1
+ {"version":3,"sources":["../../../src/server/routes.ts"],"sourcesContent":["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\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"],"mappings":"AAAA,OAAS,KAAAA,MAAS,WAElB,OACC,WAAAC,MAQM,UAEP,SAASC,KAAgBC,EAAqB,CAE7C,MAAMC,EAAU,CACf,OAAQ,GACR,QAAS,GACT,MAAO,GACP,KAAM,GACN,QAAS,GACT,SAAU,GACV,gBAAiB,GACjB,gBAAiB,GACjB,kBAAmB,GACnB,mBAAoB,EACrB,EACA,SAASC,EAAsCC,EAAeC,EAAQ,CACrE,OAAKD,EACAC,EACD,OAAOD,GAAQ,UACf,OAAOA,GAAQ,UACf,OAAOA,GAAQ,WAAmBC,EAC/BP,EAAE,MAAMM,EAAKC,CAAU,EAJbD,EADAC,CAMlB,CACA,OAAO,OAAO,YACb,OAAO,KAAKH,CAAC,EAAE,IAAKI,GAAQ,CAC3BA,EACAL,EAAQ,IAAKM,GAAMA,EAAED,CAAG,CAAyB,EAAE,OAAoCH,EAAO,IAAI,CACnG,CAAC,CACF,CACD,CAEA,MAAMK,EAAc,CAAyCC,EAAyBC,IACrFA,EAAO,IAAKC,IAAW,CACtB,GAAGF,EACH,GAAGE,EACH,KAAM,GAAGF,EAAO,IAAI,IAAIE,EAAM,IAAI,GAClC,OAAQ,CAAC,GAAIF,EAAO,QAAU,CAAC,EAAI,GAAIE,EAAM,QAAU,CAAC,CAAE,EAC1D,YAAa,CAAC,GAAIF,EAAO,aAAe,CAAC,EAAI,GAAIE,EAAM,aAAe,CAAC,CAAE,EACzE,OAAQX,EAAaS,EAAO,QAAU,CAAC,EAAGE,EAAM,QAAU,CAAC,CAAC,EAC5D,SAAU,CAAC,GAAIF,EAAO,UAAY,CAAC,EAAI,GAAIE,EAAM,UAAY,CAAC,CAAE,CACjE,EAAE,EAEI,MAAMC,CAA2B,CACvCC,GAA2B,CAAE,KAAM,EAAG,EACtCC,GAAwB,CAAC,EACzBC,GAA2B,CAAC,EAE5B,YAAYN,EAA0B,CAAE,KAAM,EAAG,EAAG,CACnD,KAAKI,GAAUJ,CAChB,CAEAO,GAAMC,EAAqB,CAC1B,MAAO,CAAqBC,EAAcT,EAAyB,CAAC,IAClEU,GAAmD,CACnD,MAAMR,EAAQH,EAAY,KAAKK,GAAS,CAAC,CAAE,GAAGJ,EAAQ,KAAAS,EAAM,OAAAD,EAAQ,QAASE,CAAe,CAAC,CAAC,EAAE,CAAC,EACjG,YAAKL,GAAQ,KAAKH,CAAK,EAChBA,CACR,CACF,CAEA,KAAO,KAAKK,GAAMjB,EAAQ,IAAI,EAC9B,IAAM,KAAKiB,GAAMjB,EAAQ,GAAG,EAC5B,KAAO,KAAKiB,GAAMjB,EAAQ,IAAI,EAC9B,IAAM,KAAKiB,GAAMjB,EAAQ,GAAG,EAC5B,MAAQ,KAAKiB,GAAMjB,EAAQ,KAAK,EAChC,OAAS,KAAKiB,GAAMjB,EAAQ,MAAM,EAClC,QAAU,KAAKiB,GAAMjB,EAAQ,OAAO,EAEpC,QAAQqB,EAAwB,CAC/BA,EAAQ,QAASC,GAAW,KAAKN,GAAU,KAAKM,CAAM,CAAC,CACxD,CAEA,IAAI,QAAS,CACZ,MAAO,CAAC,GAAG,KAAKP,EAAO,EAAE,OAAO,KAAKC,GAAU,QAASO,GAAUd,EAAY,KAAKK,GAASS,EAAM,MAAM,CAAC,CAAC,CAC3G,CACD","names":["v","Methods","mergeSchemas","schemas","k","merge","acc","cur","key","s","groupRoutes","config","routes","route","Router","#config","#routes","#children","#wrap","method","path","handler","routers","router","child"]}
@@ -13,8 +13,7 @@ function mergeSchemas(...schemas) {
13
13
  responseHeaders: "",
14
14
  responseCookies: "",
15
15
  defaultStatusCode: "",
16
- defaultContentType: "",
17
- context: ""
16
+ defaultContentType: ""
18
17
  };
19
18
  function merge(acc, cur) {
20
19
  if (!acc) return cur;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/routes.ts"],"sourcesContent":["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\tcontext: '',\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\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"],"mappings":"AAAA,SAAS,SAAS;AAElB;AAAA,EACC;AAAA,OAQM;AAEP,SAAS,gBAAgB,SAAqB;AAE7C,QAAM,IAAU;AAAA,IACf,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,SAAS;AAAA,EACV;AACA,WAAS,MAAsC,KAAe,KAAQ;AACrE,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,OAAO,QAAQ,WAAY,QAAO;AACtC,WAAO,EAAE,MAAM,KAAK,GAAU;AAAA,EAC/B;AACA,SAAO,OAAO;AAAA,IACb,OAAO,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ;AAAA,MAC3B;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,CAAyB,EAAE,OAAoC,OAAO,IAAI;AAAA,IACnG,CAAC;AAAA,EACF;AACD;AAEA,MAAM,cAAc,CAAyC,QAAyB,WACrF,OAAO,IAAI,CAAC,WAAW;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,MAAM,GAAG,OAAO,IAAI,IAAI,MAAM,IAAI;AAAA,EAClC,QAAQ,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,GAAI,MAAM,UAAU,CAAC,CAAE;AAAA,EAC1D,aAAa,CAAC,GAAI,OAAO,eAAe,CAAC,GAAI,GAAI,MAAM,eAAe,CAAC,CAAE;AAAA,EACzE,QAAQ,aAAa,OAAO,UAAU,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;AAAA,EAC5D,UAAU,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,GAAI,MAAM,YAAY,CAAC,CAAE;AACjE,EAAE;AAEI,MAAM,OAA2B;AAAA,EACvC,UAA2B,EAAE,MAAM,GAAG;AAAA,EACtC,UAAwB,CAAC;AAAA,EACzB,YAA2B,CAAC;AAAA,EAE5B,YAAY,SAA0B,EAAE,MAAM,GAAG,GAAG;AACnD,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,MAAM,QAAqB;AAC1B,WAAO,CAAqB,MAAc,SAAyB,CAAC,MACnE,CAAC,YAAmD;AACnD,YAAM,QAAQ,YAAY,KAAK,SAAS,CAAC,EAAE,GAAG,QAAQ,MAAM,QAAQ,QAAwB,CAAC,CAAC,EAAE,CAAC;AACjG,WAAK,QAAQ,KAAK,KAAK;AACvB,aAAO;AAAA,IACR;AAAA,EACF;AAAA,EAEA,OAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,EAC9B,MAAM,KAAK,MAAM,QAAQ,GAAG;AAAA,EAC5B,OAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,EAC9B,MAAM,KAAK,MAAM,QAAQ,GAAG;AAAA,EAC5B,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAAA,EAChC,SAAS,KAAK,MAAM,QAAQ,MAAM;AAAA,EAClC,UAAU,KAAK,MAAM,QAAQ,OAAO;AAAA,EAEpC,QAAQ,SAAwB;AAC/B,YAAQ,QAAQ,CAAC,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,IAAI,SAAS;AACZ,WAAO,CAAC,GAAG,KAAK,OAAO,EAAE,OAAO,KAAK,UAAU,QAAQ,CAAC,UAAU,YAAY,KAAK,SAAS,MAAM,MAAM,CAAC,CAAC;AAAA,EAC3G;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/routes.ts"],"sourcesContent":["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\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"],"mappings":"AAAA,SAAS,SAAS;AAElB;AAAA,EACC;AAAA,OAQM;AAEP,SAAS,gBAAgB,SAAqB;AAE7C,QAAM,IAAU;AAAA,IACf,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,EACrB;AACA,WAAS,MAAsC,KAAe,KAAQ;AACrE,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,OAAO,QAAQ,WAAY,QAAO;AACtC,WAAO,EAAE,MAAM,KAAK,GAAU;AAAA,EAC/B;AACA,SAAO,OAAO;AAAA,IACb,OAAO,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ;AAAA,MAC3B;AAAA,MACA,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,CAAyB,EAAE,OAAoC,OAAO,IAAI;AAAA,IACnG,CAAC;AAAA,EACF;AACD;AAEA,MAAM,cAAc,CAAyC,QAAyB,WACrF,OAAO,IAAI,CAAC,WAAW;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,MAAM,GAAG,OAAO,IAAI,IAAI,MAAM,IAAI;AAAA,EAClC,QAAQ,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,GAAI,MAAM,UAAU,CAAC,CAAE;AAAA,EAC1D,aAAa,CAAC,GAAI,OAAO,eAAe,CAAC,GAAI,GAAI,MAAM,eAAe,CAAC,CAAE;AAAA,EACzE,QAAQ,aAAa,OAAO,UAAU,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;AAAA,EAC5D,UAAU,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,GAAI,MAAM,YAAY,CAAC,CAAE;AACjE,EAAE;AAEI,MAAM,OAA2B;AAAA,EACvC,UAA2B,EAAE,MAAM,GAAG;AAAA,EACtC,UAAwB,CAAC;AAAA,EACzB,YAA2B,CAAC;AAAA,EAE5B,YAAY,SAA0B,EAAE,MAAM,GAAG,GAAG;AACnD,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,MAAM,QAAqB;AAC1B,WAAO,CAAqB,MAAc,SAAyB,CAAC,MACnE,CAAC,YAAmD;AACnD,YAAM,QAAQ,YAAY,KAAK,SAAS,CAAC,EAAE,GAAG,QAAQ,MAAM,QAAQ,QAAwB,CAAC,CAAC,EAAE,CAAC;AACjG,WAAK,QAAQ,KAAK,KAAK;AACvB,aAAO;AAAA,IACR;AAAA,EACF;AAAA,EAEA,OAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,EAC9B,MAAM,KAAK,MAAM,QAAQ,GAAG;AAAA,EAC5B,OAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,EAC9B,MAAM,KAAK,MAAM,QAAQ,GAAG;AAAA,EAC5B,QAAQ,KAAK,MAAM,QAAQ,KAAK;AAAA,EAChC,SAAS,KAAK,MAAM,QAAQ,MAAM;AAAA,EAClC,UAAU,KAAK,MAAM,QAAQ,OAAO;AAAA,EAEpC,QAAQ,SAAwB;AAC/B,YAAQ,QAAQ,CAAC,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,IAAI,SAAS;AACZ,WAAO,CAAC,GAAG,KAAK,OAAO,EAAE,OAAO,KAAK,UAAU,QAAQ,CAAC,UAAU,YAAY,KAAK,SAAS,MAAM,MAAM,CAAC,CAAC;AAAA,EAC3G;AACD;","names":[]}
@@ -1,2 +1,2 @@
1
- import{match as m}from"path-to-regexp";import{Instance as d}from "../instance/index.min.mjs";import{StatusCodes as c}from "./types.min.mjs";var y=(e=>(e.created="created",e.updated="updated",e.deleted="deleted",e))(y||{});const p="__listener_emitter",h="*";class E{constructor(n,t){this.config=t;this.socketInstance=n,this.#r(),d.on("setup",()=>{const e=t.eventBus?.createStream(p,{fanout:!0});this.#s=e?e.publish:async s=>{n.to(s.channel).emit(s.channel,s)},e?.subscribe(async s=>{n.to(s.channel).emit(s.channel,s)})},1)}socketInstance;#e={onConnect:async()=>{},onDisconnect:async()=>{}};#n={};#s=async()=>{};async created(n,t,e){await this.#t(n,"created",{after:t.toJSON(),before:null},e)}async updated(n,{after:t,before:e},s){await this.#t(n,"updated",{after:t.toJSON(),before:e.toJSON()},s)}async deleted(n,t,e){await this.#t(n,"deleted",{before:t.toJSON(),after:null},e)}async#t(n,t,{before:e,after:s},r){const i=Array.isArray(r)?r:[r??h],o=n.flatMap(a=>i.map(l=>`${l}:${a}`));await Promise.all(o.map(async a=>this.#s({channel:a,type:t,before:e,after:s})))}set connectionCallbacks(n){this.#e=n,this.#r()}register(n,t){return this.#n[n]=t,this.#n[n+"/:id"]=t,this}#i(n){const t=r=>m(r)(n),e=Object.keys(this.#n).find(t)??null;if(!e)return null;const s=t(e);return s?{config:this.#n[e],params:s.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async n=>{const t=n.id;let e=null;const s=this.config.requestsAuth.tokens;n.handshake.auth.authorization&&s&&(e=await s.verifyAccessToken(n.handshake.auth.authorization??"").catch(()=>null)),n.on("leave",async(r,i)=>r.channel?(n.leave(r.channel),typeof i=="function"&&i({code:c.Ok,message:"",channel:r.channel})):typeof i=="function"&&i({code:c.ValidationError,message:"channel is required",channel:""})),n.on("join",async(r,i)=>{if(!r.channel)return typeof i=="function"&&i({code:c.ValidationError,message:"channel is required",channel:""});const o=r.channel,a=this.#i(o)??null;if(!a)return typeof i=="function"&&i({code:c.BadRequest,message:"unknown channel",channel:o});const u=`${await a.config({channel:o,user:e},a.params,r.query??{})??h}:${o}`;return n.join(u),typeof i=="function"&&i({code:c.Ok,message:"",channel:u})}),e&&await this.#e.onConnect(e.id,t),n.on("disconnect",async()=>{e&&await this.#e.onDisconnect(e.id,t)})})}}export{E as SocketEmitter};
1
+ import{match as u}from"path-to-regexp";import{Instance as h}from "../instance/index.min.mjs";import{BaseRequestAuthMethod as d}from "./requests-auth-methods/index.min.mjs";import{StatusCodes as a}from "./types.min.mjs";var y=(n=>(n.created="created",n.updated="updated",n.deleted="deleted",n))(y||{});const p="__listener_emitter",m="*";class S{constructor(e,s){this.config=s;this.socketInstance=e,this.#r(),h.on("setup",()=>{const n=s.eventBus?.createStream(p,{fanout:!0});this.#s=n?n.publish:async t=>{e.to(t.channel).emit(t.channel,t)},n?.subscribe(async t=>{e.to(t.channel).emit(t.channel,t)})},1)}socketInstance;#n={onConnect:async()=>{},onDisconnect:async()=>{}};#e={};#s=async()=>{};async created(e,s,n){await this.#t(e,"created",{after:s.toJSON(),before:null},n)}async updated(e,{after:s,before:n},t){await this.#t(e,"updated",{after:s.toJSON(),before:n.toJSON()},t)}async deleted(e,s,n){await this.#t(e,"deleted",{before:s.toJSON(),after:null},n)}async#t(e,s,{before:n,after:t},r){const o=Array.isArray(r)?r:[r??m],i=e.flatMap(c=>o.map(l=>`${l}:${c}`));await Promise.all(i.map(async c=>this.#s({channel:c,type:s,before:n,after:t})))}set connectionCallbacks(e){this.#n=e,this.#r()}register(e,s){return this.#e[e]=s,this.#e[e+"/:id"]=s,this}#o(e){const s=r=>u(r)(e),n=Object.keys(this.#e).find(s)??null;if(!n)return null;const t=s(n);return t?{config:this.#e[n],params:t.params}:null}#r=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{const s=e.id,n=await d.process(this.config.socketsAuthMethods,e.handshake.headers).catch(()=>null);e.on("leave",async(t,r)=>t.channel?(e.leave(t.channel),typeof r=="function"&&r({code:a.Ok,message:"",channel:t.channel})):typeof r=="function"&&r({code:a.ValidationError,message:"channel is required",channel:""})),e.on("join",async(t,r)=>{if(!t.channel)return typeof r=="function"&&r({code:a.ValidationError,message:"channel is required",channel:""});const o=t.channel,i=this.#o(o)??null;if(!i)return typeof r=="function"&&r({code:a.BadRequest,message:"unknown channel",channel:o});const l=`${await i.config({channel:o,user:n},i.params,t.query??{})??m}:${o}`;return e.join(l),typeof r=="function"&&r({code:a.Ok,message:"",channel:l})}),n&&await this.#n.onConnect(n.id,s),e.on("disconnect",async()=>{n&&await this.#n.onDisconnect(n.id,s)})})}}export{S as SocketEmitter};
2
2
  //# sourceMappingURL=sockets.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/sockets.ts"],"sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\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(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\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\tlet user = null as AuthUser | null\n\t\t\tconst tokensUtil = this.config.requestsAuth.tokens\n\t\t\tif (socket.handshake.auth.authorization && tokensUtil)\n\t\t\t\tuser = await tokensUtil.verifyAccessToken(socket.handshake.auth.authorization ?? '').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"],"mappings":"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","names":["Match","Instance","StatusCodes","EmitTypes","EmitterEvent","defaultTo","SocketEmitter","socket","config","#setupSocketConnection","stream","#publish","data","#connectionCallbacks","#routes","channels","to","#emit","after","before","type","toArray","channelMap","c","channel","callbacks","onJoin","#getConfig","matcher","key","matchedChannel","match","socketId","user","tokensUtil","callback","route","newChannel"]}
1
+ {"version":3,"sources":["../../../src/server/sockets.ts"],"sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\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(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\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"],"mappings":"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","names":["Match","Instance","BaseRequestAuthMethod","StatusCodes","EmitTypes","EmitterEvent","defaultTo","SocketEmitter","socket","config","#setupSocketConnection","stream","#publish","data","#connectionCallbacks","#routes","channels","to","#emit","after","before","type","toArray","channelMap","channel","callbacks","onJoin","#getConfig","matcher","key","matchedChannel","match","socketId","user","callback","route","newChannel"]}
@@ -1,5 +1,6 @@
1
1
  import { match as Match } from "path-to-regexp";
2
2
  import { Instance } from "../instance/index.mjs";
3
+ import { BaseRequestAuthMethod } from "./requests-auth-methods/index.mjs";
3
4
  import { StatusCodes } from "./types.mjs";
4
5
  var EmitTypes = /* @__PURE__ */ ((EmitTypes2) => {
5
6
  EmitTypes2["created"] = "created";
@@ -73,10 +74,7 @@ class SocketEmitter {
73
74
  this.socketInstance.removeAllListeners("connection");
74
75
  this.socketInstance.on("connection", async (socket) => {
75
76
  const socketId = socket.id;
76
- let user = null;
77
- const tokensUtil = this.config.requestsAuth.tokens;
78
- if (socket.handshake.auth.authorization && tokensUtil)
79
- user = await tokensUtil.verifyAccessToken(socket.handshake.auth.authorization ?? "").catch(() => null);
77
+ const user = await BaseRequestAuthMethod.process(this.config.socketsAuthMethods, socket.handshake.headers).catch(() => null);
80
78
  socket.on("leave", async (data, callback) => {
81
79
  if (!data.channel)
82
80
  return typeof callback === "function" && callback({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/sockets.ts"],"sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\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(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\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\tlet user = null as AuthUser | null\n\t\t\tconst tokensUtil = this.config.requestsAuth.tokens\n\t\t\tif (socket.handshake.auth.authorization && tokensUtil)\n\t\t\t\tuser = await tokensUtil.verifyAccessToken(socket.handshake.auth.authorization ?? '').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"],"mappings":"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","names":["EmitTypes","to"]}
1
+ {"version":3,"sources":["../../../src/server/sockets.ts"],"sourcesContent":["import { match as Match } from 'path-to-regexp'\nimport type { Server } from 'socket.io'\n\nimport type { Entity } from '../dbs/base/core'\nimport { Instance } from '../instance'\nimport type { AuthUser } from '../types'\nimport type { ServerConfig } from './pipes'\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(\n\t\t\t'setup',\n\t\t\t() => {\n\t\t\t\tconst stream = config.eventBus?.createStream(EmitterEvent as never, { fanout: true })\n\t\t\t\tthis.#publish = stream\n\t\t\t\t\t? (stream.publish as unknown as (data: EmitData) => Promise<void>)\n\t\t\t\t\t: async (data: EmitData) => {\n\t\t\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t\t\t}\n\t\t\t\tstream?.subscribe(async (data: EmitData) => {\n\t\t\t\t\tsocket.to(data.channel).emit(data.channel, data)\n\t\t\t\t})\n\t\t\t},\n\t\t\t1,\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"],"mappings":"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","names":["EmitTypes","to"]}
@@ -1,2 +1,2 @@
1
- const r={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},s={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,AuthorizationExpired:461};function t(e,o){return{cb:e,onSetup:o}}const n=(...e)=>t(...e),u=(...e)=>t(...e);export{r as Methods,s as StatusCodes,u as makeErrorMiddleware,n as makeMiddleware};
1
+ const r={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},s={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,TokenExpired:461};function t(e,o){return{cb:e,onSetup:o}}const n=(...e)=>t(...e),u=(...e)=>t(...e);export{r as Methods,s as StatusCodes,u as makeErrorMiddleware,n as makeMiddleware};
2
2
  //# sourceMappingURL=types.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/types.ts"],"sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\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\tAuthorizationExpired: 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\tcontext?: (req: Request<RouteDefToReqRes<RouteDef>>) => Awaitable<Record<string, unknown>>\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\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\tcontext: Awaited<ReturnType<GetApiPart<T, 'context'>>>\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> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\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 makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n"],"mappings":"AAOO,MAAMA,EAAU,CACtB,KAAM,OACN,IAAK,MACL,KAAM,OACN,IAAK,MACL,MAAO,QACP,OAAQ,SACR,QAAS,SACV,EAEaC,EAAc,CAC1B,GAAI,IACJ,MAAO,IACP,WAAY,IACZ,iBAAkB,IAClB,cAAe,IACf,SAAU,IACV,gBAAiB,IACjB,gBAAiB,IACjB,qBAAsB,GACvB,EAkHA,SAASC,EAA+DC,EAAQC,EAA2B,CAC1G,MAAO,CAAE,GAAAD,EAAI,QAAAC,CAAQ,CACtB,CAEO,MAAMC,EAAiB,IAA0BC,IACvDJ,EAAsB,GAAGI,CAAI,EACjBC,EAAsB,IAA0BD,IAC5DJ,EAAsB,GAAGI,CAAI","names":["Methods","StatusCodes","makeMiddlewareHandler","cb","onSetup","makeMiddleware","args","makeErrorMiddleware"]}
1
+ {"version":3,"sources":["../../../src/server/types.ts"],"sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\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\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> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\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 makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n"],"mappings":"AAOO,MAAMA,EAAU,CACtB,KAAM,OACN,IAAK,MACL,KAAM,OACN,IAAK,MACL,MAAO,QACP,OAAQ,SACR,QAAS,SACV,EAEaC,EAAc,CAC1B,GAAI,IACJ,MAAO,IACP,WAAY,IACZ,iBAAkB,IAClB,cAAe,IACf,SAAU,IACV,gBAAiB,IACjB,gBAAiB,IACjB,aAAc,GACf,EAgHA,SAASC,EAA+DC,EAAQC,EAA2B,CAC1G,MAAO,CAAE,GAAAD,EAAI,QAAAC,CAAQ,CACtB,CAEO,MAAMC,EAAiB,IAA0BC,IACvDJ,EAAsB,GAAGI,CAAI,EACjBC,EAAsB,IAA0BD,IAC5DJ,EAAsB,GAAGI,CAAI","names":["Methods","StatusCodes","makeMiddlewareHandler","cb","onSetup","makeMiddleware","args","makeErrorMiddleware"]}
@@ -16,7 +16,7 @@ const StatusCodes = {
16
16
  NotFound: 404,
17
17
  ValidationError: 422,
18
18
  TooManyRequests: 429,
19
- AuthorizationExpired: 461
19
+ TokenExpired: 461
20
20
  };
21
21
  function makeMiddlewareHandler(cb, onSetup) {
22
22
  return { cb, onSetup };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/types.ts"],"sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\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\tAuthorizationExpired: 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\tcontext?: (req: Request<RouteDefToReqRes<RouteDef>>) => Awaitable<Record<string, unknown>>\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\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\tcontext: Awaited<ReturnType<GetApiPart<T, 'context'>>>\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> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\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 makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n"],"mappings":"AAOO,MAAM,UAAU;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACV;AAEO,MAAM,cAAc;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AACvB;AAkHA,SAAS,sBAA+D,IAAQ,SAA2B;AAC1G,SAAO,EAAE,IAAI,QAAQ;AACtB;AAEO,MAAM,iBAAiB,IAA0B,SACvD,sBAAsB,GAAG,IAAI;AACvB,MAAM,sBAAsB,IAA0B,SAC5D,sBAAsB,GAAG,IAAI;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/types.ts"],"sourcesContent":["import type { IsInTypeList, Pipe, PipeInput, PipeOutput, Prettify } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { Enum } from '../types'\nimport type { ServerConfig } from './pipes'\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\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> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\n) => Res<RouteDefToReqRes<Def>>\ntype RouteMiddlewareHandler<_Def extends RouteDef> = (req: Request<RouteDefToReqRes<RouteDef>>, config: ServerConfig) => Awaitable<void>\ntype ErrorHandler<Def extends RouteDef> = (\n\treq: Request<RouteDefToReqRes<Def>>,\n\tconfig: ServerConfig,\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 makeErrorMiddleware = <Def extends RouteDef>(...args: Parameters<typeof makeMiddlewareHandler<ErrorHandler<Def>, Def>>) =>\n\tmakeMiddlewareHandler(...args)\n"],"mappings":"AAOO,MAAM,UAAU;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACV;AAEO,MAAM,cAAc;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AACf;AAgHA,SAAS,sBAA+D,IAAQ,SAA2B;AAC1G,SAAO,EAAE,IAAI,QAAQ;AACtB;AAEO,MAAM,iBAAiB,IAA0B,SACvD,sBAAsB,GAAG,IAAI;AACvB,MAAM,sBAAsB,IAA0B,SAC5D,sBAAsB,GAAG,IAAI;","names":[]}
@@ -1,8 +1,14 @@
1
- import { C as Cache } from '../base-8yVXb67P.js';
2
1
  import * as valleyed from 'valleyed';
3
2
  import { PipeOutput } from 'valleyed';
4
3
  import { Redis, Cluster, RedisOptions } from 'ioredis';
5
4
 
5
+ declare abstract class Cache {
6
+ abstract set(key: string, data: string, ttlInSecs?: number): Promise<void>;
7
+ abstract get(key: string): Promise<string | null>;
8
+ abstract delete(key: string): Promise<void>;
9
+ abstract getOrSet<T>(key: string, fn: () => Promise<T>, ttlInSecs?: number): Promise<T>;
10
+ }
11
+
6
12
  declare const redisConfigPipe: () => valleyed.Pipe<{
7
13
  host: string;
8
14
  port: number | undefined;
@@ -1,19 +1,14 @@
1
- import { p as RequestError } from '../requestError-DqkM5BfW.js';
2
- export { E as EquippedError } from '../requestError-DqkM5BfW.js';
3
- export { V as ValidationError } from '../validationError-BMKfV51p.js';
1
+ import { R as RequestError } from '../requestError-7N-ngghg.js';
2
+ export { E as EquippedError } from '../requestError-7N-ngghg.js';
3
+ export { V as ValidationError } from '../validationError-BB4cfdZa.js';
4
4
  import 'valleyed';
5
5
  import '../types/index.js';
6
6
  import '../overrides-6Hxg764S.js';
7
7
  import '../base-CfeyC14V.js';
8
- import '../base-8yVXb67P.js';
8
+ import 'node:http2';
9
9
  import 'node:stream';
10
10
  import '@fastify/cookie';
11
11
 
12
- declare class AuthorizationExpired extends RequestError {
13
- statusCode: 461;
14
- constructor(message?: string, cause?: unknown);
15
- }
16
-
17
12
  declare class BadRequestError extends RequestError {
18
13
  statusCode: 400;
19
14
  constructor(message: string, cause?: unknown);
@@ -34,9 +29,9 @@ declare class NotFoundError extends RequestError {
34
29
  constructor(message?: string, cause?: unknown);
35
30
  }
36
31
 
37
- declare class RefreshTokenMisusedError extends RequestError {
38
- statusCode: 401;
32
+ declare class TokenExpired extends RequestError {
33
+ statusCode: 461;
39
34
  constructor(message?: string, cause?: unknown);
40
35
  }
41
36
 
42
- export { AuthorizationExpired, BadRequestError, NotAuthenticatedError, NotAuthorizedError, NotFoundError, RefreshTokenMisusedError, RequestError };
37
+ export { BadRequestError, NotAuthenticatedError, NotAuthorizedError, NotFoundError, RequestError, TokenExpired };
@@ -1,9 +1,8 @@
1
1
  export * from "./equippedError.js";
2
2
  export * from "./requestError.js";
3
- export * from "./types/authorizationExpired.js";
4
3
  export * from "./types/badRequestError.js";
5
4
  export * from "./types/notAuthenticatedError.js";
6
5
  export * from "./types/notAuthorizedError.js";
7
6
  export * from "./types/notFoundError.js";
8
- export * from "./types/refreshTokenMisusedError.js";
7
+ export * from "./types/tokenExpired.js";
9
8
  export * from "./types/validationError.js";
@@ -0,0 +1,11 @@
1
+ import { StatusCodes } from "../../server/index.js";
2
+ import { RequestError } from "../requestError.js";
3
+ class TokenExpired extends RequestError {
4
+ statusCode = StatusCodes.TokenExpired;
5
+ constructor(message = "Token expired", cause) {
6
+ super(message, [{ message }], cause);
7
+ }
8
+ }
9
+ export {
10
+ TokenExpired
11
+ };
@@ -1,8 +1,8 @@
1
1
  import express from 'express';
2
- import { b as RouteDef, k as RouterConfig, j as RouteConfig, m as RouteDefHandler, l as MergeRouteDefs, c as Route, S as ServerConfig, R as Request, d as Response, g as MethodsEnum } from './requestError-DqkM5BfW.js';
2
+ import { d as RouteDef, k as RouterConfig, j as RouteConfig, m as RouteDefHandler, l as MergeRouteDefs, e as Route, S as ServerConfig, a as Request, b as Response, g as MethodsEnum } from './requestError-7N-ngghg.js';
3
3
  import { FastifyRequest, FastifyReply } from 'fastify';
4
4
  import * as supertest_lib_agent from 'supertest/lib/agent';
5
- import http from 'http';
5
+ import http from 'node:http';
6
6
  import supertest from 'supertest';
7
7
  import { Server as Server$1 } from 'socket.io';
8
8
  import { E as Entity } from './core-BWUHISEy.js';
@@ -51,9 +51,10 @@ declare abstract class Server<Req = any, Res = any> {
51
51
  private implementations;
52
52
  socket: SocketEmitter;
53
53
  protected server: http.Server;
54
- protected cors: {
55
- origin: string;
54
+ protected get cors(): {
55
+ origin: string[] | undefined;
56
56
  methods: string[];
57
+ credentials: boolean | undefined;
57
58
  };
58
59
  constructor(server: http.Server, config: ServerConfig, implementations: {
59
60
  parseRequest: (req: Req) => Promise<Request<any>>;
@@ -1,20 +1,20 @@
1
1
  export { Instance } from './instance/index.js';
2
2
  import 'pino';
3
3
  import 'valleyed';
4
- import './requestError-DqkM5BfW.js';
4
+ import './requestError-7N-ngghg.js';
5
5
  import './types/index.js';
6
6
  import './overrides-6Hxg764S.js';
7
7
  import './base-CfeyC14V.js';
8
- import './base-8yVXb67P.js';
8
+ import 'node:http2';
9
9
  import 'node:stream';
10
10
  import '@fastify/cookie';
11
11
  import './kafka-DCpqW_YM.js';
12
12
  import './events/index.js';
13
- import './fastify-CDJ2WuLy.js';
13
+ import './fastify-B6FUtYe9.js';
14
14
  import 'express';
15
15
  import 'fastify';
16
16
  import 'supertest/lib/agent';
17
- import 'http';
17
+ import 'node:http';
18
18
  import 'supertest';
19
19
  import 'socket.io';
20
20
  import './core-BWUHISEy.js';