@futdevpro/nts-dynamo 1.15.58 → 1.15.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/.dynamo/logs/cicd-pipeline/output.log +1746 -1819
  2. package/.dynamo/logs/cicd-pipeline/status.json +37 -37
  3. package/.github/workflows/main.yml +432 -426
  4. package/build/_collections/global-settings.const.d.ts.map +1 -1
  5. package/build/_collections/global-settings.const.js +6 -0
  6. package/build/_collections/global-settings.const.js.map +1 -1
  7. package/build/_collections/mongo-reconnect-guard.util.d.ts +74 -0
  8. package/build/_collections/mongo-reconnect-guard.util.d.ts.map +1 -0
  9. package/build/_collections/mongo-reconnect-guard.util.js +111 -0
  10. package/build/_collections/mongo-reconnect-guard.util.js.map +1 -0
  11. package/build/_models/interfaces/global-settings.interface.d.ts +21 -0
  12. package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
  13. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.d.ts.map +1 -1
  14. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js +2 -2
  15. package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js.map +1 -1
  16. package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts +1 -1
  17. package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts.map +1 -1
  18. package/build/_modules/ai/_services/ai-embedding-mock.service.js.map +1 -1
  19. package/build/_modules/ai/_services/ai-embedding-provider.registry.d.ts.map +1 -1
  20. package/build/_modules/ai/_services/ai-embedding-provider.registry.js.map +1 -1
  21. package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts +1 -1
  22. package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts.map +1 -1
  23. package/build/_modules/ai/_services/lmstudio-embedding.control-service.js +3 -3
  24. package/build/_modules/ai/_services/lmstudio-embedding.control-service.js.map +1 -1
  25. package/build/_modules/ai/index.d.ts +2 -0
  26. package/build/_modules/ai/index.d.ts.map +1 -1
  27. package/build/_modules/ai/index.js +4 -0
  28. package/build/_modules/ai/index.js.map +1 -1
  29. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts +17 -17
  30. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts.map +1 -1
  31. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js +21 -21
  32. package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js.map +1 -1
  33. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts +4 -4
  34. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts.map +1 -1
  35. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js +5 -5
  36. package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js.map +1 -1
  37. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts +4 -4
  38. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts.map +1 -1
  39. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js +4 -4
  40. package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js.map +1 -1
  41. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts +6 -6
  42. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts.map +1 -1
  43. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js +5 -5
  44. package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js.map +1 -1
  45. package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.d.ts +1 -1
  46. package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.js +1 -1
  47. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts +4 -4
  48. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts.map +1 -1
  49. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js +6 -6
  50. package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js.map +1 -1
  51. package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts +11 -11
  52. package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts.map +1 -1
  53. package/build/_modules/mcp/_services/dynts-mcp.adapter.js +16 -11
  54. package/build/_modules/mcp/_services/dynts-mcp.adapter.js.map +1 -1
  55. package/build/_modules/mcp/index.js +1 -1
  56. package/build/_modules/mcp/index.js.map +1 -1
  57. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts +3 -3
  58. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts.map +1 -1
  59. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js +4 -4
  60. package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js.map +1 -1
  61. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.d.ts.map +1 -1
  62. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js +9 -0
  63. package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js.map +1 -1
  64. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts +3 -3
  65. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts.map +1 -1
  66. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js +1 -1
  67. package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js.map +1 -1
  68. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts +7 -7
  69. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts.map +1 -1
  70. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js +2 -2
  71. package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js.map +1 -1
  72. package/build/_services/core/global.service.d.ts.map +1 -1
  73. package/build/_services/core/global.service.js +15 -2
  74. package/build/_services/core/global.service.js.map +1 -1
  75. package/build/_services/server/app.server.d.ts.map +1 -1
  76. package/build/_services/server/app.server.js +21 -0
  77. package/build/_services/server/app.server.js.map +1 -1
  78. package/package.json +1 -1
  79. package/src/_collections/global-settings.const.ts +7 -0
  80. package/src/_collections/mongo-reconnect-guard.util.spec.ts +52 -0
  81. package/src/_collections/mongo-reconnect-guard.util.ts +172 -0
  82. package/src/_models/interfaces/global-settings.interface.ts +22 -0
  83. package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +39 -7
  84. package/src/_modules/ai/_services/ai-embedding-mock.service.ts +18 -4
  85. package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +4 -0
  86. package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +26 -5
  87. package/src/_modules/ai/index.ts +5 -0
  88. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +145 -130
  89. package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +131 -120
  90. package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +6 -5
  91. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +35 -35
  92. package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +9 -5
  93. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +11 -11
  94. package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +19 -17
  95. package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +1 -1
  96. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +123 -114
  97. package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +44 -39
  98. package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +114 -103
  99. package/src/_modules/mcp/index.ts +1 -1
  100. package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +5 -4
  101. package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +0 -2
  102. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +19 -13
  103. package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +37 -21
  104. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +11 -6
  105. package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +17 -14
  106. package/src/_services/core/global.service.spec.ts +17 -0
  107. package/src/_services/core/global.service.ts +19 -5
  108. package/src/_services/server/app.server.ts +22 -1
@@ -4,7 +4,7 @@ import { DyFM_EnvironmentFlag } from '@futdevpro/fsm-dynamo';
4
4
  import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
5
5
  import { DyNTS_GlobalService } from '../../../_services/core/global.service';
6
6
  import { DyNTS_ScopedConfig_Level } from '../_enums/dynts-scoped-config-level.enum';
7
- import { DyNTS_ScopedConfig_DataModel } from '../_models/data-models/dynts-scoped-config.data-model';
7
+ import { DyNTS_ScopedConfig } from '../_models/data-models/dynts-scoped-config.data-model';
8
8
  import { DyNTS_ScopedConfig_DataService } from './dynts-scoped-config.data-service';
9
9
 
10
10
  /**
@@ -20,6 +20,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
20
20
  if (!DyNTS_global_settings.systemShortCodeName) {
21
21
  (DyNTS_global_settings as { systemShortCodeName?: string }).systemShortCodeName = 'TEST';
22
22
  }
23
+
23
24
  if (!DyNTS_global_settings.env_settings) {
24
25
  (DyNTS_global_settings as { env_settings?: unknown }).env_settings = {
25
26
  environment: DyFM_EnvironmentFlag.local,
@@ -28,7 +29,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
28
29
  });
29
30
 
30
31
  beforeEach(() => {
31
- mockDBService = jasmine.createSpyObj('DyNTS_DBService', ['find', 'findOne']);
32
+ mockDBService = jasmine.createSpyObj('DyNTS_DBService', [ 'find', 'findOne' ]);
32
33
  mockDBService.find.and.returnValue(Promise.resolve([]));
33
34
  mockDBService.findOne.and.returnValue(Promise.resolve(null));
34
35
  spyOn(DyNTS_GlobalService, 'getDBService').and.returnValue(mockDBService as never);
@@ -37,7 +38,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
37
38
  describe('| constructor', () => {
38
39
 
39
40
  it('| should create the service with a data model', () => {
40
- const data: DyNTS_ScopedConfig_DataModel = new DyNTS_ScopedConfig_DataModel({
41
+ const data: DyNTS_ScopedConfig = new DyNTS_ScopedConfig({
41
42
  level: DyNTS_ScopedConfig_Level.global,
42
43
  key: 'read.topK',
43
44
  value: 5,
@@ -57,7 +58,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
57
58
  new DyNTS_ScopedConfig_DataService({ issuer: 'issuer-123' });
58
59
 
59
60
  expect(service).toBeInstanceOf(DyNTS_ScopedConfig_DataService);
60
- expect(service.data).toBeInstanceOf(DyNTS_ScopedConfig_DataModel);
61
+ expect(service.data).toBeInstanceOf(DyNTS_ScopedConfig);
61
62
  });
62
63
  });
63
64
 
@@ -69,15 +70,16 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
69
70
 
70
71
  const updateSpy = spyOn(service, 'updateData').and.returnValue(Promise.resolve());
71
72
 
72
- await service.setValue('rec-id', ['a', 'b'], { setBy: 'cli', setByDetail: 'user-x' });
73
+ await service.setValue('rec-id', [ 'a', 'b' ], { setBy: 'cli', setByDetail: 'user-x' });
73
74
 
74
75
  expect(updateSpy).toHaveBeenCalledTimes(1);
75
76
  const arg = updateSpy.calls.mostRecent().args[0] as {
76
77
  filterBy: { _id: string };
77
78
  update: { $set: { value: unknown; setBy?: string; setByDetail?: string } };
78
79
  };
80
+
79
81
  expect(arg.filterBy._id).toBe('rec-id');
80
- expect(arg.update.$set.value).toEqual(['a', 'b']);
82
+ expect(arg.update.$set.value).toEqual([ 'a', 'b' ]);
81
83
  expect(arg.update.$set.setBy).toBe('cli');
82
84
  expect(arg.update.$set.setByDetail).toBe('user-x');
83
85
  });
@@ -89,6 +91,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
89
91
  const filter = DyNTS_ScopedConfig_DataService.levelKeyFilter(
90
92
  DyNTS_ScopedConfig_Level.global, 'read.topK', {},
91
93
  );
94
+
92
95
  expect(filter).toEqual({ level: DyNTS_ScopedConfig_Level.global, key: 'read.topK' });
93
96
  });
94
97
 
@@ -96,6 +99,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
96
99
  const filter = DyNTS_ScopedConfig_DataService.levelKeyFilter(
97
100
  DyNTS_ScopedConfig_Level.table, 'read.topK', { tableScope: 'documents' },
98
101
  );
102
+
99
103
  expect(filter).toEqual({
100
104
  level: DyNTS_ScopedConfig_Level.table,
101
105
  key: 'read.topK',
@@ -107,6 +111,7 @@ describe('| DyNTS_ScopedConfig_DataService', () => {
107
111
  const filter = DyNTS_ScopedConfig_DataService.levelKeyFilter(
108
112
  DyNTS_ScopedConfig_Level.scope, 'read.topK', { tableScope: 'documents', scopeId: 'leaf' },
109
113
  );
114
+
110
115
  expect(filter).toEqual({
111
116
  level: DyNTS_ScopedConfig_Level.scope,
112
117
  key: 'read.topK',
@@ -5,8 +5,8 @@ import { DyNTS_ArchiveDataService } from '../../../_services/base/archive-data.s
5
5
  import { DyNTS_DataService } from '../../../_services/base/data.service';
6
6
  import { DyNTS_ScopedConfig_Level } from '../_enums/dynts-scoped-config-level.enum';
7
7
  import {
8
- DyNTS_ScopedConfig_DataModel,
9
- dyNTS_scopedConfig_dataParams,
8
+ DyNTS_ScopedConfig,
9
+ DyNTS_scopedConfig_dataParams
10
10
  } from '../_models/data-models/dynts-scoped-config.data-model';
11
11
 
12
12
  /**
@@ -22,17 +22,17 @@ import {
22
22
  * mongoose_mixed_atomic_write): a `findOne→mutate→save` SILENT-DROP-ot ad a Mixed mezőkre, ezért az
23
23
  * érték-frissítést a `setValue` `updateOne({ ... }, { $set: { value } })`-vel végzi.
24
24
  */
25
- export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_ScopedConfig_DataModel> {
25
+ export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_ScopedConfig> {
26
26
 
27
27
  constructor(
28
28
  set: {
29
- data?: DyNTS_ScopedConfig_DataModel,
29
+ data?: DyNTS_ScopedConfig,
30
30
  issuer: string,
31
31
  },
32
32
  ) {
33
33
  super(
34
- set.data instanceof DyNTS_ScopedConfig_DataModel ? set.data : new DyNTS_ScopedConfig_DataModel(set.data),
35
- dyNTS_scopedConfig_dataParams,
34
+ set.data instanceof DyNTS_ScopedConfig ? set.data : new DyNTS_ScopedConfig(set.data),
35
+ DyNTS_scopedConfig_dataParams,
36
36
  set.issuer,
37
37
  );
38
38
  }
@@ -41,10 +41,10 @@ export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_Scop
41
41
  * Az archív (soft-delete-elt) rekordokhoz tartozó data-service (a base override-ja). A
42
42
  * `DyNTS_DataService.deleteData` ezen át archiválja a felülírt aktív rekordokat (history).
43
43
  */
44
- override getArchiveDataService(): DyNTS_ArchiveDataService<DyNTS_ScopedConfig_DataModel> {
45
- return new DyNTS_ArchiveDataService<DyNTS_ScopedConfig_DataModel>(
44
+ override getArchiveDataService(): DyNTS_ArchiveDataService<DyNTS_ScopedConfig> {
45
+ return new DyNTS_ArchiveDataService<DyNTS_ScopedConfig>(
46
46
  this.data,
47
- dyNTS_scopedConfig_dataParams,
47
+ DyNTS_scopedConfig_dataParams,
48
48
  this.issuer,
49
49
  );
50
50
  }
@@ -53,14 +53,14 @@ export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_Scop
53
53
  * Egy adott feloldási-kulcson (`level`+`tableScope`+`scopeId`+`key`) az AKTÍV (nem soft-delete-elt)
54
54
  * rekord. Az aktív rekordon a `_deleted` Date soft-delete marker nincs beállítva.
55
55
  */
56
- async findActive(filter: DyFM_DBFilter<DyNTS_ScopedConfig_DataModel>): Promise<DyNTS_ScopedConfig_DataModel> {
56
+ async findActive(filter: DyFM_DBFilter<DyNTS_ScopedConfig>): Promise<DyNTS_ScopedConfig> {
57
57
  return this.findData(filter, true);
58
58
  }
59
59
 
60
60
  /**
61
61
  * Az adott kontextusra konfigurált ÖSSZES aktív rekord (a `resolveAll` egy Mongo-köre).
62
62
  */
63
- async findActiveList(filter: DyFM_DBFilter<DyNTS_ScopedConfig_DataModel>): Promise<DyNTS_ScopedConfig_DataModel[]> {
63
+ async findActiveList(filter: DyFM_DBFilter<DyNTS_ScopedConfig>): Promise<DyNTS_ScopedConfig[]> {
64
64
  return this.findDataList(filter, true);
65
65
  }
66
66
 
@@ -75,7 +75,7 @@ export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_Scop
75
75
  audit: { setBy?: string, setByDetail?: string, note?: string } = {},
76
76
  ): Promise<void> {
77
77
  await this.updateData({
78
- filterBy: { _id: id } as DyFM_DBFilterSimple<DyNTS_ScopedConfig_DataModel>,
78
+ filterBy: { _id: id },
79
79
  update: {
80
80
  $set: {
81
81
  value: value,
@@ -92,14 +92,17 @@ export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_Scop
92
92
  level: DyNTS_ScopedConfig_Level,
93
93
  key: string,
94
94
  set: { tableScope?: string, scopeId?: string },
95
- ): DyFM_DBFilterSimple<DyNTS_ScopedConfig_DataModel> {
96
- const filter: DyFM_DBFilterSimple<DyNTS_ScopedConfig_DataModel> = { level: level, key: key };
95
+ ): DyFM_DBFilterSimple<DyNTS_ScopedConfig> {
96
+ const filter: DyFM_DBFilterSimple<DyNTS_ScopedConfig> = { level: level, key: key };
97
+
97
98
  if (level === DyNTS_ScopedConfig_Level.table || level === DyNTS_ScopedConfig_Level.scope) {
98
99
  filter.tableScope = set.tableScope;
99
100
  }
101
+
100
102
  if (level === DyNTS_ScopedConfig_Level.scope) {
101
103
  filter.scopeId = set.scopeId;
102
104
  }
105
+
103
106
  return filter;
104
107
  }
105
108
  }
@@ -128,6 +128,23 @@ describe('| DyNTS_GlobalService', () => {
128
128
 
129
129
  expect(result).toBe(authService);
130
130
  });
131
+
132
+ it('| should NOT throw and return undefined when auth_settings.optional is true', () => {
133
+ // Suppress: public / no-auth szerver — a beállítás elnyomja a
134
+ // "Unique Authentication Service missing!" dobást. A flag-et finally-ben
135
+ // visszaállítjuk, hogy a randomizált futásban ne szivárogjon más tesztbe.
136
+ const prev = DyNTS_global_settings.auth_settings?.optional;
137
+ try {
138
+ DyNTS_global_settings.auth_settings = { optional: true };
139
+ let result: DyNTS_AuthService;
140
+ expect(() => {
141
+ result = DyNTS_GlobalService.getAuthService();
142
+ }).not.toThrow();
143
+ expect(result).toBeUndefined();
144
+ } finally {
145
+ DyNTS_global_settings.auth_settings = { optional: prev ?? false };
146
+ }
147
+ });
131
148
  });
132
149
 
133
150
  describe('| getDBServiceCollection', () => {
@@ -212,7 +212,10 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
212
212
  private static async setAuthService(authService?: DyNTS_AuthService): Promise<void> {
213
213
  try {
214
214
  if (!authService) {
215
- DyFM_Log.warn(`Authentication Service missing!`);
215
+ // Opcionális auth-service esetén ez VÁRT (public / no-auth szerver) — nincs warn.
216
+ if (!DyNTS_global_settings.auth_settings?.optional) {
217
+ DyFM_Log.warn(`Authentication Service missing!`);
218
+ }
216
219
  } else {
217
220
  this.instance.authService = authService;
218
221
  }
@@ -300,16 +303,27 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
300
303
  */
301
304
  static getAuthService(): DyNTS_AuthService {
302
305
  if (!this.instance?.authService) {
306
+ // Ha az app explicit opcionálisnak jelölte az auth-service-t
307
+ // (DyNTS_global_settings.auth_settings.optional), NEM dobunk: undefined-ot
308
+ // adunk vissza. A hívók (pl. a request-path issuer-kinyerés) optional-
309
+ // chaining-gel kezelik. Public / no-auth szervereknek — így a
310
+ // "Unique Authentication Service missing!" hiba suppress-elhető beállításból.
311
+ if (DyNTS_global_settings.auth_settings?.optional) {
312
+ return undefined;
313
+ }
314
+
303
315
  throw new Error(
304
- `\n Unique Authentication Service missing!` +
305
- `\n Please create a Unique Authentication Service extending DyNTS_AuthService, ` +
316
+ `\n Unique Authentication Service missing!` +
317
+ `\n Please create a Unique Authentication Service extending DyNTS_AuthService, ` +
306
318
  `\n and Setup with DyNTS_GlobalServiceC.setServices(...)` +
307
319
  '\n (If you set the globalErrorHandler, ' +
308
- 'please check if it is using the same node_modules as the app)',
320
+ 'please check if it is using the same node_modules as the app)' +
321
+ '\n (To run WITHOUT an auth service, set ' +
322
+ 'DyNTS_global_settings.auth_settings.optional = true)',
309
323
  );
310
324
  }
311
325
 
312
- return this.instance.authService;
326
+ return this.instance.authService;
313
327
  }
314
328
 
315
329
  /**
@@ -29,6 +29,7 @@ import {
29
29
  import { DyNTS_defaultFallbackCacheMaxAge } from '../../_collections/default-fallback-cache-max-age.const';
30
30
  import { DyNTS_defaultNotFoundPageHtml } from '../../_collections/default-not-found-page.const';
31
31
  import { DyNTS_global_settings } from '../../_collections/global-settings.const';
32
+ import { startMongoReconnectGuard } from '../../_collections/mongo-reconnect-guard.util';
32
33
  import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
33
34
  import { DyNTS_App_Params } from '../../_models/control-models/app-params.control-model';
34
35
  import {
@@ -985,10 +986,30 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
985
986
  } catch (error) {
986
987
  throw new DyFM_Error({
987
988
  ...this._getDefaultErrorSettings('startDB', error),
988
-
989
+
989
990
  errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-AS0-SDB0`,
990
991
  });
991
992
  }
993
+
994
+ // 2026-06-20 — Mongo reconnect-guard. A MongoDB-driver a hostnevet connect-kor EGYSZER
995
+ // resolválja + cache-eli az IP-t; ha a Mongo-konténert recreate-elik (új docker-network IP),
996
+ // a driver a HALOTT IP-n ragad → ECONNREFUSED + buffering-timeout, és a service magától SOHA
997
+ // nem áll vissza. A guard sustained-disconnect (readyState !== 1) esetén — a driver saját
998
+ // grace-e UTÁN — TELJES disconnect()+connect()-et csinál → ÚJ MongoClient → ÚJ DNS-resolve →
999
+ // új IP → reconnect. Best-effort, always-on, healthy connection-t (===1) SOHA nem bánt; csak
1000
+ // konténer-IP-frissítés, nem ír adatot. Lásd: mongo-reconnect-guard.util.ts.
1001
+ try {
1002
+ startMongoReconnectGuard({
1003
+ getReadyState: (): number => this.mongoose.connection.readyState,
1004
+ reconnect: async (): Promise<void> => {
1005
+ await this.mongoose.disconnect().catch((): void => undefined);
1006
+ await this.mongoose.connect(this._params.dbUri, this._params.dbOptions);
1007
+ },
1008
+ log: (msg: string): void => DyFM_Log.warn(msg),
1009
+ });
1010
+ } catch (guardErr) {
1011
+ DyFM_Log.warn(`[mongo-reconnect-guard] failed to start (non-fatal): ${guardErr instanceof Error ? guardErr.message : String(guardErr)}`);
1012
+ }
992
1013
  }
993
1014
 
994
1015
  /**