forked from WorldBrain/Memex
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathidle.ts
78 lines (60 loc) · 1.96 KB
/
idle.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { browser, Idle } from 'webextension-polyfill-ts'
export type IdleState = Idle.IdleState | 'locked'
type Handler = () => Promise<void> | void
type ErrHandler = (err: Error) => void
interface IdleHandlers {
onIdle: Handler
onActive: Handler
onLocked: Handler
}
export class IdleManager {
public static DEF_INTERVAL = 20
private interval: number
// States to hold scheduled handlers in
private handlers = {
idle: new Set<Handler>(),
locked: new Set<Handler>(),
active: new Set<Handler>(),
}
constructor(interval = IdleManager.DEF_INTERVAL) {
this.idleInterval = interval
}
private runHandler = (handler: Handler) =>
Promise.resolve(handler()).catch(this._errHandler)
private _errHandler: ErrHandler = err => {
if (process.env.NODE_ENV === 'development') {
console.error(err)
}
}
public set errHandler(handler: ErrHandler) {
this._errHandler = handler
}
public set idleInterval(seconds: number) {
if (browser.idle) {
browser.idle.setDetectionInterval(seconds)
}
this.interval = seconds
}
public handleIdleStateChange = (state: IdleState) =>
[...this.handlers[state]].map(this.runHandler)
/**
* Allow setting up of logic to be run on different browser idle events.
*/
public scheduleIdleCbs(handlerCbs: Partial<IdleHandlers>) {
if (handlerCbs.onIdle) {
this.handlers.idle.add(handlerCbs.onIdle)
}
if (handlerCbs.onLocked) {
this.handlers.locked.add(handlerCbs.onLocked)
}
if (handlerCbs.onActive) {
this.handlers.active.add(handlerCbs.onActive)
}
}
}
const idleManager = new IdleManager()
if (browser.idle) {
// Run all handlers in specific state corresponding to idle state change
browser.idle.onStateChanged.addListener(idleManager.handleIdleStateChange)
}
export { idleManager }