@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.
- package/model.js +1 -1
- package/package.json +4 -4
- package/task.js +45 -28
package/model.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/task-service",
|
|
3
|
-
"version": "0.8.
|
|
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.
|
|
26
|
-
"@live-change/relations-plugin": "^0.8.
|
|
25
|
+
"@live-change/framework": "^0.8.32",
|
|
26
|
+
"@live-change/relations-plugin": "^0.8.32"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
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
|
|
7
|
+
return string[0].toUpperCase() + string.slice(1)
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
async function triggerOnTaskStateChange(taskObject, causeType, cause) {
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: '
|
|
105
|
+
type: 'task_updateCauseOwnedTask',
|
|
100
106
|
causeType: context.causeType,
|
|
101
107
|
cause: context.cause,
|
|
102
108
|
task: taskObject.id
|
|
103
109
|
})
|
|
104
|
-
|
|
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
|
-
|
|
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
|