{"version":3,"file":"ngx-connection-service.mjs","sources":["../../../projects/connection-service/src/lib/connection-service.service.ts","../../../projects/connection-service/src/lib/connection-service.module.ts","../../../projects/connection-service/src/public_api.ts","../../../projects/connection-service/src/ngx-connection-service.ts"],"sourcesContent":["import {DOCUMENT, isPlatformBrowser} from '@angular/common';\nimport {EventEmitter, inject, Injectable, InjectionToken, OnDestroy, PLATFORM_ID, signal} from '@angular/core';\nimport {fromEvent, Observable, SchedulerLike, Subscription, timer} from 'rxjs';\nimport {debounceTime, retry, startWith, switchMap, tap} from 'rxjs/operators';\nimport {HttpClient} from '@angular/common/http';\n\n/**\n * Instance of this interface is used to report current connection status.\n */\nexport interface ConnectionState {\n  /**\n   * \"True\" if browser has network connection. Determined by Window objects \"online\" / \"offline\" events.\n   */\n  hasNetworkConnection: boolean;\n  /**\n   * \"True\" if browser has Internet access. Determined by heartbeat system which periodically makes request to heartbeat Url.\n   */\n  hasInternetAccess: boolean;\n}\n\n/**\n * Instance of this interface could be used to configure \"ConnectionService\".\n */\nexport interface ConnectionServiceOptions {\n  /**\n   * Controls the Internet connectivity heartbeat system. Default value is 'true'.\n   */\n  enableHeartbeat?: boolean;\n  /**\n   * Url used for checking Internet connectivity, heartbeat system periodically makes \"HEAD\" requests to this URL to determine Internet\n   * connection status. Default value is \"//api.ipify.org/\".\n   */\n  heartbeatUrl?: string;\n  /**\n   * Callback function to used for executing heartbeat requests. Defaults to HttpClient.request(...) function.\n   */\n  heartbeatExecutor?: (options?: ConnectionServiceOptions) => Observable<any>;\n  /**\n   * Interval used to check Internet connectivity specified in milliseconds. Default value is \"30000\".\n   */\n  heartbeatInterval?: number;\n  /**\n   * Interval used to retry Internet connectivity checks when an error is detected (when no Internet connection). Default value is \"1000\".\n   */\n  heartbeatRetryInterval?: number;\n  /**\n   * HTTP method used for requesting heartbeat Url. Default is 'head'.\n   */\n  requestMethod?: 'get' | 'post' | 'head' | 'options';\n\n}\n\n/**\n * InjectionToken for specifing ConnectionService options.\n */\nexport const ConnectionServiceOptionsToken = new InjectionToken<ConnectionServiceOptions>('ConnectionServiceOptionsToken');\n\n/**\n * InjectionToken to override the RxJS `SchedulerLike` used internally for `timer()`/`debounceTime()` operations\n * (heartbeat polling, retry delay, and state-change debouncing). Not needed for normal application use — defaults\n * to RxJS's `asyncScheduler` when not provided. Primarily useful in unit tests, where providing a `TestScheduler`\n * (from `rxjs/testing`) allows advancing virtual time synchronously instead of waiting on real timers, without\n * requiring `zone.js`'s `fakeAsync`/`tick`.\n */\nexport const ConnectionServiceSchedulerToken = new InjectionToken<SchedulerLike>('ConnectionServiceSchedulerToken');\n\n/**\n * Minimal Window-like object used when running outside the browser (e.g. Angular Universal SSR).\n */\nfunction createWindowStub(): Window {\n  return {\n    navigator: {onLine: true},\n    addEventListener() {\n      // no-op: online/offline events are unavailable outside the browser\n    },\n    removeEventListener() {\n      // no-op: online/offline events are unavailable outside the browser\n    },\n  } as unknown as Window;\n}\n\n/**\n * Resolves the Window object for browser use, or a stub when Window is not available (SSR).\n */\nfunction resolveWindow(documentRef: Document, platformId: object): Window {\n  if (isPlatformBrowser(platformId)) {\n    const win = documentRef.defaultView || (typeof window !== 'undefined' ? window : null);\n    if (win) {\n      return win;\n    }\n  }\n\n  console.warn(\n    'ngx-connection-service: Window is not available (SSR or non-browser environment). ' +\n    'Using a stub with navigator.onLine=true. Online/offline events will not fire until running in the browser.'\n  );\n  return createWindowStub();\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ConnectionService implements OnDestroy {\n  private static DEFAULT_OPTIONS: ConnectionServiceOptions = {\n    enableHeartbeat: true,\n    heartbeatUrl: '//api.ipify.org/',\n    heartbeatInterval: 30000,\n    heartbeatRetryInterval: 1000,\n    requestMethod: 'get',\n  };\n\n  private stateChangeEventEmitter = new EventEmitter<ConnectionState>();\n  private stateChangeEventSubscription: Subscription;\n\n  private currentState: ConnectionState = {\n    hasInternetAccess: false,\n    hasNetworkConnection: true\n  };\n\n  /**\n   * Reactive (Signal) representation of the current connection state. Prefer this over `monitor()` in modern\n   * Angular applications that use signals for change detection. Updates whenever the network / internet status changes.\n   */\n  private readonly stateSignal = signal<ConnectionState>({...this.currentState});\n\n  /**\n   * Read-only Signal exposing the current connection state. Equivalent (dual API) to subscribing to `monitor()`.\n   */\n  readonly state = this.stateSignal.asReadonly();\n\n  private offlineSubscription: Subscription | null = null;\n  private onlineSubscription: Subscription | null = null;\n  private httpSubscription: Subscription | null = null;\n  private serviceOptions: ConnectionServiceOptions;\n  private readonly windowRef: Window;\n  private readonly http = inject(HttpClient);\n  private readonly scheduler = inject(ConnectionServiceSchedulerToken, {optional: true}) ?? undefined;\n\n  /**\n   * Current ConnectionService options. Notice that changing values of the returned object has not effect on service execution.\n   * You should use \"updateOptions\" function.\n   */\n  get options(): ConnectionServiceOptions {\n    return {...this.serviceOptions};\n  }\n\n  constructor() {\n    const documentRef = inject(DOCUMENT);\n    const platformId = inject(PLATFORM_ID);\n    const options = inject(ConnectionServiceOptionsToken, {optional: true});\n\n    this.windowRef = resolveWindow(documentRef, platformId);\n    this.currentState.hasNetworkConnection = this.windowRef.navigator.onLine;\n\n    this.serviceOptions = {\n      ...ConnectionService.DEFAULT_OPTIONS,\n      heartbeatExecutor: () => this.http.request(\n        this.serviceOptions.requestMethod ?? ConnectionService.DEFAULT_OPTIONS.requestMethod!,\n        this.serviceOptions.heartbeatUrl ?? ConnectionService.DEFAULT_OPTIONS.heartbeatUrl!,\n        {responseType: 'text', withCredentials: false}\n      ),\n      ...options\n    };\n\n    // We subscribe to our own eventEmitter so that state signal will be updated with debounce settings of the emitter\n    this.stateChangeEventSubscription = this.monitor().subscribe(state => {\n      this.stateSignal.set(state);\n    });\n\n    this.checkNetworkState();\n    this.checkInternetState();\n  }\n\n  private checkInternetState() {\n\n    if (this.httpSubscription) {\n      this.httpSubscription.unsubscribe();\n      this.httpSubscription = null;\n    }\n\n    if (this.serviceOptions.enableHeartbeat) {\n      this.httpSubscription = timer(\n        0,\n        this.serviceOptions.heartbeatInterval ?? ConnectionService.DEFAULT_OPTIONS.heartbeatInterval!,\n        this.scheduler\n      )\n        .pipe(\n          switchMap(() => (\n            this.serviceOptions.heartbeatExecutor ??\n            (() => this.http.request(\n              this.serviceOptions.requestMethod ?? ConnectionService.DEFAULT_OPTIONS.requestMethod!,\n              this.serviceOptions.heartbeatUrl ?? ConnectionService.DEFAULT_OPTIONS.heartbeatUrl!,\n              {responseType: 'text', withCredentials: false}\n            ))\n          )(this.serviceOptions)),\n          retry({\n            delay: () =>\n              timer(\n                this.serviceOptions.heartbeatRetryInterval ?? ConnectionService.DEFAULT_OPTIONS.heartbeatRetryInterval!,\n                this.scheduler\n              ).pipe(\n                tap(() => {\n                  this.currentState.hasInternetAccess = false;\n                  this.emitEvent();\n                })\n              )\n          })\n        )\n        .subscribe(() => {\n          this.currentState.hasInternetAccess = true;\n          this.emitEvent();\n        });\n    } else {\n      this.currentState.hasInternetAccess = false;\n      this.emitEvent();\n    }\n  }\n\n  private checkNetworkState() {\n    this.onlineSubscription = fromEvent(this.windowRef, 'online').subscribe(() => {\n      this.currentState.hasNetworkConnection = true;\n      this.checkInternetState();\n      this.emitEvent();\n    });\n\n    this.offlineSubscription = fromEvent(this.windowRef, 'offline').subscribe(() => {\n      this.currentState.hasNetworkConnection = false;\n      this.currentState.hasInternetAccess = false;\n      this.checkInternetState();\n      this.emitEvent();\n    });\n  }\n\n  private emitEvent() {\n    this.stateChangeEventEmitter.emit({...this.currentState});\n  }\n\n  ngOnDestroy(): void {\n    try {\n      this.stateChangeEventSubscription.unsubscribe();\n      this.offlineSubscription?.unsubscribe();\n      this.onlineSubscription?.unsubscribe();\n      this.httpSubscription?.unsubscribe();\n    } catch {\n      // subscriptions may already be cleared\n    }\n  }\n\n  /**\n   * Monitor Network & Internet connection status by subscribing to this observer. If you set \"reportCurrentState\" to \"false\" then\n   * function will not report current status of the connections when initially subscribed.\n   * @param reportCurrentState Report current state when initial subscription. Default is \"true\"\n   */\n  monitor(reportCurrentState = true): Observable<ConnectionState> {\n    return reportCurrentState ?\n      this.stateChangeEventEmitter.pipe(\n        debounceTime(300, this.scheduler),\n        startWith({...this.currentState})\n      )\n      :\n      this.stateChangeEventEmitter.pipe(\n        debounceTime(300, this.scheduler)\n      );\n  }\n\n  /**\n   * Update options of the service. You could specify partial options object. Values that are not specified will use default / previous\n   * option values.\n   * @param options Partial option values.\n   */\n  updateOptions(options: Partial<ConnectionServiceOptions>) {\n    this.serviceOptions = {...this.serviceOptions, ...options};\n    this.checkInternetState();\n  }\n\n}\n","import {EnvironmentProviders, makeEnvironmentProviders, NgModule} from '@angular/core';\nimport {ConnectionService, ConnectionServiceOptions, ConnectionServiceOptionsToken} from './connection-service.service';\nimport {provideHttpClient, withInterceptorsFromDi, withXhr} from '@angular/common/http';\n\n/**\n * Registers `ConnectionService` and its dependencies (HttpClient) with the application's environment injector.\n * This is the recommended, standalone-friendly way to set up the library, replacing `ConnectionServiceModule`.\n *\n * @example\n * ```ts\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideConnectionService({ heartbeatUrl: '/assets/ping.json' }),\n *   ],\n * };\n * ```\n * @param options Optional partial configuration for `ConnectionService`.\n */\nexport function provideConnectionService(options?: ConnectionServiceOptions): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    ConnectionService,\n    provideHttpClient(withXhr(), withInterceptorsFromDi()),\n    ...(options ? [{provide: ConnectionServiceOptionsToken, useValue: options}] : []),\n  ]);\n}\n\n/**\n * @deprecated Use `provideConnectionService()` instead.\n */\n@NgModule({\n  providers: [ConnectionService, provideHttpClient(withXhr(), withInterceptorsFromDi())]\n})\nexport class ConnectionServiceModule {\n}\n","/*\n * Public API Surface of connection-service\n */\n\nexport * from './lib/connection-service.service';\nexport * from './lib/connection-service.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}