@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.
- package/.dynamo/logs/cicd-pipeline/output.log +1746 -1819
- package/.dynamo/logs/cicd-pipeline/status.json +37 -37
- package/.github/workflows/main.yml +432 -426
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +6 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_collections/mongo-reconnect-guard.util.d.ts +74 -0
- package/build/_collections/mongo-reconnect-guard.util.d.ts.map +1 -0
- package/build/_collections/mongo-reconnect-guard.util.js +111 -0
- package/build/_collections/mongo-reconnect-guard.util.js.map +1 -0
- package/build/_models/interfaces/global-settings.interface.d.ts +21 -0
- package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.d.ts.map +1 -1
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js +2 -2
- package/build/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.js.map +1 -1
- package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts +1 -1
- package/build/_modules/ai/_services/ai-embedding-mock.service.d.ts.map +1 -1
- package/build/_modules/ai/_services/ai-embedding-mock.service.js.map +1 -1
- package/build/_modules/ai/_services/ai-embedding-provider.registry.d.ts.map +1 -1
- package/build/_modules/ai/_services/ai-embedding-provider.registry.js.map +1 -1
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts +1 -1
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.d.ts.map +1 -1
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.js +3 -3
- package/build/_modules/ai/_services/lmstudio-embedding.control-service.js.map +1 -1
- package/build/_modules/ai/index.d.ts +2 -0
- package/build/_modules/ai/index.d.ts.map +1 -1
- package/build/_modules/ai/index.js +4 -0
- package/build/_modules/ai/index.js.map +1 -1
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts +17 -17
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.d.ts.map +1 -1
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js +21 -21
- package/build/_modules/data-readers/_collections/dynts-sqlite-reader.util.js.map +1 -1
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts +4 -4
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.d.ts.map +1 -1
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js +5 -5
- package/build/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.js.map +1 -1
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts +4 -4
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.d.ts.map +1 -1
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js +4 -4
- package/build/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.js.map +1 -1
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts +6 -6
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.d.ts.map +1 -1
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js +5 -5
- package/build/_modules/local-vector-search/_services/lvs-vector-persist.data-service.js.map +1 -1
- package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.d.ts +1 -1
- package/build/_modules/mcp/_models/interfaces/dynts-mcp.interface.js +1 -1
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts +4 -4
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.d.ts.map +1 -1
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js +6 -6
- package/build/_modules/mcp/_services/dynts-mcp-server.service-base.js.map +1 -1
- package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts +11 -11
- package/build/_modules/mcp/_services/dynts-mcp.adapter.d.ts.map +1 -1
- package/build/_modules/mcp/_services/dynts-mcp.adapter.js +16 -11
- package/build/_modules/mcp/_services/dynts-mcp.adapter.js.map +1 -1
- package/build/_modules/mcp/index.js +1 -1
- package/build/_modules/mcp/index.js.map +1 -1
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts +3 -3
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.d.ts.map +1 -1
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js +4 -4
- package/build/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.js.map +1 -1
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.d.ts.map +1 -1
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js +9 -0
- package/build/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.js.map +1 -1
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts +3 -3
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.d.ts.map +1 -1
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js +1 -1
- package/build/_modules/scoped-config/_services/dynts-scoped-config.control-service.js.map +1 -1
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts +7 -7
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.d.ts.map +1 -1
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js +2 -2
- package/build/_modules/scoped-config/_services/dynts-scoped-config.data-service.js.map +1 -1
- package/build/_services/core/global.service.d.ts.map +1 -1
- package/build/_services/core/global.service.js +15 -2
- package/build/_services/core/global.service.js.map +1 -1
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +21 -0
- package/build/_services/server/app.server.js.map +1 -1
- package/package.json +1 -1
- package/src/_collections/global-settings.const.ts +7 -0
- package/src/_collections/mongo-reconnect-guard.util.spec.ts +52 -0
- package/src/_collections/mongo-reconnect-guard.util.ts +172 -0
- package/src/_models/interfaces/global-settings.interface.ts +22 -0
- package/src/_modules/ai/_modules/document-ai/_collections/dai-code-chunking.util.ts +39 -7
- package/src/_modules/ai/_services/ai-embedding-mock.service.ts +18 -4
- package/src/_modules/ai/_services/ai-embedding-provider.registry.ts +4 -0
- package/src/_modules/ai/_services/lmstudio-embedding.control-service.ts +26 -5
- package/src/_modules/ai/index.ts +5 -0
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.spec.ts +145 -130
- package/src/_modules/data-readers/_collections/dynts-sqlite-reader.util.ts +131 -120
- package/src/_modules/local-vector-search/_models/data-models/lvs-vector-persist.data-model.ts +6 -5
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.spec.ts +35 -35
- package/src/_modules/local-vector-search/_services/lvs-persistent-vector-pool.control-service.ts +9 -5
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.spec.ts +11 -11
- package/src/_modules/local-vector-search/_services/lvs-vector-persist.data-service.ts +19 -17
- package/src/_modules/mcp/_models/interfaces/dynts-mcp.interface.ts +1 -1
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.spec.ts +123 -114
- package/src/_modules/mcp/_services/dynts-mcp-server.service-base.ts +44 -39
- package/src/_modules/mcp/_services/dynts-mcp.adapter.ts +114 -103
- package/src/_modules/mcp/index.ts +1 -1
- package/src/_modules/scoped-config/_models/data-models/dynts-scoped-config.data-model.ts +5 -4
- package/src/_modules/scoped-config/_models/interfaces/dynts-scoped-config.interface.ts +0 -2
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.spec.ts +19 -13
- package/src/_modules/scoped-config/_services/dynts-scoped-config.control-service.ts +37 -21
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.spec.ts +11 -6
- package/src/_modules/scoped-config/_services/dynts-scoped-config.data-service.ts +17 -14
- package/src/_services/core/global.service.spec.ts +17 -0
- package/src/_services/core/global.service.ts +19 -5
- 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 {
|
|
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:
|
|
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(
|
|
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
|
-
|
|
9
|
-
|
|
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<
|
|
25
|
+
export class DyNTS_ScopedConfig_DataService extends DyNTS_DataService<DyNTS_ScopedConfig> {
|
|
26
26
|
|
|
27
27
|
constructor(
|
|
28
28
|
set: {
|
|
29
|
-
data?:
|
|
29
|
+
data?: DyNTS_ScopedConfig,
|
|
30
30
|
issuer: string,
|
|
31
31
|
},
|
|
32
32
|
) {
|
|
33
33
|
super(
|
|
34
|
-
set.data instanceof
|
|
35
|
-
|
|
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<
|
|
45
|
-
return new DyNTS_ArchiveDataService<
|
|
44
|
+
override getArchiveDataService(): DyNTS_ArchiveDataService<DyNTS_ScopedConfig> {
|
|
45
|
+
return new DyNTS_ArchiveDataService<DyNTS_ScopedConfig>(
|
|
46
46
|
this.data,
|
|
47
|
-
|
|
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<
|
|
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<
|
|
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 }
|
|
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<
|
|
96
|
-
const filter: DyFM_DBFilterSimple<
|
|
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
|
-
|
|
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
|
/**
|