{"version":3,"file":"angular-user-idle.mjs","sources":["../../../projects/angular-user-idle/src/lib/angular-user-idle.config.ts","../../../projects/angular-user-idle/src/lib/angular-user-idle.service.ts","../../../projects/angular-user-idle/src/lib/angular-user-idle.module.ts","../../../projects/angular-user-idle/src/public-api.ts","../../../projects/angular-user-idle/src/angular-user-idle.ts"],"sourcesContent":["import { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\n\nexport class UserIdleConfig {\n  /**\n   * Idle value in seconds.\n   */\n  idle?: number;\n  /**\n   * Timeout value in seconds.\n   */\n  timeout?: number;\n  /**\n   * Ping value in seconds.\n   */\n  ping?: number;\n  /**\n   * IdleSensitivity time that activity must remain below the idle detection threshold before\n   * idle buffer timer count user's activity actions, in seconds.\n   */\n  idleSensitivity?: number;\n}\n\nexport function provideUserIdleConfig(config: UserIdleConfig): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    { provide: UserIdleConfig, useValue: config },\n  ])\n}\n","import { Injectable, NgZone, Optional } from '@angular/core';\nimport {\n  from,\n  fromEvent,\n  interval,\n  merge,\n  Observable,\n  of,\n  Subject,\n  Subscription,\n  timer,\n} from 'rxjs';\nimport {\n  bufferTime,\n  distinctUntilChanged,\n  filter,\n  finalize,\n  map,\n  switchMap,\n  takeUntil,\n  tap,\n} from 'rxjs/operators';\nimport { UserIdleConfig } from './angular-user-idle.config';\n\n/**\n * User's idle service.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class UserIdleService {\n  ping$!: Observable<any>;\n\n  /**\n   * Events that can interrupts user's inactivity timer.\n   */\n  protected activityEvents$!: Observable<any>;\n\n  protected timerStart$ = new Subject<boolean>();\n  protected idleDetected$ = new Subject<boolean>();\n  protected timeout$ = new Subject<boolean>();\n  protected idle$!: Observable<any>;\n  protected timer$!: Observable<any>;\n  /**\n   * Idle value in milliseconds.\n   * Default equals to 10 minutes.\n   */\n  protected idleMillisec = 600 * 1000;\n  /**\n   * Idle buffer wait time milliseconds to collect user action\n   * Default equals to 1 Sec.\n   */\n  protected idleSensitivityMillisec = 1000;\n  /**\n   * Timeout value in seconds.\n   * Default equals to 5 minutes.\n   */\n  protected timeout = 300;\n  /**\n   * Ping value in milliseconds.\n   * Default equals to 2 minutes.\n   */\n  protected pingMillisec = 120 * 1000;\n  /**\n   * Timeout status.\n   */\n  protected isTimeout = false;\n  /**\n   * Timer of user's inactivity is in progress.\n   */\n  protected isInactivityTimer = false;\n  protected isIdleDetected = false;\n\n  protected idleSubscription!: Subscription;\n\n  constructor(@Optional() config: UserIdleConfig, private _ngZone: NgZone) {\n    if (config) {\n      this.setConfig(config);\n    }\n  }\n\n  /**\n   * Start watching for user idle and setup timer and ping.\n   */\n  startWatching() {\n    if (!this.activityEvents$) {\n      this.activityEvents$ = merge(\n        fromEvent(window, 'mousemove'),\n        fromEvent(window, 'resize'),\n        fromEvent(document, 'keydown')\n      );\n    }\n\n    this.idle$ = from(this.activityEvents$);\n\n    if (this.idleSubscription) {\n      this.idleSubscription.unsubscribe();\n    }\n\n    // If any of user events is not active for idle-seconds when start timer.\n    this.idleSubscription = this.idle$\n      .pipe(\n        bufferTime(this.idleSensitivityMillisec), // Starting point of detecting of user's inactivity\n        filter(\n          (arr) =>\n            !arr.length && !this.isIdleDetected && !this.isInactivityTimer\n        ),\n        tap(() => {\n          this.isIdleDetected = true;\n          this.idleDetected$.next(true);\n        }),\n        switchMap(() =>\n          this._ngZone.runOutsideAngular(() =>\n            interval(1000).pipe(\n              takeUntil(\n                merge(\n                  this.activityEvents$,\n                  timer(this.idleMillisec).pipe(\n                    tap(() => {\n                      this.isInactivityTimer = true;\n                      this.timerStart$.next(true);\n                    })\n                  )\n                )\n              ),\n              finalize(() => {\n                this.isIdleDetected = false;\n                this.idleDetected$.next(false);\n              })\n            )\n          )\n        )\n      )\n      .subscribe();\n\n    this.setupTimer(this.timeout);\n    this.setupPing(this.pingMillisec);\n  }\n\n  stopWatching() {\n    this.stopTimer();\n    if (this.idleSubscription) {\n      this.idleSubscription.unsubscribe();\n    }\n  }\n\n  stopTimer() {\n    this.isInactivityTimer = false;\n    this.timerStart$.next(false);\n  }\n\n  resetTimer() {\n    this.stopTimer();\n    this.isTimeout = false;\n  }\n\n  /**\n   * Return observable for timer's countdown number that emits after idle.\n   */\n  onTimerStart(): Observable<number> {\n    return this.timerStart$.pipe(\n      distinctUntilChanged(),\n      switchMap((start) => (start ? this.timer$ : of(null)))\n    );\n  }\n\n  /**\n   * Return observable for idle status changed\n   */\n  onIdleStatusChanged(): Observable<boolean> {\n    return this.idleDetected$.asObservable();\n  }\n\n  /**\n   * Return observable for timeout is fired.\n   */\n  onTimeout(): Observable<boolean> {\n    return this.timeout$.pipe(\n      filter((timeout) => !!timeout),\n      tap(() => (this.isTimeout = true)),\n      map(() => true)\n    );\n  }\n\n  getConfigValue(): UserIdleConfig {\n    return {\n      idle: this.idleMillisec / 1000,\n      idleSensitivity: this.idleSensitivityMillisec / 1000,\n      timeout: this.timeout,\n      ping: this.pingMillisec / 1000,\n    };\n  }\n\n  /**\n   * Set config values.\n   * @param config\n   */\n  setConfigValues(config: UserIdleConfig) {\n    if (this.idleSubscription && !this.idleSubscription.closed) {\n      console.error('Call stopWatching() before set config values');\n      return;\n    }\n\n    this.setConfig(config);\n  }\n\n  private setConfig(config: UserIdleConfig) {\n    if (config.idle) {\n      this.idleMillisec = config.idle * 1000;\n    }\n    if (config.ping) {\n      this.pingMillisec = config.ping * 1000;\n    }\n    if (config.idleSensitivity) {\n      this.idleSensitivityMillisec = config.idleSensitivity * 1000;\n    }\n    if (config.timeout) {\n      this.timeout = config.timeout;\n    }\n  }\n\n  /**\n   * Set custom activity events\n   *\n   * @param customEvents Example: merge(\n   *   fromEvent(window, 'mousemove'),\n   *   fromEvent(window, 'resize'),\n   *   fromEvent(document, 'keydown'),\n   *   fromEvent(document, 'touchstart'),\n   *   fromEvent(document, 'touchend')\n   * )\n   */\n  setCustomActivityEvents(customEvents: Observable<any>) {\n    if (this.idleSubscription && !this.idleSubscription.closed) {\n      console.error('Call stopWatching() before set custom activity events');\n      return;\n    }\n\n    this.activityEvents$ = customEvents;\n  }\n\n  /**\n   * Setup timer.\n   *\n   * Counts every seconds and return n+1 and fire timeout for last count.\n   * @param timeout Timeout in seconds.\n   */\n  protected setupTimer(timeout: number) {\n    this._ngZone.runOutsideAngular(() => {\n      this.timer$ = of(() => new Date()).pipe(\n        map((fn) => fn()),\n        switchMap((startDate) =>\n          interval(1000).pipe(\n            map(() =>\n              Math.round((new Date().valueOf() - startDate.valueOf()) / 1000)\n            ), //   convert elapsed count to seconds\n            tap((elapsed) => {\n              if (elapsed >= timeout) {\n                this.timeout$.next(true);\n              }\n            })\n          )\n        )\n      );\n    });\n  }\n\n  /**\n   * Setup ping.\n   *\n   * Pings every ping-seconds only if is not timeout.\n   * @param pingMillisec\n   */\n  protected setupPing(pingMillisec: number) {\n    this.ping$ = interval(pingMillisec).pipe(filter(() => !this.isTimeout));\n  }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { provideUserIdleConfig, UserIdleConfig } from './angular-user-idle.config';\n\n/**\n * User's idle module.\n * @deprecated since version 4.0.0  - use provideUserIdleConfig(config: UserIdleConfig) instead\n */\n@NgModule({\n  imports: [],\n})\nexport class UserIdleModule {\n  static forRoot(config: UserIdleConfig): ModuleWithProviders<UserIdleModule> {\n    return {\n      ngModule: UserIdleModule,\n      providers: [provideUserIdleConfig(config)],\n    };\n  }\n}\n","/*\n * Public API Surface of angular-user-idle\n */\n\nexport * from './lib/angular-user-idle.service';\nexport * from './lib/angular-user-idle.config';\nexport * from './lib/angular-user-idle.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UserIdleConfig"],"mappings":"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"}