@futdevpro/nts-dynamo 1.15.13 → 1.15.14
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.
- package/.c8rc.json +26 -26
- package/.copilot/patterns.json +7 -7
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/_specifications/BACKLOG.md +50 -22
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +4 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_models/interfaces/global-log-settings.interface.d.ts +11 -0
- package/build/_models/interfaces/global-log-settings.interface.d.ts.map +1 -1
- package/build/_modules/logs/get-logs-routing-module.util.d.ts +19 -0
- package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +1 -0
- package/build/_modules/logs/get-logs-routing-module.util.js +32 -0
- package/build/_modules/logs/get-logs-routing-module.util.js.map +1 -0
- package/build/_modules/logs/index.d.ts +4 -0
- package/build/_modules/logs/index.d.ts.map +1 -0
- package/build/_modules/logs/index.js +10 -0
- package/build/_modules/logs/index.js.map +1 -0
- package/build/_modules/logs/log-buffer.service.d.ts +38 -0
- package/build/_modules/logs/log-buffer.service.d.ts.map +1 -0
- package/build/_modules/logs/log-buffer.service.js +97 -0
- package/build/_modules/logs/log-buffer.service.js.map +1 -0
- package/build/_modules/logs/logs.controller.d.ts +27 -0
- package/build/_modules/logs/logs.controller.d.ts.map +1 -0
- package/build/_modules/logs/logs.controller.js +90 -0
- package/build/_modules/logs/logs.controller.js.map +1 -0
- package/build/_modules/logs/logs.service.d.ts +40 -0
- package/build/_modules/logs/logs.service.d.ts.map +1 -0
- package/build/_modules/logs/logs.service.js +97 -0
- package/build/_modules/logs/logs.service.js.map +1 -0
- package/build/_modules/server/errors/errors.data-service.d.ts.map +1 -1
- package/build/_modules/server/errors/errors.data-service.js +2 -1
- package/build/_modules/server/errors/errors.data-service.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +359 -353
- package/scripts/run-coverage-tests.js +28 -28
- package/spec/support/helpers/spec-reporter-loader.js +359 -359
- package/spec/support/helpers/ts-node-helper.js +93 -93
- package/spec/support/jasmine.coverage.json +24 -24
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/archive.util.spec.ts +57 -57
- package/src/_collections/archive.util.ts +18 -18
- package/src/_collections/atlas-default-db-options.const.ts +9 -9
- package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
- package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
- package/src/_collections/default-not-found-page.const.spec.ts +19 -19
- package/src/_collections/default-not-found-page.const.ts +22 -22
- package/src/_collections/default-socket-path.const.spec.ts +12 -12
- package/src/_collections/default-socket-path.const.ts +2 -2
- package/src/_collections/get-environment-settings.util.spec.ts +210 -210
- package/src/_collections/get-environment-settings.util.ts +48 -48
- package/src/_collections/global-settings.const.ts +5 -0
- package/src/_collections/sample.env +21 -21
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +24 -24
- package/src/_enums/predefined-data-types.enum.ts +16 -16
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
- package/src/_models/control-models/api-call-params.control-model.ts +142 -142
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
- package/src/_models/control-models/app-params.control-model.ts +136 -136
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +578 -578
- package/src/_models/control-models/endpoint-params.control-model.ts +526 -526
- package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
- package/src/_models/control-models/http-settings.control-model.ts +37 -37
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +108 -96
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
- package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
- package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
- package/src/_modules/ai/_modules/document-ai/index.ts +28 -28
- package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
- package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
- package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +240 -240
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +98 -98
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +615 -615
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +437 -437
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +833 -833
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
- package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
- package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +332 -332
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -79
- package/src/_modules/ai/_services/ai-provider.service-base.ts +29 -29
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/index.ts +13 -13
- package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
- package/src/_modules/assistant/_collections/ass.util.ts +50 -50
- package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
- package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
- package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
- package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
- package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
- package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
- package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
- package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
- package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
- package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
- package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
- package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
- package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
- package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
- package/src/_modules/custom-data/custom-data.controller.ts +67 -67
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
- package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
- package/src/_modules/custom-data/index.ts +9 -9
- package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
- package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
- package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
- package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
- package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
- package/src/_modules/defaults/index.ts +17 -17
- package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
- package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
- package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
- package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
- package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
- package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
- package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
- package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
- package/src/_modules/discord-assistant/index.ts +38 -38
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
- package/src/_modules/discord-assistant-voiced/index.ts +36 -36
- package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
- package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
- package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
- package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
- package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
- package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
- package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
- package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
- package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +19 -19
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +345 -345
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +330 -330
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +393 -393
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +220 -220
- package/src/_modules/local-vector-search/index.ts +11 -11
- package/src/_modules/logs/get-logs-routing-module.util.ts +36 -0
- package/src/_modules/logs/index.ts +3 -0
- package/src/_modules/logs/log-buffer.service.ts +101 -0
- package/src/_modules/logs/logs.controller.ts +109 -0
- package/src/_modules/logs/logs.service.ts +100 -0
- package/src/_modules/messaging/README.md +354 -354
- package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
- package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
- package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
- package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
- package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
- package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
- package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
- package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
- package/src/_modules/messaging/index.ts +30 -30
- package/src/_modules/mock/app-extended-server.mock.ts +201 -201
- package/src/_modules/mock/app-integration-test.mock.ts +51 -51
- package/src/_modules/mock/app-params.mock.spec.ts +21 -21
- package/src/_modules/mock/app-params.mock.ts +9 -9
- package/src/_modules/mock/app-server.mock.ts +188 -188
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
- package/src/_modules/mock/auth-service.mock.ts +28 -28
- package/src/_modules/mock/controller.mock.spec.ts +26 -26
- package/src/_modules/mock/controller.mock.ts +16 -16
- package/src/_modules/mock/data-model.mock.spec.ts +111 -111
- package/src/_modules/mock/data-model.mock.ts +82 -82
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
- package/src/_modules/mock/email-service-collection.mock.ts +15 -15
- package/src/_modules/mock/email-service.mock.spec.ts +17 -17
- package/src/_modules/mock/email-service.mock.ts +20 -20
- package/src/_modules/mock/email-template.mock.html +14 -14
- package/src/_modules/mock/endpoint.mock.ts +91 -91
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
- package/src/_modules/mock/socket-client.mock.ts +45 -45
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
- package/src/_modules/mock/socket-server.mock.ts +46 -46
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
- package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
- package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
- package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
- package/src/_modules/oauth2/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +230 -230
- package/src/_modules/server/errors/errors.control-service.ts +69 -69
- package/src/_modules/server/errors/errors.controller.spec.ts +165 -165
- package/src/_modules/server/errors/errors.controller.ts +270 -270
- package/src/_modules/server/errors/errors.data-service.spec.ts +355 -355
- package/src/_modules/server/errors/errors.data-service.ts +2 -1
- package/src/_modules/server/index.ts +30 -30
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
- package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
- package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +516 -516
- package/src/_modules/server/server-status/server-status.control-service.ts +336 -336
- package/src/_modules/server/server-status/server-status.controller.spec.ts +156 -156
- package/src/_modules/server/server-status/server-status.controller.ts +131 -131
- package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
- package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
- package/src/_modules/socket/_services/socket-client.service.ts +260 -260
- package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +630 -630
- package/src/_modules/socket/index.ts +42 -42
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +11 -11
- package/src/_modules/test/test.controller.spec.ts +72 -72
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +15 -15
- package/src/_modules/usage/usage.controller.spec.ts +81 -81
- package/src/_modules/usage/usage.controller.ts +126 -126
- package/src/_modules/usage/usage.data-service.spec.ts +332 -332
- package/src/_modules/usage/usage.data-service.ts +185 -185
- package/src/_services/base/api.service-base.spec.ts +125 -125
- package/src/_services/base/api.service-base.ts +74 -74
- package/src/_services/base/archive-data.service.spec.ts +196 -196
- package/src/_services/base/archive-data.service.ts +216 -216
- package/src/_services/base/data.service.spec.ts +493 -493
- package/src/_services/base/data.service.ts +2525 -2525
- package/src/_services/base/db.service.spec.ts +73 -73
- package/src/_services/base/db.service.ts +1575 -1575
- package/src/_services/base/singleton.service-base.spec.ts +28 -28
- package/src/_services/base/singleton.service-base.ts +24 -24
- package/src/_services/base/singleton.service.spec.ts +114 -114
- package/src/_services/base/singleton.service.ts +38 -38
- package/src/_services/core/api.service.spec.ts +140 -140
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +742 -742
- package/src/_services/core/global.service.spec.ts +275 -275
- package/src/_services/core/global.service.ts +461 -461
- package/src/_services/core/service-collection.service.spec.ts +46 -46
- package/src/_services/core/service-collection.service.ts +6 -6
- package/src/_services/route/controller.service.spec.ts +53 -53
- package/src/_services/route/controller.service.ts +148 -148
- package/src/_services/route/routing-module.service.spec.ts +98 -98
- package/src/_services/route/routing-module.service.ts +330 -330
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +94 -94
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
|
@@ -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
|
+
}
|