bugsnag/bugsnag-js

View on GitHub
packages/electron-test-helpers/src/PowerMonitor.ts

Summary

Maintainability
A
30 mins
Test Coverage
// 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)
}