@futdevpro/nts-dynamo 1.15.144 → 1.15.150
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/.dynamo/logs/cicd-pipeline/output.log +2896 -0
- package/.dynamo/logs/cicd-pipeline/status.json +74 -0
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/README.md +16 -0
- package/__documentations/2026-08-18-artifact-compiler.md +3 -1
- package/__documentations/2026-08-21-distributed-rate-limit-bfr-ctm-010.md +59 -0
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/__documentations/plans/BEDROCK-HYPERPLAN.md +95 -95
- package/_specifications/BACKLOG.md +92 -92
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/build/_collections/npm-token-check.util.d.ts +139 -0
- package/build/_collections/npm-token-check.util.d.ts.map +1 -0
- package/build/_collections/npm-token-check.util.js +302 -0
- package/build/_collections/npm-token-check.util.js.map +1 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.d.ts +6 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.d.ts.map +1 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.js +10 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.js.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts +15 -6
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts.map +1 -1
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.d.ts +9 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.d.ts.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.js +3 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.js.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.d.ts +7 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.d.ts.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.js +3 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.js.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.d.ts +9 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.d.ts.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.js +3 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.js.map +1 -0
- package/build/_modules/rate-limit/index.d.ts +5 -0
- package/build/_modules/rate-limit/index.d.ts.map +1 -1
- package/build/_modules/rate-limit/index.js +5 -1
- package/build/_modules/rate-limit/index.js.map +1 -1
- package/build/_modules/rate-limit/rate-limit-in-memory.store.d.ts +19 -0
- package/build/_modules/rate-limit/rate-limit-in-memory.store.d.ts.map +1 -0
- package/build/_modules/rate-limit/rate-limit-in-memory.store.js +71 -0
- package/build/_modules/rate-limit/rate-limit-in-memory.store.js.map +1 -0
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts +39 -103
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts.map +1 -1
- package/build/_modules/rate-limit/rate-limit.middleware.js +325 -236
- package/build/_modules/rate-limit/rate-limit.middleware.js.map +1 -1
- package/build/_services/core/collection-growth-monitor.service.d.ts +1 -1
- package/build/_services/core/collection-growth-monitor.service.d.ts.map +1 -1
- package/build/_services/core/collection-growth-monitor.service.js +24 -5
- package/build/_services/core/collection-growth-monitor.service.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +1 -1
- package/pnpm-workspace.yaml +2 -2
- 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 +126 -126
- package/src/_collections/npm-token-check.util.spec.ts +218 -0
- package/src/_collections/npm-token-check.util.ts +327 -0
- package/src/_collections/sample.env +21 -21
- package/src/_collections/signed-url.util.spec.ts +198 -198
- package/src/_collections/signed-url.util.ts +170 -170
- 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 +669 -669
- package/src/_models/control-models/endpoint-params.control-model.ts +664 -664
- 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 +171 -171
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/global-settings.interface.ts +294 -294
- 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 +36 -36
- 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/ai-mock/_services/ai-embedding-mock.service.spec.ts +115 -115
- package/src/_modules/ai/_modules/ai-mock/_services/ai-embedding-mock.service.ts +233 -233
- 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-code-chunking.util.spec.ts +295 -295
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +518 -518
- 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-code-chunk.interface.ts +68 -68
- 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 +30 -30
- 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 +332 -332
- 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 +634 -634
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +489 -489
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.tools.spec.ts +173 -173
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +1085 -1085
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding-provider.registry.spec.ts +110 -110
- package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +114 -114
- 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 +599 -599
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +158 -158
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.spec.ts +197 -197
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +371 -371
- package/src/_modules/ai/index.ts +33 -33
- 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/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +161 -161
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +203 -203
- package/src/_modules/data-readers/_models/interfaces/dynts-sqlite-reader.interface.ts +33 -33
- package/src/_modules/data-readers/index.ts +11 -11
- 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 +35 -35
- package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +59 -59
- 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 +480 -480
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +416 -416
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +214 -214
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +186 -186
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +167 -167
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +130 -130
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +509 -509
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +323 -323
- package/src/_modules/local-vector-search/index.ts +16 -16
- package/src/_modules/logs/index.ts +11 -11
- package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +111 -111
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +142 -142
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +120 -120
- package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +168 -168
- package/src/_modules/mcp/index.ts +13 -13
- 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/rate-limit/_enums/rate-limit-store-kind.type-enum.ts +5 -0
- package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +19 -6
- package/src/_modules/rate-limit/_models/rate-limit-consume-request.interface.ts +9 -0
- package/src/_modules/rate-limit/_models/rate-limit-consume-result.interface.ts +6 -0
- package/src/_modules/rate-limit/_models/rate-limit-store.interface.ts +9 -0
- package/src/_modules/rate-limit/index.ts +5 -0
- package/src/_modules/rate-limit/rate-limit-in-memory.store.ts +91 -0
- package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +424 -200
- package/src/_modules/rate-limit/rate-limit.middleware.ts +436 -275
- package/src/_modules/scheduler/_models/scheduler-job.interface.ts +35 -35
- package/src/_modules/scheduler/get-scheduler-routing-module.util.ts +33 -33
- package/src/_modules/scheduler/index.ts +8 -8
- package/src/_modules/scheduler/scheduler.controller.spec.ts +42 -42
- package/src/_modules/scheduler/scheduler.controller.ts +69 -69
- package/src/_modules/scheduler/scheduler.service.spec.ts +141 -141
- package/src/_modules/scheduler/scheduler.service.ts +176 -176
- package/src/_modules/scoped-config/_enums/dynts-scoped-config-level.enum.ts +22 -22
- package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +81 -81
- package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +107 -107
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +306 -306
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +295 -295
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +118 -118
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +105 -105
- package/src/_modules/scoped-config/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +238 -238
- package/src/_modules/server/errors/errors.control-service.ts +100 -100
- package/src/_modules/server/errors/errors.controller.ts +559 -559
- package/src/_modules/server/errors/errors.data-service.spec.ts +480 -480
- 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 +672 -672
- package/src/_modules/server/server-status/server-status.control-service.ts +490 -490
- package/src/_modules/server/server-status/server-status.controller.spec.ts +276 -276
- package/src/_modules/server/server-status/server-status.controller.ts +336 -336
- 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 +158 -158
- package/src/_modules/socket/_models/socket-presence.control-model.ts +209 -209
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +69 -69
- 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/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +648 -648
- 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 +106 -106
- package/src/_modules/usage/usage.controller.ts +140 -140
- 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 +209 -209
- package/src/_services/base/archive-data.service.ts +223 -223
- package/src/_services/base/data.service.spec.ts +784 -784
- package/src/_services/base/data.service.ts +2792 -2792
- package/src/_services/base/db.service.spec.ts +160 -160
- package/src/_services/base/db.service.ts +1698 -1698
- 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/collection-growth-monitor.service.spec.ts +53 -1
- package/src/_services/core/collection-growth-monitor.service.ts +29 -6
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +757 -757
- package/src/_services/core/global.service.spec.ts +292 -292
- package/src/_services/core/global.service.ts +487 -487
- package/src/_services/core/memory-guard.service.spec.ts +245 -245
- package/src/_services/core/memory-guard.service.ts +481 -481
- 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/server/app.server.ts +2012 -2012
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +1 -0
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
import { Subscription, timer } from 'rxjs';
|
|
2
|
-
|
|
3
|
-
import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base';
|
|
4
|
-
import {
|
|
5
|
-
DyNTS_ScheduledJob,
|
|
6
|
-
DyNTS_ScheduledJobRun,
|
|
7
|
-
} from './_models/scheduler-job.interface';
|
|
8
|
-
|
|
9
|
-
/** Belso reprezentacio egy regisztralt job-rol + aktiv timer-rol. */
|
|
10
|
-
interface DyNTS_RegisteredJob {
|
|
11
|
-
job: DyNTS_ScheduledJob;
|
|
12
|
-
subscription?: Subscription;
|
|
13
|
-
running: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Altalanos, idozitett-job utemzo a DyNTS szerverekhez.
|
|
18
|
-
*
|
|
19
|
-
* - **Regisztralhato**: `registerJob({ key, intervalMs, handler })`.
|
|
20
|
-
* - **Idempotens / skip-if-running**: egy job-bol egyszerre csak egy futas megy
|
|
21
|
-
* (a lassu futas nem torlodik fel).
|
|
22
|
-
* - **Restart-biztos**: a scheduler NEM perzisztal futasi allapotot — a helyesseget
|
|
23
|
-
* a handler igazsagforras-timestampjei adjak (lasd DyNTS_ScheduledJob doc).
|
|
24
|
-
* - **Naplo**: az utolso N futas in-memory ring bufferben (`getRuns()`), hiba eseten
|
|
25
|
-
* rich hibauzenettel (sosem `[object Object]`).
|
|
26
|
-
*
|
|
27
|
-
* Hasznalat (szerver indulasakor):
|
|
28
|
-
* const scheduler = DyNTS_Scheduler_Service.getInstance();
|
|
29
|
-
* scheduler.registerJob({ key: 'sp-auto-accept', intervalMs: 24 * 60 * 60 * 1000, handler });
|
|
30
|
-
* scheduler.start();
|
|
31
|
-
*/
|
|
32
|
-
export class DyNTS_Scheduler_Service extends DyNTS_SingletonServiceBase {
|
|
33
|
-
|
|
34
|
-
static getInstance(): DyNTS_Scheduler_Service {
|
|
35
|
-
return DyNTS_Scheduler_Service.getSingletonInstance() as DyNTS_Scheduler_Service;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private readonly jobs: Map<string, DyNTS_RegisteredJob> = new Map<string, DyNTS_RegisteredJob>();
|
|
39
|
-
private readonly runs: DyNTS_ScheduledJobRun[] = [];
|
|
40
|
-
private readonly maxRuns: number = 500;
|
|
41
|
-
private started: boolean = false;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Job regisztralasa. Ha a scheduler mar el (`start()` lefutott), a job timer-e
|
|
45
|
-
* azonnal elindul. Duplikalt kulcs / hibas intervalMs eseten hibat dob.
|
|
46
|
-
*/
|
|
47
|
-
registerJob(job: DyNTS_ScheduledJob): void {
|
|
48
|
-
if (!job || !job.key) {
|
|
49
|
-
throw new Error('DyNTS_Scheduler_Service.registerJob: job.key kotelezo');
|
|
50
|
-
}
|
|
51
|
-
if (this.jobs.has(job.key)) {
|
|
52
|
-
throw new Error(`DyNTS_Scheduler_Service.registerJob: a(z) "${job.key}" job mar regisztralva van`);
|
|
53
|
-
}
|
|
54
|
-
if (typeof job.intervalMs !== 'number' || job.intervalMs <= 0) {
|
|
55
|
-
throw new Error(`DyNTS_Scheduler_Service.registerJob: a(z) "${job.key}" job-hoz pozitiv intervalMs kell`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const registered: DyNTS_RegisteredJob = { job: job, running: false };
|
|
59
|
-
this.jobs.set(job.key, registered);
|
|
60
|
-
|
|
61
|
-
if (this.started) {
|
|
62
|
-
this.startJob(registered);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** Job leiratkoztatasa + eltavolitasa. Ismeretlen kulcs eseten no-op. */
|
|
67
|
-
unregisterJob(key: string): void {
|
|
68
|
-
const registered: DyNTS_RegisteredJob | undefined = this.jobs.get(key);
|
|
69
|
-
if (!registered) { return; }
|
|
70
|
-
registered.subscription?.unsubscribe();
|
|
71
|
-
this.jobs.delete(key);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** Minden regisztralt job timer-enek inditasa. Idempotens. */
|
|
75
|
-
start(): void {
|
|
76
|
-
if (this.started) { return; }
|
|
77
|
-
this.started = true;
|
|
78
|
-
this.jobs.forEach((registered: DyNTS_RegisteredJob) => this.startJob(registered));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/** Minden job timer-enek leallitasa (a regisztraciok megmaradnak). */
|
|
82
|
-
stop(): void {
|
|
83
|
-
this.jobs.forEach((registered: DyNTS_RegisteredJob) => {
|
|
84
|
-
registered.subscription?.unsubscribe();
|
|
85
|
-
registered.subscription = undefined;
|
|
86
|
-
});
|
|
87
|
-
this.started = false;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** Egy job azonnali, kezi futtatasa (a skip-if-running lock-ot tiszteletben tartva). */
|
|
91
|
-
async runNow(key: string): Promise<void> {
|
|
92
|
-
const registered: DyNTS_RegisteredJob | undefined = this.jobs.get(key);
|
|
93
|
-
if (!registered) {
|
|
94
|
-
throw new Error(`DyNTS_Scheduler_Service.runNow: a(z) "${key}" job nincs regisztralva`);
|
|
95
|
-
}
|
|
96
|
-
await this.executeJob(registered);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/** El van-e inditva a scheduler. */
|
|
100
|
-
isStarted(): boolean {
|
|
101
|
-
return this.started;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** Eppen fut-e az adott job. */
|
|
105
|
-
isRunning(key: string): boolean {
|
|
106
|
-
return this.jobs.get(key)?.running ?? false;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** A regisztralt job-kulcsok. */
|
|
110
|
-
getJobKeys(): string[] {
|
|
111
|
-
return Array.from(this.jobs.keys());
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/** Az utolso N futas, legujabb elol. */
|
|
115
|
-
getRuns(limit: number = 100): DyNTS_ScheduledJobRun[] {
|
|
116
|
-
const safeLimit: number = Math.max(0, Math.min(limit, this.runs.length));
|
|
117
|
-
return this.runs.slice(this.runs.length - safeLimit).reverse();
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** Teszt-segedlet: minden timer leall + minden regisztracio/naplo torlodik. */
|
|
121
|
-
_resetForTesting(): void {
|
|
122
|
-
this.stop();
|
|
123
|
-
this.jobs.clear();
|
|
124
|
-
this.runs.length = 0;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
private startJob(registered: DyNTS_RegisteredJob): void {
|
|
128
|
-
if (registered.subscription) { return; }
|
|
129
|
-
const initialDelay: number = registered.job.initialDelayMs ?? registered.job.intervalMs;
|
|
130
|
-
registered.subscription = timer(initialDelay, registered.job.intervalMs)
|
|
131
|
-
.subscribe(() => { void this.executeJob(registered); });
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
private async executeJob(registered: DyNTS_RegisteredJob): Promise<void> {
|
|
135
|
-
if (registered.running) { return; }
|
|
136
|
-
registered.running = true;
|
|
137
|
-
|
|
138
|
-
const run: DyNTS_ScheduledJobRun = {
|
|
139
|
-
jobKey: registered.job.key,
|
|
140
|
-
startedAt: new Date().toISOString(),
|
|
141
|
-
status: 'running',
|
|
142
|
-
};
|
|
143
|
-
this.pushRun(run);
|
|
144
|
-
|
|
145
|
-
try {
|
|
146
|
-
await registered.job.handler();
|
|
147
|
-
run.status = 'success';
|
|
148
|
-
} catch (error: unknown) {
|
|
149
|
-
run.status = 'failed';
|
|
150
|
-
run.error = this.toErrorMessage(error);
|
|
151
|
-
this.logError(registered.job.key, error);
|
|
152
|
-
} finally {
|
|
153
|
-
run.finishedAt = new Date().toISOString();
|
|
154
|
-
registered.running = false;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
private pushRun(run: DyNTS_ScheduledJobRun): void {
|
|
159
|
-
this.runs.push(run);
|
|
160
|
-
if (this.runs.length > this.maxRuns) {
|
|
161
|
-
this.runs.shift();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
private toErrorMessage(error: unknown): string {
|
|
166
|
-
if (error instanceof Error) { return error.message; }
|
|
167
|
-
try { return JSON.stringify(error); } catch { return String(error); }
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
private logError(jobKey: string, error: unknown): void {
|
|
171
|
-
// A console.error-t a DyNTS_Logs_Service (ha telepitve van) automatikusan bufferli.
|
|
172
|
-
// TODO (kovetkezo iteracio): bekotni a DyNTS_GlobalService.globalErrorHandler-be.
|
|
173
|
-
// eslint-disable-next-line no-console
|
|
174
|
-
console.error(` ! Scheduler job "${jobKey}" failed:`, error);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
1
|
+
import { Subscription, timer } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base';
|
|
4
|
+
import {
|
|
5
|
+
DyNTS_ScheduledJob,
|
|
6
|
+
DyNTS_ScheduledJobRun,
|
|
7
|
+
} from './_models/scheduler-job.interface';
|
|
8
|
+
|
|
9
|
+
/** Belso reprezentacio egy regisztralt job-rol + aktiv timer-rol. */
|
|
10
|
+
interface DyNTS_RegisteredJob {
|
|
11
|
+
job: DyNTS_ScheduledJob;
|
|
12
|
+
subscription?: Subscription;
|
|
13
|
+
running: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Altalanos, idozitett-job utemzo a DyNTS szerverekhez.
|
|
18
|
+
*
|
|
19
|
+
* - **Regisztralhato**: `registerJob({ key, intervalMs, handler })`.
|
|
20
|
+
* - **Idempotens / skip-if-running**: egy job-bol egyszerre csak egy futas megy
|
|
21
|
+
* (a lassu futas nem torlodik fel).
|
|
22
|
+
* - **Restart-biztos**: a scheduler NEM perzisztal futasi allapotot — a helyesseget
|
|
23
|
+
* a handler igazsagforras-timestampjei adjak (lasd DyNTS_ScheduledJob doc).
|
|
24
|
+
* - **Naplo**: az utolso N futas in-memory ring bufferben (`getRuns()`), hiba eseten
|
|
25
|
+
* rich hibauzenettel (sosem `[object Object]`).
|
|
26
|
+
*
|
|
27
|
+
* Hasznalat (szerver indulasakor):
|
|
28
|
+
* const scheduler = DyNTS_Scheduler_Service.getInstance();
|
|
29
|
+
* scheduler.registerJob({ key: 'sp-auto-accept', intervalMs: 24 * 60 * 60 * 1000, handler });
|
|
30
|
+
* scheduler.start();
|
|
31
|
+
*/
|
|
32
|
+
export class DyNTS_Scheduler_Service extends DyNTS_SingletonServiceBase {
|
|
33
|
+
|
|
34
|
+
static getInstance(): DyNTS_Scheduler_Service {
|
|
35
|
+
return DyNTS_Scheduler_Service.getSingletonInstance() as DyNTS_Scheduler_Service;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private readonly jobs: Map<string, DyNTS_RegisteredJob> = new Map<string, DyNTS_RegisteredJob>();
|
|
39
|
+
private readonly runs: DyNTS_ScheduledJobRun[] = [];
|
|
40
|
+
private readonly maxRuns: number = 500;
|
|
41
|
+
private started: boolean = false;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Job regisztralasa. Ha a scheduler mar el (`start()` lefutott), a job timer-e
|
|
45
|
+
* azonnal elindul. Duplikalt kulcs / hibas intervalMs eseten hibat dob.
|
|
46
|
+
*/
|
|
47
|
+
registerJob(job: DyNTS_ScheduledJob): void {
|
|
48
|
+
if (!job || !job.key) {
|
|
49
|
+
throw new Error('DyNTS_Scheduler_Service.registerJob: job.key kotelezo');
|
|
50
|
+
}
|
|
51
|
+
if (this.jobs.has(job.key)) {
|
|
52
|
+
throw new Error(`DyNTS_Scheduler_Service.registerJob: a(z) "${job.key}" job mar regisztralva van`);
|
|
53
|
+
}
|
|
54
|
+
if (typeof job.intervalMs !== 'number' || job.intervalMs <= 0) {
|
|
55
|
+
throw new Error(`DyNTS_Scheduler_Service.registerJob: a(z) "${job.key}" job-hoz pozitiv intervalMs kell`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const registered: DyNTS_RegisteredJob = { job: job, running: false };
|
|
59
|
+
this.jobs.set(job.key, registered);
|
|
60
|
+
|
|
61
|
+
if (this.started) {
|
|
62
|
+
this.startJob(registered);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Job leiratkoztatasa + eltavolitasa. Ismeretlen kulcs eseten no-op. */
|
|
67
|
+
unregisterJob(key: string): void {
|
|
68
|
+
const registered: DyNTS_RegisteredJob | undefined = this.jobs.get(key);
|
|
69
|
+
if (!registered) { return; }
|
|
70
|
+
registered.subscription?.unsubscribe();
|
|
71
|
+
this.jobs.delete(key);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Minden regisztralt job timer-enek inditasa. Idempotens. */
|
|
75
|
+
start(): void {
|
|
76
|
+
if (this.started) { return; }
|
|
77
|
+
this.started = true;
|
|
78
|
+
this.jobs.forEach((registered: DyNTS_RegisteredJob) => this.startJob(registered));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Minden job timer-enek leallitasa (a regisztraciok megmaradnak). */
|
|
82
|
+
stop(): void {
|
|
83
|
+
this.jobs.forEach((registered: DyNTS_RegisteredJob) => {
|
|
84
|
+
registered.subscription?.unsubscribe();
|
|
85
|
+
registered.subscription = undefined;
|
|
86
|
+
});
|
|
87
|
+
this.started = false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Egy job azonnali, kezi futtatasa (a skip-if-running lock-ot tiszteletben tartva). */
|
|
91
|
+
async runNow(key: string): Promise<void> {
|
|
92
|
+
const registered: DyNTS_RegisteredJob | undefined = this.jobs.get(key);
|
|
93
|
+
if (!registered) {
|
|
94
|
+
throw new Error(`DyNTS_Scheduler_Service.runNow: a(z) "${key}" job nincs regisztralva`);
|
|
95
|
+
}
|
|
96
|
+
await this.executeJob(registered);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** El van-e inditva a scheduler. */
|
|
100
|
+
isStarted(): boolean {
|
|
101
|
+
return this.started;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Eppen fut-e az adott job. */
|
|
105
|
+
isRunning(key: string): boolean {
|
|
106
|
+
return this.jobs.get(key)?.running ?? false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** A regisztralt job-kulcsok. */
|
|
110
|
+
getJobKeys(): string[] {
|
|
111
|
+
return Array.from(this.jobs.keys());
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Az utolso N futas, legujabb elol. */
|
|
115
|
+
getRuns(limit: number = 100): DyNTS_ScheduledJobRun[] {
|
|
116
|
+
const safeLimit: number = Math.max(0, Math.min(limit, this.runs.length));
|
|
117
|
+
return this.runs.slice(this.runs.length - safeLimit).reverse();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Teszt-segedlet: minden timer leall + minden regisztracio/naplo torlodik. */
|
|
121
|
+
_resetForTesting(): void {
|
|
122
|
+
this.stop();
|
|
123
|
+
this.jobs.clear();
|
|
124
|
+
this.runs.length = 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private startJob(registered: DyNTS_RegisteredJob): void {
|
|
128
|
+
if (registered.subscription) { return; }
|
|
129
|
+
const initialDelay: number = registered.job.initialDelayMs ?? registered.job.intervalMs;
|
|
130
|
+
registered.subscription = timer(initialDelay, registered.job.intervalMs)
|
|
131
|
+
.subscribe(() => { void this.executeJob(registered); });
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private async executeJob(registered: DyNTS_RegisteredJob): Promise<void> {
|
|
135
|
+
if (registered.running) { return; }
|
|
136
|
+
registered.running = true;
|
|
137
|
+
|
|
138
|
+
const run: DyNTS_ScheduledJobRun = {
|
|
139
|
+
jobKey: registered.job.key,
|
|
140
|
+
startedAt: new Date().toISOString(),
|
|
141
|
+
status: 'running',
|
|
142
|
+
};
|
|
143
|
+
this.pushRun(run);
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
await registered.job.handler();
|
|
147
|
+
run.status = 'success';
|
|
148
|
+
} catch (error: unknown) {
|
|
149
|
+
run.status = 'failed';
|
|
150
|
+
run.error = this.toErrorMessage(error);
|
|
151
|
+
this.logError(registered.job.key, error);
|
|
152
|
+
} finally {
|
|
153
|
+
run.finishedAt = new Date().toISOString();
|
|
154
|
+
registered.running = false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
private pushRun(run: DyNTS_ScheduledJobRun): void {
|
|
159
|
+
this.runs.push(run);
|
|
160
|
+
if (this.runs.length > this.maxRuns) {
|
|
161
|
+
this.runs.shift();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private toErrorMessage(error: unknown): string {
|
|
166
|
+
if (error instanceof Error) { return error.message; }
|
|
167
|
+
try { return JSON.stringify(error); } catch { return String(error); }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private logError(jobKey: string, error: unknown): void {
|
|
171
|
+
// A console.error-t a DyNTS_Logs_Service (ha telepitve van) automatikusan bufferli.
|
|
172
|
+
// TODO (kovetkezo iteracio): bekotni a DyNTS_GlobalService.globalErrorHandler-be.
|
|
173
|
+
// eslint-disable-next-line no-console
|
|
174
|
+
console.error(` ! Scheduler job "${jobKey}" failed:`, error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* `DyNTS_ScopedConfig_Level` — a DB-backed scoped config feloldási-szintjei (BFR-AM-004).
|
|
4
|
-
*
|
|
5
|
-
* A precedencia: **scope (leaf→root) > table > global > builtin-default**. Egy `DyNTS_ScopedConfig`
|
|
6
|
-
* dokumentum mindig pontosan EGY szinten él; a `level` + `tableScope` + `scopeId` hármas adja a
|
|
7
|
-
* feloldási-kulcsot (a `key`-vel együtt a logikai unique-constraint).
|
|
8
|
-
*
|
|
9
|
-
* **Domain-agnosztikus:** a konkrét table-/scope-nevek a fogyasztó dolga; a bedrock csak a generikus
|
|
10
|
-
* precedencia-engine + a tárolás szintjeit definiálja (a katalógus/kulcsok NEM ide tartoznak).
|
|
11
|
-
*/
|
|
12
|
-
export enum DyNTS_ScopedConfig_Level {
|
|
13
|
-
|
|
14
|
-
/** Rendszer-szintű default (a legalacsonyabb precedencia a builtin felett). */
|
|
15
|
-
global = 'global',
|
|
16
|
-
|
|
17
|
-
/** Egy adott logikai tár/táblázat szintje (`tableScope` kötelező). */
|
|
18
|
-
table = 'table',
|
|
19
|
-
|
|
20
|
-
/** A legspecifikusabb szint: egy konkrét scope-entitás (`tableScope` + `scopeId` kötelező). */
|
|
21
|
-
scope = 'scope',
|
|
22
|
-
}
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* `DyNTS_ScopedConfig_Level` — a DB-backed scoped config feloldási-szintjei (BFR-AM-004).
|
|
4
|
+
*
|
|
5
|
+
* A precedencia: **scope (leaf→root) > table > global > builtin-default**. Egy `DyNTS_ScopedConfig`
|
|
6
|
+
* dokumentum mindig pontosan EGY szinten él; a `level` + `tableScope` + `scopeId` hármas adja a
|
|
7
|
+
* feloldási-kulcsot (a `key`-vel együtt a logikai unique-constraint).
|
|
8
|
+
*
|
|
9
|
+
* **Domain-agnosztikus:** a konkrét table-/scope-nevek a fogyasztó dolga; a bedrock csak a generikus
|
|
10
|
+
* precedencia-engine + a tárolás szintjeit definiálja (a katalógus/kulcsok NEM ide tartoznak).
|
|
11
|
+
*/
|
|
12
|
+
export enum DyNTS_ScopedConfig_Level {
|
|
13
|
+
|
|
14
|
+
/** Rendszer-szintű default (a legalacsonyabb precedencia a builtin felett). */
|
|
15
|
+
global = 'global',
|
|
16
|
+
|
|
17
|
+
/** Egy adott logikai tár/táblázat szintje (`tableScope` kötelező). */
|
|
18
|
+
table = 'table',
|
|
19
|
+
|
|
20
|
+
/** A legspecifikusabb szint: egy konkrét scope-entitás (`tableScope` + `scopeId` kötelező). */
|
|
21
|
+
scope = 'scope',
|
|
22
|
+
}
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
import { DyFM_DataModel_Params, DyFM_Metadata, DyFM_Object } from '@futdevpro/fsm-dynamo';
|
|
3
|
-
|
|
4
|
-
import { DyNTS_ScopedConfig_Level } from '../../_enums/dynts-scoped-config-level.enum';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* `DyNTS_ScopedConfig` entitás (BFR-AM-004) — egy dokumentum = **egy setting-érték egy adott szinten**.
|
|
8
|
-
* A `level` + `tableScope` + `scopeId` hármas adja a feloldási-kulcsot (a `key`-vel együtt a logikai
|
|
9
|
-
* unique-constraint); a precedencia: **scope (leaf→root) > table > global > builtin-default**.
|
|
10
|
-
*
|
|
11
|
-
* `extends DyFM_Metadata`: az identitás/metadata (`_id`, `__created`, `__lastModified`, `_deleted`)
|
|
12
|
-
* az ősből jön; a `_deleted` soft-delete marker (Date), amit a `DyNTS_ArchiveDataService` kezel — ez
|
|
13
|
-
* a felülírás-history alapja (egy `set` a régi aktív rekordot archiválja, az újat aktívan írja).
|
|
14
|
-
*
|
|
15
|
-
* **Domain-agnosztikus:** a `key` `string`, a `value` `unknown` (Mongoose `Mixed`, séma-szinten
|
|
16
|
-
* `type:'object'`). A bedrock NEM validál séma-szinten — a típushelyesség / katalógus a FOGYASZTÓ
|
|
17
|
-
* dolga. A `value` írása **`$set`-tel atomikus** (Mongoose Mixed silent-drop ellen — lásd
|
|
18
|
-
* `DyNTS_ScopedConfig_DataService.setValue`).
|
|
19
|
-
*/
|
|
20
|
-
export class DyNTS_ScopedConfig extends DyFM_Metadata {
|
|
21
|
-
|
|
22
|
-
// --- a feloldási kulcs ---
|
|
23
|
-
|
|
24
|
-
/** A feloldási-szint (`global`|`table`|`scope`). */
|
|
25
|
-
level?: DyNTS_ScopedConfig_Level;
|
|
26
|
-
|
|
27
|
-
/** `level='table'|'scope'` esetén kötelező: melyik logikai tár. */
|
|
28
|
-
tableScope?: string;
|
|
29
|
-
|
|
30
|
-
/** `level='scope'` esetén kötelező: a scope-entitás logikai azonosítója. */
|
|
31
|
-
scopeId?: string;
|
|
32
|
-
|
|
33
|
-
// --- a setting maga ---
|
|
34
|
-
|
|
35
|
-
/** A config-kulcs (a fogyasztó katalógusából; string-ként perzistált). */
|
|
36
|
-
key?: string;
|
|
37
|
-
|
|
38
|
-
/** A setting-érték; típusa a fogyasztó katalógusa szerint. Mongoose `Mixed`. */
|
|
39
|
-
value?: unknown;
|
|
40
|
-
|
|
41
|
-
// --- audit ---
|
|
42
|
-
|
|
43
|
-
/** Ki/mi állította be (audit). */
|
|
44
|
-
setBy?: string;
|
|
45
|
-
|
|
46
|
-
/** Beállítás-részlet (pl. preset-név, CLI-user). */
|
|
47
|
-
setByDetail?: string;
|
|
48
|
-
|
|
49
|
-
/** Opcionális indoklás. */
|
|
50
|
-
note?: string;
|
|
51
|
-
|
|
52
|
-
constructor(set?: Partial<DyNTS_ScopedConfig>) {
|
|
1
|
+
|
|
2
|
+
import { DyFM_DataModel_Params, DyFM_Metadata, DyFM_Object } from '@futdevpro/fsm-dynamo';
|
|
3
|
+
|
|
4
|
+
import { DyNTS_ScopedConfig_Level } from '../../_enums/dynts-scoped-config-level.enum';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* `DyNTS_ScopedConfig` entitás (BFR-AM-004) — egy dokumentum = **egy setting-érték egy adott szinten**.
|
|
8
|
+
* A `level` + `tableScope` + `scopeId` hármas adja a feloldási-kulcsot (a `key`-vel együtt a logikai
|
|
9
|
+
* unique-constraint); a precedencia: **scope (leaf→root) > table > global > builtin-default**.
|
|
10
|
+
*
|
|
11
|
+
* `extends DyFM_Metadata`: az identitás/metadata (`_id`, `__created`, `__lastModified`, `_deleted`)
|
|
12
|
+
* az ősből jön; a `_deleted` soft-delete marker (Date), amit a `DyNTS_ArchiveDataService` kezel — ez
|
|
13
|
+
* a felülírás-history alapja (egy `set` a régi aktív rekordot archiválja, az újat aktívan írja).
|
|
14
|
+
*
|
|
15
|
+
* **Domain-agnosztikus:** a `key` `string`, a `value` `unknown` (Mongoose `Mixed`, séma-szinten
|
|
16
|
+
* `type:'object'`). A bedrock NEM validál séma-szinten — a típushelyesség / katalógus a FOGYASZTÓ
|
|
17
|
+
* dolga. A `value` írása **`$set`-tel atomikus** (Mongoose Mixed silent-drop ellen — lásd
|
|
18
|
+
* `DyNTS_ScopedConfig_DataService.setValue`).
|
|
19
|
+
*/
|
|
20
|
+
export class DyNTS_ScopedConfig extends DyFM_Metadata {
|
|
21
|
+
|
|
22
|
+
// --- a feloldási kulcs ---
|
|
23
|
+
|
|
24
|
+
/** A feloldási-szint (`global`|`table`|`scope`). */
|
|
25
|
+
level?: DyNTS_ScopedConfig_Level;
|
|
26
|
+
|
|
27
|
+
/** `level='table'|'scope'` esetén kötelező: melyik logikai tár. */
|
|
28
|
+
tableScope?: string;
|
|
29
|
+
|
|
30
|
+
/** `level='scope'` esetén kötelező: a scope-entitás logikai azonosítója. */
|
|
31
|
+
scopeId?: string;
|
|
32
|
+
|
|
33
|
+
// --- a setting maga ---
|
|
34
|
+
|
|
35
|
+
/** A config-kulcs (a fogyasztó katalógusából; string-ként perzistált). */
|
|
36
|
+
key?: string;
|
|
37
|
+
|
|
38
|
+
/** A setting-érték; típusa a fogyasztó katalógusa szerint. Mongoose `Mixed`. */
|
|
39
|
+
value?: unknown;
|
|
40
|
+
|
|
41
|
+
// --- audit ---
|
|
42
|
+
|
|
43
|
+
/** Ki/mi állította be (audit). */
|
|
44
|
+
setBy?: string;
|
|
45
|
+
|
|
46
|
+
/** Beállítás-részlet (pl. preset-név, CLI-user). */
|
|
47
|
+
setByDetail?: string;
|
|
48
|
+
|
|
49
|
+
/** Opcionális indoklás. */
|
|
50
|
+
note?: string;
|
|
51
|
+
|
|
52
|
+
constructor(set?: Partial<DyNTS_ScopedConfig>) {
|
|
53
53
|
super(set);
|
|
54
|
-
|
|
55
|
-
if (set) {
|
|
56
|
-
DyFM_Object.cleanAssign(this, set);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* MongoDB data-params a `dynts_scoped_config` collection-höz (BFR-AM-004). `addArchive: true` → a
|
|
63
|
-
* felülírt (régi) értékek soft-delete-elve megőrződnek (audit-trail / history).
|
|
64
|
-
*
|
|
65
|
-
* A `value` `type:'object'` (Mongoose `Mixed`) — a séma NEM validál; a típushelyesség a fogyasztó
|
|
66
|
-
* katalógusának + set-kori validációjának dolga.
|
|
67
|
-
*/
|
|
68
|
-
export const DyNTS_scopedConfig_dataParams: DyFM_DataModel_Params<DyNTS_ScopedConfig> =
|
|
69
|
-
new DyFM_DataModel_Params<DyNTS_ScopedConfig>({
|
|
70
|
-
dataName: 'dynts_scoped_config',
|
|
71
|
-
addArchive: true,
|
|
72
|
-
properties: {
|
|
73
|
-
level: { type: 'string', index: true, required: true },
|
|
74
|
-
tableScope: { type: 'string', index: true },
|
|
75
|
-
scopeId: { type: 'string', index: true },
|
|
76
|
-
key: { type: 'string', index: true, required: true },
|
|
77
|
-
value: { type: 'object' },
|
|
78
|
-
setBy: { type: 'string', index: true },
|
|
79
|
-
setByDetail: { type: 'string' },
|
|
80
|
-
note: { type: 'string' },
|
|
81
|
-
},
|
|
82
|
-
});
|
|
54
|
+
|
|
55
|
+
if (set) {
|
|
56
|
+
DyFM_Object.cleanAssign(this, set);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* MongoDB data-params a `dynts_scoped_config` collection-höz (BFR-AM-004). `addArchive: true` → a
|
|
63
|
+
* felülírt (régi) értékek soft-delete-elve megőrződnek (audit-trail / history).
|
|
64
|
+
*
|
|
65
|
+
* A `value` `type:'object'` (Mongoose `Mixed`) — a séma NEM validál; a típushelyesség a fogyasztó
|
|
66
|
+
* katalógusának + set-kori validációjának dolga.
|
|
67
|
+
*/
|
|
68
|
+
export const DyNTS_scopedConfig_dataParams: DyFM_DataModel_Params<DyNTS_ScopedConfig> =
|
|
69
|
+
new DyFM_DataModel_Params<DyNTS_ScopedConfig>({
|
|
70
|
+
dataName: 'dynts_scoped_config',
|
|
71
|
+
addArchive: true,
|
|
72
|
+
properties: {
|
|
73
|
+
level: { type: 'string', index: true, required: true },
|
|
74
|
+
tableScope: { type: 'string', index: true },
|
|
75
|
+
scopeId: { type: 'string', index: true },
|
|
76
|
+
key: { type: 'string', index: true, required: true },
|
|
77
|
+
value: { type: 'object' },
|
|
78
|
+
setBy: { type: 'string', index: true },
|
|
79
|
+
setByDetail: { type: 'string' },
|
|
80
|
+
note: { type: 'string' },
|
|
81
|
+
},
|
|
82
|
+
});
|