@grafana/faro-web-sdk 2.0.0-beta → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/faro-web-sdk.iife.js +1 -1
- package/dist/bundle/types/index.d.ts +3 -3
- package/dist/bundle/types/instrumentations/_internal/activityWindowTracker.d.ts +36 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/const.d.ts +4 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/domMutationMonitor.d.ts +4 -0
- package/dist/bundle/types/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.d.ts +1 -3
- package/dist/bundle/types/instrumentations/_internal/monitors/index.d.ts +5 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/interactionMonitor.d.ts +8 -0
- package/dist/{types/instrumentations/userActions → bundle/types/instrumentations/_internal/monitors}/performanceEntriesMonitor.d.ts +1 -0
- package/dist/bundle/types/instrumentations/_internal/monitors/urlChangeMonitor.d.ts +10 -0
- package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/navigation/index.d.ts +1 -0
- package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +6 -0
- package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/const.d.ts +1 -4
- package/dist/bundle/types/instrumentations/userActions/index.d.ts +3 -2
- package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -4
- package/dist/bundle/types/instrumentations/userActions/userActionController.d.ts +22 -0
- package/dist/bundle/types/instrumentations/userActions/util.d.ts +4 -0
- package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -2
- package/dist/bundle/types/transports/console/transport.d.ts +1 -1
- package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
- package/dist/cjs/config/getWebInstrumentations.js +1 -0
- package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
- package/dist/cjs/config/makeCoreConfig.js +20 -9
- package/dist/cjs/config/makeCoreConfig.js.map +1 -1
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +140 -0
- package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/const.js +8 -0
- package/dist/cjs/instrumentations/_internal/monitors/const.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +34 -0
- package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.js +45 -17
- package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/index.js +14 -0
- package/dist/cjs/instrumentations/_internal/monitors/index.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +36 -0
- package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +35 -0
- package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/types.js.map +1 -0
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +138 -0
- package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -0
- package/dist/cjs/instrumentations/index.js +3 -1
- package/dist/cjs/instrumentations/index.js.map +1 -1
- package/dist/cjs/instrumentations/navigation/index.js +6 -0
- package/dist/cjs/instrumentations/navigation/index.js.map +1 -0
- package/dist/cjs/instrumentations/navigation/instrumentation.js +68 -0
- package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -0
- package/dist/cjs/instrumentations/performance/resource.js +4 -6
- package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/const.js +5 -5
- package/dist/cjs/instrumentations/userActions/const.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/index.js +3 -2
- package/dist/cjs/instrumentations/userActions/index.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/instrumentation.js +2 -2
- package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +8 -56
- package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/cjs/instrumentations/userActions/userActionController.js +125 -0
- package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -0
- package/dist/cjs/instrumentations/userActions/util.js +20 -0
- package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
- package/dist/cjs/instrumentations/webVitals/instrumentation.js +1 -10
- package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/cjs/utils/webStorage.js +1 -1
- package/dist/cjs/utils/webStorage.js.map +1 -1
- package/dist/esm/config/getWebInstrumentations.js +2 -1
- package/dist/esm/config/getWebInstrumentations.js.map +1 -1
- package/dist/esm/config/makeCoreConfig.js +19 -9
- package/dist/esm/config/makeCoreConfig.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instrumentations/_internal/activityWindowTracker.js +113 -0
- package/dist/esm/instrumentations/_internal/activityWindowTracker.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/const.js +5 -0
- package/dist/esm/instrumentations/_internal/monitors/const.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/domMutationMonitor.js +30 -0
- package/dist/esm/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -0
- package/dist/esm/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.js +44 -17
- package/dist/esm/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/index.js +6 -0
- package/dist/esm/instrumentations/_internal/monitors/index.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/interactionMonitor.js +31 -0
- package/dist/esm/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/performanceEntriesMonitor.js +31 -0
- package/dist/esm/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/types.js.map +1 -0
- package/dist/esm/instrumentations/_internal/monitors/urlChangeMonitor.js +125 -0
- package/dist/esm/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -0
- package/dist/esm/instrumentations/index.js +1 -0
- package/dist/esm/instrumentations/index.js.map +1 -1
- package/dist/esm/instrumentations/navigation/index.js +2 -0
- package/dist/esm/instrumentations/navigation/index.js.map +1 -0
- package/dist/esm/instrumentations/navigation/instrumentation.js +46 -0
- package/dist/esm/instrumentations/navigation/instrumentation.js.map +1 -0
- package/dist/esm/instrumentations/performance/resource.js +4 -6
- package/dist/esm/instrumentations/performance/resource.js.map +1 -1
- package/dist/esm/instrumentations/userActions/const.js +1 -4
- package/dist/esm/instrumentations/userActions/const.js.map +1 -1
- package/dist/esm/instrumentations/userActions/index.js +2 -1
- package/dist/esm/instrumentations/userActions/index.js.map +1 -1
- package/dist/esm/instrumentations/userActions/instrumentation.js +2 -2
- package/dist/esm/instrumentations/userActions/instrumentation.js.map +1 -1
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js +9 -55
- package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
- package/dist/esm/instrumentations/userActions/userActionController.js +117 -0
- package/dist/esm/instrumentations/userActions/userActionController.js.map +1 -0
- package/dist/esm/instrumentations/userActions/util.js +17 -0
- package/dist/esm/instrumentations/userActions/util.js.map +1 -1
- package/dist/esm/instrumentations/webVitals/instrumentation.js +1 -10
- package/dist/esm/instrumentations/webVitals/instrumentation.js.map +1 -1
- package/dist/esm/utils/webStorage.js +1 -1
- package/dist/esm/utils/webStorage.js.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/instrumentations/_internal/activityWindowTracker.d.ts +36 -0
- package/dist/types/instrumentations/_internal/monitors/const.d.ts +4 -0
- package/dist/types/instrumentations/_internal/monitors/domMutationMonitor.d.ts +4 -0
- package/dist/types/instrumentations/{userActions → _internal/monitors}/httpRequestMonitor.d.ts +1 -3
- package/dist/types/instrumentations/_internal/monitors/index.d.ts +5 -0
- package/dist/types/instrumentations/_internal/monitors/interactionMonitor.d.ts +8 -0
- package/dist/{bundle/types/instrumentations/userActions → types/instrumentations/_internal/monitors}/performanceEntriesMonitor.d.ts +1 -0
- package/dist/types/instrumentations/_internal/monitors/urlChangeMonitor.d.ts +10 -0
- package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/csp/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/index.d.ts +1 -0
- package/dist/types/instrumentations/navigation/index.d.ts +1 -0
- package/dist/types/instrumentations/navigation/instrumentation.d.ts +6 -0
- package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/const.d.ts +1 -4
- package/dist/types/instrumentations/userActions/index.d.ts +3 -2
- package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -4
- package/dist/types/instrumentations/userActions/userActionController.d.ts +22 -0
- package/dist/types/instrumentations/userActions/util.d.ts +4 -0
- package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
- package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -2
- package/dist/types/transports/console/transport.d.ts +1 -1
- package/dist/types/transports/fetch/transport.d.ts +1 -1
- package/package.json +10 -9
- package/dist/bundle/types/instrumentations/userActions/domMutationMonitor.d.ts +0 -2
- package/dist/bundle/types/instrumentations/webVitals/webVitalsBasic.d.ts +0 -14
- package/dist/cjs/instrumentations/userActions/domMutationMonitor.js +0 -19
- package/dist/cjs/instrumentations/userActions/domMutationMonitor.js.map +0 -1
- package/dist/cjs/instrumentations/userActions/httpRequestMonitor.js.map +0 -1
- package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js +0 -17
- package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js.map +0 -1
- package/dist/cjs/instrumentations/userActions/types.js.map +0 -1
- package/dist/cjs/instrumentations/webVitals/webVitalsBasic.js +0 -36
- package/dist/cjs/instrumentations/webVitals/webVitalsBasic.js.map +0 -1
- package/dist/esm/instrumentations/userActions/domMutationMonitor.js +0 -16
- package/dist/esm/instrumentations/userActions/domMutationMonitor.js.map +0 -1
- package/dist/esm/instrumentations/userActions/httpRequestMonitor.js.map +0 -1
- package/dist/esm/instrumentations/userActions/performanceEntriesMonitor.js +0 -14
- package/dist/esm/instrumentations/userActions/performanceEntriesMonitor.js.map +0 -1
- package/dist/esm/instrumentations/userActions/types.js.map +0 -1
- package/dist/esm/instrumentations/webVitals/webVitalsBasic.js +0 -28
- package/dist/esm/instrumentations/webVitals/webVitalsBasic.js.map +0 -1
- package/dist/types/instrumentations/userActions/domMutationMonitor.d.ts +0 -2
- package/dist/types/instrumentations/webVitals/webVitalsBasic.d.ts +0 -14
- /package/dist/bundle/types/instrumentations/{userActions → _internal/monitors}/types.d.ts +0 -0
- /package/dist/cjs/instrumentations/{userActions → _internal/monitors}/types.js +0 -0
- /package/dist/esm/instrumentations/{userActions → _internal/monitors}/types.js +0 -0
- /package/dist/types/instrumentations/{userActions → _internal/monitors}/types.d.ts +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BaseInstrumentation, faro, Observable, VERSION } from '@grafana/faro-core';
|
|
2
|
+
import { ActivityWindowTracker, isRequestEndMessage, isRequestStartMessage } from '../_internal/activityWindowTracker';
|
|
3
|
+
import { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';
|
|
4
|
+
import { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';
|
|
5
|
+
import { monitorInteractions } from '../_internal/monitors/interactionMonitor';
|
|
6
|
+
import { monitorUrlChanges } from '../_internal/monitors/urlChangeMonitor';
|
|
7
|
+
export class NavigationInstrumentation extends BaseInstrumentation {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.name = '@grafana/faro-web-sdk:instrumentation-navigation';
|
|
11
|
+
this.version = VERSION;
|
|
12
|
+
}
|
|
13
|
+
initialize() {
|
|
14
|
+
const httpMonitor = monitorHttpRequests();
|
|
15
|
+
const domMutationsMonitor = monitorDomMutations();
|
|
16
|
+
const urlMonitor = monitorUrlChanges();
|
|
17
|
+
const interactionMonitor = monitorInteractions(['pointerdown', 'keydown']);
|
|
18
|
+
const activityWindowTracker = new ActivityWindowTracker(new Observable().merge(httpMonitor, domMutationsMonitor, urlMonitor), {
|
|
19
|
+
inactivityMs: 100,
|
|
20
|
+
drainTimeoutMs: 10 * 1000,
|
|
21
|
+
isOperationStart: (msg) => (isRequestStartMessage(msg) ? msg.request.requestId : undefined),
|
|
22
|
+
isOperationEnd: (msg) => (isRequestEndMessage(msg) ? msg.request.requestId : undefined),
|
|
23
|
+
});
|
|
24
|
+
activityWindowTracker
|
|
25
|
+
.filter((msg) => {
|
|
26
|
+
return msg.message === 'tracking-ended';
|
|
27
|
+
})
|
|
28
|
+
.subscribe((msg) => {
|
|
29
|
+
var _a, _b, _c;
|
|
30
|
+
if (((_a = msg.events) === null || _a === void 0 ? void 0 : _a.some((e) => e.type === 'url-change')) &&
|
|
31
|
+
((_b = msg.events) === null || _b === void 0 ? void 0 : _b.some((e) => e.type === 'dom-mutation'))) {
|
|
32
|
+
const urlChange = (_c = msg.events) === null || _c === void 0 ? void 0 : _c.find((e) => e.type === 'url-change');
|
|
33
|
+
faro.api.pushEvent('faro.navigation', {
|
|
34
|
+
fromUrl: urlChange === null || urlChange === void 0 ? void 0 : urlChange.from,
|
|
35
|
+
toUrl: urlChange === null || urlChange === void 0 ? void 0 : urlChange.to,
|
|
36
|
+
sameDocument: String(true),
|
|
37
|
+
duration: msg.duration,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
interactionMonitor.subscribe(() => {
|
|
42
|
+
activityWindowTracker.startTracking();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/navigation/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACvH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAAlE;;QACW,SAAI,GAAG,kDAAkD,CAAC;QAC1D,YAAO,GAAG,OAAO,CAAC;IAyC7B,CAAC;IAvCU,UAAU;QACjB,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;QAC1C,MAAM,mBAAmB,GAAG,mBAAmB,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACvC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;QAE3E,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,CACrD,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,mBAAmB,EAAE,UAAU,CAAC,EACpE;YACE,YAAY,EAAE,GAAG;YACjB,cAAc,EAAE,EAAE,GAAG,IAAI;YACzB,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3F,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;SACxF,CACF,CAAC;QAEF,qBAAqB;aAClB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,OAAO,GAAG,CAAC,OAAO,KAAK,gBAAgB,CAAC;QAC1C,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;;YACjB,IACE,CAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;iBACrD,MAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAA,EACvD,CAAC;gBACD,MAAM,SAAS,GAAG,MAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;gBACxE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE;oBACpC,OAAO,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI;oBACxB,KAAK,EAAE,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,EAAE;oBACpB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC;oBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE;YAChC,qBAAqB,CAAC,aAAa,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { BaseInstrumentation, faro, Observable, VERSION } from '@grafana/faro-core';\n\nimport { ActivityWindowTracker, isRequestEndMessage, isRequestStartMessage } from '../_internal/activityWindowTracker';\nimport { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';\nimport { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';\nimport { monitorInteractions } from '../_internal/monitors/interactionMonitor';\nimport { monitorUrlChanges } from '../_internal/monitors/urlChangeMonitor';\n\nexport class NavigationInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-navigation';\n readonly version = VERSION;\n\n override initialize(): void {\n const httpMonitor = monitorHttpRequests();\n const domMutationsMonitor = monitorDomMutations();\n const urlMonitor = monitorUrlChanges();\n const interactionMonitor = monitorInteractions(['pointerdown', 'keydown']);\n\n const activityWindowTracker = new ActivityWindowTracker(\n new Observable().merge(httpMonitor, domMutationsMonitor, urlMonitor),\n {\n inactivityMs: 100,\n drainTimeoutMs: 10 * 1000,\n isOperationStart: (msg) => (isRequestStartMessage(msg) ? msg.request.requestId : undefined),\n isOperationEnd: (msg) => (isRequestEndMessage(msg) ? msg.request.requestId : undefined),\n }\n );\n\n activityWindowTracker\n .filter((msg) => {\n return msg.message === 'tracking-ended';\n })\n .subscribe((msg) => {\n if (\n msg.events?.some((e: any) => e.type === 'url-change') &&\n msg.events?.some((e: any) => e.type === 'dom-mutation')\n ) {\n const urlChange = msg.events?.find((e: any) => e.type === 'url-change');\n faro.api.pushEvent('faro.navigation', {\n fromUrl: urlChange?.from,\n toUrl: urlChange?.to,\n sameDocument: String(true),\n duration: msg.duration,\n });\n }\n });\n\n interactionMonitor.subscribe(() => {\n activityWindowTracker.startTracking();\n });\n }\n}\n"]}
|
|
@@ -9,18 +9,16 @@ export function observeResourceTimings(faroNavigationId, pushEvent, observable)
|
|
|
9
9
|
const entries = observedEntries.getEntries();
|
|
10
10
|
for (const resourceEntryRaw of entries) {
|
|
11
11
|
if (isUrlIgnored(resourceEntryRaw.name)) {
|
|
12
|
-
|
|
12
|
+
continue;
|
|
13
13
|
}
|
|
14
|
+
observable === null || observable === void 0 ? void 0 : observable.notify({
|
|
15
|
+
type: RESOURCE_ENTRY,
|
|
16
|
+
});
|
|
14
17
|
const resourceEntryJson = resourceEntryRaw.toJSON();
|
|
15
18
|
let spanContext = getSpanContextFromServerTiming(resourceEntryJson === null || resourceEntryJson === void 0 ? void 0 : resourceEntryJson.serverTiming);
|
|
16
19
|
if ((trackResources == null && includePerformanceEntry(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) ||
|
|
17
20
|
trackResources) {
|
|
18
21
|
const faroResourceEntry = Object.assign(Object.assign({}, createFaroResourceTiming(resourceEntryJson)), { faroNavigationId, faroResourceId: genShortID() });
|
|
19
|
-
if (faro.config.trackUserActionsPreview) {
|
|
20
|
-
observable === null || observable === void 0 ? void 0 : observable.notify({
|
|
21
|
-
type: RESOURCE_ENTRY,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
22
|
pushEvent('faro.performance.resource', faroResourceEntry, undefined, {
|
|
25
23
|
spanContext,
|
|
26
24
|
timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAKvH,MAAM,uBAAuB,GAAG,EAAE,aAAa,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAE/E,MAAM,UAAU,sBAAsB,CACpC,gBAAwB,EACxB,SAAiC,EACjC,UAA4C;IAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,CAAC,eAAe,EAAE,EAAE;QAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;QAE7C,KAAK,MAAM,gBAAgB,IAAI,OAAO,EAAE,CAAC;YACvC,IAAI,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../../src/instrumentations/performance/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAKvH,MAAM,uBAAuB,GAAG,EAAE,aAAa,EAAE,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAE/E,MAAM,UAAU,sBAAsB,CACpC,gBAAwB,EACxB,SAAiC,EACjC,UAA4C;IAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,CAAC,eAAe,EAAE,EAAE;QAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;QAE7C,KAAK,MAAM,gBAAgB,IAAI,OAAO,EAAE,CAAC;YACvC,IAAI,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,WAAW,GAAgB,8BAA8B,CAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,CAAC,CAAC;YAE/F,IACE,CAAC,cAAc,IAAI,IAAI,IAAI,uBAAuB,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;gBAC/F,cAAc,EACd,CAAC;gBACD,MAAM,iBAAiB,mCAClB,wBAAwB,CAAC,iBAAiB,CAAC,KAC9C,gBAAgB,EAChB,cAAc,EAAE,UAAU,EAAE,GAC7B,CAAC;gBAEF,SAAS,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,EAAE;oBACnE,WAAW;oBACX,oBAAoB,EAAE,WAAW,CAAC,UAAU,GAAG,iBAAiB,CAAC,SAAS;iBAC3E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC;QACf,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { faro, genShortID } from '@grafana/faro-core';\nimport type { EventsAPI, Observable, PushEventOptions } from '@grafana/faro-core';\n\nimport { isUrlIgnored } from '../../utils/url';\n\nimport { RESOURCE_ENTRY } from './performanceConstants';\nimport { createFaroResourceTiming, getSpanContextFromServerTiming, includePerformanceEntry } from './performanceUtils';\nimport type { ResourceEntryMessage } from './types';\n\ntype SpanContext = PushEventOptions['spanContext'];\n\nconst DEFAULT_TRACK_RESOURCES = { initiatorType: ['xmlhttprequest', 'fetch'] };\n\nexport function observeResourceTimings(\n faroNavigationId: string,\n pushEvent: EventsAPI['pushEvent'],\n observable: Observable<ResourceEntryMessage>\n) {\n const trackResources = faro.config.trackResources;\n\n const observer = new PerformanceObserver((observedEntries) => {\n const entries = observedEntries.getEntries();\n\n for (const resourceEntryRaw of entries) {\n if (isUrlIgnored(resourceEntryRaw.name)) {\n continue;\n }\n\n observable?.notify({\n type: RESOURCE_ENTRY,\n });\n\n const resourceEntryJson = resourceEntryRaw.toJSON();\n let spanContext: SpanContext = getSpanContextFromServerTiming(resourceEntryJson?.serverTiming);\n\n if (\n (trackResources == null && includePerformanceEntry(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) ||\n trackResources\n ) {\n const faroResourceEntry = {\n ...createFaroResourceTiming(resourceEntryJson),\n faroNavigationId,\n faroResourceId: genShortID(),\n };\n\n pushEvent('faro.performance.resource', faroResourceEntry, undefined, {\n spanContext,\n timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime,\n });\n }\n }\n });\n\n observer.observe({\n type: RESOURCE_ENTRY,\n buffered: true,\n });\n}\n"]}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';
|
|
2
|
-
export const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';
|
|
3
|
-
export const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';
|
|
4
|
-
export const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';
|
|
5
1
|
export const userActionDataAttributeParsed = 'faroUserActionName';
|
|
6
2
|
export const userActionDataAttribute = 'data-faro-user-action-name';
|
|
3
|
+
export { MESSAGE_TYPE_DOM_MUTATION, MESSAGE_TYPE_HTTP_REQUEST_START, MESSAGE_TYPE_HTTP_REQUEST_END, } from '../_internal/monitors/const';
|
|
7
4
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,6BAA6B,GAAG,oBAAoB,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,4BAA4B,CAAC;AAEpE,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC","sourcesContent":["export const userActionDataAttributeParsed = 'faroUserActionName';\nexport const userActionDataAttribute = 'data-faro-user-action-name';\n\nexport {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n} from '../_internal/monitors/const';\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { UserActionInstrumentation } from './instrumentation';
|
|
2
|
-
export { MESSAGE_TYPE_DOM_MUTATION, MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START,
|
|
2
|
+
export { MESSAGE_TYPE_DOM_MUTATION, MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START, } from '../_internal/monitors/const';
|
|
3
|
+
export { userActionDataAttribute } from './const';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAS9D,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,+BAA+B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAS9D,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC","sourcesContent":["export { UserActionInstrumentation } from './instrumentation';\n\nexport type {\n DomMutationMessage,\n HttpRequestEndMessage,\n HttpRequestStartMessage,\n HttpRequestMessagePayload,\n} from '../_internal/monitors/types';\n\nexport {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from '../_internal/monitors/const';\n\nexport { userActionDataAttribute } from './const';\n"]}
|
|
@@ -7,7 +7,7 @@ export class UserActionInstrumentation extends BaseInstrumentation {
|
|
|
7
7
|
this.version = VERSION;
|
|
8
8
|
}
|
|
9
9
|
initialize() {
|
|
10
|
-
const { processUserEvent,
|
|
10
|
+
const { processUserEvent, processUserActionStarted } = getUserEventHandler(faro);
|
|
11
11
|
window.addEventListener('pointerdown', processUserEvent);
|
|
12
12
|
window.addEventListener('keydown', (ev) => {
|
|
13
13
|
if ([' ', 'Enter'].includes(ev.key)) {
|
|
@@ -16,7 +16,7 @@ export class UserActionInstrumentation extends BaseInstrumentation {
|
|
|
16
16
|
});
|
|
17
17
|
this._userActionSub = userActionsMessageBus.subscribe(({ type, userAction }) => {
|
|
18
18
|
if (type === 'user_action_start') {
|
|
19
|
-
|
|
19
|
+
processUserActionStarted(userAction);
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAqB,qBAAqB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAAlE;;QACW,SAAI,GAAG,mDAAmD,CAAC;QAC3D,YAAO,GAAG,OAAO,CAAC;IAuB7B,CAAC;IAnBC,UAAU;QACR,MAAM,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAqB,qBAAqB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAAlE;;QACW,SAAI,GAAG,mDAAmD,CAAC;QAC3D,YAAO,GAAG,OAAO,CAAC;IAuB7B,CAAC;IAnBC,UAAU;QACR,MAAM,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAiB,EAAE,EAAE;YACvD,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YAC7E,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACjC,wBAAwB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;;QACL,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,EAAE,CAAC;IACrC,CAAC;CACF","sourcesContent":["import { BaseInstrumentation, faro, type Subscription, userActionsMessageBus, VERSION } from '@grafana/faro-core';\n\nimport { getUserEventHandler } from './processUserActionEventHandler';\n\nexport class UserActionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-user-action';\n readonly version = VERSION;\n\n private _userActionSub?: Subscription;\n\n initialize(): void {\n const { processUserEvent, processUserActionStarted } = getUserEventHandler(faro);\n window.addEventListener('pointerdown', processUserEvent);\n window.addEventListener('keydown', (ev: KeyboardEvent) => {\n if ([' ', 'Enter'].includes(ev.key)) {\n processUserEvent(ev);\n }\n });\n\n this._userActionSub = userActionsMessageBus.subscribe(({ type, userAction }) => {\n if (type === 'user_action_start') {\n processUserActionStarted(userAction);\n }\n });\n }\n\n destroy() {\n this._userActionSub?.unsubscribe();\n }\n}\n"]}
|
|
@@ -1,65 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { monitorDomMutations } from './domMutationMonitor';
|
|
4
|
-
import { monitorHttpRequests } from './httpRequestMonitor';
|
|
5
|
-
import { monitorPerformanceEntries } from './performanceEntriesMonitor';
|
|
1
|
+
import { userActionDataAttributeParsed as userActionDataAttribute } from './const';
|
|
2
|
+
import { UserActionController } from './userActionController';
|
|
6
3
|
import { convertDataAttributeName } from './util';
|
|
7
4
|
export function getUserEventHandler(faro) {
|
|
8
5
|
const { api, config } = faro;
|
|
9
|
-
const httpMonitor = monitorHttpRequests();
|
|
10
|
-
const domMutationsMonitor = monitorDomMutations();
|
|
11
|
-
const performanceEntriesMonitor = monitorPerformanceEntries();
|
|
12
6
|
function processUserEvent(event) {
|
|
13
|
-
var _a;
|
|
14
|
-
const userActionName = getUserActionNameFromElement(event.target, (_a = config.
|
|
7
|
+
var _a, _b;
|
|
8
|
+
const userActionName = getUserActionNameFromElement(event.target, (_b = (_a = config.userActionsInstrumentation) === null || _a === void 0 ? void 0 : _a.dataAttributeName) !== null && _b !== void 0 ? _b : userActionDataAttribute);
|
|
15
9
|
// We don't have a data attribute
|
|
16
10
|
if (!userActionName) {
|
|
17
11
|
return;
|
|
18
12
|
}
|
|
19
13
|
const userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });
|
|
20
14
|
if (userAction) {
|
|
21
|
-
|
|
15
|
+
processUserActionStarted(userAction);
|
|
22
16
|
}
|
|
23
17
|
}
|
|
24
|
-
function
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
.merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor)
|
|
28
|
-
.takeWhile(() => [UserActionState.Started, UserActionState.Halted].includes(userAction.getState()))
|
|
29
|
-
.filter((msg) => {
|
|
30
|
-
// If the user action is in halt state, we only keep listening to ended http requests
|
|
31
|
-
if (userAction.getState() === UserActionState.Halted &&
|
|
32
|
-
!(isRequestEndMessage(msg) && runningRequests.has(msg.request.requestId))) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
return true;
|
|
36
|
-
})
|
|
37
|
-
.subscribe((msg) => {
|
|
38
|
-
if (isRequestStartMessage(msg)) {
|
|
39
|
-
// An action is on halt if it has pending items, like pending HTTP requests.
|
|
40
|
-
// In this case we start a separate timeout to wait for the requests to finish
|
|
41
|
-
// If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)
|
|
42
|
-
// But we are still subscribed to
|
|
43
|
-
runningRequests.set(msg.request.requestId, msg.request);
|
|
44
|
-
}
|
|
45
|
-
if (isRequestEndMessage(msg)) {
|
|
46
|
-
runningRequests.delete(msg.request.requestId);
|
|
47
|
-
}
|
|
48
|
-
if (!isRequestEndMessage(msg)) {
|
|
49
|
-
userAction.extend(() => runningRequests.size > 0);
|
|
50
|
-
}
|
|
51
|
-
else if (userAction.getState() === UserActionState.Halted && runningRequests.size === 0) {
|
|
52
|
-
userAction.end();
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
userAction
|
|
56
|
-
.filter((v) => [UserActionState.Ended, UserActionState.Cancelled].includes(v))
|
|
57
|
-
.first()
|
|
58
|
-
.subscribe(() => {
|
|
59
|
-
unsubscribeAllMonitors(allMonitorsSub);
|
|
60
|
-
});
|
|
18
|
+
function processUserActionStarted(userAction) {
|
|
19
|
+
const internalUserAction = userAction;
|
|
20
|
+
new UserActionController(internalUserAction).attach();
|
|
61
21
|
}
|
|
62
|
-
return { processUserEvent,
|
|
22
|
+
return { processUserEvent, processUserActionStarted };
|
|
63
23
|
}
|
|
64
24
|
export function getUserActionNameFromElement(element, dataAttributeName) {
|
|
65
25
|
const parsedDataAttributeName = convertDataAttributeName(dataAttributeName);
|
|
@@ -75,10 +35,4 @@ export function unsubscribeAllMonitors(allMonitorsSub) {
|
|
|
75
35
|
allMonitorsSub === null || allMonitorsSub === void 0 ? void 0 : allMonitorsSub.unsubscribe();
|
|
76
36
|
allMonitorsSub = undefined;
|
|
77
37
|
}
|
|
78
|
-
export function isRequestStartMessage(msg) {
|
|
79
|
-
return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;
|
|
80
|
-
}
|
|
81
|
-
export function isRequestEndMessage(msg) {
|
|
82
|
-
return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;
|
|
83
|
-
}
|
|
84
38
|
//# sourceMappingURL=processUserActionEventHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,IAAI,uBAAuB,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,SAAS,gBAAgB,CAAC,KAAmC;;QAC3D,MAAM,cAAc,GAAG,4BAA4B,CACjD,KAAK,CAAC,MAAqB,EAC3B,MAAA,MAAA,MAAM,CAAC,0BAA0B,0CAAE,iBAAiB,mCAAI,uBAAuB,CAChF,CAAC;QAEF,iCAAiC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACxF,IAAI,UAAU,EAAE,CAAC;YACf,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,SAAS,wBAAwB,CAAC,UAA+B;QAC/D,MAAM,kBAAkB,GAAG,UAAoD,CAAC;QAChF,IAAI,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAoB,EAAE,iBAAyB;IAC1F,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,cAAwC;IAC7E,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,EAAE,CAAC;IAC9B,cAAc,GAAG,SAAS,CAAC;AAC7B,CAAC","sourcesContent":["import type { Faro, Subscription, UserActionInterface, UserActionInternalInterface } from '@grafana/faro-core';\n\nimport { userActionDataAttributeParsed as userActionDataAttribute } from './const';\nimport { UserActionController } from './userActionController';\nimport { convertDataAttributeName } from './util';\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n function processUserEvent(event: PointerEvent | KeyboardEvent) {\n const userActionName = getUserActionNameFromElement(\n event.target as HTMLElement,\n config.userActionsInstrumentation?.dataAttributeName ?? userActionDataAttribute\n );\n\n // We don't have a data attribute\n if (!userActionName) {\n return;\n }\n\n const userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });\n if (userAction) {\n processUserActionStarted(userAction);\n }\n }\n\n function processUserActionStarted(userAction: UserActionInterface) {\n const internalUserAction = userAction as unknown as UserActionInternalInterface;\n new UserActionController(internalUserAction).attach();\n }\n\n return { processUserEvent, processUserActionStarted };\n}\n\nexport function getUserActionNameFromElement(element: HTMLElement, dataAttributeName: string): string | undefined {\n const parsedDataAttributeName = convertDataAttributeName(dataAttributeName);\n const dataset = element.dataset;\n\n for (const key in dataset) {\n if (key === parsedDataAttributeName) {\n return dataset[key];\n }\n }\n\n return undefined;\n}\n\nexport function unsubscribeAllMonitors(allMonitorsSub: Subscription | undefined) {\n allMonitorsSub?.unsubscribe();\n allMonitorsSub = undefined;\n}\n"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// packages/web-sdk/src/instrumentations/userActions/userActionController.ts
|
|
2
|
+
import { Observable, UserActionState } from '@grafana/faro-core';
|
|
3
|
+
import { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';
|
|
4
|
+
import { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';
|
|
5
|
+
import { monitorPerformanceEntries } from '../_internal/monitors/performanceEntriesMonitor';
|
|
6
|
+
import { isRequestEndMessage, isRequestStartMessage, startTimeout } from './util';
|
|
7
|
+
const defaultFollowUpActionTimeRange = 100;
|
|
8
|
+
const defaultHaltTimeout = 10 * 1000;
|
|
9
|
+
export class UserActionController {
|
|
10
|
+
constructor(userAction) {
|
|
11
|
+
this.userAction = userAction;
|
|
12
|
+
this.http = monitorHttpRequests();
|
|
13
|
+
this.dom = monitorDomMutations();
|
|
14
|
+
this.perf = monitorPerformanceEntries();
|
|
15
|
+
this.isValid = false;
|
|
16
|
+
this.runningRequests = new Map();
|
|
17
|
+
}
|
|
18
|
+
attach() {
|
|
19
|
+
// Subscribe to monitors while action is active/halting
|
|
20
|
+
this.allMonitorsSub = new Observable()
|
|
21
|
+
.merge(this.http, this.dom, this.perf)
|
|
22
|
+
.takeWhile(() => [UserActionState.Started, UserActionState.Halted].includes(this.userAction.getState()))
|
|
23
|
+
.filter((msg) => {
|
|
24
|
+
// If the user action is in halt state, we only keep listening to ended http requests
|
|
25
|
+
if (this.userAction.getState() === UserActionState.Halted &&
|
|
26
|
+
!(isRequestEndMessage(msg) && this.runningRequests.has(msg.request.requestId))) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
})
|
|
31
|
+
.subscribe((msg) => {
|
|
32
|
+
if (isRequestStartMessage(msg)) {
|
|
33
|
+
// An action is on halt if it has pending items, like pending HTTP requests.
|
|
34
|
+
// In this case we start a separate timeout to wait for the requests to finish
|
|
35
|
+
// If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)
|
|
36
|
+
// But we are still subscribed to
|
|
37
|
+
this.runningRequests.set(msg.request.requestId, msg.request);
|
|
38
|
+
}
|
|
39
|
+
if (isRequestEndMessage(msg)) {
|
|
40
|
+
this.runningRequests.delete(msg.request.requestId);
|
|
41
|
+
}
|
|
42
|
+
if (!isRequestEndMessage(msg)) {
|
|
43
|
+
if (!this.isValid) {
|
|
44
|
+
this.isValid = true;
|
|
45
|
+
}
|
|
46
|
+
this.scheduleFollowUp();
|
|
47
|
+
}
|
|
48
|
+
else if (this.userAction.getState() === UserActionState.Halted && this.runningRequests.size === 0) {
|
|
49
|
+
this.endAction();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// When UA ends or cancels, cleanup timers/subscriptions
|
|
53
|
+
this.stateSub = this.userAction
|
|
54
|
+
.filter((s) => [UserActionState.Ended, UserActionState.Cancelled].includes(s))
|
|
55
|
+
.first()
|
|
56
|
+
.subscribe(() => this.cleanup());
|
|
57
|
+
// initial follow-up window in case nothing else happens
|
|
58
|
+
this.scheduleFollowUp();
|
|
59
|
+
}
|
|
60
|
+
scheduleFollowUp() {
|
|
61
|
+
this.clearTimer(this.followUpTid);
|
|
62
|
+
this.followUpTid = setTimeout(() => {
|
|
63
|
+
// If action just started and there's pending work, go to halted
|
|
64
|
+
if (this.userAction.getState() === UserActionState.Started && this.runningRequests.size > 0) {
|
|
65
|
+
this.haltAction();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// If we saw any relevant activity in the window, finish as ended
|
|
69
|
+
if (this.isValid) {
|
|
70
|
+
this.endAction();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Otherwise, no signals => cancel
|
|
74
|
+
this.cancelAction();
|
|
75
|
+
}, defaultFollowUpActionTimeRange);
|
|
76
|
+
}
|
|
77
|
+
haltAction() {
|
|
78
|
+
if (this.userAction.getState() !== UserActionState.Started) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.userAction.halt();
|
|
82
|
+
this.startHaltTimeout();
|
|
83
|
+
}
|
|
84
|
+
startHaltTimeout() {
|
|
85
|
+
this.clearTimer(this.haltTid);
|
|
86
|
+
this.haltTid = startTimeout(this.haltTid, () => {
|
|
87
|
+
// If still halted after timeout, end
|
|
88
|
+
if (this.userAction.getState() === UserActionState.Halted) {
|
|
89
|
+
this.endAction();
|
|
90
|
+
}
|
|
91
|
+
}, defaultHaltTimeout);
|
|
92
|
+
}
|
|
93
|
+
endAction() {
|
|
94
|
+
this.userAction.end();
|
|
95
|
+
this.cleanup();
|
|
96
|
+
}
|
|
97
|
+
cancelAction() {
|
|
98
|
+
this.userAction.cancel();
|
|
99
|
+
this.cleanup();
|
|
100
|
+
}
|
|
101
|
+
cleanup() {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
this.clearTimer(this.followUpTid);
|
|
104
|
+
this.clearTimer(this.haltTid);
|
|
105
|
+
(_a = this.allMonitorsSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
106
|
+
(_b = this.stateSub) === null || _b === void 0 ? void 0 : _b.unsubscribe();
|
|
107
|
+
this.allMonitorsSub = undefined;
|
|
108
|
+
this.stateSub = undefined;
|
|
109
|
+
this.runningRequests.clear();
|
|
110
|
+
}
|
|
111
|
+
clearTimer(id) {
|
|
112
|
+
if (id) {
|
|
113
|
+
clearTimeout(id);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=userActionController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userActionController.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/userActionController.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/web-sdk/src/instrumentations/userActions/userActionController.ts\nimport { Observable, UserActionState } from '@grafana/faro-core';\nimport type { Subscription, UserActionInternalInterface } from '@grafana/faro-core';\n\nimport { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';\nimport { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';\nimport { monitorPerformanceEntries } from '../_internal/monitors/performanceEntriesMonitor';\nimport type { HttpRequestMessagePayload } from '../_internal/monitors/types';\n\nimport { isRequestEndMessage, isRequestStartMessage, startTimeout } from './util';\n\nconst defaultFollowUpActionTimeRange = 100;\nconst defaultHaltTimeout = 10 * 1000;\n\nexport class UserActionController {\n private readonly http = monitorHttpRequests();\n private readonly dom = monitorDomMutations();\n private readonly perf = monitorPerformanceEntries();\n\n private allMonitorsSub?: Subscription;\n private stateSub?: Subscription;\n private followUpTid?: number;\n private haltTid?: number;\n\n private isValid = false;\n private runningRequests = new Map<string, HttpRequestMessagePayload>();\n\n constructor(private userAction: UserActionInternalInterface) {}\n\n attach(): void {\n // Subscribe to monitors while action is active/halting\n this.allMonitorsSub = new Observable()\n .merge(this.http, this.dom, this.perf)\n .takeWhile(() => [UserActionState.Started, UserActionState.Halted].includes(this.userAction.getState()))\n .filter((msg) => {\n // If the user action is in halt state, we only keep listening to ended http requests\n if (\n this.userAction.getState() === UserActionState.Halted &&\n !(isRequestEndMessage(msg) && this.runningRequests.has(msg.request.requestId))\n ) {\n return false;\n }\n\n return true;\n })\n .subscribe((msg) => {\n if (isRequestStartMessage(msg)) {\n // An action is on halt if it has pending items, like pending HTTP requests.\n // In this case we start a separate timeout to wait for the requests to finish\n // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)\n // But we are still subscribed to\n this.runningRequests.set(msg.request.requestId, msg.request);\n }\n\n if (isRequestEndMessage(msg)) {\n this.runningRequests.delete(msg.request.requestId);\n }\n\n if (!isRequestEndMessage(msg)) {\n if (!this.isValid) {\n this.isValid = true;\n }\n this.scheduleFollowUp();\n } else if (this.userAction.getState() === UserActionState.Halted && this.runningRequests.size === 0) {\n this.endAction();\n }\n });\n\n // When UA ends or cancels, cleanup timers/subscriptions\n this.stateSub = (this.userAction as unknown as Observable)\n .filter((s: UserActionState) => [UserActionState.Ended, UserActionState.Cancelled].includes(s))\n .first()\n .subscribe(() => this.cleanup());\n\n // initial follow-up window in case nothing else happens\n this.scheduleFollowUp();\n }\n\n private scheduleFollowUp() {\n this.clearTimer(this.followUpTid);\n this.followUpTid = setTimeout(() => {\n // If action just started and there's pending work, go to halted\n if (this.userAction.getState() === UserActionState.Started && this.runningRequests.size > 0) {\n this.haltAction();\n return;\n }\n\n // If we saw any relevant activity in the window, finish as ended\n if (this.isValid) {\n this.endAction();\n return;\n }\n\n // Otherwise, no signals => cancel\n this.cancelAction();\n }, defaultFollowUpActionTimeRange) as any;\n }\n\n private haltAction() {\n if (this.userAction.getState() !== UserActionState.Started) {\n return;\n }\n this.userAction.halt();\n this.startHaltTimeout();\n }\n\n private startHaltTimeout() {\n this.clearTimer(this.haltTid);\n this.haltTid = startTimeout(\n this.haltTid,\n () => {\n // If still halted after timeout, end\n if (this.userAction.getState() === UserActionState.Halted) {\n this.endAction();\n }\n },\n defaultHaltTimeout\n ) as any;\n }\n\n private endAction() {\n this.userAction.end();\n this.cleanup();\n }\n\n private cancelAction() {\n this.userAction.cancel();\n this.cleanup();\n }\n\n private cleanup() {\n this.clearTimer(this.followUpTid);\n this.clearTimer(this.haltTid);\n this.allMonitorsSub?.unsubscribe();\n this.stateSub?.unsubscribe();\n this.allMonitorsSub = undefined;\n this.stateSub = undefined;\n this.runningRequests.clear();\n }\n\n private clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';
|
|
1
2
|
/**
|
|
2
3
|
* Parses the action attribute name by removing the 'data-' prefix and converting
|
|
3
4
|
* the remaining string to camelCase.
|
|
@@ -10,4 +11,20 @@ export function convertDataAttributeName(userActionDataAttribute) {
|
|
|
10
11
|
const withUpperCase = withoutData === null || withoutData === void 0 ? void 0 : withoutData.replace(/-(.)/g, (_, char) => char.toUpperCase());
|
|
11
12
|
return withUpperCase === null || withUpperCase === void 0 ? void 0 : withUpperCase.replace(/-/g, '');
|
|
12
13
|
}
|
|
14
|
+
export function startTimeout(timeoutId, cb, delay) {
|
|
15
|
+
if (timeoutId) {
|
|
16
|
+
clearTimeout(timeoutId);
|
|
17
|
+
}
|
|
18
|
+
//@ts-expect-error for some reason vscode is using the node types
|
|
19
|
+
timeoutId = setTimeout(() => {
|
|
20
|
+
cb();
|
|
21
|
+
}, delay);
|
|
22
|
+
return timeoutId;
|
|
23
|
+
}
|
|
24
|
+
export function isRequestStartMessage(msg) {
|
|
25
|
+
return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;
|
|
26
|
+
}
|
|
27
|
+
export function isRequestEndMessage(msg) {
|
|
28
|
+
return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;
|
|
29
|
+
}
|
|
13
30
|
//# sourceMappingURL=util.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAEzF;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,uBAA+B;IACtE,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAA6B,EAAE,EAAc,EAAE,KAAa;IACvF,IAAI,SAAS,EAAE,CAAC;QACd,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,iEAAiE;IACjE,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;QAC1B,EAAE,EAAE,CAAC;IACP,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAQ;IAC5C,OAAO,GAAG,CAAC,IAAI,KAAK,+BAA+B,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,OAAO,GAAG,CAAC,IAAI,KAAK,6BAA6B,CAAC;AACpD,CAAC","sourcesContent":["import type { HttpRequestEndMessage, HttpRequestStartMessage } from '../_internal/monitors/types';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';\n\n/**\n * Parses the action attribute name by removing the 'data-' prefix and converting\n * the remaining string to camelCase.\n *\n * This is needed because the browser will remove the 'data-' prefix and the dashes from\n * data attributes and make then camelCase.\n */\nexport function convertDataAttributeName(userActionDataAttribute: string) {\n const withoutData = userActionDataAttribute.split('data-')[1];\n const withUpperCase = withoutData?.replace(/-(.)/g, (_, char) => char.toUpperCase());\n return withUpperCase?.replace(/-/g, '');\n}\n\nexport function startTimeout(timeoutId: number | undefined, cb: () => void, delay: number) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n //@ts-expect-error for some reason vscode is using the node types\n timeoutId = setTimeout(() => {\n cb();\n }, delay);\n\n return timeoutId;\n}\n\nexport function isRequestStartMessage(msg: any): msg is HttpRequestStartMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;\n}\n\nexport function isRequestEndMessage(msg: any): msg is HttpRequestEndMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { BaseInstrumentation, VERSION } from '@grafana/faro-core';
|
|
2
|
-
import { WebVitalsBasic } from './webVitalsBasic';
|
|
3
2
|
import { WebVitalsWithAttribution } from './webVitalsWithAttribution';
|
|
4
3
|
export class WebVitalsInstrumentation extends BaseInstrumentation {
|
|
5
4
|
constructor() {
|
|
@@ -9,16 +8,8 @@ export class WebVitalsInstrumentation extends BaseInstrumentation {
|
|
|
9
8
|
}
|
|
10
9
|
initialize() {
|
|
11
10
|
this.logDebug('Initializing');
|
|
12
|
-
const webVitals = this.
|
|
11
|
+
const webVitals = new WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);
|
|
13
12
|
webVitals.initialize();
|
|
14
13
|
}
|
|
15
|
-
intializeWebVitalsInstrumentation() {
|
|
16
|
-
var _a, _b, _c;
|
|
17
|
-
if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.trackWebVitalsAttribution) === false ||
|
|
18
|
-
((_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.webVitalsInstrumentation) === null || _c === void 0 ? void 0 : _c.trackAttribution) === false) {
|
|
19
|
-
return new WebVitalsBasic(this.api.pushMeasurement, this.config.webVitalsInstrumentation);
|
|
20
|
-
}
|
|
21
|
-
return new WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);
|
|
22
|
-
}
|
|
23
14
|
}
|
|
24
15
|
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,OAAO,wBAAyB,SAAQ,mBAAmB;IAAjE;;QACW,SAAI,GAAG,kDAAkD,CAAC;QAC1D,YAAO,GAAG,OAAO,CAAC;IAO7B,CAAC;IALC,UAAU;QACR,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC/G,SAAS,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;CACF","sourcesContent":["import { BaseInstrumentation, VERSION } from '@grafana/faro-core';\n\nimport { WebVitalsWithAttribution } from './webVitalsWithAttribution';\n\nexport class WebVitalsInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-web-vitals';\n readonly version = VERSION;\n\n initialize(): void {\n this.logDebug('Initializing');\n const webVitals = new WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);\n webVitals.initialize();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,cAAc;CACb,CAAC;AAIX;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI,CAAC;QACH,IAAI,OAAO,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,MAAA,IAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,uBAAuB,IAAI,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,mBAAqC;IACxE,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,mBAAqC;IACvF,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,cAAc;CACb,CAAC;AAIX;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI,CAAC;QACH,IAAI,OAAO,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,MAAA,IAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,uBAAuB,IAAI,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,mBAAqC;IACxE,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,mBAAqC;IACvF,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,aAAa;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,mBAAqC;IAC3E,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAEvF,SAAS,yBAAyB,CAAC,mBAAqC;IACtE,IAAI,mBAAmB,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC;QACjD,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,IAAI,mBAAmB,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\nexport const webStorageType = {\n session: 'sessionStorage',\n local: 'localStorage',\n} as const;\n\ntype StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType];\n\n/**\n * Check if selected web storage mechanism is available.\n * @param type storage mechanism to test availability for.\n * @returns\n */\nexport function isWebStorageAvailable(type: StorageMechanism): boolean {\n try {\n let storage;\n storage = window[type];\n\n const testItem = '__faro_storage_test__';\n storage.setItem(testItem, testItem);\n storage.removeItem(testItem);\n return true;\n } catch (error) {\n // the above can throw\n faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`);\n return false;\n }\n}\n\n/**\n * Get item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function getItem(key: string, webStorageMechanism: StorageMechanism): string | null {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n return window[webStorageMechanism].getItem(key);\n }\n\n return null;\n}\n\n/**\n * Store item in SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param value: the item data.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n try {\n window[webStorageMechanism].setItem(key, value);\n } catch (_error) {\n // do nothing\n }\n }\n}\n\n/**\n * Remove item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function removeItem(key: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n window[webStorageMechanism].removeItem(key);\n }\n}\n\nexport const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local);\nexport const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session);\n\nfunction isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) {\n if (webStorageMechanism === webStorageType.local) {\n return isLocalStorageAvailable;\n }\n\n if (webStorageMechanism === webStorageType.session) {\n return isSessionStorageAvailable;\n }\n\n return false;\n}\n"]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -2,13 +2,13 @@ export { getWebInstrumentations, makeCoreConfig } from './config';
|
|
|
2
2
|
export type { BrowserConfig } from './config';
|
|
3
3
|
export { defaultEventDomain } from './consts';
|
|
4
4
|
export { initializeFaro } from './initialize';
|
|
5
|
-
export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, PerformanceInstrumentation, CSPInstrumentation, UserActionInstrumentation, } from './instrumentations';
|
|
5
|
+
export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, PerformanceInstrumentation, CSPInstrumentation, UserActionInstrumentation, NavigationInstrumentation, } from './instrumentations';
|
|
6
6
|
export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';
|
|
7
7
|
export { browserMeta, createSession, sdkMeta } from './metas';
|
|
8
8
|
export { ConsoleTransport, FetchTransport } from './transports';
|
|
9
9
|
export type { ClockFn, ConsoleTransportOptions, FetchTransportOptions, FetchTransportRequestOptions, } from './transports';
|
|
10
|
-
export { faro, allLogLevels, BaseExtension, BaseInstrumentation, BaseTransport, createInternalLogger, createPromiseBuffer, deepEqual, defaultExceptionType, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultLogLevel, genShortID, getCurrentTimestamp, getInternalFaroFromGlobalObject, getTransportBody, globalObject, internalGlobalObjectKey, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isInternalFaroOnGlobalObject, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, isEmpty, InternalLoggerLevel, LogLevel, noop, setInternalFaroOnGlobalObject, TransportItemType, transportItemTypeToBodyKey, VERSION, EVENT_CLICK, EVENT_NAVIGATION, EVENT_ROUTE_CHANGE, EVENT_SESSION_EXTEND, EVENT_SESSION_RESUME, EVENT_SESSION_START, EVENT_VIEW_CHANGED, Observable, unknownString, } from '@grafana/faro-core';
|
|
11
|
-
export type { Faro, API, APIEvent, BaseObject, BaseObjectKey, BaseObjectPrimitiveValue, BaseObjectValue, BeforeSendHook, BufferItem, Config, EventAttributes, EventEvent, EventsAPI, ExceptionEvent, ExceptionEventExtended, ExceptionStackFrame, ExceptionsAPI, ExtendedError, Extension, GlobalObject, Instrumentation, Instrumentations, InternalLogger, LogContext, LogEvent, LogsAPI, MeasurementEvent, MeasurementsAPI, Meta, MetaAPI, MetaApp, MetaAttributes, MetaBrowser, MetaGetter, MetaItem, MetaPage, Metas, MetaSDK, MetaSDKIntegration, MetaSession, MetaUser, MetaView, OTELApi, Patterns, PromiseBuffer, PromiseBufferOptions, PromiseProducer, PushErrorOptions, PushLogOptions, PushMeasurementOptions, Stacktrace, StacktraceParser, TraceContext, TraceEvent, TracesAPI, Transport, TransportBody, TransportItem, TransportItemPayload, Transports, UnpatchedConsole, } from '@grafana/faro-core';
|
|
10
|
+
export { faro, allLogLevels, BaseExtension, BaseInstrumentation, BaseTransport, createInternalLogger, createPromiseBuffer, deepEqual, defaultExceptionType, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultLogLevel, genShortID, getCurrentTimestamp, getInternalFaroFromGlobalObject, getTransportBody, globalObject, internalGlobalObjectKey, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isInternalFaroOnGlobalObject, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, isEmpty, InternalLoggerLevel, LogLevel, noop, setInternalFaroOnGlobalObject, TransportItemType, transportItemTypeToBodyKey, VERSION, EVENT_CLICK, EVENT_NAVIGATION, EVENT_ROUTE_CHANGE, EVENT_SESSION_EXTEND, EVENT_SESSION_RESUME, EVENT_SESSION_START, EVENT_VIEW_CHANGED, Observable, unknownString, UserActionState, type UserActionInternalInterface, } from '@grafana/faro-core';
|
|
11
|
+
export type { Faro, API, APIEvent, BaseObject, BaseObjectKey, BaseObjectPrimitiveValue, BaseObjectValue, BeforeSendHook, BufferItem, Config, EventAttributes, EventEvent, EventsAPI, ExceptionEvent, ExceptionEventExtended, ExceptionStackFrame, ExceptionsAPI, ExtendedError, Extension, GlobalObject, Instrumentation, Instrumentations, InternalLogger, LogContext, LogEvent, LogsAPI, MeasurementEvent, MeasurementsAPI, Meta, MetaAPI, MetaApp, MetaAttributes, MetaBrowser, MetaGetter, MetaItem, MetaPage, Metas, MetaSDK, MetaSDKIntegration, MetaSession, MetaUser, MetaView, OTELApi, Patterns, PromiseBuffer, PromiseBufferOptions, PromiseProducer, PushErrorOptions, PushLogOptions, PushMeasurementOptions, Stacktrace, StacktraceParser, TraceContext, TraceEvent, TracesAPI, Transport, TransportBody, TransportItem, TransportItemPayload, Transports, UnpatchedConsole, UserActionImportance, } from '@grafana/faro-core';
|
|
12
12
|
export { PersistentSessionsManager, VolatileSessionsManager, MAX_SESSION_PERSISTENCE_TIME, SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME, STORAGE_KEY, } from './instrumentations/session';
|
|
13
13
|
export { getIgnoreUrls, getUrlFromResource } from './utils/url';
|
|
14
14
|
export { userActionDataAttribute } from './instrumentations/userActions';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Observable } from '@grafana/faro-core';
|
|
2
|
+
import type { HttpRequestEndMessage, HttpRequestStartMessage } from './monitors/types';
|
|
3
|
+
type OperationKey = string;
|
|
4
|
+
export declare function isRequestStartMessage(msg: any): msg is HttpRequestStartMessage;
|
|
5
|
+
export declare function isRequestEndMessage(msg: any): msg is HttpRequestEndMessage;
|
|
6
|
+
export interface ActivityWindowTrackerOptions<TMsg = any> {
|
|
7
|
+
inactivityMs?: number;
|
|
8
|
+
drainTimeoutMs?: number;
|
|
9
|
+
isOperationStart?: (msg: TMsg) => OperationKey | undefined;
|
|
10
|
+
isOperationEnd?: (msg: TMsg) => OperationKey | undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Tracks events in a time‑boxed activity window. When the window goes quiet for `inactivityMs`,
|
|
14
|
+
* it enters a draining phase: new short events are ignored; only active operations are awaited
|
|
15
|
+
* until they end or `drainTimeoutMs` elapses.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ActivityWindowTracker extends Observable {
|
|
18
|
+
eventsObservable: Observable;
|
|
19
|
+
private _tracking;
|
|
20
|
+
private _inactivityTid?;
|
|
21
|
+
private _drainTid?;
|
|
22
|
+
private _currentEvents?;
|
|
23
|
+
private _activeOperations?;
|
|
24
|
+
private _startTime?;
|
|
25
|
+
private _lastEventTime?;
|
|
26
|
+
private _options;
|
|
27
|
+
constructor(eventsObservable: Observable, options?: ActivityWindowTrackerOptions);
|
|
28
|
+
private _initialize;
|
|
29
|
+
startTracking(): void;
|
|
30
|
+
stopTracking(): void;
|
|
31
|
+
private _scheduleInactivityCheck;
|
|
32
|
+
private _startDrainTimeout;
|
|
33
|
+
private hasActiveOperations;
|
|
34
|
+
private _clearTimer;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const MESSAGE_TYPE_RESOURCE_ENTRY = "resource-entry";
|
|
2
|
+
export declare const MESSAGE_TYPE_HTTP_REQUEST_START = "http-request-start";
|
|
3
|
+
export declare const MESSAGE_TYPE_HTTP_REQUEST_END = "http-request-end";
|
|
4
|
+
export declare const MESSAGE_TYPE_DOM_MUTATION = "dom-mutation";
|