@live-change/cron-service 0.9.166 → 0.9.167

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/interval.js CHANGED
@@ -3,7 +3,10 @@ const app = App.app()
3
3
 
4
4
  import definition from './definition.js'
5
5
  import config from './config.js'
6
- import { triggerType, runTrigger, doRunTrigger, waitForTasks, RunState } from './run.js'
6
+ import { triggerType, runTrigger, doRunTrigger, RunState } from './run.js'
7
+ import createWaitingFunction from './waitForDone.js'
8
+
9
+ const waitForTasks = createWaitingFunction(definition)
7
10
 
8
11
  export const Interval = definition.model({
9
12
  name: "Interval",
@@ -89,7 +92,7 @@ export const IntervalInfo = definition.model({
89
92
 
90
93
  async function processInterval({ id, interval, wait, trigger, firstRunDelay, isFirstRun }, { triggerService }) {
91
94
  //console.log("PROCESSING INTERVAL", id, interval, wait, trigger, firstRunDelay, isFirstRun)
92
- if(wait) await waitForTasks('cron_Interval', id)
95
+ if(wait) await waitForTasks('cron_Interval', id, { triggerService })
93
96
  //console.log("WAIT FOR TASKS DONE", id)
94
97
  const nextTimestamp = Date.now() + (isFirstRun ? (firstRunDelay || 0) : interval)
95
98
  const nextTime = new Date(nextTimestamp)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@live-change/cron-service",
3
- "version": "0.9.166",
3
+ "version": "0.9.167",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "type": "module",
24
24
  "dependencies": {
25
- "@live-change/framework": "^0.9.166"
25
+ "@live-change/framework": "^0.9.167"
26
26
  },
27
- "gitHead": "e99ff5ce503d5dc894d0cfe954a58397683d12e0"
27
+ "gitHead": "1051ad24a384d88af662d655f647349281fab23a"
28
28
  }
package/run.js CHANGED
@@ -174,50 +174,3 @@ definition.trigger({
174
174
  return 'done'
175
175
  }
176
176
  })
177
-
178
- export async function waitForTasks(jobType, job) {
179
- const runState = App.encodeIdentifier([jobType, job])
180
- return new Promise((resolve, reject) => {
181
- let done = false
182
- const taskObservations = new Map()
183
- function addTaskObservation(taskId) {
184
- const observable = Task.observable(taskId)
185
- if(!observable) return
186
- const observer = {
187
- set: (value) => {
188
- if(!value) return updateTasks()
189
- if(value.state === 'done' || value.state === 'failed') updateTasks()
190
- }
191
- }
192
- taskObservations.set(taskId, { observable, observer })
193
- observable.observe(observer)
194
- }
195
- async function updateTasks() {
196
- if(done) return
197
- const runningTasks = taskObservations.values()
198
- .filter(observation => observation.observable.getValue().state !== 'done' && observation.observable.getValue().state !== 'failed')
199
- if(runningTasks.length === 0) {
200
- await RunState.delete(runState)
201
- finish()
202
- }
203
- }
204
- const runStateObservable = RunState.observable(runState)
205
- const runStateObserver = {
206
- set: (value) => {
207
- if(!value) finish()
208
- if(value.tasks) {
209
- for(const taskId of value.tasks) {
210
- addTaskObservation(taskId)
211
- }
212
- }
213
- }
214
- }
215
- runStateObservable.observe(runStateObserver)
216
- function finish() {
217
- if(done) return
218
- done = true
219
- runStateObservable.unobserve(runStateObserver)
220
- resolve()
221
- }
222
- })
223
- }
package/schedule.js CHANGED
@@ -3,7 +3,7 @@ const app = App.app()
3
3
 
4
4
  import definition from './definition.js'
5
5
  import config from './config.js'
6
- import { triggerType, runTrigger, doRunTrigger, waitForTasks } from './run.js'
6
+ import { triggerType, runTrigger, doRunTrigger } from './run.js'
7
7
 
8
8
  export const Schedule = definition.model({
9
9
  name: "Schedule",
package/waitForDone.js ADDED
@@ -0,0 +1,62 @@
1
+ import App from '@live-change/framework'
2
+ const app = App.app()
3
+
4
+
5
+ export default function createWaitingFunction(definition) {
6
+ const Task = definition.foreignModel('task', 'Task')
7
+ const RunState = definition.foreignModel('cron', 'RunState')
8
+
9
+ return async function waitForDone(jobType, job, {triggerService, trigger}) {
10
+ if(typeof job !== 'string') job = App.encodeIdentifier(job.ownerType, job.owner, job.topicType, job.topic)
11
+ const runState = App.encodeIdentifier([jobType, job])
12
+ return new Promise((resolve, reject) => {
13
+ let done = false
14
+ const taskObservations = new Map()
15
+ function addTaskObservation(taskId) {
16
+ const observable = Task.observable(taskId)
17
+ if(!observable) return
18
+ const observer = {
19
+ set: (value) => {
20
+ if(done) return
21
+ if(!value) return updateTasks()
22
+ if(value.state === 'done' || value.state === 'failed') updateTasks()
23
+ }
24
+ }
25
+ taskObservations.set(taskId, { observable, observer })
26
+ observable.observe(observer)
27
+ }
28
+ async function updateTasks() {
29
+ if(done) return
30
+ const runningTasks = Array.from(taskObservations.values())
31
+ .filter(observation => observation.observable.getValue().state !== 'done' && observation.observable.getValue().state !== 'failed')
32
+ if(runningTasks.length === 0) {
33
+ //await RunState.delete(runState)
34
+ await triggerService({ service: 'cron', type: 'cron_deleteRunState' }, {
35
+ runState
36
+ })
37
+ if(done) return
38
+ return finish()
39
+ }
40
+ }
41
+ const runStateObservable = RunState.observable(runState)
42
+ const runStateObserver = {
43
+ set: (value) => {
44
+ if(done) return
45
+ if(!value) return finish()
46
+ if(value.tasks) {
47
+ for(const taskId of value.tasks) {
48
+ addTaskObservation(taskId)
49
+ }
50
+ }
51
+ }
52
+ }
53
+ runStateObservable.observe(runStateObserver)
54
+ function finish() {
55
+ if(done) return
56
+ done = true
57
+ runStateObservable.unobserve(runStateObserver)
58
+ resolve()
59
+ }
60
+ })
61
+ }
62
+ }