@futdevpro/nts-dynamo 1.15.127 → 1.15.129

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 (389) hide show
  1. package/.c8rc.json +26 -26
  2. package/.copilot/patterns.json +7 -7
  3. package/.cursor/rules/__assistant_guide.mdc +30 -30
  4. package/.cursor/rules/_ag_backend-structure.mdc +85 -85
  5. package/.cursor/rules/_ag_backend.mdc +16 -16
  6. package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
  7. package/.cursor/rules/_ag_frontend.mdc +39 -39
  8. package/.cursor/rules/_ag_import-rules.mdc +44 -44
  9. package/.cursor/rules/_ag_naming.mdc +115 -115
  10. package/.cursor/rules/_ag_should-be.mdc +6 -6
  11. package/.cursor/rules/ai_development_guide.md +60 -60
  12. package/.cursor/rules/cursor-rules.md +160 -160
  13. package/.cursor/rules/default-command.mdc +464 -464
  14. package/.cursor/rules/error_code_pattern.md +39 -39
  15. package/.cursor/rules/saved rule mcp server use.md +15 -15
  16. package/.dynamo/logs/cicd-pipeline/output.log +2852 -0
  17. package/.dynamo/logs/cicd-pipeline/status.json +74 -0
  18. package/.dynamo/pipeline.cicd.config.json +3 -1
  19. package/.vscode/settings.json +10 -10
  20. package/HOWTO.md +15 -15
  21. package/LICENSE +21 -21
  22. package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
  23. package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
  24. package/_specifications/BACKLOG.md +92 -92
  25. package/_specifications/TODO.md +15 -15
  26. package/_specifications/agent.md +138 -138
  27. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  28. package/build/_models/control-models/endpoint-params.control-model.js +9 -0
  29. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  30. package/build/_modules/server/errors/errors.data-service.d.ts +6 -0
  31. package/build/_modules/server/errors/errors.data-service.d.ts.map +1 -1
  32. package/build/_modules/server/errors/errors.data-service.js +29 -3
  33. package/build/_modules/server/errors/errors.data-service.js.map +1 -1
  34. package/build/_services/core/event-loop-diag.service.d.ts +6 -0
  35. package/build/_services/core/event-loop-diag.service.d.ts.map +1 -1
  36. package/build/_services/core/event-loop-diag.service.js +19 -1
  37. package/build/_services/core/event-loop-diag.service.js.map +1 -1
  38. package/build/_services/core/request-hunter.service.d.ts +74 -0
  39. package/build/_services/core/request-hunter.service.d.ts.map +1 -0
  40. package/build/_services/core/request-hunter.service.js +123 -0
  41. package/build/_services/core/request-hunter.service.js.map +1 -0
  42. package/build/index.d.ts +1 -0
  43. package/build/index.d.ts.map +1 -1
  44. package/build/index.js +1 -0
  45. package/build/index.js.map +1 -1
  46. package/eslint.config.js +3 -3
  47. package/nodemon.json +24 -24
  48. package/package.json +2 -2
  49. package/pnpm-workspace.yaml +5 -5
  50. package/scripts/run-coverage-tests.js +28 -28
  51. package/spec/support/helpers/spec-reporter-loader.js +359 -359
  52. package/spec/support/helpers/ts-node-helper.js +93 -93
  53. package/spec/support/jasmine.coverage.json +24 -24
  54. package/spec/support/jasmine.json +24 -24
  55. package/src/_collections/archive.util.spec.ts +57 -57
  56. package/src/_collections/archive.util.ts +18 -18
  57. package/src/_collections/atlas-default-db-options.const.ts +9 -9
  58. package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
  59. package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
  60. package/src/_collections/default-not-found-page.const.spec.ts +19 -19
  61. package/src/_collections/default-not-found-page.const.ts +22 -22
  62. package/src/_collections/default-socket-path.const.spec.ts +12 -12
  63. package/src/_collections/default-socket-path.const.ts +2 -2
  64. package/src/_collections/get-environment-settings.util.spec.ts +210 -210
  65. package/src/_collections/get-environment-settings.util.ts +48 -48
  66. package/src/_collections/global-settings.const.ts +126 -126
  67. package/src/_collections/sample.env +21 -21
  68. package/src/_collections/signed-url.util.spec.ts +198 -198
  69. package/src/_collections/signed-url.util.ts +170 -170
  70. package/src/_collections/star.controller.spec.ts +224 -224
  71. package/src/_collections/star.controller.ts +129 -129
  72. package/src/_enums/data-model-type.enum.ts +14 -14
  73. package/src/_enums/data-service-function.enum.ts +24 -24
  74. package/src/_enums/predefined-data-types.enum.ts +16 -16
  75. package/src/_enums/route-security.enum.ts +12 -12
  76. package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
  77. package/src/_models/control-models/api-call-params.control-model.ts +142 -142
  78. package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
  79. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  80. package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
  81. package/src/_models/control-models/app-params.control-model.ts +136 -136
  82. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
  83. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  84. package/src/_models/control-models/endpoint-params.control-model.spec.ts +669 -669
  85. package/src/_models/control-models/endpoint-params.control-model.ts +664 -656
  86. package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
  87. package/src/_models/control-models/http-settings.control-model.ts +37 -37
  88. package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
  89. package/src/_models/control-models/system-control.control-model.ts +12 -12
  90. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  91. package/src/_models/interfaces/environment-settings.interface.ts +59 -59
  92. package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
  93. package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
  94. package/src/_models/interfaces/global-settings.interface.ts +286 -286
  95. package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
  96. package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
  97. package/src/_models/interfaces/static-client-settings.interface.ts +36 -36
  98. package/src/_models/types/db-update.type.ts +100 -100
  99. package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
  100. package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
  101. package/src/_modules/ai/_modules/ai-mock/_services/ai-embedding-mock.service.spec.ts +115 -115
  102. package/src/_modules/ai/_modules/ai-mock/_services/ai-embedding-mock.service.ts +233 -233
  103. package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
  104. package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
  105. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
  106. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
  107. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -295
  108. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
  109. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
  110. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
  111. package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
  112. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
  113. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
  114. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
  115. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -68
  116. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
  117. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
  118. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
  119. package/src/_modules/ai/_modules/document-ai/index.ts +30 -30
  120. package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
  121. package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
  122. package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
  123. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
  124. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
  125. package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
  126. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
  127. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
  128. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
  129. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
  130. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
  131. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
  132. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
  133. package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
  134. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
  135. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
  136. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
  137. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
  138. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1085 -1085
  139. package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
  140. package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
  141. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +114 -114
  142. package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
  143. package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
  144. package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
  145. package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
  146. package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
  147. package/src/_modules/ai/_services/ai-llm.service-base.ts +599 -599
  148. package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
  149. package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
  150. package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
  151. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
  152. package/src/_modules/ai/index.ts +33 -33
  153. package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
  154. package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
  155. package/src/_modules/assistant/_collections/ass.util.ts +50 -50
  156. package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
  157. package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
  158. package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
  159. package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
  160. package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
  161. package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
  162. package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
  163. package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
  164. package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
  165. package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
  166. package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
  167. package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
  168. package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
  169. package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
  170. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
  171. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
  172. package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
  173. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
  174. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
  175. package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
  176. package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
  177. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
  178. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
  179. package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
  180. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
  181. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
  182. package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
  183. package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
  184. package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
  185. package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
  186. package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
  187. package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
  188. package/src/_modules/custom-data/custom-data.controller.ts +67 -67
  189. package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
  190. package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
  191. package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
  192. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
  193. package/src/_modules/custom-data/index.ts +9 -9
  194. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
  195. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
  196. package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
  197. package/src/_modules/data-readers/index.ts +11 -11
  198. package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
  199. package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
  200. package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
  201. package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
  202. package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
  203. package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
  204. package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
  205. package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
  206. package/src/_modules/defaults/index.ts +17 -17
  207. package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
  208. package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
  209. package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
  210. package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
  211. package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
  212. package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
  213. package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
  214. package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
  215. package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
  216. package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
  217. package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
  218. package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
  219. package/src/_modules/discord-assistant/index.ts +38 -38
  220. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
  221. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
  222. package/src/_modules/discord-assistant-voiced/index.ts +36 -36
  223. package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
  224. package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
  225. package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
  226. package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
  227. package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
  228. package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
  229. package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
  230. package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
  231. package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
  232. package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
  233. package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
  234. package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
  235. package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
  236. package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
  237. package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
  238. package/src/_modules/discord-bot/index.ts +36 -36
  239. package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
  240. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
  241. package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
  242. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
  243. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
  244. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
  245. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
  246. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +214 -214
  247. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +186 -186
  248. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
  249. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +130 -130
  250. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +509 -509
  251. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +323 -323
  252. package/src/_modules/local-vector-search/index.ts +16 -16
  253. package/src/_modules/logs/index.ts +11 -11
  254. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
  255. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
  256. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
  257. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
  258. package/src/_modules/mcp/index.ts +13 -13
  259. package/src/_modules/messaging/README.md +354 -354
  260. package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
  261. package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
  262. package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
  263. package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
  264. package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
  265. package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
  266. package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
  267. package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
  268. package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
  269. package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
  270. package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
  271. package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
  272. package/src/_modules/messaging/index.ts +30 -30
  273. package/src/_modules/mock/app-extended-server.mock.ts +201 -201
  274. package/src/_modules/mock/app-integration-test.mock.ts +51 -51
  275. package/src/_modules/mock/app-params.mock.spec.ts +21 -21
  276. package/src/_modules/mock/app-params.mock.ts +9 -9
  277. package/src/_modules/mock/app-server.mock.ts +188 -188
  278. package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
  279. package/src/_modules/mock/auth-service.mock.ts +28 -28
  280. package/src/_modules/mock/controller.mock.spec.ts +26 -26
  281. package/src/_modules/mock/controller.mock.ts +16 -16
  282. package/src/_modules/mock/data-model.mock.spec.ts +111 -111
  283. package/src/_modules/mock/data-model.mock.ts +82 -82
  284. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
  285. package/src/_modules/mock/email-service-collection.mock.ts +15 -15
  286. package/src/_modules/mock/email-service.mock.spec.ts +17 -17
  287. package/src/_modules/mock/email-service.mock.ts +20 -20
  288. package/src/_modules/mock/email-template.mock.html +14 -14
  289. package/src/_modules/mock/endpoint.mock.ts +91 -91
  290. package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
  291. package/src/_modules/mock/socket-client.mock.ts +45 -45
  292. package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
  293. package/src/_modules/mock/socket-server.mock.ts +46 -46
  294. package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
  295. package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
  296. package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
  297. package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
  298. package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
  299. package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
  300. package/src/_modules/oauth2/index.ts +17 -17
  301. package/src/_modules/scheduler/_models/scheduler-job.interface.ts +35 -35
  302. package/src/_modules/scheduler/get-scheduler-routing-module.util.ts +33 -33
  303. package/src/_modules/scheduler/index.ts +8 -8
  304. package/src/_modules/scheduler/scheduler.controller.spec.ts +42 -42
  305. package/src/_modules/scheduler/scheduler.controller.ts +69 -69
  306. package/src/_modules/scheduler/scheduler.service.spec.ts +141 -141
  307. package/src/_modules/scheduler/scheduler.service.ts +176 -176
  308. package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
  309. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
  310. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
  311. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
  312. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
  313. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
  314. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
  315. package/src/_modules/scoped-config/index.ts +17 -17
  316. package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
  317. package/src/_modules/server/errors/errors.control-service.ts +100 -100
  318. package/src/_modules/server/errors/errors.controller.spec.ts +268 -268
  319. package/src/_modules/server/errors/errors.controller.ts +515 -515
  320. package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
  321. package/src/_modules/server/errors/errors.data-service.ts +30 -3
  322. package/src/_modules/server/index.ts +30 -30
  323. package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
  324. package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
  325. package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
  326. package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
  327. package/src/_modules/server/server-status/server-status.control-service.spec.ts +672 -672
  328. package/src/_modules/server/server-status/server-status.control-service.ts +490 -490
  329. package/src/_modules/server/server-status/server-status.controller.spec.ts +276 -276
  330. package/src/_modules/server/server-status/server-status.controller.ts +336 -336
  331. package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
  332. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
  333. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
  334. package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
  335. package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
  336. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +69 -69
  337. package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
  338. package/src/_modules/socket/_services/socket-client.service.ts +260 -260
  339. package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
  340. package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
  341. package/src/_modules/socket/app-extended.server.ts +648 -648
  342. package/src/_modules/socket/index.ts +42 -42
  343. package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
  344. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  345. package/src/_modules/test/index.ts +11 -11
  346. package/src/_modules/test/test.controller.spec.ts +72 -72
  347. package/src/_modules/test/test.controller.ts +115 -115
  348. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  349. package/src/_modules/usage/index.ts +15 -15
  350. package/src/_modules/usage/usage.controller.spec.ts +81 -81
  351. package/src/_modules/usage/usage.controller.ts +126 -126
  352. package/src/_modules/usage/usage.data-service.spec.ts +332 -332
  353. package/src/_modules/usage/usage.data-service.ts +185 -185
  354. package/src/_services/base/api.service-base.spec.ts +125 -125
  355. package/src/_services/base/api.service-base.ts +74 -74
  356. package/src/_services/base/archive-data.service.spec.ts +209 -209
  357. package/src/_services/base/archive-data.service.ts +223 -223
  358. package/src/_services/base/data.service.spec.ts +729 -729
  359. package/src/_services/base/data.service.ts +2758 -2758
  360. package/src/_services/base/db.service.spec.ts +160 -160
  361. package/src/_services/base/db.service.ts +1698 -1698
  362. package/src/_services/base/singleton.service-base.spec.ts +28 -28
  363. package/src/_services/base/singleton.service-base.ts +24 -24
  364. package/src/_services/base/singleton.service.spec.ts +114 -114
  365. package/src/_services/base/singleton.service.ts +38 -38
  366. package/src/_services/core/api.service.spec.ts +140 -140
  367. package/src/_services/core/auth.service.spec.ts +159 -159
  368. package/src/_services/core/auth.service.ts +174 -174
  369. package/src/_services/core/email.service.spec.ts +85 -85
  370. package/src/_services/core/email.service.ts +757 -757
  371. package/src/_services/core/event-loop-diag.service.ts +23 -1
  372. package/src/_services/core/global.service.spec.ts +292 -292
  373. package/src/_services/core/global.service.ts +487 -487
  374. package/src/_services/core/memory-guard.service.spec.ts +245 -245
  375. package/src/_services/core/memory-guard.service.ts +481 -481
  376. package/src/_services/core/request-hunter.service.spec.ts +124 -0
  377. package/src/_services/core/request-hunter.service.ts +157 -0
  378. package/src/_services/core/service-collection.service.spec.ts +46 -46
  379. package/src/_services/core/service-collection.service.ts +6 -6
  380. package/src/_services/route/controller.service.spec.ts +53 -53
  381. package/src/_services/route/controller.service.ts +148 -148
  382. package/src/_services/route/routing-module.service.spec.ts +98 -98
  383. package/src/_services/route/routing-module.service.ts +330 -330
  384. package/src/_services/server/app.server.ts +1985 -1985
  385. package/src/_services/shared.static-service.spec.ts +99 -99
  386. package/src/_services/shared.static-service.ts +78 -78
  387. package/src/index.ts +113 -112
  388. package/tsconfig.app.json +12 -12
  389. package/tsconfig.json +42 -42
@@ -1,648 +1,648 @@
1
-
2
- import * as Http from 'http';
3
- import * as SocketIO from 'socket.io';
4
-
5
- import {
6
- DyFM_AnyError,
7
- DyFM_Array,
8
- DyFM_Async,
9
- DyFM_Error,
10
- DyFM_Error_Settings,
11
- DyFM_ErrorLevel,
12
- DyFM_Log,
13
- } from '@futdevpro/fsm-dynamo';
14
-
15
- import { DyNTS_defaultSocketPath } from '../../_collections/default-socket-path.const';
16
- import { DyNTS_global_settings } from '../../_collections/global-settings.const';
17
- import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
18
- import {
19
- DyNTS_AppExtSysControls
20
- } from '../../_models/control-models/app-ext-system-controls.control-model';
21
- import { DyNTS_App } from '../../_services/server/app.server';
22
- import { DyNTS_SocketSecurity } from './_enums/socket-security.enum';
23
- import { DyNTS_SocketServerService } from './_services/socket-server.service';
24
-
25
- /**
26
- * This will be the MAIN service of our server project,
27
- * follow the types and type instructions while setting up your project
28
- *
29
- * In this service, there are abstract functions that you will need to implement,
30
- * where you need to set up the main params for your application.
31
- *
32
- * The extended App is containing socket server tools
33
- *
34
- * You need to add socketService definitions to setupRoutingModules
35
- *
36
- * @example
37
- * export class App extends DyNTS_AppExtended {
38
- *
39
- * ...
40
- *
41
- * // Setting up App params, and preparing project global settings
42
- * setupAppParams(): void {
43
- * this.params = new DyNTS_AppParams({
44
- * name: 'Warbots Server',
45
- * title: warbotsTitleLog,
46
- * version: version,
47
- * dbName: 'warbots',
48
- * });
49
- *
50
- * // dynamoNTS_GlobalSettings.logRequestsContent = false;
51
- * }
52
- *
53
- * ...
54
- *
55
- * // Setting up DBServices
56
- * setGlobalServiceCollection(): void {
57
- * DyNTS_GlobalService.setServices({
58
- * authService: AuthService.getInstance(),
59
- * emailServiceCollection: EmailServiceCollectionService.getInstance(),
60
- * dbModels: [
61
- * userModelParams,
62
- * userDataModelParams,
63
- * userOptionsModelParams,
64
- * userStatisticsModelParams,
65
- * userAchievementsModelParams,
66
- * userNotificationsModelParams,
67
- *
68
- * matchStatisticsModelParams,
69
- * matchDataModelParams,
70
-
71
- * DyFM_usageSession_dataParams,
72
- * DyFM_customData_dataParams,
73
- * ]
74
- * });
75
- * }
76
- *
77
- * ...
78
- *
79
- * // Setting up Routes
80
- * setupRoutingModules(): void {
81
- * this.httpPort = env.port;
82
-
83
- * this.routingModules = [
84
- * new DyNTS_RoutingModule({
85
- * route: '/user',
86
- * controllers: [
87
- * UserController.getInstance(),
88
- * UserDataController.getInstance(),
89
- * UserOptionsController.getInstance(),
90
- * UserStatisticsController.getInstance(),
91
- * UserAchievementsController.getInstance(),
92
- * UserNotificationsController.getInstance()
93
- * ]
94
- * }),
95
- * new DyNTS_RoutingModule({
96
- * route: '/match',
97
- * controllers: [
98
- * MatchController.getInstance(),
99
- * MatchDistributionController.getInstance(),
100
- * MatchStatisticsController.getInstance(),
101
- * ]
102
- * }),
103
- * new DyNTS_RoutingModule({
104
- * route: '/server',
105
- * controllers: [
106
- * ServerController.getInstance(),
107
- * ]
108
- * }),
109
-
110
- * getTestRoutingModule(),
111
- * getUsageRoutingModule()
112
- * ];
113
- *
114
- * ...
115
- *
116
- * // Setting up Sockets (port opcionális – ha nincs megadva, a HTTP/HTTPS portot használjuk, same port)
117
- * this.socketServices = [
118
- * NotificationService.getInstance(),
119
- * ChatService.getInstance(),
120
- * ...
121
- * ];
122
- * }
123
- * }
124
- */
125
- export abstract class DyNTS_AppExtended extends DyNTS_App {
126
-
127
- private readonly systemControlsExt: DyNTS_AppExtSysControls = new DyNTS_AppExtSysControls();
128
- override get started(): boolean { return this.systemControlsExt.appExtended.started; }
129
- private httpsSocketSettingUpCount: number = 0;
130
- private httpSocketSettingUpCount: number = 0;
131
-
132
- private socketSecurity: DyNTS_RouteSecurity;
133
-
134
- /** Csak akkor van értékadva, ha nincs base httpServer (pl. nincs open route) és open socket van. */
135
- private httpSocketServer: Http.Server | undefined;
136
-
137
- /**
138
- * Socket szolgáltatások. A port opcionális: ha nincs megadva, az extended app
139
- * a getPortSettings() httpPort/httpsPort értékét használja (WebSocket és HTTP ugyanazon a porton).
140
- * @example
141
- * // Setting up Sockets
142
- * this.socketServices = [
143
- * NotificationService.getInstance(),
144
- * ChatService.getInstance(),
145
- * ...
146
- * ];
147
- */
148
- protected socketServices: DyNTS_SocketServerService<any>[];
149
- private readonly allSocketServers: SocketIO.Server[] = [];
150
-
151
- constructor(){
152
- super(/* true */);
153
-
154
- /* this.asyncConstructExt().catch((error: DyFM_AnyError): void => {
155
- if (
156
- DyNTS_global_settings.log_settings.highDetailedLogs ||
157
- !(error instanceof DyFM_Error)
158
- ) {
159
- DyFM_Log.H_error(
160
- `Extended Application: ${this.params?.name} start failed. ` +
161
- `(DyNTS_AppExtended constructor catch)`,
162
- `\n ERROR:`, error
163
- );
164
- } else {
165
- error.logSimple(
166
- `Extended Application: "${this.params?.name}" start failed. ` +
167
- `(DyNTS_AppExtended constructor catch)`
168
- );
169
- }
170
- }); */
171
- }
172
-
173
- protected override async asyncConstruct(extended = true): Promise<void> {
174
- if (this.fnLogs && this.deepLog) console.log('\nfn:. asyncConstruct-extended');
175
-
176
- try {
177
- await super.asyncConstruct(true);
178
-
179
- this.systemControlsExt.appExtended.init = true;
180
-
181
- this.socketServices = this.getSocketServices();
182
-
183
- if (this.socketServices?.length) {
184
- if (this.logSetup) DyFM_Log.log('\nsetting up socket servers...');
185
-
186
- this.setSocketSecurity();
187
-
188
- await this.setupSocketServerServices();
189
-
190
- if (this.logSetup) console.log(
191
- `\nAll sockets setted up.... sockets using security: ${this.socketSecurity}`
192
- );
193
- } else {
194
- DyFM_Log.testWarn(
195
- 'No socketServices setted up while using Extended Application.',
196
- '\nYou should use DyNTS_App if you don`t need socket services.'
197
- );
198
- }
199
-
200
- await this.ready();
201
-
202
- if (this.params.title) {
203
- console.log(this.params.title);
204
- console.log(`Version: ${this.params.version}`);
205
- }
206
- DyFM_Log.H_success(`"${this.params.name}" started successfully.`);
207
-
208
- } catch (error) {
209
- /* if (
210
- DyNTS_global_settings.log_settings.highDetailedLogs ||
211
- !(error instanceof DyFM_Error)
212
- ) {
213
- DyFM_Log.H_error(
214
- `Extended Application: ${this.params?.name} start failed. (asyncConstructExt catch)` +
215
- `\n ERROR:`, error
216
- );
217
- } else {
218
- error.logSimple(
219
- `Extended Application: "${this.params?.name}" start failed. (asyncConstructExt catch)`
220
- );
221
- } */
222
-
223
- throw new DyFM_Error({
224
- errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-001`,
225
- error: error,
226
- additionalContent: {
227
- constructErrors: this.constructErrors,
228
- systemControls: this.systemControls,
229
- systemControlsExt: this.systemControlsExt,
230
- systemReadies: {
231
- app: this.systemControls.app.getIsReady(),
232
- appExtended: this.systemControlsExt.appExtended.getIsReady(),
233
- mongoose: this.systemControls.mongoose.getIsReady(),
234
- httpServer: this.systemControls.httpServer.getIsReady(),
235
- httpsServer: this.systemControls.httpsServer.getIsReady(),
236
- httpSocketServer: this.systemControlsExt.httpSocketServer.getIsReady(),
237
- httpsSocketServer: this.systemControlsExt.httpsSocketServer.getIsReady(),
238
- },
239
- },
240
- });
241
- }
242
- }
243
-
244
- override async ready(timeout: number = this.defaultReadyTimeout): Promise<void> {
245
- if (this.fnLogs) console.log('\nfn:. ready-extended');
246
-
247
- try {
248
- await super.ready(timeout);
249
-
250
- let ready: boolean = false;
251
- const start: number = +new Date();
252
-
253
- if (this.constructErrors.length) {
254
- if (this.deepLog) {
255
- if (DyNTS_global_settings.log_settings.highDetailedLogs) {
256
- DyFM_Log.H_error(
257
- `Extended Application: "${this.params.name}" start failed. ` +
258
- `(ready; constructErrors check +1)`,
259
- `\n construct ERRORS:`, this.constructErrors
260
- );
261
- } else {
262
- DyFM_Log.H_error(
263
- `Extended Application: "${this.params.name}" start failed. ` +
264
- `(ready; constructErrors check +1)`,
265
- `\n construct ERRORS:`, this.getSimplifiedConstructErrors(),
266
- );
267
- }
268
- }
269
-
270
- throw new DyFM_Error({
271
- message: `${this.params?.name} start failed.`,
272
- additionalContent: this.constructErrors,
273
- error: this.constructErrors?.[0] ?? new Error(),
274
- });
275
- }
276
-
277
- while (!ready && +new Date() - start < timeout) {
278
- if (this.systemControlsExt.appExtended.init) {
279
- ready = (
280
- this.superStarted &&
281
- this.systemControlsExt.httpSocketServer.getIsReady() &&
282
- this.systemControlsExt.httpsSocketServer.getIsReady()
283
- );
284
- } else {
285
- DyFM_Log.error(`"${this.params.name}" APP NOT INITIALIZED while trying to get ready.`);
286
- }
287
-
288
- if (!ready) {
289
- await DyFM_Async.wait(100);
290
- }
291
- }
292
-
293
- if (this.constructErrors.length) {
294
- if (this.deepLog) {
295
- if (DyNTS_global_settings.log_settings.highDetailedLogs) {
296
- DyFM_Log.H_error(
297
- `Extended Application: "${this.params.name}" start failed. (ready; TIMEOUT check +2)`,
298
- `\n construct ERRORS:`, this.constructErrors
299
- );
300
- } else {
301
- DyFM_Log.H_error(
302
- `Extended Application: "${this.params.name}" start failed. (ready; TIMEOUT check +2)`,
303
- `\n construct ERRORS:`, this.getSimplifiedConstructErrors(),
304
- );
305
- }
306
- }
307
-
308
- throw new DyFM_Error({
309
- message: `${this.params?.name} start failed. TIMEOUT`,
310
- additionalContent: this.constructErrors,
311
- error: this.constructErrors?.[0] ?? new Error(),
312
- });
313
- }
314
-
315
- if (ready) {
316
- this.systemControlsExt.appExtended.started = true;
317
-
318
- if (this.fnLogs && this.deepLog) console.log('\nfn:. ready-extended: return');
319
-
320
- return;
321
- } else {
322
- this.systemControlsExt.appExtended.started = false;
323
-
324
- let msg: string = `${this.params?.name} start failed. UNKNOWN`;
325
-
326
- if (
327
- this.systemControlsExt.httpSocketServer.init &&
328
- !this.systemControlsExt.httpSocketServer.started
329
- ) {
330
- msg += '\nhttpSocketServer start failed.';
331
- }
332
-
333
- if (
334
- this.systemControlsExt.httpsSocketServer.init &&
335
- !this.systemControlsExt.httpsSocketServer.started
336
- ) {
337
- msg += '\nhttpsSocketServer start failed.';
338
- }
339
-
340
- DyFM_Log.error(msg, this.constructErrors, '\n');
341
-
342
- throw new DyFM_Error({
343
- errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-110`,
344
- message: msg,
345
- additionalContent: {
346
- constructErrors: this.constructErrors,
347
- systemControls: this.systemControls,
348
- systemControlsExt: this.systemControlsExt,
349
- systemReadies: {
350
- app: this.systemControls.app.getIsReady(),
351
- appExtended: this.systemControlsExt.appExtended.getIsReady(),
352
- mongoose: this.systemControls.mongoose.getIsReady(),
353
- httpServer: this.systemControls.httpServer.getIsReady(),
354
- httpsServer: this.systemControls.httpsServer.getIsReady(),
355
- httpSocketServer: this.systemControlsExt.httpSocketServer.getIsReady(),
356
- httpsSocketServer: this.systemControlsExt.httpsSocketServer.getIsReady(),
357
- },
358
- },
359
- error: this.constructErrors?.[0] ?? new Error(),
360
- });
361
- }
362
- } catch (error) {
363
- throw new DyFM_Error({
364
- ...this.__getDefaultErrorSettings('ready', error),
365
-
366
- errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-111`,
367
- error: error,
368
- });
369
- }
370
- }
371
-
372
- override async stop(): Promise<void> {
373
- if (this.fnLogs) console.log('\nfn:. stop-extended');
374
-
375
- try {
376
- if (this.started) {
377
- await super.stop(true);
378
-
379
- this.systemControlsExt.httpSocketServer.started = false;
380
- this.systemControlsExt.httpsSocketServer.started = false;
381
- await DyFM_Array.asyncForEach(
382
- this.allSocketServers,
383
- async (socketServer: SocketIO.Server): Promise<void> => {
384
- await new Promise<void>((resolve, reject): void => {
385
- socketServer.disconnectSockets(true);
386
- socketServer.close((err): void => {
387
- if (err) {
388
- DyFM_Log.error(`\nHTTP socket server close error`, err);
389
- reject(
390
- new DyFM_Error({
391
- errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-120`,
392
- message: `SocketServer close failed.`,
393
- error: err,
394
- })
395
- );
396
- } else {
397
- resolve();
398
- }
399
- });
400
- });
401
- }
402
- );
403
- this.systemControlsExt.httpSocketServer.init = false;
404
- this.systemControlsExt.httpsSocketServer.init = false;
405
-
406
- await DyFM_Async.delay(100);
407
-
408
- DyFM_Log.H_info(`"${this.params.name}" stopped successfully.`);
409
- }
410
- } catch (error) {
411
- throw new DyFM_Error({
412
- ...this.__getDefaultErrorSettings('stop', error),
413
-
414
- errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-121`,
415
- });
416
- }
417
- }
418
-
419
- /**
420
- *
421
- */
422
- private setSocketSecurity(): void {
423
- if (this.fnLogs) console.log('\nfn:. setSocketSecurity');
424
-
425
- this.socketServices.forEach((service: DyNTS_SocketServerService<any>): void => {
426
- if (!this.socketSecurity) {
427
- this.socketSecurity = DyNTS_RouteSecurity[service.security];
428
- } else if (
429
- this.socketSecurity !== DyNTS_RouteSecurity.both &&
430
- this.socketSecurity !== DyNTS_RouteSecurity[service.security]
431
- ) {
432
- this.socketSecurity = DyNTS_RouteSecurity.both;
433
- }
434
- });
435
- }
436
-
437
- /**
438
- * Socket szerverek felállítása. By default a socket a HTTP/HTTPS porton fut (same port);
439
- * ha a service.port nincs megadva, a getPortSettings() httpPort/httpsPort értékét használjuk.
440
- * Ha a base app már listenel (httpServer/httpsServer), arra attacholjuk a Socket.IO-t,
441
- * különben külön httpSocketServer-t hozunk létre és listenelünk.
442
- * A Socket.IO path a portSettings.socketPath-ből jön (default: DyNTS_defaultSocketPath); a kliensnek ugyanazt kell használnia.
443
- */
444
- private async setupSocketServerServices(): Promise<void> {
445
- try {
446
- if (this.fnLogs) console.log('\nfn:. setupSocketServerServices');
447
-
448
- const useBaseHttpServer: boolean = !!this.httpServer;
449
- const useBaseHttpsServer: boolean = !!this.httpsServer;
450
-
451
- if (this.socketSecurity !== DyNTS_RouteSecurity.secure) {
452
- if (!this.openExpress) {
453
- await this.initOpenExpress();
454
- }
455
-
456
- if (!useBaseHttpServer && !this.httpSocketServer) {
457
- this.httpSocketServer = Http.createServer(this.openExpress);
458
- }
459
- }
460
-
461
- if (this.socketSecurity !== DyNTS_RouteSecurity.open) {
462
- if (!this.httpsServer) {
463
- if (this.cert) {
464
- await this.initSecureExpress();
465
- } else {
466
- let errorMsg: string =
467
- `\nYou have secure socket service, but the certification paths are not set!` +
468
- `\nset...` +
469
- `\n cert: {` +
470
- `\n keyPath: FileSystem.PathLike,` +
471
- `\n certPath: FileSystem.PathLike,` +
472
- `\n }` +
473
- `\nin DynamoNTSServer - setupRoutingModules() to enable secure routes.`;
474
-
475
- errorMsg += '\n\nThe socket services setted to use secure server:';
476
- this.socketServices.forEach((service: DyNTS_SocketServerService<any>): void => {
477
- if (service.security !== DyNTS_SocketSecurity.open) {
478
- const effPort: number | undefined = service.port ??
479
- this.portSettings.httpsPort;
480
- errorMsg += `\n ${service?.name} (port: ${effPort})`;
481
- }
482
- });
483
-
484
- const error = new Error('Secure routes cannot be established!');
485
- const errorStack: string[] = error.stack.split('\n');
486
-
487
- errorStack.splice(1, 2);
488
- error.stack = errorStack.join('\n');
489
-
490
- DyFM_Log.error(errorMsg);
491
-
492
- throw error;
493
- }
494
- }
495
- }
496
-
497
- await DyFM_Array.asyncForEach(
498
- this.socketServices,
499
- async (service: DyNTS_SocketServerService<any>): Promise<void> => {
500
- try {
501
- const effectivePort: number | undefined = service.security === DyNTS_SocketSecurity.open
502
- ? (service.port ?? this.portSettings.httpPort)
503
- : (service.port ?? this.portSettings.httpsPort);
504
-
505
- if (effectivePort === undefined) {
506
- throw new Error(
507
- `PORT NOT SET: "${service.name}". ` +
508
- `Set port in getServiceParams() or ensure getPortSettings() returns httpPort/httpsPort.`
509
- );
510
- }
511
-
512
- if (service.security === DyNTS_SocketSecurity.open) {
513
- this.systemControlsExt.httpSocketServer.init = true;
514
-
515
- // BFR-MASTERPROMPTER-025 (a BFR-FDPTOKENSERVICE-007 3a2c381 utó-fix-e): az attach-mód
516
- // EXPLICIT opt-in (`dedicatedPort: true`), NEM a port-érték implicit inferenciája. A
517
- // korábbi `port≠httpPort → dedikált` inferencia CSENDBEN regresszálta a unified-shared
518
- // appokat, amelyek legacy-label/notif-konvenció okból adtak portot (MP live-igazolt:
519
- // realtime DEAD az nts-bump után; adventor/ccap/warbots latens). Mostantól:
520
- // - default (dedicatedPort hiányzik/false) → SHARED (a fő szerverre attach, a port-label irreleváns);
521
- // - dedicatedPort: true → saját Http.Server + listen a service.port-on (a bizonyított
522
- // non-base útvonal tükre) — pl. a token-service szándékosan-dedikált notif-portja.
523
- if (service.dedicatedPort && (service.port === undefined || service.port === this.portSettings.httpPort)) {
524
- throw new Error(
525
- `SOCKET CONFIG ERROR: "${service.name}" dedicatedPort:true requires an explicit ` +
526
- `port that differs from the main httpPort (${this.portSettings.httpPort}).`
527
- );
528
- }
529
- const attachToMain: boolean = useBaseHttpServer && !service.dedicatedPort;
530
- const serverForOpen: Http.Server = attachToMain
531
- ? this.httpServer
532
- : (useBaseHttpServer
533
- ? Http.createServer(this.openExpress)
534
- : this.httpSocketServer!);
535
- if (this.logSetup) console.log(
536
- `\nsocket setup (open): ${service?.name}:${effectivePort}` +
537
- (attachToMain ? ' (shared with HTTP)' : ' (dedicated port)')
538
- );
539
- this.httpSocketSettingUpCount++;
540
- this.systemControlsExt.httpSocketServer.started = false;
541
-
542
- const socketPath: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
543
- this.allSocketServers.push(
544
- await service.setupSocketServer(
545
- new SocketIO.Server(serverForOpen, { path: socketPath }),
546
- DyNTS_SocketSecurity.open,
547
- (): void => {
548
- this.httpSocketSettingUpCount--;
549
-
550
- if (this.httpSocketSettingUpCount === 0) {
551
- this.systemControlsExt.httpSocketServer.started = true;
552
- }
553
- },
554
- {
555
- attachedToExistingServer: attachToMain,
556
- effectivePort: effectivePort,
557
- }
558
- )
559
- );
560
-
561
- } else if (service.security === DyNTS_SocketSecurity.secure) {
562
- this.systemControlsExt.httpsSocketServer.init = true;
563
- if (this.logSetup) console.log(
564
- `\nsocket setup (secure): ${service?.name}:${effectivePort}` +
565
- (useBaseHttpsServer ? ' (shared with HTTPS)' : '')
566
- );
567
- this.httpsSocketSettingUpCount++;
568
- this.systemControlsExt.httpsSocketServer.started = false;
569
-
570
- const socketPathSecure: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
571
- this.allSocketServers.push(
572
- await service.setupSocketServer(
573
- new SocketIO.Server(this.httpsServer, { path: socketPathSecure }),
574
- DyNTS_SocketSecurity.secure,
575
- (): void => {
576
- this.httpsSocketSettingUpCount--;
577
-
578
- if (this.httpsSocketSettingUpCount === 0) {
579
- this.systemControlsExt.httpsSocketServer.started = true;
580
- }
581
- },
582
- {
583
- attachedToExistingServer: useBaseHttpsServer,
584
- effectivePort: effectivePort,
585
- }
586
- )
587
- );
588
-
589
- } else {
590
- const error = new Error(
591
- `INVALID Socket Service security: ${service.security} on ${service?.name}`
592
- );
593
- const errorStack: string[] = error.stack?.split('\n');
594
-
595
- errorStack.splice(1, 4);
596
- error.stack = errorStack.join('\n');
597
-
598
- DyFM_Log.error(`\n${error.message}`);
599
-
600
- throw error;
601
- }
602
- } catch (error) {
603
- if (error instanceof DyFM_Error) {
604
- error.logSimple(`\nSocket Server service setup failed. (${service?.name})`)
605
- } else {
606
- DyFM_Log.error(
607
- `\nSocket Server service setup failed. (${service?.name})`,
608
- error,
609
- );
610
- }
611
-
612
- throw error;
613
- }
614
- }
615
- );
616
- } catch (error) {
617
- DyFM_Log.error(
618
- `\nSocket Server services setup failed. (${this.socketServices?.length} services)\n`,
619
- error,
620
- '\n'
621
- );
622
-
623
- throw error;
624
- }
625
- }
626
-
627
- /**
628
- * MISSING Description (TODO)
629
- */
630
- abstract getSocketServices(): DyNTS_SocketServerService<any>[];
631
-
632
- private __getDefaultErrorSettings(
633
- fnName: string,
634
- error: DyFM_AnyError
635
- ): DyFM_Error_Settings {
636
- return {
637
- status: (error as DyFM_Error)?.___status ?? 500,
638
- message: (error as Error)?.message ??
639
- (error as DyFM_Error)?._message ??
640
- `${fnName} was UNSUCCESSFUL (NTS)`,
641
- userMessage: (error as DyFM_Error)?.__userMessage ?? this.defaultErrorUserMsg,
642
- addECToUserMsg: !(error as DyFM_Error)?.__userMessage,
643
- issuerService: `${this?.constructor?.name}-DyNTS_AppExtended`,
644
- level: DyFM_ErrorLevel.fatal,
645
- error: error,
646
- };
647
- }
648
- }
1
+
2
+ import * as Http from 'http';
3
+ import * as SocketIO from 'socket.io';
4
+
5
+ import {
6
+ DyFM_AnyError,
7
+ DyFM_Array,
8
+ DyFM_Async,
9
+ DyFM_Error,
10
+ DyFM_Error_Settings,
11
+ DyFM_ErrorLevel,
12
+ DyFM_Log,
13
+ } from '@futdevpro/fsm-dynamo';
14
+
15
+ import { DyNTS_defaultSocketPath } from '../../_collections/default-socket-path.const';
16
+ import { DyNTS_global_settings } from '../../_collections/global-settings.const';
17
+ import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
18
+ import {
19
+ DyNTS_AppExtSysControls
20
+ } from '../../_models/control-models/app-ext-system-controls.control-model';
21
+ import { DyNTS_App } from '../../_services/server/app.server';
22
+ import { DyNTS_SocketSecurity } from './_enums/socket-security.enum';
23
+ import { DyNTS_SocketServerService } from './_services/socket-server.service';
24
+
25
+ /**
26
+ * This will be the MAIN service of our server project,
27
+ * follow the types and type instructions while setting up your project
28
+ *
29
+ * In this service, there are abstract functions that you will need to implement,
30
+ * where you need to set up the main params for your application.
31
+ *
32
+ * The extended App is containing socket server tools
33
+ *
34
+ * You need to add socketService definitions to setupRoutingModules
35
+ *
36
+ * @example
37
+ * export class App extends DyNTS_AppExtended {
38
+ *
39
+ * ...
40
+ *
41
+ * // Setting up App params, and preparing project global settings
42
+ * setupAppParams(): void {
43
+ * this.params = new DyNTS_AppParams({
44
+ * name: 'Warbots Server',
45
+ * title: warbotsTitleLog,
46
+ * version: version,
47
+ * dbName: 'warbots',
48
+ * });
49
+ *
50
+ * // dynamoNTS_GlobalSettings.logRequestsContent = false;
51
+ * }
52
+ *
53
+ * ...
54
+ *
55
+ * // Setting up DBServices
56
+ * setGlobalServiceCollection(): void {
57
+ * DyNTS_GlobalService.setServices({
58
+ * authService: AuthService.getInstance(),
59
+ * emailServiceCollection: EmailServiceCollectionService.getInstance(),
60
+ * dbModels: [
61
+ * userModelParams,
62
+ * userDataModelParams,
63
+ * userOptionsModelParams,
64
+ * userStatisticsModelParams,
65
+ * userAchievementsModelParams,
66
+ * userNotificationsModelParams,
67
+ *
68
+ * matchStatisticsModelParams,
69
+ * matchDataModelParams,
70
+
71
+ * DyFM_usageSession_dataParams,
72
+ * DyFM_customData_dataParams,
73
+ * ]
74
+ * });
75
+ * }
76
+ *
77
+ * ...
78
+ *
79
+ * // Setting up Routes
80
+ * setupRoutingModules(): void {
81
+ * this.httpPort = env.port;
82
+
83
+ * this.routingModules = [
84
+ * new DyNTS_RoutingModule({
85
+ * route: '/user',
86
+ * controllers: [
87
+ * UserController.getInstance(),
88
+ * UserDataController.getInstance(),
89
+ * UserOptionsController.getInstance(),
90
+ * UserStatisticsController.getInstance(),
91
+ * UserAchievementsController.getInstance(),
92
+ * UserNotificationsController.getInstance()
93
+ * ]
94
+ * }),
95
+ * new DyNTS_RoutingModule({
96
+ * route: '/match',
97
+ * controllers: [
98
+ * MatchController.getInstance(),
99
+ * MatchDistributionController.getInstance(),
100
+ * MatchStatisticsController.getInstance(),
101
+ * ]
102
+ * }),
103
+ * new DyNTS_RoutingModule({
104
+ * route: '/server',
105
+ * controllers: [
106
+ * ServerController.getInstance(),
107
+ * ]
108
+ * }),
109
+
110
+ * getTestRoutingModule(),
111
+ * getUsageRoutingModule()
112
+ * ];
113
+ *
114
+ * ...
115
+ *
116
+ * // Setting up Sockets (port opcionális – ha nincs megadva, a HTTP/HTTPS portot használjuk, same port)
117
+ * this.socketServices = [
118
+ * NotificationService.getInstance(),
119
+ * ChatService.getInstance(),
120
+ * ...
121
+ * ];
122
+ * }
123
+ * }
124
+ */
125
+ export abstract class DyNTS_AppExtended extends DyNTS_App {
126
+
127
+ private readonly systemControlsExt: DyNTS_AppExtSysControls = new DyNTS_AppExtSysControls();
128
+ override get started(): boolean { return this.systemControlsExt.appExtended.started; }
129
+ private httpsSocketSettingUpCount: number = 0;
130
+ private httpSocketSettingUpCount: number = 0;
131
+
132
+ private socketSecurity: DyNTS_RouteSecurity;
133
+
134
+ /** Csak akkor van értékadva, ha nincs base httpServer (pl. nincs open route) és open socket van. */
135
+ private httpSocketServer: Http.Server | undefined;
136
+
137
+ /**
138
+ * Socket szolgáltatások. A port opcionális: ha nincs megadva, az extended app
139
+ * a getPortSettings() httpPort/httpsPort értékét használja (WebSocket és HTTP ugyanazon a porton).
140
+ * @example
141
+ * // Setting up Sockets
142
+ * this.socketServices = [
143
+ * NotificationService.getInstance(),
144
+ * ChatService.getInstance(),
145
+ * ...
146
+ * ];
147
+ */
148
+ protected socketServices: DyNTS_SocketServerService<any>[];
149
+ private readonly allSocketServers: SocketIO.Server[] = [];
150
+
151
+ constructor(){
152
+ super(/* true */);
153
+
154
+ /* this.asyncConstructExt().catch((error: DyFM_AnyError): void => {
155
+ if (
156
+ DyNTS_global_settings.log_settings.highDetailedLogs ||
157
+ !(error instanceof DyFM_Error)
158
+ ) {
159
+ DyFM_Log.H_error(
160
+ `Extended Application: ${this.params?.name} start failed. ` +
161
+ `(DyNTS_AppExtended constructor catch)`,
162
+ `\n ERROR:`, error
163
+ );
164
+ } else {
165
+ error.logSimple(
166
+ `Extended Application: "${this.params?.name}" start failed. ` +
167
+ `(DyNTS_AppExtended constructor catch)`
168
+ );
169
+ }
170
+ }); */
171
+ }
172
+
173
+ protected override async asyncConstruct(extended = true): Promise<void> {
174
+ if (this.fnLogs && this.deepLog) console.log('\nfn:. asyncConstruct-extended');
175
+
176
+ try {
177
+ await super.asyncConstruct(true);
178
+
179
+ this.systemControlsExt.appExtended.init = true;
180
+
181
+ this.socketServices = this.getSocketServices();
182
+
183
+ if (this.socketServices?.length) {
184
+ if (this.logSetup) DyFM_Log.log('\nsetting up socket servers...');
185
+
186
+ this.setSocketSecurity();
187
+
188
+ await this.setupSocketServerServices();
189
+
190
+ if (this.logSetup) console.log(
191
+ `\nAll sockets setted up.... sockets using security: ${this.socketSecurity}`
192
+ );
193
+ } else {
194
+ DyFM_Log.testWarn(
195
+ 'No socketServices setted up while using Extended Application.',
196
+ '\nYou should use DyNTS_App if you don`t need socket services.'
197
+ );
198
+ }
199
+
200
+ await this.ready();
201
+
202
+ if (this.params.title) {
203
+ console.log(this.params.title);
204
+ console.log(`Version: ${this.params.version}`);
205
+ }
206
+ DyFM_Log.H_success(`"${this.params.name}" started successfully.`);
207
+
208
+ } catch (error) {
209
+ /* if (
210
+ DyNTS_global_settings.log_settings.highDetailedLogs ||
211
+ !(error instanceof DyFM_Error)
212
+ ) {
213
+ DyFM_Log.H_error(
214
+ `Extended Application: ${this.params?.name} start failed. (asyncConstructExt catch)` +
215
+ `\n ERROR:`, error
216
+ );
217
+ } else {
218
+ error.logSimple(
219
+ `Extended Application: "${this.params?.name}" start failed. (asyncConstructExt catch)`
220
+ );
221
+ } */
222
+
223
+ throw new DyFM_Error({
224
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-001`,
225
+ error: error,
226
+ additionalContent: {
227
+ constructErrors: this.constructErrors,
228
+ systemControls: this.systemControls,
229
+ systemControlsExt: this.systemControlsExt,
230
+ systemReadies: {
231
+ app: this.systemControls.app.getIsReady(),
232
+ appExtended: this.systemControlsExt.appExtended.getIsReady(),
233
+ mongoose: this.systemControls.mongoose.getIsReady(),
234
+ httpServer: this.systemControls.httpServer.getIsReady(),
235
+ httpsServer: this.systemControls.httpsServer.getIsReady(),
236
+ httpSocketServer: this.systemControlsExt.httpSocketServer.getIsReady(),
237
+ httpsSocketServer: this.systemControlsExt.httpsSocketServer.getIsReady(),
238
+ },
239
+ },
240
+ });
241
+ }
242
+ }
243
+
244
+ override async ready(timeout: number = this.defaultReadyTimeout): Promise<void> {
245
+ if (this.fnLogs) console.log('\nfn:. ready-extended');
246
+
247
+ try {
248
+ await super.ready(timeout);
249
+
250
+ let ready: boolean = false;
251
+ const start: number = +new Date();
252
+
253
+ if (this.constructErrors.length) {
254
+ if (this.deepLog) {
255
+ if (DyNTS_global_settings.log_settings.highDetailedLogs) {
256
+ DyFM_Log.H_error(
257
+ `Extended Application: "${this.params.name}" start failed. ` +
258
+ `(ready; constructErrors check +1)`,
259
+ `\n construct ERRORS:`, this.constructErrors
260
+ );
261
+ } else {
262
+ DyFM_Log.H_error(
263
+ `Extended Application: "${this.params.name}" start failed. ` +
264
+ `(ready; constructErrors check +1)`,
265
+ `\n construct ERRORS:`, this.getSimplifiedConstructErrors(),
266
+ );
267
+ }
268
+ }
269
+
270
+ throw new DyFM_Error({
271
+ message: `${this.params?.name} start failed.`,
272
+ additionalContent: this.constructErrors,
273
+ error: this.constructErrors?.[0] ?? new Error(),
274
+ });
275
+ }
276
+
277
+ while (!ready && +new Date() - start < timeout) {
278
+ if (this.systemControlsExt.appExtended.init) {
279
+ ready = (
280
+ this.superStarted &&
281
+ this.systemControlsExt.httpSocketServer.getIsReady() &&
282
+ this.systemControlsExt.httpsSocketServer.getIsReady()
283
+ );
284
+ } else {
285
+ DyFM_Log.error(`"${this.params.name}" APP NOT INITIALIZED while trying to get ready.`);
286
+ }
287
+
288
+ if (!ready) {
289
+ await DyFM_Async.wait(100);
290
+ }
291
+ }
292
+
293
+ if (this.constructErrors.length) {
294
+ if (this.deepLog) {
295
+ if (DyNTS_global_settings.log_settings.highDetailedLogs) {
296
+ DyFM_Log.H_error(
297
+ `Extended Application: "${this.params.name}" start failed. (ready; TIMEOUT check +2)`,
298
+ `\n construct ERRORS:`, this.constructErrors
299
+ );
300
+ } else {
301
+ DyFM_Log.H_error(
302
+ `Extended Application: "${this.params.name}" start failed. (ready; TIMEOUT check +2)`,
303
+ `\n construct ERRORS:`, this.getSimplifiedConstructErrors(),
304
+ );
305
+ }
306
+ }
307
+
308
+ throw new DyFM_Error({
309
+ message: `${this.params?.name} start failed. TIMEOUT`,
310
+ additionalContent: this.constructErrors,
311
+ error: this.constructErrors?.[0] ?? new Error(),
312
+ });
313
+ }
314
+
315
+ if (ready) {
316
+ this.systemControlsExt.appExtended.started = true;
317
+
318
+ if (this.fnLogs && this.deepLog) console.log('\nfn:. ready-extended: return');
319
+
320
+ return;
321
+ } else {
322
+ this.systemControlsExt.appExtended.started = false;
323
+
324
+ let msg: string = `${this.params?.name} start failed. UNKNOWN`;
325
+
326
+ if (
327
+ this.systemControlsExt.httpSocketServer.init &&
328
+ !this.systemControlsExt.httpSocketServer.started
329
+ ) {
330
+ msg += '\nhttpSocketServer start failed.';
331
+ }
332
+
333
+ if (
334
+ this.systemControlsExt.httpsSocketServer.init &&
335
+ !this.systemControlsExt.httpsSocketServer.started
336
+ ) {
337
+ msg += '\nhttpsSocketServer start failed.';
338
+ }
339
+
340
+ DyFM_Log.error(msg, this.constructErrors, '\n');
341
+
342
+ throw new DyFM_Error({
343
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-110`,
344
+ message: msg,
345
+ additionalContent: {
346
+ constructErrors: this.constructErrors,
347
+ systemControls: this.systemControls,
348
+ systemControlsExt: this.systemControlsExt,
349
+ systemReadies: {
350
+ app: this.systemControls.app.getIsReady(),
351
+ appExtended: this.systemControlsExt.appExtended.getIsReady(),
352
+ mongoose: this.systemControls.mongoose.getIsReady(),
353
+ httpServer: this.systemControls.httpServer.getIsReady(),
354
+ httpsServer: this.systemControls.httpsServer.getIsReady(),
355
+ httpSocketServer: this.systemControlsExt.httpSocketServer.getIsReady(),
356
+ httpsSocketServer: this.systemControlsExt.httpsSocketServer.getIsReady(),
357
+ },
358
+ },
359
+ error: this.constructErrors?.[0] ?? new Error(),
360
+ });
361
+ }
362
+ } catch (error) {
363
+ throw new DyFM_Error({
364
+ ...this.__getDefaultErrorSettings('ready', error),
365
+
366
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-111`,
367
+ error: error,
368
+ });
369
+ }
370
+ }
371
+
372
+ override async stop(): Promise<void> {
373
+ if (this.fnLogs) console.log('\nfn:. stop-extended');
374
+
375
+ try {
376
+ if (this.started) {
377
+ await super.stop(true);
378
+
379
+ this.systemControlsExt.httpSocketServer.started = false;
380
+ this.systemControlsExt.httpsSocketServer.started = false;
381
+ await DyFM_Array.asyncForEach(
382
+ this.allSocketServers,
383
+ async (socketServer: SocketIO.Server): Promise<void> => {
384
+ await new Promise<void>((resolve, reject): void => {
385
+ socketServer.disconnectSockets(true);
386
+ socketServer.close((err): void => {
387
+ if (err) {
388
+ DyFM_Log.error(`\nHTTP socket server close error`, err);
389
+ reject(
390
+ new DyFM_Error({
391
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-120`,
392
+ message: `SocketServer close failed.`,
393
+ error: err,
394
+ })
395
+ );
396
+ } else {
397
+ resolve();
398
+ }
399
+ });
400
+ });
401
+ }
402
+ );
403
+ this.systemControlsExt.httpSocketServer.init = false;
404
+ this.systemControlsExt.httpsSocketServer.init = false;
405
+
406
+ await DyFM_Async.delay(100);
407
+
408
+ DyFM_Log.H_info(`"${this.params.name}" stopped successfully.`);
409
+ }
410
+ } catch (error) {
411
+ throw new DyFM_Error({
412
+ ...this.__getDefaultErrorSettings('stop', error),
413
+
414
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AES-121`,
415
+ });
416
+ }
417
+ }
418
+
419
+ /**
420
+ *
421
+ */
422
+ private setSocketSecurity(): void {
423
+ if (this.fnLogs) console.log('\nfn:. setSocketSecurity');
424
+
425
+ this.socketServices.forEach((service: DyNTS_SocketServerService<any>): void => {
426
+ if (!this.socketSecurity) {
427
+ this.socketSecurity = DyNTS_RouteSecurity[service.security];
428
+ } else if (
429
+ this.socketSecurity !== DyNTS_RouteSecurity.both &&
430
+ this.socketSecurity !== DyNTS_RouteSecurity[service.security]
431
+ ) {
432
+ this.socketSecurity = DyNTS_RouteSecurity.both;
433
+ }
434
+ });
435
+ }
436
+
437
+ /**
438
+ * Socket szerverek felállítása. By default a socket a HTTP/HTTPS porton fut (same port);
439
+ * ha a service.port nincs megadva, a getPortSettings() httpPort/httpsPort értékét használjuk.
440
+ * Ha a base app már listenel (httpServer/httpsServer), arra attacholjuk a Socket.IO-t,
441
+ * különben külön httpSocketServer-t hozunk létre és listenelünk.
442
+ * A Socket.IO path a portSettings.socketPath-ből jön (default: DyNTS_defaultSocketPath); a kliensnek ugyanazt kell használnia.
443
+ */
444
+ private async setupSocketServerServices(): Promise<void> {
445
+ try {
446
+ if (this.fnLogs) console.log('\nfn:. setupSocketServerServices');
447
+
448
+ const useBaseHttpServer: boolean = !!this.httpServer;
449
+ const useBaseHttpsServer: boolean = !!this.httpsServer;
450
+
451
+ if (this.socketSecurity !== DyNTS_RouteSecurity.secure) {
452
+ if (!this.openExpress) {
453
+ await this.initOpenExpress();
454
+ }
455
+
456
+ if (!useBaseHttpServer && !this.httpSocketServer) {
457
+ this.httpSocketServer = Http.createServer(this.openExpress);
458
+ }
459
+ }
460
+
461
+ if (this.socketSecurity !== DyNTS_RouteSecurity.open) {
462
+ if (!this.httpsServer) {
463
+ if (this.cert) {
464
+ await this.initSecureExpress();
465
+ } else {
466
+ let errorMsg: string =
467
+ `\nYou have secure socket service, but the certification paths are not set!` +
468
+ `\nset...` +
469
+ `\n cert: {` +
470
+ `\n keyPath: FileSystem.PathLike,` +
471
+ `\n certPath: FileSystem.PathLike,` +
472
+ `\n }` +
473
+ `\nin DynamoNTSServer - setupRoutingModules() to enable secure routes.`;
474
+
475
+ errorMsg += '\n\nThe socket services setted to use secure server:';
476
+ this.socketServices.forEach((service: DyNTS_SocketServerService<any>): void => {
477
+ if (service.security !== DyNTS_SocketSecurity.open) {
478
+ const effPort: number | undefined = service.port ??
479
+ this.portSettings.httpsPort;
480
+ errorMsg += `\n ${service?.name} (port: ${effPort})`;
481
+ }
482
+ });
483
+
484
+ const error = new Error('Secure routes cannot be established!');
485
+ const errorStack: string[] = error.stack.split('\n');
486
+
487
+ errorStack.splice(1, 2);
488
+ error.stack = errorStack.join('\n');
489
+
490
+ DyFM_Log.error(errorMsg);
491
+
492
+ throw error;
493
+ }
494
+ }
495
+ }
496
+
497
+ await DyFM_Array.asyncForEach(
498
+ this.socketServices,
499
+ async (service: DyNTS_SocketServerService<any>): Promise<void> => {
500
+ try {
501
+ const effectivePort: number | undefined = service.security === DyNTS_SocketSecurity.open
502
+ ? (service.port ?? this.portSettings.httpPort)
503
+ : (service.port ?? this.portSettings.httpsPort);
504
+
505
+ if (effectivePort === undefined) {
506
+ throw new Error(
507
+ `PORT NOT SET: "${service.name}". ` +
508
+ `Set port in getServiceParams() or ensure getPortSettings() returns httpPort/httpsPort.`
509
+ );
510
+ }
511
+
512
+ if (service.security === DyNTS_SocketSecurity.open) {
513
+ this.systemControlsExt.httpSocketServer.init = true;
514
+
515
+ // BFR-MASTERPROMPTER-025 (a BFR-FDPTOKENSERVICE-007 3a2c381 utó-fix-e): az attach-mód
516
+ // EXPLICIT opt-in (`dedicatedPort: true`), NEM a port-érték implicit inferenciája. A
517
+ // korábbi `port≠httpPort → dedikált` inferencia CSENDBEN regresszálta a unified-shared
518
+ // appokat, amelyek legacy-label/notif-konvenció okból adtak portot (MP live-igazolt:
519
+ // realtime DEAD az nts-bump után; adventor/ccap/warbots latens). Mostantól:
520
+ // - default (dedicatedPort hiányzik/false) → SHARED (a fő szerverre attach, a port-label irreleváns);
521
+ // - dedicatedPort: true → saját Http.Server + listen a service.port-on (a bizonyított
522
+ // non-base útvonal tükre) — pl. a token-service szándékosan-dedikált notif-portja.
523
+ if (service.dedicatedPort && (service.port === undefined || service.port === this.portSettings.httpPort)) {
524
+ throw new Error(
525
+ `SOCKET CONFIG ERROR: "${service.name}" dedicatedPort:true requires an explicit ` +
526
+ `port that differs from the main httpPort (${this.portSettings.httpPort}).`
527
+ );
528
+ }
529
+ const attachToMain: boolean = useBaseHttpServer && !service.dedicatedPort;
530
+ const serverForOpen: Http.Server = attachToMain
531
+ ? this.httpServer
532
+ : (useBaseHttpServer
533
+ ? Http.createServer(this.openExpress)
534
+ : this.httpSocketServer!);
535
+ if (this.logSetup) console.log(
536
+ `\nsocket setup (open): ${service?.name}:${effectivePort}` +
537
+ (attachToMain ? ' (shared with HTTP)' : ' (dedicated port)')
538
+ );
539
+ this.httpSocketSettingUpCount++;
540
+ this.systemControlsExt.httpSocketServer.started = false;
541
+
542
+ const socketPath: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
543
+ this.allSocketServers.push(
544
+ await service.setupSocketServer(
545
+ new SocketIO.Server(serverForOpen, { path: socketPath }),
546
+ DyNTS_SocketSecurity.open,
547
+ (): void => {
548
+ this.httpSocketSettingUpCount--;
549
+
550
+ if (this.httpSocketSettingUpCount === 0) {
551
+ this.systemControlsExt.httpSocketServer.started = true;
552
+ }
553
+ },
554
+ {
555
+ attachedToExistingServer: attachToMain,
556
+ effectivePort: effectivePort,
557
+ }
558
+ )
559
+ );
560
+
561
+ } else if (service.security === DyNTS_SocketSecurity.secure) {
562
+ this.systemControlsExt.httpsSocketServer.init = true;
563
+ if (this.logSetup) console.log(
564
+ `\nsocket setup (secure): ${service?.name}:${effectivePort}` +
565
+ (useBaseHttpsServer ? ' (shared with HTTPS)' : '')
566
+ );
567
+ this.httpsSocketSettingUpCount++;
568
+ this.systemControlsExt.httpsSocketServer.started = false;
569
+
570
+ const socketPathSecure: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
571
+ this.allSocketServers.push(
572
+ await service.setupSocketServer(
573
+ new SocketIO.Server(this.httpsServer, { path: socketPathSecure }),
574
+ DyNTS_SocketSecurity.secure,
575
+ (): void => {
576
+ this.httpsSocketSettingUpCount--;
577
+
578
+ if (this.httpsSocketSettingUpCount === 0) {
579
+ this.systemControlsExt.httpsSocketServer.started = true;
580
+ }
581
+ },
582
+ {
583
+ attachedToExistingServer: useBaseHttpsServer,
584
+ effectivePort: effectivePort,
585
+ }
586
+ )
587
+ );
588
+
589
+ } else {
590
+ const error = new Error(
591
+ `INVALID Socket Service security: ${service.security} on ${service?.name}`
592
+ );
593
+ const errorStack: string[] = error.stack?.split('\n');
594
+
595
+ errorStack.splice(1, 4);
596
+ error.stack = errorStack.join('\n');
597
+
598
+ DyFM_Log.error(`\n${error.message}`);
599
+
600
+ throw error;
601
+ }
602
+ } catch (error) {
603
+ if (error instanceof DyFM_Error) {
604
+ error.logSimple(`\nSocket Server service setup failed. (${service?.name})`)
605
+ } else {
606
+ DyFM_Log.error(
607
+ `\nSocket Server service setup failed. (${service?.name})`,
608
+ error,
609
+ );
610
+ }
611
+
612
+ throw error;
613
+ }
614
+ }
615
+ );
616
+ } catch (error) {
617
+ DyFM_Log.error(
618
+ `\nSocket Server services setup failed. (${this.socketServices?.length} services)\n`,
619
+ error,
620
+ '\n'
621
+ );
622
+
623
+ throw error;
624
+ }
625
+ }
626
+
627
+ /**
628
+ * MISSING Description (TODO)
629
+ */
630
+ abstract getSocketServices(): DyNTS_SocketServerService<any>[];
631
+
632
+ private __getDefaultErrorSettings(
633
+ fnName: string,
634
+ error: DyFM_AnyError
635
+ ): DyFM_Error_Settings {
636
+ return {
637
+ status: (error as DyFM_Error)?.___status ?? 500,
638
+ message: (error as Error)?.message ??
639
+ (error as DyFM_Error)?._message ??
640
+ `${fnName} was UNSUCCESSFUL (NTS)`,
641
+ userMessage: (error as DyFM_Error)?.__userMessage ?? this.defaultErrorUserMsg,
642
+ addECToUserMsg: !(error as DyFM_Error)?.__userMessage,
643
+ issuerService: `${this?.constructor?.name}-DyNTS_AppExtended`,
644
+ level: DyFM_ErrorLevel.fatal,
645
+ error: error,
646
+ };
647
+ }
648
+ }