equipped 5.1.10 → 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 (230) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/dbs/mongo/changes.cjs +5 -1
  3. package/dist/cjs/dbs/mongo/changes.cjs.map +1 -1
  4. package/dist/cjs/dbs/mongo/changes.min.cjs +1 -1
  5. package/dist/cjs/dbs/mongo/changes.min.cjs.map +1 -1
  6. package/dist/cjs/errors/index.cjs +1 -2
  7. package/dist/cjs/errors/index.cjs.map +1 -1
  8. package/dist/cjs/errors/index.min.cjs +1 -1
  9. package/dist/cjs/errors/index.min.cjs.map +1 -1
  10. package/dist/cjs/errors/types/tokenExpired.cjs +12 -0
  11. package/dist/cjs/errors/types/tokenExpired.cjs.map +1 -0
  12. package/dist/cjs/errors/types/{refreshTokenMisusedError.min.cjs → tokenExpired.min.cjs} +2 -2
  13. package/dist/cjs/errors/types/tokenExpired.min.cjs.map +1 -0
  14. package/dist/cjs/events/types/kafka.cjs +13 -16
  15. package/dist/cjs/events/types/kafka.cjs.map +1 -1
  16. package/dist/cjs/events/types/kafka.min.cjs +1 -1
  17. package/dist/cjs/events/types/kafka.min.cjs.map +1 -1
  18. package/dist/cjs/instance/index.cjs.map +1 -1
  19. package/dist/cjs/instance/index.min.cjs.map +1 -1
  20. package/dist/cjs/server/impls/base.cjs +17 -17
  21. package/dist/cjs/server/impls/base.cjs.map +1 -1
  22. package/dist/cjs/server/impls/base.min.cjs +1 -1
  23. package/dist/cjs/server/impls/base.min.cjs.map +1 -1
  24. package/dist/cjs/server/impls/express.cjs +2 -13
  25. package/dist/cjs/server/impls/express.cjs.map +1 -1
  26. package/dist/cjs/server/impls/express.min.cjs +1 -1
  27. package/dist/cjs/server/impls/express.min.cjs.map +1 -1
  28. package/dist/cjs/server/impls/fastify.cjs +3 -14
  29. package/dist/cjs/server/impls/fastify.cjs.map +1 -1
  30. package/dist/cjs/server/impls/fastify.min.cjs +1 -1
  31. package/dist/cjs/server/impls/fastify.min.cjs.map +1 -1
  32. package/dist/cjs/server/index.cjs +1 -1
  33. package/dist/cjs/server/index.cjs.map +1 -1
  34. package/dist/cjs/server/index.min.cjs +1 -1
  35. package/dist/cjs/server/index.min.cjs.map +1 -1
  36. package/dist/cjs/server/middlewares/requireAuthUser.cjs +9 -52
  37. package/dist/cjs/server/middlewares/requireAuthUser.cjs.map +1 -1
  38. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs +1 -1
  39. package/dist/cjs/server/middlewares/requireAuthUser.min.cjs.map +1 -1
  40. package/dist/cjs/server/pipes.cjs +23 -8
  41. package/dist/cjs/server/pipes.cjs.map +1 -1
  42. package/dist/cjs/server/pipes.min.cjs +1 -1
  43. package/dist/cjs/server/pipes.min.cjs.map +1 -1
  44. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs +21 -0
  45. package/dist/cjs/server/requests-auth-methods/apiKeys.cjs.map +1 -0
  46. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs +2 -0
  47. package/dist/cjs/server/requests-auth-methods/apiKeys.min.cjs.map +1 -0
  48. package/dist/cjs/server/requests-auth-methods/base.cjs +20 -0
  49. package/dist/cjs/server/requests-auth-methods/base.cjs.map +1 -0
  50. package/dist/cjs/server/requests-auth-methods/base.min.cjs +2 -0
  51. package/dist/cjs/server/requests-auth-methods/base.min.cjs.map +1 -0
  52. package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.cjs +2 -1
  53. package/dist/cjs/server/requests-auth-methods/index.cjs.map +1 -0
  54. package/dist/cjs/server/{requests-auth → requests-auth-methods}/index.min.cjs +1 -1
  55. package/dist/cjs/server/requests-auth-methods/index.min.cjs.map +1 -0
  56. package/dist/cjs/server/requests-auth-methods/jwt.cjs +78 -0
  57. package/dist/cjs/server/requests-auth-methods/jwt.cjs.map +1 -0
  58. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs +2 -0
  59. package/dist/cjs/server/requests-auth-methods/jwt.min.cjs.map +1 -0
  60. package/dist/cjs/server/requests.cjs +1 -9
  61. package/dist/cjs/server/requests.cjs.map +1 -1
  62. package/dist/cjs/server/requests.min.cjs +1 -1
  63. package/dist/cjs/server/requests.min.cjs.map +1 -1
  64. package/dist/cjs/server/routes.cjs +1 -2
  65. package/dist/cjs/server/routes.cjs.map +1 -1
  66. package/dist/cjs/server/routes.min.cjs +1 -1
  67. package/dist/cjs/server/routes.min.cjs.map +1 -1
  68. package/dist/cjs/server/sockets.cjs +2 -4
  69. package/dist/cjs/server/sockets.cjs.map +1 -1
  70. package/dist/cjs/server/sockets.min.cjs +1 -1
  71. package/dist/cjs/server/sockets.min.cjs.map +1 -1
  72. package/dist/cjs/server/types.cjs +1 -1
  73. package/dist/cjs/server/types.cjs.map +1 -1
  74. package/dist/cjs/server/types.min.cjs +1 -1
  75. package/dist/cjs/server/types.min.cjs.map +1 -1
  76. package/dist/esm/dbs/mongo/changes.min.mjs +1 -1
  77. package/dist/esm/dbs/mongo/changes.min.mjs.map +1 -1
  78. package/dist/esm/dbs/mongo/changes.mjs +5 -1
  79. package/dist/esm/dbs/mongo/changes.mjs.map +1 -1
  80. package/dist/esm/errors/index.min.mjs +1 -1
  81. package/dist/esm/errors/index.min.mjs.map +1 -1
  82. package/dist/esm/errors/index.mjs +1 -2
  83. package/dist/esm/errors/index.mjs.map +1 -1
  84. package/dist/esm/errors/types/tokenExpired.min.mjs +2 -0
  85. package/dist/esm/errors/types/tokenExpired.min.mjs.map +1 -0
  86. package/dist/esm/errors/types/tokenExpired.mjs +12 -0
  87. package/dist/esm/errors/types/tokenExpired.mjs.map +1 -0
  88. package/dist/esm/events/types/kafka.min.mjs +1 -1
  89. package/dist/esm/events/types/kafka.min.mjs.map +1 -1
  90. package/dist/esm/events/types/kafka.mjs +13 -16
  91. package/dist/esm/events/types/kafka.mjs.map +1 -1
  92. package/dist/esm/instance/index.min.mjs +1 -1
  93. package/dist/esm/instance/index.min.mjs.map +1 -1
  94. package/dist/esm/instance/index.mjs.map +1 -1
  95. package/dist/esm/server/impls/base.min.mjs +1 -1
  96. package/dist/esm/server/impls/base.min.mjs.map +1 -1
  97. package/dist/esm/server/impls/base.mjs +9 -9
  98. package/dist/esm/server/impls/base.mjs.map +1 -1
  99. package/dist/esm/server/impls/express.min.mjs +1 -1
  100. package/dist/esm/server/impls/express.min.mjs.map +1 -1
  101. package/dist/esm/server/impls/express.mjs +2 -13
  102. package/dist/esm/server/impls/express.mjs.map +1 -1
  103. package/dist/esm/server/impls/fastify.min.mjs +1 -1
  104. package/dist/esm/server/impls/fastify.min.mjs.map +1 -1
  105. package/dist/esm/server/impls/fastify.mjs +2 -13
  106. package/dist/esm/server/impls/fastify.mjs.map +1 -1
  107. package/dist/esm/server/index.min.mjs +1 -1
  108. package/dist/esm/server/index.min.mjs.map +1 -1
  109. package/dist/esm/server/index.mjs +1 -1
  110. package/dist/esm/server/index.mjs.map +1 -1
  111. package/dist/esm/server/middlewares/requireAuthUser.min.mjs +1 -1
  112. package/dist/esm/server/middlewares/requireAuthUser.min.mjs.map +1 -1
  113. package/dist/esm/server/middlewares/requireAuthUser.mjs +9 -52
  114. package/dist/esm/server/middlewares/requireAuthUser.mjs.map +1 -1
  115. package/dist/esm/server/pipes.min.mjs +1 -1
  116. package/dist/esm/server/pipes.min.mjs.map +1 -1
  117. package/dist/esm/server/pipes.mjs +23 -8
  118. package/dist/esm/server/pipes.mjs.map +1 -1
  119. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs +2 -0
  120. package/dist/esm/server/requests-auth-methods/apiKeys.min.mjs.map +1 -0
  121. package/dist/esm/server/requests-auth-methods/apiKeys.mjs +21 -0
  122. package/dist/esm/server/requests-auth-methods/apiKeys.mjs.map +1 -0
  123. package/dist/esm/server/requests-auth-methods/base.min.mjs +2 -0
  124. package/dist/esm/server/requests-auth-methods/base.min.mjs.map +1 -0
  125. package/dist/esm/server/requests-auth-methods/base.mjs +20 -0
  126. package/dist/esm/server/requests-auth-methods/base.mjs.map +1 -0
  127. package/dist/esm/server/requests-auth-methods/index.min.mjs +2 -0
  128. package/dist/esm/server/requests-auth-methods/index.min.mjs.map +1 -0
  129. package/dist/esm/server/requests-auth-methods/index.mjs +4 -0
  130. package/dist/esm/server/requests-auth-methods/index.mjs.map +1 -0
  131. package/dist/esm/server/requests-auth-methods/jwt.min.mjs +2 -0
  132. package/dist/esm/server/requests-auth-methods/jwt.min.mjs.map +1 -0
  133. package/dist/esm/server/requests-auth-methods/jwt.mjs +78 -0
  134. package/dist/esm/server/requests-auth-methods/jwt.mjs.map +1 -0
  135. package/dist/esm/server/requests.min.mjs +1 -1
  136. package/dist/esm/server/requests.min.mjs.map +1 -1
  137. package/dist/esm/server/requests.mjs +1 -9
  138. package/dist/esm/server/requests.mjs.map +1 -1
  139. package/dist/esm/server/routes.min.mjs +1 -1
  140. package/dist/esm/server/routes.min.mjs.map +1 -1
  141. package/dist/esm/server/routes.mjs +1 -2
  142. package/dist/esm/server/routes.mjs.map +1 -1
  143. package/dist/esm/server/sockets.min.mjs +1 -1
  144. package/dist/esm/server/sockets.min.mjs.map +1 -1
  145. package/dist/esm/server/sockets.mjs +2 -4
  146. package/dist/esm/server/sockets.mjs.map +1 -1
  147. package/dist/esm/server/types.min.mjs +1 -1
  148. package/dist/esm/server/types.min.mjs.map +1 -1
  149. package/dist/esm/server/types.mjs +1 -1
  150. package/dist/esm/server/types.mjs.map +1 -1
  151. package/dist/types/cache/index.d.ts +7 -1
  152. package/dist/types/dbs/mongo/changes.js +5 -1
  153. package/dist/types/errors/index.d.ts +7 -12
  154. package/dist/types/errors/index.js +1 -2
  155. package/dist/types/errors/types/tokenExpired.js +11 -0
  156. package/dist/types/events/types/kafka.js +13 -16
  157. package/dist/types/{fastify-CDJ2WuLy.d.ts → fastify-B6FUtYe9.d.ts} +5 -4
  158. package/dist/types/index.d.ts +4 -4
  159. package/dist/types/instance/index.d.ts +63 -16
  160. package/dist/types/{requestError-DqkM5BfW.d.ts → requestError-7N-ngghg.d.ts} +97 -80
  161. package/dist/types/server/impls/base.js +9 -9
  162. package/dist/types/server/impls/express.js +2 -13
  163. package/dist/types/server/impls/fastify.js +2 -13
  164. package/dist/types/server/index.d.ts +62 -20
  165. package/dist/types/server/index.js +1 -1
  166. package/dist/types/server/middlewares/requireAuthUser.js +9 -52
  167. package/dist/types/server/pipes.js +23 -8
  168. package/dist/types/server/requests-auth-methods/apiKeys.js +20 -0
  169. package/dist/types/server/requests-auth-methods/base.js +19 -0
  170. package/dist/types/server/requests-auth-methods/index.js +3 -0
  171. package/dist/types/server/requests-auth-methods/jwt.js +77 -0
  172. package/dist/types/server/requests.js +1 -9
  173. package/dist/types/server/routes.js +1 -2
  174. package/dist/types/server/sockets.js +2 -4
  175. package/dist/types/server/types.js +1 -1
  176. package/dist/types/{validationError-BMKfV51p.d.ts → validationError-BB4cfdZa.d.ts} +1 -1
  177. package/dist/types/validations/index.d.ts +3 -9
  178. package/package.json +13 -12
  179. package/dist/cjs/errors/types/authorizationExpired.cjs +0 -12
  180. package/dist/cjs/errors/types/authorizationExpired.cjs.map +0 -1
  181. package/dist/cjs/errors/types/authorizationExpired.min.cjs +0 -2
  182. package/dist/cjs/errors/types/authorizationExpired.min.cjs.map +0 -1
  183. package/dist/cjs/errors/types/refreshTokenMisusedError.cjs +0 -12
  184. package/dist/cjs/errors/types/refreshTokenMisusedError.cjs.map +0 -1
  185. package/dist/cjs/errors/types/refreshTokenMisusedError.min.cjs.map +0 -1
  186. package/dist/cjs/server/middlewares/parseAuthUser.cjs +0 -21
  187. package/dist/cjs/server/middlewares/parseAuthUser.cjs.map +0 -1
  188. package/dist/cjs/server/middlewares/parseAuthUser.min.cjs +0 -2
  189. package/dist/cjs/server/middlewares/parseAuthUser.min.cjs.map +0 -1
  190. package/dist/cjs/server/requests-auth/apiKeys.cjs +0 -6
  191. package/dist/cjs/server/requests-auth/apiKeys.cjs.map +0 -1
  192. package/dist/cjs/server/requests-auth/apiKeys.min.cjs +0 -2
  193. package/dist/cjs/server/requests-auth/apiKeys.min.cjs.map +0 -1
  194. package/dist/cjs/server/requests-auth/index.cjs.map +0 -1
  195. package/dist/cjs/server/requests-auth/index.min.cjs.map +0 -1
  196. package/dist/cjs/server/requests-auth/tokens.cjs +0 -92
  197. package/dist/cjs/server/requests-auth/tokens.cjs.map +0 -1
  198. package/dist/cjs/server/requests-auth/tokens.min.cjs +0 -2
  199. package/dist/cjs/server/requests-auth/tokens.min.cjs.map +0 -1
  200. package/dist/esm/errors/types/authorizationExpired.min.mjs +0 -2
  201. package/dist/esm/errors/types/authorizationExpired.min.mjs.map +0 -1
  202. package/dist/esm/errors/types/authorizationExpired.mjs +0 -12
  203. package/dist/esm/errors/types/authorizationExpired.mjs.map +0 -1
  204. package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs +0 -2
  205. package/dist/esm/errors/types/refreshTokenMisusedError.min.mjs.map +0 -1
  206. package/dist/esm/errors/types/refreshTokenMisusedError.mjs +0 -12
  207. package/dist/esm/errors/types/refreshTokenMisusedError.mjs.map +0 -1
  208. package/dist/esm/server/middlewares/parseAuthUser.min.mjs +0 -2
  209. package/dist/esm/server/middlewares/parseAuthUser.min.mjs.map +0 -1
  210. package/dist/esm/server/middlewares/parseAuthUser.mjs +0 -21
  211. package/dist/esm/server/middlewares/parseAuthUser.mjs.map +0 -1
  212. package/dist/esm/server/requests-auth/apiKeys.min.mjs +0 -2
  213. package/dist/esm/server/requests-auth/apiKeys.min.mjs.map +0 -1
  214. package/dist/esm/server/requests-auth/apiKeys.mjs +0 -6
  215. package/dist/esm/server/requests-auth/apiKeys.mjs.map +0 -1
  216. package/dist/esm/server/requests-auth/index.min.mjs +0 -2
  217. package/dist/esm/server/requests-auth/index.min.mjs.map +0 -1
  218. package/dist/esm/server/requests-auth/index.mjs +0 -3
  219. package/dist/esm/server/requests-auth/index.mjs.map +0 -1
  220. package/dist/esm/server/requests-auth/tokens.min.mjs +0 -2
  221. package/dist/esm/server/requests-auth/tokens.min.mjs.map +0 -1
  222. package/dist/esm/server/requests-auth/tokens.mjs +0 -92
  223. package/dist/esm/server/requests-auth/tokens.mjs.map +0 -1
  224. package/dist/types/base-8yVXb67P.d.ts +0 -8
  225. package/dist/types/errors/types/authorizationExpired.js +0 -11
  226. package/dist/types/errors/types/refreshTokenMisusedError.js +0 -11
  227. package/dist/types/server/middlewares/parseAuthUser.js +0 -20
  228. package/dist/types/server/requests-auth/apiKeys.js +0 -5
  229. package/dist/types/server/requests-auth/index.js +0 -2
  230. package/dist/types/server/requests-auth/tokens.js +0 -91
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _socketio = require('socket.io');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../validations/index.min.cjs');var _valleyedmincjs = require('../../validations/valleyed.min.cjs');var _parseAuthUsermincjs = require('../middlewares/parseAuthUser.min.cjs');var _openapimincjs = require('../openapi.min.cjs');var _requestsmincjs = require('../requests.min.cjs');require('../routes');var _socketsmincjs = require('../sockets.min.cjs');var _typesmincjs = require('../types.min.cjs');const U=Object.entries(_typesmincjs.StatusCodes).filter(([,f])=>f>399).map(([f,s])=>({status:s,contentType:"application/json",pipe:_valleyed.v.meta(_valleyed.v.array(_valleyed.v.object({message:_valleyed.v.string(),field:_valleyed.v.optional(_valleyed.v.string())})),{$refId:`Errors.${f}Response`,description:`${f} Response`})}));class Z{constructor(s,t,i){;Z.prototype.__init.call(this);this.config=t;this.implementations=i;this.server=s,this.#e=new (0, _openapimincjs.OpenApi)(t);const c=new (0, _socketio.Server)(s,{cors:this.cors});this.socket=new (0, _socketsmincjs.SocketEmitter)(c,t),this.addRouter(this.#e.router())}#t=[];#s=new Map;#e;__init() {this.cors={origin:"*",methods:Object.values(_typesmincjs.Methods).filter(s=>s!==_typesmincjs.Methods.options).map(s=>s.toUpperCase())}}addRouter(...s){s.map(t=>t.routes).forEach(t=>this.addRoute(...t))}addRoute(...s){s.forEach(t=>{this.#t.push(async()=>{const{method:i,path:c,schema:o={},onError:d,middlewares:u=[]}=t,p=`(${i.toUpperCase()}) ${this.#e.cleanPath(c)}`;if(this.#s.get(p))throw new (0, _indexmincjs.EquippedError)(`Route key ${p} already registered. All route keys must be unique`,{route:t,key:p});u.unshift(_parseAuthUsermincjs.parseAuthUser),u.forEach(m=>_optionalChain([m, 'access', _ => _.onSetup, 'optionalCall', _2 => _2(t)])),_optionalChain([d, 'optionalAccess', _3 => _3.onSetup, 'optionalCall', _4 => _4(t)]);const{validateRequest:R,validateResponse:w,jsonSchema:v}=this.#o(i,o);this.#s.set(p,!0),await this.#e.register(t,v),this.implementations.registerRoute(i,this.#e.cleanPath(c),async(m,q)=>{const g=await R(await this.implementations.parseRequest(m));try{for(const n of u)await n.cb(g,this.config);const e=await t.handler(g,this.config),r=e instanceof _requestsmincjs.Response?e:new (0, _requestsmincjs.Response)({body:e,status:_typesmincjs.StatusCodes.Ok,headers:{},piped:!1});return await this.implementations.handleResponse(q,await w(r))}catch(e){if(_optionalChain([d, 'optionalAccess', _5 => _5.cb])){const r=await d.cb(g,this.config,e),n=r instanceof _requestsmincjs.Response?r:new (0, _requestsmincjs.Response)({body:r,status:_typesmincjs.StatusCodes.BadRequest,headers:{}});return await this.implementations.handleResponse(q,await w(n))}throw e}})})})}#o(s,t){const i=_nullishCoalesce(_optionalChain([t, 'optionalAccess', _6 => _6.defaultStatusCode]), () => (_typesmincjs.StatusCodes.Ok)),c=_nullishCoalesce(_optionalChain([t, 'optionalAccess', _7 => _7.defaultContentType]), () => ("application/json"));let o=i,d=c;const u={response:{},request:{}},p={},R={};[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"cookies",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![_typesmincjs.Methods.post,_typesmincjs.Methods.put,_typesmincjs.Methods.patch].includes(s)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"},{key:"responseCookies",type:"response"}].forEach(e=>{const r=_nullishCoalesce(t[e.key], () => (_valleyed.v.any()));if(!e.skip&&(e.type==="request"&&(p[e.key]=r,u.request[e.key]=_valleyed.v.schema(r)),e.type==="response")){const n=U.concat({status:i,contentType:d,pipe:r});R[e.key]=_valleyed.v.any().pipe(y=>{const E=_optionalChain([n, 'access', _8 => _8.find, 'call', _9 => _9(P=>P.status===o), 'optionalAccess', _10 => _10.pipe]);if(!E)throw _valleyed.PipeError.root(`schema not defined for status code: ${o}`,y);return _valleyed.v.assert(E,y)}),u.response[e.key]=n.map(y=>({status:y.status,contentType:y.contentType,schema:_valleyed.v.schema(y.pipe)}))}});const v=_valleyed.v.object(p);_valleyed.v.compile(v,{allErrors:!0});const m=_valleyed.v.object(R);return _valleyed.v.compile(m,{allErrors:!0}),{jsonSchema:u,validateRequest:async e=>{if(!Object.keys(p))return e;const r=t.context?await t.context(e):{};e.context=r;const n=_valleyedmincjs.requestLocalStorage.run(e,()=>_valleyed.v.validate(v,{params:e.params,headers:e.headers,query:e.query,body:e.body,cookies:e.cookies}));if(!n.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, n.error);return e.params=n.value.params,e.headers=n.value.headers,e.query=n.value.query,e.body=n.value.body,e.cookies=n.value.cookies,e},validateResponse:async e=>{if(!Object.keys(R))return e;o=e.status,d=e.contentType;const r=_valleyedmincjs.responseLocalStorage.run(e,()=>_valleyed.v.validate(m,{responseHeaders:e.headers,responseCookies:e.cookies,response:e.body}));if(!r.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, r.error);return e.body=r.value.response,e.headers=r.value.responseHeaders,e.cookieValues=r.value.responseCookies,e}}}test(){return _supertest2.default.call(void 0, this.server)}async start(){const s=this.config.port,t=_indexmincjs3.Instance.get(),{app:i}=t.settings;this.config.healthPath&&this.addRoute({method:_typesmincjs.Methods.get,path:this.config.healthPath,handler:async o=>o.res({body:`${t.id}(${i.name}) service running`,contentType:"text/plain"})}),this.implementations.registerNotFoundHandler(async o=>{const d=await this.implementations.parseRequest(o);throw new (0, _indexmincjs.NotFoundError)(`Route ${d.path} not found`)}),this.implementations.registerErrorHandler(async(o,d,u)=>{_indexmincjs3.Instance.get().log.error({error:o},"Uncaught error in route handler");const p=o instanceof _indexmincjs.RequestError?new (0, _requestsmincjs.Response)({body:o.serializedErrors,status:o.statusCode}):new (0, _requestsmincjs.Response)({body:[{message:"Something went wrong",data:o.message}],status:_typesmincjs.StatusCodes.BadRequest});return await this.implementations.handleResponse(u,p)}),await Promise.all(this.#t.map(o=>o()));const c=await this.implementations.start(s);return c&&_indexmincjs3.Instance.get().log.info(`${t.id}(${i.name}) service listening on port ${s}`),c}}exports.Server = Z;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('cors');var _socketio = require('socket.io');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _valleyed = require('valleyed');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../validations/index.min.cjs');var _valleyedmincjs = require('../../validations/valleyed.min.cjs');var _openapimincjs = require('../openapi.min.cjs');var _requestsmincjs = require('../requests.min.cjs');require('../routes');var _socketsmincjs = require('../sockets.min.cjs');var _typesmincjs = require('../types.min.cjs');const x=Object.entries(_typesmincjs.StatusCodes).filter(([,f])=>f>399).map(([f,o])=>({status:o,contentType:"application/json",pipe:_valleyed.v.meta(_valleyed.v.array(_valleyed.v.object({message:_valleyed.v.string(),field:_valleyed.v.optional(_valleyed.v.string())})),{$refId:`Errors.${f}Response`,description:`${f} Response`})}));class Y{constructor(o,s,n){this.config=s;this.implementations=n;this.server=o,this.#e=new (0, _openapimincjs.OpenApi)(s);const p=new (0, _socketio.Server)(o,{cors:this.cors});this.socket=new (0, _socketsmincjs.SocketEmitter)(p,s),this.addRouter(this.#e.router())}#t=[];#s=new Map;#e;get cors(){return{origin:_optionalChain([this, 'access', _ => _.config, 'access', _2 => _2.cors, 'optionalAccess', _3 => _3.origin]),methods:(_nullishCoalesce(_optionalChain([this, 'access', _4 => _4.config, 'access', _5 => _5.cors, 'optionalAccess', _6 => _6.methods]), () => (Object.values(_typesmincjs.Methods)))).filter(o=>o!==_typesmincjs.Methods.options).map(o=>o.toUpperCase()),credentials:_optionalChain([this, 'access', _7 => _7.config, 'access', _8 => _8.cors, 'optionalAccess', _9 => _9.credentials])}}addRouter(...o){o.map(s=>s.routes).forEach(s=>this.addRoute(...s))}addRoute(...o){o.forEach(s=>{this.#t.push(async()=>{const{method:n,path:p,schema:r={},onError:c,middlewares:d=[]}=s,i=`(${n.toUpperCase()}) ${this.#e.cleanPath(p)}`;if(this.#s.get(i))throw new (0, _indexmincjs.EquippedError)(`Route key ${i} already registered. All route keys must be unique`,{route:s,key:i});d.forEach(h=>_optionalChain([h, 'access', _10 => _10.onSetup, 'optionalCall', _11 => _11(s)])),_optionalChain([c, 'optionalAccess', _12 => _12.onSetup, 'optionalCall', _13 => _13(s)]);const{validateRequest:R,validateResponse:q,jsonSchema:v}=this.#o(n,r);this.#s.set(i,!0),await this.#e.register(s,v),this.implementations.registerRoute(n,this.#e.cleanPath(p),async(h,w)=>{const g=await R(await this.implementations.parseRequest(h));try{for(const u of d)await u.cb(g,this.config);const e=await s.handler(g,this.config),t=e instanceof _requestsmincjs.Response?e:new (0, _requestsmincjs.Response)({body:e,status:_typesmincjs.StatusCodes.Ok,headers:{},piped:!1});return await this.implementations.handleResponse(w,await q(t))}catch(e){if(_optionalChain([c, 'optionalAccess', _14 => _14.cb])){const t=await c.cb(g,this.config,e),u=t instanceof _requestsmincjs.Response?t:new (0, _requestsmincjs.Response)({body:t,status:_typesmincjs.StatusCodes.BadRequest,headers:{}});return await this.implementations.handleResponse(w,await q(u))}throw e}})})})}#o(o,s){const n=_nullishCoalesce(_optionalChain([s, 'optionalAccess', _15 => _15.defaultStatusCode]), () => (_typesmincjs.StatusCodes.Ok)),p=_nullishCoalesce(_optionalChain([s, 'optionalAccess', _16 => _16.defaultContentType]), () => ("application/json"));let r=n,c=p;const d={response:{},request:{}},i={},R={};[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"cookies",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![_typesmincjs.Methods.post,_typesmincjs.Methods.put,_typesmincjs.Methods.patch].includes(o)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"},{key:"responseCookies",type:"response"}].forEach(e=>{const t=_nullishCoalesce(s[e.key], () => (_valleyed.v.any()));if(!e.skip&&(e.type==="request"&&(i[e.key]=t,d.request[e.key]=_valleyed.v.schema(t)),e.type==="response")){const u=x.concat({status:n,contentType:c,pipe:t});R[e.key]=_valleyed.v.any().pipe(m=>{const E=_optionalChain([u, 'access', _17 => _17.find, 'call', _18 => _18(P=>P.status===r), 'optionalAccess', _19 => _19.pipe]);if(!E)throw _valleyed.PipeError.root(`schema not defined for status code: ${r}`,m);return _valleyed.v.assert(E,m)}),d.response[e.key]=u.map(m=>({status:m.status,contentType:m.contentType,schema:_valleyed.v.schema(m.pipe)}))}});const v=_valleyed.v.object(i);_valleyed.v.compile(v,{allErrors:!0});const h=_valleyed.v.object(R);return _valleyed.v.compile(h,{allErrors:!0}),{jsonSchema:d,validateRequest:async e=>{if(!Object.keys(i))return e;const t=_valleyedmincjs.requestLocalStorage.run(e,()=>_valleyed.v.validate(v,{params:e.params,headers:e.headers,query:e.query,body:e.body,cookies:e.cookies}));if(!t.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, t.error);return e.params=t.value.params,e.headers=t.value.headers,e.query=t.value.query,e.body=t.value.body,e.cookies=t.value.cookies,e},validateResponse:async e=>{if(!Object.keys(R))return e;r=e.status,c=e.contentType;const t=_valleyedmincjs.responseLocalStorage.run(e,()=>_valleyed.v.validate(h,{responseHeaders:e.headers,responseCookies:Object.fromEntries(Object.entries(e.cookies).map(([u,m])=>[u,m.value])),response:e.body}));if(!t.valid)throw _indexmincjs5.pipeErrorToValidationError.call(void 0, t.error);return e.body=t.value.response,e.headers=t.value.responseHeaders,e.cookieValues=t.value.responseCookies,e}}}test(){return _supertest2.default.call(void 0, this.server)}async start(){const o=this.config.port,s=_indexmincjs3.Instance.get(),{app:n}=s.settings;this.config.healthPath&&this.addRoute({method:_typesmincjs.Methods.get,path:this.config.healthPath,handler:async r=>r.res({body:`${s.id}(${n.name}) service running`,contentType:"text/plain"})}),this.implementations.registerNotFoundHandler(async r=>{const c=await this.implementations.parseRequest(r);throw new (0, _indexmincjs.NotFoundError)(`Route ${c.path} not found`)}),this.implementations.registerErrorHandler(async(r,c,d)=>{_indexmincjs3.Instance.get().log.error({error:r},"Uncaught error in route handler");const i=r instanceof _indexmincjs.RequestError?new (0, _requestsmincjs.Response)({body:r.serializedErrors,status:r.statusCode}):new (0, _requestsmincjs.Response)({body:[{message:"Something went wrong",data:r.message}],status:_typesmincjs.StatusCodes.BadRequest});return await this.implementations.handleResponse(d,i)}),await Promise.all(this.#t.map(r=>r()));const p=await this.implementations.start(o);return p&&_indexmincjs3.Instance.get().log.info(`${s.id}(${n.name}) service listening on port ${o}`),p}}exports.Server = Y;
2
2
  //# sourceMappingURL=base.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/impls/base.ts"],"names":["Methods","StatusCodes","v","key","server","config"],"mappings":"AAEA,szBAAuC,4FACjB,oCACkB,yDAG/B,4DACA,+DACqB,oEACA,2EAGS,mDAE9B,qDACAA,qBAA0CC,mDAMjC,+CAGH,MACb,CAAA,CAAA,MAAQ,CAAA,OAAO,CAAA,wBAAMC,CAAAA,CAAE,MAAA,CAAO,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAASA,CAAAA,GAAE,CAAA,CAAA,GAAO,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAOA,EAAE,CAAA,CAAA,MAAA,CAASA,CAAAA,CAAE,WAAY,CAAA,kBAC5E,CAAUC,IAAG,CAAA,WAAA,CAAA,IAAA,CACrB,WAAA,CAAA,KAAA,CAAA,WAAA,CAAA,MAAmB,CAAA,CAAA,OAAA,CAAA,WACpB,CAAC,MAGI,CAAA,CAAA,CAAA,KAaN,CAAA,WAAA,CAAA,QACCC,CAAAA,WACQC,CAAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MACA,CAAA,CAAA,OAAA,EAAA,CAAA,CAAA,QASR,CAAA,CAAA,WAAcD,CACd,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.min.cjs","sourcesContent":["import type http from 'http'\n\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { parseAuthUser } from '../middlewares/parseAuthUser'\nimport { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type RouteDef, StatusCodes, type Route } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected cors = {\n\t\torigin: '*',\n\t\tmethods: Object.values(Methods)\n\t\t\t.filter((m) => m !== Methods.options)\n\t\t\t.map((m) => m.toUpperCase()),\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.unshift(parseAuthUser as any)\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst context = schema.context ? await schema.context(request) : {}\n\t\t\trequest.context = context\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: response.cookies,\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/server/impls/base.ts"],"names":["v","server","config","implementations"],"mappings":"AAEA,iyBAAiC,qCACM,4FACjB,oCACkB,yDAG/B,4DACA,+DACqB,oEAGP,mDAEvB,qDACS,qBAAsD,mDAM7D,+CAGa,MAAA,CAAA,CAAA,MACb,CAAA,OAAQ,CAAA,wBAAA,CAAKA,CAAAA,MAAE,CAAMA,CAAAA,CAAE,CAAA,CAAA,CAAA,CAAA,EAAA,CAAO,CAAE,GAAA,CAAA,CAAA,GAASA,CAAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAO,CAAG,CAAA,MAAOA,CAAE,CAAA,CAAA,WAAW,CAAA,kBAChE,CAAA,IAAA,CAAA,WAAA,CAAA,IAAa,CAAA,WAAA,CAAA,KAAA,CAAA,WACrB,CAAA,MAAA,CAAA,CAAA,OAAmB,CAAA,WAAA,CAAA,MAAA,CAAA,CACpB,CAAC,KAGI,CAAA,WAAA,CAAA,QAcN,CAAA,WAAA,CAAA,MACCC,CAAAA,CACQC,CAAAA,CACAC,CAAAA,CAQP,CATO,CAAA,MAAA,CAAA,CAAA,OACA,EAAA,CAAA,CAAA,QAAA,CAAA,CAAA,WASR,CAAK,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/base.min.cjs","sourcesContent":["import type http from 'node:http'\n\nimport { type CorsOptions } from 'cors'\nimport { Server as SocketServer } from 'socket.io'\nimport supertest from 'supertest'\nimport { type Pipe, PipeError, v } from 'valleyed'\n\nimport { EquippedError, NotFoundError, RequestError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { pipeErrorToValidationError } from '../../validations'\nimport { requestLocalStorage, responseLocalStorage } from '../../validations/valleyed'\nimport { OpenApi, type OpenApiSchemaDef } from '../openapi'\nimport type { ServerConfig } from '../pipes'\nimport { type Request, Response } from '../requests'\nimport { Router } from '../routes'\nimport { SocketEmitter } from '../sockets'\nimport { Methods, type MethodsEnum, type Route, type RouteDef, StatusCodes } from '../types'\n\ntype RequestValidator = (req: Request<any>) => Promise<Request<any>>\ntype ResponseValidator = (res: Response<any>) => Promise<Response<any>>\n\nconst errorsSchemas = Object.entries(StatusCodes)\n\t.filter(([, value]) => value > 399)\n\t.map(([key, value]) => ({\n\t\tstatus: value,\n\t\tcontentType: 'application/json',\n\t\tpipe: v.meta(v.array(v.object({ message: v.string(), field: v.optional(v.string()) })), {\n\t\t\t$refId: `Errors.${key}Response`,\n\t\t\tdescription: `${key} Response`,\n\t\t}) as Pipe<any, any>,\n\t}))\n\nexport abstract class Server<Req = any, Res = any> {\n\t#queue: (() => void | Promise<void>)[] = []\n\t#routesByKey = new Map<string, boolean>()\n\t#openapi: OpenApi\n\tsocket: SocketEmitter\n\tprotected server: http.Server\n\tprotected get cors() {\n\t\treturn {\n\t\t\torigin: this.config.cors?.origin,\n\t\t\tmethods: (this.config.cors?.methods ?? Object.values(Methods)).filter((m) => m !== Methods.options).map((m) => m.toUpperCase()),\n\t\t\tcredentials: this.config.cors?.credentials,\n\t\t} satisfies CorsOptions\n\t}\n\n\tconstructor(\n\t\tserver: http.Server,\n\t\tprivate config: ServerConfig,\n\t\tprivate implementations: {\n\t\t\tparseRequest: (req: Req) => Promise<Request<any>>\n\t\t\thandleResponse: (res: Res, response: Response<any>) => Promise<void>\n\t\t\tregisterRoute: (method: MethodsEnum, path: string, cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterErrorHandler: (cb: (error: Error, req: Req, res: Res) => Promise<void>) => void\n\t\t\tregisterNotFoundHandler: (cb: (req: Req, res: Res) => Promise<void>) => void\n\t\t\tstart: (port: number) => Promise<boolean>\n\t\t},\n\t) {\n\t\tthis.server = server\n\t\tthis.#openapi = new OpenApi(config)\n\t\tconst socketInstance = new SocketServer(server, { cors: this.cors })\n\t\tthis.socket = new SocketEmitter(socketInstance, config)\n\t\tthis.addRouter(this.#openapi.router())\n\t}\n\n\taddRouter(...routers: Router<any>[]) {\n\t\trouters.map((router) => router.routes).forEach((routes) => this.addRoute(...routes))\n\t}\n\n\taddRoute<T extends RouteDef>(...routes: Route<T>[]) {\n\t\troutes.forEach((route) => {\n\t\t\tthis.#queue.push(async () => {\n\t\t\t\tconst { method, path, schema = {}, onError, middlewares = [] } = route\n\n\t\t\t\tconst key = `(${method.toUpperCase()}) ${this.#openapi.cleanPath(path)}`\n\t\t\t\tif (this.#routesByKey.get(key))\n\t\t\t\t\tthrow new EquippedError(`Route key ${key} already registered. All route keys must be unique`, { route, key })\n\n\t\t\t\tmiddlewares.forEach((m) => m.onSetup?.(route as any))\n\t\t\t\tonError?.onSetup?.(route as any)\n\n\t\t\t\tconst { validateRequest, validateResponse, jsonSchema } = this.#resolveSchema(method, schema)\n\n\t\t\t\tthis.#routesByKey.set(key, true)\n\t\t\t\tawait this.#openapi.register(route, jsonSchema)\n\t\t\t\tthis.implementations.registerRoute(method, this.#openapi.cleanPath(path), async (req: Req, res: Res) => {\n\t\t\t\t\tconst request = await validateRequest(await this.implementations.parseRequest(req))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const middleware of middlewares) await middleware.cb(request, this.config)\n\t\t\t\t\t\tconst rawRes = await route.handler(request, this.config)\n\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\trawRes instanceof Response\n\t\t\t\t\t\t\t\t? rawRes\n\t\t\t\t\t\t\t\t: new Response({ body: rawRes, status: StatusCodes.Ok, headers: {}, piped: false })\n\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (onError?.cb) {\n\t\t\t\t\t\t\tconst rawResponse = await onError.cb(request, this.config, error as Error)\n\t\t\t\t\t\t\tconst response =\n\t\t\t\t\t\t\t\trawResponse instanceof Response\n\t\t\t\t\t\t\t\t\t? rawResponse\n\t\t\t\t\t\t\t\t\t: new Response({ body: rawResponse, status: StatusCodes.BadRequest, headers: {} })\n\t\t\t\t\t\t\treturn await this.implementations.handleResponse(res, await validateResponse(response))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t#resolveSchema(method: MethodsEnum, schema: RouteDef) {\n\t\tconst defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok\n\t\tconst defaultContentType = schema?.defaultContentType ?? 'application/json'\n\t\tlet status = defaultStatusCode\n\t\tlet contentType = defaultContentType\n\t\tconst jsonSchema: OpenApiSchemaDef = { response: {}, request: {} }\n\t\tconst requestPipeDefs: Pick<RouteDef, 'body' | 'headers' | 'query' | 'params' | 'cookies'> = {}\n\t\tconst responsePipeDefs: Pick<RouteDef, 'response' | 'responseHeaders' | 'responseCookies'> = {}\n\n\t\tconst defs: {\n\t\t\tkey: Exclude<keyof RouteDef, `default${string}` | 'context'>\n\t\t\ttype: keyof OpenApiSchemaDef\n\t\t\tskip?: boolean\n\t\t}[] = [\n\t\t\t{ key: 'params', type: 'request' },\n\t\t\t{ key: 'headers', type: 'request' },\n\t\t\t{ key: 'cookies', type: 'request' },\n\t\t\t{ key: 'query', type: 'request' },\n\t\t\t{ key: 'body', type: 'request', skip: !(<MethodsEnum[]>[Methods.post, Methods.put, Methods.patch]).includes(method) },\n\t\t\t{ key: 'response', type: 'response' },\n\t\t\t{ key: 'responseHeaders', type: 'response' },\n\t\t\t{ key: 'responseCookies', type: 'response' },\n\t\t]\n\t\tdefs.forEach((def) => {\n\t\t\tconst pipe = schema[def.key] ?? v.any()\n\t\t\tif (def.skip) return\n\n\t\t\tif (def.type === 'request') {\n\t\t\t\trequestPipeDefs[def.key] = pipe\n\t\t\t\tjsonSchema.request[def.key as keyof typeof jsonSchema.request] = v.schema(pipe)\n\t\t\t}\n\t\t\tif (def.type === 'response') {\n\t\t\t\tconst pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe })\n\t\t\t\tresponsePipeDefs[def.key] = v.any().pipe((input) => {\n\t\t\t\t\tconst p = pipeRecords.find((r) => r.status === status)?.pipe\n\t\t\t\t\tif (!p) throw PipeError.root(`schema not defined for status code: ${status}`, input)\n\t\t\t\t\treturn v.assert(p, input)\n\t\t\t\t})\n\t\t\t\tjsonSchema.response[def.key as keyof typeof jsonSchema.response] = pipeRecords.map((record) => ({\n\t\t\t\t\tstatus: record.status,\n\t\t\t\t\tcontentType: record.contentType,\n\t\t\t\t\tschema: v.schema(record.pipe),\n\t\t\t\t}))\n\t\t\t}\n\t\t})\n\t\tconst requestPipe = v.object(requestPipeDefs)\n\t\tv.compile(requestPipe, { allErrors: true })\n\t\tconst responsePipe = v.object(responsePipeDefs)\n\t\tv.compile(responsePipe, { allErrors: true })\n\t\tconst validateRequest: RequestValidator = async (request) => {\n\t\t\tif (!Object.keys(requestPipeDefs)) return request\n\t\t\tconst validity = requestLocalStorage.run(request, () =>\n\t\t\t\tv.validate(requestPipe, {\n\t\t\t\t\tparams: request.params,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t\tquery: request.query,\n\t\t\t\t\tbody: request.body,\n\t\t\t\t\tcookies: request.cookies,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\trequest.params = validity.value.params!\n\t\t\trequest.headers = validity.value.headers!\n\t\t\trequest.query = validity.value.query!\n\t\t\trequest.body = validity.value.body!\n\t\t\trequest.cookies = validity.value.cookies!\n\t\t\treturn request\n\t\t}\n\t\tconst validateResponse: ResponseValidator = async (response) => {\n\t\t\tif (!Object.keys(responsePipeDefs)) return response\n\t\t\tstatus = response.status\n\t\t\tcontentType = response.contentType\n\n\t\t\tconst validity = responseLocalStorage.run(response, () =>\n\t\t\t\tv.validate(responsePipe, {\n\t\t\t\t\tresponseHeaders: response.headers,\n\t\t\t\t\tresponseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value] as const)),\n\t\t\t\t\tresponse: response.body,\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tif (!validity.valid) throw pipeErrorToValidationError(validity.error)\n\t\t\tresponse.body = validity.value.response!\n\t\t\tresponse.headers = validity.value.responseHeaders!\n\t\t\tresponse.cookieValues = validity.value.responseCookies!\n\t\t\treturn response\n\t\t}\n\t\treturn {\n\t\t\tjsonSchema,\n\t\t\tvalidateRequest,\n\t\t\tvalidateResponse,\n\t\t}\n\t}\n\n\ttest() {\n\t\treturn supertest(this.server)\n\t}\n\n\tasync start() {\n\t\tconst port = this.config.port\n\t\tconst instance = Instance.get()\n\t\tconst { app } = instance.settings\n\t\tif (this.config.healthPath)\n\t\t\tthis.addRoute({\n\t\t\t\tmethod: Methods.get,\n\t\t\t\tpath: this.config.healthPath,\n\t\t\t\thandler: async (req) =>\n\t\t\t\t\treq.res({\n\t\t\t\t\t\tbody: `${instance.id}(${app.name}) service running`,\n\t\t\t\t\t\tcontentType: 'text/plain',\n\t\t\t\t\t}),\n\t\t\t})\n\n\t\tthis.implementations.registerNotFoundHandler(async (req) => {\n\t\t\tconst request = await this.implementations.parseRequest(req)\n\t\t\tthrow new NotFoundError(`Route ${request.path} not found`)\n\t\t})\n\t\tthis.implementations.registerErrorHandler(async (error, _, res) => {\n\t\t\tInstance.get().log.error({ error }, 'Uncaught error in route handler')\n\t\t\tconst response =\n\t\t\t\terror instanceof RequestError\n\t\t\t\t\t? new Response({\n\t\t\t\t\t\t\tbody: error.serializedErrors,\n\t\t\t\t\t\t\tstatus: error.statusCode,\n\t\t\t\t\t\t})\n\t\t\t\t\t: new Response({\n\t\t\t\t\t\t\tbody: [{ message: 'Something went wrong', data: error.message }],\n\t\t\t\t\t\t\tstatus: StatusCodes.BadRequest,\n\t\t\t\t\t\t})\n\t\t\treturn await this.implementations.handleResponse(res, response)\n\t\t})\n\n\t\tawait Promise.all(this.#queue.map((cb) => cb()))\n\t\tconst started = await this.implementations.start(port)\n\t\tif (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${port}`)\n\t\treturn started\n\t}\n}\n"]}
@@ -18,16 +18,6 @@ class ExpressServer extends _basecjs.Server {
18
18
  const instance = _indexcjs.Instance.get();
19
19
  super(_http2.default.createServer(app), config, {
20
20
  parseRequest: async (req) => {
21
- const allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, _nullishCoalesce(val, () => ( null))]));
22
- const headers = {
23
- ...allHeaders,
24
- Authorization: req.get("authorization"),
25
- RefreshToken: req.get("x-refresh-token"),
26
- ApiKey: req.get("x-api-key"),
27
- ContentType: req.get("content-type"),
28
- Referer: req.get("referer"),
29
- UserAgent: req.get("user-agent")
30
- };
31
21
  const files = Object.fromEntries(
32
22
  await Promise.all(
33
23
  Object.entries(_nullishCoalesce(req.files, () => ( {}))).map(async ([key, file]) => {
@@ -54,9 +44,8 @@ class ExpressServer extends _basecjs.Server {
54
44
  query: _nullishCoalesce(req.query, () => ( {})),
55
45
  method: req.method,
56
46
  path: req.path,
57
- headers,
58
- files,
59
- context: {}
47
+ headers: req.headers,
48
+ files
60
49
  });
61
50
  },
62
51
  handleResponse: async (res, response) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/impls/express.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs"],"names":["app"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs","sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class ExpressServer extends Server<express.Request, express.Response> {\n\t#expressApp: express.Express\n\n\tconstructor(config: ServerConfig) {\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tsuper(http.createServer(app), config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]))\n\t\t\t\tconst headers = {\n\t\t\t\t\t...allHeaders,\n\t\t\t\t\tAuthorization: req.get('authorization'),\n\t\t\t\t\tRefreshToken: req.get('x-refresh-token'),\n\t\t\t\t\tApiKey: req.get('x-api-key'),\n\t\t\t\t\tContentType: req.get('content-type'),\n\t\t\t\t\tReferer: req.get('referer'),\n\t\t\t\t\tUserAgent: req.get('user-agent'),\n\t\t\t\t}\n\t\t\t\tconst files = Object.fromEntries(\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\t\t\tuploads.map(async (f) => ({\n\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\treturn new Request<any>({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody: req.body ?? {},\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? {},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.path,\n\t\t\t\t\theaders,\n\t\t\t\t\tfiles,\n\t\t\t\t\tcontext: {},\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tif (!response.piped) {\n\t\t\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\t\t\tres.status(response.status)[type](response.body).end()\n\t\t\t\t} else {\n\t\t\t\t\tresponse.body.pipe(res)\n\t\t\t\t}\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tthis.#expressApp[method]?.(path, cb)\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(async (err, req, res, _next) => cb(err, req, res))\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(cb)\n\t\t\t},\n\t\t\tstart: async (port) =>\n\t\t\t\tnew Promise((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst app = this.server.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(<Error>err)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t})\n\t\tthis.#expressApp = app\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t})) */\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/server/impls/express.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs"],"names":["app"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.cjs","sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class ExpressServer extends Server<express.Request, express.Response> {\n\t#expressApp: express.Express\n\n\tconstructor(config: ServerConfig) {\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tsuper(http.createServer(app), config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst files = Object.fromEntries(\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\t\t\tuploads.map(async (f) => ({\n\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\treturn new Request<any>({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody: req.body ?? {},\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? {},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.path,\n\t\t\t\t\theaders: req.headers,\n\t\t\t\t\tfiles,\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tif (!response.piped) {\n\t\t\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\t\t\tres.status(response.status)[type](response.body).end()\n\t\t\t\t} else {\n\t\t\t\t\tresponse.body.pipe(res)\n\t\t\t\t}\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tthis.#expressApp[method]?.(path, cb)\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(async (err, req, res, _next) => cb(err, req, res))\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(cb)\n\t\t\t},\n\t\t\tstart: async (port) =>\n\t\t\t\tnew Promise((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst app = this.server.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(<Error>err)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t})\n\t\tthis.#expressApp = app\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t})) */\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _http = require('http'); var _http2 = _interopRequireDefault(_http);var _cookieparser = require('cookie-parser'); var _cookieparser2 = _interopRequireDefault(_cookieparser);var _cors = require('cors'); var _cors2 = _interopRequireDefault(_cors);var _express = require('express'); var _express2 = _interopRequireDefault(_express);var _expressfileupload = require('express-fileupload'); var _expressfileupload2 = _interopRequireDefault(_expressfileupload);var _expressratelimit = require('express-rate-limit');var _helmet = require('helmet'); var _helmet2 = _interopRequireDefault(_helmet);var _pinohttp = require('pino-http');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _typesmincjs = require('../types.min.cjs');var _basemincjs = require('./base.min.cjs');class _ extends _basemincjs.Server{#e;constructor(a){const s=_express2.default.call(void 0, ),c=_indexmincjs.Instance.get();super(_http2.default.createServer(s),a,{parseRequest:async e=>{const o={...Object.fromEntries(Object.entries(e.headers).map(([i,n])=>[i,_nullishCoalesce(n, () => (null))])),Authorization:e.get("authorization"),RefreshToken:e.get("x-refresh-token"),ApiKey:e.get("x-api-key"),ContentType:e.get("content-type"),Referer:e.get("referer"),UserAgent:e.get("user-agent")},r=Object.fromEntries(await Promise.all(Object.entries(_nullishCoalesce(e.files, () => ({}))).map(async([i,n])=>{const l=Array.isArray(n)?n:[n],d=await Promise.all(l.map(async p=>({name:p.name,type:p.mimetype,size:p.size,isTruncated:p.truncated,data:p.data,duration:await _indexmincjs3.getMediaDuration.call(void 0, p.data)})));return[i,d]})));return new (0, _requestsmincjs.Request)({ip:e.ip,body:_nullishCoalesce(e.body, () => ({})),cookies:_nullishCoalesce(e.cookies, () => ({})),params:_nullishCoalesce(e.params, () => ({})),query:_nullishCoalesce(e.query, () => ({})),method:e.method,path:e.path,headers:o,files:r,context:{}})},handleResponse:async(e,t)=>{if(t.piped)t.body.pipe(e);else{Object.entries(t.headers).forEach(([r,i])=>e.header(r,i)),Object.entries(t.cookies).forEach(([r,{value:i,...n}])=>e.cookie(r,i,n));const o=t.body===null||t.body===void 0?"json":"send";e.status(t.status)[o](t.body).end()}},registerRoute:(e,t,o)=>{_optionalChain([this, 'access', _2 => _2.#e, 'access', _3 => _3[e], 'optionalCall', _4 => _4(t,o)])},registerErrorHandler:e=>{this.#e.use(async(t,o,r,i)=>e(t,o,r))},registerNotFoundHandler:e=>{this.#e.use(e)},start:async e=>new Promise((t,o)=>{try{const r=this.server.listen({host:"0.0.0.0",port:e},async()=>t(!0));_indexmincjs.Instance.on("close",r.close,1)}catch(r){o(r)}})}),this.#e=s,s.disable("x-powered-by"),a.requests.log&&s.use(_pinohttp.pinoHttp.call(void 0, {logger:c.log})),s.use(_express2.default.json()),s.use(_express2.default.text()),s.use(_cookieparser2.default.call(void 0, )),s.use(_helmet2.default.call(void 0, {crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1})),s.use(_cors2.default.call(void 0, this.cors)),s.use(_express2.default.urlencoded({extended:!1})),a.publicPath&&s.use(_express2.default.static(a.publicPath)),s.use(_expressfileupload2.default.call(void 0, {limits:{fileSize:c.settings.utils.maxFileUploadSizeInMb*1024*1024},useTempFiles:!1})),a.requests.rateLimit.enabled&&s.use(_expressratelimit.rateLimit.call(void 0, {windowMs:a.requests.rateLimit.periodInMs,limit:a.requests.rateLimit.limit,handler:(e,t)=>t.status(_typesmincjs.StatusCodes.TooManyRequests).json([{message:"Too Many Requests"}])}))}}exports.ExpressServer = _;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _http = require('http'); var _http2 = _interopRequireDefault(_http);var _cookieparser = require('cookie-parser'); var _cookieparser2 = _interopRequireDefault(_cookieparser);var _cors = require('cors'); var _cors2 = _interopRequireDefault(_cors);var _express = require('express'); var _express2 = _interopRequireDefault(_express);var _expressfileupload = require('express-fileupload'); var _expressfileupload2 = _interopRequireDefault(_expressfileupload);var _expressratelimit = require('express-rate-limit');var _helmet = require('helmet'); var _helmet2 = _interopRequireDefault(_helmet);var _pinohttp = require('pino-http');var _indexmincjs = require('../../instance/index.min.cjs');var _indexmincjs3 = require('../../utilities/index.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _typesmincjs = require('../types.min.cjs');var _basemincjs = require('./base.min.cjs');class C extends _basemincjs.Server{#e;constructor(i){const t=_express2.default.call(void 0, ),u=_indexmincjs.Instance.get();super(_http2.default.createServer(t),i,{parseRequest:async e=>{const s=Object.fromEntries(await Promise.all(Object.entries(_nullishCoalesce(e.files, () => ({}))).map(async([o,r])=>{const a=Array.isArray(r)?r:[r],m=await Promise.all(a.map(async n=>({name:n.name,type:n.mimetype,size:n.size,isTruncated:n.truncated,data:n.data,duration:await _indexmincjs3.getMediaDuration.call(void 0, n.data)})));return[o,m]})));return new (0, _requestsmincjs.Request)({ip:e.ip,body:_nullishCoalesce(e.body, () => ({})),cookies:_nullishCoalesce(e.cookies, () => ({})),params:_nullishCoalesce(e.params, () => ({})),query:_nullishCoalesce(e.query, () => ({})),method:e.method,path:e.path,headers:e.headers,files:s})},handleResponse:async(e,s)=>{if(s.piped)s.body.pipe(e);else{Object.entries(s.headers).forEach(([r,a])=>e.header(r,a)),Object.entries(s.cookies).forEach(([r,{value:a,...m}])=>e.cookie(r,a,m));const o=s.body===null||s.body===void 0?"json":"send";e.status(s.status)[o](s.body).end()}},registerRoute:(e,s,o)=>{_optionalChain([this, 'access', _ => _.#e, 'access', _2 => _2[e], 'optionalCall', _3 => _3(s,o)])},registerErrorHandler:e=>{this.#e.use(async(s,o,r,a)=>e(s,o,r))},registerNotFoundHandler:e=>{this.#e.use(e)},start:async e=>new Promise((s,o)=>{try{const r=this.server.listen({host:"0.0.0.0",port:e},async()=>s(!0));_indexmincjs.Instance.on("close",r.close,1)}catch(r){o(r)}})}),this.#e=t,t.disable("x-powered-by"),i.requests.log&&t.use(_pinohttp.pinoHttp.call(void 0, {logger:u.log})),t.use(_express2.default.json()),t.use(_express2.default.text()),t.use(_cookieparser2.default.call(void 0, )),t.use(_helmet2.default.call(void 0, {crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1})),t.use(_cors2.default.call(void 0, this.cors)),t.use(_express2.default.urlencoded({extended:!1})),i.publicPath&&t.use(_express2.default.static(i.publicPath)),t.use(_expressfileupload2.default.call(void 0, {limits:{fileSize:u.settings.utils.maxFileUploadSizeInMb*1024*1024},useTempFiles:!1})),i.requests.rateLimit.enabled&&t.use(_expressratelimit.rateLimit.call(void 0, {windowMs:i.requests.rateLimit.periodInMs,limit:i.requests.rateLimit.limit,handler:(e,s)=>s.status(_typesmincjs.StatusCodes.TooManyRequests).json([{message:"Too Many Requests"}])}))}}exports.ExpressServer = C;
2
2
  //# sourceMappingURL=express.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/impls/express.ts"],"names":["ExpressServer","http","req","headers","key","val","files","uploads","file","fileArray","f","getMediaDuration","Request","response","res","value","opts","path","cb","#expressApp","err","_next","port","app","reject","config","instance","cookie","helmet","cors","express","fileUpload","rateLimit","StatusCodes"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.min.cjs","sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class ExpressServer extends Server<express.Request, express.Response> {\n\t#expressApp: express.Express\n\n\tconstructor(config: ServerConfig) {\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tsuper(http.createServer(app), config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]))\n\t\t\t\tconst headers = {\n\t\t\t\t\t...allHeaders,\n\t\t\t\t\tAuthorization: req.get('authorization'),\n\t\t\t\t\tRefreshToken: req.get('x-refresh-token'),\n\t\t\t\t\tApiKey: req.get('x-api-key'),\n\t\t\t\t\tContentType: req.get('content-type'),\n\t\t\t\t\tReferer: req.get('referer'),\n\t\t\t\t\tUserAgent: req.get('user-agent'),\n\t\t\t\t}\n\t\t\t\tconst files = Object.fromEntries(\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\t\t\tuploads.map(async (f) => ({\n\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\treturn new Request<any>({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody: req.body ?? {},\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? {},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.path,\n\t\t\t\t\theaders,\n\t\t\t\t\tfiles,\n\t\t\t\t\tcontext: {},\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tif (!response.piped) {\n\t\t\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\t\t\tres.status(response.status)[type](response.body).end()\n\t\t\t\t} else {\n\t\t\t\t\tresponse.body.pipe(res)\n\t\t\t\t}\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tthis.#expressApp[method]?.(path, cb)\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(async (err, req, res, _next) => cb(err, req, res))\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(cb)\n\t\t\t},\n\t\t\tstart: async (port) =>\n\t\t\t\tnew Promise((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst app = this.server.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(<Error>err)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t})\n\t\tthis.#expressApp = app\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t})) */\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/server/impls/express.ts"],"names":["ExpressServer","http","req","files","key","uploads","file","fileArray","f","getMediaDuration","Request","res","response","value","opts","path","cb","#expressApp","err","_next","port","app","reject","config","instance","cookie","helmet","cors","express","fileUpload","rateLimit","StatusCodes"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/express.min.cjs","sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class ExpressServer extends Server<express.Request, express.Response> {\n\t#expressApp: express.Express\n\n\tconstructor(config: ServerConfig) {\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tsuper(http.createServer(app), config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst files = Object.fromEntries(\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\t\t\tuploads.map(async (f) => ({\n\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\treturn new Request<any>({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody: req.body ?? {},\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? {},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.path,\n\t\t\t\t\theaders: req.headers,\n\t\t\t\t\tfiles,\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tif (!response.piped) {\n\t\t\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\t\t\tres.status(response.status)[type](response.body).end()\n\t\t\t\t} else {\n\t\t\t\t\tresponse.body.pipe(res)\n\t\t\t\t}\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tthis.#expressApp[method]?.(path, cb)\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(async (err, req, res, _next) => cb(err, req, res))\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tthis.#expressApp.use(cb)\n\t\t\t},\n\t\t\tstart: async (port) =>\n\t\t\t\tnew Promise((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst app = this.server.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treject(<Error>err)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t})\n\t\tthis.#expressApp = app\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t})) */\n\t}\n}\n"]}
@@ -33,16 +33,6 @@ class FastifyServer extends _basecjs.Server {
33
33
  });
34
34
  super(app.server, config, {
35
35
  parseRequest: async (req) => {
36
- const allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, _nullishCoalesce(val, () => ( null))]));
37
- const headers = {
38
- ...allHeaders,
39
- Authorization: _optionalChain([req, 'access', _2 => _2.headers, 'access', _3 => _3["authorization"], 'optionalAccess', _4 => _4.toString, 'call', _5 => _5()]),
40
- RefreshToken: _optionalChain([req, 'access', _6 => _6.headers, 'access', _7 => _7["x-refresh-token"], 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]),
41
- ApiKey: _optionalChain([req, 'access', _10 => _10.headers, 'access', _11 => _11["x-api-key"], 'optionalAccess', _12 => _12.toString, 'call', _13 => _13()]),
42
- ContentType: _optionalChain([req, 'access', _14 => _14.headers, 'access', _15 => _15["content-type"], 'optionalAccess', _16 => _16.toString, 'call', _17 => _17()]),
43
- Referer: _optionalChain([req, 'access', _18 => _18.headers, 'access', _19 => _19["referer"], 'optionalAccess', _20 => _20.toString, 'call', _21 => _21()]),
44
- UserAgent: _optionalChain([req, 'access', _22 => _22.headers, 'access', _23 => _23["user-agent"], 'optionalAccess', _24 => _24.toString, 'call', _25 => _25()])
45
- };
46
36
  const { body, files } = excludeBufferKeys(_nullishCoalesce(req.body, () => ( {})));
47
37
  return new (0, _requestscjs.Request)({
48
38
  ip: req.ip,
@@ -52,9 +42,8 @@ class FastifyServer extends _basecjs.Server {
52
42
  query: _nullishCoalesce(req.query, () => ( {})),
53
43
  method: req.method,
54
44
  path: req.url,
55
- headers,
56
- files,
57
- context: {}
45
+ headers: req.headers,
46
+ files
58
47
  });
59
48
  },
60
49
  handleResponse: async (res, response) => {
@@ -118,7 +107,7 @@ class FastifyServer extends _basecjs.Server {
118
107
  function excludeBufferKeys(body) {
119
108
  if (typeof body !== "object") return { body, files: {} };
120
109
  const entries = Object.entries(_nullishCoalesce(body, () => ( {})));
121
- const isFile = (val) => Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(_optionalChain([val, 'optionalAccess', _26 => _26.data]));
110
+ const isFile = (val) => Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(_optionalChain([val, 'optionalAccess', _2 => _2.data]));
122
111
  const fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]]);
123
112
  const nonFileEntries = entries.filter(([_, value]) => !isFile(value));
124
113
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/impls/fastify.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/fastify.cjs"],"names":[],"mappings":"AAAA,02BAA0B;AAC1B,iFAAwB;AACxB,iGAA4B;AAC5B,yFAA0B;AAC1B,qGAA6B;AAC7B,sGAA6B;AAC7B,yFAA0B;AAE1B,oFAAoB;AAEpB,gEAAe;AAEf,kDAAgC;AAChC,qDAAyB;AACzB,sDAAiC;AAEjC,8CAAwB;AACxB,wCAA+C;AAC/C,qCAAuB;AAEhB,MAAM,cAAA,QAAsB,gBAAqC;AAAA,EACvE,WAAA,CAAY,MAAA,EAAsB;AACjC,IAAA,MAAM,SAAA,EAAW,mBAAA,CAAS,GAAA,CAAI,CAAA;AAC9B,IAAA,MAAM,IAAA,EAAM,+BAAA;AAAQ,MACnB,qBAAA,EAAuB,CAAC,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,MACxC,cAAA,EAAgB,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,CAAA;AAAA,MACrD,GAAA,EAAK,EAAE,aAAA,EAAe,EAAE,WAAA,EAAa,MAAM,EAAE,CAAA;AAAA,MAC7C,aAAA,EAAe;AAAA,QACd,mBAAA,EAAqB,IAAA;AAAA,QACrB,aAAA,EAAe;AAAA,MAChB,CAAA;AAAA,MACA,oBAAA,EAAsB,CAAC,MAAA,EAAQ,IAAA,EAAA,GAC9B,IAAI,8BAAA;AAAA,QACH,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAA,GAAA,CAAW;AAAA,UACtB,QAAA,EAAU,kBAAC,KAAA,CAAM,OAAA,UAAW,IAAE,CAAA;AAAA,UAC9B,KAAA,EAAO,CAAA,EAAA;AACN,QAAA;AACH,MAAA;AACD,IAAA;AACS,IAAA;AACT,MAAA;AACO,QAAA;AACA,QAAA;AACF,UAAA;AACH,UAAA;AACA,UAAA;AACQ,UAAA;AACR,UAAA;AACA,UAAA;AACA,UAAA;AACD,QAAA;AACQ,QAAA;AAED,QAAA;AACE,UAAA;AACR,UAAA;AACA,UAAA;AACQ,UAAA;AACD,UAAA;AACM,UAAA;AACP,UAAA;AACN,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA;AACC,QAAA;AACU,QAAA;AACX,MAAA;AACA,MAAA;AACK,QAAA;AACE,UAAA;AACL,QAAA;AACF,MAAA;AACA,MAAA;AACK,QAAA;AACL,MAAA;AACA,MAAA;AACK,QAAA;AACL,MAAA;AACO,MAAA;AACI,QAAA;AACA,QAAA;AACD,QAAA;AACF,QAAA;AACR,MAAA;AACA,IAAA;AAEG,IAAA;AACA,IAAA;AACA,IAAA;AACO,IAAA;AACE,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACZ,MAAA;AACA,MAAA;AACU,MAAA;AACF,MAAA;AACD,QAAA;AACA,QAAA;AACG,UAAA;AACA,UAAA;AACF,UAAA;AACN,UAAA;AACM,UAAA;AACN,UAAA;AACD,QAAA;AAEU,QAAA;AACX,MAAA;AACA,IAAA;AAMU,IAAA;AACN,MAAA;AACE,QAAA;AACL,QAAA;AACA,QAAA;AACC,UAAA;AACA,UAAA;AACD,QAAA;AACA,MAAA;AACH,EAAA;AACD;AAES;AACG,EAAA;AACK,EAAA;AACA,EAAA;AACV,EAAA;AACA,EAAA;AACC,EAAA;AACU,IAAA;AAC8B,IAAA;AAC/C,EAAA;AACD;ACdkB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/fastify.cjs","sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport type { FastifyReply, FastifyRequest } from 'fastify'\nimport Fastify from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class FastifyServer extends Server<FastifyRequest, FastifyReply> {\n\tconstructor(config: ServerConfig) {\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tsuper(app.server, config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]))\n\t\t\t\tconst headers = {\n\t\t\t\t\t...allHeaders,\n\t\t\t\t\tAuthorization: req.headers['authorization']?.toString(),\n\t\t\t\t\tRefreshToken: req.headers['x-refresh-token']?.toString(),\n\t\t\t\t\tApiKey: req.headers['x-api-key']?.toString(),\n\t\t\t\t\tContentType: req.headers['content-type']?.toString(),\n\t\t\t\t\tReferer: req.headers['referer']?.toString(),\n\t\t\t\t\tUserAgent: req.headers['user-agent']?.toString(),\n\t\t\t\t}\n\t\t\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\t\t\treturn new Request({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody,\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? <any>{},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.url,\n\t\t\t\t\theaders,\n\t\t\t\t\tfiles,\n\t\t\t\t\tcontext: {},\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\t\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tapp.register(async (inst) => {\n\t\t\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t\t\t})\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tapp.setErrorHandler(cb)\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tapp.setNotFoundHandler(cb)\n\t\t\t},\n\t\t\tstart: async (port) => {\n\t\t\t\tawait app.ready()\n\t\t\t\tawait app.listen({ port, host: '0.0.0.0' })\n\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/server/impls/fastify.ts","/home/runner/work/equipped/equipped/dist/cjs/server/impls/fastify.cjs"],"names":[],"mappings":"AAAA,02BAA0B;AAC1B,iFAAwB;AACxB,iGAA4B;AAC5B,yFAA0B;AAC1B,qGAA6B;AAC7B,sGAA6B;AAC7B,yFAA0B;AAE1B,oFAAoB;AAEpB,gEAAe;AAEf,kDAAgC;AAChC,qDAAyB;AACzB,sDAAiC;AAEjC,8CAAwB;AACxB,wCAA+C;AAC/C,qCAAuB;AAEhB,MAAM,cAAA,QAAsB,gBAAqC;AAAA,EACvE,WAAA,CAAY,MAAA,EAAsB;AACjC,IAAA,MAAM,SAAA,EAAW,mBAAA,CAAS,GAAA,CAAI,CAAA;AAC9B,IAAA,MAAM,IAAA,EAAM,+BAAA;AAAQ,MACnB,qBAAA,EAAuB,CAAC,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,MACxC,cAAA,EAAgB,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,CAAA;AAAA,MACrD,GAAA,EAAK,EAAE,aAAA,EAAe,EAAE,WAAA,EAAa,MAAM,EAAE,CAAA;AAAA,MAC7C,aAAA,EAAe;AAAA,QACd,mBAAA,EAAqB,IAAA;AAAA,QACrB,aAAA,EAAe;AAAA,MAChB,CAAA;AAAA,MACA,oBAAA,EAAsB,CAAC,MAAA,EAAQ,IAAA,EAAA,GAC9B,IAAI,8BAAA;AAAA,QACH,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAA,GAAA,CAAW;AAAA,UACtB,QAAA,EAAU,kBAAC,KAAA,CAAM,OAAA,UAAW,IAAE,CAAA;AAAA,UAC9B,KAAA,EAAO,CAAA,EAAA;AACN,QAAA;AACH,MAAA;AACD,IAAA;AACS,IAAA;AACT,MAAA;AACS,QAAA;AAED,QAAA;AACE,UAAA;AACR,UAAA;AACA,UAAA;AACQ,UAAA;AACD,UAAA;AACM,UAAA;AACP,UAAA;AACN,UAAA;AACA,UAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA;AACC,QAAA;AACU,QAAA;AACX,MAAA;AACA,MAAA;AACK,QAAA;AACE,UAAA;AACL,QAAA;AACF,MAAA;AACA,MAAA;AACK,QAAA;AACL,MAAA;AACA,MAAA;AACK,QAAA;AACL,MAAA;AACO,MAAA;AACI,QAAA;AACA,QAAA;AACD,QAAA;AACF,QAAA;AACR,MAAA;AACA,IAAA;AAEG,IAAA;AACA,IAAA;AACA,IAAA;AACO,IAAA;AACE,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACZ,MAAA;AACA,MAAA;AACU,MAAA;AACF,MAAA;AACD,QAAA;AACA,QAAA;AACG,UAAA;AACA,UAAA;AACF,UAAA;AACN,UAAA;AACM,UAAA;AACN,UAAA;AACD,QAAA;AAEU,QAAA;AACX,MAAA;AACA,IAAA;AAMU,IAAA;AACN,MAAA;AACE,QAAA;AACL,QAAA;AACA,QAAA;AACC,UAAA;AACA,UAAA;AACD,QAAA;AACA,MAAA;AACH,EAAA;AACD;AAES;AACG,EAAA;AACK,EAAA;AACA,EAAA;AACV,EAAA;AACA,EAAA;AACC,EAAA;AACU,IAAA;AAC8B,IAAA;AAC/C,EAAA;AACD;ACdkB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/fastify.cjs","sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport type { FastifyReply, FastifyRequest } from 'fastify'\nimport Fastify from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class FastifyServer extends Server<FastifyRequest, FastifyReply> {\n\tconstructor(config: ServerConfig) {\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tsuper(app.server, config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\t\t\treturn new Request({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody,\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? <any>{},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.url,\n\t\t\t\t\theaders: req.headers,\n\t\t\t\t\tfiles,\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\t\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tapp.register(async (inst) => {\n\t\t\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t\t\t})\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tapp.setErrorHandler(cb)\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tapp.setNotFoundHandler(cb)\n\t\t\t},\n\t\t\tstart: async (port) => {\n\t\t\t\tawait app.ready()\n\t\t\t\tawait app.listen({ port, host: '0.0.0.0' })\n\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _cookie = require('@fastify/cookie'); var _cookie2 = _interopRequireDefault(_cookie);var _cors = require('@fastify/cors'); var _cors2 = _interopRequireDefault(_cors);var _formbody = require('@fastify/formbody'); var _formbody2 = _interopRequireDefault(_formbody);var _helmet = require('@fastify/helmet'); var _helmet2 = _interopRequireDefault(_helmet);var _multipart = require('@fastify/multipart'); var _multipart2 = _interopRequireDefault(_multipart);var _ratelimit = require('@fastify/rate-limit'); var _ratelimit2 = _interopRequireDefault(_ratelimit);var _static = require('@fastify/static'); var _static2 = _interopRequireDefault(_static);var _fastify = require('fastify'); var _fastify2 = _interopRequireDefault(_fastify);var _qs = require('qs'); var _qs2 = _interopRequireDefault(_qs);var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _typesmincjs = require('../types.min.cjs');var _basemincjs = require('./base.min.cjs');class _ extends _basemincjs.Server{constructor(i){const o=_indexmincjs3.Instance.get(),r=_fastify2.default.call(void 0, {disableRequestLogging:!i.requests.log,loggerInstance:i.requests.log?o.log:void 0,ajv:{customOptions:{coerceTypes:!1}},routerOptions:{ignoreTrailingSlash:!0,caseSensitive:!1},schemaErrorFormatter:(e,t)=>new (0, _indexmincjs.ValidationError)(e.map(s=>({messages:[_nullishCoalesce(s.message, () => (""))],field:`${t}${s.instancePath}`.replaceAll("/",".")})))});super(r.server,i,{parseRequest:async e=>{const s={...Object.fromEntries(Object.entries(e.headers).map(([m,u])=>[m,_nullishCoalesce(u, () => (null))])),Authorization:_optionalChain([e, 'access', _2 => _2.headers, 'access', _3 => _3.authorization, 'optionalAccess', _4 => _4.toString, 'call', _5 => _5()]),RefreshToken:_optionalChain([e, 'access', _6 => _6.headers, 'access', _7 => _7["x-refresh-token"], 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]),ApiKey:_optionalChain([e, 'access', _10 => _10.headers, 'access', _11 => _11["x-api-key"], 'optionalAccess', _12 => _12.toString, 'call', _13 => _13()]),ContentType:_optionalChain([e, 'access', _14 => _14.headers, 'access', _15 => _15["content-type"], 'optionalAccess', _16 => _16.toString, 'call', _17 => _17()]),Referer:_optionalChain([e, 'access', _18 => _18.headers, 'access', _19 => _19.referer, 'optionalAccess', _20 => _20.toString, 'call', _21 => _21()]),UserAgent:_optionalChain([e, 'access', _22 => _22.headers, 'access', _23 => _23["user-agent"], 'optionalAccess', _24 => _24.toString, 'call', _25 => _25()])},{body:a,files:l}=w(_nullishCoalesce(e.body, () => ({})));return new (0, _requestsmincjs.Request)({ip:e.ip,body:a,cookies:_nullishCoalesce(e.cookies, () => ({})),params:_nullishCoalesce(e.params, () => ({})),query:_nullishCoalesce(e.query, () => ({})),method:e.method,path:e.url,headers:s,files:l,context:{}})},handleResponse:async(e,t)=>{for(const[s,{value:a,...l}]of Object.entries(t.cookies))e=e.setCookie(s,a,l);await e.status(t.status).headers(t.headers).send(t.body)},registerRoute:(e,t,s)=>{r.register(async a=>{a.route({url:t,method:e,handler:s})})},registerErrorHandler:e=>{r.setErrorHandler(e)},registerNotFoundHandler:e=>{r.setNotFoundHandler(e)},start:async e=>(await r.ready(),await r.listen({port:e,host:"0.0.0.0"}),_indexmincjs3.Instance.on("close",r.close,1),!0)}),r.decorateRequest("savedReq",null),r.setValidatorCompiler(()=>()=>!0),r.setSerializerCompiler(()=>e=>JSON.stringify(e)),i.publicPath&&r.register(_static2.default,{root:i.publicPath}),r.register(_cookie2.default,{}),r.register(_cors2.default,this.cors),r.register(_formbody2.default,{parser:e=>_qs2.default.parse(e)}),r.register(_helmet2.default,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),r.register(_multipart2.default,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:o.settings.utils.maxFileUploadSizeInMb*1024*1024},onFile:async e=>{const t=await e.toBuffer(),s={name:e.filename,type:e.mimetype,size:t.byteLength,isTruncated:e.file.truncated,data:t,duration:await _indexmincjs5.getMediaDuration.call(void 0, t)};e.value=s}}),i.requests.rateLimit.enabled&&r.register(_ratelimit2.default,{max:i.requests.rateLimit.limit,timeWindow:i.requests.rateLimit.periodInMs,errorResponseBuilder:(e,t)=>({statusCode:_typesmincjs.StatusCodes.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${t.after}`}])})})}}function w(n){if(typeof n!="object")return{body:n,files:{}};const i=Object.entries(_nullishCoalesce(n, () => ({}))),o=t=>Array.isArray(t)?o(t.at(0)):Buffer.isBuffer(_optionalChain([t, 'optionalAccess', _26 => _26.data])),r=i.filter(([t,s])=>o(s)).map(([t,s])=>[t,Array.isArray(s)?s:[s]]),e=i.filter(([t,s])=>!o(s));return{body:Object.fromEntries(e),files:Object.fromEntries(r)}}exports.FastifyServer = _;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _cookie = require('@fastify/cookie'); var _cookie2 = _interopRequireDefault(_cookie);var _cors = require('@fastify/cors'); var _cors2 = _interopRequireDefault(_cors);var _formbody = require('@fastify/formbody'); var _formbody2 = _interopRequireDefault(_formbody);var _helmet = require('@fastify/helmet'); var _helmet2 = _interopRequireDefault(_helmet);var _multipart = require('@fastify/multipart'); var _multipart2 = _interopRequireDefault(_multipart);var _ratelimit = require('@fastify/rate-limit'); var _ratelimit2 = _interopRequireDefault(_ratelimit);var _static = require('@fastify/static'); var _static2 = _interopRequireDefault(_static);var _fastify = require('fastify'); var _fastify2 = _interopRequireDefault(_fastify);var _qs = require('qs'); var _qs2 = _interopRequireDefault(_qs);var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var _indexmincjs5 = require('../../utilities/index.min.cjs');var _requestsmincjs = require('../requests.min.cjs');var _typesmincjs = require('../types.min.cjs');var _basemincjs = require('./base.min.cjs');class N extends _basemincjs.Server{constructor(i){const o=_indexmincjs3.Instance.get(),r=_fastify2.default.call(void 0, {disableRequestLogging:!i.requests.log,loggerInstance:i.requests.log?o.log:void 0,ajv:{customOptions:{coerceTypes:!1}},routerOptions:{ignoreTrailingSlash:!0,caseSensitive:!1},schemaErrorFormatter:(e,t)=>new (0, _indexmincjs.ValidationError)(e.map(s=>({messages:[_nullishCoalesce(s.message, () => (""))],field:`${t}${s.instancePath}`.replaceAll("/",".")})))});super(r.server,i,{parseRequest:async e=>{const{body:t,files:s}=C(_nullishCoalesce(e.body, () => ({})));return new (0, _requestsmincjs.Request)({ip:e.ip,body:t,cookies:_nullishCoalesce(e.cookies, () => ({})),params:_nullishCoalesce(e.params, () => ({})),query:_nullishCoalesce(e.query, () => ({})),method:e.method,path:e.url,headers:e.headers,files:s})},handleResponse:async(e,t)=>{for(const[s,{value:n,...f}]of Object.entries(t.cookies))e=e.setCookie(s,n,f);await e.status(t.status).headers(t.headers).send(t.body)},registerRoute:(e,t,s)=>{r.register(async n=>{n.route({url:t,method:e,handler:s})})},registerErrorHandler:e=>{r.setErrorHandler(e)},registerNotFoundHandler:e=>{r.setNotFoundHandler(e)},start:async e=>(await r.ready(),await r.listen({port:e,host:"0.0.0.0"}),_indexmincjs3.Instance.on("close",r.close,1),!0)}),r.decorateRequest("savedReq",null),r.setValidatorCompiler(()=>()=>!0),r.setSerializerCompiler(()=>e=>JSON.stringify(e)),i.publicPath&&r.register(_static2.default,{root:i.publicPath}),r.register(_cookie2.default,{}),r.register(_cors2.default,this.cors),r.register(_formbody2.default,{parser:e=>_qs2.default.parse(e)}),r.register(_helmet2.default,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),r.register(_multipart2.default,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:o.settings.utils.maxFileUploadSizeInMb*1024*1024},onFile:async e=>{const t=await e.toBuffer(),s={name:e.filename,type:e.mimetype,size:t.byteLength,isTruncated:e.file.truncated,data:t,duration:await _indexmincjs5.getMediaDuration.call(void 0, t)};e.value=s}}),i.requests.rateLimit.enabled&&r.register(_ratelimit2.default,{max:i.requests.rateLimit.limit,timeWindow:i.requests.rateLimit.periodInMs,errorResponseBuilder:(e,t)=>({statusCode:_typesmincjs.StatusCodes.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${t.after}`}])})})}}function C(a){if(typeof a!="object")return{body:a,files:{}};const i=Object.entries(_nullishCoalesce(a, () => ({}))),o=t=>Array.isArray(t)?o(t.at(0)):Buffer.isBuffer(_optionalChain([t, 'optionalAccess', _ => _.data])),r=i.filter(([t,s])=>o(s)).map(([t,s])=>[t,Array.isArray(s)?s:[s]]),e=i.filter(([t,s])=>!o(s));return{body:Object.fromEntries(e),files:Object.fromEntries(r)}}exports.FastifyServer = N;
2
2
  //# sourceMappingURL=fastify.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/impls/fastify.ts"],"names":["getMediaDuration","config","instance"],"mappings":"AAAA,02BAA0B,iFACF,iGACI,yFACF,qGACG,sGACA,yFACH,oFAEN,gEAEL,yDAGN,4DACAA,6DAGT,qDACS,+CAGIC,4CAGV,MAAwBA,EAAO,QAAS,kBAAA,CAAA,WACxC,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CAAA,sBAAA,CAAA,GAAS,CAAA,CAAA,CAAA,CAAMC,CAAAA,+BAAS,CAAA,qBACxC,CAAA,CAAA,CAAA,CAAA,QAAiB,CAAA,GAAA,CAAA,cACxB,CAAA,CAAA,CAAA,QACC,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,CAAA,CAAqB,GACrB,CAAA,CAAA,aAAe,CAChB,CAAA,WACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aACC,CAAA,CAAA,mBAEE,CAAA,CAAA,CAAA,CAAU,aAAkB,CAAE,CAAA,CAC9B,CAAA,CAAA,oBAAuB,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,EAAG,IAAA,iCAAA,CAAA,CAAA,CAAA,GAAW,CAAA,CAAA,EAAK,CAAA,CAAA,QAGzD,CACD,kBAAA,CAAA,CAAA,OAAU,SAAA,IAAA,CAAQD,CAAAA,KACjB,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/fastify.min.cjs","sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport type { FastifyReply, FastifyRequest } from 'fastify'\nimport Fastify from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class FastifyServer extends Server<FastifyRequest, FastifyReply> {\n\tconstructor(config: ServerConfig) {\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tsuper(app.server, config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]))\n\t\t\t\tconst headers = {\n\t\t\t\t\t...allHeaders,\n\t\t\t\t\tAuthorization: req.headers['authorization']?.toString(),\n\t\t\t\t\tRefreshToken: req.headers['x-refresh-token']?.toString(),\n\t\t\t\t\tApiKey: req.headers['x-api-key']?.toString(),\n\t\t\t\t\tContentType: req.headers['content-type']?.toString(),\n\t\t\t\t\tReferer: req.headers['referer']?.toString(),\n\t\t\t\t\tUserAgent: req.headers['user-agent']?.toString(),\n\t\t\t\t}\n\t\t\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\t\t\treturn new Request({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody,\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? <any>{},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.url,\n\t\t\t\t\theaders,\n\t\t\t\t\tfiles,\n\t\t\t\t\tcontext: {},\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\t\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tapp.register(async (inst) => {\n\t\t\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t\t\t})\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tapp.setErrorHandler(cb)\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tapp.setNotFoundHandler(cb)\n\t\t\t},\n\t\t\tstart: async (port) => {\n\t\t\t\tawait app.ready()\n\t\t\t\tawait app.listen({ port, host: '0.0.0.0' })\n\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/server/impls/fastify.ts"],"names":["getMediaDuration","config","instance"],"mappings":"AAAA,02BAA0B,iFACF,iGACI,yFACF,qGACG,sGACA,yFACH,oFAEN,gEAEL,yDAGN,4DACAA,6DAGT,qDACS,+CAGIC,4CAGV,MAAwBA,EAAO,QAAS,kBAAA,CAAA,WACxC,CAAA,CAAA,CAAA,CAAA,MAAuB,CAAA,CAAA,sBAAA,CAAA,GAAS,CAAA,CAAA,CAAA,CAAMC,CAAAA,+BAAS,CAAA,qBACxC,CAAA,CAAA,CAAA,CAAA,QAAiB,CAAA,GAAA,CAAA,cACxB,CAAA,CAAA,CAAA,QACC,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,CAAA,CAAqB,GACrB,CAAA,CAAA,aAAe,CAChB,CAAA,WACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aACC,CAAA,CAAA,mBAEE,CAAA,CAAA,CAAA,CAAU,aAAkB,CAAE,CAAA,CAC9B,CAAA,CAAA,oBAAuB,CAAA,CAAA,CAAA,CAAA,CAAY,CAAA,EAAG,IAAA,iCAAA,CAAA,CAAA,CAAA,GAAW,CAAA,CAAA,EAAK,CAAA,CAAA,QAGzD,CACD,kBAAA,CAAA,CAAA,OAAU,SAAA,IAAA,CAAQD,CAAAA,KACjB,CAAA,CAAA,EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/impls/fastify.min.cjs","sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport type { FastifyReply, FastifyRequest } from 'fastify'\nimport Fastify from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { getMediaDuration } from '../../utilities'\nimport type { ServerConfig } from '../pipes'\nimport { Request } from '../requests'\nimport { type IncomingFile, StatusCodes } from '../types'\nimport { Server } from './base'\n\nexport class FastifyServer extends Server<FastifyRequest, FastifyReply> {\n\tconstructor(config: ServerConfig) {\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tsuper(app.server, config, {\n\t\t\tparseRequest: async (req) => {\n\t\t\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\t\t\treturn new Request({\n\t\t\t\t\tip: req.ip,\n\t\t\t\t\tbody,\n\t\t\t\t\tcookies: req.cookies ?? {},\n\t\t\t\t\tparams: req.params ?? <any>{},\n\t\t\t\t\tquery: req.query ?? {},\n\t\t\t\t\tmethod: <any>req.method,\n\t\t\t\t\tpath: req.url,\n\t\t\t\t\theaders: req.headers,\n\t\t\t\t\tfiles,\n\t\t\t\t})\n\t\t\t},\n\t\t\thandleResponse: async (res, response) => {\n\t\t\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\t\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t\t\t},\n\t\t\tregisterRoute: (method, path, cb) => {\n\t\t\t\tapp.register(async (inst) => {\n\t\t\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t\t\t})\n\t\t\t},\n\t\t\tregisterErrorHandler: (cb) => {\n\t\t\t\tapp.setErrorHandler(cb)\n\t\t\t},\n\t\t\tregisterNotFoundHandler: (cb) => {\n\t\t\t\tapp.setNotFoundHandler(cb)\n\t\t\t},\n\t\t\tstart: async (port) => {\n\t\t\t\tawait app.ready()\n\t\t\t\tawait app.listen({ port, host: '0.0.0.0' })\n\t\t\t\tInstance.on('close', app.close, 1)\n\t\t\t\treturn true\n\t\t\t},\n\t\t})\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n"]}
@@ -4,7 +4,7 @@ var _fastifycjs = require('./impls/fastify.cjs'); _createStarExport(_fastifycjs)
4
4
  var _indexcjs = require('./middlewares/index.cjs'); _createStarExport(_indexcjs);
5
5
  var _pipescjs = require('./pipes.cjs'); _createStarExport(_pipescjs);
6
6
  var _requestscjs = require('./requests.cjs'); _createStarExport(_requestscjs);
7
- var _indexcjs3 = require('./requests-auth/index.cjs'); _createStarExport(_indexcjs3);
7
+ var _indexcjs3 = require('./requests-auth-methods/index.cjs'); _createStarExport(_indexcjs3);
8
8
  var _routescjs = require('./routes.cjs'); _createStarExport(_routescjs);
9
9
  var _typescjs = require('./types.cjs'); _createStarExport(_typescjs);
10
10
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,yaAAc;AACd,iFAAc;AACd,iFAAc;AACd,iFAAc;AACd,qEAAc;AACd,8EAAc;AACd,qFAAc;AACd,wEAAc;AAEd,qEAAc","file":"/home/runner/work/equipped/equipped/dist/cjs/server/index.cjs","sourcesContent":["export * from './impls/base'\nexport * from './impls/express'\nexport * from './impls/fastify'\nexport * from './middlewares'\nexport * from './pipes'\nexport * from './requests'\nexport * from './requests-auth'\nexport * from './routes'\nexport type * from './sockets'\nexport * from './types'\n"]}
1
+ {"version":3,"sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,yaAAc;AACd,iFAAc;AACd,iFAAc;AACd,iFAAc;AACd,qEAAc;AACd,8EAAc;AACd,6FAAc;AACd,wEAAc;AAEd,qEAAc","file":"/home/runner/work/equipped/equipped/dist/cjs/server/index.cjs","sourcesContent":["export * from './impls/base'\nexport * from './impls/express'\nexport * from './impls/fastify'\nexport * from './middlewares'\nexport * from './pipes'\nexport * from './requests'\nexport * from './requests-auth-methods'\nexport * from './routes'\nexport type * from './sockets'\nexport * from './types'\n"]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _basemincjs = require('./impls/base.min.cjs'); _createStarExport(_basemincjs);var _expressmincjs = require('./impls/express.min.cjs'); _createStarExport(_expressmincjs);var _fastifymincjs = require('./impls/fastify.min.cjs'); _createStarExport(_fastifymincjs);var _indexmincjs = require('./middlewares/index.min.cjs'); _createStarExport(_indexmincjs);var _pipesmincjs = require('./pipes.min.cjs'); _createStarExport(_pipesmincjs);var _requestsmincjs = require('./requests.min.cjs'); _createStarExport(_requestsmincjs);var _indexmincjs3 = require('./requests-auth/index.min.cjs'); _createStarExport(_indexmincjs3);var _routesmincjs = require('./routes.min.cjs'); _createStarExport(_routesmincjs);var _typesmincjs = require('./types.min.cjs'); _createStarExport(_typesmincjs);
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _basemincjs = require('./impls/base.min.cjs'); _createStarExport(_basemincjs);var _expressmincjs = require('./impls/express.min.cjs'); _createStarExport(_expressmincjs);var _fastifymincjs = require('./impls/fastify.min.cjs'); _createStarExport(_fastifymincjs);var _indexmincjs = require('./middlewares/index.min.cjs'); _createStarExport(_indexmincjs);var _pipesmincjs = require('./pipes.min.cjs'); _createStarExport(_pipesmincjs);var _requestsmincjs = require('./requests.min.cjs'); _createStarExport(_requestsmincjs);var _indexmincjs3 = require('./requests-auth-methods/index.min.cjs'); _createStarExport(_indexmincjs3);var _routesmincjs = require('./routes.min.cjs'); _createStarExport(_routesmincjs);var _typesmincjs = require('./types.min.cjs'); _createStarExport(_typesmincjs);
2
2
  //# sourceMappingURL=index.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,mbACA,2FACc,2FACA,2FAEA,+EACA,wFAGd,+FAAc,kFAAA,+EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/index.min.cjs","sourcesContent":["export * from './impls/base'\nexport * from './impls/express'\nexport * from './impls/fastify'\nexport * from './middlewares'\nexport * from './pipes'\nexport * from './requests'\nexport * from './requests-auth'\nexport * from './routes'\nexport type * from './sockets'\nexport * from './types'\n"]}
1
+ {"version":3,"sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,mbACA,2FACc,2FACA,2FAEA,+EACA,wFAGd,uGAAc,kFAAA,+EAAA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/index.min.cjs","sourcesContent":["export * from './impls/base'\nexport * from './impls/express'\nexport * from './impls/fastify'\nexport * from './middlewares'\nexport * from './pipes'\nexport * from './requests'\nexport * from './requests-auth-methods'\nexport * from './routes'\nexport type * from './sockets'\nexport * from './types'\n"]}
@@ -1,65 +1,22 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _indexcjs = require('../../errors/index.cjs');
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexcjs = require('../../errors/index.cjs');
2
+ var _indexcjs3 = require('../requests-auth-methods/index.cjs');
2
3
  var _typescjs = require('../types.cjs');
3
- const requireAuthUser = _typescjs.makeMiddleware.call(void 0,
4
+ const requireAuthUser = (methods) => _typescjs.makeMiddleware.call(void 0,
4
5
  async (request) => {
5
- const user = request.users.access.value || request.users.apiKey.value;
6
- const error = request.users.access.error || request.users.apiKey.error;
7
- if (!user && error) throw error;
8
- request.authUser = user;
6
+ request.authUser = await _indexcjs3.BaseRequestAuthMethod.process(methods, request.headers);
9
7
  if (!request.authUser) throw new (0, _indexcjs.NotAuthenticatedError)();
10
8
  },
11
9
  (route) => {
12
10
  route.security ??= [];
13
- route.security.push({ Authorization: [] }, { ApiKey: [] });
11
+ for (const method of methods) {
12
+ const schemeName = method.routeSecuritySchemeName();
13
+ if (schemeName) route.security.push({ [schemeName]: [] });
14
+ }
14
15
  route.descriptions ??= [];
15
16
  route.descriptions.push("Requires a valid means of authentication.");
16
17
  }
17
18
  );
18
- const requireAuthorizationUser = _typescjs.makeMiddleware.call(void 0,
19
- async (request) => {
20
- if (request.users.access.error) throw request.users.access.error;
21
- request.authUser = request.users.access.value;
22
- if (!request.authUser) throw new (0, _indexcjs.NotAuthenticatedError)();
23
- },
24
- (route) => {
25
- route.security ??= [];
26
- route.security.push({ Authorization: [] });
27
- route.descriptions ??= [];
28
- route.descriptions.push("Requires a valid authorization header.");
29
- }
30
- );
31
- const requireApiKeyUser = _typescjs.makeMiddleware.call(void 0,
32
- async (request) => {
33
- if (request.users.apiKey.error) throw request.users.apiKey.error;
34
- request.authUser = request.users.apiKey.value;
35
- if (!request.authUser) throw new (0, _indexcjs.NotAuthenticatedError)();
36
- },
37
- (route) => {
38
- route.security ??= [];
39
- route.security.push({ ApiKey: [] });
40
- route.descriptions ??= [];
41
- route.descriptions.push("Requires a valid x-api-key header.");
42
- }
43
- );
44
- const requireRefreshTokenUser = _typescjs.makeMiddleware.call(void 0,
45
- async (request, config) => {
46
- if (request.users.refresh.error) throw request.users.refresh.error;
47
- const refreshToken = request.headers.RefreshToken;
48
- if (!refreshToken) throw new (0, _indexcjs.NotAuthorizedError)("x-refresh-token header missing");
49
- request.users.refresh.value = await _optionalChain([config, 'optionalAccess', _ => _.requestsAuth, 'access', _2 => _2.tokens, 'optionalAccess', _3 => _3.verifyRefreshToken, 'call', _4 => _4(refreshToken)]);
50
- if (!request.users.refresh.value) throw new (0, _indexcjs.NotAuthorizedError)();
51
- },
52
- (route) => {
53
- route.security ??= [];
54
- route.security.push({ RefreshToken: [] });
55
- route.descriptions ??= [];
56
- route.descriptions.push("Requires a valid x-refresh-token header.");
57
- }
58
- );
59
-
60
-
61
-
62
19
 
63
20
 
64
- exports.requireApiKeyUser = requireApiKeyUser; exports.requireAuthUser = requireAuthUser; exports.requireAuthorizationUser = requireAuthorizationUser; exports.requireRefreshTokenUser = requireRefreshTokenUser;
21
+ exports.requireAuthUser = requireAuthUser;
65
22
  //# sourceMappingURL=requireAuthUser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/middlewares/requireAuthUser.ts","/home/runner/work/equipped/equipped/dist/cjs/server/middlewares/requireAuthUser.cjs"],"names":[],"mappings":"AAAA,+nBAA0D;AAC1D,wCAA+B;AAExB,MAAM,gBAAA,EAAkB,sCAAA;AAAA,EAC9B,MAAA,CAAO,OAAA,EAAA,GAAY;AAClB,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA;AAChE,IAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA;AACjE,IAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,KAAA,EAAO,MAAM,KAAA;AAC1B,IAAA,OAAA,CAAQ,SAAA,EAAW,IAAA;AACnB,IAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,QAAA,EAAU,MAAM,IAAI,oCAAA,CAAsB,CAAA;AAAA,EACxD,CAAA;AAAA,EACA,CAAC,KAAA,EAAA,GAAU;AACV,IAAA,KAAA,CAAM,SAAA,IAAa,CAAC,CAAA;AACpB,IAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,EAAE,aAAA,EAAe,CAAC,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAC,EAAE,CAAC,CAAA;AACzD,IAAA,KAAA,CAAM,aAAA,IAAiB,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,2CAA2C,CAAA;AAAA,EACpE;AACD,CAAA;AAEO,MAAM,yBAAA,EAA2B,sCAAA;AAAA,EACvC,MAAA,CAAO,OAAA,EAAA,GAAY;AAClB,IAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA;AAC3D,IAAA,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA;AACxC,IAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,QAAA,EAAU,MAAM,IAAI,oCAAA,CAAsB,CAAA;AAAA,EACxD,CAAA;AAAA,EACA,CAAC,KAAA,EAAA,GAAU;AACV,IAAA,KAAA,CAAM,SAAA,IAAa,CAAC,CAAA;AACpB,IAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,EAAE,aAAA,EAAe,CAAC,EAAE,CAAC,CAAA;AACzC,IAAA,KAAA,CAAM,aAAA,IAAiB,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,wCAAwC,CAAA;AAAA,EACjE;AACD,CAAA;AAEO,MAAM,kBAAA,EAAoB,sCAAA;AAAA,EAChC,MAAA,CAAO,OAAA,EAAA,GAAY;AAClB,IAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA;AAC3D,IAAA,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,KAAA;AACxC,IAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,QAAA,EAAU,MAAM,IAAI,oCAAA,CAAsB,CAAA;AAAA,EACxD,CAAA;AAAA,EACA,CAAC,KAAA,EAAA,GAAU;AACV,IAAA,KAAA,CAAM,SAAA,IAAa,CAAC,CAAA;AACpB,IAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAC,EAAE,CAAC,CAAA;AAClC,IAAA,KAAA,CAAM,aAAA,IAAiB,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,oCAAoC,CAAA;AAAA,EAC7D;AACD,CAAA;AAEO,MAAM,wBAAA,EAA0B,sCAAA;AAAA,EACtC,MAAA,CAAO,OAAA,EAAS,MAAA,EAAA,GAAW;AAC1B,IAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA;AAC7D,IAAA,MAAM,aAAA,EAAe,OAAA,CAAQ,OAAA,CAAQ,YAAA;AACrC,IAAA,GAAA,CAAI,CAAC,YAAA,EAAc,MAAM,IAAI,iCAAA,CAAmB,gCAAgC,CAAA;AAChF,IAAA,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,sBAAM,MAAA,2BAAQ,YAAA,qBAAa,MAAA,6BAAQ,kBAAA,mBAAmB,YAAY,GAAA;AAChG,IAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,IAAI,iCAAA,CAAmB,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,CAAC,KAAA,EAAA,GAAU;AACV,IAAA,KAAA,CAAM,SAAA,IAAa,CAAC,CAAA;AACpB,IAAA,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,EAAE,YAAA,EAAc,CAAC,EAAE,CAAC,CAAA;AACxC,IAAA,KAAA,CAAM,aAAA,IAAiB,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,0CAA0C,CAAA;AAAA,EACnE;AACD,CAAA;ACHA;AACE;AACA;AACA;AACA;AACF,iNAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/server/middlewares/requireAuthUser.cjs","sourcesContent":["import { NotAuthenticatedError, NotAuthorizedError } from '../../errors'\nimport { makeMiddleware } from '../types'\n\nexport const requireAuthUser = makeMiddleware(\n\tasync (request) => {\n\t\tconst user = request.users.access.value || request.users.apiKey.value\n\t\tconst error = request.users.access.error || request.users.apiKey.error\n\t\tif (!user && error) throw error\n\t\trequest.authUser = user\n\t\tif (!request.authUser) throw new NotAuthenticatedError()\n\t},\n\t(route) => {\n\t\troute.security ??= []\n\t\troute.security.push({ Authorization: [] }, { ApiKey: [] })\n\t\troute.descriptions ??= []\n\t\troute.descriptions.push('Requires a valid means of authentication.')\n\t},\n)\n\nexport const requireAuthorizationUser = makeMiddleware(\n\tasync (request) => {\n\t\tif (request.users.access.error) throw request.users.access.error\n\t\trequest.authUser = request.users.access.value\n\t\tif (!request.authUser) throw new NotAuthenticatedError()\n\t},\n\t(route) => {\n\t\troute.security ??= []\n\t\troute.security.push({ Authorization: [] })\n\t\troute.descriptions ??= []\n\t\troute.descriptions.push('Requires a valid authorization header.')\n\t},\n)\n\nexport const requireApiKeyUser = makeMiddleware(\n\tasync (request) => {\n\t\tif (request.users.apiKey.error) throw request.users.apiKey.error\n\t\trequest.authUser = request.users.apiKey.value\n\t\tif (!request.authUser) throw new NotAuthenticatedError()\n\t},\n\t(route) => {\n\t\troute.security ??= []\n\t\troute.security.push({ ApiKey: [] })\n\t\troute.descriptions ??= []\n\t\troute.descriptions.push('Requires a valid x-api-key header.')\n\t},\n)\n\nexport const requireRefreshTokenUser = makeMiddleware(\n\tasync (request, config) => {\n\t\tif (request.users.refresh.error) throw request.users.refresh.error\n\t\tconst refreshToken = request.headers.RefreshToken\n\t\tif (!refreshToken) throw new NotAuthorizedError('x-refresh-token header missing')\n\t\trequest.users.refresh.value = await config?.requestsAuth.tokens?.verifyRefreshToken(refreshToken)\n\t\tif (!request.users.refresh.value) throw new NotAuthorizedError()\n\t},\n\t(route) => {\n\t\troute.security ??= []\n\t\troute.security.push({ RefreshToken: [] })\n\t\troute.descriptions ??= []\n\t\troute.descriptions.push('Requires a valid x-refresh-token header.')\n\t},\n)\n",null]}
1
+ {"version":3,"sources":["../../../../src/server/middlewares/requireAuthUser.ts","/home/runner/work/equipped/equipped/dist/cjs/server/middlewares/requireAuthUser.cjs"],"names":[],"mappings":"AAAA,2HAAsC;AAEtC,+DAAsC;AACtC,wCAA+B;AAExB,MAAM,gBAAA,EAAkB,CAAC,OAAA,EAAA,GAC/B,sCAAA;AAAA,EACC,MAAA,CAAO,OAAA,EAAA,GAAY;AAClB,IAAA,OAAA,CAAQ,SAAA,EAAW,MAAM,gCAAA,CAAsB,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA;AAC/E,IAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,QAAA,EAAU,MAAM,IAAI,oCAAA,CAAsB,CAAA;AAAA,EACxD,CAAA;AAAA,EACA,CAAC,KAAA,EAAA,GAAU;AACV,IAAA,KAAA,CAAM,SAAA,IAAa,CAAC,CAAA;AACpB,IAAA,IAAA,CAAA,MAAW,OAAA,GAAU,OAAA,EAAS;AAC7B,MAAA,MAAM,WAAA,EAAa,MAAA,CAAO,uBAAA,CAAwB,CAAA;AAClD,MAAA,GAAA,CAAI,UAAA,EAAY,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,UAAU,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAAA,IACzD;AAEA,IAAA,KAAA,CAAM,aAAA,IAAiB,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,2CAA2C,CAAA;AAAA,EACpE;AACD,CAAA;ACHD;AACE;AACF,0CAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/server/middlewares/requireAuthUser.cjs","sourcesContent":["import { NotAuthenticatedError } from '../../errors'\nimport type { AuthUser } from '../../types'\nimport { BaseRequestAuthMethod } from '../requests-auth-methods'\nimport { makeMiddleware } from '../types'\n\nexport const requireAuthUser = (methods: BaseRequestAuthMethod<AuthUser>[]) =>\n\tmakeMiddleware(\n\t\tasync (request) => {\n\t\t\trequest.authUser = await BaseRequestAuthMethod.process(methods, request.headers)\n\t\t\tif (!request.authUser) throw new NotAuthenticatedError()\n\t\t},\n\t\t(route) => {\n\t\t\troute.security ??= []\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst schemeName = method.routeSecuritySchemeName()\n\t\t\t\tif (schemeName) route.security.push({ [schemeName]: [] })\n\t\t\t}\n\n\t\t\troute.descriptions ??= []\n\t\t\troute.descriptions.push('Requires a valid means of authentication.')\n\t\t},\n\t)\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _indexmincjs = require('../../errors/index.min.cjs');var _typesmincjs = require('../types.min.cjs');const c=_typesmincjs.makeMiddleware.call(void 0, async r=>{const s=r.users.access.value||r.users.apiKey.value,e=r.users.access.error||r.users.apiKey.error;if(!s&&e)throw e;if(r.authUser=s,!r.authUser)throw new _indexmincjs.NotAuthenticatedError},r=>{r.security??=[],r.security.push({Authorization:[]},{ApiKey:[]}),r.descriptions??=[],r.descriptions.push("Requires a valid means of authentication.")}),t= exports.requireAuthorizationUser =_typesmincjs.makeMiddleware.call(void 0, async r=>{if(r.users.access.error)throw r.users.access.error;if(r.authUser=r.users.access.value,!r.authUser)throw new _indexmincjs.NotAuthenticatedError},r=>{r.security??=[],r.security.push({Authorization:[]}),r.descriptions??=[],r.descriptions.push("Requires a valid authorization header.")}),u= exports.requireApiKeyUser =_typesmincjs.makeMiddleware.call(void 0, async r=>{if(r.users.apiKey.error)throw r.users.apiKey.error;if(r.authUser=r.users.apiKey.value,!r.authUser)throw new _indexmincjs.NotAuthenticatedError},r=>{r.security??=[],r.security.push({ApiKey:[]}),r.descriptions??=[],r.descriptions.push("Requires a valid x-api-key header.")}),p= exports.requireRefreshTokenUser =_typesmincjs.makeMiddleware.call(void 0, async(r,s)=>{if(r.users.refresh.error)throw r.users.refresh.error;const e=r.headers.RefreshToken;if(!e)throw new (0, _indexmincjs.NotAuthorizedError)("x-refresh-token header missing");if(r.users.refresh.value=await _optionalChain([s, 'optionalAccess', _ => _.requestsAuth, 'access', _2 => _2.tokens, 'optionalAccess', _3 => _3.verifyRefreshToken, 'call', _4 => _4(e)]),!r.users.refresh.value)throw new _indexmincjs.NotAuthorizedError},r=>{r.security??=[],r.security.push({RefreshToken:[]}),r.descriptions??=[],r.descriptions.push("Requires a valid x-refresh-token header.")});exports.requireApiKeyUser = u; exports.requireAuthUser = c; exports.requireAuthorizationUser = t; exports.requireRefreshTokenUser = p;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../requests-auth-methods/index.min.cjs');var _typesmincjs = require('../types.min.cjs');const u=t=>_typesmincjs.makeMiddleware.call(void 0, async e=>{if(e.authUser=await _indexmincjs3.BaseRequestAuthMethod.process(t,e.headers),!e.authUser)throw new _indexmincjs.NotAuthenticatedError},e=>{e.security??=[];for(const s of t){const r=s.routeSecuritySchemeName();r&&e.security.push({[r]:[]})}e.descriptions??=[],e.descriptions.push("Requires a valid means of authentication.")});exports.requireAuthUser = u;
2
2
  //# sourceMappingURL=requireAuthUser.min.cjs.map