@live-change/task-service 0.8.30 → 0.8.32

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.
Files changed (3) hide show
  1. package/model.js +1 -1
  2. package/package.json +4 -4
  3. package/task.js +45 -28
package/model.js CHANGED
@@ -106,7 +106,7 @@ definition.view({
106
106
  type: Task
107
107
  }
108
108
  },
109
- async daoPath({ hash }) {
109
+ async daoPath({ causeType, cause, hash }) {
110
110
  return Task.indexRangePath('byCauseAndHash', [causeType, cause, hash], { limit: 23 })
111
111
  }
112
112
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@live-change/task-service",
3
- "version": "0.8.30",
3
+ "version": "0.8.32",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -22,8 +22,8 @@
22
22
  },
23
23
  "type": "module",
24
24
  "dependencies": {
25
- "@live-change/framework": "^0.8.30",
26
- "@live-change/relations-plugin": "^0.8.30"
25
+ "@live-change/framework": "^0.8.32",
26
+ "@live-change/relations-plugin": "^0.8.32"
27
27
  },
28
- "gitHead": "aec2a3ede7fe490dcb7db40ee6c2963cd0c62af1"
28
+ "gitHead": "9ea7767670a99404794087726223064c45d798d3"
29
29
  }
package/task.js CHANGED
@@ -4,28 +4,29 @@ const app = App.app()
4
4
  import crypto from 'crypto'
5
5
 
6
6
  function upperFirst(string) {
7
- return string.charAt(0).toUpperCase() + string.slice(1)
7
+ return string[0].toUpperCase() + string.slice(1)
8
8
  }
9
9
 
10
10
  async function triggerOnTaskStateChange(taskObject, causeType, cause) {
11
- await app.trigger({
11
+ if(!taskObject?.state) throw new Error('Task object state is not defined in ' + taskObject)
12
+ if(!taskObject?.id) throw new Error('Task object id is not defined in '+taskObject)
13
+ await app.trigger({ type: 'task'+upperFirst(taskObject.state), }, {
12
14
  ...taskObject,
13
- type: 'task'+upperFirst(taskObject.state),
14
15
  task: taskObject.id,
15
16
  causeType,
16
17
  cause
17
18
  })
18
- await app.trigger({
19
+ await app.trigger({ type: 'task'+upperFirst(taskObject.name)+upperFirst(taskObject.state) }, {
19
20
  ...taskObject,
20
- type: 'task'+upperFirst(taskObject.name)+upperFirst(taskObject.state),
21
21
  task: taskObject.id,
22
22
  causeType,
23
23
  cause
24
24
  })
25
25
  await app.trigger({
26
+ type: `${taskObject.causeType}_${taskObject.cause}OwnedTask`
27
+ +`${upperFirst(taskObject.name)}${upperFirst(taskObject.state)}`
28
+ }, {
26
29
  ...taskObject,
27
- type: `${taskObject.causeType}_${taksObject.cause}OwnedTask`
28
- +`${upperFirst(taskObject.name)}${upperFirst(taskObject.state)}`,
29
30
  task: taskObject.id,
30
31
  causeType,
31
32
  cause
@@ -33,7 +34,6 @@ async function triggerOnTaskStateChange(taskObject, causeType, cause) {
33
34
  }
34
35
 
35
36
  async function createOrReuseTask(taskDefinition, props, causeType, cause) {
36
-
37
37
  const propertiesJson = JSON.stringify(props)
38
38
  const hash = crypto
39
39
  .createHash('sha256')
@@ -48,32 +48,32 @@ async function createOrReuseTask(taskDefinition, props, causeType, cause) {
48
48
  const oldTask = similarTasks.find(similarTask => similarTask.name === taskDefinition.name
49
49
  && JSON.stringify(similarTask.properties) === propertiesJson)
50
50
 
51
- let taskObject = oldTask
51
+ const taskObject = oldTask
52
52
  ? await app.serviceViewGet('task', 'task', { task: oldTask.to })
53
53
  : {
54
54
  id: app.generateUid(),
55
55
  name: taskDefinition.name,
56
56
  properties: props,
57
57
  hash,
58
- state: 'created'
58
+ state: 'created',
59
+ retries: []
59
60
  }
60
61
 
61
62
  if(!oldTask) {
62
63
  /// app.emitEvents
63
- await app.triggerService('task', {
64
+ await app.triggerService({ service: 'task', type: 'task_createCauseOwnedTask' }, {
64
65
  ...taskObject,
65
- type: 'task_createCaseOwnedTask',
66
66
  causeType,
67
67
  cause,
68
68
  task: taskObject.id
69
69
  })
70
70
  await triggerOnTaskStateChange(taskObject, causeType, cause)
71
71
  }
72
-
72
+ return taskObject
73
73
  }
74
74
 
75
75
  async function startTask(taskFunction, props, causeType, cause){
76
- const taskObject = createOrReuseTask(taskFunction.definition, props, causeType, cause)
76
+ const taskObject = await createOrReuseTask(taskFunction.definition, props, causeType, cause)
77
77
  const context = {
78
78
  causeType,
79
79
  cause,
@@ -91,17 +91,31 @@ export default function task(definition) {
91
91
  let taskObject = context.taskObject
92
92
  ?? await createOrReuseTask(taskDefinition, props, context.causeType, context.cause)
93
93
 
94
+ if(!taskObject?.state) throw new Error('Task object state is not defined in ' + taskObject)
95
+ if(!taskObject?.id) throw new Error('Task object id is not defined in '+taskObject)
96
+
94
97
  const maxRetries = definition.maxRetries ?? 5
95
98
 
96
99
  async function updateTask(data) {
97
- await app.triggerService('task', {
100
+ if(typeof data !== 'object') throw new Error('Task update data is not an object' + JSON.stringify(data))
101
+ if(!taskObject?.state) throw new Error('Task object state is not defined in ' + JSON.stringify(taskObject))
102
+ if(!taskObject?.id) throw new Error('Task object id is not defined in ' + JSON.stringify(taskObject))
103
+ /* console.log("UPDATING TASK", {
98
104
  ...data,
99
- type: 'task_updateCaseOwnedTask',
105
+ type: 'task_updateCauseOwnedTask',
100
106
  causeType: context.causeType,
101
107
  cause: context.cause,
102
108
  task: taskObject.id
103
109
  })
104
- taskObject = await app.serviceViewGet('task', 'task', { task: oldTask.to })
110
+ console.trace("UPDATING TASK!")*/
111
+ const result = await app.triggerService({ service: 'task', type: 'task_updateCauseOwnedTask' }, {
112
+ ...data,
113
+ causeType: context.causeType,
114
+ cause: context.cause,
115
+ task: taskObject.id
116
+ })
117
+ taskObject = await app.serviceViewGet('task', 'task', { task: taskObject.id })
118
+ //console.log("UPDATED TASK", taskObject, result)
105
119
  }
106
120
 
107
121
  const runTask = async () => {
@@ -136,22 +150,24 @@ export default function task(definition) {
136
150
  })
137
151
  await triggerOnTaskStateChange(taskObject, context.causeType, context.cause)
138
152
  } catch(error) {
139
- if(taskObject.retries.length >= maxRetries) {
153
+ console.log("TASK ERROR", error.message, error.stack)
154
+ /*console.log("RETRIES", taskObject.retries?.length, maxRetries)*/
155
+ if((taskObject.retries?.length || 0) >= maxRetries) {
140
156
  await updateTask({
141
157
  state: 'failed',
142
158
  doneAt: new Date(),
143
- error: error.message
159
+ error: error.stack ?? error.message ?? error
160
+ })
161
+ } else {
162
+ await updateTask({
163
+ state: 'retrying',
164
+ retries: [...(taskObject.retries || []), {
165
+ startedAt: taskObject.startedAt,
166
+ failedAt: new Date(),
167
+ error: error.stack ?? error.message ?? error
168
+ }]
144
169
  })
145
- await triggerOnTaskStateChange(taskObject, context.causeType, context.cause)
146
170
  }
147
- await updateTask(taskObject.id, {
148
- state: 'retrying',
149
- retries: [...taskObject.retries, {
150
- startedAt: taskObject.startedAt,
151
- failedAt: new Date(),
152
- error: error.message
153
- }]
154
- })
155
171
  await triggerOnTaskStateChange(taskObject, context.causeType, context.cause)
156
172
  }
157
173
  }
@@ -159,6 +175,7 @@ export default function task(definition) {
159
175
  /// TODO: implement task queues
160
176
  while(taskObject.state !== 'done' && taskObject.state !== 'failed') {
161
177
  await runTask()
178
+ //console.log("TASK OBJECT AFTER RUNTASK", taskObject)
162
179
  }
163
180
 
164
181
  return taskObject.result