{"version":3,"file":"observers-private.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/observers/private/shared-resize-observer.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\nimport {inject, Service, NgZone, OnDestroy, RendererFactory2} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {filter, shareReplay, takeUntil} from 'rxjs/operators';\n\n/**\n * Handler that logs \"ResizeObserver loop limit exceeded\" errors.\n * These errors are not shown in the Chrome console, so we log them to ensure developers are aware.\n * @param e The error\n */\nconst loopLimitExceededErrorHandler = (e: unknown) => {\n  if (e instanceof ErrorEvent && e.message === 'ResizeObserver loop limit exceeded') {\n    console.error(\n      `${e.message}. This could indicate a performance issue with your app. See https://github.com/WICG/resize-observer/blob/master/explainer.md#error-handling`,\n    );\n  }\n};\n\n/**\n * A shared ResizeObserver to be used for a particular box type (content-box, border-box, or\n * device-pixel-content-box)\n */\nclass SingleBoxSharedResizeObserver {\n  /** Stream that emits when the shared observer is destroyed. */\n  private _destroyed = new Subject<void>();\n  /** Stream of all events from the ResizeObserver. */\n  private _resizeSubject = new Subject<ResizeObserverEntry[]>();\n  /** ResizeObserver used to observe element resize events. */\n  private _resizeObserver?: ResizeObserver;\n  /** A map of elements to streams of their resize events. */\n  private _elementObservables = new Map<Element, Observable<ResizeObserverEntry[]>>();\n\n  constructor(\n    /** The box type to observe for resizes. */\n    private _box: ResizeObserverBoxOptions,\n  ) {\n    if (typeof ResizeObserver !== 'undefined') {\n      this._resizeObserver = new ResizeObserver(entries => this._resizeSubject.next(entries));\n    }\n  }\n\n  /**\n   * Gets a stream of resize events for the given element.\n   * @param target The element to observe.\n   * @return The stream of resize events for the element.\n   */\n  observe(target: Element): Observable<ResizeObserverEntry[]> {\n    if (!this._elementObservables.has(target)) {\n      this._elementObservables.set(\n        target,\n        new Observable<ResizeObserverEntry[]>(observer => {\n          const subscription = this._resizeSubject.subscribe(observer);\n          this._resizeObserver?.observe(target, {box: this._box});\n          return () => {\n            this._resizeObserver?.unobserve(target);\n            subscription.unsubscribe();\n            this._elementObservables.delete(target);\n          };\n        }).pipe(\n          filter(entries => entries.some(entry => entry.target === target)),\n          // Share a replay of the last event so that subsequent calls to observe the same element\n          // receive initial sizing info like the first one. Also enable ref counting so the\n          // element will be automatically unobserved when there are no more subscriptions.\n          shareReplay({bufferSize: 1, refCount: true}),\n          takeUntil(this._destroyed),\n        ),\n      );\n    }\n    return this._elementObservables.get(target)!;\n  }\n\n  /** Destroys this instance. */\n  destroy() {\n    this._destroyed.next();\n    this._destroyed.complete();\n    this._resizeSubject.complete();\n    this._elementObservables.clear();\n  }\n}\n\n/**\n * Allows observing resize events on multiple elements using a shared set of ResizeObserver.\n * Sharing a ResizeObserver instance is recommended for better performance (see\n * https://github.com/WICG/resize-observer/issues/59).\n *\n * Rather than share a single `ResizeObserver`, this class creates one `ResizeObserver` per type\n * of observed box ('content-box', 'border-box', and 'device-pixel-content-box'). This avoids\n * later calls to `observe` with a different box type from influencing the events dispatched to\n * earlier calls.\n */\n@Service()\nexport class SharedResizeObserver implements OnDestroy {\n  private _cleanupErrorListener: (() => void) | undefined;\n\n  /** Map of box type to shared resize observer. */\n  private _observers = new Map<ResizeObserverBoxOptions, SingleBoxSharedResizeObserver>();\n\n  /** The Angular zone. */\n  private _ngZone = inject(NgZone);\n\n  constructor() {\n    if (typeof ResizeObserver !== 'undefined' && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n      this._ngZone.runOutsideAngular(() => {\n        const renderer = inject(RendererFactory2).createRenderer(null, null);\n        this._cleanupErrorListener = renderer.listen(\n          'window',\n          'error',\n          loopLimitExceededErrorHandler,\n        );\n      });\n    }\n  }\n\n  ngOnDestroy() {\n    for (const [, observer] of this._observers) {\n      observer.destroy();\n    }\n    this._observers.clear();\n    this._cleanupErrorListener?.();\n  }\n\n  /**\n   * Gets a stream of resize events for the given target element and box type.\n   * @param target The element to observe for resizes.\n   * @param options Options to pass to the `ResizeObserver`\n   * @return The stream of resize events for the element.\n   */\n  observe(target: Element, options?: ResizeObserverOptions): Observable<ResizeObserverEntry[]> {\n    const box = options?.box || 'content-box';\n    if (!this._observers.has(box)) {\n      this._observers.set(box, new SingleBoxSharedResizeObserver(box));\n    }\n    return this._observers.get(box)!.observe(target);\n  }\n}\n"],"names":[],"mappings":"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"}