stama-rx
Installation
npm i -S stama-rx
Example Structure
main.ts
import './stama/effects';
import faker from 'faker';
import { DeployAction, stamaInstance } from './stama/actions';
(async () => {
const actionCount = faker.datatype.number({ min: 3, max: 5 });
for (let i = 0; i < actionCount; i++) {
DeployAction.dispatch({ projectName: faker.company.catchPhrase() });
}
stamaInstance.complete(DeployAction);
await stamaInstance.untilFinished();
console.log('🏁 Finished');
})();
stama/actions.ts
import StamaRx from 'stama-rx';
export const stamaInstance = new StamaRx();
export const DeployAction = stamaInstance.actionBuilder<{
projectName: string,
}>().create('Deploy');
export const BuildProjectAction = stamaInstance.actionBuilder<{
projectName: string,
}>().create('Build Project');
export const UploadAction = stamaInstance.actionBuilder<{
projectName: string,
targetHost: string,
}>().create('Upload Project');
export const FinishAction = stamaInstance.actionBuilder<{
projectName: string,
}>().create('Finish');
stama/effects.ts
import faker from 'faker';
import { timer } from 'rxjs';
import { map, mergeMap } from 'rxjs/operators';
import { BuildProjectAction, DeployAction, FinishAction, stamaInstance, UploadAction } from './actions';
export const deploy$ = stamaInstance.createEffect(s => s.fromAction(DeployAction).pipe(
map(({ projectName }) => {
return BuildProjectAction.create({ projectName });
}),
), { signalCompleteOnFinished: BuildProjectAction });
export const build$ = stamaInstance.createEffect(s => s.fromAction(BuildProjectAction).pipe(
mergeMap(async ({ projectName }) => {
console.log(`📦 Start building '${projectName}'`);
await timer(faker.datatype.number({ min: 500, max: 3000 })).toPromise();
console.log(`📦 ✅ Project '${projectName}' built`);
return UploadAction.create({ projectName, targetHost: faker.internet.domainName() });
}),
), { signalCompleteOnFinished: UploadAction });
export const upload$ = stamaInstance.createEffect(s => s.fromAction(UploadAction).pipe(
mergeMap(async ({ projectName, targetHost }) => {
console.log(`🏭 Uploading project '${projectName}' to '${targetHost}'`);
await timer(faker.datatype.number({ min: 500, max: 3000 })).toPromise();
console.log(`🏭 ✅ Project '${projectName}' uploaded`);
return FinishAction.create({ projectName });
}),
));
To see the visualized flow of example, fork this repository then run the following commands
npm i
npm run example