uci-utils-scheduler/examples/runner.js

126 lines
3.7 KiB
JavaScript

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: 5,
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(value)})
runner.rxSubscribe('running','runner',schs => { console.log('running schedules:',schs.map(sch=>sch.name).join(','))})
runner.rxSubscribe('queue','runner',schs => { console.log('queued schedules:',schs.map(sch=>sch.name).join(','))})
runner.rxSubscribe('activeCount','runner',value => { console.log('active 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('-----starting-------',zone.id, activeSch.runID)
// console.log('---waiting-----', zone.duration,'secs duration to complete')
const tick = setInterval(()=>{
console.log('duration tick')
}, 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')
}, 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)
})
}