@oneteme/inspect-ng-collector 1.0.1 → 1.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/fesm2022/oneteme-inspect-ng-collector.mjs +208 -34
- package/fesm2022/oneteme-inspect-ng-collector.mjs.map +1 -1
- package/index.d.ts +157 -5
- package/package.json +1 -1
- package/lib/configuration.d.ts +0 -45
- package/lib/http-interceptor.service.d.ts +0 -11
- package/lib/ng-collector.module.d.ts +0 -12
- package/lib/session-manager.service.d.ts +0 -27
- package/lib/trace.model.d.ts +0 -59
- package/lib/traceable-stage.decorator.d.ts +0 -1
- package/lib/util.d.ts +0 -5
- package/public-api.d.ts +0 -2
|
@@ -1,28 +1,43 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Inject, Injectable, APP_INITIALIZER, NgModule } from '@angular/core';
|
|
2
|
+
import { Inject, Injectable, APP_INITIALIZER, ErrorHandler, NgModule } from '@angular/core';
|
|
3
3
|
import { HttpResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
4
4
|
import { Router, NavigationStart, NavigationEnd } from '@angular/router';
|
|
5
5
|
import { tap as tap$1, finalize } from 'rxjs/operators';
|
|
6
6
|
import { interval, startWith, tap } from 'rxjs';
|
|
7
|
+
import { DOCUMENT } from '@angular/common';
|
|
7
8
|
|
|
8
9
|
const WIN = window;
|
|
9
10
|
function dateNow() {
|
|
10
11
|
return Date.now() / 1_000;
|
|
11
12
|
}
|
|
12
13
|
function initDebug(value) {
|
|
13
|
-
WIN["inspect"] = {
|
|
14
|
+
WIN["inspect"] = { app: value.app, user: value.user };
|
|
14
15
|
}
|
|
15
|
-
function logInspect(...args) {
|
|
16
|
-
if (WIN["inspect"]
|
|
16
|
+
function logInspect(level, ...args) {
|
|
17
|
+
if (WIN["inspect"][level]) {
|
|
17
18
|
if (args.length == 1 && typeof args[0] == 'function') {
|
|
18
19
|
args = args[0]();
|
|
19
20
|
if (!Array.isArray(args)) {
|
|
20
21
|
args = [args];
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
|
-
console.log(
|
|
24
|
+
console.log(`[INSPECT]-(${level})`, ...args);
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
function prettyActionUserFormat(session, userAction) {
|
|
28
|
+
let s = `(${session.location}) `;
|
|
29
|
+
if (userAction.type) {
|
|
30
|
+
s += `[${userAction.type}]`;
|
|
31
|
+
}
|
|
32
|
+
if (userAction.nodeName) {
|
|
33
|
+
s += `<${userAction.nodeName}>`;
|
|
34
|
+
}
|
|
35
|
+
if (userAction.name) {
|
|
36
|
+
s += `(${userAction.name}) `;
|
|
37
|
+
}
|
|
38
|
+
s += ` >> ${new Date(userAction.start * 1000).toISOString()}`;
|
|
39
|
+
return s;
|
|
40
|
+
}
|
|
26
41
|
function prettySessionFormat(session) {
|
|
27
42
|
let s = `[${session.name}]`;
|
|
28
43
|
if (session.user) {
|
|
@@ -85,7 +100,7 @@ function prettyLocalRequestFormat(local) {
|
|
|
85
100
|
return s;
|
|
86
101
|
}
|
|
87
102
|
function prettyDurationFormat(start, end) {
|
|
88
|
-
return start && end ? `(in ${(end - start).toFixed(2)}
|
|
103
|
+
return start && end ? `(in ${(end - start).toFixed(2)} s)` : '';
|
|
89
104
|
}
|
|
90
105
|
|
|
91
106
|
const SLASH = '/';
|
|
@@ -95,15 +110,16 @@ function validateAndGetConfig(conf) {
|
|
|
95
110
|
let host = matchRegex(getStringOrCall(conf.host), "host", HOST_PATERN);
|
|
96
111
|
let sessionApi = matchRegex(getStringOrCall(conf.sessionApi), "sessionApi", PATH_PATERN, "v3/trace/instance/:id/session");
|
|
97
112
|
let instanceApi = matchRegex(getStringOrCall(conf.instanceApi), "intanceApi", PATH_PATERN, "v3/trace/instance");
|
|
98
|
-
initDebug(conf.debug ?? false);
|
|
113
|
+
initDebug(conf.debug ?? { app: false, user: false });
|
|
99
114
|
return {
|
|
100
|
-
user:
|
|
115
|
+
user: typeof conf.user == 'function' ? conf.user : () => conf.user,
|
|
101
116
|
bufferMaxSize: requirePostitiveValue(getNumberOrCall(conf.bufferMaxSize), "bufferMaxSize", 1000),
|
|
102
117
|
delay: requirePostitiveValue(getNumberOrCall(conf.delay), "delay", 60000),
|
|
103
118
|
instanceApi: sessionApiURL(host, instanceApi),
|
|
104
119
|
sessionApi: instanceApiURL(host, sessionApi),
|
|
105
120
|
exclude: getRegArrOrCall(conf.exclude) || [],
|
|
106
|
-
debug: conf.debug ?? false,
|
|
121
|
+
debug: conf.debug ?? { app: false, user: false },
|
|
122
|
+
analytics: conf.analytics ?? false,
|
|
107
123
|
enabled: conf.enabled ?? false
|
|
108
124
|
};
|
|
109
125
|
}
|
|
@@ -231,7 +247,7 @@ class SessionManager {
|
|
|
231
247
|
}
|
|
232
248
|
}))
|
|
233
249
|
.subscribe();
|
|
234
|
-
logInspect('SessionManager initialized');
|
|
250
|
+
logInspect('app', 'SessionManager initialized');
|
|
235
251
|
}
|
|
236
252
|
static get instance() {
|
|
237
253
|
return SessionManager._instance;
|
|
@@ -243,20 +259,22 @@ class SessionManager {
|
|
|
243
259
|
this.currentSession.location = document.URL;
|
|
244
260
|
if (this.config.exclude.every((e) => !e.test(this.currentSession.location))) {
|
|
245
261
|
this.sessionQueue.push(this.currentSession);
|
|
246
|
-
logInspect(`added element to session queue, new size is:${this.sessionQueue.length}`);
|
|
262
|
+
logInspect('app', `added element to session queue, new size is:${this.sessionQueue.length}`);
|
|
247
263
|
}
|
|
248
|
-
logInspect(() => prettySessionFormat(this.currentSession));
|
|
264
|
+
logInspect('app', () => prettySessionFormat(this.currentSession));
|
|
249
265
|
}
|
|
250
266
|
if (url) {
|
|
251
267
|
this.currentSession = {
|
|
252
268
|
'@type': "main",
|
|
253
|
-
user: this.config.user,
|
|
269
|
+
user: this.config.user(),
|
|
254
270
|
start: dateNow(),
|
|
255
271
|
type: "VIEW",
|
|
256
272
|
location: url,
|
|
257
273
|
loading: true,
|
|
258
274
|
restRequests: [],
|
|
259
|
-
localRequests: []
|
|
275
|
+
localRequests: [],
|
|
276
|
+
userActions: [],
|
|
277
|
+
exceptions: []
|
|
260
278
|
};
|
|
261
279
|
}
|
|
262
280
|
}
|
|
@@ -280,11 +298,11 @@ class SessionManager {
|
|
|
280
298
|
this.sessionSendAttempts++;
|
|
281
299
|
let sessions = [...this.sessionQueue];
|
|
282
300
|
this.sessionQueue.splice(0, sessions.length); // add rest of sessions
|
|
283
|
-
logInspect(`sending sessions, attempts:${this.sessionSendAttempts}, queue size : ${sessions.length}`);
|
|
301
|
+
logInspect('app', `sending sessions, attempts:${this.sessionSendAttempts}, queue size : ${sessions.length}`);
|
|
284
302
|
return this.putSessions(sessions)
|
|
285
303
|
.then(ok => {
|
|
286
304
|
if (ok) {
|
|
287
|
-
logInspect(`sessions sent successfully, queue size reset, new size is: ${this.sessionQueue.length}`);
|
|
305
|
+
logInspect('app', `sessions sent successfully, queue size reset, new size is: ${this.sessionQueue.length}`);
|
|
288
306
|
this.sessionSendAttempts = 0;
|
|
289
307
|
return sessions.length;
|
|
290
308
|
}
|
|
@@ -317,7 +335,7 @@ class SessionManager {
|
|
|
317
335
|
})
|
|
318
336
|
.then(res => res.ok ? res.text().then(id => {
|
|
319
337
|
this.config.sessionApi = this.config.sessionApi.replace(':id', id);
|
|
320
|
-
logInspect('Environement instance sent successfully', id);
|
|
338
|
+
logInspect('app', 'Environement instance sent successfully', id);
|
|
321
339
|
this.sessionSendAttempts = 0;
|
|
322
340
|
return this.instanceEnvironment.id = id;
|
|
323
341
|
}) : null)
|
|
@@ -328,7 +346,7 @@ class SessionManager {
|
|
|
328
346
|
if (this.sessionQueue.length > this.config.bufferMaxSize) {
|
|
329
347
|
let diff = this.sessionQueue.length - this.config.bufferMaxSize;
|
|
330
348
|
this.sessionQueue = this.sessionQueue.slice(0, this.config.bufferMaxSize);
|
|
331
|
-
logInspect(`Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):${diff}`);
|
|
349
|
+
logInspect('app', `Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):${diff}`);
|
|
332
350
|
}
|
|
333
351
|
}
|
|
334
352
|
ngOnDestroy() {
|
|
@@ -339,10 +357,10 @@ class SessionManager {
|
|
|
339
357
|
getCurrentSession() {
|
|
340
358
|
return this.currentSession;
|
|
341
359
|
}
|
|
342
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
343
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
360
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: SessionManager, deps: [{ token: 'config' }, { token: 'instance' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
361
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: SessionManager, providedIn: 'root' }); }
|
|
344
362
|
}
|
|
345
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
363
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: SessionManager, decorators: [{
|
|
346
364
|
type: Injectable,
|
|
347
365
|
args: [{ providedIn: 'root' }]
|
|
348
366
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
@@ -404,10 +422,10 @@ class HttpInterceptorService {
|
|
|
404
422
|
}
|
|
405
423
|
}));
|
|
406
424
|
}
|
|
407
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
408
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
425
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: HttpInterceptorService, deps: [{ token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
426
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: HttpInterceptorService, providedIn: 'root' }); }
|
|
409
427
|
}
|
|
410
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
428
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: HttpInterceptorService, decorators: [{
|
|
411
429
|
type: Injectable,
|
|
412
430
|
args: [{ providedIn: 'root' }]
|
|
413
431
|
}], ctorParameters: () => [{ type: SessionManager }] });
|
|
@@ -451,22 +469,175 @@ function sizeOf(body) {
|
|
|
451
469
|
return body ? JSON.stringify(body).length : 0;
|
|
452
470
|
}
|
|
453
471
|
|
|
472
|
+
const genericMap = [
|
|
473
|
+
t => t.getAttribute('placeholder'),
|
|
474
|
+
t => t.getAttribute('title'),
|
|
475
|
+
t => t.innerText,
|
|
476
|
+
t => t.getAttribute('name'),
|
|
477
|
+
t => t.getAttribute('id'),
|
|
478
|
+
];
|
|
479
|
+
const MAP = {
|
|
480
|
+
'img': [
|
|
481
|
+
t => t.getAttribute('alt'),
|
|
482
|
+
t => t.getAttribute('src'),
|
|
483
|
+
],
|
|
484
|
+
'input': [
|
|
485
|
+
t => t.getAttribute('name'),
|
|
486
|
+
],
|
|
487
|
+
'a': [
|
|
488
|
+
t => t.getAttribute('href'),
|
|
489
|
+
],
|
|
490
|
+
'label': [
|
|
491
|
+
t => t.getAttribute('for'),
|
|
492
|
+
],
|
|
493
|
+
};
|
|
494
|
+
function getFirst(c, t) {
|
|
495
|
+
for (const o of c) {
|
|
496
|
+
let r = o(t)?.trim();
|
|
497
|
+
if (r) {
|
|
498
|
+
return r;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
function extractName(t) {
|
|
504
|
+
try {
|
|
505
|
+
let tagName = t.tagName;
|
|
506
|
+
if (tagName) {
|
|
507
|
+
let name;
|
|
508
|
+
let c = MAP[tagName.toLowerCase()];
|
|
509
|
+
if (c) {
|
|
510
|
+
name = getFirst(c, t);
|
|
511
|
+
}
|
|
512
|
+
return name ?? getFirst(genericMap, t);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
catch (err) {
|
|
516
|
+
console.warn(err);
|
|
517
|
+
}
|
|
518
|
+
return null;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
class AnalyticsCollector {
|
|
522
|
+
constructor(document, sessionManager) {
|
|
523
|
+
this.document = document;
|
|
524
|
+
this.sessionManager = sessionManager;
|
|
525
|
+
this.eventHandlers = {
|
|
526
|
+
'click': (target) => this.lookUpChild(target, 1),
|
|
527
|
+
};
|
|
528
|
+
this.patchedEvent = {};
|
|
529
|
+
this.elementsWithClickListeners = new WeakSet();
|
|
530
|
+
}
|
|
531
|
+
subscribeToEvents() {
|
|
532
|
+
const body = this.document.body;
|
|
533
|
+
body.addEventListener('click', (event) => this.globalHandler(event), true);
|
|
534
|
+
body.addEventListener('change', (event) => this.globalHandler(event), true);
|
|
535
|
+
body.addEventListener('scrollend', (event) => this.globalHandler(event), true);
|
|
536
|
+
body.addEventListener('dragend', (event) => this.globalHandler(event), true);
|
|
537
|
+
this.document.addEventListener('DOMContentLoaded', (event) => this.globalHandler(event), true);
|
|
538
|
+
/* let that =this;
|
|
539
|
+
|
|
540
|
+
const originalAddEventListener = EventTarget.prototype.addEventListener;
|
|
541
|
+
EventTarget.prototype.addEventListener = function(type: string, listener: any, options?: boolean | AddEventListenerOptions) {
|
|
542
|
+
if(type === "click"){
|
|
543
|
+
that.elementsWithClickListeners.add(this);
|
|
544
|
+
const wrapperListener = (event: any) => {
|
|
545
|
+
if(that.elementsWithClickListeners.has(event.currentTarget)){
|
|
546
|
+
console.log('click event',event);
|
|
547
|
+
that.GlobalHandler(event);
|
|
548
|
+
}
|
|
549
|
+
return listener.apply(this, arguments);
|
|
550
|
+
};
|
|
551
|
+
return originalAddEventListener.apply(this,[type,wrapperListener,options])
|
|
552
|
+
}
|
|
553
|
+
return originalAddEventListener.call(this, type, listener, options);
|
|
554
|
+
}*/
|
|
555
|
+
}
|
|
556
|
+
globalHandler(event) {
|
|
557
|
+
// event.stopPropagation()
|
|
558
|
+
// event.preventDefault()
|
|
559
|
+
let target = event.target;
|
|
560
|
+
let eventType = event.type;
|
|
561
|
+
try {
|
|
562
|
+
if (this.eventHandlers.hasOwnProperty(eventType) && !this.eventHandlers[eventType](target)) {
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
this.addActionUser(eventType, target);
|
|
566
|
+
}
|
|
567
|
+
catch (err) {
|
|
568
|
+
console.warn(err);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
lookUpChild(t, depth) {
|
|
572
|
+
if (t.hasChildNodes() && t.children.length <= 5) {
|
|
573
|
+
if (++depth > 5) {
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
return Array.from(t.childNodes).reduce((acc, c) => acc && this.lookUpChild(c, depth), true);
|
|
577
|
+
}
|
|
578
|
+
return true;
|
|
579
|
+
}
|
|
580
|
+
addActionUser(eventType, target) {
|
|
581
|
+
const ua = {
|
|
582
|
+
type: eventType,
|
|
583
|
+
start: dateNow(),
|
|
584
|
+
name: extractName(target),
|
|
585
|
+
nodeName: target.tagName?.toLowerCase(),
|
|
586
|
+
};
|
|
587
|
+
logInspect('user', () => prettyActionUserFormat(this.sessionManager.getCurrentSession(), ua));
|
|
588
|
+
this.sessionManager.getCurrentSession().userActions.push(ua);
|
|
589
|
+
}
|
|
590
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: AnalyticsCollector, deps: [{ token: DOCUMENT }, { token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
591
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: AnalyticsCollector, providedIn: 'root' }); }
|
|
592
|
+
}
|
|
593
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: AnalyticsCollector, decorators: [{
|
|
594
|
+
type: Injectable,
|
|
595
|
+
args: [{
|
|
596
|
+
providedIn: 'root'
|
|
597
|
+
}]
|
|
598
|
+
}], ctorParameters: () => [{ type: Document, decorators: [{
|
|
599
|
+
type: Inject,
|
|
600
|
+
args: [DOCUMENT]
|
|
601
|
+
}] }, { type: SessionManager }] });
|
|
602
|
+
|
|
603
|
+
class GlobalErrorHandlerService {
|
|
604
|
+
constructor(sessionManager) {
|
|
605
|
+
this.sessionManager = sessionManager;
|
|
606
|
+
}
|
|
607
|
+
handleError(error) {
|
|
608
|
+
this.sessionManager.getCurrentSession().exceptions.push({
|
|
609
|
+
type: error?.name,
|
|
610
|
+
message: error?.message
|
|
611
|
+
});
|
|
612
|
+
throw error;
|
|
613
|
+
}
|
|
614
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: GlobalErrorHandlerService, deps: [{ token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
615
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: GlobalErrorHandlerService, providedIn: 'root' }); }
|
|
616
|
+
}
|
|
617
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: GlobalErrorHandlerService, decorators: [{
|
|
618
|
+
type: Injectable,
|
|
619
|
+
args: [{ providedIn: 'root' }]
|
|
620
|
+
}], ctorParameters: () => [{ type: SessionManager }] });
|
|
621
|
+
|
|
454
622
|
class NgCollectorModule {
|
|
455
623
|
static forRoot(configuration) {
|
|
456
624
|
if (configuration?.enabled) {
|
|
457
625
|
try {
|
|
458
626
|
let config = validateAndGetConfig(configuration);
|
|
459
627
|
let instance = GetInstanceEnvironement(configuration);
|
|
460
|
-
|
|
461
|
-
logInspect(JSON.stringify(
|
|
628
|
+
let deps = [Router, SessionManager];
|
|
629
|
+
logInspect('app', JSON.stringify(config));
|
|
630
|
+
logInspect('app', JSON.stringify(instance));
|
|
631
|
+
config.analytics && deps.push(AnalyticsCollector);
|
|
462
632
|
return {
|
|
463
633
|
ngModule: NgCollectorModule,
|
|
464
634
|
providers: [
|
|
465
635
|
SessionManager,
|
|
466
|
-
{ provide: APP_INITIALIZER, useFactory: initializeEvents, deps:
|
|
636
|
+
{ provide: APP_INITIALIZER, useFactory: initializeEvents, deps: deps, multi: true },
|
|
467
637
|
{ provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },
|
|
468
638
|
{ provide: 'instance', useValue: instance },
|
|
469
|
-
{ provide: 'config', useValue: config }
|
|
639
|
+
{ provide: 'config', useValue: config },
|
|
640
|
+
{ provide: ErrorHandler, useClass: GlobalErrorHandlerService }
|
|
470
641
|
]
|
|
471
642
|
};
|
|
472
643
|
}
|
|
@@ -478,16 +649,16 @@ class NgCollectorModule {
|
|
|
478
649
|
ngModule: NgCollectorModule
|
|
479
650
|
};
|
|
480
651
|
}
|
|
481
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
482
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
483
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
652
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: NgCollectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
653
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.0.3", ngImport: i0, type: NgCollectorModule }); }
|
|
654
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: NgCollectorModule }); }
|
|
484
655
|
}
|
|
485
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
656
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: NgCollectorModule, decorators: [{
|
|
486
657
|
type: NgModule
|
|
487
658
|
}] });
|
|
488
|
-
function initializeEvents(router, sessionManager) {
|
|
659
|
+
function initializeEvents(router, sessionManager, analyticsCollector) {
|
|
489
660
|
return () => {
|
|
490
|
-
logInspect('initialize routing events listeners');
|
|
661
|
+
logInspect('app', 'initialize routing events listeners');
|
|
491
662
|
window.addEventListener('beforeunload', event => {
|
|
492
663
|
if (!sessionManager.getCurrentSession().loading) {
|
|
493
664
|
sessionManager.newSession();
|
|
@@ -502,6 +673,9 @@ function initializeEvents(router, sessionManager) {
|
|
|
502
673
|
delete sessionManager.getCurrentSession().loading;
|
|
503
674
|
}
|
|
504
675
|
});
|
|
676
|
+
if (analyticsCollector) {
|
|
677
|
+
analyticsCollector.subscribeToEvents();
|
|
678
|
+
}
|
|
505
679
|
};
|
|
506
680
|
}
|
|
507
681
|
|
|
@@ -1 +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/configuration.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/session-manager.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/lib/traceable-stage.decorator.ts","../../../../projects/oneteme/inspect-ng-collector/src/public-api.ts","../../../../projects/oneteme/inspect-ng-collector/src/oneteme-inspect-ng-collector.ts"],"sourcesContent":["import { LocalRequest, MainSession, RestRequest } from \"./trace.model\";\n\nconst WIN:any = window;\n\nexport function dateNow() {\n return Date.now() / 1_000;\n}\n\nexport function initDebug(value:boolean){\n WIN[\"inspect\"] = { debug : value };\n}\n\nexport function logInspect(...args: any[]){\n if(WIN[\"inspect\"]?.debug){\n if(args.length == 1 && typeof args[0] == 'function'){\n args = args[0]();\n if(!Array.isArray(args)){\n args = [args];\n }\n }\n console.log('[INSPECT]', ...args);\n }\n}\n\nexport function prettySessionFormat(session: MainSession){\n let s= `[${session.name}]`;\n if(session.user){\n s+= `<${session.user}>`\n }\n if(session.location){\n s+= `(${session.location}) `\n }\n s+=prettyDurationFormat(session.start,session.end!)+'\\n';\n session.restRequests.forEach(r => {\n s+= prettyRestRequestFormat(r)+'\\n';\n })\n session.localRequests.forEach(r => {\n s+= prettyLocalRequestFormat(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 if(rest.host){\n s+= rest.host\n }\n if(rest.port > 0){\n s+= `:${rest.port}`\n }\n if(rest.path){\n if(!rest.path.startsWith(\"/\") && !s.endsWith(\"/\")){\n s+= '/'\n }\n s+= rest.path;\n }\n if(rest.query){\n s+= rest.query\n }\n if(rest.exception?.type){\n s+= ` ${rest.exception?.type}:`;\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 prettyLocalRequestFormat(local: LocalRequest){\n let s = ` - [${local.name}]`;\n if(local.location){\n s+= `(${local.location})`\n }\n if(local.exception?.type){\n s+= ` ${local.exception?.type}:`;\n }\n if(local.exception?.message){\n s+= ` ${local.exception.message}`\n }\n s+= ` >> ${prettyDurationFormat(local.start, local.end)}`;\n return s;\n}\n\nfunction prettyDurationFormat(start:number,end:number){\n return start && end ? `(in ${ (end - start).toFixed(2) } ms)` : '';\n}\n\n\n\n","import { dateNow, initDebug } from \"./util\";\nconst SLASH = '/';\nconst HOST_PATERN = /https?:\\/\\/[\\w\\-.]+(:\\d{2,5})?\\/?/;\nconst PATH_PATERN = /[\\w-]+(\\/[\\w-]+)*/;\nexport interface ApplicationConf {\n host?: string;\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 debug?: boolean;\n enabled?: boolean;\n}\n\nexport interface TechnicalConf {\n user?:string ;\n bufferMaxSize: number;\n delay: number;\n instanceApi: string;\n sessionApi: string;\n exclude: RegExp[];\n debug: boolean;\n enabled: boolean;\n}\n\nexport function validateAndGetConfig(conf:any):TechnicalConf{\n let host = matchRegex(getStringOrCall(conf.host), \"host\" , HOST_PATERN)\n let sessionApi = matchRegex(getStringOrCall(conf.sessionApi),\"sessionApi\", PATH_PATERN, \"v3/trace/instance/:id/session\")\n let instanceApi = matchRegex(getStringOrCall(conf.instanceApi),\"intanceApi\", PATH_PATERN, \"v3/trace/instance\")\n initDebug(conf.debug ?? false);\n return {\n user : getStringOrCall(conf.user),\n bufferMaxSize: requirePostitiveValue(getNumberOrCall(conf.bufferMaxSize),\"bufferMaxSize\", 1000) ,\n delay: requirePostitiveValue(getNumberOrCall(conf.delay),\"delay\", 60000) ,\n instanceApi: sessionApiURL(host, instanceApi),\n sessionApi: instanceApiURL(host, sessionApi),\n exclude: getRegArrOrCall(conf.exclude) || [],\n debug: conf.debug ?? false,\n enabled: conf.enabled ?? false\n }\n}\n\nexport function GetInstanceEnvironement(conf:ApplicationConf){\n return {\n name: require(getStringOrCall(conf.name), 'name'),\n version: getStringOrCall(conf.version),\n address: undefined, //server side\n env: require(getStringOrCall(conf.env),'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\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('edg') > -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 case agent.indexOf('msie') > -1:\n return 'Microsoft Internet Explorer';\n }\n }\n catch (e) {\n console.error(e);\n }\n return undefined;\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 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\nfunction instanceApiURL(host:string, path:string){\n return toURL(host,path);\n}\n\nfunction sessionApiURL(host:string, path:string){\n return toURL(host,path);\n}\n\nfunction toURL(host:string, path:string ){\n return host.endsWith(SLASH) || path.startsWith(SLASH) ? host + path : [host,path].join(SLASH);\n}\n\nexport function matchRegex(v: string | undefined, name: string, pattern: RegExp, defaultValue?: string) {\n if(v && pattern.exec(v)){\n return v;\n }\n if(!defaultValue){\n if(v != undefined){\n throw new Error(`bad value ${name}=${v}, pattern=${pattern}`);\n }else {\n throw new Error(`${name} property is required`);\n }\n }\n return defaultValue;\n}\n\nexport function requirePostitiveValue(v: number | undefined, name: string, defaultValue:number){\n if(v && v > 0) {\n return v;\n }\n if(v == undefined){\n return defaultValue;\n }\n throw new Error(`bad value ${name}=${v} <= 0`);\n}\n\nexport function require(v: string | undefined, name: string){\n if(v!= undefined){\n return v;\n }\n throw new Error(`${name} property is required`);\n}\n\n\n","import { Inject, Injectable, OnDestroy } from '@angular/core';\nimport { InstanceEnvironment, MainSession } from './trace.model';\nimport { interval, startWith, Subscription, tap } from 'rxjs';\nimport { dateNow, logInspect, prettySessionFormat } from './util';\nimport { TechnicalConf } from './configuration';\n\n\n@Injectable({ providedIn: 'root' })\nexport class SessionManager implements OnDestroy {\n\n config: TechnicalConf;\n instanceEnvironment: InstanceEnvironment;\n scheduledSessionSender: Subscription;\n sessionQueue: MainSession[] = [];\n sessionSendAttempts: number = 0\n sendSessionfinished: boolean = true;\n currentSession!: MainSession;\n private static _instance: SessionManager;\n\n constructor(@Inject('config') config: TechnicalConf,\n @Inject('instance') instance: InstanceEnvironment) {\n this.config = config;\n this.instanceEnvironment = instance;\n SessionManager._instance = this;\n this.scheduledSessionSender = interval(config.delay)\n .pipe(startWith(0))\n .pipe(tap(() => {\n if (this.sendSessionfinished) {\n this.sendSessionfinished = false;\n this.manageCache().finally(() => { this.sendSessionfinished = true });\n }\n }))\n .subscribe();\n logInspect('SessionManager initialized');\n }\n\n static get instance(): SessionManager{\n return SessionManager._instance;\n }\n\n newSession(url?: string) {\n if (this.currentSession) {\n this.currentSession.end = dateNow();\n this.currentSession.name = document.title;\n this.currentSession.location = document.URL;\n if (this.config.exclude.every((e) => !e.test(this.currentSession.location))) {\n this.sessionQueue.push(this.currentSession);\n logInspect(`added element to session queue, new size is:${this.sessionQueue.length}`);\n }\n\n logInspect(() => prettySessionFormat(this.currentSession));\n }\n if (url) {\n this.currentSession = {\n '@type': \"main\",\n user: this.config.user,\n start: dateNow(),\n type: \"VIEW\",\n location: url,\n loading: true,\n restRequests: [],\n localRequests: []\n }\n }\n }\n\n manageCache(): Promise<any> {\n if(this.instanceEnvironment.id){\n return this.sendSessions();\n }\n return this.postInstanceEnv().then((id: string | null) => {\n if (id) {\n return this.sendSessions();\n }\n console.warn(`Error while attempting to send Environement instance, attempts ${this.sessionSendAttempts}`);\n return Promise.reject(new Error('No instance id'));\n });\n }\n\n sendSessions(instanceComplete?:boolean) : Promise<number>{\n if (this.sessionQueue.length > 0) {\n if(instanceComplete){\n this.config.sessionApi +=\"?end=\"+ new Date().toISOString();\n }\n this.sessionSendAttempts++;\n let sessions: MainSession[] = [...this.sessionQueue];\n this.sessionQueue.splice(0, sessions.length); // add rest of sessions\n logInspect(`sending sessions, attempts:${this.sessionSendAttempts}, queue size : ${sessions.length}`)\n return this.putSessions(sessions)\n .then(ok => {\n if (ok) {\n logInspect(`sessions sent successfully, queue size reset, new size is: ${this.sessionQueue.length}`)\n this.sessionSendAttempts = 0;\n return sessions.length;\n } else {\n console.warn(`Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`)//\n this.revertQueueSize(sessions);\n return -1;\n }\n })\n }\n return Promise.resolve(0);\n }\n\n putSessions(sessionList: MainSession[]): Promise<boolean> {\n return fetch(this.config.sessionApi, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n body: JSON.stringify(sessionList)\n })\n .then(res => res.ok)\n .catch(err => false);\n }\n\n postInstanceEnv(): Promise<string | null> {\n this.sessionSendAttempts++;\n return fetch(this.config.instanceApi, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n body: JSON.stringify(this.instanceEnvironment)\n })\n .then(res => res.ok ? res.text().then(id => {\n this.config.sessionApi = this.config.sessionApi.replace(':id', id);\n logInspect('Environement instance sent successfully', id);\n this.sessionSendAttempts = 0;\n return this.instanceEnvironment.id = id;\n }) : null)\n .catch(err => null);\n }\n\n revertQueueSize(sessions: MainSession[]) {\n this.sessionQueue.unshift(...sessions);\n if (this.sessionQueue.length > this.config.bufferMaxSize) {\n let diff = this.sessionQueue.length - this.config.bufferMaxSize;\n this.sessionQueue = this.sessionQueue.slice(0, this.config.bufferMaxSize);\n logInspect(`Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):${diff}`)\n }\n }\n\n ngOnDestroy(): void {\n if (this.scheduledSessionSender) {\n this.scheduledSessionSender.unsubscribe();\n }\n }\n\n getCurrentSession() {\n return this.currentSession;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { tap, finalize } from 'rxjs/operators'\nimport { ExceptionInfo } from './trace.model';\nimport { dateNow } from './util';\nimport { SessionManager } from './session-manager.service';\n\n\n\n\n@Injectable({ providedIn: 'root' })\nexport class HttpInterceptorService implements HttpInterceptor {\n\n constructor(private readonly SessionManager: SessionManager) { } // change this to session manager\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 id = getReqid(error.headers);\n status = +error.status;\n exception = {\n type : error.name,\n message: error.error && error.status ? JSON.stringify(error.error) : error.message\n }\n },\n ), finalize(() => {\n try {\n if (this.SessionManager.getCurrentSession()){\n const url = toHref(req.urlWithParams);\n const auth_user = extractAuthSchemeAnduser(req.headers);\n this.SessionManager.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 || -1,\n path: url.pathname,\n query: url.search.slice(1, url.search.length),\n contentType: req.responseType,\n authScheme: auth_user.authScheme,\n user: auth_user.user,\n status: +status,\n inDataSize: sizeOf(responseBody),\n ouDataSize: sizeOf(req.body),\n start: start,\n end: dateNow(),\n exception: exception\n });\n }\n }catch(err){\n console.warn(err);\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 extractAuthSchemeAnduser(headers: any): {user: string | undefined, authScheme: string | undefined} {\n let auth_user: {user: string | undefined, authScheme: string | undefined} = {\n user: undefined,\n authScheme: undefined\n };\n try {\n auth_user.authScheme = headers.get('authorization').match(/^(\\w+) /)?.at(1)\n switch (auth_user.authScheme){\n case \"Basic\":\n auth_user.user = atob(headers.get('authorization').split(\" \")[1]).toString().split(':')[0];\n break;\n case \"Bearer\": {\n const parts = headers.get('authorization').split(\" \")[1].split('.');\n if (parts.length == 3) {\n auth_user.user = JSON.parse(atob(parts[1]).toString()).sub;\n }\n }\n }\n }catch(err){}\n return auth_user;\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 { logInspect } from './util';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { ApplicationConf, GetInstanceEnvironement, validateAndGetConfig } from './configuration';\nimport { HttpInterceptorService } from './http-interceptor.service';\nimport { SessionManager } from './session-manager.service';\n\n@NgModule()\nexport class NgCollectorModule {\n\n static forRoot(configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule> {\n if (configuration?.enabled) {\n try {\n let config = validateAndGetConfig(configuration);\n let instance = GetInstanceEnvironement(configuration);\n logInspect(JSON.stringify(config));\n logInspect(JSON.stringify(instance));\n return {\n ngModule: NgCollectorModule,\n providers: [\n SessionManager,\n { provide: APP_INITIALIZER, useFactory: initializeEvents, deps: [Router, SessionManager], multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },\n { provide: 'instance', useValue: instance },\n { provide: 'config', useValue: config }\n ]\n };\n } catch (e:any) {\n console.warn(`invalid Configuration, Ng-collector is disabled because of this ${e.message}`);\n }\n }\n return {\n ngModule: NgCollectorModule\n }\n }\n}\n\nexport function initializeEvents(router: Router, sessionManager: SessionManager) {\n return () => {\n logInspect('initialize routing events listeners');\n window.addEventListener('beforeunload', event => {\n if(!sessionManager.getCurrentSession().loading){\n sessionManager.newSession();\n }\n sessionManager.sendSessions(true);\n });\n router.events.subscribe(event => {\n if (event instanceof NavigationStart) {\n sessionManager.newSession(event.url);\n }\n if (event instanceof NavigationEnd) {\n delete sessionManager.getCurrentSession().loading;\n }\n })\n }\n}\n\n\n","import { SessionManager } from \"./session-manager.service\";\n\n\nexport function TraceableStage(){\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n descriptor.value = function (...args: any[]){\n if(SessionManager.instance){\n let session = SessionManager.instance.getCurrentSession();\n let exception;\n let start,end;\n \n start = Date.now();\n try{\n return originalMethod.apply(this,args);\n }catch(e:any){\n let type=null,message=null;\n if(e){\n if(typeof e === \"string\"){\n message = e;\n }else if(e instanceof Error){\n type = e.name;\n message = e.message;\n }else{\n message = JSON.stringify(e)\n }\n }\n exception = {\n type : type,\n message : message\n }\n throw e;\n }finally{\n end = Date.now();\n SessionManager.instance.getCurrentSession().localRequests.push({\n name: propertyKey,\n location: target.constructor.name,\n user: session.user,\n start: start, \n end: end,\n exception: exception\n })\n }\n }\n }\n return descriptor;\n }\n }","/*\n * Public API Surface of inspect-ng-collector\n */\n\n\nexport * from './lib/ng-collector.module';\nexport * from './lib/traceable-stage.decorator';\n\n ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["tap","i1.SessionManager"],"mappings":"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"}
|
|
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/configuration.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/session-manager.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/http-interceptor.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/trace.model.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/analytics-collect.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/global-error-handler.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/ng-collector.module.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/traceable-stage.decorator.ts","../../../../projects/oneteme/inspect-ng-collector/src/public-api.ts","../../../../projects/oneteme/inspect-ng-collector/src/oneteme-inspect-ng-collector.ts"],"sourcesContent":["import {LocalRequest, MainSession, RestRequest, UserAction} from \"./trace.model\";\n\nconst WIN:any = window;\ntype level = 'app' | 'user';\nexport function dateNow() {\n return Date.now() / 1_000;\n}\n\nexport function initDebug(value: {app: boolean, user: boolean}){\n WIN[\"inspect\"] = { app : value.app, user: value.user };\n}\n\nexport function logInspect(level: level, ...args: any[]){\n if(WIN[\"inspect\"][level]){\n if(args.length == 1 && typeof args[0] == 'function'){\n args = args[0]();\n if(!Array.isArray(args)){\n args = [args];\n }\n }\n console.log(`[INSPECT]-(${level})`, ...args);\n }\n}\n\nexport function prettyActionUserFormat(session: MainSession,userAction:UserAction){\n let s = `(${session.location}) `\n if(userAction.type){\n s+= `[${userAction.type}]`;\n }\n\n if(userAction.nodeName){\n s+= `<${userAction.nodeName}>`\n }\n\n if(userAction.name){\n s+= `(${userAction.name}) `\n }\n\n s+= ` >> ${new Date(userAction.start*1000).toISOString()}`\n return s;\n}\n\nexport function prettySessionFormat(session: MainSession){\n let s= `[${session.name}]`;\n if(session.user){\n s+= `<${session.user}>`\n }\n if(session.location){\n s+= `(${session.location}) `\n }\n s+=prettyDurationFormat(session.start, session.end)+'\\n';\n session.restRequests.forEach(r => {\n s+= prettyRestRequestFormat(r)+'\\n';\n })\n session.localRequests.forEach(r => {\n s+= prettyLocalRequestFormat(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 if(rest.host){\n s+= rest.host\n }\n if(rest.port > 0){\n s+= `:${rest.port}`\n }\n if(rest.path){\n if(!rest.path.startsWith(\"/\") && !s.endsWith(\"/\")){\n s+= '/'\n }\n s+= rest.path;\n }\n if(rest.query){\n s+= rest.query\n }\n if(rest.exception?.type){\n s+= ` ${rest.exception?.type}:`;\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 prettyLocalRequestFormat(local: LocalRequest){\n let s = ` - [${local.name}]`;\n if(local.location){\n s+= `(${local.location})`\n }\n if(local.exception?.type){\n s+= ` ${local.exception?.type}:`;\n }\n if(local.exception?.message){\n s+= ` ${local.exception.message}`\n }\n s+= ` >> ${prettyDurationFormat(local.start, local.end)}`;\n return s;\n}\n\nfunction prettyDurationFormat(start:number,end:number|undefined){\n return start && end ? `(in ${ (end - start).toFixed(2) } s)` : '';\n}\n\n\n\n\n","import { dateNow, initDebug } from \"./util\";\nconst SLASH = '/';\nconst HOST_PATERN = /https?:\\/\\/[\\w\\-.]+(:\\d{2,5})?\\/?/;\nconst PATH_PATERN = /[\\w-]+(\\/[\\w-]+)*/;\nexport interface ApplicationConf {\n host?: string;\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 debug?: {app: boolean, user: boolean};\n analytics?:boolean;\n enabled?: boolean;\n}\n\nexport interface TechnicalConf {\n user: () => string ;\n bufferMaxSize: number;\n delay: number;\n instanceApi: string;\n sessionApi: string;\n exclude: RegExp[];\n debug: {app: boolean, user: boolean};\n analytics?: boolean;\n enabled: boolean;\n}\n\nexport function validateAndGetConfig(conf:any):TechnicalConf{\n let host = matchRegex(getStringOrCall(conf.host), \"host\" , HOST_PATERN)\n let sessionApi = matchRegex(getStringOrCall(conf.sessionApi),\"sessionApi\", PATH_PATERN, \"v3/trace/instance/:id/session\")\n let instanceApi = matchRegex(getStringOrCall(conf.instanceApi),\"intanceApi\", PATH_PATERN, \"v3/trace/instance\")\n initDebug(conf.debug ?? {app: false, user: false});\n return {\n user : typeof conf.user == 'function' ? conf.user : ()=> conf.user,\n bufferMaxSize: requirePostitiveValue(getNumberOrCall(conf.bufferMaxSize),\"bufferMaxSize\", 1000) ,\n delay: requirePostitiveValue(getNumberOrCall(conf.delay),\"delay\", 60000),\n instanceApi: sessionApiURL(host, instanceApi),\n sessionApi: instanceApiURL(host, sessionApi),\n exclude: getRegArrOrCall(conf.exclude) || [],\n debug: conf.debug ?? {app: false, user: false},\n analytics: conf.analytics ?? false,\n enabled: conf.enabled ?? false\n }\n}\n\nexport function GetInstanceEnvironement(conf:ApplicationConf){\n return {\n name: require(getStringOrCall(conf.name), 'name'),\n version: getStringOrCall(conf.version),\n address: undefined, //server side\n env: require(getStringOrCall(conf.env),'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\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('edg') > -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 case agent.indexOf('msie') > -1:\n return 'Microsoft Internet Explorer';\n }\n }\n catch (e) {\n console.error(e);\n }\n return undefined;\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 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\nfunction instanceApiURL(host:string, path:string){\n return toURL(host,path);\n}\n\nfunction sessionApiURL(host:string, path:string){\n return toURL(host,path);\n}\n\nfunction toURL(host:string, path:string ){\n return host.endsWith(SLASH) || path.startsWith(SLASH) ? host + path : [host,path].join(SLASH);\n}\n\nexport function matchRegex(v: string | undefined, name: string, pattern: RegExp, defaultValue?: string) {\n if(v && pattern.exec(v)){\n return v;\n }\n if(!defaultValue){\n if(v != undefined){\n throw new Error(`bad value ${name}=${v}, pattern=${pattern}`);\n }else {\n throw new Error(`${name} property is required`);\n }\n }\n return defaultValue;\n}\n\nexport function requirePostitiveValue(v: number | undefined, name: string, defaultValue:number){\n if(v && v > 0) {\n return v;\n }\n if(v == undefined){\n return defaultValue;\n }\n throw new Error(`bad value ${name}=${v} <= 0`);\n}\n\nexport function require(v: string | undefined, name: string){\n if(v!= undefined){\n return v;\n }\n throw new Error(`${name} property is required`);\n}\n\n\n","import { Inject, Injectable, OnDestroy } from '@angular/core';\nimport { InstanceEnvironment, MainSession } from './trace.model';\nimport { interval, startWith, Subscription, tap } from 'rxjs';\nimport { dateNow, logInspect, prettySessionFormat } from './util';\nimport { TechnicalConf } from './configuration';\n\n\n@Injectable({ providedIn: 'root' })\nexport class SessionManager implements OnDestroy {\n\n config: TechnicalConf;\n instanceEnvironment: InstanceEnvironment;\n scheduledSessionSender: Subscription;\n sessionQueue: MainSession[] = [];\n sessionSendAttempts: number = 0\n sendSessionfinished: boolean = true;\n currentSession!: MainSession;\n private static _instance: SessionManager;\n\n constructor(@Inject('config') config: TechnicalConf,\n @Inject('instance') instance: InstanceEnvironment) {\n this.config = config;\n this.instanceEnvironment = instance;\n SessionManager._instance = this;\n this.scheduledSessionSender = interval(config.delay)\n .pipe(startWith(0))\n .pipe(tap(() => {\n if (this.sendSessionfinished) {\n this.sendSessionfinished = false;\n this.manageCache().finally(() => { this.sendSessionfinished = true });\n }\n }))\n .subscribe();\n logInspect('app','SessionManager initialized');\n }\n\n static get instance(): SessionManager{\n return SessionManager._instance;\n }\n\n newSession(url?: string) {\n if (this.currentSession) {\n this.currentSession.end = dateNow();\n this.currentSession.name = document.title;\n this.currentSession.location = document.URL;\n if (this.config.exclude.every((e) => !e.test(this.currentSession.location))) {\n this.sessionQueue.push(this.currentSession);\n logInspect('app',`added element to session queue, new size is:${this.sessionQueue.length}`);\n }\n\n logInspect('app',() => prettySessionFormat(this.currentSession));\n }\n if (url) {\n this.currentSession = {\n '@type': \"main\",\n user: this.config.user(),\n start: dateNow(),\n type: \"VIEW\",\n location: url,\n loading: true,\n restRequests: [],\n localRequests: [],\n userActions: [],\n exceptions: []\n }\n }\n }\n\n manageCache(): Promise<any> {\n if(this.instanceEnvironment.id){\n return this.sendSessions();\n }\n return this.postInstanceEnv().then((id: string | null) => {\n if (id) {\n return this.sendSessions();\n }\n console.warn(`Error while attempting to send Environement instance, attempts ${this.sessionSendAttempts}`);\n return Promise.reject(new Error('No instance id'));\n });\n }\n\n sendSessions(instanceComplete?:boolean) : Promise<number>{\n if (this.sessionQueue.length > 0) {\n if(instanceComplete){\n this.config.sessionApi +=\"?end=\"+ new Date().toISOString();\n }\n this.sessionSendAttempts++;\n let sessions: MainSession[] = [...this.sessionQueue];\n this.sessionQueue.splice(0, sessions.length); // add rest of sessions\n logInspect('app',`sending sessions, attempts:${this.sessionSendAttempts}, queue size : ${sessions.length}`)\n return this.putSessions(sessions)\n .then(ok => {\n if (ok) {\n logInspect('app',`sessions sent successfully, queue size reset, new size is: ${this.sessionQueue.length}`)\n this.sessionSendAttempts = 0;\n return sessions.length;\n } else {\n console.warn(`Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`)//\n this.revertQueueSize(sessions);\n return -1;\n }\n })\n }\n return Promise.resolve(0);\n }\n\n putSessions(sessionList: MainSession[]): Promise<boolean> {\n return fetch(this.config.sessionApi, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n body: JSON.stringify(sessionList)\n })\n .then(res => res.ok)\n .catch(err => false);\n }\n\n postInstanceEnv(): Promise<string | null> {\n this.sessionSendAttempts++;\n return fetch(this.config.instanceApi, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n mode: 'cors',\n body: JSON.stringify(this.instanceEnvironment)\n })\n .then(res => res.ok ? res.text().then(id => {\n this.config.sessionApi = this.config.sessionApi.replace(':id', id);\n logInspect('app','Environement instance sent successfully', id);\n this.sessionSendAttempts = 0;\n return this.instanceEnvironment.id = id;\n }) : null)\n .catch(err => null);\n }\n\n revertQueueSize(sessions: MainSession[]) {\n this.sessionQueue.unshift(...sessions);\n if (this.sessionQueue.length > this.config.bufferMaxSize) {\n let diff = this.sessionQueue.length - this.config.bufferMaxSize;\n this.sessionQueue = this.sessionQueue.slice(0, this.config.bufferMaxSize);\n logInspect('app',`Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):${diff}`)\n }\n }\n\n ngOnDestroy(): void {\n if (this.scheduledSessionSender) {\n this.scheduledSessionSender.unsubscribe();\n }\n }\n\n getCurrentSession() {\n return this.currentSession;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { tap, finalize } from 'rxjs/operators'\nimport { ExceptionInfo } from './trace.model';\nimport { dateNow } from './util';\nimport { SessionManager } from './session-manager.service';\n\n\n\n\n@Injectable({ providedIn: 'root' })\nexport class HttpInterceptorService implements HttpInterceptor {\n\n constructor(private readonly SessionManager: SessionManager) { } // change this to session manager\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 id = getReqid(error.headers);\n status = +error.status;\n exception = {\n type : error.name,\n message: error.error && error.status ? JSON.stringify(error.error) : error.message\n }\n },\n ), finalize(() => {\n try {\n if (this.SessionManager.getCurrentSession()){\n const url = toHref(req.urlWithParams);\n const auth_user = extractAuthSchemeAnduser(req.headers);\n this.SessionManager.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 || -1,\n path: url.pathname,\n query: url.search.slice(1, url.search.length),\n contentType: req.responseType,\n authScheme: auth_user.authScheme,\n user: auth_user.user,\n status: +status,\n inDataSize: sizeOf(responseBody),\n ouDataSize: sizeOf(req.body),\n start: start,\n end: dateNow(),\n exception: exception\n });\n }\n }catch(err){\n console.warn(err);\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 extractAuthSchemeAnduser(headers: any): {user: string | undefined, authScheme: string | undefined} {\n let auth_user: {user: string | undefined, authScheme: string | undefined} = {\n user: undefined,\n authScheme: undefined\n };\n try {\n auth_user.authScheme = headers.get('authorization').match(/^(\\w+) /)?.at(1)\n switch (auth_user.authScheme){\n case \"Basic\":\n auth_user.user = atob(headers.get('authorization').split(\" \")[1]).toString().split(':')[0];\n break;\n case \"Bearer\": {\n const parts = headers.get('authorization').split(\" \")[1].split('.');\n if (parts.length == 3) {\n auth_user.user = JSON.parse(atob(parts[1]).toString()).sub;\n }\n }\n }\n }catch(err){}\n return auth_user;\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","type InstantType = \"SERVER\" | \"CLIENT\";\ntype MainSessionType = \"VIEW\" | \"BATCH\" | \"STARTUP\";\n\nexport interface MainSession {\n '@type'?: string;\n type: MainSessionType;\n name?: string;\n location: string;\n user?: string;\n start: number;\n end?: number;\n exceptions: ExceptionInfo[], // to be changed ?\n restRequests: RestRequest[],\n localRequests: LocalRequest[],\n userActions: UserAction[],\n loading?: boolean\n}\n\nexport interface InstanceEnvironment {\n id?:string;\n name?: string;\n address?: string;\n version?: string;\n env?: string;\n os?: string;\n re?: string;\n user?: string;\n type?: InstantType;\n instant?:number;\n collector?:string;\n}\n\nexport interface RestRequest {\n id?: string;\n method: string;\n protocol: string;\n host: string;\n port: number;\n path: string;\n query: string;\n contentType: string;\n authScheme?: string;\n status: number;\n inDataSize: number;\n ouDataSize: number;\n user?:string;\n start: number;\n end: number;\n exception?: ExceptionInfo\n}\n\nexport interface LocalRequest {\n name: string;\n location: string;\n user?: string;\n start: number;\n end: number;\n exception?: ExceptionInfo\n}\n\nexport interface ExceptionInfo { // to bechanged\n type: string | null;\n message: string | null;\n}\n\nexport interface UserAction{\n type: string;\n start: number;\n name: string| null;\n nodeName: string;\n}\n\nexport const genericMap : ((t:HTMLElement)=>string|null)[] = [\n t => t.getAttribute('placeholder'),\n t => t.getAttribute('title'),\n t => t.innerText,\n t => t.getAttribute('name'),\n t => t.getAttribute('id'),\n ]\n\nexport const MAP: {[key:string]: ((t:HTMLElement)=>string|null)[]} = {\n 'img' : [\n t=> t.getAttribute('alt'),\n t=> t.getAttribute('src'),\n ],\n 'input': [\n t=> t.getAttribute('name'),\n ],\n 'a' : [\n t=> t.getAttribute('href'),\n ],\n 'label':[\n t=> t.getAttribute('for'),\n ],\n}\n\nexport function getFirst(c:((t:HTMLElement)=>string|null)[], t: HTMLElement) {\n for (const o of c) {\n let r = o(t)?.trim();\n if (r) {\n return r;\n }\n }\n return null;\n}\n\nexport function extractName(t: HTMLElement){\n try\n {\n let tagName = t.tagName\n if(tagName){\n let name;\n let c = MAP[tagName.toLowerCase()];\n if(c){\n name = getFirst(c,t);\n }\n return name ?? getFirst(genericMap,t)!;\n }\n\n }catch(err){\n console.warn(err)\n }\n return null\n}\n","import {Inject, Injectable} from \"@angular/core\";\nimport {DOCUMENT} from \"@angular/common\";\nimport {extractName} from \"./trace.model\";\nimport {SessionManager} from \"./session-manager.service\";\nimport {dateNow, logInspect, prettyActionUserFormat} from \"./util\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AnalyticsCollector {\n\n eventHandlers : {[key:string]: (target: HTMLElement)=>boolean} = {\n 'click' : (target:HTMLElement)=> this.lookUpChild(target,1),\n }\n patchedEvent : {[key:string]:boolean} = {};\n elementsWithClickListeners = new WeakSet();\n constructor(@Inject(DOCUMENT) private readonly document: Document,\n private readonly sessionManager: SessionManager) {\n\n }\n subscribeToEvents(){\n const body = this.document.body;\n body.addEventListener('click', (event) => this.globalHandler(event), true);\n body.addEventListener('change', (event) => this.globalHandler(event), true);\n body.addEventListener('scrollend', (event) => this.globalHandler(event), true);\n body.addEventListener('dragend', (event) => this.globalHandler(event), true);\n this.document.addEventListener('DOMContentLoaded', (event) => this.globalHandler(event), true);\n\n /* let that =this;\n\n const originalAddEventListener = EventTarget.prototype.addEventListener;\n EventTarget.prototype.addEventListener = function(type: string, listener: any, options?: boolean | AddEventListenerOptions) {\n if(type === \"click\"){\n that.elementsWithClickListeners.add(this);\n const wrapperListener = (event: any) => {\n if(that.elementsWithClickListeners.has(event.currentTarget)){\n console.log('click event',event);\n that.GlobalHandler(event);\n }\n return listener.apply(this, arguments);\n };\n return originalAddEventListener.apply(this,[type,wrapperListener,options])\n }\n return originalAddEventListener.call(this, type, listener, options);\n }*/\n }\n\n\n\n globalHandler(event: Event | MouseEvent){\n // event.stopPropagation()\n // event.preventDefault()\n let target = event.target as HTMLElement;\n let eventType = event.type;\n try {\n if(this.eventHandlers.hasOwnProperty(eventType) && !this.eventHandlers[eventType](target)){\n return;\n }\n this.addActionUser(eventType,target);\n }catch(err){\n console.warn(err);\n }\n }\n\n lookUpChild(t: HTMLElement, depth: number):boolean {\n if(t.hasChildNodes() && t.children.length <= 5) {\n if(++depth > 5){\n return false;\n }\n return Array.from(t.childNodes).reduce((acc, c) =>\n acc && this.lookUpChild(c as HTMLElement, depth), true);\n }\n return true;\n }\n\n addActionUser(eventType: string, target: HTMLElement){\n const ua = {\n type: eventType,\n start: dateNow(),\n name : extractName(target),\n nodeName : target.tagName?.toLowerCase(),\n }\n logInspect('user',() => prettyActionUserFormat(this.sessionManager.getCurrentSession(),ua));\n this.sessionManager.getCurrentSession().userActions.push(ua);\n }\n\n\n}\n","import {ErrorHandler, Injectable} from \"@angular/core\";\nimport {SessionManager} from \"./session-manager.service\";\n\n@Injectable({ providedIn: 'root' })\nexport class GlobalErrorHandlerService implements ErrorHandler {\n\n constructor(private readonly sessionManager: SessionManager) {\n }\n handleError(error:any ) {\n this.sessionManager.getCurrentSession().exceptions.push({\n type: error?.name,\n message: error?.message\n })\n throw error;\n }\n}\n","import {NgModule, APP_INITIALIZER, ModuleWithProviders, ErrorHandler} from '@angular/core';\nimport { HTTP_INTERCEPTORS, } from '@angular/common/http';\nimport { logInspect } from './util';\nimport { NavigationEnd, NavigationStart, Router } from '@angular/router';\nimport { ApplicationConf, GetInstanceEnvironement, validateAndGetConfig } from './configuration';\nimport { HttpInterceptorService } from './http-interceptor.service';\nimport { SessionManager } from './session-manager.service';\nimport {AnalyticsCollector} from \"./analytics-collect.service\";\nimport {GlobalErrorHandlerService} from \"./global-error-handler.service\";\n\n@NgModule()\nexport class NgCollectorModule {\n\n static forRoot(configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule> {\n if (configuration?.enabled) {\n try {\n let config = validateAndGetConfig(configuration);\n let instance = GetInstanceEnvironement(configuration);\n let deps:any[] = [Router, SessionManager]\n logInspect('app',JSON.stringify(config));\n logInspect('app',JSON.stringify(instance));\n config.analytics && deps.push(AnalyticsCollector);\n\n return {\n ngModule: NgCollectorModule,\n providers: [\n SessionManager,\n { provide: APP_INITIALIZER, useFactory: initializeEvents, deps: deps, multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },\n { provide: 'instance', useValue: instance },\n { provide: 'config', useValue: config },\n { provide: ErrorHandler, useClass: GlobalErrorHandlerService }\n ]\n };\n } catch (e:any) {\n console.warn(`invalid Configuration, Ng-collector is disabled because of this ${e.message}`);\n }\n }\n return {\n ngModule: NgCollectorModule\n }\n }\n}\n\nexport function initializeEvents(router: Router, sessionManager: SessionManager, analyticsCollector: AnalyticsCollector) {\n return () => {\n logInspect('app','initialize routing events listeners');\n window.addEventListener('beforeunload', event => {\n if(!sessionManager.getCurrentSession().loading){\n sessionManager.newSession();\n }\n sessionManager.sendSessions(true);\n });\n router.events.subscribe(event => {\n if (event instanceof NavigationStart) {\n sessionManager.newSession(event.url);\n }\n if (event instanceof NavigationEnd) {\n delete sessionManager.getCurrentSession().loading;\n }\n })\n if(analyticsCollector){\n analyticsCollector.subscribeToEvents();\n }\n\n }\n}\n\n\n","import { SessionManager } from \"./session-manager.service\";\n\n\nexport function TraceableStage(){\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n descriptor.value = function (...args: any[]){\n if(SessionManager.instance){\n let session = SessionManager.instance.getCurrentSession();\n let exception;\n let start,end;\n \n start = Date.now();\n try{\n return originalMethod.apply(this,args);\n }catch(e:any){\n let type=null,message=null;\n if(e){\n if(typeof e === \"string\"){\n message = e;\n }else if(e instanceof Error){\n type = e.name;\n message = e.message;\n }else{\n message = JSON.stringify(e)\n }\n }\n exception = {\n type : type,\n message : message\n }\n throw e;\n }finally{\n end = Date.now();\n SessionManager.instance.getCurrentSession().localRequests.push({\n name: propertyKey,\n location: target.constructor.name,\n user: session.user,\n start: start, \n end: end,\n exception: exception\n })\n }\n }\n }\n return descriptor;\n }\n }","/*\n * Public API Surface of inspect-ng-collector\n */\n\n\nexport * from './lib/ng-collector.module';\nexport * from './lib/traceable-stage.decorator';\n\n ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["tap","i1.SessionManager"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,157 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { OnDestroy, ModuleWithProviders } from '@angular/core';
|
|
3
|
+
import { Router } from '@angular/router';
|
|
4
|
+
import { Subscription } from 'rxjs';
|
|
5
|
+
|
|
6
|
+
interface ApplicationConf {
|
|
7
|
+
host?: string;
|
|
8
|
+
name?: string | (() => string);
|
|
9
|
+
version?: string | (() => string);
|
|
10
|
+
env?: string | (() => string);
|
|
11
|
+
user?: string | (() => string);
|
|
12
|
+
bufferMaxSize?: number | (() => number);
|
|
13
|
+
delay?: number | (() => number);
|
|
14
|
+
instanceApi?: string | (() => string);
|
|
15
|
+
sessionApi?: string | (() => string);
|
|
16
|
+
exclude?: RegExp[] | (() => RegExp[]);
|
|
17
|
+
debug?: {
|
|
18
|
+
app: boolean;
|
|
19
|
+
user: boolean;
|
|
20
|
+
};
|
|
21
|
+
analytics?: boolean;
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
}
|
|
24
|
+
interface TechnicalConf {
|
|
25
|
+
user: () => string;
|
|
26
|
+
bufferMaxSize: number;
|
|
27
|
+
delay: number;
|
|
28
|
+
instanceApi: string;
|
|
29
|
+
sessionApi: string;
|
|
30
|
+
exclude: RegExp[];
|
|
31
|
+
debug: {
|
|
32
|
+
app: boolean;
|
|
33
|
+
user: boolean;
|
|
34
|
+
};
|
|
35
|
+
analytics?: boolean;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type InstantType = "SERVER" | "CLIENT";
|
|
40
|
+
type MainSessionType = "VIEW" | "BATCH" | "STARTUP";
|
|
41
|
+
interface MainSession {
|
|
42
|
+
'@type'?: string;
|
|
43
|
+
type: MainSessionType;
|
|
44
|
+
name?: string;
|
|
45
|
+
location: string;
|
|
46
|
+
user?: string;
|
|
47
|
+
start: number;
|
|
48
|
+
end?: number;
|
|
49
|
+
exceptions: ExceptionInfo[];
|
|
50
|
+
restRequests: RestRequest[];
|
|
51
|
+
localRequests: LocalRequest[];
|
|
52
|
+
userActions: UserAction[];
|
|
53
|
+
loading?: boolean;
|
|
54
|
+
}
|
|
55
|
+
interface InstanceEnvironment {
|
|
56
|
+
id?: string;
|
|
57
|
+
name?: string;
|
|
58
|
+
address?: string;
|
|
59
|
+
version?: string;
|
|
60
|
+
env?: string;
|
|
61
|
+
os?: string;
|
|
62
|
+
re?: string;
|
|
63
|
+
user?: string;
|
|
64
|
+
type?: InstantType;
|
|
65
|
+
instant?: number;
|
|
66
|
+
collector?: string;
|
|
67
|
+
}
|
|
68
|
+
interface RestRequest {
|
|
69
|
+
id?: string;
|
|
70
|
+
method: string;
|
|
71
|
+
protocol: string;
|
|
72
|
+
host: string;
|
|
73
|
+
port: number;
|
|
74
|
+
path: string;
|
|
75
|
+
query: string;
|
|
76
|
+
contentType: string;
|
|
77
|
+
authScheme?: string;
|
|
78
|
+
status: number;
|
|
79
|
+
inDataSize: number;
|
|
80
|
+
ouDataSize: number;
|
|
81
|
+
user?: string;
|
|
82
|
+
start: number;
|
|
83
|
+
end: number;
|
|
84
|
+
exception?: ExceptionInfo;
|
|
85
|
+
}
|
|
86
|
+
interface LocalRequest {
|
|
87
|
+
name: string;
|
|
88
|
+
location: string;
|
|
89
|
+
user?: string;
|
|
90
|
+
start: number;
|
|
91
|
+
end: number;
|
|
92
|
+
exception?: ExceptionInfo;
|
|
93
|
+
}
|
|
94
|
+
interface ExceptionInfo {
|
|
95
|
+
type: string | null;
|
|
96
|
+
message: string | null;
|
|
97
|
+
}
|
|
98
|
+
interface UserAction {
|
|
99
|
+
type: string;
|
|
100
|
+
start: number;
|
|
101
|
+
name: string | null;
|
|
102
|
+
nodeName: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
declare class SessionManager implements OnDestroy {
|
|
106
|
+
config: TechnicalConf;
|
|
107
|
+
instanceEnvironment: InstanceEnvironment;
|
|
108
|
+
scheduledSessionSender: Subscription;
|
|
109
|
+
sessionQueue: MainSession[];
|
|
110
|
+
sessionSendAttempts: number;
|
|
111
|
+
sendSessionfinished: boolean;
|
|
112
|
+
currentSession: MainSession;
|
|
113
|
+
private static _instance;
|
|
114
|
+
constructor(config: TechnicalConf, instance: InstanceEnvironment);
|
|
115
|
+
static get instance(): SessionManager;
|
|
116
|
+
newSession(url?: string): void;
|
|
117
|
+
manageCache(): Promise<any>;
|
|
118
|
+
sendSessions(instanceComplete?: boolean): Promise<number>;
|
|
119
|
+
putSessions(sessionList: MainSession[]): Promise<boolean>;
|
|
120
|
+
postInstanceEnv(): Promise<string | null>;
|
|
121
|
+
revertQueueSize(sessions: MainSession[]): void;
|
|
122
|
+
ngOnDestroy(): void;
|
|
123
|
+
getCurrentSession(): MainSession;
|
|
124
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SessionManager, never>;
|
|
125
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SessionManager>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
declare class AnalyticsCollector {
|
|
129
|
+
private readonly document;
|
|
130
|
+
private readonly sessionManager;
|
|
131
|
+
eventHandlers: {
|
|
132
|
+
[key: string]: (target: HTMLElement) => boolean;
|
|
133
|
+
};
|
|
134
|
+
patchedEvent: {
|
|
135
|
+
[key: string]: boolean;
|
|
136
|
+
};
|
|
137
|
+
elementsWithClickListeners: WeakSet<object>;
|
|
138
|
+
constructor(document: Document, sessionManager: SessionManager);
|
|
139
|
+
subscribeToEvents(): void;
|
|
140
|
+
globalHandler(event: Event | MouseEvent): void;
|
|
141
|
+
lookUpChild(t: HTMLElement, depth: number): boolean;
|
|
142
|
+
addActionUser(eventType: string, target: HTMLElement): void;
|
|
143
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsCollector, never>;
|
|
144
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AnalyticsCollector>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
declare class NgCollectorModule {
|
|
148
|
+
static forRoot(configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule>;
|
|
149
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgCollectorModule, never>;
|
|
150
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgCollectorModule, never, never, never>;
|
|
151
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<NgCollectorModule>;
|
|
152
|
+
}
|
|
153
|
+
declare function initializeEvents(router: Router, sessionManager: SessionManager, analyticsCollector: AnalyticsCollector): () => void;
|
|
154
|
+
|
|
155
|
+
declare function TraceableStage(): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
156
|
+
|
|
157
|
+
export { NgCollectorModule, TraceableStage, initializeEvents };
|
package/package.json
CHANGED
package/lib/configuration.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export interface ApplicationConf {
|
|
2
|
-
host?: string;
|
|
3
|
-
name?: string | (() => string);
|
|
4
|
-
version?: string | (() => string);
|
|
5
|
-
env?: string | (() => string);
|
|
6
|
-
user?: string | (() => string);
|
|
7
|
-
bufferMaxSize?: number | (() => number);
|
|
8
|
-
delay?: number | (() => number);
|
|
9
|
-
instanceApi?: string | (() => string);
|
|
10
|
-
sessionApi?: string | (() => string);
|
|
11
|
-
exclude?: RegExp[] | (() => RegExp[]);
|
|
12
|
-
debug?: boolean;
|
|
13
|
-
enabled?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export interface TechnicalConf {
|
|
16
|
-
user?: string;
|
|
17
|
-
bufferMaxSize: number;
|
|
18
|
-
delay: number;
|
|
19
|
-
instanceApi: string;
|
|
20
|
-
sessionApi: string;
|
|
21
|
-
exclude: RegExp[];
|
|
22
|
-
debug: boolean;
|
|
23
|
-
enabled: boolean;
|
|
24
|
-
}
|
|
25
|
-
export declare function validateAndGetConfig(conf: any): TechnicalConf;
|
|
26
|
-
export declare function GetInstanceEnvironement(conf: ApplicationConf): {
|
|
27
|
-
name: string;
|
|
28
|
-
version: string | undefined;
|
|
29
|
-
address: undefined;
|
|
30
|
-
env: string;
|
|
31
|
-
os: string | undefined;
|
|
32
|
-
re: string | undefined;
|
|
33
|
-
user: undefined;
|
|
34
|
-
type: string;
|
|
35
|
-
instant: number;
|
|
36
|
-
collector: string;
|
|
37
|
-
};
|
|
38
|
-
export declare function getNumberOrCall(o?: number | (() => number)): number | undefined;
|
|
39
|
-
export declare function getStringOrCall(o?: string | (() => string)): string | undefined;
|
|
40
|
-
export declare function getRegArrOrCall(o?: RegExp[] | (() => RegExp[])): RegExp[] | undefined;
|
|
41
|
-
export declare function detectBrowser(): "Edge" | "Opera" | "Chrome" | "Firefox" | "Safari" | "Microsoft Internet Explorer" | undefined;
|
|
42
|
-
export declare function detectOs(): string | undefined;
|
|
43
|
-
export declare function matchRegex(v: string | undefined, name: string, pattern: RegExp, defaultValue?: string): string;
|
|
44
|
-
export declare function requirePostitiveValue(v: number | undefined, name: string, defaultValue: number): number;
|
|
45
|
-
export declare function require(v: string | undefined, name: string): string;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest } from '@angular/common/http';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { SessionManager } from './session-manager.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class HttpInterceptorService implements HttpInterceptor {
|
|
6
|
-
private readonly SessionManager;
|
|
7
|
-
constructor(SessionManager: SessionManager);
|
|
8
|
-
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
|
|
9
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<HttpInterceptorService, never>;
|
|
10
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<HttpInterceptorService>;
|
|
11
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ModuleWithProviders } from '@angular/core';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
3
|
-
import { ApplicationConf } from './configuration';
|
|
4
|
-
import { SessionManager } from './session-manager.service';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class NgCollectorModule {
|
|
7
|
-
static forRoot(configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule>;
|
|
8
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgCollectorModule, never>;
|
|
9
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<NgCollectorModule, never, never, never>;
|
|
10
|
-
static ɵinj: i0.ɵɵInjectorDeclaration<NgCollectorModule>;
|
|
11
|
-
}
|
|
12
|
-
export declare function initializeEvents(router: Router, sessionManager: SessionManager): () => void;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import { InstanceEnvironment, MainSession } from './trace.model';
|
|
3
|
-
import { Subscription } from 'rxjs';
|
|
4
|
-
import { TechnicalConf } from './configuration';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class SessionManager implements OnDestroy {
|
|
7
|
-
config: TechnicalConf;
|
|
8
|
-
instanceEnvironment: InstanceEnvironment;
|
|
9
|
-
scheduledSessionSender: Subscription;
|
|
10
|
-
sessionQueue: MainSession[];
|
|
11
|
-
sessionSendAttempts: number;
|
|
12
|
-
sendSessionfinished: boolean;
|
|
13
|
-
currentSession: MainSession;
|
|
14
|
-
private static _instance;
|
|
15
|
-
constructor(config: TechnicalConf, instance: InstanceEnvironment);
|
|
16
|
-
static get instance(): SessionManager;
|
|
17
|
-
newSession(url?: string): void;
|
|
18
|
-
manageCache(): Promise<any>;
|
|
19
|
-
sendSessions(instanceComplete?: boolean): Promise<number>;
|
|
20
|
-
putSessions(sessionList: MainSession[]): Promise<boolean>;
|
|
21
|
-
postInstanceEnv(): Promise<string | null>;
|
|
22
|
-
revertQueueSize(sessions: MainSession[]): void;
|
|
23
|
-
ngOnDestroy(): void;
|
|
24
|
-
getCurrentSession(): MainSession;
|
|
25
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SessionManager, never>;
|
|
26
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<SessionManager>;
|
|
27
|
-
}
|
package/lib/trace.model.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
type InstantType = "SERVER" | "CLIENT";
|
|
2
|
-
type MainSessionType = "VIEW" | "BATCH" | "STARTUP";
|
|
3
|
-
export interface MainSession {
|
|
4
|
-
'@type'?: string;
|
|
5
|
-
type: MainSessionType;
|
|
6
|
-
name?: string;
|
|
7
|
-
location: string;
|
|
8
|
-
user?: string;
|
|
9
|
-
start: number;
|
|
10
|
-
end?: number;
|
|
11
|
-
exception?: ExceptionInfo;
|
|
12
|
-
restRequests: RestRequest[];
|
|
13
|
-
localRequests: LocalRequest[];
|
|
14
|
-
loading?: boolean;
|
|
15
|
-
}
|
|
16
|
-
export interface InstanceEnvironment {
|
|
17
|
-
id?: string;
|
|
18
|
-
name?: string;
|
|
19
|
-
address?: string;
|
|
20
|
-
version?: string;
|
|
21
|
-
env?: string;
|
|
22
|
-
os?: string;
|
|
23
|
-
re?: string;
|
|
24
|
-
user?: string;
|
|
25
|
-
type?: InstantType;
|
|
26
|
-
instant?: number;
|
|
27
|
-
collector?: string;
|
|
28
|
-
}
|
|
29
|
-
export interface RestRequest {
|
|
30
|
-
id?: string;
|
|
31
|
-
method: string;
|
|
32
|
-
protocol: string;
|
|
33
|
-
host: string;
|
|
34
|
-
port: number;
|
|
35
|
-
path: string;
|
|
36
|
-
query: string;
|
|
37
|
-
contentType: string;
|
|
38
|
-
authScheme?: string;
|
|
39
|
-
status: number;
|
|
40
|
-
inDataSize: number;
|
|
41
|
-
ouDataSize: number;
|
|
42
|
-
user?: string;
|
|
43
|
-
start: number;
|
|
44
|
-
end: number;
|
|
45
|
-
exception?: ExceptionInfo;
|
|
46
|
-
}
|
|
47
|
-
export interface LocalRequest {
|
|
48
|
-
name: string;
|
|
49
|
-
location: string;
|
|
50
|
-
user?: string;
|
|
51
|
-
start: number;
|
|
52
|
-
end: number;
|
|
53
|
-
exception?: ExceptionInfo;
|
|
54
|
-
}
|
|
55
|
-
export interface ExceptionInfo {
|
|
56
|
-
type: string | null;
|
|
57
|
-
message: string | null;
|
|
58
|
-
}
|
|
59
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function TraceableStage(): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
package/lib/util.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { MainSession } from "./trace.model";
|
|
2
|
-
export declare function dateNow(): number;
|
|
3
|
-
export declare function initDebug(value: boolean): void;
|
|
4
|
-
export declare function logInspect(...args: any[]): void;
|
|
5
|
-
export declare function prettySessionFormat(session: MainSession): string;
|
package/public-api.d.ts
DELETED