@futdevpro/nts-dynamo 1.15.86 → 1.15.88

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 (358) 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/pipeline.cicd.config.json +4 -0
  17. package/.vscode/settings.json +10 -10
  18. package/HOWTO.md +15 -15
  19. package/LICENSE +21 -21
  20. package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
  21. package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
  22. package/_specifications/BACKLOG.md +92 -92
  23. package/_specifications/TODO.md +15 -15
  24. package/_specifications/agent.md +138 -138
  25. package/eslint.config.js +3 -3
  26. package/nodemon.json +24 -24
  27. package/package.json +5 -5
  28. package/pnpm-workspace.yaml +5 -5
  29. package/scripts/run-coverage-tests.js +28 -28
  30. package/spec/support/helpers/spec-reporter-loader.js +359 -359
  31. package/spec/support/helpers/ts-node-helper.js +93 -93
  32. package/spec/support/jasmine.coverage.json +24 -24
  33. package/spec/support/jasmine.json +24 -24
  34. package/src/_collections/archive.util.spec.ts +57 -57
  35. package/src/_collections/archive.util.ts +18 -18
  36. package/src/_collections/atlas-default-db-options.const.ts +9 -9
  37. package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
  38. package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
  39. package/src/_collections/default-not-found-page.const.spec.ts +19 -19
  40. package/src/_collections/default-not-found-page.const.ts +22 -22
  41. package/src/_collections/default-socket-path.const.spec.ts +12 -12
  42. package/src/_collections/default-socket-path.const.ts +2 -2
  43. package/src/_collections/get-environment-settings.util.spec.ts +210 -210
  44. package/src/_collections/get-environment-settings.util.ts +48 -48
  45. package/src/_collections/global-settings.const.ts +109 -109
  46. package/src/_collections/sample.env +21 -21
  47. package/src/_collections/star.controller.spec.ts +224 -224
  48. package/src/_collections/star.controller.ts +129 -129
  49. package/src/_enums/data-model-type.enum.ts +14 -14
  50. package/src/_enums/data-service-function.enum.ts +24 -24
  51. package/src/_enums/predefined-data-types.enum.ts +16 -16
  52. package/src/_enums/route-security.enum.ts +12 -12
  53. package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
  54. package/src/_models/control-models/api-call-params.control-model.ts +142 -142
  55. package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
  56. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  57. package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
  58. package/src/_models/control-models/app-params.control-model.ts +136 -136
  59. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
  60. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  61. package/src/_models/control-models/endpoint-params.control-model.spec.ts +627 -627
  62. package/src/_models/control-models/endpoint-params.control-model.ts +627 -627
  63. package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
  64. package/src/_models/control-models/http-settings.control-model.ts +37 -37
  65. package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
  66. package/src/_models/control-models/system-control.control-model.ts +12 -12
  67. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  68. package/src/_models/interfaces/environment-settings.interface.ts +59 -59
  69. package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
  70. package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
  71. package/src/_models/interfaces/global-settings.interface.ts +235 -235
  72. package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
  73. package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
  74. package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
  75. package/src/_models/types/db-update.type.ts +100 -100
  76. package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
  77. package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
  78. package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
  79. package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
  80. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
  81. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
  82. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -295
  83. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
  84. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
  85. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
  86. package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
  87. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
  88. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
  89. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
  90. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -68
  91. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
  92. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
  93. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
  94. package/src/_modules/ai/_modules/document-ai/index.ts +30 -30
  95. package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
  96. package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
  97. package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
  98. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
  99. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
  100. package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
  101. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
  102. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
  103. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
  104. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
  105. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
  106. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
  107. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
  108. package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
  109. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
  110. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
  111. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
  112. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
  113. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1033 -1033
  114. package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
  115. package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -115
  116. package/src/_modules/ai/_services/ai-embedding-mock.service.ts +212 -212
  117. package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
  118. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -110
  119. package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
  120. package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
  121. package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
  122. package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
  123. package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
  124. package/src/_modules/ai/_services/ai-llm.service-base.ts +519 -519
  125. package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
  126. package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
  127. package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
  128. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
  129. package/src/_modules/ai/index.ts +23 -23
  130. package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
  131. package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
  132. package/src/_modules/assistant/_collections/ass.util.ts +50 -50
  133. package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
  134. package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
  135. package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
  136. package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
  137. package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
  138. package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
  139. package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
  140. package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
  141. package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
  142. package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
  143. package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
  144. package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
  145. package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
  146. package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
  147. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
  148. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
  149. package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
  150. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
  151. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
  152. package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
  153. package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
  154. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
  155. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
  156. package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
  157. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
  158. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
  159. package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
  160. package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
  161. package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
  162. package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
  163. package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
  164. package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
  165. package/src/_modules/custom-data/custom-data.controller.ts +67 -67
  166. package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
  167. package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
  168. package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
  169. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
  170. package/src/_modules/custom-data/index.ts +9 -9
  171. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
  172. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
  173. package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
  174. package/src/_modules/data-readers/index.ts +11 -11
  175. package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
  176. package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
  177. package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
  178. package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
  179. package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
  180. package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
  181. package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
  182. package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
  183. package/src/_modules/defaults/index.ts +17 -17
  184. package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
  185. package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
  186. package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
  187. package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
  188. package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
  189. package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
  190. package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
  191. package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
  192. package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
  193. package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
  194. package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
  195. package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
  196. package/src/_modules/discord-assistant/index.ts +38 -38
  197. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
  198. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
  199. package/src/_modules/discord-assistant-voiced/index.ts +36 -36
  200. package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
  201. package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
  202. package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
  203. package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
  204. package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
  205. package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
  206. package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
  207. package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
  208. package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
  209. package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
  210. package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
  211. package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
  212. package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
  213. package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
  214. package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
  215. package/src/_modules/discord-bot/index.ts +36 -36
  216. package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
  217. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
  218. package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
  219. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
  220. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
  221. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
  222. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
  223. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -198
  224. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -146
  225. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
  226. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -106
  227. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +507 -507
  228. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +272 -272
  229. package/src/_modules/local-vector-search/index.ts +16 -16
  230. package/src/_modules/logs/index.ts +11 -11
  231. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
  232. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
  233. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
  234. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
  235. package/src/_modules/mcp/index.ts +13 -13
  236. package/src/_modules/messaging/README.md +354 -354
  237. package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
  238. package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
  239. package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
  240. package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
  241. package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
  242. package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
  243. package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
  244. package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
  245. package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
  246. package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
  247. package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
  248. package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
  249. package/src/_modules/messaging/index.ts +30 -30
  250. package/src/_modules/mock/app-extended-server.mock.ts +201 -201
  251. package/src/_modules/mock/app-integration-test.mock.ts +51 -51
  252. package/src/_modules/mock/app-params.mock.spec.ts +21 -21
  253. package/src/_modules/mock/app-params.mock.ts +9 -9
  254. package/src/_modules/mock/app-server.mock.ts +188 -188
  255. package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
  256. package/src/_modules/mock/auth-service.mock.ts +28 -28
  257. package/src/_modules/mock/controller.mock.spec.ts +26 -26
  258. package/src/_modules/mock/controller.mock.ts +16 -16
  259. package/src/_modules/mock/data-model.mock.spec.ts +111 -111
  260. package/src/_modules/mock/data-model.mock.ts +82 -82
  261. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
  262. package/src/_modules/mock/email-service-collection.mock.ts +15 -15
  263. package/src/_modules/mock/email-service.mock.spec.ts +17 -17
  264. package/src/_modules/mock/email-service.mock.ts +20 -20
  265. package/src/_modules/mock/email-template.mock.html +14 -14
  266. package/src/_modules/mock/endpoint.mock.ts +91 -91
  267. package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
  268. package/src/_modules/mock/socket-client.mock.ts +45 -45
  269. package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
  270. package/src/_modules/mock/socket-server.mock.ts +46 -46
  271. package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
  272. package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
  273. package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
  274. package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
  275. package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
  276. package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
  277. package/src/_modules/oauth2/index.ts +17 -17
  278. package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
  279. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
  280. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
  281. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
  282. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
  283. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
  284. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
  285. package/src/_modules/scoped-config/index.ts +17 -17
  286. package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
  287. package/src/_modules/server/errors/errors.control-service.ts +100 -100
  288. package/src/_modules/server/errors/errors.controller.spec.ts +268 -268
  289. package/src/_modules/server/errors/errors.controller.ts +515 -515
  290. package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
  291. package/src/_modules/server/index.ts +30 -30
  292. package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
  293. package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
  294. package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
  295. package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
  296. package/src/_modules/server/server-status/server-status.control-service.spec.ts +576 -576
  297. package/src/_modules/server/server-status/server-status.control-service.ts +396 -396
  298. package/src/_modules/server/server-status/server-status.controller.spec.ts +255 -255
  299. package/src/_modules/server/server-status/server-status.controller.ts +272 -272
  300. package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
  301. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
  302. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
  303. package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
  304. package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
  305. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
  306. package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
  307. package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
  308. package/src/_modules/socket/_services/socket-client.service.ts +260 -260
  309. package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
  310. package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
  311. package/src/_modules/socket/app-extended.server.ts +630 -630
  312. package/src/_modules/socket/index.ts +42 -42
  313. package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
  314. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  315. package/src/_modules/test/index.ts +11 -11
  316. package/src/_modules/test/test.controller.spec.ts +72 -72
  317. package/src/_modules/test/test.controller.ts +115 -115
  318. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  319. package/src/_modules/usage/index.ts +15 -15
  320. package/src/_modules/usage/usage.controller.spec.ts +81 -81
  321. package/src/_modules/usage/usage.controller.ts +126 -126
  322. package/src/_modules/usage/usage.data-service.spec.ts +332 -332
  323. package/src/_modules/usage/usage.data-service.ts +185 -185
  324. package/src/_services/base/api.service-base.spec.ts +125 -125
  325. package/src/_services/base/api.service-base.ts +74 -74
  326. package/src/_services/base/archive-data.service.spec.ts +209 -209
  327. package/src/_services/base/archive-data.service.ts +224 -224
  328. package/src/_services/base/data.service.spec.ts +729 -729
  329. package/src/_services/base/data.service.ts +2740 -2740
  330. package/src/_services/base/db.service.spec.ts +73 -73
  331. package/src/_services/base/db.service.ts +1575 -1575
  332. package/src/_services/base/singleton.service-base.spec.ts +28 -28
  333. package/src/_services/base/singleton.service-base.ts +24 -24
  334. package/src/_services/base/singleton.service.spec.ts +114 -114
  335. package/src/_services/base/singleton.service.ts +38 -38
  336. package/src/_services/core/api.service.spec.ts +140 -140
  337. package/src/_services/core/auth.service.spec.ts +159 -159
  338. package/src/_services/core/auth.service.ts +174 -174
  339. package/src/_services/core/email.service.spec.ts +85 -85
  340. package/src/_services/core/email.service.ts +742 -742
  341. package/src/_services/core/global.service.spec.ts +292 -292
  342. package/src/_services/core/global.service.ts +487 -487
  343. package/src/_services/core/memory-guard.service.spec.ts +245 -245
  344. package/src/_services/core/memory-guard.service.ts +481 -481
  345. package/src/_services/core/service-collection.service.spec.ts +46 -46
  346. package/src/_services/core/service-collection.service.ts +6 -6
  347. package/src/_services/route/controller.service.spec.ts +53 -53
  348. package/src/_services/route/controller.service.ts +148 -148
  349. package/src/_services/route/routing-module.service.spec.ts +98 -98
  350. package/src/_services/route/routing-module.service.ts +330 -330
  351. package/src/_services/server/app.server.ts +1912 -1912
  352. package/src/_services/shared.static-service.spec.ts +99 -99
  353. package/src/_services/shared.static-service.ts +78 -78
  354. package/src/index.ts +97 -97
  355. package/tsconfig.app.json +12 -12
  356. package/tsconfig.json +42 -42
  357. package/.dynamo/logs/cicd-pipeline/output.log +0 -2818
  358. package/.dynamo/logs/cicd-pipeline/status.json +0 -94
@@ -1,630 +1,630 @@
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
- const serverForOpen: Http.Server = useBaseHttpServer
515
- ? this.httpServer
516
- : this.httpSocketServer!;
517
- if (this.logSetup) console.log(
518
- `\nsocket setup (open): ${service?.name}:${effectivePort}` +
519
- (useBaseHttpServer ? ' (shared with HTTP)' : '')
520
- );
521
- this.httpSocketSettingUpCount++;
522
- this.systemControlsExt.httpSocketServer.started = false;
523
-
524
- const socketPath: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
525
- this.allSocketServers.push(
526
- await service.setupSocketServer(
527
- new SocketIO.Server(serverForOpen, { path: socketPath }),
528
- DyNTS_SocketSecurity.open,
529
- (): void => {
530
- this.httpSocketSettingUpCount--;
531
-
532
- if (this.httpSocketSettingUpCount === 0) {
533
- this.systemControlsExt.httpSocketServer.started = true;
534
- }
535
- },
536
- {
537
- attachedToExistingServer: useBaseHttpServer,
538
- effectivePort: effectivePort,
539
- }
540
- )
541
- );
542
-
543
- } else if (service.security === DyNTS_SocketSecurity.secure) {
544
- this.systemControlsExt.httpsSocketServer.init = true;
545
- if (this.logSetup) console.log(
546
- `\nsocket setup (secure): ${service?.name}:${effectivePort}` +
547
- (useBaseHttpsServer ? ' (shared with HTTPS)' : '')
548
- );
549
- this.httpsSocketSettingUpCount++;
550
- this.systemControlsExt.httpsSocketServer.started = false;
551
-
552
- const socketPathSecure: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
553
- this.allSocketServers.push(
554
- await service.setupSocketServer(
555
- new SocketIO.Server(this.httpsServer, { path: socketPathSecure }),
556
- DyNTS_SocketSecurity.secure,
557
- (): void => {
558
- this.httpsSocketSettingUpCount--;
559
-
560
- if (this.httpsSocketSettingUpCount === 0) {
561
- this.systemControlsExt.httpsSocketServer.started = true;
562
- }
563
- },
564
- {
565
- attachedToExistingServer: useBaseHttpsServer,
566
- effectivePort: effectivePort,
567
- }
568
- )
569
- );
570
-
571
- } else {
572
- const error = new Error(
573
- `INVALID Socket Service security: ${service.security} on ${service?.name}`
574
- );
575
- const errorStack: string[] = error.stack?.split('\n');
576
-
577
- errorStack.splice(1, 4);
578
- error.stack = errorStack.join('\n');
579
-
580
- DyFM_Log.error(`\n${error.message}`);
581
-
582
- throw error;
583
- }
584
- } catch (error) {
585
- if (error instanceof DyFM_Error) {
586
- error.logSimple(`\nSocket Server service setup failed. (${service?.name})`)
587
- } else {
588
- DyFM_Log.error(
589
- `\nSocket Server service setup failed. (${service?.name})`,
590
- error,
591
- );
592
- }
593
-
594
- throw error;
595
- }
596
- }
597
- );
598
- } catch (error) {
599
- DyFM_Log.error(
600
- `\nSocket Server services setup failed. (${this.socketServices?.length} services)\n`,
601
- error,
602
- '\n'
603
- );
604
-
605
- throw error;
606
- }
607
- }
608
-
609
- /**
610
- * MISSING Description (TODO)
611
- */
612
- abstract getSocketServices(): DyNTS_SocketServerService<any>[];
613
-
614
- private __getDefaultErrorSettings(
615
- fnName: string,
616
- error: DyFM_AnyError
617
- ): DyFM_Error_Settings {
618
- return {
619
- status: (error as DyFM_Error)?.___status ?? 500,
620
- message: (error as Error)?.message ??
621
- (error as DyFM_Error)?._message ??
622
- `${fnName} was UNSUCCESSFUL (NTS)`,
623
- userMessage: (error as DyFM_Error)?.__userMessage ?? this.defaultErrorUserMsg,
624
- addECToUserMsg: !(error as DyFM_Error)?.__userMessage,
625
- issuerService: `${this?.constructor?.name}-DyNTS_AppExtended`,
626
- level: DyFM_ErrorLevel.fatal,
627
- error: error,
628
- };
629
- }
630
- }
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
+ const serverForOpen: Http.Server = useBaseHttpServer
515
+ ? this.httpServer
516
+ : this.httpSocketServer!;
517
+ if (this.logSetup) console.log(
518
+ `\nsocket setup (open): ${service?.name}:${effectivePort}` +
519
+ (useBaseHttpServer ? ' (shared with HTTP)' : '')
520
+ );
521
+ this.httpSocketSettingUpCount++;
522
+ this.systemControlsExt.httpSocketServer.started = false;
523
+
524
+ const socketPath: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
525
+ this.allSocketServers.push(
526
+ await service.setupSocketServer(
527
+ new SocketIO.Server(serverForOpen, { path: socketPath }),
528
+ DyNTS_SocketSecurity.open,
529
+ (): void => {
530
+ this.httpSocketSettingUpCount--;
531
+
532
+ if (this.httpSocketSettingUpCount === 0) {
533
+ this.systemControlsExt.httpSocketServer.started = true;
534
+ }
535
+ },
536
+ {
537
+ attachedToExistingServer: useBaseHttpServer,
538
+ effectivePort: effectivePort,
539
+ }
540
+ )
541
+ );
542
+
543
+ } else if (service.security === DyNTS_SocketSecurity.secure) {
544
+ this.systemControlsExt.httpsSocketServer.init = true;
545
+ if (this.logSetup) console.log(
546
+ `\nsocket setup (secure): ${service?.name}:${effectivePort}` +
547
+ (useBaseHttpsServer ? ' (shared with HTTPS)' : '')
548
+ );
549
+ this.httpsSocketSettingUpCount++;
550
+ this.systemControlsExt.httpsSocketServer.started = false;
551
+
552
+ const socketPathSecure: string = this.portSettings.socketPath ?? DyNTS_defaultSocketPath;
553
+ this.allSocketServers.push(
554
+ await service.setupSocketServer(
555
+ new SocketIO.Server(this.httpsServer, { path: socketPathSecure }),
556
+ DyNTS_SocketSecurity.secure,
557
+ (): void => {
558
+ this.httpsSocketSettingUpCount--;
559
+
560
+ if (this.httpsSocketSettingUpCount === 0) {
561
+ this.systemControlsExt.httpsSocketServer.started = true;
562
+ }
563
+ },
564
+ {
565
+ attachedToExistingServer: useBaseHttpsServer,
566
+ effectivePort: effectivePort,
567
+ }
568
+ )
569
+ );
570
+
571
+ } else {
572
+ const error = new Error(
573
+ `INVALID Socket Service security: ${service.security} on ${service?.name}`
574
+ );
575
+ const errorStack: string[] = error.stack?.split('\n');
576
+
577
+ errorStack.splice(1, 4);
578
+ error.stack = errorStack.join('\n');
579
+
580
+ DyFM_Log.error(`\n${error.message}`);
581
+
582
+ throw error;
583
+ }
584
+ } catch (error) {
585
+ if (error instanceof DyFM_Error) {
586
+ error.logSimple(`\nSocket Server service setup failed. (${service?.name})`)
587
+ } else {
588
+ DyFM_Log.error(
589
+ `\nSocket Server service setup failed. (${service?.name})`,
590
+ error,
591
+ );
592
+ }
593
+
594
+ throw error;
595
+ }
596
+ }
597
+ );
598
+ } catch (error) {
599
+ DyFM_Log.error(
600
+ `\nSocket Server services setup failed. (${this.socketServices?.length} services)\n`,
601
+ error,
602
+ '\n'
603
+ );
604
+
605
+ throw error;
606
+ }
607
+ }
608
+
609
+ /**
610
+ * MISSING Description (TODO)
611
+ */
612
+ abstract getSocketServices(): DyNTS_SocketServerService<any>[];
613
+
614
+ private __getDefaultErrorSettings(
615
+ fnName: string,
616
+ error: DyFM_AnyError
617
+ ): DyFM_Error_Settings {
618
+ return {
619
+ status: (error as DyFM_Error)?.___status ?? 500,
620
+ message: (error as Error)?.message ??
621
+ (error as DyFM_Error)?._message ??
622
+ `${fnName} was UNSUCCESSFUL (NTS)`,
623
+ userMessage: (error as DyFM_Error)?.__userMessage ?? this.defaultErrorUserMsg,
624
+ addECToUserMsg: !(error as DyFM_Error)?.__userMessage,
625
+ issuerService: `${this?.constructor?.name}-DyNTS_AppExtended`,
626
+ level: DyFM_ErrorLevel.fatal,
627
+ error: error,
628
+ };
629
+ }
630
+ }