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, description: this.description, error: this.error, 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 failed without translation key * TODO: Remove this method after all tasks are using translation keys * * @param {string} message */ setFailedText(message) { this.error = message this.errorKey = null this.errorSubs = null this.isFailed = true this.failedAt = Date.now() this.setFinished() } /** * Set task as finished * TODO: Update to use translation keys * * @param {string} [newDescription] update description */ setFinished(newDescription = null) { if (newDescription) { this.description = newDescription this.descriptionKey = null this.descriptionSubs = null } this.isFinished = true this.finishedAt = Date.now() } } module.exports = Task