UNPKG

@ng-idle/core

Version:

A module for detecting and responding to the user becoming idle in Angular applications.

1 lines 50.5 kB
{"version":3,"file":"ng-idle-core.mjs","sources":["../../../projects/core/src/lib/interrupt.ts","../../../projects/core/src/lib/idleexpiry.ts","../../../projects/core/src/lib/alternativestorage.ts","../../../projects/core/src/lib/localstorage.ts","../../../projects/core/src/lib/localstorageexpiry.ts","../../../projects/core/src/lib/keepalivesvc.ts","../../../projects/core/src/lib/idle.ts","../../../projects/core/src/lib/interruptargs.ts","../../../projects/core/src/lib/interruptsource.ts","../../../projects/core/src/lib/eventtargetinterruptsource.ts","../../../projects/core/src/lib/documentinterruptsource.ts","../../../projects/core/src/lib/windowinterruptsource.ts","../../../projects/core/src/lib/storageinterruptsource.ts","../../../projects/core/src/lib/simpleexpiry.ts","../../../projects/core/src/lib/module.ts","../../../projects/core/src/lib/defaultinterruptsources.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-idle-core.ts"],"sourcesContent":["import { Subscription } from 'rxjs';\n\nimport { InterruptArgs } from './interruptargs';\nimport { InterruptOptions } from './interruptoptions';\nimport { InterruptSource } from './interruptsource';\n\n/*\n * A class for managing an interrupt from an interrupt source.\n */\nexport class Interrupt {\n private sub: Subscription;\n\n constructor(public source: InterruptSource, options?: InterruptOptions) {\n if (source.initialize) {\n source.initialize(options);\n }\n }\n\n /*\n * Subscribes to the interrupt using the specified function.\n * @param fn - The subscription function.\n */\n subscribe(fn: (args: InterruptArgs) => void): void {\n this.sub = this.source.onInterrupt.subscribe(fn);\n }\n\n /*\n * Unsubscribes the interrupt.\n */\n unsubscribe(): void {\n this.sub.unsubscribe();\n this.sub = null;\n }\n\n /*\n * Keeps the subscription but resumes interrupt events.\n */\n resume(): void {\n this.source.attach();\n }\n\n /*\n * Keeps the subscription but pauses interrupt events.\n */\n pause(): void {\n this.source.detach();\n }\n}\n","/*\n * Represents a base class for types that provide expiry detection for the Idle service.\n */\nexport abstract class IdleExpiry {\n protected idValue: any;\n protected idlingValue: boolean;\n\n constructor() {\n this.idValue = new Date();\n this.idlingValue = false;\n }\n\n /*\n * Gets or sets a unique ID for the window\n * @param id - The id.\n * @return The current id.\n */\n id(value?: any): any {\n if (value !== void 0) {\n if (!value) {\n throw new Error('A value must be specified for the ID.');\n }\n\n this.idValue = value;\n }\n\n return this.idValue;\n }\n\n /*\n * Gets or sets the last expiry date.\n * @param value - The value to set.\n * @return The last expiry value.\n */\n abstract last(value?: Date): Date;\n\n /*\n * Gets or sets the idling value.\n * @param value - The value to set.\n * @return The idling value.\n */\n idling(value?: boolean): boolean {\n if (value !== void 0) {\n this.idlingValue = value;\n }\n\n return this.idlingValue;\n }\n\n /*\n * Returns the current Date.\n * @return The current Date.\n */\n now(): Date {\n /* istanbul ignore next */\n return new Date();\n }\n\n /*\n * Returns whether or not it is expired.\n * @return True if expired; otherwise, false.\n */\n isExpired(): boolean {\n const expiry = this.last();\n return expiry != null && expiry <= this.now();\n }\n}\n","/*\n * Represents an alternative storage for browser that doesn't support localstorage. (i.e. Safari in\n * private mode)\n * @implements Storage\n */\nexport class AlternativeStorage implements Storage {\n private storageMap: any = {};\n\n /*\n * Returns an integer representing the number of data items stored in the storageMap object.\n */\n get length() {\n return Object.keys(this.storageMap).length;\n }\n\n /*\n * Remove all keys out of the storage.\n */\n clear(): void {\n this.storageMap = {};\n }\n\n /*\n * Return the key's value\n *\n * @param key - name of the key to retrieve the value of.\n * @return The key's value\n */\n getItem(key: string): string | null {\n if (typeof this.storageMap[key] !== 'undefined') {\n return this.storageMap[key];\n }\n return null;\n }\n\n /*\n * Return the nth key in the storage\n *\n * @param index - the number of the key you want to get the name of.\n * @return The name of the key.\n */\n key(index: number): string | null {\n return Object.keys(this.storageMap)[index] || null;\n }\n\n /*\n * Remove a key from the storage.\n *\n * @param key - the name of the key you want to remove.\n */\n removeItem(key: string): void {\n this.storageMap[key] = undefined;\n }\n\n /*\n * Add a key to the storage, or update a key's value if it already exists.\n *\n * @param key - the name of the key.\n * @param value - the value you want to give to the key.\n */\n setItem(key: string, value: string): void {\n this.storageMap[key] = value;\n }\n\n [key: string]: any;\n [index: number]: string;\n}\n","import { Injectable } from '@angular/core';\nimport { AlternativeStorage } from './alternativestorage';\n\n/*\n * Represents a localStorage store.\n */\n@Injectable()\nexport class LocalStorage {\n private storage: Storage;\n\n constructor() {\n this.storage = this.getStorage();\n }\n\n /*\n * Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem\n * throw QuotaExceededError. We're going to detect this and just silently drop any calls to\n * setItem\n * to avoid the entire page breaking, without having to do a check at each usage of Storage.\n */\n private getStorage(): Storage {\n try {\n const storage = localStorage;\n storage.setItem('ng2IdleStorage', '');\n storage.removeItem('ng2IdleStorage');\n return storage;\n } catch (err) {\n return new AlternativeStorage();\n }\n }\n\n /*\n * Gets an item in the storage.\n *\n * @param value - The value to get.\n * @return The current value.\n */\n getItem(key: string): string | null {\n return this.storage.getItem('ng2Idle.' + key);\n }\n\n /*\n * Removes an item in the storage.\n *\n * @param value - The value to remove.\n */\n removeItem(key: string): void {\n this.storage.removeItem('ng2Idle.' + key);\n }\n\n /*\n * Sets an item in the storage.\n *\n * @param key - The key to set the value.\n * @param value - The value to set to the key.\n */\n setItem(key: string, data: string): void {\n this.storage.setItem('ng2Idle.' + key, data);\n }\n\n /*\n * Represents the storage, commonly use for testing purposes.\n *\n * @param key - The key to set the value.\n * @param value - The value to set to the key.\n */\n _wrapped(): Storage {\n return this.storage;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { IdleExpiry } from './idleexpiry';\nimport { LocalStorage } from './localstorage';\n\n/*\n * Represents a localStorage store of expiry values.\n * @extends IdleExpiry\n */\n@Injectable()\nexport class LocalStorageExpiry extends IdleExpiry {\n private idleName = 'main';\n\n constructor(private localStorage: LocalStorage) {\n super();\n }\n\n /*\n * Gets or sets the last expiry date in localStorage.\n * If localStorage doesn't work correctly (i.e. Safari in private mode), we store the expiry value in memory.\n * @param value - The expiry value to set; omit to only return the value.\n * @return The current expiry value.\n */\n last(value?: Date): Date {\n if (value !== void 0) {\n this.setExpiry(value);\n }\n return this.getExpiry();\n }\n\n idling(value?: boolean): boolean {\n if (value !== void 0) {\n this.setIdling(value);\n }\n return this.getIdling();\n }\n\n /*\n * Gets the idle name.\n * @return The name of the idle.\n */\n getIdleName(): string {\n return this.idleName;\n }\n\n /*\n * Sets the idle name.\n * @param The name of the idle.\n */\n setIdleName(key: string): void {\n if (key) {\n this.idleName = key;\n }\n }\n\n private getExpiry(): Date {\n const expiry: string = this.localStorage.getItem(this.idleName + '.expiry');\n if (expiry) {\n return new Date(parseInt(expiry, 10));\n } else {\n return null;\n }\n }\n\n private setExpiry(value: Date) {\n if (value) {\n this.localStorage.setItem(\n this.idleName + '.expiry',\n value.getTime().toString()\n );\n } else {\n this.localStorage.removeItem(this.idleName + '.expiry');\n }\n }\n\n private getIdling(): boolean {\n const idling: string = this.localStorage.getItem(this.idleName + '.idling');\n if (idling) {\n return idling === 'true';\n } else {\n return false;\n }\n }\n\n private setIdling(value: boolean) {\n if (value) {\n this.localStorage.setItem(this.idleName + '.idling', value.toString());\n } else {\n this.localStorage.setItem(this.idleName + '.idling', 'false');\n }\n }\n}\n","export abstract class KeepaliveSvc {\n abstract start(): void;\n abstract stop(): void;\n abstract ping(): void;\n}\n","import {\n EventEmitter,\n Inject,\n Injectable,\n NgZone,\n OnDestroy,\n Optional,\n PLATFORM_ID\n} from '@angular/core';\n\nimport { IdleExpiry } from './idleexpiry';\nimport { Interrupt } from './interrupt';\nimport { InterruptArgs } from './interruptargs';\nimport { InterruptSource } from './interruptsource';\nimport { KeepaliveSvc } from './keepalivesvc';\nimport { LocalStorageExpiry } from './localstorageexpiry';\n\n/*\n * Indicates the desired auto resume behavior.\n */\nexport enum AutoResume {\n /*\n * Auto resume functionality will be disabled.\n */\n disabled,\n /*\n * Can resume automatically even if they are idle.\n */\n idle,\n /*\n * Can only resume automatically if they are not yet idle.\n */\n notIdle\n}\n\n/**\n * A service for detecting and responding to user idleness.\n */\n@Injectable()\nexport class Idle implements OnDestroy {\n private idle: number = 20 * 60; // in seconds\n private timeoutVal = 30; // in seconds\n private autoResume: AutoResume = AutoResume.idle;\n private interrupts: Array<Interrupt> = new Array();\n private running = false;\n private idling: boolean;\n private idleHandle: any;\n private timeoutHandle: any;\n private countdown: number;\n private keepaliveEnabled = false;\n private keepaliveSvc: KeepaliveSvc;\n\n public onIdleStart: EventEmitter<any> = new EventEmitter();\n public onIdleEnd: EventEmitter<any> = new EventEmitter();\n public onTimeoutWarning: EventEmitter<number> = new EventEmitter<number>();\n public onTimeout: EventEmitter<number> = new EventEmitter<number>();\n public onInterrupt: EventEmitter<any> = new EventEmitter();\n\n [key: string]: any;\n\n constructor(\n private expiry: IdleExpiry,\n private zone: NgZone,\n @Optional() keepaliveSvc?: KeepaliveSvc,\n @Optional() @Inject(PLATFORM_ID) private platformId?: Object\n ) {\n if (keepaliveSvc) {\n this.keepaliveSvc = keepaliveSvc;\n this.keepaliveEnabled = true;\n }\n this.setIdling(false);\n }\n\n /*\n * Sets the idle name for localStorage.\n * Important to set if multiple instances of Idle with LocalStorageExpiry\n * @param The name of the idle.\n */\n setIdleName(key: string): void {\n if (this.expiry instanceof LocalStorageExpiry) {\n this.expiry.setIdleName(key);\n } else {\n throw new Error(\n 'Cannot set expiry key name because no LocalStorageExpiry has been provided.'\n );\n }\n }\n\n /*\n * Returns whether or not keepalive integration is enabled.\n * @return True if integration is enabled; otherwise, false.\n */\n getKeepaliveEnabled(): boolean {\n return this.keepaliveEnabled;\n }\n\n /*\n * Sets and returns whether or not keepalive integration is enabled.\n * @param True if the integration is enabled; otherwise, false.\n * @return The current value.\n */\n setKeepaliveEnabled(value: boolean): boolean {\n if (!this.keepaliveSvc) {\n throw new Error(\n 'Cannot enable keepalive integration because no KeepaliveSvc has been provided.'\n );\n }\n\n return (this.keepaliveEnabled = value);\n }\n\n /*\n * Returns the current timeout value.\n * @return The timeout value in seconds.\n */\n getTimeout(): number {\n return this.timeoutVal;\n }\n\n /*\n * Sets the timeout value.\n * @param seconds - The timeout value in seconds. 0 or false to disable timeout feature.\n * @return The current value. If disabled, the value will be 0.\n */\n setTimeout(seconds: number | boolean): number {\n if (seconds === false) {\n this.timeoutVal = 0;\n } else if (typeof seconds === 'number' && seconds >= 0) {\n this.timeoutVal = seconds;\n } else {\n throw new Error(\"'seconds' can only be 'false' or a positive number.\");\n }\n\n return this.timeoutVal;\n }\n\n /*\n * Returns the current idle value.\n * @return The idle value in seconds.\n */\n getIdle(): number {\n return this.idle;\n }\n\n /*\n * Sets the idle value.\n * @param seconds - The idle value in seconds.\n * @return The idle value in seconds.\n */\n setIdle(seconds: number): number {\n if (seconds <= 0) {\n throw new Error(\"'seconds' must be greater zero\");\n }\n\n return (this.idle = seconds);\n }\n\n /*\n * Returns the current autoresume value.\n * @return The current value.\n */\n getAutoResume(): AutoResume {\n return this.autoResume;\n }\n\n setAutoResume(value: AutoResume): AutoResume {\n return (this.autoResume = value);\n }\n\n /*\n * Sets interrupts from the specified sources.\n * @param sources - Interrupt sources.\n * @return The resulting interrupts.\n */\n setInterrupts(sources: Array<InterruptSource>): Array<Interrupt> {\n this.clearInterrupts();\n\n const self = this;\n\n for (const source of sources) {\n const options = { platformId: this.platformId };\n const sub = new Interrupt(source, options);\n sub.subscribe((args: InterruptArgs) => {\n self.interrupt(args.force, args.innerArgs);\n });\n\n this.interrupts.push(sub);\n }\n\n return this.interrupts;\n }\n\n /*\n * Returns the current interrupts.\n * @return The current interrupts.\n */\n getInterrupts(): Array<Interrupt> {\n return this.interrupts;\n }\n\n /*\n * Pauses, unsubscribes, and clears the current interrupt subscriptions.\n */\n clearInterrupts(): void {\n for (const sub of this.interrupts) {\n sub.pause();\n sub.unsubscribe();\n }\n\n this.interrupts.length = 0;\n }\n\n /*\n * Returns whether or not the service is running i.e. watching for idleness.\n * @return True if service is watching; otherwise, false.\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /*\n * Returns whether or not the user is considered idle.\n * @return True if the user is in the idle state; otherwise, false.\n */\n isIdling(): boolean {\n return this.idling;\n }\n\n /*\n * Starts watching for inactivity.\n */\n watch(skipExpiry?: boolean): void {\n this.safeClearInterval('idleHandle');\n this.safeClearInterval('timeoutHandle');\n\n const timeout = !this.timeoutVal ? 0 : this.timeoutVal;\n if (!skipExpiry) {\n const value = new Date(\n this.expiry.now().getTime() + (this.idle + timeout) * 1000\n );\n this.expiry.last(value);\n }\n\n if (this.idling) {\n this.toggleState();\n }\n if (!this.running) {\n this.startKeepalive();\n this.toggleInterrupts(true);\n }\n\n this.running = true;\n\n const watchFn = () => {\n this.zone.run(() => {\n const diff = this.getExpiryDiff(timeout);\n if (diff > 0) {\n this.safeClearInterval('idleHandle');\n this.setIdleIntervalOutsideOfZone(watchFn, 1000);\n } else {\n this.toggleState();\n }\n });\n };\n\n this.setIdleIntervalOutsideOfZone(watchFn, 1000);\n }\n\n /*\n * Allows protractor tests to call waitForAngular without hanging\n */\n setIdleIntervalOutsideOfZone(watchFn: () => void, frequency: number): void {\n this.zone.runOutsideAngular(() => {\n this.idleHandle = setInterval(watchFn, frequency);\n });\n }\n\n /*\n * Stops watching for inactivity.\n */\n stop(): void {\n this.stopKeepalive();\n\n this.toggleInterrupts(false);\n\n this.safeClearInterval('idleHandle');\n this.safeClearInterval('timeoutHandle');\n\n this.setIdling(false);\n this.running = false;\n\n this.expiry.last(null);\n }\n\n /*\n * Forces a timeout event and state.\n */\n timeout(): void {\n this.stopKeepalive();\n\n this.toggleInterrupts(false);\n\n this.safeClearInterval('idleHandle');\n this.safeClearInterval('timeoutHandle');\n\n this.setIdling(true);\n this.running = false;\n this.countdown = 0;\n\n this.onTimeout.emit(null);\n }\n\n /*\n * Signals that user activity has occurred.\n * @param force - Forces watch to be called, unless they are timed out.\n * @param eventArgs - Optional source event arguments.\n */\n interrupt(force?: boolean, eventArgs?: any): void {\n if (!this.running) {\n return;\n }\n\n if (this.timeoutVal && this.expiry.isExpired()) {\n this.timeout();\n return;\n }\n this.onInterrupt.emit(eventArgs);\n\n if (\n force === true ||\n this.autoResume === AutoResume.idle ||\n (this.autoResume === AutoResume.notIdle && !this.expiry.idling())\n ) {\n this.watch(force);\n }\n }\n\n private setIdling(value: boolean): void {\n this.idling = value;\n this.expiry.idling(value);\n }\n\n private toggleState(): void {\n this.setIdling(!this.idling);\n\n if (this.idling) {\n this.onIdleStart.emit(null);\n this.stopKeepalive();\n\n if (this.timeoutVal > 0) {\n this.countdown = this.timeoutVal;\n this.doCountdown();\n this.setTimeoutIntervalOutsideZone(() => {\n this.doCountdownInZone();\n }, 1000);\n }\n } else {\n this.toggleInterrupts(true);\n this.onIdleEnd.emit(null);\n this.startKeepalive();\n }\n\n this.safeClearInterval('idleHandle');\n }\n\n private setTimeoutIntervalOutsideZone(\n intervalFn: () => void,\n frequency: number\n ) {\n this.zone.runOutsideAngular(() => {\n this.timeoutHandle = setInterval(() => {\n intervalFn();\n }, frequency);\n });\n }\n\n private toggleInterrupts(resume: boolean): void {\n for (const interrupt of this.interrupts) {\n if (resume) {\n interrupt.resume();\n } else {\n interrupt.pause();\n }\n }\n }\n\n private getExpiryDiff(timeout: number): number {\n const now: Date = this.expiry.now();\n const last: Date = this.expiry.last() || now;\n return last.getTime() - now.getTime() - timeout * 1000;\n }\n\n private doCountdownInZone(): void {\n this.zone.run(() => {\n this.doCountdown();\n });\n }\n\n private doCountdown(): void {\n const diff = this.getExpiryDiff(this.timeoutVal);\n if (diff > 0) {\n this.safeClearInterval('timeoutHandle');\n this.interrupt(true);\n return;\n }\n\n if (!this.idling) {\n return;\n }\n\n if (this.countdown <= 0) {\n this.timeout();\n return;\n }\n\n this.onTimeoutWarning.emit(this.countdown);\n\n const countdownMs = ((this.timeoutVal - 1) * 1000) + diff;\n this.countdown = Math.round(countdownMs / 1000);\n }\n\n private safeClearInterval(handleName: string): void {\n const handle = this[handleName];\n if (handle !== null && typeof handle !== 'undefined') {\n clearInterval(this[handleName]);\n this[handleName] = null;\n }\n }\n\n private startKeepalive(): void {\n if (!this.keepaliveSvc || !this.keepaliveEnabled) {\n return;\n }\n\n if (this.running) {\n this.keepaliveSvc.ping();\n }\n\n this.keepaliveSvc.start();\n }\n\n private stopKeepalive(): void {\n if (!this.keepaliveSvc || !this.keepaliveEnabled) {\n return;\n }\n\n this.keepaliveSvc.stop();\n }\n\n /*\n * Called by Angular when destroying the instance.\n */\n ngOnDestroy(): void {\n this.stop();\n this.clearInterrupts();\n }\n}\n","import { InterruptSource } from './interruptsource';\n\n/*\n * A class for expressing arguments to interrupt events.\n */\nexport class InterruptArgs {\n constructor(\n public source: InterruptSource,\n public innerArgs: any,\n public force = false\n ) {}\n}\n","import { EventEmitter } from '@angular/core';\n\nimport { InterruptArgs } from './interruptargs';\nimport { InterruptOptions } from './interruptoptions';\n\ndeclare const Zone: any;\n\n/*\n * A base for classes that act as a source for interrupts.\n */\nexport abstract class InterruptSource {\n isAttached = false;\n\n public onInterrupt: EventEmitter<InterruptArgs> = new EventEmitter<\n InterruptArgs\n >();\n\n constructor(\n protected attachFn?: (source: InterruptSource) => void,\n protected detachFn?: (source: InterruptSource) => void\n ) {}\n\n /*\n * Attaches to the specified events on the specified source.\n */\n attach(): void {\n // If the current zone is the 'angular' zone (a.k.a. NgZone) then re-enter this method in its parent zone\n // The parent zone is usually the '<root>' zone but it can also be 'long-stack-trace-zone' in debug mode\n // In tests, the current zone is typically a 'ProxyZone' created by async/fakeAsync (from @angular/core/testing)\n if (Zone.current.get('isAngularZone') === true) {\n Zone.current.parent.run(() => this.attach());\n return;\n }\n\n if (!this.isAttached && this.attachFn) {\n this.attachFn(this);\n }\n\n this.isAttached = true;\n }\n\n /*\n * Detaches from the specified events on the specified source.\n */\n detach(): void {\n if (this.isAttached && this.detachFn) {\n this.detachFn(this);\n }\n\n this.isAttached = false;\n }\n\n initialize?(options?: InterruptOptions): void;\n}\n","import { isPlatformServer } from '@angular/common';\nimport { Observable, Subscription, fromEvent, merge } from 'rxjs';\nimport { filter, throttleTime } from 'rxjs/operators';\n\nimport { EventTarget } from './eventtarget';\nimport { InterruptArgs } from './interruptargs';\nimport { InterruptOptions } from './interruptoptions';\nimport { InterruptSource } from './interruptsource';\n\n/**\n * Options for EventTargetInterruptSource\n */\nexport interface EventTargetInterruptOptions {\n /**\n * The number of milliseconds to throttle the events coming from the target.\n */\n throttleDelay?: number;\n\n /**\n * Whether or not to use passive event listeners.\n * Note: you need to detect if the browser supports passive listeners, and only set this to true if it does.\n */\n passive?: boolean;\n}\n\nconst defaultThrottleDelay = 500;\n\n/*\n * An interrupt source on an EventTarget object, such as a Window or HTMLElement.\n */\nexport class EventTargetInterruptSource extends InterruptSource {\n private eventSrc: Observable<any>;\n private eventSubscription: Subscription = new Subscription();\n protected throttleDelay: number;\n protected passive: boolean;\n\n constructor(\n protected target: EventTarget<any> | (() => EventTarget<any>),\n protected events: string,\n private opts?: number | EventTargetInterruptOptions\n ) {\n super(null, null);\n\n if (typeof this.opts === 'number') {\n this.opts = { throttleDelay: this.opts, passive: false };\n }\n\n this.opts = this.opts || {\n passive: false,\n throttleDelay: defaultThrottleDelay\n };\n\n if (this.opts.throttleDelay === undefined || this.opts.throttleDelay === null) {\n this.opts.throttleDelay = defaultThrottleDelay;\n }\n\n this.throttleDelay = this.opts.throttleDelay;\n this.passive = !!this.opts.passive;\n }\n\n initialize(options?: InterruptOptions) {\n if (options?.platformId && isPlatformServer(options.platformId)) {\n return;\n }\n\n const eventTarget = typeof this.target === 'function' ? this.target() : this.target;\n const opts = this.passive ? { passive: true } : null;\n const fromEvents = this.events\n .split(' ')\n .map(eventName => fromEvent(eventTarget as any, eventName, opts));\n this.eventSrc = merge(...fromEvents);\n this.eventSrc = this.eventSrc.pipe(\n filter(innerArgs => !this.filterEvent(innerArgs))\n );\n if (this.throttleDelay > 0) {\n this.eventSrc = this.eventSrc.pipe(throttleTime(this.throttleDelay));\n }\n\n const handler = (innerArgs: any) =>\n this.onInterrupt.emit(new InterruptArgs(this, innerArgs));\n\n this.attachFn = () =>\n (this.eventSubscription = this.eventSrc.subscribe(handler));\n\n this.detachFn = () => this.eventSubscription.unsubscribe();\n }\n\n /*\n * Checks to see if the event should be filtered. Always returns false unless overriden.\n * @param event - The original event object.\n * @return True if the event should be filtered (don't cause an interrupt); otherwise, false.\n */\n protected filterEvent(event: any): boolean {\n return false;\n }\n\n /**\n * Returns the current options being used.\n * @return The current option values.\n */\n get options(): EventTargetInterruptOptions {\n return {\n passive: this.passive,\n throttleDelay: this.throttleDelay\n };\n }\n}\n","import {\n EventTargetInterruptOptions,\n EventTargetInterruptSource\n} from './eventtargetinterruptsource';\n\n/*\n * An interrupt source that uses events on the document element (html tag).\n */\nexport class DocumentInterruptSource extends EventTargetInterruptSource {\n constructor(events: string, options?: number | EventTargetInterruptOptions) {\n super(() => document.documentElement, events, options);\n }\n\n /*\n * Checks to see if the event should be filtered.\n * @param event - The original event object.\n * @return True if the event should be filtered (don't cause an interrupt); otherwise, false.\n */\n filterEvent(event: any): boolean {\n // some browser bad input hacks\n if (\n event.type === 'mousemove' &&\n // fix for Chrome destop notifications\n ((event.originalEvent &&\n event.originalEvent.movementX === 0 &&\n event.originalEvent.movementY === 0) ||\n // fix for webkit fake mousemove\n ((event.movementX !== void 0 && !event.movementX) || !event.movementY))\n ) {\n return true;\n }\n\n return false;\n }\n}\n","import {\n EventTargetInterruptOptions,\n EventTargetInterruptSource\n} from './eventtargetinterruptsource';\n\n/*\n * An interrupt source on the Window object.\n */\nexport class WindowInterruptSource extends EventTargetInterruptSource {\n constructor(events: string, options?: number | EventTargetInterruptOptions) {\n super(() => window, events, options);\n }\n}\n","import { WindowInterruptSource } from './windowinterruptsource';\nimport { EventTargetInterruptOptions } from './eventtargetinterruptsource';\n\n/*\n * An interrupt source on the storage event of Window.\n */\nexport class StorageInterruptSource extends WindowInterruptSource {\n constructor(options: number | EventTargetInterruptOptions = 500) {\n super('storage', options);\n }\n\n /*\n * Checks to see if the event should be filtered.\n * @param event - The original event object.\n * @return True if the event should be filtered (don't cause an interrupt); otherwise, false.\n */\n filterEvent(event: StorageEvent): boolean {\n if (\n event.key &&\n event.key.indexOf('ng2Idle.') >= 0 &&\n event.key.indexOf('.expiry') >= 0\n ) {\n return false;\n }\n return true;\n }\n}\n","import { IdleExpiry } from './idleexpiry';\n\n/*\n * Represents a simple in-memory store of expiry values.\n * @extends IdleExpiry\n */\nexport class SimpleExpiry extends IdleExpiry {\n private lastValue: Date = null;\n\n constructor() {\n super();\n }\n\n /*\n * Gets or sets the last expiry date.\n * @param value - The expiry value to set; omit to only return the value.\n * @return The current expiry value.\n */\n last(value?: Date): Date {\n if (value !== void 0) {\n this.lastValue = value;\n }\n\n return this.lastValue;\n }\n}\n","import { ModuleWithProviders, NgModule, Provider } from '@angular/core';\n\nimport { Idle } from './idle';\nimport { IdleExpiry } from './idleexpiry';\nimport { LocalStorageExpiry } from './localstorageexpiry';\nimport { LocalStorage } from './localstorage';\n\nexport function provideNgIdle(): Provider[] {\n return [\n LocalStorage,\n LocalStorageExpiry,\n Idle,\n {\n provide: IdleExpiry,\n useExisting: LocalStorageExpiry\n }\n ];\n};\n\n@NgModule({\n providers: [LocalStorage]\n})\nexport class NgIdleModule {\n static forRoot(): ModuleWithProviders<NgIdleModule> {\n return {\n ngModule: NgIdleModule,\n providers: [\n LocalStorageExpiry,\n { provide: IdleExpiry, useExisting: LocalStorageExpiry },\n Idle\n ]\n };\n }\n}\n","import { DocumentInterruptSource } from './documentinterruptsource';\nimport { EventTargetInterruptOptions } from './eventtargetinterruptsource';\nimport { StorageInterruptSource } from './storageinterruptsource';\n\nexport function createDefaultInterruptSources(\n options?: EventTargetInterruptOptions\n) {\n return [\n new DocumentInterruptSource(\n 'mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove scroll',\n options\n ),\n new StorageInterruptSource(options)\n ];\n}\n\nexport const DEFAULT_INTERRUPTSOURCES = createDefaultInterruptSources();\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/idle';\nexport * from './lib/interruptargs';\nexport * from './lib/interruptsource';\nexport * from './lib/eventtargetinterruptsource';\nexport * from './lib/documentinterruptsource';\nexport * from './lib/windowinterruptsource';\nexport * from './lib/storageinterruptsource';\nexport * from './lib/keepalivesvc';\nexport * from './lib/idleexpiry';\nexport * from './lib/simpleexpiry';\nexport * from './lib/localstorage';\nexport * from './lib/localstorageexpiry';\nexport * from './lib/module';\nexport * from './lib/defaultinterruptsources';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LocalStorage"],"mappings":"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