{"version":3,"file":"ng-connection-service.mjs","sources":["../../../projects/ng-connection-service/src/lib/ng-connection-service.service.ts","../../../projects/ng-connection-service/src/lib/ng-connection-service.module.ts","../../../projects/ng-connection-service/src/public-api.ts","../../../projects/ng-connection-service/src/ng-connection-service.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken, OnDestroy, Optional } from '@angular/core';\nimport { BehaviorSubject, fromEvent, interval, Observable, Subscription } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { switchMap } from 'rxjs/operators';\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 \"//internethealthtest.org\".\n   */\n  heartbeatUrl?: string;\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\nexport const DEFAULT_CONNECTION_STATE: ConnectionState = {\n  hasInternetAccess: true,\n  hasNetworkConnection: window.navigator.onLine\n}\n\nexport const DEFAULT_HEART_BEAT_INTERVAL = 1000;\n// export const DEFAULT_HEART_BEAT_URL = 'https://jsonplaceholder.typicode.com';\nexport const DEFAULT_HEART_BEAT_URL = 'http://localhost:3000';\nexport const DEFAULT_HEART_BEAT_RETRY_INTERVAL = 1000;\n\nexport enum HTTP_REQUEST_METHODS {\n  HEAD = 'head',\n  GET = 'get',\n  POST = 'post',\n  PUT = 'put',\n  OPTIONS = 'options'\n}\n\nexport const DEFAULT_OPTIONS: ConnectionServiceOptions = {\n  enableHeartbeat: false,\n  heartbeatUrl: DEFAULT_HEART_BEAT_URL,\n  heartbeatInterval: DEFAULT_HEART_BEAT_INTERVAL,\n  heartbeatRetryInterval: 1000,\n  requestMethod: HTTP_REQUEST_METHODS.HEAD\n};\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ConnectionService implements OnDestroy {\n\n  private currentState: ConnectionState = DEFAULT_CONNECTION_STATE;\n  private serviceOptions: ConnectionServiceOptions = DEFAULT_OPTIONS;\n\n  private subscription: Subscription = new Subscription();\n  private httpSubscription: Subscription = new Subscription();\n\n  private stateChanged$ = new BehaviorSubject<ConnectionState>(DEFAULT_CONNECTION_STATE);\n\n  constructor(private http: HttpClient, @Inject(ConnectionServiceOptionsToken) @Optional() options: ConnectionServiceOptions) {\n    // TODO: Token useValue in providers not working.\n    this.serviceOptions = { ...DEFAULT_OPTIONS, ...options };\n    this.checkNetworkState();\n\n    if (this.serviceOptions.enableHeartbeat) {\n      this.checkInternetState();\n    }\n  }\n\n  private checkNetworkState() {\n    this.subscription.add(fromEvent(window, 'online').subscribe(() => {\n      this.currentState.hasNetworkConnection = true;\n      this.checkInternetState();\n      this.publishState();\n    }));\n\n    this.subscription.add(fromEvent(window, 'offline').subscribe(() => {\n      this.currentState.hasNetworkConnection = false;\n      this.checkInternetState();\n      this.publishState();\n    }));\n  }\n\n  private checkInternetState() {\n\n    if (this.serviceOptions.enableHeartbeat) {\n      this.subscription = interval(3000).pipe(\n        switchMap(async () =>\n          this.http[this.serviceOptions.requestMethod || HTTP_REQUEST_METHODS.HEAD](this.serviceOptions.heartbeatUrl || DEFAULT_HEART_BEAT_URL,\n            { responseType: 'text' }).subscribe(\n              {\n                next: (data) => {\n                  this.currentState.hasInternetAccess = true;\n                  this.publishState();\n                },\n\n                error: (err) => {\n                  this.currentState.hasInternetAccess = false;\n                  this.publishState();\n                  throw err;\n                },\n              }\n            )\n        )\n      ).subscribe(\n        res => {\n        }\n      );\n      // this.httpSubscription = timer(0, this.serviceOptions.heartbeatInterval || DEFAULT_HEART_BEAT_INTERVAL)\n      //   .pipe(\n      //     switchMap(async () => this.http[this.serviceOptions.requestMethod || HTTP_REQUEST_METHODS.HEAD](this.serviceOptions.heartbeatUrl || DEFAULT_HEART_BEAT_URL,\n      //       { responseType: 'text' })),\n      //     retryWhen(errors =>\n      //       errors.pipe(\n      //         // log error message\n      //         tap(val => {\n      //           this.currentState.hasInternetAccess = false;\n      //           this.publishState();\n      //           throw errors;\n      //         }),\n      //         // restart after 5 seconds\n      //         delay(this.serviceOptions.heartbeatRetryInterval || DEFAULT_HEART_BEAT_RETRY_INTERVAL)\n      //       )\n      //     )\n      //   )\n      //   .subscribe(result => {\n      //     this.currentState.hasInternetAccess = true;\n      //     this.publishState();\n      //   });\n    } else {\n      this.currentState.hasInternetAccess = false;\n      this.publishState();\n    }\n  }\n\n  private publishState() {\n    this.stateChanged$.next(this.currentState);\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  public monitor(options?: ConnectionServiceOptions): Observable<ConnectionState> {\n    if (options) {\n      this.serviceOptions = { ...this.serviceOptions, ...options };\n    }\n    if(this.serviceOptions.enableHeartbeat) {\n      this.checkInternetState();\n    }\n    return this.stateChanged$;\n  }\n\n  ngOnDestroy(): void {\n    this.subscription.unsubscribe();\n  }\n}\n","import { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { ConnectionService } from './ng-connection-service.service';\n\n@NgModule({\n  imports: [HttpClientModule],\n  providers: [ConnectionService]\n})\nexport class ConnectionServiceModule { }\n","/*\n * Public API Surface of ng-connection-service\n */\n\nexport * from './lib/ng-connection-service.service';\nexport * from './lib/ng-connection-service.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}