import Schedule from '../src/schedule.js' import Runner from '../src/runner.js' import delay from 'delay' const dt = new Date() const NZONES = 6 const ZONE = { duration: 3, settings:{ enabled: true, simultaneous: false, timing: { hour: dt.getHours(), minute: dt.getMinutes()+(dt.getSeconds()+5)/60, delta: 12 } } } ; (async () => { let zones = [] let schs = [] for (let zone=0; zone < NZONES; zone++) { let opts = Object.assign({},ZONE) opts.name = 'sch-zone-'+(zone+1) opts.id= 'zone-'+(zone+1), zones[zone] = opts let min = opts.settings.timing.minute // console.log(zones[zone].id,opts.min) let last = ((zone+1) % 3 ? 0 : 1) // console.log(opts.id, 'last', last, min) // console.log('zone:',opts) schs[zone] = new Schedule (opts) opts.settings.timing.minute = min + last * zone * .1 // schs[zone].rxSubscribe('nextTS','TS',function (val) { // console.log(schs[zone].name, 'subscription: nextTS was updated', val) // }) // console.log('register action !!!!!!!!!!!!!!!!!!!!!') // console.log(schs[zone].name,zones[zone]) schs[zone].registerStartAction(startAsync,zones[zone]) schs[zone].registerStopAction(stop,zones[zone]) // console.log('register action done!!!!!!!!!!!!!!!!!!!!!') } const runner = new Runner ({ name: 'example', // one: true, schedules: schs, }) runner.rxSubscribe('countdown','runner',value => { console.log('trigger #', runner._toID,'in', value)}) runner.rxSubscribe('running','runner',list => { console.log('running schedules:',list)}) runner.rxSubscribe('queue','runner',list => { console.log('queued schedules:',list)}) runner.rxSubscribe('queueCount','runner',value => { console.log('queue schedule count', value)}) runner.rxSubscribe('runningCount','runner',value => { console.log('running schedule count', value)}) // setInterval(() => { // console.log('resetting mintue') // runner.nextSchedule.minute+=1 // // console.log(runner.nextSchedule.get('settings')) // }, // 60*1000 // ) runner.enabled=true // setTimeout(()=>runner.enabled=false,6000) })().catch(err => { console.error('FATAL: UNABLE TO START SYSTEM!\n',err) // process.kill(process.pid, 'SIGTERM') }) // ACTIONS // MUST be promise returning and NOT an arrow function function stop (zone,activeSch) { console.log('stop action: aborting run for action id',activeSch.runID, 'zone',zone.id) this.emit('abort:'+activeSch.runID) } async function startAsync (zone,activeSch) { // console.log('async start function') console.log('-----running----->>',zone.id, activeSch.runID) // console.log('---waiting-----', zone.duration,'secs duration to complete') const tick = setInterval(()=>{ console.log('duration tick',zone.id) }, 1000) const duration = delay(zone.duration*1000) this.once('abort:'+activeSch.runID,()=> { console.log('aborting run>>>', activeSch.runID) duration.clear() }) await duration clearInterval(tick) this.removeAllListeners('abort:'+activeSch.runID) console.log('stopping', activeSch.runID) } function startPromise (zone,activeSch) { console.log('promise return start function', this.evName) return new Promise(resolve => { console.log('starting>>>',zone.id) console.log('---waiting-----', zone.duration,'secs duration to complete') const tick = setInterval(()=>{ console.log('duration tick',zone.id) }, 1000) this.once('abort:'+activeSch.runID,()=> { clearTimeout(run) console.log('aborting run>>>', activeSch.runID) }) const run = setTimeout(()=>{ console.log('stopping>>>',activeSch.runID) clearInterval(tick) this.removeAllListeners('abort:'+activeSch.runID) resolve() }, zone.duration*1000) }) }