this.opts.killBehavior = opts.killBehavior ?? DEFAULT_KILL_BEHAVIOR
this.opts.maxInactiveTime =
opts.maxInactiveTime ?? DEFAULT_MAX_INACTIVE_TIME
- delete this.opts.async
this.opts.killHandler = opts.killHandler ?? EMPTY_FUNCTION
+ delete this.opts.async
}
/**
'A taskFunctions parameter object key is not a string'
)
}
+ if (typeof name === 'string' && name.trim().length === 0) {
+ throw new TypeError(
+ 'A taskFunctions parameter object key an empty string'
+ )
+ }
if (typeof fn !== 'function') {
throw new TypeError(
'A taskFunctions parameter object value is not a function'
if (typeof name !== 'string') {
throw new TypeError('name parameter is not a string')
}
+ if (typeof name === 'string' && name.trim().length === 0) {
+ throw new TypeError('name parameter is an empty string')
+ }
return this.taskFunctions.has(name)
}
if (typeof name !== 'string') {
throw new TypeError('name parameter is not a string')
}
+ if (typeof name === 'string' && name.trim().length === 0) {
+ throw new TypeError('name parameter is an empty string')
+ }
if (name === DEFAULT_TASK_NAME) {
throw new Error(
'Cannot add a task function with the default reserved name'
this.taskFunctions.set(DEFAULT_TASK_NAME, boundFn)
}
this.taskFunctions.set(name, boundFn)
+ this.sendTaskFunctionsListToMainWorker()
return true
} catch {
return false
if (typeof name !== 'string') {
throw new TypeError('name parameter is not a string')
}
+ if (typeof name === 'string' && name.trim().length === 0) {
+ throw new TypeError('name parameter is an empty string')
+ }
if (name === DEFAULT_TASK_NAME) {
throw new Error(
'Cannot remove the task function with the default reserved name'
'Cannot remove the task function used as the default task function'
)
}
- return this.taskFunctions.delete(name)
+ const deleteStatus = this.taskFunctions.delete(name)
+ this.sendTaskFunctionsListToMainWorker()
+ return deleteStatus
}
/**
if (typeof name !== 'string') {
throw new TypeError('name parameter is not a string')
}
+ if (typeof name === 'string' && name.trim().length === 0) {
+ throw new TypeError('name parameter is an empty string')
+ }
if (name === DEFAULT_TASK_NAME) {
throw new Error(
'Cannot set the default task function reserved name as the default task function'
protected messageListener (message: MessageValue<Data>): void {
if (this.isMain) {
throw new Error('Cannot handle message to worker in main worker')
+ } else if (message.workerId == null) {
+ throw new Error('Message worker id is not set')
} else if (message.workerId != null && message.workerId !== this.id) {
throw new Error(
`Message worker id ${message.workerId} does not match the worker id ${this.id}`
)
- } else if (message.workerId === this.id) {
- if (message.statistics != null) {
- // Statistics message received
- this.statistics = message.statistics
- } else if (message.checkActive != null) {
- // Check active message received
- message.checkActive ? this.startCheckActive() : this.stopCheckActive()
- } else if (message.taskId != null && message.data != null) {
- // Task message received
- this.run(message)
- } else if (message.kill === true) {
- // Kill message received
- this.handleKillMessage(message)
- }
+ }
+ if (message.statistics != null) {
+ // Statistics message received
+ this.statistics = message.statistics
+ } else if (message.checkActive != null) {
+ // Check active message received
+ message.checkActive ? this.startCheckActive() : this.stopCheckActive()
+ } else if (message.taskId != null && message.data != null) {
+ // Task message received
+ this.run(message)
+ } else if (message.kill === true) {
+ // Kill message received
+ this.handleKillMessage(message)
}
}
message: MessageValue<Response, Data>
): void
+ /**
+ * Sends the list of task function names to the main worker.
+ */
+ protected sendTaskFunctionsListToMainWorker (): void {
+ this.sendToMainWorker({
+ taskFunctions: this.listTaskFunctions(),
+ workerId: this.id
+ })
+ }
+
/**
* Handles an error and convert it to a string so it can be sent back to the main worker.
*
fn: TaskSyncFunction<Data, Response>,
task: Task<Data>
): void {
+ const { name, taskId, data } = task
try {
- let taskPerformance = this.beginTaskPerformance(task.name)
- const res = fn(task.data)
+ let taskPerformance = this.beginTaskPerformance(name)
+ const res = fn(data)
taskPerformance = this.endTaskPerformance(taskPerformance)
this.sendToMainWorker({
data: res,
taskPerformance,
workerId: this.id,
- taskId: task.taskId
+ taskId
})
} catch (e) {
const errorMessage = this.handleError(e as Error | string)
this.sendToMainWorker({
taskError: {
- name: task.name ?? DEFAULT_TASK_NAME,
+ name: name ?? DEFAULT_TASK_NAME,
message: errorMessage,
- data: task.data
+ data
},
workerId: this.id,
- taskId: task.taskId
+ taskId
})
} finally {
this.updateLastTaskTimestamp()
fn: TaskAsyncFunction<Data, Response>,
task: Task<Data>
): void {
- let taskPerformance = this.beginTaskPerformance(task.name)
- fn(task.data)
+ const { name, taskId, data } = task
+ let taskPerformance = this.beginTaskPerformance(name)
+ fn(data)
.then((res) => {
taskPerformance = this.endTaskPerformance(taskPerformance)
this.sendToMainWorker({
data: res,
taskPerformance,
workerId: this.id,
- taskId: task.taskId
+ taskId
})
return null
})
const errorMessage = this.handleError(e as Error | string)
this.sendToMainWorker({
taskError: {
- name: task.name ?? DEFAULT_TASK_NAME,
+ name: name ?? DEFAULT_TASK_NAME,
message: errorMessage,
- data: task.data
+ data
},
workerId: this.id,
- taskId: task.taskId
+ taskId
})
})
.finally(() => {