{"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"}