packages/electron-test-helpers/src/PowerMonitor.ts
// https://www.electronjs.org/docs/api/power-monitor
export type PowerMonitorEvent
= 'suspend'
| 'resume'
| 'on-ac'
| 'on-battery'
| 'shutdown'
| 'lock-screen'
| 'unlock-screen'
| 'user-did-become-active'
| 'user-did-resign-active'
class PowerMonitor {
private readonly callbacks: { [event in PowerMonitorEvent]: Function[] } = {
suspend: [],
resume: [],
'on-ac': [],
'on-battery': [],
shutdown: [],
'lock-screen': [],
'unlock-screen': [],
'user-did-become-active': [],
'user-did-resign-active': []
}
private usingBattery: boolean
private isLocked: boolean
private idleTime: number
constructor ({
usingBattery = false,
isLocked = false,
idleTime = 0
} = {}) {
this.usingBattery = usingBattery
this.isLocked = isLocked
this.idleTime = idleTime
}
on (event: PowerMonitorEvent, callback: Function): void {
this.callbacks[event].push(callback)
}
getSystemIdleState (idleThreshold: number) {
if (idleThreshold > 0) {
return this.isLocked ? 'locked' : 'active'
}
// https://github.com/electron/electron/blob/a9924e1c32e8445887e3a6b5cdff445d93c2b18f/shell/browser/api/electron_api_power_monitor.cc#L129-L130
throw new TypeError('Invalid idle threshold, must be greater than 0')
}
getSystemIdleTime () {
return this.idleTime
}
get onBatteryPower () {
return this.usingBattery
}
_emit (event: PowerMonitorEvent): void {
this._handleEvent(event)
this.callbacks[event].forEach(cb => { cb() })
}
private _handleEvent (event: PowerMonitorEvent): void {
switch (event) {
case 'on-ac':
this.usingBattery = false
break
case 'on-battery':
this.usingBattery = true
break
case 'lock-screen':
this.isLocked = true
break
case 'unlock-screen':
this.isLocked = false
break
}
}
}
export function makePowerMonitor (...args: any[]): PowerMonitor {
return new PowerMonitor(...args)
}