stama-rx
TypeScript icon, indicating that this package has built-in type declarations

1.0.0 • Public • Published

stama-rx

version npm

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

Package Sidebar

Install

npm i stama-rx

Weekly Downloads

1

Version

1.0.0

License

MIT

Unpacked Size

20.2 kB

Total Files

7

Last publish

Collaborators

  • dkhang97