// import to from 'await-to-js' import { EventEmitter } from 'events' import moment from 'moment' import 'moment-duration-format' // Single Device Scheduler User instance for each unique action // see Schedulers to create a group with "collision protection" class UCISchedule extends EventEmitter { constructor(opts) { super(opts) this.name = opts.name || 'test_schedule' this.id = opts.id || this.name this.hour = opts.hour || 0 this.dev = opts.dev || process.env.UCI_ENV==='dev' this.minute = opts.minute || 0 this.delta = opts.delta || 6 // time to next trigger in hours this.duration = opts.duration || 10 // in minutes // computed values this.nextTS = 0 // the next trigger time in seconds this.enabled = opts.enabled || true // this.active = false // if schedule is currently active // this.on('active',active=>this.active=active) this.simultaneous = opts.simulanteous // if true delay this scheduled event until current scheduled event completes // this.lastActiveTS this._startAction = opts.startAction || defaultStartAction.bind(this) // single (or array) of function(s) this._stopAction = opts.stopAction || defaultStopAction.bind(this) // single (or array) of function(s) } // async readyWait () { // return new Promise( resolve => { // if (!this.active) { // resolve() // return} // this.once('active',active=>{if (!active) resolve()}) // }) // } get countdown() { return moment.duration(parseInt((this.nextTS - Math.floor(Date.now()/1000))),'seconds').format('hh:mm:ss') } // get countdownActive() { // if (this.active) return moment.duration(parseInt((this.duration*60 + this.nextTS - Math.floor(Date.now()/1000))),'seconds').format('hh:mm:ss') // // } get countdownMS() { return (this.nextTS*1000 - Date.now()) } get durationMS() { return (this.duration*(this.dev ? 1 :60)*1000) } get nextDT() { return moment(this.nextTS*1000).format('ddd, MMM Do h:mm A') } // get activeDuration() { // return moment.duration((Math.floor(Date.now()/1000) - this.nextTS),'seconds').format('hh:mm:ss') // } // get activeRemaining() { // return moment.duration((this.nextTS - Math.floor(Date.now()/1000) + this.duration * 60),'seconds').format('hh:mm:ss') // } update() { // all TS in seconds let baseTS = this.hour*3600+this.minute*60 let dt = new Date() let intoDayTS = (dt.getSeconds() + (60 * dt.getMinutes()) + (60 * 60 * dt.getHours())) let nowTS = Math.floor(Date.now()/1000) this.nextTS = nowTS - intoDayTS + baseTS if (!this.dev) { while (nowTS > this.nextTS) { // console.log(`now ${nowTS} is beyond next ${this.nextTS} adding delta ${this.delta} hours`) this.nextTS += this.delta * 3600 } } else this.nextTS = nowTS + this.delta // console.log(baseTS,intoDayTS,nowTS, nowTS-intoDayTS,this.nextTS) this.emit('update',{id:this.id, ts:this.nextTS,dt:this.nextDT,countdown:this.countdown,simultaneous:this.simultaneous}) } registerStartAction(func) { if (!Array.isArray(func)) func = [func] this.startAction = func } registerStopAction(func) { if (!Array.isArray(func)) func = [func] this.stopAction = func } async startAction (data) { this._startAction(data) } async stopAction (data) { this._stopAction(data) } } function defaultStartAction () { console.log('start action for', this.name,moment(Date.now()).format('ddd, MMM Do h:mm:ss A')) } function defaultStopAction () { console.log('stop action for', this.name,moment(Date.now()).format('ddd, MMM Do h:mm:ss A')) } export default UCISchedule export {UCISchedule as Schedule}