smartspawn/ts/smartipc.classes.thread.ts

80 lines
1.7 KiB
TypeScript
Raw Normal View History

2017-01-29 19:50:36 +00:00
import * as plugins from './smartipc.plugins'
import * as q from 'smartq'
2017-01-18 15:54:39 +00:00
2017-01-29 22:41:26 +00:00
import { Pool } from './smartipc.classes.pool'
2017-03-04 10:40:32 +00:00
export let workerBasePath: string = null
2017-01-29 19:50:36 +00:00
export let setWorkerBasePath = (basePathArg: string) => {
2017-03-04 10:40:32 +00:00
workerBasePath = basePathArg
2017-03-03 19:52:23 +00:00
plugins.threads.config.set({
basepath: {
2017-03-04 10:40:32 +00:00
node: workerBasePath
2017-03-03 19:52:23 +00:00
}
})
2017-01-18 15:54:39 +00:00
}
export class Thread {
2017-03-03 19:52:23 +00:00
thread
workerPath: string
running: boolean = false
assignedPool: Pool = null
constructor(filePathArg: string) {
this.workerPath = filePathArg
}
2017-01-18 15:54:39 +00:00
2017-03-03 19:52:23 +00:00
/**
* sends a message to the spawned process
* spawns it and keeps running
*/
send<T>(message: any): Promise<T> {
let done = q.defer<T>()
this.checkSpawn()
this.thread.send(message)
this.thread.on('message', (message: T) => {
done.resolve(message)
})
this.thread.on('done', (job, message: T) => {
done.resolve(message)
})
this.thread.on('error', err => {
done.reject(err)
})
return done.promise
}
2017-01-18 15:54:39 +00:00
2017-03-03 19:52:23 +00:00
/**
* sends a command once and then kills the child process
*/
sendOnce<T>(message): Promise<T> {
let done = q.defer<T>()
this.send<T>(message).then(message => {
done.resolve(message)
this.kill()
})
return done.promise
}
2017-01-29 22:41:26 +00:00
2017-03-03 19:52:23 +00:00
/**
* kills the thread
*/
kill() {
this.thread.kill()
this.running = false
}
assignToPool(poolArg: Pool) {
this.assignedPool = poolArg
}
2017-01-29 22:41:26 +00:00
2017-03-03 19:52:23 +00:00
private checkSpawn() {
if (!this.running && !this.assignedPool) {
this.running = true
this.thread = plugins.threads.spawn(this.workerPath)
} else if (!this.running && this.assignedPool) {
this.running = true
this.thread = this.assignedPool.run(this.workerPath)
2017-01-29 22:41:26 +00:00
}
2017-03-03 19:52:23 +00:00
}
2017-01-29 22:41:26 +00:00
}