audiobookshelf/server/objects/Task.js

134 lines
3.6 KiB
JavaScript

const uuidv4 = require('uuid').v4
/**
* @typedef TaskString
* @property {string} text
* @property {string} key
* @property {string[]} [subs]
*/
class Task {
constructor() {
/** @type {string} */
this.id = null
/** @type {string} */
this.action = null // e.g. embed-metadata, encode-m4b, etc
/** @type {Object} custom data */
this.data = null // additional info for the action like libraryItemId
/** @type {string} */
this.title = null
/** @type {string} - Used for translation */
this.titleKey = null
/** @type {string[]} - Used for translation */
this.titleSubs = null
/** @type {string} */
this.description = null
/** @type {string} - Used for translation */
this.descriptionKey = null
/** @type {string[]} - Used for translation */
this.descriptionSubs = null
/** @type {string} */
this.error = null
/** @type {string} - Used for translation */
this.errorKey = null
/** @type {string[]} - Used for translation */
this.errorSubs = null
/** @type {boolean} client should keep the task visible after success */
this.showSuccess = false
/** @type {boolean} */
this.isFailed = false
/** @type {boolean} */
this.isFinished = false
/** @type {number} */
this.startedAt = null
/** @type {number} */
this.finishedAt = null
}
toJSON() {
return {
id: this.id,
action: this.action,
data: this.data ? { ...this.data } : {},
title: this.title,
titleKey: this.titleKey,
titleSubs: this.titleSubs,
description: this.description,
descriptionKey: this.descriptionKey,
descriptionSubs: this.descriptionSubs,
error: this.error,
errorKey: this.errorKey,
errorSubs: this.errorSubs,
showSuccess: this.showSuccess,
isFailed: this.isFailed,
isFinished: this.isFinished,
startedAt: this.startedAt,
finishedAt: this.finishedAt
}
}
/**
* Set initial task data
*
* @param {string} action
* @param {TaskString} titleString
* @param {TaskString|null} descriptionString
* @param {boolean} showSuccess
* @param {Object} [data]
*/
setData(action, titleString, descriptionString, showSuccess, data = {}) {
this.id = uuidv4()
this.action = action
this.data = { ...data }
this.title = titleString.text
this.titleKey = titleString.key || null
this.titleSubs = titleString.subs || null
this.description = descriptionString?.text || null
this.descriptionKey = descriptionString?.key || null
this.descriptionSubs = descriptionString?.subs || null
this.showSuccess = showSuccess
this.startedAt = Date.now()
}
/**
* Set task as failed
*
* @param {TaskString} messageString
*/
setFailed(messageString) {
this.error = messageString.text
this.errorKey = messageString.key || null
this.errorSubs = messageString.subs || null
this.isFailed = true
this.failedAt = Date.now()
this.setFinished()
}
/**
* Set task as finished
*
* @param {TaskString} [newDescriptionString] update description
* @param {boolean} [clearDescription] clear description
*/
setFinished(newDescriptionString = null, clearDescription = false) {
if (newDescriptionString) {
this.description = newDescriptionString.text
this.descriptionKey = newDescriptionString.key || null
this.descriptionSubs = newDescriptionString.subs || null
} else if (clearDescription) {
this.description = null
this.descriptionKey = null
this.descriptionSubs = null
}
this.isFinished = true
this.finishedAt = Date.now()
}
}
module.exports = Task