@serve.zone/dcrouter 18.1.0 → 18.2.0
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/deno.json +1 -1
- package/dist_serve/bundle.js +2072 -1624
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +64 -2
- package/dist_ts/classes.dcrouter.js +187 -6
- package/dist_ts/db/documents/classes.authentication-event.doc.d.ts +25 -0
- package/dist_ts/db/documents/classes.authentication-event.doc.js +273 -0
- package/dist_ts/db/documents/classes.email-traffic-bucket.doc.d.ts +25 -0
- package/dist_ts/db/documents/classes.email-traffic-bucket.doc.js +200 -0
- package/dist_ts/db/documents/index.d.ts +2 -0
- package/dist_ts/db/documents/index.js +3 -1
- package/dist_ts/email/classes.accepted-email-spool.d.ts +67 -0
- package/dist_ts/email/classes.accepted-email-spool.js +245 -17
- package/dist_ts/email/classes.workapp-mail-manager.js +5 -2
- package/dist_ts/monitoring/classes.metricsmanager.d.ts +19 -0
- package/dist_ts/monitoring/classes.metricsmanager.js +240 -44
- package/dist_ts/opsserver/handlers/admin.handler.d.ts +1 -0
- package/dist_ts/opsserver/handlers/admin.handler.js +61 -14
- package/dist_ts/opsserver/handlers/security.handler.js +21 -3
- package/dist_ts/opsserver/handlers/stats.handler.js +27 -10
- package/dist_ts/security/classes.authentication-event-manager.d.ts +35 -0
- package/dist_ts/security/classes.authentication-event-manager.js +185 -0
- package/dist_ts/security/index.d.ts +1 -0
- package/dist_ts/security/index.js +2 -1
- package/dist_ts_interfaces/data/stats.d.ts +16 -0
- package/dist_ts_migrations/index.js +74 -15
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/overview/ops-view-overview.js +3 -2
- package/dist_ts_web/elements/security/ops-view-security-authentication.js +20 -13
- package/dist_ts_web/elements/security/ops-view-security-overview.js +8 -11
- package/package.json +3 -3
- package/readme.md +24 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +230 -6
- package/ts/db/documents/classes.authentication-event.doc.ts +248 -0
- package/ts/db/documents/classes.email-traffic-bucket.doc.ts +161 -0
- package/ts/db/documents/index.ts +2 -0
- package/ts/email/classes.accepted-email-spool.ts +319 -21
- package/ts/email/classes.workapp-mail-manager.ts +4 -1
- package/ts/monitoring/classes.metricsmanager.ts +287 -50
- package/ts/opsserver/handlers/admin.handler.ts +74 -15
- package/ts/opsserver/handlers/security.handler.ts +23 -2
- package/ts/opsserver/handlers/stats.handler.ts +29 -9
- package/ts/security/classes.authentication-event-manager.ts +221 -0
- package/ts/security/index.ts +1 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/overview/ops-view-overview.ts +2 -1
- package/ts_web/elements/security/ops-view-security-authentication.ts +20 -13
- package/ts_web/elements/security/ops-view-security-overview.ts +7 -12
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { IAuthenticationEvent, TAuthenticationFailureReason, TAuthenticationSource, TResolvedAuthenticationSource } from '../../../dist_ts_interfaces/data/stats.js';
|
|
3
|
+
export declare class AuthenticationEventDoc extends plugins.smartdata.SmartDataDbDoc<AuthenticationEventDoc, AuthenticationEventDoc> implements IAuthenticationEvent {
|
|
4
|
+
id: string;
|
|
5
|
+
timestamp: number;
|
|
6
|
+
username: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
success: boolean;
|
|
9
|
+
requestedAuthSource: TAuthenticationSource;
|
|
10
|
+
resolvedAuthSource?: TResolvedAuthenticationSource;
|
|
11
|
+
failureReason?: TAuthenticationFailureReason;
|
|
12
|
+
constructor();
|
|
13
|
+
toApiObject(): IAuthenticationEvent;
|
|
14
|
+
private static getNativeCollection;
|
|
15
|
+
private static toPersistedFields;
|
|
16
|
+
private static validateEvent;
|
|
17
|
+
static upsertMany(eventsArg: IAuthenticationEvent[]): Promise<void>;
|
|
18
|
+
static getWindowSummary(cutoffArg: number, limitArg?: number): Promise<{
|
|
19
|
+
successes: number;
|
|
20
|
+
failures: number;
|
|
21
|
+
events: IAuthenticationEvent[];
|
|
22
|
+
}>;
|
|
23
|
+
static findExistingIds(idsArg: string[]): Promise<Set<string>>;
|
|
24
|
+
static pruneBefore(cutoffArg: number): Promise<number>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import * as plugins from '../../plugins.js';
|
|
36
|
+
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
|
+
const DB_OPERATION_TIMEOUT_MS = 5_000;
|
|
38
|
+
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
39
|
+
let AuthenticationEventDoc = (() => {
|
|
40
|
+
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
41
|
+
let _classDescriptor;
|
|
42
|
+
let _classExtraInitializers = [];
|
|
43
|
+
let _classThis;
|
|
44
|
+
let _classSuper = plugins.smartdata.SmartDataDbDoc;
|
|
45
|
+
let _id_decorators;
|
|
46
|
+
let _id_initializers = [];
|
|
47
|
+
let _id_extraInitializers = [];
|
|
48
|
+
let _timestamp_decorators;
|
|
49
|
+
let _timestamp_initializers = [];
|
|
50
|
+
let _timestamp_extraInitializers = [];
|
|
51
|
+
let _username_decorators;
|
|
52
|
+
let _username_initializers = [];
|
|
53
|
+
let _username_extraInitializers = [];
|
|
54
|
+
let _userId_decorators;
|
|
55
|
+
let _userId_initializers = [];
|
|
56
|
+
let _userId_extraInitializers = [];
|
|
57
|
+
let _success_decorators;
|
|
58
|
+
let _success_initializers = [];
|
|
59
|
+
let _success_extraInitializers = [];
|
|
60
|
+
let _requestedAuthSource_decorators;
|
|
61
|
+
let _requestedAuthSource_initializers = [];
|
|
62
|
+
let _requestedAuthSource_extraInitializers = [];
|
|
63
|
+
let _resolvedAuthSource_decorators;
|
|
64
|
+
let _resolvedAuthSource_initializers = [];
|
|
65
|
+
let _resolvedAuthSource_extraInitializers = [];
|
|
66
|
+
let _failureReason_decorators;
|
|
67
|
+
let _failureReason_initializers = [];
|
|
68
|
+
let _failureReason_extraInitializers = [];
|
|
69
|
+
var AuthenticationEventDoc = class extends _classSuper {
|
|
70
|
+
static { _classThis = this; }
|
|
71
|
+
static {
|
|
72
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
73
|
+
_id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
74
|
+
_timestamp_decorators = [plugins.smartdata.svDb()];
|
|
75
|
+
_username_decorators = [plugins.smartdata.svDb()];
|
|
76
|
+
_userId_decorators = [plugins.smartdata.svDb()];
|
|
77
|
+
_success_decorators = [plugins.smartdata.svDb()];
|
|
78
|
+
_requestedAuthSource_decorators = [plugins.smartdata.svDb()];
|
|
79
|
+
_resolvedAuthSource_decorators = [plugins.smartdata.svDb()];
|
|
80
|
+
_failureReason_decorators = [plugins.smartdata.svDb()];
|
|
81
|
+
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
82
|
+
__esDecorate(null, null, _timestamp_decorators, { kind: "field", name: "timestamp", static: false, private: false, access: { has: obj => "timestamp" in obj, get: obj => obj.timestamp, set: (obj, value) => { obj.timestamp = value; } }, metadata: _metadata }, _timestamp_initializers, _timestamp_extraInitializers);
|
|
83
|
+
__esDecorate(null, null, _username_decorators, { kind: "field", name: "username", static: false, private: false, access: { has: obj => "username" in obj, get: obj => obj.username, set: (obj, value) => { obj.username = value; } }, metadata: _metadata }, _username_initializers, _username_extraInitializers);
|
|
84
|
+
__esDecorate(null, null, _userId_decorators, { kind: "field", name: "userId", static: false, private: false, access: { has: obj => "userId" in obj, get: obj => obj.userId, set: (obj, value) => { obj.userId = value; } }, metadata: _metadata }, _userId_initializers, _userId_extraInitializers);
|
|
85
|
+
__esDecorate(null, null, _success_decorators, { kind: "field", name: "success", static: false, private: false, access: { has: obj => "success" in obj, get: obj => obj.success, set: (obj, value) => { obj.success = value; } }, metadata: _metadata }, _success_initializers, _success_extraInitializers);
|
|
86
|
+
__esDecorate(null, null, _requestedAuthSource_decorators, { kind: "field", name: "requestedAuthSource", static: false, private: false, access: { has: obj => "requestedAuthSource" in obj, get: obj => obj.requestedAuthSource, set: (obj, value) => { obj.requestedAuthSource = value; } }, metadata: _metadata }, _requestedAuthSource_initializers, _requestedAuthSource_extraInitializers);
|
|
87
|
+
__esDecorate(null, null, _resolvedAuthSource_decorators, { kind: "field", name: "resolvedAuthSource", static: false, private: false, access: { has: obj => "resolvedAuthSource" in obj, get: obj => obj.resolvedAuthSource, set: (obj, value) => { obj.resolvedAuthSource = value; } }, metadata: _metadata }, _resolvedAuthSource_initializers, _resolvedAuthSource_extraInitializers);
|
|
88
|
+
__esDecorate(null, null, _failureReason_decorators, { kind: "field", name: "failureReason", static: false, private: false, access: { has: obj => "failureReason" in obj, get: obj => obj.failureReason, set: (obj, value) => { obj.failureReason = value; } }, metadata: _metadata }, _failureReason_initializers, _failureReason_extraInitializers);
|
|
89
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
90
|
+
AuthenticationEventDoc = _classThis = _classDescriptor.value;
|
|
91
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
92
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
93
|
+
}
|
|
94
|
+
id = __runInitializers(this, _id_initializers, void 0);
|
|
95
|
+
timestamp = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _timestamp_initializers, void 0));
|
|
96
|
+
username = (__runInitializers(this, _timestamp_extraInitializers), __runInitializers(this, _username_initializers, void 0));
|
|
97
|
+
userId = (__runInitializers(this, _username_extraInitializers), __runInitializers(this, _userId_initializers, void 0));
|
|
98
|
+
success = (__runInitializers(this, _userId_extraInitializers), __runInitializers(this, _success_initializers, void 0));
|
|
99
|
+
requestedAuthSource = (__runInitializers(this, _success_extraInitializers), __runInitializers(this, _requestedAuthSource_initializers, void 0));
|
|
100
|
+
resolvedAuthSource = (__runInitializers(this, _requestedAuthSource_extraInitializers), __runInitializers(this, _resolvedAuthSource_initializers, void 0));
|
|
101
|
+
failureReason = (__runInitializers(this, _resolvedAuthSource_extraInitializers), __runInitializers(this, _failureReason_initializers, void 0));
|
|
102
|
+
constructor() {
|
|
103
|
+
super();
|
|
104
|
+
__runInitializers(this, _failureReason_extraInitializers);
|
|
105
|
+
}
|
|
106
|
+
toApiObject() {
|
|
107
|
+
return {
|
|
108
|
+
id: this.id,
|
|
109
|
+
timestamp: this.timestamp,
|
|
110
|
+
username: this.username,
|
|
111
|
+
success: this.success,
|
|
112
|
+
requestedAuthSource: this.requestedAuthSource,
|
|
113
|
+
...(this.userId ? { userId: this.userId } : {}),
|
|
114
|
+
...(this.resolvedAuthSource ? { resolvedAuthSource: this.resolvedAuthSource } : {}),
|
|
115
|
+
...(this.failureReason ? { failureReason: this.failureReason } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
static async getNativeCollection() {
|
|
119
|
+
const smartdataCollection = AuthenticationEventDoc.collection;
|
|
120
|
+
await smartdataCollection.init();
|
|
121
|
+
const probe = new AuthenticationEventDoc();
|
|
122
|
+
await smartdataCollection.markUniqueIndexes(probe.uniqueIndexes || []);
|
|
123
|
+
await smartdataCollection.createRegularIndexes(probe.regularIndexes || []);
|
|
124
|
+
return smartdataCollection.mongoDbCollection;
|
|
125
|
+
}
|
|
126
|
+
static toPersistedFields(eventArg) {
|
|
127
|
+
return {
|
|
128
|
+
id: eventArg.id,
|
|
129
|
+
timestamp: eventArg.timestamp,
|
|
130
|
+
username: eventArg.username,
|
|
131
|
+
success: eventArg.success,
|
|
132
|
+
requestedAuthSource: eventArg.requestedAuthSource,
|
|
133
|
+
...(eventArg.userId !== undefined ? { userId: eventArg.userId } : {}),
|
|
134
|
+
...(eventArg.resolvedAuthSource !== undefined
|
|
135
|
+
? { resolvedAuthSource: eventArg.resolvedAuthSource }
|
|
136
|
+
: {}),
|
|
137
|
+
...(eventArg.failureReason !== undefined ? { failureReason: eventArg.failureReason } : {}),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
static validateEvent(eventArg) {
|
|
141
|
+
if (typeof eventArg.id !== 'string'
|
|
142
|
+
|| !eventArg.id.trim()
|
|
143
|
+
|| !Number.isSafeInteger(eventArg.timestamp)
|
|
144
|
+
|| eventArg.timestamp < 0
|
|
145
|
+
|| typeof eventArg.username !== 'string'
|
|
146
|
+
|| !eventArg.username.trim()
|
|
147
|
+
|| typeof eventArg.success !== 'boolean'
|
|
148
|
+
|| !['auto', 'local', 'idp.global'].includes(eventArg.requestedAuthSource)) {
|
|
149
|
+
throw new Error('Invalid authentication event');
|
|
150
|
+
}
|
|
151
|
+
if (eventArg.userId !== undefined
|
|
152
|
+
&& (typeof eventArg.userId !== 'string' || !eventArg.userId.trim())) {
|
|
153
|
+
throw new Error('Invalid authentication event user ID');
|
|
154
|
+
}
|
|
155
|
+
if (eventArg.resolvedAuthSource !== undefined
|
|
156
|
+
&& eventArg.resolvedAuthSource !== 'local'
|
|
157
|
+
&& eventArg.resolvedAuthSource !== 'idp.global') {
|
|
158
|
+
throw new Error('Invalid resolved authentication source');
|
|
159
|
+
}
|
|
160
|
+
if (eventArg.failureReason !== undefined
|
|
161
|
+
&& ![
|
|
162
|
+
'invalidCredentials',
|
|
163
|
+
'serviceUnavailable',
|
|
164
|
+
'identityIssuanceFailed',
|
|
165
|
+
'internalError',
|
|
166
|
+
].includes(eventArg.failureReason)) {
|
|
167
|
+
throw new Error('Invalid authentication failure reason');
|
|
168
|
+
}
|
|
169
|
+
if (eventArg.success && eventArg.failureReason) {
|
|
170
|
+
throw new Error('Successful authentication events cannot carry a failure reason');
|
|
171
|
+
}
|
|
172
|
+
if (!eventArg.success && !eventArg.failureReason) {
|
|
173
|
+
throw new Error('Failed authentication events require a failure reason');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
static async upsertMany(eventsArg) {
|
|
177
|
+
if (eventsArg.length === 0)
|
|
178
|
+
return;
|
|
179
|
+
if (eventsArg.length > 500) {
|
|
180
|
+
throw new Error('AuthenticationEventDoc.upsertMany accepts at most 500 events');
|
|
181
|
+
}
|
|
182
|
+
for (const event of eventsArg) {
|
|
183
|
+
AuthenticationEventDoc.validateEvent(event);
|
|
184
|
+
}
|
|
185
|
+
const collection = await AuthenticationEventDoc.getNativeCollection();
|
|
186
|
+
await collection.bulkWrite(eventsArg.map((event) => {
|
|
187
|
+
const timestamp = new Date(event.timestamp).toISOString();
|
|
188
|
+
const persistedEvent = AuthenticationEventDoc.toPersistedFields(event);
|
|
189
|
+
return {
|
|
190
|
+
updateOne: {
|
|
191
|
+
filter: { id: event.id },
|
|
192
|
+
update: {
|
|
193
|
+
$setOnInsert: {
|
|
194
|
+
...persistedEvent,
|
|
195
|
+
_createdAt: timestamp,
|
|
196
|
+
_updatedAt: timestamp,
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
upsert: true,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}), { ordered: false, timeoutMS: DB_OPERATION_TIMEOUT_MS });
|
|
203
|
+
}
|
|
204
|
+
static async getWindowSummary(cutoffArg, limitArg = 100) {
|
|
205
|
+
if (!Number.isSafeInteger(cutoffArg) || cutoffArg < 0) {
|
|
206
|
+
throw new Error('AuthenticationEventDoc.getWindowSummary requires a valid cutoff');
|
|
207
|
+
}
|
|
208
|
+
if (!Number.isSafeInteger(limitArg) || limitArg <= 0 || limitArg > 500) {
|
|
209
|
+
throw new Error('AuthenticationEventDoc.getWindowSummary requires a limit from 1 to 500');
|
|
210
|
+
}
|
|
211
|
+
const collection = await AuthenticationEventDoc.getNativeCollection();
|
|
212
|
+
const selector = { timestamp: { $gte: cutoffArg } };
|
|
213
|
+
const cursor = collection
|
|
214
|
+
.find(selector, { timeoutMS: DB_OPERATION_TIMEOUT_MS })
|
|
215
|
+
.sort({ timestamp: -1, id: -1 })
|
|
216
|
+
.limit(limitArg);
|
|
217
|
+
try {
|
|
218
|
+
const [successes, failures, rows] = await Promise.all([
|
|
219
|
+
collection.countDocuments({ ...selector, success: true }, { timeoutMS: DB_OPERATION_TIMEOUT_MS }),
|
|
220
|
+
collection.countDocuments({ ...selector, success: false }, { timeoutMS: DB_OPERATION_TIMEOUT_MS }),
|
|
221
|
+
cursor.toArray(),
|
|
222
|
+
]);
|
|
223
|
+
return {
|
|
224
|
+
successes,
|
|
225
|
+
failures,
|
|
226
|
+
events: rows.map((row) => AuthenticationEventDoc
|
|
227
|
+
.createInstanceFromMongoDbNativeDoc(row)
|
|
228
|
+
.toApiObject()),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
await cursor.close({ timeoutMS: DB_OPERATION_TIMEOUT_MS });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
static async findExistingIds(idsArg) {
|
|
236
|
+
const ids = [...new Set(idsArg)];
|
|
237
|
+
if (ids.length === 0)
|
|
238
|
+
return new Set();
|
|
239
|
+
if (ids.length > 500) {
|
|
240
|
+
throw new Error('AuthenticationEventDoc.findExistingIds accepts at most 500 ids');
|
|
241
|
+
}
|
|
242
|
+
const collection = await AuthenticationEventDoc.getNativeCollection();
|
|
243
|
+
const rows = await collection
|
|
244
|
+
.find({ id: { $in: ids } }, { projection: { id: 1 }, timeoutMS: DB_OPERATION_TIMEOUT_MS })
|
|
245
|
+
.toArray();
|
|
246
|
+
return new Set(rows.map((row) => String(row.id)));
|
|
247
|
+
}
|
|
248
|
+
static async pruneBefore(cutoffArg) {
|
|
249
|
+
if (!Number.isSafeInteger(cutoffArg) || cutoffArg < 0) {
|
|
250
|
+
throw new Error('AuthenticationEventDoc.pruneBefore requires a valid cutoff');
|
|
251
|
+
}
|
|
252
|
+
const collection = await AuthenticationEventDoc.getNativeCollection();
|
|
253
|
+
let deletedCount = 0;
|
|
254
|
+
while (true) {
|
|
255
|
+
const rows = await collection
|
|
256
|
+
.find({ timestamp: { $lt: cutoffArg } }, { projection: { _id: 1 }, timeoutMS: DB_OPERATION_TIMEOUT_MS })
|
|
257
|
+
.sort({ timestamp: 1, _id: 1 })
|
|
258
|
+
.limit(500)
|
|
259
|
+
.toArray();
|
|
260
|
+
if (rows.length === 0)
|
|
261
|
+
break;
|
|
262
|
+
const result = await collection.deleteMany({ _id: { $in: rows.map((row) => row._id) } }, { timeoutMS: DB_OPERATION_TIMEOUT_MS });
|
|
263
|
+
deletedCount += result.deletedCount;
|
|
264
|
+
if (rows.length < 500)
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
return deletedCount;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
return AuthenticationEventDoc = _classThis;
|
|
271
|
+
})();
|
|
272
|
+
export { AuthenticationEventDoc };
|
|
273
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRoZW50aWNhdGlvbi1ldmVudC5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy5hdXRoZW50aWNhdGlvbi1ldmVudC5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUXZELE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBRXRDLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUd4QyxzQkFBc0I7NEJBRGxDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7O3NCQUNBLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQ0FBeEMsU0FBUSxXQUczQzs7Ozs4QkFDRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2tDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7K0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzhDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTt5Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFwQnpCLHdKQUFP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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
export interface IEmailTrafficBucketCounts {
|
|
3
|
+
sent: number;
|
|
4
|
+
received: number;
|
|
5
|
+
failed: number;
|
|
6
|
+
}
|
|
7
|
+
export interface IEmailTrafficBucketSnapshot extends IEmailTrafficBucketCounts {
|
|
8
|
+
bucketStart: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class EmailTrafficBucketDoc extends plugins.smartdata.SmartDataDbDoc<EmailTrafficBucketDoc, EmailTrafficBucketDoc> implements IEmailTrafficBucketSnapshot {
|
|
11
|
+
id: string;
|
|
12
|
+
bucketStart: number;
|
|
13
|
+
sent: number;
|
|
14
|
+
received: number;
|
|
15
|
+
failed: number;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
updatedAt: number;
|
|
18
|
+
constructor();
|
|
19
|
+
private static getNativeCollection;
|
|
20
|
+
private static validateSnapshot;
|
|
21
|
+
/** Persist retry-safe absolute monotonic counters. */
|
|
22
|
+
static persistAbsolute(snapshotsArg: IEmailTrafficBucketSnapshot[]): Promise<void>;
|
|
23
|
+
static loadSince(cutoffArg: number): Promise<IEmailTrafficBucketSnapshot[]>;
|
|
24
|
+
static pruneBefore(cutoffArg: number): Promise<number>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import * as plugins from '../../plugins.js';
|
|
36
|
+
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
|
+
const DB_OPERATION_TIMEOUT_MS = 5_000;
|
|
38
|
+
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
39
|
+
let EmailTrafficBucketDoc = (() => {
|
|
40
|
+
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
41
|
+
let _classDescriptor;
|
|
42
|
+
let _classExtraInitializers = [];
|
|
43
|
+
let _classThis;
|
|
44
|
+
let _classSuper = plugins.smartdata.SmartDataDbDoc;
|
|
45
|
+
let _id_decorators;
|
|
46
|
+
let _id_initializers = [];
|
|
47
|
+
let _id_extraInitializers = [];
|
|
48
|
+
let _bucketStart_decorators;
|
|
49
|
+
let _bucketStart_initializers = [];
|
|
50
|
+
let _bucketStart_extraInitializers = [];
|
|
51
|
+
let _sent_decorators;
|
|
52
|
+
let _sent_initializers = [];
|
|
53
|
+
let _sent_extraInitializers = [];
|
|
54
|
+
let _received_decorators;
|
|
55
|
+
let _received_initializers = [];
|
|
56
|
+
let _received_extraInitializers = [];
|
|
57
|
+
let _failed_decorators;
|
|
58
|
+
let _failed_initializers = [];
|
|
59
|
+
let _failed_extraInitializers = [];
|
|
60
|
+
let _createdAt_decorators;
|
|
61
|
+
let _createdAt_initializers = [];
|
|
62
|
+
let _createdAt_extraInitializers = [];
|
|
63
|
+
let _updatedAt_decorators;
|
|
64
|
+
let _updatedAt_initializers = [];
|
|
65
|
+
let _updatedAt_extraInitializers = [];
|
|
66
|
+
var EmailTrafficBucketDoc = class extends _classSuper {
|
|
67
|
+
static { _classThis = this; }
|
|
68
|
+
static {
|
|
69
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
70
|
+
_id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
71
|
+
_bucketStart_decorators = [plugins.smartdata.svDb()];
|
|
72
|
+
_sent_decorators = [plugins.smartdata.svDb()];
|
|
73
|
+
_received_decorators = [plugins.smartdata.svDb()];
|
|
74
|
+
_failed_decorators = [plugins.smartdata.svDb()];
|
|
75
|
+
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
76
|
+
_updatedAt_decorators = [plugins.smartdata.svDb()];
|
|
77
|
+
__esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
|
|
78
|
+
__esDecorate(null, null, _bucketStart_decorators, { kind: "field", name: "bucketStart", static: false, private: false, access: { has: obj => "bucketStart" in obj, get: obj => obj.bucketStart, set: (obj, value) => { obj.bucketStart = value; } }, metadata: _metadata }, _bucketStart_initializers, _bucketStart_extraInitializers);
|
|
79
|
+
__esDecorate(null, null, _sent_decorators, { kind: "field", name: "sent", static: false, private: false, access: { has: obj => "sent" in obj, get: obj => obj.sent, set: (obj, value) => { obj.sent = value; } }, metadata: _metadata }, _sent_initializers, _sent_extraInitializers);
|
|
80
|
+
__esDecorate(null, null, _received_decorators, { kind: "field", name: "received", static: false, private: false, access: { has: obj => "received" in obj, get: obj => obj.received, set: (obj, value) => { obj.received = value; } }, metadata: _metadata }, _received_initializers, _received_extraInitializers);
|
|
81
|
+
__esDecorate(null, null, _failed_decorators, { kind: "field", name: "failed", static: false, private: false, access: { has: obj => "failed" in obj, get: obj => obj.failed, set: (obj, value) => { obj.failed = value; } }, metadata: _metadata }, _failed_initializers, _failed_extraInitializers);
|
|
82
|
+
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
83
|
+
__esDecorate(null, null, _updatedAt_decorators, { kind: "field", name: "updatedAt", static: false, private: false, access: { has: obj => "updatedAt" in obj, get: obj => obj.updatedAt, set: (obj, value) => { obj.updatedAt = value; } }, metadata: _metadata }, _updatedAt_initializers, _updatedAt_extraInitializers);
|
|
84
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
85
|
+
EmailTrafficBucketDoc = _classThis = _classDescriptor.value;
|
|
86
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
87
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
88
|
+
}
|
|
89
|
+
id = __runInitializers(this, _id_initializers, void 0);
|
|
90
|
+
bucketStart = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _bucketStart_initializers, void 0));
|
|
91
|
+
sent = (__runInitializers(this, _bucketStart_extraInitializers), __runInitializers(this, _sent_initializers, 0));
|
|
92
|
+
received = (__runInitializers(this, _sent_extraInitializers), __runInitializers(this, _received_initializers, 0));
|
|
93
|
+
failed = (__runInitializers(this, _received_extraInitializers), __runInitializers(this, _failed_initializers, 0));
|
|
94
|
+
createdAt = (__runInitializers(this, _failed_extraInitializers), __runInitializers(this, _createdAt_initializers, void 0));
|
|
95
|
+
updatedAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _updatedAt_initializers, void 0));
|
|
96
|
+
constructor() {
|
|
97
|
+
super();
|
|
98
|
+
__runInitializers(this, _updatedAt_extraInitializers);
|
|
99
|
+
}
|
|
100
|
+
static async getNativeCollection() {
|
|
101
|
+
const smartdataCollection = EmailTrafficBucketDoc.collection;
|
|
102
|
+
await smartdataCollection.init();
|
|
103
|
+
const probe = new EmailTrafficBucketDoc();
|
|
104
|
+
await smartdataCollection.markUniqueIndexes(probe.uniqueIndexes || []);
|
|
105
|
+
await smartdataCollection.createRegularIndexes(probe.regularIndexes || []);
|
|
106
|
+
return smartdataCollection.mongoDbCollection;
|
|
107
|
+
}
|
|
108
|
+
static validateSnapshot(snapshotArg) {
|
|
109
|
+
const counts = [snapshotArg.sent, snapshotArg.received, snapshotArg.failed];
|
|
110
|
+
if (!Number.isSafeInteger(snapshotArg.bucketStart)
|
|
111
|
+
|| snapshotArg.bucketStart < 0
|
|
112
|
+
|| snapshotArg.bucketStart % 60_000 !== 0
|
|
113
|
+
|| counts.some((count) => !Number.isSafeInteger(count) || count < 0)) {
|
|
114
|
+
throw new Error('Invalid email traffic bucket snapshot');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Persist retry-safe absolute monotonic counters. */
|
|
118
|
+
static async persistAbsolute(snapshotsArg) {
|
|
119
|
+
if (snapshotsArg.length === 0)
|
|
120
|
+
return;
|
|
121
|
+
if (snapshotsArg.length > 500) {
|
|
122
|
+
throw new Error('EmailTrafficBucketDoc.persistAbsolute accepts at most 500 buckets');
|
|
123
|
+
}
|
|
124
|
+
for (const snapshot of snapshotsArg) {
|
|
125
|
+
EmailTrafficBucketDoc.validateSnapshot(snapshot);
|
|
126
|
+
}
|
|
127
|
+
const collection = await EmailTrafficBucketDoc.getNativeCollection();
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
const updatedAt = new Date(now).toISOString();
|
|
130
|
+
await collection.bulkWrite(snapshotsArg.map((snapshot) => ({
|
|
131
|
+
updateOne: {
|
|
132
|
+
filter: { bucketStart: snapshot.bucketStart },
|
|
133
|
+
update: {
|
|
134
|
+
$max: {
|
|
135
|
+
sent: snapshot.sent,
|
|
136
|
+
received: snapshot.received,
|
|
137
|
+
failed: snapshot.failed,
|
|
138
|
+
},
|
|
139
|
+
$set: {
|
|
140
|
+
updatedAt: now,
|
|
141
|
+
_updatedAt: updatedAt,
|
|
142
|
+
},
|
|
143
|
+
$setOnInsert: {
|
|
144
|
+
id: `email-traffic-${snapshot.bucketStart}`,
|
|
145
|
+
bucketStart: snapshot.bucketStart,
|
|
146
|
+
createdAt: now,
|
|
147
|
+
_createdAt: updatedAt,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
upsert: true,
|
|
151
|
+
},
|
|
152
|
+
})), { ordered: false, timeoutMS: DB_OPERATION_TIMEOUT_MS });
|
|
153
|
+
}
|
|
154
|
+
static async loadSince(cutoffArg) {
|
|
155
|
+
if (!Number.isSafeInteger(cutoffArg) || cutoffArg < 0) {
|
|
156
|
+
throw new Error('EmailTrafficBucketDoc.loadSince requires a valid cutoff');
|
|
157
|
+
}
|
|
158
|
+
const collection = await EmailTrafficBucketDoc.getNativeCollection();
|
|
159
|
+
const cursor = collection
|
|
160
|
+
.find({ bucketStart: { $gte: cutoffArg } }, { timeoutMS: DB_OPERATION_TIMEOUT_MS })
|
|
161
|
+
.sort({ bucketStart: 1 });
|
|
162
|
+
try {
|
|
163
|
+
const rows = await cursor.toArray();
|
|
164
|
+
return rows.map((row) => ({
|
|
165
|
+
bucketStart: Number(row.bucketStart),
|
|
166
|
+
sent: Number(row.sent || 0),
|
|
167
|
+
received: Number(row.received || 0),
|
|
168
|
+
failed: Number(row.failed || 0),
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
await cursor.close({ timeoutMS: DB_OPERATION_TIMEOUT_MS });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
static async pruneBefore(cutoffArg) {
|
|
176
|
+
if (!Number.isSafeInteger(cutoffArg) || cutoffArg < 0) {
|
|
177
|
+
throw new Error('EmailTrafficBucketDoc.pruneBefore requires a valid cutoff');
|
|
178
|
+
}
|
|
179
|
+
const collection = await EmailTrafficBucketDoc.getNativeCollection();
|
|
180
|
+
let deletedCount = 0;
|
|
181
|
+
while (true) {
|
|
182
|
+
const rows = await collection
|
|
183
|
+
.find({ bucketStart: { $lt: cutoffArg } }, { projection: { _id: 1 }, timeoutMS: DB_OPERATION_TIMEOUT_MS })
|
|
184
|
+
.sort({ bucketStart: 1, _id: 1 })
|
|
185
|
+
.limit(500)
|
|
186
|
+
.toArray();
|
|
187
|
+
if (rows.length === 0)
|
|
188
|
+
break;
|
|
189
|
+
const result = await collection.deleteMany({ _id: { $in: rows.map((row) => row._id) } }, { timeoutMS: DB_OPERATION_TIMEOUT_MS });
|
|
190
|
+
deletedCount += result.deletedCount;
|
|
191
|
+
if (rows.length < 500)
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
return deletedCount;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
return EmailTrafficBucketDoc = _classThis;
|
|
198
|
+
})();
|
|
199
|
+
export { EmailTrafficBucketDoc };
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbWFpbC10cmFmZmljLWJ1Y2tldC5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy5lbWFpbC10cmFmZmljLWJ1Y2tldC5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBRXRDLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQWF4QyxxQkFBcUI7NEJBRGpDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7O3NCQUNELE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxQ0FBeEMsU0FBUSxXQUcxQzs7Ozs4QkFDRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTt1Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO29DQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtrQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtZQWpCekIsd0pBQU8sRUFBRSw2QkFBRixFQUFFLCtFQUFVO1lBR25CLG1MQUFPLFdBQVcs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
|
|
@@ -3,6 +3,8 @@ export * from './classes.cached.ip.reputation.js';
|
|
|
3
3
|
export * from './classes.ip-intelligence.doc.js';
|
|
4
4
|
export * from './classes.security-block-rule.doc.js';
|
|
5
5
|
export * from './classes.security-policy-audit.doc.js';
|
|
6
|
+
export * from './classes.authentication-event.doc.js';
|
|
7
|
+
export * from './classes.email-traffic-bucket.doc.js';
|
|
6
8
|
export * from './classes.route.doc.js';
|
|
7
9
|
export * from './classes.api-token.doc.js';
|
|
8
10
|
export * from './classes.gateway-client.doc.js';
|
|
@@ -4,6 +4,8 @@ export * from './classes.cached.ip.reputation.js';
|
|
|
4
4
|
export * from './classes.ip-intelligence.doc.js';
|
|
5
5
|
export * from './classes.security-block-rule.doc.js';
|
|
6
6
|
export * from './classes.security-policy-audit.doc.js';
|
|
7
|
+
export * from './classes.authentication-event.doc.js';
|
|
8
|
+
export * from './classes.email-traffic-bucket.doc.js';
|
|
7
9
|
// Config document classes
|
|
8
10
|
export * from './classes.route.doc.js';
|
|
9
11
|
export * from './classes.api-token.doc.js';
|
|
@@ -41,4 +43,4 @@ export * from './classes.webpush-admission.doc.js';
|
|
|
41
43
|
export * from './classes.webpush-spool.doc.js';
|
|
42
44
|
export * from './classes.smartmta-storage.doc.js';
|
|
43
45
|
export * from './classes.ops-config-event.doc.js';
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsdUNBQXVDLENBQUM7QUFFdEQsMEJBQTBCO0FBQzFCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELHVCQUF1QjtBQUN2QixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsNkJBQTZCLENBQUM7QUFFNUMsK0JBQStCO0FBQy9CLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGtDQUFrQztBQUNsQyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsOENBQThDLENBQUM7QUFFN0QsMEJBQTBCO0FBQzFCLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxxQ0FBcUMsQ0FBQztBQUVwRCwyQ0FBMkM7QUFDM0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUUvQyxpQ0FBaUM7QUFDakMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QywwQkFBMEI7QUFDMUIsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsK0JBQStCLENBQUM7QUFFOUMsOEJBQThCO0FBQzlCLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxtQ0FBbUMsQ0FBQyJ9
|