@embrace-io/web-sdk
Version:
1 lines • 6.15 kB
Source Map (JSON)
{"version":3,"file":"EmbracePageManager.cjs","names":["OTelPerformanceManager","diag","generateUUID"],"sources":["../../../src/managers/EmbracePageManager/EmbracePageManager.ts"],"sourcesContent":["import type { DiagLogger } from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\nimport type { PageManager, Route } from '../../api-page/index.ts';\nimport type { NavigationHost, TitleDocument } from '../../common/index.ts';\nimport type { PerformanceManager } from '../../utils/index.ts';\nimport {\n generateUUID,\n OTelPerformanceManager,\n updateZeroTimeMillis,\n} from '../../utils/index.ts';\nimport type { UserSessionManagerInternal } from '../EmbraceUserSessionManager/index.ts';\nimport type { EmbracePageManagerArgs } from './types.ts';\n\nexport class EmbracePageManager implements PageManager {\n private _currentRoute: Route | null = null;\n private _currentPageId: string | null = null;\n private _pageLabel: string | null = null;\n private readonly _titleDocument: TitleDocument | undefined;\n private readonly _useDocumentTitleAsPageLabel: boolean;\n private readonly _routeChangedListeners: Array<(route: Route) => void> = [];\n private readonly _diag: DiagLogger;\n private readonly _navigationHost: NavigationHost;\n private readonly _userSessionManager: UserSessionManagerInternal | undefined;\n private readonly _perf: PerformanceManager;\n\n public constructor({\n useDocumentTitleAsPageLabel = true,\n titleDocument = window.document,\n diag: diagParam,\n navigationHost = window as NavigationHost,\n userSessionManager,\n perf = new OTelPerformanceManager(),\n }: EmbracePageManagerArgs = {}) {\n this._useDocumentTitleAsPageLabel = useDocumentTitleAsPageLabel;\n this._titleDocument = titleDocument;\n this._diag =\n diagParam ??\n diag.createComponentLogger({ namespace: 'EmbracePageManager' });\n this._navigationHost = navigationHost;\n this._userSessionManager = userSessionManager;\n this._perf = perf;\n\n this._navigationHost.navigation?.addEventListener(\n 'currententrychange',\n this._onSoftNavigation,\n );\n\n this._setInitialRouteFromCurrentLocation();\n }\n\n public getCurrentPageId = (): string | null => this._currentPageId;\n\n public getCurrentRoute = () => this._currentRoute;\n\n public setPageLabel = (label: string): void => {\n this._pageLabel = label;\n };\n\n public getPageLabel = (): string | null => {\n return (\n this._pageLabel ||\n (!this._useDocumentTitleAsPageLabel || !this._titleDocument\n ? null\n : this._titleDocument.title)\n );\n };\n\n public setCurrentRoute = (route: Route) => {\n if (!this._currentRoute || this._currentRoute.url !== route.url) {\n this._currentPageId = generateUUID();\n }\n\n this._currentRoute = route;\n\n if (route.label) {\n this._pageLabel = route.label;\n } else {\n this._pageLabel = null;\n }\n\n for (const listener of this._routeChangedListeners) {\n try {\n listener(route);\n } catch (error) {\n this._diag.warn('Error while executing route changed listener', error);\n }\n }\n };\n\n public clearCurrentRoute = () => {\n this._currentRoute = null;\n this._currentPageId = null;\n this._pageLabel = null;\n };\n\n public addRouteChangedListener = (\n listener: (route: Route) => void,\n ): (() => void) => {\n this._routeChangedListeners.push(listener);\n\n return () => {\n const index = this._routeChangedListeners.indexOf(listener);\n if (index !== -1) {\n this._routeChangedListeners.splice(index, 1);\n }\n };\n };\n\n private readonly _onSoftNavigation = (\n event: NavigationCurrentEntryChangeEvent,\n ): void => {\n // Skip same-URL replacements (e.g. framework hydration via history.replaceState).\n // eslint-disable-next-line baseline-js/use-baseline\n if (event.from.url === this._navigationHost.location.href) {\n return;\n }\n\n updateZeroTimeMillis(this._perf.epochMillisFromOrigin(event.timeStamp));\n\n // Order matters: rolling over first ends the outgoing route span (via the\n // session-part-ended listener) while it's still open, so it's correctly\n // attributed to the outgoing part.\n this._userSessionManager?.rolloverSessionPartInternal({\n endReason: 'web_soft_navigation',\n startReason: 'web_soft_navigation',\n });\n\n this._setInitialRouteFromCurrentLocation();\n };\n\n private readonly _setInitialRouteFromCurrentLocation = (): void => {\n const pathname = this._navigationHost.location.pathname;\n this.setCurrentRoute({ path: pathname, url: pathname });\n };\n}\n"],"mappings":";;;;;AAaA,IAAa,qBAAb,MAAuD;CACrD,gBAAsC;CACtC,iBAAwC;CACxC,aAAoC;CACpC;CACA;CACA,yBAAyE,CAAC;CAC1E;CACA;CACA;CACA;CAEA,YAAmB,EACjB,8BAA8B,MAC9B,gBAAgB,OAAO,UACvB,MAAM,WACN,iBAAiB,QACjB,oBACA,OAAO,IAAIA,wDAAAA,uBAAuB,MACR,CAAC,GAAG;EAC9B,KAAK,+BAA+B;EACpC,KAAK,iBAAiB;EACtB,KAAK,QACH,aACAC,mBAAAA,KAAK,sBAAsB,EAAE,WAAW,qBAAqB,CAAC;EAChE,KAAK,kBAAkB;EACvB,KAAK,sBAAsB;EAC3B,KAAK,QAAQ;EAEb,KAAK,gBAAgB,YAAY,iBAC/B,sBACA,KAAK,iBACP;EAEA,KAAK,oCAAoC;CAC3C;CAEA,yBAA+C,KAAK;CAEpD,wBAA+B,KAAK;CAEpC,gBAAuB,UAAwB;EAC7C,KAAK,aAAa;CACpB;CAEA,qBAA2C;EACzC,OACE,KAAK,eACJ,CAAC,KAAK,gCAAgC,CAAC,KAAK,iBACzC,OACA,KAAK,eAAe;CAE5B;CAEA,mBAA0B,UAAiB;EACzC,IAAI,CAAC,KAAK,iBAAiB,KAAK,cAAc,QAAQ,MAAM,KAC1D,KAAK,iBAAiBC,2BAAAA,aAAa;EAGrC,KAAK,gBAAgB;EAErB,IAAI,MAAM,OACR,KAAK,aAAa,MAAM;OAExB,KAAK,aAAa;EAGpB,KAAK,MAAM,YAAY,KAAK,wBAC1B,IAAI;GACF,SAAS,KAAK;EAChB,SAAS,OAAO;GACd,KAAK,MAAM,KAAK,gDAAgD,KAAK;EACvE;CAEJ;CAEA,0BAAiC;EAC/B,KAAK,gBAAgB;EACrB,KAAK,iBAAiB;EACtB,KAAK,aAAa;CACpB;CAEA,2BACE,aACiB;EACjB,KAAK,uBAAuB,KAAK,QAAQ;EAEzC,aAAa;GACX,MAAM,QAAQ,KAAK,uBAAuB,QAAQ,QAAQ;GAC1D,IAAI,UAAU,IACZ,KAAK,uBAAuB,OAAO,OAAO,CAAC;EAE/C;CACF;CAEA,qBACE,UACS;EAGT,IAAI,MAAM,KAAK,QAAQ,KAAK,gBAAgB,SAAS,MACnD;EAGF,wDAAA,qBAAqB,KAAK,MAAM,sBAAsB,MAAM,SAAS,CAAC;EAKtE,KAAK,qBAAqB,4BAA4B;GACpD,WAAW;GACX,aAAa;EACf,CAAC;EAED,KAAK,oCAAoC;CAC3C;CAEA,4CAAmE;EACjE,MAAM,WAAW,KAAK,gBAAgB,SAAS;EAC/C,KAAK,gBAAgB;GAAE,MAAM;GAAU,KAAK;EAAS,CAAC;CACxD;AACF"}