@oneteme/inspect-ng-collector 0.0.1
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/README.md +24 -0
- package/esm2022/lib/http-interceptor.service.mjs +79 -0
- package/esm2022/lib/ng-collector.module.mjs +46 -0
- package/esm2022/lib/route-tracer.service.mjs +70 -0
- package/esm2022/lib/session-manager.service.mjs +145 -0
- package/esm2022/lib/trace.model.mjs +2 -0
- package/esm2022/lib/util.mjs +131 -0
- package/esm2022/oneteme-inspect-ng-collector.mjs +5 -0
- package/esm2022/public-api.mjs +5 -0
- package/fesm2022/oneteme-inspect-ng-collector.mjs +466 -0
- package/fesm2022/oneteme-inspect-ng-collector.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/http-interceptor.service.d.ts +11 -0
- package/lib/ng-collector.module.d.ts +22 -0
- package/lib/route-tracer.service.d.ts +21 -0
- package/lib/session-manager.service.d.ts +30 -0
- package/lib/trace.model.d.ts +50 -0
- package/lib/util.d.ts +13 -0
- package/package.json +32 -0
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, Inject, APP_INITIALIZER, NgModule } from '@angular/core';
|
|
3
|
+
import { HttpResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
4
|
+
import { tap as tap$1, finalize } from 'rxjs/operators';
|
|
5
|
+
import * as i1 from '@angular/router';
|
|
6
|
+
import { NavigationStart, NavigationEnd } from '@angular/router';
|
|
7
|
+
import { interval, tap, from, BehaviorSubject, of } from 'rxjs';
|
|
8
|
+
|
|
9
|
+
let WIN = window;
|
|
10
|
+
let c = console;
|
|
11
|
+
const HOST_PATERN = /https?:\/\/[\w\-\.]+(:\d{2,5})?\/?/;
|
|
12
|
+
const PATH_PATERN = /[\w\-\{\}]+(\/[\w\-\{\}]+)*/;
|
|
13
|
+
function dateNow() {
|
|
14
|
+
return Date.now() / 1000;
|
|
15
|
+
}
|
|
16
|
+
function logTraceapi(fn, ...args) {
|
|
17
|
+
if (WIN["traceapi"]) {
|
|
18
|
+
if (typeof c[fn] === 'function') {
|
|
19
|
+
c[fn]('[TRACEAPI]', ...args);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function prettySessionFormat(session) {
|
|
24
|
+
let s = "";
|
|
25
|
+
if (WIN['debug']) {
|
|
26
|
+
s = `[${session.name}]`;
|
|
27
|
+
if (session.user != null) {
|
|
28
|
+
s += `<${session.user}>`;
|
|
29
|
+
}
|
|
30
|
+
if (session.location) {
|
|
31
|
+
s += `(${session.location}) `;
|
|
32
|
+
}
|
|
33
|
+
s += prettyDurationFormat(session.start, session.end);
|
|
34
|
+
session.restRequests.forEach(r => {
|
|
35
|
+
s += prettyRestRequestFormat(r);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return s;
|
|
39
|
+
}
|
|
40
|
+
function prettyRestRequestFormat(rest) {
|
|
41
|
+
let s = ` - [${rest.method}]`;
|
|
42
|
+
if (rest.protocol) {
|
|
43
|
+
s += `${rest.protocol}://`;
|
|
44
|
+
}
|
|
45
|
+
if (rest.host) {
|
|
46
|
+
s += rest.host;
|
|
47
|
+
}
|
|
48
|
+
if (rest.port > 0) {
|
|
49
|
+
s += `:${rest.port}`;
|
|
50
|
+
}
|
|
51
|
+
if (rest.path) {
|
|
52
|
+
if (!rest.path.startsWith("/") && !s.endsWith("/")) {
|
|
53
|
+
s += '/';
|
|
54
|
+
}
|
|
55
|
+
s += rest.path;
|
|
56
|
+
}
|
|
57
|
+
if (rest.query) {
|
|
58
|
+
s += rest.query;
|
|
59
|
+
}
|
|
60
|
+
if (rest.exception?.type) {
|
|
61
|
+
s += ` ${rest.exception?.type}:`;
|
|
62
|
+
}
|
|
63
|
+
if (rest.exception?.message) {
|
|
64
|
+
s += ` ${rest.exception.message}`;
|
|
65
|
+
}
|
|
66
|
+
s += ` >> ${rest.status}`;
|
|
67
|
+
s += prettyDurationFormat(rest.start, rest.end);
|
|
68
|
+
return s;
|
|
69
|
+
}
|
|
70
|
+
function prettyDurationFormat(start, end) {
|
|
71
|
+
return start && end ? `(in ${new Date(end * 1000).getTime() - new Date(start * 1000).getTime()} ms) \n` : '';
|
|
72
|
+
}
|
|
73
|
+
function validate(v, pattern) {
|
|
74
|
+
if (v && pattern.exec(v)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
logTraceapi('warn', "bad value=" + v + ", pattern=" + pattern);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
function requirePostitiveValue(v, name) {
|
|
81
|
+
if (v == undefined || (v && v > 0)) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
logTraceapi('warn', name + '=' + v + " <= 0");
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
function getNumberOrCall(o) {
|
|
88
|
+
return typeof o === "function" ? o() : o;
|
|
89
|
+
}
|
|
90
|
+
function getStringOrCall(o) {
|
|
91
|
+
return typeof o === "function" ? o() : o;
|
|
92
|
+
}
|
|
93
|
+
function getRegArrOrCall(o) {
|
|
94
|
+
return typeof o === "function" ? o() : o;
|
|
95
|
+
}
|
|
96
|
+
function detectBrowser() {
|
|
97
|
+
try {
|
|
98
|
+
const agent = window.navigator.userAgent.toLowerCase();
|
|
99
|
+
switch (true) {
|
|
100
|
+
case agent.indexOf('edge') > -1:
|
|
101
|
+
return 'edge';
|
|
102
|
+
case agent.indexOf('opr') > -1:
|
|
103
|
+
return 'opera';
|
|
104
|
+
case agent.indexOf('chrome') > -1:
|
|
105
|
+
return 'chrome';
|
|
106
|
+
case agent.indexOf('firefox') > -1:
|
|
107
|
+
return 'firefox';
|
|
108
|
+
case agent.indexOf('safari') > -1:
|
|
109
|
+
return 'safari';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
console.error(e);
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
function detectOs() {
|
|
118
|
+
try {
|
|
119
|
+
let versionMatch, version;
|
|
120
|
+
const agent = window.navigator.userAgent.toLowerCase();
|
|
121
|
+
switch (true) {
|
|
122
|
+
case (/windows/.test(agent)):
|
|
123
|
+
versionMatch = /windows nt (\d+\.\d+)/.exec(agent);
|
|
124
|
+
version = versionMatch ? versionMatch[1] : 'Unknown';
|
|
125
|
+
return `Windows ${version}`;
|
|
126
|
+
case (/linux/.test(agent)):
|
|
127
|
+
return 'Linux';
|
|
128
|
+
case (/macintosh/.test(agent)):
|
|
129
|
+
versionMatch = /mac os x (\d+[._]\d+[._]\d+)/.exec(agent);
|
|
130
|
+
version = versionMatch ? versionMatch[1] : 'Unknown';
|
|
131
|
+
return `MacOs ${version}`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
console.error(e);
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const SLASH$1 = '/';
|
|
141
|
+
class SessionManager {
|
|
142
|
+
constructor() {
|
|
143
|
+
this.sessionQueue = [];
|
|
144
|
+
this.sessionSendAttempts = 0;
|
|
145
|
+
this.InstanceEnvSendAttempts = 0;
|
|
146
|
+
this.sendSessionfinished = true;
|
|
147
|
+
this.sendInstanceEnvFinished = true;
|
|
148
|
+
}
|
|
149
|
+
initialize(config, host) {
|
|
150
|
+
this.logServerMain = this.sessionApiURL(host, getStringOrCall(config.sessionApi));
|
|
151
|
+
this.logInstanceEnv = this.instanceApiURL(host, getStringOrCall(config.instanceApi));
|
|
152
|
+
this.maxBufferSize = getNumberOrCall(config.bufferMaxSize) ?? 1000;
|
|
153
|
+
this.delay = getNumberOrCall(config.delay) ?? 60000;
|
|
154
|
+
this.instanceEnvironment = {
|
|
155
|
+
name: getStringOrCall(config.name),
|
|
156
|
+
version: getStringOrCall(config.version),
|
|
157
|
+
address: undefined, //server side
|
|
158
|
+
env: getStringOrCall(config.env),
|
|
159
|
+
os: detectOs(),
|
|
160
|
+
re: detectBrowser(),
|
|
161
|
+
user: undefined, // cannot get user
|
|
162
|
+
type: "CLIENT",
|
|
163
|
+
instant: dateNow(),
|
|
164
|
+
collector: "inspect-ng-collector-0.0.1"
|
|
165
|
+
};
|
|
166
|
+
this.scheduledSessionSender = interval(this.delay)
|
|
167
|
+
.pipe(tap(() => {
|
|
168
|
+
if (this.sendSessionfinished) {
|
|
169
|
+
this.sendSessions();
|
|
170
|
+
}
|
|
171
|
+
}))
|
|
172
|
+
.subscribe();
|
|
173
|
+
}
|
|
174
|
+
addSessions(sessions) {
|
|
175
|
+
this.sessionQueue.push(sessions);
|
|
176
|
+
logTraceapi('log', "added element to session queue, new size is: " + this.sessionQueue.length);
|
|
177
|
+
}
|
|
178
|
+
sendSessions() {
|
|
179
|
+
if (this.sessionQueue.length > 0) {
|
|
180
|
+
this.getInsertedInstanceId().subscribe((id) => {
|
|
181
|
+
if (id) {
|
|
182
|
+
this.sendSessionfinished = false;
|
|
183
|
+
let sessions = [...this.sessionQueue];
|
|
184
|
+
this.sessionQueue.splice(0, sessions.length); // add rest of sessions
|
|
185
|
+
logTraceapi('log', `sending sessions, attempts:${++this.sessionSendAttempts}, queue size : ${sessions.length}`);
|
|
186
|
+
const requestOptions = {
|
|
187
|
+
method: 'PUT',
|
|
188
|
+
headers: {
|
|
189
|
+
'Content-Type': 'application/json',
|
|
190
|
+
'Access-Control-Allow-Origin': '*'
|
|
191
|
+
},
|
|
192
|
+
body: JSON.stringify(sessions)
|
|
193
|
+
};
|
|
194
|
+
fetch(this.logServerMain, requestOptions)
|
|
195
|
+
.then(data => {
|
|
196
|
+
if (data.ok) {
|
|
197
|
+
logTraceapi('log', 'sessions sent successfully, queue size reset, new size is: ' + this.sessionQueue.length);
|
|
198
|
+
this.sessionSendAttempts = 0;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
logTraceapi('warn', `Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`); //
|
|
202
|
+
this.revertQueueSize(sessions);
|
|
203
|
+
}
|
|
204
|
+
})
|
|
205
|
+
.catch(error => {
|
|
206
|
+
logTraceapi('warn', `Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`); //
|
|
207
|
+
logTraceapi('warn', error);
|
|
208
|
+
this.revertQueueSize(sessions);
|
|
209
|
+
}).finally(() => {
|
|
210
|
+
this.sendSessionfinished = true;
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
logTraceapi('warn', `Error while attempting to send Environement instance, attempts ${this.sessionSendAttempts}`);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
revertQueueSize(sessions) {
|
|
220
|
+
this.sessionQueue.unshift(...sessions);
|
|
221
|
+
if (this.sessionQueue.length > this.maxBufferSize) {
|
|
222
|
+
let diff = this.sessionQueue.length - this.maxBufferSize;
|
|
223
|
+
this.sessionQueue = this.sessionQueue.slice(0, this.maxBufferSize);
|
|
224
|
+
logTraceapi('log', 'Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):' + diff);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
getInsertedInstanceId() {
|
|
228
|
+
if (this.instance) {
|
|
229
|
+
return this.instance;
|
|
230
|
+
}
|
|
231
|
+
if (this.sendInstanceEnvFinished) {
|
|
232
|
+
this.sendInstanceEnvFinished = false;
|
|
233
|
+
const requestOptions = {
|
|
234
|
+
method: 'POST',
|
|
235
|
+
headers: {
|
|
236
|
+
'Content-Type': 'application/json',
|
|
237
|
+
'Access-Control-Allow-Origin': '*' // retest
|
|
238
|
+
},
|
|
239
|
+
body: JSON.stringify(this.instanceEnvironment)
|
|
240
|
+
};
|
|
241
|
+
this.sessionSendAttempts++;
|
|
242
|
+
return from(fetch(this.logInstanceEnv, requestOptions)
|
|
243
|
+
.then(res => res.ok ? res.text().then(id => {
|
|
244
|
+
this.instance = new BehaviorSubject(id);
|
|
245
|
+
this.logServerMain = this.logServerMain.replace(':id', id);
|
|
246
|
+
this.sessionSendAttempts = 0;
|
|
247
|
+
logTraceapi('log', 'Environement instance sent successfully');
|
|
248
|
+
return id; // return logserverMain
|
|
249
|
+
}) : null)
|
|
250
|
+
.catch(err => {
|
|
251
|
+
logTraceapi('warn', err);
|
|
252
|
+
return null;
|
|
253
|
+
}).finally(() => {
|
|
254
|
+
this.sendInstanceEnvFinished = true;
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
return of(null);
|
|
258
|
+
}
|
|
259
|
+
instanceApiURL(host, path) {
|
|
260
|
+
return this.toURL(host, path);
|
|
261
|
+
}
|
|
262
|
+
sessionApiURL(host, path) {
|
|
263
|
+
return this.toURL(host, path);
|
|
264
|
+
}
|
|
265
|
+
toURL(host, path) {
|
|
266
|
+
return host.endsWith(SLASH$1) || path.startsWith(SLASH$1) ? host + path : [host, path].join(SLASH$1);
|
|
267
|
+
}
|
|
268
|
+
ngOnDestroy() {
|
|
269
|
+
if (this.scheduledSessionSender) {
|
|
270
|
+
this.scheduledSessionSender.unsubscribe();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SessionManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
274
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SessionManager, providedIn: 'root' }); }
|
|
275
|
+
}
|
|
276
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SessionManager, decorators: [{
|
|
277
|
+
type: Injectable,
|
|
278
|
+
args: [{ providedIn: 'root' }]
|
|
279
|
+
}], ctorParameters: () => [] });
|
|
280
|
+
|
|
281
|
+
const SLASH = '/';
|
|
282
|
+
class RouteTracerService {
|
|
283
|
+
constructor(router, config, host) {
|
|
284
|
+
this.router = router;
|
|
285
|
+
this.beforeUnloadHandler = (event) => {
|
|
286
|
+
this.currentSession.end = dateNow();
|
|
287
|
+
if (this.excludeList.every((e) => !e.test(this.currentSession.location))) {
|
|
288
|
+
this.sessionManager.addSessions(this.currentSession); //force
|
|
289
|
+
this.sessionManager.sendSessions();
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
this.sessionManager = new SessionManager();
|
|
293
|
+
this.excludeList = getRegArrOrCall(config.exclude);
|
|
294
|
+
this.sessionManager.initialize(config, host);
|
|
295
|
+
this.user = getStringOrCall(config.user);
|
|
296
|
+
}
|
|
297
|
+
ngOnDestroy() {
|
|
298
|
+
window.removeEventListener('beforeunload', this.beforeUnloadHandler);
|
|
299
|
+
}
|
|
300
|
+
initialize() {
|
|
301
|
+
logTraceapi('log', 'initialize');
|
|
302
|
+
window.addEventListener('beforeunload', this.beforeUnloadHandler);
|
|
303
|
+
this.router.events.subscribe(event => {
|
|
304
|
+
if (event instanceof NavigationStart) {
|
|
305
|
+
const now = dateNow();
|
|
306
|
+
if (this.currentSession) {
|
|
307
|
+
this.currentSession.end = dateNow();
|
|
308
|
+
if (this.excludeList.every((e) => !e.test(this.currentSession.location))) {
|
|
309
|
+
this.sessionManager.addSessions(this.currentSession);
|
|
310
|
+
}
|
|
311
|
+
logTraceapi('log', prettySessionFormat(this.currentSession));
|
|
312
|
+
}
|
|
313
|
+
this.currentSession = {
|
|
314
|
+
'@type': "main",
|
|
315
|
+
user: this.user,
|
|
316
|
+
start: now,
|
|
317
|
+
type: "VIEW",
|
|
318
|
+
location: event.url,
|
|
319
|
+
restRequests: []
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
if (event instanceof NavigationEnd) {
|
|
323
|
+
this.currentSession.name = document.title;
|
|
324
|
+
this.currentSession.location = document.URL;
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
getCurrentSession() {
|
|
329
|
+
return this.currentSession;
|
|
330
|
+
}
|
|
331
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RouteTracerService, deps: [{ token: i1.Router }, { token: 'config' }, { token: 'host' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
332
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RouteTracerService, providedIn: 'root' }); }
|
|
333
|
+
}
|
|
334
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RouteTracerService, decorators: [{
|
|
335
|
+
type: Injectable,
|
|
336
|
+
args: [{ providedIn: 'root' }]
|
|
337
|
+
}], ctorParameters: () => [{ type: i1.Router }, { type: undefined, decorators: [{
|
|
338
|
+
type: Inject,
|
|
339
|
+
args: ['config']
|
|
340
|
+
}] }, { type: undefined, decorators: [{
|
|
341
|
+
type: Inject,
|
|
342
|
+
args: ['host']
|
|
343
|
+
}] }] });
|
|
344
|
+
|
|
345
|
+
class HttpInterceptorService {
|
|
346
|
+
constructor(routerTracerService) {
|
|
347
|
+
this.routerTracerService = routerTracerService;
|
|
348
|
+
}
|
|
349
|
+
intercept(req, next) {
|
|
350
|
+
const start = dateNow();
|
|
351
|
+
let status, responseBody = '', exception;
|
|
352
|
+
let id;
|
|
353
|
+
return next.handle(req).pipe(tap$1((event) => {
|
|
354
|
+
if (event instanceof HttpResponse) {
|
|
355
|
+
status = +event.status;
|
|
356
|
+
responseBody = event.body;
|
|
357
|
+
id = getReqid(event.headers);
|
|
358
|
+
}
|
|
359
|
+
}, error => {
|
|
360
|
+
console.log(error);
|
|
361
|
+
id = getReqid(error.headers);
|
|
362
|
+
status = +error.status;
|
|
363
|
+
exception = {
|
|
364
|
+
type: error.error.error,
|
|
365
|
+
message: error.error.message
|
|
366
|
+
};
|
|
367
|
+
}), finalize(() => {
|
|
368
|
+
const url = toHref(req.urlWithParams);
|
|
369
|
+
this.routerTracerService.getCurrentSession().restRequests.push({
|
|
370
|
+
id: id,
|
|
371
|
+
method: req.method,
|
|
372
|
+
protocol: url.protocol.slice(0, -1),
|
|
373
|
+
host: exctractHost(url.host),
|
|
374
|
+
port: +url.port,
|
|
375
|
+
path: url.pathname,
|
|
376
|
+
query: url.search.slice(1, url.search.length),
|
|
377
|
+
contentType: req.responseType,
|
|
378
|
+
authScheme: extractAuthScheme(req.headers),
|
|
379
|
+
status: +status,
|
|
380
|
+
inDataSize: sizeOf(responseBody),
|
|
381
|
+
ouDataSize: sizeOf(req.body),
|
|
382
|
+
start: start,
|
|
383
|
+
end: dateNow(),
|
|
384
|
+
exception: exception
|
|
385
|
+
});
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HttpInterceptorService, deps: [{ token: RouteTracerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
389
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HttpInterceptorService, providedIn: 'root' }); }
|
|
390
|
+
}
|
|
391
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HttpInterceptorService, decorators: [{
|
|
392
|
+
type: Injectable,
|
|
393
|
+
args: [{ providedIn: 'root' }]
|
|
394
|
+
}], ctorParameters: () => [{ type: RouteTracerService }] });
|
|
395
|
+
function toHref(url) {
|
|
396
|
+
const href = document.createElement('a');
|
|
397
|
+
href.setAttribute('href', url);
|
|
398
|
+
return href;
|
|
399
|
+
}
|
|
400
|
+
function exctractHost(path) {
|
|
401
|
+
const portregex = /:\d+/;
|
|
402
|
+
return path.replace(portregex, '');
|
|
403
|
+
}
|
|
404
|
+
function extractAuthScheme(headers) {
|
|
405
|
+
return headers.has('authorization')
|
|
406
|
+
? headers.get('authorization').match(/^(\w+) /)?.at(1)
|
|
407
|
+
: undefined;
|
|
408
|
+
}
|
|
409
|
+
function getReqid(headers) {
|
|
410
|
+
return headers.has('x-tracert')
|
|
411
|
+
? headers.get('x-tracert')
|
|
412
|
+
: undefined;
|
|
413
|
+
}
|
|
414
|
+
function sizeOf(body) {
|
|
415
|
+
return body ? JSON.stringify(body).length : 0;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
class NgCollectorModule {
|
|
419
|
+
static forRoot(host, configuration) {
|
|
420
|
+
if (configuration?.enabled
|
|
421
|
+
&& validate(host, HOST_PATERN)
|
|
422
|
+
&& validate(getStringOrCall(configuration?.sessionApi), PATH_PATERN)
|
|
423
|
+
&& validate(getStringOrCall(configuration?.instanceApi), PATH_PATERN)) {
|
|
424
|
+
if (!requirePostitiveValue(getNumberOrCall(configuration?.delay), "delay") ||
|
|
425
|
+
!requirePostitiveValue(getNumberOrCall(configuration?.bufferMaxSize), "bufferMaxSize")) {
|
|
426
|
+
logTraceapi('warn', 'invalid Configuration, Ng-collector is disabled');
|
|
427
|
+
return { ngModule: NgCollectorModule };
|
|
428
|
+
}
|
|
429
|
+
return {
|
|
430
|
+
ngModule: NgCollectorModule,
|
|
431
|
+
providers: [
|
|
432
|
+
RouteTracerService,
|
|
433
|
+
SessionManager,
|
|
434
|
+
{ provide: APP_INITIALIZER, useFactory: initializeRoutingEvents, deps: [RouteTracerService], multi: true },
|
|
435
|
+
{ provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },
|
|
436
|
+
{ provide: 'config', useValue: configuration },
|
|
437
|
+
{ provide: 'host', useValue: host }
|
|
438
|
+
]
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
return {
|
|
442
|
+
ngModule: NgCollectorModule
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
446
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule }); }
|
|
447
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule }); }
|
|
448
|
+
}
|
|
449
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule, decorators: [{
|
|
450
|
+
type: NgModule,
|
|
451
|
+
args: [{}]
|
|
452
|
+
}] });
|
|
453
|
+
function initializeRoutingEvents(routeTracerService) {
|
|
454
|
+
return () => routeTracerService.initialize();
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/*
|
|
458
|
+
* Public API Surface of inspect-ng-collector
|
|
459
|
+
*/
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Generated bundle index. Do not edit.
|
|
463
|
+
*/
|
|
464
|
+
|
|
465
|
+
export { NgCollectorModule, initializeRoutingEvents };
|
|
466
|
+
//# sourceMappingURL=oneteme-inspect-ng-collector.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneteme-inspect-ng-collector.mjs","sources":["../../../../projects/oneteme/inspect-ng-collector/src/lib/util.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/session-manager.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/route-tracer.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/http-interceptor.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/ng-collector.module.ts","../../../../projects/oneteme/inspect-ng-collector/src/public-api.ts","../../../../projects/oneteme/inspect-ng-collector/src/oneteme-inspect-ng-collector.ts"],"sourcesContent":["import { MainSession, RestRequest } from \"./trace.model\";\n\nlet WIN:any = window;\nlet c:any = console;\n\nexport const HOST_PATERN = /https?:\\/\\/[\\w\\-\\.]+(:\\d{2,5})?\\/?/;\nexport const PATH_PATERN = /[\\w\\-\\{\\}]+(\\/[\\w\\-\\{\\}]+)*/;\n\nexport function dateNow() {\n return Date.now() / 1_000;\n}\n\nexport function logTraceapi(fn:string ,...args: any[]){\n\n if(WIN[\"traceapi\"]){\n if( typeof c[fn] === 'function'){\n c[fn]('[TRACEAPI]', ...args)\n }\n }\n}\n\nexport function prettySessionFormat(session: MainSession){\n let s=\"\";\n if(WIN['debug']){\n s = `[${session.name}]`;\n if(session.user != null){\n s+= `<${session.user}>`\n }\n if(session.location){\n s+= `(${session.location}) `\n }\n s+=prettyDurationFormat(session.start,session.end!);\n session.restRequests.forEach(r => {\n s+= prettyRestRequestFormat(r);\n })\n }\n return s;\n}\n\nfunction prettyRestRequestFormat(rest: RestRequest){\n let s = ` - [${rest.method}]`\n if(rest.protocol){\n s+= `${rest.protocol}://`\n }\n\n if(rest.host){\n s+= rest.host\n }\n\n if(rest.port > 0){\n s+= `:${rest.port}`\n }\n\n if(rest.path){\n if(!rest.path.startsWith(\"/\") && !s.endsWith(\"/\")){\n s+= '/'\n }\n s+= rest.path;\n }\n\n if(rest.query){\n s+= rest.query\n }\n\n if(rest.exception?.type){\n s+= ` ${rest.exception?.type}:`;\n }\n\n if(rest.exception?.message){\n s+= ` ${rest.exception.message}`;\n }\n s+= ` >> ${rest.status}`\n s+= prettyDurationFormat(rest.start,rest.end);\n return s;\n}\n\nfunction prettyDurationFormat(start:number,end:number){\n return start && end ? `(in ${ new Date(end*1000).getTime()- new Date(start*1000).getTime() } ms) \\n` : '';\n}\n\n\n\nexport function validate(v: string | undefined, pattern: RegExp) {\n if(v && pattern.exec(v)){\n return true;\n }\n\n\n logTraceapi('warn',\"bad value=\" + v + \", pattern=\" + pattern);\n return false;\n}\n\nexport function requirePostitiveValue(v: number | undefined, name: string){\n if(v == undefined || (v && v > 0)) {\n return true;\n }\n\n logTraceapi('warn',name +'='+ v + \" <= 0\");\n return false;\n}\n\nexport function getNumberOrCall(o?: number | (() => number)): number | undefined {\n return typeof o === \"function\" ? o() : o;\n}\n\nexport function getStringOrCall(o?: string | (() => string)): string | undefined {\n return typeof o === \"function\" ? o() : o;\n}\n\nexport function getRegArrOrCall(o?: RegExp[] | (() => RegExp[])): RegExp[] | undefined {\n return typeof o === \"function\" ? o() : o;\n}\n\nexport function detectBrowser() {\n try {\n const agent = window.navigator.userAgent.toLowerCase()\n switch (true) {\n case agent.indexOf('edge') > -1:\n return 'edge';\n case agent.indexOf('opr') > -1:\n return 'opera';\n case agent.indexOf('chrome') > -1:\n return 'chrome';\n case agent.indexOf('firefox') > -1:\n return 'firefox';\n case agent.indexOf('safari') > -1:\n return 'safari';\n }\n }\n catch (e) {\n console.error(e);\n }\n return undefined;\n\n}\n\nexport function detectOs() {\n try {\n let versionMatch, version;\n const agent = window.navigator.userAgent.toLowerCase()\n switch (true) {\n case (/windows/.test(agent)):\n\n versionMatch = /windows nt (\\d+\\.\\d+)/.exec(agent);\n version = versionMatch ? versionMatch[1] : 'Unknown';\n return `Windows ${version}`;\n case (/linux/.test(agent)):\n return 'Linux';\n\n case (/macintosh/.test(agent)):\n versionMatch = /mac os x (\\d+[._]\\d+[._]\\d+)/.exec(agent);\n version = versionMatch ? versionMatch[1] : 'Unknown';\n return `MacOs ${version}`\n }\n }\n catch (e) {\n console.error(e);\n }\n return undefined;\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { InstanceEnvironment, MainSession } from './trace.model';\nimport { BehaviorSubject, from, interval, Observable, of, Subscription, tap } from 'rxjs';\nimport { dateNow, detectBrowser, detectOs, getNumberOrCall, getStringOrCall, logTraceapi } from './util';\n\nconst SLASH = '/';\n\n@Injectable({ providedIn: 'root' })\nexport class SessionManager implements OnDestroy {\n\n logServerMain!: string;\n logInstanceEnv!: string;\n maxBufferSize!: number;\n delay!:number\n instanceEnvironment !: InstanceEnvironment;\n scheduledSessionSender!: Subscription;\n sessionQueue: MainSession[]= [];\n sessionSendAttempts: number = 0\n InstanceEnvSendAttempts: number = 0;\n instance!: BehaviorSubject<string>;\n sendSessionfinished:boolean= true;\n sendInstanceEnvFinished: boolean = true;\n constructor(){\n\n }\n\n\n initialize(config:any, host:string) {\n this.logServerMain = this.sessionApiURL(host,getStringOrCall(config.sessionApi)!);\n this.logInstanceEnv = this.instanceApiURL(host,getStringOrCall(config.instanceApi)!);\n this.maxBufferSize = getNumberOrCall(config.bufferMaxSize) ?? 1000;\n this.delay = getNumberOrCall(config.delay) ?? 60000;\n this.instanceEnvironment = {\n name: getStringOrCall(config.name),\n version: getStringOrCall(config.version),\n address: undefined, //server side\n env: getStringOrCall(config.env),\n os: detectOs(),\n re: detectBrowser(),\n user: undefined, // cannot get user\n type: \"CLIENT\",\n instant: dateNow(),\n collector: \"inspect-ng-collector-0.0.1\"\n }\n\n this.scheduledSessionSender = interval(this.delay)\n .pipe(tap(()=> {\n if(this.sendSessionfinished){\n this.sendSessions();\n }}))\n .subscribe();\n }\n\n addSessions(sessions:MainSession){\n this.sessionQueue.push(sessions);\n logTraceapi('log',\"added element to session queue, new size is: \"+ this.sessionQueue.length);\n }\n\n\n sendSessions() {\n if(this.sessionQueue.length> 0){\n this.getInsertedInstanceId().subscribe((id:string|null)=>{\n if(id) {\n this.sendSessionfinished = false;\n let sessions: MainSession[] = [...this.sessionQueue];\n this.sessionQueue.splice(0,sessions.length); // add rest of sessions\n logTraceapi('log',`sending sessions, attempts:${++this.sessionSendAttempts}, queue size : ${sessions.length}`)\n\n const requestOptions = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n },\n body: JSON.stringify(sessions)\n };\n\n fetch(this.logServerMain, requestOptions)\n .then(data=> {\n if(data.ok){\n logTraceapi('log','sessions sent successfully, queue size reset, new size is: '+this.sessionQueue.length)\n this.sessionSendAttempts= 0;\n }else{\n logTraceapi('warn',`Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`)//\n this.revertQueueSize(sessions);\n }\n })\n .catch(error => {\n logTraceapi('warn',`Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`)//\n logTraceapi('warn',error)\n this.revertQueueSize(sessions);\n }).finally( ()=> {\n this.sendSessionfinished = true;\n })\n\n }else {\n logTraceapi('warn',`Error while attempting to send Environement instance, attempts ${this.sessionSendAttempts}`);\n }\n })\n }\n }\n\n revertQueueSize(sessions: MainSession[]){\n this.sessionQueue.unshift(...sessions);\n if(this.sessionQueue.length > this.maxBufferSize ){\n let diff = this.sessionQueue.length - this.maxBufferSize;\n this.sessionQueue = this.sessionQueue.slice(0,this.maxBufferSize);\n logTraceapi('log','Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):'+diff)\n }\n }\n\n getInsertedInstanceId() : Observable<any> {\n if(this.instance){\n return this.instance;\n }\n if(this.sendInstanceEnvFinished){\n this.sendInstanceEnvFinished = false;\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*' // retest\n },\n body: JSON.stringify(this.instanceEnvironment)\n };\n this.sessionSendAttempts++;\n return from( fetch(this.logInstanceEnv,requestOptions)\n .then(res => res.ok ? res.text().then(id=> {\n this.instance = new BehaviorSubject<string>(id);\n this.logServerMain =this.logServerMain.replace(':id',id);\n this.sessionSendAttempts=0;\n logTraceapi('log','Environement instance sent successfully');\n return id; // return logserverMain\n }) : null)\n .catch(err => {\n logTraceapi('warn',err)\n return null;\n }).finally(()=> {\n this.sendInstanceEnvFinished = true;\n }))\n }\n return of(null);\n }\n\n instanceApiURL(host:string, path:string){\n return this.toURL(host,path);\n }\n\n sessionApiURL(host:string, path:string){\n return this.toURL(host,path);\n }\n\n toURL( host:string, path:string ){\n return host.endsWith(SLASH) || path.startsWith(SLASH) ? host + path : [host,path].join(SLASH);\n }\n\n ngOnDestroy(): void {\n if(this.scheduledSessionSender){\n this.scheduledSessionSender.unsubscribe();\n }\n }\n}\n","import { Inject, Injectable, OnDestroy} from \"@angular/core\";\nimport { NavigationEnd, NavigationStart, Router } from \"@angular/router\";\nimport { MainSession } from \"./trace.model\";\nimport { ApplicationConf} from \"./ng-collector.module\";\nimport { dateNow, getRegArrOrCall, getStringOrCall, logTraceapi, prettySessionFormat } from \"./util\";\nimport { SessionManager } from \"./session-manager.service\";\n\n\nconst SLASH = '/';\n@Injectable({ providedIn: 'root' }) \nexport class RouteTracerService implements OnDestroy{\n\n\n currentSession!: MainSession; \n user?: string;\n trySendInstanceEnv:any;\n excludeList: RegExp[] | undefined;\n sessionManager : SessionManager;\n constructor(private router: Router,\n @Inject('config') config: ApplicationConf,\n @Inject('host') host: string) {\n this.sessionManager = new SessionManager();\n this.excludeList = getRegArrOrCall(config.exclude);\n this.sessionManager.initialize(config,host);\n this.user = getStringOrCall(config.user);\n }\n\n private beforeUnloadHandler = (event: BeforeUnloadEvent): void => {\n this.currentSession.end = dateNow();\n if(this.excludeList!.every((e) => !e.test(this.currentSession.location))){\n this.sessionManager.addSessions(this.currentSession);//force \n this.sessionManager.sendSessions();\n }\n }\n\n ngOnDestroy(): void { \n window.removeEventListener('beforeunload',this.beforeUnloadHandler); \n }\n\n initialize() {\n logTraceapi('log','initialize');\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n this.router.events.subscribe(event => {\n if (event instanceof NavigationStart) {\n const now = dateNow();\n if (this.currentSession) {\n this.currentSession.end = dateNow();\n if(this.excludeList!.every((e) => !e.test(this.currentSession.location))){\n this.sessionManager.addSessions(this.currentSession);\n }\n logTraceapi('log',prettySessionFormat(this.currentSession));\n }\n this.currentSession = {\n '@type': \"main\",\n user: this.user,\n start: now,\n type: \"VIEW\",\n location: event.url,\n restRequests: []\n }\n }\n if (event instanceof NavigationEnd) {\n this.currentSession.name = document.title;\n this.currentSession.location = document.URL; \n\n }\n })\n\n }\n\n getCurrentSession() {\n return this.currentSession;\n }\n}\n\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { tap, finalize } from 'rxjs/operators'\nimport { RouteTracerService } from './route-tracer.service';\nimport { ExceptionInfo } from './trace.model';\nimport { dateNow } from './util';\n\n@Injectable({ providedIn: 'root' })\nexport class HttpInterceptorService implements HttpInterceptor {\n\n constructor(private routerTracerService: RouteTracerService) { }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const start = dateNow();\n let status: number, responseBody: any = '', exception: ExceptionInfo;\n let id: string| undefined;\n return next.handle(req).pipe(tap(\n (event: any) => {\n if (event instanceof HttpResponse) {\n status = +event.status;\n responseBody = event.body\n id = getReqid(event.headers);\n }\n },\n error => {\n console.log(error)\n id = getReqid(error.headers);\n status = +error.status;\n exception = {\n type: error.error.error,\n message: error.error.message\n }\n },\n ), finalize(() => {\n\n const url = toHref(req.urlWithParams);\n this.routerTracerService.getCurrentSession().restRequests.push({\n id: id,\n method: req.method,\n protocol: url.protocol.slice(0, -1),\n host: exctractHost(url.host),\n port: +url.port,\n path: url.pathname,\n query: url.search.slice(1, url.search.length),\n contentType: req.responseType,\n authScheme: extractAuthScheme(req.headers),\n status: +status,\n inDataSize: sizeOf(responseBody),\n ouDataSize: sizeOf(req.body),\n start: start,\n end: dateNow(),\n exception: exception\n });\n }));\n }\n}\n\nfunction toHref(url: string): HTMLAnchorElement {\n const href = document.createElement('a');\n href.setAttribute('href', url);\n return href;\n}\n\nfunction exctractHost(path: string) {\n const portregex = /:\\d+/;\n return path.replace(portregex, '')\n}\n\nfunction extractAuthScheme(headers: any): string | undefined {\n return headers.has('authorization')\n ? headers.get('authorization').match(/^(\\w+) /)?.at(1)\n : undefined;\n}\n\nfunction getReqid(headers:any):string | undefined {\n return headers.has('x-tracert')\n ? headers.get('x-tracert')\n : undefined;\n}\n\nfunction sizeOf(body: any): number {\n return body ? JSON.stringify(body).length : 0;\n}\n","import { NgModule, APP_INITIALIZER, ModuleWithProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS, } from '@angular/common/http';\nimport { HttpInterceptorService } from './http-interceptor.service';\nimport { RouteTracerService } from './route-tracer.service';\nimport { getNumberOrCall, logTraceapi, requirePostitiveValue, validate, HOST_PATERN, PATH_PATERN, getStringOrCall } from './util';\nimport { SessionManager } from './session-manager.service';\n\n\n\n@NgModule({})\nexport class NgCollectorModule {\n\n static forRoot(host: string, configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule> {\n if (configuration?.enabled\n && validate(host, HOST_PATERN)\n && validate(getStringOrCall(configuration?.sessionApi), PATH_PATERN)\n && validate(getStringOrCall(configuration?.instanceApi), PATH_PATERN)) {\n\n\n if(!requirePostitiveValue(getNumberOrCall(configuration?.delay),\"delay\") ||\n !requirePostitiveValue(getNumberOrCall(configuration?.bufferMaxSize),\"bufferMaxSize\") ){\n logTraceapi('warn','invalid Configuration, Ng-collector is disabled');\n return {ngModule: NgCollectorModule}\n }\n\n return {\n ngModule: NgCollectorModule,\n providers: [\n RouteTracerService,\n SessionManager,\n { provide: APP_INITIALIZER, useFactory: initializeRoutingEvents, deps: [RouteTracerService], multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },\n { provide: 'config', useValue: configuration },\n { provide: 'host', useValue: host }\n ]\n };\n }\n return {\n ngModule: NgCollectorModule\n }\n\n }\n}\n\nexport function initializeRoutingEvents(routeTracerService: RouteTracerService) {\n return () => routeTracerService.initialize();\n}\n\nexport interface ApplicationConf {\n name?: string | (() => string);\n version?: string | (() => string);\n env?: string | (() => string);\n user?: string | (() => string);\n bufferMaxSize?: number | (() => number);\n delay?: number| (() => number);\n instanceApi?: string | (() => string);\n sessionApi?: string | (() => string);\n exclude?: RegExp[] | (() => RegExp[]);\n enabled?: boolean;\n}\n","/*\n * Public API Surface of inspect-ng-collector\n */\n\n\nexport * from './lib/ng-collector.module';\n\n ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["SLASH","tap","i1.RouteTracerService"],"mappings":";;;;;;;;AAEA,IAAI,GAAG,GAAO,MAAM,CAAC;AACrB,IAAI,CAAC,GAAO,OAAO,CAAC;AAEb,MAAM,WAAW,GAAG,oCAAoC,CAAC;AACzD,MAAM,WAAW,GAAG,6BAA6B,CAAC;SAEzC,OAAO,GAAA;AACnB,IAAA,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAK,CAAC;AAC9B,CAAC;SAEe,WAAW,CAAC,EAAS,EAAE,GAAG,IAAW,EAAA;AAEnD,IAAA,IAAG,GAAG,CAAC,UAAU,CAAC,EAAC;QACf,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,UAAU,EAAC;YAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAA;SAC7B;KACF;AACL,CAAC;AAEK,SAAU,mBAAmB,CAAC,OAAoB,EAAA;IACtD,IAAI,CAAC,GAAC,EAAE,CAAC;AACT,IAAA,IAAG,GAAG,CAAC,OAAO,CAAC,EAAC;AACb,QAAA,CAAC,GAAI,CAAI,CAAA,EAAA,OAAO,CAAC,IAAI,GAAG,CAAC;AAC1B,QAAA,IAAG,OAAO,CAAC,IAAI,IAAI,IAAI,EAAC;AACtB,YAAA,CAAC,IAAG,CAAI,CAAA,EAAA,OAAO,CAAC,IAAI,GAAG,CAAA;SACxB;AACD,QAAA,IAAG,OAAO,CAAC,QAAQ,EAAC;AAClB,YAAA,CAAC,IAAG,CAAI,CAAA,EAAA,OAAO,CAAC,QAAQ,IAAI,CAAA;SAC7B;QACD,CAAC,IAAE,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAC,OAAO,CAAC,GAAI,CAAC,CAAC;AACpD,QAAA,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAG;AAC/B,YAAA,CAAC,IAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AACjC,SAAC,CAAC,CAAA;KACH;AACD,IAAA,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAiB,EAAA;AAChD,IAAA,IAAI,CAAC,GAAG,CAAA,MAAA,EAAS,IAAI,CAAC,MAAM,GAAG,CAAA;AAC/B,IAAA,IAAG,IAAI,CAAC,QAAQ,EAAC;AACf,QAAA,CAAC,IAAG,CAAG,EAAA,IAAI,CAAC,QAAQ,KAAK,CAAA;KAC1B;AAED,IAAA,IAAG,IAAI,CAAC,IAAI,EAAC;AACX,QAAA,CAAC,IAAG,IAAI,CAAC,IAAI,CAAA;KACd;AAED,IAAA,IAAG,IAAI,CAAC,IAAI,GAAG,CAAC,EAAC;AACf,QAAA,CAAC,IAAG,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,EAAE,CAAA;KACpB;AAED,IAAA,IAAG,IAAI,CAAC,IAAI,EAAC;AACX,QAAA,IAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAC;YAChD,CAAC,IAAG,GAAG,CAAA;SACR;AACD,QAAA,CAAC,IAAG,IAAI,CAAC,IAAI,CAAC;KACf;AAED,IAAA,IAAG,IAAI,CAAC,KAAK,EAAC;AACZ,QAAA,CAAC,IAAG,IAAI,CAAC,KAAK,CAAA;KACf;AAED,IAAA,IAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAC;QACtB,CAAC,IAAG,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC;KACjC;AAED,IAAA,IAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAC;QACzB,CAAC,IAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;KAClC;AACD,IAAA,CAAC,IAAG,CAAO,IAAA,EAAA,IAAI,CAAC,MAAM,EAAE,CAAA;IACxB,CAAC,IAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9C,IAAA,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAY,EAAC,GAAU,EAAA;AACjD,IAAA,OAAQ,KAAK,IAAI,GAAG,GAAG,CAAA,IAAA,EAAQ,IAAI,IAAI,CAAC,GAAG,GAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAE,IAAI,IAAI,CAAC,KAAK,GAAC,IAAI,CAAC,CAAC,OAAO,EAAG,CAAS,OAAA,CAAA,GAAG,EAAE,CAAC;AAC/G,CAAC;AAIe,SAAA,QAAQ,CAAC,CAAqB,EAAE,OAAe,EAAA;IAC5D,IAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;AACrB,QAAA,OAAO,IAAI,CAAC;KACd;IAGD,WAAW,CAAC,MAAM,EAAC,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC;AAC9D,IAAA,OAAO,KAAK,CAAC;AAChB,CAAC;AAEe,SAAA,qBAAqB,CAAC,CAAqB,EAAE,IAAY,EAAA;AACvE,IAAA,IAAG,CAAC,IAAI,SAAS,KAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AAClC,QAAA,OAAO,IAAI,CAAC;KACb;IAED,WAAW,CAAC,MAAM,EAAC,IAAI,GAAE,GAAG,GAAE,CAAC,GAAG,OAAO,CAAC,CAAC;AAC3C,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAEK,SAAU,eAAe,CAAC,CAA2B,EAAA;AACzD,IAAA,OAAO,OAAO,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAEK,SAAU,eAAe,CAAC,CAA2B,EAAA;AACzD,IAAA,OAAO,OAAO,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAEK,SAAU,eAAe,CAAC,CAA+B,EAAA;AAC7D,IAAA,OAAO,OAAO,CAAC,KAAK,UAAU,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;SAEe,aAAa,GAAA;AAC3B,IAAA,IAAI;QACA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtD,QAAQ,IAAI;YACR,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3B,gBAAA,OAAO,MAAM,CAAC;YAClB,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1B,gBAAA,OAAO,OAAO,CAAC;YACnB,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7B,gBAAA,OAAO,QAAQ,CAAC;YACpB,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9B,gBAAA,OAAO,SAAS,CAAC;YACrB,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7B,gBAAA,OAAO,QAAQ,CAAC;SACvB;KACJ;IACD,OAAO,CAAC,EAAE;AACN,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpB;AACD,IAAA,OAAO,SAAS,CAAC;AAEnB,CAAC;SAEe,QAAQ,GAAA;AACtB,IAAA,IAAI;QACA,IAAI,YAAY,EAAE,OAAO,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtD,QAAQ,IAAI;AACR,YAAA,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AAEvB,gBAAA,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnD,gBAAA,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACrD,OAAO,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAC;AAChC,YAAA,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACrB,gBAAA,OAAO,OAAO,CAAC;AAEnB,YAAA,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,gBAAA,YAAY,GAAG,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1D,gBAAA,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACrD,OAAO,CAAA,MAAA,EAAS,OAAO,CAAA,CAAE,CAAA;SAChC;KACJ;IACD,OAAO,CAAC,EAAE;AACN,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpB;AACD,IAAA,OAAO,SAAS,CAAC;AACnB;;AC1JA,MAAMA,OAAK,GAAG,GAAG,CAAC;MAGL,cAAc,CAAA;AAcvB,IAAA,WAAA,GAAA;QANA,IAAY,CAAA,YAAA,GAAiB,EAAE,CAAC;QAChC,IAAmB,CAAA,mBAAA,GAAW,CAAC,CAAA;QAC/B,IAAuB,CAAA,uBAAA,GAAW,CAAC,CAAC;QAEpC,IAAmB,CAAA,mBAAA,GAAU,IAAI,CAAC;QAClC,IAAuB,CAAA,uBAAA,GAAY,IAAI,CAAC;KAGvC;IAGD,UAAU,CAAC,MAAU,EAAE,IAAW,EAAA;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAE,CAAC,CAAC;AAClF,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAE,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,GAAI,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;QACpE,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACpD,IAAI,CAAC,mBAAmB,GAAG;AACvB,YAAA,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;AAClC,YAAA,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,SAAS;AAClB,YAAA,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;YAChC,EAAE,EAAE,QAAQ,EAAE;YACd,EAAE,EAAE,aAAa,EAAE;YACnB,IAAI,EAAE,SAAS;AACf,YAAA,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO,EAAE;AAClB,YAAA,SAAS,EAAE,4BAA4B;SAC1C,CAAA;QAED,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACjD,aAAA,IAAI,CAAC,GAAG,CAAC,MAAI;AACV,YAAA,IAAG,IAAI,CAAC,mBAAmB,EAAC;gBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;aACvB;AAAA,SAAC,CAAC,CAAC;AACP,aAAA,SAAS,EAAE,CAAC;KAChB;AAED,IAAA,WAAW,CAAC,QAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,WAAW,CAAC,KAAK,EAAC,+CAA+C,GAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;KAChG;IAGD,YAAY,GAAA;QACR,IAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAE,CAAC,EAAC;YAC3B,IAAI,CAAC,qBAAqB,EAAE,CAAC,SAAS,CAAC,CAAC,EAAc,KAAG;gBACrD,IAAG,EAAE,EAAE;AACH,oBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;oBACjC,IAAI,QAAQ,GAAkB,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;AACrD,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC5C,oBAAA,WAAW,CAAC,KAAK,EAAC,CAAA,2BAAA,EAA8B,EAAE,IAAI,CAAC,mBAAmB,CAAA,eAAA,EAAkB,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC,CAAA;AAE9G,oBAAA,MAAM,cAAc,GAAG;AACnB,wBAAA,MAAM,EAAE,KAAK;AACb,wBAAA,OAAO,EAAE;AACL,4BAAA,cAAc,EAAE,kBAAkB;AAClC,4BAAA,6BAA6B,EAAE,GAAG;AACrC,yBAAA;AACD,wBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;qBACjC,CAAC;AAEF,oBAAA,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;yBACxC,IAAI,CAAC,IAAI,IAAE;AACR,wBAAA,IAAG,IAAI,CAAC,EAAE,EAAC;4BACP,WAAW,CAAC,KAAK,EAAC,6DAA6D,GAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;AACzG,4BAAA,IAAI,CAAC,mBAAmB,GAAE,CAAC,CAAC;yBAC/B;6BAAI;4BACD,WAAW,CAAC,MAAM,EAAC,CAAsD,mDAAA,EAAA,IAAI,CAAC,mBAAmB,CAAE,CAAA,CAAC,CAAA;AACpG,4BAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;yBAClC;AACL,qBAAC,CAAC;yBACD,KAAK,CAAC,KAAK,IAAG;wBACX,WAAW,CAAC,MAAM,EAAC,CAAsD,mDAAA,EAAA,IAAI,CAAC,mBAAmB,CAAE,CAAA,CAAC,CAAA;AACpG,wBAAA,WAAW,CAAC,MAAM,EAAC,KAAK,CAAC,CAAA;AACzB,wBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,qBAAC,CAAC,CAAC,OAAO,CAAE,MAAI;AACZ,wBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AACpC,qBAAC,CAAC,CAAA;iBAEL;qBAAK;oBACF,WAAW,CAAC,MAAM,EAAC,CAAA,+DAAA,EAAkE,IAAI,CAAC,mBAAmB,CAAE,CAAA,CAAC,CAAC;iBACpH;AACL,aAAC,CAAC,CAAA;SACL;KACJ;AAED,IAAA,eAAe,CAAC,QAAuB,EAAA;QACnC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvC,IAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YAC9C,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;AACzD,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAClE,YAAA,WAAW,CAAC,KAAK,EAAC,6GAA6G,GAAC,IAAI,CAAC,CAAA;SACxI;KACJ;IAED,qBAAqB,GAAA;AACjB,QAAA,IAAG,IAAI,CAAC,QAAQ,EAAC;YACb,OAAO,IAAI,CAAC,QAAQ,CAAC;SACxB;AACD,QAAA,IAAG,IAAI,CAAC,uBAAuB,EAAC;AAC5B,YAAA,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;AACrC,YAAA,MAAM,cAAc,GAAG;AACnB,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE;AACL,oBAAA,cAAc,EAAE,kBAAkB;oBAClC,6BAA6B,EAAE,GAAG;AACrC,iBAAA;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC;aACjD,CAAC;YACF,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAE,KAAK,CAAC,IAAI,CAAC,cAAc,EAAC,cAAc,CAAC;iBACrD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAE;gBACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,GAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAC,EAAE,CAAC,CAAC;AACzD,gBAAA,IAAI,CAAC,mBAAmB,GAAC,CAAC,CAAC;AAC3B,gBAAA,WAAW,CAAC,KAAK,EAAC,yCAAyC,CAAC,CAAC;gBAC7D,OAAO,EAAE,CAAC;AACd,aAAC,CAAC,GAAG,IAAI,CAAC;iBACT,KAAK,CAAC,GAAG,IAAG;AACT,gBAAA,WAAW,CAAC,MAAM,EAAC,GAAG,CAAC,CAAA;AACvB,gBAAA,OAAO,IAAI,CAAC;AAChB,aAAC,CAAC,CAAC,OAAO,CAAC,MAAI;AACX,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;aACvC,CAAC,CAAC,CAAA;SACN;AACD,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;KACnB;IAED,cAAc,CAAC,IAAW,EAAE,IAAW,EAAA;QACnC,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;KAChC;IAED,aAAa,CAAC,IAAW,EAAE,IAAW,EAAA;QACnC,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;KAChC;IAED,KAAK,CAAE,IAAW,EAAG,IAAW,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAACA,OAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAACA,OAAK,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC,IAAI,CAACA,OAAK,CAAC,CAAC;KACjG;IAED,WAAW,GAAA;AACR,QAAA,IAAG,IAAI,CAAC,sBAAsB,EAAC;AAC3B,YAAA,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;SAC7C;KACJ;+GAxJQ,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA,CAAA,EAAA;;4FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACClC,MAAM,KAAK,GAAG,GAAG,CAAC;MAEL,kBAAkB,CAAA;AAQ3B,IAAA,WAAA,CAAoB,MAAc,EACZ,MAAuB,EACzB,IAAY,EAAA;QAFZ,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;AAS1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,CAAC,KAAwB,KAAU;AAC7D,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;YACpC,IAAG,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAC;gBACrE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACrD,gBAAA,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;aACtC;AACL,SAAC,CAAA;AAZG,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,EAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KAC5C;IAUD,WAAW,GAAA;QACP,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;KACvE;IAED,UAAU,GAAA;AACN,QAAA,WAAW,CAAC,KAAK,EAAC,YAAY,CAAC,CAAC;QAChC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAG;AACjC,YAAA,IAAI,KAAK,YAAY,eAAe,EAAE;AAClC,gBAAA,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;oBACpC,IAAG,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAC;wBACrE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;qBACxD;oBACD,WAAW,CAAC,KAAK,EAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;iBAC/D;gBACD,IAAI,CAAC,cAAc,GAAG;AAClB,oBAAA,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,oBAAA,KAAK,EAAE,GAAG;AACV,oBAAA,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,KAAK,CAAC,GAAG;AACnB,oBAAA,YAAY,EAAE,EAAE;iBACnB,CAAA;aACJ;AACD,YAAA,IAAI,KAAK,YAAY,aAAa,EAAE;gBAChC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC1C,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC;aAE/C;AACL,SAAC,CAAC,CAAA;KAEL;IAED,iBAAiB,GAAA;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;KAC9B;+GA9DQ,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EASf,QAAQ,EAAA,EAAA,EAAA,KAAA,EACR,MAAM,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAVT,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA,CAAA,EAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;0BAUzB,MAAM;2BAAC,QAAQ,CAAA;;0BACf,MAAM;2BAAC,MAAM,CAAA;;;MCXT,sBAAsB,CAAA;AAE/B,IAAA,WAAA,CAAoB,mBAAuC,EAAA;QAAvC,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAoB;KAAK;IAEhE,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AAC9C,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;AACxB,QAAA,IAAI,MAAc,EAAE,YAAY,GAAQ,EAAE,EAAE,SAAwB,CAAC;AACrE,QAAA,IAAI,EAAqB,CAAC;AAC1B,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAACC,KAAG,CAC5B,CAAC,KAAU,KAAI;AACX,YAAA,IAAI,KAAK,YAAY,YAAY,EAAE;AAC/B,gBAAA,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AACvB,gBAAA,YAAY,GAAG,KAAK,CAAC,IAAI,CAAA;AACzB,gBAAA,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aAChC;SACJ,EACD,KAAK,IAAG;AACJ,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AAClB,YAAA,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,YAAA,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AACvB,YAAA,SAAS,GAAG;AACR,gBAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;AACvB,gBAAA,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO;aAC/B,CAAA;AACL,SAAC,CACJ,EAAE,QAAQ,CAAC,MAAK;YAEb,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACtC,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;AAC3D,gBAAA,EAAE,EAAE,EAAE;gBACN,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnC,gBAAA,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,gBAAA,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI;gBACf,IAAI,EAAE,GAAG,CAAC,QAAQ;AAClB,gBAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7C,WAAW,EAAE,GAAG,CAAC,YAAY;AAC7B,gBAAA,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC1C,MAAM,EAAE,CAAC,MAAM;AACf,gBAAA,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC;AAChC,gBAAA,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,gBAAA,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,OAAO,EAAE;AACd,gBAAA,SAAS,EAAE,SAAS;AACvB,aAAA,CAAC,CAAC;SACN,CAAC,CAAC,CAAC;KACP;+GA9CQ,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA,CAAA,EAAA;;4FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;AAkDlC,SAAS,MAAM,CAAC,GAAW,EAAA;IACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACzC,IAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC/B,IAAA,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAA;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAY,EAAA;AACnC,IAAA,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAC/B,UAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;UACpD,SAAS,CAAC;AACpB,CAAC;AAED,SAAS,QAAQ,CAAC,OAAW,EAAA;AACzB,IAAA,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAC3B,UAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;UACxB,SAAS,CAAC;AACpB,CAAC;AAED,SAAS,MAAM,CAAC,IAAS,EAAA;AACrB,IAAA,OAAO,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAClD;;MCzEa,iBAAiB,CAAA;AAE5B,IAAA,OAAO,OAAO,CAAC,IAAY,EAAE,aAA8B,EAAA;QACzD,IAAI,aAAa,EAAE,OAAO;AACnB,eAAA,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;eAC3B,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC;eACjE,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE;YAGxE,IAAG,CAAC,qBAAqB,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,EAAC,OAAO,CAAC;AACrE,gBAAA,CAAC,qBAAqB,CAAC,eAAe,CAAC,aAAa,EAAE,aAAa,CAAC,EAAC,eAAe,CAAC,EAAE;AACrF,gBAAA,WAAW,CAAC,MAAM,EAAC,iDAAiD,CAAC,CAAC;AACxE,gBAAA,OAAO,EAAC,QAAQ,EAAE,iBAAiB,EAAC,CAAA;aACtC;YAEF,OAAO;AACL,gBAAA,QAAQ,EAAE,iBAAiB;AAC3B,gBAAA,SAAS,EAAE;oBACT,kBAAkB;oBAClB,cAAc;AACd,oBAAA,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC1G,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7E,oBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE;AAC9C,oBAAA,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;AACpC,iBAAA;aACF,CAAC;SACH;QACD,OAAO;AACL,YAAA,QAAQ,EAAE,iBAAiB;SAC5B,CAAA;KAEF;+GA/BU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAAjB,iBAAiB,EAAA,CAAA,CAAA,EAAA;gHAAjB,iBAAiB,EAAA,CAAA,CAAA,EAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,QAAQ;mBAAC,EAAE,CAAA;;AAmCN,SAAU,uBAAuB,CAAC,kBAAsC,EAAA;AAC5E,IAAA,OAAO,MAAM,kBAAkB,CAAC,UAAU,EAAE,CAAC;AAC/C;;AC9CA;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest } from '@angular/common/http';
|
|
3
|
+
import { RouteTracerService } from './route-tracer.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class HttpInterceptorService implements HttpInterceptor {
|
|
6
|
+
private routerTracerService;
|
|
7
|
+
constructor(routerTracerService: RouteTracerService);
|
|
8
|
+
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HttpInterceptorService, never>;
|
|
10
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<HttpInterceptorService>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ModuleWithProviders } from '@angular/core';
|
|
2
|
+
import { RouteTracerService } from './route-tracer.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgCollectorModule {
|
|
5
|
+
static forRoot(host: string, configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule>;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgCollectorModule, never>;
|
|
7
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgCollectorModule, never, never, never>;
|
|
8
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<NgCollectorModule>;
|
|
9
|
+
}
|
|
10
|
+
export declare function initializeRoutingEvents(routeTracerService: RouteTracerService): () => void;
|
|
11
|
+
export interface ApplicationConf {
|
|
12
|
+
name?: string | (() => string);
|
|
13
|
+
version?: string | (() => string);
|
|
14
|
+
env?: string | (() => string);
|
|
15
|
+
user?: string | (() => string);
|
|
16
|
+
bufferMaxSize?: number | (() => number);
|
|
17
|
+
delay?: number | (() => number);
|
|
18
|
+
instanceApi?: string | (() => string);
|
|
19
|
+
sessionApi?: string | (() => string);
|
|
20
|
+
exclude?: RegExp[] | (() => RegExp[]);
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OnDestroy } from "@angular/core";
|
|
2
|
+
import { Router } from "@angular/router";
|
|
3
|
+
import { MainSession } from "./trace.model";
|
|
4
|
+
import { ApplicationConf } from "./ng-collector.module";
|
|
5
|
+
import { SessionManager } from "./session-manager.service";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export declare class RouteTracerService implements OnDestroy {
|
|
8
|
+
private router;
|
|
9
|
+
currentSession: MainSession;
|
|
10
|
+
user?: string;
|
|
11
|
+
trySendInstanceEnv: any;
|
|
12
|
+
excludeList: RegExp[] | undefined;
|
|
13
|
+
sessionManager: SessionManager;
|
|
14
|
+
constructor(router: Router, config: ApplicationConf, host: string);
|
|
15
|
+
private beforeUnloadHandler;
|
|
16
|
+
ngOnDestroy(): void;
|
|
17
|
+
initialize(): void;
|
|
18
|
+
getCurrentSession(): MainSession;
|
|
19
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RouteTracerService, never>;
|
|
20
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<RouteTracerService>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { OnDestroy } from '@angular/core';
|
|
2
|
+
import { InstanceEnvironment, MainSession } from './trace.model';
|
|
3
|
+
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class SessionManager implements OnDestroy {
|
|
6
|
+
logServerMain: string;
|
|
7
|
+
logInstanceEnv: string;
|
|
8
|
+
maxBufferSize: number;
|
|
9
|
+
delay: number;
|
|
10
|
+
instanceEnvironment: InstanceEnvironment;
|
|
11
|
+
scheduledSessionSender: Subscription;
|
|
12
|
+
sessionQueue: MainSession[];
|
|
13
|
+
sessionSendAttempts: number;
|
|
14
|
+
InstanceEnvSendAttempts: number;
|
|
15
|
+
instance: BehaviorSubject<string>;
|
|
16
|
+
sendSessionfinished: boolean;
|
|
17
|
+
sendInstanceEnvFinished: boolean;
|
|
18
|
+
constructor();
|
|
19
|
+
initialize(config: any, host: string): void;
|
|
20
|
+
addSessions(sessions: MainSession): void;
|
|
21
|
+
sendSessions(): void;
|
|
22
|
+
revertQueueSize(sessions: MainSession[]): void;
|
|
23
|
+
getInsertedInstanceId(): Observable<any>;
|
|
24
|
+
instanceApiURL(host: string, path: string): string;
|
|
25
|
+
sessionApiURL(host: string, path: string): string;
|
|
26
|
+
toURL(host: string, path: string): string;
|
|
27
|
+
ngOnDestroy(): void;
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SessionManager, never>;
|
|
29
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SessionManager>;
|
|
30
|
+
}
|