Async flow control utilities.

flow

Execute an async operation with state signals.

import { flow } from 'sairin';

const fetchUser = flow(async (signal) => {
  const response = await fetch("/api/user", { signal });
  return response.json();
});

Returns

interface Flow<T> {
  running: Signal<boolean>;
  result: Signal<T | null>;
  error: Signal<Error | null>;
  start: () => Promise<void>;
  cancel: () => void;
}

Usage

await fetchUser.start();

console.log(fetchUser.running.get());  // false
console.log(fetchUser.result.get());    // { ... }
console.log(fetchUser.error.get());     // null or Error

fetchUser.cancel();

pipeline

Async operation with input.

import { pipeline } from 'sairin';

const processData = pipeline(async (input, signal) => {
  const result = await fetch(`/api/process/${input}`, { signal });
  return result.json();
});

Returns

interface Pipeline<T, R> {
  running: Signal<boolean>;
  result: Signal<R | null>;
  error: Signal<Error | null>;
  start: (input: T) => Promise<void>;
  cancel: () => void;
}

sequence

Run functions in sequence, collect all results.

import { sequence } from 'sairin';

const seq = sequence(
  async () => "a",
  async () => "b",
  async () => "c"
);

await seq.start();

console.log(seq.results.get());  // ["a", "b", "c"]
console.log(seq.errors.get());    // []

parallel

Run functions in parallel.

import { parallel } from 'sairin';

const par = parallel(
  () => fetch("/api/1"),
  () => fetch("/api/2"),
  () => fetch("/api/3")
);

await par.start();

race

First to settle wins.

import { race } from 'sairin';

const winner = race(
  () => fetch("/api/fast"),
  () => fetch("/api/slow")
);

await winner.start();

console.log(winner.winner.get());  // 0 or 1