arkos 2.0.0-next.16 → 2.0.0-next.18

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 (434) hide show
  1. package/README.md +33 -31
  2. package/cli.js +1 -8
  3. package/dist/esm/app.js +5 -12
  4. package/dist/esm/app.js.map +1 -1
  5. package/dist/esm/components/arkos-gateway/arkos-gateway.js +337 -0
  6. package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -0
  7. package/dist/esm/components/arkos-gateway/socket-extensions.js +161 -0
  8. package/dist/esm/components/arkos-gateway/socket-extensions.js.map +1 -0
  9. package/dist/esm/components/arkos-gateway/types.js +3 -0
  10. package/dist/esm/components/arkos-gateway/types.js.map +1 -0
  11. package/dist/esm/components/arkos-gateway/utils/helpers.js +105 -0
  12. package/dist/esm/components/arkos-gateway/utils/helpers.js.map +1 -0
  13. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js +47 -0
  14. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js.map +1 -0
  15. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js +39 -0
  16. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js.map +1 -0
  17. package/dist/esm/components/arkos-gateway/utils/rate-limiter.js +13 -0
  18. package/dist/esm/components/arkos-gateway/utils/rate-limiter.js.map +1 -0
  19. package/dist/esm/components/arkos-policy/index.js.map +1 -1
  20. package/dist/esm/components/arkos-route-hook/index.js +2 -1
  21. package/dist/esm/components/arkos-route-hook/index.js.map +1 -1
  22. package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
  23. package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
  24. package/dist/esm/exports/index.js +2 -2
  25. package/dist/esm/exports/index.js.map +1 -1
  26. package/dist/esm/exports/services/index.js +2 -2
  27. package/dist/esm/exports/services/index.js.map +1 -1
  28. package/dist/esm/exports/websockets.js +5 -0
  29. package/dist/esm/exports/websockets.js.map +1 -0
  30. package/dist/esm/generated.js.map +1 -1
  31. package/dist/esm/modules/auth/auth.controller.js +2 -2
  32. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  33. package/dist/esm/modules/auth/auth.service.js +83 -204
  34. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  35. package/dist/esm/modules/auth/utils/auth-error-objects.js +2 -2
  36. package/dist/esm/modules/auth/utils/auth-error-objects.js.map +1 -1
  37. package/dist/esm/modules/auth/utils/auth-hooks-manager.js +148 -0
  38. package/dist/esm/modules/auth/utils/auth-hooks-manager.js.map +1 -0
  39. package/dist/esm/modules/auth/utils/docs-links.js +6 -0
  40. package/dist/esm/modules/auth/utils/docs-links.js.map +1 -0
  41. package/dist/esm/modules/auth/utils/services/auth-action.service.js +6 -4
  42. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  43. package/dist/esm/modules/base/base.controller.js +11 -5
  44. package/dist/esm/modules/base/base.controller.js.map +1 -1
  45. package/dist/esm/modules/base/base.middlewares.js +12 -21
  46. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  47. package/dist/esm/modules/base/base.service.js +16 -128
  48. package/dist/esm/modules/base/base.service.js.map +1 -1
  49. package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
  50. package/dist/esm/modules/email/email.service.js +14 -7
  51. package/dist/esm/modules/email/email.service.js.map +1 -1
  52. package/dist/esm/modules/error-handler/error-handler.controller.js +6 -66
  53. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  54. package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -1
  55. package/dist/esm/modules/error-handler/utils/get-handled-error.js +68 -0
  56. package/dist/esm/modules/error-handler/utils/get-handled-error.js.map +1 -0
  57. package/dist/esm/modules/file-upload/file-upload.router.js +9 -2
  58. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  59. package/dist/esm/modules/file-upload/file-upload.service.js +1 -1
  60. package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
  61. package/dist/esm/modules/swagger/swagger.router.js +11 -10
  62. package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
  63. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +3 -1
  64. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -1
  65. package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -1
  66. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +4 -2
  67. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
  68. package/dist/esm/server.js +1 -1
  69. package/dist/esm/server.js.map +1 -1
  70. package/dist/esm/types/arkos.js.map +1 -1
  71. package/dist/esm/types/index.js.map +1 -1
  72. package/dist/esm/types/new-arkos-config.js.map +1 -1
  73. package/dist/esm/types/upload.js +2 -0
  74. package/dist/esm/types/upload.js.map +1 -0
  75. package/dist/esm/types/validation/validation-manager.js +50 -0
  76. package/dist/esm/types/validation/validation-manager.js.map +1 -0
  77. package/dist/esm/types/validation/validator.js +2 -0
  78. package/dist/esm/types/validation/validator.js.map +1 -0
  79. package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js +9 -33
  80. package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
  81. package/dist/esm/utils/arkos-router/index.js +15 -3
  82. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  83. package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
  84. package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -1
  85. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +45 -9
  86. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
  87. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +26 -6
  88. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
  89. package/dist/esm/utils/cli/build.js +11 -2
  90. package/dist/esm/utils/cli/build.js.map +1 -1
  91. package/dist/esm/utils/cli/dev.js +4 -6
  92. package/dist/esm/utils/cli/dev.js.map +1 -1
  93. package/dist/esm/utils/cli/generate.js +0 -90
  94. package/dist/esm/utils/cli/generate.js.map +1 -1
  95. package/dist/esm/utils/cli/index.js +10 -74
  96. package/dist/esm/utils/cli/index.js.map +1 -1
  97. package/dist/esm/utils/cli/start.js +20 -11
  98. package/dist/esm/utils/cli/start.js.map +1 -1
  99. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  100. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +53 -17
  101. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  102. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +3 -54
  103. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  104. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +11 -4
  105. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  106. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +2 -2
  107. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  108. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +18 -18
  109. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  110. package/dist/esm/utils/cli/utils/template-generators.js +27 -24
  111. package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
  112. package/dist/esm/utils/docs-links.js +2 -0
  113. package/dist/esm/utils/docs-links.js.map +1 -0
  114. package/dist/esm/utils/features/api.features.js.map +1 -1
  115. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
  116. package/dist/esm/utils/helpers/exit-error.js +1 -1
  117. package/dist/esm/utils/helpers/exit-error.js.map +1 -1
  118. package/dist/esm/utils/initialize-app.js +3 -3
  119. package/dist/esm/utils/initialize-app.js.map +1 -1
  120. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +19 -18
  121. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  122. package/dist/esm/utils/remove-dir.js +1 -1
  123. package/dist/esm/utils/remove-dir.js.map +1 -1
  124. package/dist/esm/utils/setup-app.js.map +1 -1
  125. package/dist/types/app.d.ts +4 -0
  126. package/dist/types/components/arkos-gateway/arkos-gateway.d.ts +121 -0
  127. package/dist/types/components/arkos-gateway/socket-extensions.d.ts +79 -0
  128. package/dist/types/components/arkos-gateway/types.d.ts +364 -0
  129. package/dist/types/components/arkos-gateway/utils/helpers.d.ts +9 -0
  130. package/dist/types/components/arkos-gateway/utils/memory-gateway-store.d.ts +14 -0
  131. package/dist/types/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.d.ts +20 -0
  132. package/dist/types/components/arkos-gateway/utils/rate-limiter.d.ts +11 -0
  133. package/dist/types/components/arkos-route-hook/index.d.ts +11 -5
  134. package/dist/types/components/arkos-route-hook/reader.d.ts +2 -2
  135. package/dist/types/components/arkos-route-hook/types.d.ts +5 -1
  136. package/dist/types/exports/index.d.ts +3 -2
  137. package/dist/types/exports/services/index.d.ts +3 -3
  138. package/dist/types/exports/websockets.d.ts +5 -0
  139. package/dist/types/modules/auth/auth.service.d.ts +12 -36
  140. package/dist/types/modules/auth/utils/auth-hooks-manager.d.ts +63 -0
  141. package/dist/types/modules/auth/utils/docs-links.d.ts +3 -0
  142. package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +2 -2
  143. package/dist/types/modules/base/base.controller.d.ts +2 -2
  144. package/dist/types/modules/base/base.service.d.ts +5 -15
  145. package/dist/types/modules/base/types/base.service.types.d.ts +11 -0
  146. package/dist/types/modules/error-handler/utils/catch-async.d.ts +2 -2
  147. package/dist/types/modules/error-handler/utils/get-handled-error.d.ts +1 -0
  148. package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +6 -1
  149. package/dist/types/types/arkos.d.ts +2 -15
  150. package/dist/types/types/index.d.ts +6 -5
  151. package/dist/types/types/new-arkos-config.d.ts +1 -1
  152. package/dist/types/types/upload.d.ts +10 -0
  153. package/dist/types/types/validation/validation-manager.d.ts +27 -0
  154. package/dist/types/types/validation/validator.d.ts +2 -0
  155. package/dist/types/utils/arkos-router/index.d.ts +7 -0
  156. package/dist/types/utils/arkos-router/types/index.d.ts +35 -21
  157. package/dist/types/utils/arkos-router/types/upload-config.d.ts +2 -1
  158. package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +6 -7
  159. package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +1 -0
  160. package/dist/types/utils/cli/build.d.ts +1 -1
  161. package/dist/types/utils/cli/generate.d.ts +11 -10
  162. package/dist/types/utils/cli/start.d.ts +2 -0
  163. package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +7 -0
  164. package/dist/types/utils/docs-links.d.ts +1 -0
  165. package/dist/types/utils/features/api.features.d.ts +1 -2
  166. package/dist/types/utils/helpers/arkos-config.helpers.d.ts +5 -0
  167. package/package.json +61 -30
  168. package/dist/cjs/app.js +0 -121
  169. package/dist/cjs/app.js.map +0 -1
  170. package/dist/cjs/components/arkos-loadable-registry/index.js +0 -28
  171. package/dist/cjs/components/arkos-loadable-registry/index.js.map +0 -1
  172. package/dist/cjs/components/arkos-loadable-translator/index.js +0 -144
  173. package/dist/cjs/components/arkos-loadable-translator/index.js.map +0 -1
  174. package/dist/cjs/components/arkos-policy/index.js +0 -38
  175. package/dist/cjs/components/arkos-policy/index.js.map +0 -1
  176. package/dist/cjs/components/arkos-policy/types.js +0 -3
  177. package/dist/cjs/components/arkos-policy/types.js.map +0 -1
  178. package/dist/cjs/components/arkos-route-hook/index.js +0 -50
  179. package/dist/cjs/components/arkos-route-hook/index.js.map +0 -1
  180. package/dist/cjs/components/arkos-route-hook/reader.js +0 -47
  181. package/dist/cjs/components/arkos-route-hook/reader.js.map +0 -1
  182. package/dist/cjs/components/arkos-route-hook/types.js +0 -3
  183. package/dist/cjs/components/arkos-route-hook/types.js.map +0 -1
  184. package/dist/cjs/components/arkos-service-hook/index.js +0 -35
  185. package/dist/cjs/components/arkos-service-hook/index.js.map +0 -1
  186. package/dist/cjs/components/arkos-service-hook/reader.js +0 -30
  187. package/dist/cjs/components/arkos-service-hook/reader.js.map +0 -1
  188. package/dist/cjs/components/arkos-service-hook/types.js +0 -3
  189. package/dist/cjs/components/arkos-service-hook/types.js.map +0 -1
  190. package/dist/cjs/exports/auth/index.js +0 -6
  191. package/dist/cjs/exports/auth/index.js.map +0 -1
  192. package/dist/cjs/exports/config.js +0 -6
  193. package/dist/cjs/exports/config.js.map +0 -1
  194. package/dist/cjs/exports/controllers/index.js +0 -42
  195. package/dist/cjs/exports/controllers/index.js.map +0 -1
  196. package/dist/cjs/exports/error-handler/index.js +0 -26
  197. package/dist/cjs/exports/error-handler/index.js.map +0 -1
  198. package/dist/cjs/exports/index.js +0 -23
  199. package/dist/cjs/exports/index.js.map +0 -1
  200. package/dist/cjs/exports/middlewares/index.js +0 -7
  201. package/dist/cjs/exports/middlewares/index.js.map +0 -1
  202. package/dist/cjs/exports/prisma/index.js +0 -13
  203. package/dist/cjs/exports/prisma/index.js.map +0 -1
  204. package/dist/cjs/exports/services/index.js +0 -53
  205. package/dist/cjs/exports/services/index.js.map +0 -1
  206. package/dist/cjs/exports/utils/index.js +0 -26
  207. package/dist/cjs/exports/utils/index.js.map +0 -1
  208. package/dist/cjs/exports/validation/index.js +0 -11
  209. package/dist/cjs/exports/validation/index.js.map +0 -1
  210. package/dist/cjs/generated.js +0 -7
  211. package/dist/cjs/generated.js.map +0 -1
  212. package/dist/cjs/modules/auth/auth.controller.js +0 -254
  213. package/dist/cjs/modules/auth/auth.controller.js.map +0 -1
  214. package/dist/cjs/modules/auth/auth.router.js +0 -130
  215. package/dist/cjs/modules/auth/auth.router.js.map +0 -1
  216. package/dist/cjs/modules/auth/auth.service.js +0 -433
  217. package/dist/cjs/modules/auth/auth.service.js.map +0 -1
  218. package/dist/cjs/modules/auth/utils/auth-error-objects.js +0 -10
  219. package/dist/cjs/modules/auth/utils/auth-error-objects.js.map +0 -1
  220. package/dist/cjs/modules/auth/utils/auth-openapi-generator.js +0 -372
  221. package/dist/cjs/modules/auth/utils/auth-openapi-generator.js.map +0 -1
  222. package/dist/cjs/modules/auth/utils/auth-prisma-json-schema-generator.js +0 -101
  223. package/dist/cjs/modules/auth/utils/auth-prisma-json-schema-generator.js.map +0 -1
  224. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +0 -83
  225. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -1
  226. package/dist/cjs/modules/auth/utils/services/auth-action.service.js +0 -154
  227. package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +0 -1
  228. package/dist/cjs/modules/base/base.controller.js +0 -287
  229. package/dist/cjs/modules/base/base.controller.js.map +0 -1
  230. package/dist/cjs/modules/base/base.middlewares.js +0 -238
  231. package/dist/cjs/modules/base/base.middlewares.js.map +0 -1
  232. package/dist/cjs/modules/base/base.router.js +0 -126
  233. package/dist/cjs/modules/base/base.router.js.map +0 -1
  234. package/dist/cjs/modules/base/base.service.js +0 -436
  235. package/dist/cjs/modules/base/base.service.js.map +0 -1
  236. package/dist/cjs/modules/base/types/base.service.types.js +0 -3
  237. package/dist/cjs/modules/base/types/base.service.types.js.map +0 -1
  238. package/dist/cjs/modules/base/utils/error-prettifier.js +0 -188
  239. package/dist/cjs/modules/base/utils/error-prettifier.js.map +0 -1
  240. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +0 -49
  241. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -1
  242. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +0 -243
  243. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +0 -1
  244. package/dist/cjs/modules/base/utils/model-openapi-generator.js +0 -443
  245. package/dist/cjs/modules/base/utils/model-openapi-generator.js.map +0 -1
  246. package/dist/cjs/modules/base/utils/router-validator.js +0 -13
  247. package/dist/cjs/modules/base/utils/router-validator.js.map +0 -1
  248. package/dist/cjs/modules/base/utils/service-hooks-manager.js +0 -19
  249. package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +0 -1
  250. package/dist/cjs/modules/debugger/debugger.service.js +0 -59
  251. package/dist/cjs/modules/debugger/debugger.service.js.map +0 -1
  252. package/dist/cjs/modules/email/email.service.js +0 -106
  253. package/dist/cjs/modules/email/email.service.js.map +0 -1
  254. package/dist/cjs/modules/error-handler/error-handler.controller.js +0 -166
  255. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +0 -1
  256. package/dist/cjs/modules/error-handler/utils/app-error.js +0 -27
  257. package/dist/cjs/modules/error-handler/utils/app-error.js.map +0 -1
  258. package/dist/cjs/modules/error-handler/utils/catch-async.js +0 -21
  259. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +0 -1
  260. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +0 -104
  261. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  262. package/dist/cjs/modules/error-handler/utils/errors.js +0 -158
  263. package/dist/cjs/modules/error-handler/utils/errors.js.map +0 -1
  264. package/dist/cjs/modules/error-handler/utils/multer-error-handler.js +0 -39
  265. package/dist/cjs/modules/error-handler/utils/multer-error-handler.js.map +0 -1
  266. package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -252
  267. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +0 -1
  268. package/dist/cjs/modules/file-upload/file-upload.router.js +0 -96
  269. package/dist/cjs/modules/file-upload/file-upload.router.js.map +0 -1
  270. package/dist/cjs/modules/file-upload/file-upload.service.js +0 -343
  271. package/dist/cjs/modules/file-upload/file-upload.service.js.map +0 -1
  272. package/dist/cjs/modules/file-upload/utils/file-upload-json-schema-generator.js +0 -351
  273. package/dist/cjs/modules/file-upload/utils/file-upload-json-schema-generator.js.map +0 -1
  274. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js +0 -134
  275. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js.map +0 -1
  276. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -100
  277. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  278. package/dist/cjs/modules/swagger/swagger.router.js +0 -81
  279. package/dist/cjs/modules/swagger/swagger.router.js.map +0 -1
  280. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +0 -306
  281. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +0 -1
  282. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +0 -53
  283. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +0 -1
  284. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +0 -72
  285. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +0 -1
  286. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +0 -331
  287. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +0 -1
  288. package/dist/cjs/package.json +0 -3
  289. package/dist/cjs/server.js +0 -60
  290. package/dist/cjs/server.js.map +0 -1
  291. package/dist/cjs/types/arkos-config/utils.js +0 -3
  292. package/dist/cjs/types/arkos-config/utils.js.map +0 -1
  293. package/dist/cjs/types/arkos-prisma-input.js +0 -3
  294. package/dist/cjs/types/arkos-prisma-input.js.map +0 -1
  295. package/dist/cjs/types/arkos.js +0 -3
  296. package/dist/cjs/types/arkos.js.map +0 -1
  297. package/dist/cjs/types/auth.js +0 -3
  298. package/dist/cjs/types/auth.js.map +0 -1
  299. package/dist/cjs/types/index.js +0 -3
  300. package/dist/cjs/types/index.js.map +0 -1
  301. package/dist/cjs/types/new-arkos-config.js +0 -3
  302. package/dist/cjs/types/new-arkos-config.js.map +0 -1
  303. package/dist/cjs/types/router-config.js +0 -3
  304. package/dist/cjs/types/router-config.js.map +0 -1
  305. package/dist/cjs/utils/arkos-env.js +0 -9
  306. package/dist/cjs/utils/arkos-env.js.map +0 -1
  307. package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js +0 -184
  308. package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js.map +0 -1
  309. package/dist/cjs/utils/arkos-router/index.js +0 -153
  310. package/dist/cjs/utils/arkos-router/index.js.map +0 -1
  311. package/dist/cjs/utils/arkos-router/route-config-registry.js +0 -16
  312. package/dist/cjs/utils/arkos-router/route-config-registry.js.map +0 -1
  313. package/dist/cjs/utils/arkos-router/route-config-validator.js +0 -56
  314. package/dist/cjs/utils/arkos-router/route-config-validator.js.map +0 -1
  315. package/dist/cjs/utils/arkos-router/types/body-parser-config.js +0 -3
  316. package/dist/cjs/utils/arkos-router/types/body-parser-config.js.map +0 -1
  317. package/dist/cjs/utils/arkos-router/types/index.js +0 -3
  318. package/dist/cjs/utils/arkos-router/types/index.js.map +0 -1
  319. package/dist/cjs/utils/arkos-router/types/openapi-config.js +0 -3
  320. package/dist/cjs/utils/arkos-router/types/openapi-config.js.map +0 -1
  321. package/dist/cjs/utils/arkos-router/types/upload-config.js +0 -3
  322. package/dist/cjs/utils/arkos-router/types/upload-config.js.map +0 -1
  323. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +0 -158
  324. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +0 -1
  325. package/dist/cjs/utils/arkos-router/utils/helpers/index.js +0 -179
  326. package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +0 -1
  327. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +0 -540
  328. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +0 -1
  329. package/dist/cjs/utils/bundler.js +0 -163
  330. package/dist/cjs/utils/bundler.js.map +0 -1
  331. package/dist/cjs/utils/cli/build.js +0 -199
  332. package/dist/cjs/utils/cli/build.js.map +0 -1
  333. package/dist/cjs/utils/cli/dev.js +0 -133
  334. package/dist/cjs/utils/cli/dev.js.map +0 -1
  335. package/dist/cjs/utils/cli/export-auth-action.js +0 -80
  336. package/dist/cjs/utils/cli/export-auth-action.js.map +0 -1
  337. package/dist/cjs/utils/cli/generate.js +0 -333
  338. package/dist/cjs/utils/cli/generate.js.map +0 -1
  339. package/dist/cjs/utils/cli/index.js +0 -259
  340. package/dist/cjs/utils/cli/index.js.map +0 -1
  341. package/dist/cjs/utils/cli/prisma-generate.js +0 -112
  342. package/dist/cjs/utils/cli/prisma-generate.js.map +0 -1
  343. package/dist/cjs/utils/cli/start.js +0 -74
  344. package/dist/cjs/utils/cli/start.js.map +0 -1
  345. package/dist/cjs/utils/cli/utils/cli.helpers.js +0 -24
  346. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +0 -1
  347. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +0 -118
  348. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +0 -1
  349. package/dist/cjs/utils/cli/utils/smart-fs-watcher.js +0 -73
  350. package/dist/cjs/utils/cli/utils/smart-fs-watcher.js.map +0 -1
  351. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +0 -810
  352. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +0 -1
  353. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -64
  354. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
  355. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +0 -242
  356. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +0 -1
  357. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +0 -51
  358. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +0 -1
  359. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +0 -23
  360. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +0 -1
  361. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +0 -50
  362. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +0 -1
  363. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +0 -545
  364. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +0 -1
  365. package/dist/cjs/utils/cli/utils/template-generators.js +0 -62
  366. package/dist/cjs/utils/cli/utils/template-generators.js.map +0 -1
  367. package/dist/cjs/utils/cli/utils/watermark-stamper.js +0 -26
  368. package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +0 -1
  369. package/dist/cjs/utils/define-config.js +0 -60
  370. package/dist/cjs/utils/define-config.js.map +0 -1
  371. package/dist/cjs/utils/dotenv.helpers.js +0 -46
  372. package/dist/cjs/utils/dotenv.helpers.js.map +0 -1
  373. package/dist/cjs/utils/dynamic-loader.js +0 -22
  374. package/dist/cjs/utils/dynamic-loader.js.map +0 -1
  375. package/dist/cjs/utils/expand-env.js +0 -72
  376. package/dist/cjs/utils/expand-env.js.map +0 -1
  377. package/dist/cjs/utils/features/api.features.js +0 -216
  378. package/dist/cjs/utils/features/api.features.js.map +0 -1
  379. package/dist/cjs/utils/features/port-and-host-allocator.js +0 -129
  380. package/dist/cjs/utils/features/port-and-host-allocator.js.map +0 -1
  381. package/dist/cjs/utils/helpers/api.features.helpers.js +0 -347
  382. package/dist/cjs/utils/helpers/api.features.helpers.js.map +0 -1
  383. package/dist/cjs/utils/helpers/arkos-config.helpers.js +0 -106
  384. package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +0 -1
  385. package/dist/cjs/utils/helpers/change-case.helpers.js +0 -177
  386. package/dist/cjs/utils/helpers/change-case.helpers.js.map +0 -1
  387. package/dist/cjs/utils/helpers/deepmerge.helper.js +0 -115
  388. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +0 -1
  389. package/dist/cjs/utils/helpers/exit-error.js +0 -13
  390. package/dist/cjs/utils/helpers/exit-error.js.map +0 -1
  391. package/dist/cjs/utils/helpers/fs.helpers.js +0 -52
  392. package/dist/cjs/utils/helpers/fs.helpers.js.map +0 -1
  393. package/dist/cjs/utils/helpers/global.helpers.js +0 -106
  394. package/dist/cjs/utils/helpers/global.helpers.js.map +0 -1
  395. package/dist/cjs/utils/helpers/prisma.helpers.js +0 -56
  396. package/dist/cjs/utils/helpers/prisma.helpers.js.map +0 -1
  397. package/dist/cjs/utils/helpers/query-parser.helpers.js +0 -69
  398. package/dist/cjs/utils/helpers/query-parser.helpers.js.map +0 -1
  399. package/dist/cjs/utils/helpers/routers.helpers.js +0 -36
  400. package/dist/cjs/utils/helpers/routers.helpers.js.map +0 -1
  401. package/dist/cjs/utils/helpers/text.helpers.js +0 -28
  402. package/dist/cjs/utils/helpers/text.helpers.js.map +0 -1
  403. package/dist/cjs/utils/helpers/url-helpers.js +0 -14
  404. package/dist/cjs/utils/helpers/url-helpers.js.map +0 -1
  405. package/dist/cjs/utils/initialize-app.js +0 -80
  406. package/dist/cjs/utils/initialize-app.js.map +0 -1
  407. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +0 -366
  408. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +0 -1
  409. package/dist/cjs/utils/prisma/prisma-schema-parser.js +0 -380
  410. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +0 -1
  411. package/dist/cjs/utils/prisma/types.js +0 -3
  412. package/dist/cjs/utils/prisma/types.js.map +0 -1
  413. package/dist/cjs/utils/remove-dir.js +0 -14
  414. package/dist/cjs/utils/remove-dir.js.map +0 -1
  415. package/dist/cjs/utils/setup-app.js +0 -136
  416. package/dist/cjs/utils/setup-app.js.map +0 -1
  417. package/dist/cjs/utils/sheu.js +0 -131
  418. package/dist/cjs/utils/sheu.js.map +0 -1
  419. package/dist/cjs/utils/validate-dto.js +0 -19
  420. package/dist/cjs/utils/validate-dto.js.map +0 -1
  421. package/dist/cjs/utils/validate-schema.js +0 -75
  422. package/dist/cjs/utils/validate-schema.js.map +0 -1
  423. package/dist/esm/components/arkos-service-hook/index.js +0 -32
  424. package/dist/esm/components/arkos-service-hook/index.js.map +0 -1
  425. package/dist/esm/components/arkos-service-hook/reader.js +0 -24
  426. package/dist/esm/components/arkos-service-hook/reader.js.map +0 -1
  427. package/dist/esm/components/arkos-service-hook/types.js +0 -2
  428. package/dist/esm/components/arkos-service-hook/types.js.map +0 -1
  429. package/dist/esm/modules/base/utils/service-hooks-manager.js +0 -17
  430. package/dist/esm/modules/base/utils/service-hooks-manager.js.map +0 -1
  431. package/dist/types/components/arkos-service-hook/index.d.ts +0 -41
  432. package/dist/types/components/arkos-service-hook/reader.d.ts +0 -35
  433. package/dist/types/components/arkos-service-hook/types.d.ts +0 -240
  434. package/dist/types/modules/base/utils/service-hooks-manager.d.ts +0 -10
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- ![Header Image](https://www.arkosjs.com/img/arkos-readme-header.webp?v=3)
1
+ ![Header Image](https://www.arkosjs.com/img/arkos-readme-header.webp?v=4)
2
2
 
3
3
  <div align="center">
4
4
 
@@ -30,7 +30,7 @@
30
30
  ## Quick Start
31
31
 
32
32
  ```bash
33
- pnpm create arkos@latest my-project
33
+ npm create arkos@latest my-project
34
34
  ```
35
35
 
36
36
  Your new project already has JWT auth, customizable CRUD routes, Swagger docs at `/api/docs`, file uploads, validation, and a full security middleware stack. Understand the generated [Project Structure](https://www.arkosjs.com/docs/getting-started/project-structure).
@@ -51,6 +51,34 @@ app.listen();
51
51
 
52
52
  Arkos replaces the Express `app` — but it _is_ Express under the hood. You can still use `app.use()`, custom middleware, and raw Express code wherever you need it.
53
53
 
54
+ ## Automatic CRUD: One Model, Full REST Endpoints
55
+
56
+ **Define The Prisma model:**
57
+
58
+ ```prisma
59
+ model Post {
60
+ id String @id @default(uuid())
61
+ title String
62
+ content String
63
+ authorId String
64
+ author User @relation(fields: [authorId], references: [id])
65
+ createdAt DateTime @default(now())
66
+ updatedAt DateTime @updatedAt
67
+ }
68
+ ```
69
+
70
+ **Get a full REST API — instantly:**
71
+
72
+ ```
73
+ POST /api/posts Create a post
74
+ GET /api/posts List all posts
75
+ GET /api/posts/:id Get a post
76
+ PATCH /api/posts/:id Update a post
77
+ DELETE /api/posts/:id Delete a post
78
+ ```
79
+
80
+ Authenticated, validated, and documented. Zero boilerplate.
81
+
54
82
  ## Creating a Router Beyond Express
55
83
 
56
84
  ```typescript
@@ -95,35 +123,7 @@ export default postPolicy;
95
123
 
96
124
  Define who can do what, once, per resource. Arkos enforces it across every route that references the policy — no scattered middleware, no repeated role checks.
97
125
 
98
- ## Automatic CRUD: One Model, Full REST Endpoints
99
-
100
- **Define The Prisma model:**
101
-
102
- ```prisma
103
- model Post {
104
- id String @id @default(uuid())
105
- title String
106
- content String
107
- authorId String
108
- author User @relation(fields: [authorId], references: [id])
109
- createdAt DateTime @default(now())
110
- updatedAt DateTime @updatedAt
111
- }
112
- ```
113
-
114
- **Get a full REST API — instantly:**
115
-
116
- ```
117
- POST /api/posts Create a post
118
- GET /api/posts List all posts
119
- GET /api/posts/:id Get a post
120
- PATCH /api/posts/:id Update a post
121
- DELETE /api/posts/:id Delete a post
122
- ```
123
-
124
- Authenticated, validated, and documented. Zero boilerplate.
125
-
126
- **Customize just like normal router:**
126
+ **Customize CRUD Routes just like normal router:**
127
127
 
128
128
  ```typescript
129
129
  // src/modules/post/post.router.ts
@@ -262,3 +262,5 @@ Built with ❤️ by [Uanela Como](https://github.com/uanela) and contributors
262
262
  _The name "Arkos" comes from the Greek word "ἀρχή" (Arkhē), meaning "beginning" or "foundation", reflecting our goal of providing a solid foundation for backend development._
263
263
 
264
264
  </div>
265
+
266
+
package/cli.js CHANGED
@@ -3,28 +3,21 @@
3
3
  const { join } = await import("path");
4
4
  const { existsSync, readFileSync } = await import("fs");
5
5
  const { spawn } = await import("child_process");
6
-
7
6
  const pkgPath = join(process.cwd(), "package.json");
8
7
  let useEsm = false;
9
-
10
8
  if (existsSync(pkgPath)) {
11
9
  const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
12
10
  useEsm = pkg.type === "module";
13
11
  }
14
-
15
- const tsSrc = join(process.cwd(), "tsconfig.json");
16
12
  const entryPoint = join(
17
13
  __dirname,
18
14
  `dist/${useEsm ? "esm" : "cjs"}/utils/cli/index.js`
19
15
  );
20
- const useTs = existsSync(tsSrc);
21
-
22
16
  const args = [
23
- ...(useTs ? ["--experimental-strip-types"] : []),
17
+ ...["--import", "tsx"],
24
18
  entryPoint,
25
19
  ...process.argv.slice(2),
26
20
  ];
27
-
28
21
  process.env.NO_CLI = "true";
29
22
  process.env.FORCE_COLOR = "3";
30
23
  process.env.__ARKOS_CLI = "true";
package/dist/esm/app.js CHANGED
@@ -6,13 +6,13 @@ import { logAppStartup } from "./server.js";
6
6
  import runtimeCliCommander from "./utils/cli/utils/runtime-cli-commander.js";
7
7
  import { Server } from "http";
8
8
  import ExitError from "./utils/helpers/exit-error.js";
9
- import loadableRegistry from "./components/arkos-loadable-registry/index.js";
10
9
  import { applyArkosRouterProxy } from "./utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js";
11
10
  import { isProduction, validateArkosConfig, } from "./utils/helpers/arkos-config.helpers.js";
12
11
  export const app = express();
13
12
  let appServer;
14
- const docsLink = "https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app";
13
+ export const docsLink = "https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app";
15
14
  let instanciated = false;
15
+ export let state = "idle";
16
16
  export function arkos() {
17
17
  if (process.env.__ARKOS_CLI !== "true")
18
18
  throw ExitError(`Arkos.js application must be started the built-in cli ${isProduction() ? "'arkos start' in production" : `'arkos dev' in development`} see https://www.arkosjs.com/docs/getting-started/installation#7-set-up-packagejson-scripts`);
@@ -21,16 +21,6 @@ export function arkos() {
21
21
  const app = applyArkosRouterProxy(express(), {}, "app");
22
22
  setupApp(app);
23
23
  instanciated = true;
24
- let state = "idle";
25
- app.load = (...items) => {
26
- if (state !== "idle")
27
- throw ExitError(`app.load() must be called before app.${state === "listening" ? "listen" : "build"}(), see ${docsLink}`);
28
- if (Array.isArray(items[0]))
29
- items = items[0];
30
- items = Array.isArray(items) ? items : [items];
31
- items.forEach((item) => loadableRegistry.register(item));
32
- return app;
33
- };
34
24
  function loadApp() {
35
25
  let _app = initializeApp(app);
36
26
  _app = addGlobalErrorHandler(_app);
@@ -66,6 +56,9 @@ export function arkos() {
66
56
  validateArkosConfig();
67
57
  const port = Number(process.env.__PORT || process.env.PORT || "8000");
68
58
  const host = process.env.__HOST || process.env.HOST || "0.0.0.0";
59
+ process.send?.({ started: true });
60
+ if (process.env.__SKIP_LISTEN == "true")
61
+ return appServer;
69
62
  if (args?.length === 0 || typeof args[0] === "function")
70
63
  appServer = originalListen(port, host, defaultCb(port, host, args[0]));
71
64
  else if (args[0] instanceof Server || typeof args[0] === "object")
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./utils/helpers/arkos-config.helpers\";\nimport express, { Express } from \"express\";\nimport setupApp from \"./utils/setup-app\";\nimport { Arkos, ArkosLoadable } from \"./types/arkos\";\nimport initializeApp, { addGlobalErrorHandler } from \"./utils/initialize-app\";\nimport { logAppStartup } from \"./server\";\nimport runtimeCliCommander from \"./utils/cli/utils/runtime-cli-commander\";\nimport { IncomingMessage, Server, ServerResponse } from \"http\";\nimport ExitError from \"./utils/helpers/exit-error\";\nimport loadableRegistry from \"./components/arkos-loadable-registry\";\nimport { applyArkosRouterProxy } from \"./utils/arkos-router/utils/helpers/apply-arkos-router-proxy\";\nimport {\n isProduction,\n validateArkosConfig,\n} from \"./utils/helpers/arkos-config.helpers\";\nexport const app: express.Express = express();\n\nlet appServer: Server<typeof IncomingMessage, typeof ServerResponse>;\nconst docsLink =\n \"https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app\";\nlet instanciated = false;\n\n/**\n * Creates and configures an Arkos application instance.\n *\n * Arkos extends Express with a small set of methods for registering routers,\n * loading route/service hooks, and booting the application. All Arkos-specific\n * setup (`app.build()`) must happen before the app starts\n * accepting requests.\n *\n * @example\n * ```ts\n * // Simple setup\n * import arkos from \"arkos\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * app.listen();\n * ```\n *\n * @example\n * ```ts\n * // Custom HTTP server (e.g. for WebSockets)\n * import arkos from \"arkos\";\n * import http from \"http\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * await app.build();\n *\n * const server = http.createServer(app);\n * app.listen(server)\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/core-concepts/routing/setup}\n */\nexport function arkos(): Arkos {\n if (process.env.__ARKOS_CLI !== \"true\")\n throw ExitError(\n `Arkos.js application must be started the built-in cli ${isProduction() ? \"'arkos start' in production\" : `'arkos dev' in development`} see https://www.arkosjs.com/docs/getting-started/installation#7-set-up-packagejson-scripts`\n );\n\n if (instanciated)\n throw ExitError(`arkos() must be called only once, see ${docsLink}`);\n\n const app = applyArkosRouterProxy(express(), {}, \"app\") as any as Arkos;\n setupApp(app);\n instanciated = true;\n\n type AppState = \"idle\" | \"building\" | \"built\" | \"listening\";\n let state: AppState = \"idle\";\n\n app.load = (...items: ArkosLoadable[]) => {\n if (state !== \"idle\")\n throw ExitError(\n `app.load() must be called before app.${state === \"listening\" ? \"listen\" : \"build\"}(), see ${docsLink}`\n );\n\n if (Array.isArray(items[0])) items = items[0];\n items = Array.isArray(items) ? items : [items];\n\n items.forEach((item) => loadableRegistry.register(item));\n return app;\n };\n\n function loadApp() {\n let _app = initializeApp(app);\n _app = addGlobalErrorHandler(_app);\n if (process.env.CLI_COMMAND) runtimeCliCommander.handle();\n return _app;\n }\n\n app.build = function () {\n if (state === \"built\" || state === \"building\")\n throw ExitError(`app.build() must only be called once, see ${docsLink}`);\n if (state === \"listening\")\n throw ExitError(\n `app.build() must be called before app.listen(), see ${docsLink}`\n );\n\n state = \"building\";\n const _app = loadApp();\n state = \"built\";\n return _app;\n };\n\n const originalListen = app.listen.bind(app) as any as Express[\"listen\"];\n type UserCallback = (err?: Error) => void;\n\n const defaultCb = (\n port: number | string,\n host: string,\n cb?: UserCallback\n ) => {\n logAppStartup(port, host);\n return cb || function () {};\n };\n\n app.listen = async function (...args: any[]): Promise<Server> {\n process.env.__ARKOS_SERVER_LISTENER = \"arkos\";\n\n if (state === \"listening\")\n throw ExitError(`app.listen() must only be called once, see ${docsLink}`);\n if (state === \"building\")\n throw ExitError(\n `app.build() must be awaited before calling app.listen(), see ${docsLink}`\n );\n\n if (state === \"idle\") {\n state = \"listening\";\n loadApp();\n }\n\n validateArkosConfig();\n\n const port = Number(process.env.__PORT || process.env.PORT || \"8000\");\n const host = process.env.__HOST! || process.env.HOST || \"0.0.0.0\";\n\n if ((args as any)?.length === 0 || typeof args[0] === \"function\")\n appServer = originalListen(\n port,\n host,\n defaultCb(port, host, args[0] as UserCallback)\n );\n else if (args[0] instanceof Server || typeof args[0] === \"object\")\n appServer = args[0].listen(\n port,\n host,\n defaultCb(port, host, args[1] as UserCallback)\n );\n\n return appServer;\n };\n\n return app;\n}\n\nexport function getAppServer() {\n return appServer;\n}\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,sCAAsC,CAAC;AAC9C,OAAO,OAAoB,MAAM,SAAS,CAAC;AAC3C,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,aAAa,EAAE,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,mBAAmB,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAmB,MAAM,EAAkB,MAAM,MAAM,CAAC;AAC/D,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EACL,YAAY,EACZ,mBAAmB,GACpB,MAAM,sCAAsC,CAAC;AAC9C,MAAM,CAAC,MAAM,GAAG,GAAoB,OAAO,EAAE,CAAC;AAE9C,IAAI,SAAgE,CAAC;AACrE,MAAM,CAAC,MAAM,QAAQ,GACnB,8EAA8E,CAAC;AACjF,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,CAAC,IAAI,KAAK,GAAa,MAAM,CAAC;AAwCpC,MAAM,UAAU,KAAK;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM;QACpC,MAAM,SAAS,CACb,yDAAyD,YAAY,EAAE,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,4BAA4B,6FAA6F,CACpO,CAAC;IAEJ,IAAI,YAAY;QACd,MAAM,SAAS,CAAC,yCAAyC,QAAQ,EAAE,CAAC,CAAC;IAEvE,MAAM,GAAG,GAAG,qBAAqB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,CAAiB,CAAC;IACxE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACd,YAAY,GAAG,IAAI,CAAC;IAIpB,SAAS,OAAO;QACd,IAAI,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;YAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAK,GAAG;QACV,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU;YAC3C,MAAM,SAAS,CAAC,6CAA6C,QAAQ,EAAE,CAAC,CAAC;QAC3E,IAAI,KAAK,KAAK,WAAW;YACvB,MAAM,SAAS,CACb,uDAAuD,QAAQ,EAAE,CAClE,CAAC;QAEJ,KAAK,GAAG,UAAU,CAAC;QACnB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,KAAK,GAAG,OAAO,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAA6B,CAAC;IAGxE,MAAM,SAAS,GAAG,CAChB,IAAqB,EACrB,IAAY,EACZ,EAAiB,EACjB,EAAE;QACF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,EAAE,IAAI,cAAa,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,GAAG,CAAC,MAAM,GAAG,KAAK,WAAU,GAAG,IAAW;QACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,OAAO,CAAC;QAE9C,IAAI,KAAK,KAAK,WAAW;YACvB,MAAM,SAAS,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,KAAK,UAAU;YACtB,MAAM,SAAS,CACb,gEAAgE,QAAQ,EAAE,CAC3E,CAAC;QAEJ,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,KAAK,GAAG,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,mBAAmB,EAAE,CAAC;QAEtB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;QAElE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM;YAAE,OAAO,SAAS,CAAC;QAE1D,IAAK,IAAY,EAAE,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU;YAC9D,SAAS,GAAG,cAAc,CACxB,IAAI,EACJ,IAAI,EACJ,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAiB,CAAC,CAC/C,CAAC;aACC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YAC/D,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CACxB,IAAI,EACJ,IAAI,EACJ,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAiB,CAAC,CAC/C,CAAC;QAEJ,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import \"./utils/helpers/arkos-config.helpers\";\nimport express, { Express } from \"express\";\nimport setupApp from \"./utils/setup-app\";\nimport { Arkos } from \"./types/arkos\";\nimport initializeApp, { addGlobalErrorHandler } from \"./utils/initialize-app\";\nimport { logAppStartup } from \"./server\";\nimport runtimeCliCommander from \"./utils/cli/utils/runtime-cli-commander\";\nimport { IncomingMessage, Server, ServerResponse } from \"http\";\nimport ExitError from \"./utils/helpers/exit-error\";\nimport { applyArkosRouterProxy } from \"./utils/arkos-router/utils/helpers/apply-arkos-router-proxy\";\nimport {\n isProduction,\n validateArkosConfig,\n} from \"./utils/helpers/arkos-config.helpers\";\nexport const app: express.Express = express();\n\nlet appServer: Server<typeof IncomingMessage, typeof ServerResponse>;\nexport const docsLink =\n \"https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app\";\nlet instanciated = false;\ntype AppState = \"idle\" | \"building\" | \"built\" | \"listening\";\nexport let state: AppState = \"idle\";\n\n/**\n * Creates and configures an Arkos application instance.\n *\n * Arkos extends Express with a small set of methods for registering routers,\n * loading route/service hooks, and booting the application. All Arkos-specific\n * setup (`app.build()`) must happen before the app starts\n * accepting requests.\n *\n * @example\n * ```ts\n * // Simple setup\n * import arkos from \"arkos\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * app.listen();\n * ```\n *\n * @example\n * ```ts\n * // Custom HTTP server (e.g. for WebSockets)\n * import arkos from \"arkos\";\n * import http from \"http\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * await app.build();\n *\n * const server = http.createServer(app);\n * app.listen(server)\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/core-concepts/routing/setup}\n */\nexport function arkos(): Arkos {\n if (process.env.__ARKOS_CLI !== \"true\")\n throw ExitError(\n `Arkos.js application must be started the built-in cli ${isProduction() ? \"'arkos start' in production\" : `'arkos dev' in development`} see https://www.arkosjs.com/docs/getting-started/installation#7-set-up-packagejson-scripts`\n );\n\n if (instanciated)\n throw ExitError(`arkos() must be called only once, see ${docsLink}`);\n\n const app = applyArkosRouterProxy(express(), {}, \"app\") as any as Arkos;\n setupApp(app);\n instanciated = true;\n\n\n\n function loadApp() {\n let _app = initializeApp(app);\n _app = addGlobalErrorHandler(_app);\n if (process.env.CLI_COMMAND) runtimeCliCommander.handle();\n return _app;\n }\n\n app.build = function() {\n if (state === \"built\" || state === \"building\")\n throw ExitError(`app.build() must only be called once, see ${docsLink}`);\n if (state === \"listening\")\n throw ExitError(\n `app.build() must be called before app.listen(), see ${docsLink}`\n );\n\n state = \"building\";\n const _app = loadApp();\n state = \"built\";\n return _app;\n };\n\n const originalListen = app.listen.bind(app) as any as Express[\"listen\"];\n type UserCallback = (err?: Error) => void;\n\n const defaultCb = (\n port: number | string,\n host: string,\n cb?: UserCallback\n ) => {\n logAppStartup(port, host);\n return cb || function() { };\n };\n\n app.listen = async function(...args: any[]): Promise<Server> {\n process.env.__ARKOS_SERVER_LISTENER = \"arkos\";\n\n if (state === \"listening\")\n throw ExitError(`app.listen() must only be called once, see ${docsLink}`);\n if (state === \"building\")\n throw ExitError(\n `app.build() must be awaited before calling app.listen(), see ${docsLink}`\n );\n\n if (state === \"idle\") {\n state = \"listening\";\n loadApp();\n }\n\n validateArkosConfig();\n\n const port = Number(process.env.__PORT || process.env.PORT || \"8000\");\n const host = process.env.__HOST! || process.env.HOST || \"0.0.0.0\";\n\n process.send?.({ started: true });\n if (process.env.__SKIP_LISTEN == \"true\") return appServer;\n\n if ((args as any)?.length === 0 || typeof args[0] === \"function\")\n appServer = originalListen(\n port,\n host,\n defaultCb(port, host, args[0] as UserCallback)\n );\n else if (args[0] instanceof Server || typeof args[0] === \"object\")\n appServer = args[0].listen(\n port,\n host,\n defaultCb(port, host, args[1] as UserCallback)\n );\n\n return appServer;\n };\n\n return app;\n}\n\nexport function getAppServer() {\n return appServer;\n}\n"]}
@@ -0,0 +1,337 @@
1
+ import { authActionService, authService } from "../../exports/services/index.js";
2
+ import { checkRateLimit, clearRateLimitForSocket } from "./utils/rate-limiter.js";
3
+ import { handleArkosGatewayErrors, runArkosGatewayPipes, handleGatewayEventLog, handleGatewayLifecycleLog, } from "./utils/helpers.js";
4
+ import authHookManager from "../../modules/auth/utils/auth-hooks-manager.js";
5
+ import { getArkosConfig } from "../../server.js";
6
+ import validationManager from "../../types/validation/validation-manager.js";
7
+ import { loginRequiredError } from "../../modules/auth/utils/auth-error-objects.js";
8
+ import errorPrettifier from "../../modules/base/utils/error-prettifier.js";
9
+ import deepmerge from "../../utils/helpers/deepmerge.helper.js";
10
+ import { defaultGatewayStore } from "./utils/memory-gateway-store.js";
11
+ import { mountArkosSocketExtensions } from "./socket-extensions.js";
12
+ import { isAuthenticationEnabled, isUsingAuthentication, } from "../../utils/helpers/arkos-config.helpers.js";
13
+ import ExitError from "../../utils/helpers/exit-error.js";
14
+ import { getUserFileExtension } from "../../utils/helpers/fs.helpers.js";
15
+ import { BadRequestError, TooManyRequestsError, } from "../../modules/error-handler/utils/errors.js";
16
+ export class IArkosGateway {
17
+ constructor(config) {
18
+ this.events = [];
19
+ this.pipes = [];
20
+ this.gateways = [];
21
+ this.hooks = [];
22
+ this.config = config;
23
+ this.config.name = config.name ?? "web-socket";
24
+ }
25
+ use(...middlewareOrGateway) {
26
+ for (const item of middlewareOrGateway) {
27
+ if (item instanceof IArkosGateway) {
28
+ this.gateways.push(item);
29
+ }
30
+ else if (typeof item === "function") {
31
+ this.pipes.push(item);
32
+ }
33
+ else {
34
+ throw new Error(`Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received "${typeof item}".`);
35
+ }
36
+ }
37
+ return this;
38
+ }
39
+ pipe(fnOrConfig, fn) {
40
+ if (typeof fnOrConfig === "function") {
41
+ this.pipes.push(fnOrConfig);
42
+ }
43
+ else if (fnOrConfig && typeof fnOrConfig === "object" && fn) {
44
+ const entry = this.events.find((e) => e.config.event === fnOrConfig.event);
45
+ if (entry) {
46
+ entry.pipes = entry.pipes ?? [];
47
+ entry.pipes.push(fn);
48
+ }
49
+ else {
50
+ this.events.push({
51
+ config: { event: fnOrConfig.event, _pipeOnly: true },
52
+ handler: null,
53
+ pipes: [fn],
54
+ });
55
+ }
56
+ }
57
+ else {
58
+ throw new Error(`Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`);
59
+ }
60
+ return this;
61
+ }
62
+ on(eventConfig, handler) {
63
+ if (eventConfig.disabled)
64
+ return this;
65
+ if (eventConfig.authorization && this.config.authentication === false) {
66
+ throw new Error(`Event "${eventConfig.event}" on "${this.config.name}" gateway defines authorization rules ` +
67
+ `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`);
68
+ }
69
+ const deferred = this.events.find((e) => e.config._pipeOnly && e.config.event === eventConfig.event);
70
+ const entry = {
71
+ config: eventConfig,
72
+ handler,
73
+ pipes: [...this.pipes, ...(deferred?.pipes ?? [])],
74
+ };
75
+ if (deferred) {
76
+ const idx = this.events.indexOf(deferred);
77
+ this.events.splice(idx, 1, entry);
78
+ }
79
+ else {
80
+ this.events.push(entry);
81
+ }
82
+ if (typeof eventConfig?.authorization == "object")
83
+ eventConfig.authorization._authAction = authActionService.add(eventConfig.authorization.action, eventConfig.authorization.resource, {
84
+ [eventConfig.authorization.action]: eventConfig.authorization?.rule,
85
+ });
86
+ return this;
87
+ }
88
+ hook(type, handler) {
89
+ this.hooks.push({ type, handler });
90
+ return this;
91
+ }
92
+ register(io, options = {}) {
93
+ if (io._arkosGatewayRegistered)
94
+ throw new Error(`The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/components/advanced-guides/web-sockets/setup.`);
95
+ io._arkosGatewayRegistered = true;
96
+ this._register(io, undefined, this.hooks || [], this.pipes || [], options);
97
+ }
98
+ _register(io, parentConfig, inheritedHooks = [], inheritedPipes = [], options = {}) {
99
+ options.store = options.store ?? defaultGatewayStore;
100
+ const { store } = options;
101
+ const parentName = parentConfig?.name;
102
+ const ownName = this.config.name;
103
+ this.config = deepmerge(parentConfig || {}, this.config, {
104
+ arrayMerge: (_, sourceArray) => sourceArray,
105
+ });
106
+ this.config.name = ownName;
107
+ const localConfig = this.config;
108
+ const namespaceName = parentName
109
+ ? `${parentName.replace(/\/$/, "")}/${ownName.replace(/^\//, "")}`
110
+ : (ownName ?? "");
111
+ const ns = io.of(namespaceName);
112
+ const resolvedAuth = this.config.authentication !== false &&
113
+ parentConfig?.authentication !== false;
114
+ const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;
115
+ const resolvedHooks = [...inheritedHooks, ...this.hooks];
116
+ const connectHandlers = resolvedHooks
117
+ .filter((h) => h.type === "connection")
118
+ .map((h) => h.handler);
119
+ const disconnectHandlers = resolvedHooks
120
+ .filter((h) => h.type === "disconnect")
121
+ .map((h) => h.handler);
122
+ const errorHandlers = resolvedHooks
123
+ .filter((h) => h.type === "error")
124
+ .map((h) => h.handler);
125
+ if (resolvedAuth && isAuthenticationEnabled()) {
126
+ ns.use(async (socket, next) => {
127
+ socket = socket;
128
+ const startTime = new Date().getTime();
129
+ try {
130
+ await authHookManager.runAuthenticate({
131
+ context: socket,
132
+ done: (err) => {
133
+ if (err)
134
+ throw err;
135
+ next();
136
+ },
137
+ }, async (socket) => {
138
+ const user = await authService.getAuthenticatedUser(socket);
139
+ if (!user)
140
+ throw loginRequiredError;
141
+ return user;
142
+ }, "currentUser");
143
+ }
144
+ catch (err) {
145
+ handleArkosGatewayErrors(err, socket, errorHandlers, {
146
+ startTime,
147
+ namespace: this.config.name,
148
+ event: "authentication",
149
+ });
150
+ next(err);
151
+ }
152
+ });
153
+ }
154
+ else if ((this.config.authentication || parentConfig?.authentication) &&
155
+ !isUsingAuthentication())
156
+ throw ExitError(`Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : ""} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.
157
+
158
+ For further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`);
159
+ ns.on("connection", async (s) => {
160
+ const socket = s;
161
+ socket.locals = {};
162
+ socket._arkos = { store, gatewayConfig: localConfig };
163
+ mountArkosSocketExtensions(socket);
164
+ handleGatewayLifecycleLog(this.config.name, "connected", socket.id);
165
+ const connectionStartTime = new Date().getTime();
166
+ if (socket.currentUser?.id)
167
+ socket.join(`arkos::user:${socket.currentUser.id}`);
168
+ try {
169
+ for (const handler of connectHandlers)
170
+ await handler(socket);
171
+ }
172
+ catch (err) {
173
+ handleArkosGatewayErrors(err, socket, [], {
174
+ startTime: connectionStartTime,
175
+ namespace: this.config.name,
176
+ event: "connection",
177
+ });
178
+ return;
179
+ }
180
+ socket.on("disconnect", async () => {
181
+ handleGatewayLifecycleLog(this.config.name, "disconnected", socket.id);
182
+ await clearRateLimitForSocket(socket.id, store);
183
+ try {
184
+ for (const handler of disconnectHandlers)
185
+ await handler(socket);
186
+ }
187
+ catch (err) {
188
+ handleArkosGatewayErrors(err, socket, [], {
189
+ startTime: connectionStartTime,
190
+ namespace: this.config.name,
191
+ event: "disconnection",
192
+ });
193
+ }
194
+ });
195
+ for (const entry of this.events) {
196
+ if (entry.config._pipeOnly || !entry.handler)
197
+ continue;
198
+ const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;
199
+ if ((this.config.authentication || parentConfig?.authentication) &&
200
+ !isUsingAuthentication())
201
+ throw ExitError(`Trying to use authorization gateway.on("${eventConfig.event}") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.
202
+
203
+ For further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`);
204
+ socket.on(eventConfig.event, async (...args) => {
205
+ socket.locals = {};
206
+ const startTime = new Date().getTime();
207
+ let data = args[0];
208
+ const ack = typeof args[args.length - 1] === "function"
209
+ ? args[args.length - 1]
210
+ : undefined;
211
+ let ackCalled = false;
212
+ const wrappedAck = ack
213
+ ? (...response) => {
214
+ ackCalled = true;
215
+ ack(...response);
216
+ }
217
+ : undefined;
218
+ function resolveDedup() {
219
+ if (eventConfig.dedup === false ||
220
+ localConfig.dedup === false ||
221
+ parentConfig?.dedup === false)
222
+ return null;
223
+ return {
224
+ enabled: true,
225
+ ttl: 3600,
226
+ ...parentConfig?.dedup,
227
+ ...localConfig?.dedup,
228
+ ...eventConfig?.dedup,
229
+ };
230
+ }
231
+ const dedupOpt = resolveDedup();
232
+ try {
233
+ const meta = data?._meta || {};
234
+ const resolvedMaxAge = eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;
235
+ if (resolvedMaxAge && !meta.timestamp)
236
+ throw new BadRequestError("Missing _meta.timestamp for maxAge deduplication");
237
+ if (meta.timestamp !== undefined) {
238
+ const timestamp = new Date(meta.timestamp);
239
+ if (isNaN(timestamp.getTime())) {
240
+ throw new BadRequestError("Invalid data._meta.timestamp", "InvalidTimestamp");
241
+ }
242
+ const age = Date.now() - timestamp.getTime();
243
+ if (age + 1000 < 0)
244
+ throw new BadRequestError("Timestamp is in the future", "FutureTimestamp");
245
+ if (resolvedMaxAge && age > resolvedMaxAge) {
246
+ throw new BadRequestError("Message is too old", "StaleMessage");
247
+ }
248
+ }
249
+ if (dedupOpt && dedupOpt?.enabled !== false) {
250
+ if (!meta?.mid)
251
+ throw new BadRequestError("Missing data._meta.mid in your payload for deduplication", "MissingDedupMessageId", { data });
252
+ if (typeof meta.mid !== "string" || meta.mid.trim() === "")
253
+ throw new BadRequestError("Invalid data._meta.mid, it must be a non-empty string", "InvalidMessageId");
254
+ const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;
255
+ const ttl = dedupOpt?.ttl ?? 3600;
256
+ const acquired = await store.setIfNotExists(key, ttl);
257
+ if (acquired === false)
258
+ return wrappedAck?.({
259
+ success: true,
260
+ duplicate: true,
261
+ });
262
+ const { _meta, ...payload } = data;
263
+ data = payload;
264
+ socket.meta = meta;
265
+ }
266
+ const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;
267
+ if (rateLimitOptions !== false) {
268
+ const { allowed, retryAfter } = await checkRateLimit(socket.id, eventConfig.event, rateLimitOptions || {}, options.store);
269
+ if (!allowed) {
270
+ throw new TooManyRequestsError(undefined, undefined, {
271
+ retryAfter,
272
+ });
273
+ }
274
+ }
275
+ if (typeof eventConfig.authorization === "object" &&
276
+ resolvedAuth &&
277
+ isAuthenticationEnabled()) {
278
+ await authHookManager.runAuthorize({ context: socket, done: () => { } }, eventConfig?.authorization?._authAction, "currentUser");
279
+ }
280
+ if (eventConfig.validation) {
281
+ const arkosConfig = getArkosConfig();
282
+ const { validationFn, isValidValidator, validatorName, validatorNameType, } = validationManager;
283
+ if (!isValidValidator(eventConfig.validation))
284
+ throw new Error(`Your validation resolver is set to ${arkosConfig.validation.resolver}, ` +
285
+ `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +
286
+ `under event handler "${eventConfig.event}" in "${this.config.name}" gateway.`);
287
+ const shouldValidate = validationManager.shouldValidate(eventConfig.validation, data);
288
+ if (shouldValidate === "prohibit")
289
+ throw new BadRequestError("Event data is not allowed for this event.", "EventDataNotAllowed", { data });
290
+ else if (shouldValidate === "passthrough")
291
+ data = data;
292
+ else {
293
+ try {
294
+ data = await validationFn(eventConfig.validation, data);
295
+ }
296
+ catch (err) {
297
+ const { validationConfig } = validationManager;
298
+ const resolver = validationConfig?.resolver;
299
+ const isZod = validationConfig?.resolver === "zod";
300
+ const prettifiedError = errorPrettifier.prettify(resolver, err);
301
+ const error = prettifiedError[0];
302
+ throw new BadRequestError(error.message, `InvalidData`, isZod ? err.format() : err);
303
+ }
304
+ }
305
+ }
306
+ socket.data = data;
307
+ await runArkosGatewayPipes([...inheritedPipes, ...eventPipes], socket, data);
308
+ await handler(socket, data, wrappedAck);
309
+ handleGatewayEventLog(this.config.name, eventConfig.event, 200, startTime);
310
+ if (eventConfig.ack && ack && !ackCalled) {
311
+ ack({ success: true });
312
+ }
313
+ }
314
+ catch (err) {
315
+ handleArkosGatewayErrors(err, socket, errorHandlers, {
316
+ startTime,
317
+ namespace: this.config.name,
318
+ event: eventConfig.event,
319
+ }, ack);
320
+ }
321
+ });
322
+ }
323
+ });
324
+ for (const child of this.gateways) {
325
+ child._register(io, {
326
+ name: namespaceName,
327
+ authentication: resolvedAuth,
328
+ rateLimit: resolvedRateLimit,
329
+ }, resolvedHooks, inheritedPipes, options);
330
+ }
331
+ }
332
+ }
333
+ function ArkosGateway(config) {
334
+ return new IArkosGateway(config);
335
+ }
336
+ export default ArkosGateway;
337
+ //# sourceMappingURL=arkos-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkos-gateway.js","sourceRoot":"","sources":["../../../../src/components/arkos-gateway/arkos-gateway.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ArkosGatewayConfig,\n ArkosGatewayErrorHandler,\n ArkosGatewayEventConfig,\n ArkosGatewayEventEntry,\n ArkosGatewayHandler,\n ArkosGatewayHookHandler,\n ArkosGatewayHookType,\n ArkosGatewayPipe,\n ArkosGatewayConnectionHandler,\n ArkosSocket,\n ArkosGatewayRegisterOptions,\n} from \"./types\";\nimport { Validator } from \"../../types/validation/validator\";\nimport { Server } from \"socket.io\";\nimport { authActionService, authService } from \"../../exports/services\";\nimport { checkRateLimit, clearRateLimitForSocket } from \"./utils/rate-limiter\";\nimport {\n handleArkosGatewayErrors,\n runArkosGatewayPipes,\n handleGatewayEventLog,\n handleGatewayLifecycleLog,\n} from \"./utils/helpers\";\nimport authHookManager from \"../../modules/auth/utils/auth-hooks-manager\";\nimport { getArkosConfig } from \"../../server\";\nimport validationManager from \"../../types/validation/validation-manager\";\nimport { loginRequiredError } from \"../../modules/auth/utils/auth-error-objects\";\nimport errorPrettifier from \"../../modules/base/utils/error-prettifier\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { defaultGatewayStore } from \"./utils/memory-gateway-store\";\nimport { mountArkosSocketExtensions } from \"./socket-extensions\";\nimport {\n isAuthenticationEnabled,\n isUsingAuthentication,\n} from \"../../utils/helpers/arkos-config.helpers\";\nimport ExitError from \"../../utils/helpers/exit-error\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport {\n BadRequestError,\n TooManyRequestsError,\n} from \"../../modules/error-handler/utils/errors\";\n\nexport class IArkosGateway {\n private config: ArkosGatewayConfig;\n private events: ArkosGatewayEventEntry[] = [];\n private pipes: ArkosGatewayPipe[] = [];\n private gateways: IArkosGateway[] = [];\n private hooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [];\n\n constructor(config: ArkosGatewayConfig) {\n this.config = config;\n this.config.name = config.name ?? \"web-socket\";\n }\n\n /**\n * Register a Socket.io connection-level middleware — runs before a socket\n * is accepted into this gateway's namespace. Also accepts a child\n * `ArkosGateway` which will inherit this gateway's name as prefix along\n * with its auth, rateLimit, and pipes.\n *\n * @example\n * chatGateway.use((socket, next) => {\n * console.log(\"incoming connection\", socket.id)\n * })\n *\n * // nested gateway\n * chatGateway.use(notificationsGateway)\n */\n use(...middlewareOrGateway: Array<ArkosGatewayPipe | IArkosGateway>): this {\n for (const item of middlewareOrGateway) {\n if (item instanceof IArkosGateway) {\n this.gateways.push(item);\n } else if (typeof item === \"function\") {\n this.pipes.push(item as ArkosGatewayPipe);\n } else {\n throw new Error(\n `Invalid value for gateway.use() — expected an ArkosGateway instance or a middleware function but received \"${typeof item}\".`\n );\n }\n }\n return this;\n }\n\n /**\n * Register a pipe — middleware that runs before event handlers.\n *\n * When called with a function only, the pipe runs before every event\n * handler in this gateway and drills down to child gateways.\n *\n * When called with an event config object, the pipe runs only for that\n * specific event.\n *\n * @example\n * // runs before every event in this gateway\n * chatGateway.pipe((socket, data) => {\n * })\n *\n * // runs only before \"send_message\"\n * chatGateway.pipe({ event: \"send_message\" }, (socket, data) => {\n * })\n */\n pipe(fn: ArkosGatewayPipe): this;\n pipe<TSchema extends Validator = any>(\n eventConfig: { event: string },\n fn: ArkosGatewayPipe\n ): this;\n pipe<TSchema extends Validator = any>(\n fnOrConfig: ArkosGatewayPipe | ArkosGatewayEventConfig<TSchema>,\n fn?: ArkosGatewayPipe\n ): this {\n if (typeof fnOrConfig === \"function\") {\n this.pipes.push(fnOrConfig);\n } else if (fnOrConfig && typeof fnOrConfig === \"object\" && fn) {\n const entry = this.events.find(\n (e) => e.config.event === fnOrConfig.event\n );\n if (entry) {\n entry.pipes = entry.pipes ?? [];\n entry.pipes.push(fn);\n } else {\n this.events.push({\n config: { event: fnOrConfig.event, _pipeOnly: true } as any,\n handler: null as any,\n pipes: [fn],\n });\n }\n } else {\n throw new Error(\n `Invalid arguments for gateway.pipe() — pass a middleware function, or an event config object followed by a middleware function.`\n );\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * @example\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n */\n on<TSchema extends Validator = any>(\n eventConfig: ArkosGatewayEventConfig<TSchema>,\n handler: ArkosGatewayHandler\n ): this {\n if (eventConfig.disabled) return this;\n\n if (eventConfig.authorization && this.config.authentication === false) {\n throw new Error(\n `Event \"${eventConfig.event}\" on \"${this.config.name}\" gateway defines authorization rules ` +\n `but the gateway has authentication: false. Enable authentication on the gateway to use per-event authentication.`\n );\n }\n\n const deferred = this.events.find(\n (e) => (e.config as any)._pipeOnly && e.config.event === eventConfig.event\n );\n\n const entry: ArkosGatewayEventEntry = {\n config: eventConfig,\n handler,\n pipes: [...this.pipes, ...(deferred?.pipes ?? [])],\n };\n\n if (deferred) {\n const idx = this.events.indexOf(deferred);\n this.events.splice(idx, 1, entry);\n } else {\n this.events.push(entry);\n }\n\n if (typeof eventConfig?.authorization == \"object\")\n // To reuse later on\n (eventConfig.authorization as any)._authAction = authActionService.add(\n eventConfig.authorization!.action,\n eventConfig.authorization!.resource,\n {\n [eventConfig.authorization!.action]: eventConfig.authorization?.rule,\n }\n );\n\n return this;\n }\n\n /**\n * Register a lifecycle hook.\n *\n * - `\"connection\"` — called after a socket successfully connects and passes authentication.\n * - `\"disconnect\"` — called when a socket disconnects.\n * - `\"error\"` — called when an error is thrown inside any event handler.\n * If not registered, Arkos emits a default `\"error\"` event to the socket.\n *\n * @example\n * chatGateway.hook(\"connection\", (socket) => {\n * console.log(\"connected\", socket.user.id)\n * })\n *\n * chatGateway.hook(\"error\", (err, socket) => {\n * socket.emit(\"error\", { message: err.message })\n * })\n */\n hook(type: \"connection\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"disconnect\", handler: ArkosGatewayConnectionHandler): this;\n hook(type: \"error\", handler: ArkosGatewayErrorHandler): this;\n hook(\n type: ArkosGatewayHookType,\n handler: ArkosGatewayConnectionHandler | ArkosGatewayErrorHandler\n ): this {\n this.hooks.push({ type, handler });\n return this;\n }\n\n /**\n * Wire this gateway into a Socket.io `Server` instance.\n * Registers the namespace, auth middleware, rate limiting, pipes,\n * and all event handlers — then recurses into child gateways.\n *\n * @example\n * const io = new Server(server)\n * chatGateway.register(io)\n */\n register(io: Server, options: ArkosGatewayRegisterOptions = {}): void {\n if ((io as any)._arkosGatewayRegistered)\n throw new Error(\n `The method gateway.register() can only be called once per io server instance. Use gateway.use() to compose gateways, see https://www.arkosjs.com/docs/components/advanced-guides/web-sockets/setup.`\n );\n (io as any)._arkosGatewayRegistered = true;\n this._register(io, undefined, this.hooks || [], this.pipes || [], options);\n }\n\n private _register(\n io: Server,\n parentConfig?: ArkosGatewayConfig,\n inheritedHooks: {\n type: ArkosGatewayHookType;\n handler: ArkosGatewayHookHandler;\n }[] = [],\n inheritedPipes: ArkosGatewayPipe[] = [],\n options: ArkosGatewayRegisterOptions = {}\n ): void {\n options.store = options.store ?? defaultGatewayStore;\n const { store } = options;\n\n const parentName = parentConfig?.name;\n const ownName = this.config.name;\n this.config = deepmerge(parentConfig || {}, this.config, {\n arrayMerge: (_, sourceArray) => sourceArray,\n });\n this.config.name = ownName;\n const localConfig = this.config;\n\n const namespaceName = parentName\n ? `${parentName.replace(/\\/$/, \"\")}/${ownName.replace(/^\\//, \"\")}`\n : (ownName ?? \"\");\n\n const ns = io.of(namespaceName);\n\n const resolvedAuth =\n this.config.authentication !== false &&\n parentConfig?.authentication !== false;\n\n const resolvedRateLimit = this.config.rateLimit ?? parentConfig?.rateLimit;\n const resolvedHooks = [...inheritedHooks, ...this.hooks];\n\n const connectHandlers = resolvedHooks\n .filter((h) => h.type === \"connection\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const disconnectHandlers = resolvedHooks\n .filter((h) => h.type === \"disconnect\")\n .map((h) => h.handler as ArkosGatewayConnectionHandler);\n\n const errorHandlers = resolvedHooks\n .filter((h) => h.type === \"error\")\n .map((h) => h.handler as ArkosGatewayErrorHandler);\n\n if (resolvedAuth && isAuthenticationEnabled()) {\n ns.use(async (socket: any, next) => {\n socket = socket as ArkosSocket;\n const startTime = new Date().getTime();\n try {\n await authHookManager.runAuthenticate(\n {\n context: socket,\n done: (err?: any) => {\n if (err) throw err;\n next();\n },\n },\n async (socket) => {\n const user = await authService.getAuthenticatedUser(socket);\n if (!user) throw loginRequiredError;\n return user;\n },\n \"currentUser\"\n );\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, errorHandlers, {\n startTime,\n namespace: this.config.name,\n event: \"authentication\",\n });\n next(err);\n }\n });\n } else if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to authenticate gateway ${this.config.name ? `${this.config.name}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n ns.on(\"connection\", async (s) => {\n const socket = s as ArkosSocket;\n socket.locals = {};\n\n socket._arkos = { store, gatewayConfig: localConfig };\n mountArkosSocketExtensions(socket);\n\n handleGatewayLifecycleLog(this.config.name, \"connected\", socket.id);\n const connectionStartTime = new Date().getTime();\n\n if (socket.currentUser?.id)\n socket.join(`arkos::user:${socket.currentUser.id}`);\n\n try {\n for (const handler of connectHandlers) await handler(socket);\n } catch (err: any) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"connection\",\n });\n return;\n }\n\n socket.on(\"disconnect\", async () => {\n handleGatewayLifecycleLog(this.config.name, \"disconnected\", socket.id);\n\n await clearRateLimitForSocket(socket.id, store);\n try {\n for (const handler of disconnectHandlers) await handler(socket);\n } catch (err) {\n handleArkosGatewayErrors(err, socket, [], {\n startTime: connectionStartTime,\n namespace: this.config.name,\n event: \"disconnection\",\n });\n }\n });\n\n for (const entry of this.events) {\n if ((entry.config as any)._pipeOnly || !entry.handler) continue;\n\n const { config: eventConfig, handler, pipes: eventPipes = [] } = entry;\n\n if (\n (this.config.authentication || parentConfig?.authentication) &&\n !isUsingAuthentication()\n )\n throw ExitError(\n `Trying to use authorization gateway.on(\"${eventConfig.event}\") without choosing an authentication mode under arkos.config.${getUserFileExtension()}.\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n socket.on(eventConfig.event, async (...args: any[]) => {\n socket.locals = {};\n const startTime = new Date().getTime();\n let data = args[0];\n\n const ack =\n typeof args[args.length - 1] === \"function\"\n ? args[args.length - 1]\n : undefined;\n\n let ackCalled = false;\n const wrappedAck = ack\n ? (...response: any) => {\n ackCalled = true;\n ack(...response);\n }\n : undefined;\n\n function resolveDedup() {\n if (\n eventConfig.dedup === false ||\n localConfig.dedup === false ||\n parentConfig?.dedup === false\n )\n return null;\n\n return {\n enabled: true,\n ttl: 3600,\n ...parentConfig?.dedup,\n ...localConfig?.dedup,\n ...eventConfig?.dedup,\n };\n }\n\n const dedupOpt = resolveDedup();\n\n try {\n const meta = data?._meta || {};\n const resolvedMaxAge =\n eventConfig.maxAge ?? localConfig.maxAge ?? parentConfig?.maxAge;\n\n if (resolvedMaxAge && !meta.timestamp)\n throw new BadRequestError(\n \"Missing _meta.timestamp for maxAge deduplication\"\n );\n\n if (meta.timestamp !== undefined) {\n const timestamp = new Date(meta.timestamp);\n\n if (isNaN(timestamp.getTime())) {\n throw new BadRequestError(\n \"Invalid data._meta.timestamp\",\n \"InvalidTimestamp\"\n );\n }\n\n const age = Date.now() - timestamp.getTime();\n\n if (age + 1000 < 0)\n throw new BadRequestError(\n \"Timestamp is in the future\",\n \"FutureTimestamp\"\n );\n\n if (resolvedMaxAge && age > resolvedMaxAge) {\n throw new BadRequestError(\"Message is too old\", \"StaleMessage\");\n }\n }\n\n if (dedupOpt && dedupOpt?.enabled !== false) {\n if (!meta?.mid)\n throw new BadRequestError(\n \"Missing data._meta.mid in your payload for deduplication\",\n \"MissingDedupMessageId\",\n { data }\n );\n\n if (typeof meta.mid !== \"string\" || meta.mid.trim() === \"\")\n throw new BadRequestError(\n \"Invalid data._meta.mid, it must be a non-empty string\",\n \"InvalidMessageId\"\n );\n\n const key = `arkos::dedup:${eventConfig.event}:${meta.mid}`;\n const ttl = dedupOpt?.ttl ?? 3600;\n\n const acquired = await store.setIfNotExists(key, ttl);\n\n if (acquired === false)\n return wrappedAck?.({\n success: true,\n duplicate: true,\n });\n\n const { _meta, ...payload } = data;\n data = payload;\n\n socket.meta = meta;\n }\n\n const rateLimitOptions = eventConfig.rateLimit ?? resolvedRateLimit;\n if (rateLimitOptions !== false) {\n const { allowed, retryAfter } = await checkRateLimit(\n socket.id,\n eventConfig.event,\n rateLimitOptions || {},\n options.store!\n );\n if (!allowed) {\n throw new TooManyRequestsError(undefined, undefined, {\n retryAfter,\n });\n }\n }\n\n if (\n typeof eventConfig.authorization === \"object\" &&\n resolvedAuth &&\n isAuthenticationEnabled()\n ) {\n await authHookManager.runAuthorize(\n { context: socket, done: () => {} },\n (eventConfig?.authorization as any)?._authAction,\n \"currentUser\"\n );\n }\n\n if (eventConfig.validation) {\n const arkosConfig = getArkosConfig();\n const {\n validationFn,\n isValidValidator,\n validatorName,\n validatorNameType,\n } = validationManager;\n\n if (!isValidValidator(eventConfig.validation))\n throw new Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, ` +\n `please provide a valid ${validatorName} in order to use { validation: ${validatorNameType} } ` +\n `under event handler \"${eventConfig.event}\" in \"${this.config.name}\" gateway.`\n );\n\n const shouldValidate = validationManager.shouldValidate(\n eventConfig.validation,\n data\n );\n\n if (shouldValidate === \"prohibit\")\n throw new BadRequestError(\n \"Event data is not allowed for this event.\",\n \"EventDataNotAllowed\",\n { data }\n );\n else if (shouldValidate === \"passthrough\") data = data;\n else {\n try {\n data = await (validationFn as any)(\n eventConfig.validation,\n data\n );\n } catch (err: any) {\n const { validationConfig } = validationManager;\n\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n\n throw new BadRequestError(\n error.message,\n `InvalidData`,\n isZod ? err.format() : err\n );\n }\n }\n }\n\n socket.data = data;\n\n await runArkosGatewayPipes(\n [...inheritedPipes, ...eventPipes],\n socket,\n data\n );\n\n await handler(socket, data, wrappedAck);\n\n handleGatewayEventLog(\n this.config.name,\n eventConfig.event,\n 200,\n startTime\n );\n\n if (eventConfig.ack && ack && !ackCalled) {\n ack({ success: true });\n }\n } catch (err: any) {\n handleArkosGatewayErrors(\n err,\n socket,\n errorHandlers,\n {\n startTime,\n namespace: this.config.name,\n event: eventConfig.event,\n },\n ack\n );\n }\n });\n }\n });\n\n for (const child of this.gateways) {\n child._register(\n io,\n {\n name: namespaceName,\n authentication: resolvedAuth,\n rateLimit: resolvedRateLimit,\n },\n resolvedHooks,\n inheritedPipes,\n options\n );\n }\n }\n}\n\n/**\n * Creates an Arkos WebSocket Gateway backed by Socket.io.\n *\n * Handles authentication, validation, rate limiting, pipes,\n * error handling, and nested gateways — all declaratively.\n * Enhances every connected socket with `socket.user()`, `socket.peer()`,\n * `socket.retry()`, and automatic `_meta` injection on outgoing emits.\n *\n * @example\n * ```ts\n * const chatGateway = ArkosGateway({\n * name: \"chat\",\n * authentication: true,\n * rateLimit: { windowMs: 60_000, max: 200 },\n * })\n *\n * chatGateway.on(\n * { event: \"send_message\", validation: MessageSchema, ack: true },\n * (socket, data, ack) => {\n * socket.to(data.room).emit(\"receive_message\", data)\n * ack?.({ status: \"ok\" })\n * }\n * )\n * ```\n * @since 1.7.0-canary.18\n * @see {@link https://www.arkosjs.com/docs/core-concepts/components/gateways}\n */\nfunction ArkosGateway(config: ArkosGatewayConfig) {\n return new IArkosGateway(config);\n}\n\nexport default ArkosGateway;\n"]}