@grafana/faro-web-sdk
Version:
Faro instrumentations, metas, transports for web.
46 lines • 2.53 kB
JavaScript
import { BaseInstrumentation, faro, Observable, VERSION } from '@grafana/faro-core';
import { ActivityWindowTracker, isRequestEndMessage, isRequestStartMessage } from '../_internal/activityWindowTracker';
import { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';
import { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';
import { monitorInteractions } from '../_internal/monitors/interactionMonitor';
import { monitorUrlChanges } from '../_internal/monitors/urlChangeMonitor';
export class NavigationInstrumentation extends BaseInstrumentation {
constructor() {
super(...arguments);
this.name = '@grafana/faro-web-sdk:instrumentation-navigation';
this.version = VERSION;
}
initialize() {
const httpMonitor = monitorHttpRequests();
const domMutationsMonitor = monitorDomMutations();
const urlMonitor = monitorUrlChanges();
const interactionMonitor = monitorInteractions(['pointerdown', 'keydown']);
const activityWindowTracker = new ActivityWindowTracker(new Observable().merge(httpMonitor, domMutationsMonitor, urlMonitor), {
inactivityMs: 100,
drainTimeoutMs: 10 * 1000,
isOperationStart: (msg) => (isRequestStartMessage(msg) ? msg.request.requestId : undefined),
isOperationEnd: (msg) => (isRequestEndMessage(msg) ? msg.request.requestId : undefined),
});
activityWindowTracker
.filter((msg) => {
return msg.message === 'tracking-ended';
})
.subscribe((msg) => {
var _a, _b, _c;
if (((_a = msg.events) === null || _a === void 0 ? void 0 : _a.some((e) => e.type === 'url-change')) &&
((_b = msg.events) === null || _b === void 0 ? void 0 : _b.some((e) => e.type === 'dom-mutation'))) {
const urlChange = (_c = msg.events) === null || _c === void 0 ? void 0 : _c.find((e) => e.type === 'url-change');
faro.api.pushEvent('faro.navigation', {
fromUrl: urlChange === null || urlChange === void 0 ? void 0 : urlChange.from,
toUrl: urlChange === null || urlChange === void 0 ? void 0 : urlChange.to,
sameDocument: String(true),
duration: msg.duration,
});
}
});
interactionMonitor.subscribe(() => {
activityWindowTracker.startTracking();
});
}
}
//# sourceMappingURL=instrumentation.js.map