mirror of
https://github.com/vatesfr/xen-orchestra.git
synced 2026-09-12 06:59:53 -05:00
Change the backups so they stop using their own task system, and use the same system as XO Tasks. For the moment, it shouldn't affect the users, but when the previous backup logs will be old enough to be erased, this will allow us to have shorter loading times for backup logs. XO-52
64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
'use strict'
|
|
|
|
const assert = require('node:assert').strict
|
|
|
|
const noop = Function.prototype
|
|
|
|
exports.makeOnProgress = function ({ onRootTaskEnd = noop, onRootTaskStart = noop, onTaskUpdate = noop }) {
|
|
const taskLogs = new Map()
|
|
return function onProgress(event) {
|
|
const { id, type } = event
|
|
let taskLog
|
|
if (type === 'start') {
|
|
taskLog = {
|
|
id,
|
|
properties: { __proto__: null, ...event.properties },
|
|
start: event.timestamp,
|
|
status: 'pending',
|
|
}
|
|
taskLogs.set(id, taskLog)
|
|
|
|
const { parentId } = event
|
|
if (parentId === undefined) {
|
|
Object.defineProperty(taskLog, '$root', { value: taskLog })
|
|
|
|
// start of a root task
|
|
onRootTaskStart(taskLog, event)
|
|
} else {
|
|
// start of a subtask
|
|
const parent = taskLogs.get(parentId)
|
|
assert.notEqual(parent, undefined)
|
|
|
|
// inject a (non-enumerable) reference to the parent and the root task
|
|
Object.defineProperties(taskLog, { $parent: { value: parent }, $root: { value: parent.$root } })
|
|
;(parent.tasks ?? (parent.tasks = [])).push(taskLog)
|
|
}
|
|
} else {
|
|
taskLog = taskLogs.get(id)
|
|
assert.notEqual(taskLog, undefined)
|
|
|
|
if (type === 'info' || type === 'warning') {
|
|
const key = type + 's'
|
|
const { data, message } = event
|
|
;(taskLog[key] ?? (taskLog[key] = [])).push({ data, message })
|
|
} else if (type === 'property') {
|
|
;(taskLog.properties ?? (taskLog.properties = { __proto__: null }))[event.name] = event.value
|
|
} else if (type === 'end') {
|
|
taskLogs.delete(id)
|
|
|
|
taskLog.end = event.timestamp
|
|
taskLog.result = event.result
|
|
taskLog.status = event.status
|
|
} else if (type === 'abortionRequested') {
|
|
taskLog.abortionRequestedAt = event.timestamp
|
|
}
|
|
|
|
if (type === 'end' && taskLog.$root === taskLog) {
|
|
onRootTaskEnd(taskLog, event)
|
|
}
|
|
}
|
|
|
|
onTaskUpdate(taskLog, event)
|
|
}
|
|
}
|