6 Commits

Author SHA1 Message Date
702c0164a2 2.0.7 2019-08-22 09:26:30 +02:00
0220252b28 fix(core): update 2019-08-22 09:26:30 +02:00
fcdcd4b929 2.0.6 2019-08-22 00:32:10 +02:00
c2f7e98481 fix(core): update 2019-08-22 00:32:09 +02:00
a2242105a1 2.0.5 2019-08-22 00:04:27 +02:00
44431e7d25 fix(core): update 2019-08-22 00:04:27 +02:00
14 changed files with 620 additions and 638 deletions

22
.gitignore vendored
View File

@ -1,4 +1,22 @@
node_modules/ .nogit/
# artifacts
coverage/ coverage/
pages/
public/ public/
pages/
# installs
node_modules/
# caches
.yarn/
.cache/
.rpt2_cache
# builds
dist/
dist_web/
dist_serve/
dist_ts_web/
# custom

View File

@ -1,5 +1,7 @@
# gitzone standard # gitzone ci_default
image: hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
variables:
GIT_STRATEGY: clone
cache: cache:
paths: paths:
@ -48,15 +50,15 @@ testLTS:
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
- notpriv - priv
testSTABLE: testBuild:
stage: test stage: test
script: script:
- npmci npm prepare - npmci npm prepare
- npmci node install stable - npmci node install lts
- npmci npm install - npmci npm install
- npmci npm test - npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -65,7 +67,7 @@ testSTABLE:
release: release:
stage: release stage: release
script: script:
- npmci node install stable - npmci node install lts
- npmci npm publish - npmci npm publish
only: only:
- tags - tags
@ -78,19 +80,11 @@ release:
# ==================== # ====================
codequality: codequality:
stage: metadata stage: metadata
image: docker:stable
allow_failure: true allow_failure: true
services:
- docker:stable-dind
script: script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - npmci command npm install -g tslint typescript
- docker run - npmci npm install
--env SOURCE_CODE="$PWD" - npmci command "tslint -c tslint.json ./ts/**/*.ts"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
artifacts:
paths: [codeclimate.json]
tags: tags:
- docker - docker
- priv - priv
@ -106,13 +100,15 @@ trigger:
- notpriv - notpriv
pages: pages:
image: hosttoday/ht-docker-node:npmci image: hosttoday/ht-docker-dbase:npmci
services:
- docker:18-dind
stage: metadata stage: metadata
script: script:
- npmci command npm install -g typedoc typescript - npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/ - npmci command tsdoc
tags: tags:
- docker - docker
- notpriv - notpriv

View File

@ -47,6 +47,6 @@ myThread.send('someMessageOrObject').then(messageResponse => {
For further information read the linked docs at the top of this readme. For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com) [![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

930
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartspawn", "name": "@pushrocks/smartspawn",
"version": "2.0.4", "version": "2.0.7",
"private": false, "private": false,
"description": "smart subprocess handling", "description": "smart subprocess handling",
"main": "dist/index.js", "main": "dist/index.js",
@ -22,13 +22,27 @@
"dependencies": { "dependencies": {
"@pushrocks/smartpromise": "^3.0.2", "@pushrocks/smartpromise": "^3.0.2",
"spawn-wrap": "^1.4.2", "spawn-wrap": "^1.4.2",
"threads": "^0.12.1" "threads": "1.0.0-beta.4",
"tiny-worker": "^2.2.0"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.8", "@gitzone/tsbuild": "^2.1.11",
"@gitzone/tsrun": "^1.2.1", "@gitzone/tsrun": "^1.2.8",
"@gitzone/tstest": "^1.0.18", "@gitzone/tstest": "^1.0.24",
"@pushrocks/tapbundle": "^3.0.7", "@pushrocks/tapbundle": "^3.0.11",
"@types/node": "^11.13.0" "@types/node": "^12.7.2",
} "tslint": "^5.19.0",
"tslint-config-prettier": "^1.18.0"
},
"files": [
"ts/*",
"ts_web/*",
"dist/*",
"dist_web/*",
"dist_ts_web/*",
"assets/*",
"cli.js",
"npmextra.json",
"readme.md"
]
} }

View File

@ -2,60 +2,6 @@ import { expect, tap } from '@pushrocks/tapbundle';
import * as smartspawn from '../ts/index'; import * as smartspawn from '../ts/index';
let testThreadFunction: smartspawn.ThreadFunction; tap.test('should create a simple test function', async () => {});
let testThread: smartspawn.Thread;
let testPool: smartspawn.Pool;
/**
* create a normal ThreadFunction
*/
tap.test('should create an instance of ThreadFunction', async () => {
testThreadFunction = new smartspawn.ThreadFunction((input, done) => {
let url = require('url');
done(url.parse(input));
});
const message = await testThreadFunction.send('https://google.com');
console.log(message);
testThreadFunction.kill();
});
tap.test('should create an instance of Thread', async () => {
smartspawn.setWorkerBasePath(__dirname);
testThread = new smartspawn.Thread('../testassets/child.ts');
testThread.enableTypeScript();
const message = await testThread.send('https://google.com');
console.log(message);
testThread.kill();
});
tap.test('should not spawn when nothing is sent', async () => {
smartspawn.setWorkerBasePath(__dirname);
let testThread = new smartspawn.Thread('../testassets/child.ts');
});
tap.test('should run in a Pool', async () => {
let testPool = new smartspawn.Pool();
let testThread = new smartspawn.Thread('../testassets/child.ts');
testThread.assignToPool(testPool);
// first run
let message = await testThread.send('what');
expect(message).to.equal('what');
console.log(message);
// second run
message = await testThread.send('another');
expect(message).to.equal('another');
console.log(message);
// kill all
testThread.assignedPool.pool.killAll();
});
tap.test('should once', async () => {
let testThread = new smartspawn.Thread('../testassets/child.ts');
const message = await testThread.sendOnce('what');
expect(message).to.equal('what');
});
tap.start(); tap.start();

View File

@ -1,5 +1,4 @@
export * from './smartspawn.classes.thread';
export * from './smartspawn.classes.threadfunction';
export * from './smartspawn.classes.threadsimple'; export * from './smartspawn.classes.threadsimple';
export * from './smartspawn.classes.pool';
export * from './smartspawn.wrap'; export * from './smartspawn.wrap';
export * from 'threads';

View File

@ -1,6 +0,0 @@
// ==============
// This file handles clustering of nodejs programs
// ==============
import * as plugins from './smartspawn.plugins';
export class Cluster {}

View File

@ -1,13 +0,0 @@
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);
}
}

View File

@ -1,85 +0,0 @@
import * as plugins from './smartspawn.plugins';
import * as paths from './smartspawn.paths';
import * as smartpromise from '@pushrocks/smartpromise';
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 = smartpromise.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 = smartpromise.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);
}
}
}

View File

@ -1,33 +0,0 @@
import * as plugins from './smartspawn.plugins';
import * as smartpromise from '@pushrocks/smartpromise';
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 = smartpromise.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();
}
}

View File

@ -2,13 +2,11 @@ import * as plugins from './smartspawn.plugins';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
import * as childProcess from 'child_process'; import * as childProcess from 'child_process';
import { workerBasePath } from './smartspawn.classes.thread';
export class ThreadSimple { export class ThreadSimple {
workerPath: string; public workerPath: string;
threadChildProcess: childProcess.ChildProcess; public threadChildProcess: childProcess.ChildProcess;
forkOptions: childProcess.ForkOptions; public forkOptions: childProcess.ForkOptions;
argvArgs: string[]; public argvArgs: string[];
constructor( constructor(
filePathArg: string, filePathArg: string,
argvArgs: string[] = [], argvArgs: string[] = [],
@ -19,17 +17,13 @@ export class ThreadSimple {
this.argvArgs = argvArgs; this.argvArgs = argvArgs;
} }
run() { public async start() {
let done = smartpromise.defer<childProcess.ChildProcess>(); const forkPath = this.workerPath;
let forkPath = (() => {
if (workerBasePath) {
return plugins.path.join(workerBasePath, this.workerPath);
} else {
return this.workerPath;
}
})();
this.threadChildProcess = childProcess.fork(forkPath, this.argvArgs, this.forkOptions); this.threadChildProcess = childProcess.fork(forkPath, this.argvArgs, this.forkOptions);
done.resolve(this.threadChildProcess); return this.threadChildProcess;
return done.promise; }
public async stop() {
this.threadChildProcess.kill();
} }
} }

View File

@ -1,5 +1,5 @@
import * as path from 'path'; import * as path from 'path';
let threads = require('threads'); const threads = require('threads');
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
export { path, smartpromise, threads }; export { path, smartpromise, threads };

View File

@ -3,8 +3,8 @@ import * as spawnWrap from 'spawn-wrap';
let unwrap: any = null; let unwrap: any = null;
export const startSpawnWrap = (filePath: string, cliArgs: string[] = [], envArgs: any = {}) => { export const startSpawnWrap = (filePath: string, cliArgs: string[] = [], envArgs: any = {}) => {
let spawnArray = [filePath]; const spawnArray = [filePath];
for (let cliArg of cliArgs) { for (const cliArg of cliArgs) {
spawnArray.push(cliArg); spawnArray.push(cliArg);
} }
unwrap = spawnWrap(spawnArray, envArgs); unwrap = spawnWrap(spawnArray, envArgs);