UNPKG

@omostan/ngx-idle

Version:

A module for responding to idle users in Angular applications. this is a forked version of the original @ng-Idle

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