@oneteme/inspect-ng-collector 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,466 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, Inject, APP_INITIALIZER, NgModule } from '@angular/core';
3
+ import { HttpResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
4
+ import { tap as tap$1, finalize } from 'rxjs/operators';
5
+ import * as i1 from '@angular/router';
6
+ import { NavigationStart, NavigationEnd } from '@angular/router';
7
+ import { interval, tap, from, BehaviorSubject, of } from 'rxjs';
8
+
9
+ let WIN = window;
10
+ let c = console;
11
+ const HOST_PATERN = /https?:\/\/[\w\-\.]+(:\d{2,5})?\/?/;
12
+ const PATH_PATERN = /[\w\-\{\}]+(\/[\w\-\{\}]+)*/;
13
+ function dateNow() {
14
+ return Date.now() / 1000;
15
+ }
16
+ function logTraceapi(fn, ...args) {
17
+ if (WIN["traceapi"]) {
18
+ if (typeof c[fn] === 'function') {
19
+ c[fn]('[TRACEAPI]', ...args);
20
+ }
21
+ }
22
+ }
23
+ function prettySessionFormat(session) {
24
+ let s = "";
25
+ if (WIN['debug']) {
26
+ s = `[${session.name}]`;
27
+ if (session.user != null) {
28
+ s += `<${session.user}>`;
29
+ }
30
+ if (session.location) {
31
+ s += `(${session.location}) `;
32
+ }
33
+ s += prettyDurationFormat(session.start, session.end);
34
+ session.restRequests.forEach(r => {
35
+ s += prettyRestRequestFormat(r);
36
+ });
37
+ }
38
+ return s;
39
+ }
40
+ function prettyRestRequestFormat(rest) {
41
+ let s = ` - [${rest.method}]`;
42
+ if (rest.protocol) {
43
+ s += `${rest.protocol}://`;
44
+ }
45
+ if (rest.host) {
46
+ s += rest.host;
47
+ }
48
+ if (rest.port > 0) {
49
+ s += `:${rest.port}`;
50
+ }
51
+ if (rest.path) {
52
+ if (!rest.path.startsWith("/") && !s.endsWith("/")) {
53
+ s += '/';
54
+ }
55
+ s += rest.path;
56
+ }
57
+ if (rest.query) {
58
+ s += rest.query;
59
+ }
60
+ if (rest.exception?.type) {
61
+ s += ` ${rest.exception?.type}:`;
62
+ }
63
+ if (rest.exception?.message) {
64
+ s += ` ${rest.exception.message}`;
65
+ }
66
+ s += ` >> ${rest.status}`;
67
+ s += prettyDurationFormat(rest.start, rest.end);
68
+ return s;
69
+ }
70
+ function prettyDurationFormat(start, end) {
71
+ return start && end ? `(in ${new Date(end * 1000).getTime() - new Date(start * 1000).getTime()} ms) \n` : '';
72
+ }
73
+ function validate(v, pattern) {
74
+ if (v && pattern.exec(v)) {
75
+ return true;
76
+ }
77
+ logTraceapi('warn', "bad value=" + v + ", pattern=" + pattern);
78
+ return false;
79
+ }
80
+ function requirePostitiveValue(v, name) {
81
+ if (v == undefined || (v && v > 0)) {
82
+ return true;
83
+ }
84
+ logTraceapi('warn', name + '=' + v + " <= 0");
85
+ return false;
86
+ }
87
+ function getNumberOrCall(o) {
88
+ return typeof o === "function" ? o() : o;
89
+ }
90
+ function getStringOrCall(o) {
91
+ return typeof o === "function" ? o() : o;
92
+ }
93
+ function getRegArrOrCall(o) {
94
+ return typeof o === "function" ? o() : o;
95
+ }
96
+ function detectBrowser() {
97
+ try {
98
+ const agent = window.navigator.userAgent.toLowerCase();
99
+ switch (true) {
100
+ case agent.indexOf('edge') > -1:
101
+ return 'edge';
102
+ case agent.indexOf('opr') > -1:
103
+ return 'opera';
104
+ case agent.indexOf('chrome') > -1:
105
+ return 'chrome';
106
+ case agent.indexOf('firefox') > -1:
107
+ return 'firefox';
108
+ case agent.indexOf('safari') > -1:
109
+ return 'safari';
110
+ }
111
+ }
112
+ catch (e) {
113
+ console.error(e);
114
+ }
115
+ return undefined;
116
+ }
117
+ function detectOs() {
118
+ try {
119
+ let versionMatch, version;
120
+ const agent = window.navigator.userAgent.toLowerCase();
121
+ switch (true) {
122
+ case (/windows/.test(agent)):
123
+ versionMatch = /windows nt (\d+\.\d+)/.exec(agent);
124
+ version = versionMatch ? versionMatch[1] : 'Unknown';
125
+ return `Windows ${version}`;
126
+ case (/linux/.test(agent)):
127
+ return 'Linux';
128
+ case (/macintosh/.test(agent)):
129
+ versionMatch = /mac os x (\d+[._]\d+[._]\d+)/.exec(agent);
130
+ version = versionMatch ? versionMatch[1] : 'Unknown';
131
+ return `MacOs ${version}`;
132
+ }
133
+ }
134
+ catch (e) {
135
+ console.error(e);
136
+ }
137
+ return undefined;
138
+ }
139
+
140
+ const SLASH$1 = '/';
141
+ class SessionManager {
142
+ constructor() {
143
+ this.sessionQueue = [];
144
+ this.sessionSendAttempts = 0;
145
+ this.InstanceEnvSendAttempts = 0;
146
+ this.sendSessionfinished = true;
147
+ this.sendInstanceEnvFinished = true;
148
+ }
149
+ initialize(config, host) {
150
+ this.logServerMain = this.sessionApiURL(host, getStringOrCall(config.sessionApi));
151
+ this.logInstanceEnv = this.instanceApiURL(host, getStringOrCall(config.instanceApi));
152
+ this.maxBufferSize = getNumberOrCall(config.bufferMaxSize) ?? 1000;
153
+ this.delay = getNumberOrCall(config.delay) ?? 60000;
154
+ this.instanceEnvironment = {
155
+ name: getStringOrCall(config.name),
156
+ version: getStringOrCall(config.version),
157
+ address: undefined, //server side
158
+ env: getStringOrCall(config.env),
159
+ os: detectOs(),
160
+ re: detectBrowser(),
161
+ user: undefined, // cannot get user
162
+ type: "CLIENT",
163
+ instant: dateNow(),
164
+ collector: "inspect-ng-collector-0.0.1"
165
+ };
166
+ this.scheduledSessionSender = interval(this.delay)
167
+ .pipe(tap(() => {
168
+ if (this.sendSessionfinished) {
169
+ this.sendSessions();
170
+ }
171
+ }))
172
+ .subscribe();
173
+ }
174
+ addSessions(sessions) {
175
+ this.sessionQueue.push(sessions);
176
+ logTraceapi('log', "added element to session queue, new size is: " + this.sessionQueue.length);
177
+ }
178
+ sendSessions() {
179
+ if (this.sessionQueue.length > 0) {
180
+ this.getInsertedInstanceId().subscribe((id) => {
181
+ if (id) {
182
+ this.sendSessionfinished = false;
183
+ let sessions = [...this.sessionQueue];
184
+ this.sessionQueue.splice(0, sessions.length); // add rest of sessions
185
+ logTraceapi('log', `sending sessions, attempts:${++this.sessionSendAttempts}, queue size : ${sessions.length}`);
186
+ const requestOptions = {
187
+ method: 'PUT',
188
+ headers: {
189
+ 'Content-Type': 'application/json',
190
+ 'Access-Control-Allow-Origin': '*'
191
+ },
192
+ body: JSON.stringify(sessions)
193
+ };
194
+ fetch(this.logServerMain, requestOptions)
195
+ .then(data => {
196
+ if (data.ok) {
197
+ logTraceapi('log', 'sessions sent successfully, queue size reset, new size is: ' + this.sessionQueue.length);
198
+ this.sessionSendAttempts = 0;
199
+ }
200
+ else {
201
+ logTraceapi('warn', `Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`); //
202
+ this.revertQueueSize(sessions);
203
+ }
204
+ })
205
+ .catch(error => {
206
+ logTraceapi('warn', `Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`); //
207
+ logTraceapi('warn', error);
208
+ this.revertQueueSize(sessions);
209
+ }).finally(() => {
210
+ this.sendSessionfinished = true;
211
+ });
212
+ }
213
+ else {
214
+ logTraceapi('warn', `Error while attempting to send Environement instance, attempts ${this.sessionSendAttempts}`);
215
+ }
216
+ });
217
+ }
218
+ }
219
+ revertQueueSize(sessions) {
220
+ this.sessionQueue.unshift(...sessions);
221
+ if (this.sessionQueue.length > this.maxBufferSize) {
222
+ let diff = this.sessionQueue.length - this.maxBufferSize;
223
+ this.sessionQueue = this.sessionQueue.slice(0, this.maxBufferSize);
224
+ logTraceapi('log', 'Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):' + diff);
225
+ }
226
+ }
227
+ getInsertedInstanceId() {
228
+ if (this.instance) {
229
+ return this.instance;
230
+ }
231
+ if (this.sendInstanceEnvFinished) {
232
+ this.sendInstanceEnvFinished = false;
233
+ const requestOptions = {
234
+ method: 'POST',
235
+ headers: {
236
+ 'Content-Type': 'application/json',
237
+ 'Access-Control-Allow-Origin': '*' // retest
238
+ },
239
+ body: JSON.stringify(this.instanceEnvironment)
240
+ };
241
+ this.sessionSendAttempts++;
242
+ return from(fetch(this.logInstanceEnv, requestOptions)
243
+ .then(res => res.ok ? res.text().then(id => {
244
+ this.instance = new BehaviorSubject(id);
245
+ this.logServerMain = this.logServerMain.replace(':id', id);
246
+ this.sessionSendAttempts = 0;
247
+ logTraceapi('log', 'Environement instance sent successfully');
248
+ return id; // return logserverMain
249
+ }) : null)
250
+ .catch(err => {
251
+ logTraceapi('warn', err);
252
+ return null;
253
+ }).finally(() => {
254
+ this.sendInstanceEnvFinished = true;
255
+ }));
256
+ }
257
+ return of(null);
258
+ }
259
+ instanceApiURL(host, path) {
260
+ return this.toURL(host, path);
261
+ }
262
+ sessionApiURL(host, path) {
263
+ return this.toURL(host, path);
264
+ }
265
+ toURL(host, path) {
266
+ return host.endsWith(SLASH$1) || path.startsWith(SLASH$1) ? host + path : [host, path].join(SLASH$1);
267
+ }
268
+ ngOnDestroy() {
269
+ if (this.scheduledSessionSender) {
270
+ this.scheduledSessionSender.unsubscribe();
271
+ }
272
+ }
273
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SessionManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
274
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SessionManager, providedIn: 'root' }); }
275
+ }
276
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SessionManager, decorators: [{
277
+ type: Injectable,
278
+ args: [{ providedIn: 'root' }]
279
+ }], ctorParameters: () => [] });
280
+
281
+ const SLASH = '/';
282
+ class RouteTracerService {
283
+ constructor(router, config, host) {
284
+ this.router = router;
285
+ this.beforeUnloadHandler = (event) => {
286
+ this.currentSession.end = dateNow();
287
+ if (this.excludeList.every((e) => !e.test(this.currentSession.location))) {
288
+ this.sessionManager.addSessions(this.currentSession); //force
289
+ this.sessionManager.sendSessions();
290
+ }
291
+ };
292
+ this.sessionManager = new SessionManager();
293
+ this.excludeList = getRegArrOrCall(config.exclude);
294
+ this.sessionManager.initialize(config, host);
295
+ this.user = getStringOrCall(config.user);
296
+ }
297
+ ngOnDestroy() {
298
+ window.removeEventListener('beforeunload', this.beforeUnloadHandler);
299
+ }
300
+ initialize() {
301
+ logTraceapi('log', 'initialize');
302
+ window.addEventListener('beforeunload', this.beforeUnloadHandler);
303
+ this.router.events.subscribe(event => {
304
+ if (event instanceof NavigationStart) {
305
+ const now = dateNow();
306
+ if (this.currentSession) {
307
+ this.currentSession.end = dateNow();
308
+ if (this.excludeList.every((e) => !e.test(this.currentSession.location))) {
309
+ this.sessionManager.addSessions(this.currentSession);
310
+ }
311
+ logTraceapi('log', prettySessionFormat(this.currentSession));
312
+ }
313
+ this.currentSession = {
314
+ '@type': "main",
315
+ user: this.user,
316
+ start: now,
317
+ type: "VIEW",
318
+ location: event.url,
319
+ restRequests: []
320
+ };
321
+ }
322
+ if (event instanceof NavigationEnd) {
323
+ this.currentSession.name = document.title;
324
+ this.currentSession.location = document.URL;
325
+ }
326
+ });
327
+ }
328
+ getCurrentSession() {
329
+ return this.currentSession;
330
+ }
331
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RouteTracerService, deps: [{ token: i1.Router }, { token: 'config' }, { token: 'host' }], target: i0.ɵɵFactoryTarget.Injectable }); }
332
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RouteTracerService, providedIn: 'root' }); }
333
+ }
334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: RouteTracerService, decorators: [{
335
+ type: Injectable,
336
+ args: [{ providedIn: 'root' }]
337
+ }], ctorParameters: () => [{ type: i1.Router }, { type: undefined, decorators: [{
338
+ type: Inject,
339
+ args: ['config']
340
+ }] }, { type: undefined, decorators: [{
341
+ type: Inject,
342
+ args: ['host']
343
+ }] }] });
344
+
345
+ class HttpInterceptorService {
346
+ constructor(routerTracerService) {
347
+ this.routerTracerService = routerTracerService;
348
+ }
349
+ intercept(req, next) {
350
+ const start = dateNow();
351
+ let status, responseBody = '', exception;
352
+ let id;
353
+ return next.handle(req).pipe(tap$1((event) => {
354
+ if (event instanceof HttpResponse) {
355
+ status = +event.status;
356
+ responseBody = event.body;
357
+ id = getReqid(event.headers);
358
+ }
359
+ }, error => {
360
+ console.log(error);
361
+ id = getReqid(error.headers);
362
+ status = +error.status;
363
+ exception = {
364
+ type: error.error.error,
365
+ message: error.error.message
366
+ };
367
+ }), finalize(() => {
368
+ const url = toHref(req.urlWithParams);
369
+ this.routerTracerService.getCurrentSession().restRequests.push({
370
+ id: id,
371
+ method: req.method,
372
+ protocol: url.protocol.slice(0, -1),
373
+ host: exctractHost(url.host),
374
+ port: +url.port,
375
+ path: url.pathname,
376
+ query: url.search.slice(1, url.search.length),
377
+ contentType: req.responseType,
378
+ authScheme: extractAuthScheme(req.headers),
379
+ status: +status,
380
+ inDataSize: sizeOf(responseBody),
381
+ ouDataSize: sizeOf(req.body),
382
+ start: start,
383
+ end: dateNow(),
384
+ exception: exception
385
+ });
386
+ }));
387
+ }
388
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HttpInterceptorService, deps: [{ token: RouteTracerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
389
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HttpInterceptorService, providedIn: 'root' }); }
390
+ }
391
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HttpInterceptorService, decorators: [{
392
+ type: Injectable,
393
+ args: [{ providedIn: 'root' }]
394
+ }], ctorParameters: () => [{ type: RouteTracerService }] });
395
+ function toHref(url) {
396
+ const href = document.createElement('a');
397
+ href.setAttribute('href', url);
398
+ return href;
399
+ }
400
+ function exctractHost(path) {
401
+ const portregex = /:\d+/;
402
+ return path.replace(portregex, '');
403
+ }
404
+ function extractAuthScheme(headers) {
405
+ return headers.has('authorization')
406
+ ? headers.get('authorization').match(/^(\w+) /)?.at(1)
407
+ : undefined;
408
+ }
409
+ function getReqid(headers) {
410
+ return headers.has('x-tracert')
411
+ ? headers.get('x-tracert')
412
+ : undefined;
413
+ }
414
+ function sizeOf(body) {
415
+ return body ? JSON.stringify(body).length : 0;
416
+ }
417
+
418
+ class NgCollectorModule {
419
+ static forRoot(host, configuration) {
420
+ if (configuration?.enabled
421
+ && validate(host, HOST_PATERN)
422
+ && validate(getStringOrCall(configuration?.sessionApi), PATH_PATERN)
423
+ && validate(getStringOrCall(configuration?.instanceApi), PATH_PATERN)) {
424
+ if (!requirePostitiveValue(getNumberOrCall(configuration?.delay), "delay") ||
425
+ !requirePostitiveValue(getNumberOrCall(configuration?.bufferMaxSize), "bufferMaxSize")) {
426
+ logTraceapi('warn', 'invalid Configuration, Ng-collector is disabled');
427
+ return { ngModule: NgCollectorModule };
428
+ }
429
+ return {
430
+ ngModule: NgCollectorModule,
431
+ providers: [
432
+ RouteTracerService,
433
+ SessionManager,
434
+ { provide: APP_INITIALIZER, useFactory: initializeRoutingEvents, deps: [RouteTracerService], multi: true },
435
+ { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },
436
+ { provide: 'config', useValue: configuration },
437
+ { provide: 'host', useValue: host }
438
+ ]
439
+ };
440
+ }
441
+ return {
442
+ ngModule: NgCollectorModule
443
+ };
444
+ }
445
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
446
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule }); }
447
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule }); }
448
+ }
449
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgCollectorModule, decorators: [{
450
+ type: NgModule,
451
+ args: [{}]
452
+ }] });
453
+ function initializeRoutingEvents(routeTracerService) {
454
+ return () => routeTracerService.initialize();
455
+ }
456
+
457
+ /*
458
+ * Public API Surface of inspect-ng-collector
459
+ */
460
+
461
+ /**
462
+ * Generated bundle index. Do not edit.
463
+ */
464
+
465
+ export { NgCollectorModule, initializeRoutingEvents };
466
+ //# sourceMappingURL=oneteme-inspect-ng-collector.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneteme-inspect-ng-collector.mjs","sources":["../../../../projects/oneteme/inspect-ng-collector/src/lib/util.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/session-manager.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/route-tracer.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/http-interceptor.service.ts","../../../../projects/oneteme/inspect-ng-collector/src/lib/ng-collector.module.ts","../../../../projects/oneteme/inspect-ng-collector/src/public-api.ts","../../../../projects/oneteme/inspect-ng-collector/src/oneteme-inspect-ng-collector.ts"],"sourcesContent":["import { MainSession, RestRequest } from \"./trace.model\";\n\nlet WIN:any = window;\nlet c:any = console;\n\nexport const HOST_PATERN = /https?:\\/\\/[\\w\\-\\.]+(:\\d{2,5})?\\/?/;\nexport const PATH_PATERN = /[\\w\\-\\{\\}]+(\\/[\\w\\-\\{\\}]+)*/;\n\nexport function dateNow() {\n return Date.now() / 1_000;\n}\n\nexport function logTraceapi(fn:string ,...args: any[]){\n\n if(WIN[\"traceapi\"]){\n if( typeof c[fn] === 'function'){\n c[fn]('[TRACEAPI]', ...args)\n }\n }\n}\n\nexport function prettySessionFormat(session: MainSession){\n let s=\"\";\n if(WIN['debug']){\n s = `[${session.name}]`;\n if(session.user != null){\n s+= `<${session.user}>`\n }\n if(session.location){\n s+= `(${session.location}) `\n }\n s+=prettyDurationFormat(session.start,session.end!);\n session.restRequests.forEach(r => {\n s+= prettyRestRequestFormat(r);\n })\n }\n return s;\n}\n\nfunction prettyRestRequestFormat(rest: RestRequest){\n let s = ` - [${rest.method}]`\n if(rest.protocol){\n s+= `${rest.protocol}://`\n }\n\n if(rest.host){\n s+= rest.host\n }\n\n if(rest.port > 0){\n s+= `:${rest.port}`\n }\n\n if(rest.path){\n if(!rest.path.startsWith(\"/\") && !s.endsWith(\"/\")){\n s+= '/'\n }\n s+= rest.path;\n }\n\n if(rest.query){\n s+= rest.query\n }\n\n if(rest.exception?.type){\n s+= ` ${rest.exception?.type}:`;\n }\n\n if(rest.exception?.message){\n s+= ` ${rest.exception.message}`;\n }\n s+= ` >> ${rest.status}`\n s+= prettyDurationFormat(rest.start,rest.end);\n return s;\n}\n\nfunction prettyDurationFormat(start:number,end:number){\n return start && end ? `(in ${ new Date(end*1000).getTime()- new Date(start*1000).getTime() } ms) \\n` : '';\n}\n\n\n\nexport function validate(v: string | undefined, pattern: RegExp) {\n if(v && pattern.exec(v)){\n return true;\n }\n\n\n logTraceapi('warn',\"bad value=\" + v + \", pattern=\" + pattern);\n return false;\n}\n\nexport function requirePostitiveValue(v: number | undefined, name: string){\n if(v == undefined || (v && v > 0)) {\n return true;\n }\n\n logTraceapi('warn',name +'='+ v + \" <= 0\");\n return false;\n}\n\nexport function getNumberOrCall(o?: number | (() => number)): number | undefined {\n return typeof o === \"function\" ? o() : o;\n}\n\nexport function getStringOrCall(o?: string | (() => string)): string | undefined {\n return typeof o === \"function\" ? o() : o;\n}\n\nexport function getRegArrOrCall(o?: RegExp[] | (() => RegExp[])): RegExp[] | undefined {\n return typeof o === \"function\" ? o() : o;\n}\n\nexport function detectBrowser() {\n try {\n const agent = window.navigator.userAgent.toLowerCase()\n switch (true) {\n case agent.indexOf('edge') > -1:\n return 'edge';\n case agent.indexOf('opr') > -1:\n return 'opera';\n case agent.indexOf('chrome') > -1:\n return 'chrome';\n case agent.indexOf('firefox') > -1:\n return 'firefox';\n case agent.indexOf('safari') > -1:\n return 'safari';\n }\n }\n catch (e) {\n console.error(e);\n }\n return undefined;\n\n}\n\nexport function detectOs() {\n try {\n let versionMatch, version;\n const agent = window.navigator.userAgent.toLowerCase()\n switch (true) {\n case (/windows/.test(agent)):\n\n versionMatch = /windows nt (\\d+\\.\\d+)/.exec(agent);\n version = versionMatch ? versionMatch[1] : 'Unknown';\n return `Windows ${version}`;\n case (/linux/.test(agent)):\n return 'Linux';\n\n case (/macintosh/.test(agent)):\n versionMatch = /mac os x (\\d+[._]\\d+[._]\\d+)/.exec(agent);\n version = versionMatch ? versionMatch[1] : 'Unknown';\n return `MacOs ${version}`\n }\n }\n catch (e) {\n console.error(e);\n }\n return undefined;\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { InstanceEnvironment, MainSession } from './trace.model';\nimport { BehaviorSubject, from, interval, Observable, of, Subscription, tap } from 'rxjs';\nimport { dateNow, detectBrowser, detectOs, getNumberOrCall, getStringOrCall, logTraceapi } from './util';\n\nconst SLASH = '/';\n\n@Injectable({ providedIn: 'root' })\nexport class SessionManager implements OnDestroy {\n\n logServerMain!: string;\n logInstanceEnv!: string;\n maxBufferSize!: number;\n delay!:number\n instanceEnvironment !: InstanceEnvironment;\n scheduledSessionSender!: Subscription;\n sessionQueue: MainSession[]= [];\n sessionSendAttempts: number = 0\n InstanceEnvSendAttempts: number = 0;\n instance!: BehaviorSubject<string>;\n sendSessionfinished:boolean= true;\n sendInstanceEnvFinished: boolean = true;\n constructor(){\n\n }\n\n\n initialize(config:any, host:string) {\n this.logServerMain = this.sessionApiURL(host,getStringOrCall(config.sessionApi)!);\n this.logInstanceEnv = this.instanceApiURL(host,getStringOrCall(config.instanceApi)!);\n this.maxBufferSize = getNumberOrCall(config.bufferMaxSize) ?? 1000;\n this.delay = getNumberOrCall(config.delay) ?? 60000;\n this.instanceEnvironment = {\n name: getStringOrCall(config.name),\n version: getStringOrCall(config.version),\n address: undefined, //server side\n env: getStringOrCall(config.env),\n os: detectOs(),\n re: detectBrowser(),\n user: undefined, // cannot get user\n type: \"CLIENT\",\n instant: dateNow(),\n collector: \"inspect-ng-collector-0.0.1\"\n }\n\n this.scheduledSessionSender = interval(this.delay)\n .pipe(tap(()=> {\n if(this.sendSessionfinished){\n this.sendSessions();\n }}))\n .subscribe();\n }\n\n addSessions(sessions:MainSession){\n this.sessionQueue.push(sessions);\n logTraceapi('log',\"added element to session queue, new size is: \"+ this.sessionQueue.length);\n }\n\n\n sendSessions() {\n if(this.sessionQueue.length> 0){\n this.getInsertedInstanceId().subscribe((id:string|null)=>{\n if(id) {\n this.sendSessionfinished = false;\n let sessions: MainSession[] = [...this.sessionQueue];\n this.sessionQueue.splice(0,sessions.length); // add rest of sessions\n logTraceapi('log',`sending sessions, attempts:${++this.sessionSendAttempts}, queue size : ${sessions.length}`)\n\n const requestOptions = {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n },\n body: JSON.stringify(sessions)\n };\n\n fetch(this.logServerMain, requestOptions)\n .then(data=> {\n if(data.ok){\n logTraceapi('log','sessions sent successfully, queue size reset, new size is: '+this.sessionQueue.length)\n this.sessionSendAttempts= 0;\n }else{\n logTraceapi('warn',`Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`)//\n this.revertQueueSize(sessions);\n }\n })\n .catch(error => {\n logTraceapi('warn',`Error while attempting to send sessions, attempts: ${this.sessionSendAttempts}`)//\n logTraceapi('warn',error)\n this.revertQueueSize(sessions);\n }).finally( ()=> {\n this.sendSessionfinished = true;\n })\n\n }else {\n logTraceapi('warn',`Error while attempting to send Environement instance, attempts ${this.sessionSendAttempts}`);\n }\n })\n }\n }\n\n revertQueueSize(sessions: MainSession[]){\n this.sessionQueue.unshift(...sessions);\n if(this.sessionQueue.length > this.maxBufferSize ){\n let diff = this.sessionQueue.length - this.maxBufferSize;\n this.sessionQueue = this.sessionQueue.slice(0,this.maxBufferSize);\n logTraceapi('log','Buffer size exeeded the max size,last sessions have been removed from buffer, (number of sessions removed):'+diff)\n }\n }\n\n getInsertedInstanceId() : Observable<any> {\n if(this.instance){\n return this.instance;\n }\n if(this.sendInstanceEnvFinished){\n this.sendInstanceEnvFinished = false;\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*' // retest\n },\n body: JSON.stringify(this.instanceEnvironment)\n };\n this.sessionSendAttempts++;\n return from( fetch(this.logInstanceEnv,requestOptions)\n .then(res => res.ok ? res.text().then(id=> {\n this.instance = new BehaviorSubject<string>(id);\n this.logServerMain =this.logServerMain.replace(':id',id);\n this.sessionSendAttempts=0;\n logTraceapi('log','Environement instance sent successfully');\n return id; // return logserverMain\n }) : null)\n .catch(err => {\n logTraceapi('warn',err)\n return null;\n }).finally(()=> {\n this.sendInstanceEnvFinished = true;\n }))\n }\n return of(null);\n }\n\n instanceApiURL(host:string, path:string){\n return this.toURL(host,path);\n }\n\n sessionApiURL(host:string, path:string){\n return this.toURL(host,path);\n }\n\n toURL( host:string, path:string ){\n return host.endsWith(SLASH) || path.startsWith(SLASH) ? host + path : [host,path].join(SLASH);\n }\n\n ngOnDestroy(): void {\n if(this.scheduledSessionSender){\n this.scheduledSessionSender.unsubscribe();\n }\n }\n}\n","import { Inject, Injectable, OnDestroy} from \"@angular/core\";\nimport { NavigationEnd, NavigationStart, Router } from \"@angular/router\";\nimport { MainSession } from \"./trace.model\";\nimport { ApplicationConf} from \"./ng-collector.module\";\nimport { dateNow, getRegArrOrCall, getStringOrCall, logTraceapi, prettySessionFormat } from \"./util\";\nimport { SessionManager } from \"./session-manager.service\";\n\n\nconst SLASH = '/';\n@Injectable({ providedIn: 'root' }) \nexport class RouteTracerService implements OnDestroy{\n\n\n currentSession!: MainSession; \n user?: string;\n trySendInstanceEnv:any;\n excludeList: RegExp[] | undefined;\n sessionManager : SessionManager;\n constructor(private router: Router,\n @Inject('config') config: ApplicationConf,\n @Inject('host') host: string) {\n this.sessionManager = new SessionManager();\n this.excludeList = getRegArrOrCall(config.exclude);\n this.sessionManager.initialize(config,host);\n this.user = getStringOrCall(config.user);\n }\n\n private beforeUnloadHandler = (event: BeforeUnloadEvent): void => {\n this.currentSession.end = dateNow();\n if(this.excludeList!.every((e) => !e.test(this.currentSession.location))){\n this.sessionManager.addSessions(this.currentSession);//force \n this.sessionManager.sendSessions();\n }\n }\n\n ngOnDestroy(): void { \n window.removeEventListener('beforeunload',this.beforeUnloadHandler); \n }\n\n initialize() {\n logTraceapi('log','initialize');\n window.addEventListener('beforeunload', this.beforeUnloadHandler);\n this.router.events.subscribe(event => {\n if (event instanceof NavigationStart) {\n const now = dateNow();\n if (this.currentSession) {\n this.currentSession.end = dateNow();\n if(this.excludeList!.every((e) => !e.test(this.currentSession.location))){\n this.sessionManager.addSessions(this.currentSession);\n }\n logTraceapi('log',prettySessionFormat(this.currentSession));\n }\n this.currentSession = {\n '@type': \"main\",\n user: this.user,\n start: now,\n type: \"VIEW\",\n location: event.url,\n restRequests: []\n }\n }\n if (event instanceof NavigationEnd) {\n this.currentSession.name = document.title;\n this.currentSession.location = document.URL; \n\n }\n })\n\n }\n\n getCurrentSession() {\n return this.currentSession;\n }\n}\n\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { tap, finalize } from 'rxjs/operators'\nimport { RouteTracerService } from './route-tracer.service';\nimport { ExceptionInfo } from './trace.model';\nimport { dateNow } from './util';\n\n@Injectable({ providedIn: 'root' })\nexport class HttpInterceptorService implements HttpInterceptor {\n\n constructor(private routerTracerService: RouteTracerService) { }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const start = dateNow();\n let status: number, responseBody: any = '', exception: ExceptionInfo;\n let id: string| undefined;\n return next.handle(req).pipe(tap(\n (event: any) => {\n if (event instanceof HttpResponse) {\n status = +event.status;\n responseBody = event.body\n id = getReqid(event.headers);\n }\n },\n error => {\n console.log(error)\n id = getReqid(error.headers);\n status = +error.status;\n exception = {\n type: error.error.error,\n message: error.error.message\n }\n },\n ), finalize(() => {\n\n const url = toHref(req.urlWithParams);\n this.routerTracerService.getCurrentSession().restRequests.push({\n id: id,\n method: req.method,\n protocol: url.protocol.slice(0, -1),\n host: exctractHost(url.host),\n port: +url.port,\n path: url.pathname,\n query: url.search.slice(1, url.search.length),\n contentType: req.responseType,\n authScheme: extractAuthScheme(req.headers),\n status: +status,\n inDataSize: sizeOf(responseBody),\n ouDataSize: sizeOf(req.body),\n start: start,\n end: dateNow(),\n exception: exception\n });\n }));\n }\n}\n\nfunction toHref(url: string): HTMLAnchorElement {\n const href = document.createElement('a');\n href.setAttribute('href', url);\n return href;\n}\n\nfunction exctractHost(path: string) {\n const portregex = /:\\d+/;\n return path.replace(portregex, '')\n}\n\nfunction extractAuthScheme(headers: any): string | undefined {\n return headers.has('authorization')\n ? headers.get('authorization').match(/^(\\w+) /)?.at(1)\n : undefined;\n}\n\nfunction getReqid(headers:any):string | undefined {\n return headers.has('x-tracert')\n ? headers.get('x-tracert')\n : undefined;\n}\n\nfunction sizeOf(body: any): number {\n return body ? JSON.stringify(body).length : 0;\n}\n","import { NgModule, APP_INITIALIZER, ModuleWithProviders } from '@angular/core';\nimport { HTTP_INTERCEPTORS, } from '@angular/common/http';\nimport { HttpInterceptorService } from './http-interceptor.service';\nimport { RouteTracerService } from './route-tracer.service';\nimport { getNumberOrCall, logTraceapi, requirePostitiveValue, validate, HOST_PATERN, PATH_PATERN, getStringOrCall } from './util';\nimport { SessionManager } from './session-manager.service';\n\n\n\n@NgModule({})\nexport class NgCollectorModule {\n\n static forRoot(host: string, configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule> {\n if (configuration?.enabled\n && validate(host, HOST_PATERN)\n && validate(getStringOrCall(configuration?.sessionApi), PATH_PATERN)\n && validate(getStringOrCall(configuration?.instanceApi), PATH_PATERN)) {\n\n\n if(!requirePostitiveValue(getNumberOrCall(configuration?.delay),\"delay\") ||\n !requirePostitiveValue(getNumberOrCall(configuration?.bufferMaxSize),\"bufferMaxSize\") ){\n logTraceapi('warn','invalid Configuration, Ng-collector is disabled');\n return {ngModule: NgCollectorModule}\n }\n\n return {\n ngModule: NgCollectorModule,\n providers: [\n RouteTracerService,\n SessionManager,\n { provide: APP_INITIALIZER, useFactory: initializeRoutingEvents, deps: [RouteTracerService], multi: true },\n { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },\n { provide: 'config', useValue: configuration },\n { provide: 'host', useValue: host }\n ]\n };\n }\n return {\n ngModule: NgCollectorModule\n }\n\n }\n}\n\nexport function initializeRoutingEvents(routeTracerService: RouteTracerService) {\n return () => routeTracerService.initialize();\n}\n\nexport interface ApplicationConf {\n name?: string | (() => string);\n version?: string | (() => string);\n env?: string | (() => string);\n user?: string | (() => string);\n bufferMaxSize?: number | (() => number);\n delay?: number| (() => number);\n instanceApi?: string | (() => string);\n sessionApi?: string | (() => string);\n exclude?: RegExp[] | (() => RegExp[]);\n enabled?: boolean;\n}\n","/*\n * Public API Surface of inspect-ng-collector\n */\n\n\nexport * from './lib/ng-collector.module';\n\n ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["SLASH","tap","i1.RouteTracerService"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@oneteme/inspect-ng-collector" />
5
+ export * from './public-api';
@@ -0,0 +1,11 @@
1
+ import { Observable } from 'rxjs';
2
+ import { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest } from '@angular/common/http';
3
+ import { RouteTracerService } from './route-tracer.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class HttpInterceptorService implements HttpInterceptor {
6
+ private routerTracerService;
7
+ constructor(routerTracerService: RouteTracerService);
8
+ intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<HttpInterceptorService, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<HttpInterceptorService>;
11
+ }
@@ -0,0 +1,22 @@
1
+ import { ModuleWithProviders } from '@angular/core';
2
+ import { RouteTracerService } from './route-tracer.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class NgCollectorModule {
5
+ static forRoot(host: string, configuration: ApplicationConf): ModuleWithProviders<NgCollectorModule>;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgCollectorModule, never>;
7
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgCollectorModule, never, never, never>;
8
+ static ɵinj: i0.ɵɵInjectorDeclaration<NgCollectorModule>;
9
+ }
10
+ export declare function initializeRoutingEvents(routeTracerService: RouteTracerService): () => void;
11
+ export interface ApplicationConf {
12
+ name?: string | (() => string);
13
+ version?: string | (() => string);
14
+ env?: string | (() => string);
15
+ user?: string | (() => string);
16
+ bufferMaxSize?: number | (() => number);
17
+ delay?: number | (() => number);
18
+ instanceApi?: string | (() => string);
19
+ sessionApi?: string | (() => string);
20
+ exclude?: RegExp[] | (() => RegExp[]);
21
+ enabled?: boolean;
22
+ }
@@ -0,0 +1,21 @@
1
+ import { OnDestroy } from "@angular/core";
2
+ import { Router } from "@angular/router";
3
+ import { MainSession } from "./trace.model";
4
+ import { ApplicationConf } from "./ng-collector.module";
5
+ import { SessionManager } from "./session-manager.service";
6
+ import * as i0 from "@angular/core";
7
+ export declare class RouteTracerService implements OnDestroy {
8
+ private router;
9
+ currentSession: MainSession;
10
+ user?: string;
11
+ trySendInstanceEnv: any;
12
+ excludeList: RegExp[] | undefined;
13
+ sessionManager: SessionManager;
14
+ constructor(router: Router, config: ApplicationConf, host: string);
15
+ private beforeUnloadHandler;
16
+ ngOnDestroy(): void;
17
+ initialize(): void;
18
+ getCurrentSession(): MainSession;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<RouteTracerService, never>;
20
+ static ɵprov: i0.ɵɵInjectableDeclaration<RouteTracerService>;
21
+ }
@@ -0,0 +1,30 @@
1
+ import { OnDestroy } from '@angular/core';
2
+ import { InstanceEnvironment, MainSession } from './trace.model';
3
+ import { BehaviorSubject, Observable, Subscription } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ export declare class SessionManager implements OnDestroy {
6
+ logServerMain: string;
7
+ logInstanceEnv: string;
8
+ maxBufferSize: number;
9
+ delay: number;
10
+ instanceEnvironment: InstanceEnvironment;
11
+ scheduledSessionSender: Subscription;
12
+ sessionQueue: MainSession[];
13
+ sessionSendAttempts: number;
14
+ InstanceEnvSendAttempts: number;
15
+ instance: BehaviorSubject<string>;
16
+ sendSessionfinished: boolean;
17
+ sendInstanceEnvFinished: boolean;
18
+ constructor();
19
+ initialize(config: any, host: string): void;
20
+ addSessions(sessions: MainSession): void;
21
+ sendSessions(): void;
22
+ revertQueueSize(sessions: MainSession[]): void;
23
+ getInsertedInstanceId(): Observable<any>;
24
+ instanceApiURL(host: string, path: string): string;
25
+ sessionApiURL(host: string, path: string): string;
26
+ toURL(host: string, path: string): string;
27
+ ngOnDestroy(): void;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<SessionManager, never>;
29
+ static ɵprov: i0.ɵɵInjectableDeclaration<SessionManager>;
30
+ }