@futdevpro/nts-dynamo 1.15.74 → 1.15.75

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 (357) 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 +2798 -0
  17. package/.dynamo/logs/cicd-pipeline/status.json +94 -0
  18. package/.vscode/settings.json +10 -10
  19. package/HOWTO.md +15 -15
  20. package/LICENSE +21 -21
  21. package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
  22. package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
  23. package/_specifications/BACKLOG.md +92 -92
  24. package/_specifications/TODO.md +15 -15
  25. package/_specifications/agent.md +138 -138
  26. package/eslint.config.js +3 -3
  27. package/nodemon.json +24 -24
  28. package/package.json +2 -2
  29. package/pnpm-workspace.yaml +5 -5
  30. package/scripts/run-coverage-tests.js +28 -28
  31. package/spec/support/helpers/spec-reporter-loader.js +359 -359
  32. package/spec/support/helpers/ts-node-helper.js +93 -93
  33. package/spec/support/jasmine.coverage.json +24 -24
  34. package/spec/support/jasmine.json +24 -24
  35. package/src/_collections/archive.util.spec.ts +57 -57
  36. package/src/_collections/archive.util.ts +18 -18
  37. package/src/_collections/atlas-default-db-options.const.ts +9 -9
  38. package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
  39. package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
  40. package/src/_collections/default-not-found-page.const.spec.ts +19 -19
  41. package/src/_collections/default-not-found-page.const.ts +22 -22
  42. package/src/_collections/default-socket-path.const.spec.ts +12 -12
  43. package/src/_collections/default-socket-path.const.ts +2 -2
  44. package/src/_collections/get-environment-settings.util.spec.ts +210 -210
  45. package/src/_collections/get-environment-settings.util.ts +48 -48
  46. package/src/_collections/global-settings.const.ts +97 -97
  47. package/src/_collections/sample.env +21 -21
  48. package/src/_collections/star.controller.spec.ts +224 -224
  49. package/src/_collections/star.controller.ts +129 -129
  50. package/src/_enums/data-model-type.enum.ts +14 -14
  51. package/src/_enums/data-service-function.enum.ts +24 -24
  52. package/src/_enums/predefined-data-types.enum.ts +16 -16
  53. package/src/_enums/route-security.enum.ts +12 -12
  54. package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
  55. package/src/_models/control-models/api-call-params.control-model.ts +142 -142
  56. package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
  57. package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
  58. package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
  59. package/src/_models/control-models/app-params.control-model.ts +136 -136
  60. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
  61. package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
  62. package/src/_models/control-models/endpoint-params.control-model.spec.ts +627 -627
  63. package/src/_models/control-models/endpoint-params.control-model.ts +627 -627
  64. package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
  65. package/src/_models/control-models/http-settings.control-model.ts +37 -37
  66. package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
  67. package/src/_models/control-models/system-control.control-model.ts +12 -12
  68. package/src/_models/interfaces/certification-settings.interface.ts +7 -7
  69. package/src/_models/interfaces/environment-settings.interface.ts +59 -59
  70. package/src/_models/interfaces/global-log-settings.interface.ts +171 -171
  71. package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
  72. package/src/_models/interfaces/global-settings.interface.ts +216 -216
  73. package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
  74. package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
  75. package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
  76. package/src/_models/types/db-update.type.ts +100 -100
  77. package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
  78. package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
  79. package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
  80. package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
  81. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
  82. package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
  83. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.spec.ts +295 -295
  84. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
  85. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
  86. package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
  87. package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
  88. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
  89. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
  90. package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
  91. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-code-chunk.interface.ts +68 -68
  92. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
  93. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
  94. package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
  95. package/src/_modules/ai/_modules/document-ai/index.ts +30 -30
  96. package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
  97. package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
  98. package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
  99. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
  100. package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
  101. package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
  102. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
  103. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
  104. package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
  105. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
  106. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
  107. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
  108. package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
  109. package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +332 -332
  110. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
  111. package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +634 -634
  112. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
  113. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
  114. package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1033 -1033
  115. package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
  116. package/src/_modules/ai/_services/ai-embedding-mock.service.spec.ts +115 -115
  117. package/src/_modules/ai/_services/ai-embedding-mock.service.ts +212 -212
  118. package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
  119. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +110 -110
  120. package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
  121. package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
  122. package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
  123. package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
  124. package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
  125. package/src/_modules/ai/_services/ai-llm.service-base.ts +519 -519
  126. package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
  127. package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
  128. package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
  129. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
  130. package/src/_modules/ai/index.ts +23 -23
  131. package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
  132. package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
  133. package/src/_modules/assistant/_collections/ass.util.ts +50 -50
  134. package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
  135. package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
  136. package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
  137. package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
  138. package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
  139. package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
  140. package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
  141. package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
  142. package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
  143. package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
  144. package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
  145. package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
  146. package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
  147. package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
  148. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
  149. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
  150. package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
  151. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
  152. package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
  153. package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
  154. package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
  155. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
  156. package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
  157. package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
  158. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
  159. package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
  160. package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
  161. package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
  162. package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
  163. package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
  164. package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
  165. package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
  166. package/src/_modules/custom-data/custom-data.controller.ts +67 -67
  167. package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
  168. package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
  169. package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
  170. package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
  171. package/src/_modules/custom-data/index.ts +9 -9
  172. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
  173. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
  174. package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
  175. package/src/_modules/data-readers/index.ts +11 -11
  176. package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
  177. package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
  178. package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
  179. package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
  180. package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
  181. package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
  182. package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
  183. package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
  184. package/src/_modules/defaults/index.ts +17 -17
  185. package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
  186. package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
  187. package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
  188. package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
  189. package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
  190. package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
  191. package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
  192. package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
  193. package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
  194. package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
  195. package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
  196. package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
  197. package/src/_modules/discord-assistant/index.ts +38 -38
  198. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
  199. package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
  200. package/src/_modules/discord-assistant-voiced/index.ts +36 -36
  201. package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
  202. package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
  203. package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
  204. package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
  205. package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
  206. package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
  207. package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
  208. package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
  209. package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
  210. package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
  211. package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
  212. package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
  213. package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
  214. package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
  215. package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
  216. package/src/_modules/discord-bot/index.ts +36 -36
  217. package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +35 -35
  218. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
  219. package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
  220. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
  221. package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
  222. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +480 -480
  223. package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
  224. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +198 -198
  225. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +146 -146
  226. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
  227. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +106 -106
  228. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +507 -507
  229. package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +272 -272
  230. package/src/_modules/local-vector-search/index.ts +16 -16
  231. package/src/_modules/logs/index.ts +11 -11
  232. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
  233. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
  234. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
  235. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
  236. package/src/_modules/mcp/index.ts +13 -13
  237. package/src/_modules/messaging/README.md +354 -354
  238. package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
  239. package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
  240. package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
  241. package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
  242. package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
  243. package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
  244. package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
  245. package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
  246. package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
  247. package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
  248. package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
  249. package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
  250. package/src/_modules/messaging/index.ts +30 -30
  251. package/src/_modules/mock/app-extended-server.mock.ts +201 -201
  252. package/src/_modules/mock/app-integration-test.mock.ts +51 -51
  253. package/src/_modules/mock/app-params.mock.spec.ts +21 -21
  254. package/src/_modules/mock/app-params.mock.ts +9 -9
  255. package/src/_modules/mock/app-server.mock.ts +188 -188
  256. package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
  257. package/src/_modules/mock/auth-service.mock.ts +28 -28
  258. package/src/_modules/mock/controller.mock.spec.ts +26 -26
  259. package/src/_modules/mock/controller.mock.ts +16 -16
  260. package/src/_modules/mock/data-model.mock.spec.ts +111 -111
  261. package/src/_modules/mock/data-model.mock.ts +82 -82
  262. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
  263. package/src/_modules/mock/email-service-collection.mock.ts +15 -15
  264. package/src/_modules/mock/email-service.mock.spec.ts +17 -17
  265. package/src/_modules/mock/email-service.mock.ts +20 -20
  266. package/src/_modules/mock/email-template.mock.html +14 -14
  267. package/src/_modules/mock/endpoint.mock.ts +91 -91
  268. package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
  269. package/src/_modules/mock/socket-client.mock.ts +45 -45
  270. package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
  271. package/src/_modules/mock/socket-server.mock.ts +46 -46
  272. package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
  273. package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
  274. package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
  275. package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
  276. package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
  277. package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
  278. package/src/_modules/oauth2/index.ts +17 -17
  279. package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
  280. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
  281. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
  282. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
  283. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
  284. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
  285. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
  286. package/src/_modules/scoped-config/index.ts +17 -17
  287. package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
  288. package/src/_modules/server/errors/errors.control-service.ts +100 -100
  289. package/src/_modules/server/errors/errors.controller.spec.ts +241 -241
  290. package/src/_modules/server/errors/errors.controller.ts +489 -489
  291. package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
  292. package/src/_modules/server/index.ts +30 -30
  293. package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
  294. package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
  295. package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
  296. package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
  297. package/src/_modules/server/server-status/server-status.control-service.spec.ts +576 -576
  298. package/src/_modules/server/server-status/server-status.control-service.ts +396 -396
  299. package/src/_modules/server/server-status/server-status.controller.spec.ts +240 -240
  300. package/src/_modules/server/server-status/server-status.controller.ts +253 -253
  301. package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
  302. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
  303. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
  304. package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
  305. package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
  306. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
  307. package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
  308. package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
  309. package/src/_modules/socket/_services/socket-client.service.ts +260 -260
  310. package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
  311. package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
  312. package/src/_modules/socket/app-extended.server.ts +630 -630
  313. package/src/_modules/socket/index.ts +42 -42
  314. package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
  315. package/src/_modules/test/get-test-routing-module.util.ts +23 -23
  316. package/src/_modules/test/index.ts +11 -11
  317. package/src/_modules/test/test.controller.spec.ts +72 -72
  318. package/src/_modules/test/test.controller.ts +115 -115
  319. package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
  320. package/src/_modules/usage/index.ts +15 -15
  321. package/src/_modules/usage/usage.controller.spec.ts +81 -81
  322. package/src/_modules/usage/usage.controller.ts +126 -126
  323. package/src/_modules/usage/usage.data-service.spec.ts +332 -332
  324. package/src/_modules/usage/usage.data-service.ts +185 -185
  325. package/src/_services/base/api.service-base.spec.ts +125 -125
  326. package/src/_services/base/api.service-base.ts +74 -74
  327. package/src/_services/base/archive-data.service.spec.ts +196 -196
  328. package/src/_services/base/archive-data.service.ts +216 -216
  329. package/src/_services/base/data.service.spec.ts +674 -674
  330. package/src/_services/base/data.service.ts +2719 -2719
  331. package/src/_services/base/db.service.spec.ts +73 -73
  332. package/src/_services/base/db.service.ts +1575 -1575
  333. package/src/_services/base/singleton.service-base.spec.ts +28 -28
  334. package/src/_services/base/singleton.service-base.ts +24 -24
  335. package/src/_services/base/singleton.service.spec.ts +114 -114
  336. package/src/_services/base/singleton.service.ts +38 -38
  337. package/src/_services/core/api.service.spec.ts +140 -140
  338. package/src/_services/core/auth.service.spec.ts +159 -159
  339. package/src/_services/core/auth.service.ts +174 -174
  340. package/src/_services/core/email.service.spec.ts +85 -85
  341. package/src/_services/core/email.service.ts +742 -742
  342. package/src/_services/core/global.service.spec.ts +292 -292
  343. package/src/_services/core/global.service.ts +475 -475
  344. package/src/_services/core/memory-guard.service.spec.ts +245 -245
  345. package/src/_services/core/memory-guard.service.ts +481 -481
  346. package/src/_services/core/service-collection.service.spec.ts +46 -46
  347. package/src/_services/core/service-collection.service.ts +6 -6
  348. package/src/_services/route/controller.service.spec.ts +53 -53
  349. package/src/_services/route/controller.service.ts +148 -148
  350. package/src/_services/route/routing-module.service.spec.ts +98 -98
  351. package/src/_services/route/routing-module.service.ts +330 -330
  352. package/src/_services/server/app.server.ts +1747 -1747
  353. package/src/_services/shared.static-service.spec.ts +99 -99
  354. package/src/_services/shared.static-service.ts +78 -78
  355. package/src/index.ts +96 -96
  356. package/tsconfig.app.json +12 -12
  357. package/tsconfig.json +42 -42
@@ -1,74 +1,74 @@
1
-
2
- import { DyNTS_ServerStatus_ControlService } from './server-status.control-service';
3
- import { DyNTS_Errors_ControlService } from '../errors/errors.control-service';
4
- import { DyNTS_ServerStatusSnapshot_ControlService } from './server-status-snapshot.control-service';
5
- import { DyFM_ServerStatus, DyFM_Error, DyFM_Errors, DyFM_ErrorLevel, DyFM_RelativeDate, DyFM_Error_Statistics, DyFM_ServerConnectionCheckResult, DyFM_ServerConnection_Status, DyFM_Time, DyFM_Paged, DyFM_Array } from '@futdevpro/fsm-dynamo';
6
- import { DyNTS_ApiService_Base } from '../../../_services/base/api.service-base';
7
- import { DyNTS_ServerConnection } from './server-status.control-service';
8
- import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
9
- import { timer } from 'rxjs';
10
-
11
- class TestError extends DyFM_Error {
12
- constructor(set?: Partial<TestError>) {
13
- super(set);
14
- Object.assign(this, set);
15
- }
16
- }
17
-
18
- class TestErrors extends DyFM_Errors<TestError> {
19
- constructor(set?: Partial<TestErrors>) {
20
- super(set);
21
- Object.assign(this, set);
22
- }
23
- }
24
-
25
- class TestServerStatus extends DyFM_ServerStatus {
26
- constructor(set?: Partial<TestServerStatus>) {
27
- super();
28
- Object.assign(this, set);
29
- }
30
- }
31
-
32
- class TestErrorsControlService extends DyNTS_Errors_ControlService<TestError, TestErrors> {
33
- async recordError(data: TestErrors, issuer: string, alwaysRecord?: boolean): Promise<void> {
34
- // Mock implementation
35
- }
36
-
37
- async handleInternalError(error: any, issuer: string, alwaysRecord?: boolean): Promise<void> {
38
- // Mock implementation
39
- }
40
-
41
- checkErrorIsStringifyableOrResolvable(error: TestError, issuer: string): TestError | 'UNRESOLVABLE' {
42
- return error;
43
- }
44
-
45
- getPriorityMultiplierByLevel(level: DyFM_ErrorLevel, issuer: string): number {
46
- return 1;
47
- }
48
-
49
- async getErrorsFromDate(date: Date, issuer: string): Promise<DyFM_Paged<TestErrors>> {
50
- return {
51
- items: [],
52
- total: 0,
53
- pageIndex: 0,
54
- pageSize: 0,
55
- };
56
- }
57
-
58
- async deleteError(errorId: string, issuer: string, alwaysDelete?: boolean): Promise<void> {
59
- // Mock implementation
60
- }
61
-
62
- async deleteAllErrors(issuer: string, alwaysDelete?: boolean): Promise<void> {
63
- // Mock implementation
64
- }
65
-
66
- async recordFixAttempt(errorId: string, version: string, hypothesis: string, issuer: string): Promise<any> {
67
- return { at: new Date(), by: issuer, version, hypothesis };
68
- }
69
-
70
- async getErrorsByCategoryPaged(category: string, range: any, pageSize: number, pageIndex: number, issuer: string): Promise<any> {
71
- return { items: [], total: 0, pageIndex, pageSize };
1
+
2
+ import { DyNTS_ServerStatus_ControlService } from './server-status.control-service';
3
+ import { DyNTS_Errors_ControlService } from '../errors/errors.control-service';
4
+ import { DyNTS_ServerStatusSnapshot_ControlService } from './server-status-snapshot.control-service';
5
+ import { DyFM_ServerStatus, DyFM_Error, DyFM_Errors, DyFM_ErrorLevel, DyFM_RelativeDate, DyFM_Error_Statistics, DyFM_ServerConnectionCheckResult, DyFM_ServerConnection_Status, DyFM_Time, DyFM_Paged, DyFM_Array } from '@futdevpro/fsm-dynamo';
6
+ import { DyNTS_ApiService_Base } from '../../../_services/base/api.service-base';
7
+ import { DyNTS_ServerConnection } from './server-status.control-service';
8
+ import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
9
+ import { timer } from 'rxjs';
10
+
11
+ class TestError extends DyFM_Error {
12
+ constructor(set?: Partial<TestError>) {
13
+ super(set);
14
+ Object.assign(this, set);
15
+ }
16
+ }
17
+
18
+ class TestErrors extends DyFM_Errors<TestError> {
19
+ constructor(set?: Partial<TestErrors>) {
20
+ super(set);
21
+ Object.assign(this, set);
22
+ }
23
+ }
24
+
25
+ class TestServerStatus extends DyFM_ServerStatus {
26
+ constructor(set?: Partial<TestServerStatus>) {
27
+ super();
28
+ Object.assign(this, set);
29
+ }
30
+ }
31
+
32
+ class TestErrorsControlService extends DyNTS_Errors_ControlService<TestError, TestErrors> {
33
+ async recordError(data: TestErrors, issuer: string, alwaysRecord?: boolean): Promise<void> {
34
+ // Mock implementation
35
+ }
36
+
37
+ async handleInternalError(error: any, issuer: string, alwaysRecord?: boolean): Promise<void> {
38
+ // Mock implementation
39
+ }
40
+
41
+ checkErrorIsStringifyableOrResolvable(error: TestError, issuer: string): TestError | 'UNRESOLVABLE' {
42
+ return error;
43
+ }
44
+
45
+ getPriorityMultiplierByLevel(level: DyFM_ErrorLevel, issuer: string): number {
46
+ return 1;
47
+ }
48
+
49
+ async getErrorsFromDate(date: Date, issuer: string): Promise<DyFM_Paged<TestErrors>> {
50
+ return {
51
+ items: [],
52
+ total: 0,
53
+ pageIndex: 0,
54
+ pageSize: 0,
55
+ };
56
+ }
57
+
58
+ async deleteError(errorId: string, issuer: string, alwaysDelete?: boolean): Promise<void> {
59
+ // Mock implementation
60
+ }
61
+
62
+ async deleteAllErrors(issuer: string, alwaysDelete?: boolean): Promise<void> {
63
+ // Mock implementation
64
+ }
65
+
66
+ async recordFixAttempt(errorId: string, version: string, hypothesis: string, issuer: string): Promise<any> {
67
+ return { at: new Date(), by: issuer, version, hypothesis };
68
+ }
69
+
70
+ async getErrorsByCategoryPaged(category: string, range: any, pageSize: number, pageIndex: number, issuer: string): Promise<any> {
71
+ return { items: [], total: 0, pageIndex, pageSize };
72
72
  }
73
73
 
74
74
  async resolveError(errorId: string, issuer: string, notes?: string): Promise<void> {
@@ -77,508 +77,508 @@ class TestErrorsControlService extends DyNTS_Errors_ControlService<TestError, Te
77
77
 
78
78
  async getErrorsByStatusPaged(status: string, range: any, pageSize: number, pageIndex: number, issuer: string): Promise<any> {
79
79
  return { items: [], total: 0, pageIndex, pageSize };
80
- }
81
-
82
- async getErrorsInRange(range: DyFM_RelativeDate, issuer: string): Promise<DyFM_Paged<TestErrors>> {
83
- return {
84
- items: [],
85
- total: 0,
86
- pageIndex: 0,
87
- pageSize: 0,
88
- };
89
- }
90
-
91
- async getErrorsPaged(range: DyFM_RelativeDate, pageSize: number, pageIndex: number, issuer: string): Promise<DyFM_Paged<TestErrors>> {
92
- return {
93
- items: [],
94
- total: 0,
95
- pageIndex,
96
- pageSize,
97
- };
98
- }
99
-
100
- async getLastErrors(range: DyFM_RelativeDate, pageSize: number, pageIndex: number, issuer: string): Promise<DyFM_Paged<TestErrors>> {
101
- return {
102
- items: [],
103
- total: 0,
104
- pageIndex,
105
- pageSize,
106
- };
107
- }
108
-
109
- async searchErrors(searchQuery: any, issuer: string): Promise<any> {
110
- return {
111
- items: [],
112
- total: 0,
113
- };
114
- }
115
- }
116
-
117
- class TestServerStatusSnapshotControlService extends DyNTS_ServerStatusSnapshot_ControlService<TestServerStatus> {
118
- async saveSnapshot(snapshot: TestServerStatus, issuer: string): Promise<TestServerStatus> {
119
- return snapshot;
120
- }
121
- }
122
-
123
- class TestApiService extends DyNTS_ApiService_Base {
124
- get baseUrl(): string {
125
- return 'https://test.example.com';
126
- }
127
- get testEndpoint(): string {
128
- return '/test';
129
- }
130
- get connectingSystemName(): string {
131
- return 'TestSystem';
132
- }
133
-
134
- override async checkServerAvailability(issuer: string): Promise<void> {
135
- // Mock implementation
136
- }
137
- }
138
-
139
- class TestServerStatusControlService extends DyNTS_ServerStatus_ControlService<
140
- TestServerStatus,
141
- TestError,
142
- TestErrors,
143
- TestErrorsControlService,
144
- TestServerStatus,
145
- TestServerStatusSnapshotControlService
146
- > {
147
- protected getErrorControlService?(set?: { data?: TestErrors, issuer?: string }): TestErrorsControlService {
148
- return new TestErrorsControlService();
149
- }
150
-
151
- protected getServerStatusSnapshotControlService?(set?: { data?: TestServerStatus, issuer?: string }): TestServerStatusSnapshotControlService {
152
- return new TestServerStatusSnapshotControlService();
153
- }
154
-
155
- protected requiredServerConnections: DyNTS_ServerConnection[] = [];
156
-
157
- static getInstance(): TestServerStatusControlService {
158
- return TestServerStatusControlService.getSingletonInstance();
159
- }
160
- }
161
-
162
- describe('| DyNTS_ServerStatus_ControlService', () => {
163
- let service: TestServerStatusControlService;
164
- let mockErrorsControlService: jasmine.SpyObj<TestErrorsControlService>;
165
- let mockSnapshotControlService: jasmine.SpyObj<TestServerStatusSnapshotControlService>;
166
- let mockApiService: jasmine.SpyObj<DyNTS_ApiService_Base>;
167
-
168
- beforeEach(() => {
169
- mockApiService = jasmine.createSpyObj('DyNTS_ApiService_Base', ['checkServerAvailability'], {
170
- baseUrl: 'https://test.example.com',
171
- testEndpoint: '/test',
172
- });
173
-
174
- mockErrorsControlService = jasmine.createSpyObj('TestErrorsControlService', [
175
- 'getErrorsFromDate',
176
- ]);
177
-
178
- mockSnapshotControlService = jasmine.createSpyObj('TestServerStatusSnapshotControlService', [
179
- 'saveSnapshot',
180
- ]);
181
-
182
- service = new (TestServerStatusControlService as any)();
183
- (service as any).requiredServerConnections = [
184
- {
185
- name: 'test-service',
186
- apiService: mockApiService,
187
- accessible: false,
188
- },
189
- ];
190
- });
191
-
192
- describe('| constructor', () => {
193
- it('| should initialize with up time', () => {
194
- expect((service as any).up).toBeInstanceOf(Date);
195
- });
196
-
197
- it('| should initialize server version numeric', () => {
198
- expect(service.serverVersionNumeric).toBeDefined();
199
- expect(typeof service.serverVersionNumeric).toBe('number');
200
- });
201
-
202
- it('| should set up overseer subscription', () => {
203
- expect((service as any).overseer).toBeDefined();
204
- });
205
- });
206
-
207
- describe('| properties', () => {
208
- it('| should return serverVersion', () => {
209
- expect(service.serverVersion).toBeDefined();
210
- expect(typeof service.serverVersion).toBe('string');
211
- });
212
-
213
- it('| should return serverVersionNumeric', () => {
214
- expect(service.serverVersionNumeric).toBeDefined();
215
- expect(typeof service.serverVersionNumeric).toBe('number');
216
- });
217
-
218
- it('| should return latestClientVersion', () => {
219
- expect(service.latestClientVersion).toBeUndefined();
220
- });
221
-
222
- it('| should return latestClientVersionNumeric', () => {
223
- expect(service.latestClientVersionNumeric).toBeUndefined();
224
- });
225
- });
226
-
227
- describe('| getServerStatus', () => {
228
- it('| should return server status', async () => {
229
- spyOn(service, 'checkServerConnections').and.returnValue(Promise.resolve({} as any));
230
-
231
- const result = await service.getServerStatus('test-issuer');
232
-
233
- expect(result).toBeDefined();
234
- expect(result.status).toBe('ready');
235
- expect(result.systemName).toBe(DyNTS_global_settings.systemName);
236
- expect(result.systemShortCode).toBe(DyNTS_global_settings.systemShortCodeName);
237
- expect(result.uptime).toBeGreaterThanOrEqual(0);
238
- expect(result.memoryUsage).toBeDefined();
239
- expect(result.cpuUsage).toBeDefined();
240
- });
241
-
242
- it('| should check client version if provided', async () => {
243
- spyOn(service, 'checkServerConnections').and.returnValue(Promise.resolve({} as any));
244
- spyOn(service as any, 'clientVersionIsLatest').and.returnValue(true);
245
-
246
- const result = await service.getServerStatus('test-issuer', 'v1.0.0');
247
-
248
- expect((service as any).clientVersionIsLatest).toHaveBeenCalledWith('v1.0.0');
249
- expect(result.clientVersionOk).toBe(true);
250
- });
251
-
252
- it('| should handle errors', async () => {
253
- const error = new Error('Status check failed');
254
- spyOn(service, 'checkServerConnections').and.throwError(error);
255
-
256
- try {
257
- await service.getServerStatus('test-issuer');
258
- fail('Should have thrown an error');
259
- } catch (err) {
260
- expect(err).toBeInstanceOf(DyFM_Error);
261
- expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-GSS0');
262
- }
263
- });
264
- });
265
-
266
- describe('| checkServerConnections', () => {
267
- it('| should check server connections', async () => {
268
- mockApiService.checkServerAvailability.and.returnValue(Promise.resolve());
269
-
270
- const result = await service.checkServerConnections('test-issuer');
271
-
272
- expect(result).toBeDefined();
273
- expect(result['test-service']).toBe(DyFM_ServerConnection_Status.accessible);
274
- expect(mockApiService.checkServerAvailability).toHaveBeenCalled();
275
- });
276
-
277
- it('| should cache connection status', async () => {
278
- mockApiService.checkServerAvailability.and.returnValue(Promise.resolve());
279
- (service as any).requiredServerConnections[0].accessible = true;
280
- (service as any).requiredServerConnections[0].lastCheck = new Date();
281
-
282
- await service.checkServerConnections('test-issuer');
283
-
284
- expect(mockApiService.checkServerAvailability).not.toHaveBeenCalled();
285
- });
286
-
287
- it('| should handle connection errors', async () => {
288
- const error = new Error('Connection failed');
289
- mockApiService.checkServerAvailability.and.returnValue(Promise.reject(error));
290
-
291
- const result = await service.checkServerConnections('test-issuer');
292
-
293
- // Note: The implementation sets accessible to true after catch, so it will be accessible
294
- expect(result['test-service']).toBe(DyFM_ServerConnection_Status.accessible);
295
- });
296
-
297
- it('| should handle check errors', async () => {
298
- const error = new Error('Check failed');
299
- spyOn(DyFM_Array, 'asyncForEachAllAtOnce').and.throwError(error);
300
-
301
- try {
302
- await service.checkServerConnections('test-issuer');
303
- fail('Should have thrown an error');
304
- } catch (err) {
305
- expect(err).toBeInstanceOf(DyFM_Error);
306
- expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-CC0');
307
- }
308
- });
309
- });
310
-
311
- describe('| getErrorStatistics', () => {
312
- it('| should return error statistics', async () => {
313
- const mockErrors: TestErrors[] = [
314
- new TestErrors({
315
- count: 5,
316
- source: 'SERVER',
317
- level: DyFM_ErrorLevel.error,
318
- }),
319
- new TestErrors({
320
- count: 3,
321
- source: 'CLIENT',
322
- level: DyFM_ErrorLevel.warning,
323
- }),
324
- new TestErrors({
325
- count: 2,
326
- source: 'SERVER',
327
- level: DyFM_ErrorLevel.info,
328
- }),
329
- ];
330
-
331
- mockErrorsControlService.getErrorsFromDate.and.returnValue(Promise.resolve({
332
- items: mockErrors,
333
- total: 3,
334
- pageIndex: 0,
335
- pageSize: 10,
336
- }));
337
-
338
- spyOn(service as any, 'getErrorControlService').and.returnValue(mockErrorsControlService);
339
- spyOn(DyFM_Time, 'getDateByRelativeDate').and.returnValue(new Date());
340
-
341
- const result = await service.getErrorStatistics(DyFM_RelativeDate.lastWeek, 'test-issuer');
342
-
343
- expect(result).toBeDefined();
344
- expect(result.allErrors).toBe(3);
345
- expect(result.allAllErrors).toBe(10);
346
- expect(result.serverErrors).toBe(2);
347
- expect(result.clientErrors).toBe(1);
348
- expect(result.allServerErrors).toBe(7);
349
- expect(result.allClientErrors).toBe(3);
350
- expect(result.errorErrors).toBe(1);
351
- expect(result.warningErrors).toBe(1);
352
- expect(result.infoErrors).toBe(1);
353
- });
354
-
355
- it('| should handle errors', async () => {
356
- const error = new Error('Statistics failed');
357
- spyOn(service as any, 'getErrorControlService').and.throwError(error);
358
-
359
- try {
360
- await service.getErrorStatistics(DyFM_RelativeDate.lastWeek, 'test-issuer');
361
- fail('Should have thrown an error');
362
- } catch (err) {
363
- expect(err).toBeInstanceOf(DyFM_Error);
364
- expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSS-GES0');
365
- }
366
- });
367
- });
368
-
369
- describe('| getVersionNumeric', () => {
370
- it('| should convert version string to numeric', () => {
371
- const result = (service as any).getVersionNumeric('v1.2.3');
372
-
373
- expect(result).toBe(123);
374
- });
375
-
376
- it('| should handle version with alpha suffix', () => {
377
- const result = (service as any).getVersionNumeric('v1.2.3-alpha');
378
-
379
- expect(result).toBe(123);
380
- });
381
-
382
- it('| should handle version with beta suffix', () => {
383
- const result = (service as any).getVersionNumeric('v1.2.3-beta');
384
-
385
- expect(result).toBe(123);
386
- });
387
-
388
- it('| should handle version with test suffix', () => {
389
- const result = (service as any).getVersionNumeric('v1.2.3-test');
390
-
391
- expect(result).toBe(123);
392
- });
393
-
394
- it('| should handle version with dev suffix', () => {
395
- const result = (service as any).getVersionNumeric('v1.2.3-dev');
396
-
397
- expect(result).toBe(123);
398
- });
399
- });
400
-
401
- describe('| clientVersionIsLatest', () => {
402
- it('| should return true for first client version', () => {
403
- const result = (service as any).clientVersionIsLatest('v1.0.0');
404
-
405
- expect(result).toBe(true);
406
- expect(service.latestClientVersion).toBe('v1.0.0');
407
- });
408
-
409
- it('| should return true for same version', () => {
410
- (service as any).setLatestClientVersion('v1.0.0', 100);
411
-
412
- const result = (service as any).clientVersionIsLatest('v1.0.0');
413
-
414
- expect(result).toBe(true);
415
- });
416
-
417
- it('| should return false for older version', () => {
418
- (service as any).setLatestClientVersion('v2.0.0', 200);
419
-
420
- const result = (service as any).clientVersionIsLatest('v1.0.0');
421
-
422
- expect(result).toBe(false);
423
- });
424
-
425
- it('| should return true and update for newer version', () => {
426
- (service as any).setLatestClientVersion('v1.0.0', 100);
427
-
428
- const result = (service as any).clientVersionIsLatest('v2.0.0');
429
-
430
- expect(result).toBe(true);
431
- expect(service.latestClientVersion).toBe('v2.0.0');
432
- });
433
-
434
- it('| should not update latest version for test versions', () => {
435
- (service as any).setLatestClientVersion('v1.0.0', 100);
436
-
437
- const result = (service as any).clientVersionIsLatest('v2.0.0-test');
438
-
439
- expect(result).toBe(true);
440
- expect(service.latestClientVersion).toBe('v1.0.0');
441
- });
442
-
443
- it('| should not update latest version for dev versions', () => {
444
- (service as any).setLatestClientVersion('v1.0.0', 100);
445
-
446
- const result = (service as any).clientVersionIsLatest('v2.0.0-dev');
447
-
448
- expect(result).toBe(true);
449
- expect(service.latestClientVersion).toBe('v1.0.0');
450
- });
451
- });
452
-
453
- describe('| setLatestClientVersion', () => {
454
- it('| should set latest client version', () => {
455
- (service as any).setLatestClientVersion('v1.0.0', 100);
456
-
457
- expect(service.latestClientVersion).toBe('v1.0.0');
458
- expect(service.latestClientVersionNumeric).toBe(100);
459
- });
460
-
461
- it('| should not set test versions', () => {
462
- (service as any).setLatestClientVersion('v1.0.0-test', 100);
463
-
464
- expect(service.latestClientVersion).toBeUndefined();
465
- });
466
-
467
- it('| should not set dev versions', () => {
468
- (service as any).setLatestClientVersion('v1.0.0-dev', 100);
469
-
470
- expect(service.latestClientVersion).toBeUndefined();
471
- });
472
- });
473
-
474
- describe('| triggerCreateSnapshot', () => {
475
- it('| should create snapshot', async () => {
476
- const mockSnapshot: TestServerStatus = new TestServerStatus({
477
- status: 'ready',
478
- });
479
-
480
- spyOn(service, 'getServerStatusSnapshot').and.returnValue(Promise.resolve(mockSnapshot));
481
- spyOn(service as any, 'getServerStatusSnapshotControlService').and.returnValue(mockSnapshotControlService);
482
- mockSnapshotControlService.saveSnapshot.and.returnValue(Promise.resolve(mockSnapshot));
483
-
484
- await (service as any).triggerCreateSnapshot('test-issuer');
485
-
486
- expect(service.getServerStatusSnapshot).toHaveBeenCalled();
487
- expect(mockSnapshotControlService.saveSnapshot).toHaveBeenCalled();
488
- });
489
-
490
- it('| should handle errors', async () => {
491
- const error = new Error('Snapshot failed');
492
- spyOn(service, 'getServerStatusSnapshot').and.returnValue(Promise.reject(error));
493
-
494
- try {
495
- await (service as any).triggerCreateSnapshot('test-issuer');
496
- fail('Should have thrown an error');
497
- } catch (err) {
498
- expect(err).toBeInstanceOf(DyFM_Error);
499
- expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-TCS0');
500
- }
501
- });
502
- });
503
-
504
- describe('| checkDbReadiness', () => {
505
- it('| should be ready when connected (readyState=1) and ping succeeds', async () => {
506
- const fakeConnection = {
507
- readyState: 1,
508
- db: { admin: () => ({ ping: async () => ({ ok: 1 }) }) },
509
- };
510
- spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
511
-
512
- const result = await service.checkDbReadiness();
513
-
514
- expect(result.ready).toBe(true);
515
- expect(result.dbReadyState).toBe(1);
516
- expect(result.dbPingOk).toBe(true);
517
- expect(result.serverVersion).toBe(service.serverVersion);
518
- expect(result.uptime).toBeGreaterThanOrEqual(0);
519
- });
520
-
521
- it('| should NOT be ready when disconnected (readyState=0) — no ping attempted', async () => {
522
- const fakeConnection = { readyState: 0, db: undefined };
523
- spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
524
-
525
- const result = await service.checkDbReadiness();
526
-
527
- expect(result.ready).toBe(false);
528
- expect(result.dbReadyState).toBe(0);
529
- expect(result.dbPingOk).toBe(false);
530
- });
531
-
532
- it('| should NOT be ready when connected but ping fails (DB unresponsive)', async () => {
533
- const fakeConnection = {
534
- readyState: 1,
535
- db: { admin: () => ({ ping: async () => { throw new Error('no pong'); } }) },
536
- };
537
- spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
538
-
539
- const result = await service.checkDbReadiness();
540
-
541
- expect(result.ready).toBe(false);
542
- expect(result.dbReadyState).toBe(1);
543
- expect(result.dbPingOk).toBe(false);
544
- });
545
-
546
- it('| should never throw — returns not-ready on internal error', async () => {
547
- spyOn(service as any, 'getMongooseConnection').and.throwError(new Error('boom'));
548
-
549
- const result = await service.checkDbReadiness();
550
-
551
- expect(result.ready).toBe(false);
552
- expect(result.dbReadyState).toBe(0);
553
- });
554
- });
555
-
556
- describe('| getServerStatusSnapshot', () => {
557
- it('| should return server status snapshot', async () => {
558
- const mockStatus: TestServerStatus = new TestServerStatus({
559
- status: 'ready',
560
- });
561
-
562
- spyOn(service, 'getServerStatus').and.returnValue(Promise.resolve(mockStatus));
563
-
564
- const result = await service.getServerStatusSnapshot('test-issuer');
565
-
566
- expect(result).toBeDefined();
567
- expect(result.status).toBe('ready');
568
- });
569
-
570
- it('| should handle errors', async () => {
571
- const error = new Error('Snapshot failed');
572
- spyOn(service, 'getServerStatus').and.returnValue(Promise.reject(error));
573
-
574
- try {
575
- await service.getServerStatusSnapshot('test-issuer');
576
- fail('Should have thrown an error');
577
- } catch (err) {
578
- expect(err).toBeInstanceOf(DyFM_Error);
579
- expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-GSS0');
580
- }
581
- });
582
- });
583
- });
584
-
80
+ }
81
+
82
+ async getErrorsInRange(range: DyFM_RelativeDate, issuer: string): Promise<DyFM_Paged<TestErrors>> {
83
+ return {
84
+ items: [],
85
+ total: 0,
86
+ pageIndex: 0,
87
+ pageSize: 0,
88
+ };
89
+ }
90
+
91
+ async getErrorsPaged(range: DyFM_RelativeDate, pageSize: number, pageIndex: number, issuer: string): Promise<DyFM_Paged<TestErrors>> {
92
+ return {
93
+ items: [],
94
+ total: 0,
95
+ pageIndex,
96
+ pageSize,
97
+ };
98
+ }
99
+
100
+ async getLastErrors(range: DyFM_RelativeDate, pageSize: number, pageIndex: number, issuer: string): Promise<DyFM_Paged<TestErrors>> {
101
+ return {
102
+ items: [],
103
+ total: 0,
104
+ pageIndex,
105
+ pageSize,
106
+ };
107
+ }
108
+
109
+ async searchErrors(searchQuery: any, issuer: string): Promise<any> {
110
+ return {
111
+ items: [],
112
+ total: 0,
113
+ };
114
+ }
115
+ }
116
+
117
+ class TestServerStatusSnapshotControlService extends DyNTS_ServerStatusSnapshot_ControlService<TestServerStatus> {
118
+ async saveSnapshot(snapshot: TestServerStatus, issuer: string): Promise<TestServerStatus> {
119
+ return snapshot;
120
+ }
121
+ }
122
+
123
+ class TestApiService extends DyNTS_ApiService_Base {
124
+ get baseUrl(): string {
125
+ return 'https://test.example.com';
126
+ }
127
+ get testEndpoint(): string {
128
+ return '/test';
129
+ }
130
+ get connectingSystemName(): string {
131
+ return 'TestSystem';
132
+ }
133
+
134
+ override async checkServerAvailability(issuer: string): Promise<void> {
135
+ // Mock implementation
136
+ }
137
+ }
138
+
139
+ class TestServerStatusControlService extends DyNTS_ServerStatus_ControlService<
140
+ TestServerStatus,
141
+ TestError,
142
+ TestErrors,
143
+ TestErrorsControlService,
144
+ TestServerStatus,
145
+ TestServerStatusSnapshotControlService
146
+ > {
147
+ protected getErrorControlService?(set?: { data?: TestErrors, issuer?: string }): TestErrorsControlService {
148
+ return new TestErrorsControlService();
149
+ }
150
+
151
+ protected getServerStatusSnapshotControlService?(set?: { data?: TestServerStatus, issuer?: string }): TestServerStatusSnapshotControlService {
152
+ return new TestServerStatusSnapshotControlService();
153
+ }
154
+
155
+ protected requiredServerConnections: DyNTS_ServerConnection[] = [];
156
+
157
+ static getInstance(): TestServerStatusControlService {
158
+ return TestServerStatusControlService.getSingletonInstance();
159
+ }
160
+ }
161
+
162
+ describe('| DyNTS_ServerStatus_ControlService', () => {
163
+ let service: TestServerStatusControlService;
164
+ let mockErrorsControlService: jasmine.SpyObj<TestErrorsControlService>;
165
+ let mockSnapshotControlService: jasmine.SpyObj<TestServerStatusSnapshotControlService>;
166
+ let mockApiService: jasmine.SpyObj<DyNTS_ApiService_Base>;
167
+
168
+ beforeEach(() => {
169
+ mockApiService = jasmine.createSpyObj('DyNTS_ApiService_Base', ['checkServerAvailability'], {
170
+ baseUrl: 'https://test.example.com',
171
+ testEndpoint: '/test',
172
+ });
173
+
174
+ mockErrorsControlService = jasmine.createSpyObj('TestErrorsControlService', [
175
+ 'getErrorsFromDate',
176
+ ]);
177
+
178
+ mockSnapshotControlService = jasmine.createSpyObj('TestServerStatusSnapshotControlService', [
179
+ 'saveSnapshot',
180
+ ]);
181
+
182
+ service = new (TestServerStatusControlService as any)();
183
+ (service as any).requiredServerConnections = [
184
+ {
185
+ name: 'test-service',
186
+ apiService: mockApiService,
187
+ accessible: false,
188
+ },
189
+ ];
190
+ });
191
+
192
+ describe('| constructor', () => {
193
+ it('| should initialize with up time', () => {
194
+ expect((service as any).up).toBeInstanceOf(Date);
195
+ });
196
+
197
+ it('| should initialize server version numeric', () => {
198
+ expect(service.serverVersionNumeric).toBeDefined();
199
+ expect(typeof service.serverVersionNumeric).toBe('number');
200
+ });
201
+
202
+ it('| should set up overseer subscription', () => {
203
+ expect((service as any).overseer).toBeDefined();
204
+ });
205
+ });
206
+
207
+ describe('| properties', () => {
208
+ it('| should return serverVersion', () => {
209
+ expect(service.serverVersion).toBeDefined();
210
+ expect(typeof service.serverVersion).toBe('string');
211
+ });
212
+
213
+ it('| should return serverVersionNumeric', () => {
214
+ expect(service.serverVersionNumeric).toBeDefined();
215
+ expect(typeof service.serverVersionNumeric).toBe('number');
216
+ });
217
+
218
+ it('| should return latestClientVersion', () => {
219
+ expect(service.latestClientVersion).toBeUndefined();
220
+ });
221
+
222
+ it('| should return latestClientVersionNumeric', () => {
223
+ expect(service.latestClientVersionNumeric).toBeUndefined();
224
+ });
225
+ });
226
+
227
+ describe('| getServerStatus', () => {
228
+ it('| should return server status', async () => {
229
+ spyOn(service, 'checkServerConnections').and.returnValue(Promise.resolve({} as any));
230
+
231
+ const result = await service.getServerStatus('test-issuer');
232
+
233
+ expect(result).toBeDefined();
234
+ expect(result.status).toBe('ready');
235
+ expect(result.systemName).toBe(DyNTS_global_settings.systemName);
236
+ expect(result.systemShortCode).toBe(DyNTS_global_settings.systemShortCodeName);
237
+ expect(result.uptime).toBeGreaterThanOrEqual(0);
238
+ expect(result.memoryUsage).toBeDefined();
239
+ expect(result.cpuUsage).toBeDefined();
240
+ });
241
+
242
+ it('| should check client version if provided', async () => {
243
+ spyOn(service, 'checkServerConnections').and.returnValue(Promise.resolve({} as any));
244
+ spyOn(service as any, 'clientVersionIsLatest').and.returnValue(true);
245
+
246
+ const result = await service.getServerStatus('test-issuer', 'v1.0.0');
247
+
248
+ expect((service as any).clientVersionIsLatest).toHaveBeenCalledWith('v1.0.0');
249
+ expect(result.clientVersionOk).toBe(true);
250
+ });
251
+
252
+ it('| should handle errors', async () => {
253
+ const error = new Error('Status check failed');
254
+ spyOn(service, 'checkServerConnections').and.throwError(error);
255
+
256
+ try {
257
+ await service.getServerStatus('test-issuer');
258
+ fail('Should have thrown an error');
259
+ } catch (err) {
260
+ expect(err).toBeInstanceOf(DyFM_Error);
261
+ expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-GSS0');
262
+ }
263
+ });
264
+ });
265
+
266
+ describe('| checkServerConnections', () => {
267
+ it('| should check server connections', async () => {
268
+ mockApiService.checkServerAvailability.and.returnValue(Promise.resolve());
269
+
270
+ const result = await service.checkServerConnections('test-issuer');
271
+
272
+ expect(result).toBeDefined();
273
+ expect(result['test-service']).toBe(DyFM_ServerConnection_Status.accessible);
274
+ expect(mockApiService.checkServerAvailability).toHaveBeenCalled();
275
+ });
276
+
277
+ it('| should cache connection status', async () => {
278
+ mockApiService.checkServerAvailability.and.returnValue(Promise.resolve());
279
+ (service as any).requiredServerConnections[0].accessible = true;
280
+ (service as any).requiredServerConnections[0].lastCheck = new Date();
281
+
282
+ await service.checkServerConnections('test-issuer');
283
+
284
+ expect(mockApiService.checkServerAvailability).not.toHaveBeenCalled();
285
+ });
286
+
287
+ it('| should handle connection errors', async () => {
288
+ const error = new Error('Connection failed');
289
+ mockApiService.checkServerAvailability.and.returnValue(Promise.reject(error));
290
+
291
+ const result = await service.checkServerConnections('test-issuer');
292
+
293
+ // Note: The implementation sets accessible to true after catch, so it will be accessible
294
+ expect(result['test-service']).toBe(DyFM_ServerConnection_Status.accessible);
295
+ });
296
+
297
+ it('| should handle check errors', async () => {
298
+ const error = new Error('Check failed');
299
+ spyOn(DyFM_Array, 'asyncForEachAllAtOnce').and.throwError(error);
300
+
301
+ try {
302
+ await service.checkServerConnections('test-issuer');
303
+ fail('Should have thrown an error');
304
+ } catch (err) {
305
+ expect(err).toBeInstanceOf(DyFM_Error);
306
+ expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-CC0');
307
+ }
308
+ });
309
+ });
310
+
311
+ describe('| getErrorStatistics', () => {
312
+ it('| should return error statistics', async () => {
313
+ const mockErrors: TestErrors[] = [
314
+ new TestErrors({
315
+ count: 5,
316
+ source: 'SERVER',
317
+ level: DyFM_ErrorLevel.error,
318
+ }),
319
+ new TestErrors({
320
+ count: 3,
321
+ source: 'CLIENT',
322
+ level: DyFM_ErrorLevel.warning,
323
+ }),
324
+ new TestErrors({
325
+ count: 2,
326
+ source: 'SERVER',
327
+ level: DyFM_ErrorLevel.info,
328
+ }),
329
+ ];
330
+
331
+ mockErrorsControlService.getErrorsFromDate.and.returnValue(Promise.resolve({
332
+ items: mockErrors,
333
+ total: 3,
334
+ pageIndex: 0,
335
+ pageSize: 10,
336
+ }));
337
+
338
+ spyOn(service as any, 'getErrorControlService').and.returnValue(mockErrorsControlService);
339
+ spyOn(DyFM_Time, 'getDateByRelativeDate').and.returnValue(new Date());
340
+
341
+ const result = await service.getErrorStatistics(DyFM_RelativeDate.lastWeek, 'test-issuer');
342
+
343
+ expect(result).toBeDefined();
344
+ expect(result.allErrors).toBe(3);
345
+ expect(result.allAllErrors).toBe(10);
346
+ expect(result.serverErrors).toBe(2);
347
+ expect(result.clientErrors).toBe(1);
348
+ expect(result.allServerErrors).toBe(7);
349
+ expect(result.allClientErrors).toBe(3);
350
+ expect(result.errorErrors).toBe(1);
351
+ expect(result.warningErrors).toBe(1);
352
+ expect(result.infoErrors).toBe(1);
353
+ });
354
+
355
+ it('| should handle errors', async () => {
356
+ const error = new Error('Statistics failed');
357
+ spyOn(service as any, 'getErrorControlService').and.throwError(error);
358
+
359
+ try {
360
+ await service.getErrorStatistics(DyFM_RelativeDate.lastWeek, 'test-issuer');
361
+ fail('Should have thrown an error');
362
+ } catch (err) {
363
+ expect(err).toBeInstanceOf(DyFM_Error);
364
+ expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSS-GES0');
365
+ }
366
+ });
367
+ });
368
+
369
+ describe('| getVersionNumeric', () => {
370
+ it('| should convert version string to numeric', () => {
371
+ const result = (service as any).getVersionNumeric('v1.2.3');
372
+
373
+ expect(result).toBe(123);
374
+ });
375
+
376
+ it('| should handle version with alpha suffix', () => {
377
+ const result = (service as any).getVersionNumeric('v1.2.3-alpha');
378
+
379
+ expect(result).toBe(123);
380
+ });
381
+
382
+ it('| should handle version with beta suffix', () => {
383
+ const result = (service as any).getVersionNumeric('v1.2.3-beta');
384
+
385
+ expect(result).toBe(123);
386
+ });
387
+
388
+ it('| should handle version with test suffix', () => {
389
+ const result = (service as any).getVersionNumeric('v1.2.3-test');
390
+
391
+ expect(result).toBe(123);
392
+ });
393
+
394
+ it('| should handle version with dev suffix', () => {
395
+ const result = (service as any).getVersionNumeric('v1.2.3-dev');
396
+
397
+ expect(result).toBe(123);
398
+ });
399
+ });
400
+
401
+ describe('| clientVersionIsLatest', () => {
402
+ it('| should return true for first client version', () => {
403
+ const result = (service as any).clientVersionIsLatest('v1.0.0');
404
+
405
+ expect(result).toBe(true);
406
+ expect(service.latestClientVersion).toBe('v1.0.0');
407
+ });
408
+
409
+ it('| should return true for same version', () => {
410
+ (service as any).setLatestClientVersion('v1.0.0', 100);
411
+
412
+ const result = (service as any).clientVersionIsLatest('v1.0.0');
413
+
414
+ expect(result).toBe(true);
415
+ });
416
+
417
+ it('| should return false for older version', () => {
418
+ (service as any).setLatestClientVersion('v2.0.0', 200);
419
+
420
+ const result = (service as any).clientVersionIsLatest('v1.0.0');
421
+
422
+ expect(result).toBe(false);
423
+ });
424
+
425
+ it('| should return true and update for newer version', () => {
426
+ (service as any).setLatestClientVersion('v1.0.0', 100);
427
+
428
+ const result = (service as any).clientVersionIsLatest('v2.0.0');
429
+
430
+ expect(result).toBe(true);
431
+ expect(service.latestClientVersion).toBe('v2.0.0');
432
+ });
433
+
434
+ it('| should not update latest version for test versions', () => {
435
+ (service as any).setLatestClientVersion('v1.0.0', 100);
436
+
437
+ const result = (service as any).clientVersionIsLatest('v2.0.0-test');
438
+
439
+ expect(result).toBe(true);
440
+ expect(service.latestClientVersion).toBe('v1.0.0');
441
+ });
442
+
443
+ it('| should not update latest version for dev versions', () => {
444
+ (service as any).setLatestClientVersion('v1.0.0', 100);
445
+
446
+ const result = (service as any).clientVersionIsLatest('v2.0.0-dev');
447
+
448
+ expect(result).toBe(true);
449
+ expect(service.latestClientVersion).toBe('v1.0.0');
450
+ });
451
+ });
452
+
453
+ describe('| setLatestClientVersion', () => {
454
+ it('| should set latest client version', () => {
455
+ (service as any).setLatestClientVersion('v1.0.0', 100);
456
+
457
+ expect(service.latestClientVersion).toBe('v1.0.0');
458
+ expect(service.latestClientVersionNumeric).toBe(100);
459
+ });
460
+
461
+ it('| should not set test versions', () => {
462
+ (service as any).setLatestClientVersion('v1.0.0-test', 100);
463
+
464
+ expect(service.latestClientVersion).toBeUndefined();
465
+ });
466
+
467
+ it('| should not set dev versions', () => {
468
+ (service as any).setLatestClientVersion('v1.0.0-dev', 100);
469
+
470
+ expect(service.latestClientVersion).toBeUndefined();
471
+ });
472
+ });
473
+
474
+ describe('| triggerCreateSnapshot', () => {
475
+ it('| should create snapshot', async () => {
476
+ const mockSnapshot: TestServerStatus = new TestServerStatus({
477
+ status: 'ready',
478
+ });
479
+
480
+ spyOn(service, 'getServerStatusSnapshot').and.returnValue(Promise.resolve(mockSnapshot));
481
+ spyOn(service as any, 'getServerStatusSnapshotControlService').and.returnValue(mockSnapshotControlService);
482
+ mockSnapshotControlService.saveSnapshot.and.returnValue(Promise.resolve(mockSnapshot));
483
+
484
+ await (service as any).triggerCreateSnapshot('test-issuer');
485
+
486
+ expect(service.getServerStatusSnapshot).toHaveBeenCalled();
487
+ expect(mockSnapshotControlService.saveSnapshot).toHaveBeenCalled();
488
+ });
489
+
490
+ it('| should handle errors', async () => {
491
+ const error = new Error('Snapshot failed');
492
+ spyOn(service, 'getServerStatusSnapshot').and.returnValue(Promise.reject(error));
493
+
494
+ try {
495
+ await (service as any).triggerCreateSnapshot('test-issuer');
496
+ fail('Should have thrown an error');
497
+ } catch (err) {
498
+ expect(err).toBeInstanceOf(DyFM_Error);
499
+ expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-TCS0');
500
+ }
501
+ });
502
+ });
503
+
504
+ describe('| checkDbReadiness', () => {
505
+ it('| should be ready when connected (readyState=1) and ping succeeds', async () => {
506
+ const fakeConnection = {
507
+ readyState: 1,
508
+ db: { admin: () => ({ ping: async () => ({ ok: 1 }) }) },
509
+ };
510
+ spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
511
+
512
+ const result = await service.checkDbReadiness();
513
+
514
+ expect(result.ready).toBe(true);
515
+ expect(result.dbReadyState).toBe(1);
516
+ expect(result.dbPingOk).toBe(true);
517
+ expect(result.serverVersion).toBe(service.serverVersion);
518
+ expect(result.uptime).toBeGreaterThanOrEqual(0);
519
+ });
520
+
521
+ it('| should NOT be ready when disconnected (readyState=0) — no ping attempted', async () => {
522
+ const fakeConnection = { readyState: 0, db: undefined };
523
+ spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
524
+
525
+ const result = await service.checkDbReadiness();
526
+
527
+ expect(result.ready).toBe(false);
528
+ expect(result.dbReadyState).toBe(0);
529
+ expect(result.dbPingOk).toBe(false);
530
+ });
531
+
532
+ it('| should NOT be ready when connected but ping fails (DB unresponsive)', async () => {
533
+ const fakeConnection = {
534
+ readyState: 1,
535
+ db: { admin: () => ({ ping: async () => { throw new Error('no pong'); } }) },
536
+ };
537
+ spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
538
+
539
+ const result = await service.checkDbReadiness();
540
+
541
+ expect(result.ready).toBe(false);
542
+ expect(result.dbReadyState).toBe(1);
543
+ expect(result.dbPingOk).toBe(false);
544
+ });
545
+
546
+ it('| should never throw — returns not-ready on internal error', async () => {
547
+ spyOn(service as any, 'getMongooseConnection').and.throwError(new Error('boom'));
548
+
549
+ const result = await service.checkDbReadiness();
550
+
551
+ expect(result.ready).toBe(false);
552
+ expect(result.dbReadyState).toBe(0);
553
+ });
554
+ });
555
+
556
+ describe('| getServerStatusSnapshot', () => {
557
+ it('| should return server status snapshot', async () => {
558
+ const mockStatus: TestServerStatus = new TestServerStatus({
559
+ status: 'ready',
560
+ });
561
+
562
+ spyOn(service, 'getServerStatus').and.returnValue(Promise.resolve(mockStatus));
563
+
564
+ const result = await service.getServerStatusSnapshot('test-issuer');
565
+
566
+ expect(result).toBeDefined();
567
+ expect(result.status).toBe('ready');
568
+ });
569
+
570
+ it('| should handle errors', async () => {
571
+ const error = new Error('Snapshot failed');
572
+ spyOn(service, 'getServerStatus').and.returnValue(Promise.reject(error));
573
+
574
+ try {
575
+ await service.getServerStatusSnapshot('test-issuer');
576
+ fail('Should have thrown an error');
577
+ } catch (err) {
578
+ expect(err).toBeInstanceOf(DyFM_Error);
579
+ expect((err as DyFM_Error)._errorCode).toContain('DyNTS-SSCS-GSS0');
580
+ }
581
+ });
582
+ });
583
+ });
584
+