BREAKING CHANGE(package): change scope
This commit is contained in:
11
ts/index.ts
11
ts/index.ts
@ -1,6 +1,5 @@
|
||||
export * from './smartipc.classes.thread'
|
||||
export * from './smartipc.classes.threadfunction'
|
||||
export * from './smartipc.classes.threadsimple'
|
||||
export * from './smartipc.classes.pool'
|
||||
export * from './smartipc.wrap'
|
||||
|
||||
export * from './smartspawn.classes.thread';
|
||||
export * from './smartspawn.classes.threadfunction';
|
||||
export * from './smartspawn.classes.threadsimple';
|
||||
export * from './smartspawn.classes.pool';
|
||||
export * from './smartspawn.wrap';
|
||||
|
@ -1,11 +0,0 @@
|
||||
import * as plugins from './smartipc.plugins'
|
||||
|
||||
export class Pool {
|
||||
pool
|
||||
constructor() {
|
||||
this.pool = new plugins.threads.Pool()
|
||||
}
|
||||
run(workerPathArg: string) {
|
||||
return this.pool.run(workerPathArg)
|
||||
}
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
import * as plugins from './smartipc.plugins'
|
||||
import * as q from 'smartq'
|
||||
|
||||
import { Pool } from './smartipc.classes.pool'
|
||||
|
||||
export let workerBasePath: string = null
|
||||
|
||||
export let setWorkerBasePath = (basePathArg: string) => {
|
||||
workerBasePath = basePathArg
|
||||
plugins.threads.config.set({
|
||||
basepath: {
|
||||
node: workerBasePath
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export class Thread {
|
||||
thread
|
||||
workerPath: string
|
||||
running: boolean = false
|
||||
assignedPool: Pool = null
|
||||
constructor(filePathArg: string) {
|
||||
this.workerPath = filePathArg
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
}
|
||||
|
||||
/**
|
||||
* kills the thread
|
||||
*/
|
||||
kill() {
|
||||
this.thread.kill()
|
||||
this.running = false
|
||||
}
|
||||
|
||||
assignToPool(poolArg: Pool) {
|
||||
this.assignedPool = poolArg
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
import 'typings-global'
|
||||
import * as plugins from './smartipc.plugins'
|
||||
import * as q from 'smartq'
|
||||
|
||||
export interface IThreadFunction {
|
||||
(input, done): void
|
||||
}
|
||||
|
||||
export class ThreadFunction {
|
||||
thread
|
||||
constructor(functionArg: IThreadFunction) {
|
||||
this.thread = plugins.threads.spawn(functionArg)
|
||||
}
|
||||
|
||||
/**
|
||||
* sends a message to the spawned process
|
||||
*/
|
||||
send<T>(message: any): Promise<T> {
|
||||
let done = q.defer<T>()
|
||||
this.thread.send(message).on('message', (message: T) => {
|
||||
done.resolve(message)
|
||||
}).on('error', err => {
|
||||
done.reject(err)
|
||||
})
|
||||
return done.promise
|
||||
}
|
||||
|
||||
kill() {
|
||||
this.thread.kill()
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
import * as plugins from './smartipc.plugins'
|
||||
import * as smartq from 'smartq'
|
||||
import * as childProcess from 'child_process'
|
||||
|
||||
import { workerBasePath } from './smartipc.classes.thread'
|
||||
|
||||
export class ThreadSimple {
|
||||
workerPath: string
|
||||
threadChildProcess: childProcess.ChildProcess
|
||||
forkOptions: childProcess.ForkOptions
|
||||
argvArgs: string[]
|
||||
constructor (filePathArg: string, argvArgs: string[] = [], forkOptionsArg: childProcess.ForkOptions = {}) {
|
||||
this.workerPath = filePathArg
|
||||
this.forkOptions = forkOptionsArg
|
||||
this.argvArgs = argvArgs
|
||||
}
|
||||
|
||||
run () {
|
||||
let done = smartq.defer<childProcess.ChildProcess>()
|
||||
let forkPath = (() => {
|
||||
if (workerBasePath) {
|
||||
return plugins.path.join(workerBasePath, this.workerPath)
|
||||
} else {
|
||||
return this.workerPath
|
||||
}
|
||||
})()
|
||||
this.threadChildProcess = childProcess.fork(forkPath, this.argvArgs, this.forkOptions)
|
||||
done.resolve(this.threadChildProcess)
|
||||
return done.promise
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
import 'typings-global'
|
||||
import * as path from 'path'
|
||||
let threads = require('threads')
|
||||
import * as smartq from 'smartq'
|
||||
|
||||
export {
|
||||
path,
|
||||
smartq,
|
||||
threads
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
import * as spawnWrap from 'spawn-wrap'
|
||||
|
||||
let unwrap: any = null
|
||||
|
||||
export let startSpawnWrap = (filePath: string, cliArgs: string[] = [], envArgs: any = {}) => {
|
||||
let spawnArray = [filePath]
|
||||
for (let cliArg of cliArgs) {
|
||||
spawnArray.push(cliArg)
|
||||
}
|
||||
unwrap = spawnWrap(spawnArray, envArgs)
|
||||
}
|
||||
|
||||
export let endSpawnWrap = () => {
|
||||
if (unwrap) {
|
||||
unwrap()
|
||||
unwrap = null
|
||||
}
|
||||
}
|
6
ts/smartspawn.classes.cluster.ts
Normal file
6
ts/smartspawn.classes.cluster.ts
Normal file
@ -0,0 +1,6 @@
|
||||
// ==============
|
||||
// This file handles clustering of nodejs programs
|
||||
// ==============
|
||||
import * as plugins from './smartspawn.plugins';
|
||||
|
||||
export class Cluster {}
|
13
ts/smartspawn.classes.pool.ts
Normal file
13
ts/smartspawn.classes.pool.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import * as plugins from './smartspawn.plugins';
|
||||
|
||||
export class Pool {
|
||||
pool;
|
||||
|
||||
// the constructor for pool
|
||||
constructor() {
|
||||
this.pool = new plugins.threads.Pool();
|
||||
}
|
||||
run(workerPathArg: string) {
|
||||
return this.pool.run(workerPathArg);
|
||||
}
|
||||
}
|
85
ts/smartspawn.classes.thread.ts
Normal file
85
ts/smartspawn.classes.thread.ts
Normal file
@ -0,0 +1,85 @@
|
||||
import * as plugins from './smartspawn.plugins';
|
||||
import * as paths from './smartspawn.paths';
|
||||
import * as q from 'smartq';
|
||||
|
||||
import { Pool } from './smartspawn.classes.pool';
|
||||
import { startSpawnWrap, endSpawnWrap } from './smartspawn.wrap';
|
||||
|
||||
export let workerBasePath: string = null;
|
||||
|
||||
export const setWorkerBasePath = (basePathArg: string) => {
|
||||
workerBasePath = basePathArg;
|
||||
plugins.threads.config.set({
|
||||
basepath: {
|
||||
node: workerBasePath
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export class Thread {
|
||||
thread;
|
||||
workerPath: string;
|
||||
running: boolean = false;
|
||||
assignedPool: Pool = null;
|
||||
constructor(filePathArg: string) {
|
||||
this.workerPath = filePathArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* kills the thread
|
||||
*/
|
||||
kill() {
|
||||
this.thread.kill();
|
||||
this.running = false;
|
||||
}
|
||||
|
||||
assignToPool(poolArg: Pool) {
|
||||
this.assignedPool = poolArg;
|
||||
}
|
||||
|
||||
enableTypeScript () {
|
||||
// TODO:
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
34
ts/smartspawn.classes.threadfunction.ts
Normal file
34
ts/smartspawn.classes.threadfunction.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import 'typings-global';
|
||||
import * as plugins from './smartspawn.plugins';
|
||||
import * as q from 'smartq';
|
||||
|
||||
export interface IThreadFunction {
|
||||
(input, done): void;
|
||||
}
|
||||
|
||||
export class ThreadFunction {
|
||||
thread;
|
||||
constructor(functionArg: IThreadFunction) {
|
||||
this.thread = plugins.threads.spawn(functionArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* sends a message to the spawned process
|
||||
*/
|
||||
send<T>(message: any): Promise<T> {
|
||||
let done = q.defer<T>();
|
||||
this.thread
|
||||
.send(message)
|
||||
.on('message', (message: T) => {
|
||||
done.resolve(message);
|
||||
})
|
||||
.on('error', err => {
|
||||
done.reject(err);
|
||||
});
|
||||
return done.promise;
|
||||
}
|
||||
|
||||
kill() {
|
||||
this.thread.kill();
|
||||
}
|
||||
}
|
35
ts/smartspawn.classes.threadsimple.ts
Normal file
35
ts/smartspawn.classes.threadsimple.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import * as plugins from './smartspawn.plugins';
|
||||
import * as smartq from 'smartq';
|
||||
import * as childProcess from 'child_process';
|
||||
|
||||
import { workerBasePath } from './smartspawn.classes.thread';
|
||||
|
||||
export class ThreadSimple {
|
||||
workerPath: string;
|
||||
threadChildProcess: childProcess.ChildProcess;
|
||||
forkOptions: childProcess.ForkOptions;
|
||||
argvArgs: string[];
|
||||
constructor(
|
||||
filePathArg: string,
|
||||
argvArgs: string[] = [],
|
||||
forkOptionsArg: childProcess.ForkOptions = {}
|
||||
) {
|
||||
this.workerPath = filePathArg;
|
||||
this.forkOptions = forkOptionsArg;
|
||||
this.argvArgs = argvArgs;
|
||||
}
|
||||
|
||||
run() {
|
||||
let done = smartq.defer<childProcess.ChildProcess>();
|
||||
let forkPath = (() => {
|
||||
if (workerBasePath) {
|
||||
return plugins.path.join(workerBasePath, this.workerPath);
|
||||
} else {
|
||||
return this.workerPath;
|
||||
}
|
||||
})();
|
||||
this.threadChildProcess = childProcess.fork(forkPath, this.argvArgs, this.forkOptions);
|
||||
done.resolve(this.threadChildProcess);
|
||||
return done.promise;
|
||||
}
|
||||
}
|
4
ts/smartspawn.paths.ts
Normal file
4
ts/smartspawn.paths.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import * as plugins from './smartspawn.plugins'
|
||||
|
||||
export const packageBase = plugins.path.join(__dirname, '../');
|
||||
export const typescriptwrapJs = plugins.path.join(packageBase, 'assets/typescriptwrap.js');
|
5
ts/smartspawn.plugins.ts
Normal file
5
ts/smartspawn.plugins.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import * as path from 'path';
|
||||
let threads = require('threads');
|
||||
import * as smartpromise from '@pushrocks/smartpromise';
|
||||
|
||||
export { path, smartpromise, threads };
|
18
ts/smartspawn.wrap.ts
Normal file
18
ts/smartspawn.wrap.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import * as spawnWrap from 'spawn-wrap';
|
||||
|
||||
let unwrap: any = null;
|
||||
|
||||
export const startSpawnWrap = (filePath: string, cliArgs: string[] = [], envArgs: any = {}) => {
|
||||
let spawnArray = [filePath];
|
||||
for (let cliArg of cliArgs) {
|
||||
spawnArray.push(cliArg);
|
||||
}
|
||||
unwrap = spawnWrap(spawnArray, envArgs);
|
||||
};
|
||||
|
||||
export const endSpawnWrap = () => {
|
||||
if (unwrap) {
|
||||
unwrap();
|
||||
unwrap = null;
|
||||
}
|
||||
};
|
Reference in New Issue
Block a user