@grafana/faro-web-sdk 2.0.0-beta-2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +3 -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/csp/instrumentation.js +18 -1
- package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
- 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 +1 -1
- 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/csp/instrumentation.js +18 -1
- package/dist/esm/instrumentations/csp/instrumentation.js.map +1 -1
- 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
package/dist/esm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { getWebInstrumentations, makeCoreConfig } from './config';
|
|
2
2
|
export { defaultEventDomain } from './consts';
|
|
3
3
|
export { initializeFaro } from './initialize';
|
|
4
|
-
export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, PerformanceInstrumentation, CSPInstrumentation, UserActionInstrumentation, } from './instrumentations';
|
|
4
|
+
export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, PerformanceInstrumentation, CSPInstrumentation, UserActionInstrumentation, NavigationInstrumentation, } from './instrumentations';
|
|
5
5
|
export { browserMeta, createSession, sdkMeta } from './metas';
|
|
6
6
|
export { ConsoleTransport, FetchTransport } from './transports';
|
|
7
7
|
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, } from '@grafana/faro-core';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhE,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,KAAK,EACL,4BAA4B,EAC5B,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,6BAA6B,EAC7B,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhE,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,KAAK,EACL,4BAA4B,EAC5B,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,6BAA6B,EAC7B,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAmE5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { getWebInstrumentations, makeCoreConfig } from './config';\nexport type { BrowserConfig } from './config';\n\nexport { defaultEventDomain } from './consts';\n\nexport { initializeFaro } from './initialize';\n\nexport {\n buildStackFrame,\n ConsoleInstrumentation,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n ViewInstrumentation,\n WebVitalsInstrumentation,\n SessionInstrumentation,\n PerformanceInstrumentation,\n CSPInstrumentation,\n UserActionInstrumentation,\n NavigationInstrumentation,\n} from './instrumentations';\nexport type { ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';\n\nexport { browserMeta, createSession, sdkMeta } from './metas';\n\nexport { ConsoleTransport, FetchTransport } from './transports';\nexport type {\n ClockFn,\n ConsoleTransportOptions,\n FetchTransportOptions,\n FetchTransportRequestOptions,\n} from './transports';\n\nexport {\n faro,\n allLogLevels,\n BaseExtension,\n BaseInstrumentation,\n BaseTransport,\n createInternalLogger,\n createPromiseBuffer,\n deepEqual,\n defaultExceptionType,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogLevel,\n genShortID,\n getCurrentTimestamp,\n getInternalFaroFromGlobalObject,\n getTransportBody,\n globalObject,\n internalGlobalObjectKey,\n isArray,\n isBoolean,\n isDomError,\n isDomException,\n isElement,\n isElementDefined,\n isError,\n isErrorDefined,\n isErrorEvent,\n isEvent,\n isEventDefined,\n isFunction,\n isInstanceOf,\n isInt,\n isInternalFaroOnGlobalObject,\n isMap,\n isMapDefined,\n isNull,\n isNumber,\n isObject,\n isPrimitive,\n isRegExp,\n isString,\n isSymbol,\n isSyntheticEvent,\n isThenable,\n isToString,\n isTypeof,\n isUndefined,\n isEmpty,\n InternalLoggerLevel,\n LogLevel,\n noop,\n setInternalFaroOnGlobalObject,\n TransportItemType,\n transportItemTypeToBodyKey,\n VERSION,\n EVENT_CLICK,\n EVENT_NAVIGATION,\n EVENT_ROUTE_CHANGE,\n EVENT_SESSION_EXTEND,\n EVENT_SESSION_RESUME,\n EVENT_SESSION_START,\n EVENT_VIEW_CHANGED,\n Observable,\n unknownString,\n UserActionState,\n type UserActionInternalInterface,\n} from '@grafana/faro-core';\n\nexport type {\n Faro,\n API,\n APIEvent,\n BaseObject,\n BaseObjectKey,\n BaseObjectPrimitiveValue,\n BaseObjectValue,\n BeforeSendHook,\n BufferItem,\n Config,\n EventAttributes,\n EventEvent,\n EventsAPI,\n ExceptionEvent,\n ExceptionEventExtended,\n ExceptionStackFrame,\n ExceptionsAPI,\n ExtendedError,\n Extension,\n GlobalObject,\n Instrumentation,\n Instrumentations,\n InternalLogger,\n LogContext,\n LogEvent,\n LogsAPI,\n MeasurementEvent,\n MeasurementsAPI,\n Meta,\n MetaAPI,\n MetaApp,\n MetaAttributes,\n MetaBrowser,\n MetaGetter,\n MetaItem,\n MetaPage,\n Metas,\n MetaSDK,\n MetaSDKIntegration,\n MetaSession,\n MetaUser,\n MetaView,\n OTELApi,\n Patterns,\n PromiseBuffer,\n PromiseBufferOptions,\n PromiseProducer,\n PushErrorOptions,\n PushLogOptions,\n PushMeasurementOptions,\n Stacktrace,\n StacktraceParser,\n TraceContext,\n TraceEvent,\n TracesAPI,\n Transport,\n TransportBody,\n TransportItem,\n TransportItemPayload,\n Transports,\n UnpatchedConsole,\n UserActionImportance,\n} from '@grafana/faro-core';\n\nexport {\n PersistentSessionsManager,\n VolatileSessionsManager,\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n} from './instrumentations/session';\n\nexport { getIgnoreUrls, getUrlFromResource } from './utils/url';\n\nexport { userActionDataAttribute } from './instrumentations/userActions';\n"]}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Observable } from '@grafana/faro-core';
|
|
2
|
+
import { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './monitors/const';
|
|
3
|
+
export function isRequestStartMessage(msg) {
|
|
4
|
+
return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;
|
|
5
|
+
}
|
|
6
|
+
export function isRequestEndMessage(msg) {
|
|
7
|
+
return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Tracks events in a time‑boxed activity window. When the window goes quiet for `inactivityMs`,
|
|
11
|
+
* it enters a draining phase: new short events are ignored; only active operations are awaited
|
|
12
|
+
* until they end or `drainTimeoutMs` elapses.
|
|
13
|
+
*/
|
|
14
|
+
export class ActivityWindowTracker extends Observable {
|
|
15
|
+
constructor(eventsObservable, options) {
|
|
16
|
+
var _a, _b, _c, _d;
|
|
17
|
+
super();
|
|
18
|
+
this._tracking = false;
|
|
19
|
+
this.eventsObservable = eventsObservable;
|
|
20
|
+
this._options = {
|
|
21
|
+
inactivityMs: (_a = options === null || options === void 0 ? void 0 : options.inactivityMs) !== null && _a !== void 0 ? _a : 100,
|
|
22
|
+
drainTimeoutMs: (_b = options === null || options === void 0 ? void 0 : options.drainTimeoutMs) !== null && _b !== void 0 ? _b : 10 * 1000,
|
|
23
|
+
isOperationStart: (_c = options === null || options === void 0 ? void 0 : options.isOperationStart) !== null && _c !== void 0 ? _c : (() => undefined),
|
|
24
|
+
isOperationEnd: (_d = options === null || options === void 0 ? void 0 : options.isOperationEnd) !== null && _d !== void 0 ? _d : (() => undefined),
|
|
25
|
+
};
|
|
26
|
+
this._initialize();
|
|
27
|
+
}
|
|
28
|
+
_initialize() {
|
|
29
|
+
this.eventsObservable
|
|
30
|
+
.filter(() => {
|
|
31
|
+
return this._tracking;
|
|
32
|
+
})
|
|
33
|
+
.subscribe((event) => {
|
|
34
|
+
var _a, _b, _c;
|
|
35
|
+
this._lastEventTime = Date.now();
|
|
36
|
+
(_a = this._currentEvents) === null || _a === void 0 ? void 0 : _a.push(event);
|
|
37
|
+
const startKey = this._options.isOperationStart(event);
|
|
38
|
+
if (startKey) {
|
|
39
|
+
(_b = this._activeOperations) === null || _b === void 0 ? void 0 : _b.set(startKey, true);
|
|
40
|
+
}
|
|
41
|
+
const endKey = this._options.isOperationEnd(event);
|
|
42
|
+
if (endKey) {
|
|
43
|
+
(_c = this._activeOperations) === null || _c === void 0 ? void 0 : _c.delete(endKey);
|
|
44
|
+
}
|
|
45
|
+
this._scheduleInactivityCheck();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
startTracking() {
|
|
49
|
+
if (this._tracking) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this._tracking = true;
|
|
53
|
+
this._startTime = Date.now();
|
|
54
|
+
this._lastEventTime = Date.now();
|
|
55
|
+
this.notify({
|
|
56
|
+
message: 'tracking-started',
|
|
57
|
+
});
|
|
58
|
+
this._currentEvents = [];
|
|
59
|
+
this._activeOperations = new Map();
|
|
60
|
+
this._scheduleInactivityCheck();
|
|
61
|
+
}
|
|
62
|
+
stopTracking() {
|
|
63
|
+
this._tracking = false;
|
|
64
|
+
this._clearTimer(this._inactivityTid);
|
|
65
|
+
this._clearTimer(this._drainTid);
|
|
66
|
+
let duration = 0;
|
|
67
|
+
if (this.hasActiveOperations()) {
|
|
68
|
+
duration = Date.now() - this._startTime;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
duration = this._lastEventTime ? this._lastEventTime - this._startTime : 0;
|
|
72
|
+
}
|
|
73
|
+
this.notify({
|
|
74
|
+
message: 'tracking-ended',
|
|
75
|
+
events: this._currentEvents,
|
|
76
|
+
duration: duration,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
_scheduleInactivityCheck() {
|
|
80
|
+
this._inactivityTid = startTimeout(this._inactivityTid, () => {
|
|
81
|
+
if (this.hasActiveOperations()) {
|
|
82
|
+
this._startDrainTimeout();
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.stopTracking();
|
|
86
|
+
}
|
|
87
|
+
}, this._options.inactivityMs);
|
|
88
|
+
}
|
|
89
|
+
_startDrainTimeout() {
|
|
90
|
+
this._drainTid = startTimeout(this._drainTid, () => {
|
|
91
|
+
this.stopTracking();
|
|
92
|
+
}, this._options.drainTimeoutMs);
|
|
93
|
+
}
|
|
94
|
+
hasActiveOperations() {
|
|
95
|
+
return !!this._activeOperations && this._activeOperations.size > 0;
|
|
96
|
+
}
|
|
97
|
+
_clearTimer(id) {
|
|
98
|
+
if (id) {
|
|
99
|
+
clearTimeout(id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function startTimeout(timeoutId, cb, delay) {
|
|
104
|
+
if (timeoutId) {
|
|
105
|
+
clearTimeout(timeoutId);
|
|
106
|
+
}
|
|
107
|
+
//@ts-expect-error for some reason vscode is using the node types
|
|
108
|
+
timeoutId = setTimeout(() => {
|
|
109
|
+
cb();
|
|
110
|
+
}, delay);
|
|
111
|
+
return timeoutId;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=activityWindowTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activityWindowTracker.js","sourceRoot":"","sources":["../../../../src/instrumentations/_internal/activityWindowTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './monitors/const';\nimport type { HttpRequestEndMessage, HttpRequestStartMessage } from './monitors/types';\n\ntype OperationKey = string;\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\nexport interface ActivityWindowTrackerOptions<TMsg = any> {\n inactivityMs?: number;\n drainTimeoutMs?: number;\n isOperationStart?: (msg: TMsg) => OperationKey | undefined;\n isOperationEnd?: (msg: TMsg) => OperationKey | undefined;\n}\n\n/**\n * Tracks events in a time‑boxed activity window. When the window goes quiet for `inactivityMs`,\n * it enters a draining phase: new short events are ignored; only active operations are awaited\n * until they end or `drainTimeoutMs` elapses.\n */\nexport class ActivityWindowTracker extends Observable {\n eventsObservable: Observable;\n\n private _tracking = false;\n private _inactivityTid?: number;\n private _drainTid?: number;\n private _currentEvents?: any[];\n private _activeOperations?: Map<OperationKey, true>;\n private _startTime?: number;\n private _lastEventTime?: number;\n private _options: Required<ActivityWindowTrackerOptions>;\n\n constructor(eventsObservable: Observable, options?: ActivityWindowTrackerOptions) {\n super();\n this.eventsObservable = eventsObservable;\n this._options = {\n inactivityMs: options?.inactivityMs ?? 100,\n drainTimeoutMs: options?.drainTimeoutMs ?? 10 * 1000,\n isOperationStart: options?.isOperationStart ?? (() => undefined),\n isOperationEnd: options?.isOperationEnd ?? (() => undefined),\n } as Required<ActivityWindowTrackerOptions>;\n this._initialize();\n }\n\n private _initialize() {\n this.eventsObservable\n .filter(() => {\n return this._tracking;\n })\n .subscribe((event) => {\n this._lastEventTime = Date.now();\n this._currentEvents?.push(event);\n\n const startKey = this._options.isOperationStart(event as any);\n if (startKey) {\n this._activeOperations?.set(startKey, true);\n }\n\n const endKey = this._options.isOperationEnd(event as any);\n if (endKey) {\n this._activeOperations?.delete(endKey);\n }\n\n this._scheduleInactivityCheck();\n });\n }\n\n startTracking() {\n if (this._tracking) {\n return;\n }\n\n this._tracking = true;\n this._startTime = Date.now();\n this._lastEventTime = Date.now();\n\n this.notify({\n message: 'tracking-started',\n });\n\n this._currentEvents = [];\n this._activeOperations = new Map<OperationKey, true>();\n this._scheduleInactivityCheck();\n }\n\n stopTracking() {\n this._tracking = false;\n this._clearTimer(this._inactivityTid);\n this._clearTimer(this._drainTid);\n\n let duration = 0;\n if (this.hasActiveOperations()) {\n duration = Date.now() - this._startTime!;\n } else {\n duration = this._lastEventTime ? this._lastEventTime - this._startTime! : 0;\n }\n\n this.notify({\n message: 'tracking-ended',\n events: this._currentEvents,\n duration: duration,\n });\n }\n\n private _scheduleInactivityCheck() {\n this._inactivityTid = startTimeout(\n this._inactivityTid,\n () => {\n if (this.hasActiveOperations()) {\n this._startDrainTimeout();\n } else {\n this.stopTracking();\n }\n },\n this._options.inactivityMs\n );\n }\n\n private _startDrainTimeout() {\n this._drainTid = startTimeout(\n this._drainTid,\n () => {\n this.stopTracking();\n },\n this._options.drainTimeoutMs\n );\n }\n\n private hasActiveOperations(): boolean {\n return !!this._activeOperations && this._activeOperations.size > 0;\n }\n\n private _clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\n}\n\nfunction 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"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
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
|
+
//# sourceMappingURL=const.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG,gBAAgB,CAAC;AAC5D,MAAM,CAAC,MAAM,+BAA+B,GAAG,oBAAoB,CAAC;AACpE,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC","sourcesContent":["export const MESSAGE_TYPE_RESOURCE_ENTRY = 'resource-entry';\nexport const MESSAGE_TYPE_HTTP_REQUEST_START = 'http-request-start';\nexport const MESSAGE_TYPE_HTTP_REQUEST_END = 'http-request-end';\nexport const MESSAGE_TYPE_DOM_MUTATION = 'dom-mutation';\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Observable } from '@grafana/faro-core';
|
|
2
|
+
import { MESSAGE_TYPE_DOM_MUTATION } from './const';
|
|
3
|
+
let domMutationObservable;
|
|
4
|
+
let domMutationObserver;
|
|
5
|
+
export function monitorDomMutations() {
|
|
6
|
+
if (!domMutationObservable) {
|
|
7
|
+
domMutationObservable = new Observable();
|
|
8
|
+
}
|
|
9
|
+
if (!domMutationObserver) {
|
|
10
|
+
domMutationObserver = new MutationObserver((_mutationsList, _observer) => {
|
|
11
|
+
domMutationObservable.notify({ type: MESSAGE_TYPE_DOM_MUTATION });
|
|
12
|
+
});
|
|
13
|
+
domMutationObserver.observe(document, {
|
|
14
|
+
attributes: true,
|
|
15
|
+
childList: true,
|
|
16
|
+
subtree: true,
|
|
17
|
+
characterData: true,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return domMutationObservable;
|
|
21
|
+
}
|
|
22
|
+
// Test-only utility to reset state between tests
|
|
23
|
+
export function __resetDomMutationMonitorForTests() {
|
|
24
|
+
if (domMutationObserver) {
|
|
25
|
+
domMutationObserver.disconnect();
|
|
26
|
+
}
|
|
27
|
+
domMutationObserver = undefined;
|
|
28
|
+
domMutationObservable = undefined;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=domMutationMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domMutationMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/domMutationMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAGpD,IAAI,qBAAiE,CAAC;AACtE,IAAI,mBAAiD,CAAC;AAEtD,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,UAAU,EAAsB,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,mBAAmB,GAAG,IAAI,gBAAgB,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE;YACvE,qBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE;YACpC,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iCAAiC;IAC/C,IAAI,mBAAmB,EAAE,CAAC;QACxB,mBAAmB,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IACD,mBAAmB,GAAG,SAAS,CAAC;IAChC,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_DOM_MUTATION } from './const';\nimport type { DomMutationMessage } from './types';\n\nlet domMutationObservable: Observable<DomMutationMessage> | undefined;\nlet domMutationObserver: MutationObserver | undefined;\n\nexport function monitorDomMutations(): Observable<DomMutationMessage> {\n if (!domMutationObservable) {\n domMutationObservable = new Observable<DomMutationMessage>();\n }\n\n if (!domMutationObserver) {\n domMutationObserver = new MutationObserver((_mutationsList, _observer) => {\n domMutationObservable!.notify({ type: MESSAGE_TYPE_DOM_MUTATION });\n });\n\n domMutationObserver.observe(document, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n\n return domMutationObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetDomMutationMonitorForTests() {\n if (domMutationObserver) {\n domMutationObserver.disconnect();\n }\n domMutationObserver = undefined;\n domMutationObservable = undefined;\n}\n"]}
|
|
@@ -1,37 +1,49 @@
|
|
|
1
1
|
import { genShortID, Observable } from '@grafana/faro-core';
|
|
2
|
-
import { getUrlFromResource, isUrlIgnored } from '
|
|
2
|
+
import { getUrlFromResource, isUrlIgnored } from '../../../utils/url';
|
|
3
3
|
import { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';
|
|
4
4
|
const apiTypeFetch = 'fetch';
|
|
5
5
|
const apiTypeXhr = 'xhr';
|
|
6
6
|
/**
|
|
7
7
|
* Monitors if any http requests are in progress.
|
|
8
8
|
*/
|
|
9
|
+
let httpRequestObservable;
|
|
10
|
+
let isInstrumented = false;
|
|
11
|
+
let originalXhrOpen;
|
|
12
|
+
let originalFetchFn;
|
|
9
13
|
export function monitorHttpRequests() {
|
|
10
|
-
|
|
14
|
+
if (httpRequestObservable) {
|
|
15
|
+
return httpRequestObservable;
|
|
16
|
+
}
|
|
17
|
+
httpRequestObservable = new Observable();
|
|
11
18
|
function emitStartMessage(requestProps) {
|
|
12
|
-
|
|
19
|
+
httpRequestObservable.notify({
|
|
13
20
|
type: MESSAGE_TYPE_HTTP_REQUEST_START,
|
|
14
21
|
request: requestProps,
|
|
15
22
|
});
|
|
16
23
|
}
|
|
17
24
|
function emitEndMessage(requestProps) {
|
|
18
|
-
|
|
25
|
+
httpRequestObservable.notify({
|
|
19
26
|
type: MESSAGE_TYPE_HTTP_REQUEST_END,
|
|
20
27
|
request: requestProps,
|
|
21
28
|
});
|
|
22
29
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
if (!isInstrumented) {
|
|
31
|
+
monitorFetch({
|
|
32
|
+
onRequestStart: emitStartMessage,
|
|
33
|
+
onRequestEnd: emitEndMessage,
|
|
34
|
+
});
|
|
35
|
+
monitorXhr({
|
|
36
|
+
onRequestStart: emitStartMessage,
|
|
37
|
+
onRequestEnd: emitEndMessage,
|
|
38
|
+
});
|
|
39
|
+
isInstrumented = true;
|
|
40
|
+
}
|
|
41
|
+
return httpRequestObservable;
|
|
32
42
|
}
|
|
33
43
|
function monitorXhr({ onRequestStart, onRequestEnd, }) {
|
|
34
|
-
|
|
44
|
+
if (!originalXhrOpen) {
|
|
45
|
+
originalXhrOpen = XMLHttpRequest.prototype.open;
|
|
46
|
+
}
|
|
35
47
|
XMLHttpRequest.prototype.open = function () {
|
|
36
48
|
const url = arguments[1];
|
|
37
49
|
const isIgnoredUrl = isUrlIgnored(url);
|
|
@@ -59,11 +71,13 @@ function monitorXhr({ onRequestStart, onRequestEnd, }) {
|
|
|
59
71
|
onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });
|
|
60
72
|
}
|
|
61
73
|
});
|
|
62
|
-
|
|
74
|
+
originalXhrOpen.apply(this, arguments);
|
|
63
75
|
};
|
|
64
76
|
}
|
|
65
77
|
function monitorFetch({ onRequestEnd, onRequestStart, }) {
|
|
66
|
-
|
|
78
|
+
if (!originalFetchFn) {
|
|
79
|
+
originalFetchFn = window.fetch;
|
|
80
|
+
}
|
|
67
81
|
window.fetch = function () {
|
|
68
82
|
var _a, _b;
|
|
69
83
|
const url = (_a = getUrlFromResource(arguments[0])) !== null && _a !== void 0 ? _a : '';
|
|
@@ -73,7 +87,7 @@ function monitorFetch({ onRequestEnd, onRequestStart, }) {
|
|
|
73
87
|
if (!isIgnoredUrl) {
|
|
74
88
|
onRequestStart({ url, method, requestId, apiType: apiTypeFetch });
|
|
75
89
|
}
|
|
76
|
-
return
|
|
90
|
+
return originalFetchFn
|
|
77
91
|
.apply(this, arguments)
|
|
78
92
|
.then((response) => {
|
|
79
93
|
if (!isIgnoredUrl) {
|
|
@@ -89,4 +103,17 @@ function monitorFetch({ onRequestEnd, onRequestStart, }) {
|
|
|
89
103
|
});
|
|
90
104
|
};
|
|
91
105
|
}
|
|
106
|
+
// Test-only utility to reset instrumentation and singleton between tests
|
|
107
|
+
export function __resetHttpRequestMonitorForTests() {
|
|
108
|
+
if (originalXhrOpen) {
|
|
109
|
+
XMLHttpRequest.prototype.open = originalXhrOpen;
|
|
110
|
+
}
|
|
111
|
+
if (originalFetchFn) {
|
|
112
|
+
window.fetch = originalFetchFn;
|
|
113
|
+
}
|
|
114
|
+
httpRequestObservable = undefined;
|
|
115
|
+
isInstrumented = false;
|
|
116
|
+
originalXhrOpen = undefined;
|
|
117
|
+
originalFetchFn = undefined;
|
|
118
|
+
}
|
|
92
119
|
//# sourceMappingURL=httpRequestMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpRequestMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/httpRequestMonitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { genShortID, Observable } from '@grafana/faro-core';\n\nimport { getUrlFromResource, isUrlIgnored } from '../../../utils/url';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';\nimport type { HttpRequestEndMessage, HttpRequestMessagePayload, HttpRequestStartMessage } from './types';\n\ntype RequestProps = HttpRequestMessagePayload;\n\nconst apiTypeFetch = 'fetch';\nconst apiTypeXhr = 'xhr';\n\n/**\n * Monitors if any http requests are in progress.\n */\nlet httpRequestObservable: Observable<HttpRequestStartMessage | HttpRequestEndMessage> | undefined;\nlet isInstrumented = false;\nlet originalXhrOpen: typeof XMLHttpRequest.prototype.open | undefined;\nlet originalFetchFn: typeof window.fetch | undefined;\n\nexport function monitorHttpRequests(): Observable<HttpRequestStartMessage | HttpRequestEndMessage> {\n if (httpRequestObservable) {\n return httpRequestObservable;\n }\n\n httpRequestObservable = new Observable<HttpRequestStartMessage | HttpRequestEndMessage>();\n\n function emitStartMessage(requestProps: RequestProps) {\n httpRequestObservable!.notify({\n type: MESSAGE_TYPE_HTTP_REQUEST_START,\n request: requestProps,\n });\n }\n\n function emitEndMessage(requestProps: RequestProps) {\n httpRequestObservable!.notify({\n type: MESSAGE_TYPE_HTTP_REQUEST_END,\n request: requestProps,\n });\n }\n\n if (!isInstrumented) {\n monitorFetch({\n onRequestStart: emitStartMessage,\n onRequestEnd: emitEndMessage,\n });\n\n monitorXhr({\n onRequestStart: emitStartMessage,\n onRequestEnd: emitEndMessage,\n });\n\n isInstrumented = true;\n }\n\n return httpRequestObservable;\n}\n\nfunction monitorXhr({\n onRequestStart,\n onRequestEnd,\n}: {\n onRequestStart: (props: RequestProps) => void;\n onRequestEnd: (props: RequestProps) => void;\n}) {\n if (!originalXhrOpen) {\n originalXhrOpen = XMLHttpRequest.prototype.open;\n }\n\n XMLHttpRequest.prototype.open = function () {\n const url = arguments[1];\n const isIgnoredUrl = isUrlIgnored(url);\n const method = arguments[0];\n\n const requestId = genShortID();\n\n // request has started to load data.\n this.addEventListener('loadstart', function () {\n if (!isIgnoredUrl) {\n onRequestStart({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n // transaction completes successfully.\n this.addEventListener('load', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n this.addEventListener('error', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n this.addEventListener('abort', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n originalXhrOpen!.apply(this, arguments as any);\n };\n}\n\nfunction monitorFetch({\n onRequestEnd,\n onRequestStart,\n}: {\n onRequestStart: (props: RequestProps) => void;\n onRequestEnd: (props: RequestProps) => void;\n}) {\n if (!originalFetchFn) {\n originalFetchFn = window.fetch;\n }\n\n window.fetch = function () {\n const url = getUrlFromResource(arguments[0]) ?? '';\n const isIgnoredUrl = isUrlIgnored(url);\n const method = (arguments[1] ?? {}).method;\n\n const requestId = genShortID();\n\n if (!isIgnoredUrl) {\n onRequestStart({ url, method, requestId, apiType: apiTypeFetch });\n }\n\n return originalFetchFn!\n .apply(this, arguments as any)\n .then((response) => {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeFetch });\n }\n return response;\n })\n .catch((error) => {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeFetch });\n }\n throw error;\n });\n };\n}\n\n// Test-only utility to reset instrumentation and singleton between tests\nexport function __resetHttpRequestMonitorForTests() {\n if (originalXhrOpen) {\n XMLHttpRequest.prototype.open = originalXhrOpen;\n }\n if (originalFetchFn) {\n (window as any).fetch = originalFetchFn;\n }\n httpRequestObservable = undefined;\n isInstrumented = false;\n originalXhrOpen = undefined;\n originalFetchFn = undefined;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { monitorDomMutations } from './domMutationMonitor';
|
|
2
|
+
export { monitorHttpRequests } from './httpRequestMonitor';
|
|
3
|
+
export { monitorPerformanceEntries } from './performanceEntriesMonitor';
|
|
4
|
+
export { monitorUrlChanges } from './urlChangeMonitor';
|
|
5
|
+
export { monitorInteractions } from './interactionMonitor';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { monitorDomMutations } from './domMutationMonitor';\nexport { monitorHttpRequests } from './httpRequestMonitor';\nexport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nexport { monitorUrlChanges } from './urlChangeMonitor';\nexport { monitorInteractions } from './interactionMonitor';\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Observable } from '@grafana/faro-core';
|
|
2
|
+
export const MESSAGE_TYPE_INTERACTION = 'interaction';
|
|
3
|
+
let interactionObservable;
|
|
4
|
+
const registeredEventNames = new Set();
|
|
5
|
+
const eventNameToHandler = new Map();
|
|
6
|
+
export function monitorInteractions(eventNames) {
|
|
7
|
+
if (!interactionObservable) {
|
|
8
|
+
interactionObservable = new Observable();
|
|
9
|
+
}
|
|
10
|
+
eventNames.forEach((eventName) => {
|
|
11
|
+
if (!registeredEventNames.has(eventName)) {
|
|
12
|
+
const handler = () => {
|
|
13
|
+
interactionObservable.notify({ type: MESSAGE_TYPE_INTERACTION, name: eventName });
|
|
14
|
+
};
|
|
15
|
+
window.addEventListener(eventName, handler);
|
|
16
|
+
registeredEventNames.add(eventName);
|
|
17
|
+
eventNameToHandler.set(eventName, handler);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
return interactionObservable;
|
|
21
|
+
}
|
|
22
|
+
// Test-only utility to reset state between tests
|
|
23
|
+
export function __resetInteractionMonitorForTests() {
|
|
24
|
+
eventNameToHandler.forEach((handler, eventName) => {
|
|
25
|
+
window.removeEventListener(eventName, handler);
|
|
26
|
+
});
|
|
27
|
+
eventNameToHandler.clear();
|
|
28
|
+
registeredEventNames.clear();
|
|
29
|
+
interactionObservable = undefined;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=interactionMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/interactionMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAOtD,IAAI,qBAAiE,CAAC;AACtE,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC/C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEjE,MAAM,UAAU,mBAAmB,CAAC,UAAoB;IACtD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,UAAU,EAAsB,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC/B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,qBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC5C,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iCAAiC;IAC/C,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE;QAChD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAC3B,oBAAoB,CAAC,KAAK,EAAE,CAAC;IAC7B,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nexport const MESSAGE_TYPE_INTERACTION = 'interaction';\n\nexport type InteractionMessage = {\n type: typeof MESSAGE_TYPE_INTERACTION;\n name: string;\n};\n\nlet interactionObservable: Observable<InteractionMessage> | undefined;\nconst registeredEventNames = new Set<string>();\nconst eventNameToHandler = new Map<string, (e: Event) => void>();\n\nexport function monitorInteractions(eventNames: string[]): Observable<InteractionMessage> {\n if (!interactionObservable) {\n interactionObservable = new Observable<InteractionMessage>();\n }\n\n eventNames.forEach((eventName) => {\n if (!registeredEventNames.has(eventName)) {\n const handler = () => {\n interactionObservable!.notify({ type: MESSAGE_TYPE_INTERACTION, name: eventName });\n };\n window.addEventListener(eventName, handler);\n registeredEventNames.add(eventName);\n eventNameToHandler.set(eventName, handler);\n }\n });\n\n return interactionObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetInteractionMonitorForTests() {\n eventNameToHandler.forEach((handler, eventName) => {\n window.removeEventListener(eventName, handler);\n });\n eventNameToHandler.clear();\n registeredEventNames.clear();\n interactionObservable = undefined;\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Observable } from '@grafana/faro-core';
|
|
2
|
+
import { performanceEntriesSubscription } from '../../performance/instrumentation';
|
|
3
|
+
import { RESOURCE_ENTRY } from '../../performance/performanceConstants';
|
|
4
|
+
import { MESSAGE_TYPE_RESOURCE_ENTRY } from './const';
|
|
5
|
+
let performanceObservable;
|
|
6
|
+
let isSubscribed = false;
|
|
7
|
+
let subscription;
|
|
8
|
+
export function monitorPerformanceEntries() {
|
|
9
|
+
if (!performanceObservable) {
|
|
10
|
+
performanceObservable = new Observable();
|
|
11
|
+
}
|
|
12
|
+
if (!isSubscribed) {
|
|
13
|
+
subscription = performanceEntriesSubscription.subscribe((data) => {
|
|
14
|
+
if (data.type === RESOURCE_ENTRY) {
|
|
15
|
+
performanceObservable.notify({ type: MESSAGE_TYPE_RESOURCE_ENTRY });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
isSubscribed = true;
|
|
19
|
+
}
|
|
20
|
+
return performanceObservable;
|
|
21
|
+
}
|
|
22
|
+
// Test-only utility to reset state between tests
|
|
23
|
+
export function __resetPerformanceEntriesMonitorForTests() {
|
|
24
|
+
if (subscription) {
|
|
25
|
+
subscription.unsubscribe();
|
|
26
|
+
}
|
|
27
|
+
subscription = undefined;
|
|
28
|
+
isSubscribed = false;
|
|
29
|
+
performanceObservable = undefined;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=performanceEntriesMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceEntriesMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/performanceEntriesMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEtD,IAAI,qBAA6C,CAAC;AAClD,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,YAAsC,CAAC;AAE3C,MAAM,UAAU,yBAAyB;IACvC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,UAAU,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,8BAA8B,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACjC,qBAAsB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,wCAAwC;IACtD,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,YAAY,GAAG,SAAS,CAAC;IACzB,YAAY,GAAG,KAAK,CAAC;IACrB,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\nimport type { Subscription } from '@grafana/faro-core';\n\nimport { performanceEntriesSubscription } from '../../performance/instrumentation';\nimport { RESOURCE_ENTRY } from '../../performance/performanceConstants';\n\nimport { MESSAGE_TYPE_RESOURCE_ENTRY } from './const';\n\nlet performanceObservable: Observable | undefined;\nlet isSubscribed = false;\nlet subscription: Subscription | undefined;\n\nexport function monitorPerformanceEntries(): Observable {\n if (!performanceObservable) {\n performanceObservable = new Observable();\n }\n\n if (!isSubscribed) {\n subscription = performanceEntriesSubscription.subscribe((data) => {\n if (data.type === RESOURCE_ENTRY) {\n performanceObservable!.notify({ type: MESSAGE_TYPE_RESOURCE_ENTRY });\n }\n });\n isSubscribed = true;\n }\n\n return performanceObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetPerformanceEntriesMonitorForTests() {\n if (subscription) {\n subscription.unsubscribe();\n }\n subscription = undefined;\n isSubscribed = false;\n performanceObservable = undefined;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Observable } from '@grafana/faro-core';
|
|
2
|
+
export const MESSAGE_TYPE_URL_CHANGE = 'url-change';
|
|
3
|
+
let urlChangeObservable;
|
|
4
|
+
let isInstrumented = false;
|
|
5
|
+
let lastHref;
|
|
6
|
+
let originalPushState;
|
|
7
|
+
let originalReplaceState;
|
|
8
|
+
let onPopStateHandler;
|
|
9
|
+
let onHashChangeHandler;
|
|
10
|
+
let onNavigateHandler;
|
|
11
|
+
let originalNavigateEventIntercept;
|
|
12
|
+
export function monitorUrlChanges() {
|
|
13
|
+
if (!urlChangeObservable) {
|
|
14
|
+
urlChangeObservable = new Observable();
|
|
15
|
+
lastHref = location.href;
|
|
16
|
+
}
|
|
17
|
+
function emit(trigger, toOverride) {
|
|
18
|
+
const next = toOverride !== null && toOverride !== void 0 ? toOverride : location.href;
|
|
19
|
+
if (next !== lastHref) {
|
|
20
|
+
urlChangeObservable.notify({ type: MESSAGE_TYPE_URL_CHANGE, from: lastHref, to: next, trigger });
|
|
21
|
+
lastHref = next;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (!isInstrumented) {
|
|
25
|
+
const hasNavigation = 'navigation' in window && 'NavigateEvent' in window;
|
|
26
|
+
if (hasNavigation) {
|
|
27
|
+
// Prefer Navigation API when supported: do not patch history or add popstate/hashchange listeners
|
|
28
|
+
onNavigateHandler = (e) => {
|
|
29
|
+
try {
|
|
30
|
+
const destination = e === null || e === void 0 ? void 0 : e.destination;
|
|
31
|
+
if ((destination === null || destination === void 0 ? void 0 : destination.sameDocument) && typeof destination.url === 'string') {
|
|
32
|
+
emit('navigate', destination.url);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (_err) {
|
|
36
|
+
// Swallow to avoid impacting host app
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
window.navigation.addEventListener('navigate', onNavigateHandler);
|
|
40
|
+
const NavigateEventConstructor = window.NavigateEvent;
|
|
41
|
+
if (NavigateEventConstructor &&
|
|
42
|
+
NavigateEventConstructor.prototype &&
|
|
43
|
+
typeof NavigateEventConstructor.prototype.intercept === 'function') {
|
|
44
|
+
if (!originalNavigateEventIntercept) {
|
|
45
|
+
originalNavigateEventIntercept = NavigateEventConstructor.prototype.intercept;
|
|
46
|
+
}
|
|
47
|
+
// Wrap intercept to detect soft navigations (cross-document turned same-document)
|
|
48
|
+
NavigateEventConstructor.prototype.intercept = function (options) {
|
|
49
|
+
try {
|
|
50
|
+
const canIntercept = !!(this === null || this === void 0 ? void 0 : this.canIntercept);
|
|
51
|
+
const destination = this === null || this === void 0 ? void 0 : this.destination;
|
|
52
|
+
if (canIntercept &&
|
|
53
|
+
destination &&
|
|
54
|
+
destination.sameDocument === false &&
|
|
55
|
+
typeof destination.url === 'string') {
|
|
56
|
+
emit('navigate-intercept', destination.url);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (_err) {
|
|
60
|
+
// ignore
|
|
61
|
+
}
|
|
62
|
+
return originalNavigateEventIntercept.call(this, options);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
isInstrumented = true;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Fallback: history API patching + popstate/hashchange
|
|
69
|
+
if (!originalPushState) {
|
|
70
|
+
originalPushState = window.history.pushState;
|
|
71
|
+
}
|
|
72
|
+
window.history.pushState = function (...args) {
|
|
73
|
+
const result = originalPushState.apply(window.history, args);
|
|
74
|
+
emit('pushState');
|
|
75
|
+
return result;
|
|
76
|
+
};
|
|
77
|
+
if (!originalReplaceState) {
|
|
78
|
+
originalReplaceState = window.history.replaceState;
|
|
79
|
+
}
|
|
80
|
+
window.history.replaceState = function (...args) {
|
|
81
|
+
const result = originalReplaceState.apply(window.history, args);
|
|
82
|
+
emit('replaceState');
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
onPopStateHandler = () => emit('popstate');
|
|
86
|
+
onHashChangeHandler = () => emit('hashchange');
|
|
87
|
+
window.addEventListener('popstate', onPopStateHandler);
|
|
88
|
+
window.addEventListener('hashchange', onHashChangeHandler);
|
|
89
|
+
isInstrumented = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return urlChangeObservable;
|
|
93
|
+
}
|
|
94
|
+
// Test-only utility to reset state between tests
|
|
95
|
+
export function __resetUrlChangeMonitorForTests() {
|
|
96
|
+
var _a, _b;
|
|
97
|
+
if (onPopStateHandler) {
|
|
98
|
+
window.removeEventListener('popstate', onPopStateHandler);
|
|
99
|
+
}
|
|
100
|
+
if (onHashChangeHandler) {
|
|
101
|
+
window.removeEventListener('hashchange', onHashChangeHandler);
|
|
102
|
+
}
|
|
103
|
+
if (onNavigateHandler && ((_a = window.navigation) === null || _a === void 0 ? void 0 : _a.removeEventListener)) {
|
|
104
|
+
window.navigation.removeEventListener('navigate', onNavigateHandler);
|
|
105
|
+
}
|
|
106
|
+
if (originalPushState) {
|
|
107
|
+
window.history.pushState = originalPushState;
|
|
108
|
+
}
|
|
109
|
+
if (originalReplaceState) {
|
|
110
|
+
window.history.replaceState = originalReplaceState;
|
|
111
|
+
}
|
|
112
|
+
if (originalNavigateEventIntercept && ((_b = window.NavigateEvent) === null || _b === void 0 ? void 0 : _b.prototype)) {
|
|
113
|
+
window.NavigateEvent.prototype.intercept = originalNavigateEventIntercept;
|
|
114
|
+
}
|
|
115
|
+
urlChangeObservable = undefined;
|
|
116
|
+
isInstrumented = false;
|
|
117
|
+
lastHref = undefined;
|
|
118
|
+
onPopStateHandler = undefined;
|
|
119
|
+
onHashChangeHandler = undefined;
|
|
120
|
+
onNavigateHandler = undefined;
|
|
121
|
+
originalPushState = undefined;
|
|
122
|
+
originalReplaceState = undefined;
|
|
123
|
+
originalNavigateEventIntercept = undefined;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=urlChangeMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlChangeMonitor.js","sourceRoot":"","sources":["../../../../../src/instrumentations/_internal/monitors/urlChangeMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AASpD,IAAI,mBAA6D,CAAC;AAClE,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,IAAI,QAA4B,CAAC;AACjC,IAAI,iBAA8D,CAAC;AACnE,IAAI,oBAAoE,CAAC;AACzE,IAAI,iBAAyE,CAAC;AAC9E,IAAI,mBAA6E,CAAC;AAClF,IAAI,iBAA4D,CAAC;AACjE,IAAI,8BAA8G,CAAC;AAEnH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,mBAAmB,GAAG,IAAI,UAAU,EAAoB,CAAC;QACzD,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,SAAS,IAAI,CAAC,OAAoC,EAAE,UAAmB;QACrE,MAAM,IAAI,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,QAAQ,CAAC,IAAI,CAAC;QACzC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,mBAAoB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,QAAS,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACnG,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,aAAa,GAAG,YAAY,IAAI,MAAM,IAAI,eAAe,IAAK,MAAc,CAAC;QAEnF,IAAI,aAAa,EAAE,CAAC;YAClB,kGAAkG;YAClG,iBAAiB,GAAG,CAAC,CAAM,EAAE,EAAE;gBAC7B,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,WAAmE,CAAC;oBAC3F,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,KAAI,OAAO,WAAW,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;wBACrE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAAC,OAAO,IAAI,EAAE,CAAC;oBACd,sCAAsC;gBACxC,CAAC;YACH,CAAC,CAAC;YACD,MAAc,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,iBAAwB,CAAC,CAAC;YAElF,MAAM,wBAAwB,GAAI,MAAc,CAAC,aAAa,CAAC;YAC/D,IACE,wBAAwB;gBACxB,wBAAwB,CAAC,SAAS;gBAClC,OAAO,wBAAwB,CAAC,SAAS,CAAC,SAAS,KAAK,UAAU,EAClE,CAAC;gBACD,IAAI,CAAC,8BAA8B,EAAE,CAAC;oBACpC,8BAA8B,GAAG,wBAAwB,CAAC,SAAS,CAAC,SAAS,CAAC;gBAChF,CAAC;gBAED,kFAAkF;gBAClF,wBAAwB,CAAC,SAAS,CAAC,SAAS,GAAG,UAAqB,OAAa;oBAC/E,IAAI,CAAC;wBACH,MAAM,YAAY,GAAG,CAAC,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAA,CAAC;wBAC1C,MAAM,WAAW,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAmE,CAAC;wBAC9F,IACE,YAAY;4BACZ,WAAW;4BACX,WAAW,CAAC,YAAY,KAAK,KAAK;4BAClC,OAAO,WAAW,CAAC,GAAG,KAAK,QAAQ,EACnC,CAAC;4BACD,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;wBAC9C,CAAC;oBACH,CAAC;oBAAC,OAAO,IAAI,EAAE,CAAC;wBACd,SAAS;oBACX,CAAC;oBACD,OAAO,8BAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC7D,CAA0C,CAAC;YAC7C,CAAC;YAED,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;YAC/C,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAiD;gBACvF,MAAM,MAAM,GAAG,iBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAW,CAAC,CAAC;gBACrE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClB,OAAO,MAAM,CAAC;YAChB,CAAoC,CAAC;YAErC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YACrD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAoD;gBAC7F,MAAM,MAAM,GAAG,oBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAW,CAAC,CAAC;gBACxE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAuC,CAAC;YAExC,iBAAiB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3C,mBAAmB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/C,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;YAE3D,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,+BAA+B;;IAC7C,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,iBAAiB,KAAI,MAAC,MAAc,CAAC,UAAU,0CAAE,mBAAmB,CAAA,EAAE,CAAC;QACxE,MAAc,CAAC,UAAU,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAwB,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IACD,IAAI,oBAAoB,EAAE,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACrD,CAAC;IACD,IAAI,8BAA8B,KAAI,MAAC,MAAc,CAAC,aAAa,0CAAE,SAAS,CAAA,EAAE,CAAC;QAC9E,MAAc,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,GAAG,8BAA8B,CAAC;IACrF,CAAC;IACD,mBAAmB,GAAG,SAAS,CAAC;IAChC,cAAc,GAAG,KAAK,CAAC;IACvB,QAAQ,GAAG,SAAS,CAAC;IACrB,iBAAiB,GAAG,SAAS,CAAC;IAC9B,mBAAmB,GAAG,SAAS,CAAC;IAChC,iBAAiB,GAAG,SAAS,CAAC;IAC9B,iBAAiB,GAAG,SAAS,CAAC;IAC9B,oBAAoB,GAAG,SAAS,CAAC;IACjC,8BAA8B,GAAG,SAAS,CAAC;AAC7C,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nexport const MESSAGE_TYPE_URL_CHANGE = 'url-change';\n\nexport type UrlChangeMessage = {\n type: typeof MESSAGE_TYPE_URL_CHANGE;\n from: string;\n to: string;\n trigger: 'pushState' | 'replaceState' | 'popstate' | 'hashchange' | 'navigate' | 'navigate-intercept';\n};\n\nlet urlChangeObservable: Observable<UrlChangeMessage> | undefined;\nlet isInstrumented = false;\nlet lastHref: string | undefined;\nlet originalPushState: typeof window.history.pushState | undefined;\nlet originalReplaceState: typeof window.history.replaceState | undefined;\nlet onPopStateHandler: ((this: Window, ev: PopStateEvent) => any) | undefined;\nlet onHashChangeHandler: ((this: Window, ev: HashChangeEvent) => any) | undefined;\nlet onNavigateHandler: ((this: any, ev: any) => any) | undefined;\nlet originalNavigateEventIntercept: (((this: any, options?: any) => any) & { _faroWrapped?: boolean }) | undefined;\n\nexport function monitorUrlChanges(): Observable<UrlChangeMessage> {\n if (!urlChangeObservable) {\n urlChangeObservable = new Observable<UrlChangeMessage>();\n lastHref = location.href;\n }\n\n function emit(trigger: UrlChangeMessage['trigger'], toOverride?: string) {\n const next = toOverride ?? location.href;\n if (next !== lastHref) {\n urlChangeObservable!.notify({ type: MESSAGE_TYPE_URL_CHANGE, from: lastHref!, to: next, trigger });\n lastHref = next;\n }\n }\n\n if (!isInstrumented) {\n const hasNavigation = 'navigation' in window && 'NavigateEvent' in (window as any);\n\n if (hasNavigation) {\n // Prefer Navigation API when supported: do not patch history or add popstate/hashchange listeners\n onNavigateHandler = (e: any) => {\n try {\n const destination = e?.destination as { url?: string; sameDocument?: boolean } | undefined;\n if (destination?.sameDocument && typeof destination.url === 'string') {\n emit('navigate', destination.url);\n }\n } catch (_err) {\n // Swallow to avoid impacting host app\n }\n };\n (window as any).navigation.addEventListener('navigate', onNavigateHandler as any);\n\n const NavigateEventConstructor = (window as any).NavigateEvent;\n if (\n NavigateEventConstructor &&\n NavigateEventConstructor.prototype &&\n typeof NavigateEventConstructor.prototype.intercept === 'function'\n ) {\n if (!originalNavigateEventIntercept) {\n originalNavigateEventIntercept = NavigateEventConstructor.prototype.intercept;\n }\n\n // Wrap intercept to detect soft navigations (cross-document turned same-document)\n NavigateEventConstructor.prototype.intercept = function (this: any, options?: any) {\n try {\n const canIntercept = !!this?.canIntercept;\n const destination = this?.destination as { url?: string; sameDocument?: boolean } | undefined;\n if (\n canIntercept &&\n destination &&\n destination.sameDocument === false &&\n typeof destination.url === 'string'\n ) {\n emit('navigate-intercept', destination.url);\n }\n } catch (_err) {\n // ignore\n }\n return originalNavigateEventIntercept!.call(this, options);\n } as typeof originalNavigateEventIntercept;\n }\n\n isInstrumented = true;\n } else {\n // Fallback: history API patching + popstate/hashchange\n if (!originalPushState) {\n originalPushState = window.history.pushState;\n }\n window.history.pushState = function (...args: Parameters<typeof window.history.pushState>) {\n const result = originalPushState!.apply(window.history, args as any);\n emit('pushState');\n return result;\n } as typeof window.history.pushState;\n\n if (!originalReplaceState) {\n originalReplaceState = window.history.replaceState;\n }\n window.history.replaceState = function (...args: Parameters<typeof window.history.replaceState>) {\n const result = originalReplaceState!.apply(window.history, args as any);\n emit('replaceState');\n return result;\n } as typeof window.history.replaceState;\n\n onPopStateHandler = () => emit('popstate');\n onHashChangeHandler = () => emit('hashchange');\n window.addEventListener('popstate', onPopStateHandler);\n window.addEventListener('hashchange', onHashChangeHandler);\n\n isInstrumented = true;\n }\n }\n\n return urlChangeObservable;\n}\n\n// Test-only utility to reset state between tests\nexport function __resetUrlChangeMonitorForTests() {\n if (onPopStateHandler) {\n window.removeEventListener('popstate', onPopStateHandler);\n }\n if (onHashChangeHandler) {\n window.removeEventListener('hashchange', onHashChangeHandler);\n }\n if (onNavigateHandler && (window as any).navigation?.removeEventListener) {\n (window as any).navigation.removeEventListener('navigate', onNavigateHandler as any);\n }\n if (originalPushState) {\n window.history.pushState = originalPushState;\n }\n if (originalReplaceState) {\n window.history.replaceState = originalReplaceState;\n }\n if (originalNavigateEventIntercept && (window as any).NavigateEvent?.prototype) {\n (window as any).NavigateEvent.prototype.intercept = originalNavigateEventIntercept;\n }\n urlChangeObservable = undefined;\n isInstrumented = false;\n lastHref = undefined;\n onPopStateHandler = undefined;\n onHashChangeHandler = undefined;\n onNavigateHandler = undefined;\n originalPushState = undefined;\n originalReplaceState = undefined;\n originalNavigateEventIntercept = undefined;\n}\n"]}
|
|
@@ -12,7 +12,24 @@ export class CSPInstrumentation extends BaseInstrumentation {
|
|
|
12
12
|
document.removeEventListener('securitypolicyviolation', this.securitypolicyviolationHandler);
|
|
13
13
|
}
|
|
14
14
|
securitypolicyviolationHandler(ev) {
|
|
15
|
-
|
|
15
|
+
// We must explicitly extract properties because SecurityPolicyViolationEvent
|
|
16
|
+
// properties are getters on the prototype chain, not own enumerable properties.
|
|
17
|
+
// Object.entries() would not capture them.
|
|
18
|
+
const attributes = {
|
|
19
|
+
blockedURI: ev.blockedURI,
|
|
20
|
+
columnNumber: ev.columnNumber,
|
|
21
|
+
disposition: ev.disposition,
|
|
22
|
+
documentURI: ev.documentURI,
|
|
23
|
+
effectiveDirective: ev.effectiveDirective,
|
|
24
|
+
lineNumber: ev.lineNumber,
|
|
25
|
+
originalPolicy: ev.originalPolicy,
|
|
26
|
+
referrer: ev.referrer,
|
|
27
|
+
sample: ev.sample,
|
|
28
|
+
sourceFile: ev.sourceFile,
|
|
29
|
+
statusCode: ev.statusCode,
|
|
30
|
+
violatedDirective: ev.violatedDirective,
|
|
31
|
+
};
|
|
32
|
+
this.api.pushEvent('securitypolicyviolation', stringifyObjectValues(attributes));
|
|
16
33
|
}
|
|
17
34
|
}
|
|
18
35
|
//# sourceMappingURL=instrumentation.js.map
|