@oneteme/inspect-ng-collector 1.0.0 → 1.2.0-beta.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.
@@ -1,28 +1,43 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Inject, 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"] = { debug: value };
14
+ WIN["inspect"] = { app: value.app, user: value.user };
14
15
  }
15
- function logInspect(...args) {
16
- if (WIN["inspect"]?.debug) {
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('[INSPECT]', ...args);
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)} ms)` : '';
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: getStringOrCall(conf.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: "19.1.6", ngImport: i0, type: SessionManager, deps: [{ token: 'config' }, { token: 'instance' }], target: i0.ɵɵFactoryTarget.Injectable }); }
343
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SessionManager, providedIn: 'root' }); }
360
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: SessionManager, deps: [{ token: 'config' }, { token: 'instance' }], target: i0.ɵɵFactoryTarget.Injectable }); }
361
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: SessionManager, providedIn: 'root' }); }
344
362
  }
345
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SessionManager, decorators: [{
363
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: SessionManager, decorators: [{
346
364
  type: Injectable,
347
365
  args: [{ providedIn: 'root' }]
348
366
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -375,32 +393,39 @@ class HttpInterceptorService {
375
393
  message: error.error && error.status ? JSON.stringify(error.error) : error.message
376
394
  };
377
395
  }), finalize(() => {
378
- if (this.SessionManager.getCurrentSession()) {
379
- const url = toHref(req.urlWithParams);
380
- this.SessionManager.getCurrentSession().restRequests.push({
381
- id: id,
382
- method: req.method,
383
- protocol: url.protocol.slice(0, -1),
384
- host: exctractHost(url.host),
385
- port: +url.port || -1,
386
- path: url.pathname,
387
- query: url.search.slice(1, url.search.length),
388
- contentType: req.responseType,
389
- authScheme: extractAuthScheme(req.headers),
390
- status: +status,
391
- inDataSize: sizeOf(responseBody),
392
- ouDataSize: sizeOf(req.body),
393
- start: start,
394
- end: dateNow(),
395
- exception: exception
396
- });
396
+ try {
397
+ if (this.SessionManager.getCurrentSession()) {
398
+ const url = toHref(req.urlWithParams);
399
+ const auth_user = extractAuthSchemeAnduser(req.headers);
400
+ this.SessionManager.getCurrentSession().restRequests.push({
401
+ id: id,
402
+ method: req.method,
403
+ protocol: url.protocol.slice(0, -1),
404
+ host: exctractHost(url.host),
405
+ port: +url.port || -1,
406
+ path: url.pathname,
407
+ query: url.search.slice(1, url.search.length),
408
+ contentType: req.responseType,
409
+ authScheme: auth_user.authScheme,
410
+ user: auth_user.user,
411
+ status: +status,
412
+ inDataSize: sizeOf(responseBody),
413
+ ouDataSize: sizeOf(req.body),
414
+ start: start,
415
+ end: dateNow(),
416
+ exception: exception
417
+ });
418
+ }
419
+ }
420
+ catch (err) {
421
+ console.warn(err);
397
422
  }
398
423
  }));
399
424
  }
400
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: HttpInterceptorService, deps: [{ token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
401
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: HttpInterceptorService, providedIn: 'root' }); }
425
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: HttpInterceptorService, deps: [{ token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
426
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: HttpInterceptorService, providedIn: 'root' }); }
402
427
  }
403
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: HttpInterceptorService, decorators: [{
428
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: HttpInterceptorService, decorators: [{
404
429
  type: Injectable,
405
430
  args: [{ providedIn: 'root' }]
406
431
  }], ctorParameters: () => [{ type: SessionManager }] });
@@ -413,10 +438,27 @@ function exctractHost(path) {
413
438
  const portregex = /:\d+/;
414
439
  return path.replace(portregex, '');
415
440
  }
416
- function extractAuthScheme(headers) {
417
- return headers.has('authorization')
418
- ? headers.get('authorization').match(/^(\w+) /)?.at(1)
419
- : undefined;
441
+ function extractAuthSchemeAnduser(headers) {
442
+ let auth_user = {
443
+ user: undefined,
444
+ authScheme: undefined
445
+ };
446
+ try {
447
+ auth_user.authScheme = headers.get('authorization').match(/^(\w+) /)?.at(1);
448
+ switch (auth_user.authScheme) {
449
+ case "Basic":
450
+ auth_user.user = atob(headers.get('authorization').split(" ")[1]).toString().split(':')[0];
451
+ break;
452
+ case "Bearer": {
453
+ const parts = headers.get('authorization').split(" ")[1].split('.');
454
+ if (parts.length == 3) {
455
+ auth_user.user = JSON.parse(atob(parts[1]).toString()).sub;
456
+ }
457
+ }
458
+ }
459
+ }
460
+ catch (err) { }
461
+ return auth_user;
420
462
  }
421
463
  function getReqid(headers) {
422
464
  return headers.has('x-tracert')
@@ -427,22 +469,175 @@ function sizeOf(body) {
427
469
  return body ? JSON.stringify(body).length : 0;
428
470
  }
429
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: "19.2.10", ngImport: i0, type: AnalyticsCollector, deps: [{ token: DOCUMENT }, { token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
591
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: AnalyticsCollector, providedIn: 'root' }); }
592
+ }
593
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", 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: "19.2.10", ngImport: i0, type: GlobalErrorHandlerService, deps: [{ token: SessionManager }], target: i0.ɵɵFactoryTarget.Injectable }); }
615
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: GlobalErrorHandlerService, providedIn: 'root' }); }
616
+ }
617
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: GlobalErrorHandlerService, decorators: [{
618
+ type: Injectable,
619
+ args: [{ providedIn: 'root' }]
620
+ }], ctorParameters: () => [{ type: SessionManager }] });
621
+
430
622
  class NgCollectorModule {
431
623
  static forRoot(configuration) {
432
624
  if (configuration?.enabled) {
433
625
  try {
434
626
  let config = validateAndGetConfig(configuration);
435
627
  let instance = GetInstanceEnvironement(configuration);
436
- logInspect(JSON.stringify(config));
437
- logInspect(JSON.stringify(instance));
628
+ let deps = [Router, SessionManager];
629
+ logInspect('app', JSON.stringify(config));
630
+ logInspect('app', JSON.stringify(instance));
631
+ config.analytics && deps.push(AnalyticsCollector);
438
632
  return {
439
633
  ngModule: NgCollectorModule,
440
634
  providers: [
441
635
  SessionManager,
442
- { provide: APP_INITIALIZER, useFactory: initializeEvents, deps: [Router, SessionManager], multi: true },
636
+ { provide: APP_INITIALIZER, useFactory: initializeEvents, deps: deps, multi: true },
443
637
  { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },
444
638
  { provide: 'instance', useValue: instance },
445
- { provide: 'config', useValue: config }
639
+ { provide: 'config', useValue: config },
640
+ { provide: ErrorHandler, useClass: GlobalErrorHandlerService }
446
641
  ]
447
642
  };
448
643
  }
@@ -454,16 +649,16 @@ class NgCollectorModule {
454
649
  ngModule: NgCollectorModule
455
650
  };
456
651
  }
457
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: NgCollectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
458
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.6", ngImport: i0, type: NgCollectorModule }); }
459
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: NgCollectorModule }); }
652
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: NgCollectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
653
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.10", ngImport: i0, type: NgCollectorModule }); }
654
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: NgCollectorModule }); }
460
655
  }
461
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: NgCollectorModule, decorators: [{
656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: NgCollectorModule, decorators: [{
462
657
  type: NgModule
463
658
  }] });
464
- function initializeEvents(router, sessionManager) {
659
+ function initializeEvents(router, sessionManager, analyticsCollector) {
465
660
  return () => {
466
- logInspect('initialize routing events listeners');
661
+ logInspect('app', 'initialize routing events listeners');
467
662
  window.addEventListener('beforeunload', event => {
468
663
  if (!sessionManager.getCurrentSession().loading) {
469
664
  sessionManager.newSession();
@@ -478,6 +673,9 @@ function initializeEvents(router, sessionManager) {
478
673
  delete sessionManager.getCurrentSession().loading;
479
674
  }
480
675
  });
676
+ if (analyticsCollector) {
677
+ analyticsCollector.subscribeToEvents();
678
+ }
481
679
  };
482
680
  }
483
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@Injectable({ providedIn: 'root' })\nexport class HttpInterceptorService implements HttpInterceptor {\n\n constructor(private 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 if(this.SessionManager.getCurrentSession()){\n const url = toHref(req.urlWithParams);\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: 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}\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 { 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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"}
@@ -0,0 +1,20 @@
1
+ import { SessionManager } from "./session-manager.service";
2
+ import * as i0 from "@angular/core";
3
+ export declare class AnalyticsCollector {
4
+ private readonly document;
5
+ private readonly sessionManager;
6
+ eventHandlers: {
7
+ [key: string]: (target: HTMLElement) => boolean;
8
+ };
9
+ patchedEvent: {
10
+ [key: string]: boolean;
11
+ };
12
+ elementsWithClickListeners: WeakSet<object>;
13
+ constructor(document: Document, sessionManager: SessionManager);
14
+ subscribeToEvents(): void;
15
+ globalHandler(event: Event | MouseEvent): void;
16
+ lookUpChild(t: HTMLElement, depth: number): boolean;
17
+ addActionUser(eventType: string, target: HTMLElement): void;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsCollector, never>;
19
+ static ɵprov: i0.ɵɵInjectableDeclaration<AnalyticsCollector>;
20
+ }
@@ -9,17 +9,25 @@ export interface ApplicationConf {
9
9
  instanceApi?: string | (() => string);
10
10
  sessionApi?: string | (() => string);
11
11
  exclude?: RegExp[] | (() => RegExp[]);
12
- debug?: boolean;
12
+ debug?: {
13
+ app: boolean;
14
+ user: boolean;
15
+ };
16
+ analytics?: boolean;
13
17
  enabled?: boolean;
14
18
  }
15
19
  export interface TechnicalConf {
16
- user?: string;
20
+ user: () => string;
17
21
  bufferMaxSize: number;
18
22
  delay: number;
19
23
  instanceApi: string;
20
24
  sessionApi: string;
21
25
  exclude: RegExp[];
22
- debug: boolean;
26
+ debug: {
27
+ app: boolean;
28
+ user: boolean;
29
+ };
30
+ analytics?: boolean;
23
31
  enabled: boolean;
24
32
  }
25
33
  export declare function validateAndGetConfig(conf: any): TechnicalConf;
@@ -0,0 +1,10 @@
1
+ import { ErrorHandler } from "@angular/core";
2
+ import { SessionManager } from "./session-manager.service";
3
+ import * as i0 from "@angular/core";
4
+ export declare class GlobalErrorHandlerService implements ErrorHandler {
5
+ private readonly sessionManager;
6
+ constructor(sessionManager: SessionManager);
7
+ handleError(error: any): void;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<GlobalErrorHandlerService, never>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<GlobalErrorHandlerService>;
10
+ }
@@ -3,7 +3,7 @@ import { Observable } from 'rxjs';
3
3
  import { SessionManager } from './session-manager.service';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class HttpInterceptorService implements HttpInterceptor {
6
- private SessionManager;
6
+ private readonly SessionManager;
7
7
  constructor(SessionManager: SessionManager);
8
8
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<HttpInterceptorService, never>;
@@ -2,6 +2,7 @@ import { ModuleWithProviders } from '@angular/core';
2
2
  import { Router } from '@angular/router';
3
3
  import { ApplicationConf } from './configuration';
4
4
  import { SessionManager } from './session-manager.service';
5
+ import { AnalyticsCollector } from "./analytics-collect.service";
5
6
  import * as i0 from "@angular/core";
6
7
  export declare class NgCollectorModule {
7
8
  static forRoot(configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule>;
@@ -9,4 +10,4 @@ export declare class NgCollectorModule {
9
10
  static ɵmod: i0.ɵɵNgModuleDeclaration<NgCollectorModule, never, never, never>;
10
11
  static ɵinj: i0.ɵɵInjectorDeclaration<NgCollectorModule>;
11
12
  }
12
- export declare function initializeEvents(router: Router, sessionManager: SessionManager): () => void;
13
+ export declare function initializeEvents(router: Router, sessionManager: SessionManager, analyticsCollector: AnalyticsCollector): () => void;
@@ -8,9 +8,10 @@ export interface MainSession {
8
8
  user?: string;
9
9
  start: number;
10
10
  end?: number;
11
- exception?: ExceptionInfo;
11
+ exceptions: ExceptionInfo[];
12
12
  restRequests: RestRequest[];
13
13
  localRequests: LocalRequest[];
14
+ userActions: UserAction[];
14
15
  loading?: boolean;
15
16
  }
16
17
  export interface InstanceEnvironment {
@@ -56,4 +57,16 @@ export interface ExceptionInfo {
56
57
  type: string | null;
57
58
  message: string | null;
58
59
  }
60
+ export interface UserAction {
61
+ type: string;
62
+ start: number;
63
+ name: string | null;
64
+ nodeName: string;
65
+ }
66
+ export declare const genericMap: ((t: HTMLElement) => string | null)[];
67
+ export declare const MAP: {
68
+ [key: string]: ((t: HTMLElement) => string | null)[];
69
+ };
70
+ export declare function getFirst(c: ((t: HTMLElement) => string | null)[], t: HTMLElement): string | null;
71
+ export declare function extractName(t: HTMLElement): string | null;
59
72
  export {};
package/lib/util.d.ts CHANGED
@@ -1,5 +1,11 @@
1
- import { MainSession } from "./trace.model";
1
+ import { MainSession, UserAction } from "./trace.model";
2
+ type level = 'app' | 'user';
2
3
  export declare function dateNow(): number;
3
- export declare function initDebug(value: boolean): void;
4
- export declare function logInspect(...args: any[]): void;
4
+ export declare function initDebug(value: {
5
+ app: boolean;
6
+ user: boolean;
7
+ }): void;
8
+ export declare function logInspect(level: level, ...args: any[]): void;
9
+ export declare function prettyActionUserFormat(session: MainSession, userAction: UserAction): string;
5
10
  export declare function prettySessionFormat(session: MainSession): string;
11
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneteme/inspect-ng-collector",
3
- "version": "1.0.0",
3
+ "version": "1.2.0-beta.1",
4
4
  "description": "inspect ng collector",
5
5
  "homepage": "https://github.com/oneteme/inspect-ng-collector",
6
6
  "bugs": "https://github.com/oneteme/inspect-ng-collector/issues",