{"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 {EventEmitter, Inject, Injectable, InjectionToken, OnDestroy, Optional} from '@angular/core';\nimport {fromEvent, Observable, Subscription, timer} from 'rxjs';\nimport {debounceTime, delay, retryWhen, startWith, switchMap, tap} from 'rxjs/operators';\nimport {HttpClient} from '@angular/common/http';\nimport {getWindow} from 'ssr-window';\n\nconst window = getWindow();\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: InjectionToken<ConnectionServiceOptions> = new InjectionToken('ConnectionServiceOptionsToken');\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\n  private currentState: ConnectionState = {\n    hasInternetAccess: false,\n    hasNetworkConnection: window.navigator.onLine\n  };\n  private offlineSubscription: Subscription;\n  private onlineSubscription: Subscription;\n  private httpSubscription: Subscription;\n  private serviceOptions: ConnectionServiceOptions;\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(private http: HttpClient, @Inject(ConnectionServiceOptionsToken) @Optional() options: ConnectionServiceOptions) {\n    this.serviceOptions = {\n      ...ConnectionService.DEFAULT_OPTIONS,\n      heartbeatExecutor: () => this.http.request(\n        this.serviceOptions.requestMethod,\n        this.serviceOptions.heartbeatUrl,\n        {responseType: 'text', withCredentials: false}\n      ),\n      ...options\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(0, this.serviceOptions.heartbeatInterval)\n        .pipe(\n          switchMap(() => this.serviceOptions.heartbeatExecutor(this.serviceOptions)),\n          retryWhen(errors =>\n            errors.pipe(\n              tap(val => {\n                this.currentState.hasInternetAccess = false;\n                this.emitEvent();\n              }),\n              // restart after 5 seconds\n              delay(this.serviceOptions.heartbeatRetryInterval)\n            )\n          )\n        )\n        .subscribe(result => {\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(window, 'online').subscribe(() => {\n      this.currentState.hasNetworkConnection = true;\n      this.checkInternetState();\n      this.emitEvent();\n    });\n\n    this.offlineSubscription = fromEvent(window, '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.offlineSubscription.unsubscribe();\n      this.onlineSubscription.unsubscribe();\n      this.httpSubscription.unsubscribe();\n    } catch (e) {\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),\n        startWith(this.currentState),\n      )\n      :\n      this.stateChangeEventEmitter.pipe(\n        debounceTime(300)\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 {NgModule} from '@angular/core';\nimport {ConnectionService} from './connection-service.service';\nimport {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';\n\n@NgModule({\n  providers: [ConnectionService, provideHttpClient(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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"}