@futdevpro/nts-dynamo 1.15.242 → 1.15.245
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/LICENSE +21 -21
- package/README.md +789 -789
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +5 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_models/interfaces/global-settings.interface.d.ts +19 -0
- package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
- package/build/_modules/privacy-lifecycle/_enums/privacy-rights-decision.type-enum.d.ts +13 -0
- package/build/_modules/privacy-lifecycle/_enums/privacy-rights-decision.type-enum.d.ts.map +1 -0
- package/build/_modules/privacy-lifecycle/_enums/privacy-rights-decision.type-enum.js +18 -0
- package/build/_modules/privacy-lifecycle/_enums/privacy-rights-decision.type-enum.js.map +1 -0
- package/build/_modules/privacy-lifecycle/_models/privacy-rights-execution.interface.d.ts +69 -0
- package/build/_modules/privacy-lifecycle/_models/privacy-rights-execution.interface.d.ts.map +1 -0
- package/build/_modules/privacy-lifecycle/_models/privacy-rights-execution.interface.js +3 -0
- package/build/_modules/privacy-lifecycle/_models/privacy-rights-execution.interface.js.map +1 -0
- package/build/_modules/privacy-lifecycle/index.d.ts +3 -0
- package/build/_modules/privacy-lifecycle/index.d.ts.map +1 -1
- package/build/_modules/privacy-lifecycle/index.js +6 -1
- package/build/_modules/privacy-lifecycle/index.js.map +1 -1
- package/build/_modules/privacy-lifecycle/privacy-rights-execution.mongo-store.d.ts +37 -0
- package/build/_modules/privacy-lifecycle/privacy-rights-execution.mongo-store.d.ts.map +1 -0
- package/build/_modules/privacy-lifecycle/privacy-rights-execution.mongo-store.js +306 -0
- package/build/_modules/privacy-lifecycle/privacy-rights-execution.mongo-store.js.map +1 -0
- package/build/_services/core/memory-guard.service.d.ts +41 -2
- package/build/_services/core/memory-guard.service.d.ts.map +1 -1
- package/build/_services/core/memory-guard.service.js +88 -11
- package/build/_services/core/memory-guard.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_PrivacyRightsExecution_MongoStore = void 0;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const node_util_1 = require("node:util");
|
|
6
|
+
const mongoose_1 = require("mongoose");
|
|
7
|
+
const privacy_rights_decision_type_enum_1 = require("./_enums/privacy-rights-decision.type-enum");
|
|
8
|
+
const privacy_request_type_enum_1 = require("./_enums/privacy-request.type-enum");
|
|
9
|
+
/**
|
|
10
|
+
* Applies confidential rights input exactly once and journals only bounded content-free decisions.
|
|
11
|
+
* Call ensureReady during bootstrap. The caller owns one snapshot/majority transaction covering this store,
|
|
12
|
+
* custody, every domain mutation and every postcondition verification. Product callbacks are trusted composition.
|
|
13
|
+
*/
|
|
14
|
+
class DyNTS_PrivacyRightsExecution_MongoStore {
|
|
15
|
+
settings;
|
|
16
|
+
ownedErrors = new WeakSet();
|
|
17
|
+
isReady = false;
|
|
18
|
+
/** Validates all dependencies without accepting defaults for legal or retention policy. */
|
|
19
|
+
constructor(settings) {
|
|
20
|
+
try {
|
|
21
|
+
if (!settings?.connection || typeof settings.connection.startSession !== 'function'
|
|
22
|
+
|| !settings.custody || typeof settings.custody.withExecutionInput !== 'function'
|
|
23
|
+
|| !this.positive(settings.maxOperationTimeMs, 2_147_483_647)
|
|
24
|
+
|| !this.positive(settings.maxExceptionTimeMs, 31_536_000_000)
|
|
25
|
+
|| typeof settings.rectify !== 'function' || typeof settings.verifyRectification !== 'function'
|
|
26
|
+
|| typeof settings.decidePurpose !== 'function' || typeof settings.verifyPurpose !== 'function') {
|
|
27
|
+
throw new Error();
|
|
28
|
+
}
|
|
29
|
+
this.settings = Object.freeze({ ...settings });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw this.error('SETTINGS_INVALID');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Creates and verifies the strict content-free execution journal before requests are admitted. */
|
|
36
|
+
async ensureReady() {
|
|
37
|
+
if (this.isReady) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
try {
|
|
42
|
+
await this.settings.connection.db.createCollection('dynts_privacy_rights_executions', {
|
|
43
|
+
validator: this.validator(), validationLevel: 'strict', validationAction: 'error',
|
|
44
|
+
maxTimeMS: this.settings.maxOperationTimeMs,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (!(error instanceof mongoose_1.mongo.MongoServerError) || error.code !== 48) {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const information = await this.settings.connection.db.listCollections({ name: 'dynts_privacy_rights_executions' }, { nameOnly: false, maxTimeMS: this.settings.maxOperationTimeMs }).next();
|
|
53
|
+
if (!(0, node_util_1.isDeepStrictEqual)(information?.options?.validator, this.validator())
|
|
54
|
+
|| information?.options?.validationLevel !== 'strict'
|
|
55
|
+
|| information?.options?.validationAction !== 'error') {
|
|
56
|
+
throw this.error('SCHEMA_MIGRATION_REQUIRED');
|
|
57
|
+
}
|
|
58
|
+
await this.collection().createIndex({ requestId: 1, subjectId: 1, organizationId: 1 }, { unique: true, name: 'uq_dynts_rights_execution_authority', maxTimeMS: this.settings.maxOperationTimeMs });
|
|
59
|
+
this.isReady = true;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof Error && this.ownedErrors.has(error)) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
throw this.error('NOT_READY');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Executes once or returns the immutable prior receipt without reapplying any domain mutation. */
|
|
69
|
+
async execute(authorityValue, session) {
|
|
70
|
+
return this.inTransaction(session, async () => {
|
|
71
|
+
const authority = this.authority(authorityValue);
|
|
72
|
+
let receipt;
|
|
73
|
+
await this.settings.custody.withExecutionInput({
|
|
74
|
+
authority: authority,
|
|
75
|
+
task: async (input, custodySession) => {
|
|
76
|
+
if (custodySession !== session) {
|
|
77
|
+
throw this.error('TRANSACTION_MISMATCH');
|
|
78
|
+
}
|
|
79
|
+
const existing = await this.collection().findOne({ _id: this.key(authority) }, this.options(session));
|
|
80
|
+
if (existing) {
|
|
81
|
+
this.assertRecord(existing, authority, input);
|
|
82
|
+
receipt = this.receipt(existing, false);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const completedAt = (await this.databaseTime()).toISOString();
|
|
86
|
+
const record = input.type ===
|
|
87
|
+
privacy_request_type_enum_1.DyNTS_PrivacyRequest_Type.rectification
|
|
88
|
+
? await this.rectificationRecord(authority, input, { completedAt: completedAt, session: session })
|
|
89
|
+
: await this.purposeRecord(authority, input, { completedAt: completedAt, session: session });
|
|
90
|
+
await this.collection().insertOne(record, this.options(session));
|
|
91
|
+
receipt = this.receipt(record, true);
|
|
92
|
+
},
|
|
93
|
+
}, session);
|
|
94
|
+
if (!receipt) {
|
|
95
|
+
throw this.error('EXECUTION_RESULT_MISSING');
|
|
96
|
+
}
|
|
97
|
+
return receipt;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async rectificationRecord(authority, input, set) {
|
|
101
|
+
const decisions = [];
|
|
102
|
+
for (const replacement of input.replacements) {
|
|
103
|
+
const decision = await this.settings.rectify({
|
|
104
|
+
authority: authority, replacement: replacement, session: set.session,
|
|
105
|
+
});
|
|
106
|
+
this.assertRectificationDecision(decision, replacement);
|
|
107
|
+
if (!await this.settings.verifyRectification({
|
|
108
|
+
authority: authority, replacement: replacement, decision: decision, session: set.session,
|
|
109
|
+
})) {
|
|
110
|
+
throw this.error('RECTIFICATION_NOT_VERIFIED');
|
|
111
|
+
}
|
|
112
|
+
decisions.push(Object.freeze({ ...decision }));
|
|
113
|
+
}
|
|
114
|
+
return Object.freeze({
|
|
115
|
+
_id: this.key(authority), contractVersion: 'dynts-privacy-rights-execution-receipt/1', ...authority,
|
|
116
|
+
requestType: input.type, policyVersion: input.policyVersion,
|
|
117
|
+
expectedRequestRevision: input.expectedRequestRevision,
|
|
118
|
+
rectifications: Object.freeze(decisions), purposes: Object.freeze([]), completedAt: set.completedAt,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async purposeRecord(authority, input, set) {
|
|
122
|
+
const decisions = [];
|
|
123
|
+
const now = Date.parse(set.completedAt);
|
|
124
|
+
for (const purposeCode of input.purposeCodes) {
|
|
125
|
+
const decision = await this.settings.decidePurpose({
|
|
126
|
+
authority: authority, requestType: input.type, purposeCode: purposeCode, session: set.session,
|
|
127
|
+
});
|
|
128
|
+
this.assertPurposeDecision(decision, purposeCode, now);
|
|
129
|
+
if (!await this.settings.verifyPurpose({
|
|
130
|
+
authority: authority, requestType: input.type, purposeCode: purposeCode,
|
|
131
|
+
decision: decision, session: set.session,
|
|
132
|
+
})) {
|
|
133
|
+
throw this.error('PURPOSE_DECISION_NOT_VERIFIED');
|
|
134
|
+
}
|
|
135
|
+
decisions.push(Object.freeze({ ...decision }));
|
|
136
|
+
}
|
|
137
|
+
return Object.freeze({
|
|
138
|
+
_id: this.key(authority), contractVersion: 'dynts-privacy-rights-execution-receipt/1', ...authority,
|
|
139
|
+
requestType: input.type, policyVersion: input.policyVersion,
|
|
140
|
+
expectedRequestRevision: input.expectedRequestRevision,
|
|
141
|
+
rectifications: Object.freeze([]), purposes: Object.freeze(decisions), completedAt: set.completedAt,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
assertRectificationDecision(decision, replacement) {
|
|
145
|
+
const updated = decision?.decision === privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsRectificationDecision_Type.updated;
|
|
146
|
+
const declined = decision?.decision === privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsRectificationDecision_Type.correctionRequired
|
|
147
|
+
|| decision?.decision === privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsRectificationDecision_Type.refused;
|
|
148
|
+
if (!this.exactRecord(decision, [
|
|
149
|
+
'fieldCode', 'decision', 'expectedRevision', 'resultingRevision', 'reasonCode',
|
|
150
|
+
]) || decision.fieldCode !== replacement.fieldCode
|
|
151
|
+
|| decision.expectedRevision !== replacement.expectedRevision
|
|
152
|
+
|| !Number.isSafeInteger(decision.resultingRevision) || decision.resultingRevision < 0
|
|
153
|
+
|| (!updated && !declined)
|
|
154
|
+
|| (updated && (decision.resultingRevision <= replacement.expectedRevision || decision.reasonCode !== ''))
|
|
155
|
+
|| (declined && !this.code(decision.reasonCode))) {
|
|
156
|
+
throw this.error('RECTIFICATION_DECISION_INVALID');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
assertPurposeDecision(decision, purposeCode, now) {
|
|
160
|
+
const retained = decision?.decision === privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsPurposeDecision_Type.retainedWithException;
|
|
161
|
+
const stopped = decision?.decision === privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsPurposeDecision_Type.stopped;
|
|
162
|
+
const rejected = decision?.decision === privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsPurposeDecision_Type.rejected;
|
|
163
|
+
const exceptionTime = Date.parse(decision?.exceptionExpiresAt);
|
|
164
|
+
if (!this.exactRecord(decision, [
|
|
165
|
+
'purposeCode', 'decision', 'reasonCode', 'exceptionExpiresAt',
|
|
166
|
+
]) || decision.purposeCode !== purposeCode || (!retained && !stopped && !rejected)
|
|
167
|
+
|| (stopped && (decision.reasonCode !== '' || decision.exceptionExpiresAt !== ''))
|
|
168
|
+
|| (rejected && (!this.code(decision.reasonCode) || decision.exceptionExpiresAt !== ''))
|
|
169
|
+
|| (retained && (!this.code(decision.reasonCode) || !Number.isFinite(exceptionTime)
|
|
170
|
+
|| exceptionTime <= now || exceptionTime > now + this.settings.maxExceptionTimeMs))) {
|
|
171
|
+
throw this.error('PURPOSE_DECISION_INVALID');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
assertRecord(record, authority, input) {
|
|
175
|
+
const expectedRectifications = input.type === privacy_request_type_enum_1.DyNTS_PrivacyRequest_Type.rectification
|
|
176
|
+
? input.replacements.length : 0;
|
|
177
|
+
const expectedPurposes = input.type === privacy_request_type_enum_1.DyNTS_PrivacyRequest_Type.rectification
|
|
178
|
+
? 0 : input.purposeCodes.length;
|
|
179
|
+
if (record._id !== this.key(authority) || record.contractVersion !== 'dynts-privacy-rights-execution-receipt/1'
|
|
180
|
+
|| record.requestId !== authority.requestId || record.subjectId !== authority.subjectId
|
|
181
|
+
|| record.organizationId !== authority.organizationId || record.requestType !== input.type
|
|
182
|
+
|| record.policyVersion !== input.policyVersion
|
|
183
|
+
|| record.expectedRequestRevision !== input.expectedRequestRevision
|
|
184
|
+
|| record.rectifications.length !== expectedRectifications || record.purposes.length !== expectedPurposes
|
|
185
|
+
|| (input.type === privacy_request_type_enum_1.DyNTS_PrivacyRequest_Type.rectification
|
|
186
|
+
&& record.rectifications.some((decision, index) => (decision.fieldCode !== input.replacements[index].fieldCode
|
|
187
|
+
|| decision.expectedRevision !== input.replacements[index].expectedRevision)))
|
|
188
|
+
|| (input.type !== privacy_request_type_enum_1.DyNTS_PrivacyRequest_Type.rectification
|
|
189
|
+
&& record.purposes.some((decision, index) => (decision.purposeCode !== input.purposeCodes[index])))) {
|
|
190
|
+
throw this.error('REPLAY_CONFLICT');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
receipt(record, created) {
|
|
194
|
+
return Object.freeze({
|
|
195
|
+
contractVersion: record.contractVersion, requestId: record.requestId, subjectId: record.subjectId,
|
|
196
|
+
organizationId: record.organizationId, requestType: record.requestType, policyVersion: record.policyVersion,
|
|
197
|
+
expectedRequestRevision: record.expectedRequestRevision,
|
|
198
|
+
rectifications: Object.freeze(record.rectifications.map((entry) => Object.freeze({ ...entry }))),
|
|
199
|
+
purposes: Object.freeze(record.purposes.map((entry) => Object.freeze({ ...entry }))),
|
|
200
|
+
completedAt: record.completedAt, created: created,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
async inTransaction(session, task) {
|
|
204
|
+
const concern = session?.transaction?.options?.readConcern;
|
|
205
|
+
if (!this.isReady || !session?.inTransaction() || session.transaction.options.writeConcern?.w !== 'majority'
|
|
206
|
+
|| (typeof concern === 'string' ? concern : concern?.level) !== 'snapshot') {
|
|
207
|
+
throw this.error('OWNING_TRANSACTION_REQUIRED');
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
await this.collection().findOne({ _id: '' }, this.options(session));
|
|
211
|
+
return await task();
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (error instanceof mongoose_1.mongo.MongoError && error.hasErrorLabel('TransientTransactionError')) {
|
|
215
|
+
const retryable = new mongoose_1.mongo.MongoError('DyNTS|PRIVACY_RIGHTS_EXECUTION|TRANSACTION_FAILED');
|
|
216
|
+
retryable.addErrorLabel('TransientTransactionError');
|
|
217
|
+
throw retryable;
|
|
218
|
+
}
|
|
219
|
+
if (error instanceof Error && this.ownedErrors.has(error)) {
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
throw this.error('EXECUTION_FAILED');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
authority(value) {
|
|
226
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
227
|
+
const requestId = descriptors.requestId?.value;
|
|
228
|
+
const subjectId = descriptors.subjectId?.value;
|
|
229
|
+
const organizationId = descriptors.organizationId?.value;
|
|
230
|
+
if (Reflect.ownKeys(value).length !== 3 || !this.code(requestId)
|
|
231
|
+
|| !this.code(subjectId) || !this.code(organizationId)) {
|
|
232
|
+
throw this.error('AUTHORITY_INVALID');
|
|
233
|
+
}
|
|
234
|
+
return Object.freeze({ requestId: requestId, subjectId: subjectId, organizationId: organizationId });
|
|
235
|
+
}
|
|
236
|
+
async databaseTime() {
|
|
237
|
+
const result = await this.settings.connection.db.command({ hello: 1, maxTimeMS: this.settings.maxOperationTimeMs }, { timeoutMS: this.settings.maxOperationTimeMs });
|
|
238
|
+
const now = result.localTime;
|
|
239
|
+
if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
|
|
240
|
+
throw this.error('CLOCK_UNAVAILABLE');
|
|
241
|
+
}
|
|
242
|
+
return now;
|
|
243
|
+
}
|
|
244
|
+
key(authority) {
|
|
245
|
+
return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify([
|
|
246
|
+
'dynts-privacy-rights-execution-receipt/1', authority.requestId, authority.subjectId, authority.organizationId,
|
|
247
|
+
])).digest('hex');
|
|
248
|
+
}
|
|
249
|
+
positive(value, maximum) {
|
|
250
|
+
return Number.isSafeInteger(value) && Number(value) > 0 && Number(value) <= maximum;
|
|
251
|
+
}
|
|
252
|
+
code(value) {
|
|
253
|
+
return typeof value === 'string' && /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/u.test(value);
|
|
254
|
+
}
|
|
255
|
+
exactRecord(value, expectedKeys) {
|
|
256
|
+
if (typeof value !== 'object' || value === null) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
const keys = Reflect.ownKeys(value);
|
|
260
|
+
return keys.length === expectedKeys.length && expectedKeys.every((key) => {
|
|
261
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
262
|
+
return !!descriptor && 'value' in descriptor;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
options(session) {
|
|
266
|
+
return { session: session, maxTimeMS: this.settings.maxOperationTimeMs };
|
|
267
|
+
}
|
|
268
|
+
collection() {
|
|
269
|
+
return this.settings.connection.db.collection('dynts_privacy_rights_executions');
|
|
270
|
+
}
|
|
271
|
+
error(code) {
|
|
272
|
+
const error = new Error(`DyNTS|PRIVACY_RIGHTS_EXECUTION|${code}`);
|
|
273
|
+
this.ownedErrors.add(error);
|
|
274
|
+
return error;
|
|
275
|
+
}
|
|
276
|
+
validator() {
|
|
277
|
+
const code = { bsonType: 'string', pattern: '^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$' };
|
|
278
|
+
const rectification = { bsonType: 'object', additionalProperties: false,
|
|
279
|
+
required: ['fieldCode', 'decision', 'expectedRevision', 'resultingRevision', 'reasonCode'],
|
|
280
|
+
properties: { fieldCode: code, decision: { enum: Object.values(privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsRectificationDecision_Type) },
|
|
281
|
+
expectedRevision: { bsonType: ['int', 'long', 'double'], minimum: 0, maximum: Number.MAX_SAFE_INTEGER },
|
|
282
|
+
resultingRevision: { bsonType: ['int', 'long', 'double'], minimum: 0, maximum: Number.MAX_SAFE_INTEGER },
|
|
283
|
+
reasonCode: { bsonType: 'string', maxLength: 128 } } };
|
|
284
|
+
const purpose = { bsonType: 'object', additionalProperties: false,
|
|
285
|
+
required: ['purposeCode', 'decision', 'reasonCode', 'exceptionExpiresAt'],
|
|
286
|
+
properties: { purposeCode: code, decision: { enum: Object.values(privacy_rights_decision_type_enum_1.DyNTS_PrivacyRightsPurposeDecision_Type) },
|
|
287
|
+
reasonCode: { bsonType: 'string', maxLength: 128 },
|
|
288
|
+
exceptionExpiresAt: { bsonType: 'string', maxLength: 24 } } };
|
|
289
|
+
const properties = {
|
|
290
|
+
_id: { bsonType: 'string', pattern: '^[a-f0-9]{64}$' },
|
|
291
|
+
contractVersion: { enum: ['dynts-privacy-rights-execution-receipt/1'] },
|
|
292
|
+
requestId: code, subjectId: code, organizationId: code,
|
|
293
|
+
requestType: { enum: ['rectification', 'restriction', 'objection'] }, policyVersion: code,
|
|
294
|
+
expectedRequestRevision: {
|
|
295
|
+
bsonType: ['int', 'long', 'double'], minimum: 0, maximum: Number.MAX_SAFE_INTEGER,
|
|
296
|
+
},
|
|
297
|
+
rectifications: { bsonType: 'array', maxItems: 64, uniqueItems: true, items: rectification },
|
|
298
|
+
purposes: { bsonType: 'array', maxItems: 64, uniqueItems: true, items: purpose },
|
|
299
|
+
completedAt: { bsonType: 'string', maxLength: 24 },
|
|
300
|
+
};
|
|
301
|
+
return { $jsonSchema: { bsonType: 'object', additionalProperties: false,
|
|
302
|
+
required: Object.keys(properties), properties: properties } };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.DyNTS_PrivacyRightsExecution_MongoStore = DyNTS_PrivacyRightsExecution_MongoStore;
|
|
306
|
+
//# sourceMappingURL=privacy-rights-execution.mongo-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-rights-execution.mongo-store.js","sourceRoot":"","sources":["../../../src/_modules/privacy-lifecycle/privacy-rights-execution.mongo-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,10 +39,21 @@ export interface DyNTS_MemoryGuard_Event {
|
|
|
39
39
|
rssMb: number;
|
|
40
40
|
/** External (C++ / Buffer) memória MB-ban. */
|
|
41
41
|
externalMb: number;
|
|
42
|
+
/**
|
|
43
|
+
* RSS a FIZIKAI RAM (`os.totalmem()`) százalékában (egészre kerekítve) — BFR-AM-016.
|
|
44
|
+
* Akkor is kitöltjük, ha az RSS-küszöb ki van kapcsolva: a `heapPct` mellett ez mutatja meg, hogy a
|
|
45
|
+
* folyamat memóriája a JS-heapen KÍVÜL (TypedArray/Buffer) mekkora — enélkül egy Float32-poolos app
|
|
46
|
+
* 1 %-os heapet mutat 6 GB-os lábnyom mellett.
|
|
47
|
+
*/
|
|
48
|
+
rssPct: number;
|
|
42
49
|
/** A közelmúlt GC-hányada (GC-ben töltött idő / poll-ablak; 0..1) — a mark-compact-thrash / OOM-precursor jelzője. */
|
|
43
50
|
gcFraction: number;
|
|
44
|
-
/**
|
|
45
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Mi váltotta ki az esemény-szintet. A jelek FIX sorrendben fűződnek össze (`heap` → `gc` → `rss`), így a
|
|
53
|
+
* korábbi `'heap'` / `'gc'` / `'heap+gc'` értékek bájtra VÁLTOZATLANOK maradnak; az `rss`-es kombinációk
|
|
54
|
+
* a BFR-AM-016-tal jöttek be (a heap-% vak a TypedArray-poolra).
|
|
55
|
+
*/
|
|
56
|
+
trigger: 'heap' | 'gc' | 'rss' | 'heap+gc' | 'heap+rss' | 'gc+rss' | 'heap+gc+rss' | 'recovery';
|
|
46
57
|
/** Esemény időbélyege (ISO). */
|
|
47
58
|
at: string;
|
|
48
59
|
}
|
|
@@ -58,6 +69,10 @@ export interface DyNTS_MemoryGuard_Config {
|
|
|
58
69
|
recoveryMargin?: number;
|
|
59
70
|
/** Megőrzött események max száma (ring-buffer). Default: 100. */
|
|
60
71
|
maxHistoryCount?: number;
|
|
72
|
+
/** RSS warning-küszöb a fizikai RAM %-ában (BFR-AM-016). `0` = kikapcsolva. Default: a global-settings értéke. */
|
|
73
|
+
rssWarningThresholdPct?: number;
|
|
74
|
+
/** RSS critical-küszöb a fizikai RAM %-ában (BFR-AM-016). `0` = kikapcsolva. Default: a global-settings értéke. */
|
|
75
|
+
rssCriticalThresholdPct?: number;
|
|
61
76
|
/** GC-hányad-küszöb a `warning`-hoz (0..1). Default: 0.40. */
|
|
62
77
|
gcWarningFraction?: number;
|
|
63
78
|
/** GC-hányad-küszöb a `critical`-hoz (0..1). Default: 0.60. */
|
|
@@ -98,6 +113,9 @@ export declare class DyNTS_MemoryGuard extends DyNTS_SingletonServiceBase {
|
|
|
98
113
|
private readonly history;
|
|
99
114
|
private peakHeapPct;
|
|
100
115
|
private peakRssMb;
|
|
116
|
+
/** RSS-küszöbök a fizikai RAM %-ában (BFR-AM-016). `0` = az ág nem szól bele a döntésbe. */
|
|
117
|
+
private rssWarnPct;
|
|
118
|
+
private rssCritPct;
|
|
101
119
|
private gcObserver;
|
|
102
120
|
private gcEvents;
|
|
103
121
|
private criticalStreak;
|
|
@@ -130,7 +148,28 @@ export declare class DyNTS_MemoryGuard extends DyNTS_SingletonServiceBase {
|
|
|
130
148
|
heapPct: number;
|
|
131
149
|
rssMb: number;
|
|
132
150
|
gcFraction: number;
|
|
151
|
+
/** RSS a fizikai RAM %-ában (BFR-AM-016) — mindig kitöltve, akkor is, ha az RSS-küszöb kikapcsolt. */
|
|
152
|
+
rssPct: number;
|
|
153
|
+
/**
|
|
154
|
+
* External (ArrayBuffer/Buffer) memória MB-ban (BFR-AM-016). **Eddig csak az ESEMÉNYBEN volt benne, a
|
|
155
|
+
* `pressure()`-ben nem** — így a fogyasztó (pl. egy health-endpoint) kénytelen volt újra mérni a saját
|
|
156
|
+
* `process.memoryUsage()`-ével. TypedArray-nehéz appnál ez a mező mondja meg, hol van valójában a memória.
|
|
157
|
+
*/
|
|
158
|
+
externalMb: number;
|
|
133
159
|
};
|
|
160
|
+
/**
|
|
161
|
+
* RSS a fizikai RAM (`os.totalmem()`) százalékában, egészre kerekítve (BFR-AM-016).
|
|
162
|
+
* Értelmezhetetlen `totalmem`/`rss` → **0**: a hívó küszöb-logikája a 0-val NEM riaszt, ami a helyes
|
|
163
|
+
* default — egy hibás mérés SOHA ne váltson ki graceful-exitet.
|
|
164
|
+
*/
|
|
165
|
+
private static rssPctOfPhysical;
|
|
166
|
+
/**
|
|
167
|
+
* A fizikai RAM byte-ban. **Külön metódus a spec-mockoláshoz** — ugyanaz a seam-minta, mint a
|
|
168
|
+
* `getHeapLimitBytes()`-nál. (Az `os.totalmem` újabb Node-okon nem írható/spy-olható közvetlenül.)
|
|
169
|
+
*/
|
|
170
|
+
private static getPhysicalMemoryBytes;
|
|
171
|
+
/** Küszöb-normalizálás: nem-szám / negatív / 100 feletti → `0` (= az ág kikapcsolva). */
|
|
172
|
+
private static normalizePct;
|
|
134
173
|
/** `true`, ha a NEHÉZ műveleteket le kell shed-elni (critical nyomás) — a fogyasztó load-shed gate-jének. */
|
|
135
174
|
shouldShedLoad(): boolean;
|
|
136
175
|
/** A GC-hányad az utolsó `pollIntervalMs` ablakban (GC-ms / ablak-ms; clamp [0..1]). Nincs GC-observer → 0. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-guard.service.d.ts","sourceRoot":"","sources":["../../../src/_services/core/memory-guard.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-guard.service.d.ts","sourceRoot":"","sources":["../../../src/_services/core/memory-guard.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DyNTS_MemoryGuard = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
const os = tslib_1.__importStar(require("os"));
|
|
5
6
|
const v8 = tslib_1.__importStar(require("v8"));
|
|
6
7
|
const perf_hooks_1 = require("perf_hooks");
|
|
7
8
|
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
@@ -34,6 +35,9 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
34
35
|
history = [];
|
|
35
36
|
peakHeapPct = 0;
|
|
36
37
|
peakRssMb = 0;
|
|
38
|
+
/** RSS-küszöbök a fizikai RAM %-ában (BFR-AM-016). `0` = az ág nem szól bele a döntésbe. */
|
|
39
|
+
rssWarnPct = 0;
|
|
40
|
+
rssCritPct = 0;
|
|
37
41
|
// GC-thrash követés (perf_hooks 'gc') — a GC-ben töltött ms gördülő ablaka + a critical-streak számláló.
|
|
38
42
|
gcObserver = null;
|
|
39
43
|
gcEvents = [];
|
|
@@ -62,6 +66,10 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
62
66
|
this.maxHistoryCount = config?.maxHistoryCount ?? g.maxHistoryCount ?? 100;
|
|
63
67
|
this.gcWarnFraction = config?.gcWarningFraction ?? g.gcWarningFraction ?? 0.40;
|
|
64
68
|
this.gcCritFraction = config?.gcCriticalFraction ?? g.gcCriticalFraction ?? 0.60;
|
|
69
|
+
// BFR-AM-016 — RSS-ág. Default 0 (kikapcsolva): gép-függő küszöb, és a meglévő appok viselkedése
|
|
70
|
+
// maradjon bitre változatlan. A negatív/nem-szám érték is 0-ra esik (= kikapcsolva).
|
|
71
|
+
this.rssWarnPct = DyNTS_MemoryGuard.normalizePct(config?.rssWarningThresholdPct ?? g.rssWarningThresholdPct);
|
|
72
|
+
this.rssCritPct = DyNTS_MemoryGuard.normalizePct(config?.rssCriticalThresholdPct ?? g.rssCriticalThresholdPct);
|
|
65
73
|
this.isCriticalExitEnabled = config?.exitOnSustainedCritical ?? g.exitOnSustainedCritical ?? false;
|
|
66
74
|
this.sustainedCriticalPolls = config?.sustainedCriticalPolls ?? g.sustainedCriticalPolls ?? 3;
|
|
67
75
|
this.exitCode = config?.exitCode ?? g.exitCode ?? 137;
|
|
@@ -86,6 +94,9 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
86
94
|
`warn ${this.warnPct}%/${Math.round(this.gcWarnFraction * 100)}%GC, ` +
|
|
87
95
|
`crit ${this.critPct}%/${Math.round(this.gcCritFraction * 100)}%GC (heap limit ` +
|
|
88
96
|
`${Math.round(this.getHeapLimitBytes() / BYTES_PER_MB)}MB)` +
|
|
97
|
+
(this.rssWarnPct > 0 || this.rssCritPct > 0
|
|
98
|
+
? `, RSS warn ${this.rssWarnPct}%/crit ${this.rssCritPct}% of ${Math.round(os.totalmem() / BYTES_PER_MB)}MB physical`
|
|
99
|
+
: '') +
|
|
89
100
|
(this.isCriticalExitEnabled ? `, graceful-exit@${this.sustainedCriticalPolls} critical polls (boot-grace ${this.bootGraceMs}ms)` : ''));
|
|
90
101
|
}
|
|
91
102
|
catch (err) {
|
|
@@ -118,21 +129,30 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
118
129
|
if (rssMb > this.peakRssMb) {
|
|
119
130
|
this.peakRssMb = rssMb;
|
|
120
131
|
}
|
|
121
|
-
// A szintet a heap-% ÉS a GC-hányad közül a ROSSZABB dönti el (a GC-thrash a %-küszöb ALATT
|
|
132
|
+
// A szintet a heap-% ÉS a GC-hányad ÉS az RSS-% közül a ROSSZABB dönti el (a GC-thrash a %-küszöb ALATT
|
|
133
|
+
// is OOM-ot jelez; az RSS-ág pedig a heapen KÍVÜLI memóriát fogja meg — BFR-AM-016).
|
|
134
|
+
const rssPct = DyNTS_MemoryGuard.rssPctOfPhysical(mu.rss);
|
|
122
135
|
const heapCrit = pct >= this.critPct;
|
|
123
136
|
const gcCrit = gcFraction >= this.gcCritFraction;
|
|
137
|
+
// A KIKAPCSOLT (0) küszöb sosem riaszt — enélkül minden app azonnal `critical`-be esne (0 >= 0).
|
|
138
|
+
const rssCrit = this.rssCritPct > 0 && rssPct >= this.rssCritPct;
|
|
124
139
|
const heapWarn = pct >= this.warnPct;
|
|
125
140
|
const gcWarn = gcFraction >= this.gcWarnFraction;
|
|
141
|
+
const rssWarn = this.rssWarnPct > 0 && rssPct >= this.rssWarnPct;
|
|
126
142
|
// Hiszterézis-állapotgép — esemény CSAK állapot-váltáskor.
|
|
127
143
|
const prev = this.state;
|
|
128
144
|
let next = prev;
|
|
129
|
-
if (heapCrit || gcCrit) {
|
|
145
|
+
if (heapCrit || gcCrit || rssCrit) {
|
|
130
146
|
next = 'critical';
|
|
131
147
|
}
|
|
132
|
-
else if ((heapWarn || gcWarn) && prev === 'normal') {
|
|
148
|
+
else if ((heapWarn || gcWarn || rssWarn) && prev === 'normal') {
|
|
133
149
|
next = 'warning';
|
|
134
150
|
}
|
|
135
|
-
else if (pct <= this.warnPct - this.recoveryMargin
|
|
151
|
+
else if (pct <= this.warnPct - this.recoveryMargin
|
|
152
|
+
&& gcFraction < this.gcWarnFraction
|
|
153
|
+
// A helyreállás MINDHÁROM ágon teljesüljön — különben egy tartósan magas RSS mellett a guard
|
|
154
|
+
// `recovered`-et jelentene, és a következő valódi nyomás ismét `warning`-ot emitálna (esemény-pingpong).
|
|
155
|
+
&& (this.rssWarnPct <= 0 || rssPct <= this.rssWarnPct - this.recoveryMargin)) {
|
|
136
156
|
next = 'normal';
|
|
137
157
|
}
|
|
138
158
|
// Egyébként marad a jelenlegi állapot (hiszterézis-sáv) — nincs re-emit.
|
|
@@ -154,9 +174,22 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
154
174
|
return;
|
|
155
175
|
}
|
|
156
176
|
this.state = next;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
177
|
+
// A kiváltó jelek FIX sorrendben (`heap` → `gc` → `rss`). A korábbi 'heap' / 'gc' / 'heap+gc' értékek
|
|
178
|
+
// így bájtra változatlanok maradnak; üres halmaz (elvileg nem fordulhat elő nem-normal ágon) → 'heap',
|
|
179
|
+
// hogy a mező sose legyen üres string (`core-error-debuggable`).
|
|
180
|
+
const signals = [];
|
|
181
|
+
if (heapCrit || heapWarn) {
|
|
182
|
+
signals.push('heap');
|
|
183
|
+
}
|
|
184
|
+
if (gcCrit || gcWarn) {
|
|
185
|
+
signals.push('gc');
|
|
186
|
+
}
|
|
187
|
+
if (rssCrit || rssWarn) {
|
|
188
|
+
signals.push('rss');
|
|
189
|
+
}
|
|
190
|
+
const trigger = next === 'normal'
|
|
191
|
+
? 'recovery'
|
|
192
|
+
: (signals.join('+') || 'heap');
|
|
160
193
|
const event = {
|
|
161
194
|
level: next === 'normal' ? 'recovered' : next,
|
|
162
195
|
heapUsedMb: Math.round(mu.heapUsed / BYTES_PER_MB),
|
|
@@ -164,6 +197,7 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
164
197
|
heapPct: Math.round(pct),
|
|
165
198
|
rssMb: Math.round(rssMb),
|
|
166
199
|
externalMb: Math.round((mu.external ?? 0) / BYTES_PER_MB),
|
|
200
|
+
rssPct: rssPct,
|
|
167
201
|
gcFraction: Math.round(gcFraction * 100) / 100,
|
|
168
202
|
trigger: trigger,
|
|
169
203
|
at: new Date().toISOString(),
|
|
@@ -181,7 +215,10 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
181
215
|
while (this.history.length > this.maxHistoryCount) {
|
|
182
216
|
this.history.shift();
|
|
183
217
|
}
|
|
184
|
-
|
|
218
|
+
// Az RSS-% CSAK akkor kerül a szövegbe, ha az ág aktív — különben a meglévő appok log-sorai
|
|
219
|
+
// bájtra változatlanok maradnak (a log-illesztő monitorok ne törjenek el egy opt-in feature-től).
|
|
220
|
+
const rssSuffix = (this.rssWarnPct > 0 || this.rssCritPct > 0) ? ` (${event.rssPct}% of physical)` : '';
|
|
221
|
+
const summary = `heap ${event.heapPct}% (${event.heapUsedMb}/${event.heapLimitMb}MB), rss ${event.rssMb}MB${rssSuffix}, ` +
|
|
185
222
|
`GC ${Math.round(event.gcFraction * 100)}% [${event.trigger}]`;
|
|
186
223
|
if (event.level === 'recovered') {
|
|
187
224
|
fsm_dynamo_1.DyFM_Log.success(`[DyNTS_MemoryGuard] RECOVERED — ${summary}`);
|
|
@@ -225,17 +262,50 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
225
262
|
const mu = process.memoryUsage();
|
|
226
263
|
const pct = limitBytes > 0 ? (mu.heapUsed / limitBytes) * 100 : 0;
|
|
227
264
|
const gcFraction = this.recentGcFraction();
|
|
228
|
-
const
|
|
229
|
-
|
|
265
|
+
const rssPct = DyNTS_MemoryGuard.rssPctOfPhysical(mu.rss);
|
|
266
|
+
// Ugyanaz a „rosszabb ág dönt" szabály, mint a `poll()`-ban — a kettő NEM térhet el, különben a
|
|
267
|
+
// load-shed (`shouldShedLoad`) mást gondolna a nyomásról, mint a riasztás.
|
|
268
|
+
const level = (pct >= this.critPct || gcFraction >= this.gcCritFraction || (this.rssCritPct > 0 && rssPct >= this.rssCritPct))
|
|
269
|
+
? 'critical'
|
|
270
|
+
: (pct >= this.warnPct || gcFraction >= this.gcWarnFraction || (this.rssWarnPct > 0 && rssPct >= this.rssWarnPct))
|
|
271
|
+
? 'warning' : 'ok';
|
|
230
272
|
return {
|
|
231
273
|
level: level,
|
|
232
274
|
heapUsedMb: Math.round(mu.heapUsed / BYTES_PER_MB),
|
|
233
275
|
heapLimitMb: Math.round(limitBytes / BYTES_PER_MB),
|
|
234
276
|
heapPct: Math.round(pct),
|
|
235
277
|
rssMb: Math.round(mu.rss / BYTES_PER_MB),
|
|
278
|
+
rssPct: rssPct,
|
|
279
|
+
externalMb: Math.round((mu.external ?? 0) / BYTES_PER_MB),
|
|
236
280
|
gcFraction: Math.round(gcFraction * 100) / 100,
|
|
237
281
|
};
|
|
238
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* RSS a fizikai RAM (`os.totalmem()`) százalékában, egészre kerekítve (BFR-AM-016).
|
|
285
|
+
* Értelmezhetetlen `totalmem`/`rss` → **0**: a hívó küszöb-logikája a 0-val NEM riaszt, ami a helyes
|
|
286
|
+
* default — egy hibás mérés SOHA ne váltson ki graceful-exitet.
|
|
287
|
+
*/
|
|
288
|
+
static rssPctOfPhysical(rssBytes) {
|
|
289
|
+
const total = DyNTS_MemoryGuard.getPhysicalMemoryBytes();
|
|
290
|
+
if (!Number.isFinite(total) || total <= 0 || !Number.isFinite(rssBytes) || rssBytes <= 0) {
|
|
291
|
+
return 0;
|
|
292
|
+
}
|
|
293
|
+
return Math.round((rssBytes / total) * 100);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* A fizikai RAM byte-ban. **Külön metódus a spec-mockoláshoz** — ugyanaz a seam-minta, mint a
|
|
297
|
+
* `getHeapLimitBytes()`-nál. (Az `os.totalmem` újabb Node-okon nem írható/spy-olható közvetlenül.)
|
|
298
|
+
*/
|
|
299
|
+
static getPhysicalMemoryBytes() {
|
|
300
|
+
return os.totalmem();
|
|
301
|
+
}
|
|
302
|
+
/** Küszöb-normalizálás: nem-szám / negatív / 100 feletti → `0` (= az ág kikapcsolva). */
|
|
303
|
+
static normalizePct(value) {
|
|
304
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || value > 100) {
|
|
305
|
+
return 0;
|
|
306
|
+
}
|
|
307
|
+
return Math.floor(value);
|
|
308
|
+
}
|
|
239
309
|
/** `true`, ha a NEHÉZ műveleteket le kell shed-elni (critical nyomás) — a fogyasztó load-shed gate-jének. */
|
|
240
310
|
shouldShedLoad() {
|
|
241
311
|
return this.isInstallationActive && this.pressure().level === 'critical';
|
|
@@ -301,8 +371,15 @@ class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceB
|
|
|
301
371
|
}
|
|
302
372
|
/** Tartós-critical graceful-exit: végső error-entry + tiszta exit (a wrapper újraindít a kriptikus 134 helyett). */
|
|
303
373
|
gracefulExit(set) {
|
|
374
|
+
// BFR-AM-016: ha az RSS-ág aktív, a kilépés OKA lehet a heapen KÍVÜLI memória — ilyenkor egy heap-only
|
|
375
|
+
// üzenet („graceful exit, heap 1%") értelmezhetetlen lenne az üzemeltetőnek. A memória-tényt tehát MINDIG
|
|
376
|
+
// odaírjuk, amikor az ág be van kapcsolva (`core-error-debuggable`).
|
|
377
|
+
const rssPct = DyNTS_MemoryGuard.rssPctOfPhysical(set.mu.rss);
|
|
378
|
+
const rssPart = (this.rssWarnPct > 0 || this.rssCritPct > 0)
|
|
379
|
+
? `, rss ${Math.round(set.mu.rss / BYTES_PER_MB)}MB (${rssPct}% of physical, crit ${this.rssCritPct}%)`
|
|
380
|
+
: '';
|
|
304
381
|
const summary = `heap ${Math.round(set.pct)}% (${Math.round(set.mu.heapUsed / BYTES_PER_MB)}/` +
|
|
305
|
-
`${Math.round(set.limitBytes / BYTES_PER_MB)}MB), GC ${Math.round(set.gcFraction * 100)}%`;
|
|
382
|
+
`${Math.round(set.limitBytes / BYTES_PER_MB)}MB)${rssPart}, GC ${Math.round(set.gcFraction * 100)}%`;
|
|
306
383
|
fsm_dynamo_1.DyFM_Log.H_error(`[DyNTS_MemoryGuard] SUSTAINED CRITICAL — ${summary} — graceful exit(${this.exitCode}) a kriptikus OOM (exit 134) helyett.`);
|
|
307
384
|
try {
|
|
308
385
|
global_service_1.DyNTS_GlobalService.globalErrorHandler?.(new fsm_dynamo_1.DyFM_Error({
|