procych
v0.0.3
Published
Process composable abstractions and composition tools
Readme
procych
Abstraction for dependency injected cycle-runnable processes and compositions of them. Usable for process control and comfortable test of iteration of running.
API
export interface IProcych<Deps extends {}>
{
prepare(dep: Deps): Promise<void>;
run(): Promise<void>;
destroy(): Promise<void>;
}
//Concurrency processese composition
export class ConcurProcych<Deps extends {}> implements IProcych<Deps>
{
public constructor(procs: IProcych<Deps>[]);
public async prepare(dep: Deps): Promise<void>;
public async destroy(): Promise<void>;
public async run(): Promise<void>;
}
//Sequential processes composition
export class SeqProcych<Deps extends {}> implements IProcych<Deps>
{
public constructor(procs: IProcych<Deps>[]);
public async prepare(dep: Deps): Promise<void>;
public async destroy(): Promise<void>;
public async run(): Promise<void>;
}
//Runner for processes
export class ProcychRunner<C extends Record<string, () => IProcych<D>>, D>{
constructor(conf: C, deps: D, logErr: (any: any) => Promise<void>);
public async runScript(s: (keyof C)): Promise<void>;
//async cyclic run
public async runProcess(s: (keyof C), duration: number): Promise<void>;
public async stop(): Promise<void>;
}Example of usage
// 0. Define common deps container
type SomeDeps = {...};
// 1. Define System processes
class RequestAndSaveSite implements IProcych<SomeDeps> {...}
class ParseSite implements IProcych<SomeDeps> {...}
class ProcessSiteData implements IProcych<SomeDeps> {...}
const processMap = {
"req": () => new RequestAndSaveSite(),
"parse": () => new ParseSite(),
"process": () => new ProcessSiteData(),
"full": () => new SeqProcych([
new RequestAndSaveSite(),
new ParseSite(),
new ProcessSiteData(),
]),
}
// 2. Make runner controllable from console or repl for them
const consoleParams = ...; //some data
const deps: SomeDeps = await makeDepsFromConsole(consoleParams); // some deps constructor
const runner = new ProcychRunner(processMap, deps, (log) => {console.log(log);});
if(consoleParams.test) {
await runScript(consoleParams.script);
} else {
await runProcess(consoleParams.script, cosoleParams.delay)
}Author
Anatoly Starodubtsev [email protected]
License
MIT
